【问题标题】:Problem with CountVectorizer from scikit-learn packagescikit-learn 包中的 CountVectorizer 问题
【发布时间】:2019-06-08 03:42:39
【问题描述】:

我有一个电影评论数据集。它有两列:'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

【问题讨论】:

  • 顺便说一句,你可以使用TfidfVectorizer,它结合了CountVectorizerTfidfTransformer
  • @Tomothy32 我知道。文章提到了。
  • 你所说的“没有意义的奇怪输出”是一个稀疏矩阵。您可以从这里开始,将其设置为稠密,或使用 as it is 作为 RandomForest 分类器的输入。
  • @SergeyBushmanov 但是,然后我看到这个错误:“找到样本数量不一致的输入变量:[1, 7086]”...
  • [1,7086] 绝对不是您希望看到的此类问题/数据集。有关分步工作流程,请参阅下面的答案。

标签: python scikit-learn classification sentiment-analysis text-recognition


【解决方案1】:

假设你碰巧有一个数据框:

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)

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

【讨论】:

  • 非常非常非常感谢。我真的很感激。
  • 我有问题要学习。在什么基础上,这些词被分配到列中。意思是,为什么第 0 列是“真棒”?我如何计算有多少单词成为列/特征?
  • 如何分配给列的单词由CountVectorizer 决定。正如我所说,逻辑如下:(i)提取的所有唯一单词,它们构成vocabulary(ii)单词按字母顺序排列(iii)第一个单词分配给第一列,第二个到第二个等等。这个练习的最终结果可以通过vectorizer.vocabulary_ 访问(见答案)。多少字简直就是len(vectorizer.vocabulary_).
猜你喜欢
  • 2020-05-05
  • 2017-02-25
  • 1970-01-01
  • 2020-01-15
  • 2012-05-09
  • 1970-01-01
  • 2020-11-09
  • 2016-09-02
  • 2014-07-13
相关资源
最近更新 更多