2012-12-22 1 views
5

Im новый для python и нужна помощь! Я практиковал классическую текстовую классификацию Python NLTK. Вот пример кода я практикуя на http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/n-граммы с классификатором Naive Bayes

Ive пытался это один

from nltk import bigrams 
from nltk.probability import ELEProbDist, FreqDist 
from nltk import NaiveBayesClassifier 
from collections import defaultdict 

train_samples = {} 

with file ('positive.txt', 'rt') as f: 
    for line in f.readlines(): 
     train_samples[line]='pos' 

with file ('negative.txt', 'rt') as d: 
    for line in d.readlines(): 
     train_samples[line]='neg' 

f=open("test.txt", "r") 
test_samples=f.readlines() 

def bigramReturner(text): 
    tweetString = text.lower() 
    bigramFeatureVector = {} 
    for item in bigrams(tweetString.split()): 
     bigramFeatureVector.append(' '.join(item)) 
    return bigramFeatureVector 

def get_labeled_features(samples): 
    word_freqs = {} 
    for text, label in train_samples.items(): 
     tokens = text.split() 
     for token in tokens: 
      if token not in word_freqs: 
       word_freqs[token] = {'pos': 0, 'neg': 0} 
      word_freqs[token][label] += 1 
    return word_freqs 


def get_label_probdist(labeled_features): 
    label_fd = FreqDist() 
    for item,counts in labeled_features.items(): 
     for label in ['neg','pos']: 
      if counts[label] > 0: 
       label_fd.inc(label) 
    label_probdist = ELEProbDist(label_fd) 
    return label_probdist 


def get_feature_probdist(labeled_features): 
    feature_freqdist = defaultdict(FreqDist) 
    feature_values = defaultdict(set) 
    num_samples = len(train_samples)/2 
    for token, counts in labeled_features.items(): 
     for label in ['neg','pos']: 
      feature_freqdist[label, token].inc(True, count=counts[label]) 
      feature_freqdist[label, token].inc(None, num_samples - counts[label]) 
      feature_values[token].add(None) 
      feature_values[token].add(True) 
    for item in feature_freqdist.items(): 
     print item[0],item[1] 
    feature_probdist = {} 
    for ((label, fname), freqdist) in feature_freqdist.items(): 
     probdist = ELEProbDist(freqdist, bins=len(feature_values[fname])) 
     feature_probdist[label,fname] = probdist 
    return feature_probdist 



labeled_features = get_labeled_features(train_samples) 

label_probdist = get_label_probdist(labeled_features) 

feature_probdist = get_feature_probdist(labeled_features) 

classifier = NaiveBayesClassifier(label_probdist, feature_probdist) 

for sample in test_samples: 
    print "%s | %s" % (sample, classifier.classify(bigramReturner(sample))) 

но получаю эту ошибку, почему?

Traceback (most recent call last): 
    File "C:\python\naive_test.py", line 76, in <module> 
    print "%s | %s" % (sample, classifier.classify(bigramReturner(sample))) 
    File "C:\python\naive_test.py", line 23, in bigramReturner 
    bigramFeatureVector.append(' '.join(item)) 
AttributeError: 'dict' object has no attribute 'append' 
+0

Почему вы не используете 'Weka', это ваше задание? –

+0

этот код для bi-gram –

ответ

11

Атрибут функции bigram следует за теми же принципами, что и векторный векторный набор. Итак, точно так же, как упомянутый вами учебник, вам нужно будет проверить, присутствует ли функция bigram в любом из документов, которые вы будете использовать. Что касается функций bigram и как их извлечь, я написал для него код ниже. Вы можете просто принять их, чтобы изменить переменную «твиты» в учебнике.

import nltk 
text = "Hi, I want to get the bigram list of this string" 
for item in nltk.bigrams (text.split()): print ' '.join(item) 

Вместо того чтобы печатать их, вы можете просто добавить их в список «твитов», и вы готовы к работе! Надеюсь, это будет полезно. В противном случае, дайте мне знать, если у вас все еще есть проблемы. Обратите внимание, что в таких приложениях, как анализ настроений, некоторые исследователи склонны символизировать слова и удалять пунктуацию, а некоторые другие - нет. Из опыта я знаю, что если вы не удаляете пунктуации, наивные байки работают почти одинаково, однако SVM будет иметь уменьшенную точность. Возможно, вам придется поиграть с этим материалом и решить, что лучше работает на вашем наборе данных. Edit1: Существует книга под названием «Обработка естественного языка с помощью Python», которую я могу вам порекомендовать. Он содержит примеры биграмм, а также некоторые упражнения. Однако, я думаю, вы даже можете решить это дело без него. Идея выбора характеристик bigrams заключается в том, что мы хотим знать вероятность того, что в нашем корпусе появится слово A, за которым следует слово B. Так, например, в предложении «Я вожу грузовик» функции «unigram» будут каждый из эти 4 слова, в то время как функции слова «bigram» будут: [я вожу, диск, грузовик]. Теперь вы хотите использовать эти 3 в качестве своих функций. Таким образом, функция кода bellow помещает все биграммы строки в список с именем bigramFeatureVector.

def bigramReturner (tweetString): 
    tweetString = tweetString.lower() 
    tweetString = removePunctuation (tweetString) 
    bigramFeatureVector = [] 
    for item in nltk.bigrams(tweetString.split()): 
     bigramFeatureVector.append(' '.join(item)) 
    return bigramFeatureVector 

Обратите внимание, что вам необходимо написать собственную функцию removePunctuation. То, что вы получаете в качестве вывода вышеупомянутой функции, - это вектор функции bigram. Вы будете относиться к нему точно так же, как векторы объектов униграмм рассматриваются в упомянутом вами учебнике.

+0

действительно спасибо за ваши советы! Я попробую с ним лучше всего! – Aikin

+0

ahhhh не понимаю, как использовать bigrams в python ... есть ли какие-нибудь учебники? – Aikin

+0

Проверьте мое редактирование выше. Думаю, теперь это должно быть яснее! – user823743