无法让 NLTK-Trainer 识别/使用 scikit-learn 分类器
Posted
技术标签:
【中文标题】无法让 NLTK-Trainer 识别/使用 scikit-learn 分类器【英文标题】:Can't get NLTK-Trainer to recognize/ work with scikit-learn classifiers 【发布时间】:2015-10-28 10:31:03 【问题描述】:我一直在使用(优秀的)NLTK-Trainer 来训练 NaiveBayes 分类器来对文本的 sn-ps 进行分类。我看到 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):
-
我的另一个假设是 Anaconda 附带的 scikit-learn 文件位于 NLTK-Trainer 找不到它们的地方。根据 Jacob Perkins 的建议 (comment),我可以运行“from nltk.classify import scikitlearn”命令而不会出错。但是,当我进一步查看此处的 nltk-trainer/args.py 代码 (code) 时,我无法运行“导入命令”之后的代码。所有这些行都会引发错误。
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
这真的很令人沮丧,我无法完全弄清楚为什么它不起作用。任何帮助将不胜感激!
【问题讨论】:
如果您无法执行from sklearn.feature_extraction.text import TfidfTransformer
或任何其他 sklearn 导入命令,则意味着 scikit-learn 库不可导入。这可能是 Anaconda 的问题,但也许你可以这样做 pip install -U scikit-learn
。
【参考方案1】:
argparse
只是接受命令行参数并解析它们的代码。它不使用这些论点或对这些论点采取行动。这是通过以下代码完成的。解析器只是看门人,确保您的输入看起来正确。
我不熟悉NLTK-Trainer
,但我可以看到它的解析器在做什么。
从错误消息中可以清楚地看出,您的论点“sklearn.BernoulliNB”正在通过。但是--classifier
参数被设置为只接受choices
列表中的一个字符串。 ['NaiveBayes', 'DecisionTree',...]
。它不接受任何名称或模块引用。
程序可能会采用一个可接受的名称并将其映射到其他一些函数、模块或参数。
尝试使用-h
或--help
调用此代码,以查看它接受哪些参数。并转到程序文档以查看它对输入的说明。也许还有其他方法可以指定替代算法。 --classifier
显然设置为仅接受一组预定义的值。
【讨论】:
你是对的,它给出的选项是默认值,但是在查看 nltk-trainer args.py 文件之后,它看起来像是试图找到一个工作的 scikit-learn 库,如果它确实,它添加了额外的 sk.learn 选项。有“def”代码来添加 sklearn 参数,但只有在找到 scikit-learn 时才可以。 args.py 文件的链接在原始问题中,如果您想查看所有内容。 好的,这样的选择列表可以是动态的,从环境中填充。问题出在上游,例如导入。以上是关于无法让 NLTK-Trainer 识别/使用 scikit-learn 分类器的主要内容,如果未能解决你的问题,请参考以下文章