Храните наиболее часто встречающиеся значения в списке Python - PullRequest
0 голосов
/ 09 мая 2018

Я создаю пакет слов из текстового корпуса и пытаюсь ограничить размер моего словарного запаса, потому что программа зависает, когда я пытаюсь преобразовать свой список в фрейм данных pandas. Я использую Счетчик для подсчета количества вхождений каждого слова:

from collections import Counter
bow = []
# corpus is list of text samples where each text sample is a list of words with variable length
for tokenized_text in corpus:
    clean_text = [tok.lower() for tok in tokenized_text if tok not in punctuation and tok not in stopwords]
    bow.append(Counter(clean_text))
# Program freezes here
df_bows = pd.DataFrame.from_dict(bow)

Мой вход будет представлять собой список токенов длины num_samples, где каждый текстовый образец представляет собой список токенов. Для моего вывода я хочу панду DataFrame с формой (num_samples, 10000), где 10000 - это размер моего словаря. Раньше мой df_bows размер словаря (df_bows.shape[1]) становился очень большим (больше 50 000). Как я могу выбрать 10000 наиболее часто встречающихся слов из моего bow списка объектов Counter и поместить их затем в DataFrame, сохранив при этом количество образцов текста?

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Чтобы найти общий верхний 10000 слов, самый простой способ будет update глобальный Counter:

from collections import Counter
global_counter = Counter() # <- create a counter
for tokenized_text in corpus:
    clean_text = [tok.lower() for tok in tokenized_text if tok not in punctuation and tok not in stopwords]
    global_counter.update(clean_text) # <- update it

На данный момент, вы можете просто использовать

import pandas as pd
df = pd.DataFrame(global_counter.most_common(10000))

Если вы хотите найти количество слов для определенных записей, добавьте теперь следующий код (после предыдущего).

most_common = set([t[0] for t in global_counter.most_common(10000)])
occurrences = []
for tokenized_text in corpus:
    clean_text = dict(collections.Counter([tok.lower() for tok in tokenized_text if tok not in punctuation and tok not in stopwords]))
    occurrences.append({c: clean_text.get(c, 0) for c in most_common})

Теперь просто используйте

pd.DataFrame(occurrences)
0 голосов
/ 09 мая 2018

Вы можете наиболее часто встречающиеся слова, используя вспомогательную функцию счетчика most_comman:

from collections import Counter
clean_text = [tok.lower() for tok in tokenized_text if tok not in punctuation and tok not in stopwords]
counter = Counter(clean_text)
counter.most_common(10000)
0 голосов
/ 09 мая 2018

Counter.most_common(n) возвращает вам наиболее распространенные n элементов.

Здесь: https://docs.python.org/3/library/collections.html#collections.Counter.most_common

from collections import Counter

myStr = "It was a very, very good presentation, was it not?"
C = Counter(myStr.split())
C.most_common(2)

# [('was', 2), ('It', 1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...