文本预处理分如下几步:
1.读入文本
defread_time_machine():withopen('/home/kesci/input/timemachine7163/timemachine.txt','r')asf:lines=[re.sub('[^a-z]+',' ',line.strip().lower())forlineinf]returnlines
2.分词
deftokenize(sentences,token='word'):"""Split sentences into word or char tokens"""iftoken=='word':return[sentence.split(' ')forsentenceinsentences]eliftoken=='char':return[list(sentence)forsentenceinsentences]else:print('ERROR: unkown token type '+token)tokens=tokenize(lines)tokens[0:2
3.建立字典,将每个词映射到一个唯一的索引(index)
4.将文本从词的序列转换为索引的序列,方便输入模型
缺点:
1.标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
2.类似“shouldn't", "doesn't"这样的词会被错误地处理
3.类似"Mr.", "Dr."这样的词会被错误地处理
语言模型
n元语法
序列长度增加,计算和存储多个词共同出现的概率的复杂度会呈指数级增加。n元语法通过马尔可夫假设简化模型,马尔科夫假设是指一个词的出现只与前面n个词相关,即n阶马尔可夫链
缺陷:
1.参数空间过大
2.数据稀疏
步骤:
1.先预处理(+随机采样\相邻采样)
循环神经网络
基于当前的输入与过去的输入序列,预测序列的下一个字符
网络构造:
one-hot 向量, 向量长度等于字典长度
裁剪梯度
循环神经网络中较容易出现梯度衰减或梯度爆炸,这会导致网络几乎无法训练。裁剪梯度是一种应对梯度爆炸的方法。
定义预测函数
以下函数基于前缀prefix(含有数个字符的字符串)来预测接下来的num_chars个字符。
困惑度
我们通常使用困惑度(perplexity)来评价语言模型的好坏
最佳情况下,模型总是把标签类别的概率预测为1,此时困惑度为1;
最坏情况下,模型总是把标签类别的概率预测为0,此时困惑度为正无穷;
基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。