Найти относительное количество наиболее распространенных слов из набора предложений в Python - PullRequest
0 голосов
/ 15 марта 2020

У меня есть 5 предложений в массиве np.array, и я хочу найти наиболее распространенное число n слов, которые появляются вместе с их относительным количеством. Например, если n было 3, я бы хотел 3 наиболее распространенных слова. В качестве относительного числа я хочу, чтобы количество раз, когда это слово появилось, делилось на общее количество слов. У меня есть пример ниже:

0    oh i am she cool though might off her a brownie lol
1    so trash wouldnt do colors better tweet
2    love monkey brownie as much as a tweet
3    monkey get this tweet around i think
4    saw a brownie to make me some monkey

С помощью предыдущего вопроса мне удается найти наиболее распространенные слова

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer

A = np.array(["oh i am she cool though might off her a brownie lol", 
              "so trash wouldnt do colors better tweet", 
              "love monkey brownie as much as a tweet",
              "monkey get this tweet around i think",
              "saw a brownie to make me some monkey" ])

n = 3
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(A)

vocabulary = vectorizer.get_feature_names()
ind  = np.argsort(X.toarray().sum(axis=0))[-n:]

top_n_words = [vocabulary[a] for a in ind]

print (top_n_words)
['tweet', 'monkey', 'brownie']

Однако теперь я хочу найти относительный счет? Есть ли простой способ pythoni c сделать это? Например:

print (top_n_words_relative_count)
[3/42, 3/42, 3/42]

Где 42 - общее количество слов.

1 Ответ

1 голос
/ 15 марта 2020

Вы можете использовать collections.Counter:

>>> A = np.array(["oh i am she cool though might off her a brownie lol", 
              "so trash wouldnt do colors better tweet", 
              "love monkey brownie as much as a tweet",
              "monkey get this tweet around i think",
              "saw a brownie to make me some monkey" ])

>>> B = ' '.join(A).split()
>>> top_n_words, top_n_words_count = zip(*Counter(B).most_common(3))
>>> top_n_words_relative_count = np.array(tom_n_words_count)/len(B)
>>> top_n_words
('a', 'brownie', 'tweet')
>>> top_n_words_relative_count
array([0.07142857, 0.07142857, 0.07142857])

Если вы хотите отформатировать:

>>> [f"{count}/{len(B)}" for count in top_n_words_count]
['3/42', '3/42', '3/42']

Или, если вы go до pandas Вы можете использовать value_counts и nlargest:

>>> import pandas as pd
>>> B = pd.Series(' '.join(A).split())
>>> B = B.value_counts(normalize=True).nlargest(3)
monkey    0.071429
a         0.071429
tweet     0.071429
dtype: float64
>>> B.index.tolist()
['monkey', 'a', 'tweet']
>>> B.values.tolist()
[0.07142857142857142, 0.07142857142857142, 0.07142857142857142]
...