【问题标题】:How do I use use the tfidf-calculating functions in scikit-learn?如何使用 scikit-learn 中的 tf idf-calculation 函数?
【发布时间】:2015-02-11 07:34:08
【问题描述】:

我想使用 scikit-learn 中的 TfidfVectorizer 和相关函数来执行文档分类,但我对它的使用有点困惑(我搜索的其他问题都没有涉及正确的数据格式)。

目前,我的训练数据按以下方式组织:

  1. 从语料库中获取单个文本。
  2. 规范化、标记化(使用 nltk PunktWordTokenizer)、词干(使用 nltk SnowballStemmer)
  3. 过滤掉剩下的低长度和低出现的单词
  4. 标记相应的文字

上述完成后,单个文本如下所示(此处的值是随机的,但对应于每个术语的计数/出现次数):

text = ({"has": 5.0, "love": 12.0, ...}, "Relationships")

而完整的语料库最后看起来像这样:

corpus = [({"has": 5.0, "love": 12.0, ...}, "Relationships"),
          ({"game": 9, "play": 9.0, ...}, "Games"),
          ...,
         ]

如何将这些数据输入TfidfVectorizer()?我是否必须只提供上面的内容(作为字典?作为列表?),还是只提供没有计数的内容?我什么时候提供标签?如果需要,我不介意完全重构我的数据。

不幸的是,关于这个特定函数的文档很少有关于格式化的示例。

【问题讨论】:

  • 你的数值是多少?
  • 我不太确定你的意思是什么,这让我认为我可能对 tfidf 的运作方式存在根本性的误解。你能解释一下吗?
  • 你的原文只有单词,你如何得到你在那里显示的数字(你的字典的值)?
  • 哦,抱歉。数值是每个单词的计数(基本上是给定文档的词频)。我应该更清楚地说明这一点。

标签: python machine-learning scikit-learn classification tf-idf


【解决方案1】:

这就是你将如何使用TfidfVectorizerlook here 了解更多详情)

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> corpus = ['This is the first document.',
              'This is the second second document.',
              'And the third one.',
              'Is this the first document?']
>>> vect = TfidfVectorizer()
>>> X = vect.fit_transform(corpus)
>>> X.todense()

matrix([[ 0.        ,  0.43877674,  0.54197657,  0.43877674,  0.        ,
          0.        ,  0.35872874,  0.        ,  0.43877674],
        [ 0.        ,  0.27230147,  0.        ,  0.27230147,  0.        ,
          0.85322574,  0.22262429,  0.        ,  0.27230147],
        [ 0.55280532,  0.        ,  0.        ,  0.        ,  0.55280532,
          0.        ,  0.28847675,  0.55280532,  0.        ],
        [ 0.        ,  0.43877674,  0.54197657,  0.43877674,  0.        ,
          0.        ,  0.35872874,  0.        ,  0.43877674]])

这是您的文本语料库的数字表示。现在要拟合将文档映射到标签的模型,首先将它们放入目标变量中,标签的长度应该与语料库中的文档数量相匹配:

>>> y = ['Relationships', 'Games', ...]

现在您可以拟合任何模型,例如:

>>> from sklearn.linear_model import SGDClassifier
>>> model = SGDClassifier()
>>> model.fit(X, y)

现在您有了一个可以根据新数据进行评估的拟合模型。预测对新的语料库或文本重复相同的过程。请注意,我使用与以前相同的矢量化器 vect

X_pred = vect.transform(['My new document'])
y_pred = model.predict(X_pred)

如果您想使用自定义标记器,请使用:

vect = TfidfVectorizer(tokenizer=your_custom_tokenizer_function)

【讨论】:

  • y 中标签的顺序必须与语料库中文档的顺序相对应,对吗?另外,我提供给fit_transformcorpus 应该包含 预处理数据还是预处理数据?
  • 是的,同样的顺序。 TfidfVectorizer 对输入进行预处理和标记化,但您可以覆盖提供的自定义函数。您可以像在我的示例中一样传递文档(字符串)列表,也可以传递文件名,看看the docs
  • 啊,太好了。感谢您的快速回复!
猜你喜欢
  • 2019-11-14
  • 2020-01-18
  • 2016-10-11
  • 2014-12-05
  • 2016-11-07
  • 1970-01-01
  • 2018-08-05
  • 2020-11-30
  • 2016-07-02
相关资源
最近更新 更多