生产Web应用程序上的NLTK

abr*_*hof 5 python nltk pyramid

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

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

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

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

Jac*_*cob 5

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

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

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