文章开头便引用了一句话:We tend to look through language and not realize how much power language has. 我们往往低估了语言的力量。文本摘要抽取,文本生成,文本自动填充这些任务都依赖于Language Model (LM),事实上,LM是大部分NLP任务的基石,本篇文章就带我们由浅入深,亲自实践LM去了解它的广度与深度。
什么是LM?
A language model learns to predict the probobality of a sequence of words. LM学习预测一个词序列出现的概率。如何理解一个词序列出现的概率?以一个机器翻译的例子来说明,在机器翻译任务中,通常是给你一个词序列,让你把它转换成另一个词序列,你需要估计转换后的词序列的概率分布,概率最高的那个词序列就是一个理想的翻译结果。比如以下两个词序列:the cat is small 和 small the is cat,很明显第一个词序列出现的概率更高。当模型能够学习到语言的规律(词序列的概率分布)时,就可以解决很多NLP任务。
LM的类别
有两种类型的LM:
1. Statistical Language Model 统计语言模型。 这类LM利用一些传统的统计模型如N-gram, HMM,或者一些特定的统计规则来学习词的概率分布。
2. Neural Language Model 神经语言模型。利用神经网络来建模的语言模型。
下面将分别介绍这两类语言模型。
构建一个N-gram Model
N-gram 就是一个长度为N的词序列,可以通过下面这个例子来理解N-gram:
“I love reading blogs about data science on Analytics Vidhya.”
这个句子中可以抽出1-gram有"I","love","reading"等等由一个词构成的单元,2-gram包括"I love","love reading","reading blogs"等由两个连续词构成的序列。一个N-gram Model可以预测自然语言中一个长度为N的词序列出现的概率。
为了预测长度为N的语言序列的概率,即构建该N-gram Model,需要使用链式法则来获取N个词出现的联合概率分布:
p(w1...ws) = p(w1) . p(w2 | w1) . p(w3 | w1 w2) . p(w4 | w1 w2 w3) ..... p(wn | w1...wn-1)
可以发现为了求得联合概率分布,需要计算若干条件概率。这些条件概率都是在给定history的条件下来预测下一个词,即下图所示:
可以发现当历史很长时,若考虑所有的历史词p(wn | w1...wn-1),会使得模型空间过大,模型过于复杂,同时也会有数据稀疏等问题。因此,通常使用马尔科夫假设,使得下一个要预测的词只与当前一个词有关,与其他历史词无关,从而使得条件概率简化为p(wn | wn-1)。
下面来实操构建一个N-gram Language Model。使用的Reuters数据集共包含10,788篇新闻文档,1,300,000个词。使用以下代码可以构建一个language model:
# code courtesy of https://nlpforhackers.io/language-models/
from nltk.corpus import reuters
from nltk import bigrams, trigrams
from collections import Counter, defaultdict
# Create a placeholder for model
model = defaultdict(