5

我想将自定义标记器合并到我正在开发的 Web 应用程序(在 Pyramid 上运行)中。我使用 NLTK 在我的本地机器上让标记器工作正常,但我读到 NLTK 的生产速度相对较慢。

似乎存储标记器的标准方法是腌制它。在我的机器上,加载 11.7MB 的 pickle 文件需要几秒钟。

  1. NLTK 是否适用于生产?我应该看scikit-learn还是像 Mahout 这样的东西?

  2. 如果 NLTK 足够好,那么确保它正确使用内存等的最佳方法是什么?

4

2 回答 2

5

我运行文本处理及其相关的NLP API,它使用大约 2 打不同的腌制模型,这些模型由 Django 应用程序(nginx 后面的 gunicorn)加载。模型会在需要时立即加载,一旦加载,它们就会保留在内存中。这意味着每当我重新启动 gunicorn 服务器时,需要模型的第一个请求必须等待几秒钟才能加载,但每个后续请求都会使用已经缓存在 RAM 中的模型。仅当我部署新功能时才会重新启动,这通常涉及更新模型,因此无论如何我都需要重新加载它们。因此,如果您不希望经常更改代码,并且对一致的请求时间没有强烈要求,那么您可能不需要单独的守护程序。

除了初始加载时间之外,主要的限制因素是内存。我目前只有1个工作进程,因为当所有模型都加载到内存中时,单个进程最多可以占用1GB(YMMV,对于单个11MB的pickle文件,你的内存需求会低得多)。使用已加载的模型处理单个请求足够快(通常 <50 毫秒),我目前不需要超过 1 个工作人员,如果需要,最简单的解决方案是添加足够的 RAM 来运行更多工作进程。

如果您担心内存,请查看 scikit-learn,因为等效模型使用的内存比 NLTK 少得多。但是,它们不一定更快或更准确。

于 2013-01-03T00:34:58.430 回答
2

减少启动延迟的最佳方法是将标记器作为守护程序(持久服务)运行,您的 Web 应用程序会将文本片段发送到标记。这样,您的标记器仅在系统启动时以及如果/当​​需要重新启动守护程序时加载。

只有您可以决定 NLTK 是否足够快以满足您的需求。加载标记器后,您可能已经注意到 NLTK 可以标记多页文本而没有明显的延迟。但是资源消耗和并发用户的数量可能会使事情复杂化。

于 2013-01-02T22:21:41.733 回答