我有一个NLP任务,我正在使用scikit-learn。阅读我发现必须矢量化文本以及如何使用此矢量化模型来提供分类算法的教程。假设我有一些文本,我想按如下方式对其进行矢量化:
from sklearn.feature_extraction.text import CountVectorizer
corpus =['''Computer science is the scientific and
practical approach to computation and its applications.'''
#this is another opinion
'''It is the systematic study of the feasibility, structure,
expression, and mechanization of the methodical
procedures that underlie the acquisition,
representation, processing, storage, communication of,
and access to information, whether such information is encoded
as bits in a computer memory or transcribed in genes and
protein structures in a biological cell.'''
#anotherone
'''A computer scientist specializes in the theory of
computation and the design of computational systems''']
vectorizer = CountVectorizer(analyzer='word')
X = vectorizer.fit_transform(corpus)
print X
问题是我不明白输出的含义,我没有看到与矢量化器返回的文本和矩阵有任何关系:
(0, 12) 3
(0, 33) 1
(0, 20) 3
(0, 45) 7
(0, 34) 1
(0, 2) 6
(0, 28) 1
(0, 4) 1
(0, 47) 2
(0, 10) 2
(0, 22) 1
(0, 3) 1
(0, 21) 1
(0, 42) 1
(0, 40) 1
(0, 26) 5
(0, 16) 1
(0, 38) 1
(0, 15) 1
(0, 23) 1
(0, 25) 1
(0, 29) 1
(0, 44) 1
(0, 49) 1
(0, 1) 1
: :
(0, 30) 1
(0, 37) 1
(0, 9) 1
(0, 0) 1
(0, 19) 2
(0, 50) 1
(0, 41) 1
(0, 14) 1
(0, 5) 1
(0, 7) 1
(0, 18) 4
(0, 24) 1
(0, 27) 1
(0, 48) 1
(0, 17) 1
(0, 31) 1
(0, 39) 1
(0, 6) 1
(0, 8) 1
(0, 35) 1
(0, 36) 1
(0, 46) 1
(0, 13) 1
(0, 11) 1
(0, 43) 1
我也不明白当我使用 toarray()
方法时输出发生了什么:
print X.toarray()
输出到底意味着什么,与语料库有什么关系?
[[1 1 6 1 1 1 1 1 1 1 2 1 3 1 1 1 1 1 4 2 3 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 7 1 2 1 1 1]]
CountVectorizer
生成文档术语矩阵。对于一个简单的示例,让我们看一下以下简化代码:
from sklearn.feature_extraction.text import CountVectorizer
corpus =['''computer hardware''',
'''computer data and software data''']
vectorizer = CountVectorizer(analyzer='word')
X = vectorizer.fit_transform(corpus)
print X
print X.toarray()
你有两个文件,语料库的元素,和五个术语,单词。您可以按如下方式计算文档中的条款:
| and computer data hardware software
+-------------------------------------
doc 0 | 1 1
doc 1 | 1 1 2 1
并且X
以关联方式表示上述矩阵,即从(行,列)到术语频率的映射,X.toarray()
X
显示为列表列表。以下是执行结果:
(1, 0) 1
(0, 1) 1
(1, 1) 1
(1, 2) 2
(0, 3) 1
(1, 4) 1
[[0 1 0 1 0]
[1 1 2 0 1]]
如@dmcc所述,您省略了逗号,这使得corpus
只有一个文档。
我认为缺少的链接是vectorizer.get_feature_names()
(文档)。此方法允许您将矩阵中的计数映射回其原始单词:
>>> vectorizer.get_feature_names()
[u'access', u'acquisition', u'and', u'applications', u'approach', u'as', u'biological', u'bits', u'cell', u'communication', u'computation', u'computational', u'computer', u'design', u'encoded', u'expression', u'feasibility', u'genes', u'in', u'information', u'is', u'it', u'its', u'mechanization', u'memory', u'methodical', u'of', u'or', u'practical', u'procedures', u'processing', u'protein', u'representation', u'science', u'scientific', u'scientist', u'specializes', u'storage', u'structure', u'structures', u'study', u'such', u'systematic', u'systems', u'that', u'the', u'theory', u'to', u'transcribed', u'underlie', u'whether']
因此,X.toarray()
中的第一个元素意味着语料库包含单词 access
的 1 个实例,第三个元素意味着单词 and
有 6 个实例。
顺便说一下,一个混淆点可能是#anotherone
周围缺少逗号 - 这会导致两个字符串被连接起来,因此corpus
现在只是一个包含一个字符串的列表。