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. 計算中文文本相似度有哪些好用的算法?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章