正克用朴素贝叶斯分类器(n-grams with Naive Bayes classifier)

2019-07-17 12:00发布

进出口新的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'

Answer 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将有一个下降的准确率。 您可能需要玩这个东西,并决定哪些作品在你的数据集更好。

编辑1:

有一个名为“自然语言处理与Python”的书,我可以把它推荐给你。 它包含双字母组的例子,以及一些练习。 不过,我认为你甚至可以解决这种情况下,没有它。 选择背后的想法二元语法一个特点是,我们想知道这个词A将出现在我们的语料库后跟字B.因此,例如在句子中probabilty

“我开卡车”

字单字组特征将是每个这样的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功能。 你得到的是上面的函数的输出是二元特征向量。 你将把它完全相同的方式单字组特征向量在你提到的教程处理。



文章来源: n-grams with Naive Bayes classifier