在 NLTK 中实现词袋朴素贝叶斯分类器

2024-01-24

我基本上有和这个人有同样的问题 https://stackoverflow.com/questions/2162718/python-nltk-code-snippet-to-train-a-classifier-naive-bayes-using-feature-frequ.. The NLTK书中的例子 http://nltk.googlecode.com/svn/trunk/doc/book/ch06.html#document-classify-all-words对于朴素贝叶斯分类器,仅考虑单词是否作为特征出现在文档中。它不考虑单词的频率作为要查看的特征(“词袋”)。

答案之一 https://stackoverflow.com/a/2226115/378622似乎表明这不能用内置的 NLTK 分类器来完成。是这样吗?如何使用 NLTK 进行频率/词袋 NB 分类?


scikit学习 http://scikit-learn.org has 多项式朴素贝叶斯的实现 http://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes,这是这种情况下朴素贝叶斯的正确变体。不过,支持向量机 (SVM) 可能会工作得更好。

正如 Ken 在评论中指出的那样,NLTK 已经scikit-learn 分类器的一个很好的包装器 https://github.com/nltk/nltk/blob/master/nltk/classify/scikitlearn.py。根据文档修改,这里有一个有点复杂的模型,它执行 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 上进行训练。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 NLTK 中实现词袋朴素贝叶斯分类器 的相关文章

随机推荐

  • Delphi 的 VCL 中的命名空间兼容性

    如何最好地保持 Delphi 7 到 Delphi XE7 之间使用的命名空间的兼容性 Delphi 7 使用 SysUtils 而 Delphi XE7 使用 System SysUtils 它使用许多 ifdef 使代码变得混乱 所以我
  • 如何从 wsdl 生成 Web 服务

    客户端向我提供了 wsdl 来生成 Web 服务 但是当我使用 wsdl exe 命令时 它生成了 cs 类 我在 Web 服务中使用了该类 当我向客户端提供 wsdl 时 它与他们的架构不匹配 实际上 我希望从 wsdl 自动生成 asm
  • 在 MySQL 中将 dd/mm/yyyy 字符串转换为 Unix 时间戳

    在我的表中 我有一个名为的 varchar 列date包含 dd mm yyyy 格式的日期字符串表示形式 如何在 SELECT 查询中将它们转换为 Unix 时间 select unix timestamp str to date 30
  • NSURLRequest 到 NSString

    如何将 NSURLRequest 转换为 NSString NSString urlRequestToString NSURLRequest urlRequest NSString requestPath urlRequest URL ab
  • 使用 CloudKit 共享私有数据

    有没有一种简单的方法可以使用 CloudKit 在两个或多个用户之间共享私有数据 公共和私人日期是显而易见的 但似乎没有一种方法可以允许一组用户组织自己的孤岛以在彼此之间共享数据 而不将其提供给系统的所有其他用户和应用程序开发人员 我想到了
  • DAX 测试整数

    我有一个实际值列 如下所示 ID Airport A 98 4 B 98 0 C 95 3 我正在尝试将上面的数字格式化为前端报告的百分比 我将其写在 switch 语句中 为了方便起见 我将逻辑编写为 IF 布尔值 example mea
  • Yii2:从 URL 中删除控制器

    我正在使用高级模板 我在 SiteController 上创建了所有操作 因此我所有的 url 都是domain com site something 并且我需要从 url 中删除 site 一词 这样它将是domain com somet
  • 在 XAML 中显示窗口内的页面

    我的窗口中有一个选项卡控件 在每个选项卡项内我想要有一个不同的页面 我可以通过在 TabItem 内创建一个 Frame 并在后面的代码中使用来实现此目的 例如 frame1 Content new Pages MyPage 我怎样才能在
  • 为什么 Facebook 调试器工具无法抓取我的网站?

    我有一个网站http predictstat com http predictstat com 它由 Django 提供支持 我想确保当用户将此网站的链接发布到 Facebook 时 那里会显示一个漂亮的预览图像 标题和描述 也可以使用不同
  • BitBucket 和合并冲突

    我有一个代码源 有 3 个分支 master Branch 1 Branch 2 我正在尝试Branch 2当另一个程序员正在工作时Branch 1 在本地提取任何更改后 我最近将更改推送到了我的分支 然后我将我的分支与主分支合并 我现在正
  • 如何创建一个自动让用户登录到 devise/rails 的链接?

    我正在尝试让注册用户在我的网站上执行某些操作 因此我想通过电子邮件向他们发送直接指向此操作的链接 问题是我希望他们在单击此链接时自动登录 我可以做一些显而易见的事情 例如创建一个唯一的令牌并通过 url 传递它mysite com my f
  • 使用不同的最终分隔符连接字符串数组

    一般来说 如何连接字符串数组以使最后一个分隔符与其他分隔符不同 具体来说 iOS消息应用程序如何构建群组对话的默认名称 即联系人姓名列表 Example class User var name String init name String
  • C++ boost asio Windows 文件句柄 a​​sync_read_until 无限循环 - 无 eof

    我在 VS2010 中使用 boost 1 50 使用 aWindows 文件句柄 与使用套接字的 asio 相比 这似乎相对不常见 Problem The handle read回调到达第 8 行并返回第一位 并附加第 1 行的所有内容
  • Laravel - Artisan 给出了错误的基本 url

    我的 app config app php 有 url gt http dev domain com something somethingElse 然后我有一个可以从应用程序和 artisan 命令调用的函数 但URL route myR
  • Laravel 5 列出 htmlentities() 期望参数 1 为字符串

    我有以下内容 App Models Finance FinanceAccount lists name id 在我的一个观点的顶部 但它一直给我错误 htmlentities expects parameter 1 to be string
  • 关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题

    我已经研究了 3 周如何使用 PHPMailer for GoDaddy 配置 SMTP 但没有任何效果 尝试联系 GoDaddy 支持 但他们尚未回复 我还没有看到任何关于如何在他们的服务器上设置 SMTP 的文档 我已经多次更改主机并进
  • Google 地图地理编码器从 MySQL 数据库查找附近的地点

    我有一个网站 我将位置存储在 MySQL 数据库中 并使用数据库提供的地址进行地理编码 现在我想添加一个功能 它将找到距离指定点最近的位置 例如他们现在站立或打字的位置 我正在使用 JavaScript 和 jQuery 编写地理编码器和谷
  • 更改 ruby​​ 变量/引用的值

    我只是偶然发现了一些我不太明白的事情 我知道 ruby 中的变量是引用 所以那些很棒的事情是可能的 但是当我将变量传递给方法时 它的行为很奇怪 my var a nothing happend to me my var b nothing
  • install_github是否递归安装依赖项?

    R 包devtools似乎是直接从 github 存储库安装 R 包的方法 使用install github 功能 这样做时 不仅会安装所寻址的 github 包 还会安装其直接的 CRAN 依赖项 即包的描述 命名空间文件中定义的依赖项和
  • 在 NLTK 中实现词袋朴素贝叶斯分类器

    我基本上有和这个人有同样的问题 https stackoverflow com questions 2162718 python nltk code snippet to train a classifier naive bayes usi