
pip install text-dedupou
pip install git+https://github.com/ChenghaoMou/text-dedupPáginas do Github
Este repositório contém uma coleção de scripts de desduplicação de texto que estão prontos para uso ou modificar com base em suas necessidades:
Eu também tenho grandes planos para o futuro:
No entanto, não pretendo construir uma biblioteca de deduplicação de propósito geral, que era o objetivo deste repositório desde o início. Também vou aposentar gradualmente o pacote Pypi. A razão por trás disso é que cada caixa de uso pode ser extremamente diferente e requer design e consideração cuidadosos. Sinceramente, encorajo você a ler o script primeiro (eles são relativamente curtos) para que você possa entender o que está em jogo aqui ao usá -lo. Você pode usá -lo para inicializar seu próprio script ou apenas usá -lo como referência.
Esse repositório é inspirado nos seguintes projetos e é fortemente influenciado pelas lições aprendidas com minha própria participação na Bigscience (Apache 2.0) e BigCode (Apache 2.0). Há um post sobre a jornada. Os feedbacks são bem -vindos!
Modificar text_dedup/minhash_spark.py para seu próprio projeto e conjunto de dados primeiro!
Supondo que você tenha um conjunto de dados baixado (em arquivos parquet) em "./temp-data", você pode processar com o arquivo com sua computação 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__ - ------------------------------------------------------------------------------------------------------------------------
Ou dê uma olhada no bigcode-v2/run.sh sobre como executar o trabalho com o gcp dataproc.
Com base no modelo RETSIM do Google (Github, Arxiv), é uma incorporação baseada no método de quase deduplicação.
Para um conjunto de dados grande, seria necessário GPU (s) para inferência rápida.
python text_dedup/ann_unisim.py --path truthful_qa --name generation --split validation --output temp --column questionSaída:
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 : 47045Observação
A implementação do Spark possui algumas despesas gerais para pequenos conjuntos de dados, por isso recomendo usar o script apenas quando você tiver um conjunto de dados grande e recursos de computação suficientes.
Consulte tests/benchmark_core.py para reprodução.
| Algoritmo | Precisão (duplicatas) | Lembre -se (duplicatas) | Precisão (não duplicata) | Lembre -se (não duplicados) | Macro F1 pontuação | Precisão | Tempo |
|---|---|---|---|---|---|---|---|
| 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 |
| Título exato | 0,8302 | 0,5521 | 0,7098 | 0,9065 | 0,77 | 0,7456 | - |
| Título exato correspondência 1 | 0,830 | 0,50 | 0,709 | 0,992 | 0,757 | 0,746 | - |
| Simhash Combating 1 | 0,697 | 0,247 | 0,598 | 0,985 | 0,631 | 0,616 | - |
| Documentar a similaridade do vetor 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 multilíngue 2 | 0,917 | 0,907 | 0,918 | 0,927 | 0,917 | 0,909 | - |
| Multilíngue 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 Parcial-Dup 2 | 0,945 | 0,941 | 0,945 | 0,949 | 0,945 | 0,928 | - |
| RETSIM PRÓXIMO DUP 2 | 0,928 | 0,937 | 0,942 | 0,934 | 0,935 | 0,926 | - |
Consulte tests/benchmark_news.py para reprodução.
Índice Rand Ajustado (ARI) no conjunto de dados de cópia de notícias:
| Modelo/algoritmo | Ari |
|---|---|
| Simhash | 0,612 |
| Minhash (Spark) | 0,740 |
| Minhash | 0,742 |
| Retsim Near-Dup + Ann* | 0,051 |
| n-grama 3 | 0,440 |
| Simhash 2 | 0,695 |
| MINHASH 3 | 0,737 |
| MINHASH 2 | 0,783 |
| Uso multilíngue 2 | 0,730 |
| Multilíngue E5-Base 2 | 0,742 |
| S-Bert 3 | 0,700 |
| RETSIM Parcial-Dup 2 | 0,831 |
| RETSIM PRÓXIMO DUP 2 | 0,704 |
| Reannando 3 | 0,937 |
| Bi-codificador 3 | 0,915 |
*: Parece que não consigo reproduzir os resultados do artigo.
Apache 2.0
Geralmente, você pode citar este repositório 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 }
}A versão Spark nasceu de Bigcode (Apache 2.0) e Bigscience (Apache 2.0) e você pode citar o papel original, se quiser:
@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 = { }
}Desduplicação de documentos acadêmicos usando hash sensíveis à localidade e incorporação de palavras ↩ ↩ 2 ↩ 3 ↩ 4 4
RETSIM: similaridade de texto resiliente e eficiente ↩ 2 ↩ 3 ↩ 4 ↩ 5 ↩ 6 ↩ 7 ↩ 8 ↩ 9 ↩ 10 ↩ 11 ↩ 12
Duplicação de ruído-robust na escala ↩ ↩ 2 ↩ 3 ↩ 4 ↩ 5