我应该如何使用 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 构建的树的大小(节点数)?