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计算。