簡介
對Python內置庫 difflib
和 fuzzywuzzy
進行比較
difflib
:基於Ratcliff-Obershelp算法(格式塔模式匹配)
fuzzywuzzy
:基於萊文斯坦距離(需要安裝python-Levenshtein)
安裝
pip install python-Levenshtein
pip install fuzzywuzzy
初試
內容接近的文本:
- 你公司在哪
- 你公司地址在哪裏
- 我不知道
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 |
含義接近的文本:
- 價格怎麼樣
- 怎麼賣的
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)]