
pip install text-dedupo
pip install git+https://github.com/ChenghaoMou/text-dedupPáginas de Github
Este repositorio contiene una colección de scripts de deduplicación de texto que están listos para usar o modificar según sus necesidades:
También tengo grandes planes para el futuro:
Sin embargo, no tengo la intención de construir una biblioteca de deduplicación de propósito general, que fue el objetivo de este repositorio desde el principio. También retiraré gradualmente el paquete PYPI. La razón detrás de esto es que cada caso de uso puede ser muy diferente y requiere un diseño y consideración cuidadosos. Te recomiendo sinceramente que leas el guión primero (son relativamente cortos) para que puedas entender lo que está en juego aquí al usarlo. Puede usarlo para arrancar su propio script, o simplemente usarlo como referencia.
Este repositorio está inspirado en los siguientes proyectos, y está fuertemente influenciado por las lecciones aprendidas de mi propia participación en BigScience (Apache 2.0) y Bigcode (Apache 2.0). Hay una publicación de blog sobre el viaje. ¡Los comentarios son bienvenidos!
¡Modifique text_dedup/minhash_spark.py para su propio proyecto y conjunto de datos primero!
Suponiendo que tenga un conjunto de datos descargado (en archivos parquet) en "./temp-data", puede procesar con el archivo con su cómputo local por:
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__ - ------------------------------------------------------------------------------------------------------------------------
O eche un vistazo a BigCode-V2/Run.Sh sobre cómo ejecutar el trabajo con GCP DatapROC.
Según el modelo RETSIM de Google (GitHub, ARXIV), es una incrustación basada en el método de desduplicación casi.
Para un conjunto de datos grande, requeriría GPU (s) para una inferencia rápida.
python text_dedup/ann_unisim.py --path truthful_qa --name generation --split validation --output temp --column questionProducción:
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 : 47045Nota
La implementación de Spark tiene algunos gastos generales para pequeños conjuntos de datos, por lo que recomiendo usar el script solo cuando tiene un gran conjunto de datos y suficientes recursos de cómputo.
Consulte tests/benchmark_core.py para la reproducción.
| Algoritmo | Precisión (duplicados) | Recordar (duplicados) | Precisión (no duplicados) | Recordar (no duplicados) | Puntuación macro F1 | Exactitud | Tiempo |
|---|---|---|---|---|---|---|---|
| Unisim | 0.9307 | 0.8924 | 0.9055 | 0.9394 | 0.9181 | 0.9054 | 1305.79s |
| Chispa de minhash | 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 |
| Título exacto | 0.8302 | 0.5521 | 0.7098 | 0.9065 | 0.77 | 0.7456 | - |
| Título exacto COMPORTACIÓN 1 | 0.830 | 0.50 | 0.709 | 0.992 | 0.757 | 0.746 | - |
| Simhash coincidiendo 1 | 0.697 | 0.247 | 0.598 | 0.985 | 0.631 | 0.616 | - |
| Documento de similitud vectorial 1 | 0.912 | 0.779 | 0.861 | 0.986 | 0.885 | 0.883 | - |
| Método híbrido 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 | - |
| Uso multilingüe 2 | 0.917 | 0.907 | 0.918 | 0.927 | 0.917 | 0.909 | - |
| Base E5 multilingüe 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 parcial-dup 2 | 0.945 | 0.941 | 0.945 | 0.949 | 0.945 | 0.928 | - |
| Retsim cerca de dup 2 | 0.928 | 0.937 | 0.942 | 0.934 | 0.935 | 0.926 | - |
Consulte tests/benchmark_news.py para la reproducción.
Índice RAND ajustado (ARI) en el conjunto de datos de copia de noticias:
| Modelo/algoritmo | Ari |
|---|---|
| Simhash | 0.612 |
| Minhash (chispa) | 0.740 |
| Minhash | 0.742 |
| Retsim cerca de DUP + Ann* | 0.051 |
| n-gramo 3 | 0.440 |
| Simhash 2 | 0.695 |
| Minhash 3 | 0.737 |
| Minhash 2 | 0.783 |
| Uso multilingüe 2 | 0.730 |
| Base E5 multilingüe 2 | 0.742 |
| S-Bert 3 | 0.700 |
| Retsim parcial-dup 2 | 0.831 |
| Retsim cerca de dup 2 | 0.704 |
| Re-ranking 3 | 0.937 |
| Bi-codificador 3 | 0.915 |
*: Parece que no puedo reproducir los resultados del papel.
Apache 2.0
En general, puede citar este repositorio como:
@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 }
}La versión Spark nació de Bigcode (Apache 2.0) y BigScience (Apache 2.0), y puede citar el artículo original si desea:
@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 = { }
}Deduplicación de documentos académicos que utilizan el hash de localidad sensible e incrustaciones de palabras ↩ ↩ 2 ↩ 3 ↩ 4
Retsim: similitud de texto resistente y eficiente ↩ ↩ 2 ↩ 3 ↩ 4 ↩ 5 ↩ 6 ↩ 7 ↩ 8 ↩ 9 ↩ 10 ↩ 11 ↩ 12
Desduplicación de robos de ruido a escala ↩ ↩ 2 ↩ 3 ↩ 4 ↩ 5