过完年了, 为明年设计一个春联自动生成器, 给大家助助兴
作者:DS小龙哥
- 2022 年 2 月 26 日
本文字数:3947 字
阅读完需:约 13 分钟
1. 前言
春节是中国最隆重的传统节日,一到过年家家户户肯定是要贴春联;在春节前夕,会用大红纸张,加上浓墨书写祝福词语,在春节当天贴于门框两边,寓意着一年吉祥如意,还会将福字倒转贴于门上,有"福到临门"的意思。为了方便找到合适的春联句子,我这里就采用现成的自然语言处理接口实现了一个自动生成春联的软件,输入提示词就可以完成春联的生成,方便写春联时参考。
下面是实现的效果:
小时候最期盼的日子就是过年,可以穿新衣服,吃平时吃不到的好吃的,吃完年夜饭一起看春晚,放鞭炮;现在生活水平逐渐提高,平时穿的吃的也不差,也没有很期待了,现在过年吃完饭大家都是盯着手机玩,感觉没有以前小时候那种感觉了。
2. 实现原理
软件是采用 Qt 框架设计,调用百度大脑的智能春联接口完成春联生成。
官网地址: https://ai.baidu.com/tech/nlp_apply
HTTP请求方法: POST
请求地址: https://aip.baidubce.com/rpc/2.0/creation/v1/couplets
URL的参数:access_token 通过API Key和Secret Key获取的access_token
请求头Header:Content-Type application/json
请求参数
text 春联主题的提示字符
index 春联的索引. 默认是0,同一个提示符,多次获取时,这个索引+1就能访问后面的春联.
返回参数解释
first 春联上联:成7-9个字的上联
second 春联下联:生成7-9个字的春联下联
center 春联横批:生成4个字的春联横批
复制代码
请求示例:
{
"text": "新水",
"index": 0
}
复制代码
返回的数据示例:
{
"couplets" : {
"first": "新春新水千山绿",
"second": "春色春风万户红",
"center": "喜迎新春"
}
}
复制代码
3. 示例代码
下面列出主要的核心代码,可以直接贴到自己工程里就可以使用。
3.1 获取春联接口
//获取春联
void Widget::get_CoupletText(QString terms,int index)
{
function_select=1;
QString requestUrl;
QNetworkRequest request;
//存放图片BASE64编码
QString imgData;
//打包请求参数赋值
QJsonObject post_data;
QJsonDocument document;
//设置请求地址
QUrl url;
QByteArray post_param;
//请求地址
requestUrl = "https://aip.baidubce.com/rpc/2.0/creation/v1/couplets";
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//设置请求参数:
post_data.insert("text",terms); //字符串(限5字符数以内)即春联的主题
post_data.insert("index",index); //int 整数 默认为数值为0,即第一幅春联。每换一次,数值加1即可,一定数量后会返回之前的春联结果。
//构造请求
url.setUrl(requestUrl + "?access_token=" + Token);
request.setUrl(url);
document.setObject(post_data);
post_param = document.toJson(QJsonDocument::Compact);
//发送请求
manager->post(request, post_param);
}
复制代码
3.2 数据解析代码
//解析反馈结果
void Widget::replyFinished(QNetworkReply *reply)
{
int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
//读取所有数据
QByteArray replyData = reply->readAll();
qDebug()<<"状态码:"<<statusCode;
qDebug()<<"反馈的数据:"<<QString(replyData);
//判断状态码
if(200 != statusCode)
{
return;
}
/*
反馈的数据: "{\"couplets\":{\"center\":\"万象皆春\",\"first\":\"龙年龙舞千秋业\",\"second\":\"蛇岁蛇腾万里春\"},\"log_id\":1484407725829006888}"
上联: "龙年龙舞千秋业"
下联: "蛇岁蛇腾万里春"
横批: "万象皆春"
上联: "虎跃龙腾千里虎"
下联: "龙腾虎跃万家龙"
横批: "虎跃龙腾"
*/
if(function_select==1) //春联生成
{
//解析数据
QJsonParseError json_error;
QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
//判断是否是对象,然后开始解析数据
if(document.isObject())
{
QJsonObject obj = document.object();
//解析错误代码
if(obj.contains("error_code"))
{
int error_code=obj.take("error_code").toInt();
switch (error_code)
{
case 0: //成功
break;
case 110:
case 111:
QMessageBox::information(this,"提示","正在更新密匙.确定后重试.",
QMessageBox::Ok,QMessageBox::Ok);
//更新密匙
QTimer::singleShot(200, this, SLOT(updateCaption()));
return;
default:
if(obj.contains("error_msg"))
{
QString text=obj.take("error_msg").toString();
QMessageBox::information(this,"提示",text,
QMessageBox::Ok,QMessageBox::Ok);
return;
}
}
}
else if(obj.contains("couplets"))
{
QJsonObject obj2=obj.take("couplets").toObject();
QString center; //横批
QString first; //上联-第一
QString second; //下联第二
if(obj2.contains("center"))
{
center=obj2.take("center").toString();
}
if(obj2.contains("first"))
{
first=obj2.take("first").toString();
}
if(obj2.contains("second"))
{
second=obj2.take("second").toString();
}
ui->label_0->setText(center);
QString first_1="\n";
for(int i=0;i<first.size();i++)
{
first_1+=first.at(i);
first_1+="\n";
}
QString second_1="\n";
for(int i=0;i<second.size();i++)
{
second_1+=second.at(i);
second_1+="\n";
}
ui->label_1->setText(first_1);
ui->label_2->setText(second_1);
qDebug()<<"上联:"<<first;
qDebug()<<"下联:"<<second;
qDebug()<<"横批:"<<center;
}
}
}
}
//更新token
else if(function_select==4)
{
//解析数据
QJsonParseError json_error;
QJsonDocument document = QJsonDocument::fromJson(replyData, &json_error);
if(json_error.error == QJsonParseError::NoError)
{
//判断是否是对象,然后开始解析数据
if(document.isObject())
{
QJsonObject obj = document.object();
//解析token
if(obj.contains("access_token"))
{
QString data_token=obj.take("access_token").toString();
Token=data_token.toUtf8();
qDebug()<<"更新的Token:"<<data_token;
//保存到文件
SaveDataToFile(Token);
QMessageBox::information(this,"提示","密匙更新成功.",
QMessageBox::Ok,QMessageBox::Ok);
}
}
}
return;
}
}
复制代码
3.2 token 数据存储
/*
功能: 保存数据到文件
*/
void Widget::SaveDataToFile(QString text)
{
/*保存数据到文件,方便下次加载*/
QString file;
file=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
QFile filesrc(file);
filesrc.open(QIODevice::WriteOnly);
QDataStream out(&filesrc);
out << text; //序列化写字符串
filesrc.flush();
filesrc.close();
}
/*
功能: 从文件读取数据
*/
QString Widget::ReadDataFile(void)
{
//读取配置文件
QString text,data;
text=QCoreApplication::applicationDirPath()+"/"+ConfigFile;
//判断文件是否存在
if(QFile::exists(text))
{
QFile filenew(text);
filenew.open(QIODevice::ReadOnly);
QDataStream in(&filenew); // 从文件读取序列化数据
in >> data; //提取写入的数据
filenew.close();
}
return data; //返回值读取的值
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 2
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/eabe39216a6bd6b04ca3e1425】。文章转载请联系作者。
DS小龙哥
关注
之所以觉得累,是因为说的比做的多。 2022.01.06 加入
熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域
评论