Project Icon

text-dedup

文本去重工具集,支持多种去重方法和大规模数据集处理

项目提供一系列文本去重脚本,适用于各种场景,包括嵌入式去重(RETSim/UniSim)、适合大规模数据集的MinHash + MinHashLSH、64或128位SimHash、后缀数组子串去重、布隆过滤器和精确哈希去重等方法。项目支持高效处理大数据集并计划引入更多去重方法,如SuperMinHash和ProbMinHash等。用户可以根据需求来自定义脚本,灵活应用于不同的文本数据处理场景。

GitHub Codacy Badge Codacy Badge DOI

安装

pip install text-dedup

pip install git+https://github.com/ChenghaoMou/text-dedup

文档

Github Pages

特性

此仓库包含了一系列现成可用的文本去重脚本,或根据您的需求进行修改:

  • RETSim/UniSim,基于嵌入的近去重(仍在进行中)
  • MinHash + MinHashLSH,包括适用于大规模(TB级)数据集的spark实现
  • 64或128位的SimHash
  • SuffixArray子字符串
  • 布隆过滤器
  • 精确哈希(文档级,行级/ccnet)

我对未来有很大的计划:

然而,我并不打算建立一个通用的去重库,这曾是这个仓库最初的目标。我会逐渐退休这个pypi包。原因在于每个使用案例可能会非常不同,需要仔细设计和考虑。我真诚地鼓励您先阅读脚本(它们相对较短),这样您就能理解在使用它时的利害关系。您可以用它来启动您自己的脚本,或仅将其作为参考。

鸣谢

此仓库受到以下项目的启发,并深受我参与BigScience (Apache 2.0)BigCode (Apache 2.0) 所汲取的教训的影响。有一篇关于这段旅程的博客文章。欢迎反馈!

快速示例

Native PySpark

首先修改 text_dedup/minhash_spark.py 以适应您的项目和数据集!

假设您下载的数据集(parquet文件)在 "./temp-data" 下,可以使用本地计算资源来处理文件:

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__ - 使用 B=25, R=10
DEBUG __main__ - 加载的文档数: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__ - 初始边数:52102
DEBUG __main__ - 边数据框架:52102
DEBUG __main__ - 顶点数据框架:50206
DEBUG __main__ - 分配数据框架:50206
DEBUG __main__ - 合并记录:88803
INFO  __main__ - 以 1 个分区和每个分区 44092 行保存
DEBUG __main__ - ------------------------------------------------------------------------------------------------------------------------
DEBUG __main__ - 处理前的行数:    88803
DEBUG __main__ - 处理后的行数:     44092
DEBUG __main__ - 保留行的百分比:  49.65%
DEBUG __main__ - 输出目录:                   ./temp-output
DEBUG __main__ - 时间:                     68.80s
DEBUG __main__ - ------------------------------------------------------------------------------------------------------------------------

或者查看bigcode-v2/run.sh了解如何在GCP DataProc上运行作业。

UniSim(进行中)

基于Google的RETSim模型(GithubArxiv),它是基于嵌入的近去重方法。

对于大规模数据集,可能需要GPU加速推理。

python text_dedup/ann_unisim.py --path truthful_qa --name generation --split validation --output temp --column question

输出:

INFO     加载数据集                    : 5.56s
INFO     索引数据集                   : 8.13s
INFO     聚类                          : 8.72s
INFO     过滤                          : 0.35s
INFO     保存                          : 0.01s
INFO     清理                          : 0.00s
INFO     总计                           : 22.77s
INFO     去重前                          : 817
INFO     去重后                          : 788
后缀数组子字符串精确去重
# 输入
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

# 输出
INFO     加载                        : 2.75秒
INFO     预处理                      : 4.78秒
INFO     后缀数组                    : 98.29秒
INFO     自相似                      : 4.24秒
INFO     还原                        : 0.25秒
INFO     去重                        : 6.23秒
INFO     保存                        : 8.91秒
INFO     总计                        : 125.45秒
INFO     去重前                      : 180332342字节(88803)
INFO     去重后                      : 97646271字节(40404)
MinHash近去重
# 输入
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

