2016-04-21 34 views
3

我在R中建立一个语言模型,根据前面的单词预测句子中的下一个单词。目前我的模型是Kneser-Ney平滑的简单ngram模型。它通过在训练集中找到具有最大概率(频率)的ngram来预测下一个单词,其中平滑提供了插值低阶ngram的方式,这在高阶ngram具有低频并且可能不提供可靠预测的情况下是有利的。虽然这种方法工作得相当好,但它在n-gram无法捕获上下文的情况下失败。例如,“外面温暖阳光充足,让我们去......”和“外面很冷,下雨,让我们去...”将会提出同样的预测,因为没有捕捉到天气的背景在最后的n-gram中(假设n < 5)。用R中的text2vec来预测下一个单词

我正在研究更先进的方法,并且我找到了text2vec包,它允许将单词映射到向量空间,其中具有相似含义的单词用类似(近似)向量表示。我有一种感觉,这种表示可以有助于下一个单词预测,但我无法弄清楚如何确切定义训练任务。我的问题是,如果text2vec是用于下一个单词预测的正确工具,并且如果是,那么可以用于此任务的合适的预测算法是什么?

回答

1

您的直觉是正确的,词嵌入向量可以用来通过结合长距离依赖关系来改善语言模型。您正在寻找的算法被称为RNNLM(递归神经网络语言模型)。 http://www.rnnlm.org/

+0

你知道RNNLM是否有R实现? – Sasha

+0

可能不会是我的猜测。 – Aaron

6

您可以尝试char-rnnword-rnn(谷歌一点点)。 对于字符级模型R/mxnet实现,请看mxnet examples。可能有可能使用text2vec GloVe嵌入将此代码扩展到字级模型。

如果您将取得任何成功,请告诉我们(我的意思是text2vec或/和mxnet开发人员)。对于R社区,我将是非常有趣的案例。我想执行这样的模型/实验,但仍然没有时间。

2

有一个实现的解决方案作为使用词嵌入的完整示例。事实上,来自Makarenkov等人的论文(2017)名为语言模型与预训练(GloVe)词嵌入呈现循序渐进的实施训练语言模型,使用循环神经网络(RNN)和预先训练的GloVe词嵌入。

在本文中,作者提供了运行代码的说明: 1.下载预先训练好的GloVe矢量。 2.获取文本以训练模型。 3.打开并调整主 函数内的LM_RNN_GloVe.py文件参数。 4.运行以下方法: 的(a)tokenize_file_to_vectors(glove_vectors_file_name,file_2_tokenize_name, tokenized_file_name) (b)中run_experiment(tokenized_file_name)

在Python代码是这里https://github.com/vicmak/ProofSeer

我还发现@Dmitriy Selivanov最近发布了一个很好用的教程,使用了它的text2vec包,可以从R的角度解决这个问题。 (如果他可以进一步评论,这将是很好的)。