用遞歸神經網路,撰寫一份特朗普式發言稿!

用遞歸神經網路,撰寫一份特朗普式發言稿!

來自專欄數據汪31 人贊了文章

大數據文摘出品

編譯:小七、什錦甜、夏雅薇

特朗普新的連任競選開啟了。

特朗普充滿個人特色的語言風格讓作者產生了興趣,如果把他的推文和演講稿都用於訓練數據,再運用遞歸神經網路能否生成一份有特式風格的發言稿呢?結論是,如果數據和算力足夠大的情況下,總統競選班子里或許可以有演算法撰稿機器人的一席之地。

2015年12月30日,在南卡羅來納州,一場競選集會正在熱火朝天地進行,這次競選演講在特朗普的「特朗普主義」語錄里又加了精彩一筆。正是這些言論使特朗普受到了支持者的愛戴和擁護,同時也成為了某些人的笑料。

無論對特朗普的個人看法如何,你都不能否認他有其獨特的說話方式——零星的高級辭彙和打破常規的句子結構,僅憑這些就足以使他的演講在前輩和同輩人中有極高的辨識度。

我對這種獨特的風格非常感興趣,打算用機器學習演算法來進行學習並生成和特朗普說話風格相似的文本。

數據收集和處理

首先要收集大量的例子才能了解特朗普總統的說話風格,這裡主要有兩個來源——一個是推特,一個是總統的演講和致辭。

Twitter

非常規句子結構的例子之一

特朗普的推特是最容易獲取他話語的地方。特朗普是唯一一位用社交網路平台和美國人民直接溝通和互動的總統。此外,作為一個公眾人物,他的言論自然會被收集和組織起來供後人參考,這為我節省了不少麻煩,我就不需要用推特不穩定又有各種限制的API來爬取了。總之,這裡一共有不到31,000條推文可供我使用。

推文鏈接:

developer.twitter.com/e

總統致辭和演講

然而,除了他的網上形象,我還想看看他作為總統更正式的說話方式。 為此,我希望能從白宮簡報陳述檔案中獲得一些資料。在一些Python工具的幫助下,我很快就收集了大約420份演講稿以及總統的一些其他評論內容。這些資料涵蓋了各種活動,如與外國政要會面,與國會議員的圓桌會議以及頒獎典禮演講。

白宮陳述檔案鏈接:

whitehouse.gov/briefing

Python工具鏈接:

crummy.com/software/Bea

推特中的每一個字都是由特朗普本人所寫或口授的,但是這些發言不同,會涉及到其他政治家和一些好事的記者。我們需要將特朗普的話與其他人的分開,這是一項艱巨的任務。

我認為正則表達式是非常神奇的

輸入正則表達式——正則表達式雖然聽起來挺無聊的,不過它卻是一個強大且絕對不乏味的工具。

正則表達式允許指定搜索模式,此模式可以包含任何數量的特定約束、通配符或其他限制,從而精確地只返回你想要的內容,而不包含其他的。

通過一些試驗和錯誤,我生成了一個複雜的正則表達式,只返回總統發言的話,分離出並丟棄其他的辭彙或注釋。

數據是否需要清洗?

通常,處理文本的第一步是對其進行標準化。這種歸一化的程度和複雜程度根據人們的需要而變化,可以是簡單地刪除標點符號或大寫字母,也可以是到將單詞的所有變形都縮減為一個詞根。

工作流程例子:

towardsdatascience.com/

詞根鏈接:

nlp.stanford.edu/IR-boo

然而在標準化過程中,可能會丟失的特定特性和模式恰好是我所需要的和要保留的部分。所以,為了讓生成的文本更加可信和真實,我選擇繞過大部分標準的歸一化流程。

文本生成

馬爾可夫鏈

