textdistance是Python的第三方库,用于计算文本之间的相似度或距离。它提供了30+个算法,简单易用。
安装
bash
pip install textdistance
# 使用扩展库,提高性能
pip install "textdistance[extras]"
使用
python
import textdistance
# 计算编辑距离
distance = textdistance.levenshtein.distance("如何更换花呗绑定银行卡", "花呗更改绑定银行卡")
print("编辑距离:", distance)
# 计算余弦相似度
similarity = textdistance.cosine.similarity("如何更换花呗绑定银行卡", "花呗更改绑定银行卡")
print("余弦相似度:", similarity)
# 计算 Jaccard 系数
coefficient = textdistance.jaccard("如何更换花呗绑定银行卡", "花呗更改绑定银行卡")
print("Jaccard 系数:", coefficient)
# 计算 Hamming 距离
distance = textdistance.hamming.distance("如何更换花呗绑定银行卡", "花呗更改绑定银行卡")
print("Hamming 距离:", distance)
结果:
编辑距离: 5
余弦相似度: 0.8040302522073697
Jaccard 系数: 0.6666666666666666
Hamming 距离: 10
应用场景
拼写检查
在拼写检查中,可以使用编辑距离等算法来比较单词之间的相似度,从而找出可能的正确拼写。
python
import textdistance
# 拼写检查
word = "发愤图强"
possible_spellings = ["发奋图强", "发奋图", "发愤图"]
for spelling in possible_spellings:
distance = textdistance.levenshtein.distance(word, spelling)
if distance <= 1:
print("可能的正确拼写:", spelling)
结果
可能的正确拼写: 发奋图强
可能的正确拼写: 发愤图
文档相似度计算
在信息检索和推荐系统中,经常需要计算文档之间的相似度,以便为用户提供相关的信息或推荐内容。
python
import textdistance
# 文档相似度计算
doc1 = "Python is a programming language"
doc2 = "Python is used for web development"
doc3 = "Java is a programming language"
similarity1 = textdistance.cosine.similarity(doc1, doc2)
similarity2 = textdistance.cosine.similarity(doc1, doc3)
print("文档1和文档2的余弦相似度:", similarity1)
print("文档1和文档3的余弦相似度:", similarity2)
文档1和文档2的余弦相似度: 0.6063390625908325
文档1和文档3的余弦相似度: 0.8391463916782737
数据清洗
在数据清洗过程中,可以使用 Hamming 距离等算法来比较数据条目之间的相似度,从而找出相似但不完全相同的数据。
python
import textdistance
# 数据清洗
data = ["配偶", "原配", "元配", "老婆", "夫人", "爱人"]
for i in range(len(data)):
for j in range(i+1, len(data)):
distance = textdistance.hamming.distance(data[i], data[j])
if distance <= 1:
print("相似但不完全相同的数据:", data[i], data[j])
结果:
相似但不完全相同的数据: 原配 元配
相似但不完全相同的数据: 夫人 爱人
python
import textdistance
# 姓名匹配
name1 = "李建国"
name2 = "张建国"
name3 = "王爱国"
coefficient1 = textdistance.jaccard.normalized_similarity(name1, name2)
coefficient2 = textdistance.jaccard.normalized_similarity(name1, name3)
print("姓名1和姓名2的Jaccard系数:", coefficient1)
print("姓名1和姓名3的Jaccard系数:", coefficient2)
结果
python
姓名1和姓名2的Jaccard系数: 0.5
姓名1和姓名3的Jaccard系数: 0.19999999999999996
textdistance 提供了丰富多样的文本比较算法和距离度量方法,可以满足各种不同的文本比较需求。