百度飞桨:春节写春联:你写上联,AI写下联

2023-05-16

写春联:你写上联,AI写下联

  • 一. 前言
  • 二. 项目简介
  • 三. 基本要求
  • 四. 代码实现
  • 五. 项目成果
  • 六. 总结

百度飞桨系列文章

  • 百度飞桨:给出关键词,AI自动生成元宵节祝福~
  • 百度飞桨:(情人节特辑)想做就做,让爱豆对你说情话,过凡尔赛式情人节~

关注专栏百度飞桨

一. 前言

春联,又称“春贴”、“门对”、“对联”,是过年时所贴的红色喜庆元素“年红”中一个种类。它以对仗工整、简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年的重要习俗。当人们在自己的家门口贴年红(春联、福字、窗花等)的时候,意味着过春节正式拉开序幕。

每逢春节,无论城市还是农村,家家户户都要挑漂亮的红春联贴于门上,辞旧迎新,增加喜庆的节日气氛。春联的另一来源是春贴,古人在立春日多贴“宜春”二字,后渐渐发展为春联,表达了中国劳动人民一种辟邪除灾、迎祥纳福的美好愿望。

二. 项目简介

本项目基于PaddleHub的对联生成模型ernie_tiny_couplet,使用的是paddlepaddle 2.x 框架,根据上联生成对联的下联。

ernie_gen_couplet框架:

  • ERNIE-GEN 是面向生成任务的预训练-微调框架,首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。在预训练和微调中通过填充式生成机制和噪声感知机制来缓解曝光偏差问题。
  • 此外, ERNIE-GEN 采样多片段-多粒度目标文本采样策略, 增强源文本和目标文本的关联性,加强了编码器和解码器的交互。
  • ernie_gen_couplet采用开源对联数据集进行微调,可用于生成下联。下图是模型结构:

ernie_tiny_couplet模型:

  • ernie_tiny_couplet是一个对联生成模型,它由ernie_tiny预训练模型经PaddleHubTextGenerationTask微调而来,仅支持预测,如需进一步微调请参考PaddleHub text_generation demo。
  • 预训练模型转换成预测module的转换方式请参考Fine-tune保存的模型如何转化为一个PaddleHub Module。
  • 下图是模型结构:

三. 基本要求

  • 对联文字长短不一,短的仅一、两个字;长的可达几百字。对联形式多样,有正对、反对、流水对、联球对、集句对等。但不管何类对联,使用何种形式,都必须具备以下特点:
  • 要字数相等,断句一致。除有意空出某字的位置以达到某种效果外,上下联字数必须相同,不多不少。
  • 要平仄相合,音调和谐。传统习惯是「仄起平落」,即上联末句尾字用仄声,下联末句尾字用平声。
  • 要词性相对,位置相同。一般称为「虚对虚,实对实」,就是名词对名词,动词对动词,形容词对形容词,数量词对数量词,副词对副词,而且相对的词必须在相同的位置上。
    要内容相关,上下衔接。上下联的含义必须相互衔接,但又不能重复。

四. 代码实现

代码基于飞桨的 BML CodeLab 编写

# 安装环境依赖
!pip install paddlehub --upgrade -i https://mirror.baidu.com/pypi/simple 
import paddlehub as hub
import re
import io
from PIL import Image
import numpy as np
import requests

module = hub.Module(name="ernie_gen_couplet") # 加载模型 

# ***************春 联 上 联***************
test_texts_a = ['万事平安幸福年'] #可以通过修改 test_texts_a 中的内容,生成你想要的春联。

test_texts_bs = module.generate(texts=test_texts_a, use_gpu=True, beam_width=1)
test_texts_b = test_texts_bs[0]
# 获取汉字图片
def get_word(ch, quality):
    """
    ch          - 单个汉字或英文字母(仅支持大写)
    quality     - 单字分辨率,H-640像素,M-480像素,L-320像素
    """
    
    fp = io.BytesIO(requests.post(url='http://xufive.sdysit.com/tk', data={'ch':ch}).content) # 只包含大约1500常用汉字
    im = Image.open(fp)
    w, h = im.size
    if quality == 'M':
        w, h = int(w*0.75), int(0.75*h)
    elif quality == 'L':
        w, h = int(w*0.5), int(0.5*h)
    
    return im.resize((w,h))

