2016-04-20 1 views
1

J'essaie de répliquer Go Et Al. Twitter sentiment analyse qui peut être trouvé ici http://help.sentiment140.com/for-students Le problème que je rencontre est le nombre de fonctionnalités est 364464. J'utilise actuellement nltk et nltk.NaiveBayesClassifier pour ce faire où les tweets contient une réplication des tweets 1,600,000 et là la polarité:Python nltk classifier avec grand ensemble de fonctionnalités (Répliquer 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)) 

Tout ne prend pas beaucoup de temps en dehors de la fonction extract_features

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

en effet, pour chaque tweet est la création d'un dictionnaire de taille 364464 pour représenter si quelque chose est présent ou non.

Existe-t-il un moyen de rendre ceci plus rapide ou plus efficace sans réduire le nombre de fonctionnalités comme dans ce document?

+0

Je me demande pourquoi vous ne voulez pas utiliser les mêmes techniques que dans le document. Quoi qu'il en soit, les étapes de base de la PNL que vous pourriez prendre incluent: supprimer les mots vides, faire une vectorisation tfidf et supprimer les mots moins communs ou très communs ... Ceux-ci supprimeraient également des fonctionnalités, mais d'une manière différente. Comme je l'ai dit, je ne suis pas vraiment sûr de ce que vous voulez faire. – lrnzcig

+0

Je courais dans les problèmes de mémoire comme vous pouvez l'imaginer, mais j'ai réussi à le résoudre. Merci pour la réponse – Adam

Répondre

0

Transforme là-bas est une fonction merveilleuse appelée: nltk.classify.util.apply_features() que vous pouvez trouver herehttp: //www.nltk.org/api/nltk.classify.html

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

J'ai dû changer ma fonction extract_features mais cela fonctionne maintenant avec les tailles énormes sans problèmes de mémoire.

Voici une verité de la description de la fonction:

L'objectif principal de cette fonction est d'éviter la mémoire frais généraux liés à stocker tous les featuresets pour chaque jeton dans un corpus. Au lieu de cela, ces featuresets sont construits paresseusement, au besoin. La réduction de la surcharge mémoire peut être particulièrement significative lorsque la liste sous-jacente de jetons est elle-même paresseuse (comme c'est le cas avec de nombreux lecteurs de corpus).

et ma fonction changé:

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