字数统计

时间:2018-12-07 19:45:35

标签: pandas scikit-learn tf-idf

我有一个具有大基数(+1000)的分类变量。这些值中的每一个可以在每个训练/测试实例中重复出现。

尽管这并不是真正的文本数据,但它似乎具有相似的属性,我想将其视为文本分类问题。

我的出发点是一个数据框,其中列出了每个“文档”中每个“单词”的出现次数,例如

{'Word1': {0: '1',
1: '3',
2: '0',
3: '0',
4: '0'},
'Word2': {0: '0',
1: '2',
2: '0',
3: '0',
4: '0'}

我想将tfidf转换应用于这些“单词”计数。我怎样才能做到这一点?

sklearn.feature_extraction.text.TfidfVectorizer似乎期望将字符串或文件序列作为输入进行预处理和标记化。在这种情况下,这些都没有必要,因为我已经有了“单词”计数。

那么如何获得这些计数的tfidf转换?

1 个答案:

答案 0 :(得分:0)

我遇到过类似的情况,我试图从字数重建TF-IDF 尝试下面的代码,为我工作。

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["The dog ate a sandwich and I ate a sandwich",
          "The wizard transfigured a sandwich"]
vectorizer = TfidfVectorizer(stop_words='english')
tfidfs = vectorizer.fit_transform(corpus)


from collections import Counter
import pandas as pd

columns = [k for (v, k) in sorted((v, k)
           for k, v in vectorizer.vocabulary_.items())]
tfidfs = pd.DataFrame(tfidfs.todense(),
                      columns=columns)
#     ate   dog  sandwich  transfigured  wizard 
#0   0.75  0.38      0.54          0.00    0.00
#1   0.00  0.00      0.45          0.63    0.63

df = (1 / pd.DataFrame([vectorizer.idf_], columns=columns))
#     ate   dog  sandwich  transfigured  wizard
#0   0.71  0.71       1.0          0.71    0.71
corp = [txt.lower().split() for txt in corpus]
corp = [[w for w in d if w in vectorizer.vocabulary_] for d in corp]
tfs = pd.DataFrame([Counter(d) for d in corp]).fillna(0).astype(int)
#    ate  dog  sandwich  transfigured  wizard
#0    2    1         2             0       0
#1    0    0         1             1       1

# The first document's TFIDF vector:
tfidf0 = tfs.iloc[0] * (1. / df)
tfidf0 = tfidf0 / pd.np.linalg.norm(tfidf0)
#        ate       dog  sandwich  transfigured  wizard
#0  0.754584  0.377292  0.536893           0.0     0.0

tfidf1 = tfs.iloc[1] * (1. / df)
tfidf1 = tfidf1 / pd.np.linalg.norm(tfidf1)
#    ate  dog  sandwich  transfigured    wizard
#0   0.0  0.0  0.449436      0.631667  0.631667