【发布时间】:2020-06-03 12:46:19
【问题描述】:
我有一个巨大的列表(包含约 25 万个单词),这是唯一的单词。 (说清单1)
我有另一个列表,其中包含 5 个拼写错误的单词。 (说清单2)
我需要找到 jaccard 相似度(基于不同的 ngram)。在两个列表之间,并从 list1 返回最接近的匹配词。根据我在这个网站上找到的一些答案,我能够:
- 通过函数将两个列表拆分为 ngram。
- 计算第二个列表的第一个元素和第一个列表的 jaccard 相似度。
这给了我一个有效的答案。但是,我无法从这里开始从 list1 返回最匹配的单词。我知道我需要将 ngram 函数应用于我的 list1 的每个元素。然后用 list2 计算 jaccard 相似度,并从中返回最大值元素。但无法通过循环实现它。这是我正在使用的代码:
def spell_correcter(list2=['word1', 'word2',... 'word5']):
from sklearn.metrics import jaccard_similarity_score
import re
def find_ngrams(text: str, number: int=3) -> set:
#returns a set of ngrams for the given string
if not text:
return set()
str1 = ''.join(text)
words = [f' {x} ' for x in re.split(r'\W+', str1.lower()) if x.strip()]
ngrams = set()
for word in words:
for x in range(0, len(word) - number + 1):
ngrams.add(word[x:x+number])
return ngrams
def similarity(text1: str, text2: str, number: int=3) -> float:
#Finds the similarity between 2 strings using ngrams.
ngrams1 = find_ngrams(text1, number)
ngrams2 = find_ngrams(text2, number)
num_unique = len(ngrams1 | ngrams2)
num_equal = len(ngrams1 & ngrams2)
#Tried to compute for entire list1; very slow. Didn't execute
#for i in range(0, len(text1)):
#ngrams1 = find_ngrams(text1, number)
#num_unique = len(ngrams1 | ngrams2)
#num_equal = len(ngrams1 & ngrams2)
#jaccard = float(num_equal) / float(num_unique)
return float(num_equal) / float(num_unique)
b = list2[0]
a = similarity(list1, b)
return a
有人可以帮忙处理这段代码吗?
【问题讨论】:
标签: python similarity levenshtein-distance n-gram sentence-similarity