#python #python-3.x #collections #counter #ram
Вопрос:
Я пытаюсь подсчитать частоту слов в некоторых документах. Для фильтрации / очистки я использую SpaCy.
from collections import Counter
nouns = []
length = 0
for sentence in sentences:
for token in sentence:
if token.pos_ == "NOUN":
if token.is_stop is False and not token.is_punct and not token.is_digit and not token.like_num and len(token) >= 4:
nouns.append(token.text)
length = 1
noun_freq = Counter(nouns)
common_nouns = noun_freq.most_common()
Когда я запускаю этот скрипт для нескольких тысяч или миллионов слов, он просто делает то, что должен делать. (Получите наиболее распространенные существительные).
Когда я использую более 10 миллионов слов, мое ядро уничтожает скрипт и показывает, что ему не хватает памяти.
из системного журнала:
kernel: [458254.437276] oom_kill_process.cold 0xb/0x10
kernel: [458254.437278] out_of_memory.part.0 0x1df/0x3d0
kernel: [458254.437280] out_of_memory 0x6d/0xd0
Какие существуют другие способы подсчета / получения частот наиболее распространенных слов для нескольких десятков миллионов слов?
Комментарии:
1. Похоже, вы могли бы разделить документ на куски и обработать таким образом
2. Я не уверен, как выглядят ваши данные и чего вы пытаетесь достичь, но, вероятно, векторизованный подход
pandas
был бы более эффективным.3. Как
sentences
создается? Вам действительно нужноnouns
что-то еще, кроме перехода к Counter() ?4. Сколько разных слов вы ожидаете?
5. Почему бы не использовать «вспомогательную» память, например
sqlite
, или какой-либо файл для хранения результатов, а не буферизовать все в памяти?