使用百度 AI 进行智能写诗 & 智能春联

注:本博客为博主在 百度 AI 社区 上分享的一篇文章,由于本博主也是作为一个学习者,所以如果文章中存在错误或者不适合的地方还请见谅。

先来一波推荐:
如果你也喜欢开发,欢迎加入百度 AI 开发平台的核心团队,分享自己的 idea,当然也是有福利的,具体信息访问以下链接:【招募令】核心团队在找最优秀的你! 。如果不介意的话可以说是我推荐的哟,本博主百度AI社区ID:busyboxs

我为什么要做这个小项目?
要说起我为什么要做这个小项目,其实要从我的学习生涯谈起。我本来是学深度学习图像处理的,所以经常关注深度学习相关的咨询。当然也喜欢将实际的理论知识用于实践中,在两年前,使用深度学习来对对联火了一段时间,我当时也关注了这个,印象比较深刻的是 王斌给您对对联 -_-!,这个是用 tensorflow 来实现的项目,但是由于我主要是做 CV 的,对于 NLP 很多东西不是很了解,所以没有深入去理解里面的网络结构。后来一次偶然的机会接触到了百度 AI 开放平台,看到里面有提供这个接口,所以打算尝试写一个我自己的对对联项目。所以这个小项目得以诞生,虽然可能还是由很多问题,并不完善,但是在写出这个小项目后还是蛮开心的。我从中也学会了一些新知识,比如 Flask 库的使用以及 request 相关的知识。我的小项目里也借用了 王斌给您对对联 -_-! 中的一些网页元素,在此对作者的分享表示感谢,同时感谢百度 AI 开放平台提供的接口,只是遗憾的是这个接口的免费调用次数有所限制。



百度 AI 目前提供了智能写作的接口,主要包括智能写诗接口与智能春联接口。具体的使用说明可以参考文档 https://ai.baidu.com/ai-doc/NLP/Nk3ippdkc.

智能写作接口说明

智能春联接口

智能春联是指根据用户输入的命题关键词自动生成一副春联,包括上联、下联和横批。

智能春联的请求参数如下表:

参数 是否必选 类型 描述
text string 字符串(限5字符数以内)即春联的主题
index int 整数 默认为数值为0,即第一幅春联。每换一次,数值加1即可,一定数量后会返回之前的春联结果。

上面两个字符段是接口的输入,text 字数小于 5,是春联的主题。 index 可以用来指定生成的对联,不同的 index 可能会生成不同的对联。

智能春联的返回参数如下表:

参数 类型 描述
couplets object object嵌套结构,对应返回的春联
+first string 春联上联:成7-9个字的上联
+second string 春联下联:生成7-9个字的春联下联
+center string 春联横批:生成4个字的春联横批

其输出为 json 字符串。例如:“春节”对应的一个输出为

{
    'couplets': {
        'center': '迎春接福',
        'first': '春节迎春新世纪',
        'second': '福音报福小康年'
        }
}

智能写诗接口

智能写诗是指根据用户输入的命题关键词自动生成一首7言绝句。

智能写诗的请求参数如下表:

参数 是否必选 类型 描述
text string 字符串(限5字符数以内,)即作诗的主题
index int 整数 默认为数值为0,即第一首诗。每换一次,数值加1即可,一定数量后会返回之前的作诗结果

这两个输入字段和智能春联的两个输入字段相同,只是,text 代表诗的主题

智能写诗的返回参数如下表:

参数 类型 描述
poem array 数组结构,元素对应7言绝句诗
+title string 诗名,即用户输入作诗主题
+content string 作诗结果:为一首7言绝句

其输出也是 json 字符串,例如:“百度”对应的一个输出为

{
  "poem": [
    {
        "title":      "百度"
        "content": "神州百度庆元功
                    华夏千秋唱大风
                    伟业宏图开盛世
                    红旗锦绣耀长空"
    }
  ]
}

错误码说明

错误码 错误信息 描述
52000 成功
52001 请求超时 重试
52002 系统错误 重试
52003 未授权用户 检查您的appid是否正确
52004 输入解析失败 检查输入编码格式,有无特殊字符,是否是json格式
52005 输入字段有误 是否包含text字段
52006 输入文本长度有误 输入不能超过5个字符
52007 输入文本包含政治&黄色内容 换输入文本
52008 后台服务返回错误 重试
54003 访问频率受限 请降低您的调用频率
54100 查询接口参数为空 检查是否少传参数
54102 无写诗结果 重试
2 后端连接超时 重试