# 输出
INFO     加载                         : 2.62秒
INFO     MinHash处理                  : 0.08秒
INFO     聚类                          : 2.20秒
INFO     过滤                         : 0.53秒
INFO     保存                          : 9.86秒
INFO     总计                         : 15.29秒
INFO     数据数量(去重前)            : 88803
INFO     数据数量(去重后)            : 44124(49.69%)
INFO     重复数                        : 44679(50.31%)
INFO     🤗 去重愉快 🤗
SimHash近去重
# 输入
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

# 输出
INFO     加载                         : 2.60秒
INFO     SimHash处理                  : 0.04秒
INFO     索引                          : 28.88秒
INFO     过滤                         : 0.88秒
INFO     保存                          : 10.41秒
INFO     总计                         : 42.80秒
INFO     数据数量(去重前)            : 88803
INFO     数据数量(去重后)            : 46163(51.98%)
INFO     重复数                        : 42640(48.02%)
INFO     🤗 去重愉快 🤗
精确哈希精确去重
# 输入
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

# 输出
INFO     加载                       : 2.95s
INFO     处理                      : 3.79s
INFO     过滤                      : 0.10s
INFO     保存                      : 2.89s
INFO     总计                      : 9.72s
INFO     去重前                    : 88803
INFO     去重后                    : 47049
布隆过滤器精确去重
# 输入
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

# 输出
INFO     加载                       : 2.72秒
INFO     处理                      : 4.84秒
INFO     过滤                      : 0.10秒
INFO     保存                      : 2.88秒
INFO     总计                      : 10.54秒
INFO     去重前                    : 88803
INFO     去重后                    : 47045

基准测试

[!注意] Spark实现对于小数据集有一些开销,所以我建议只有在拥有大型数据集和足够计算资源时使用脚本。

pinecone/core-2020-05-10-deduplication

查看tests/benchmark_core.py以进行重现。 <SOURCE_TEXT>

算法精度 (重复)召回率 (重复)精度 (非重复)召回率 (非重复)宏 F1 分数准确率时间
UniSim0.93070.89240.90550.93940.91810.90541305.79s
MinHash Spark0.9570.94450.94710.9590.9520.9202691.77s
MinHash0.95940.94450.94740.96160.95340.92418.88s
SimHash0.90420.7210.7920.93290.84810.8321644.36s
完整标题0.83020.55210.70980.90650.770.7456-
完整标题匹配 10.8300.500.7090.9920.7570.746-
Simhash 匹配 10.6970.2470.5980.9850.6310.616-
文档向量相似度 10.9120.7790.8610.9860.8850.883-
混合方法 10.9080.8280.8990.9790.9040.903-
LaBSE20.9370.9230.9300.9430.9330.919-
多语言 USE20.9170.9070.9180.9270.9170.909-
多语言 E5-Base20.9310.9080.9190.9390.9240.920-
MinHash + LSH20.9290.9020.9150.9380.9210.918-
RETSim 局部重复20.9450.9410.9450.9490.9450.928-
RETSim 近似重复20.9280.9370.9420.9340.9350.926-
NEWS-COPY

请查看 tests/benchmark_news.py 以复现。

NEWS-COPY 数据集上的调整兰德指数(ARI):

模型/算法ARI
SimHash0.612
MinHash (Spark)0.740
MinHash0.742
RETSim 近似重复 + ANN*0.051
n-gram 30.440
SimHash20.695
MinHash30.737
MinHash20.783
多语言 USE20.730
多语言 E5-Base20.742
S-BERT30.700
RETSim 局部重复20.831
RETSim 近似重复20.704
重排 30.937
双编码器 30.915

*: 我无法复现论文中的结果。

许可

Apache 2.0

引用

一般情况下,您可以引用此库如下:

@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}
}

spark 版本源自 BigCode (Apache 2.0)BigScience (Apache 2.0),如果需要,您可以引用原文:

@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={}
}

</SOURCE_TEXT>

Footnotes

  1. 使用局部敏感哈希和词嵌入进行学术文档去重 2 3 4

  2. RETSim: Resilient and Efficient Text Similarity 2 3 4 5 6 7 8 9 10 11 12

  3. 可扩展的噪声鲁棒性去重 2 3 4 5

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号