您要构建的是一个 N-gram 模型,该模型包括计算每个单词遵循 n 个单词序列的概率。
您可以使用NLTK 文本语料库nltk.sent_tokenize(text)
来训练您的模型,或者您可以使用和标记您自己的语料库nltk.word_tokenize(sentence)
。
您可以考虑 2-gram(马尔可夫模型):
“小猫”跟随“可爱”的概率是多少?
...或 3 克:
“小猫”跟随“可爱”的概率是多少?
等等
显然,用 n+1-gram 训练模型比 n-gram 更昂贵。
您可以考虑词性标签(word, pos)
所在的位置,而不是考虑单词(您可以使用 获取标签)pos
nltk.pos_tag(tokens)
您也可以尝试考虑引理而不是单词。
这里有一些关于 N-gram 建模的有趣讲座:
- N-gram 简介
- 估计 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()}