scikit学习包中的CountVectorizer出现问题



我有一个影评数据集。它有两列:'class''reviews'。我已经完成了大部分常规的预处理工作,比如:降低字符,删除停止词,删除标点符号。在预处理结束时,每个原始评论看起来都像是用空格分隔的单词。

我想使用CountVectorizer和TF-IDF来创建我的数据集的特征,这样我就可以用随机森林进行分类/文本识别。我查了一下网站,试着按照他们的做法去做。这是我的代码:

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

我是不是错过了什么?还是我太笨了,无法理解?我所理解和想要的是,如果我进行转换,我将收到一个新的数据集,其中包含许多特征(关于单词及其频率)和标签列。但是,我得到的还远远不够

我重复一遍,我只想从我的数据集中有一个新的数据集,其中有数字、单词作为特征的评论,这样随机森林或其他分类算法就可以用它做任何事情。

谢谢。

顺便说一句,这是我数据集的前五行:

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

假设您碰巧有一个数据帧:

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)

这段代码在我的笔记本上运行时没有出现错误。如果这能解决您的问题,请告诉我们!

相关内容

  • 没有找到相关文章

最新更新