我应该如何使用 scikit learn 对以下列表列表进行矢量化?

Posted

技术标签:

【中文标题】我应该如何使用 scikit learn 对以下列表列表进行矢量化?【英文标题】:How should I vectorize the following list of lists with scikit learn? 【发布时间】:2015-02-24 17:36:36 【问题描述】:

我想用 scikit 向量化一个有列表的列表。我去了我阅读培训文本的路径,然后我得到了这样的东西:

corpus = [["this is spam, 'SPAM'"],["this is ham, 'HAM'"],["this is nothing, 'NOTHING'"]]

from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer(analyzer='word')
vect_representation= vect.fit_transform(corpus)
print vect_representation.toarray()

我得到以下信息:

return lambda x: strip_accents(x.lower())
AttributeError: 'list' object has no attribute 'lower'

还有一个问题是每个文档末尾的标签,我应该如何处理它们才能进行正确的分类?

【问题讨论】:

刚刚阅读您的帖子,因为我遇到了类似的问题。我的错误是:corpus 不应该是一个列表,它应该是一个字符串列表,像这样:corpus = ["this is spam","this is ham",...] 【参考方案1】:

对于未来的每个人,这都解决了我的问题:

corpus = [["this is spam, 'SPAM'"],["this is ham, 'HAM'"],["this is nothing, 'NOTHING'"]]

from sklearn.feature_extraction.text import CountVectorizer
bag_of_words = CountVectorizer(tokenizer=lambda doc: doc, lowercase=False).fit_transform(splited_labels_from_corpus)

这是输出,当我使用.toarray() 函数时:

[[0 0 1]
 [1 0 0]
 [0 1 0]]

谢谢大家

【讨论】:

谁能推荐我一个更 Pythonic 的方式来做到这一点?在此先感谢各位。 你不需要两个CountVectorizers,还有为什么你的输入数据总是和标签混在一起那么奇怪? 抱歉,第一个 vect 出错了。我没有意识到(我只是复制并粘贴问题的代码)我将编辑答案。我有这种格式,因为我只是在学习如何使用 scikit learn 和我自己的语料库,我假设我有一个语料库,每个列表一个文档。感谢您的反馈 数据总是与标签混合在一起,因为我不知道任何其他方法来标记训练数据。假设我在每个列表都是一个文档的列表中有训练数据,你建议我用什么其他方法来标记训练数据?如何告诉分类算法一个文档属于一个类?。 通常数据来自 .csv 文件,其中每一行对应一个样本/文档,最后一列或第一列是标签。使用 pandas 很容易解决这个问题。如果您手动输入数据,则将标签直接放入 y 列表变量中,例如 y=['SPAM', 'HAM', ...],长度等于文档数量,即不要将它们与文档混合。那么你的语料库将是corpus = [ "this is spam", "this is ham", ...]【参考方案2】:

首先,您应该将标签与文本分开。如果你想使用 CountVectorizer,你必须一个一个地转换你的文本:

corpus = [["this is spam, 'SPAM'"],["this is ham, 'HAM'"],["this is nothing, 'NOTHING'"]]
from sklearn.feature_extraction.text import CountVectorizer
... split labels from texts
vect = CountVectorizer(analyzer='word')
vect_representation= map(vect.fit_transform,corpus)
...

作为另一种选择,您可以直接将TfidfVectorizer 与列表一起使用。

【讨论】:

那么我应该从文本中拆分标签吗?我正在考虑使用监督方法(MNB、SVM、LR)并使用corpus 作为训练数据,如果我删除标签,我如何使用它们来训练分类器?或者这将通过 scikit 提供的教程提供的y 解决(目标) 是的,通常 y 代表 scikit 中的标签列表。所以你必须将语料库拆分为 X 和 Y。 我拆分了标签,但是当我执行以下操作时:´vect_representation.toarray()´ 我有以下内容:AttributeError: 'list' object has no attribute 'toarray 我想可视化文档术语矩阵。每个文档一个向量,如何解决这个问题?谢谢 vect_representation 是向量列表。您可以通过 toarray() 可视化列表中的每个向量。 “作为另一种选择,您可以直接将 TfidfVectorizer 与列表一起使用。”,究竟如何?对我不起作用。

以上是关于我应该如何使用 scikit learn 对以下列表列表进行矢量化?的主要内容,如果未能解决你的问题,请参考以下文章

如何规范 scikit learn 的 kde?

如何知道使用 Scikit-learn 构建的树的大小(节点数)?

如何在 scikit-learn 中使用 KDE(核密度估计)进行一维数组聚类?

scikit-learn:如何使用拟合概率模型?

在 Scikit-Learn 分类器上使用交叉验证

如何使用 scikit-learn 创建我自己的数据集?