python中的共同出现矩阵

时间:2018-02-12 12:22:39

标签: python matrix

我有庞大的数据集,样本在下面,我需要计算技能列的共生矩阵,请参考下面的示例数据,我读到了共生矩阵,以及来自scikit的CountVectorizer学习轻松,我写了下面的代码,但我很困惑如何看到结果。如果有人可以,请帮助我,请找到示例数据,以及我在下面尝试过的代码

df1 = pd.DataFrame([["1000074", "6284 6295"],["75634786", "4044 4714 5789 6076 6077 6079 6082 6168 6229"],["75635714","4092 4420 4430 4437 4651"]], columns=['people_id', 'skills_id'])

count_vect = CountVectorizer(ngram_range=(1,1),lowercase= False)
X_counts = count_vect.fit_transform(df1['skills_id'])
Xc = (X_counts.T * X_counts)
Xc.setdiag(0)
print(Xc.todense())

我对共生矩阵的术语很新,我可以理解数字,单词到单词的共生,但是如何阅读和理解结果。

1 个答案:

答案 0 :(得分:1)

嗯,你可能会想到它就像一个单词到单词的共生矩阵。在这里,假设您的skill列是第二列,其数字大小为4,它首先会查看所有唯一可能的值:

>>> count_vect.get_feature_names()

['4044',
 '4092',
 '4420',
 '4430',
 '4437',
 '4651',
 '4714',
 '5789',
 '6076',
 '6077',
 '6079',
 '6082',
 '6168',
 '6229',
 '6284',
 '6295']

这是一个16号的数组,表示skill列中找到的16个不同的。实际上,sklearn.text.CountVectorizer()通过使用空格分隔符分割字符串来查找单词。

您使用print(Xc.todense())看到的最终矩阵只是这16个的共生矩阵。这就是它的大小为(16,16)

的原因

为了更清楚(请原谅列对齐格式),您可以查看:

>> pd.DataFrame(Xc.todense(), 
    columns=count_vect.get_feature_names(), 
    index=count_vect.get_feature_names())

      4044 4092 4420 ...
4044    0   0   0   0   0   0   1   1   1   1   1   1   1   1   0   0
4092    0   0   1   1   1   1   0   0   0   0   0   0   0   0   0   0
4420    0   1   0   1   1   1   0   0   0   0   0   0   0   0   0   0
4430    0   1   1   0   1   1   0   0   0   0   0   0   0   0   0   0
4437    0   1   1   1   0   1   0   0   0   0   0   0   0   0   0   0
4651    0   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0
4714    1   0   0   0   0   0   0   1   1   1   1   1   1   1   0   0
5789    1   0   0   0   0   0   1   0   1   1   1   1   1   1   0   0
6076    1   0   0   0   0   0   1   1   0   1   1   1   1   1   0   0
6077    1   0   0   0   0   0   1   1   1   0   1   1   1   1   0   0
6079    1   0   0   0   0   0   1   1   1   1   0   1   1   1   0   0
6082    1   0   0   0   0   0   1   1   1   1   1   0   1   1   0   0
6168    1   0   0   0   0   0   1   1   1   1   1   1   0   1   0   0
6229    1   0   0   0   0   0   1   1   1   1   1   1   1   0   0   0
6284    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1
6295    0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0

tl; dr 在这种情况下,当您输入字符串时,无论它们是数字(例如"23")还是名词(例如"cat")都不会改变任何东西。共现仍然显示二进制值,表示是否找到给定的令牌与另一个。 CountVectorizer()的默认标记生成器只是在空格上分割。

你对数字的期望究竟是什么?