我正在尝试使用 NLTK 的 KneserNeyInterpolated 函数在字符级别上构建语言模型。我拥有的是熊猫数据框中单词的频率列表,唯一的列是它的频率(单词本身就是索引)。根据单词的平均长度,我确定 9 克模型是合适的。
from nltk.lm.models import KneserNeyInterpolated
lm = KneserNeyInterpolated(9)
for i in range(df.shape[0]):
lm.fit([list(ngrams(df.index[i], n = 9))])
lm.generate(num_words = 9)
# ValueError: Can't choose from empty population
尝试调试:
n = 9 # Order of ngram
train_data, padded_sents = padded_everygram_pipeline(4, 'whatisgoingonhere')
model = KneserNeyInterpolated(n)
model.fit(train_data, padded_sents)
model.generate(num_words = 10)
# ['r', '</s>', '</s>', '</s>', '</s>', '</s>', '</s>', '</s>', '</s>', '</s>']
这行得通(我猜?),但我似乎无法将功能扩展到连续训练新单词到语言模型,我仍然无法生成逼真的单词。我觉得我在这里缺少有关该模块应该如何工作的基本内容。让这有点困难的是,所有教程似乎都基于单词级 ngram。