Task2

文本预处理分如下几步:

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,此时困惑度为正无穷;

基线情况下,模型总是预测所有类别的概率都相同,此时困惑度为类别个数。

你可能感兴趣的:(Task2)