我有一组样本,每个样本有3个单词(给定名称,中间名和姓氏)
text = ['James Jackson Jammy',
'Steve Smith Something',
'Chamak Chalo Chanta',
'Polo Rolo Colo']
尝试使用神经网络的输入解析issue,我想提取名称的字符级别tf(例如james - > ja,am,me,es)并将其保存为数组把它交给神经网络进行分类。
使用TfIdfVectorizer,我试图从语料库中提取特定单词的tf
# creating the corps
corpus =[]
# splitting the text in to words
corpus = ' '.join(text[i] for i in range(len(text))).split()
# copy only unique words
corpus = set(corpus)
# creating the character vector (2 letters)
vectorizer = TfidfVectorizer(ngram_range=(1,2), analyzer= 'char')
X = vectorizer.fit(corpus)
# checking the vector of the one word
# ab = X.transform(['Chamak Chalo Chanta'])
ab = X.transform(['Chamak'])
print(ab.shape)
print(ab)
当我检查输出时,我得到了类似
的内容 (1,55)
(0, 28) 0.38126785705606514
(0, 27) 0.23541325871187607
(0, 23) 0.3274372645024392
(0, 16) 0.28924385126550206
(0, 15) 0.23541325871187607
(0, 7) 0.28924385126550206
(0, 6) 0.23541325871187607
(0, 4) 0.28924385126550206
(0, 2) 0.38126785705606514
(0, 0) 0.4298956344860669
它说形状是(1,55),我不明白它显示的是什么样的矢量。 (0,0)...(0,28)的值是否有任何意义。对于'chamak'这个词,我期待它应该显示'ch','ha','am','ma','ak'的tf值,但值是55而不是5.
当我使用ngram_range=(1,3)
输出
(1, 91)
(0, 49) 0.30927373541425635
(0, 48) 0.30927373541425635
(0, 47) 0.1909605977541359
(0, 42) 0.26560787654230167
(0, 29) 0.30927373541425635
(0, 27) 0.23462645662609066
(0, 26) 0.1909605977541359
(0, 14) 0.23462645662609066
(0, 13) 0.23462645662609066
(0, 12) 0.1909605977541359
(0, 7) 0.30927373541425635
(0, 6) 0.23462645662609066
(0, 3) 0.30927373541425635
(0, 0) 0.34871921735651773
当我将范围增加到3而不是3(如cha,ham,amp,..)时,它应该减少,但为什么它会增加。
我对这个概念的理解出了问题,但我做错了吗?我可以使用矢量输入神经网络吗?对于我想要的输出,对于ch,am,ma,ap,pa,ak(6个向量)的tf是我打印出的向量是正确的吗?
答案 0 :(得分:1)
形状为(1,55),因为55是整个n-gram词汇的大小。当您在1个文本列表上调用transform时,输出形状仍为(1,55),如果您在2个文本上调用它,则为(2,55)。输出中的元组意味着词汇表中索引(0,x)处的克是单词中的克。浮点数是逆文档频率
另外我认为你误解了ngram_range
参数的工作方式。你问为什么它增加,并且当你输入(1,3)而不是(1,2)时不减少。这是因为当你输入(1,3)时它会在词汇表中存储unigrams,bigrams和trigrams。