TfidfVectorizer toarray()和HashingVectorizer的含义

时间:2019-02-06 21:30:47

标签: python machine-learning scikit-learn

我正在尝试了解python中的矢量化器。 我正在使用以下示例代码:

from sklearn.feature_extraction.text import TfidfVectorizer
# list of text documents
text = ["The quick brown fox jumped over the lazy dog.", "The dog.", "The fox"]
print(text)
# create the transform
vectorizer = TfidfVectorizer()
# tokenize and build vocab
vectorizer.fit(text)
# summarize
print(vectorizer.idf_)
# encode document
vector = vectorizer.transform([text[0]])
# summarize encoded vector
print(vector.shape)
print(vector.toarray())
print(vectorizer.vocabulary_)

输出是这样的:

['The quick brown fox jumped over the lazy dog.', 'The dog.', 'The fox']
[1.69314718 1.28768207 1.28768207 1.69314718 1.69314718 1.69314718
1.69314718 1.        ]
(1, 8)
[[0.36388646 0.27674503 0.27674503 0.36388646 0.36388646 0.36388646
0.36388646 0.42983441]]
{'the': 7, 'quick': 6, 'brown': 0, 'fox': 2, 'jumped': 3, 'over': 5, 
'lazy': 4, 'dog': 1}

我不明白为什么vector.toarray()会为不同的单词产生重复的数字。例如,四次有0.36388646 ..两次有0.27674503 ..这个数字代表什么? 神经网络用来自我训练的数字是用vectorizer.vocabulary_?打印的数字。

使用散列矢量化程序代替,我有以下代码:

from sklearn.feature_extraction.text import HashingVectorizer
# list of text documents
text = ["The quick brown fox jumped over the lazy dog."]
# create the transform
vectorizer = HashingVectorizer(n_features=20)
# encode document
vector = vectorizer.fit_transform(text)
# summarize encoded vector
print(vector.shape)
print(vector.toarray())

这就是输出:

(1, 20)
[[ 0.          0.          0.          0.          0.          0.33333333
 0.         -0.33333333  0.33333333  0.          0.          0.33333333
 0.          0.          0.         -0.33333333  0.          0.
-0.66666667  0.        ]]

是否使用了0。什么礼物?为何甚至在那里也打印重复的值? (0.3333333和-0.33333333)

2 个答案:

答案 0 :(得分:1)

  • 在第一种情况下,您会看到重复的数字,因为您的“语料库”中有多个单词具有相同的IDF(反向文档频率)。例如,单词 dog fox 在您的文本中具有完全相同的出现方式,因此它们具有相同的IDF。这两个由1.28768207值表示。单词 the 出现在每个文本中,因此用1表示。词汇表中的其余单词在第一个文本中出现一次,而在其他两个文本中不出现,因此它们具有完全相同的含义以色列国防军。您可以使用vectorizer.get_feature_names()查看哪个功能对应于哪个单词。
  • 使用HashingVectorizer时,您选择的功能数为20,但是文本中唯一词的总数少于20,因此您将有很多功能数为0。获得的非特征数少于8 -零元素,因为存在一些哈希冲突-这是因为20太少了避免冲突的功能(请考虑默认值为2 ^ 20)。如果您选择较高的n_features,则会得到8个非零元素。您有重复的值,因为在该文本中几乎所有功能再次具有相同的频率。
  • 对于标题中的问题,toarray() method将sklearn使用的稀疏矩阵的有效表示形式转换为普通的可读密集ndarray表示形式。

答案 1 :(得分:0)

  

TfidfVectorizer()

将原始文档集合转换为TF-IDF功能矩阵。 您正在运行

  

vectorizer.fit(文本)

我建议你跑步

  

vectorizer.fit_transform(text)

然后将您的文本标记化,从而为文本创建功能。由于您的文字具有8个功能( {'the':7,'quick':6,6,'brown':0,'fox':2,2,'jumped':3,'over':5, 'lazy':4,4,'dog':1} 它返回了与它们对应的8个频率。您也可以通过运行

进行交叉验证
  

print(vectorizer.get_feature_names())

这会给你 [“棕色”,“狗”,“狐狸”,“跳跃”,“懒惰”,“过来”,“快速”,“那个”]

  

print(vectorizer.fit_transform(text).shape)

会给您

  

(3,8)