我正在使用Python 3.5,使用Anaconda进行安装和管理。我想使用一些文本训练NGramModel(来自nltk)。我的安装找不到模块nltk.model
这个问题有一些可能的答案(选择正确的答案,并解释如何去做):
答案 0 :(得分:15)
随着NLTK 3.4的发布,重新设计的lm
模块包含ngram模型功能。请参阅其文档!
对于那些感兴趣或因任何原因无法安装3.3版本的人,我会保留旧的答案
首先,正如您对问题的评论中所指出的,如果训练/跑步速度对您来说是一个问题,KenLM可能是更好的选择。此时nltk.model
主要用于教育/原型设计,但速度并不快。
如果您仍然决定坚持使用NLTK,请继续阅读。我碰巧是NgramModel
分支中新model
代码的作者,我会尝试清楚地说明,以便您可以测试代码并让我知道您的想法。由于旧实现中的a lot of critical bugs,我们不得不对模块进行大修,我们仍在调整新设置。
目前在this doctest file中描述了改版模块的预期用途。话虽如此,我会快速浏览工作流程的主要更改,因为它与旧版本有很大不同。 如果您对我们如何推出新工作流程感兴趣,请参阅this thread。
最重要的是要记住,训练ngram模型现在明确分为以下3个步骤。
旧的实现中一些最烦人的错误发生在ngram模型遇到训练期间没有看到的单词时。解决这个问题的传统方法是在开始训练之前创建一个“已知”标记(单词)的词汇。
在训练你的ngram模型时,你会在词汇表中查找标记并增加它们的计数(如果它们存在),否则增加计数器以获得特殊的 UNKNOWN 标记。我们的想法是,如果您在测试期间遇到看不见的令牌,您可以使用 UNKNOWN 中的计数来估算其得分。
此词汇表可以使用您训练的数据以外的数据创建。例如,你的词汇可能来自Gigaword语料库,但你只训练你的模型华尔街日报。
使用nltk.model.build_vocabulary
功能。
你有没有想过当你“训练”ngram模型时究竟发生了什么?从本质上讲,培训模型实际上归结为简单地计算文本中的ngrams。当然,这还涉及将文本分解为ngrams并根据您在上一步中创建的词汇检查令牌。
在此任务中,适当命名的nltk.model.count_ngrams
函数是您的朋友。它返回NgramCounter
类的一个实例,它试图提供一个清晰的接口来访问/更新ngram计数。
这是整个过程的最终目标,在给定某些背景的情况下获得类似于令牌的概率。
该模块的这一部分仍在进行中,目前只有 MLE , Lidstone 和 Laplace 估算器。它们的使用在doctest文件中简要记录。
如果你想使用不同的估算器,你必须为它编写自己的类。但是,我试图让它变得非常容易。此外,您可以将您的作品提交给NLTK并成为贡献者!
以下是您定义自己的估算工具的方法:
BaseNgramModel
。score
方法,该方法使用ngram_counts
属性来访问计数。随意从ngram.py
中已定义的模型中获取灵感。
以下是基本MLE评分的示例实现:
from nltk.model import BaseNgramModel
class MLENgramModel(BaseNgramModel):
def score(self, context, word):
# how many times word occurs with context
ngram_count = self.ngrams[context][word]
# how many times the context itself occurred we take advantage of
# the fact that self.ngram[context] is a FreqDist and has a method
# FreqDist.N() which counts all the samples in it.
context_count = self.ngram[context].N()
# In case context_count is 0 we shouldn't be dividing by it
# and just return 0
if context_count == 0:
return 0
# otherwise we can return the standard MLE score
return ngram_count / context_count