【问题标题】:Similarity score of two lists with strings两个带字符串的列表的相似度得分
【发布时间】:2014-04-14 20:02:26
【问题描述】:

我有一个字符串列表作为查询和数百个其他字符串列表。我想将查询与其他所有列表进行比较,并提取它们之间的相似度分数。

例子:

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,但我在想你是否有其他建议。

【问题讨论】:

  • 我不明白您的解决方案有什么问题。你想要什么样的比较?也许举一个你会接受的结果的例子,以及它如何更好。
  • 正如我所说,因为这是一个绝对的比较,我没有高分。所以,我正在寻找另一种可能会提高分数的解决方案。
  • 你的意思是你想要一种比较字符串的方法,而不是列表。我说的对吗?
  • 是的,但最终得分将在列表之间。就像我的问题中的示例一样。我比较字符串,然后根据字符串比较结果计算列表之间的分数。

标签: python comparison string-comparison similarity fuzzy-comparison


【解决方案1】:

如果您正在寻找一种方法来查找字符串之间的相似性,这个SO question 建议将Levenshtein distance 作为一种这样做的方法。

有一个solution 准备好了,它也存在于Natural Language Tool Kit 库中。

naive 集成将是(我使用 random 只是为了得到结果。这显然没有意义):

#!/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)

祝你好运。

【讨论】:

  • 谢谢。我会等一会,如果我没有其他答案,我会选择你的!
猜你喜欢
  • 2013-06-06
  • 2012-04-07
  • 2011-10-03
  • 1970-01-01
  • 2010-10-09
  • 2023-01-12
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多