文本預(yù)處理分如下幾步:
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.將文本從詞的序列轉(zhuǎn)換為索引的序列讥此,方便輸入模型
缺點(diǎn):
1.標(biāo)點(diǎn)符號通惩靶可以提供語義信息角骤,但是我們的方法直接將其丟棄了
2.類似“shouldn't", "doesn't"這樣的詞會被錯誤地處理
3.類似"Mr.", "Dr."這樣的詞會被錯誤地處理
語言模型
n元語法
序列長度增加毡们,計(jì)算和存儲多個詞共同出現(xiàn)的概率的復(fù)雜度會呈指數(shù)級增加。n元語法通過馬爾可夫假設(shè)簡化模型赃绊,馬爾科夫假設(shè)是指一個詞的出現(xiàn)只與前面n個詞相關(guān)豺总,即n階馬爾可夫鏈
缺陷:
1.參數(shù)空間過大
2.數(shù)據(jù)稀疏
步驟:
1.先預(yù)處理(+隨機(jī)采樣\相鄰采樣)
循環(huán)神經(jīng)網(wǎng)絡(luò)
基于當(dāng)前的輸入與過去的輸入序列,預(yù)測序列的下一個字符
網(wǎng)絡(luò)構(gòu)造:
one-hot 向量狠怨, 向量長度等于字典長度
裁剪梯度
循環(huán)神經(jīng)網(wǎng)絡(luò)中較容易出現(xiàn)梯度衰減或梯度爆炸约啊,這會導(dǎo)致網(wǎng)絡(luò)幾乎無法訓(xùn)練。裁剪梯度是一種應(yīng)對梯度爆炸的方法佣赖。
定義預(yù)測函數(shù)
以下函數(shù)基于前綴prefix(含有數(shù)個字符的字符串)來預(yù)測接下來的num_chars個字符恰矩。
困惑度
我們通常使用困惑度(perplexity)來評價語言模型的好壞
最佳情況下,模型總是把標(biāo)簽類別的概率預(yù)測為1憎蛤,此時困惑度為1外傅;
最壞情況下纪吮,模型總是把標(biāo)簽類別的概率預(yù)測為0,此時困惑度為正無窮萎胰;
基線情況下碾盟,模型總是預(yù)測所有類別的概率都相同,此時困惑度為類別個數(shù)技竟。