Python Can';t让NLTK培训师识别/使用scikit学习分类器

Python Can';t让NLTK培训师识别/使用scikit学习分类器,python,nltk,argparse,Python,Nltk,Argparse,我一直在使用(优秀的)NLTK训练器来训练NaiveBayes分类器对文本片段进行分类。我看到NLTK Trainer还支持scikit学习算法,我希望使用这些算法来减少内存使用/提高准确性 但是,当我在运行train_classifier.py时尝试指定一个scikit学习分类器时,它会抛出一个错误: train_classifier.py: error: argument --classifier/--algorithm: invalid choice: 'sklearn.Bernoulli

我一直在使用(优秀的)NLTK训练器来训练NaiveBayes分类器对文本片段进行分类。我看到NLTK Trainer还支持scikit学习算法,我希望使用这些算法来减少内存使用/提高准确性

但是,当我在运行train_classifier.py时尝试指定一个scikit学习分类器时,它会抛出一个错误:

train_classifier.py: error: argument --classifier/--algorithm: invalid choice: 'sklearn.BernoulliNB' (choose from 'NaiveBayes', 'DecisionTree', 'Maxent', 'GIS', 'IIS', 'MEGAM', 'TADM')
我正在Windows7上运行Python 3.4.3的32位Anaconda发行版(2.20)。“pip冻结”给了我以下信息:NLTK 3.0.4,scikit学习0.16.1。我相信我正在使用最新版本的NLTK Trainer(我一个月前下载的)

在做了一些研究之后,我有两种理论来解释问题所在: 1.有某种arg解析错误没有通过--classifier sklearn.BernoulliNB来正确训练_classifier.py。在我对错误进行回溯后,它会给出以下信息

nltk\u数据\nltk培训师大师\nltk培训师大师\train\u分类器.py in()
131 nltk_trainer.classification.args.add_sklearn_args(解析器)
132
-->133 args=parser.parse_args()
134
parse_args(self、args、命名空间)中的AppData\Local\Continuum\Anaconda3\lib\argparse.py
1726     # =====================================
1727 def parse_args(self,args=None,namespace=None):
->1728 args,argv=self.parse_known_args(args,名称空间)
1729如果argv:
1730 msg=(('无法识别的参数:%s')
1765除参数错误外:
1766错误=_sys.exc_info()[1]
->1767自我错误(str(err))
1768
1769定义解析已知参数(self,参数字符串,命名空间):

  • 我的另一个假设是,Anaconda附带的scikit学习文件位于NLTK Trainer找不到的地方。根据Jacob Perkins在此处的建议(),我可以毫无错误地运行“from nltk.classify import scikitlearn”命令。但是,当我在这里进一步查看nltk trainer/args.py代码()时,我无法在“import命令”后面运行代码。所有这些行都会抛出错误
  • 从sklearn.feature\u extraction.text导入
    从sklearn.pipeline导入管道
    从sklearn导入集成、特征选择、线性模型、朴素贝叶斯、邻居、支持向量机、树


    这真的很令人沮丧,我不知道为什么它不起作用。任何帮助都将不胜感激

    argparse
    就是接受命令行参数并对其进行解析的代码。它不使用这些论点,也不根据这些论点行事。这是通过以下代码完成的。解析器只是看门人,确保您的输入看起来是正确的

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

    从错误消息中可以清楚地看出,您的论点“sklearn.BernoulliNB”正在通过。但是
    --classifier
    参数设置为只接受
    选项
    列表中的一个字符串<代码>['NaiveBayes','DecisionTree',…]。它不接受任何名称或模块引用

    程序很可能采用一个可接受的名称,并将其映射到其他函数、模块或参数上


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

    您是对的,它给出的选项是默认值,但在查看nltk trainer args.py文件后,它似乎试图找到一个工作的scikit学习库,如果找到了,它会添加额外的sk.learn选项。有“def”代码来添加sklearn参数,但只要找到scikit learn即可。如果您想查看args.py文件的所有内容,则原始问题中有指向args.py文件的链接。好的,这样的选项列表可以是动态的,从环境中填充。如果您无法从sklearn.feature\u extraction.text import tfidf transformer或任何其他sklearn导入命令执行
    ,则表示scikit学习库不可导入。这可能是Anaconda的问题,但您可以执行
    pip安装-U scikit learn