利用 50 行 Python 代码构建一个在线文本生成器!
本指南将引导你学习构建一个自动完成任意输入文本的Web应用程序。
以下为译文:
pip install torch
pip install transformers
对于我们的web应用程序,我们将利用Panel这个窗口容器/框架,这是一个很好的工具,可以被用来从jupyter notebooks或者常规的Python脚本中轻松地创建可维护的仪表板。可以使用以下命令安装Panel:
pip install panel
import numpy as np
import torch
import torch.nn.functional as F
from transformers import GPT2Tokenizer, GPT2LMHeadModel
from random import choice
接下来,我们将加载OpenGPT2的Tokenizer和语言模型:(如果是第一次运行,可能需要几分钟下载预先训练的模型)
tok = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")
预测函数
def get_pred(text, model, tok, p=0.7):input_ids = torch.tensor(tok.encode(text)).unsqueeze(0)logits = model(input_ids)[0][:, -1]probs = F.softmax(logits, dim=-1).squeeze()idxs = torch.argsort(probs, descending=True)res, cumsum = [], 0.for idx in idxs:res.append(idx)cumsum += probs[idx]if cumsum > p:pred_idx = idxs.new_tensor([choice(res)])breakpred = tok.convert_ids_to_tokens(int(pred_idx))return tok.convert_tokens_to_string(pred)
这个函数中发生了很多事情。因此,让我们把它分解来看看。首先,我们对input_ids中的输入文本进行标记(tokenize)和编码(encode)。接着,我们要求我们的模型为下一个单词/标记(token)生成一个logits向量。在应用softmax函数并按降序对这些可能的概率结果进行排序之后,我们得到了一个向量idxs,它按各自的概率顺序列出了每个token的索引。
Panel:可以包含一个或多个窗格(pane)对象的容器,面板(pane)对象是指文本、图像、图形、小部件等(也可以包含其他panel);
Pane:任何单个对象,例如文本、图像、数据帧等;
Widget(小部件):用户可以自行调整的项目,包括文本输入框、滑块、按钮、复选框,等等可以改变窗格的行为的小部件。
import panel as pn
pn.extension() # loading panel's extension for jupyter compatibility text_input = pn.widgets.TextInput()
现在,如果在jupyter中执行文本输入,我们将得到以下结果:
generated_text = pn.pane.Markdown(object=text_input.value)
注意,这里我们将文本对象设置为text_input的值。我们希望generated_text的值与text_input的值相同,因为我们将要在generated_text之上预测新文本。随着越来越多的token被添加到我们的序列中,我们将继续基于generated_text进行预测,直到用户改变了text_input。一旦用户改变了text_input,这个进程将重新启动。
text_input.link(generated_text, value='object')
这里,我们在text_input和generated_text之间形成了单向链接。因此,每当text_input的值发生更改时,generated_text值也将更改为新值。如下所示:
button = pn.widgets.Button(name="Generate",button_type="primary")
很好,现在我们有了一个按钮,我们只需要把它和我们想要的行为链接起来。为此,我们将编写一个回调函数,该函数将在每次单击按钮时运行:
def click_cb(event):pred = get_pred(generated_text.object, model, tok)generated_text.object += pred
button.on_click(click_cb)
我们现在已经完成了所有小部件、窗格和函数的创建。接下来我们需要做的只是把这些东西放在一个面板里,然后看看会发现什么:
app = pn.Column(text_input, button, generated_text); app
title = pn.pane.Markdown("# **Text Generator**")
desc = pn.pane.HTML("<marquee scrollamount='10'><b>Welcome to the text generator! In order to get started, simply enter some starting input text below, click generate a few times and watch it go!</b></marquee>")final_app = pn.Column(title, desc ,app)
final_app.show()
panel serve --show text_generation_app.ipynb
只要你的笔记本中有以下代码,这个操作将在本地端口上启动你的web应用:
final_app.servable()
大功告成!
热门:Python 学习 100 天
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
热 文 推 荐
利用 50 行 Python 代码构建一个在线文本生成器!相关推荐
- python 按钮更改输入框的值_利用 50 行 Python 代码构建一个在线文本生成器!
本指南将引导你学习构建一个自动完成任意输入文本的Web应用程序. 作者 | Dev Sharma译者 | 苏本如,责编 | 郭芮出品 | CSDN(ID:CSDNnews) 以下为译文: 在本文中,我 ...
- 50 行 Python 代码制作一个数据大屏
今天给大家分享一个制作数据大屏的工具,非常的好用,100行左右的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. PywebIO介绍 Python当中的PywebIO模块 ...
- 如何使用 50 行 Python 代码制作一个计算器
简介 在这篇文章中,我将向大家演示怎样向一个通用计算器一样解析并计算一个四则运算表达式.当我们结束的时候,我们将得到一个可以处理诸如 1+2*-(-3+2)/5.6+3样式的表达式的计算器了.当然,你 ...
- 如何制作python代码_如何使用50行Python代码制作一个计算器
(点击上方公号,可快速关注) 作者:Stories For Sad Robots 译者:开源中国社区 链接:http://www.oschina.net/translate/how-to-write- ...
- python开发框架 代码生成_500 行 Python 代码构建一个轻量级爬虫框架
转载:https://www.jqhtml.com/11084.html 既然已经有像 Scrapy 这样优秀的爬虫框架,为何还要造轮子呢?嗯,其实最主要的还是想要将学习到 Python 知识综合起来 ...
- python写一个游戏多少代码-使用50行Python代码从零开始实现一个AI平衡小游戏
集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...
- 50行python游戏代码_使用50行Python代码从零开始实现一个AI平衡小游戏
使用50行Python代码从零开始实现一个AI平衡小游戏 发布时间:2020-10-23 09:26:14 来源:脚本之家 阅读:74 集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何 ...
- python50行小游戏_使用50行Python代码从零开始实现一个AI平衡小游戏
集智导读: 本文会为大家展示机器学习专家 Mike Shi 如何用 50 行 Python 代码创建一个 AI,使用增强学习技术,玩耍一个保持杆子平衡的小游戏.所用环境为标准的 OpenAI Gym, ...
- 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络
理解神经网络,从简单的例子开始(1)7行python代码构建神经网络 前言 本文分为两个部分,第一个部分是一个简单的实例:9行Python代码搭建神经网络,这篇文章原文为:原文链接, 其中中文翻译版来 ...
最新文章
- 07 Java面试反射原理
- 修改php.ini参数,为何建议用ini_set()代替直接修改php.ini参数
- java 面向对象 小练习
- 【ABAP】Field Symbol使用总结
- 找出素数并升序排列c语言,习题:随机产生N个四位正整数,将其中的素数选出,并升序排列之输…...
- C#调用C++(opencv)中图片数据传递的问题
- 安卓adapter适配器作用_自带安卓系统的便携屏,能玩出什么花样?
- 如何将多个一维列表转化为二维列表_数据分析2_如何处理一维、二维数据
- 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
- 计算机ppt教案设计大赛,广东省创新杯说课大赛计算机类一等奖作品:PPT电子相册制作教学设计...
- 越狱显示苹果服务器调整,iOS 14 后台切换界面更改?可能是越狱插件修改
- 方维众筹1.61 php5.5,最新方维众筹1.61完美解密版源码 综合型众筹产品+理财+公益+股权+微信+商城+PC+WAP运营版...
- nvm use报错exit status 1解决方法
- Proof of Stake FAQ
- 35岁的程序员:第9章,女测试
- 如何将PDF格式转换成Excel格式?
- JAVA学习记录(冲冲冲)
- 暑假教师计算机培训总结,关于暑期教师信息技术培训总结范文
- LVC 播放器buffer自定义读写的方法
- 六十星系之11紫微破军坐丑未
热门文章
- jQuery学习之---效果
- HDU 4079 Happy Telephones 简单题
- 雷达数据处理及应用第三版 pdf_数字阵列雷达:零中频接收机的优缺点
- leetcode python3 简单题231. Power of Two
- windchill文件无法上传服务器,Windchill MethodServer无法启动
- html5播放器占用带宽情况,分享|用 bmon 查看网络带宽使用情况
- 【图像处理】MATLAB:亮度变换
- 中国书写工具行业市场供需与战略研究报告
- 30秒Python轻松入门-目录
- 两大方案,只为写出更安全的代码!