TfidfVectorizer-toarray()和HashingVectorizer的含义



我正在尝试理解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.363888646四次。。0.27674503两次。。这个号码是什么?神经网络用来自我训练的数字是用vector.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)

  • 在第一种情况下,您会看到重复的数字,因为您的"语料库"中有多个单词具有相同的IDF(文档频率相反)。例如,单词dogfox在文本中具有完全相同的出现模式,因此它们具有相同的IDF;这两个值用1.28768207表示。单词出现在每个文本中,因此用1表示。词汇表中的其余单词在第一个文本中出现一次,而在其他两个文本中没有出现,因此它们都具有完全相同的IDF。您可以使用vectorizer.get_feature_names()查看哪个特征对应于哪个单词
  • 使用HashingVectorizer,您选择了20个功能,但文本中唯一单词的总数不到20,因此您将拥有许多0的功能。你得到的非零元素少于8个,因为存在一些哈希冲突——这是因为20的功能太少,无法避免冲突(考虑默认值为2^20)。如果您选择更高的n_features,您将得到正好8个非零元素。您有重复的值,因为在该文本中,几乎所有特征的频率都相同
  • 对于标题中的问题,toarray()方法将sklearn使用的稀疏矩阵的有效表示转换为普通可读的稠密ndarray表示

TfidfVectorizer()

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

矢量器.fit(文本)

我建议你运行

矢量器.fit_transform(文本)

然后它标记了您的文本,为您的文本创建了一个功能。由于您的文本有8个功能({'':7,'快速':6,'棕色':0,'狐狸':2,'跳跃':3,'越过':5,"lazy":4,"dog":1}它返回了与它们对应的8个频率。您也可以通过运行进行交叉验证

print(vectorizer.get_feature_names())

[‘rown’,‘dog’,‘fox’,‘jump’,‘lazy’,"over","quick","the"]

print(vectorizer.fit_transform(text).shape)

将为您提供

(3,8)

相关内容

  • 没有找到相关文章

最新更新