2016-04-20 8 views
1

Ich versuche Go Et Al zu replizieren. Twitter Sentiment Analyse, die hier gefunden werden kann http://help.sentiment140.com/for-students Das Problem, das ich habe, ist die Anzahl der Funktionen ist 364464. Ich verwende derzeit nltk und nltk.NaiveBayesClassifier zu tun, wo Tweets eine Replikation der 1.600.000 Tweets hält und dort Polarität:Python nltk klassifizieren mit großem Funktionsumfang (Replicate Go Et Al 2009)

for tweet in tweets: 
    tweet[0] = extract_features(tweet[0], features) 

classifier = nltk.NaiveBayesClassifier.train(training_set) 
# print "NB Classified" 
classifier.show_most_informative_features() 
print(nltk.classify.util.accuracy(classifier, testdata)) 

Alles dauert nicht sehr lange außer dem extract_features funktioniert

def extract_features(tweet, featureList): 
    tweet_words = set(tweet) 
    features = {} 
    for word in featureList: 
     features['contains(%s)' % word] = (word in tweet_words) 
    return features 

Dies liegt daran, für jeden einen Wörterbuch der Größe 364464 es tweet Schaffung darzustellen, ob etwas vorhanden ist oder nicht.

Gibt es eine Möglichkeit, dies schneller oder effizienter zu machen, ohne die Anzahl der Funktionen wie in diesem Dokument zu reduzieren?

+0

Ich frage mich, warum Sie nicht die gleichen Techniken wie in dem Papier verwendet werden sollen. Wie auch immer, grundlegende NLP-Schritte, die Sie ergreifen könnten, sind: Entfernen von Stoppwörtern, Ausführen einer Tfidf-Vektorisierung und Entfernen von weniger gebräuchlichen oder sehr häufigen Wörtern ... Diese würden auch Merkmale entfernen, aber nur auf eine andere Weise. Wie gesagt, ich bin mir nicht sicher, was du machen willst. – lrnzcig

+0

Ich habe Speicher Probleme wie Sie sich vorstellen können, aber ich habe es geschafft, es zu lösen. Danke für die Antwort – Adam

Antwort

0

Stellt sich heraus, es ist eine wunderbare Funktion aufgerufen: nltk.classify.util.apply_features() , die Sie finden können herehttp: //www.nltk.org/api/nltk.classify.html

training_set = nltk.classify.apply_features(extract_features, tweets) 

Ich musste meine extract_features Funktion ändern, aber es funktioniert jetzt mit den großen Größen ohne Speicherprobleme.

Hier ist ein lowdown der Funktionsbeschreibung:

Der primäre Zweck dieser Funktion ist es, den Speicher-Overhead in die Speicherung aller featuresets für jedes Token in einem Korpus beteiligt zu vermeiden. Stattdessen werden diese Feature-Sets nach Bedarf konstruiert. Die Verringerung des Speicheraufwands kann besonders signifikant sein, wenn die zugrunde liegende Liste von Token selbst faul ist (wie es bei vielen Korpuslesern der Fall ist).

und meine geänderte Funktion:

def extract_features(tweet): 
     tweet_words = set(tweet) 
     global featureList 
     features = {} 
     for word in featureList: 
      features[word] = False 
     for word in tweet_words: 
      if word in featureList: 
       features[word] = True 
     return features