2014-02-11 5 views
0

Я пытаюсь запустить анализ настроений. Мне удалось использовать Naive Bayes через nltk, чтобы классифицировать корпус отрицательных и положительных твитов. Однако я не хочу проходить процесс запуска этого классификатора каждый раз, когда я запускаю эту программу, поэтому я пытался использовать pickle для сохранения, а затем загружать в другой скрипт классификатор. Однако, когда я пытаюсь запустить скрипт, возвращает ошибку NameError: имя классификатор не определен, хотя я думал, что это было определено через ДЕФ load_classifier():Загрузка классификатора с использованием Pickle?

код у меня есть атм ниже:

import nltk, pickle 
from nltk.corpus import stopwords 

customstopwords = [''] 

p = open('xxx', 'r') 
postxt = p.readlines() 

n = open('xxx', 'r') 
negtxt = n.readlines() 

neglist = [] 
poslist = [] 

for i in range(0,len(negtxt)): 
    neglist.append('negative') 

for i in range(0,len(postxt)): 
    poslist.append('positive') 

postagged = zip(postxt, poslist) 
negtagged = zip(negtxt, neglist) 


taggedtweets = postagged + negtagged 

tweets = [] 

for (word, sentiment) in taggedtweets: 
    word_filter = [i.lower() for i in word.split()] 
    tweets.append((word_filter, sentiment)) 

def getwords(tweets): 
    allwords = [] 
    for (words, sentiment) in tweets: 
      allwords.extend(words) 
    return allwords 

def getwordfeatures(listoftweets): 
    wordfreq = nltk.FreqDist(listoftweets) 
    words = wordfreq.keys() 
    return words 

wordlist = [i for i in getwordfeatures(getwords(tweets)) if not i in     stopwords.words('english')] 
wordlist = [i for i in getwordfeatures(getwords(tweets)) if not i in customstopwords] 


def feature_extractor(doc): 
    docwords = set(doc) 
    features = {} 
    for i in wordlist: 
     features['contains(%s)' % i] = (i in docwords) 
    return features 


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

def load_classifier(): 
    f = open('my_classifier.pickle', 'rb') 
    classifier = pickle.load(f) 
    f.close 
    return classifier 

while True: 
    input = raw_input('I hate this film') 
    if input == 'exit': 
     break 
    elif input == 'informfeatures': 
     print classifier.show_most_informative_features(n=30) 
     continue 
    else: 
     input = input.lower() 
     input = input.split() 
     print '\nSentiment is ' + classifier.classify(feature_extractor(input)) + ' in that sentence.\n' 

p.close() 
n.close() 

Любая помощь была бы замечательной, кажется, что сценарий делает это для печати '\ nSentiment is' + classifier.classify (feature_extractor (input)) + 'в этом предложении. \ N' "перед возвратом ошибки ...

ответ

1

Ну, у вас есть объявлено и определено метод load_classifier(), но он никогда не назывался и присвоено значение переменной. Это означает, что к тому моменту выполнение достигает линии print '\nSentiment is... ', нет имен переменных classifier. Естественно, выполнение выдает исключение.

Добавить строку classifier = load_classifier() непосредственно перед тем, как цикл. (без каких-либо углублений)

Смежные вопросы