代码实现

本文使用 python3 来调用智能春联和智能写诗接口,接下来一步一步进行说明。

创建应用

首先进入到控制台,然后在“总览”下找到“产品服务” -> “人工智能” -> “自然语言处理”。


然后点击创建应用,填写好“应用名称”、“应用描述”,其他默认就行,然后点击“创建”。

创建好应用之后,进入“应用列表”,就能看到应用的相关信息,我们需要的是 API KeySecret Key

获取 access token

通过 API KeySecret Key 获取的 access_token。更多关于 access_token 的获取方法参考 https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu

下面代码是 python3 获取 access_token 的代码

# 获取 token
def get_token_key():
    token_key = ''
    # client_id 为官网获取的AK, client_secret 为官网获取的SK
    client_id = '【百度云应用的AK】'
    client_secret = '【百度云应用的SK】'

    host = f'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials'         f'&client_id={client_id}&client_secret={client_secret}'

    request = Request(host)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = urlopen(request)
    token_content = response.read()
    if token_content:
        token_info = json.loads(token_content)
        token_key = token_info['access_token']
    return token_key

token_content 中包含很多信息,例如输出如下(为了我个人信息安全,部分内容用 * 代替):

{'access_token': '****************************************',
 'expires_in': 2592000,
 'refresh_token': '*******************************************',
 'scope': 'brain_nlp_sentiment_classify_custom public nlp_simnet nlp_wordemb '
          'nlp_comtag nlp_dnnlm_cn brain_nlp_lexer brain_all_scope '
          'brain_nlp_comment_tag brain_nlp_dnnlm_cn brain_nlp_word_emb_vec '
          'brain_nlp_word_emb_sim brain_nlp_sentiment_classify '
          'brain_nlp_simnet brain_nlp_depparser brain_nlp_wordembedding '
          'brain_nlp_dnnlm_cn_legacy brain_nlp_simnet_legacy '
          'brain_nlp_comment_tag_legacy brain_nlp_lexer_custom '
          'brain_nlp_keyword brain_nlp_topic brain_nlp_ecnet brain_nlp_emotion '
          'brain_nlp_comment_tag_custom wise_adapt lebo_resource_base '
          'lightservice_public hetu_basic lightcms_map_poi kaidian_kaidian '
          'ApsMisTest_Test权限 vis-classify_flower lpq_开放 cop_helloScope '
          'ApsMis_fangdi_permission smartapp_snsapi_base iop_autocar '
          'oauth_tp_app smartapp_smart_game_openapi oauth_sessionkey '
          'smartapp_swanid_verify smartapp_opensource_openapi',
 'session_key': '*****************************',
 'session_secret': '*******************************'}

而我们需要的只是 access_token,因此只需获取该字段就行。

调用智能春联接口

调用智能春联接口的 python3 实现代码如下:

注:由于文档和接口有更新,请求 URL 有修改
如下
请求URL:https://aip.baidubce.com/rpc/2.0/creation/v1/couplets
请求URL: https://aip.baidubce.com/rpc/2.0/nlp/v1/couplets(邀测期用户)

# 调用百度 AI 智能春联接口(用于测试)
def get_couplets(text, token_key, index=0):
    """
    调用百度AI智能春联接口,并生成横批、上联和下联
    :param text: 智能春联的主题(官方限制不超过5个字)
    :param token_key: 通过调用 get_token_key() 获取的 token
    :param index: 不同的 index 会生成不同的春联
    :return: 调用智能春联生成的数据
    """
    request_url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/couplets'
    params_d = dict()
    params_d['text'] = text
    params_d['index'] = index
    params = json.dumps(params_d).encode('utf-8')
    access_token = token_key
    request_url = request_url + "?access_token=" + access_token
    request = Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/json')
    response = urlopen(request)
    content = response.read()
    if content:
        data = json.loads(content)
        return data

# 解析生成的春联
def parse_couplets(data):
    """
    解析调用智能春联生成的数据
    :param data: 调用智能春联生成的有效数据
    :return: 横批(center)、上联(first)和下联(second)
    """
    center = data['couplets']['center']
    first = data['couplets']['first']
    second = data['couplets']['second']
    # print(f'上联:{first}')
    # print(f'下联:{second}')
    # print(f'横批:{center}')
    return center, first, second

