我有很多文本数据,我想进行分类。我按块递增地获取这些数据(例如 500 个示例)。我想用这些块在 NLTK 中训练 NaiveBayesClassifier,但要进行零碎的训练。
我可以用一个夹头执行训练 NaiveBayesClassifier,然后用于训练下一个块等吗?
我在文档中找不到这个问题的答案。
我有很多文本数据,我想进行分类。我按块递增地获取这些数据(例如 500 个示例)。我想用这些块在 NLTK 中训练 NaiveBayesClassifier,但要进行零碎的训练。
我可以用一个夹头执行训练 NaiveBayesClassifier,然后用于训练下一个块等吗?
我在文档中找不到这个问题的答案。
您可能应该使用 scikit-learn 的 NLTK 包装器并使用 scikit-learn 提供的朴素贝叶斯实现。这个支持进行部分拟合,这正是你想要的:一次只训练一部分数据。
参考资料:http ://www.nltk.org/_modules/nltk/classify/scikitlearn.html和http://scikit-learn.org/stable/modules/naive_bayes.html
我能想到2个选项:
定期根据新数据重新训练分类器。您将在语料库中积累新的训练数据(已经包含原始训练数据),然后每当您获得下一个块时,重新训练并重新加载分类器。这可能是最简单的解决方案。
外部化内部模型,然后手动更新。NaiveBayesClassifier
可以通过给它 a
和
label_prodist
a来直接创建feature_probdist
。您可以单独创建它们,将它们传递给 a NaiveBayesClassifier
,然后在新数据进入时更新它们。分类器将立即使用这些新数据。您必须查看 train 方法以获取有关如何更新特定案例/需求的概率分布的详细信息。
如果您使用选项 2 ,并且不介意为了水平可扩展性而牺牲一点ProbDistI
速度,则可以通过创建一个使用 Redis 哈希进行存储/查找的子类将模型持久保存在 Redis 中。然后你不必对语料库做任何酸洗,分类器总是“打开”的。
Weka 有一个可更新的朴素贝叶斯实现。