python - 使用 TfidfVectorizer 理解字符级特征提取

标签 python machine-learning nlp 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 的 ch、am、ma、ap、pa、ak(6 个向量)是我打印出来的向量是否正确?

最佳答案

形状是 (1,55),因为 55 是整个 n 元语法词汇的大小。当您对 1 个文本的列表调用 Transform 时,输出形状仍将为 (1,55),如果您对 2 个文本调用它,则输出形状将为 (2,55)。输出中的元组意味着词汇表中索引 (0,x) 处的语法是您单词中的语法。 float 为逆文档频率

此外,我认为您误解了 ngram_range 参数的工作方式。你问为什么当你输入(1,3)而不是(1,2)时它会增加,并且不会减少。这是因为当您输入 (1,3) 时,它会在词汇表中存储一元组、二元组和三元组。

关于python - 使用 TfidfVectorizer 理解字符级特征提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49856775/

相关文章:

python - Python Pickle 是否有我可以用作分隔符的非法字符/序列?

machine-learning - 机器学习多分类: Why use 'one-hot' encoding instead of a number

python - 如何使用 python 请求执行限时响应下载?

python - 如何将 Wordpress 放在 Heroku 上运行的 Flask 应用程序的/blog 目录中

python - Python subprocess.run无法处理大参数字符串

android - android中的实时交通标志识别

python - 预处理、重采样和管道 - 以及两者之间的错误

python - 使用 gensim 从 fasttext 库中高效地加载预训练词嵌入的内存

python - TfidfVectorizer 是否隐式地对大型数据集的拟合输出进行阈值处理?

numpy - 如何使用 scikit learn SVC 进行概率分类?