Проблема с CountVectorizer из пакета scikit-learn - PullRequest
0 голосов
/ 14 января 2019

У меня есть набор обзоров фильмов. Он имеет два столбца: 'class' и 'reviews'. Я выполнил большинство рутинных операций предварительной обработки, таких как: опускание символов, удаление стоп-слов, удаление знаков препинания. В конце предварительной обработки каждый исходный обзор выглядит как слова, разделенные пробелом.

Я хочу использовать CountVectorizer, а затем TF-IDF, чтобы создать функции моего набора данных, чтобы я мог выполнять классификацию / распознавание текста с помощью Random Forest. Я посмотрел на сайты, и я попытался сделать, как они сделали. Это мой код:

data = pd.read_csv('updated-data ready.csv')
X = data.drop('class', axis = 1)
y = data['class']
vectorizer = CountVectorizer()
new_X = vectorizer.fit_transform(X)
tfidfconverter = TfidfTransformer()  
X1 = tfidfconverter.fit_transform(new_X)
print(X1)

Но я получаю этот вывод ...

(0, 0)  1.0

что не имеет смысла вообще. Я рассмотрел некоторые параметры и прокомментировал части о TF-IDF. Вот мой код:

data = pd.read_csv('updated-data ready.csv')
X = data.drop('class', axis = 1)
y = data['class']
vectorizer = CountVectorizer(analyzer = 'char_wb',  \
                         tokenizer = None, \
                         preprocessor = None, \
                         stop_words = None, \
                         max_features = 5000)

new_X = vectorizer.fit_transform(X)
print(new_X)

и это мой вывод:

(0, 4)  1
(0, 6)  1
(0, 2)  1
(0, 5)  1
(0, 1)  2
(0, 3)  1
(0, 0)  2

Я что-то упустил? Или я слишком нуб, чтобы понять? Все, что я понял и хотел, было / есть, если я выполню преобразование, я получу новый набор данных с таким количеством функций (относительно слов и их частот) плюс столбец меток. Но то, что я получаю, так далеко от этого.

Я повторяю, все, что я хочу, это иметь новый набор данных из моего набора данных с обзорами, в которых он содержит числа, слова в качестве признаков, так что Random Forest или другие алгоритмы классификации могут делать с ним что угодно.

Спасибо.

Кстати, это первые пять строк моего набора данных:

   class                                            reviews
0      1                         da vinci code book awesome
1      1  first clive cussler ever read even books like ...
2      1                            liked da vinci code lot
3      1                            liked da vinci code lot
4      1            liked da vinci code ultimatly seem hold

1 Ответ

0 голосов
/ 14 января 2019

Предположим, у вас есть фрейм данных:

data
    class   reviews
0   1   da vinci code book aw...
1   1   first clive cussler ever read even books lik...
2   1   liked da vinci cod...
3   1   liked da vinci cod...
4   1   liked da vinci code ultimatly seem...

Разделить на особенности и результаты:

y = data['class']
X = data.drop('class', axis = 1)

Затем, следуя вашему конвейеру, вы можете подготовить свои данные для любого алгоритма ML следующим образом:

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
new_X = vectorizer.fit_transform(X.reviews)
new_X
<5x18 sparse matrix of type '<class 'numpy.int64'>'

Этот new_X может быть использован в вашем дальнейшем конвейере "как есть" или преобразован в плотную матрицу:

new_X.todense()
matrix([[1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
        [0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0],
        [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1],
        [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1],
        [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1]],
       dtype=int64)
        with 30 stored elements in Compressed Sparse Row format>

Строки в этой матрице представляют строки в исходном столбце reviews, а столбцы представляют количество слов. Если вас интересует, в каком столбце указано какое слово вы можете сделать:

vectorizer.vocabulary_
{'da': 6,
 'vinci': 17,
 'code': 4,
 'book': 1,
 'awesome': 0,
 'first': 9,
 'clive': 3,
 'cussler': 5,
....

, где key - это слово, а value - это индекс столбца в вышеприведенной матрице (фактически вы можете сделать вывод, что индекс столбца соответствует упорядоченному словарю, с 'awesome', отвечающим за 0-й столбец и т. Д.).

Вы можете продолжить работу со своим конвейером следующим образом:

tfidfconverter = TfidfTransformer()  
X1 = tfidfconverter.fit_transform(new_X)
X1
<5x18 sparse matrix of type '<class 'numpy.float64'>'
    with 30 stored elements in Compressed Sparse Row format>

Наконец, вы можете передать свои предварительно обработанные данные в RandomForest:

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier()
clf.fit(X1, y)

Этот код работает без ошибок на моем ноутбуке. Пожалуйста, дайте нам знать, если это решит вашу проблему!

...