两个字符串列表的相似度得分

4
我有一个字符串列表作为查询,还有几百个其他字符串列表。我想将查询与每个其他列表进行比较,并提取它们之间的相似度分数。
例如:
query = ["football", "basketball", "martial arts", "baseball"]

list1 = ["apple", "football", "basketball court"]

list2 = ["ball"]

list3 = ["martial-arts", "baseball", "banana", "food", "doctor"]

我现在做的事情,而且我对结果不满意,是对它们的绝对比较。
score = 0
for i in query:
   if i in list1:
      score += 1

score_of_list1 = score*100//len(list1)

我找到了一个可能会对我有帮助的库fuzzywuzzy,但我想知道你是否有其他建议。

我不明白你的解决方案有什么问题。你想要进行什么样的比较?也许举个你可以接受的结果例子,并说明它为什么更好。 - Reut Sharabani
正如我所说,由于这是一个绝对比较,我的分数并不高。因此,我正在寻找另一种解决方案,也许可以提高分数。 - Tasos
你的意思是你想要一种比较字符串而不是列表的方法,我理解得对吗? - Reut Sharabani
是的,但最终得分将介于列表之间。就像我的问题中的例子一样。我比较字符串,然后根据字符串比较结果计算列表之间的得分。 - Tasos
1个回答

6
如果您正在寻找一种查找字符串相似度的方法,这个SO问题建议使用Levenshtein距离算法进行比较。
已经有解决方案并且它也存在于Natural Language Tool Kit库中。
一个简单的集成方式是(我只是随机使用结果。显然这没有意义):
#!/usr/bin/env python
query = ["football", "basketball", "martial arts", "baseball"]
lists = [["apple", "football", "basketball court"], ["ball"], ["martial-arts", "baseball", "banana", "food", "doctor"]]
from random import random

def fake_levenshtein(word1, word2):
    return random()

def avg_list(l):
        return reduce(lambda x, y: x + y, l) / len(l)

for l in lists:
    score = []
    for w1 in l:
        for w2 in query:
            score.append(fake_levenshtein(w1, w2))
    print avg_list(score)

祝你好运。


谢谢。我会等一会儿,如果没有其他答案,我会选择你的! - Tasos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接