Поиск около 150000 слов в файле, который содержит около 3 миллионов слов

Я работаю над обобщением текста и, чтобы построить свой словарный запас, я подготовил набор данных. Теперь мне нужны векторы этих слов из Google Word2Vec. Я написал простой код, который берет каждое слово и ищет его в файле google-vectors, который содержит около 3 миллионов слов. Но проблема в том, что для такого рода линейного поиска буквально потребуются недели. Я использую Py thon для этой вещи. Как я могу найти эти слова более эффективным способом?

found_counter = 0
file1 = open('vocab_training.txt', 'r').read()
for i, line in enumerate(file1):
    if i >= 50:
        break
    file2 = open('google-vectors.txt', 'r' )
    for j, line2 in enumerate(file2):
        if line.lower() == line2.split():
            found_counter += 1
    file2.close()
print(found_counter)

1 ответ

Опция: загрузите 3 миллиона слов в память в хеш-таблицу и проверьте членство - в Python вы бы сохранили set:

with open('google-vectors.txt', 'r') as f:
  words = set(l.lower() for l in f)

...
  if line.lower in words:
    ...

Другие опции:

  1. Сохраняйте отсортированный список с помощью log (n) поиска с помощью бинарного поиска (хеш превосходит это)
  2. Если памяти недостаточно для сохранения набора в памяти, инициализируйте фильтр кукушки, фильтр Блума или другую структуру "приблизительного членства" с содержимым набора слов. Сначала проверьте членство в фильтре - если вы получили попадание, это означает, что у вас может быть настоящий попадание, а затем вы можете перейти к более медленному методу запроса. Вы можете получить достаточно мало ложных срабатываний, чтобы это было хорошим вариантом.
  3. Если объем памяти слишком велик для хранения, храните данные на диске или в другом месте так, чтобы их можно было легко запросить. Некоторые примеры, встроенные в Python: dbm, shelve, а также sqlite3, При использовании, например, sqlite3 не забудьте проиндексировать данные. Вы даже можете запустить локальное сетевое хранилище ключей-значений, такое как Redis, и при этом получить гораздо лучшую производительность, чем повторять список.
Другие вопросы по тегам