get_couplets 函数调用接口得到返回的值,parse_couplets 函数解析调用智能春联生成的有效数据。这里所说的有效数据是指调用接口没有发生错误的情况。在正确调用接口时,data 输出示例如下:

{
    'couplets': {
        'center': '迎春接福',
        'first': '春节迎春新世纪',
        'second': '福音报福小康年'
        }
}

是一个字典型数据,直接进行解析就能得到横批、上联和下联。如果想要获取同一主题不同的对联,可以尝试不同的 index

当调用接口失败时,就会得到无效的 data,通过解析 data,能够获得错误信息,下面是解析错误的代码,能够返回对应错误的中文描述。

# 错误代码
ERROR_DICT = {
    '2': '后端连接超时请重试',
    '52001': '请求超时请重试',
    '52002': '系统错误请重试',
    '52003': '未授权用户',
    '52004': '输入解析失败',
    '52005': '输入字段有误',
    '52006': '输入文本长度不超过5',
    '52007': '输入文本包含政治&黄色内容',
    '52008': '后台服务返回错误请重试',
    '54003': '访问频率受限',
    '54100': '查询接口参数为空',
    '54102': '无写诗结果请重试'
}

# 解析是否调用接口错误,如果有返回对应的提示,没有返回None
def parse_error(data):
    """
    解析是否调用接口错误
    :param data: 调用接口生成的数据
    :return: 如果出错,返回对应的错误信息,否则返回None
    """
    if 'error_code' in data:
        code = data['error_code']
        error = ERROR_DICT[str(code)]
        return error
    return None

调用智能写诗接口

调用智能写诗接口的 python3 实现代码如下:

注:由于文档和接口有更新,请求 URL 有修改
如下
请求URL:https://aip.baidubce.com/rpc/2.0/creation/v1/poem
请求URL: https://aip.baidubce.com/rpc/2.0/nlp/v1/poem(邀测期用户)

# 调用百度 AI 智能写诗接口(用于测试)
def get_poem(text, token_key, index=0):
    """
    调用百度AI智能写诗接口,并生成七言诗
    :param text: 智能写诗的主题(官方限制不超过5个字)
    :param token_key: 通过调用 get_token_key() 获取的 token
    :param index: 不同的 index 会生成不同的七言诗
    :return: 调用智能写诗生成的数据
    """
    request_url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/poem'
    params_d = dict()
    params_d['text'] = text
    params_d['index'] = index
    params = json.dumps(params_d).encode('utf-8')
    access_token = token_key
    request_url = request_url + "?access_token=" + access_token
    request = Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/json')
    response = urlopen(request)
    content = response.read()
    if content:
        data = json.loads(content)
        return data

# 解析生成的诗句
def parse_poem(data):
    """
    解析调用智能写诗生成的数据
    :param data: 调用智能写诗生成的有效数据
    :return: 诗的题目(title)和诗的内容(content)
    """
    title = data['poem'][0]['title']
    poem = data['poem'][0]['content'].replace('\t', '\n')
    # print(title)
    # print(poem)
    return title, poem

在正确调用接口时,data 输出如下:

{
  "poem": [
    {
        "title":      "百度"
        "content": "神州百度庆元功
                    华夏千秋唱大风
                    伟业宏图开盛世
                    红旗锦绣耀长空"
    }
  ]
}

是一个字典型数据,直接进行解析就能得到题目和内容。如果想要获取同一主题不同的诗,可以尝试不同的 index

案例应用

本文进一步通过网页的形式将上述功能进行实现,使用Flask来部署。

首先创建一个文件夹 flaskr,该文件夹下有一个名为 static 的文件夹,用于存放 css 样式和背景图片,还有一个文件夹名为 templates 用于存放 html 网页,另外还有一个 python 文件,用于执行 flask。

以下是 Flask 相关代码

from flask import Flask, render_template, request, redirect, url_for, session
from flaskr.poem import nlp_result, parse_error, parse_couplets, parse_poem
import random

app = Flask(__name__)

token_key = '【你获取的token】'

