我一直在使用(优秀的)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):
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
这真是令人沮丧,我无法理解为什么它不起作用。非常感谢任何帮助!
答案 0 :(得分:1)
argparse
只是获取命令行参数并解析它们的代码。它不会对这些论点使用或采取行动。这是通过以下代码完成的。解析器只是看门人,确保您的输入看起来正确。
我不熟悉NLTK-Trainer
,但我可以看到它的解析器正在做什么。
从错误消息中可以清楚地看到你的论点,&#39; sklearn.BernoulliNB&#39;正在通过。但--classifier
参数设置为仅接受choices
列表中的一个字符串。 ['NaiveBayes', 'DecisionTree',...]
。它不接受任何名称或模块引用。
程序可能采用可接受的名称并将其映射到其他功能,模块或参数。
尝试使用-h
或--help
调用此代码,以查看它加入的参数。然后转到程序文档以查看它对输入的说明。也许还有其他一些方法来指定替代算法。 --classifier
显然设置为仅接受一组预定义的值。