如何解释sklearn稀疏矩阵输出?

问题描述 投票:0回答:1

我正在尝试生成一个二元词共生矩阵,表示一个词在一个语料库中跟随另一个词的次数。

作为测试,我写了以下内容(我从其他SE问题中收集过):

from sklearn.feature_extraction.text import CountVectorizer

test_sent = ['hello', 'i', 'am', 'hello', 'i', 'dont', 'want', 'to', 'i', 'dont']
bigram_vec = CountVectorizer(ngram_range=(1,2)) 
X = bigram_vec.fit_transform(test_sent)
Xc = (X.T * X)
print Xc

这应该给出正确的输出。矩阵Xc输出如下:

(0, 0)  1
(1, 1)  2
(2, 2)  2
(3, 3)  1
(4, 4)  1

我不知道如何解释这个。我尝试使用Xc.todense()来帮助解释我的密集程度,这得到了:

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

这些都没有给出正确的单词共生矩阵,显示一行在列之后有多少次。

有人可以解释我如何解释/使用输出?为什么会那样?

除了问题

这是另一个可能的输出,使用ngram_range=(2,2)的不同示例:

from sklearn.feature_extraction.text import CountVectorizer

test_sent = ['hello biggest awesome biggest biggest awesome today lively splendid awesome today']

bigram_vec = CountVectorizer(ngram_range=(2,2)) 

X = bigram_vec.fit_transform(test_sent)
print bigram_vec.get_feature_names()

Xc = (X.T * X)

print Xc
print ' '
print Xc.todense()

(4, 0)  1
(2, 0)  2
(0, 0)  1
(3, 0)  1
(1, 0)  2
(7, 0)  1
(5, 0)  1
(6, 0)  1
(4, 1)  2
(2, 1)  4
(0, 1)  2
(3, 1)  2
(1, 1)  4
(7, 1)  2
(5, 1)  2
(6, 1)  2
(4, 2)  2
(2, 2)  4
(0, 2)  2
(3, 2)  2
(1, 2)  4
(7, 2)  2
(5, 2)  2
(6, 2)  2
(4, 3)  1
:   :
(6, 4)  1
(4, 5)  1
(2, 5)  2
(0, 5)  1
(3, 5)  1
(1, 5)  2
(7, 5)  1
(5, 5)  1
(6, 5)  1
(4, 6)  1
(2, 6)  2
(0, 6)  1
(3, 6)  1
(1, 6)  2
(7, 6)  1
(5, 6)  1
(6, 6)  1
(4, 7)  1
(2, 7)  2
(0, 7)  1
(3, 7)  1
(1, 7)  2
(7, 7)  1
(5, 7)  1
(6, 7)  1

[[1 2 2 1 1 1 1 1]
 [2 4 4 2 2 2 2 2]
 [2 4 4 2 2 2 2 2]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]
 [1 2 2 1 1 1 1 1]]

这个似乎由bigrams标记,因为调用bigram_vec.get_feature_names()给出

[u'awesome biggest', u'awesome today', u'biggest awesome', u'biggest biggest', u'hello biggest', u'lively splendid', u'splendid awesome', u'today lively']

一些帮助解释这将是伟大的。它是一个对称矩阵,所以我想它可能只是出现次数?

python scikit-learn sparse-matrix
1个回答
0
投票

首先,您需要查看CountVectorizer正在使用的功能名称。

做这个:

bigram_vec.get_feature_names()
# Out:  [u'am', u'dont', u'hello', u'to', u'want']

你看到"i"这个词不存在。那是因为默认的tokenizer使用了一个模式:

token_pattern:string

Regular expression denoting what constitutes a “token”, only used if 
analyzer == 'word'. The default regexp select tokens of 2 or more
alphanumeric characters (punctuation is completely ignored and always
treated as a token separator).

并且X的实际输出应解释为:

            [u'am', u'dont', u'hello', u'to', u'want']
'hello'    [[ 0        0        1        0       0]
'i'         [ 0        0        0        0       0]
'am'        [ 1        0        0        0       0]
'hello'     [ 0        0        1        0       0]
'i'         [ 0        0        0        0       0]
'dont'      [ 0        1        0        0       0]
'want'      [ 0        0        0        0       1]
'to'        [ 0        0        0        1       0]
'i'         [ 0        0        0        0       0]
'dont'      [ 0        1        0        0       0]]

现在当你做X.T * X时,这应解释为:

           u'am'  u'dont'  u'hello'  u'to'  u'want'
u'am'      [[1      0         0        0       0]
u'dont'     [0      2         0        0       0]
u'hello'    [0      0         2        0       0]
u'to'       [0      0         0        1       0]
u'want'     [0      0         0        0       1]]

如果您还有其他需要,那么您应该在问题中添加详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.