У меня есть файл с большим (0,5-1,5 миллиона) числом строк, каждая из которых является именем файла (длина составляет около 50-100 символов).Мне нужен быстрый поиск по этим строкам по заданному запросу.Теперь мой код выглядит следующим образом:
def similarity(haystack, needle):
words = re.findall(r'\w+', haystack.lower()) # replacing by split with separators reduces time by about 4 seconds
for word in words:
if word == needle:
return 10
for word in words:
if word.startswith(needle):
return 10 ** (len(needle) / len(word))
if needle in haystack:
return 1
return 0
def search(text):
text = text.lower()
lines = [(similarity(x, text), x) for x in lines]
return [x[1] for x in sorted(lines, reverse = True)[:15]]
Он работает около 15 секунд с файлом примера на моем ПК (почти все время работает в функции similarity()
), и я хочу, чтобы он запускался почти сразу, впару секунд.Как это можно сделать?
Я думаю, что индексация может помочь, но понятия не имею о ее возможной структуре.И, если возможно, я хочу, чтобы поиск был «более размытым» - например, с N-граммами или чем-то в этом роде.Но сейчас основной проблемой является скорость.
UPD:
Один и тот же lines
выполняется многократный поиск.
needle
всегда одно слово.
«Более нечеткий» означает, что он должен находить строки, даже если needle
немного опечатан.