20行Python程式碼實現能夠機器學習的雞湯句智慧生成器
“Don’t think of the overwhelming majority of the impossible.”
“不要去想不可能之事”
“Grew up your bliss and the world.”
“努力贏得自己的幸福和世界”
“what we would end create, creates the ground and you are the one to warm it”
“我們想要結束的創造卻造就了大地,唯你抱以溫情”
“look and give up in miracles”
“仰望奇蹟,放棄幻想”
但其實上面這些雞湯句子全都是電腦生成的,而且其生成雞湯文所用的程式還不到 20 行 Python 程式碼。
一提到自然語言生成,人們通常會覺得這一定是很先進的 AI 系統,使用了很高階的數學知識。但是,事實並非如此。在本文我(作者 Ramtin Alami——譯者注)會用馬爾科夫鏈(Markov chains)和一個很小的雞湯文資料集生成新的雞湯文。
馬爾科夫鏈
馬爾科夫鏈是一種隨機模型,能根據先前的事件單獨預測一個事件。舉個簡單的例子,就用我家喵主子的生活狀態轉換解釋一下吧。我家喵主子總是要麼吃、要麼睡、要麼玩玩具。她大部分時間都是在睡覺,但是偶爾會睡醒起來用膳。通常,用膳過後她會倍兒精神,開始玩玩具,玩夠了就回去睡,然後再睡醒去吃。
用馬爾科夫鏈就能很容易地模擬出我家喵主人的生活狀態,因為她會根據之前的狀態決定下一步去幹嘛。她一般不會醒來後直接去玩玩具,但是吃完東西后,有很大概率去玩一會。這些生活狀態轉換也可以用圖表的形式表現出來:
每個迴圈是一個生活狀態,箭頭所指的是下一個生活狀態,箭頭旁邊的數字是指她從一種狀態轉到另一種狀態的可能性。我們可以看到,狀態轉換的可能性基本上只根據上一種生活狀態。
使用馬爾科夫鏈生成文字
使用馬爾科夫鏈生成文字也是採用了相同的理念,努力找到一個詞出現在另一個詞後面的概率。為了確認這些轉換的可能性,我們用一些例句訓練模型。
例如,我們使用下面這些句子訓練模型:
我喜歡吃蘋果(I like to eat apples)。 你吃橘子(You eat oranges)。
從上面這兩個訓練句子,我們可以總結出“I”(我),“like”(喜歡)和“eat”(吃)總是以相同的順序出現,而“you”(你)和“eat”(吃)一直連在一起。但是“orange”(橘子)和“apples”(蘋果)出現在詞彙“eat”(吃)後面的機率是相等的。下面這個轉換圖表能更好地顯示我上面講的這一堆:
這兩個訓練句子能夠生成兩個新的句子,但是情況不總是這樣。我用下面這四個句子訓練了另一個模型,結果大不相同:
我朋友做出的樹莓派在鎮上最好(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)。
用這四個句子訓練的模型的轉換圖表會大得多。
雖然圖表和典型的馬爾科夫鏈轉換圖表看起來大不一樣,但兩者背後的主要理念是一樣的。
從起始節點開始的路徑會隨機選取接下來的詞,一直到終端節點。詞語之間相連路徑的寬度表示詞彙被選取的概率。
雖然只用四個句子訓練,上面的模型卻能夠生成幾百個不同的句子。
程式碼
上面這個文字生成器的程式碼非常簡單,除了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]]
生成雞湯句
生成器部分包含一個迴圈。它首先會選取一個隨機的起始詞並將其新增至一個列表,然後會在詞典中所搜包含潛在跟隨詞的列表,並隨機選取一個列表,將新的選取的詞新增至該列表。生成器會一直選擇隨機的潛在跟隨詞直到找到結束詞,然後會停止迴圈,輸出生成的句子或所謂的“名言”。Python資源分享秋秋裙 855408893 ,內有安裝包,學習視訊資料,免費直播實戰案例。這裡是Python學習者的聚集地,零基礎,進階,都歡迎
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)就是用“亞拉伯罕·林肯”和“阿道夫·希特勒”兩人的名字混合而成。
你也可以這麼操作,把一些名人的名字輸入馬爾科夫鏈中,讓它生成好玩的混合人物名,(比如…
郭達·斯坦森
尼古拉斯.趙四
甚至你還能更進一步,把一些名人的名言,比如上面說的林肯和希特勒的演講句子用馬爾科夫鏈混合後生成全新風格的演講。
馬爾科夫鏈幾乎可以應用在所有領域,雖然文字生成並非最有用處的應用,但我確實覺得這項應用很有意思,萬一你生產的雞湯文有朝一日吸引來的粉絲比咪蒙還多呢?
相關推薦
20行Python程式碼實現能夠機器學習的雞湯句智慧生成器
“Don’t think of the overwhelming majority of the impossible.” “不
20行python程式碼實現雞湯智慧生成器
“Don’t think of the overwhelming majority
三十八、100行python程式碼實現機器學習自動分類
現在朋友圈、公眾號、微博資訊應接不暇,以微信公眾號舉例,看技術極客是怎麼自動篩出自己想看的文章的,100行機器學習程式碼就能自動幫你歸好類,要想找出想看的和不想看的,你再也不用刷朋友圈了 準備工作 1. 準備一張mysql資料庫表,至少包含這些列:id、title(文章標題)、content(文章內
利用itchat 10行python程式碼實現微信轟炸
''' 轉載:https://github.com/Gin79/WeChat-Bomb/blob/master/README.md ''' 說明 站在巨人的肩膀上 基於python,這個小程式是用python寫的 使用的是python第三方庫itchat,itc
用20行JS程式碼實現貼上板功能
document.execCommand() 此方法就是實現剪貼簿的關鍵,它可以傳入cut,copy,paste三種引數。從最常用的document.execCommand('copy')開始介紹。 在使用之前,我們應該檢查瀏覽器是否支援copy命令:document.queryCommandS
神奇,幾行Python程式碼實現隨機生成生成優惠券
生活中我們到處搶優惠券,到處用到優惠券,彷彿一輸入類似“yxune1uaqc5”一串代號的優惠券,立刻感覺撿到大便宜。商家這些優惠券的編碼都是怎麼生成的呢? 學習Python中有不明白推薦加入交流群 &n
一個 11 行 Python 程式碼實現的神經網路
概要:直接上程式碼是最有效的學習方式。這篇教程通過由一段簡短的 python 程式碼實現的非常簡單的例項來講解 BP 反向傳播演算法。 程式碼如下: Python 1234567891011X=np.array([
表哥用80行Python程式碼實現“頭腦王者”,運營竅訣躺著教我賺錢!
最近感覺微信小程式比較火、頭腦王者,周圍很多人在玩“跳一跳”和“頭腦王者”之類的小遊戲。 我對小程式也產生了濃厚的興趣。一開始看到官方的小程式的介紹,也看了小程式的部分開發文件,本能以為微信小程式不過是一個瀏覽器框架,小程式也只是網頁而已。首先認為小程式通過了HTTP協yi傳輸了相應的JS、HT
基於Tkinter用50行Python程式碼實現簡易計算器
Tkinter一般是python自帶的,所以程式碼不需要其他元件,本程式是在python2.7版本實現的。 主要涉及了tkinter的使用,函式定義和呼叫,匿名函式的使用,類成員函式定義等python基礎知識,適合新手學習。 程式碼如下: from Tkinter
300行Python程式碼實現俄羅斯方塊,致敬逝去的童年
本文程式碼基於 python3.6 和 pygame1.9.4。 俄羅斯方塊是兒時最經典的遊戲之一,剛開始接觸 pygame 的時候就想寫一個俄羅斯方塊。但是想到旋轉,停靠,消除等操作,感覺好像很難啊,等真正寫完了發現,一共也就 300 行程式碼,並沒有什麼難的。 先來看一個遊戲截圖,有點醜
20行python程式碼的入門級小遊戲
0、背景: 作為一個python小白,今天從菜鳥教程上看了一些python的教程,看到了python的一些語法,對比起來(有其他語言功底),感覺還是非常有趣,就隨手添了一點內容,改了一個小例程,當著練練手,從一些小例子入門感覺效率很高。1、程式碼內容:不多說了,直接上程
5行Python程式碼實現一個簡單的線上英漢詞典
# -*- coding: utf-8 -*- import urllib, urllib2, simplejson while True: url = 'http://fanyi.youdao.com/openapi.do?key=79379998&keyfro
200行python程式碼實現一個類似django的簡單模板引擎
之前使用django覺得模板就是通過正則等方法把裡面的標籤替換成變數,其實裡面還大有學問。 後面看到一些模板引擎的原理,覺得很酷,比如下面這個教程講的,這是500lines系列裡的一篇文章。 教程原文地址:http://aosabook.org/en/500L/a-tem
強大的15行python程式碼,實現微信無限轟炸
前言 想不想擁有一項酷炫,狂拽叼,非常能裝逼的技能呢,可以指定你想要轟炸的群,或者人,非常非常簡單的十幾行Python程式碼,只
50行Python程式碼實現視訊中物體顏色識別和跟蹤(必須以紅色為例)
目前計算機視覺(CV)與自然語言處理(NLP)及語音識別並列為人工智慧三大熱點方向,而計算機視覺中的物件檢測(objectdetection)應用非常廣泛,比如自動駕駛、視訊監控、工業質檢、醫療診斷等場景。 目標檢測的根本任務就是將圖片或者視訊中感興趣的目標提取出來,目標的識別可以基於顏色、紋理、形狀。其
20行Python程式碼爬取王者榮耀全英雄面板
引言王者榮耀大家都玩過吧,沒玩過的也應該聽說過,作為時下最火的手機MOBA遊戲,咳咳,好像跑題了。我們今天的重點是爬取王者榮耀所有英雄的所有面板,而且僅僅使用20行Python程式碼即可完成。 準備工作爬取面板本身並不難,難點在於分析,我們首先得得到面板圖片的url地址,話不多說,我們馬上來到王者榮耀的官網:
帶大家用40行python程式碼實現一個疫情地圖
最近兩個月,因為新冠病毒無情的肆虐,相信會給每個中國人的記憶中畫上重重的一筆。到今天為止,疫情形勢依然十分嚴峻,雖然除湖北外的其他省份已經連續十一天確診人數下降,但是接下來還有將近至少1.6億的人口遷徙,這無疑還存在一定的風險。 相信很多人和我一樣,早上起床的第一件事情都是檢視疫情資料,一般的資料都配有中國確
150+行Python程式碼實現帶介面的數獨遊戲
# 150行程式碼實現圖形化數獨遊戲 [Github地址](https://github.com/NemoHoHaloAi/Sudoku--),歡迎各位大佬們fork、star啥的,感謝; 今天閒著沒事幹,以前做過html+js版的數獨,這次做個python版本的,介面由pygame完成,數獨生成由遞迴演
140行Python程式碼實現Flippy Bird
# 140行程式碼實現Flippy Bird 話說這遊戲中文名叫什麼來著,死活想不起來了,算了話不多說,140行實現小遊戲系列第二章,依然是簡單小遊戲,與數獨遊戲相比,在遊戲介面顯示上更難一些,但是在邏輯方面更簡單一些,需要處理的無非是速度、加速度、時間、位置、碰撞檢測,介面方面則要實現整個動態的顯示;