python - 朴素贝叶斯分类(使用 NLTK)

标签 python class types classification nltk

我正在尝试使用 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 问题的数量,它就会开始说它是下一个最受欢迎的问题。在该答案类型压倒所有其他答案之前,只需要几个问题的差异。

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

最佳答案

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

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

学习how to train a classifier ,(以及分类是如何工作的),问题就会消失。

关于python - 朴素贝叶斯分类(使用 NLTK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40967392/

相关文章:

python - 将对象的实例声明为 'global' 内的 '__init__'

java - 将类作为方法中的参数传递并在 If 语句中使用此参数

java - 在 Java 中,List<Object> 与 List< 有何不同?扩展对象>?

c++ - 静态数据成员是否可以在 C++ 中键入其容器类型?

scala - 您可以为 None 指定类型参数或告诉编译器它是一个 Option[String] 吗?

python - 无法通过 ansible 从本地主机运行 python 脚本

python - 如何识别 xarray 中的时间、lon 和 lat 坐标?

python - Selenium Web-Driver 找不到元素(Selenium IDE 确实找到了)

c++ - Int 值急剧变化和段错误

javascript - 在javascript中动态实例化类