在深入研究深度學習模型之前,我很想探索另一種常用的文本生成方法——馬爾可夫鏈。長期以來,馬爾可夫鏈一直是笑話文本生成的最佳選擇——根據「星際迷航」、 「歷任總統」、「辛普森一家」等關鍵詞快速搜索就有很多故事。

馬爾可夫鏈鏈接:

en.wikipedia.org/wiki/M

故事鏈接:

hackernoon.com/automate

由於馬爾可夫鏈只根據當前的詞來確定下一個詞,所以速度很快,但是效果並不理想。這種演算法每次只關注於特定的一個單詞,它下一個單詞就隨之產生。下一個詞是根據概率隨機選擇的,而概率是與頻率成正比的。下面用一個簡單的例子來說明:

簡化馬爾可夫鏈的例子,其中「taxes」後面只有3個詞:「bigly」,「soon」和句尾。

在現實生活中,如果特朗普說了「taxes」一詞後,70%的情況下緊跟著是「bigly」一詞,那麼在馬爾可夫鏈產生的文本中將會有70%可能性選擇下一個字為「bigly」。

但有時候,他也不會跟「bigly」,而是直接結尾,或者跟其他的詞。這時,馬爾可夫鏈很可能會選擇「bigly」,但它也有可能會選擇其他可能的詞,所以我們生成的文本就是多樣的。然後不停重複這個過程,直到句子結束。

這對於快速而垃圾的應用程序非常適用,但很容易看出它會在哪裡出錯。由於馬爾可夫鏈只關心當前的單詞,因此很容易產生誤區。以談論國內經濟開始的一句話可能很容易以「學徒(The Apprentice)」結束。

根據有限的文本數據集來研究,大部分馬爾可夫鏈的輸出都是荒謬的。但是,偶爾也會迸出一些精彩且幽默的金句:

以「FBI」為開頭經過馬爾可夫鏈訓練出的結果

遞歸神經網路

然而,如果需要得出一些更合理的句式,我需要一些更複雜的東西。遞歸神經網路(RNN)已經成為許多文本或序列化應用程序的首選架構。RNN內部具體的工作原理已經超出了本文的範圍,但是這裡有一些相對來說適合初學者的資料

資料鏈接:

colah.github.io/posts/2

這些神經單位的顯著特徵是它們內部有對順序的「記憶」,辭彙的選擇和語法在很大程度上依賴於周圍的環境,所以這個「記憶」可以通過跟蹤時態、主語和賓語等來創造連貫的思維。

這些網路類型的缺點是它們的計算量非常大——在筆記本電腦上,一次要花一個多小時的時間用這個模型跑完整個文本,考慮到我需要做大約200次,這就不太合適了。

但這也是目前雲計算的發展方向。許多成熟的科技公司提供雲服務,其中最大的是亞馬遜、谷歌和微軟。在一個強大的GPU計算實例中,一個小時的循環時間被縮減為九十秒,時間減少了四十倍以上!

GPU計算實例:

aws.amazon.com/ec2/inst

結果評估

你能判斷出這個陳述是否是真實的嗎?

California finally deserves a great Government to Make America Great Again! #Trump2016

(加州最終值得有一個偉大的政府來讓美國再創輝煌!)

這是從特朗普支持共和黨州長候選人的發言中提取的文本,但它可能會成為特朗普在2016年大選前夕發布的推文。

特朗普支持共和黨州長候選人發言鏈接:

twitter.com/realDonaldT

我實現過的更複雜的神經網路,是在遞歸層前面和後面都具有隱藏的全連接層,它能夠在只基於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.com/tetrahydrofu

歡迎提出任何疑問或反饋!

相關報道:

towardsdatascience.com/

推薦閱讀:

手動實現梯度下降(GD)及優化
機器學習之類別不平衡問題 (1) —— 各種評估指標
深度學習與量子蒙特卡洛 (3) 最優路徑與神經網路
支持向量機SVM總結之問題描述
機器學習筆記(3) - 邏輯回歸

TAG:美國大選 | 機器學習 |