Scikit Learn – 从特征数组语料库而非原始文档语料库计算TF-IDF

Scikit-Learn的TfidfVectorizer将一组原始文档转换为TF-IDF特征矩阵。我希望不是从原始文档,而是从特征名称矩阵转换为TF-IDF特征。

你提供给fit_transform()的语料库应该是一个原始文档数组,但我希望能够提供一个每篇文档的特征数组的数组。例如:

corpus = [    ['orange', 'red', 'blue'],    ['orange', 'yellow', 'red'],    ['orange', 'green', 'purple (if you believe in purple)'],    ['orange', 'reddish orange', 'black and blue']]

… 而不是一个一维的字符串数组。

我知道我可以为TfidfVectorizer定义自己的词汇表,所以我可以轻松地创建一个包含语料库中唯一特征及其在特征向量中的索引的字典。但该函数仍然期望原始文档,由于我的特征长度不一且偶尔会重叠(例如,’orange’和’reddish orange’),我不能简单地将特征连接成单一字符串并使用ngrams。

有没有我没找到的其他Scikit-Learn函数可以用于此目的?我是否有办法使用TfidfVectorizer而我没有发现?还是我必须自己编写一个TF-IDF函数来实现这个功能?


回答:

你可以编写自定义函数来覆盖内置的预处理器和分词器。

根据文档:

预处理器 – 一个可调用的对象,接受整个文档作为输入(作为单一字符串),并返回可能转换后的文档版本,仍然作为整个字符串。这可以用来移除HTML标签,将整个文档转换为小写等。

分词器 – 一个可调用的对象,接受预处理器的输出并将其分割成标记,然后返回这些标记的列表。

在这种情况下,没有预处理要执行(因为没有原始文档)。分词也是不必要的,因为我们已经有了特征数组。因此,我们可以这样做:

tfidf = TfidfVectorizer(preprocessor=lambda x: x, tokenizer=lambda x: x)tfidf_matrix = tfidf.fit_transform(corpus)

我们通过简单地传递lambda x: x来跳过预处理器和分词器步骤。一旦内置的分析器接收到特征数组,它会自己构建词汇表,并像往常一样对“分词”后的语料库执行TF-IDF计算。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注