@app.route("/", methods=('GET', 'POST'))
def index():
    if request.method == 'POST':
        couplets = request.form.get('couplets')
        if couplets is not None:
            return redirect(url_for('get_couplets'))
        poem = request.form.get('poem')
        if poem is not None:
            return redirect(url_for('get_poem'))

    return render_template('couplets/index.html')

@app.route("/couplets", methods=('GET', 'POST'))
def get_couplets():
    if request.method == 'POST':
        center = None
        first = None
        second = None
        title = request.form.get('theme')
        back = request.form.get('back')
        if back == '返回':
            return redirect(url_for('index'))
        index = random.randint(0, 10)
        data = nlp_result(title, token_key, index, way='couplets')
        error = parse_error(data)
        if not error:
            center, first, second = parse_couplets(data)
        return render_template('couplets/show.html',
                               center=center,
                               first=first,
                               second=second,
                               title=title,
                               error=error)
    return render_template('couplets/base.html')

@app.route("/poem", methods=('GET', 'POST'))
def get_poem():
    if request.method == 'POST':
        title = None
        poem = None
        title = request.form.get('theme')
        back = request.form.get('back')
        if back == '返回':
            return redirect(url_for('index'))
        index = random.randint(0, 10)
        data = nlp_result(title, token_key, index, way='poem')
        error = parse_error(data)
        if not error:
            title, poem = parse_poem(data)
        return render_template('couplets/poem_show.html',
                               title=title,
                               poem=poem,
                               error=error)
    return render_template('couplets/poem_index.html')

if __name__ == '__main__':
    app.run(debug=True)

该代码中有三个函数,分别对应三个界面,如果运行地址为 http://127.0.0.1:5000/,那么三个界面对应的网址分别为 http://127.0.0.1:5000/http://127.0.0.1:5000/coupletshttp://127.0.0.1:5000/poem。表示主页、对联页和写诗页。

其效果展示如下:



处理错误信息的效果展示如下:



完整代码请移步 https://github.com/busyboxs/couplet-and-poem

原文地址:https://www.cnblogs.com/busyboxs/p/12231536.html

时间: 2024-10-07 01:21:40

使用百度 AI 进行智能写诗 & 智能春联的相关文章

526份行业报告+白皮书:AI人工智能、机器人、智能出行、智能家居、物联网、VR/AR、 区块链等(附下载)

随着现有技术的成熟,不可预见的发展会更快地到来,而创新则从消费者应用到商业(反之亦然),我们必须不断地寻找那些有潜力为我们自己的业务和我们的客户增值的人. 在未来30年里,超级智能一定会诞生.届时,所有的物都将相互连接,超级智能走进云端,并走进自动驾驶.健康医疗.客户服务.工业等等领域.人们的生活,将发生巨大的改变.墙裂推荐一读. 与 2017 年类似,2018 年的 CES 依然是人工智能.物联网.自动驾驶汽车.AR/VR 和健康设备等热门产品的舞台. 我们分享各个行业526份关于AI人工智能

为你写诗:3 步搭建 Serverless AI 应用

作者 | 杜万(倚贤) 阿里巴巴技术专家 本文整理自 1 月 2 日社群分享,每月 2 场高质量分享,点击加入社群. 关注"阿里巴巴云原生"公众号,回复关键词 0102 即可下载本文 PPT. 导读:本文作者将以一个自动生成五言绝句诗句的示例,向大家介绍一个典型函数计算的应用场景:AI Model Serving(AI 模型服务化).内容分三个部分进行:首先介绍函数计算和 AI 推理:其次介绍了如何 3 步搭建自动生成五言绝句诗句应用:最后介绍了函数计算在 AI 推理场景的优势. 函数

人工智能的造血机制:从Q1财报读懂百度AI矩阵如何运作

在人工智能到来,我们在最初被惊艳到之后,接下来的问题如期而至:AI到底如何工作?如何创造真正的价值? 毕竟AI不能永远是一种表演和游戏,作为一种底层技术,它必须开始为人类服务,必须在商业世界中证明自己的必要性. 事实上,相比于AI独立成为一种与人类相近的智能,真实的AI更接近各行各业升级自身的机遇,甚至是让一些我们习以为常的东西发生重大升级的技术手段. 今天来看,这门尚稚嫩的技术确实没有令我们失望.百度(Nasdaq:BIDU)在刚刚发布了截至3月31日的2018财年第一财季财报.报告显示,百度

