繁体   English   中英

Scikit Learn - 从特征数组的语料库中计算TF-IDF,而不是从原始文档的语料库中计算TF-IDF

[英]Scikit Learn - Calculating TF-IDF from a corpus of arrays of features instead of from a corpus of raw documents

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标记,小写整个文档等。

Tokenizer - 一个可调用的,它从预处理器获取输出并将其拆分为标记,然后返回这些标记的列表。

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

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

我们通过简单地使用lambda x: x传递整个语料库来跳过预处理器和标记器步骤。 一旦内置分析器接收到特征数组,它就会自行构建词汇表并在“标记化”语料库上执行TF-IDF。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM