瑞克|用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集( 二 )
streamlit run app.py
接下来 , 加入一个自由调节插件 , 用来实现用户自定义模型需要生成的角色数:
slider = st.slider('Max story length (in characters)', 50, 200)
现在我们可以开始生成文本啦!来做一个执行生成命令的按钮吧:
button = st.button('Generate')
我们的应用要感知“按下按钮”的动作 , 此功能借助一个简单的条件语句实现 。 文本生成后会打印到屏幕上:
if button:
output_text = model(textbox, max_length=slider)[0]['generated_text']
for i, line in enumerate(output_text.split("\n")):
if ":" in line:
speaker, speech = line.split(':')
st.markdown(f'__{speaker}__: {speech}')
else:
st.markdown(line)
下面向之前定义的文本框输入提示语生成故事:
Rick: Come on, flip the pickle, Morty. You're not gonna regret it. The payoff is huge.
瑞克:莫蒂 , 快呀 , 把泡菜黄瓜翻过来 , 你不会后悔的 。 你会得到巨大回报的 。
输出:
Rick: Come on, flip the pickle, Morty. You're not gonna regret it. The payoff is huge. You don't have to be bad, Morty.
瑞克:莫蒂 , 快呀 , 把泡菜黄瓜翻过来 , 你不会后悔的 。 你会得到巨大回报的 。 莫蒂 , 你不用扮演坏人的 。
(瑞克台词结束)
【换景退出 。 莫蒂在家里】
很棒的输出!模型根据提示输出了新内容 , 而且看上去不错 。 我们还能通过调整decoding方法的参数来进一步提升输出的质量 。 Hugging Face的帖子里有关于不同方法解码的更多概述9 。 现在 , 让我们替换模型函数并给更多参数赋值:
output_text = model(textbox, do_sample=True, max_length=slider, top_k=50, top_p=0.95, num_returned_sequences=1)[0]['generated_text']
简而言之 , do_sample会随机挑选下一个词语 , top_k过滤控制最有可能在下一个词出现的词汇的个数 , top_p允许后面生成词语数量的动态增加或减少 , num_returned_sequences参数负责输出多个相互独立的样本以供进一步筛选和评估(在我们的案例出只输出了一组样本) 。
通过调节这些参数 , 你就能获得不同类型的输出结果 。 让我们用这种解码方法生成另一个输出吧 。
输出:
Rick: Come on, flip the pickle, Morty. You're not gonna regret it. The payoff is huge.
瑞克:莫蒂 , 快呀 , 把腌黄瓜翻过来 , 你不会后悔的 。 这是个大惊喜 。
Morty: Ew, no, Rick! Where are you?
莫蒂:呃 , 不 , 瑞克!你在哪?
Rick: Morty, just do it! [laughing] Just flip the pickle!
瑞克:莫蒂 , 就这样做【大笑】 。 快把腌黄瓜翻过来!
Morty: I'm a Morty, okay?
莫蒂:我是莫蒂 , 好吗?
Rick: Come on, Morty. Don't be ashamed to be a Morty. Just flip the pickle.
瑞克:别介 , 莫蒂 。 你是莫蒂没什么好羞耻的 。 快把腌黄瓜翻过来 。
现在我们的输出看起来更像样了 。 尽管模型还会输出一些不合逻辑甚至无意义的语句 , 但新模型配合解码方法能够解决问题 。 不巧的是 , 由于模型受到网络数据文本的训练 , 有时会生成具有伤害性的、粗鲁的、暴力的或者带有歧视性意味的用词 。 针对这一问题我们通过应用“坏词”过滤器来解决 , 过滤器根据一个含有451个词汇的列表对暴力词汇进行简单检查以发现伤害性用词 。 我强烈建议读者考虑再增加别的过滤器 , 比如针对仇恨言论的过滤器 。 过滤器功能的增加方法如下:
def load_bad_words() -> list:
res_list = []file = urllib.request.urlopen("https://raw.githubusercontent.com/RobertJGabriel/Google-profanity-words/master/list.txt")
【瑞克|用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集】for line in file:
dline = line.decode("utf-8")
res_list.append(dline.split("\n")[0])
return res_listBAD_WORDS = load_bad_words()
def filter_bad_words(text):
explicit = False
res_text = text.lower()
for word in BAD_WORDS:
if word in res_text:
res_text = res_text.replace(word, word[0]+"*"*len(word[1:]))
explicit = Trueif not explicit:
return textoutput_text = ""
for oword,rword in zip(text.split(" "), res_text.split(" ")):
if oword.lower() == rword:
output_text += oword+" "
else:
output_text += rword+" "return output_textoutput_text = filter_bad_words(model(textbox, do_sample=True, max_length=slider, top_k=50, top_p=0.95, num_returned_sequences=1)[0]['generated_text'])
最终的app.py文件如下:
import urllib
推荐阅读
- 明星八卦|应采儿二胎恢复身材,曾经直言想生女儿,做个“宠女狂魔”
- 周震南|周震南,做个孝子,真的很难吗?
- 来长沙|成毅10月26号录制《快本》!女主袁冰妍缺席,矛盾加剧,姜磊做个人?
- 厨房|参观演员周杰如今的家,厨房做个玻璃吊顶,室内也能享受户外阳光