当前位置: 首页 > 面试题库 >

在NLTK中实现单词袋Naive-Bayes分类器

云光明
2023-03-14
问题内容

我基本上和这个人有同样的问题..
NLTK书中针对朴素贝叶斯分类器的示例仅考虑单词是否在文档中作为特征出现。它不考虑单词的出现频率作为特征。看一下(“词袋”)。

答案之一似乎表明,内置NLTK分类器无法做到这一点。是这样吗
如何使用NLTK进行频率/词袋NB分类?

为了进行培训,请创建可用于创建ProbDists的适当的FreqDist,然后再将其传递给NaiveBayesClassifier。但是分类实际上适用于使用布尔值而非频率的特征集。因此,如果要基于FreqDist进行分类,则必须实现自己的分类器,该分类器不使用NLTK功能集。


问题答案:

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

正如Ken在评论中指出的那样,NLTK对于scikit-
learn分类器来说是一个很好的包装器
。根据文档进行了修改,这是一个有点复杂的操作,它执行TF-
IDF加权,根据chi2统计量选择1000个最佳功能,然后将其传递给多项式朴素的贝叶斯分类器。(我打赌这有点笨拙,因为我对NLTK或scikit-
learn都不是很熟悉。)

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的培训。



 类似资料:
  • 贝叶斯定理 贝叶斯定理解决了现实生活里经常遇到的问题:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A)。这里先解释什么是条件概率: 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率。其基本求解公式为:。 贝叶斯定理之所以有用,是因为我们在生活中经常遇到这种情况:我们可以很容易直接得出P(A|B),P(B|A)则很难直接

  • NLTK书中有几个单词计数的例子,但实际上它们不是单词计数,而是标记计数。例如,第1章“计算词汇”中说,下面给出了一个单词计数: 然而,它没有-它给出了一个单词和标点符号计数。你怎样才能得到一个真正的字数(忽略标点符号)? 同样,如何获得一个单词中的平均字符数?显而易见的答案是: 但是,这将关闭,因为: len(文本的字符串)是一个字符计数,包括空格 我是不是遗漏了什么?这一定是一个非常常见的NL

  • 问题内容: 我知道如何使用NLTK来获得二元组和三元组的搭配,并将它们应用于我自己的语料库。代码如下。 但是我不确定(1)如何获取特定单词的搭配?(2)NLTK是否具有基于对数似然比的搭配度量? 问题答案: 试试这个代码: 它使用似然测度,还过滤掉不包含“生物”一词的Ngram。

  • 本文向大家介绍问题:朴素贝叶斯(naive Bayes)法的要求是?相关面试题,主要包含被问及问题:朴素贝叶斯(naive Bayes)法的要求是?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 贝叶斯定理、特征条件独立假设 解析:朴素贝叶斯属于生成式模型,学习输入和输出的联合概率分布。给定输入x,利用贝叶斯概率定理求出最大的后验概率作为输出y。

  • 本文向大家介绍在Python中使用NLTK库实现对词干的提取的教程,包括了在Python中使用NLTK库实现对词干的提取的教程的使用技巧和注意事项,需要的朋友参考一下 什么是词干提取? 在语言形态学和信息检索里,词干提取是去除词缀得到词根的过程─—得到单词最一般的写法。对于一个词的形态词根,词干并不需要完全相同;相关的词映射到同一个词干一般能得到满意的结果,即使该词干不是词的有效根。从1968年开