NLTK在生产环境中?

aks*_*ayb 10 python nltk opennlp

我在python nltk中开发了几种用于聚类,数据抽象等的算法.现在,问题是,我将在风险投资之前呈现大规模.NLTK有自己的优势,比如快速开发等.但是当我在开始时选择时,这对我来说很有意义.现在我已经足够成熟,并且发现它有一些局限性,比如缺乏可扩展性.对Mahout进行了一些研究,但这也是针对集群/分类和搭配的.打开NLP是一个选项,但我不确定我能用多长时间.对于高规模的nlp有什么好的吗?

请注意 - 这个问题与我的旧问题无关 - 如何提高NLTK的性能?备择方案?.我已经完全在生产Web应用程序上阅读了NLTK.

pvo*_*ten 4

NLTK确实是一个很好的学习平台,但并不是为了稳健地服务数百万客户而设计的。

您可以通过两种不同的方式解决可扩展性问题:

  • 第一种“大数据”方法:使您的算法适应 MapReduce 并在 MongoDB/Hadoop/Google MapReduce/...上运行它们...有不同的地方可以托管此类解决方案(Amazon、Google、Rackspace...)
  • 第二种,“自己动手”的方法:使用常见的托管解决方案或您自己的数据中心。

“大数据”方法

这意味着重新思考你的算法。需要良好的数学背景和对算法的深入理解。也许您甚至会替换算法,因为执行时间与工作量关系不大。

因此,就实现您的想法而言,这可能是最困难(甚至可能是不可能)的解决方案,具体取决于您的技能。对于部署和未来的好处来说,这是迄今为止最简单的解决方案。

“自己动手”的方法

可扩展性可以有不同的含义:

  • 更大的训练集
  • 更多客户
  • 更多算法和应用
  • 增加训练集可能意味着重新训练或适应
  • ...

可扩展性有不同的数量级:您想要扩展 10 倍、100 倍、1000 倍……吗?

有多种方法可以克服可扩展性问题:

  • 并行化:添加服务器的精确副本并进行负载平衡
  • 流水线:将处理分成不同的步骤,可以在不同的服务器上进行
  • 更昂贵的硬件、更快的 CPU、RAM、磁盘、总线、ASIC,...
  • 客户端处理
  • 缓存请求
  • 软件性能调整,在 C/C++ 中实现瓶颈
  • 使用更好的算法
  • 更智能地分离离线发生的事情(例如使用 cron 作业)和每个请求完成的事情。
  • ...

无论可扩展性的类型如何,也无论您使用什么方法来克服它,都请进行负载测试以了解您可以处理什么。由于您无法立即负担得起所有硬件,因此可以采用不同的方法对扩展的基础设施进行负载测试:

  • 每小时租用处理器、内存、磁盘空间……,刚好足以进行负载测试和紧急救援。这样你就不需要购买设备了。
  • 风险更大:在比生产中更少、更便宜的设备上进行负载测试,并推断结果。也许您有一个关于算法如何扩展的理论模型,但要注意副作用。布丁的好坏就在于吃的过程中。

接近 VC(就可扩展性而言)

  • 创建一个能够清楚地自我解释您的想法的原型(不一定是可扩展的)
  • 向自己证明,在未来的某个时刻一切都会好起来的,成本是多少(最小/预期/最大一次性/连续成本)
  • 从私人测试版开始,这样可扩展性从一开始就不是问题。没有结束测试版的最后期限。估计可以,但没有截止日期。不要在这一点上妥协!

祝你好运!