2022对春联(春联生成--用python手把手教(科普难度))

Posted 'or 1 or 不正经の泡泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022对春联(春联生成--用python手把手教(科普难度))相关的知识,希望对你有一定的参考价值。

文章目录

前言

哦,那是一个阳光明媚的午后,作为浑水摸鱼大师的我无意中一撇,突然发现了这么一篇文章。
用Python写春联:抒写最真诚的祝福和最美好的祈愿

这不是撞我枪口了嘛,反正闲着也是闲着,不如搞点事情。于是我兴致勃勃地喝了一杯茶

去look look。好家伙,原来是生成了对联的图片,那么问题来了有木有办法自动生成对联,然后再生成图片呢?

并且在本地部署咧。

于是我有个大胆的想法

基于RNN(Seq2Seq + Attention)生成对联(个屁)

没错我有个大胆的想法那就是,我们基于Seq2Seq + Attention来生成对联吧。然而

好吧看来我们得换一个思路了。

呀呼,还真让我找到了。

环境准备

好了不说废话了,让我们快速开始吧。
在此之前我们得准备一下我们的环境。
我这里使用的是python 3.8

pip install paddlepaddle
pip install paddlehub
#如果paddlehub安装失败的话,可以使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-timeout=100 paddlehub

pip install pillow 

功能分析

对联生成

得益于飞浆为我们提供的PaddleHub我们可以快速地实现我们需要的功能。于是我们可以这样封装一下我们的代码。

这个真没啥好说的。

import paddlehub as hub

class HubUtils(object):
    def __init__(self):
        self.hub = hub
        #初始化时需要加载模型,需要时间,饿汉加载吧,方便后面调用,但是给标题的比较特殊
        self.module_love_words = self.hub.Module(name="ernie_gen_lover_words")
        self.module_poetry = self.hub.Module(name="ernie_gen_poetry")
        self.module_couplets = self.hub.Module(name="ernie_gen_couplet")
    def GetLoveWords(self,curx,size=5):
        # 生成情话,默认返回五个情话,这个传入list
        results = self.module_love_words.generate(texts=curx, use_gpu=True, beam_width=size)
        return results[0]

    def GetAcrostic(self,title,line=4,word=7,size=1):
        #默认返回一首,输入标题即可
        self.module_acrostic = self.hub.module = hub.Module(name="ernie_gen_acrostic_poetry", line=4, word=7)
        results = self.module_acrostic.generate(texts=[title], use_gpu=True, beam_width=size)
        return results[0]

    def GetPoetry(self,curx,size=1):
        #输入关键句,词即可生成诗歌,默认一首
        results = self.module_poetry.generate(texts=[curx], use_gpu=True, beam_width=size)
        return results[0]

    def GetCouplet(self,up_couplet,size=1):
        #输入上联给出下联,默认给一个
        results = self.module_couplets.generate(texts=[up_couplet], use_gpu=True, beam_width=size)
        return results[0]


if __name__=="__main__":
    Hub = HubUtils()
    print(Hub.GetCouplet("小母牛坐飞机"))
    print(Hub.GetCouplet("风吹云乱天垂泪"))

这里的话我还封装了几个比较有意思的训练好的模型。

图片生成

现在我们拿到了我们的对联,接下来要做的就是来生成一下我们的图片。

这个其实很简单,我们直接使用pillow在一张背景图片上写字就行,就像打水印一样。

不过在此之前我们得先选一个好看的字体。
这里我使用的还是Windows系统(没办法,很多环境配置都在Windows系统,除了平时办公室玩玩基本没玩了,而且现在还放寒假了…以前还玩kali来着的)

打开这个文件夹
C:\\Windows\\Fonts

咱们选一个好看的。


来我们先来看看这个生成的效果


我们再给他美化一下,同时我们需要让我们的字竖起来。

然后我们再绘制一些点,让它布灵布灵。

class ImgUtils(object):

    def Set_Color(self):
        return random.randrange(255)
    def Pretty(self,dr,width,height):
        for i in range(800):
            # 绘制干扰点
            dr.point(xy=(random.randrange((width)), random.randrange(height)),
                            fill=(self.Set_Color(), self.Set_Color(), self.Set_Color()))

    def CreateImg(self,text,output_path="output.png",
                  fontPath = r"C:\\Windows\\Fonts\\STXINGKA.TTF",show=True,
                  fontSize = 55,pretty=True):
        #正常情况下的文字
        lens = len(text)
        # 画布颜色
        im = Image.new("RGB", (fontSize * lens + 20, (fontSize + 20)), (255, 0, 0))
        dr = ImageDraw.Draw(im)
        font = ImageFont.truetype(fontPath, fontSize)
        #美化
        if(pretty):
            self.Pretty(dr,fontSize * lens + 20,(fontSize + 20))

        # 文字颜色
        dr.text((10, 10), text, font=font, fill="black")
        im.save(output_path)
        if(show):
            im.show()

    def CoupletImg(self,text,output_path="output.png",
                   fontPath = r"C:\\Windows\\Fonts\\STXINGKA.TTF",show=True,
                   fontSize = 55,pretty=True):

        lens = len(text)
        words = list(text)
        # 画布颜色
        im = Image.new("RGB", ((fontSize + 20),fontSize * (lens+1) + 20), (255, 0, 0))
        dr = ImageDraw.Draw(im)

        font = ImageFont.truetype(fontPath, fontSize)
        #美化
        if(pretty):
            self.Pretty(dr,(fontSize + 20),fontSize * lens + 20)
        # 文字颜色
        step = 10
        for word in words:
            dr.text((10, step), word, font=font, fill="black")
            step +=10+fontSize
        im.save(output_path)
        if (show):
            im.show()

调用

之后就是咱们调用啦。

from utils import ImgUtils,HubUtils


def main():
    Hub = HubUtils()
    imgUtils = ImgUtils()

    up_couplet = "漂亮小姐姐"
    down_couplet = Hub.GetCouplet(up_couplet)[0]
    imgUtils.CoupletImg(up_couplet,output_path="up_couplet.png")
    imgUtils.CoupletImg(down_couplet, output_path="down_couplet.png")

if __name__ == '__main__':
    main()

效果



貌似好像翻车了

总结

这次也是我第一次写科普类型(难度)的文章,如有不足多多指教
另外提取祝大家新年快乐~

以上是关于2022对春联(春联生成--用python手把手教(科普难度))的主要内容,如果未能解决你的问题,请参考以下文章

过年了,用 PyQt5 生成一副春联吧...

新年快到了,如何运用Python实现春联

新年快到了,如何运用Python实现春联

新年快到了,如何运用Python实现春联

在外打工好久不回老家,用python为家里贴上新年春联

海龟库画春联怎么画