日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开源项目学习笔记(1)——狗屁不通文章生成器(BullshitGenerator)

發(fā)布時間:2024/1/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源项目学习笔记(1)——狗屁不通文章生成器(BullshitGenerator) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

參考資料: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ī)用途!

關(guān)于中文變量名:

平時擼碼鄙人是不寫中文變量名的, 本項目中的中文變量名只是最開始瞎寫的時候邊寫語料邊寫代碼時懶得切英文輸入法了. 不過既然如此就保持吧!

關(guān)于生成算法:

鄙人才疏學(xué)淺并不會任何自然語言處理相關(guān)算法. 而且目前比較偏愛簡單有效的方式達到目的方式. 除非撞到了天花板, 否則暫時不會引入任何神經(jīng)網(wǎng)絡(luò)等算法. 不過歡迎任何人另開分支實現(xiàn)更復(fù)雜, 效果更好的算法. 不過除非效果拔群, 否則鄙人暫時不會融合.

一、項目概覽

項目中提供了在線版和Python3版本兩種,其中與Python版本有關(guān)的文件有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())
  • 這個函數(shù)的核心是后兩句:獲取文件句柄,利用read()函數(shù),將file中的數(shù)據(jù)轉(zhuǎn)化為str字符串,再利用json.loads()函數(shù)將字符串轉(zhuǎn)換成dict字典類型返回。
  • 前面的代碼是為了增強代碼的穩(wěn)定性,防止因為文件名導(dǎo)致的文件讀寫錯誤。
  • 關(guān)于json.loads()函數(shù),請參考Python中用json.load() json.loads()加載json數(shù)據(jù)的方法
  • 自動狗屁不通文章生成器.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 = "學(xué)生會退會"重復(fù)度 = 2def 洗牌遍歷(列表):global 重復(fù)度池 = list(列表) * 重復(fù)度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 重復(fù)度池 = list(列表) * 重復(fù)度while True:random.shuffle()for 元素 in:yield 元素下一句廢話 = 洗牌遍歷(廢話) 下一句名人名言 = 洗牌遍歷(名人名言)
  • 池 = list(列表) * 重復(fù)度 將列表重復(fù)了n次

  • random.shuffle()函數(shù)將“池”中元素打亂重新排列

  • yield:

    這個應(yīng)該是整個項目里面最難懂的部分,本人之前也沒接觸過這種用法(可能是因為我太菜了),在網(wǎng)上搜索了相關(guān)用法,這個是我覺得講的最好的一篇博客:python中yield的用法詳解

    帶yield的函數(shù)是一個生成器(Generator),下面的“下一句廢話”與“下一句名人名言”相當(dāng)于他的兩個實例。每一次使用next()函數(shù)時,從上一次的yield中斷處開始運行,直至遇到下一個yield中斷運行并返回相應(yīng)值,如果遇到return或者函數(shù)體結(jié)尾,自動拋出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ù)內(nèi)介紹的next()函數(shù),xx = next(下一句名人名言),即從上一次調(diào)用洗牌遍歷(名人名言)這一函數(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)
  • for循環(huán)遍歷文章主題的字符串,如果在輸入文章主題時直接回車,那么程序會直接結(jié)束。
  • for循環(huán)的次數(shù)和字符串長度有關(guān),for循環(huán)內(nèi)部生成一個6000字左右的字符串,所以生成的文章的總長度與文章主題的長度成正相關(guān)關(guān)系,文章主題每多一個字,文章長度就會增加6000字左右,小伙伴們可以自行驗證一下。
  • 分支:random.randint(0,100)生成一個0~100之間的隨機整數(shù)(包括0和100),如果在0~4之間,另起一段,5~19添加名人名言,20~100添加廢話,所以說按照概率從大到小排序:添加廢話>添加名人名言>另起一段
  • 廢話中有x表示需要填充的文章主題,tmp = tmp.replace("x",xx)將文章中所有的x都替換成文章主題,注意:**這句函數(shù)中的“x”是加引號的,要與for x in xx:中的x區(qū)分開。**之后,把生成的文章print出來,就完成了!
  • 綜上,我們看完了BullshitGenerator的整個代碼,不知道你們感覺怎樣,反正我這個Python小白是收獲滿滿。文章中難免有錯誤紕漏之處,歡迎大家批評指正。

    總結(jié)

    以上是生活随笔為你收集整理的开源项目学习笔记(1)——狗屁不通文章生成器(BullshitGenerator)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。