我有一组样本,每个样本包含3个单词(名、中间名和姓)
text = ['James Jackson Jammy', 'Steve Smith Something', 'Chamak Chalo Chanta', 'Polo Rolo Colo']
在尝试解决神经网络输入问题时,我想提取名字的字符级别tf(例如,james –> ja,am,me,es),并将其保存为数组,以便提供给神经网络进行分类。
使用TfIdfVectorizer,我尝试从语料库中提取特定单词的tf
# 创建语料库corpus =[]# 将文本分割成单词corpus = ' '.join(text[i] for i in range(len(text))).split()# 仅复制唯一单词corpus = set(corpus)# 创建字符向量(2个字母)vectorizer = TfidfVectorizer(ngram_range=(1,2), analyzer= 'char')X = vectorizer.fit(corpus)# 检查单个单词的向量# 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而不是2(如cha, ham, amp, ..)时,它应该减少,但为什么反而增加了呢?
我的概念理解出了问题,但我做错了什么吗?我可以将这个向量用作神经网络的输入吗?对于我期望的输出,’ch’, ‘am’, ‘ma’, ‘ap’, ‘pa’, ‘ak’(6个向量)的tf值,我打印出的向量是正确的吗?
回答:
形状是(1,55),因为55是你的整个n-gram词汇表的大小。当你对一个包含1个文本的列表调用transform时,输出形状仍然是(1,55),如果你对2个文本调用它,它将是(2,55)。你的输出中的元组意味着你的词汇表中索引为(0,x)的gram在你的单词中。浮点数是逆文档频率。
另外,我认为你误解了ngram_range
参数的工作方式。你问为什么它增加了,而不是减少,当你输入(1,3)而不是(1,2)时。这是因为当你输入(1,3)时,它会在词汇表中存储单字、双字和三字的gram。