3

我目前正在使用 NLTK 的朴素贝叶斯分类器,但我也想尝试 Max Ent 分类器。从文档看来,它应该采用与朴素贝叶斯相同的功能集格式,但由于某种原因,当我尝试它时出现此错误:

  File "/usr/lib/python2.7/site-packages/nltk/classify/maxent.py", line 323, in train
    gaussian_prior_sigma, **cutoffs)
  File "/usr/lib/python2.7/site-packages/nltk/classify/maxent.py", line 1453, in train_maxent_classifier_with_scipy
    model.fit(algorithm=algorithm)
  File "/usr/lib64/python2.7/site-packages/scipy/maxentropy/maxentropy.py", line 1026, in fit
    return model.fit(self, self.K, algorithm)
  File "/usr/lib64/python2.7/site-packages/scipy/maxentropy/maxentropy.py", line 226, in fit
    callback=callback)
  File "/usr/lib64/python2.7/site-packages/scipy/optimize/optimize.py", line 636, in fmin_cg
    gfk = myfprime(x0)
  File "/usr/lib64/python2.7/site-packages/scipy/optimize/optimize.py", line 176, in function_wrapper
    return function(x, *args)
  File "/usr/lib64/python2.7/site-packages/scipy/maxentropy/maxentropy.py", line 420, in grad
    G = self.expectations() - self.K
ValueError: shape mismatch: objects cannot be broadcast to a single shape

我不确定这意味着什么,但我使用的输入与我运行朴素贝叶斯时使用的输入完全相同,并且有效。(训练数据,表示为对列表,其中第一个成员是特征集,并且第二个是分类标签。)有什么想法吗?

谢谢!

4

3 回答 3

3

我在使用 NLTK 时也遇到了这个问题。虽然我无法令人满意地解决它(即使用 scipy 让 Maxent 工作),但当我使用不同的算法时,我能够在 NLTK 中训练一个 maxent 分类器。尝试训练

me_classifier = nltk.MaxentClassifier.train(trainset,algorithm="iis")

或其他可接受的算法值之一,例如“gis”或“megam”。

于 2012-05-05T03:54:25.490 回答
1

此问题还取决于您使用的 scipy 版本。

NLTK 使用 scipy.maxentropy,它在 scipy 0.10 中已弃用并在 0.11 中删除,请参阅文档:http ://docs.scipy.org/doc/scipy-0.10.0/reference/maxentropy.html#

我确实在 github 上为此创建了一个问题:https ://github.com/nltk/nltk/issues/307

于 2012-11-12T21:57:42.103 回答
0

你必须安装 nltk 然后你才能分类。使用下面的代码在 python 中使用最大熵进行分类

me_classifier = nltk.MaxentClassifier.train(trainset,algorithm="gis")
print(me_classifier.classify(testing))
于 2017-03-16T09:23:43.300 回答