无法让NLTK-Trainer识别/使用scikit-learn分类器

时间:2015-08-05 14:58:21

标签: python nltk argparse

我一直在使用(优秀的)NLTK-Trainer来训练NaiveBayes分类器来分类文本片段。我看到NLTK-Trainer也支持scikit-learn算法,我希望使用它们以减少内存使用/提高准确性。

但是,当我在运行train_classifier.py时尝试指定其中一个scikit-learn分类符时,会抛出错误:

train_classifier.py: error: argument --classifier/--algorithm: invalid choice: 'sklearn.BernoulliNB' (choose from 'NaiveBayes', 'DecisionTree', 'Maxent', 'GIS', 'IIS', 'MEGAM', 'TADM')

我正在Windows 7上运行Python 3.4.3的32位Anaconda发行版(2.20)。" pip freeze"给我以下内容:NLTK 3.0.4,scikit-learn 0.16.1。我相信我使用的是最新版本的NLTK-Trainer(我在一个月前下载过它)。

在做了一些研究后,我有两种理论可以解决出错的问题: 1.有一种arg解析错误没有正确地将--classifier sklearn.BernoulliNB传递给train_classifer.py。在我对错误进行追溯之后,它给了我这个

nltk_data\nltk-trainer-master\nltk-trainer-master\train_classifier.py in <module>() 131 nltk_trainer.classification.args.add_sklearn_args(parser) 132 --> 133 args = parser.parse_args() 134 AppData\Local\Continuum\Anaconda3\lib\argparse.py in parse_args(self, args, namespace) 1726 # ===================================== 1727 def parse_args(self, args=None, namespace=None): -> 1728 args, argv = self.parse_known_args(args, namespace) 1729 if argv: 1730 msg = _('unrecognized arguments: %s') 1765 except ArgumentError: 1766 err = _sys.exc_info()[1] -> 1767 self.error(str(err)) 1768 1769 def _parse_known_args(self, arg_strings, namespace):

  1. 我的另一个假设是,Anaconda附带的scikit-learn文件位于NLTK-Trainer无法找到它们的地方。 Per Jacob Perkins&#39;这里的建议(comment)我可以从nltk.classify导入scikitlearn&#39;运行&#39;命令没有错误。但是,当我在这里(code)深入研究nltk-trainer / args.py代码时,我无法在&#39; import命令之后运行代码&#39;。所有这些行都会出错。
  2. from sklearn.feature_extraction.text import TfidfTransformer from sklearn.pipeline import Pipeline from sklearn import ensemble, feature_selection, linear_model, naive_bayes, neighbors, svm, tree

    这真是令人沮丧,我无法理解为什么它不起作用。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

argparse只是获取命令行参数并解析它们的代码。它不会对这些论点使用或采取行动。这是通过以下代码完成的。解析器只是看门人,确保您的输入看起来正确。

我不熟悉NLTK-Trainer,但我可以看到它的解析器正在做什么。

从错误消息中可以清楚地看到你的论点,&#39; sklearn.BernoulliNB&#39;正在通过。但--classifier参数设置为仅接受choices列表中的一个字符串。 ['NaiveBayes', 'DecisionTree',...]。它不接受任何名称或模块引用。

程序可能采用可接受的名称并将其映射到其他功能,模块或参数。

尝试使用-h--help调用此代码,以查看它加入的参数。然后转到程序文档以查看它对输入的说明。也许还有其他一些方法来指定替代算法。 --classifier显然设置为仅接受一组预定义的值。