写春联:你写上联,AI写下联
写春联:你写上联,AI写下联
转载自AI Studio
项目链接
写春联:你写上联,AI写下联 - 飞桨AI Studio - 人工智能学习与实训社区aistudio.baidu.com/aistudio/projectdetail/3447495?contributionType=1&shared=1一. 前言
春联,又称“春贴”、“门对”、“对联”,是过年时所贴的红色喜庆元素“年红”中一个种类。它以对仗工整、简洁精巧的文字描绘美好形象,抒发美好愿望,是中国特有的文学形式,是华人们过年的重要习俗。当人们在自己的家门口贴年红(春联、福字、窗花等)的时候,意味着过春节正式拉开序幕。每逢春节,无论城市还是农村,家家户户都要挑漂亮的红春联贴于门上,辞旧迎新,增加喜庆的节日气氛。春联的另一来源是春贴,古人在立春日多贴“宜春”二字,后渐渐发展为春联,表达了中国劳动人民一种辟邪除灾、迎祥纳福的美好愿望。二. 项目简介
本项目基于PaddleHub的对联生成模型ernie_tiny_couplet,根据上联生成对联的下联。
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。 * 下图是模型结构:
三. 基本要求
对联文字长短不一,短的仅一、两个字;长的可达几百字。对联形式多样,有正对、反对、流水对、联球对、集句对等。但不管何类对联,使用何种形式,都必须具备以下特点:要字数相等,断句一致。除有意空出某字的位置以达到某种效果外,上下联字数必须相同,不多不少。要平仄相合,音调和谐。传统习惯是「仄起平落」,即上联末句尾字用仄声,下联末句尾字用平声。要词性相对,位置相同。一般称为「虚对虚,实对实」,就是名词对名词,动词对动词,形容词对形容词,数量词对数量词,副词对副词,而且相对的词必须在相同的位置上。 要内容相关,上下衔接。上下联的含义必须相互衔接,但又不能重复。四. 代码实现
# 安装环境依赖 !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_bs = module.generate(texts=test_texts_a, use_gpu=True, beam_width=1) test_texts_b = test_texts_bs[0]可以通过修改 test_texts_a 中的内容,生成你想要的春联。
# 获取汉字图片 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写出下联,给我们的春节一个满意的祝福!
可以通过调用paddleHub的 ernie_gen_poetry module、ernie_gen_lover_words module等模型实现功能的转换。
目前的代码中用到的字模均来源于网络,共计1550个常用汉字作者简介
沈阳工业大学 人工智能学院 智能科学与技术专业 2018级 本科生 朱瑞
CSDN 人工智能领域优质创作者
百度飞桨官方帮帮团成员
腾讯云开发初级工程师认证
我在AI Studio上获得黄金等级,点亮6个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/91451
欢迎大家fork喜欢评论三连,感兴趣的朋友也可互相关注一下啊~
本文由qingshulin发布,不代表倾述林立场,转载联系作者并注明出处:https://www.qingshulin.com/duilian/chunliandaquan/show-31294.html