2016-07-13 20 views
0

Ich habe zig thounds von Tweets in einer TXT-Datei gespeichert, ich mag den höchsten tf-idf Wert der ersten berechnen berechnen 100 Wörter in diesen tweeets, mit anderen Worten, ich möchte das Wort des tf-idf Wert zwischen verschiedenen Tweets vergleichen, gegenwärtig, das einzige, was ich vollenden könnte, ist Wort des tf-idf Wert in den gleichen Tweets zu vergleichen, kann ich nicht einen Weg finden, um den tf-idf-Wert eines Wortes zwischen verschiedenen Tweets zu vergleichen.Python-how den höchsten tf-idf Wert der ersten 100 Worte in verschiedenen tweeets berechnen

Bitte helfen Sie mir, ich habe wegen dieses Problems für eine lange Zeit den Haufen geworfen worden. /(ㄒ o ㄒ)/~~

Schlag mein Code: (nur in der Lage der Laufzeit der TFIDF Wert in gleichen Tweets zu berechnen)

with open('D:/Data/ows/ows_sample.txt','rb') as f: 
    tweet=f.readlines() 
lines = csv.reader((line.replace('\x00','') for line in tweet), delimiter=',', quotechar='"') 
wordterm=[] 
for i in lines: 
    i[1]= re.sub(r'http[s]?://(?:[a-z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+|(?:@[\w_]+)', "", i[1]) 
    tweets=re.split(r"\W+",i[1]) 
    tweets=[w.lower() for w in tweets if w!=""] 
    stopwords = open("D:/Data/ows/stopwords.txt", "r").read().split() 
    terms = [t for t in tweets if not t in stopwords] 
    wordterm.append(terms) 

word=[' '.join(t) for t in wordterm] 
tfidf_vectorizer = TfidfVectorizer(min_df = 1,use_idf=True) 
tfidf_matrix = tfidf_vectorizer.fit_transform(word) 
terms_name = tfidf_vectorizer.get_feature_names() 
toarry=tfidf_matrix.todense() 

#below code will output the tf-idf value of each tweets' terms. 
for ii in range(0,len(toarry)): 
    print u"第"+ ii +u"个tweets" 
    for jj in range(0,len(terms_name)): 
     print terms_name[jj],'-',tfidf_matrix[ii,jj] 

Antwort

1

Nun, da ich verstehe Ihre Frage, werde ich versuchen, beantworte deine Frage etwas besser.

Um die 100 besten 'tf-idf'-Werte in einer Weise zu erhalten, die über alle Tweets hinweg vergleichbar ist, würde das bedeuten, dass Sie den Gedanken loslassen, dass es Tweets gibt oder Sie den Vergleich machen wollen gleiche Worte miteinander durch tf-IDF-Score.

So für das erste Szenario vorstellen, dass alle Wörter in 1 ‚Dokument‘ sind. Dies würde den 'idf'-Aspekt von tf-idf im Wesentlichen eliminieren, und was Sie erhalten, ist im Grunde ein Wortzähl-Vektorisierer, der miteinander verglichen werden kann, und Sie können die oberen 100 Wörter auf diese Weise erhalten.

words = ['the cat sat on the mat cat cat'] 
tfidf_vectorizer = TfidfVectorizer(min_df = 1,use_idf=True) 
tfidf_matrix = tfidf_vectorizer.fit_transform(words) 
terms_name = tfidf_vectorizer.get_feature_names() 
toarry=tfidf_matrix.todense() 

toarry: 
    matrix([ .75, 0.25, 0.25, 0.25, 0.5]) 

Das andere Szenario ist, dass Sie jeden tweet separat nehmen, und dann vergleichen Sie die Noten durch ihre tf-idf-Scores. Dies würde in den gleichen Worten ergeben sich unterschiedliche Werte haben, denn das ist, was tf-idf tut - er die Bedeutung des Wortes in dem Dokument in Bezug auf den Korpus berechnet.

words = ['the cat sat on the mat cat', 'the fat rat sat on a mat', 'the bat and a rat sat on a mat'] 
tfidf_vectorizer = TfidfVectorizer(min_df = 1,use_idf=True) 
tfidf_matrix = tfidf_vectorizer.fit_transform(words) 
terms_name = tfidf_vectorizer.get_feature_names() 
toarry=tfidf_matrix.todense() 
for i in tfidf_matrix.toarray(): 
    print zip(terms_name, i) 

[(u'and', 0.0), (u'bat', 0.0), (u'cat', 0.78800079617844954), (u'fat', 0.0), (u'mat', 0.23270298212286766), (u'on', 0.23270298212286766), (u'rat', 0.0), (u'sat', 0.23270298212286766), (u'the', 0.46540596424573533)] 
[(u'and', 0.0), (u'bat', 0.0), (u'cat', 0.0), (u'fat', 0.57989687146162439), (u'mat', 0.34249643393071422), (u'on', 0.34249643393071422), (u'rat', 0.44102651785124652), (u'sat', 0.34249643393071422), (u'the', 0.34249643393071422)] 
[(u'and', 0.50165133177159349), (u'bat', 0.50165133177159349), (u'cat', 0.0), (u'fat', 0.0), (u'mat', 0.29628335772067432), (u'on', 0.29628335772067432), (u'rat', 0.38151876810273028), (u'sat', 0.29628335772067432), (u'the', 0.29628335772067432)] 

Wie Sie in den Ergebnissen sehen kann, werden die gleichen Worte in jedem Dokument unterschiedliche Werte aufweisen, da TF-IDF eine Punktzahl dieses Begriffs innerhalb jedes Dokuments ist. Dies sind also die beiden verfügbaren Methoden. Je nachdem, was Sie wollen, können Sie wählen, was für Ihre Zwecke besser ist.

+0

Dies sollte ein Kommentar sein, keine Antwort –

+0

Ja, aber sieht aus wie ich brauche 50 Ruf zu kommentieren ... –

+0

Ah, ich dachte, es war 10. Nun, besser posten einige * tatsächliche * Antworten;) (I gekennzeichnet es für sie es auf einen Kommentar für Sie konvertieren kann sowieso, also vielleicht mod) –