20行Python代碼實現可以機器學習的雞湯句智能生成器

「Don’t think of the overwhelming majority of the impossible.」bash

「不要去想不可能之事」app

「Grew up your bliss and the world.」dom

「努力贏得本身的幸福和世界」機器學習

「what we would end create, creates the ground and you are the one to warm it」學習

「咱們想要結束的創造卻造就了大地,惟你抱以溫情」ui

「look and give up in miracles」spa

「仰望奇蹟,放棄幻想」3d

但其實上面這些雞湯句子全都是電腦生成的,並且其生成雞湯文所用的程序還不到 20 行 Python 代碼。code

圖0:20行Python代碼實現可以機器學習的雞湯句智能生成器

一提到天然語言生成,人們一般會以爲這必定是很先進的 AI 系統,使用了很高級的數學知識。可是,事實並不是如此。在本文我(做者 Ramtin Alami——譯者注)會用馬爾科夫鏈(Markov chains)和一個很小的雞湯文數據集生成新的雞湯文。cdn

馬爾科夫鏈

馬爾科夫鏈是一種隨機模型,能根據先前的事件單獨預測一個事件。舉個簡單的例子,就用我家喵主子的生活狀態轉換解釋一下吧。我家喵主子老是要麼吃、要麼睡、要麼玩玩具。她大部分時間都是在睡覺,可是偶爾會睡醒起來用膳。一般,用膳事後她會倍兒精神,開始玩玩具,玩夠了就回去睡,而後再睡醒去吃。

圖1:20行Python代碼實現可以機器學習的雞湯句智能生成器

用馬爾科夫鏈就能很容易地模擬出我家喵主人的生活狀態,由於她會根據以前的狀態決定下一步去幹嗎。她通常不會醒來後直接去玩玩具,可是吃完東西后,有很大機率去玩一會。這些生活狀態轉換也能夠用圖表的形式表現出來:

圖2:20行Python代碼實現可以機器學習的雞湯句智能生成器

每一個循環是一個生活狀態,箭頭所指的是下一個生活狀態,箭頭旁邊的數字是指她從一種狀態轉到另外一種狀態的可能性。咱們能夠看到,狀態轉換的可能性基本上只根據上一種生活狀態。

使用馬爾科夫鏈生成文本

使用馬爾科夫鏈生成文本也是採用了相同的理念,努力找到一個詞出如今另外一個詞後面的機率。爲了確認這些轉換的可能性,咱們用一些例句訓練模型。

例如,咱們使用下面這些句子訓練模型

我喜歡吃蘋果(I like to eat apples)。 你吃橘子(You eat oranges)。

從上面這兩個訓練句子,咱們能夠總結出「I」(我),「like」(喜歡)和「eat」(吃)老是以相同的順序出現,而「you」(你)和「eat」(吃)一直連在一塊兒。可是「orange」(橘子)和「apples」(蘋果)出如今詞彙「eat」(吃)後面的概率是相等的。下面這個轉換圖表能更好地顯示我上面講的這一堆:

圖3:20行Python代碼實現可以機器學習的雞湯句智能生成器

這兩個訓練句子可以生成兩個新的句子,可是狀況不老是這樣。我用下面這四個句子訓練了另外一個模型,結果大不相同:

我朋友作出的樹莓派在鎮上最好(my friend makes the best raspberry pies in town)。 我以爲蘋果派最好(i think apple pies are the best pies)。 史蒂夫以爲蘋果作出的電腦在世界上最好(steve thinks apple makes the best computers in the world)。 我有兩臺電腦,它們不是蘋果電腦,由於我既不是史蒂夫也不是大款(I own two computers and they’re not apple because I am not steve or rich)。

用這四個句子訓練的模型的轉換圖表會大得多。

雖然圖表和典型的馬爾科夫鏈轉換圖表看起來大不同,但二者背後的主要理念是同樣的。

圖4:20行Python代碼實現可以機器學習的雞湯句智能生成器

從起始節點開始的路徑會隨機選取接下來的詞,一直到終端節點。詞語之間相連路徑的寬度表示詞彙被選取的機率。

