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

时间:2015-09-15 16:57:03

标签: python machine-learning 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功能才能执行此操作?

1 个答案:

答案 0 :(得分:11)

您可以编写自定义函数来覆盖内置的预处理器和标记器。

来自文档:

  

预处理器 - 一个可调用的文件,它将整个文档作为输入(作为单个字符串),并返回文档的可能转换版本,仍然作为整个字符串。这可用于删除HTML标记,小写整个文档等。

     

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

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

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

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