2016-04-20 1 views
1

Я пытаюсь реплицировать Go Et Al. Анализ настроений в Twitter, который можно найти здесь http://help.sentiment140.com/for-students Проблема, с которой я столкнулась, - это количество функций 364464. В настоящее время я использую nltk и nltk.NaiveBayesClassifier, чтобы сделать это, когда твиты содержат репликацию из 1,600,000 твитов и там полярность:Python nltk классифицируют с помощью большого набора функций (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)) 

Все не очень долго, кроме как 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 

Это происходит потому, что для каждого чирикать это создания словаря размером 364,464 представлять ли что-то присутствует или нет.

Есть ли способ сделать это быстрее или эффективнее, не уменьшая количество функций, как в этой статье?

+0

Интересно, почему вы не хотите использовать те же методы, что и в работе. В любом случае, основные шаги NLP, которые вы могли бы предпринять, включают в себя: удаление стоп-слов, выполнение векторизации tfidf и удаление менее распространенных или очень распространенных слов ... Они также удаляли бы функции, но только по-другому. Как я уже сказал, я не совсем уверен, что вы хотите сделать. – lrnzcig

+0

Я сталкивался с проблемами памяти, как вы можете себе представить, но мне удалось это решить. Спасибо за ответ – Adam

ответ

0

Оказывается, есть замечательная функция называется: nltk.classify.util.apply_features() которые вы можете найти herehttp: //www.nltk.org/api/nltk.classify.html

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

Мне пришлось изменить функцию extract_features, но теперь она работает с огромными размерами без проблем с памятью.

Вот подноготная описания функции:

Основная цель этой функции, чтобы избежать накладных расходов памяти, участвующих в хранении всех featuresets для каждого маркера в корпус. Вместо этого эти аксессуры создаются лениво, по мере необходимости. Уменьшение издержек памяти может быть особенно значительным, когда основной список токенов сам ленив (как в случае со многими считывателями корпусов).

и моя изменилась функция:

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 
Смежные вопросы