scikit-learn包中的CountVectorizer问题

前端之家收集整理的这篇文章主要介绍了scikit-learn包中的CountVectorizer问题 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有电影评论的数据集.它有两列:“类”和“评论”.我已经完成了大多数常规的预处理工作,例如:降低字符,删除停用词,删除标点符号.在预处理结束时,每个原始评论看起来都像是由空格分隔符分隔的单词.

我想先使用CountVectorizer,然后再使用TF-IDF,以创建数据集的特征,以便我可以使用Random Forest进行分类/文本识别.我调查了网站,然后尝试做网站.这是我的代码

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

但是,我得到这个输出

  1. (0,0) 1.0

这根本没有意义.我处理了一些参数,并注释掉了有关TF-IDF的部分.这是我的代码

  1. data = pd.read_csv('updated-data ready.csv')
  2. X = data.drop('class',axis = 1)
  3. y = data['class']
  4. vectorizer = CountVectorizer(analyzer = 'char_wb',\
  5. tokenizer = None,\
  6. preprocessor = None,\
  7. stop_words = None,\
  8. max_features = 5000)
  9. new_X = vectorizer.fit_transform(X)
  10. print(new_X)

这是我的输出

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

我想念什么吗?还是我太菜鸟不懂?我所理解和想要的只是/如果我进行了变换,我将收到一个具有这么多功能(关于单词及其频率)加上标签列的新数据集.但是,我得到的却远非如此.

我再说一遍,我想要做的是从评论集中提取一个新的数据集,其中包含数字,单词作为特征,因此Random Forest或其他分类算法可以对它进行任何处理.

谢谢.

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

  1. class reviews
  2. 0 1 da vinci code book awesome
  3. 1 1 first clive cussler ever read even books like ...
  4. 2 1 liked da vinci code lot
  5. 3 1 liked da vinci code lot
  6. 4 1 liked da vinci code ultimatly seem hold
最佳答案
假设您碰巧有一个数据框:

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

分为特征和结果:

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

然后,按照您的管道,您可以为任何ML算法准备数据,如下所示:

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

此new_X可以“按原样”在您的其他管道中使用,也可以转换为密集矩阵:

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

此矩阵中的行表示原始评论列中的行,而列表示字数.如果您对“哪一列”指的是您可能要使用的单词感兴趣:

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

其中key是单词,值是上述矩阵中的列索引(实际上,您可以推断该列索引对应于有序词汇表,“ awesome”负责第0列,依此类推).

您可以像下面这样进一步处理管道:

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

最后,您可以将预处理的数据输入到RandomForest中:

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

代码在我的笔记本上运行没有错误.
请让我们知道这是否可以解决您的问题!

猜你在找的Python相关文章