我正在尝试使用 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/