# 生成春联背景图
def get_bg(quality):

    return get_word('bg', quality)

# 生成春联
def write_couplets(text, HorV='V', quality='L', out_file=None):
    """
    text        - 春联内容,以空格断行
    HorV        - H-横排,V-竖排
    quality     - 单字分辨率,H-640像素,M-480像素,L-320像素
    out_file    - 输出文件名
    """
    
    usize = {'H':(640,23), 'M':(480,18), 'L':(320,12)}
    bg_im = get_bg(quality)
    text_list = [list(item) for item in text.split()]
    rows = len(text_list)
    cols = max([len(item) for item in text_list])
    
    if HorV == 'V':
        ow, oh = 40+rows*usize[quality][0]+(rows-1)*10, 40+cols*usize[quality][0]
    else:
        ow, oh = 40+cols*usize[quality][0], 40+rows*usize[quality][0]+(rows-1)*10
    out_im = Image.new('RGBA', (ow, oh), '#f0f0f0')
    
    for row in range(rows):
        if HorV == 'V':
            row_im = Image.new('RGBA', (usize[quality][0], cols*usize[quality][0]), 'white')
            offset = (ow-(usize[quality][0]+10)*(row+1)-10, 20)
        else:
            row_im = Image.new('RGBA', (cols*usize[quality][0], usize[quality][0]), 'white')
            offset = (20, 20+(usize[quality][0]+10)*row)
        
        for col, ch in enumerate(text_list[row]):
            if HorV == 'V':
                pos = (0, col*usize[quality][0])
            else:
                pos = (col*usize[quality][0],0)
            
            ch_im = get_word(ch, quality)
            row_im.paste(bg_im, pos)
            row_im.paste(ch_im, (pos[0]+usize[quality][1], pos[1]+usize[quality][1]), mask=ch_im)
            
        out_im.paste(row_im, offset)
    
    if out_file:
        out_im.convert('RGB').save(out_file)
    out_im.show()
# 开始写春联
text = test_texts_b,test_texts_a
text=re.sub('[^\u4e00-\u9fa5]+',' ',str(text))
write_couplets(text, HorV='V', quality='M', out_file='春联.jpg')

五. 项目成果

在这里插入图片描述

六. 总结

  • 欢迎大家更换上联,让AI写出下联,给我们的春节一个满意的祝福!
  • 来AI Studio互粉吧,等你哦,来互关呀~请点击—> 非鱼子焉
  • 欢迎大家喜欢收藏评论三连,感兴趣的朋友也可互相关注一下啊~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度飞桨:春节写春联:你写上联,AI写下联 的相关文章

