仅就我自己而言,我发现通过使用我能找到的最简单的例子来解决这些事情要容易得多,而不是那些sklearn
提供的大型怪物文本。怪物文本在以后很有用,但是当你试图从骨头中挑选出什么与什么相关时,弄清楚单词之间的区别CountVectorizer
和TfidfVectorizer
绝对数量并不是很有帮助。
然后,考虑一个我们创建两个矢量化器的情况,以及两个非常简单的示例:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
cv = CountVectorizer(stop_words='english')
tv = TfidfVectorizer(stop_words='english')
a = "cat hat bat splat cat bat hat mat cat"
b = "cat mat cat sat"
使用我们的文档列表调用fit_transform()
任一向量化[a,b]
器,作为每种情况下的参数,返回相同类型的对象——一个 2x6 稀疏矩阵,其中包含 8 个压缩稀疏行格式的存储元素。唯一的区别是TfidfVectorizer()
返回浮动,而CountVectorizer()
返回整数。这是意料之中的——正如上面引用的文档中所解释的,在计数TfidfVectorizer()
时分配分数。CountVectorizer()
cv_score = cv.fit_transform([a, b])
cv_score
>>> <2x6 sparse matrix of type '<class 'numpy.int64'>'
with 8 stored elements in Compressed Sparse Row format>
tv_score = tv.fit_transform([a, b])
tv_score
>>> <2x6 sparse matrix of type '<class 'numpy.float64'>'
with 8 stored elements in Compressed Sparse Row format>
如果我们对它们进行迭代,我们的评分矩阵之间的差异就更容易看出——因此为我们的示例选择了漂亮的短文本。首先,我们将编写一个函数来将我们的备用矩阵转换为好的旧列表。
def matrix_to_list(matrix):
matrix = matrix.toarray()
return matrix.tolist()
cv_score_list = matrix_to_list(cv_score)
cv_score_list
>>> [[2, 3, 2, 1, 0, 1], [0, 2, 0, 1, 1, 0]]
tv_score_list = matrix_to_list(tv_score)
tv_score_list
>>> [[0.5333344767907123,
0.5692078092660131,
0.5333344767907123,
0.18973593642200434,
0.0,
0.26666723839535617],
[0.0, 0.7572644142929534, 0.0, 0.3786322071464767, 0.5321543559503558, 0.0]]
每个列表包含两个列表作为元素—— 和 的得分,以及a
和的单词计数。我们将此与知识相结合,即如果我们调用任一矢量化器,单词的(字母)顺序与评分顺序相匹配。因此,我们可以很好地迭代我们的四个列表(2x2)和我们的单词列表来制作一个有用的表格:b
tv_score_list
a
b
cv_score_list
.get_feature_names()
print("tfidf_a tfidf_b count_a count_b word")
print("-"*41)
for i in range(6):
print(" {:.3f} {:.3f} {:} {:} {:}".format(tv_score_list[0][i],
tv_score_list[1][i],
cv_score_list[0][i],
cv_score_list[1][i],
cv.get_feature_names()[i]))
tfidf_a tfidf_b count_a count_b word
-----------------------------------------
0.533 0.000 2 0 bat
0.569 0.757 3 2 cat
0.533 0.000 2 0 hat
0.190 0.379 1 1 mat
0.000 0.532 0 1 sat
0.267 0.000 1 0 splat
查看表格可以让我们了解tfidf
算法的工作原理。例如,splat在 中出现一次,在 中a
根本不出现b
,而在sat
中出现一次,在 中b
根本不出现a
。然而,splat得分为 0.267,而sat得分为 0.532。另请注意,虽然mat出现在两个列表中,但它的得分为 0.19a
和 0.379 b
。这是算法在工作中词频和文档频率之间的区别。
谢谢你陪我。我希望这对某人有所帮助。