开源项目学习笔记(1)——狗屁不通文章生成器(BullshitGenerator)
參考資料:1.Python中用json.load() json.loads()加載json數(shù)據(jù)的方法:https://blog.csdn.net/xiongchengluo1129/article/details/78779418?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2. python中yield的用法詳解:https://blog.csdn.net/mieleizhi0522/article/details/82142856/
一個很有趣的項目,輸入主題,分分鐘洋洋灑灑上萬字形式主義大作。
項目的Github地址:https://github.com/menzi11/BullshitGenerator
網(wǎng)頁版在線生成器:https://suulnnka.github.io/BullshitGenerator/index.html
效果:作者聲明:
偶爾需要一些中文文字用于GUI開發(fā)時測試文本渲染. 本項目只做這一項, 請勿用于其他任何用途.
再次聲明一下, 本項目生成的文章真的狗屁不通, 只能拿來搞笑, 請不要用于正規(guī)用途!
關于中文變量名:
平時擼碼鄙人是不寫中文變量名的, 本項目中的中文變量名只是最開始瞎寫的時候邊寫語料邊寫代碼時懶得切英文輸入法了. 不過既然如此就保持吧!
關于生成算法:
鄙人才疏學淺并不會任何自然語言處理相關算法. 而且目前比較偏愛簡單有效的方式達到目的方式. 除非撞到了天花板, 否則暫時不會引入任何神經(jīng)網(wǎng)絡等算法. 不過歡迎任何人另開分支實現(xiàn)更復雜, 效果更好的算法. 不過除非效果拔群, 否則鄙人暫時不會融合.
一、項目概覽
項目中提供了在線版和Python3版本兩種,其中與Python版本有關的文件有3個,自動狗屁不通文章生成器.py(主框架),readJSON.py(讀取JSON庫),data.json(儲存名言和廢話)
二、代碼分析
readJSON.py
def 讀JSON文件(fileName=""):import jsonif fileName!='':strList = fileName.split(".")if strList[len(strList)-1].lower() == "json":with open(fileName,mode='r',encoding="utf-8") as file:return json.loads(file.read())自動狗屁不通文章生成器.py
#!/usr/bin/python # -*- coding: UTF-8 -*-import random import readJSONdata = readJSON.讀JSON文件("data.json") 名人名言 = data["famous"] # a 代表前面墊話,b代表后面墊話 前面墊話 = data["before"] # 在名人名言前面弄點廢話 后面墊話 = data['after'] # 在名人名言后面弄點廢話 廢話 = data['bosh'] # 代表文章主要廢話來源xx = "學生會退會"重復度 = 2def 洗牌遍歷(列表):global 重復度池 = list(列表) * 重復度while True:random.shuffle(池)for 元素 in 池:yield 元素下一句廢話 = 洗牌遍歷(廢話) 下一句名人名言 = 洗牌遍歷(名人名言)def 來點名人名言():global 下一句名人名言xx = next(下一句名人名言)xx = xx.replace("a", random.choice(前面墊話))xx = xx.replace("b", random.choice(后面墊話))return xxdef 另起一段():xx = ". "xx += "\r\n"xx += " "return xxif __name__ == "__main__":xx = input("請輸入文章主題:")for x in xx:tmp = str()while len(tmp) < 6000:分支 = random.randint(0, 100)if 分支 < 5:tmp += 另起一段()elif 分支 < 20:tmp += 來點名人名言()else:tmp += next(下一句廢話)tmp = tmp.replace("x", xx)print(tmp)1.洗牌遍歷
def 洗牌遍歷(列表):global 重復度池 = list(列表) * 重復度while True:random.shuffle(池)for 元素 in 池:yield 元素下一句廢話 = 洗牌遍歷(廢話) 下一句名人名言 = 洗牌遍歷(名人名言)池 = list(列表) * 重復度 將列表重復了n次
random.shuffle()函數(shù)將“池”中元素打亂重新排列
yield:
這個應該是整個項目里面最難懂的部分,本人之前也沒接觸過這種用法(可能是因為我太菜了),在網(wǎng)上搜索了相關用法,這個是我覺得講的最好的一篇博客:python中yield的用法詳解
帶yield的函數(shù)是一個生成器(Generator),下面的“下一句廢話”與“下一句名人名言”相當于他的兩個實例。每一次使用next()函數(shù)時,從上一次的yield中斷處開始運行,直至遇到下一個yield中斷運行并返回相應值,如果遇到return或者函數(shù)體結尾,自動拋出StopIteration異常。
對于這段代碼,通過一個for循環(huán),保證每一次返回的元素都與上一次不同。
2.來點名人名言
def 來點名人名言():global 下一句名人名言xx = next(下一句名人名言)xx = xx.replace("a", random.choice(前面墊話))xx = xx.replace("b", random.choice(后面墊話))return xx不得不說作者的函數(shù)名起得還是很魔性的,O(∩_∩)O哈哈~
在這里我們見到了在上一個函數(shù)內介紹的next()函數(shù),xx = next(下一句名人名言),即從上一次調用洗牌遍歷(名人名言)這一函數(shù)的yield中斷處開始執(zhí)行,通過for循環(huán),返回了一個名人名言。
名人名言的格式:名人+a+名言+b,如“愛迪生a,天才是百分之一的勤奮加百分之九十九的汗水。b”,所以作者要對a和b進行替換,random.choice()函數(shù)返回列表中的一個隨機值,作者從前面墊話和后面墊話的列表中各取出一句,然后利用replace()這一字符串處理函數(shù)替換掉原來的a和b,這時xx已經(jīng)成為一個完整的名人名言了。
3.另起一段
def 另起一段():xx = ". "xx += "\r\n"xx += " "return xx這個函數(shù)沒什么好說的,就是一個句號+換行符+首行縮進。
4.main函數(shù)
if __name__ == "__main__":xx = input("請輸入文章主題:")for x in xx:tmp = str()while len(tmp) < 6000:分支 = random.randint(0, 100)if 分支 < 5:tmp += 另起一段()elif 分支 < 20:tmp += 來點名人名言()else:tmp += next(下一句廢話)tmp = tmp.replace("x", xx)print(tmp)綜上,我們看完了BullshitGenerator的整個代碼,不知道你們感覺怎樣,反正我這個Python小白是收獲滿滿。文章中難免有錯誤紕漏之處,歡迎大家批評指正。
總結
以上是生活随笔為你收集整理的开源项目学习笔记(1)——狗屁不通文章生成器(BullshitGenerator)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TOM企业邮箱|你会设置电子名片吗?
- 下一篇: Matlab 透视变换 原理及其代码实现