前段时间,github上出现了一个很火的项目——BullshitGenerator,中文名是狗屁不通文章生成器,到现在已经有13.4k个star,用户任意输入一个主题词,就能生成一篇6000字符的文章,而且看起来还颇有文采。当笔者点进这个项目时,发现项目作者用的方法出奇的简单,利用几十行python代码就能达到如此神奇的效果,想到这里大家一定跃跃欲试了。今天我们就来解密下这个狗屁不通文章生成器背后的原理,并告诉大家如何自定义自己的文章生成器。
项目描述
解密BullshitGenerator点进项目主页发现有10个文件,但是大家其实只需要看2个文件就可以了,一个是data.json,这是语料库,也是文章废话的来源;另一个是自动狗屁不通文章生成器.py,这是主文件,运行这个文件就能生成文章。我们先来看下这两个文件的内容。
项目主页
首先,单击data.json,发现里面的内容长下面这样:
{
"title":"学生会退会",
"famous":[ "爱迪生a,天才是百分之一的勤奋加百分之九十九的汗水。b", …… ],
"bosh":["现在, 解决x的问题, 是非常非常重要的. 所以", …… ],
"after":["这不禁令我深思. ", ……],
"before":["曾经说过", ……]
}
如果大家对python的基础知识有了解,就会发现这其实就是一个词典,里面有五个键值对,分别对应主题、名人名言、废话、名人名言前、后的废话。大家如果想自定义自己的文章生成器,只需要改变这个data.json里面的内容就好了。
然后,单击狗屁不通文章生成器.py,这是个python脚本,里面的代码长这样:
import os, re
import random,readJSON
data = readJSON.读JSON文件("data.json")
名人名言 = data["famous"] # a 代表前面垫话,b代表后面垫话
前面垫话 = data["before"] # 在名人名言前面弄点废话
后面垫话 = data['after'] # 在名人名言后面弄点废话
废话 = data['bosh'] # 代表文章主要废话来源
xx = "学生会退会"
重复度 = 2
def 洗牌遍历(列表):
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 xx
def 另起一段():
xx = ". "
xx = "\r\n"
xx = " "
return xx
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)
粗略的浏览一遍,发现代码的主体是三个函数,而且作者为了方便读者理解,变量名和函数名直接用的中文,相信即使不会python的用户,也能大概明白什么意思。这三个函数分别是:洗牌遍历,来点名人名言,另起一段。三个函数的功能是:
只需要随机的排列组合这三个函数,就能生成一篇文采飞扬的文章啦!作者下面给出了使用范例,可以随机生成一篇6000字的文章。大家只要修改main函数的代码就能生成自己的文章啦!例如将main函数里面的6000改为10000,就能生成一篇万字长文啦!
结果展示作者提供了网页版供大家进行尝试,比如输入“人工智能”,生成的文章如下,看起来还不错。其实如果大家想进入深入的研究,可以利用自然语言处理,强化学习等方法来增强语言的逻辑性,那样生成的文章就更像真的啦。
输入人工智能
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved