Согласно CountVectorizer
документам , метод fit_transform()
ожидает итерацию строк.Он не может обрабатывать DataFrame
напрямую.
Но итерация по фрейму данных возвращает метки столбцов, а не значения.Я предлагаю вам попробовать df.itertuples()
.
Попробуйте что-то вроде этого:
value_list = [
row[0]
for row in df.itertuples(index=False, name=None)]
print(value_list)
print(type(value_list))
print(type(value_list[0]))
X_train_counts = count_vect.fit_transform(value_list)
Каждое значение в value_list
должно иметь тип str
.Дайте нам знать, если это поможет.
Вот небольшой пример:
>>> import pandas as pd
>>> df = pd.DataFrame(['my big dog', 'my lazy cat'])
>>> df
0
0 my big dog
1 my lazy cat
>>> value_list = [row[0] for row in df.itertuples(index=False, name=None)]
>>> value_list
['my big dog', 'my lazy cat']
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> cv = CountVectorizer()
>>> x_train = cv.fit_transform(value_list)
>>> x_train
<2x5 sparse matrix of type '<class 'numpy.int64'>'
with 6 stored elements in Compressed Sparse Row format>
>>> x_train.toarray()
array([[1, 0, 1, 0, 1],
[0, 1, 0, 1, 1]], dtype=int64)
>>> cv.vocabulary_
{'my': 4, 'big': 0, 'dog': 2, 'lazy': 3, 'cat': 1}
И теперь вы можете отображать количество слов в каждой строке (каждая входная строка отдельно):
>>> for word, col in cv.vocabulary_.items():
... for row in range(x_train.shape[0]):
... print('word:{:10s} | row:{:2d} | count:{:2d}'.format(word, row, x_train[row,col]))
word:my | row: 0 | count: 1
word:my | row: 1 | count: 1
word:big | row: 0 | count: 1
word:big | row: 1 | count: 0
word:dog | row: 0 | count: 1
word:dog | row: 1 | count: 0
word:lazy | row: 0 | count: 0
word:lazy | row: 1 | count: 1
word:cat | row: 0 | count: 0
word:cat | row: 1 | count: 1
Вы также можете отобразить общее количество слов (сумма строк):
>>> x_train_sum = x_train.sum(axis=0)
>>> x_train_sum
matrix([[1, 1, 1, 1, 2]], dtype=int64)
>>> for word, col in cv.vocabulary_.items():
... print('word:{:10s} | count:{:2d}'.format(word, x_train_sum[0, col]))
word:my | count: 2
word:big | count: 1
word:dog | count: 1
word:lazy | count: 1
word:cat | count: 1
>>> with open('my-file.csv', 'w') as f:
... for word, col in cv.vocabulary_.items():
... f.write('{};{}\n'.format(word, x_train_sum[0, col]))
Это должно прояснить, как вы можете использовать инструменты, которые у вас есть.