用人工智能取一个超酷的名字(一)

在我年轻的时候,我总是讨厌别人叫我春阳。这主要是因为我觉得这个名字有点土,听起来不够有格调。但是没有办法,按照我们中国人的传统,我这辈按照族谱中的规定,第二个字是春,最后一个字是我爷爷填的,他希望我能像太阳一样,温暖身边的人,所以就填了一个阳字。

就这样,春阳这个名字就诞生了,虽然不情愿,时间长了,也就习惯了。但是这也让我在后来我每次起名字的时候,都会急进的想起个好听的、有格调的名字,可每次都是绞尽脑汁,最终也找不到一个合适的名字。这样的经历,我至少经历了,给自己起网名、起英文名,给自己的博客起名字,给宠物起名字,给公司起名字等等。起名字这件事折磨了我很久。

直到有一天,我突然灵光乍现,我可以用深度神经网络来做一个起名的人工智能程序啊。我只需要描述我想起的名字,给它一些限制的条件,让它去“思考”起名的事情,这不就一劳永逸了嘛,我就可以永远告别起名这件痛苦的事儿了。

说干就干

有了想法,那么说干就干!首先,我要确定下,我需要的输入和输出的样子。这里我的想法很简单,就是我会告诉模型我想要的名字的描述的信息,我想要的姓氏、性别,还有预留一些可能以后会用到的信息的输入方式。那么这个输入和输出就是这样的:

用人工智能取一个超酷的名字(一)_第1张图片

接下来的问题就是,我从哪里才能得到大量的既有人的名字,又有对于人的信息的描述的数据来训练我的起名模型呢?

想到这里,估计你也猜到了,恰巧就有一个地方,既有我们的名字(网名),又有我们的描述信息。(这里卖个关子,不说明确切的来源)

既然有了数据来源,接下来就是写爬虫抓数据。想要爬虫程序的,可以单独联系我,我把爬虫发给你。如果是有想直接用数据集,那么你可以安装我写的一个快速进行数据下载、加载、可视化、预处理的包 datasetstore。有了这个包你就可以快速的加载我抓取下来的数据了。下面是对应的代码:

!pip install datasetstore==1.0.1.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
from datasetstore import load_dataset

dataset = load_dataset("chinese-person-profile-10k")
dataset

用人工智能取一个超酷的名字(一)_第2张图片

datasetstore 会在第一次加载的时候,从我们的云存储中加载到你的本地硬盘中,第二次再调用的时候,就会从你的本地缓存中读取了。

读取出来的数据是使用 Apache Arrow 格式存储的,计算速度和占用的存储空间也都是有保障的。

我们也可以通过接口快速的分析和查看数据的分布,是这样的:

from datasetstore.eda import quick_analysis

quick_analysis(dataset)

我们能看到,可视化的方法可以帮助我们快速的进行数据探索,了解数据的分布、缺失值、异常值等信息。

这个任务使用的模型

从上面的描述中,我们能够很容易的知道,这是一个很经典的序列到序列的问题,也就是说,我是通过对于输入序列文本的理解,来生成一串序列文本的任务。这种任务,我们可以使用 Seq2seq 来进行建模。可以参考下面的图进行理解:

用人工智能取一个超酷的名字(一)_第3张图片

我们能够非常清楚的看到,我们输入给模型的就是对于这个名字的描述,输出的就是这个名字。

大批量对数据集进行预处理

在 datasetstore 中,我们集成了很多常用的批量进行数据预处理的方法,接下来,我们就用这些方法,把原始的文本转换为模型能够接收的输入和输出的格式。

def construct_one_example(example):
    if example["nickname"]:
        nickname_len = len(example["nickname"])
        # 输入
        gender = example["gender"] if example["gender"] else ""
        desc = example["description"] if example["description"] else ""
        # head_name + ("" * (nickname_len - 1)) +
        text = "" + gender + "," + desc + ""
        # 输出
        label = "" + example["nickname"] + ""
        return {"text": text, "label": label}
from datasetstore.preprocess import preprocessing

preprocessed_dataset = preprocessing(filtered_dataset, [construct_one_example])

这样就可以实现批量的数据转换了,当然从接口的设计上你可以看出来,其实你可以在 preprocessing 中传入多个预处理的函数,datasetstore 都会帮你顺序的处理,并且帮你打印执行的进度。

OK!到这里,我们就已经处理好了模型需要的数据格式,接下来我们还要做文本的表示和任务的建模,以及最重要的名字的生成。

我们下篇文章见~!

你可能感兴趣的