【问题标题】:Piecemeal training NaiveBayesClassifier (NLTK)零碎训练 NaiveBayesClassifier (NLTK)
【发布时间】:2014-04-21 04:15:46
【问题描述】:

我有很多文本数据,我想进行分类。我按块递增地获取这些数据(例如 500 个示例)。 我想用这些块在 NLTK 中训练 NaiveBayesClassifier,但要进行零碎训练。

我可以用一个卡盘执行训练 NaiveBayesClassifier,然后用于训练下一个块等吗?

我在文档中找不到这个问题的答案。

【问题讨论】:

  • 零碎训练是什么意思?
  • 例如:首先,我只有 500 个训练数据样本,但一段时间后我会有另一个(新的)500 个训练数据样本等。但我不想等待,而我获取所有数据(因为时间和内存空间很昂贵)。所以,我想用一块数据训练分类器,经过一段时间用于训练下一块数据等。
  • 这看起来很相关:link.springer.com/article/10.1007%2Fs12555-011-0099-1 但我希望看到真正的 python 实现 =)

标签: nltk bayesian text-classification


【解决方案1】:

我能想到的有两种选择:

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

  2. 外部化内部模型,然后手动更新。这 NaiveBayesClassifier 可以通过给它一个直接创建 label_prodistfeature_probdist。你可以创建这些 分别将它们传递给NaiveBayesClassifier,然后更新 每当有新数据进来时,分类器就会使用这个新的 立即数据。您必须查看火车方法以了解详细信息 关于如何更新您特定的概率分布 案例/需求。

如果您使用选项 2并且您不介意为了水平可扩展性而牺牲 一点速度,您可以通过以下方式在 Redis 中保留模型创建一个 ProbDistI 子类,它使用 Redis 哈希进行存储/查找。那么你就不用对语料库做任何酸洗了,分类器总是“开启”的。

【讨论】:

    【解决方案2】:

    您可能应该使用 scikit-learn 的 NLTK 包装器并使用 scikit-learn 提供的朴素贝叶斯实现。这个支持进行部分拟合,这正是您想要的:一次只训练一部分数据。

    参考:http://www.nltk.org/_modules/nltk/classify/scikitlearn.htmlhttp://scikit-learn.org/stable/modules/naive_bayes.html

    【讨论】:

      【解决方案3】:

      Weka 有一个可更新的朴素贝叶斯实现。

      【讨论】:

      • 这个答案几乎没有细节。你能扩展一下吗?
      猜你喜欢
      • 2014-01-16
      • 2015-01-20
      • 2020-03-16
      • 1970-01-01
      • 2018-03-07
      • 2019-01-17
      • 2023-03-11
      • 2018-12-21
      • 2014-10-25
      相关资源
      最近更新 更多