TextDistance
TextDistance -- 一个用于通过多种算法比较两个或多个序列之间距离的 Python 库。
特点:
- 30多种算法
- 纯 Python 实现
- 使用简单
- 可比较两个以上的序列
- 一些算法在同一个类中有多种实现
- 可选择使用 numpy 以获得最高速度
算法
基于编辑的算法
算法 | 类 | 函数 |
---|---|---|
汉明距离 | Hamming | hamming |
MLIPNS | MLIPNS | mlipns |
莱文斯坦距离 | Levenshtein | 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 |
Sørensen–Dice 系数 | Sorensen | sorensen , sorensen_dice , dice |
Tversky 指数 | Tversky | tversky |
重叠系数 | Overlap | overlap |
Tanimoto 距离 | Tanimoto | tanimoto |
余弦相似度 | Cosine | cosine |
Monge-Elkan | MongeElkan | monge_elkan |
Bag 距离 | Bag | bag |
基于序列的算法
算法 | 类 | 函数 |
---|---|---|
最长公共子序列相似度 | LCSSeq | lcsseq |
最长公共子串相似度 | LCSStr | lcsstr |
Ratcliff-Obershelp 相似度 | RatcliffObershelp | ratcliff_obershelp |
基于压缩的算法
标准化压缩距离使用不同的压缩算法。
经典压缩算法:
普通压缩算法:
算法 | 类 | 函数 |
---|---|---|
平方根 | SqrtNCD | sqrt_ncd |
熵 | EntropyNCD | entropy_ncd |
正在开发中的算法,将两个字符串作为位数组进行比较:
更多关于 NCD 的详细信息,请参阅博客文章。
语音算法
简单算法
算法 | 类 | 函数 |
---|---|---|
前缀相似度 | Prefix | prefix |
后缀相似度 | Postfix | postfix |
长度距离 | Length | length |
相同性相似度 | Identity | identity |
矩阵相似度 | Matrix | matrix |
安装
稳定版
仅安装纯 Python 实现:
pip install textdistance
安装额外库以获得最高速度:
pip install "textdistance[extras]"
pip install "textdistance[benchmark]"
安装特定算法的额外库:
pip install "textdistance[Hamming]"
可用额外库的算法:DamerauLevenshtein
,Hamming
,Jaro
,JaroWinkler
,Levenshtein
。
开发版
通过 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]"
使用方法
所有算法都有两种接口:
- 带有算法特定参数的类,用于自定义。
- 带有默认参数的类实例,用于快速简单使用。
所有算法都有一些共同的方法:
.distance(*sequences)
-- 计算序列之间的距离。.similarity(*sequences)
-- 计算序列的相似度。.maximum(*sequences)
-- 距离和相似度的最大可能值。对于任何序列:distance + similarity == maximum
。.normalized_distance(*sequences)
-- 序列之间的标准化距离。返回值是 0 到 1 之间的浮点数,其中 0 表示相等,1 表示完全不同。.normalized_similarity(*sequences)
-- 序列的标准化相似度。返回值是 0 到 1 之间的浮点数,其中 0 表示完全不同,1 表示相等。
最常用的初始化参数:
qval
-- 用于将序列分割成 q-gram 的 q 值。可能的值:- 1(默认)-- 按字符比较序列。
- 2 或更多 -- 将序列转换为 q-gram。
- None -- 按单词分割序列。
as_set
-- 用于基于标记的算法:- True --
t
和ttt
被视为相等。 - False(默认)--
t
和ttt
被视为不同。
- True --
示例
以汉明距离为例:
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会尝试调用已知的外部库(按速度从快到慢排序)。安装带有extras的textdistance以使用此功能。
你可以通过在初始化时传递external=False
参数来禁用此功能:
import textdistance
hamming = textdistance.Hamming(external=False)
hamming('text', 'testit')
# 3
支持的库:
算法:
- DamerauLevenshtein
- Hamming
- Jaro
- JaroWinkler
- Levenshtein
基准测试
不安装extras:
算法 | 库 | 时间 |
---|---|---|
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 | distance | 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 | distance | 0.28669 |
Levenshtein | textdistance | 0.53902 |
总计: 24个库。
是的,速度很慢。在生产环境中使用TextDistance时只安装extras。
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: