这个稀疏矩阵在scipy中意味着什么?

时间:2014-12-02 01:51:44

标签: numpy machine-learning scipy nlp scikit-learn

我有一个NLP任务,我正在使用scikit-learn。阅读tutorials我发现必须对文本进行矢量化以及如何使用此矢量化模型来提供分类算法。假设我有一些文本,我想按如下方式对其进行矢量化:

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]]

2 个答案:

答案 0 :(得分:5)

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只有一个文档的逗号。

答案 1 :(得分:3)

我认为缺失的链接是vectorizer.get_feature_names()docs)。此方法允许您将矩阵中的计数映射回原始单词:

>>> 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只是一个列表,其中包含一个字符串。