У меня есть список L около 40 000 фраз и документ объемом около 10 миллионов слов. я хочу проверить, какая пара этих фраз co происходит в окне из 4 слов. Например, рассмотрим L = [«коричневая лиса», «ленивая собака»]. В документе содержатся слова: «Быстрая коричневая лиса прыгает через ленивую собаку». Я хочу посмотреть, сколько раз коричневый лис и ленивая собака появляется в окне из четырех слов и хранит это в файле. У меня следующий код для этого:эффективный алгоритм поиска совпадения матрицы фраз
content=open("d.txt","r").read().replace("\n"," ");
for i in range(len(L)):
for j in range(i+1,len(L)):
wr=L[i]+"\W+(?:\w+\W+){1,4}"+L[j]
wrev=L[j]+"\W+(?:\w+\W+){1,4}"+L[i]
phrasecoccur=len(re.findall(wr, content))+len(re.findall(wrev,content))
if (phrasecoccur>0):
f.write(L[i]+", "+L[j]+", "+str(phrasecoccur)+"\n")
По существу, для каждой пары фраз в списке L, я проверяю в содержании документа, что сколько раз появляются эти фразы в окне 4 слов. Однако этот метод является вычислительно неэффективным, когда список L довольно большой, например, 40K элементов. Есть ли лучший способ сделать это?
Перепишите свой алгоритм для реализации итератора скользящего окна над словами и попробуйте использовать 'dict' или 'set', а не списки, поскольку времена поиска короче. –