【问题标题】:Which 10 words has the highest TF-IDF value in each document / total?每个文档/总数中哪 10 个词的 TF-IDF 值最高?
【发布时间】:2021-02-20 21:31:21
【问题描述】:

我正在尝试为每个文档获取 10 个最高 TF-IDF 分数的单词。

我的数据框中有一列包含来自我的各种文档的预处理文本(没有标点符号、停用词等)。在本例中,一行表示一个文档。

它有超过 500 行,我很好奇每一行中最重要的单词。

所以我运行了以下代码:

from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
vectors = vectorizer.fit_transform(df['liststring'])
feature_names = vectorizer.get_feature_names()
dense = vectors.todense()
denselist = dense.tolist()
df2 = pd.DataFrame(denselist, columns=feature_names)

这给了我一个 TF-IDF 矩阵:

我的问题是,如何收集具有最高 TF-IDF 值的前 10 个单词?最好在我的原始数据框 (df) 中创建一列,其中包含每行的前 10 个单词,但也知道哪些单词是最重要的。

【问题讨论】:

    标签: python pandas scikit-learn tf-idf tfidfvectorizer


    【解决方案1】:

    20newsgroups 数据集的最小可重现示例是:

    from sklearn.datasets import fetch_20newsgroups
    from sklearn.feature_extraction.text import TfidfVectorizer
    
    X,y = fetch_20newsgroups(return_X_y = True)
    tfidf = TfidfVectorizer()
    X_tfidf = tfidf.fit_transform(X).toarray()
    vocab = tfidf.vocabulary_
    reverse_vocab = {v:k for k,v in vocab.items()}
    
    feature_names = tfidf.get_feature_names()
    df_tfidf = pd.DataFrame(X_tfidf, columns = feature_names)
    
    idx = X_tfidf.argsort(axis=1)
    
    tfidf_max10 = idx[:,-10:]
    
    df_tfidf['top10'] = [[reverse_vocab.get(item) for item in row] for row in tfidf_max10 ]
    
    df_tfidf['top10']
    
    0        [this, was, funky, rac3, bricklin, tellme, umd...
    1        [1qvfo9innc3s, upgrade, experiences, carson, k...
    2        [heard, anybody, 160, display, willis, powerbo...
    3        [joe, green, csd, iastate, jgreen, amber, p900...
    4        [tom, n3p, c5owcb, expected, std, launch, jona...
                                   ...                        
    11309    [millie, diagnosis, headache, factory, scan, j...
    11310    [plus, jiggling, screen, bodin, blank, mac, wi...
    11311    [weight, ended, vertical, socket, the, westes,...
    11312    [central, steven, steve, collins, bolson, hcrl...
    11313    [california, kjg, 2101240, willow, jh2sc281xpm...
    Name: top10, Length: 11314, dtype: object
    

    要获得 TfIdf 最高的前 10 个功能,请使用:

    global_top10_idx = X_tfidf.max(axis=0).argsort()[-10:]
    np.asarray(feature_names)[global_top10_idx]
    

    如果有不清楚的地方请追问。

    【讨论】:

    • 非常感谢谢尔盖,非常感谢您的详细解决方案!它与我的数据配合得很好,但不幸的是,最终全球前 10 个单词没有给出正确的结果。我检查了我是否将 df_tfidf['top10'] 导出到 excel 中,然后我做了一个数据透视并得到了不同的结果,但我确信 df_tfidf['top10'] 是正确的。看起来是否按字母顺序排列,因为在我的数据集中所有单词都以字母“a”开头,而在您的 20newsgroups 数据集中,所有单词都是数字。
    • 你能试试global_top10_idx = X_tfidf.max(axis=0).argsort()[-10:]吗?
    • 不幸的是,这也不能正常工作,但我使用以下代码得到了正确的结果:import collections slist = [] for x in df_tfidf ['top10']: slist.extend (x) counter = collections.Counter (slist) print (counter.most_common (n = 10))
    • 我怀疑我们对全球前 10 个单词有不同的定义。我的是那些具有最高 tfidf 列的人。你可以选择一个你觉得舒服的。无论如何,从任何定义来看,我的原件都是错误的。感谢您指出这一点!
    • 是的,确实,我们误会了!无论如何,你的回答对我很有帮助。独自一人,我可能无法解决问题。再次感谢!
    猜你喜欢
    • 2019-06-09
    • 2018-03-23
    • 2017-07-05
    • 2021-01-22
    • 2014-04-04
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多