我有一个影评数据集。它有两列:'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)
这段代码在我的笔记本上运行时没有出现错误。如果这能解决您的问题,请告诉我们!