python - 两个字符串匹配多少百分比?
问题描述
我有 2 列疾病名称,我必须尝试匹配最佳选项。我尝试在 python 中使用“SequenceMatcher”模块和“fuzzywuzzy”模块,结果令人惊讶。我在下面粘贴了结果和我的疑问:
考虑有一种疾病“肝脏肿瘤”,我需要匹配最佳匹配名称“癌症,肝脏”或“癌症,乳房”。现在很明显,由于肝脏是一个匹配词,它应该很容易选择“癌症,肝脏”作为答案,但这并没有发生。我想知道在python中匹配的原因和更好的方法。
from difflib import SequenceMatcher
s1 = 'liver neoplasms'
s2 = 'cancer, liver'
SequenceMatcher(None, s1, s2).ratio()
# Answer = 0.3571
s2 = 'cancer, breast'
SequenceMatcher(None, s1, s2).ratio()
# Answer = 0.4137
# fuzzy.ratio also has the same results.
我的疑问是癌症,乳房如何比癌症,肝脏更匹配。我可以使用哪些其他技术来正确完成这项工作?
谢谢 :)
解决方案
这是两个字符串之间的余弦相似度匹配算法。
理论解释请参考以下链接
https://blog.nishtahir.com/2015/09/19/fuzzy-string-matching-using-cosine-similarity/
import re
import math
from collections import Counter
def get_cosine(vec1, vec2):
intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x]**2 for x in vec1.keys()])
sum2 = sum([vec2[x]**2 for x in vec2.keys()])
denominator = math.sqrt(sum1) * math.sqrt(sum2)
if not denominator:
return 0.0
else:
return float(numerator) / denominator
def text_to_vector(text):
word = re.compile(r'\w+')
words = word.findall(text)
return Counter(words)
def get_result(content_a, content_b):
text1 = content_a
text2 = content_b
vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)
cosine_result = get_cosine(vector1, vector2)
return cosine_result
print(get_result('liver neoplasms', 'cancer, liver'))
print(get_result('liver neoplasms', 'cancer, breast'))
推荐阅读
- flutter - Flutter google_sign_in - 请求额外的范围
- kubernetes - pod java.lang.IllegalStateException 上的异常:未知协议:HTT
- javascript - 如何从输入字段中获取数据并使用警报功能打印?
- python - 从 Mask RCNN 结果中选择一个特定的掩码,r。过滤字典以仅保留 r['class_ids']==1 的键
- php - 为什么总是这个错误 Undefined variable $question
- apache-flink - Flink 对 hadoop 3.X 的支持
- extjs - 如何覆盖 AbstractForm?
- python - django - 预取一对多关系的特定项目
- matlab - 在 MATLAB 中使用 PixelList 获取 RGB 图像中的像素值
- debugging - 有什么方法可以在带有_DEBUG的调试模式下使用发布构建DLL?