0

我有一个下面的数据帧df,这是我从sframe的Python:如何计算TF-IDF的大型数据集

URI           name   text 
0 <http://dbpedia.org/resource/Digby_M...  Digby Morrell digby morrell born 10 october 1979 i... 
1 <http://dbpedia.org/resource/Alfred_...  Alfred J. Lewy alfred j lewy aka sandy lewy graduat... 
2 <http://dbpedia.org/resource/Harpdog...  Harpdog Brown harpdog brown is a singer and harmon... 
3 <http://dbpedia.org/resource/Franz_R... Franz Rottensteiner franz rottensteiner born in waidmann... 
4 <http://dbpedia.org/resource/G-Enka>     G-Enka henry krvits born 30 december 1974 i... 

我已经做了转换的以下内容:

from textblob import TextBlob as tb 

import math 

def tf(word, blob): 
    return blob.words.count(word)/len(blob.words) 

def n_containing(word, bloblist): 
    return sum(1 for blob in bloblist if word in blob.words) 

def idf(word, bloblist): 
    return math.log(len(bloblist)/(1 + n_containing(word, bloblist))) 

def tfidf(word, blob, bloblist): 
    return tf(word, blob) * idf(word, bloblist) 

bloblist = [] 

for i in range(0, df.shape[0]): 
    bloblist.append(tb(df.iloc[i,2])) 

for i, blob in enumerate(bloblist): 
    print("Top words in document {}".format(i + 1)) 
    scores = {word: tfidf(word, blob, bloblist) for word in blob.words} 
    sorted_words = sorted(scores.items(), key=lambda x: x[1], reverse=True) 
    for word, score in sorted_words[:3]: 
     print("\tWord: {}, TF-IDF: {}".format(word, round(score, 5))) 

但这需要很多时间,因为有59000文件。

有没有更好的方法来做到这一点?

回答

1
  • 我很困惑这个问题。但我使用Spark在互联网上找到了一些解决方案。在这里,你可以看看:

    https://www.linkedin.com/pulse/understanding-tf-idf-first-principle-computation-apache-asimadi

  • 在另一方面我想theese方法,我没有得到不好的结果。也许你想尝试:

    • 我有一个单词列表。此列表包含单词,它是计数。
    • 我找到了这个单词的平均数。
    • 我选择了平均值的下限和上限。
      (例如下限=平均值/ 2和上限=平均值* 5)
    • 然后我创建了一个带有上限和下限的新单词列表。
  • 随着theese我得到theese结果:
    正常化字矢量长度之前:11880
    平均数:19下界:9的上限:95
    正常化字矢量长度之后:1595

  • 余弦相似性结果也更好。

相关问题