随机推荐

  • IdentityServer4 (IDS4) 快速入门

    一 系统环境 win10 C Users zhoujy gt dotnet version 5 0 102 IdentityServer4 4 0 0 Microsoft Visual Studio Community 2019 版本 16
  • IdentityServer4 (IDS4) UI界面使用

    在本快速入门中 xff0c 将对通过OpenID Connect协议进行的交互式用户身份验证的支持添加到上一章中构建的IdentityServer中 实现后 xff0c 我们将创建一个将使用IdentityServer进行身份验证的MVC应
  • ML.NET 奇异谱分析(SSA Singular spectrum analysis)预测实践

    一 奇异谱分析 Singular Spectrum Analysis SSA 简介 奇异谱分析 Singular Spectrum Analysis SSA 是一种处理非线性时间序列数据的方法 xff0c 通过对所要研究的时间序列的轨迹矩阵
  • ASP .Net Core内置 Identity 简介 使用

    一 简介 1 概况 ASP NET Core Identity是一个成员身份系统 xff0c 可将用户注册和登录功能添加到 ASP NET Core Web UI 成员身份系统处理身份验证和授权问题 身份验证涉及你的身份 授权涉及允许你进行
  • sql 2008 安装失败 mof语法错误 处理

    这几天比较忧闷 xff0c 在一台比较老的win2003机器上安装sql2008一直出 MOF语法错误 安装失败 xff0c 浪费了我几天的时间才搞定 现把经历写出来以帮他人可以少走歪路 这台机器是一个平时当开发平台的机器 xff0c AM
  • 十年老撕鸡分享,五分钟搭建个人轻论坛

    点击 关注 爪哇笔记 给公众号标星置顶 更多精彩 第一时间直达 前言 09 年开始接触论坛 xff0c 那会微信还没有诞生 xff0c 也没有什么移动互联网 xff0c 大家还都在用功能机玩着 2G 的文字游戏 xff01 那会玩论坛的还比
  • sql server之在存储过程中利用OpenJson将Json字符串转化为表格

    在Sql server2016的版本后 xff0c 数据库增加了对Json格式的支持 xff0c 详细信息可以参考微软官方文档链接 应用背景 在线订餐系统中 xff0c 购物车的内容存储在浏览器缓存中 所以数据库关于订单的设计是订单表 xf
  • 生活大爆炸版 石头剪刀布

    如果大家认为写的不错 xff0c 请点赞关注收藏 xff01 题目描述 石头剪刀布是常见的猜拳游戏 xff1a 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一 样 xff0c 则不分胜负 在 生活大爆炸 第二季第8
  • debian10安装docker

    使用root登录 将已安装的软件包更新到最新版本 xff1a apt update apt upgrade 安装通过 HTTPS 添加新存储库所需的依赖项 xff1a apt install apt transport https ca c
  • 黑盒(功能)测试以及测试用例设计

    概念 xff1a 黑盒测试是把测试对象看做一个黑盒子 xff0c 利用黑盒测试法进行动态测试时 xff0c 需要测试软件产品已经实现的功能是否符合功能设计要求 xff0c 不需测试软件产品的内部结构和处理过程 黑盒测试注重于测试软件的功能性
  • 2018.09.27 网络协议(tarjan)

    描述 一些学校连接在一个计算机网络上 学校之间存在软件支援协议 每个学校都有它应支援的学校名单 xff08 学校 a 支援学校 b xff0c 并不表示学校 b 一定支援学校 a xff09 当某校获得一个新软件时 xff0c 无论是直接得
  • golang exec 执行 shell 如何同步输出/得到执行结果

    背景 项目中需要执行shell命令 xff0c 虽然exec包提供了CombinedOutput 方法 xff0c 在shell运行结束会返回shell执行的输出 xff0c 但是用户在发起一次任务时 xff0c 可能在不停的刷新log x
  • Android下USB的虚拟串口功能

    1 先关闭usb的gadge功能 echo 0 gt sys class android usb android0 enable 2 设置acm transports为 34 TTY 34 的功能 echo 34 TTY 34 gt sys
  • ubuntu鼠标灵敏度设置

    ubuntu鼠标灵敏度设置 安装ubuntu以后使用系统鼠标灵敏度设置总觉得不太管用 xff0c 于是各方搜索 xff0c 最终找到一个有效的解决方案 具体命令如下 xff1a span class hljs built in sudo s
  • Win10安装Anaconda和TensorFlow

    Anaconda与TensorFlow Anaconda是一个开源的Python发行版本 包含了很多科学包 Tensorflow是谷歌近几年发行的机器学习框架 安装过程 Anaconda安装 其安装过程简单 Anaconda安装成功测试卸载
  • Navicat报错2003:can't connect to MySQl server on localhost

    好久没用Navicat来操作Mysql 今天一用出现错误 解决方法 控制面板 大图标 管理工具 服务 MYSQL启动
  • vscode编辑c++报错undefined reference to `Point::setY(int)‘ collect2.exe: error: ld returned 1 exit statu

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 64 TOC 文vscode编辑c 43 43 报错undefined reference to 96 Point setY int co
  • 解决RuntimeError: Expected all tensors to be on the same device, but found at least two devices,

    问题描述 说明网络中有的数据在gpu运算有的在cpu运算 解决方法 报错的行加上 cuda 即可 参考 https www cnblogs com tanyahuang p 15522833 html
  • 线性表 顺序存储 C语言实现

    线性表 顺序存储 C语言实现 关于线性表8个基本操作的c语言实现 注意 顺序表用数组表示 线性表位序从1开始 数组元素下标从0开始 顺序表插入删除 判断插入 删除位置是否合法的表示方法 include lt stdio h gt SqLis
  • 百度飞桨:春节写春联:你写上联,AI写下联

    写春联 xff1a 你写上联 xff0c AI写下联 一 前言二 项目简介三 基本要求四 代码实现五 项目成果六 总结 百度飞桨系列文章 xff1a 百度飞桨 xff1a 给出关键词 xff0c AI自动生成元宵节祝福 百度飞桨 xff1a