AI对联生成案例(一)

2024-01-22 01:36
文章标签 ai 生成 案例 对联

本文主要是介绍AI对联生成案例(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

智能对联

自然语言处理(Natural Language Processing, NLP)是人工智能领域中最重要的分支之一。本案例使用深度学习的方法,利用常见的机器翻译模型,构建了一个智能对联生成的微信小程序。通过对该案例的学习,读者能够了解NLP领域的基础理论,包括词嵌入(Word Embedding)、编码解码模型(Encoder-Decoder)、注意力机制(Attention)等重要知识点,并具备应用、实践能力。通过阅读详实的步骤介绍和参考代码,读者也能了解RNN、LSTM、GRU、Transformer等流行算法,以及Tensor2Tensor等模型库的使用,从而在应用场景中将NLP的理论知识转变成相应的实战技能。

该案例面向对象广泛,扩展性强,不但覆盖了NLP的几大主要知识点,还进一步结合了计算机视觉(Computer Vision)中目标检测、图像分割、图像标注等知识点。初学者可通过复现此案例来学习NLP相关的理论知识,在实践中加深对理论的理解、提高动手能力;对于进阶者,可以通过研究优化对联生成模型等方面,对该案例应用做进一步的扩展,从而提高分析、研究能力。

发展历程及实现方法

机器翻译的发展经历了以下几个阶段:

由最初的基于规则的方法,发展到统计机器翻译,再到现在的神经网络机器翻译。

基于规则

基于规则的方法是由人来提供翻译规则,从词语到词语的对应,都由人来提供。由于该方法需要人类语言专家来设计规则,且规则复杂,因此开发周期长,成本高。由于基于规则的方法,通常是字字对应的转化,没有考虑上下文,因此翻译质量通常会由于使用场景的不同而产生较大的差异。

统计机器翻译

在基于统计的机器翻译中,规则是由机器自动从大规模的语料中学习得到的,而非由人主动提供完整的规则。这种方法的成本较低,因为机器可以利用大量数据自动学习对应的规则,而无需人的参与。由于统计机器翻译基于大量的语料库,因此翻译质量易受语料库的多寡影响。

微软亚洲研究院周明老师团队早在十几年前就已经使用基于短语的统计机器学习的方法,实现了电脑自动对联系统,效果非常好,很好的展现了中国经典文化的魅力,收获了非常多的赞誉。在线体验地址是 这里。

神经网络机器翻译

近年来,深度神经网络学习的发展为机器翻译提供了新的思路。通常情况下,神经机器翻译使用编码器-解码器框架。编码阶段将整个源序列编码成一个(或一组)向量,解码阶段通过最大化预测序列概率,从中解码出整个目标序列,完成翻译过程。

编码器、解码器通常使用 RNN、LSTM 来实现,也有的用 CNN 来实现,达到了比较好的性能和结果。

在本次案例中,我们将使用深度学习的方法,实现一个对联自动生成的应用。

当前,常见的深度学习算法有 RNN、 LSTM、GRU、 Transformer。

由于前馈神经网络的输入都是一批静态数据,无法处理对于随着时间变化的连续数据,或者说无法捕捉时间序列的关系,因此科学家提出了循环神经网络(RNN,Recurrent Neural Network),通过连接多个前馈神经网络的隐藏层,从而获取每个相邻时间步之间的联系。在RNN的基础上,科学家又引入了大量优化理论并从此衍生出许多改进算法,如长短期记忆网络(Long Short-Term Memory networks, LSTM)、门控循环单元网络(Gated Recurrent Unit networks, GRU)等。

LSTM主要解决了RNN中容易出现的梯度爆炸和梯度消失的问题,而GRU在LSTM的基础上,做了进一步的简化,但它们始终是基于RNN的算法,十分地消耗计算资源。Transformer算法则基于全新的Attention机制,放弃了循环和卷积,采用了编码器和解码器的结构,在翻译任务上的表现也更优。因此,在这里我们选择使用transformer模型来实现我们的任务。

案例价值

此案例特色显明,生动有趣,可以激发学生们对深度学习的兴趣。在技术层面,此案例使学生对深度学习的时序模型有直观的了解。该案例面向对象广泛,扩展性强。对初学者,可重复案例的过程;对于进阶者,不论在模型选择上,还是在模型推理上,都可以有更多的扩展,可提高学生们的探索研究能力。

核心知识点

  • 使用微软认知服务(Cognitive Service)中计算机视觉(computer vision)服务
  • NLP 相关知识
    • Sequence2Sequence 模型
    • 相关算法: RNN,LSTM,GRU,Transformer
  • 模型库的使用
    • Tensor2Tensor
    • 费尔赛克
  • 在OpenPAI上训练模型

先修知识

  • 了解RNN的基本概念和原理

    参考链接: 循环神经网络

  • Seq2Seq模型的基本概念

    参考链接:序列到序列

  • 了解主流深度学习框架

    参考链接:tensorflow, Pytorch

  • 熟悉github的使用

    参考链接:GitHub入门

环境与工具

本案例运行在Azure虚拟机上,虚拟机的系统为Ubuntu 16.04

需要的软件环境如下:

  • 蟒蛇 3.5
  • 张量流 1.14.0
  • 张量2张量 1.14.1

软件依赖

在开始之前,请确保安装好以下依赖:

  • 训练所需 python packages 在文件 train_requirements.txt 中。

安装示例:

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>pip3 install -r train_requirements.txt
</code></span></span></span></span>

案例大纲

序号内容关键知识点收获实战技能
1图片信息提取认知服务使用Cognitive Service提取图像内容
2文本表征词嵌入与词向量掌握常用词嵌入的方法; 用向量表征文本; 词向量库的使用
3语言模型简介传统语言模型; 基于神经网络的语言模型了解语言模型发展历程及基本原理
4Seq2Seq序列模型Seq2Seq, 编码器-解码器, 注意, 变压器掌握Seq2Seq模型原理
5模型库的使用Tensor2Tensor、Fairseq使用模型库构建并训练语言模型;使用训练好的模型进行推理
6应用开发后端开发HTTP服务搭建

推荐学习时长

  • 初次学习的实战者:5~8 小时
  • 有一定经验学习者:3~5 小时

案例详解

程序结构

本案例的基本程序结构如下图所示:

由于在该结构中,NLP的核心内容在于上联生成下联,因此我们将会在案例中关注此部分的实现,并搭建一个简单的web应用将模型封装成api。

数据收集

有了模型,还需要数据。巧妇难为无米之炊,没有数据,什么都是浮云。数据从哪里来呢?GitHub 上有很多开源贡献者收集和整理了对联数据,可以进行下载使用。

本案例从下面几个渠道获取对联数据:

  1. Github网站上的开源对联数据: https://github.com/wb14123/couplet-dataset/releases
  2. Github网站上的开源古诗数据: https://github.com/chinese-poetry/chinese-poetry
  3. 微软亚洲研究院提供的10万条对联数据(非公开数据)。

工具包的选择

想要完成一个自动生成对联的小程序,想法十分美好,但想要达到这个目标,光拍拍脑袋想想是不够的,需要训练出一个能完成对联生成的自然语言理解模型。于是乎,就有两个选择:

  1. 自己写一套完成对联生成工作的深度学习模型。这个工作量相当之大,可能需要一个NLP专业团队来进行开发,调优。
  2. 应用已有的深度学习模型,直接应用。这个选择比较符合客观需要。我们找到了两个工具包:Tensor2Tensor和Fairseq。

Tensor2Tensor

Tensor2Tensor(以下简称T2T)是由 Google Brain 团队使用和维护的开源深度学习模型库,支持多种数据集和模型。T2T 在 github 上有完整的介绍和用法,可以访问这里了解详细信息。

在本案例中,我们将演示如何使用T2T工具包进行模型训练。

费尔赛克

Fairseq 是 Facebook 推出的一个序列建模工具包,这个工具包允许研究和开发人员自定义训练翻译、摘要、语言模型等文本生成任务。这里是它的 PyTorch 实现。

除了下面的使用T2T训练的版本外,我们也提供了使用fairseq训练模型的教程。

数据预处理

生成源数据文件

网上提供的对联数据形式各异,需要整理成我们需要的格式。我们创建两个文本文件,命名为 train.txt.up 和 train.txt.down,存放上联和下联数据。每个上联/下联为一行,用换行符 '\n' 分隔。

生成词表文件

接下来我们要统计上下联中出现多少不同的字,用于后续的模型推理。

  1. 将上下联数据每个字以"空格"分隔,合并成一个文件。

    a. 分隔数据的python代码 (split_data.py):

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>import sysfilename = sys.argv[1]
    with open(filename, 'r', encoding='utf-8') as infile:with open(filename + '.clean', 'w', encoding='utf-8') as outfile:lines = infile.readlines()for line in lines:out = ""for i in line.strip():out += i + (' ')out = out[:-1]out += '\n'outfile.write(out)
    </code></span></span></span>

    b. 执行如下命令完成文件分隔

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>python3 split_data.py train.txt.up
    python3 split_data.py train.txt.down
    </code></span></span></span>

    分隔后生成两个文件:train.txt.up.clean 和 train.txt.down.clean

    c. 合并文件为 merge.txt

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cat train.txt.up.clean train.txt.down.clean > merge.txt
    </code></span></span></span>
  2. 统计文件中出现的不同字和每个字的出现次数。

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>subword-nmt get-vocab --input merge.txt --output merge.txt.vocab
    </code></span></span></span>
  3. 去掉出现次数,只保留字,并统计字数

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cat merge.txt.vocab | awk '{print $1}' > merge.txt.vocab.clean
    wc -l merge.txt.vocab.clean
    </code></span></span></span>
  4. 生成测试集。

    取训练集中前 100 个数据作为测试集。(在实际训练过程中,没有用到测试集)

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>head -n 100 train.txt.up.clean > dev.txt.up.clean
    head -n 100 train.txt.down.clean > dev.txt.down.clean
    </code></span></span></span>

完成以上预处理以后,我们最终得到以下文件:

  • train.txt.up.clean
  • train.txt.down.clean
  • dev.txt.up.clean
  • dev.txt.down.clean
  • merge.txt.vocab.clean

将上述文件放到目录(新建目录)。usr_dir

自定义T2T问题

  1. 新建目录。usr_dir

  2. 在merge_vocab.py 文件中编写下联生成模型的问题定义。

    修改如下参数:

    1. SRC_TRAIN_DATA为训练集上联数据文件
    2. TGT_TRAIN_DATA为训练集下联数据文件
    3. SRC_DEV_DATA为测试集上联数据文件
    4. TGT_DEV_DATA为测试集下联数据文件
    5. MERGE_VOCAB为最终字表文件
    6. VOCAB_SIZE为字表文件中字的个数

    该文件注册了问题类 ,用于指出如何进行上下联翻译。其中 函数用于处理词表、编码、创建完成时序任务的生成器的工作。TranslateUp2downgenerate_encoded_samples

  3. 添加一个 文件,导入。__init__.pymerge_vocab.py

    <span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>from . import merge_vocab
    </code></span></span></span>

检查目录

完成上述步骤后,请确保你的文件按如下的目录结构放置。

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>usr_dir \__init__.pymerge_vocab.pytrain.txt.up.cleantrain.txt.down.cleandev.txt.up.cleandev.txt.down.cleanmerge.txt.vocab.clean
</code></span></span></span></span>

生成训练数据

在本案例中,若要使用 T2T 工具包进行训练,需要把数据转换成T2T认可的二进制文件形式。

使用如下命令生成训练数据:

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>USR_DIR=./usr_dir
DATA_DIR=./data_dir
PROBLEM=translate_up2downt2t-datagen \--t2t_usr_dir=${USR_DIR} \--data_dir=${DATA_DIR} \--problem=${PROBLEM}
</code></span></span></span></span>

其中,

t2t_usr_dir:指定了一个目录,该目录中包含 __init__.py 文件,并可以导入处理对联问题的 python 模块。在该目录中,编写 merge_vocab.py 文件,注册对联问题。

data_dir:数据目录。存放生成的训练数据文件。

problem:定义问题名称,本案例中问题名称为 translate_up2down。

当命令执行完毕,将会在 data 目录下生成两个文件:

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#1f2328"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>translate_up2down-train-00000-of-00001
translate_up2down-dev-00000-of-00001
</code></span></span></span></span>

这便是我们需要的训练数据文件。

这篇关于AI对联生成案例(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631461

相关文章

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma