У меня есть огромный список (содержащий ~ 250 тысяч слов), который был уникальным словом. (Произнесите список1)
У меня есть еще один список, содержащий 5 слов с ошибками. (Произнесите список2)
Мне нужно найти сходство с жаккардом (на основе разных ngrams). между двумя списками и вернуть ближайшее совпадающее слово из list1. Работая над несколькими ответами, которые я нашел на этом сайте, я смог:
- Разделите оба списка на ngrams с помощью функции.
- Вычислите сходство Жаккара для первого элемента второго списка и первого списка.
Это дает мне правильный ответ. Однако я не могу продолжить отсюда, чтобы вернуть наиболее подходящие слова из list1. Я знаю, что мне нужно применить функцию ngram к каждому элементу моего списка1. А затем вычислите сходство жаккарда со списком2 и верните из него элемент с максимальным значением. Но не удалось реализовать это через цикл. Это код, который я использую:
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
Может ли кто-нибудь помочь с этим кодом?