scikit-learn 包中的 CountVectorizer 问题
Problem with CountVectorizer from scikit-learn package
我有一个电影评论数据集。它有两列:'class'
和 'reviews'
。我已经完成了大部分常规预处理工作,例如:降低字符、删除停用词、删除标点符号。在预处理结束时,每个原始评论看起来都像是用 space 分隔符分隔的单词。
我想使用 CountVectorizer,然后使用 TF-IDF 来创建我的数据集的特征,这样我就可以使用随机森林进行 classification/text 识别。我查看了网站,并尝试按照他们的方式去做。这是我的代码:
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
我错过了什么吗?还是我太菜鸟看不懂?我所了解和想要的 was/is 如果我进行转换,我将收到一个具有如此多特征(关于单词及其频率)以及标签列的新数据集。但是,我得到的远非如此。
我再说一遍,我想要的只是从我的数据集中获得一个新的数据集,其中包含数字、单词作为特征的评论,因此随机森林或其他分类算法可以用它做任何事情。
谢谢。
顺便说一句,这是我的数据集的前五行:
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
可用于您的进一步管道 "as is" 或转换为密集矩阵:
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)
这段代码在我的笔记本上运行没有错误。
如果这能解决您的问题,请告诉我们!
我有一个电影评论数据集。它有两列:'class'
和 'reviews'
。我已经完成了大部分常规预处理工作,例如:降低字符、删除停用词、删除标点符号。在预处理结束时,每个原始评论看起来都像是用 space 分隔符分隔的单词。
我想使用 CountVectorizer,然后使用 TF-IDF 来创建我的数据集的特征,这样我就可以使用随机森林进行 classification/text 识别。我查看了网站,并尝试按照他们的方式去做。这是我的代码:
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
我错过了什么吗?还是我太菜鸟看不懂?我所了解和想要的 was/is 如果我进行转换,我将收到一个具有如此多特征(关于单词及其频率)以及标签列的新数据集。但是,我得到的远非如此。
我再说一遍,我想要的只是从我的数据集中获得一个新的数据集,其中包含数字、单词作为特征的评论,因此随机森林或其他分类算法可以用它做任何事情。
谢谢。
顺便说一句,这是我的数据集的前五行:
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
可用于您的进一步管道 "as is" 或转换为密集矩阵:
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)
这段代码在我的笔记本上运行没有错误。 如果这能解决您的问题,请告诉我们!