Почему результат подсчета частоты на основе значений отличается от счетчика векторов? - PullRequest
2 голосов
/ 27 марта 2019

У меня есть фрейм данных со столбцом под названием «Фраза».Я пытаюсь найти 20 наиболее распространенных слов в этой колонке.Для этого я использовал следующий код:

print(pd.Series(' '.join(film['Phrase']).lower().split()).value_counts()[:20])

Это дало мне следующий вывод:

s             16981
film           6689
movie          5905
nt             3970
one            3609
like           3071
story          2520
rrb            2438
lrb            2098
good           2043
characters     1882
much           1862
time           1747
comedy         1721
even           1597
little         1575
funny          1522
way            1511
life           1484
make           1396

Позже мне потребовалось создать число векторов для каждого слова.Я сделал это, используя следующий код:

vectorizer = CountVectorizer()
vectorizer.fit(film['Phrase'])
print(vectorizer.vocabulary_)

Я не буду показывать весь вывод, но число векторов отличается от вывода выше.например, для слова «фильм» это 9308, для «хорошо» это 6131 и для «сделать» это 8655. Почему это происходит?Является ли метод подсчета значений только подсчетом каждого столбца, в котором используется слово, а не подсчетом каждого вхождения слова?Я неправильно понял, что делает функция CountVectorizer?

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Как упомянуто @MaximeKan, CountVectorizer() не вычисляет частоту каждого члена, но мы можем вычислить ее на основе разреженного матричного вывода transform () и атрибута get_feature_names() vectorizer.

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(film['Phrase'])
{x:y for x,y in zip(vectorizer.get_feature_names(), X.sum(0).getA1())}

Рабочий пример:

>>> from sklearn.feature_extraction.text import CountVectorizer
>>> corpus = [
...     'This is the first document.',
...     'This document is the second document.',
...     'And this is the third one.',
...     'Is this the first document?',
... ]
>>> vectorizer = CountVectorizer()
>>> X = vectorizer.fit_transform(corpus)

Не используйте .toarray() до тех пор, пока это не будет необходимо, поскольку для этого требуется больший объем памяти и время вычислений. мы можем получить сумму, используя разреженную матрицу напрямую.

>>> list(zip(vectorizer.get_feature_names(), X.sum(0).getA1()))

[('and', 1),
 ('document', 4),
 ('first', 2),
 ('is', 4),
 ('one', 1),
 ('second', 1),
 ('the', 4),
 ('third', 1),
 ('this', 4)]

1014 *

2 голосов
/ 28 марта 2019

vectorizer.vocabulary_ делает не частоты возвращаемых слов, но согласно документации:

Отображение терминов в индексы признаков

Чтоэто означает, что каждое из слов в ваших данных сопоставляется с индексом, который хранится в vectorizer.vocabulary_.

Вот пример, иллюстрирующий происходящее:

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

df = pd.DataFrame({"a":["we love music","we love piano"]})

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df['a'])
print(vectorizer.vocabulary_)

>>> {'we': 3, 'love': 0, 'music': 1, 'piano': 2}

Эта векторизация идентифицирует 4 слова в данных и присваивает индексы от 0 до 3 каждому слову.Теперь вы можете спросить: «Но почему я вообще беспокоюсь об этих показателях?»Потому что, как только векторизация будет завершена, вам необходимо отслеживать порядок слов в векторизованном объекте.Например,

X.toarray()
>>> array([[1, 1, 0, 1],
           [1, 0, 1, 1]], dtype=int64)

Используя словарный словарь, вы можете сказать, что первый столбец соответствует «любви», второй - «музыке», третий - «пианино», а четвертый - «мы».".

Обратите внимание, это также соответствует порядку слов в vectorizer.get_feature_names()

vectorizer.get_feature_names()
>>> ['love', 'music', 'piano', 'we']
...