Н-грамм с наивным байесовским классификатором
Я новичок в Python и нуждаюсь в помощи! Я практиковался с текстовой классификацией Python NLTK. Вот пример кода, который я практикую на http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/
Я пробовал это
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'
1 ответ
Вектор элементов биграммы следует тем же принципам, что и вектор элементов униграммы. Итак, так же, как и в упомянутом вами руководстве, вам нужно будет проверить, присутствует ли функция биграммы в каком-либо из документов, которые вы будете использовать. Что касается функций биграммы и способов их извлечения, я написал нижеприведенный код. Вы можете просто принять их, чтобы изменить переменную "твиты" в учебнике.
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", которую я могу порекомендовать вам. Он содержит примеры биграмм, а также некоторые упражнения. Тем не менее, я думаю, что вы даже можете решить это дело без него. Идея выбора биграмм как элементов заключается в том, что мы хотим знать вероятность того, что слово A появится в нашем корпусе, за которым следует слово B. Так, например, в предложении "Я езжу на грузовике" слово "символы униграммы" будет эти 4 слова, в то время как особенности слова биграмм будут: [Я вожу, вожу, грузовик]. Теперь вы хотите использовать эти 3 в качестве своих функций. Таким образом, функция кода ниже помещает все биграммы строки в список с именем 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. То, что вы получаете в качестве результата вышеупомянутой функции, является вектором функции биграммы. Вы будете относиться к нему точно так же, как к векторам элементов униграмм в упомянутом учебнике.