0

je une trame de données suivante df, que je converti de sframePython: Comment calculer tf-idf pour un grand ensemble de données

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... 

Je l'ai fait ce qui suit:

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))) 

Mais Cela prend beaucoup de temps car il y a 59000 documents.

Y a-t-il une meilleure façon de le faire?

Répondre

1
  • Je suis confus à ce sujet. Mais j'ai trouvé quelques solution sur internet avec l'utilisation de Spark. Ici, vous pouvez consulter:

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

  • D'autre part, j'ai essayé theese méthode et je n'ai pas eu de mauvais résultats. Peut-être que vous voulez essayer:

    • J'ai une liste de mots. Cette liste contient le mot et c'est compte.
    • J'ai trouvé que la moyenne de ces mots compte.
    • J'ai sélectionné la limite inférieure et la limite supérieure avec la valeur moyenne.
      (par exemple limite inférieure = moyenne/2 et limite supérieure = moyenne * 5)
    • Ensuite, j'ai créé une nouvelle liste de mots avec limite supérieure et inférieure.
  • Avec theese j'ai obtenu theese résultat:
    Avant mot de normalisation longueur du vecteur: 11880
    moyenne: 19 limite inférieure: 9 limite supérieure: 95
    Après mot normalisation longueur du vecteur: 1595

  • Et aussi les résultats de similarité de cosinus étaient meilleurs.