瑞克|用GPT-2做个“姥爷”!57行代码给《瑞克和莫蒂》写新剧集( 三 )
import streamlit as st
import torch
from transformers import pipelinedef load_bad_words() -> list:
res_list = []file = urllib.request.urlopen("https://raw.githubusercontent.com/RobertJGabriel/Google-profanity-words/master/list.txt")
for line in file:
dline = line.decode("utf-8")
res_list.append(dline.split("\n")[0])
return res_listBAD_WORDS = load_bad_words()
@st.cache(allow_output_mutation=True, suppress_st_warning=True)
def load_model():
return pipeline("text-generation", model="e-tony/gpt2-rnm")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_textmodel = load_model()
textbox = st.text_area('Start your story:', '', height=200, max_chars=1000)
slider = slider = st.slider('Max text length (in characters)', 50, 1000)
button = st.button('Generate')if button:
output_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'])
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)
此外 , 欢迎大家到Github库上查看我的演示案例 , 其中还包括对此应用的外观效果及其他功能性修饰相关的实用代码 。
https://github.com/e-tony/Story_Generator
https://share.streamlit.io/e-tony/story_generator/main/app.py
现在我们已经可以上线功能了!
应用部署 我们使用Streamlit Sharing部署应用 。 准备一个公开的Github库以及相关需求文档(requirement.txt文件) , 再加上app.py文件就 , 就基本完成了 。 你的需求文档大致将包含这些内容:
-f https://download.pytorch.org/whl/torch_stable.html
streamlit-nightly==0.69.3.dev20201025
torch==1.6.0+cpu
torchvision==0.7.0+cpu
transformers @ git+git://github.com/huggingface/transformers@59b5953d89544a66d73
在Streamlit Sharing网站上(https://share.streamlit.io/)和Github库完成连接 , 模型很快就能上线了 。
伦理考量 需要提醒大家 , 我们这里讨论的应用仅限个人娱乐使用!在其他场景下使用GPT2模型之前请谨慎考量 。 尽管我们移除了原始训练集中涉及到某些领域的数据 , GPT2模型仍然大量使用了网络上未经筛选的内容进行预先训练 , 其中就会包含很多偏见和歧视意味的言论 。
OpenAI的模型卡片说明也指出了这些担忧:
我们认为某些二次使用的案例大概率包含以下情景:
- 写作辅助:语法助手 , 自动补充填词(常规文本或是代码文本)
- 创业写作和艺术创作:对创意性、科幻性文本生成进行探索;帮助诗歌和其他文学艺术作品的创作
- 娱乐用途:用于游戏 , 聊天机器人 , 讲笑话等
类似GPT2这样基于大范围语言训练的模型并不会辨别语句的真伪 , 因此我们不支持需要保证文本真实性的使用案例 。 此外 , 由于训练数据特性 , GPT2系统本身就反映出一定程度的偏见 , 所以我们也不推荐直接将模型用于人类交互 , 除非部署者提前对预期使用案例进行了偏见问题的相关研究 。 在我们进行过的分析中 , 针对性别、种族以及宗教问题 , 使用774M的数据量和1.5B数据量的训练集并未发现统计学意义上的显著差异 , 这意味着使用所有版本的GPT2模型都应该同样谨慎 , 尤其是要处理与人类社会属性偏见敏感的案例时 。
以下这个案例也说明该模型可能生成具有偏见性的结果:
>>> from transformers import pipeline, set_seed
>>> generator = pipeline('text-generation', model='gpt2')
>>> set_seed(42)
>>> generator("The man worked as a", max_length=10, num_return_sequences=5)[{'generated_text': 'The man worked as a waiter at a Japanese restaurant'},
{'generated_text': 'The man worked as a bouncer and a boun'},
{'generated_text': 'The man worked as a lawyer at the local firm'},
推荐阅读
- 明星八卦|应采儿二胎恢复身材,曾经直言想生女儿,做个“宠女狂魔”
- 周震南|周震南,做个孝子,真的很难吗?
- 来长沙|成毅10月26号录制《快本》!女主袁冰妍缺席,矛盾加剧,姜磊做个人?
- 厨房|参观演员周杰如今的家,厨房做个玻璃吊顶,室内也能享受户外阳光