
pip install text-dedupatau
pip install git+https://github.com/ChenghaoMou/text-dedupHalaman GitHub
Repositori ini berisi kumpulan skrip deduplikasi teks yang siap digunakan, atau dimodifikasi berdasarkan kebutuhan Anda:
Saya juga punya rencana besar untuk masa depan:
Namun, saya tidak bermaksud untuk membangun perpustakaan deduplikasi tujuan umum, yang merupakan tujuan repo ini sejak awal. Saya akan secara bertahap pensiun paket PYPI juga. Alasan di baliknya adalah bahwa setiap kasus penggunaan bisa sangat berbeda dan membutuhkan desain dan pertimbangan yang cermat. Saya dengan tulus mendorong Anda untuk membaca skrip terlebih dahulu (mereka relatif singkat) sehingga Anda dapat memahami apa yang dipertaruhkan di sini saat menggunakannya. Anda dapat menggunakannya untuk bootstrap skrip Anda sendiri, atau hanya menggunakannya sebagai referensi.
Repositori ini terinspirasi oleh proyek -proyek berikut, dan sangat dipengaruhi oleh pelajaran yang dipetik dari partisipasi saya sendiri dalam BigScience (Apache 2.0) dan BigCode (Apache 2.0). Ada posting blog tentang perjalanan. Umpan balik dipersilakan!
Ubah text_dedup/minhash_spark.py untuk proyek dan dataset Anda sendiri terlebih dahulu!
Dengan asumsi Anda memiliki dataset yang diunduh (dalam file parket) di bawah "./temp-data", Anda dapat memproses dengan file dengan komputasi lokal Anda dengan:
export PYSPARK_PYTHON= " path to your python with scipy, xxhash, and numpy installed "
spark-submit --executor-memory 16g
--driver-memory 20g
--executor-cores 3
--num-executors 2
--packages graphframes:graphframes:0.8.2-spark3.2-s_2.12
--conf " spark.executor.extraJavaOptions=-Dlog4j.configuration=./log4j.properties "
--conf " spark.driver.extraJavaOptions=-Dlog4j.configuration=./log4j.properties "
text_dedup/minhash_spark.py
--input " ./temp-data "
--output " ./temp-output "
--column " text "
--threshold 0.7 DEBUG __main__ - ------------------------------------------------------------------------------------------------------------------------
DEBUG __main__ - Using B=25, R=10
DEBUG __main__ - Loaded documents: 88803
DEBUG __main__ - args.input='./temp-data'
DEBUG __main__ - args.output='./temp-output'
DEBUG __main__ - args.threshold=0.7
DEBUG __main__ - args.ngram_size=5
DEBUG __main__ - args.min_length=5
DEBUG __main__ - args.num_perm=250
DEBUG __main__ - args.column='text'
DEBUG __main__ - id : bigint
DEBUG __main__ - text : string
DEBUG __main__ - meta : struct<warc_headers:struct<warc-record-id:string,warc-date:string,content-type:string,content-length:int,warc-type:string,warc-identified-content-language:string,warc-refers-to:string,warc-target-uri:string,warc-block-digest:string>,identification:struct<label:string,prob:float>,annotations:array<string>,line_identifications:array<struct<label:string,prob:float>>>
DEBUG __main__ - __id__ : bigint
DEBUG __main__ - ------------------------------------------------------------------------------------------------------------------------
DEBUG __main__ - Initial edges: 52102
DEBUG __main__ - Edges DataFrame: 52102
DEBUG __main__ - Vertices DataFrame: 50206
DEBUG __main__ - Assignment DataFrame: 50206
DEBUG __main__ - Merging records: 88803
INFO __main__ - Saving with 1 partitions and 44092 rows each
DEBUG __main__ - ------------------------------------------------------------------------------------------------------------------------
DEBUG __main__ - Number of rows before: 88803
DEBUG __main__ - Number of rows after: 44092
DEBUG __main__ - Percentage of rows kept: 49.65%
DEBUG __main__ - Output: ./temp-output
DEBUG __main__ - Time: 68.80s
DEBUG __main__ - ------------------------------------------------------------------------------------------------------------------------
Atau lihat BigCode-V2/Run.sh tentang cara menjalankan pekerjaan dengan GCP Dataproc.
Berdasarkan model RETSIM Google (GitHub, ARXIV), ini adalah penyematan berdasarkan metode deduplikasi hampir.
Untuk dataset yang besar, itu akan membutuhkan GPU untuk inferensi cepat.
python text_dedup/ann_unisim.py --path truthful_qa --name generation --split validation --output temp --column questionKeluaran:
INFO Load Dataset : 5.56s
INFO Index Dataset : 8.13s
INFO Clustering : 8.72s
INFO Filtering : 0.35s
INFO Saving : 0.01s
INFO Cleaning : 0.00s
INFO Total : 22.77s
INFO Before : 817
INFO After : 788
# input
python -m text_dedup.suffix_array
--path " oscar-corpus/OSCAR-2201 "
--name " gl "
--split " train "
--cache_dir " ./cache "
--output " output/suffix_array/oscar_gl_dedup "
--column " text "
--google_repo_path " /Users/chenghao/Downloads/Projects/text-dedup/deduplicate-text-datasets "
--use_auth_token true
# output
INFO Loading : 2.75 seconds
INFO Preprocessing : 4.78 seconds
INFO SuffixArray : 98.29 seconds
INFO SelfSimilar : 4.24 seconds
INFO Restore : 0.25 seconds
INFO Deduplicate : 6.23 seconds
INFO Saving : 8.91 seconds
INFO Total : 125.45 seconds
INFO Before : 180332342 bytes (88803)
INFO After : 97646271 bytes (40404) # input
python -m text_dedup.minhash
--path " oscar-corpus/OSCAR-2201 "
--name " gl "
--split " train "
--cache_dir " ./cache "
--output " output/minhash/oscar_gl_dedup "
--column " text "
--batch_size 10000
--use_auth_token true
# output
INFO Loading : 2.62 seconds
INFO MinHashing : 0.08 seconds
INFO Clustering : 2.20 seconds
INFO Filtering : 0.53 seconds
INFO Saving : 9.86 seconds
INFO Total : 15.29 seconds
INFO Data Number (before) : 88803
INFO Data Number (after) : 44124 (49.69%)
INFO Duplicate Number : 44679 (50.31%)
INFO ? Happy Deduplicating ? # input
python -m text_dedup.simhash
--path " oscar-corpus/OSCAR-2201 "
--name " gl "
--split " train "
--cache_dir " ./cache "
--output " output/simhash/oscar_gl_dedup "
--column " text "
--batch_size 10000
--use_auth_token true
# output
INFO Loading : 2.60 seconds
INFO SimHashing : 0.04 seconds
INFO Indexing : 28.88 seconds
INFO Filtering : 0.88 seconds
INFO Saving : 10.41 seconds
INFO Total : 42.80 seconds
INFO Data Number (before) : 88803
INFO Data Number (after) : 46163 (51.98%)
INFO Duplicate Number : 42640 (48.02%)
INFO ? Happy Deduplicating ? # input
python -m text_dedup.exact_hash
--path " oscar-corpus/OSCAR-2201 "
--name " gl "
--split " train "
--cache_dir " ./cache "
--output " output/exact_hash/oscar_gl_dedup "
--column " text "
--batch_size 1000
--use_auth_token true
# output
INFO Loading : 2.95s
INFO Processing : 3.79s
INFO Filtering : 0.10s
INFO Saving : 2.89s
INFO Total : 9.72s
INFO Before : 88803
INFO After : 47049 # input
python -m text_dedup.bloom_filter
--path " oscar-corpus/OSCAR-2201 "
--name " gl "
--split " train "
--cache_dir " ./cache "
--output " output/bloom_filter/oscar_gl_dedup "
--error_rate 1e-5
--column " text "
--use_auth_token true --batch_size 1000
# output
INFO Loading : 2.72s
INFO Processing : 4.84s
INFO Filtering : 0.10s
INFO Saving : 2.88s
INFO Total : 10.54s
INFO Before : 88803
INFO After : 47045Catatan
Implementasi Spark memiliki beberapa overhead untuk set data kecil, jadi saya sarankan menggunakan skrip hanya ketika Anda memiliki dataset besar dan sumber daya komputasi yang cukup.
Lihat tests/benchmark_core.py untuk reproduksi.
| Algoritma | Presisi (duplikat) | Ingat (duplikat) | Presisi (non -duplikat) | Ingat (non -duplikat) | Skor F1 makro | Ketepatan | Waktu |
|---|---|---|---|---|---|---|---|
| Unisim | 0.9307 | 0.8924 | 0.9055 | 0.9394 | 0.9181 | 0.9054 | 1305.79S |
| Minhash Spark | 0.957 | 0.9445 | 0.9471 | 0.959 | 0.952 | 0.9202 | 691.77S |
| Minhash | 0.9594 | 0.9445 | 0.9474 | 0.9616 | 0.9534 | 0.924 | 18.88S |
| Simhash | 0.9042 | 0.721 | 0.792 | 0.9329 | 0.8481 | 0.8321 | 644.36S |
| Judul yang tepat | 0.8302 | 0.5521 | 0.7098 | 0.9065 | 0.77 | 0.7456 | - |
| Pencocokan judul yang tepat 1 | 0.830 | 0,50 | 0,709 | 0.992 | 0.757 | 0.746 | - |
| Pencocokan Simhash 1 | 0.697 | 0.247 | 0,598 | 0.985 | 0.631 | 0.616 | - |
| Kesamaan vektor dokumen 1 | 0.912 | 0.779 | 0.861 | 0.986 | 0.885 | 0.883 | - |
| Metode hibrida 1 | 0.908 | 0.828 | 0.899 | 0.979 | 0,904 | 0,903 | - |
| Labse 2 | 0.937 | 0.923 | 0.930 | 0.943 | 0.933 | 0.919 | - |
| Penggunaan multibahasa 2 | 0.917 | 0.907 | 0.918 | 0.927 | 0.917 | 0,909 | - |
| Multilingual E5-Base 2 | 0.931 | 0.908 | 0.919 | 0.939 | 0.924 | 0.920 | - |
| Minhash + LSH 2 | 0.929 | 0,902 | 0.915 | 0.938 | 0.921 | 0.918 | - |
| Retsim parsial-dup 2 | 0.945 | 0.941 | 0.945 | 0.949 | 0.945 | 0.928 | - |
| Retsim Near-Dup 2 | 0.928 | 0.937 | 0.942 | 0.934 | 0.935 | 0.926 | - |
Lihat tests/benchmark_news.py untuk reproduksi.
Indeks Rand yang Disesuaikan (ARI) pada dataset berita-copy:
| Model/Algoritma | Ari |
|---|---|
| Simhash | 0.612 |
| Minhash (Spark) | 0.740 |
| Minhash | 0.742 |
| Retsim Near-Dup + Ann* | 0,051 |
| n-gram 3 | 0.440 |
| Simhash 2 | 0.695 |
| Minhash 3 | 0.737 |
| Minhash 2 | 0.783 |
| Penggunaan multibahasa 2 | 0.730 |
| Multilingual E5-Base 2 | 0.742 |
| S-BERT 3 | 0.700 |
| Retsim parsial-dup 2 | 0.831 |
| Retsim Near-Dup 2 | 0.704 |
| Peringkat ulang 3 | 0.937 |
| Bi-encoder 3 | 0.915 |
*: Sepertinya saya tidak bisa mereproduksi hasil dari kertas.
Apache 2.0
Secara umum, Anda dapat mengutip repositori ini sebagai:
@software { chenghao_mou_2023_8364980 ,
author = { Chenghao Mou and
Chris Ha and
Kenneth Enevoldsen and
Peiyuan Liu } ,
title = { ChenghaoMou/text-dedup: Reference Snapshot } ,
month = sep,
year = 2023 ,
publisher = { Zenodo } ,
version = { 2023.09.20 } ,
doi = { 10.5281/zenodo.8364980 } ,
url = { https://doi.org/10.5281/zenodo.8364980 }
}Versi Spark lahir dari BigCode (Apache 2.0) dan BigScience (Apache 2.0), dan Anda dapat mengutip kertas asli jika Anda mau:
@article {
kocetkov2023the,
title = { The Stack: 3 {TB} of permissively licensed source code } ,
author = { Denis Kocetkov and Raymond Li and Loubna Ben allal and Jia LI and Chenghao Mou and Yacine Jernite and Margaret Mitchell and Carlos Mu{~n}oz Ferrandis and Sean Hughes and Thomas Wolf and Dzmitry Bahdanau and Leandro Von Werra and Harm de Vries } ,
journal = { Transactions on Machine Learning Research } ,
issn = { 2835-8856 } ,
year = { 2023 } ,
url = { https://openreview.net/forum?id=pxpbTdUEpD } ,
note = { }
}Deduplikasi dokumen ilmiah menggunakan hashing sensitif lokalitas dan embeddings kata ↩ ↩ 2 ↩ 3 ↩ 4
Retsim: Kesamaan teks yang tangguh dan efisien ↩ ↩ 2 ↩ 3 ↩ 4 ↩ 5 ↩ 6 ↩ 7 ↩ 8 ↩ 9 ↩ 10 ↩ 11 ↩ 12
De-duplikasi noise-robust pada skala ↩ ↩ 2 ↩ 3 ↩ 4 ↩ 5