【问题标题】:Naive Bayesian Classification (using NLTK)朴素贝叶斯分类(使用 NLTK)
【发布时间】:2017-04-19 10:35:07
【问题描述】:

我正在尝试使用 Python 的 NLTK 进行一些答案类型分类。基本上是在一堆问题上训练它,然后给出一些看不见的问题。

我遇到的问题是,几乎只是将任何问题归类为最常见的答案类型。因此,如果有 200 个问题被标记为“人”,150 个问题被标记为“地点”,那么每个测试问题都被标记为答案类型为“人”。

我知道平衡数据更好,但这似乎是一个非常严格的限制(考虑到我正在使用的测试数据量,这也是不可行的)。我使用的训练数据是这组 5500 个问题:

http://cogcomp.cs.illinois.edu/Data/QA/QC/train_5500.label

这是我的 Python 代码:

import nltk

train = []

with open('data.txt') as f:
    content = f.readlines()

for c in content:
    parts = c.split(' ', 1)
    train.append((dict(q=parts[1].rstrip()), parts[0]))


test = [
    (dict(q='When was the congress of Vienna?')),
    (dict(q='What is the capital of Australia?')),
    (dict(q='Why doesn\'t this classifier work?'))

]

classifier = nltk.classify.NaiveBayesClassifier.train(train)

print classifier.classify_many(test)

它将所有 3 个测试问题分配给“HUM:ind”类,这是训练集中最常见的问题。如果我减少这些 HUM:ind 问题的数量,它就会开始说它是下一个最受欢迎的问题。只需要几个有差异的问题,该答案类型就会压倒所有其他问题。

我错过了什么吗?我没有使用正确的算法吗?考虑到我的训练数据的格式,我应该更改一些参数吗?我的示例与我在网上看到的几个示例非常相似。任何帮助表示赞赏

【问题讨论】:

  • 这是#homework 吗?
  • 不,这是为了工作
  • 我建议跳过nltk,直接转到sklearn

标签: python class types classification nltk


【解决方案1】:

您总是会得到最常见的类别,因为您没有为分类器提供任何有用的功能来使用:如果您必须在没有证据的情况下猜测,最常见的类别就是正确的答案。

分类器只能推理它以前见过的特征名称和特征值。 (新数据由以前从未见过的组合 中的已知特征组成。)但是您的代码只定义了一个“特征”q,并且每种情况下的值都是题。所以所有的测试题都是未知的(因此无法区分)特征值。你不能白手起家。

了解how to train a classifier,(以及分类的工作原理),问题就会迎刃而解。

【讨论】:

  • 哦,我明白了,很公平。但是那我应该怎么做答案类型的分类呢?我只有一个功能,就是问题。
猜你喜欢
  • 2015-12-20
  • 2016-09-28
  • 2012-12-05
  • 2013-12-02
  • 2017-08-30
  • 2012-04-01
  • 1970-01-01
  • 2017-05-19
  • 2014-01-13
相关资源
最近更新 更多