Как применить countvectorizer к биграммам в панде - PullRequest
0 голосов
/ 15 февраля 2019

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

Это то, что я пытался использовать

cereal['bigrams'].head()

0    [(best, thing), (thing, I), (I, have),....
1    [(eat, it), (it, every), (every, morning),...
2    [(every, morning), (morning, my), (my, brother),...
3    [(I, have), (five, cartons), (cartons, lying),...
.........
bow = CountVectorizer(max_features=5000, ngram_range=(2,2))
train_bow = bow.fit_transform(cereal['bigrams'])
train_bow

Expected results


      (best,thing) (thing, I) (I, have)  (eat,it) (every,morning)....
0           1          1          1         0           0
1           0          0          0         1           1
2           0          0          0         0           1
3           0          0          1         0           0
....



1 Ответ

0 голосов
/ 27 февраля 2019

Я вижу, вы пытаетесь преобразовать pd.Series в представление количества каждого термина.

Это немного отличается от того, что делает CountVectorizer;

Из описания функции:

Преобразование коллекции текстовых документов в матрицу подсчета токенов

Официальный пример использования кейса:

>>> 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)
>>> print(vectorizer.get_feature_names())
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
>>> print(X.toarray())  
[[0 1 1 1 0 0 1 0 1]
 [0 2 0 1 0 1 1 0 1]
 [1 0 0 1 1 0 1 1 1]
 [0 1 1 1 0 0 1 0 1]]

Итак, как можновидите, он принимает в качестве входных данных список, в котором каждый термин является «документом».Это объясняет причину ошибок, которые вы получаете, вы видите, что вы передаете pd.Series, где каждый термин представляет собой список кортежей.

Чтобы использовать CountVectorizer, вам нужно будет преобразовать свой ввод вправильный формат.

Если у вас есть оригинальный корпус / текст, вы можете легко реализовать CountVectorizer поверх него (с параметром ngram), чтобы получить желаемый результат.

Иначе, лучшее решение будеттрактовать его как есть, серию со списком элементов, которые необходимо подсчитать / повернуть.

Пример обходного решения:

enter image description here

(было бы намного проще, если бы вместо этого вы использовали текстовый корпус)

Надеюсь, это поможет!

...