誰瞭解最好的詞彙?
I know words. I have the best words.
在 2015 年 12 月 30 日舉行的南卡羅來納州競選會上,川普說出了上面這些話。這些「川普主義」的言論使得川普的粉絲更加喜歡他,但也使他成為其他人的笑柄。
無論每個人對他的看法如何,川普的說話方式毋庸置疑是十分獨特的:他的言語十分隨意且無視傳統句子結構約束。這類特點使他的講話十分具有辨識度。
正是這種獨特的風格吸引了我,我嘗試用機器學習來模仿它:生成看起來或聽起來像川普會說的文字。
資料收集與處理
要學習川普的說話風格,首先要獲取足夠多的語言樣本。我主要關注兩個主要的資料來源。
非常規句子結構的例子。
川普的推特是收集其語言樣本最好的地方。川普的獨特之處在於他利用推特直接與美國百姓進行交流。此外,作為一名「明星人物」,他的言論已經被收集組織了起來(http://www.trumptwitterarchive.com/),這幫我省去了不少麻煩。一共大約有接近 31000 份推文可供使用。
總統致辭和演講
然而,除了他在網路上表現出的一面,我還想更多地瞭解他作為總統更加正式的一面。為此,我收集了白宮簡報檔案提供的相關資料。藉助 Python 工具我快速彙總了大約 420 份川普的演講稿以及評論講話。文字內容涵蓋了各類活動,如與外國政要會面、與國會議員進行會議以及頒獎典禮。
與推特不同的是,雖然每一個字都是由川普本人所寫或口述的,但這些文字還包含其他政治家或者記者所說的話。將川普所說的話與其他人的區分開來似乎是一項艱鉅的任務。
正規表示式很強大。相信我。
輸入正規表示式,雖然名字聽起來很無聊但是功能絕對強大。
正規表示式允許你指定要搜尋的模式;此模式可以包含任意數量的特定約束、萬用字元或其他限制,以保證返回的資料能夠滿足你的要求。
經過一些試驗和調整,我生成了一個複雜的正規表示式,它只返回總統的言論,而不會返回其他的詞或註釋。
處理文字還是不處理?這是個問題
通常處理文字的第一步是對其進行歸一化。歸一化的程度和複雜度根據需求而變,從簡單地刪除標點符號或大寫字母,到將單詞的所有變體規範化為基本形式。工作流示例見:https://towardsdatascience.com/into-a-textual-heart-of-darkness-39b3895ce21e。
然而,對我而言,歸一化過程中會丟失的具體特質和模式正是我需要保留的。所以,為了讓我生成的文字更加可信和真實,我選擇繞過大部分標準歸一化工作流程。
文字生成
馬爾可夫鏈
在深入研究深度學習模型之前,我們先來了解另一種常用的文字生成方法——馬爾可夫鏈。馬爾可夫鏈之前用作生成笑話文字的捷徑:比如使用馬爾可夫鏈基於星際迷航(https://twitter.com/captain_markov?lang=en)、辛普森一家(https://github.com/cshenton/simpsons_markov)劇本生成文字等例項。
馬爾可夫鏈是快速且粗糙的,它只關注當前的詞,以確定接下來的詞是什麼。這種演算法每次只關注當前的詞以及接下來可能會出現的詞。下一個詞是隨機選擇的,其機率與頻率成正比。下面用一個簡單的例子來說明:
簡化的馬爾可夫鏈例子,其中接著「taxes」出現的可以是「bigly」、「soon」或者句號。
現實生活中,如果川普說「taxes」一詞,70% 的情況下他會在說完「taxes」後接著說「bigly」,而馬爾可夫鏈 70% 的情況下會選擇「bigly」作為下一個詞。但有時候,他不會說「bigly」。有時他會結束句子,或者選擇另一個詞接在後面。馬爾可夫鏈很可能會選擇「bigly」,但它也有可能選擇其他可選的選項,這為生成的文字引入了一些不確定因素。
之後馬爾可夫鏈可能會不斷的生成下去,或者直到句子結束才停止。
對於快速且隨機的應用場景,馬爾可夫鏈可能非常適用,但是它一旦出錯也很容易看出來。由於馬爾可夫鏈只關心當前的單詞,因此它生成的句子很容易跑偏。一個一開始討論國內經濟的句子可能結束的時候在討論《誰是接班人》。
使用我有限的文字資料集,馬爾可夫鏈的大部分輸出是無意義的。但偶爾也會有「靈光一現」:
用推文訓練馬爾可夫鏈所生成的句子(種子詞為「FBI」)。
迴圈神經網路
然而如果要訓練得到更加真實的文字,需要一些更復雜的演算法。迴圈神經網路(RNN)已經成為許多文字或基於序列的應用的首選架構。RNN 的詳細內部工作原理不在本文的討論範圍之內。
這些神經元的顯著特徵是它們具有各種內部「記憶」。單詞的選擇和語法很大程度上依賴於上下文,而這些「記憶」能夠跟蹤時態、主語和賓語等,這對生成連貫的句子是非常有用的。
這類網路的缺點是它們的計算量非常大,在膝上型電腦上用模型將我的文字資料訓練一次要一個多小時,考慮到要這樣訓練大約 200 次,這類網路不是很友好。
這裡就需要雲端計算大展身手了。許多成熟的科技公司提供雲服務,其中最大的是亞馬遜、谷歌和微軟。在需要大量 GPU 計算的例項中,之前需要一個小時的過程縮減為九十秒,時間減少大約四十倍!
評估
你能判斷這個句子是川普說的還是 RNN 生成的嗎?
California finally deserves a great Government to Make America Great Again! #Trump2016
這是從「川普對共和黨州長候選人的支援」推文(https://twitter.com/realDonaldTrump/status/997597940444221440)中生成的文字,但它可能會被當作川普在 2016 年大選前釋出的推文。
我所實現的複雜版本的神經網路(在迴圈層之前和之後有隱藏的全連線層)能夠在種子為 40 個或小於 40 個字元的情況下生成內部連貫的文字。
I want them all to get together and I want people that can look at the farms.
China has agreed to buy massive amounts of the world—and stop what a massive American deal.
而簡化版本的網路在連貫性方面有所欠缺,但仍然能夠捕捉到川普總統講話的語言風格:
Obama. We'll have a lot of people that do we—okay? I'll tell you they were a little bit of it.
結語
雖然沒能一直產生足以欺騙你我的文字,但這種嘗試讓我看到了 RNN 的力量。簡而言之,這些網路學習了拼寫、語法的某些方面,以及在特定情況下如何使用井號標籤和超連結。
該專案的 GitHub 連結:https://github.com/tetrahydrofuran/presidential-rnn
參考原文:https://towardsdatascience.com/the-best-words-cf6fc2333c31