【问题标题】:how to compute TF-IDF on dataset?如何在数据集上计算 TF-IDF?
【发布时间】:2020-04-13 13:02:08
【问题描述】:

我有文章的数据集以及这些文章中每个单词出现的次数: 如何计算TF-IDF?

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns; sns.set()
from sklearn.cluster import KMeans
import pandas as pd
import sklearn as sk
import math 

data = pd.read_csv('D:\\Datasets\\NIPS_1987-2015.csv', index_col ="word")

# retrieving row by loc method
first = data["1987_1"]
second = data["1987_2"]

print(first, "\n\n\n", second)

我得到了这个数据库:

word
abalone        0
abbeel         0
abbott         0
abbreviate     0
abbreviated    0
          ..
zoo            0
zoom           0
zou            0
zoubin         0
zurich         0
Name: 1987_1, Length: 11463, dtype: int64 


 word
abalone        0
abbeel         0
abbott         0
abbreviate     0
abbreviated    0
          ..
zoo            0
zoom           0
zou            0
zoubin         0
zurich         0
Name: 1987_2, Length: 11463, dtype: int64

那么从这里如何计算 TF-IDF?有什么建议?我应该转换成字典还是有另一种可能性?

【问题讨论】:

  • 你能提供一些数据吗?你期望出来的是什么?在我看来,这就像您正在导入一个单词数组,并且您正在使用单词作为索引......到目前为止,输出是否符合您的预期?还是有什么不符合您的预期?
  • 每个单词出现的次数。是的,像索引这样的词。两篇文章都有很多零。例如鲍鱼不在这 2 篇文章中,但出现在另一篇文章中。目前,我只检查这两篇文章。但例如我有一个单词“written”,在 1987_1 中出现 1,在 1987_2 中出现 3

标签: python pandas numpy tf-idf tfidfvectorizer


【解决方案1】:

您可以执行以下操作。假设您得到了docs,它是pd.Series 对象的列表,每个对象代表单个文档的词频分布。

然后你可以重建一个语料库(单词的顺序并不重要,只是频率对 TF-IDF 很重要)。

最后,您使用sklearn.feature_extraction.text.TfidfVectorizer 将您的语料库转换为 TF-IDF 值。

注意:这假设您的文本(一旦重建)可以适合内存。大多数数据集都是。但如果不是这样,并且如果你想直接从docs 获得 TF-IDF,你可能必须自己实现它。

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

# docs = [pd.Series(...), pd.Series(..), ...]

rep_docs = [" ".join(d.repeat(d).index.values) for d in docs]

tfidf = TfidfVectorizer()
tfidf.fit(rep_docs)
res = tfidf.transform(rep_docs[:1])

print(res)
print(tfidf.vocabulary_)

产生,

# TF IDF values
(0, 10) 0.2773500981126146
(0, 8)  0.2773500981126146
(0, 5)  0.8320502943378437
(0, 4)  0.2773500981126146
(0, 1)  0.2773500981126146

# Vocabulary
{'sat': 8, 'the': 10, 'mat': 4, 'bark': 1, 'moon': 5, 'on': 7, 'at': 0, 'swam': 9, 'to': 11, 'ocean': 6, 'fish': 3, 'cat': 2}

【讨论】:

  • 谢谢它真的有帮助!我尝试做功能,它非常复杂,我几乎得到了它,但你的选择是最快的。谢谢!
  • 关于词汇。例如,我有 2 篇文章中出现的“工作”一词(第一篇文章中的 1 篇,第二篇文章中的 3 篇)那么为什么我只看到第一篇文章中的值而看不到第二篇文章中的值?另外,第一列表示文件的数量? (带零的列)
猜你喜欢
  • 2017-02-03
  • 2018-05-26
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多