so easy! 10行程式碼寫個"狗屁不通"文章生成器

liu志軍發表於2020-01-11

前幾天,GitHub 有個開源專案特別火,只要輸入標題就可以生成一篇長長的文章。

so easy! 10行程式碼寫個"狗屁不通"文章生成器

背後實現程式碼一定很複雜吧,裡面一定有很多高深莫測的機器學習等複雜演算法

so easy! 10行程式碼寫個"狗屁不通"文章生成器

不過,當我看了原始碼之後

so easy! 10行程式碼寫個"狗屁不通"文章生成器

這程式不到50行

so easy! 10行程式碼寫個"狗屁不通"文章生成器


儘管我有多年的Python經驗,但我竟然一時也沒有看懂

so easy! 10行程式碼寫個"狗屁不通"文章生成器


這程式碼放到編輯器裡還特麼真能執行

so easy! 10行程式碼寫個"狗屁不通"文章生成器

當然啦,原作者也說了,這個程式碼也是在無聊中誕生的,平時擼碼是不寫中文變數名的, 中文變數名只是最開始瞎寫的時候邊寫語料邊寫程式碼時懶得切英文輸入法了。

中文變數名也就忍了,但程式碼邏輯不好懂,最後我還是忍著劇烈的頭痛把它的原理讀懂了。

這究竟咋實現的呢?

so easy! 10行程式碼寫個"狗屁不通"文章生成器

我肯定是不服的,這程式碼要是被Python之父看見了,他一定後悔發明這門語言。

其實,生成的文章內容都來自於素材檔案 data.json, 這個檔案的結構是個字典結構

{
"famous":[
"愛迪生a,天才是百分之一的勤奮加百分之九十九的汗水。b",
"查爾斯·史a,一個人幾乎可以在任何他懷有無限熱忱的事情上成功。b",
....
],
"bosh":[
"現在, 解決x的問題, 是非常非常重要的. 所以, ",
"我們不得不面對一個非常尷尬的事實, 那就是, ",
....
],
"after":[
"這不禁令我深思. ",
"帶著這句話, 我們還要更加慎重的審視這個問題: ",
....

],
"before":[
"曾經說過",
"在不經意間這樣說過",
....
]
}

famous 裡面收集了很多名人語錄, 裡面的關鍵字”a”和”b” 將分別被 beforeafter列表中的內容替換,這樣處理後句子看起來具有邏輯性

bosh裡面是各種各樣的的廢話, 裡面關鍵字”x”最後會用標題替換,這樣會讓人感覺,這篇文章還是和標題有那麼一丟丟聯絡的。

一篇完整的文章就是靠不斷隨機從famous、bosh列表獲取元素,之後拼接成一篇文章。

搞懂了原理,如果我們自己來寫的話,除去程式碼註釋,就10來行程式碼

import random
import json

data = json.load(open("data.json", encoding="utf-8"))

def generator(title, length=800):
"""
:param title: 文章標題
:param length: 生成正文的長度
:return: 返回正文內容
"""

body = ""
while len(body) < length:
num = random.randint(0, 100)
if num < 10:
body += "\r\n"
elif num < 20:
body += random.choice(data["famous"]) \
.replace('a', random.choice(data["before"])) \
.replace('b', random.choice(data['after']))
else:
body += random.choice(data["bosh"])
body = body.replace("x", title)

return body

來測試一下

from bullshit import generator
content = generator("我愛Python")
print(content)

輸出

一般來說, 問題的關鍵究竟為何? 既然如何,
對我個人而言,我愛Python不僅僅是一個重大的事件,還可能會改變我的人生.
我愛Python, 到底應該如何實現. 生活中, 若我愛Python出現了, 我們就不得不考慮它出現了的事實. 從這個角度來看, 易卜生說過一句富有哲理的話, 偉大的事業,需要決心,能力,組織和責任感。我希望諸位也能好好地體會這句話. 我們不妨可以這樣來想: 我們不妨可以這樣來想: 奧斯特洛夫斯基曾經提到過, 共同的事業,共同的鬥爭,可以使人們產生忍受一切的力量。 這不禁令我深思. 在這種困難的抉擇下, 本人思來想去, 寢食難安.問題的關鍵究竟為何? 帶著這些問題, 我們來審視一下我愛Python. 我愛Python似乎是一種巧合,但如果我們從一個更大的角度看待問題,這似乎是一種不可避免的事實.
現在, 解決我愛Python的問題, 是非常非常重要的. 所以, 對我個人而言,我愛Python不僅僅是一個重大的事件,還可能會改變我的人生. 現在, 解決我愛Python的問題, 是非常非常重要的. 所以,

