scikit-learn:tfidf模型表示

时间:2015-04-20 00:52:03

标签: python machine-learning scikit-learn tf-idf

tldr:tfidf稀疏矩阵是什么样的?

假设我有以下内容。

descriptions = ["he liked dogs", "she liked cats", "she hated cars"]
tfidf = TfidfVectorizer()
trained_model = tfidf.fit_transform(descriptions)

现在我想将tfidf分数与文档的其他功能结合起来,并给出不同的权重。例如,我想添加length_documentnum_words作为文档的功能。所以每个文档都应该表示为

d = [tfidf_score, length_document, num_words]

然后我会尝试找出这三个功能的最佳权重,以返回最相似的文档。

但首先,我需要弄清楚trained_model到底是什么样的。

(Pdb) trained_model
<5801x8954 sparse matrix of type '<type 'numpy.float64'>'
    with 48369 stored elements in Compressed Sparse Row format>
(Pdb) trained_model[0]
<1x8954 sparse matrix of type '<type 'numpy.float64'>'
    with 4 stored elements in Compressed Sparse Row format>
(Pdb) trained_model[1]
<1x8954 sparse matrix of type '<type 'numpy.float64'>'
    with 11 stored elements in Compressed Sparse Row format>

总共有5801个文档,它们在语料库中用8954个单词表示。然后x stored elements表示什么?

如果你有时间:

我假设每个文档都由一个长度为8954的向量表示。如果我只是在末尾添加两个特征并使矢量长度为8956,那么对它们进行平均称重是没有意义的。我想让第一个8954功能占用重量的1/3,最后两个功能占2/3。它有意义吗?

2 个答案:

答案 0 :(得分:0)

矩阵中的每一行对应一个文档。行根据压缩行格式进行格式化。仅包含非零项。

so trained_model [0]应该返回第一个文档的tfidf向量,它有四个条目,每个条目有一个tfidf。第二个文件对11个不同的术语有11个tfidf。

关于你的体重。如果您想要测量文档的相似性,您可能应该使用距离度量,例如tfidf向量上的cosign相似度。将2/3的相似度分配给文档的长度可能不是您想要的

答案 1 :(得分:0)

tf-idf矩阵是一个矩阵的稀疏表示,它将您的文档作为行,让我们称之为 D ,以及单个术语(即词汇表)这些文件中包含的单词代表列 - 让我们称之为 T

在正常(密集)矩阵表示(如数组)中,机器将保留 DxT 数据块,并使用零或NaN或其他任何值填充空单元格,取决于您的数据类型(TF-IDF矩阵可能包含浮点型数据,因此您会看到零)它只是一个大的矩形存储块,可以通过提供坐标参考快速参考。

矩阵的稀疏表示通过假设大多数矩阵为零来节省空间,并且将非零值写入属于某些(x,y)类似元组的索引。 x stored elements部分表示该矩阵中有x个非零元素。

只要保持简单,就可以直接执行矩阵 - 数学稀疏矩阵,或者,如果你有记忆,你可以使用S.todense()函数将矩阵转换为密集表示。这使您可以更灵活地执行您的操作,但需要承担一定的费用(在您的示例中)5801x8954xdatatype_size(如果您的数据类型为np.float64,则为8,即np.dtype(np.float64).itemsize)为您提供{{1}这是粗略计算5801x8954x8=415537232。这可能是可以管理的,只要你在任何时候都不是在处理成千上万的这些。

与第一个稀疏矩阵的大小相比较,包含48369个值,每个8个字节和(可能另外每个4-8个字节用于索引)大致为400MB - 节省了大量内存!

如果您乐意在tf-idf表示(稀疏或密集)中工作,可能能够通过注入一些保留关键字来挤压这些额外的指标,例如{{1}或3MB进入你的词汇表(最简单的方法是将它们附加到文档末尾,然后再修改它们)然后修补相关的 DT 相应的权重玩具单元格值 - 您可能会发现需要降低(标准化)数字,以便它们不会支配您在最终矩阵上执行的任何矢量化,但是一些实验应该有所帮助揭示一些合适的参数。