为什么sklearn的TfidfVectorizer在我传递词汇参数时返回一个空矩阵,而当我不传递时却没有?



我正试图使用以下代码获取一组文档的tf idf:

documents = ['iADV díltudNOUN iADV gaibidVERB gabálNOUN', 'iADV díthNOUN dérnumNOUN iADP foileNOUN', ...]
vocab = ['aADP', 'aDET', 'aPRON', 'achtSCONJ', 'amalSCONJ', 'arADP', 'arPRON', ...]
vectorizer = TfidfVectorizer(analyzer='word', token_pattern=r"(?u)b[wáéíóúↄḟṁṅæǽ⁊ɫ֊̃]+b", vocabulary=vocab)
vectors = vectorizer.fit_transform(documents)
print(vectors)

当我这样做的时候,矩阵是空的。如果我尝试print([vectors]),我可以看到矩阵的形状,但其中没有数据。

[<42x79 sparse matrix of type '<class 'numpy.float64'>'
with 0 stored elements in Compressed Sparse Row format>]

奇怪的是,当我删除vocabulary=vocab参数时,我可以获得文档中所有单词的tf idf,不过,我真的不希望它适用于所有单词:

vectorizer = TfidfVectorizer(analyzer='word', token_pattern=r"(?u)b[wáéíóúↄḟṁṅæǽ⁊ɫ֊̃]+b")
vectors = vectorizer.fit_transform(documents)
print(vectors)
(0, 564)  0.09058331497564333
(0, 313)  0.09058331497564333
(0, 93)   0.08155482537999634
(0, 165)  0.06268804803234075
(0, 169)  0.09058331497564333
...

当我传递vocabulary参数时,是什么导致我的矩阵为空?我的token_pattern有什么问题吗?

问题来自于默认参数lowercase,它等于True。所以,你所有的文本都是小写的。如果你把你的词汇表改成小写,它就会起作用:

vocab=[v.lower() for v in vocab]

您也可以将参数lowercase更改为False

最新更新