首页 > 解决方案 > 两个字符串匹配多少百分比?

问题描述

我有 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.

我的疑问是癌症,乳房如何比癌症,肝脏更匹配。我可以使用哪些其他技术来正确完成这项工作?

谢谢 :)

标签: pythonstringfuzzywuzzysequencematcher

解决方案


这是两个字符串之间的余弦相似度匹配算法。

理论解释请参考以下链接

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'))

推荐阅读