AI裁判、写手、保姆…站在人性和技术的十字路口

人工智能(AI)已经成为科技界最热门的话题,没有之一,这个行业之所以奇妙而具有前景,正在于其无限的应用场景,但凡能和智能,特别是低智商活动沾上点关系的工作都能交给人工智能去做,比如正在如火如荼进行的世界杯,引入VAR视频裁判,严格意义上来讲,这是一种极弱的人工智能,相信随着AI技术的发展,那些庄严.肃穆.无聊的自然人裁判会随之消失,技术人员只需要把海量的犯规集锦存入AI机器人内存大脑,而动作捕捉技术,则可以扫描赛场上的一切动作,包括C罗健硕的奔跑,梅西懒散的步调,日本人细腻的技术,还有韩国棒子的

百度AI开放平台,共建AI生态

2016年,百度开始把积累多年的人工智能技术全面对外开放,从底端智能云,中间百度大脑,到顶层的DuerOS,百度打造整体人工智能开放生态,旨在帮助企业.业界能够更快速的使用.应用人工智能的技术去发展,为人类带来更好的生活.在此背景下,为了更加全面的了解百度AI开放平台及AI生态,将由百度AI技术生态部产品负责人刘倩为大家介绍百度在人工智能开放平台与开放生态方面的思考.进展以及沉淀. 以下为刘倩老师演讲实录 百度AI开放生态战略的中流砥柱---百度大脑 百度AI开放生态是从底端智能云,中间百度大脑

什么人工智能能写诗和画画?你还能打电话吗?

在过去的几年里,有人说人工智能只能替代机器的重复工作.例如,艺术创作和诗歌创作可能达不到目前的技术水平. 但就在今年,一种能写诗.画画.唱出优美优美歌曲的人工智能开始出现在人类引以为豪的文化艺术金字塔上. 今年中央美术学院的毕业生中,有一个特殊的学生叫夏玉兵,名字很有意义.在毕业展览上,他的作品和其他学生一样参加了这次展览. 她的作品一经展出就受到同学们的好评,受到中央美术学院教师的高度认可.每个来参加展览的人都会在他的作品前停下来拍照.一位教授甚至写了一篇关于他的工作的长篇评论.她的作品不仅在

百度AI开放平台- API实战调用

百度AI开放平台- API实战调用 一.      前言 首先说一下项目需求. 两个用户,分别上传了两段不同的文字,要计算两段文字相似度有多少,匹配数据库中的符合条件的数据,初步估计列出来会有60-100条左右,不会更多,只会更少.最终的需求是:从这些匹配结果中找到相似度较高的那些条目. 自己编写算法来实现是一个很大的工程,涉及到自然语言处理的一些方面,比较复杂.于是上网搜了搜,发现百度开放平台的自然语言处理可以免费调用,而且每天有10W的调用次数,对我的小项目来说正好满足.但是,在往下翻的时候

百度AI认为最漂亮的中国女星是----范冰冰

一.程序说明 1.1 程序说明 之前写调用百度AI接口的程序,然后刷到了两条明星的新闻,就想到了写个给明星颜值排下名的程序. 程序的关键点是两个,第一个是百度AI接口的调用这点其实直接使用早前实现的类所以没有费什么劲(见Python3+BaiduAI识别高颜值妹子图片). 第二个是怎么个排法,这个问题还比较大可以分成几个点,第一点是排哪些明星,有哪些明星我也不是很清楚就随便百度一下然后用了这个网站的名单:https://123fans.cn/rank.php?c=2 第二个点是去哪里取图片,开始

百度AI开放平台 UNIT平台开发在线客服 借助百度的人工智能如何开发一个在线客服系统

这段时间在研究一些人工智能的产品,对比了国内几家做人工智能在线客服的,有些接口是要收费的,有些是免费的,但是做了很多限制,比如每天调用的接口次数限制是100次.后来就找到了百度的AI,大家也知道,目前国内做AI的,应该就算百度比较超前了. 于是就开始研究吧. 百度AI的网址http://ai.baidu.com/    然后就看百度的UNIT的文档    地址参见 https://ai.baidu.com/docs#/UNIT-v2-download/top UNIT机器人对话API文档.里面的