這樣看來, 在這種不可避免的衝突下,我們必須解決這個問題. 既然如何, 要想清楚, 我愛Python, 到底是一種怎麼樣的存在. 既然如此, 總結的來說, 經過上述討論, 我愛Python因何而發生?總結的來說, 就我個人來說, 我愛Python對我的意義, 不能不說非常重大. 而這些並不是完全重要, 更加重要的問題是, 問題的關鍵究竟為何? 笛卡兒曾經提到過, 我的努力求學沒有得到別的好處,只不過是愈來愈發覺自己的無知。這句話語雖然很短, 但令我浮想聯翩. 我認為, 我愛Python, 發生了會如何, 不發生又會如何. 經過上述討論,
在這種困難的抉擇下, 本人思來想去, 寢食難安.我愛Python, 到底應該如何實現. 我愛Python, 到底應該如何實現.

你還自定義內容長度

content = generator("我愛Python", length=1000)
print(content)

輸出

要想清楚, 我愛Python, 到底是一種怎麼樣的存在. 我們都知道, 只要有意義, 那麼就必須慎重考慮.瞭解清楚我愛Python到底是一種怎麼樣的存在, 是解決一切問題的關鍵.
從這個角度來看, 一般來說, 帶著這些問題, 我們來審視一下我愛Python. 我們不得不面對一個非常尷尬的事實, 那就是, 吉姆·羅恩在不經意間這樣說過, 要麼你主宰生活,要麼你被生活主宰。這句話把我們帶到了一個新的維度去思考這個問題: 我愛Python, 到底應該如何實現. 每個人都不得不面對這些問題. 在面對這種問題時, 問題的關鍵究竟為何? 可是,即使是這樣,我愛Python的出現仍然代表了一定的意義. 我們一般認為, 抓住了問題的關鍵, 其他一切則會迎刃而解.瞭解清楚我愛Python到底是一種怎麼樣的存在, 是解決一切問題的關鍵.我認為, 瞭解清楚我愛Python到底是一種怎麼樣的存在, 是解決一切問題的關鍵.我愛Python, 到底應該如何實現. 我愛Python的發生, 到底需要如何做到, 不我愛Python的發生, 又會如何產生. 現在, 解決我愛Python的問題, 是非常非常重要的. 所以, 我們不妨可以這樣來想: 現在, 解決我愛Python的問題, 是非常非常重要的. 所以, 我愛Python, 到底應該如何實現. 馬克思說過一句富有哲理的話, 一切節省,歸根到底都歸結為時間的節省。這啟發了我. 我們不妨可以這樣來想: 我愛Python似乎是一種巧合,但如果我們從一個更大的角度看待問題,這似乎是一種不可避免的事實. 問題的關鍵究竟為何? 歌德曾經說過一句富有哲理的話,流水在碰到底處時才會釋放活力。帶著這句話, 我們還要更加慎重的審視這個問題: 我們不得不面對一個非常尷尬的事實, 那就是, 我們不得不面對一個非常尷尬的事實, 那就是, 我愛Python, 到底應該如何實現. 一般來講, 我們都必須務必慎重的考慮考慮. 我們都知道, 只要有意義, 那麼就必須慎重考慮.總結的來說,
我們一般認為, 抓住了問題的關鍵, 其他一切則會迎刃而解.
這種事實對本人來說意義重大, 相信對這個世界也是有一定意義的.既然如何, 就我個人來說, 我愛Python對我的意義, 不能不說非常重大. 我愛Python, 發生了會如何, 不發生又會如何. 莎士比亞說過一句著名的話, 意志命運往往背道而馳,決心到最後會全部推倒。這句話語雖然很短, 但令我浮想聯翩.

是不是很簡單。

so easy! 10行程式碼寫個"狗屁不通"文章生成器

當然,你也可以引入更多NLP等技術進來,不過這對我來說

so easy! 10行程式碼寫個"狗屁不通"文章生成器

原專案地址:https://github.com/menzi11/BullshitGenerator

重構後的程式碼地址:
https://github.com/lzjun567/BullshitGenerator

推薦閱讀:
19個惡搞Linux命令
1000行 MySQL 學習筆記,不怕你不會,就怕你不學!
Python之父退休,龜叔與Python的淵源

so easy! 10行程式碼寫個"狗屁不通"文章生成器
關注“Python之禪“,學地道的Python技術

相關文章