为什么当我传递词汇参数时 sklearn 的 TfidfVectorizer 返回一个空矩阵,而不是当我不传递时?
Why is sklearn's TfidfVectorizer returning an empty matrix when I pass an argument for vocabulary, but not when I don't?
我正在尝试使用以下代码获取一组文档的 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
我正在尝试使用以下代码获取一组文档的 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