1

已经有可用的拼写检查模型可以帮助我们根据经过训练的正确拼写语料库找到建议的正确拼写。是否可以将粒度增加到字母表中的“单词”,以便我们可以得到均匀的短语建议,这样如果输入了不正确的短语,那么它应该从正确短语的语料库中建议最近的正确短语,当然它是从一个有效短语列表。

是否有任何 python 库已经实现了此功能,或者如何针对现有的大型黄金标准短语语料库进行此操作以获得统计相关的建议?

注意:这与拼写检查器不同,因为拼写检查器中的字母是有限的,而在短语校正器中,字母本身就是一个单词,因此理论上是无限的,但我们可以限制短语库中的单词数量。

4

1 回答 1

4

您要构建的是一个 N-gram 模型,该模型包括计算每个单词遵循 n 个单词序列的概率。

您可以使用NLTK 文本语料库nltk.sent_tokenize(text)来训练您的模型,或者您可以使用和标记您自己的语料库nltk.word_tokenize(sentence)

您可以考虑 2-gram(马尔可夫模型):

“小猫”跟随“可爱”的概率是多少?

...或 3 克:

“小猫”跟随“可爱”的概率是多少?

等等

显然,用 n+1-gram 训练模型比 n-gram 更昂贵。

您可以考虑词性标签(word, pos)所在的位置,而不是考虑单词(您可以使用 获取标签)posnltk.pos_tag(tokens)

您也可以尝试考虑引理而不是单词。

这里有一些关于 N-gram 建模的有趣讲座:

  1. N-gram 简介
  2. 估计 N-gram 概率

这是未优化的代码(2-gram)的简单而简短的示例:

from collections import defaultdict
import nltk
import math

ngram = defaultdict(lambda: defaultdict(int))
corpus = "The cat is cute. He jumps and he is happy."
for sentence in nltk.sent_tokenize(corpus):
    tokens = map(str.lower, nltk.word_tokenize(sentence))
    for token, next_token in zip(tokens, tokens[1:]):
        ngram[token][next_token] += 1
for token in ngram:
    total = math.log10(sum(ngram[token].values()))
    ngram[token] = {nxt: math.log10(v) - total for nxt, v in ngram[token].items()}
于 2015-08-05T14:34:06.827 回答