scikit-learn:tfidf模型表示



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。有意义吗?

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

所以trained_model[0]应该返回第一个文档的tfidf向量,有四个条目,四个不同的术语中的每一个都有一个tfidf。第二个文档有 11 个 tfidf 用于 11 个不同的术语。

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

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) 给你5801x8954x8=415537232这是通过粗略计算400MB.这可能是可以管理的,只要你不是在任何时候处理数千个。

与第一个稀疏矩阵的大小相比,包含 48369 个值,每个值为 8 个字节,(索引可能每个 4-8 个字节)大约是3MB- 节省了相当大的内存!

如果您愿意在 tf-idf 表示(稀疏或密集)中使用,您可以通过在词汇表中注入几个保留关键字(如zzz_length_documentzzz_num_words)来挤压这些额外的指标(最简单的方法是在 tf-idf-ing 它们之前将它们附加到文档的末尾),然后修改相关的DT单元格值以相应地玩弄权重 - 您可能会发现您需要调低(归一化)数字,以便它们不会主导您对最终矩阵执行的任何矢量化,但一些实验应该有助于揭示一些合适的参数。

相关内容

  • 没有找到相关文章

最新更新