我有庞大的数据集,样本在下面,我需要计算技能列的共生矩阵,请参考下面的示例数据,我读到了共生矩阵,以及来自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())
我对共生矩阵的术语很新,我可以理解数字,单词到单词的共生,但是如何阅读和理解结果。
答案 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()的默认标记生成器只是在空格上分割。
你对数字的期望究竟是什么?