雖然只用四個句子訓練,上面的模型卻可以生成幾百個不一樣的句子。

圖5:20行Python代碼實現可以機器學習的雞湯句智能生成器

代碼

上面這個文本生成器的代碼很是簡單,除了Python的隨機模塊,不須要任何額外的模塊或程序庫。代碼包含兩部分,一個用來訓練,另外一個用來生成。

訓練

訓練代碼構造了咱們稍後會用來生成雞湯句的模型。我用了一個詞典做爲模型,其包含一些詞彙做爲關鍵點,還有一列可能跟隨詞做爲對應值。例如,用上面「我喜歡吃蘋果」(‘I like to eat apples’)和「你吃橘子」(You eat oranges)這兩個句子訓練的模型的詞典會是這樣:

{'START': ['i', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'], 'you': ['eat'], 'eat': ['apples', 'oranges'], 'END': ['apples', 'oranges']}

複製代碼

咱們不須要計算跟隨詞出現的機率,由於若是它們出現的機率較高,那麼它們會在可能跟隨詞列表中屢次出現。例如,若是咱們想另外添加訓練句子「咱們吃蘋果」(‘we eat apples’),詞彙「蘋果」(‘apples’)已經在兩個句子中出如今詞彙「吃」(eat)後面,那麼它出現的機率就會很高。在該模型的詞典中,若是在「吃」(eat)列表中出現兩次就屬於出現機率較高。

{'START': ['i', 'we', 'you'], 'i': ['like'], 'like': ['to'], 'to': ['eat'], 'you': ['eat'], 'we': ['eat'], 'eat': ['apples', 'oranges', 'apples'], 'END': ['apples', 'oranges', 'apples']}

複製代碼

另外,在上面的模型詞典中還有兩個術語:「起始」(START)和「結束」(END),它們表示一個生成的句子的起始詞和結束詞。

for line in dataset_file:
    line = line.lower().split()
    for i, word in enumerate(line):
        if i == len(line)-1:   
            model['END'] = model.get('END', []) + [word]
        else:    
            if i == 0:
                model['START'] = model.get('START', []) + [word]
            model[word] = model.get(word, []) + [line[i+1]] 

複製代碼

生成雞湯句

生成器部分包含一個循環。它首先會選取一個隨機的起始詞並將其添加至一個列表,而後會在詞典中所搜包含潛在跟隨詞的列表,並隨機選取一個列表,將新的選取的詞添加至該列表。生成器會一直選擇隨機的潛在跟隨詞直到找到結束詞,而後會中止循環,輸出生成的句子或所謂的「名言」。

import random 

generated = []
while True:
    if not generated:
        words = model['START']
    elif generated[-1] in model['END']:
        break
    else:
        words = model[generated[-1]]
    generated.append(random.choice(words))

複製代碼

我用馬爾科夫鏈生成了很多雞湯文,可是做爲文本生成器,你能夠輸入任何文本,讓它生成類似的句子

用馬爾科夫鏈文本生成器還能夠作別的很酷的事情,就是混合不一樣的文本類型。例如,在我最喜歡的電視劇《瑞克和莫蒂》中,有個角色叫作「亞拉道夫·林肯勒」(Abradolf Lincler)就是用「亞拉伯罕·林肯」和「阿道夫·希特勒」兩人的名字混合而成。

你也能夠這麼操做,把一些名人的名字輸入馬爾科夫鏈中,讓它生成好玩的混合人物名,(好比…

圖6:20行Python代碼實現可以機器學習的雞湯句智能生成器

郭達·斯坦森

圖7:20行Python代碼實現可以機器學習的雞湯句智能生成器

尼古拉斯.趙四

甚至你還能更進一步,把一些名人的名言,好比上面說的林肯和希特勒的演講句子用馬爾科夫鏈混合後生成全新風格的演講。

馬爾科夫鏈幾乎能夠應用在全部領域,雖然文本生成並不是最有用處的應用,但我確實以爲這項應用頗有意思,萬一你生產的雞湯文有朝一日吸引來的粉絲比咪蒙還多呢?

圖8:20行Python代碼實現可以機器學習的雞湯句智能生成器
相關文章
相關標籤/搜索