简介
对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)]