n-grams con clasificador Naive Bayes

Soy nuevo en Python y necesito ayuda! Estaba practicando con la clasificación de texto Python NLTK. Aquí está el ejemplo de código que estoy practicando en http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/

He probado este

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))) 

Pero recibiendo este error, ¿por qué?

  Traceback (most recent call last): File "C:\python\naive_test.py", line 76, in  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' 

Un vector de características de bigtwig sigue exactamente los mismos principios que un vector de características de unigram. Entonces, al igual que en el tutorial que mencionó, tendrá que comprobar si una característica de bigtwig está presente en alguno de los documentos que utilizará.

En cuanto a las características del bigtwig y cómo extraerlas, he escrito el código a continuación. Simplemente puede adoptarlos para cambiar la variable “tweets” en el tutorial.

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

¡En lugar de imprimirlos, simplemente puede agregarlos a la lista de “tweets” y listo! Espero que esto sea lo suficientemente útil. De lo contrario, avísame si todavía tienes problemas.

Tenga en cuenta que en aplicaciones como el análisis de sentimientos, algunos investigadores tienden a tokenizar las palabras y eliminar la puntuación, y otros no. Por experiencia, sé que si no eliminas las puntuaciones, Naive Bayes funciona casi igual, sin embargo, un SVM tendría una tasa de precisión reducida. Es posible que deba jugar con estas cosas y decidir qué funciona mejor en su conjunto de datos.

Edición 1:

Hay un libro llamado “Procesamiento de lenguaje natural con Python” que se lo recomiendo. Contiene ejemplos de bigtwigs y algunos ejercicios. Sin embargo, creo que incluso puedes resolver este caso sin él. La idea detrás de la selección de bigtwigs y características es que queremos saber la probabilidad de que la palabra A aparezca en nuestro cuerpo, seguida de la palabra B. Entonces, por ejemplo, en la oración

“Conduzco un camión”

las características de la palabra unigram serían cada una de esas 4 palabras, mientras que las características de la palabra bigtwig serían:

[“Yo conduzco”, “conduzco un”, “un camión”]

Ahora quieres usar esos 3 como tus características. Así que la siguiente función de código coloca todos los bigtwigs de una cadena en una lista llamada bigramFeatureVector .

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

Tenga en cuenta que debe escribir su propia función removePunctuation . Lo que obtienes como resultado de la función anterior es el vector de características de bigtwig. Lo tratará exactamente de la misma manera que los vectores de características de Unigram se tratan en el tutorial que mencionó.