scipy中的这个稀疏矩阵是啥意思?

Posted

技术标签:

【中文标题】scipy中的这个稀疏矩阵是啥意思?【英文标题】:What means this sparse matrix in scipy?scipy中的这个稀疏矩阵是什么意思? 【发布时间】:2015-01-30 04:18:29 【问题描述】:

我有一个 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]]

【问题讨论】:

您可能想了解 Manning&Schuetze 书中的向量空间模型:nlp.stanford.edu/IR-book/pdf/06vect.pdf 【参考方案1】:

我认为缺少的链接是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 现在只是一个包含一个字符串的列表。

【讨论】:

【参考方案2】:

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 以关联方式表示上述矩阵,即从 (row, col) 到术语频率的映射,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 只有一个文档的逗号。

【讨论】:

感谢您的反馈。 scikit-learn 拥有的其他矢量化器呢? (例如 FeatureHasher、Tf–idf 等),这种矢量化算法是返回文档矩阵还是返回的矩阵取决于所选的矢量化算法?。 @ml_guy 是的,这取决于矢量化器和参数。请看the feature extraction page。

以上是关于scipy中的这个稀疏矩阵是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

计算 scipy 稀疏矩阵的稀疏传递闭包

Scipy---6.稀疏矩阵

Scipy 稀疏矩阵作为 DataFrame 列

在 Scipy 中切片稀疏矩阵——哪种类型效果最好?

如何将“SciPy 稀疏矩阵”转换为“NumPy 矩阵”?

如何点积 (1,10^13) (10^13,1) scipy 稀疏矩阵