带有 Omnicat-bayes 文档的文本分类预定义类别

text classification predefined categories with documents with Omnicat-bayes

我正在使用 omnicat-bayes 来分析文档(文本分类)。有了这个 gem 我可以创建类别和 "feed" 带有文档的类别。目前,这些类别有足够的文档,以便 "good enough" 识别新文档应该放在哪个类别中。

现在在我的 Documents 控制器中的创建操作下有几个步骤。

  1. 正在创建一个新的贝叶斯实例
  2. 创建将要使用的类别
  3. 拿前置文档训练类别
  4. 实际训练类别

(所有这些步骤都在 run_all 函数下)

创建动作:

def create
@document = Document.new(document_params)
@document.case_id = @case.id
 if @document.save
   run_all
   # Running the classify function on reden aanmelding
   classify_one = @bayes.classify(@document.reden_aanmelding)
   document_category = classify_one.to_hash[:top_score_key]
   # Updating the document category by the top key returned by Bayes
   @document.update_attribute(:category, document_category)
   finding_required_records
   # Training Cees Buddy with the document that got saved
   @bayes.train(document_category, @document.reden_aanmelding)
   redirect_to case_path(@case)
 else
   render :new
 end
end

@document.save run_all 函数中(我知道这不是最佳实践)我正在创建上面提到的四个步骤。

现在,在创建函数完成后,贝叶斯实例消失了,可以说 AI 现在又 "stupid" 了。

我的问题是: 什么是合适的位置,我如何才能完成此操作以创建新实例、新类别并向它们提供我的数据库中的文档。 singleton 在这里会很有趣吗?

这是一个非常棘手的问题,因为您可能希望扩展应用程序以处理多个文档。

问题是,生产模式 Rails 应用程序 Web 服务器通常会分叉到多个进程,甚至 运行 分叉到多台机器上。这意味着在一个过程中训练的文档在所有其他过程中都是未知的,即使您使用单例模式也是如此。

因此,只有 omnicat-bayes gem,最好的解决方法是创建某种单独的微服务,运行 在其自己的进程中不执行任何操作不仅仅是流程文件。然后主应用程序应该将处理排队到异步作业中,这样如果训练过程忙于其他文档,事情需要更长的时间也没关系。

您如何与这个外部 OmniCat 实例通信由您决定。最舒适的方式可能是 dRuby 但我应该补充一点,我没有使用它的生产模式经验。一个更具前瞻性的解决方案是使用一些简单的 HTTP + JSON。在那种情况下,您甚至可以在将来使用一些不基于 Ruby 的更强大的库来切换进行训练和分类的服务。