实施一袋词朴素贝叶斯分类器在NLTK实施一袋词朴素贝叶斯分类器在NLTK(Implementing

2019-05-13 12:00发布

我基本都有,因为这家伙同样的问题 。该在NLTK书中例子的朴素贝叶斯分类器是否只有一个文件为特征的出现Word认为..它不考虑的话,频率为功能看(“袋的词”)。

答案之一 ,似乎表明这不能与内置的NLTK分类来完成。 是这样吗? 我该怎么办频率/袋的词与NLTK NB分类?

Answer 1:

scikit学习有多项朴素贝叶斯的实现 ,这是朴素贝叶斯在这种情况下,正确的变种。 支持向量机(SVM)可能会更好地工作,虽然。

由于肯在评论中指出,NLTK有用于scikit学习分类一个很好的包装 。 从文档改性,这里有一个稍微复杂的一个没有TF-IDF加权,选择基于一个统计χ2 1000个最好的功能,并且然后传递到这一个多项式朴素贝叶斯分类器。 (我敢打赌,这是有些笨拙,因为我不是超级熟悉或者NLTK或scikit学习。)

import numpy as np
from nltk.probability import FreqDist
from nltk.classify import SklearnClassifier
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

pipeline = Pipeline([('tfidf', TfidfTransformer()),
                     ('chi2', SelectKBest(chi2, k=1000)),
                     ('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)

from nltk.corpus import movie_reviews
pos = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('pos')]
neg = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('neg')]
add_label = lambda lst, lab: [(x, lab) for x in lst]
classif.train(add_label(pos[:100], 'pos') + add_label(neg[:100], 'neg'))

l_pos = np.array(classif.classify_many(pos[100:]))
l_neg = np.array(classif.classify_many(neg[100:]))
print "Confusion matrix:\n%d\t%d\n%d\t%d" % (
          (l_pos == 'pos').sum(), (l_pos == 'neg').sum(),
          (l_neg == 'pos').sum(), (l_neg == 'neg').sum())

这我印:

Confusion matrix:
524     376
202     698

并不完美,但大方得体,考虑到这不是一个超级简单的问题,它只是培训了100/100。



Answer 2:

在NLTK贝叶斯分类器的特点是“名义”,而不是数字。 这意味着他们可以采取离散值(标签)的有限数目的,但它们不能被看作是频率。

于是用贝叶斯分类器,你不能直接使用词频作为feature--你可以做这样的事情,每个文本作为您的功能设置使用50个频繁的话,但这是完全不同的事情

但也许也有在NLTK其它分类依赖于频率。 我不知道,但你看? 我会说这是值得一试。



Answer 3:

  • 把你正在寻找到一个列表中的字符串,分解成词
  • 列表中的每个项目,问:是这个项目的功能,我在我的功能列表。
  • 如果是,添加日志概率为正常,如果不是,忽略它。

如果你的句子有相同的字多次,它只是多次添加probs。 如果这个词多次出现在同一个班,你的训练数据应该反映在字数。

为了增加准确度,计算所有双克,三 - 克等作为单独的特征。

它有助于让你明白到底发生了什么,你需要做的imporve准确性什么手工编写自己的分类。 如果你使用一个预先包装解决方案,它不工作不够好,没有什么可以做这件事。



文章来源: Implementing Bag-of-Words Naive-Bayes classifier in NLTK