Поскольку my_list
содержит строки с более чем одним словом, вам нужно найти n-grams
из my_text
, чтобы найти совпадения, так как разделение по пробелам не подойдет. Также обратите внимание, что ваш подход не рекомендуется, так как для каждой отдельной строки в my_list
вы будете обходить всю строку my_text
, используя count
. Лучшим способом было бы заранее определить n-grams
, который вы будете искать заранее.
Вот один из подходов, использующий nltk
s ngram
. Я добавил еще одну строку в my_list
, чтобы лучше проиллюстрировать процесс:
from nltk import ngrams
from collections import Counter, defaultdict
my_list = ["largest", "biggest", "greatest", "the best", 'My friend is the best']
my_text = "i have the biggest house and the biggest car. My friend is the best. Best way win this is to make the largest house and largest treehouse and then you will be the greatest"
Первый шаг - определить словарь, содержащий различные длины n-грамм, которые мы будем искать:
d = defaultdict(list)
for i in my_list:
k = i.split()
d[len(k)].append(tuple(k))
print(d)
defaultdict(list,
{1: [('largest',), ('biggest',), ('greatest',)],
2: [('the', 'best')],
5: [('My', 'friend', 'is', 'the', 'best')]})
Затем разбейте my_text
на список, и для каждого ключа в d
найдите соответствующий n-grams
и построите Counter
из результата. Затем для каждого значения в этом указанном c ключе в d
обновите значения из Counter
:
my_text_split = my_text.replace('.', '').split()
match_counts = dict()
for n,v in d.items():
c = Counter(ngrams(my_text_split, n))
for k in v:
if k in c:
match_counts[k] = c[k]
, что даст:
print(match_counts)
{('largest',): 2,
('biggest',): 2,
('greatest',): 1,
('the', 'best'): 1,
('My', 'friend', 'is', 'the', 'best'): 1}