首页 > 解决方案 > 如何将 TF-IDF 分数组合成相当于连接两个字符串

问题描述

我有一个包含 5000 个书名的语料库,我正在尝试对这些书名进行一些聚类。我正在使用 sklearn TfidfVectorizer 库为每个标题生成 TF-IDF 矩阵。

但是,我现在结合了两个标题(所以“Book A”和“Book B”变成了“Book A Book B”),我想知道是否有办法获取“Book A Book B”的 TF-IDF 矩阵” 通过组合“Book A”的矩阵和“Book B”的矩阵。

我已经尝试再次重新计算 TF-IDF 分数,但这可能需要很长时间,如果有更快的方法,我更愿意这样做,因为我实际上需要为不同的标题组合执行数千次。

下面的代码显示了我现在正在做的事情。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

tf = TfidfVectorizer(analyzer='word', ngram_range=(1, 3), min_df=0, stop_words='english')

titles = list_of_strings

tfidf_matrix = tf.fit_transform(titles)

# This gives a matrix roughly (5000, 20000)

new_title = titles[0] + ' ' + titles[1]

# Get the tfidf_matrix for the new_title

如果有类似的东西,我会很棒:

matrix_for_book_a + matrix_for_book_b 

这给出了“Book A Book B”的矩阵,但我不确定这是否可能。

感谢您的任何帮助或建议。

标签: pythonmachine-learningnlptf-idf

解决方案


您可以添加 tf-idf 矩阵,它仍然有些相关,但是,向量之后不会被归一化,并且它们的归一化本身并不比向量化容易。对于基于相似度得分(可以用 tfidf 计算)的聚类数据,强烈建议使用归一化向量。另外,请记住,如果您真的想通过加法将这两者合二为一,则它们的词汇表必须相同,否则将毫无意义(甚至尺寸会有所不同)。此外,问题在于 tf-idf 的性质,如果某个术语出现在一个数据集中的许多文档中,而在其他几个文档中,他添加的 tf-idf 分数可能不会像从 skratch 计算的那样好和相关。所以我对你最好的建议确实如你所说

再次重新计算 TF-IDF 分数

对于 5000 个标题(如果合并 idk 则为 10000 个),它仍然不会花费超过一些合理的时间(取决于您的机器,在我的机器上大约 5-10 分钟),然后保存此矩阵以不再进行计算就可以了一个很大的帮助。


推荐阅读