是否想過智能鍵盤上的預(yù)測鍵盤之類的工具如何工作?在本文中,探討了使用先驗信息生成文本的想法。具體來說,將使用Google Colab上的遞歸神經(jīng)網(wǎng)絡(luò)(RNN)和自然語言處理(NLP),從16世紀文獻中產(chǎn)生文章。這個想法很簡單,將嘗試為模型提供莎士比亞劇本的樣本,以產(chǎn)生所有假零件,同時保持相同的本地語言。雖然預(yù)測性鍵盤會為可能包含多個單詞的不完整句子生成最佳的“單個單詞”匹配,但通過使用單個單詞生成莎士比亞戲劇的一部分,將使此過程更加困難。
了解NLP和RNN
首先刷新用于NLP的RNN的概念。RNN被廣泛用于預(yù)測。RNN的數(shù)據(jù)集約束是它應(yīng)該采用時間序列的形式。NLP是人工智能領(lǐng)域,使機器能夠讀取,理解和查找文本數(shù)據(jù)中的模式。
可以將文本中的字母轉(zhuǎn)換為數(shù)字,并將其輸入RNN模型中,以產(chǎn)生下一個可能的結(jié)果(諸如預(yù)測之類的聲音,對嗎?)
RNN的變化
不同RNN的內(nèi)部機制
RNN具有循環(huán)機制,該循環(huán)機制用作允許信息從一個步驟流到下一步驟的路徑。此信息是隱藏狀態(tài),它表示以前的輸入。
RNN有許多不同的變體,最常見的是LSTM(長期記憶)。在本文中,將使用一種鮮為人知的變體,稱為門控循環(huán)單位(GRU)。簡單RNN和GRU之間的主要區(qū)別在于,后者支持隱藏狀態(tài)的門控。如前所述,隱藏狀態(tài)使能夠輸入先前時間步長中的信息。因此,RNN和GRU的區(qū)別在于傳遞信息的方式。區(qū)別在于專用機制,用于何時應(yīng)該更新隱藏狀態(tài)以及何時應(yīng)該重置隱藏狀態(tài)。
首先,很難掌握LSTM和GRU。總而言之,GRU與LSTM非常相似。唯一的區(qū)別是GRU沒有單元狀態(tài),而是使用隱藏狀態(tài)傳遞信息。實際上,GRU有兩個門:更新門和重置門。所述更新門作用類似于一個LSTM的忘記和輸入門。它決定丟棄哪些信息以及添加哪些新信息。該復位門是用來決定多少過去的信息忘記另一個門。
現(xiàn)在哪一個有好處?一個簡單的RNN,LSTM,GRU?就像生活中的所有事物一樣,沒有什么是明確的。一切都取決于用例,數(shù)據(jù)量和性能。因此,決定權(quán)取決于每個人!
使用GRU生成莎士比亞戲劇
現(xiàn)在將使用劇本《羅密歐與朱麗葉》中的文字來產(chǎn)生一些模仿16世紀文學作品的“假段落”。為此提取了一定數(shù)量的數(shù)據(jù)。
可以從.txt文件中刪除該書的初始頁面,該文件包含內(nèi)容和致謝部分。這將有助于產(chǎn)生更好的模型。
將開發(fā)一個模型,該模型使用先前的字符序列來預(yù)測下一個最高概率的字符。必須謹慎使用多少個字符。一方面,使用很長的序列將需要大量的訓練時間,并且很可能過度適合與字符集無關(guān)的字符序列。另一方面,太短的序列將不適合我們的模型。因此根據(jù)已有數(shù)據(jù)的長度來建立直覺。根據(jù)正常短語的長度,將使用一個單詞來預(yù)測接下來的180個字符。
是時候行動起來了!請按照以下步驟操作:
注意:下面提供了Google colab鏈接
步驟1:數(shù)據(jù)導入和基本功能
導入數(shù)據(jù)集(Google colab示例)
步驟2:資料預(yù)處理
創(chuàng)建一組獨特的字符:
將字母編碼為數(shù)字
步驟3:檢查順序
每個句子的長度為43,如果捕獲三個句子,則該模型應(yīng)該能夠選擇模式并學習它們。
步驟4:訓練順序
將序列映射到數(shù)據(jù)集
步驟5:建立批次
是時候建立網(wǎng)絡(luò)了
導入張量流模型,層和損失函數(shù)
定義損失函數(shù)
創(chuàng)建模型
我們的模型現(xiàn)在看起來像這樣:
模型架構(gòu)
訓練時間
將紀元設(shè)置為30
訓練模型。請注意,這將需要一些時間。花了大約40分鐘的時間來訓練數(shù)據(jù)集
模型評估
在下面的代碼中保存模型歷史記錄并繪制報告指標
GRU模型訓練結(jié)果
注意損失如何減少直到第20個時期,然后急劇上升。在第18個時代獲得的最高準確度是86.03%。因此已經(jīng)將模型訓練了18個時期。
生成文字
定義一個函數(shù)(不固定種子)以使用1的序列生成文本。如果已經(jīng)用兩個單詞訓練了模型,那么模型會更強大,但是訓練時間會增加。
對于生成,可以使用以下代碼,只需指定起始單詞和連續(xù)單詞的數(shù)量即可。
print(generate_text(model,”But”,gen_size=1000))
輸出量
獲得了“flower”一詞的以下輸出
注意模型如何初始化Juliet和Ben的名稱。此外它在句子以標點符號結(jié)尾時采用模式,并模仿16世紀散文,例如Ey,thee,thou等。
單詞“But”的輸出
這種模式太好了!
結(jié)論
看到模型模仿了《羅密歐與朱麗葉》劇本的創(chuàng)作方式。注意提到字符的句子的開頭。此外整個白話被復制。
除了使用Romeo和Juliet訓練模型外,還希望對Pride and Prejudice等其他文本以及Edmunds的汽車評論采取類似的方法。雖然前者的模型訓練顯示出希望,但后者沒有達到期望。具體來說,對于評論,該模型無法最佳執(zhí)行,因為它找不到模式。這很可能與撰寫評論的方式有關(guān)。大多數(shù)人的寫作風格不同,這使得模型很難模仿散文。
將來,在查看推文時探索這種方法以及如何使用假推文實現(xiàn)這種模型將很有趣。但是為什么只發(fā)推文呢?理想情況下,還可以查看虛假的在線文章,甚至虛假的WhatsApp新聞(尤其是在選舉期間)。