使用 TfidfVectorizer 理解字符级别 feature_extraction
understanding character level feature_extraction using TfidfVectorizer
我有一组样本,其中每个样本有 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 等)时,它应该会减少,但为什么会增加。
我对概念的理解有误,但是我做错了吗?我可以使用向量输入神经网络吗?对于我想要的输出,tf's for ch, am, ma, ap, pa, ak (6 vectors) 我打印出来的向量是正确的吗?
形状是 (1,55),因为 55 是整个 n-gram 词汇表的大小。当您对 1 个文本的列表调用转换时,输出形状仍将是 (1,55),如果您对 2 个文本调用它,则输出形状将是 (2,55)。输出中的元组意味着词汇表中索引 (0,x) 处的克是单词中的克。浮点数是逆文档频率
此外,我认为您误解了 ngram_range
参数的工作方式。你问为什么当你输入(1,3)而不是(1,2)时它会增加而不是减少。这是因为当您输入 (1,3) 时,它会在词汇表中同时存储单字母组、双字母组和三字母组。
我有一组样本,其中每个样本有 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 等)时,它应该会减少,但为什么会增加。
我对概念的理解有误,但是我做错了吗?我可以使用向量输入神经网络吗?对于我想要的输出,tf's for ch, am, ma, ap, pa, ak (6 vectors) 我打印出来的向量是正确的吗?
形状是 (1,55),因为 55 是整个 n-gram 词汇表的大小。当您对 1 个文本的列表调用转换时,输出形状仍将是 (1,55),如果您对 2 个文本调用它,则输出形状将是 (2,55)。输出中的元组意味着词汇表中索引 (0,x) 处的克是单词中的克。浮点数是逆文档频率
此外,我认为您误解了 ngram_range
参数的工作方式。你问为什么当你输入(1,3)而不是(1,2)时它会增加而不是减少。这是因为当您输入 (1,3) 时,它会在词汇表中同时存储单字母组、双字母组和三字母组。