生产Web应用程序上的NLTK

时间:2013-01-02 20:14:19

标签: python pyramid nltk

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

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

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