0

Я следующий кадр данных df, который я преобразовал из sframePython: Как рассчитать 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

  • А также результаты подобия косинуса были лучше.