Похоже, вы имеете дело с Ngrams.Обратите внимание, что в этом ответе предполагается, что в вашем словаре много ключей, а не N-грамм.В этом случае более эффективно генерировать n-граммы из текста, а не перебирать ключи словаря (как в случае с другим ответом).
Начните с определения словаря keys
.
keys = {
'X ontology entity': 0,
'X entity': 1,
'image quality': 10,
'right lower kidney': 10,
'magnetic resonance imaging': 10312,
'MR imaging': 10312,
}
Вам потребуется сгенерировать все N-граммы в пределах диапазона (который вы решите), и дляДля каждого n-грамма определите, существует ли он как ключ в вашем словаре.
import re
def get_ngrams(tokens, ngram_range):
return {' '.join(tokens[i:i+r])
for i in range(len(tokens)) for r in range(*ngram_range)}
ngram_range = (1, 4) # Right exclusive.
tokens = re.sub(r'[^a-zA-Z]', ' ', text).split()
found_tokens = set(filter(keys.__contains__, get_ngrams(tokens, ngram_range)))
print(found_tokens)
# {'MR imaging', 'right lower kidney'}
Имейте в виду, что для больших диапазонов и строк это становится дорогостоящей операцией.
Вы можете немного оптимизировать, признав, что не все N-граммы должны храниться в памяти перед фильтрацией.Мы можем сэкономить большое время, используя генератор и цикл:
def ngrams_generator(tokens, ngram_range):
yield from (' '.join(tokens[i:i+r])
for i in range(len(tokens)) for r in range(*ngram_range))
found_ngrams = set()
for ngram in ngrams_generator(tokens, ngram_range):
if ngram in keys:
found_ngrams.add(ngram)
print(found_ngrams)
# {'MR imaging', 'right lower kidney'}