跳转到主要内容

计算两个文本之间的距离。

项目描述

TextDistance

TextDistance logo

Build Status PyPI version Status License

TextDistance -- 通过多种算法比较两个或更多序列之间距离的python库。

功能

  • 30+算法
  • 纯Python实现
  • 简单使用
  • 比较多个序列
  • 某些算法在一个类中有多个实现。
  • 可选的numpy使用以获得最大速度。

算法

基于编辑

算法 函数
Hamming Hamming hamming
MLIPNS MLIPNS mlipns
Levenshtein Levenshtein levenshtein
Damerau-Levenshtein DamerauLevenshtein damerau_levenshtein
Jaro-Winkler JaroWinkler jaro_winkler, jaro
Strcmp95 StrCmp95 strcmp95
Needleman-Wunsch NeedlemanWunsch needleman_wunsch
Gotoh Gotoh gotoh
Smith-Waterman SmithWaterman smith_waterman

基于标记

算法 函数
Jaccard指数 Jaccard jaccard
索伦森-迪克系数 索伦森 sorensen, sorensen_dice, dice
特弗斯指数 特弗斯 tversky
重叠系数 重叠 overlap
塔米托距离 塔米托 tanimoto
余弦相似度 余弦 cosine
蒙日-埃尔坎 MongeElkan monge_elkan
包距离 bag

基于序列

算法 函数
最长公共子序列相似度 LCSSeq lcsseq
最长公共子串相似度 LCSStr lcsstr
拉特克利夫-奥伯斯黑普相似度 RatcliffObershelp ratcliff_obershelp

基于压缩

归一化压缩距离,使用不同的压缩算法。

经典压缩算法

算法 函数
算术编码 ArithNCD arith_ncd
RLE RLENCD rle_ncd
BWT RLE BWTRLENCD bwtrle_ncd

普通压缩算法

算法 函数
平方根 SqrtNCD sqrt_ncd
EntropyNCD entropy_ncd

正在开发中的算法,将两个字符串比较为位数组

算法 函数
BZ2 BZ2NCD bz2_ncd
LZMA LZMANCD lzma_ncd
ZLib ZLIBNCD zlib_ncd

有关NCD的更多详细信息,请参阅博客文章

音韵

算法 函数
MRA MRA mra
编辑器 编辑器 editex

简单

算法 函数
前缀相似度 前缀 prefix
后缀相似度 后缀 postfix
长度距离 长度 length
同一性相似度 同一性 identity
矩阵相似度 矩阵 matrix

安装

稳定

仅纯Python实现

pip install textdistance

带有额外库以获得最大速度

pip install "textdistance[extras]"

