diff --git a/tools/near_dedup/PILE_notebooks/EuroParl_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/EuroParl_near_dedup.ipynb new file mode 100644 index 000000000..4f9778881 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/EuroParl_near_dedup.ipynb @@ -0,0 +1,447 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Will assign 48 cores and 308492 M memory for spark\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/08/30 16:59:52 WARN Utils: Your hostname, sr414 resolves to a loopback address: 127.0.1.1; using 10.1.2.14 instead (on interface enp134s0f1)\n", + "23/08/30 16:59:52 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "23/08/30 16:59:53 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "per core memory size is 6.276 GB and shuffle_disk maximum capacity is 8589934592.000 GB\n" + ] + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "\n", + "from near_dedup import *" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f54ef8ee-4a10-475e-a83d-6a9a5f5fed07", + "metadata": {}, + "outputs": [], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/EuroParl')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/EuroParl/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/EuroParl/EuroParliamentProceedings_1996_2011.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:=====================================================> (195 + 5) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 16.729979965020902 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:=============================================> (173 + 27) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 271.9689698460279 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "82df9de1-8118-4d9b-9c44-4ce4da3039a9", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 203/203 [00:00<00:00, 6960.22it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/EuroParl/deduplicate/duplicates.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "Failed to process /home/vmagent/app/PILE_output/EuroParl/deduplicate/connected_components.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "length of the set of duplicates: 902 0.034215688705444336\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 902/902 [00:00<00:00, 861594.67it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 340 0.03926563262939453\n", + "Graph generated duplicates list!!! 0.041168928146362305\n", + "generate_connected_components all took 0.045084498007781804 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 340/340 [00:00<00:00, 175970.31it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 886\n", + "generate_duplicates_dict all took 0.008639081963337958 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 69814 documents\n", + " total detected 886 duplicated documents\n", + " duplicate ratio is 0.01269086429655943\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/NIH_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/NIH_near_dedup.ipynb new file mode 100644 index 000000000..bafb2eebd --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/NIH_near_dedup.ipynb @@ -0,0 +1,422 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "\n", + "from near_dedup import *" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/NIH')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/NIH/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be318620-6fe1-44c6-991e-da208f8da1af", + "metadata": {}, + "outputs": [], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/NIH/NIH_ExPORTER_awarded_grant_text.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:=============================================> (170 + 30) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 14.274296162999235 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:==============================================> (177 + 23) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 114.12813645100687 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aff3047a-6f75-4529-9bbf-e02d8545e7eb", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 203/203 [00:00<00:00, 1362.17it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/NIH/deduplicate/duplicates.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "Failed to process /home/vmagent/app/PILE_output/NIH/deduplicate/connected_components.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "length of the set of duplicates: 103640 0.15403461456298828\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 103640/103640 [00:00<00:00, 879390.49it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 83410 0.4011833667755127\n", + "Graph generated duplicates list!!! 0.4935333728790283\n", + "generate_connected_components all took 0.5348551459610462 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 83410/83410 [00:00<00:00, 871147.90it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 98299\n", + "generate_duplicates_dict all took 0.24805862794164568 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 939661 documents\n", + " total detected 98299 duplicated documents\n", + " duplicate ratio is 0.1046111310355543\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/PUBMED_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/PUBMED_near_dedup.ipynb new file mode 100644 index 000000000..c9db8fb9f --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/PUBMED_near_dedup.ipynb @@ -0,0 +1,421 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "from near_dedup import *\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/PUBMED')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/PUBMED/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d80742b3-9989-4c94-9953-383795826456", + "metadata": {}, + "outputs": [], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/PUBMED/PUBMED_title_abstracts_2019_baseline.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:====================================================> (192 + 8) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 51.56134534499142 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:==================================================> (189 + 11) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 1617.5527220640797 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8c40de55-ae3a-4747-90df-554cc737d206", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 203/203 [00:00<00:00, 3169.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/PUBMED/deduplicate/duplicates.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "Failed to process /home/vmagent/app/PILE_output/PUBMED/deduplicate/connected_components.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "length of the set of duplicates: 27003 0.06862425804138184\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 27003/27003 [00:00<00:00, 1095388.52it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 15384 0.10237360000610352\n", + "Graph generated duplicates list!!! 0.11692953109741211\n", + "generate_connected_components all took 0.12613834207877517 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 15384/15384 [00:00<00:00, 774370.22it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 26417\n", + "generate_duplicates_dict all took 0.035620245966129005 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 15518009 documents\n", + " total detected 26417 duplicated documents\n", + " duplicate ratio is 0.0017023446757892717\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/PhilArch_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/PhilArch_near_dedup.ipynb new file mode 100644 index 000000000..8289fa47f --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/PhilArch_near_dedup.ipynb @@ -0,0 +1,350 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "from near_dedup import *\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/PhilArch')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/PhilArch/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "da18c763-634b-4333-9c5b-6bfe7c325ec2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Will assign 48 cores and 308492 M memory for spark\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/08/31 16:15:23 WARN Utils: Your hostname, sr414 resolves to a loopback address: 127.0.1.1; using 10.1.2.14 instead (on interface enp134s0f1)\n", + "23/08/31 16:15:23 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "23/08/31 16:15:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "per core memory size is 6.276 GB and shuffle_disk maximum capacity is 8589934592.000 GB\n" + ] + } + ], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/PhilArch/PhilArchive.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:=================================================> (183 + 17) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 13.072971040033735 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 12:=========================> (96 + 48) / 200]\r" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba4b0b14-7976-4a31-80db-2ed2fe6ec3ed", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/analysis.ipynb b/tools/near_dedup/PILE_notebooks/analysis.ipynb new file mode 100644 index 000000000..da18d1fa3 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/analysis.ipynb @@ -0,0 +1,250 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "6f6a7b1a-c1e5-41d4-a9e1-06708fd83352", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "! cp -r {cur_path}/near_dedup.py /usr/local/lib/python3.10/dist-packages/\n", + "! cp -r {cur_path}/third_party /usr/local/lib/python3.10/dist-packages/\n", + "\n", + "from near_dedup import *" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "00d759c0-0cfa-4685-821a-2231a091a4de", + "metadata": {}, + "outputs": [], + "source": [ + "path = '/home/vmagent/app/PILE/NIH'\n", + "dup_dir = \"/home/vmagent/app/PILE_output/NIH/deduplicate\"\n", + "from third_party.generate_duplicates_dict import *\n", + "input_file = os.path.join(dup_dir, \"connected_components.pickle\")\n", + "with open(input_file, \"rb\") as fin:\n", + " components, n_components, reversed_mapper = pickle.load(fin)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "8451e410-318e-4209-8a55-b49b2ce598d8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "left is\n", + " NIH_ExPORTER_awarded_grant_text.jsonl@656163\n", + "right is\n", + " NIH_ExPORTER_awarded_grant_text.jsonl@551098\n", + "NIH_ExPORTER_awarded_grant_text.jsonl@656163 content is \n", + "{\"meta\": {\"APPLICATION_ID\": 8134498}, \"text\": \"The bacterial twin-arginine translocation (Tat) system exports proteins across the cytoplasmic membrane. Unlike most well-studied protein translocation systems, which transport \\\"linearized,\\\" or unfolded, polypeptides across a membrane, the Tat system translocates fully folded and assembled proteins and protein complexes. The Tat system transports many proteins that must assemble complex metallo-redox centers before transport. In some cases, the quaternary contacts between distinct subunits must be established before an assembled protein complex can be transported. Since the bacterial cytoplasmic membrane supports ion gradients, a major unresolved question is how large protein complexes >100 kDa can be transported across this membrane by the Tat machinery without collapsing the proton motive force used to make ATP. Due to its ability to transport large protein structures that must be fully folded before export, the Tat machinery is potentially important for the biotechnology industry as a system to bacterially express protein therapeutics that require a cytoplasm for maturation. Products could be recovered directly from the growth medium. Though the Tat transport system is not required for growth in all organisms that encode it, it is responsible for the export of a number of bacterial virulence factors, and the absence of a functional Tat system often leads to growth defects. Considering that the Tat system is found in many bacteria, but not found in animals, including humans, the Tat system is likely to be an excellent target for antibiotic development. Currently, the mechanism of Tat translocation is poorly understood. Three membrane proteins, TatA, TatB and TatC comprise the membrane translocase, forming numerous oligomeric complexes within the membrane. The transmembrane electric field is essential for driving efficient transport, presumably through a gated-pore. The common method to characterize protein translocation systems involves trapping a cargo protein during transport, that is, to form translocation intermediates. The Tat machinery has thus far resisted this approach. The Specific Aim of this proposal is to develop a high-throughput screening assay that will be used to search for candidate inhibitors of Tat transport. Positive hits from the primary screen will be validated using secondary screens and in vitro assays. Bona fide Tat transport inhibitors will be used to assist with mechanistic studies of Tat transport, and will be evaluated for pharmaceutical potential. PUBLIC HEALTH RELEVANCE: RELEVANCE: This proposal seeks inhibitors of the bacterial twin-arginine translocation (Tat) system, protein secretion machinery that is responsible for the export of a number of bacterial virulence factors, and that contributes to efficient bacterial growth. These inhibitors will be used to assist with future mechanistic studies of Tat transport, and will be evaluated for their possible pharmaceutical potential. Understanding the mechanism of Tat transport is essential for utilizing this unique system for the bacterial expression of protein therapeutics that requires a cytoplasm for maturation.\"}\n", + "NIH_ExPORTER_awarded_grant_text.jsonl@551098 content is \n", + "{\"meta\": {\"APPLICATION_ID\": 7617460}, \"text\": \"The bacterial twin-arginine translocation (Tat) system exports proteins across the cytoplasmic membrane. Unlike most well-studied protein translocation systems, which transport \\\"linearized,\\\" or unfolded, polypeptides across a membrane, the Tat system translocates fully folded and assembled proteins and protein complexes. The Tat system transports many proteins that must assemble complex metallo-redox centers before transport. In some cases, the quaternary contacts between distinct subunits must be established before an assembled protein complex can be transported. Since the bacterial cytoplasmic membrane supports ion gradients, a major unresolved question is how large protein complexes > 100 kDa can be transported across this membrane by the Tat machinery without collapsing the proton motive force used to make ATP. Due to its ability to transport large protein structures that must be fully folded before export, the Tat machinery is potentially important for the biotechnology industry as a system to bacterially express protein therapeutics that require a cytoplasm for maturation. Products could be recovered directly from the growth medium. Though the Tat transport system is not required for growth in all organisms that encode it, it is responsible for the export of a number of bacterial virulence factors, and the absence of a functional Tat system often leads to growth defects. Considering that the Tat system is found in many bacteria, but not found in animals, including humans, the Tat system is likely to be an excellent target for antibiotic development. Currently, the mechanism of Tat translocation is poorly understood. Three membrane proteins, TatA, TatB and TatC comprise the membrane translocase, forming numerous oligomeric complexes within the membrane. The transmembrane electric field is essential for driving efficient transport, presumably through a gated-pore. The common method to characterize protein translocation systems involves trapping a cargo protein during transport, that is, to form translocation intermediates. The Tat machinery has thus far resisted this approach. The Specific Aim of this proposal is to develop a high-throughput screening assay that will be used to search for candidate inhibitors of Tat transport. Positive hits from the primary screen will be validated using secondary screens and in vitro assays. Bona fide Tat transport inhibitors will be used to assist with mechanistic studies of Tat transport, and will be evaluated for pharmaceutical potential. [unreadable] PUBLIC HEALTH RELEVANCE: RELEVANCE: This proposal seeks inhibitors of the bacterial twin-arginine translocation (Tat) system, protein secretion machinery that is responsible for the export of a number of bacterial virulence factors, and that contributes to efficient bacterial growth. These inhibitors will be used to assist with future mechanistic studies of Tat transport, and will be evaluated for their possible pharmaceutical potential. Understanding the mechanism of Tat transport is essential for utilizing this unique system for the bacterial expression of protein therapeutics that requires a cytoplasm for maturation. [unreadable] [unreadable] [unreadable]\"}\n" + ] + } + ], + "source": [ + "idx = 1000\n", + "left = []\n", + "right = []\n", + "for rid, component in enumerate(components):\n", + " if rid > idx:\n", + " break\n", + " if rid != idx:\n", + " continue\n", + " print(\"left is\")\n", + " left.append(reversed_mapper[component[0]])\n", + " print(f\" {left[0]}\")\n", + " print(\"right is\")\n", + " for j in range(1, len(component)):\n", + " doc = reversed_mapper[component[j]]\n", + " right.append(doc)\n", + " print(f\" {doc}\")\n", + "file_name, n_row = left[0].split(\"@\")\n", + "print(left[0], \"content is \")\n", + "! sed -n {n_row}p {path}/{file_name}\n", + "for r in right:\n", + " print(r, \"content is \")\n", + " file_name, n_row = r.split(\"@\")\n", + " ! sed -n {n_row}p {path}/{file_name}" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "9df23cd2-7f52-4821-8578-f2bf1e04238c", + "metadata": {}, + "outputs": [], + "source": [ + "path = '/home/vmagent/app/PILE/pile_uspto'\n", + "dup_dir = \"/home/vmagent/app/PILE_output/pile_uspto/deduplicate\"\n", + "from third_party.generate_duplicates_dict import *\n", + "input_file = os.path.join(dup_dir, \"connected_components.pickle\")\n", + "with open(input_file, \"rb\") as fin:\n", + " components, n_components, reversed_mapper = pickle.load(fin)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "d583ffd2-a241-4604-9700-49da294d18d7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "left is\n", + " data_4_time1600295577_2000.jsonl@132944\n", + "right is\n", + " data_17_time1600253218_1993.jsonl@24671\n", + " data_3_time1600293502_1999.jsonl@53846\n", + " data_0_time1600288933_1996.jsonl@52814\n", + "data_4_time1600295577_2000.jsonl@132944 content is \n", + "{\"text\": \"In 1981, documentation began on the disease that became known as Acquired Immune Deficiency Syndrome (AIDS), as well as its forerunner AIDS Related Complex (ARC). In 1983, the cause of the disease AIDS was established as a virus named the Human Immunodeficiency Virus type 1 (HIV-1). Usually, a person infected with the virus will eventually develop AIDS; in all known cases of AIDS the final outcome has always been death.\\nThe disease AIDS is the end result of an HIV-1 virus following its own complex life cycle. The virion life cycle begins with the virion attaching itself to the host human T-4 lymphocyte immune cell through the bonding of a glycoprotein on the surface of the virion's protective coat with the CD4 glycoprotein on the lymphocyte cell. Once attached, the virion sheds its glycoprotein coat, penetrates into the membrane of the host cell, and uncoats its RNA. The virion enzyme, reverse transcriptase, directs the process of transcribing the RNA into single stranded DNA. The viral RNA is degraded and a second DNA strand is created. The now double-stranded DNA is integrated into the human cell's genes and those genes are used for cell reproduction.\\nAt this point, the human cell carries out its reproductive process by using its own RNA polymerase to transcribe the integrated DNA into viral RNA. The viral RNA is translated into glycoproteins, structural proteins, and viral enzymes, which assemble with the viral RNA intact. When the host cell finishes the reproductive step, a new virion cell, not a T-4 lymphocyte, buds forth. The number of HIV-1 virus cells thus grows while the number of T-4 lymphocytes decline.\\nThe typical human immune system response, killing the invading virion, is taxed because a large portion of the virion's life cycle is spent in a latent state within the immune cell. In addition, viral reverse transcriptase, the enzyme used in making a new virion cell, is not very specific, and causes transcription mistakes that result in continually changed glycoproteins on the surface of the viral protective coat. This lack of specificity decreases the immune system's effectiveness because antibodies specifically produced against one glycoprotein may be useless against another, hence reducing the number of antibodies available to fight the virus. The virus continues to grow while the immune response system continues to weaken. Eventually, the HIV largely holds free reign over the body's immune system, allowing opportunistic infections to set in and ensuring that, without the administration of antiviral agents and/or immunomodulators, death will result.\\nThere are three critical points in the virus' life cycle which have been identified as targets for antiviral drugs: (1) the initial attachment of the virion to the T-4 lymphocyte, or macrophage, site, (2) the transcription of viral RNA to viral DNA, and (3) the assemblage of the new virion cell during reproduction.\\nInhibition of the virus at the second critical point, the viral RNA to viral DNA transcription process, has provided the bulk of the therapies used in treating AIDS. This transcription must occur for the virion to reproduce because the virion's genes are encoded in RNA; the host cell reads only DNA. By introducing drugs that block the reverse transcriptase from completing the formation of viral DNA, HIV-1 replication can be stopped.\\nNucleoside analogs, such as 3'-azido-3'-deoxythymidine (AZT), 2',3'-dideoxycytidine (DDC), 2',3'-dideoxythymidinene (D4T), 2',3'-dideoxyinosine (DDI), and various fluoro-derivatives of these nucleosides are relatively effective in halting HIV replication at the reverse transcriptase stage. Another promising reverse transcriptase inhibitor is 2',3'-dideoxy-3'-thia-cytidine (BCH-189), which contains an oxathiolane ring substituting for the sugar moiety in the nucleoside.\\nAZT is a successful anti-HIV drug because it sabotages the formation of viral DNA inside the host T-4 lymphocyte cell. When AZT enters the cell, cellular kinases activate AZT by phosphorylation to AZT triphosphate. AZT triphosphate then competes with natural thymidine nucleosides for the receptor site of HIV reverse transcriptase enzyme. The natural nucleoside possesses two reactive ends, the first for attachment to the previous nucleoside and the second for linking to the next nucleoside. The AZT molecule has only the first reactive end; once inside the HIV enzyme site, the AZT azide group terminates viral DNA formation because the azide cannot make the 3',5'-phosphodiester with the ribose moiety of the following nucleoside.\\nAZT's clinical benefits include increased longevity, reduced frequency and severity of opportunistic infections, and increased peripheral CD4 lymphocyte count. Immunosorbent assays for viral p24, an antigen used to track HIV-1 activity, show a significant decrease with use of AZT. However, AZT's benefits must be weighed against the severe adverse reactions of bone marrow suppression, nausea, myalgia, insomnia, severe headaches, anemia, peripheral neuropathy, and seizures. Furthermore, these adverse side effects occur immediately after treatment begins whereas a minimum of six weeks of therapy is necessary to realize AZT's benefits.\\nBoth DDC and D4T are potent inhibitors of HIV replication with activities comparable (D4T) or superior (DDC) to AZT. However, both DDC and D4T are converted to their 5' triphosphates less efficiently than their natural analogs and are resistent to deaminases and phosphorylases. Clinically, both compounds are toxic. Currently, DDI is used to conjunction with AZT to treat AIDS. However, DDI's side effects include sporadic pancreatis and peripheral neuropathy. Initial tests on 3'-fluoro-2'-3'-dideoxythymidine show that its anti-viral activity is comparable to that of AZT.\\nRecent tests on BCH-189 have shown that it possesses anti-HIV activity similar to AZT and DDC, but without the cell toxicity which causes the debilitating side effects of AZT and DDC. A sufficient quantity of BCH-189 is needed to allow clinical testing and treatment using the drug.\\nThe commonly-used chemical approaches for synthesizing nucleosides or nucleoside analogs can be classified into two broad categories: (1) those which modify intact nucleosides by altering the carbohydrate, the base, or both and (2) those which modify carbohydrates and incorporate the base, or its synthetic precursor, at a suitable stage in the synthesis. Because BCH-189 substitutes a sulfur atom for a carbon atom in the carbohydrate ring, the second approach is more feasible. The most important factor in this latter strategy involves delivering the base from the .beta.-face of the carbohydrate ring in the glycosylation reaction because only the .beta.-isomers exhibit useful biological activity.\\nIt is well known in the art that the stereoselective introduction of bases to the anomeric centers of carbohydrates can be controlled by capitalizing on the neighboring group participation of a 2-substituent on the carbohydrate ring (Chem. Ber. 114:1234 (1981)). However, BCH-189 and its analogs do not possess a 2-substitutent and, therefore, cannot utilize this procedure unless additional steps to introduce a functional group that is both directing and disposable are incorporated into the synthesis. These added steps would lower the overall efficiency of the synthesis.\\nIt is also well known in the art that \\\"considerable amounts of the undesired .alpha.-nucleosides are always formed during the synthesis of 2'-deoxyribosides\\\" (Chem. Ber. 114:1234, 1244 (1981)). Furthermore, this reference teaches that the use of simple Friedel-Crafts catalysts like SnCl.sub.4 in nucleoside syntheses produces undesirable emulsions upon the workup of the reaction mixture, generates complex mixtures of the .alpha. and .beta.-isomers, and leads to stable .delta.-complexes between the SnCl.sub.4 and the more basic silyated heterocycles such as silyated cytosine. These complexes lead to longer reaction times, lower yields, and production of the undesired unnatural N-3-nucleosides. Thus, the prior art teaches the use of trimethysilyl triflate or trimethylsilyl perchlorate as a catalyst during the coupling of pyrimidine bases with a carbohydrate ring to achieve high yields of the biologically active .beta.-isomers. However, the use of these catalysts to synthesize BCH-189 or BCH-189 analogs does not produce the .beta.-isomer preferentially; these reactions result in approximately a 50:50 ratio of the isomers.\\nThus, there exists a need for an efficient synthetic route to BCH-189 and its analogs. There also exists a need for a stereoselective synthetic route to the biologically active isomer of these compounds, .beta.-BCH-189 and related .beta.-analogs. Furthermore, there exists a need for a stereoselective synthetic route to enantiomerically-enriched .beta.-BCH-189 because the other enantiomer is inactive and, therefore, represents a 50% impurity.\", \"meta\": {\"bibliographic_information\": {\"Patent Number\": \"061537519\", \"Series Code\": \"9\", \"Application Number\": \"3379108\", \"Application Type\": \"1\", \"Art unit\": \"164\", \"Application Filing Date\": \"19990622\", \"Title of Invention\": \"Method and compositions for the synthesis of BCH-189 and related compounds\", \"Issue Date\": \"20001128\", \"Number of Claims\": \"1\", \"Exemplary Claim Number(s)\": \"1\", \"Assistant Examiner\": \"McKenzie; Thomas\", \"Primary Examiner\": \"Ford; John M.\", \"Number of Drawing Sheets\": \"4\", \"Number of figures\": \"4\"}, \"source_file\": \"https://bulkdata.uspto.gov/data/patent/grant/redbook/fulltext/2000/pftaps20001128_wk48.zip\", \"abstract\": \"The present invention relates to a method of preparing BCH-189 and various analogs of BCH-189 from inexpensive precursors with the option of introducing functionality as needed. This synthetic route allows the stereoselective preparation of the biologically active isomer of these compounds, .beta.-BCH-189 and related compounds. Furthermore, the steochemistry at the nucleoside 4' position can be controlled to produce enantiomerically-enriched .beta.-BCH-189 and its analogs.\", \"citations\": [{\"Patent number\": \"4000137\", \"Issue date\": \"19761200\", \"Patentee name\": \"Dvonoch et al.\", \"US classification\": \"260252\"}, {\"Patent number\": \"4336381\", \"Issue date\": \"19820600\", \"Patentee name\": \"Nagata et al.\", \"US classification\": \"544313\"}, {\"Patent number\": \"4861759\", \"Issue date\": \"19890800\", \"Patentee name\": \"Mitsuya et al.\", \"US classification\": \"514 46\"}, {\"Patent number\": \"4879277\", \"Issue date\": \"19891100\", \"Patentee name\": \"Mitsuya et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"4916122\", \"Issue date\": \"19900400\", \"Patentee name\": \"Chu et al.\", \"US classification\": \"514 50\"}, {\"Patent number\": \"4963533\", \"Issue date\": \"19901000\", \"Patentee name\": \"de Clerq et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"5011774\", \"Issue date\": \"19910400\", \"Patentee name\": \"Farina et al.\", \"US classification\": \"435 87\"}, {\"Patent number\": \"5041449\", \"Issue date\": \"19910800\", \"Patentee name\": \"Belleau et al.\", \"US classification\": \"544317\"}, {\"Patent number\": \"5047407\", \"Issue date\": \"19910900\", \"Patentee name\": \"Belleau et al.\", \"US classification\": \"514254\"}, {\"Patent number\": \"5059690\", \"Issue date\": \"19911000\", \"Patentee name\": \"Zahler et al.\", \"US classification\": \"544317\"}, {\"Patent number\": \"5204466\", \"Issue date\": \"19930400\", \"Patentee name\": \"Liotta et al.\", \"US classification\": \"544317\"}, {\"Patent number\": \"5538975\", \"Issue date\": \"19960700\", \"Patentee name\": \"Dionne\"}, {\"Patent number\": \"5539116\", \"Issue date\": \"19960700\", \"Patentee name\": \"Liotta et al.\", \"US classification\": \"544317\"}, {\"Patent number\": \"5618820\", \"Issue date\": \"19970400\", \"Patentee name\": \"Dionne\"}, {\"Patent number\": \"5639787\", \"Issue date\": \"19970600\", \"Patentee name\": \"Mansour\"}, {\"Patent number\": \"5663320\", \"Issue date\": \"19970900\", \"Patentee name\": \"Mansour\"}, {\"Patent number\": \"5684164\", \"Issue date\": \"19971100\", \"Patentee name\": \"Belleau et al.\", \"US classification\": \"549 30\"}, {\"Patent number\": \"5696254\", \"Issue date\": \"19971200\", \"Patentee name\": \"Mansour\"}, {\"Patent number\": \"5700937\", \"Issue date\": \"19971200\", \"Patentee name\": \"Liotta\"}, {\"Patent number\": \"5728575\", \"Issue date\": \"19980300\", \"Patentee name\": \"Liotta\"}, {\"Patent number\": \"5744596\", \"Issue date\": \"19980400\", \"Patentee name\": \"Mansour\"}, {\"Patent number\": \"5756706\", \"Issue date\": \"19980500\", \"Patentee name\": \"Mansour\"}, {\"Patent number\": \"5814639\", \"Issue date\": \"19980600\", \"Patentee name\": \"Liotta\"}, {\"Patent number\": \"5827727\", \"Issue date\": \"19981000\", \"Patentee name\": \"Liotta\"}, {\"Patent number\": \"5892025\", \"Issue date\": \"19990600\", \"Patentee name\": \"Liotta\"}, {\"Patent number\": \"5914331\", \"Issue date\": \"19990600\", \"Patentee name\": \"Liotta\"}, {\"Patent number\": \"5914400\", \"Issue date\": \"19990600\", \"Patentee name\": \"Liotta et al.\", \"US classification\": \"544314\"}], \"assignees\": [{\"inventor name\": \"Emory University\", \"City\": \"Atlanta\", \"State\": \"GA\", \"Assignee type code\": \"02\"}], \"classifications\": [{\"OCL\": [\"544319\"], \"EDF\": [\"7\"], \"ICL\": [\"C07D41104\"], \"FSC\": [\"544\"], \"FSS\": [\"319\"]}], \"inventors\": [{\"inventor name\": \"Liotta; Dennis C.\", \"City\": \"McDonough\", \"State\": \"GA\"}, {\"inventor name\": \"Choi; Woo-Baeg\", \"City\": \"North Brunswick\", \"State\": \"NJ\"}]}}\n", + "data_17_time1600253218_1993.jsonl@24671 content is \n", + "{\"text\": \"The present invention relates to methods and compositions for preparing antiviral nucleoside analogs, particularly BCH-189 (2',3'-dideoxy-3'-thia-cytidine). More particularly, the invention relates to the selective synthesis of the .beta.-isomer of BCH-189 and related compounds as well as the selective synthesis of enantiomerically-enriched BCH-189 and related compounds.\\nIn 1981, documentation began on the disease that became known as Acquired Immune Deficiency Syndrome (AIDS), as well as its forerunner AIDS Related Complex (ARC). In 1983, the cause of the disease AIDS was established as a virus named the Human Immunodeficiency Virus type 1 (HIV-1). Usually, a person infected with the virus will eventually develop AIDS; in all known cases of AIDS the final outcome has always been death.\\nThe disease AIDS is the end result of an HIV-1 virus following its own complex life cycle. The virion life cycle begins with the virion attaching itself to the host human T-4 lymphocyte immune cell through the bonding of a glycoprotein on the surface of the virion's protective coat with the CD4 glycoprotein on the lymphocyte cell. Once attached, the virion sheds its glycoprotein coat, penetrates into the membrane of the host cell, and uncoats its RNA. The virion enzyme, reverse transcriptase, directs the process of transcribing the RNA into single stranded DNA. The viral RNA is degraded and a second DNA strand is created. The now double-stranded DNA is integrated into the human cell's genes and those genes are used for cell reproduction.\\nAt this point, the human cell carries out its reproductive process by using its own RNA polymerase to transcribe the integrated DNA into viral RNA. The viral RNA is translated into glycoproteins, structural proteins, and viral enzymes, which assemble with the viral RNA intact. When the host cell finishes the reproductive step, a new virion cell, not a T-4 lymphocyte, buds forth. The number of HIV-1 virus cells thus grows while the number of T-4 lymphocytes decline.\\nThe typical human immune system response, killing the invading virion, is taxed because a large portion of the virion's life cycle is spent in a latent state within the immune cell. In addition, viral reverse transcriptase, the enzyme used in making a new virion cell, is not very specific, and causes transcription mistakes that result in continually changed glycoproteins on the surface of the viral protective coat. This lack of specificity decreases the immune system's effectiveness because antibodies specifically produced against one glycoprotein may be useless against another, hence reducing the number of antibodies available to fight the virus. The virus continues to grow while the immune response system continues to weaken. Eventually, the HIV largely holds free reign over the body's immune system, allowing opportunistic infections to set in and ensuring that, without the administration of antiviral agents and/or immunomodulators, death will result.\\nThere are three critical points in the virus's life cycle which have been identified as targets for antiviral drugs: (1) the initial attachment of the virion to the T-4 lymphocyte, or macrophage, site, (2) the transcription of viral RNA to viral DNA, and (3) the assemblage of the new virion cell during reproduction.\\nInhibition of the virus at the second critical point, the viral RNA to viral DNA transcription process, has provided the bulk of the therapies used in treating AIDS. This transcription must occur for the virion to reproduce because the virion's genes are encoded in RNA; the host cell reads only DNA. By introducing drugs that block the reverse transcriptase from completing the formation of viral DNA, HIV-1 replication can be stopped.\\nNucleoside analogs, such as 3'-azido-3'-deoxythymidine (AZT), 2',3'-dideoxycytidine (DDC), 2',3'-dideoxythymidinene (D4T), 2',3'-dideoxyinosine (DDI), and various fluoro-derivatives of these nucleosides are relatively effective in halting HIV replication at the reverse transcriptase stage. Another promising reverse transcriptase inhibitor is 2',3'-dideoxy-3'-thia-cytidine (BCH-189), which contains an oxathiolane ring substituting for the sugar moiety in the nucleoside.\\nAZT is a successful anti-HIV drug because it sabotages the formation of viral DNA inside the host T-4 lymphocyte cell. When AZT enters the cell, cellular kinases activate AZT by phosphorylation to AZT triphosphate. AZT triphosphate then competes with natural thymidine nucleosides for the receptor site of HIV reverse transcriptase enzyme. The natural nucleoside possesses two reactive ends, the first for attachment to the previous nucleoside and the second for linking to the next nucleoside. The AZT molecule has only the first reactive end; once inside the HIV enzyme site, the AZT azide group terminates viral DNA formation because the azide cannot make the 3',5'-phosphodiester with the ribose moiety of the following nucleoside.\\nAZT's clinical benefits include increased longevity, reduced frequency and severity of opportunistic infections, and increased peripheral CD4 lymphocyte count. Immunosorbent assays for viral p24, an antigen used to track HIV-1 activity, show a significant decrease with use of AZT. However, AZT's benefits must be weighed against the severe adverse reactions of bone marrow suppression, nausea, myalgia, insomnia, severe headaches, anemia, peripheral neuropathy, and seizures. Furthermore, these adverse side effects occur immediately after treatment begins whereas a minimum of six weeks of therapy is necessary to realize AZT's benefits.\\nBoth DDC and D4T are potent inhibitors of HIV replication with activities comparable (D4T) or superior (DDC) to AZT. However, both DDC and D4T are converted to their 5' triphosphates less efficiently than their natural analogs and are resistent to deaminases and phosphorylases. Clinically, both compounds are toxic. Currently, DDI is used in conjunction with AZT to treat AIDS. However, DDI's side effects include sporadic pancreatis and peripheral neuropathy. Initial tests on 3'-fluoro-2'-3'-dideoxythymidine show that its anti-viral activity is comparable to that of AZT.\\nRecent tests on BCH-189 have shown that it possesses anti-HIV activity similar to AZT and DDC, but without the cell toxicity which causes the debilitating side effects of AZT and DDC. A sufficient quantity of BCH-189 is needed to allow clinical testing and treatment using the drug.\\nThe commonly-used chemical approaches for synthesizing nucleosides or nucleoside analogs can be classified into two broad categories: (1) those which modify intact nucleosides by altering the carbohydrate, the base, or both and (2) those which modify carbohydrates and incorporate the base, or its synthetic precursor, at a suitable stage in the synthesis. Because BCH-189 substitutes a sulfur atom for a carbon atom in the carbohydrate ring, the second approach is more feasible. The most important factor in this latter strategy involves delivering the base from the .beta.-face of the carbohydrate ring in the glycosylation reaction because only the .beta.-isomers exhibit useful biological activity.\\nIt is well known in the art that the stereoselective introduction of bases to the anomeric centers of carbohydrates can be controlled by capitalizing on the neighboring group participation of a 2-substituent on the carbohydrate ring (Chem. Ber. 114:1234 (1981)). However, BCH-189 and its analogs do not possess a 2-substitutent and, therefore, cannot utilize this procedure unless additional steps to introduce a functional group that is both directing and disposable are incorporated into the synthesis. These added steps would lower the overall efficiency of the synthesis.\\nIt is also well known in the art that \\\"considerable amounts of the undesired .alpha.-nucleosides are always formed during the synthesis of 2'-deoxyribosides\\\" (Chem. Ber. 114:1234, 1244 (1981)). Furthermore, this reference teaches that the use of simple Friedel-Crafts catalysts like SnCl.sub.4 in nucleoside syntheses produces undesirable emulsions upon the workup of the reaction mixture, generates complex mixtures of the .alpha. and .beta.-isomers, and leads to stable o-complexes between the SnCl.sub.4 and the more basic silyated heterocycles such as silyated cytosine. These complexes lead to longer reaction times, lower yields, and production of the undesired unnatural N-3-nucleosides. Thus, the prior art teaches the use of trimethysilyl triflate or trimethylsilyl perchlorate as a catalyst during the coupling of pyrimidine bases with a carbohydrate ring to achieve high yields of the biologically active .beta.-isomers. However, the use of these catalysts to synthesize BCH-189 or BCH-189 analogs does not produce the .beta.-isomer preferentially; these reactions result in approximately a 50:50 ratio of the isomers.\\nThus, there exists a need for an efficient synthetic route to BCH-189 and its analogs. There also exists a need for a stereoselective synthetic route to the biologically active isomer of these compounds, .beta.-BCH-189 and related .beta.-analogs. Furthermore, there exists a need for a stereoselective synthetic route to enantiomerically-enriched .beta.-BCH-189 because the other enantiomer is inactive and, therefore, represents a 50% impurity.\", \"meta\": {\"bibliographic_information\": {\"Patent Number\": \"052044661\", \"Series Code\": \"7\", \"Application Number\": \"4733185\", \"Application Type\": \"1\", \"Art unit\": \"122\", \"Application Filing Date\": \"19900201\", \"Title of Invention\": \"Method and compositions for the synthesis of BCH-189 and related compounds\", \"Issue Date\": \"19930420\", \"Number of Claims\": \"11\", \"Exemplary Claim Number(s)\": \"1\", \"Primary Examiner\": \"Tsang; Cecilia\", \"Number of Drawing Sheets\": \"4\", \"Number of figures\": \"4\"}, \"source_file\": \"https://bulkdata.uspto.gov/data/patent/grant/redbook/fulltext/1993/pftaps19930420_wk16.zip\", \"abstract\": \"The present invention relates to a method of preparing BCH-189 and various analogs of BCH-189 from inexpensive precursors with the option of introducing functionality as needed. This synthetic route allows the stereoselective preparation of the biologically active isomer of these compounds, .beta.-BCH-189 and related compounds. Furthermore, the steochemistry at the nucleoside 4' position can be controlled to produce enantiomerically-enriched .beta.-BCH-189 and its analogs.\", \"citations\": [{\"Patent number\": \"5047407\", \"Issue date\": \"19910900\", \"Patentee name\": \"Belleau et al.\", \"US classification\": \"544310\"}], \"assignees\": [{\"inventor name\": \"Emory University\", \"City\": \"Atlanta\", \"State\": \"GA\", \"Assignee type code\": \"02\"}], \"classifications\": [{\"OCL\": [\"544317\"], \"XCL\": [\"544310\", \"XCL 544212\", \"XCL 544276\", \"XCL 544277\", \"XCL 544313\", \"XCL 544229\", \"XCL 544314\", \"XCL 549 4\", \"XCL 549 30\"], \"EDF\": [\"5\"], \"ICL\": [\"C07D41104\", \"ICL C07D47300\", \"ICL C07F 502\"], \"FSC\": [\"549\", \"FSC 544\"], \"FSS\": [\"310;4;30\", \"FSS 212;276;277;313;314;229\"]}], \"inventors\": [{\"inventor name\": \"Liotta; Dennis C.\", \"City\": \"Stone Mountain\", \"State\": \"GA\"}, {\"inventor name\": \"Choi; Woo-Baeg\", \"City\": \"Atlanta\", \"State\": \"GA\"}]}}\n", + "data_3_time1600293502_1999.jsonl@53846 content is \n", + "{\"text\": \"In 1981, documentation began on the disease that became known as Acquired Immune Deficiency Syndrome (AIDS), as well as its forerunner AIDS Related Complex (ARC). In 1983, the cause of the disease AIDS was established as a virus named the Human Immunodeficiency Virus type 1 (HIV-1). Usually, a person infected with the virus will eventually develop AIDS; in all known cases of AIDS the final outcome has always been death.\\nThe disease AIDS is the end result of an HIV-1 virus following its own complex life cycle. The virion life cycle begins with the virion attaching itself to the host human T-4 lymphocyte immune cell through the bonding of a glycoprotein on the surface of the virion's protective coat with the CD4 glycoprotein on the lymphocyte cell. Once attached, the virion sheds its glycoprotein coat, penetrates into the membrane of the host cell, and uncoats its RNA. The virion enzyme, reverse transcriptase, directs the process of transcribing the RNA into single stranded DNA. The viral RNA is degraded and a second DNA strand is created. The now double-stranded DNA is integrated into the human cell's genes and those genes are used for cell reproduction.\\nAt this point, the human cell carries out its reproductive process by using its own RNA polymerase to transcribe the integrated DNA into viral RNA. The viral RNA is translated into glycoproteins, structural proteins, and viral enzymes, which assemble with the viral RNA intact. When the host cell finishes the reproductive step, a new virion cell, not a T-4 lymphocyte, buds forth. The number of HIV-1 virus cells thus grows while the number of T-4 lymphocytes decline.\\nThe typical human immune system response, killing the invading virion, is taxed because a large portion of the virion's life cycle is spent in a latent state within the immune cell. In addition, viral reverse transcriptase, the enzyme used in making a new virion cell, is not very specific, and causes transcription mistakes that result in continually changed glycoproteins on the surface of the viral protective coat. This lack of specificity decreases the immune system's effectiveness because antibodies specifically produced against one glycoprotein may be useless against another, hence reducing the number of antibodies available to fight the virus. The virus continues to grow while the immune response system continues to weaken. Eventually, the HIV largely holds free reign over the body's immune system, allowing opportunistic infections to set in and ensuring that, without the administration of antiviral agents and/or immunomodulators, death will result.\\nThere are three critical points in the virus' life cycle which have been identified as targets for antiviral drugs: (1) the initial attachment of the virion to the T-4 lymphocyte, or macrophage, site, (2) the transcription of viral RNA to viral DNA, and (3) the assemblage of the new virion cell during reproduction.\\nInhibition of the virus at the second critical point, the viral RNA to viral DNA transcription process, has provided the bulk of the therapies used in treating AIDS. This transcription must occur for the virion to reproduce because the virion's genes are encoded in RNA; the host cell reads only DNA. By introducing drugs that block the reverse transcriptase from completing the formation of viral DNA, HIV-1 replication can be stopped.\\nNucleoside analogs, such as 3'-azido-3'-deoxythymidine (AZT), 2',3'-dideoxycytidine (DDC), 2',3'-dideoxythymidinene (D4T), 2',3'-dideoxyinosine (DDI), and various fluoro-derivatives of these nucleosides are relatively effective in halting HIV replication at the reverse transcriptase stage. Another promising reverse transcriptase inhibitor is 2',3'-dideoxy-3'-thia-cytidine (BCH-189), which contains an oxathiolane ring substituting for the sugar moiety in the nucleoside.\\nAZT is a successful anti-HIV drug because it sabotages the formation of viral DNA inside the host T-4 lymphocyte cell. When AZT enters the cell, cellular kinases activate AZT by phosphorylation to AZT triphosphate. AZT triphosphate then competes with natural thymidine nucleosides for the receptor site of HIV reverse transcriptase enzyme. The natural nucleoside possesses two reactive ends, the first for attachment to the previous nucleoside and the second for linking to the next nucleoside. The AZT molecule has only the first reactive end; once inside the HIV enzyme site, the AZT azide group terminates viral DNA formation because the azide cannot make the 3',5'-phosphodiester with the ribose moiety of the following nucleoside.\\nAZT's clinical benefits include increased longevity, reduced frequency and severity of opportunistic infections, and increased peripheral CD4 lymphocyte count. Immunosorbent assays for viral p24, an antigen used to track HIV-1 activity, show a significant decrease with use of AZT. However, AZT's benefits must be weighed against the severe adverse reactions of bone marrow suppression, nausea, myalgia, insomnia, severe headaches, anemia, peripheral neuropathy, and seizures. Furthermore, these adverse side effects occur immediately after treatment begins whereas a minimum of six weeks of therapy is necessary to realize AZT's benefits.\\nBoth DDC and D4T are potent inhibitors of HIV replication with activities comparable (D4T) or superior (DDC) to AZT. However, both DDC and D4T are converted to their 5' triphosphates less efficiently than their natural analogs and are resistent to deaminases and phosphorylases. Clinically, both compounds are toxic. Currently, DDI is used to conjunction with AZT to treat AIDS. However, DDI's side effects include sporadic pancreatis and peripheral neuropathy. Initial tests on 3'-fluoro-2'-3'-dideoxythymidine show that its anti-viral activity is comparable to that of AZT.\\nRecent tests on BCH-189 have shown that it possesses anti-HIV activity similar to AZT and DDC, but without the cell toxicity which causes the debilitating side effects of AZT and DDC. A sufficient quantity of BCH-189 is needed to allow clinical testing and treatment using the drug.\\nThe commonly-used chemical approaches for synthesizing nucleosides or nucleoside analogs can be classified into two broad categories: (1) those which modify intact nucleosides by altering the carbohydrate, the base, or both and (2) those which modify carbohydrates and incorporate the base, or its synthetic precursor, at a suitable stage in the synthesis. Because BCH-189 substitutes a sulfur atom for a carbon atom in the carbohydrate ring, the second approach is more feasible. The most important factor in this latter strategy involves delivering the base from the .beta.-face of the carbohydrate ring in the glycosylation reaction because only the $isomers exhibit useful biological activity.\\nIt is well known in the art that the stereoselective introduction of bases to the anomeric centers of carbohydrates can be controlled by capitalizing on the neighboring group participation of a 2-substituent on the carbohydrate ring (Chem. Ber. 114:1234 (1981)). However, BCH-189 and its analogs do not possess a 2-substitutent and, therefore, cannot utilize this procedure unless additional steps to introduce a functional group that is both directing and disposable are incorporated into the synthesis. These added steps would lower the overall efficiency of the synthesis.\\nIt is also well known in the art that \\\"considerable amounts of the undesired .alpha.-nucleosides are always formed during the synthesis of 2'-deoxyribosides\\\" (Chem. Ber. 114:1234, 1244 (1981)). Furthermore, this reference teaches that the use of simple Friedel-Crafts catalysts like SnCl.sub.4 in nucleoside syntheses produces undesirable emulsions upon the workup of the reaction mixture, generates complex mixtures of the .alpha. and .beta.-isomers, and leads to stable .delta.-complexes between the SnCl.sub.4 and the more basic silyated heterocycles such as silyated cytosine. These complexes lead to longer reaction times, lower yields, and production of the undesired unnatural N-3-nucleosides. Thus, the prior art teaches the use of trimethysilyl triflate or trimethylsilyl perchlorate as a catalyst during the coupling of pyrimidine bases with a carbohydrate ring to achieve high yields of the biologically active .beta.-isomers. However, the use of these catalysts to synthesize BCH-189 or BCH-189 analogs does not produce the .beta.-isoner preferentially; these reactions result in approximately a 50:50 ratio of the isomers.\\nThus, there exists a need for an efficient synthetic route to BCH-189 and its analogs. There also exists a need for a stereoselective synthetic route to the biologically active isomer of these compounds, .beta.-BCH-189 and related .beta.-analogs. Furthermore, there exists a need for a stereoselective synthetic route to enantiomerically-enriched .beta.-BCH-189 because the other enantiomer is inactive and, therefore, represents a 50% impurity.\", \"meta\": {\"bibliographic_information\": {\"Patent Number\": \"059144009\", \"Series Code\": \"8\", \"Application Number\": \"4723457\", \"Application Type\": \"1\", \"Art unit\": \"161\", \"Application Filing Date\": \"19950607\", \"Title of Invention\": \"Method and compositions for the synthesis of BCH-189 and related compounds\", \"Issue Date\": \"19990622\", \"Number of Claims\": \"4\", \"Exemplary Claim Number(s)\": \"1\", \"Primary Examiner\": \"Ford; John M.\", \"Number of Drawing Sheets\": \"4\", \"Number of figures\": \"4\"}, \"source_file\": \"https://bulkdata.uspto.gov/data/patent/grant/redbook/fulltext/1999/pftaps19990622_wk25.zip\", \"abstract\": \"The present invention relates to a method of preparing BCH-189 and various analogs of BCH-189 from inexpensive precursors with the option of introducing functionality as needed. This synthetic route allows the stereoselective preparation of the biologically active isomer of these compounds, .beta.-BCH-189 and related compounds. Furthermore, the steochemistry at the nucleoside 4' position can be controlled to produce enantiomerically-enriched .beta.-BCH-189 and its analogs.\", \"citations\": [{\"Patent number\": \"4000137\", \"Issue date\": \"19761200\", \"Patentee name\": \"Dvonoch et al.\", \"US classification\": \"260252\"}, {\"Patent number\": \"4336381\", \"Issue date\": \"19820600\", \"Patentee name\": \"Nagata et al.\", \"US classification\": \"544313\"}, {\"Patent number\": \"4861759\", \"Issue date\": \"19890800\", \"Patentee name\": \"Mitsuya et al.\", \"US classification\": \"514 46\"}, {\"Patent number\": \"4879277\", \"Issue date\": \"19891100\", \"Patentee name\": \"Mitsuya et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"4916122\", \"Issue date\": \"19900400\", \"Patentee name\": \"Chu et al.\", \"US classification\": \"514 50\"}, {\"Patent number\": \"4963533\", \"Issue date\": \"19901000\", \"Patentee name\": \"de Clerq et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"5011774\", \"Issue date\": \"19910400\", \"Patentee name\": \"Farina et al.\", \"US classification\": \"435 87\"}, {\"Patent number\": \"5041449\", \"Issue date\": \"19910800\", \"Patentee name\": \"Belleau et al.\", \"US classification\": \"544317\"}, {\"Patent number\": \"5059690\", \"Issue date\": \"19911000\", \"Patentee name\": \"Zahler et al.\", \"US classification\": \"544276\"}, {\"Patent number\": \"5204466\", \"Issue date\": \"19930400\", \"Patentee name\": \"Liotta et al.\", \"US classification\": \"544317\"}, {\"Patent number\": \"5539116\", \"Issue date\": \"19960700\", \"Patentee name\": \"Liotta et al.\", \"US classification\": \"544317\"}], \"assignees\": [{\"inventor name\": \"Emory University\", \"City\": \"Atlanta\", \"State\": \"GA\", \"Assignee type code\": \"02\"}], \"classifications\": [{\"OCL\": [\"544314\"], \"XCL\": [\"544317\", \"XCL 544310\", \"XCL 544313\", \"XCL 544229\"], \"EDF\": [\"6\"], \"ICL\": [\"C07D23934\", \"ICL C07D23936\", \"ICL C07D23954\"], \"FSC\": [\"544\"], \"FSS\": [\"310;317;313;229;314;274\"]}], \"inventors\": [{\"inventor name\": \"Liotta; Dennis C.\", \"City\": \"McDonough\", \"State\": \"GA\"}, {\"inventor name\": \"Choi; Woo-Baeg\", \"City\": \"North Brunswick\", \"State\": \"NY\"}]}}\n", + "data_0_time1600288933_1996.jsonl@52814 content is \n", + "{\"text\": \"The present invention relates to methods and compositions for preparing antiviral nucleoside analogs, particularly BCH-189 (2',3'-dideoxy-3'-thia-cytidine). More particularly, the invention relates to the selective synthesis of the .beta.-isomer of BCH-189 and related compounds as well as the selective synthesis of enantiomerically-enriched BCH-189 and related compounds.\\nIn 1981, documentation began on the disease that became known as Acquired Immune Deficiency Syndrome (AIDS), as well as its forerunner AIDS Related Complex (ARC). In 1983, the cause of the disease AIDS was established as a virus named the Human Immunodeficiency Virus type 1 (HIV-1). Usually, a person infected with the virus will eventually develop AIDS; in all known cases of AIDS the final outcome has always been death.\\nThe disease AIDS is the end result of an HIV-1 virus following its own complex life cycle. The virion life cycle begins with the virion attaching itself to the host human T-4 lymphocyte immune cell through the bonding of a glycoprotein on the surface of the virion's protective coat with the CD4 glycoprotein on the lymphocyte cell. Once attached, the virion sheds its glycoprotein coat, penetrates into the membrane of the host cell, and uncoats its RNA. The virion enzyme, reverse transcriptase, directs the process of transcribing the RNA into single stranded DNA. The viral RNA is degraded and a second DNA strand is created. The now double-stranded DNA is integrated into the human cell's genes and those genes are used for cell reproduction.\\nAt this point, the human cell carries out its reproductive process by using its own RNA polymerase to transcribe the integrated DNA into viral RNA. The viral RNA is translated into glycoproteins, structural proteins, and viral enzymes, which assemble with the viral RNA intact. When the host cell finishes the reproductive step, a new virion cell, not a T-4 lymphocyte, buds forth. The number of HIV-1 virus cells thus grows while the number of T-4 lymphocytes decline.\\nThe typical human immune system response, killing the invading virion, is taxed because a large portion of the virion's life cycle is spent in a latent state within the immune cell. In addition, viral reverse transcriptase, the enzyme used in making a new virion cell, is not very specific, and causes transcription mistakes that result in continually changed glycoproteins on the surface of the viral protective coat. This lack of specificity decreases the immune system's effectiveness because antibodies specifically produced against one glycoprotein may be useless against another, hence reducing the number of antibodies available to fight the virus. The virus continues to grow while the immune response system continues to weaken. Eventually, the HIV largely holds free reign over the body's immune system, allowing opportunistic infections to set in and ensuring that, without the administration of antiviral agents and/or immunomodulators, death will results.\\nThere are three critical points in the virus's life cycle which have been identified as targets for antiviral drugs: (1) the initial attachment of the virion to the T-4 lymphocyte, or macrophage, site, (2) the transcription of viral RNA to viral DNA, and (3) the assemblage of the new virion cell during reproduction.\\nInhibition of the virus at the second critical point, the viral RNA to vital DNA transcription process, has provided the bulk of the therapies used in treating AIDS. This transcription must occur for the virion to reproduce because the virion's genes are encoded in RNA; the host cell reads only DNA. By introducing drugs that block the reverse transcriptase from completing the formation of viral DNA, HIV-1 replication can be stopped.\\nNucleoside analogs, such as 3'-azido-3'-deoxythymidine (AZT), 2',3'-dideoxycytidine (DDC), 2',3'-dideoxythymidinene (D4T), 2',3'-dideoxyinosine (DDI), and various fluoro-derivatives of these nucleosides are relatively effective in halting HIV replication at the reverse transcriptase stage. Another promising reverse transcriptase inhibitor is 2',3'-dideoxy-3'-thia-cytidine (BCH-189), which contains an oxathiolane ring substituting for the sugar moiety in the nucleoside.\\nAZT is a successful anti-HIV drug because it sabotages the formation of viral DNA inside the host T-4 lymphocyte cell. When AZT enters the cell, cellular kinases activate AZT by phosphorylation to AZT triphosphate. AZT triphosphate then competes with natural thymidine nucleosides for the receptor site of HIV reverse transcriptase enzyme. The natural nucleoside possesses two reactive ends, the first for attachment to the previous nucleoside and the second for linking to the next nucleoside. The AZT molecule has only the first reactive end; once inside the HIV enzyme site, the AZT azide group terminates viral DNA formation because the azide cannot make the 3',5'-phosphodiester with the ribose moiety of the following nucleoside.\\nAZT's clinical benefits include increased longevity, reduced frequency and severity of opportunistic infections, and increased peripheral CD4 lymphocyte count. Immunosorbent assays for viral p24, an antigen used to track HIV-1 activity, show a significant decrease with use of AZT. However, AZT's benefits must be weighed against the severe adverse reactions of bone marrow suppression, nausea, myalgia, insomnia, severe headaches, anemia, peripheral neuropathy, and seizures. Furthermore, these adverse side effects occur immediately after treatment begins whereas a minimum of six weeks of therapy is necessary to realize AZT's benefits.\\nBoth DDC and D4T are potent inhibitors of HIV replication with activities comparable (D4T) or superior (DDC) to AZT. However, both DDC and D4T are converted to their 5' triphosphates less efficiently than their natural analogs and are resistent to deaminases and phosphorylases. Clinically, both compounds are toxic. Currently, DDI is used in conjunction with AZT to treat AIDS. However, DDI's side effects include sporadic pancreatis and peripheral neuropathy. Initial tests on 3'-fluoro-2'-3'-dideoxythymidine show that its anti-viral activity is comparable to that of AZT.\\nRecent tests on BCH-189 have shown that it possesses anti-HIV activity similar to AZT and DDC, but without the cell toxicity which causes the debilitating side effects of AZT and DDC. A sufficient quantity of BCH-189 is needed to allow clinical testing and treatment using the drug.\\nThe commonly-used chemical approaches for synthesizing nucleosides or nucleoside analogs can be classified into two broad categories: (1) those which modify intact nuceosides by altering the carbohydrate, the base, or both and (2) those which modify carbohydrates and incorporate the base, or its synthetic precursor, at a suitable stage in the synthesis. Because BCH-189 substitutes a sulfur atom for a carbon atom in the carbohydrate ring, the second approach is more feasible. The most important factor in this latter strategy involves delivering the base from the .beta.-face of the carbohydrate ring in the glycosylation reaction because only the .beta.-isomers exhibit useful biological activity.\\nIt is well known in the art that the stereoselective introduction of bases to the anomeric centers of carbohydrates can be controlled by capitalizing on the neighboring group participation of a 2-substituent on the carbohydrate ring (Chem. Ber. 114:1234 (1981)). However, BCH-189 and its analogs do not possess a 2-substitutent and, therefore, cannot utilize this procedure unless additional steps to introduce a functional group that is both directing and disposable are incorporated into the synthesis. These added steps would lower the overall efficiency of the synthesis.\\nIt is also well known in the art that \\\"considerable amounts of the undesired .alpha.-nucleosides are always formed during the synthesis of 2'-deoxyribosides\\\" (Chem. Ber. 114:1234, 1244 (1981)). Furthermore, this reference teaches that the use of simple Friedel-Crafts catalysts like SnCl.sub.4 in nucleoside syntheses produces undesirable emulsions upon the workup of the reaction mixture, generates complex mixtures of the .alpha. and .beta.-isomers, and leads to stable p-complexes between the SnCl.sub.4 and the more basic silyated heterocycles such as silyated cytosine. These complexes lead to longer reaction times, lower yields, and production of the undesired unnatural N-3-nucleosides. Thus, the prior art teaches the use of trimethysilyl triflate or trimethylsilyl perchlorate as a catalyst during the coupling of pyrimidine bases with a carbohydrate ring to achieve high yields of the biologically active .beta.-isomers. However, the use of these catalysts to synthesize BCH-189 or BCH-189 analogs does not produce the .beta.-isomer preferentially; these reactions result in approximately a 50:50 ratio of the isomers.\\nThus, there exists a need for an efficient synthetic route to BCH-189 and its analogs. There also exists a need for a stereoselective synthetic route to the biologically active isomer of these compounds, .beta.-BCH-189 and related .beta.-analogs. Furthermore, there exists a need for a stereoselective synthetic route to enantiomerically-enriched .beta.-BCH-189 because the other enantiomer is inactive and, therefore, represents a 50% impurity.\", \"meta\": {\"bibliographic_information\": {\"Patent Number\": \"055391168\", \"Series Code\": \"8\", \"Application Number\": \"0159921\", \"Application Type\": \"1\", \"Art unit\": \"122\", \"Application Filing Date\": \"19930210\", \"Title of Invention\": \"Method and compositions for the synthesis of BCH-189 and related compounds\", \"Issue Date\": \"19960723\", \"Number of Claims\": \"7\", \"Exemplary Claim Number(s)\": \"1\", \"Primary Examiner\": \"Tsang; Cecilia\", \"Number of Drawing Sheets\": \"4\", \"Number of figures\": \"4\", \"Disclaimer Date\": \"20140321\"}, \"source_file\": \"https://bulkdata.uspto.gov/data/patent/grant/redbook/fulltext/1996/pftaps19960723_wk30.zip\", \"abstract\": \"The present invention relates to a method of preparing BCH-189 and various analogs of BCH-189 from inexpensive precursors with the option of introducing functionality as needed. This synthetic route allows the stereoselective preparation of the biologically active isomer of these compounds, .beta.-BCH-189 and related compounds. Furthermore, the steochemistry at the nucleoside 4' position can be controlled to produce enantiomerically-enriched .beta.-BCH-189 and its analogs.\", \"citations\": [{\"Patent number\": \"4000137\", \"Issue date\": \"19761200\", \"Patentee name\": \"Dvonoch et al.\", \"US classification\": \"260252\"}, {\"Patent number\": \"4336381\", \"Issue date\": \"19820600\", \"Patentee name\": \"Nagata et al.\", \"US classification\": \"544313\"}, {\"Patent number\": \"4861759\", \"Issue date\": \"19890800\", \"Patentee name\": \"Mitsuya et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"4879277\", \"Issue date\": \"19891100\", \"Patentee name\": \"Mitsuya et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"4916122\", \"Issue date\": \"19900400\", \"Patentee name\": \"Chu et al.\", \"US classification\": \"514 50\"}, {\"Patent number\": \"4963533\", \"Issue date\": \"19901000\", \"Patentee name\": \"de Clerq et al.\", \"US classification\": \"514 49\"}, {\"Patent number\": \"5011774\", \"Issue date\": \"19910400\", \"Patentee name\": \"Farina et al.\", \"US classification\": \"435 87\"}, {\"Patent number\": \"5041449\", \"Issue date\": \"19910800\", \"Patentee name\": \"Bellean et al.\", \"US classification\": \"544277\"}, {\"Patent number\": \"5047407\", \"Issue date\": \"19910900\", \"Patentee name\": \"Bellean et al.\", \"US classification\": \"514274\"}, {\"Patent number\": \"5059690\", \"Issue date\": \"19911000\", \"Patentee name\": \"Zahler et al.\", \"US classification\": \"544276\"}], \"assignees\": [{\"inventor name\": \"Emory University\", \"City\": \"Atlanta\", \"State\": \"GA\", \"Assignee type code\": \"02\"}], \"classifications\": [{\"OCL\": [\"544317\"], \"XCL\": [\"544229\", \"XCL 544313\", \"XCL 544314\", \"XCL 544318\"], \"EDF\": [\"6\"], \"ICL\": [\"C07D41104\", \"ICL C07F 502\", \"ICL A61K 31505\"], \"FSC\": [\"544\"], \"FSS\": [\"313;314;317\"]}], \"inventors\": [{\"inventor name\": \"Liotta; Dennis C.\", \"City\": \"Stone Mountain\", \"State\": \"GA\"}, {\"inventor name\": \"Choi; Woo-Baeg\", \"City\": \"Atlanta\", \"State\": \"GA\"}]}}\n" + ] + } + ], + "source": [ + "idx = 1000\n", + "left = []\n", + "right = []\n", + "for rid, component in enumerate(components):\n", + " if rid > idx:\n", + " break\n", + " if rid != idx:\n", + " continue\n", + " print(\"left is\")\n", + " left.append(reversed_mapper[component[0]])\n", + " print(f\" {left[0]}\")\n", + " print(\"right is\")\n", + " for j in range(1, len(component)):\n", + " doc = reversed_mapper[component[j]]\n", + " right.append(doc)\n", + " print(f\" {doc}\")\n", + "file_name, n_row = left[0].split(\"@\")\n", + "print(left[0], \"content is \")\n", + "! sed -n {n_row}p {path}/{file_name}\n", + "for r in right:\n", + " print(r, \"content is \")\n", + " file_name, n_row = r.split(\"@\")\n", + " ! sed -n {n_row}p {path}/{file_name}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b03c214-a031-426e-bdb8-96c72101193d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/apply_deduplication.ipynb b/tools/near_dedup/PILE_notebooks/apply_deduplication.ipynb new file mode 100644 index 000000000..6d9bd89a6 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/apply_deduplication.ipynb @@ -0,0 +1,236 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "dd13cba6-6f8f-40b4-a956-e707f8fcb877", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 1 for number of processes\n", + "100%|████████████████████████████████████████████| 1/1 [03:05<00:00, 185.44s/it]\n", + "apply duplicates.pickle to create new data took 185.49705739098135 sec\n" + ] + } + ], + "source": [ + "input_path = \"/home/vmagent/app/PILE\"\n", + "output_path = \"/home/vmagent/app/PILE_output/\"\n", + "\n", + "bucket = \"FreeLaw\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "58008b35-e595-47e5-be56-78a9927c24be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 1 for number of processes\n", + "100%|█████████████████████████████████████████████| 1/1 [01:07<00:00, 67.05s/it]\n", + "apply duplicates.pickle to create new data took 67.08336020295974 sec\n" + ] + } + ], + "source": [ + "bucket = \"PUBMED\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "4465fc9b-a38e-4e26-b6bf-8d21a77873d0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 45 for number of processes\n", + "100%|███████████████████████████████████████████| 45/45 [00:42<00:00, 1.06it/s]\n", + "apply duplicates.pickle to create new data took 42.78813537606038 sec\n" + ] + } + ], + "source": [ + "bucket = \"pile_uspto\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "b7636688-8ea7-4f87-968a-30ca11011f78", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 1 for number of processes\n", + "100%|█████████████████████████████████████████████| 1/1 [00:25<00:00, 25.91s/it]\n", + "apply duplicates.pickle to create new data took 25.924333511968143 sec\n" + ] + } + ], + "source": [ + "bucket = \"EuroParl\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "70809848-c1f5-491c-9ac0-af964a269f01", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 1 for number of processes\n", + "100%|█████████████████████████████████████████████| 1/1 [00:11<00:00, 11.25s/it]\n", + "apply duplicates.pickle to create new data took 11.300638337968849 sec\n" + ] + } + ], + "source": [ + "bucket = \"NIH\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8590f524-0b7a-4641-8bb4-2fa88221a344", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 1 for number of processes\n", + "100%|█████████████████████████████████████████████| 1/1 [00:14<00:00, 14.57s/it]\n", + "apply duplicates.pickle to create new data took 14.592552542919293 sec\n" + ] + } + ], + "source": [ + "bucket = \"PhilArch\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4c1c2536-9562-4122-987a-9471ce5825a4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 1 for number of processes\n", + "100%|█████████████████████████████████████████████| 1/1 [00:04<00:00, 4.84s/it]\n", + "apply duplicates.pickle to create new data took 4.862166045000777 sec\n" + ] + } + ], + "source": [ + "bucket = \"hn\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f9b4c02f-db61-4c70-bdc9-5dc8e65a28fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n", + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n", + "apply duplicates.pickle to create new data started ...\n", + "resetting to 48 for number of processes\n", + "100%|███████████████████████████████████████████| 48/48 [01:38<00:00, 2.05s/it]\n", + "apply duplicates.pickle to create new data took 98.7749809169909 sec\n" + ] + } + ], + "source": [ + "bucket = \"pmc\"\n", + "! cd ../; python dedup_convert.py -d {input_path}/{bucket} -f {output_path}/{bucket}/deduplicate/duplicates.pickle -o {output_path}/{bucket}/output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46f4a90d-8f46-4c2b-bbd7-e9dc6b85b6dc", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/freelaw_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/freelaw_near_dedup.ipynb new file mode 100644 index 000000000..05d5a4349 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/freelaw_near_dedup.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "\n", + "from near_dedup import *" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/FreeLaw')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/FreeLaw/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17e776fe-d214-43e8-80be-3b0bf8604e1d", + "metadata": {}, + "outputs": [], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/FreeLaw/FreeLaw_Opinions.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:======================================================>(199 + 1) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 92.56428317597602 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 2542.00012657803 sec\n" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88a1e50b-a333-4e88-bb78-47a88b6fd6db", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 203/203 [00:00<00:00, 1566.65it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/FreeLaw/deduplicate/duplicates.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "Failed to process /home/vmagent/app/PILE_output/FreeLaw/deduplicate/connected_components.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "length of the set of duplicates: 108593 0.13472366333007812\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 108593/108593 [00:00<00:00, 1026996.80it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 54997 0.3537757396697998\n", + "Graph generated duplicates list!!! 0.42903733253479004\n", + "generate_connected_components all took 0.4670676819514483 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 54997/54997 [00:00<00:00, 645282.05it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 101089\n", + "generate_duplicates_dict all took 0.13365483097732067 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 3562015 documents\n", + " total detected 101089 duplicated documents\n", + " duplicate ratio is 0.02837972327460721\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/hn_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/hn_near_dedup.ipynb new file mode 100644 index 000000000..2510192a4 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/hn_near_dedup.ipynb @@ -0,0 +1,432 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "\n", + "from near_dedup import * " + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/hn')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/hn/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2a9bf4a-a43d-4ab2-955e-eb91ba675737", + "metadata": {}, + "outputs": [], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/hn/part_0.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 3:======================================================>(197 + 3) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 14.270188356051221 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 14:================================================> (184 + 16) / 200]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 103.93559605104383 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63f02224-2e7b-410b-a6f0-b3f1525339e9", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 203/203 [00:00<00:00, 5747.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/hn/deduplicate/duplicates.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "Failed to process /home/vmagent/app/PILE_output/hn/deduplicate/connected_components.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "length of the set of duplicates: 4853 0.04064679145812988\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 4853/4853 [00:00<00:00, 1337382.21it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 26 0.04944562911987305\n", + "Graph generated duplicates list!!! 0.05143308639526367\n", + "generate_connected_components all took 0.05592275899834931 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 26/26 [00:00<00:00, 6544.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 4853\n", + "generate_duplicates_dict all took 0.009566550957970321 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 373027 documents\n", + " total detected 4853 duplicated documents\n", + " duplicate ratio is 0.013009782133732948\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "053a9ddd-c398-4d17-a011-ed523c652bad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/pile_uspto_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/pile_uspto_near_dedup.ipynb new file mode 100644 index 000000000..2c4fca9e7 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/pile_uspto_near_dedup.ipynb @@ -0,0 +1,487 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "from near_dedup import *\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/pile_uspto')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/pile_uspto/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "306ef8e3-6a7c-43d9-b4c4-1a941c1e141a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Will assign 48 cores and 308492 M memory for spark\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/08/30 16:26:53 WARN Utils: Your hostname, sr414 resolves to a loopback address: 127.0.1.1; using 10.1.2.14 instead (on interface enp134s0f1)\n", + "23/08/30 16:26:53 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "23/08/30 16:26:54 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "per core memory size is 6.276 GB and shuffle_disk maximum capacity is 8589934592.000 GB\n" + ] + } + ], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/pile_uspto/data_0_time1600242225_1976.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_0_time1600288933_1996.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_0_time1600364422_2006.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_10_time1600247352_1986.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_10_time1600397964_2016.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_11_time1600248055_1987.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_11_time1600403125_2017.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_12_time1600248735_1988.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_12_time1600407882_2018.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_13_time1600249593_1989.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_13_time1600413654_2019.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_14_time1600250414_1990.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_14_time1600418007_2020.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_15_time1600251300_1991.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_16_time1600252232_1992.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_17_time1600253218_1993.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_18_time1600254256_1994.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_19_time1600255349_1995.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_1_time1600242733_1977.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_1_time1600290224_1997.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_1_time1600366285_2007.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_2_time1600243253_1978.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_2_time1600291526_1998.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_2_time1600368167_2008.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_3_time1600243638_1979.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_3_time1600293502_1999.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_3_time1600370287_2009.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_4_time1600244129_1980.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_4_time1600295577_2000.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_4_time1600373162_2010.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_5_time1600244662_1981.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_5_time1600297749_2001.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_5_time1600376227_2011.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_6_time1600245134_1982.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_6_time1600300737_2002.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_6_time1600379743_2012.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_7_time1600245601_1983.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_7_time1600303730_2003.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_7_time1600383780_2013.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_8_time1600246160_1984.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_8_time1600306688_2004.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_8_time1600388299_2014.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_9_time1600246762_1985.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_9_time1600308480_2005.jsonl\n", + "/home/vmagent/app/PILE/pile_uspto/data_9_time1600393078_2015.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 268:> (0 + 1) / 1]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 212.13308584492188 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 1390.2824745549588 sec\n" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "50077ae0-131d-4930-9b6d-04f7d6c40bb3", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 8801/8801 [00:01<00:00, 8729.32it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "length of the set of duplicates: 1220088 1.012829065322876\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1220088/1220088 [00:01<00:00, 706828.50it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 613348 4.172353982925415\n", + "Graph generated duplicates list!!! 5.222286939620972\n", + "generate_connected_components all took 5.889061606954783 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 613348/613348 [00:01<00:00, 553290.64it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 1063551\n", + "generate_duplicates_dict all took 2.27969934605062 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 5883037 documents\n", + " total detected 1063551 duplicated documents\n", + " duplicate ratio is 0.18078264678600525\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "053a9ddd-c398-4d17-a011-ed523c652bad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/PILE_notebooks/pmc_near_dedup.ipynb b/tools/near_dedup/PILE_notebooks/pmc_near_dedup.ipynb new file mode 100644 index 000000000..3773e8b65 --- /dev/null +++ b/tools/near_dedup/PILE_notebooks/pmc_near_dedup.ipynb @@ -0,0 +1,511 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "JAVA_HOME is not set, use default value of /usr/lib/jvm/java-8-openjdk-amd64/\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.10/dist-packages/pyspark/pandas/__init__.py:50: UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not work if there is a Spark context already launched.\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\t\t\t\n", + "\t\t" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import sys\n", + "cur_path = \"/home/vmagent/app\"\n", + "sys.path.append(cur_path)\n", + "\n", + "from near_dedup import *\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/PILE/pmc')\n", + "dup_dir = \"/home/vmagent/app/PILE_output/pmc/deduplicate\"\n", + "ngram_size = 13\n", + "num_perm = 256\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a3876729-c56a-4ad9-97f3-a85d77818444", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Will assign 48 cores and 308492 M memory for spark\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "23/08/30 17:13:59 WARN Utils: Your hostname, sr414 resolves to a loopback address: 127.0.1.1; using 10.1.2.14 instead (on interface enp134s0f1)\n", + "23/08/30 17:13:59 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "23/08/30 17:14:00 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "per core memory size is 6.276 GB and shuffle_disk maximum capacity is 8589934592.000 GB\n" + ] + } + ], + "source": [ + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID started ...\n", + "/home/vmagent/app/PILE/pmc/part_0.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_1.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_10.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_11.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_12.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_13.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_14.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_15.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_16.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_17.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_18.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_19.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_2.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_20.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_21.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_22.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_23.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_24.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_25.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_26.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_27.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_28.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_29.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_3.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_30.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_31.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_32.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_33.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_34.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_35.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_36.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_37.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_38.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_39.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_4.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_40.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_41.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_42.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_43.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_44.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_45.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_46.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_47.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_5.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_6.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_7.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_8.jsonl\n", + "/home/vmagent/app/PILE/pmc/part_9.jsonl\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 144:===================================================(9600 + 0) / 9600]\r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Load data with RowID took 274.0298769559013 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "generate minHashLsh started ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate minHashLsh took 3619.6923032089835 sec\n" + ] + } + ], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "50077ae0-131d-4930-9b6d-04f7d6c40bb3", + "metadata": {}, + "outputs": [], + "source": [ + "spark.stop()" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_connected_components all started ...\n", + "Started graph building\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 38%|███████████████████████████████████████████▎ | 3646/9603 [00:00<00:00, 36458.38it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/pmc/deduplicate/duplicates.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "loop on file: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 9603/9603 [00:00<00:00, 36910.04it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Failed to process /home/vmagent/app/PILE_output/pmc/deduplicate/connected_components.pickle, error is 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte\n", + "length of the set of duplicates: 239010 0.2639467716217041\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 239010/239010 [00:00<00:00, 1167798.88it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of connected components: 1148 0.4844677448272705\n", + "Graph generated duplicates list!!! 0.5864162445068359\n", + "generate_connected_components all took 0.6859650410478935 sec\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "generate_duplicates_dict all started ...\n", + "Processing duplicates!!!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1148/1148 [00:00<00:00, 9223.18it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "number of duplicate documents that will be removed: 234309\n", + "generate_duplicates_dict all took 0.21165297203697264 sec\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed!!\n", + " total processed 3097097 documents\n", + " total detected 234309 duplicated documents\n", + " duplicate ratio is 0.07565439506738084\n" + ] + } + ], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "053a9ddd-c398-4d17-a011-ed523c652bad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/README.md b/tools/near_dedup/README.md new file mode 100644 index 000000000..a3d75e39c --- /dev/null +++ b/tools/near_dedup/README.md @@ -0,0 +1,67 @@ +# Near Dedup + +## Intro + +Near Dedup is to Detect duplicated documents and output as a duplicates list. + +Step 1. We use [DataSketch minHash](https://ekzhu.com/datasketch/minhash.html) as the base algorithm to calculate (hash, band_id) pair for each documents. + +Step 2. We use Spark Groupby to find the local lists for documents sharing the same (hash, band_id) pair. + +Step 3. We use SlimPajama [connected component graph](https://github.com/Cerebras/modelzoo/blob/main/modelzoo/transformers/data_processing/slimpajama/dedup/generate_connected_components.py) to detect global lists and [generate duplication list](https://github.com/Cerebras/modelzoo/blob/main/modelzoo/transformers/data_processing/slimpajama/dedup/generate_duplicates_dict.py) for documents sharing the same (hash, band_id) pair. + +Step 4(Optional). We apply the duplication list to original file to elimate duplicated documents. + +Now, only support to run with single node. Distributed Run will support by Ray in near Future. + +## Expected input and Output + +Input format: a folder of *.jsonl. + +near_dedup.py Output: a folder with duplicates.pickle(index of duplicated documents), connected_components.pickle(graph indicates the connections between duplications) + +dedup_convert.py Output: a folder of *.jsonl files (deduplicated) + +## How to RUN + +0. setup +``` +cd llm-ray/tools/near_dedup +cd docker +docker compose build && docker compose run autofe-notebook-dev +``` + +### option 1. using cmdline + +``` +docker exec -it `docker ps | grep 'autofe-notebook-dev' | awk '{print $NF}'` /bin/bash +``` +Now you are inside container +0. (Optional) convert text files to jsonl +``` +python convert_jsonl.py -d ${raw_data_dir} -o ${output_dir} -n {num_partition} | tee -a ${log} +``` + +1. generate dedup pickle +``` +python near_dedup.py -d ${to_dedup_data_folder} | tee -a ${log} +``` + +2. using dedup pickle to shink data +``` +python dedup_convert.py -d ${to_dedup_data_folder} -f ${dedup_dict_file} -o ${output_folder} | tee -a ${log} +``` + +### option 2. using notebook + +There will be notebook url shown as below +``` +[I 2023-08-28 16:24:48.132 ServerApp] Serving notebooks from local directory: /home/vmagent/app/workspace +[I 2023-08-28 16:24:48.132 ServerApp] Jupyter Server 2.7.1 is running at: +[I 2023-08-28 16:24:48.132 ServerApp] http://${hostname}:8890/lab +[I 2023-08-28 16:24:48.132 ServerApp] http://127.0.0.1:8890/lab +[I 2023-08-28 16:24:48.132 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation). + +``` +template notebooks are at [template_notebooks](template_notebooks) +PILE processed notebooks are at [PILE_notebooks](PILE_notebooks) \ No newline at end of file diff --git a/tools/near_dedup/convert_jsonl.py b/tools/near_dedup/convert_jsonl.py new file mode 100644 index 000000000..31dade479 --- /dev/null +++ b/tools/near_dedup/convert_jsonl.py @@ -0,0 +1,24 @@ +import argparse +import os +from multiprocessing import Pool, cpu_count +from pyrecdp.core.utils import Timer +from math import ceil +from tqdm import tqdm +import json +from pyrecdp.primitives.llmutils.text_to_jsonl import * + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("-d", dest="data_dir", type=str) + parser.add_argument("-o", dest="out_dir", type=str) + parser.add_argument("-n", dest="n_part", type=int, default = 10) + args = parser.parse_args() + + data_dir = args.data_dir + out_dir = args.out_dir + n_part = args.n_part + + with Timer(f"apply duplicates.pickle to create new data"): + text_to_jsonl_MP(data_dir, out_dir, n_part) + \ No newline at end of file diff --git a/tools/near_dedup/dedup_convert.py b/tools/near_dedup/dedup_convert.py new file mode 100644 index 000000000..5b7befd48 --- /dev/null +++ b/tools/near_dedup/dedup_convert.py @@ -0,0 +1,35 @@ +import argparse +import os +import sys +import pickle +import queue +from multiprocessing import Pool, cpu_count +from pyrecdp.core.utils import Timer +from math import ceil +from tqdm import tqdm +from pyrecdp.primitives.llmutils.shrink_jsonl import * + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + # data_files, dup_dir, ngram_size, num_perm, bands, ranges + #pipeline = minHashLSH_prepare(df, num_perm = 256, ngram_size = 6, bands = 9, ranges = 13) + parser.add_argument("-d", dest="data_dir", type=str) + parser.add_argument("-f", dest="dup_dict", type=str, default=None) + parser.add_argument("-o", dest="out_dir", type=str, default=None) + args = parser.parse_args() + + data_dir = args.data_dir + dup_dir = os.path.join(data_dir, "deduplicate") + if args.dup_dict is None: + dup_dict = os.path.join(dup_dir, "duplicates.pickle") + else: + dup_dict = args.dup_dict + + if args.out_dir is None: + out_dir = os.path.join(dup_dir, "output") + else: + out_dir = args.out_dir + + with Timer(f"apply duplicates.pickle to create new data"): + shrink_document_MP(data_dir, dup_dict, out_dir) + \ No newline at end of file diff --git a/tools/near_dedup/docker/Dockerfile b/tools/near_dedup/docker/Dockerfile new file mode 100644 index 000000000..076e34b0b --- /dev/null +++ b/tools/near_dedup/docker/Dockerfile @@ -0,0 +1,15 @@ +FROM ubuntu:22.04 + +RUN apt-get update -y && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + python3 \ + python3-pip \ + python-is-python3 \ + git \ + graphviz \ + openjdk-8-jre && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +RUN pip install --upgrade pip +RUN pip install jupyterlab +RUN pip install pyspark +RUN pip install pyrecdp --pre \ No newline at end of file diff --git a/tools/near_dedup/docker/docker-compose.yml b/tools/near_dedup/docker/docker-compose.yml new file mode 100644 index 000000000..3734ba13e --- /dev/null +++ b/tools/near_dedup/docker/docker-compose.yml @@ -0,0 +1,29 @@ +networks: + autofe_workflow: + external: true +services: + autofe-notebook-dev: + build: + args: + http_proxy: ${http_proxy} + https_proxy: ${https_proxy} + dockerfile: Dockerfile + context: ./ + command: + - /bin/bash + - -c + - | + jupyter lab --allow-root --ip 0.0.0.0 --NotebookApp.token='' --NotebookApp.password='' --notebook-dir /home/vmagent/app/ + container_name: autofe_dev + network_mode: "host" + environment: + - http_proxy=${http_proxy} + - https_proxy=${https_proxy} + image: intel/ai-workflows:pa-autofe + privileged: true + devices: + - /dev/dri + volumes: + - ../:/home/vmagent/app/ + working_dir: /home/vmagent/app/ + shm_size: 300g diff --git a/tools/near_dedup/near_dedup.py b/tools/near_dedup/near_dedup.py new file mode 100644 index 000000000..e11cf20ea --- /dev/null +++ b/tools/near_dedup/near_dedup.py @@ -0,0 +1,91 @@ +import argparse +import os +import sys +import ftfy +import re +import numpy as np +import pickle +from pyrecdp.core.utils import Timer +from pyrecdp.core import SparkDataProcessor +from pyrecdp.core.utils import Timer +from pyrecdp.primitives.llmutils.near_dedup import * +from pyrecdp.primitives.llmutils.utils import * +import pyspark.sql.functions as F +from pyspark.sql.window import Window +import shutil +from nltk import ngrams +import string + +def run(data_files, dup_dir, ngram_size, num_perm, bands, ranges, enable_ray): + if enable_ray: + rdp = SparkDataProcessor(spark_mode='ray') + else: + rdp = SparkDataProcessor() + spark=rdp.spark + try: + with Timer("Load data with RowID"): + df = read_json(data_files, spark).cache() + total_length = df.count() + + pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges) + with Timer("generate minHashLsh"): + if os.path.exists(dup_dir): + shutil.rmtree(dup_dir, ignore_errors=True) + results = pipeline.saveAsTextFile(dup_dir) + + + with Timer(f"generate_connected_components all"): + dup_connected_args = argparse.Namespace() + dup_connected_args.input_dir = dup_dir + dup_connected_args.out_file = os.path.join( + dup_dir, "connected_components.pickle" + ) + generate_connected_components.generate_connected_components_mp( + dup_connected_args + ) + + with Timer(f"generate_duplicates_dict all"): + dup_docs = os.path.join(dup_dir, "duplicates.pickle") + dup_dict_args = argparse.Namespace() + dup_dict_args.input_file = os.path.join( + dup_dir, "connected_components.pickle" + ) + dup_dict_args.out_file = dup_docs + generate_duplicates_dict.generate_duplicates(dup_dict_args) + + dup_dict = pickle.load(open(os.path.join(dup_dir, "duplicates.pickle"), 'rb')) + dup_sum = 0 + for _, v in dup_dict.items(): + dup_sum += len(list(v)) + + print(f"Completed!!") + print(f" total processed {total_length} documents") + print(f" total detected {dup_sum} duplicated documents") + print(f" duplicate ratio is {dup_sum/total_length}") + except Exception as e: + spark.stop() + print("Failed", e) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + # data_files, dup_dir, ngram_size, num_perm, bands, ranges + #pipeline = minHashLSH_prepare(df, num_perm = 256, ngram_size = 6, bands = 9, ranges = 13) + parser.add_argument("-d", dest="data_dir", type=str) + parser.add_argument("--nperm", dest="num_perm", type=int, default=256) + parser.add_argument("--ngram", dest="ngram_size", type=int, default=6) + parser.add_argument("--bands", dest="bands", type=int, default=9) + parser.add_argument("--ranges", dest="ranges", type=int, default=13) + parser.add_argument("--enable_ray", dest="enable_ray", action='store_true', default=False) + args = parser.parse_args() + data_dir = args.data_dir + + data_files = get_data_files(data_dir) + dup_dir = os.path.join(data_dir, "deduplicate") + + num_perm = args.num_perm + ngram_size = args.ngram_size + bands = args.bands + ranges = args.ranges + enable_ray = args.enable_ray + with Timer(f"Generate duplicate dict for {data_dir}"): + run(data_files, dup_dir, ngram_size, num_perm, bands, ranges, enable_ray) diff --git a/tools/near_dedup/template_notebooks/debug_batch_near_dedup.ipynb b/tools/near_dedup/template_notebooks/debug_batch_near_dedup.ipynb new file mode 100644 index 000000000..20e8a310d --- /dev/null +++ b/tools/near_dedup/template_notebooks/debug_batch_near_dedup.ipynb @@ -0,0 +1,662 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "markdown", + "id": "bc12e6e9-8068-4ceb-9d79-937f9ba9b6df", + "metadata": {}, + "source": [ + "## difference in bigcode and slim\n", + "\n", + "1. ngram =>\n", + " slim uses: ngrams(content, ngram_size)\n", + " bigcode uses: ngrams(NON_ALPHA.split(content), ngram_size)\n", + "\n", + "2. permuations =>\n", + " slim generate permutation by datasketch\n", + " bigcide generate permutation its self." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/vmagent/app/modelzoo\n", + "/home/vmagent/app/bigcode-dataset/near_deduplication/\n" + ] + } + ], + "source": [ + "import argparse\n", + "import os\n", + "import sys\n", + "import ftfy\n", + "import pyspark.sql.functions as F\n", + "import shutil\n", + "\n", + "cur_path = \"/home/vmagent/app/\"\n", + "\n", + "modelzoo_path = os.path.join(cur_path, \"modelzoo\")\n", + "print(modelzoo_path)\n", + "bigcode_path = os.path.join(cur_path, \"bigcode-dataset/near_deduplication/\")\n", + "print(bigcode_path)\n", + "! cp -r {modelzoo_path}/modelzoo/transformers/data_processing/slimpajama/dedup /usr/local/lib/python3.10/dist-packages/\n", + "! cp {bigcode_path}/minhash_deduplication_spark.py /usr/local/lib/python3.10/dist-packages/\n", + "sys.path.append(modelzoo_path)\n", + "sys.path.append(bigcode_path)\n", + "\n", + "from dedup import generate_connected_components, generate_duplicates_dict, to_hash\n", + "from dedup.to_hash import *\n", + "from datasketch import MinHash\n", + "from datasketch.lean_minhash import LeanMinHash\n", + "from minhash_deduplication_spark import *\n", + "from datasketch.hashfunc import sha1_hash32 as datasketch_sha1_hash32\n", + "\n", + "def normalize_str(s):\n", + " print(\"original:\", s)\n", + " s = ftfy.fix_text(s, normalization=\"NFC\")\n", + " s = s.lower().translate(str.maketrans(\"\", \"\", string.punctuation))\n", + " s = re.sub(r\"\\s+\", \" \", s.strip())\n", + " return s\n", + "\n", + "def generate_hash_values_slimpj(content, idx, num_perm, ngram_size, hashranges, permutations, min_ngram_size):\n", + " # 0. apply normalization to content\n", + " content = normalize_str(content)\n", + " print(\"after normalize: \", content)\n", + " #tokens = {\" \".join(t) for t in ngrams(content, ngram_size)}\n", + " print(\"after split:\", NON_ALPHA.split(content))\n", + " tokens = {\" \".join(t) for t in ngrams(NON_ALPHA.split(content), ngram_size)}\n", + " print(\"after tokenize w/ split:\", tokens)\n", + " print(\"after tokenize wo split:\", {\" \".join(t) for t in ngrams(content, ngram_size)})\n", + " \n", + " #1. using bigcode impl to calculate minHash\n", + " m = MinHash(num_perm=num_perm, permutations = permutations, hashfunc = sha1_hash32)\n", + " m.update_batch([token.encode(\"utf-8\") for token in tokens])\n", + "\n", + " print(m.hashvalues.shape)\n", + " print(m.hashvalues)\n", + " \n", + " #2. map results to each band\n", + " Hs = [bytes(m.hashvalues[start:end].byteswap().data) for start, end in hashranges]\n", + " return [(band_idx, H, idx) for band_idx, H in enumerate(Hs)]\n", + "\n", + "def generate_hash_values_bigcode(content, idx, num_perm, ngram_size, hashranges, permutations, min_ngram_size):\n", + " #0. apply normalize to content\n", + " content = normalize_str(content)\n", + " tokens = {\" \".join(t) for t in ngrams(NON_ALPHA.split(content), ngram_size, min_ngram_size)}\n", + " \n", + " #1. using bigcode impl to calculate minHash \n", + " a, b = permutations\n", + " hashvalues = np.ones(num_perm, dtype=np.uint64) * MAX_HASH\n", + " hv = np.array([sha1_hash32(token.encode(\"utf-8\")) for token in tokens], dtype=np.uint64)\n", + " phv = np.bitwise_and(((hv * np.tile(a, (len(hv), 1)).T).T + b) % MERSENNE_PRIME, MAX_HASH)\n", + " hashvalues = np.vstack([phv, hashvalues]).min(axis=0)\n", + " \n", + " print(hashvalues.shape)\n", + " print(hashvalues)\n", + " \n", + " #2. map results to each band\n", + " Hs = [bytes(hashvalues[start:end].byteswap().data) for start, end in hashranges]\n", + " return [(band_idx, H, idx) for band_idx, H in enumerate(Hs)]\n", + "\n", + "def get_permutation(threshold, num_perm, B = None, R = None):\n", + " if B is None or R is None:\n", + " B, R = optimal_param(threshold, num_perm)\n", + " HASH_RANGES = [(i * R, (i + 1) * R) for i in range(B)]\n", + " PERMUTATIONS = np.array(\n", + " [\n", + " (\n", + " RNG.randint(1, MERSENNE_PRIME, dtype=np.uint64),\n", + " RNG.randint(0, MERSENNE_PRIME, dtype=np.uint64),\n", + " )\n", + " for _ in range(num_perm)\n", + " ],\n", + " dtype=np.uint64,\n", + " ).T\n", + " return HASH_RANGES, PERMUTATIONS, B, R\n", + "\n", + "def read_json(data_files):\n", + " from pyspark.sql.functions import input_file_name\n", + " from pyspark.sql.types import StructType,StructField, StringType\n", + " schema = StructType([ \n", + " StructField(\"text\",StringType(),True), \n", + " StructField(\"meta\",StringType(),True)\n", + " ])\n", + "\n", + " first = True\n", + " for filename in data_files:\n", + " print(filename)\n", + " df = spark.read.text(filename)\n", + " df = df.withColumn('jsonData', F.from_json(F.col('value'), schema)).select(\"jsonData.*\")\n", + " df = df.withColumn(\"__id__\", F.monotonically_increasing_id())\n", + " df = df.withColumn(\"filename\", F.lit(os.path.basename(filename)))\n", + " df = df.withColumn(\"filename_docid\", F.concat_ws(\"@\", \"filename\", \"__id__\"))\n", + " df = df.select(\"filename_docid\", \"text\", \"meta\")\n", + " if first:\n", + " first = False\n", + " ret_df = df\n", + " else:\n", + " ret_df = ret_df.union(df)\n", + " return ret_df\n", + "\n", + "def convert_to_slimPJ_fmt(first, second):\n", + " return [f\"{first} :: {second}\"]\n" + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "num_bands is 9, ranges is 13\n", + "!!! using slimPJ !!!\n", + "original: Q: How to modify non-configurable, non-writable properties in Javascript? I'm writing a simple EventEmitter is ES5.\n", + "The objective is to ensure that all properties on EventEmitter instances are\n", + "non-writable and non-configurable.\"\n", + "After 6 hours of racking my brain I still can't figure out how to, increase the listenerCount, for example if the configurable descriptor is set to false.\n", + "Here's an example of what I have:\n", + "var eventEmitter = function(){\n", + " var listeners = listeners || 0;\n", + " var events = events || {};\n", + "\n", + " Object.defineProperties(this, {\n", + " listeners: {\n", + " value : 0,\n", + " configurable: false,\n", + " writable: false\n", + " },\n", + " events: {\n", + " value: {},\n", + " configurable : false,\n", + " writable: false\n", + " }\n", + " });\n", + " return this;\n", + "};\n", + "\n", + "\n", + "eventEmmitter.prototype.on = function(ev, cb) {\n", + " if (typeof ev !== 'string') throw new TypeError(\"Event should be type string\", \"index.js\", 6);\n", + " if (typeof cb !== 'function' || cb === null || cb === undefined) throw new TypeError(\"callback should be type function\", \"index.js\", 7);\n", + "\n", + " if (this.events[ev]){\n", + " this.events[ev].push(cb);\n", + " } else {\n", + " this.events[ev] = [cb];\n", + " }\n", + "\n", + " this.listeners ++;\n", + " return this;\n", + "};\n", + "\n", + "\n", + "A: I would recommend the use of an IIFE (immediatly invoked function expression):\n", + "var coolObj=(function(){\n", + "var public={};\n", + "var nonpublic={};\n", + "nonpublic.a=0;\n", + "public.getA=function(){nonpublic.a++;return nonpublic.a;};\n", + "\n", + "return public;\n", + "})();\n", + "\n", + "Now you can do:\n", + "coolObj.getA();//1\n", + "coolObj.getA();//2\n", + "coolObj.a;//undefined\n", + "coolObj.nonpublic;//undefined\n", + "coolObj.nonpublic.a;//undefined\n", + "\n", + "I know this is not the answer youve expected, but i think its the easiest way of doing sth like that.\n", + "\n", + "A: You can use a proxy which requires a key in order to define properties:\n", + "\n", + "\n", + "function createObject() {\n", + " var key = {configurable: true};\n", + " return [new Proxy({}, {\n", + " defineProperty(target, prop, desc) {\n", + " if (desc.value === key) {\n", + " return Reflect.defineProperty(target, prop, key);\n", + " }\n", + " }\n", + " }), key];\n", + "}\n", + "function func() {\n", + " var [obj, key] = createObject();\n", + " key.value = 0;\n", + " Reflect.defineProperty(obj, \"value\", {value: key});\n", + " key.value = function() {\n", + " key.value = obj.value + 1;\n", + " Reflect.defineProperty(obj, \"value\", {value: key});\n", + " };\n", + " Reflect.defineProperty(obj, \"increase\", {value: key});\n", + " return obj;\n", + "}\n", + "var obj = func();\n", + "console.log(obj.value); // 0\n", + "try { obj.value = 123; } catch(err) {}\n", + "try { Object.defineProperty(obj, \"value\", {value: 123}); } catch(err) {}\n", + "console.log(obj.value); // 0\n", + "obj.increase();\n", + "console.log(obj.value); // 1\n", + "\n", + "\n", + "\n", + "after normalize: q how to modify nonconfigurable nonwritable properties in javascript im writing a simple eventemitter is es5 the objective is to ensure that all properties on eventemitter instances are nonwritable and nonconfigurable after 6 hours of racking my brain i still cant figure out how to increase the listenercount for example if the configurable descriptor is set to false heres an example of what i have var eventemitter function var listeners listeners 0 var events events objectdefinepropertiesthis listeners value 0 configurable false writable false events value configurable false writable false return this eventemmitterprototypeon functionev cb if typeof ev string throw new typeerrorevent should be type string indexjs 6 if typeof cb function cb null cb undefined throw new typeerrorcallback should be type function indexjs 7 if thiseventsev thiseventsevpushcb else thiseventsev cb thislisteners return this a i would recommend the use of an iife immediatly invoked function expression var coolobjfunction var public var nonpublic nonpublica0 publicgetafunctionnonpublicareturn nonpublica return public now you can do coolobjgeta1 coolobjgeta2 coolobjaundefined coolobjnonpublicundefined coolobjnonpublicaundefined i know this is not the answer youve expected but i think its the easiest way of doing sth like that a you can use a proxy which requires a key in order to define properties function createobject var key configurable true return new proxy definepropertytarget prop desc if descvalue key return reflectdefinepropertytarget prop key key function func var obj key createobject keyvalue 0 reflectdefinepropertyobj value value key keyvalue function keyvalue objvalue 1 reflectdefinepropertyobj value value key reflectdefinepropertyobj increase value key return obj var obj func consolelogobjvalue 0 try objvalue 123 catcherr try objectdefinepropertyobj value value 123 catcherr consolelogobjvalue 0 objincrease consolelogobjvalue 1\n", + "after split: ['q', 'how', 'to', 'modify', 'nonconfigurable', 'nonwritable', 'properties', 'in', 'javascript', 'im', 'writing', 'a', 'simple', 'eventemitter', 'is', 'es5', 'the', 'objective', 'is', 'to', 'ensure', 'that', 'all', 'properties', 'on', 'eventemitter', 'instances', 'are', 'nonwritable', 'and', 'nonconfigurable', 'after', '6', 'hours', 'of', 'racking', 'my', 'brain', 'i', 'still', 'cant', 'figure', 'out', 'how', 'to', 'increase', 'the', 'listenercount', 'for', 'example', 'if', 'the', 'configurable', 'descriptor', 'is', 'set', 'to', 'false', 'heres', 'an', 'example', 'of', 'what', 'i', 'have', 'var', 'eventemitter', 'function', 'var', 'listeners', 'listeners', '0', 'var', 'events', 'events', 'objectdefinepropertiesthis', 'listeners', 'value', '0', 'configurable', 'false', 'writable', 'false', 'events', 'value', 'configurable', 'false', 'writable', 'false', 'return', 'this', 'eventemmitterprototypeon', 'functionev', 'cb', 'if', 'typeof', 'ev', 'string', 'throw', 'new', 'typeerrorevent', 'should', 'be', 'type', 'string', 'indexjs', '6', 'if', 'typeof', 'cb', 'function', 'cb', 'null', 'cb', 'undefined', 'throw', 'new', 'typeerrorcallback', 'should', 'be', 'type', 'function', 'indexjs', '7', 'if', 'thiseventsev', 'thiseventsevpushcb', 'else', 'thiseventsev', 'cb', 'thislisteners', 'return', 'this', 'a', 'i', 'would', 'recommend', 'the', 'use', 'of', 'an', 'iife', 'immediatly', 'invoked', 'function', 'expression', 'var', 'coolobjfunction', 'var', 'public', 'var', 'nonpublic', 'nonpublica0', 'publicgetafunctionnonpublicareturn', 'nonpublica', 'return', 'public', 'now', 'you', 'can', 'do', 'coolobjgeta1', 'coolobjgeta2', 'coolobjaundefined', 'coolobjnonpublicundefined', 'coolobjnonpublicaundefined', 'i', 'know', 'this', 'is', 'not', 'the', 'answer', 'youve', 'expected', 'but', 'i', 'think', 'its', 'the', 'easiest', 'way', 'of', 'doing', 'sth', 'like', 'that', 'a', 'you', 'can', 'use', 'a', 'proxy', 'which', 'requires', 'a', 'key', 'in', 'order', 'to', 'define', 'properties', 'function', 'createobject', 'var', 'key', 'configurable', 'true', 'return', 'new', 'proxy', 'definepropertytarget', 'prop', 'desc', 'if', 'descvalue', 'key', 'return', 'reflectdefinepropertytarget', 'prop', 'key', 'key', 'function', 'func', 'var', 'obj', 'key', 'createobject', 'keyvalue', '0', 'reflectdefinepropertyobj', 'value', 'value', 'key', 'keyvalue', 'function', 'keyvalue', 'objvalue', '1', 'reflectdefinepropertyobj', 'value', 'value', 'key', 'reflectdefinepropertyobj', 'increase', 'value', 'key', 'return', 'obj', 'var', 'obj', 'func', 'consolelogobjvalue', '0', 'try', 'objvalue', '123', 'catcherr', 'try', 'objectdefinepropertyobj', 'value', 'value', '123', 'catcherr', 'consolelogobjvalue', '0', 'objincrease', 'consolelogobjvalue', '1']\n", + "after tokenize w/ split: {'iife immediatly invoked function expression', 'if descvalue key return reflectdefinepropertytarget', 'value 0 configurable false writable', 'type function indexjs 7 if', 'would recommend the use of', 'to modify nonconfigurable nonwritable properties', 'false heres an example of', 'function expression var coolobjfunction var', 'can do coolobjgeta1 coolobjgeta2 coolobjaundefined', 'to false heres an example', 'on eventemitter instances are nonwritable', 'you can use a proxy', 'cb undefined throw new typeerrorcallback', 'this is not the answer', 'return new proxy definepropertytarget prop', 'what i have var eventemitter', 'value key reflectdefinepropertyobj increase value', 'expression var coolobjfunction var public', 'ev string throw new typeerrorevent', 'still cant figure out how', 'reflectdefinepropertyobj increase value key return', 'a i would recommend the', 'new proxy definepropertytarget prop desc', 'and nonconfigurable after 6 hours', 'false writable false return this', 'this a i would recommend', '1 reflectdefinepropertyobj value value key', 'to increase the listenercount for', 'the easiest way of doing', 'example of what i have', 'be type string indexjs 6', 'null cb undefined throw new', 'var nonpublic nonpublica0 publicgetafunctionnonpublicareturn nonpublica', 'the configurable descriptor is set', 'a you can use a', 'var public var nonpublic nonpublica0', 'function createobject var key configurable', 'a simple eventemitter is es5', 'nonpublica0 publicgetafunctionnonpublicareturn nonpublica return public', 'know this is not the', 'racking my brain i still', 'be type function indexjs 7', 'nonwritable properties in javascript im', 'es5 the objective is to', 'think its the easiest way', '6 hours of racking my', 'objvalue 123 catcherr try objectdefinepropertyobj', 'is es5 the objective is', 'nonwritable and nonconfigurable after 6', 'easiest way of doing sth', 'eventemmitterprototypeon functionev cb if typeof', 'use a proxy which requires', 'function indexjs 7 if thiseventsev', 'public now you can do', 'func consolelogobjvalue 0 try objvalue', 'try objvalue 123 catcherr try', 'keyvalue function keyvalue objvalue 1', 'obj var obj func consolelogobjvalue', 'listeners value 0 configurable false', '6 if typeof cb function', 'properties function createobject var key', 'catcherr consolelogobjvalue 0 objincrease consolelogobjvalue', 'the listenercount for example if', 'typeerrorevent should be type string', 'objectdefinepropertiesthis listeners value 0 configurable', 'all properties on eventemitter instances', '0 var events events objectdefinepropertiesthis', 'cb null cb undefined throw', 'i would recommend the use', 'requires a key in order', 'throw new typeerrorevent should be', 'writable false return this eventemmitterprototypeon', 'key createobject keyvalue 0 reflectdefinepropertyobj', 'can use a proxy which', 'definepropertytarget prop desc if descvalue', 'to define properties function createobject', 'eventemitter instances are nonwritable and', 'proxy which requires a key', 'createobject var key configurable true', 'value key return obj var', 'var eventemitter function var listeners', 'javascript im writing a simple', 'configurable true return new proxy', 'of what i have var', 'descvalue key return reflectdefinepropertytarget prop', 'desc if descvalue key return', 'configurable false writable false events', 'cb thislisteners return this a', 'that a you can use', 'function keyvalue objvalue 1 reflectdefinepropertyobj', 'that all properties on eventemitter', 'this eventemmitterprototypeon functionev cb if', 'coolobjgeta2 coolobjaundefined coolobjnonpublicundefined coolobjnonpublicaundefined i', 'catcherr try objectdefinepropertyobj value value', 'events objectdefinepropertiesthis listeners value 0', 'key reflectdefinepropertyobj increase value key', 'events events objectdefinepropertiesthis listeners value', 'typeof cb function cb null', 'false events value configurable false', 'var events events objectdefinepropertiesthis listeners', 'configurable false writable false return', 'the use of an iife', 'false writable false events value', 'you can do coolobjgeta1 coolobjgeta2', 'nonconfigurable after 6 hours of', 'writable false events value configurable', 'how to modify nonconfigurable nonwritable', 'in javascript im writing a', 'key configurable true return new', 'i know this is not', 'im writing a simple eventemitter', 'coolobjnonpublicundefined coolobjnonpublicaundefined i know this', 'var key configurable true return', 'true return new proxy definepropertytarget', 'in order to define properties', 'return public now you can', 'function func var obj key', 'is to ensure that all', 'thislisteners return this a i', 'recommend the use of an', 'of an iife immediatly invoked', 'invoked function expression var coolobjfunction', 'eventemitter is es5 the objective', 'events value configurable false writable', 'brain i still cant figure', 'nonpublica return public now you', 'have var eventemitter function var', 'reflectdefinepropertytarget prop key key function', 'prop desc if descvalue key', 'immediatly invoked function expression var', 'sth like that a you', 'key key function func var', 'set to false heres an', 'define properties function createobject var', 'reflectdefinepropertyobj value value key keyvalue', 'thiseventsev cb thislisteners return this', 'if typeof ev string throw', 'expected but i think its', 'value value key reflectdefinepropertyobj increase', 'a proxy which requires a', 'type string indexjs 6 if', 'how to increase the listenercount', 'publicgetafunctionnonpublicareturn nonpublica return public now', 'var listeners listeners 0 var', 'public var nonpublic nonpublica0 publicgetafunctionnonpublicareturn', 'but i think its the', 'objective is to ensure that', 'like that a you can', '123 catcherr try objectdefinepropertyobj value', 'value 123 catcherr consolelogobjvalue 0', 'if the configurable descriptor is', 'eventemitter function var listeners listeners', 'listeners listeners 0 var events', 'value value key keyvalue function', 'the answer youve expected but', 'cant figure out how to', 'its the easiest way of', 'q how to modify nonconfigurable', 'instances are nonwritable and nonconfigurable', 'properties in javascript im writing', 'function var listeners listeners 0', 'ensure that all properties on', 'return this a i would', 'way of doing sth like', 'of doing sth like that', 'key return reflectdefinepropertytarget prop key', '0 reflectdefinepropertyobj value value key', 'value key keyvalue function keyvalue', 'is set to false heres', 'should be type string indexjs', 'key in order to define', 'if typeof cb function cb', '7 if thiseventsev thiseventsevpushcb else', 'throw new typeerrorcallback should be', 'an iife immediatly invoked function', 'var coolobjfunction var public var', 'return this eventemmitterprototypeon functionev cb', 'my brain i still cant', 'not the answer youve expected', 'a key in order to', 'listenercount for example if the', 'for example if the configurable', 'typeerrorcallback should be type function', 'key return obj var obj', 'simple eventemitter is es5 the', 'cb if typeof ev string', 'nonpublic nonpublica0 publicgetafunctionnonpublicareturn nonpublica return', 'value configurable false writable false', 'var obj key createobject keyvalue', 'objvalue 1 reflectdefinepropertyobj value value', 'thiseventsevpushcb else thiseventsev cb thislisteners', 'prop key key function func', 'out how to increase the', 'increase the listenercount for example', 'nonconfigurable nonwritable properties in javascript', 'key function func var obj', 'figure out how to increase', 'heres an example of what', 'i think its the easiest', 'indexjs 7 if thiseventsev thiseventsevpushcb', 'i still cant figure out', 'thiseventsev thiseventsevpushcb else thiseventsev cb', 'cb function cb null cb', 'keyvalue 0 reflectdefinepropertyobj value value', 'configurable descriptor is set to', 'do coolobjgeta1 coolobjgeta2 coolobjaundefined coolobjnonpublicundefined', 'should be type function indexjs', 'return obj var obj func', 'modify nonconfigurable nonwritable properties in', 'writing a simple eventemitter is', 'coolobjnonpublicaundefined i know this is', 'false return this eventemmitterprototypeon functionev', 'after 6 hours of racking', 'an example of what i', 'functionev cb if typeof ev', 'key keyvalue function keyvalue objvalue', 'descriptor is set to false', 'of racking my brain i', 'listeners 0 var events events', 'new typeerrorcallback should be type', 'now you can do coolobjgeta1', 'answer youve expected but i', 'keyvalue objvalue 1 reflectdefinepropertyobj value', 'value value 123 catcherr consolelogobjvalue', '123 catcherr consolelogobjvalue 0 objincrease', 'undefined throw new typeerrorcallback should', 'increase value key return obj', 'new typeerrorevent should be type', 'if thiseventsev thiseventsevpushcb else thiseventsev', 'is not the answer youve', 'return reflectdefinepropertytarget prop key key', 'i have var eventemitter function', 'else thiseventsev cb thislisteners return', 'obj func consolelogobjvalue 0 try', 'string indexjs 6 if typeof', 'coolobjfunction var public var nonpublic', 'use of an iife immediatly', 'to ensure that all properties', 'properties on eventemitter instances are', 'indexjs 6 if typeof cb', 'youve expected but i think', 'consolelogobjvalue 0 objincrease consolelogobjvalue 1', 'the objective is to ensure', 'coolobjaundefined coolobjnonpublicundefined coolobjnonpublicaundefined i know', 'are nonwritable and nonconfigurable after', 'order to define properties function', 'obj key createobject keyvalue 0', 'typeof ev string throw new', 'consolelogobjvalue 0 try objvalue 123', 'coolobjgeta1 coolobjgeta2 coolobjaundefined coolobjnonpublicundefined coolobjnonpublicaundefined', 'func var obj key createobject', 'var obj func consolelogobjvalue 0', 'example if the configurable descriptor', 'createobject keyvalue 0 reflectdefinepropertyobj value', '0 configurable false writable false', 'hours of racking my brain', 'doing sth like that a', 'try objectdefinepropertyobj value value 123', 'function cb null cb undefined', 'proxy definepropertytarget prop desc if', 'reflectdefinepropertyobj value value key reflectdefinepropertyobj', '0 try objvalue 123 catcherr', 'which requires a key in', 'objectdefinepropertyobj value value 123 catcherr', 'string throw new typeerrorevent should'}\n", + "after tokenize wo split: {' a n e', 's e v e n', 's i o n ', ' r e t u', 'a l l p', 's 7 i', 'u l d b', ' a p r', 't e d b', ' h a v e', 'n e d c', 'r n n o', 'j a u n d', 'r o x y ', 'p d e s', '1 c o o', 'p e o f ', 'n d e x j', 'e c t i v', 'e r t i e', 'r e n o', 'u e f u', 'a m p l e', 'n s w e r', 'y p e e r', 'q h o w', 'b e t y', '2 c o o', ' o r d e', 'a n u s', 'x y d e', 'e 0 c', 'l c b ', 's e r e', ' k n o w', 'e 1 2 3', 'c t i v e', 'f t e r ', 'e n e r s', 'e 0 o', 'j v a r', 'i n e d ', ' i s t', 't e m i t', 't o r i', 'c a r e', 'a t a ', 'c a n u', 'n c r e', 'a n t f', 'o b j a u', 'x p r e s', 'r a b l e', ' a r e ', 'l i c v', 'f d o i', 'r e o u', ' i n c r', ' o f w', 'r e s a', 'e s t r', 'n o n c o', 'i c h r', ' 0 o b', 't h i s l', 'p t o r ', ' w r i t', 'p k e y', 'e c t v', ' w h i c', 'r r c o', 'l u e 0', 'o n e x', 'o r d e r', 's i n ', 'e y v a l', 'l l c a', '0 r e f', 'r f u n', 't h e l', 'p u b l i', 'n o b j', 'y k e y', 'n t s o', 't o e n', 'b u n d', 'm y b r', 'n n e w', 't s e v', 's i e s t', 'l e i f', 'c v a l u', 'l e o f', 'i n e p r', 'e w r i', 'i n j a', 'l u e f', ' n e w ', 'b l i c ', 'o b j f', 'f t h e', 'e t t o', 'k e y k', 'i c a r e', 'r d e r ', '0 t r y', 'b j a u n', 'e m m i t', 'a f u n c', ' h o w ', 'l e l o g', 'k e y i', 'i n k i', 'o w t h', 'y o u c', 'n c v a', 'o l e l o', 'b j i n c', 'k e y v a', 'o g o b j', ' 0 v a', 'r i n g ', 'n v o k e', 'i n d e x', 't i l l ', 'u s e o', ' r a c k', 'a l s e ', '3 c a t', ' r e q u', 'l y i n', 'j g e t a', ' h e r e', 'a t l y ', 'e w p r', 'e n t s', 't w a y', 'p e f u', 'i e s t h', 'c k s h', 'l u e 1', 'n s t a n', 't t o ', 'a l u e ', ' d o c', 'o f c b', 'e a t e o', 't h e o', 'r i p t o', 'b e l s', 'm w r i', 'e r e s ', 'e p r o p', ' i s e', 'e m i t t', 'n t s e v', ' y o u ', 'f i n e ', 'e e x p', 'e f u n', 'g a s', 'e d c o', 'a y o f', 'e k e y', 'i l l c', 'e a f t', ' n u l l', 'j f u n c', 'g e t p', 'e x j s ', 'e a n d', 'p r o p ', 'p r o t o', ' t r y ', 't a l l', ' e v s', 's t a n c', ' c b n', ' b u t ', 'v o k e d', '7 i f ', 'h i s e', 'e s a r', 'e l s e ', 'c n o w', 'w n e w', 'c v a r', ' 0 r e', 'e r t y o', 'o i n g ', ' i n o', 'u e 1 2', 't i v e ', ' a n d ', 't o t y p', 'o b j n o', 'b l e n', 'o u c a', 'e t h i', 'n g t h', 's s i o n', ' t o i', 'l s e t', 'e o u t', '1 r e f', 'r o b j', ' l i k e', 'b j f u n', 't h i s ', 'e i s ', 's l i s t', 'c a r e t', 'i n g i', 'n c e s ', 'r y o u', ' i t h', 'e s t w', 'e t u r n', '0 c o n', 'f i n e d', ' b e t', 'a y o u', 's e t h', 't l y i', 'b l e p', 'n t f o', 'v a s c r', 'j e c t i', 't e r f', 'e i m m', 'w y o u', 'g s t h', 'r e x a', 'i c g e t', 'e v a l', 't e o b j', 'y o u v e', 'i k e t', 's f u n', 'e o f ', 'y b r a', 't f i g', 's n o t', 'n o n w r', 'i o n f', 't e r i', 't h o w', 'e l o g o', 's t h e', 'j v a l', 'l s e r', 'e s f u', ' 7 i f', 'c c o n', ' i w o', 's e e v', 'r t y o b', 't o m o', 'x j s 7', ' w o u l', 'w r i t i', 'l s e e', 'o m m e n', 'i c v a', 'v a r c', 'b l i c g', 'p e o n ', 's e c o', 'p e r t y', 'c o o l o', 't v a r', 'n f u n', 'e d f u', 'f l e c t', 'd e s c ', 'n g m y', 'l i c u n', 'u b l i c', 'r e a s e', 'c e s a', 'd e r t', 'x y w h', 'b j f u', 'a n i i', 'o u t h', 'y p e f', 'k n o w ', 'o b j i', 't e r p r', 'o t t h', 'c h e r r', 'i n g m', 'l i c g e', 'o x y w', 'j i n c r', 'd i k', 'u e 0 ', ' 0 c o', 'a n c e s', 'n e p r o', 'o n e v', 'l i s t e', 'v a l u e', 'e v c b', 'e a s i e', 'u r e o', 'a r l i', 'c t e d ', 'q u i r e', 'e e r r o', '1 2 3 c', 'd o i n g', 'o n e v ', 'o b j i n', 'l p r o', 's e v t', 'e c t d e', 't d e f i', 'e v e n t', 'w h i c h', 'e s a ', 'i g u r a', 'c o u n t', ' t o f', 'r o r c a', 'i r e s ', 'a 0 p u', 'h r o w ', 'i s i s', 'e r s 0', 'd r e c', 'c b u n', ' b r a i', 'e e v e', ' e x a m', 'e s c v a', ' s t i l', 'r i s ', 'a p r o', ' o b j i', 'r r o r c', ' i f t', 'r l i s', 't s h o', 'n e d i', ' u n d e', 't a b l e', 'o u v e ', ' w a y ', 'o d e f', 't a r g e', 't h l i', 'b i f ', 'u e c o', 'r p r o t', 's h c b ', ' t h r o', 'r e v e n', 'a r e v', 'g o b j v', 'g t h r', 'e d e s', 's e w r', 'e s i n', 'o l o b j', 'e s a n', 'o b j k', 'o n c b', 'i n g a', 'b f u n', 'c r i p t', 'o i n c', 'y p e o f', 'n p u b l', 'a t e o b', 'j n o n p', 'p l e o', 'o u l d ', 'v e n t ', 'e s s i o', ' e x p r', 'd c o o', 'h e r r ', 'b l e f', 'i s t o', 't i n g ', 'e s c r i', 'a i n i', 'i n i ', 'u r n t', 'a n d o', 'i s l i s', 'n u s e', ' a l l ', ' i h a', ' a i ', 'o p e r t', 'c u n d e', 'j f u n', 'y i n v', 'o r e v e', 'c n o n', 'i c a u n', 'p r o x y', 'u e r e', 'i s s e', 'n d n o', 'v e n t e', 'p l e i', 'b j i n', 'i f t h', 't y p e ', 'e t a f u', 'd b u t', 's 5 t h', 'a n e x', 's e v p u', 'a r p u', '6 i f ', 'p u s h c', 'l o b j a', ' i k n', 'c a t c h', 'i v e i', 'd i a t l', 'l e n o', 'n e v e', 'h o w t', 'o p k e', ' a k e', 'n d o ', 'n c c o', ' o f r', 'r c o n', 'a r o b', 'a t a l', 'o c o o', 'c i f ', 'y o b j', ' a n s w', 'e r r t', ' s i m p', 'o t o t y', 'r n r e', 'h i s l', 'h e c o', 'p e e r r', 'd f u n', 'k e t h', 's v a l', 'n n o n', 't a f u n', ' i s t', 'r c a l l', 't i m ', 'b r a i n', 's u r e ', 'e o f c', 'c t d e f', 'f e i m', 'e r y o', 'e e a s', ' f u n c', 'u e o b', 'e r i s', 'f i g u r', 'e x p e c', ' e l s e', 'n e w p', 'n j a v', 'h e l i', 'i n e p', 'n r e f', 'a b l e ', 'o n s o l', 'g m y ', 'l l c b', 'e f l e c', 'u e v a', ' n o t ', 'j a v a s', 'l s e h', 'e s c i', 'y d e f', 'n c r e a', 'u n c t i', 'o n v a', 'f t y p', 'b l e t', 'l o b j f', ' 1 r e', 'e r s l', 'm i t t e', 'i o n e v', 'k i t s', 'e y k e', 'h i s a', ' a f t e', 't y t a r', 's t i l l', 'e f a l', 'u r n r', 't e n e r', 'n t h i', 'g e t a f', 't r u e ', 'a 2 c o', 'i c u n d', 'i k n o', ' d e s c', 'b j g e t', 'l e f a', 'i o n e', 'b a c k ', 'm e d i a', 'n w r i t', 'e x a m p', 'l e t r', 'j i n c', 'l u e o', 'n g s t', 'l e d e', 's a n ', 'o n i n', 'w t h i', ' n o w ', 'n e r c o', 'r y o b', 'a r g e t', 'n i s', 'a v e v', 'v c b ', 'b j n o n', 'a i w', 'e y c o', 'l u e v', 'r s o f', 'b l i c a', 't a 2 c', 'b l e d', ' 6 h o', 'e r s v', 'n t s h', ' p r o x', 'u i r e s', 'u e 1 ', ' c b t', 'a s e t', 'c a n t ', 'o n p u b', 'e y c r', 'e r i n', 'n s u r e', 'i f d e', 'b t h i', 'e 1 r', 'o b j g e', 'o n f i g', 'e w t y', 'g u r e ', 'e s 5 t', 'a n s w e', 'r n o n', 'h o u l d', 'k e y r', ' c o o l', 'n g a ', 'c t i o n', 'c t k e', 'u n c c', 'i t i n g', 'e o b j e', 'l o g o b', 'n t s v', 'y c r e', 'g u r a b', 'h i n k ', 'l e e v', 'i n s t a', 'e n o n', ' p r o p', 'r t r y', 'e n t s e', 'h r e q', ' o b j ', ' m o d i', ' o f a', 'w r i t a', 'o m o d', 'l d r e', ' c o n s', 'r e t h', 'k e y c', 'k e y f', ' r e f l', 'i m m e d', 'b u t i', 'p l e e', 'r s v a', 'u v e e', 's c v a l', 'v e i s', 'h e e a', 'b n u l', 's t h i s', 'u s e a', 'p t i m', 'r i t a b', 'u r s o', 'o r e x', 'o n f u', 'n e v c', 'a c k i n', 's t r i n', 'i o n n o', 'n p u b', 'o b j f u', ' t y p e', 'o n n o n', 'l i c a r', 'c a n d', 'v a r l', 'a u n d e', 't s e v p', 'h e u s', ' o u t ', 'i s l i', 'j v a l u', 'i o n i', 'w p r o', 'i p t o r', 'i i f e ', 'i n o r', 'i s e v e', 'c b n u', 't h e a', 'f d e s', 'd i f y ', ' a s i', ' c b u', 'i a t l y', 'u r n o', 's o l e l', 'e r c o u', 'c o n f i', ' t r u e', 'e r e t', 'd n o n', 'r t o ', 'n i n d', 'i o n v', 'o f w h', 'h i s i', 'r i t i n', 'i s t e n', 't y p e e', 'j k e y', 'u t h o', 'e d t h', 'e r t o', 'y f u n', 'r c o u n', ' h o u r', 'r p u b', 'c b f u', 'o n k e', 'n e d t', ' i f d', 'e 0 r', 'a s i m', 'i p t i', 'e q u i r', 't i o n ', 't e m m i', 'd t h e', ' i s s', 'g e t a 1', 'a s i e s', 'r k e y', 'o r i s', 'c r e a t', 'l e p r', 'n v a r', ' c a n ', 'r e a t e', ' c o n f', 'r n t h', 'w e r y', 'e x p r e', 's e v c', 'e y f u', 'w a y o', 'e l i s', 'n e r s ', 'x j s 6', 'a s e v', 'o f d o', 't s v a', 'a r n o', 's c i f', 'w o u l d', 'h a t a', 's l i s', 'f c b ', 'k s h o', 'j e c t ', ' i m w', 'n e x a', 'e o n f', ' c b i', 't u r n ', 'i n v o k', 'f o r e', 'c r e a s', 'j e c t d', 'l e a n', 'f i n e p', 'r e t u r', 'p e s t', 'u l d r', ' e x p e', 'v a r k', 'c o m m e', 'h e r e s', 'o u n t ', ' e n s u', 'n c o n f', 's i m p l', ' t h i s', 'e c t k', ' i i f e', 'e d i a t', ' s h o u', 'e t a 1 ', 't i o n n', 't o i n', 'u l l c', ' n o n p', 'm m e d i', 'u r n p', 'o b j e c', ' t o d', 'n t e m i', 'f w h a', 'r n p u', 'y n o n', 'i n c r e', ' n o n w', 'e v a r', 'c t v a', 'i o n k', 'c a u n d', 'i g u r e', 't c h e r', 'a v a s c', 's h o u l', 'u n d e f', 'f e v ', 'e c o m m', 'e r 6 ', 's r e t', 'e o b j', 'i m w r', 'a k e y', 'y r e t', 'a n d n', 'l i k e ', 'p e c t e', ' s t h ', 'k e d f', 'w h a t ', 'r e f l e', 'r a c k i', ' i t s ', 'e f i n e', 'v t h i', '6 h o u', 'c b i f', 'e v t h', 'n k e y', 'o w y o', 't k e y', ' o f d', 's o f ', 'd e s c v', 'i e s i', 't h e e', 'l e c t d', 'u n c v', 'n e w t', 't i t', 'h o u r s', ' y o u v', ' t h i n', 's t h l', 'a r e n', 'y w h i', 'h e o b', 'f r a c', 'a l l b a', 'h i c h ', 'e a n s', 'y o f ', 't h e c', 'm m e n d', ' t o e', 'u r a b l', 'y r e f', 's a k', ' f a l s', 'l i c a u', 'n e p r', 'o k e d ', ' c b f', 'r t i e s', 's s e t', 'n c t i o', ' w h a t', 'r e s s i', 'n o t t', ' i n s t', ' f o r ', '5 t h e', 'n i i f', 'u r e t', ' l i s t', 'p e r t i', 'v s t r', 'i s e s', 'n o n p u', 'f t h i', 'a r k e', 's a r e', 't s t h', 'n f i g u', 'h a v e ', 'l i c a 0', 's e a ', 'y t a r g', 'e n e r c', ' c r e a', ' v a l u', 'i e s o', 't i e s t', 'r i p t ', 'n o w t', ' i s n', 'w t y p', 'l i c n', '0 o b j', ' k e y ', 'y p e s', 'v e v a', 'e d b u', 'n s o l e', 'a t i ', 'd t h r', 'e s o n', ' c a n t', ' n o n c', 'r s l i', 'i f t y', 'o f e v', 'p r e s s', 'f u n c ', ' e a s i', ' a n i', ' o n e', 't t h e', 'r o p d', ' t h e ', 'r e v e', ' 1 2 3 ', 'm p l e ', 's t o ', 's 6 i', 's e s 5', 's o b j', 'n t e m m', 'u r n n', 'r n n e', ' s e t ', 'y o b j ', ' o b j v', 't o f a', 'r 6 h', 't i h', ' r e c o', 'a c k s', 'n d t h', 'l o b j g', ' p u b l', 'b j k e', 'l u e c', 'i e s t ', 'x p e c t', 't t e r p', 'e t y p', 't s e v ', 't h r o w', 'r c o o', 'r e q u i', 'n o r d', 't r i n g', 'l i c a ', 'm o d i f', 't t e r ', 'o w t o', 'n o w y', 'r r t r', 'i c n o', 'n n o n p', 'y c o n', 'v a r o', ' d o i n', 'c a 0 p', 'd o c o', 'o d i f y', 'r s r e', 't i e s ', 'o b j v', 'y p e o n', ' f i g u', 'e n d t', ' t o m', ' e v e n', ' c a t c', 'u n t f', 'j s 6 ', 'i t s t', 'd b e ', 'i n g s', 'o t y p e', ' i n j', 'i s t i', 'v a r e', 'l b a c k', 'x a m p l', 'b l e a', 'i o n c', 's a i', 'e r p r o', ' i m m e', 'l c a n', 'o b j v a', 'i t t e r', 'h e a n', 'd e f i n', 's e t t', 'r o p k', 'i s e v', 'r r o r e', 'u e k e', 'b j e c t', 'v e n t s', ' i n v o', 'w t o ', 'c h r e', 'n e x p', 'l o b j n', 'l u e k', 's e o f', 'i n g t', ' s t r i', 'o n c r', ' k e y v', 'n g i n', 'o x y d', 'u c a n', 't s o b', 'n u l l ', 'd e s c r', 's 0 v', 'g i n d', 'r o t o t', 'o f a n', 'e p r o', 'k i n g ', 's w e r ', 'r e c o m', 'n k i t', 'e y r e', 'e u s e', 'a 1 c o', 'i e s f', 'o n w r i', 'r o w n', 'h i s e v', 't h a t ', 't h e u', ' e s 5 ', 'a r e t', 'r o p e r', 'e a s e ', 'n c b ', ' m y b', '0 v a r', ' i n d e', 'e a p', 'y i n ', 's o n ', 's e v e', 'v e e x', 'l l b a c', 'a s c r i', 'm e n d ', 'm m i t t', 'e r r c', 'n t f i', 't f o r', 'e s t h i', 'r s 0 ', 'n t s e', 'l l p r', 'e v s t', 'i f e i', 'i t h i', 'f u n c t', 'f y n o', 'o e n s', 'i c a 0 ', 'e c t e d', 'h l i k', 't h i s e', 'e t p r', 'c a l l b', '2 3 c a', 'e r r o r', 'c b e l', 't e r 6', ' u s e ', 'o o l o b', 'h i s l i', ' o b j e', 't a 1 c', 't a y', 'o r c a l', 'r g e t ', 's t e n e', 'b j v a', 't i o n e', 't p r o', 'e t h a', 'p r o p e', 'f a l s e', 'i m p l e', ' v a r ', 'o f a l', 'e t a 2 ', ' d e f i', 'i w o u', 's t w a', 't y o b j', 't h i n k', ' t h a t', 'e t h e', 'e r f u', 'r u e r', 'e y i n', 'e n s u r', 'i c a r', 's e v a', 'n d e f i', 'e t r u', 't r y o', 'o p d e', 's e h e', 'u t i ', 't o d e', 'o u r s ', 'g e t a 2', 'e r t y t', 'a s e c', 'y v a l u', 'c g e t a', 'h c b e', 'e d i ', 't y p e o', 'r n o b', ' 0 t r', ' j a v a', 'r a i n ', 'd e x j s', 'e r s r', 'i t a b l', 'r o r e v', 's c r i p', 't a n c e', 'e o f e', 'r t y t a', 'c b t h', 'b j v a l', 'h a t i', 'i s n o', 'e v p u s', 'a f t e r', 'c k i n g', 'e n t s ', 'l d b e', ' 6 i f', 'v a r p', ' a y o', 'o w n e', 'a r e t u', 'f a n ', 'a r c o', 'v a r n', 'i h a v', 'l s e w', 'j s 7 ', 'l e a f', 'e h e r', 'i s a ', 's i s ', '0 p u b', 'r i n s', 'v p u s h', 'c o n s o', 'a t c h e', 'e c o n', 'b l i c u', 'e n t e m', 'u s h c b', 'o f r a', 'o n c o n', 'e i f ', 'e 0 t', 'i f y n'}\n", + "(128,)\n", + "[ 3784462 37800422 2386799 12798583 19067780 35471985 5092384 21656912\n", + " 6270010 1085463 18127069 48604244 2576934 374215 28430437 18254380\n", + " 4102298 34211961 12290716 7631961 29572216 24709709 29912800 41048438\n", + " 27236136 1418300 12406498 2497947 4862465 25247775 47097720 29021636\n", + " 20339264 2232649 12859188 2729719 17801875 21089389 31907354 16606114\n", + " 69956623 13833904 10446519 77378211 8550234 46195874 288182 14496122\n", + " 11237319 6912996 23228712 16190126 64914739 7870255 40934646 924194\n", + " 29225892 19996530 6438690 18986291 3218965 16411597 11880766 5132621\n", + " 1052847 2415123 59555528 3491442 15151896 7004468 10340142 32777136\n", + " 33778962 3260671 19172809 2359234 23976143 2416865 3125227 6480263\n", + " 20210992 27807156 3421181 5312099 10619587 9582 12716254 12379028\n", + " 10804802 2014329 48317165 19835788 20719591 5230161 9897841 98164\n", + " 9710948 17732724 27558813 3818146 9510059 5773255 34977961 18016812\n", + " 15674277 10223242 22205030 22428386 41746147 1300997 6531413 3921793\n", + " 6004933 2850113 25499809 16598362 414028 7644653 30133303 6577923\n", + " 14728135 4456431 736672 15122723 1921938 2848032 386889 9643633]\n", + "!!! using bigcode !!!\n", + "original: Q: How to modify non-configurable, non-writable properties in Javascript? I'm writing a simple EventEmitter is ES5.\n", + "The objective is to ensure that all properties on EventEmitter instances are\n", + "non-writable and non-configurable.\"\n", + "After 6 hours of racking my brain I still can't figure out how to, increase the listenerCount, for example if the configurable descriptor is set to false.\n", + "Here's an example of what I have:\n", + "var eventEmitter = function(){\n", + " var listeners = listeners || 0;\n", + " var events = events || {};\n", + "\n", + " Object.defineProperties(this, {\n", + " listeners: {\n", + " value : 0,\n", + " configurable: false,\n", + " writable: false\n", + " },\n", + " events: {\n", + " value: {},\n", + " configurable : false,\n", + " writable: false\n", + " }\n", + " });\n", + " return this;\n", + "};\n", + "\n", + "\n", + "eventEmmitter.prototype.on = function(ev, cb) {\n", + " if (typeof ev !== 'string') throw new TypeError(\"Event should be type string\", \"index.js\", 6);\n", + " if (typeof cb !== 'function' || cb === null || cb === undefined) throw new TypeError(\"callback should be type function\", \"index.js\", 7);\n", + "\n", + " if (this.events[ev]){\n", + " this.events[ev].push(cb);\n", + " } else {\n", + " this.events[ev] = [cb];\n", + " }\n", + "\n", + " this.listeners ++;\n", + " return this;\n", + "};\n", + "\n", + "\n", + "A: I would recommend the use of an IIFE (immediatly invoked function expression):\n", + "var coolObj=(function(){\n", + "var public={};\n", + "var nonpublic={};\n", + "nonpublic.a=0;\n", + "public.getA=function(){nonpublic.a++;return nonpublic.a;};\n", + "\n", + "return public;\n", + "})();\n", + "\n", + "Now you can do:\n", + "coolObj.getA();//1\n", + "coolObj.getA();//2\n", + "coolObj.a;//undefined\n", + "coolObj.nonpublic;//undefined\n", + "coolObj.nonpublic.a;//undefined\n", + "\n", + "I know this is not the answer youve expected, but i think its the easiest way of doing sth like that.\n", + "\n", + "A: You can use a proxy which requires a key in order to define properties:\n", + "\n", + "\n", + "function createObject() {\n", + " var key = {configurable: true};\n", + " return [new Proxy({}, {\n", + " defineProperty(target, prop, desc) {\n", + " if (desc.value === key) {\n", + " return Reflect.defineProperty(target, prop, key);\n", + " }\n", + " }\n", + " }), key];\n", + "}\n", + "function func() {\n", + " var [obj, key] = createObject();\n", + " key.value = 0;\n", + " Reflect.defineProperty(obj, \"value\", {value: key});\n", + " key.value = function() {\n", + " key.value = obj.value + 1;\n", + " Reflect.defineProperty(obj, \"value\", {value: key});\n", + " };\n", + " Reflect.defineProperty(obj, \"increase\", {value: key});\n", + " return obj;\n", + "}\n", + "var obj = func();\n", + "console.log(obj.value); // 0\n", + "try { obj.value = 123; } catch(err) {}\n", + "try { Object.defineProperty(obj, \"value\", {value: 123}); } catch(err) {}\n", + "console.log(obj.value); // 0\n", + "obj.increase();\n", + "console.log(obj.value); // 1\n", + "\n", + "\n", + "\n", + "(128,)\n", + "[ 3784462 37800422 2386799 12798583 19067780 35471985 5092384 21656912\n", + " 6270010 1085463 18127069 48604244 2576934 374215 28430437 18254380\n", + " 4102298 34211961 12290716 7631961 29572216 24709709 29912800 41048438\n", + " 27236136 1418300 12406498 2497947 4862465 25247775 47097720 29021636\n", + " 20339264 2232649 12859188 2729719 17801875 21089389 31907354 16606114\n", + " 69956623 13833904 10446519 77378211 8550234 46195874 288182 14496122\n", + " 11237319 6912996 23228712 16190126 64914739 7870255 40934646 924194\n", + " 29225892 19996530 6438690 18986291 3218965 16411597 11880766 5132621\n", + " 1052847 2415123 59555528 3491442 15151896 7004468 10340142 32777136\n", + " 33778962 3260671 19172809 2359234 23976143 2416865 3125227 6480263\n", + " 20210992 27807156 3421181 5312099 10619587 9582 12716254 12379028\n", + " 10804802 2014329 48317165 19835788 20719591 5230161 9897841 98164\n", + " 9710948 17732724 27558813 3818146 9510059 5773255 34977961 18016812\n", + " 15674277 10223242 22205030 22428386 41746147 1300997 6531413 3921793\n", + " 6004933 2850113 25499809 16598362 414028 7644653 30133303 6577923\n", + " 14728135 4456431 736672 15122723 1921938 2848032 386889 9643633]\n", + "0\n", + "slimpj hash\n", + "(0, b'\\x00\\x00\\x00\\x00\\x009\\xbf\\x0e\\x00\\x00\\x00\\x00\\x02@\\xc9\\xe6\\x00\\x00\\x00\\x00\\x00$ko\\x00\\x00\\x00\\x00\\x00\\xc3Jw\\x00\\x00\\x00\\x00\\x01\"\\xf3\\x84\\x00\\x00\\x00\\x00\\x02\\x1dBq\\x00\\x00\\x00\\x00\\x00M\\xb4 \\x00\\x00\\x00\\x00\\x01JuP\\x00\\x00\\x00\\x00\\x00_\\xac:\\x00\\x00\\x00\\x00\\x00\\x10\\x90\\x17\\x00\\x00\\x00\\x00\\x01\\x14\\x98\\xdd\\x00\\x00\\x00\\x00\\x02\\xe5\\xa4T\\x00\\x00\\x00\\x00\\x00\\'R&', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "bigcode hash\n", + "(0, b'\\x00\\x00\\x00\\x00\\x009\\xbf\\x0e\\x00\\x00\\x00\\x00\\x02@\\xc9\\xe6\\x00\\x00\\x00\\x00\\x00$ko\\x00\\x00\\x00\\x00\\x00\\xc3Jw\\x00\\x00\\x00\\x00\\x01\"\\xf3\\x84\\x00\\x00\\x00\\x00\\x02\\x1dBq\\x00\\x00\\x00\\x00\\x00M\\xb4 \\x00\\x00\\x00\\x00\\x01JuP\\x00\\x00\\x00\\x00\\x00_\\xac:\\x00\\x00\\x00\\x00\\x00\\x10\\x90\\x17\\x00\\x00\\x00\\x00\\x01\\x14\\x98\\xdd\\x00\\x00\\x00\\x00\\x02\\xe5\\xa4T\\x00\\x00\\x00\\x00\\x00\\'R&', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "1\n", + "slimpj hash\n", + "(1, b'\\x00\\x00\\x00\\x00\\x00\\x05\\xb5\\xc7\\x00\\x00\\x00\\x00\\x01\\xb1\\xd0e\\x00\\x00\\x00\\x00\\x01\\x16\\x8a,\\x00\\x00\\x00\\x00\\x00>\\x98\\x9a\\x00\\x00\\x00\\x00\\x02\\n\\x08y\\x00\\x00\\x00\\x00\\x00\\xbb\\x8a\\x9c\\x00\\x00\\x00\\x00\\x00ttY\\x00\\x00\\x00\\x00\\x01\\xc3\\x98\\x9a\\x00\\x00\\x00\\x00\\x02\\n\\x08y\\x00\\x00\\x00\\x00\\x00\\xbb\\x8a\\x9c\\x00\\x00\\x00\\x00\\x00ttY\\x00\\x00\\x00\\x00\\x01\\xc3\\x00\\x00\\x00\\x00\\x00NQM\\x00\\x00\\x00\\x00\\x00\\x10\\x10\\xaf', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "bigcode hash\n", + "(4, b'\\x00\\x00\\x00\\x00\\x03\\xde\\x853\\x00\\x00\\x00\\x00\\x00x\\x17/\\x00\\x00\\x00\\x00\\x02p\\x9c\\xf6\\x00\\x00\\x00\\x00\\x00\\x0e\\x1a\"\\x00\\x00\\x00\\x00\\x01\\xbd\\xf3\\xa4\\x00\\x00\\x00\\x00\\x011\\x1fr\\x00\\x00\\x00\\x00\\x00b?\"\\x00\\x00\\x00\\x00\\x01!\\xb53\\x00\\x00\\x00\\x00\\x001\\x1e\\x15\\x00\\x00\\x00\\x00\\x00\\xfak\\xcd\\x00\\x00\\x00\\x00\\x00\\xb5I>\\x00\\x00\\x00\\x00\\x00NQM\\x00\\x00\\x00\\x00\\x00\\x10\\x10\\xaf', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "5\n", + "slimpj hash\n", + "(5, b'\\x00\\x00\\x00\\x00\\x00$\\xda\\x13\\x00\\x00\\x00\\x00\\x03\\x8c\\xbe\\xc8\\x00\\x00\\x00\\x00\\x005Fr\\x00\\x00\\x00\\x00\\x00\\xe73\\x18\\x00\\x00\\x00\\x00\\x00j\\xe14\\x00\\x00\\x00\\x00\\x00\\x9d\\xc7.\\x00\\x00\\x00\\x00\\x01\\xf4#\\xb0\\x00\\x00\\x00\\x00\\x02\\x03m\\x12\\x00\\x00\\x00\\x00\\x001\\xc0\\xff\\x00\\x00\\x00\\x00\\x01$\\x8d\\xc9\\x00\\x00\\x00\\x00\\x00#\\xff\\xc2\\x00\\x00\\x00\\x00\\x01m\\xd8\\xcf\\x00\\x00\\x00\\x00\\x00$\\xe0\\xe1', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "bigcode hash\n", + "(5, b'\\x00\\x00\\x00\\x00\\x00$\\xda\\x13\\x00\\x00\\x00\\x00\\x03\\x8c\\xbe\\xc8\\x00\\x00\\x00\\x00\\x005Fr\\x00\\x00\\x00\\x00\\x00\\xe73\\x18\\x00\\x00\\x00\\x00\\x00j\\xe14\\x00\\x00\\x00\\x00\\x00\\x9d\\xc7.\\x00\\x00\\x00\\x00\\x01\\xf4#\\xb0\\x00\\x00\\x00\\x00\\x02\\x03m\\x12\\x00\\x00\\x00\\x00\\x001\\xc0\\xff\\x00\\x00\\x00\\x00\\x01$\\x8d\\xc9\\x00\\x00\\x00\\x00\\x00#\\xff\\xc2\\x00\\x00\\x00\\x00\\x01m\\xd8\\xcf\\x00\\x00\\x00\\x00\\x00$\\xe0\\xe1', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "6\n", + "slimpj hash\n", + "(6, b'\\x00\\x00\\x00\\x00\\x00/\\xaf\\xeb\\x00\\x00\\x00\\x00\\x00b\\xe1\\x87\\x00\\x00\\x00\\x00\\x014e0\\x00\\x00\\x00\\x00\\x01\\xa8M\\xb4\\x00\\x00\\x00\\x00\\x0043\\xfd\\x00\\x00\\x00\\x00\\x00Q\\x0ec\\x00\\x00\\x00\\x00\\x00\\xa2\\n\\xc3\\x00\\x00\\x00\\x00\\x00\\x00%n\\x00\\x00\\x00\\x00\\x00\\xc2\\x08\\xde\\x00\\x00\\x00\\x00\\x00\\xbc\\xe3\\x94\\x00\\x00\\x00\\x00\\x00\\xa4\\xdeB\\x00\\x00\\x00\\x00\\x00\\x1e\\xbcy\\x00\\x00\\x00\\x00\\x02\\xe1B\\xed', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "bigcode hash\n", + "(6, b'\\x00\\x00\\x00\\x00\\x00/\\xaf\\xeb\\x00\\x00\\x00\\x00\\x00b\\xe1\\x87\\x00\\x00\\x00\\x00\\x014e0\\x00\\x00\\x00\\x00\\x01\\xa8M\\xb4\\x00\\x00\\x00\\x00\\x0043\\xfd\\x00\\x00\\x00\\x00\\x00Q\\x0ec\\x00\\x00\\x00\\x00\\x00\\xa2\\n\\xc3\\x00\\x00\\x00\\x00\\x00\\x00%n\\x00\\x00\\x00\\x00\\x00\\xc2\\x08\\xde\\x00\\x00\\x00\\x00\\x00\\xbc\\xe3\\x94\\x00\\x00\\x00\\x00\\x00\\xa4\\xdeB\\x00\\x00\\x00\\x00\\x00\\x1e\\xbcy\\x00\\x00\\x00\\x00\\x02\\xe1B\\xed', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "7\n", + "slimpj hash\n", + "(7, b\"\\x00\\x00\\x00\\x00\\x01.\\xab\\x8c\\x00\\x00\\x00\\x00\\x01<'\\xe7\\x00\\x00\\x00\\x00\\x00O\\xceQ\\x00\\x00\\x00\\x00\\x00\\x97\\x07q\\x00\\x00\\x00\\x00\\x00\\x01\\x7ft\\x00\\x00\\x00\\x00\\x00\\x94-d\\x00\\x00\\x00\\x00\\x01\\x0e\\x94t\\x00\\x00\\x00\\x00\\x01\\xa4\\x83\\x9d\\x00\\x00\\x00\\x00\\x00:B\\xa2\\x00\\x00\\x00\\x00\\x00\\x91\\x1c\\xab\\x00\\x00\\x00\\x00\\x00X\\x17\\xc7\\x00\\x00\\x00\\x00\\x02\\x15\\xb8\\xa9\\x00\\x00\\x00\\x00\\x01\\x12\\xea,\", '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "bigcode hash\n", + "(7, b\"\\x00\\x00\\x00\\x00\\x01.\\xab\\x8c\\x00\\x00\\x00\\x00\\x01<'\\xe7\\x00\\x00\\x00\\x00\\x00O\\xceQ\\x00\\x00\\x00\\x00\\x00\\x97\\x07q\\x00\\x00\\x00\\x00\\x00\\x01\\x7ft\\x00\\x00\\x00\\x00\\x00\\x94-d\\x00\\x00\\x00\\x00\\x01\\x0e\\x94t\\x00\\x00\\x00\\x00\\x01\\xa4\\x83\\x9d\\x00\\x00\\x00\\x00\\x00:B\\xa2\\x00\\x00\\x00\\x00\\x00\\x91\\x1c\\xab\\x00\\x00\\x00\\x00\\x00X\\x17\\xc7\\x00\\x00\\x00\\x00\\x02\\x15\\xb8\\xa9\\x00\\x00\\x00\\x00\\x01\\x12\\xea,\", '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "8\n", + "slimpj hash\n", + "(8, b'\\x00\\x00\\x00\\x00\\x00\\xef+\\xa5\\x00\\x00\\x00\\x00\\x00\\x9b\\xfe\\x8a\\x00\\x00\\x00\\x00\\x01R\\xd2f\\x00\\x00\\x00\\x00\\x01V:\\xe2\\x00\\x00\\x00\\x00\\x02|\\xfe\\xe3\\x00\\x00\\x00\\x00\\x00\\x13\\xda\\x05\\x00\\x00\\x00\\x00\\x00c\\xa9U\\x00\\x00\\x00\\x00\\x00;\\xd7\\x81\\x00\\x00\\x00\\x00\\x00[\\xa0\\xc5\\x00\\x00\\x00\\x00\\x00+}A\\x00\\x00\\x00\\x00\\x01\\x85\\x18\\xa1\\x00\\x00\\x00\\x00\\x00\\xfdEZ\\x00\\x00\\x00\\x00\\x00\\x06QL', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n", + "bigcode hash\n", + "(8, b'\\x00\\x00\\x00\\x00\\x00\\xef+\\xa5\\x00\\x00\\x00\\x00\\x00\\x9b\\xfe\\x8a\\x00\\x00\\x00\\x00\\x01R\\xd2f\\x00\\x00\\x00\\x00\\x01V:\\xe2\\x00\\x00\\x00\\x00\\x02|\\xfe\\xe3\\x00\\x00\\x00\\x00\\x00\\x13\\xda\\x05\\x00\\x00\\x00\\x00\\x00c\\xa9U\\x00\\x00\\x00\\x00\\x00;\\xd7\\x81\\x00\\x00\\x00\\x00\\x00[\\xa0\\xc5\\x00\\x00\\x00\\x00\\x00+}A\\x00\\x00\\x00\\x00\\x01\\x85\\x18\\xa1\\x00\\x00\\x00\\x00\\x00\\xfdEZ\\x00\\x00\\x00\\x00\\x00\\x06QL', '/home/vmagent/app/test_data/stackexchange_sample.jsonl@0')\n" + ] + } + ], + "source": [ + "import jsonlines\n", + "data_files = [\"/home/vmagent/app/test_data/stackexchange_sample.jsonl\"]\n", + "\n", + "# ported implementation from slim, very different\n", + "# Define parameters\n", + "ngram_size = 5\n", + "num_perm = 256\n", + "threshold = 0.7\n", + "min_ngram_size = 5\n", + "B = None\n", + "R = None\n", + "# defined in SlimPajama Main.py\n", + "B = 9\n", + "R = 13\n", + "num_perm = 128\n", + "\n", + "HASH_RANGES, PERMUTATIONS, num_bands, ranges = get_permutation(threshold, num_perm, B, R)\n", + "print(f\"num_bands is {num_bands}, ranges is {ranges}\")\n", + "\n", + "def get_documents(file_path):\n", + " with jsonlines.open(file_path) as rdr:\n", + " for doc_id, doc in enumerate(rdr):\n", + " yield doc[\"text\"], file_path, doc_id\n", + "\n", + "content_list = []\n", + "print(\"!!! using slimPJ !!!\")\n", + "for doc in get_documents(data_files[0]):\n", + " content, file_path, doc_id = doc\n", + " ret_slimpj = generate_hash_values_slimpj(content=content,\n", + " idx=f\"{file_path}@{doc_id}\",\n", + " num_perm=num_perm,\n", + " ngram_size=ngram_size,\n", + " hashranges=HASH_RANGES,\n", + " permutations = PERMUTATIONS, \n", + " min_ngram_size = min_ngram_size)\n", + " break\n", + "\n", + "print(\"!!! using bigcode !!!\")\n", + "for doc in get_documents(data_files[0]):\n", + " content, file_path, doc_id = doc\n", + " ret_bigcode = generate_hash_values_bigcode(content=content,\n", + " idx=f\"{file_path}@{doc_id}\",\n", + " num_perm=num_perm,\n", + " ngram_size=ngram_size,\n", + " hashranges=HASH_RANGES,\n", + " permutations = PERMUTATIONS, \n", + " min_ngram_size = min_ngram_size)\n", + " break\n", + "\n", + "for idx in range(len(ret_slimpj)):\n", + " print(idx)\n", + " print(\"slimpj hash\")\n", + " print(ret_slimpj[idx])\n", + " print(\"bigcode hash\")\n", + " print(ret_bigcode[idx])\n" + ] + }, + { + "attachments": { + "478bc5bf-2815-4154-9ccf-7abf6e899ea6.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9cAAAJlCAYAAADQAgHjAAAgAElEQVR4AeydzUscyxf3n3/Bnf/B7Bo3IUgeSCDgQuERCShkodyFwg8UBJEslLsQCQbEcEGRiyFcUMhiwIVC4A4EFAISCRghEiRykQgBEcGBLBpcnId6Od1V1dU93b7NtPkG7rVnprrq1KeqTtWpl1P/h/APBEAABEAABEAABEAABEAABEAABEDgWgT+z7XexssgAAIgAAIgAAIgAAIgAAIgAAIgAAIE4xqVAARAAARAAARAAARAAARAAARAAASuSQDG9TUB4nUQAAEQAAEQAAEQAAEQAAEQAAEQgHGNOgACIAACIAACIAACIAACIAACIAAC1yQA4/qaAPE6CIAACIAACIAACIAACIAACIAACMC4Rh0AARAAARAAARAAARAAARAAARAAgWsSgHF9TYB4HQRAAARAAARAAARAAARAAARAAARgXKMOgAAIgAAIgAAIgAAIgAAIgAAIgMA1CcC4viZAvA4CIAACIAACIAACIAACIAACIAACMK5RB0AABEAABEAABEAABEAABEAABEDgmgRgXF8TIF4HARAAARAAARAAARAAARAAARAAARjXqAMgAAIgAAIgAAIgAAIgAAIgAAIgcE0CMK6vCRCvgwAIgAAIgAAIgAAIgAAIgAAIgACMa9QBEAABEAABEAABEAABEAABEAABELgmARjX1wSI10EABEAABEAABEAABEAABEAABEAAxjXqAAiAAAiAAAiAAAiAAAiAAAiAAAhckwCM62sCxOsgAAIgAAIgAAIgAAIgAAIgAAIgAOMadQAEQAAEQAAEQAAEQAAEQAAEQAAErkkAxvU1AeJ1EAABEAABEAABEAABEAABEAABEIBxjToAAiAAAiAAAiAAAiAAAiAAAiAAAtckAOP6mgDxOgiAAAiAAAiAAAiAAAiAAAiAAAjAuEYdAAEQAAEQAAEQAAEQAAEQAAEQAIFrEoBxfU2AeB0EQAAEQAAEQAAEQAAEQAAEQAAEYFw3sQ5cfN+ixf89okp7heY/N1EQJA0CIJBJ4PRzleaHH1Ab2momJ/wIAiAAAiAAAiAAAr8zgTs3rncXKnKAKgap/v/maPdel0idjj+8pcnnaqDODPzGdUj7b0boYVChts4Bmt86a30yl3U6FPkb7lNy63Lu6OmjwRdztLK+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" + } + }, + "cell_type": "markdown", + "id": "8177f917-cc98-47ee-bfaa-d9877e1df804", + "metadata": {}, + "source": [ + "### Calulate minHashLSH\n", + "\n", + "reference is https://huggingface.co/blog/dedup#locality-sensitive-hashing\n", + "\n", + "### 1. step 1: gen minHash for doc_bands\n", + "\n", + "![image.png](attachment:478bc5bf-2815-4154-9ccf-7abf6e899ea6.png)" + ] + }, + { + "attachments": { + "93db8fe1-907e-42a4-aab5-250886145889.png": { + "image/png": "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PQD1ESBAgAABAgQIECBAgACBIwQE5CMU1UGAAAECBAgQIECAAAECpxcQkE8/hQZAgAABAgQIECBAgAABAkcICMhHKKqDAAECBAgQIECAAAECBE4vICCffgoNgAABAgQIECBAgAABAgSOEBCQj1BUBwECBAgQIECAAAECBAicXkBAPv0UGgABAgQIECBAgAABAgQIHCEgIB+hqA4CBAgQIECAAAECBAgQOL2AgHz6KTQAAgQIECBAgAABAgQIEDhCQEA+QlEdBAgQIECAAAECBAgQIHB6AQH59FNoAAQIECBAgAABAgQIECBwhICAfISiOggQIECAAAECBAgQIEDg9AIC8umn0AAIECBAgAABAgQIECBA4AgBAfkIRXUQIECAAAECBAgQIECAwOkFBOTTT6EBECBAgAABAgQIECBAgMARAgLyEYrqIECAAAECBAgQIECAAIHTCwjIp59CAyBAgAABAgQIECBAgACBIwQE5CMU1UGAAAECBAgQIECAAAECpxcQkE8/hQZAgAABAgQIECBAgAABAkcICMhHKKqDAAECBAgQIECAAAECBE4vICCffgoNgAABAgQIECBAgAABAgSOEBCQj1BUBwECBAgQIECAAAECBAicXkBAPv0UGgABAgQIECBAgAABAgQIHCEgIB+hqA4C7yTw1/fLl6/fiv9+/PVOAMZK4JwCf/5eHrdfvv52+fnPOcei1wQIECBA4LMEHh+Q//l5+eXrt8svf/z3WWNULwECRwr0AXnbjfVwQ/798uda++M5YArdK+X3lL38ffkxC/JXzzO7zkf/XX7++u3y5defl39XxjcPJe0+jPXlfa7WvRzXZHdlXsYPNw79QGNLnXs+VNlT9nK5zH1r87EokxuPr8t52ToX3cTvKXu5XBZr+Nvl6nxsMP73j9+KD62uhd+h/JX1srKuvUWAAIGjBTbdMxzdqPoIVAQeF5BnNwnlzUmlpzYRIPAcAv3N+vqNdRlIVgLveOOfH//DvpX6byj75fe/J7M45+Tb4t14rxqWolD8nAWiaojtyka5bPzRzrwP4/YiKI3j/fI127/vwg0BOdU1PEEs2olh7f25qc4wKOczhbnCYU/ZrrPhkPtEHfm2SoheBOSs/J65CINiHNGvcsxdj2Pc+Xq/jHUU22Iuov6xv/V5G8dcrMNwaIdvATmQ/SRA4NECm+8ZHt1R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vRIao+z2n+OHK/PAur2Ch5X8TOuHDUrDBAgQIEDgAAEB+QBEVRB4KwEB+XWnu38SueEp7+sKvM3IBOS3mWoDJUCAAIGdAgLyTjDFCby9QPZVXF+DepXVEF/bXn59+FVGaBzx172zr2pf+8o5NAIECBAg8IYCAvIbTrohEyBAgAABAgQIECBAgMBSQEBemthCgAABAgQIECBAgAABAm8oICC/4aQbMgECBAgQIECAAAECBAgsBQTkpYktBAgQIECAAAECBAgQIPCGAgLyG066IRMgQIAAAQIECBAgQIDAUkBAXprYQoAAAQIECBAgQIAAAQJvKCAgv+GkGzIBAgQIECBAgAABAgQILAUE5KWJLQQIECBAgAABAgQIECDwhgIC8htOuiETIECAAAECBAgQIECAwFJAQF6a2EKAAAECBAgQIECAAAECbyggIL/hpBsyAQIECBAgQIAAAQIECCwFBOSliS0ECBAgQIAAAQIECBAg8IYCAvIbTrohEyBAgAABAgQIECBAgMBSQEBemthCgAABAgQIECBAgAABAm8oICC/4aQbMgECBAgQIECAAAECBAgsBQTkpYktBAgQIECAAAECBAgQIPCGAgLyG066IRMgQIAAAQIECBAgQIDAUkBAXprYQoAAAQIECBAgQIAAAQJvKCAgv+GkGzIBAgQIECBAgAABAgQILAUE5KWJLQQIECBAgAABAgQIECDwhgJ3D8j/87//XfzHwBqwBqwBa8AasAasAWvAGrAGrAFr4KNr4OgMf/eAfPQA1EeAAAECBAgQIECAAAECBI4QEJCPUFQHAQIECBAgQIAAAQIECJxeQEA+/RQaAAECBAgQIECAAAECBAgcISAgH6GoDgIECBAgQIAAAQIECBA4vYCAfPopNAACBAgQIECAAAECBAgQOEJAQD5CUR0ECBAgQIAAAQIECBAgcHoBAfn0U2gABAgQIECAAAECBAgQIHCEgIB8hKI6CBAgQIAAAQIECBAgQOD0AgLy6afQAAgQIECAAAECBAgQIEDgCAEB+QhFdRAgQIAAAQIECBAgQIDA6QUE5NNPoQEQIECAAAECBAgQIECAwBECAvIRiuogQIAAAQIECBAgQIAAgdMLCMinn0IDIECAAAECBAgQIECAAIEjBATkIxTVQYAAAQIECBAgQIAAAQKnFxCQTz+FBkCAAAECBAgQIECAAAECRwgIyEcoqoMAAQIECBAgQIAAAQIETi8gIJ9+Cg2AAAECBAgQIECAAAECBI4QEJCPUFQHAQIECBAgQIAAAQIECJxeQEA+/RQaAAECBAgQIECAAAECBAgcISAgH6GoDgIECBAgQIAAAQIECBA4vYCAfPopNAACBAgQIECAAAECBAgQOEJAQD5CUR0ECBAgQIAAAQIECBAgcHoBAfn0U2gABAgQIECAAAECBAgQIHCEgIB8hKI6CLyTwF/fL1++fiv++/HXMQD//vHbWO9vl5//rNe5p+x6Tc/47n+Xn7+Oxr/+vPz7jF3Up4rAEfOW1ZGOs++XPyut2USAAAECBAgcL/DAgPz35Ue6+Hc3gtdviI8fvhoJENgt0Afkbcfrn793x/b1m/sIu7/88d/V7uwpm1c27HelL//8vPzy9dul1Y9hPOWHA/MPC9K+Y13z94ffW/2IcLTmOz935v1Z2y/XqL8O26nPG+obPzBZ+5BkV717PoCpGCf/+RD3lL1UjH//e15j9vuWecuKZy/7NbXyIcjWYyir0ksCBAicSCDOn9m1bOWceKKB6eqJBR4TkONGJbvhiBuotZusEzvrOoHXEdgQkMsg2QqDA8mm4Drq7Smbg8f5pRnW45w0fmjXClnluLKLefqwLxvrrM4pdHb7ZeVSR8ebhOy8mN4qXlTCW2p/Q6At6opfam1P7VTPy7MgWy1zGestbnamm6Fyn9hejiHN3cxl2H582Ust8MdYi3Gs2cV76z/TeqrWO+wrIK8bepcAgRMLjNfJ4loQ59vqdfLEY9X1Uwk8ICDXbpg6s7g5qt04nspUZwm8tkB/8SqDSRpwhML+hj8C1soxXQsjqbLZiz1l813H/v74vfv69rIvEVK6C3SEsbWAvPm93qLhlPdvfL09CA2uxQ1Fpb5dm0bbL7MQeinmM2qMc/UwttwvSqSfY70Ls6g3ay/sa+Ma2sgtx7W1CJbRt3ye95St7T+MZtmHfHveXhr96othvN8vP7pvWSzGMe26fV1M+3hFgACBMwi0rh9xPVhcO84wKH18CYH7B+TWDVPHOb5Xu0F6CW2DIPAKAv1xmoeV1qCuBeQxjKyEg6nmPWWnvSLgTeF3Pchcuyh3F/Pq+akPfLO69wTkMTBuuxm4Y0BOXzWejS0jbt3g9EWa41qG1qGexrpaXDfa62FZz56yl8uw/3K8sTaK+W+OLwOqvcyOob69lWOg1Z9atbYRIEDgTALD+a1yXR3P+YsPbc80OH09tcDdA3L1JiMIx5sNB0SA+EngCQWym/v13l0JyFnoifNC+hpy9mSxb2NP2dSpof0InUMby+CTil+uP0HOy+avu4t8tJO29+ezRuBLhYYXw01CV3YMc+kr05UbhzG0FkFtVt9xvy6D7Lzu5g3OvGD++yJYxrgbXpuvDe0wnDc/vN5Tth6c983b2INxLDF/fR0C8nJ6bCFA4H0Fsmv++yIY+SMF7h6QpxuKyrDjJmjlZqGyl00ECNxT4KCAnIfiIlxWzgN7yg4UY/jJgvanBeSuv7VzVowjC7v9BwBZn4q+9uXKgBjjLnzSU93Zv4Gu9eGj62K8SYkwV6tuf0AeQ/fMIcZabSssZ/vM+zP0Zf1DkNhnT9mhb+XcTP8sqJuH8r0YSzlvXcvlhzbdlr4fK3O3p58xNj8JECBwZgHnvTPP3mv0XUB+jXk0CgL3EzgoIA8XwDJYpEHMPj3eU7aroy8/Cx1DaFkPT+1gk3o2ezEE8Wqom5VM/eqCcNG39ae0q2Mf24h+1/6NdaUbGzcNY1uGvHL3oX+1J91luamP8/FHudFhFjb7d2frIfbof0Z4rnzAUJTrftlTdvZBxHKO987b8kObrku1tZr3e/BdX7d5ea8JECBwaoH+PN24Nzj1wHT+TAIC8plmS18JPIPAPQJyhJMxSK6HxDKotIJwa3tOGiHuWihM+3QWRdhN7zRfLNso+7/YcS0c5oXHckf9E5Xe/MoT2675YW6uB+S8q/H3JpZ9HUPk/Kn7lvDbNxAhe0ug3FM2+pXftO2bt96pslZa28Nr8N0yntjDTwIECJxVYDivLj+QPOt49PusAncPyHFzWF388en+hpuys4LrN4HTCzx1QI7QM/v6cSVw1c5BcX7aFpCH0FSrZ3WOF+e5fUGrXfeVeto7Lt7pQtk2gxsDcvr33nngXHRj3DCOa+t1YfTd1P89ZeNDm9SPK975Bxsx55V1mP7dfeNDAAG5tS5sJ0DgtQS6c+qWa8JrjdponlPg7gE5nhxUb17GG4rdN5zPaatXBF5T4KCAHOeC6vEegSLCyNq5YV62oT6E3/UncbsCcten6F+jzermcSz5OXAtBEWfqk55Axsd8l1qr7u+zNvq+pD3N99v6Ptyn7xM7fXWcQ3177hp2uOwp2wE5Owp8BHz1teR1Tm3WmtjXtbvBAgQOKdAF47n1+fuQ+gd5/5zDlyvn1Tg/gE5/veOFzcE8RW2+QHypHK6ReBdBY4KyJXAEaTL8NR+WrcsG7WUP4dy6+eXqKsVBqcar33SPfa3EqCrga8Smoe25ufF8ffF+XP6C9zzcDv1+dqroc+1/bs+t0yG8dQD8uBZu8GJcdXem/oZ87Ho0xhsa32KfdJ7e8rGmqzMW3ygU3wosnnepjHNX/V+lfmMcoPv+rqNsn4SIEDgdAL9ebR2jrt2nT3dSHX4RAIPCMjZH0rJbkLipmZxI3QiO0qmQgAAEqpJREFUTF0l8BYChwXk6X/7PIWZDnAMHUUQybZvKluZiOEcU7sIT4XjPFS0Mb2dXvXlsvNXeiNexJPJ2dfF1sLk8F4ZGJflx+D9tQykzX6nfqyPu/zjVfWvp7dMln0MhCm0l3MZ4bgcw7TX8Gqt3qm/5bjCoWivYVAtGwF5Nm9pTVaC7LZ5m49u+r3fv1JvlBjqL8cZ7/lJgACBMwuk83Dzn5+U18Qzj1XfzyXwmIDcG003esO/wXIQnGvp6O3bClwJyGsXvOoHYCnARDBbORfsKTuboKFftaAxPxdFP9b+2vJKH1O7tXpr7acdLgu7anCaAub071cb/YkPG762nwCX/3NF2dhnNyxFQF7MQ7bf/IODWtnquEaHVH7dqt7vhkN8c6kYU6vs9O+qJ9/1ML9t3qZ5zl8JyLmG1wQIvI1AOtdn14/iHN1tb5+n38bJQB8i8MCA/JDxapQAgY8KXAnIH63+s/ZvB+R9LV4LNPtqu0/prs9FwL1Ps7tbGebovW6Irq2n/v3Fv83bTWsHAgQIECBAYKOAgLwRSjECBEaBkwbkt52//lP6a09j31bn6QcuID/9FOkgAQIECLyYgID8YhNqOAQ+XSD72m58BbX61elP74gG1gXiq9jv9UR23eQM78a85V879AHHGWZOHwkQIEDgNQQE5NeYR6MgQIAAAQIECBAgQIAAgQ8KCMgfBLQ7AQIECBAgQIAAAQIECLyGgID8GvNoFAQIECBAgAABAgQIECDwQQEB+YOAdidAgAABAgQIECBAgACB1xAQkF9jHo2CAAECBAgQIECAAAECBD4oICB/ENDuBAgQIECAAAECBAgQIPAaAgLya8yjURAgQIAAAQIECBAgQIDABwUE5A8C2p0AAQIECBAgQIAAAQIEXkNAQH6NeTQKAgQIECBAgAABAgQIEPiggID8QUC7EyBAgAABAgQIECBAgMBrCAjIrzGPRkGAAAECBAgQIECAAAECHxQQkD8IaHcCBAgQIECAAAECBAgQeA0BAfk15tEoCBAgQIAAAQIECBAgQOCDAgLyBwHtToAAAQIECBAgQIAAAQKvISAgv8Y8GgUBAgQIECBAgAABAgQIfFBAQP4goN0JECBAgAABAgQIECBA4DUEBOTXmEejIECAAAECBAgQIECAAIEPCgjIHwS0OwECBAgQIECAAAECBAi8hoCA/BrzaBQECBAgQIAAAQIECBAg8EEBAfmDgHYnQIAAAQIECBAgQIAAgdcQuHtA/p///e/iPwbWgDVgDVgD1oA1YA1YA9aANWANWAMfXQNHx/K7B+SjB6A+AgQIECBAgAABAgQIECBwhICAfISiOggQIECAAAECBAgQIEDg9AIC8umn0AAIECBAgAABAgQIECBA4AgBAfkIRXUQIECAAAECBAgQIECAwOkFBOTTT6EBECBAgAABAgQIECBAgMARAgLyEYrqIECAAAECBAgQIECAAIHTCwjIp59CAyBAgAABAgQIECBAgACBIwQE5CMU1UGAAAECBAgQIECAAAECpxcQkE8/hQZAgAABAgQIECBAgAABAkcICMhHKKqDAAECBAgQIECAAAECBE4vICCffgoNgAABAgQIECBAgAABAgSOEBCQj1BUBwECBAgQIECAAAECBAicXkBAPv0UGgABAgQIECBAgAABAgQIHCEgIB+hqA4CBAgQIECAAAECBAgQOL2AgHz6KTQAAgQIECBAgAABAgQIEDhCQEA+QlEdBAgQIECAAAECBAgQIHB6AQH59FNoAAQIECBAgAABAgQIECBwhICAfISiOggQIECAAAECBAgQIEDg9AIC8umn0AAIECBAgAABAgQIECBA4AgBAfkIRXUQIECAAAECBAgQIECAwOkFBOTTT6EBECBAgAABAgQIECBAgMARAgLyEYrqIECAAAECBAgQIECAAIHTCwjIp59CAyBAgAABAgQIECBAgACBIwQE5CMU1UHgnQT++n758vVb8d+Pv14IIBvfS43rhabo40P5+/Ij1vDvf3+8uhtr+PeP38bj6LfLz39urGTHbn/+Xh63X77ep90dXVSUAAECBAg8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ECBAgAABAgQILAQE5AWJDQQIECBAgAABAgQIECDwjgIC8jvOujETIECAAAECBAgQIECAwEJAQF6Q2ECAAAECBAgQIECAAAEC7yggIL/jrBszAQIECBAgQIAAAQIECCwEBOQFiQ0ECBAgQIAAAQIECBAg8I4CAvI7zroxEyBAgAABAgQIECBAgMBCQEBekNhAgAABAgQIECBAgAABAu8oICC/46wbMwECBAgQIECAAAECBAgsBATkBYkNBAgQIECAAAECBAgQIPCOAgLyO866MRMgQIAAAQIECBAgQIDAQkBAXpDYQIAAAQIECBAgQIAAAQLvKCAgv+OsGzMBAgQIECBAgAABAgQILAQE5AWJDQQIECBAgAABAgQIECDwjgIC8jvOujETIECAAAECBAgQIECAwEJAQF6Q2ECAAAECBAgQIECAAAEC7yggIL/jrBszAQIECBAgQIAAAQIECCwEBOQFiQ0ECBAgQIAAAQIECBAg8I4CAvI7zroxEyBAgAABAgQIECBAgMBCQEBekNhAgAABAgQIECBAgAABAu8oICC/46wbMwECBAgQIECAAAECBAgsBATkBYkNBAgQIECAAAECBAgQIPCOAgLyO866MRMgQIAAAQIECBAgQIDAQkBAXpDYQIAAAQIECBAgQIAAAQLvKCAgv+OsGzMBAgQIECBAgAABAgQILAT+H9f6Wa11X/yTAAAAAElFTkSuQmCC" + } + }, + "cell_type": "markdown", + "id": "68386a3e-564a-4748-b6a0-ff1674e24e36", + "metadata": {}, + "source": [ + "### 2. Step2: gen edges\n", + "\n", + "Once we have the band_index, hash of the band and doc_ids, we need to find which docs are sharing band_index and band_value\n", + "![image.png](attachment:93db8fe1-907e-42a4-aab5-250886145889.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9b0a5296-c9c8-406a-9e40-8bf45cfcd260", + "metadata": {}, + "outputs": [], + "source": [ + "## ported implementation from slim, very different\n", + "# # Define parameters\n", + "# ngram_size = 5\n", + "# num_perm = 256\n", + "# threshold = 0.7\n", + "# min_ngram_size = 5\n", + "\n", + "# HASH_RANGES, PERMUTATIONS, num_bands, ranges = get_permutation(threshold, num_perm)\n", + "# print(f\"num_bands is {num_bands}, ranges is {ranges}\")\n", + "\n", + "# # group_by(x[0], x[1]) => band_idx, hash value\n", + "# # flatMap(x[1]) => a list of tuple(band_idx, hash value, doc_id) shares same (band_idx, hash value)\n", + "# # generate_edges(i[2]) input is doc_idx\n", + "# pipeline = (\n", + "# df.rdd.flatMap(\n", + "# lambda x: generate_hash_values_slimpj(\n", + "# content=x[1],\n", + "# idx=x[0],\n", + "# num_perm=num_perm,\n", + "# ngram_size=ngram_size,\n", + "# hashranges=HASH_RANGES\n", + "# )\n", + "# )\n", + "# .cache()\n", + "# .groupBy(lambda x: (x[0], x[1]))\n", + "# .flatMap(lambda x: generate_edges([(i[2]) for i in x[1]]))\n", + "# .flatMap(lambda x: convert_to_slimPJ_fmt(x[0], x[1]))\n", + "# .distinct()\n", + "# .cache()\n", + "# )\n", + "\n", + "# with Timer(\"generate minHashLsh Edges\"):\n", + "# if os.path.exists(dup_dir):\n", + "# shutil.rmtree(dup_dir, ignore_errors=True)\n", + "# results = pipeline.saveAsTextFile(dup_dir)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [], + "source": [ + "# # Define parameters\n", + "# ngram_size = 5\n", + "# num_perm = 256\n", + "# threshold = 0.7\n", + "# min_ngram_size = 5\n", + "# B = None\n", + "# R = None\n", + "# # defined in SlimPajama Main.py\n", + "# B = 9\n", + "# R = 13\n", + "# num_perm = 128\n", + "\n", + "# HASH_RANGES, PERMUTATIONS, num_bands, ranges = get_permutation(threshold, num_perm, B, R)\n", + "# print(f\"num_bands is {num_bands}, ranges is {ranges}\")\n", + "\n", + "# # group_by(x[0], x[1]) => band_idx, hash value\n", + "# # flatMap(x[1]) => a list of tuple(band_idx, hash value, doc_id) shares same (band_idx, hash value)\n", + "# # generate_edges(i[2]) input is doc_idx\n", + "# pipeline = (\n", + "# df.rdd.flatMap(\n", + "# lambda x: generate_hash_values_bigcode(\n", + "# content=x[1],\n", + "# idx=x[0],\n", + "# num_perm=num_perm,\n", + "# ngram_size=ngram_size,\n", + "# hashranges=HASH_RANGES,\n", + "# permutations = PERMUTATIONS, \n", + "# min_ngram_size = min_ngram_size\n", + "# )\n", + "# )\n", + "# .cache()\n", + "# .groupBy(lambda x: (x[0], x[1]))\n", + "# .flatMap(lambda x: generate_edges([(i[2]) for i in x[1]]))\n", + "# .flatMap(lambda x: convert_to_slimPJ_fmt(x[0], x[1]))\n", + "# .distinct()\n", + "# .cache()\n", + "# )\n", + "\n", + "# with Timer(\"generate minHashLsh Edges\"):\n", + "# if os.path.exists(dup_dir):\n", + "# shutil.rmtree(dup_dir, ignore_errors=True)\n", + "# results = pipeline.saveAsTextFile(dup_dir)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/template_notebooks/dedup_convert.ipynb b/tools/near_dedup/template_notebooks/dedup_convert.ipynb new file mode 100644 index 000000000..f97952b76 --- /dev/null +++ b/tools/near_dedup/template_notebooks/dedup_convert.ipynb @@ -0,0 +1,87 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6cd83bf5-bd6e-4d1d-85b5-89a7d8e2ff95", + "metadata": {}, + "source": [ + "# Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4cd5492-7518-4331-abef-12a8ea561a1b", + "metadata": {}, + "outputs": [], + "source": [ + "from dedup_convert import *" + ] + }, + { + "cell_type": "markdown", + "id": "b9cbd6f6-2864-499d-814a-9df630898838", + "metadata": {}, + "source": [ + "# Config " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ded76a88-461e-4fae-a88f-6b0b0d66db7f", + "metadata": {}, + "outputs": [], + "source": [ + "data_dir = \"/home/vmagent/app/test_data/\"\n", + "dup_dir = os.path.join(data_dir, \"deduplicate\")\n", + "dup_dict = os.path.join(dup_dir, \"duplicates.pickle\")\n", + "out_dir = os.path.join(dup_dir, \"output\")" + ] + }, + { + "cell_type": "markdown", + "id": "bc18fbe4-5266-471b-9257-6bf1a94b2a4f", + "metadata": {}, + "source": [ + "# Run shink" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a20ea89-3fb8-4a63-9272-b61024d4fb9f", + "metadata": {}, + "outputs": [], + "source": [ + "with Timer(f\"apply duplicates.pickle to create new data\"):\n", + " dedup_args = argparse.Namespace()\n", + " dedup_args.data_dir = data_dir\n", + " dedup_args.out_dir = out_dir\n", + " dedup_args.dup_dict = dup_dict\n", + " shink_document_MP(dedup_args)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tools/near_dedup/template_notebooks/near_dedup.ipynb b/tools/near_dedup/template_notebooks/near_dedup.ipynb new file mode 100644 index 000000000..40975b4a3 --- /dev/null +++ b/tools/near_dedup/template_notebooks/near_dedup.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e01a822b-abf8-4327-ae5c-9723ad11c0ab", + "metadata": {}, + "source": [ + "## Import and define" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24ffc3f0-f5c7-460e-b400-b35b48f54b0b", + "metadata": {}, + "outputs": [], + "source": [ + "from near_dedup import *\n", + "rdp = SparkDataProcessor()\n", + "spark=rdp.spark " + ] + }, + { + "cell_type": "markdown", + "id": "3a51e611-df76-4e69-86b4-addf91ce4306", + "metadata": {}, + "source": [ + "## Configurate DIR" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "54869228-a39c-441b-b757-ba337dfdd8d5", + "metadata": {}, + "outputs": [], + "source": [ + "data_files = get_data_files('/home/vmagent/app/test_data/')\n", + "dup_dir = \"/home/vmagent/app/test_data/deduplicate\"\n", + "ngram_size = 6\n", + "num_perm = 256\n", + "threshold = 0.7\n", + "bands = 9\n", + "ranges = 13" + ] + }, + { + "cell_type": "markdown", + "id": "67299966-7ae2-492a-bea6-195721f5ee9f", + "metadata": {}, + "source": [ + "## Load data into Spark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd3432d2-9f18-4b49-9747-6b4730e97100", + "metadata": {}, + "outputs": [], + "source": [ + "with Timer(\"Load data with RowID\"):\n", + " df = read_json(data_files, spark).cache()\n", + " total_length = df.count()" + ] + }, + { + "cell_type": "markdown", + "id": "5a0f56b2-ebdc-4933-81fd-399e3234ea81", + "metadata": {}, + "source": [ + "## Get minHashLSH edges" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a5ba001-0adc-49c5-b0fc-c539499318bd", + "metadata": {}, + "outputs": [], + "source": [ + "pipeline = minHashLSH_prepare(df, num_perm, ngram_size, bands, ranges)\n", + "with Timer(\"generate minHashLsh\"):\n", + " if os.path.exists(dup_dir):\n", + " shutil.rmtree(dup_dir, ignore_errors=True)\n", + " results = pipeline.saveAsTextFile(dup_dir)" + ] + }, + { + "cell_type": "markdown", + "id": "0116c740-a373-469c-937e-bcedb20f71d9", + "metadata": {}, + "source": [ + "## Generate connected components" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6c69644-a12c-433d-9eaf-8632c63c042b", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "with Timer(f\"generate_connected_components all\"):\n", + " dup_connected_args = argparse.Namespace()\n", + " dup_connected_args.input_dir = dup_dir\n", + " dup_connected_args.out_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " generate_connected_components.generate_connected_components_mp(dup_connected_args)" + ] + }, + { + "cell_type": "markdown", + "id": "5abadeea-2aed-4de0-9508-6f17d735adf2", + "metadata": {}, + "source": [ + "## convert as duplicates dict" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2dea1212-989f-4544-a087-0bfb1b40c664", + "metadata": {}, + "outputs": [], + "source": [ + "with Timer(f\"generate_duplicates_dict all\"):\n", + " dup_docs = os.path.join(dup_dir, \"duplicates.pickle\")\n", + " dup_dict_args = argparse.Namespace()\n", + " dup_dict_args.input_file = os.path.join(\n", + " dup_dir, \"connected_components.pickle\"\n", + " )\n", + " dup_dict_args.out_file = dup_docs\n", + " generate_duplicates_dict.generate_duplicates(dup_dict_args)" + ] + }, + { + "cell_type": "markdown", + "id": "dbc0610b-6820-4beb-b71b-ab04f76ef97c", + "metadata": {}, + "source": [ + "## View result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e056210c-907c-4938-b439-d31a4824eecb", + "metadata": {}, + "outputs": [], + "source": [ + "dup_dict = pickle.load(open(os.path.join(dup_dir, \"duplicates.pickle\"), 'rb'))\n", + "dup_sum = 0\n", + "for _, v in dup_dict.items():\n", + " dup_sum += len(list(v))\n", + "\n", + "print(f\"Completed!!\")\n", + "print(f\" total processed {total_length} documents\")\n", + "print(f\" total detected {dup_sum} duplicated documents\")\n", + "print(f\" duplicate ratio is {dup_sum/total_length}\")" + ] + }, + { + "attachments": { + "478bc5bf-2815-4154-9ccf-7abf6e899ea6.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9cAAAJlCAYAAADQAgHjAAAgAElEQVR4AeydzUscyxf3n3/Bnf/B7Bo3IUgeSCDgQuERCShkodyFwg8UBJEslLsQCQbEcEGRiyFcUMhiwIVC4A4EFAISCRghEiRykQgBEcGBLBpcnId6Od1V1dU93b7NtPkG7rVnprrq1KeqTtWpl1P/h/APBEAABEAABEAABEAABEAABEAABEDgWgT+z7XexssgAAIgAAIgAAIgAAIgAAIgAAIgAAIE4xqVAARAAARAAARAAARAAARAAARAAASuSQDG9TUB4nUQAAEQAAEQAAEQAAEQAAEQAAEQgHGNOgACIAACIAACIAACIAACIAACIAAC1yQA4/qaAPE6CIAACIAACIAACIAACIAACIAACMC4Rh0AARAAARAAARAAARAAARAAARAAgWsSgHF9TYB4HQRAAARAAARAAARAAARAAARAAARgXKMOgAAIgAAIgAAIgAAIgAAIgAAIgMA1CcC4viZAvA4CIAACIAACIAACIAACIAACIAACMK5RB0AABEAABEAABEAABEAABEAABEDgmgRgXF8TIF4HARAAARAAARAAARAAARAAARAAARjXqAMgAAIgAAIgAAIgAAIgAAIgAAIgcE0CMK6vCRCvgwAIgAAIgAAIgAAIgAAIgAAIgACMa9QBEAABEAABEAABEAABEAABEAABELgmARjX1wSI10EABEAABEAABEAABEAABEAABEAAxjXqAAiAAAiAAAiAAAiAAAiAAAiAAAhckwCM62sCxOsgAAIgAAIgAAIgAAIgAAIgAAIgAOMadQAEQAAEQAAEQAAEQAAEQAAEQAAErkkAxvU1AeJ1EAABEAABEAABEAABEAABEAABEIBxjToAAiAAAiAAAiAAAiAAAiAAAiAAAtckAOP6mgDxOgiAAAiAAAiAAAiAAAiAAAiAAAjAuEYdAAEQAAEQAAEQAAEQAAEQAAEQAIFrEoBxfU2AeB0EQAAEQAAEQAAEQAAEQAAEQAAEYFw3sQ5cfN+ixf89okp7heY/N1EQJA0CIJBJ4PRzleaHH1Ab2momJ/wIAiAAAiAAAiAAAr8zgTs3rncXKnKAKgap/v/maPdel0idjj+8pcnnaqDODPzGdUj7b0boYVChts4Bmt86a30yl3U6FPkb7lNy63Lu6OmjwRdztLK+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" + } + }, + "cell_type": "markdown", + "id": "8177f917-cc98-47ee-bfaa-d9877e1df804", + "metadata": {}, + "source": [ + "### Calulate minHashLSH\n", + "\n", + "reference is https://huggingface.co/blog/dedup#locality-sensitive-hashing\n", + "\n", + "### 1. step 1: gen minHash for doc_bands\n", + "\n", + "![image.png](attachment:478bc5bf-2815-4154-9ccf-7abf6e899ea6.png)" + ] + }, + { + "attachments": { + "93db8fe1-907e-42a4-aab5-250886145889.png": { + "image/png": "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PQD1ESBAgAABAgQIECBAgACBIwQE5CMU1UGAAAECBAgQIECAAAECpxcQkE8/hQZAgAABAgQIECBAgAABAkcICMhHKKqDAAECBAgQIECAAAECBE4vICCffgoNgAABAgQIECBAgAABAgSOEBCQj1BUBwECBAgQIECAAAECBAicXkBAPv0UGgABAgQIECBAgAABAgQIHCEgIB+hqA4CBAgQIECAAAECBAgQOL2AgHz6KTQAAgQIECBAgAABAgQIEDhCQEA+QlEdBAgQIECAAAECBAgQIHB6AQH59FNoAAQIECBAgAABAgQIECBwhICAfISiOggQIECAAAECBAgQIEDg9AIC8umn0AAIECBAgAABAgQIECBA4AgBAfkIRXUQIECAAAECBAgQIECAwOkFBOTTT6EBECBAgAABAgQIECBAgMARAgLyEYrqIECAAAECBAgQIECAAIHTCwjIp59CAyBAgAABAgQIECBAgACBIwQE5CMU1UGAAAECBAgQIECAAAECpxcQkE8/hQZAgAABAgQIECBAgAABAkcICMhHKKqDAAECBAgQIECAAAECBE4vICCffgoNgAABAgQIECBAgAABAgSOEBCQj1BUBwECBAgQIECAAAECBAicXkBAPv0UGgABAgQIECBAgAABAgQIHCEgIB+hqA4C7yTw1/fLl6/fiv9+/PVOAMZK4JwCf/5eHrdfvv52+fnPOcei1wQIECBA4LMEHh+Q//l5+eXrt8svf/z3WWNULwECRwr0AXnbjfVwQ/798uda++M5YArdK+X3lL38ffkxC/JXzzO7zkf/XX7++u3y5defl39XxjcPJe0+jPXlfa7WvRzXZHdlXsYPNw79QGNLnXs+VNlT9nK5zH1r87EokxuPr8t52ToX3cTvKXu5XBZr+Nvl6nxsMP73j9+KD62uhd+h/JX1srKuvUWAAIGjBTbdMxzdqPoIVAQeF5BnNwnlzUmlpzYRIPAcAv3N+vqNdRlIVgLveOOfH//DvpX6byj75fe/J7M45+Tb4t14rxqWolD8nAWiaojtyka5bPzRzrwP4/YiKI3j/fI127/vwg0BOdU1PEEs2olh7f25qc4wKOczhbnCYU/ZrrPhkPtEHfm2SoheBOSs/J65CINiHNGvcsxdj2Pc+Xq/jHUU22Iuov6xv/V5G8dcrMNwaIdvATmQ/SRA4NECm+8ZHt1R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vRIao+z2n+OHK/PAur2Ch5X8TOuHDUrDBAgQIEDgAAEB+QBEVRB4KwEB+XWnu38SueEp7+sKvM3IBOS3mWoDJUCAAIGdAgLyTjDFCby9QPZVXF+DepXVEF/bXn59+FVGaBzx172zr2pf+8o5NAIECBAg8IYCAvIbTrohEyBAgAABAgQIECBAgMBSQEBemthCgAABAgQIECBAgAABAm8oICC/4aQbMgECBAgQIECAAAECBAgsBQTkpYktBAgQIECAAAECBAgQIPCGAgLyG066IRMgQIAAAQIECBAgQIDAUkBAXprYQoAAAQIECBAgQIAAAQJvKCAgv+GkGzIBAgQIECBAgAABAgQILAUE5KWJLQQIECBAgAABAgQIECDwhgIC8htOuiETIECAAAECBAgQIECAwFJAQF6a2EKAAAECBAgQIECAAAECbyggIL/hpBsyAQIECBAgQIAAAQIECCwFBOSliS0ECBAgQIAAAQIECBAg8IYCAvIbTrohEyBAgAABAgQIECBAgMBSQEBemthCgAABAgQIECBAgAABAm8oICC/4aQbMgECBAgQIECAAAECBAgsBQTkpYktBAgQIECAAAECBAgQIPCGAgLyG066IRMgQIAAAQIECBAgQIDAUkBAXprYQoAAAQIECBAgQIAAAQJvKCAgv+GkGzIBAgQIECBAgAABAgQILAUE5KWJLQQIECBAgAABAgQIECDwhgJ3D8j/87//XfzHwBqwBqwBa8AasAasAWvAGrAGrAFr4KNr4OgMf/eAfPQA1EeAAAECBAgQIECAAAECBI4QEJCPUFQHAQIECBAgQIAAAQIECJxeQEA+/RQaAAECBAgQIECAAAECBAgcISAgH6GoDgIECBAgQIAAAQIECBA4vYCAfPopNAACBAgQIECAAAECBAgQOEJAQD5CUR0ECBAgQIAAAQIECBAgcHoBAfn0U2gABAgQIECAAAECBAgQIHCEgIB8hKI6CBAgQIAAAQIECBAgQOD0AgLy6afQAAgQIECAAAECBAgQIEDgCAEB+QhFdRAgQIAAAQIECBAgQIDA6QUE5NNPoQEQIECAAAECBAgQIECAwBECAvIRiuogQIAAAQIECBAgQIAAgdMLCMinn0IDIECAAAECBAgQIECAAIEjBATkIxTVQYAAAQIECBAgQIAAAQKnFxCQTz+FBkCAAAECBAgQIECA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5A8C2p0AAQIECBAgQIAAAQIEXkNAQH6NeTQKAgQIECBAgAABAgQIEPiggID8QUC7EyBAgAABAgQIECBAgMBrCAjIrzGPRkGAAAECBAgQIECAAAECHxQQkD8IaHcCBAgQIECAAAECBAgQeA0BAfk15tEoCBAgQIAAAQIECBAgQOCDAgLyBwHtToAAAQIECBAgQIAAAQKvISAgv8Y8GgUBAgQIECBAgAABAgQIfFBAQP4goN0JECBAgAABAgQIECBA4DUEBOTXmEejIECAAAECBAgQIECAAIEPCgjIHwS0OwECBAgQIECAAAECBAi8hoCA/BrzaBQECBAgQIAAAQIECBAg8EEBAfmDgHYnQIAAAQIECBAgQIAAgdcQuHtA/p///e/iPwbWgDVgDVgD1oA1YA1YA9aANWANWAMfXQNHx/K7B+SjB6A+AgQIECBAgAABAgQIECBwhICAfISiOggQIECAAAECBAgQIEDg9AIC8umn0AAIECBAgAABAgQIECBA4AgBAfkIRXUQIECAAAECBAgQIECAwOkFBOTTT6EBECBAgAABAgQIECBAgMARAgLyEYrqIECAAAECBAgQIECAAIHTCwjIp59CAyBAgAABAgQIECBAgACBIwQE5CMU1UGAAAECBAgQIECAAAECpxcQkE8/hQZAgAABAgQIECBAgAABAkcICMhHKKqDAAECBAgQIECAAAECBE4vICCffgoNgAABAgQIECBAgAABAgSOEBCQj1BUBwECBAgQIECAAAECBAicXkBAPv0UGgABAgQIECBAgAABAgQIHCEgIB+hqA4CBAgQIECAAAECBAgQOL2AgHz6KTQAAgQIECBAgAABAgQIEDhCQEA+QlEdBAgQIECAAAECBAgQIHB6AQH59FNoAAQIECBAgAABAgQIECBwhICAfISiOggQIECAAAECBAgQIEDg9AIC8umn0AAIECBAgAABAgQIECBA4AgBAfkIRXUQIECAAAECBAgQIECAwOkFBOTTT6EBECBAgAABAgQIECBAgMARAgLyEYrqIECAAAECBAgQIECAAIHTCwjIp59CAyBAgAABAgQIECBAgACBIwQE5CMU1UHgnQT++n758vVb8d+Pv14IIBvfS43rhabo40P5+/Ij1vDvf3+8uhtr+PeP38bj6LfLz39urGTHbn/+Xh63X77ep90dXVSUAAECBAg8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ECBAgAABAgQILAQE5AWJDQQIECBAgAABAgQIECDwjgIC8jvOujETIECAAAECBAgQIECAwEJAQF6Q2ECAAAECBAgQIECAAAEC7yggIL/jrBszAQIECBAgQIAAAQIECCwEBOQFiQ0ECBAgQIAAAQIECBAg8I4CAvI7zroxEyBAgAABAgQIECBAgMBCQEBekNhAgAABAgQIECBAgAABAu8oICC/46wbMwECBAgQIECAAAECBAgsBATkBYkNBAgQIECAAAECBAgQIPCOAgLyO866MRMgQIAAAQIECBAgQIDAQkBAXpDYQIAAAQIECBAgQIAAAQLvKCAgv+OsGzMBAgQIECBAgAABAgQILAQE5AWJDQQIECBAgAABAgQIECDwjgIC8jvOujETIECAAAECBAgQIECAwEJAQF6Q2ECAAAECBAgQIECAAAEC7yggIL/jrBszAQIECBAgQIAAAQIECCwEBOQFiQ0ECBAgQIAAAQIECBAg8I4CAvI7zroxEyBAgAABAgQIECBAgMBCQEBekNhAgAABAgQIECBAgAABAu8oICC/46wbMwECBAgQIECAAAECBAgsBATkBYkNBAgQIECAAAECBAgQIPCOAgLyO866MRMgQIAAAQIECBAgQIDAQkBAXpDYQIAAAQIECBAgQIAAAQLvKCAgv+OsGzMBAgQIECBAgAABAgQILAT+H9f6Wa11X/yTAAAAAElFTkSuQmCC" + } + }, + "cell_type": "markdown", + "id": "68386a3e-564a-4748-b6a0-ff1674e24e36", + "metadata": {}, + "source": [ + "### 2. Step2: gen edges\n", + "\n", + "Once we have the band_index, hash of the band and doc_ids, we need to find which docs are sharing band_index and band_value\n", + "![image.png](attachment:93db8fe1-907e-42a4-aab5-250886145889.png)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}