感谢伯禹提供的机会
文本预处理
文本是一类序列数据,一篇文章可以看作是字符或单词的序列,本节将介绍文本数据的常见预处理步骤,预处理通常包括四个步骤:
我们可以通过引入更复杂的规则来解决这些问题,但是事实上,有一些现有的工具可以很好地进行分词,我们在这里简单介绍其中的两个:spaCy和NLTK。
- 读入文本
- 分词
- 建立字典,将每个词映射到一个唯一的索引(index)
- 将文本从词的序列转换为索引的序列,方便输入模型
读入文本 我们用一部英文小说,即H. G. Well的Time Machine,作为示例,展示文本预处理的具体过程。 分词 我们对每个句子进行分词,也就是将一个句子划分成若干个词(token),转换为一个词的序列。 建立字典 为了方便模型处理,我们需要将字符串转换为数字。因此我们需要先构建一个字典(vocabulary),将每个词映射到一个唯一的索引编号。 tokens = [tk for st in sentences for tk in st] return collections.Counter(tokens) # 返回一个字典,记录每个词的出现次数 我们看一个例子,这里我们尝试用Time Machine作为语料构建字典 将词转为索引 使用字典,我们可以将原文本中的句子从单词序列转换为索引序列 用现有工具进行分词 我们前面介绍的分词方式非常简单,它至少有以下几个缺点: - 标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
- 类似“shouldn't", "doesn't"这样的词会被错误地处理
- 类似"Mr.", "Dr."这样的词会被错误地处理
语言模型
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为TT的词的序列w1,w2,…,wTw1,w2,…,wT,语言模型的目标就是评估该序列是否合理,即计算该序列的概率:
P(w1,w2,…,wT).P(w1,w2,…,wT).
本节我们介绍基于统计的语言模型,主要是nn元语法(nn-gram)。在后续内容中,我们将会介绍基于神经网络的语言模型。
语言模型
假设序列w1,w2,…,wTw1,w2,…,wT中的每个词是依次生成的,我们有
P(w1,w2,…,wT)=∏t=1TP(wt∣w1,…,wt1)=P(w1)P(w2∣w1)P(wT∣w1w2wT1)P(w1,w2,…,wT)=∏t=1TP(wt∣w1,…,wt1)=P(w1)P(w2∣w1)P(wT∣w1w2wT1)
例如,一段含有4个词的文本序列的概率
P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w1,w2,w3).P(w1,w2,w3,w4)=P(w1)P(w2∣w1)P(w3∣w1,w2)P(w4∣w1,w2,w3).
语言模型的参数就是词的概率以及给定前几个词情况下的条件概率。设训练数据集为一个大型文本语料库,如维基百科的所有条目,词的概率可以通过该词在训练数据集中的相对词频来计算,例如,w1w1的概率可以计算为:
P^(w1)=n(w1)nP^(w1)=n(w1)n
其中n(w1)n(w1)为语料库中以w1w1作为第一个词的文本的数量,nn为语料库中文本的总数量。
类似的,给定w1w1情况下,w2w2的条件概率可以计算为:
P^(w2∣w1)=n(w1,w2)n(w1)P^(w2∣w1)=n(w1,w2)n(w1)
其中n(w1,w2)n(w1,w2)为语料库中以w1w1作为第一个词,w2w2作为第二个词的文本的数量。
循环神经网络
本节介绍循环神经网络,下图展示了如何基于循环神经网络实现语言模型。我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量HH,用HtHt表示HH在时间步tt的值。HtHt的计算基于XtXt和Ht1Ht1,可以认为HtHt记录了到当前字符为止的序列信息,利用HtHt对序列的下一个字符进行预测。
循环神经网络的构造
我们先看循环神经网络的具体构造。假设Xt∈Rn×dXt∈Rn×d是时间步tt的小批量输入,Ht∈Rn×hHt∈Rn×h是该时间步的隐藏变量,则:
Ht=(XtWxh+Ht1Whh+bh).Ht=(XtWxh+Ht1Whh+bh).
其中,Wxh∈Rd×hWxh∈Rd×h,Whh∈Rh×hWhh∈Rh×h,bh∈R1×hbh∈R1×h,函数是非线性激活函数。由于引入了Ht1WhhHt1Whh,HtHt能够捕捉截至当前时间步的序列的历史信息,就像是神经网络当前时间步的状态或记忆一样。由于HtHt的计算基于Ht1Ht1,上式的计算是循环的,使用循环计算的网络即循环神经网络(recurrent neural network)。
在时间步tt,输出层的输出为:
Ot=HtWhq+bq.Ot=HtWhq+bq.
其中Whq∈Rh×qWhq∈Rh×q,bq∈R1×qbq∈R1×q。 |