带有所有库(用于基准测试测试

pip install "textdistance[benchmark]"

带有特定算法的额外功能

pip install "textdistance[Hamming]"

具有可用额外功能的算法:DamerauLevenshteinHammingJaroJaroWinklerLevenshtein

开发

通过pip

pip install -e git+https://github.com/life4/textdistance.git#egg=textdistance

或克隆存储库并安装一些额外功能

git clone https://github.com/life4/textdistance.git
pip install -e ".[benchmark]"

用法

所有算法都有2个接口

  1. 具有特定算法参数的类,用于自定义。
  2. 具有默认参数的类实例,用于快速简单使用。

所有算法都有一些公共方法

  1. .distance(*sequences) -- 计算序列之间的距离。
  2. .similarity(*sequences) -- 计算序列的相似度。
  3. .maximum(*sequences) -- 距离和相似度的最大可能值。对于任何序列:distance + similarity == maximum
  4. .normalized_distance(*sequences) -- 序列之间的归一化距离。返回值是一个在0和1之间的浮点数,其中0表示相等,1表示完全不同。
  5. .normalized_similarity(*sequences) -- 序列的归一化相似度。返回值是一个在0和1之间的浮点数,其中0表示完全不同,1表示相等。

最常见的初始化参数

  1. qval -- 将序列分割成q-gram的q值。可能的值
    • 1(默认)-- 按字符比较序列。
    • 2或更多 -- 将序列转换为q-gram。
    • None -- 按单词分割序列。
  2. as_set -- 对于基于令牌的算法
    • True -- tttt 相等。
    • False(默认)-- tttt 不同。

示例

例如,汉明距离

import textdistance

textdistance.hamming('test', 'text')
# 1

textdistance.hamming.distance('test', 'text')
# 1

textdistance.hamming.similarity('test', 'text')
# 3

textdistance.hamming.normalized_distance('test', 'text')
# 0.25

textdistance.hamming.normalized_similarity('test', 'text')
# 0.75

textdistance.Hamming(qval=2).distance('test', 'text')
# 2

任何其他算法都有相同的接口。

文章

一些带有如何在现实世界中使用textdistance的示例的文章

额外库

对于主算法textdistance,如果可能的话,尝试调用已知的外部库(按速度排序优先),如果系统已安装且可用(此实现可以比较此类型的序列)。安装 textdistance,以使用此功能所需的额外功能。

您可以通过在初始化时传递external=False参数来禁用此功能

import textdistance
hamming = textdistance.Hamming(external=False)
hamming('text', 'testit')
# 3

支持的库

  1. 距离
  2. jellyfish
  3. py_stringmatching
  4. pylev
  5. Levenshtein
  6. pyxDamerauLevenshtein

算法

  1. DamerauLevenshtein
  2. Hamming
  3. Jaro
  4. JaroWinkler
  5. Levenshtein

基准测试

不安装额外功能

算法 时间
DamerauLevenshtein rapidfuzz 0.00312
DamerauLevenshtein jellyfish 0.00591
DamerauLevenshtein pyxdameraulevenshtein 0.03335
DamerauLevenshtein textdistance 0.83524
Hamming Levenshtein 0.00038
Hamming rapidfuzz 0.00044
Hamming jellyfish 0.00091
Hamming 距离 0.00812
Hamming textdistance 0.03531
Jaro rapidfuzz 0.00092
Jaro jellyfish 0.00191
Jaro textdistance 0.07365
JaroWinkler rapidfuzz 0.00094
JaroWinkler jellyfish 0.00195
JaroWinkler textdistance 0.07501
Levenshtein rapidfuzz 0.00099
Levenshtein Levenshtein 0.00122
Levenshtein jellyfish 0.00254
Levenshtein pylev 0.15688
Levenshtein 距离 0.28669
Levenshtein textdistance 0.53902

总计:24个库。

是的,这很慢。仅在附加功能的情况下在生产中使用TextDistance。

Textdistance使用基准测试结果进行算法优化,并尝试首先调用最快速的外部库(如果可能)。

您可以在您的系统上手动运行基准测试

pip install textdistance[benchmark]
python3 -m textdistance.benchmark

TextDistance将基准测试结果表显示给您系统的系统,并将库优先级保存到TextDistance文件夹中的libraries.json文件中。此文件将由textdistance用于调用最快的算法实现。默认的libraries.json已包含在包中。

运行测试

您只需要task。有关可用命令的列表,请参阅Taskfile.yml。例如,要运行包括第三方库使用的测试,请执行task pytest-external:run

贡献

欢迎PR!

  • 发现bug了吗?修复它!
  • 想要添加更多算法?当然可以!只需按照库中其他算法的相同接口实现它,并添加一些测试。
  • 能让某事更快吗?太棒了!只需避免外部依赖,并记住一切不仅应该与字符串一起工作。
  • 还有你认为好的其他东西吗?做吧!只需确保CI通过,以及README中的所有内容仍然适用(接口、功能等)。
  • 没有时间编码?告诉你的朋友和订阅者关于textdistance。用户越多,贡献越多,功能越强大。

谢谢你 :heart

项目详情


下载文件

下载适合您平台的应用程序。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分发

textdistance-4.6.3.tar.gz (32.7 kB 查看散列)

上传时间

构建分发

textdistance-4.6.3-py3-none-any.whl (31.3 kB 查看散列)

上传时间 Python 3

支持