Определите слова, которые встречаются менее чем в 1% корпусных документов

У меня есть набор отзывов клиентов, и я хочу выделить редкие слова, которые для меня являются словами, которые встречаются менее чем в 1% корпусных документов.

У меня уже есть рабочее решение, но оно слишком медленное для моего сценария:

# Review data is a nested list of reviews, each represented as a bag of words
doc_clean = [['This', 'is', 'review', '1'], ['This', 'is', 'review', '2'], ..] 

# Save all words of the corpus in a set
all_words = set([w for doc in doc_clean for w in doc])

# Initialize a list for the collection of rare words
rare_words = []

# Loop through all_words to identify rare words
for word in all_words:

    # Count in how many reviews the word appears
    counts = sum([word in set(review) for review in doc_clean])

    # Add word to rare_words if it appears in less than 1% of the reviews
    if counts / len(doc_clean) <= 0.01:
        rare_words.append(word)

Кто-нибудь знает более быструю реализацию для этого? Кажется, что итерация каждого отдельного слова в каждом отдельном обзоре занимает много времени.

Заранее спасибо и наилучшие пожелания, Маркус

1 ответ

Решение

Возможно, это не самое эффективное решение, но его легко понять и поддерживать, и я часто использую его сам. Я использую счетчик и панд:

import pandas as pd
from collections import Counter

Примените счетчик к каждому документу и создайте матрицу частотных терминов:

df = pd.DataFrame(list(map(Counter, doc_clean)))

Некоторые поля в матрице не определены. Они соответствуют словам, которые не встречаются в конкретном документе. Подсчитайте вхождения:

counts = df.notnull().sum()

Теперь выберите слова, которые встречаются недостаточно часто:

rare_words = counts[counts < 0.05 * len(doc_clean)].index.tolist()
Другие вопросы по тегам