Python短文本相似度比较

简介

对Python内置库 difflibfuzzywuzzy 进行比较

difflib:基于Ratcliff-Obershelp算法(格式塔模式匹配)

fuzzywuzzy:基于莱文斯坦距离(需要安装python-Levenshtein)




安装

pip install python-Levenshtein
pip install fuzzywuzzy




初试

内容接近的文本:

  1. 你公司在哪
  2. 你公司地址在哪里
  3. 我不知道
from fuzzywuzzy import fuzz
from difflib import SequenceMatcher

s1 = "你公司在哪"
s2 = "你公司地址在哪里"
s3 = "我不知道"

# difflib
sequenceMatcher = SequenceMatcher()
sequenceMatcher.set_seqs(s1, s1)
print(sequenceMatcher.ratio())  # 1.0
sequenceMatcher.set_seqs(s1, s2)
print(sequenceMatcher.ratio())  # 0.7692307692307693
sequenceMatcher.set_seqs(s1, s3)
print(sequenceMatcher.ratio())  # 0.0

# fuzzywuzzy
print(fuzz.ratio(s1, s1))  # 100
print(fuzz.ratio(s1, s2))  # 77
print(fuzz.ratio(s1, s3))  # 0
相似度 s1 s2 s3
s1 100 77 0

含义接近的文本:

  1. 价格怎么样
  2. 怎么卖的
from fuzzywuzzy import fuzz
from difflib import SequenceMatcher

s1 = "价格怎么样"
s2 = "怎么卖的"

# difflib
print(SequenceMatcher(None, s1, s2).ratio())  # 0.4444444444444444

# fuzzywuzzy
print(fuzz.ratio(s1, s2))  # 44
相似度 s2
s1 44




最佳匹配

extractOne():最佳匹配

extract():匹配多个

from fuzzywuzzy import process

choices = ["我在北京", "北京天安门", "去北京玩", "上海", "北平", "北京人", "北京地铁"]
print(process.extractOne("北京", choices))  # ('我在北京', 90)
print(process.extract("北京", choices, limit=2))  # [('我在北京', 90), ('北京天安门', 90)]




参考文献

  1. python 比较短文本相似性(difflib、fuzzywuzzy)
  2. difflib
  3. fuzzywuzzy
  4. 使用Fuzzywuzzy进行字符串匹配-是使用Levenshtein距离还是使用Ratcliff / Obershelp模式匹配算法?
  5. 计算中文文本相似度有哪些好用的算法?

猜你喜欢

转载自blog.csdn.net/lly1122334/article/details/107024341