1

我正在使用 nltk.ngram.NgramModel 在布朗语料库上训练一个 n-gram 模型。它基本上需要永远并使用大量系统内存。我想知道是否有一种方法可以保存模型,以便每次运行代码时都不必再次训练它。我看过对 pickle 和 BerkeleyDB 的引用,但我并不完全理解它们中的任何一个是如何工作的。

谢谢!

***ETA:尽管实施了此处描述的更改并尝试了所有各种泡菜协议选项,但我无法成功泡菜模型。我玩弄了 simplejson(没有运气)和 YAML(需要永远,吃掉我所有的记忆)。

4

3 回答 3

0

BerkeleyDB 参考可能是我的答案之一,或者我写的一篇文章。基本上我写了自己的频率表。针对批量创建进行了优化,它在内存中使用 NLTK 实现(例如,1000 个输入文章/文件),然后将其写到 BerkeleyDB 主存储。这减少了(慢)BerkeleyDB 写入的数量。例如,每个子批次只需要对单词“the”进行一次写入。

于 2012-06-23T14:48:12.687 回答
0

训练模型确实是你应该做一次,并保存多次使用的事情。Pickle 是正确的工具,但谁知道它为什么不适合你呢?谷歌表示,酸洗 ngram 曾经存在一些问题,但它们在几年前就已经解决了。继续尝试,或者做一个最小的例子,如果它仍然不起作用,请在此处发布。

于 2012-07-01T16:47:49.793 回答
0

Pickle 模块允许您序列化 Python 对象结构,以便您可以反序列化并在以后使用它。随时查看文档以获取更多详细信息http://docs.python.org/library/pickle.html

NLTK 的 NgramModel 在版本 <= 2.0.1rc2 中是可序列化的(经过一些努力)(或者它仍然是,但我很忙于进一步调查它。基本上,你只需要在酸洗时使用较低的 PROTOCOL_NUMBER。你可以检查这个(相当混乱的)代码,看看我是怎么做到的。

https://github.com/starenka/laholator/blob/master/laholator.py#L118

https://github.com/starenka/laholator/blob/master/laholator.py#L19

(该脚本为根据文本样本生成随机文本的几个站点提供支持。Fe 这个http://kaluzator.starenka.net/

祝你好运

于 2012-06-22T21:54:37.450 回答