【问题标题】:How to incrementally train an nltk classifier如何增量训练 nltk 分类器
【发布时间】:2011-06-21 18:43:05
【问题描述】:

我正在开展一个项目,使用 python nltk 模块和 naivebayes 分类器对文本的 sn-ps 进行分类。我能够对语料库数据进行训练并对另一组数据进行分类,但希望在初始训练后将额外的训练信息输入分类器。

如果我没记错的话,似乎没有办法做到这一点,因为 NaiveBayesClassifier.train 方法需要一组完整的训练数据。有没有办法在不输入原始特征集的情况下添加到训练数据中?

我愿意接受建议,包括其他可以接受新训练数据的分类器。

【问题讨论】:

  • 你终于找到解决这个问题的办法了吗?
  • 我对分类器内部进行了一些修改,以提供新的训练数据而无需重新训练。那是很久以前的事了,所以我记不清了,但我认为这是可行的。在那之后,我在这个项目上没有走得太远,所以它没有投入使用。
  • 好的,谢谢@rog 的回复 :)

标签: python nltk


【解决方案1】:

我知道有 2 个选项:

1) 定期根据新数据重新训练分类器。您将在语料库中积累新的训练数据(已经包含原始训练数据),然后每隔几个小时重新训练并重新加载分类器。这可能是最简单的解决方案。

2) 外部化内部模型,然后手动更新。 NaiveBayesClassifier 可以通过给它一个label_prodist 和一个feature_probdist 来直接创建。您可以单独创建它们,将它们传递给NaiveBayesClassifier,然后在新数据进入时更新它们。分类器将立即使用这些新数据。您必须查看 train 方法以了解有关如何更新概率分布的详细信息。

【讨论】:

  • 感谢雅各布!我希望避免选项 1,因为我怀疑可能存在性能问题(我将有很多单独的分类器)。我将研究选项 2,它也可能有助于持久化分类器(或者至少是知识),并且腌制整个事物会产生一个相当大的文件(再次考虑可伸缩性)。
  • 如果您愿意为了水平可扩展性而牺牲一点速度,您可以通过创建使用 Redis 哈希进行存储/查找的 ProbDistI 子类将模型持久保存在 Redis 中。那你就不用做任何酸洗了,分类器就“永远在线”了。
  • 感谢您的建议。我也在看一些 memcached + 数据库选项。
【解决方案2】:

我只是在学习 NLTK,所以如果我错了,请纠正我。这是使用 NLTK 的 Python 3 分支,可能不兼容。

NaiveBayesClassifier 实例有一个 update() 方法,似乎可以添加到训练数据中:

from textblob.classifiers import NaiveBayesClassifier

train = [
    ('training test totally tubular', 't'),
]

cl = NaiveBayesClassifier(train)
cl.update([('super speeding special sport', 's')])

print('t', cl.classify('tubular test'))
print('s', cl.classify('super special'))

打印出来:

t t
s s

【讨论】:

  • 请注意,textblob 并没有真正通过调整概率来“更新”模型,而是重新训练一个新模型。
【解决方案3】:

正如雅各布所说,第二种方法是正确的方法 并希望有人写代码

https://baali.wordpress.com/2012/01/25/incrementally-training-nltk-classifier/

【讨论】:

    猜你喜欢
    • 2018-10-31
    • 2013-06-13
    • 2016-07-09
    • 2023-03-11
    • 2019-05-04
    • 2013-04-20
    • 2011-12-22
    • 2014-05-06
    • 2018-02-05
    相关资源
    最近更新 更多