【问题标题】:Why is sklearn's TfidfVectorizer returning an empty matrix when I pass an argument for vocabulary, but not when I don't?为什么 sklearn 的 TfidfVectorizer 在我传递词汇表参数时返回一个空矩阵,但当我不传递时却没有?
【发布时间】:2021-08-16 18:30:17
【问题描述】:

我正在尝试使用以下代码获取一组文档的 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 有问题吗?

【问题讨论】:

    标签: python scikit-learn tfidfvectorizer


    【解决方案1】:

    问题来自默认参数lowercase,它等于True。因此,您的所有文本都转换为小写。如果您将词汇表更改为小写,它将起作用:

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

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

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 2021-12-24
      • 2021-10-21
      • 2017-11-16
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2017-10-12
      相关资源
      最近更新 更多