我实现了一个人工机器学习写作器

我最近在赫尔大学完成了我的进阶人工智能模块。它特别棒。“机器学习”技术尤其吸引我,大量基于此的潜在应用看起来前途无量。当我克服了(人工神经)网络工作原理的陡峭学习曲线后,我决定是时候写点什么了。

人工神经网络(ANN)写作器

在我全力搜索互联网上来研究奇迹般的机器学习的同时,我偶然发现了个 github 上的项目,使用了递归神经网络(recurrent neural network)来模仿莎士比亚的写作风格。我喜欢这个想法,所以也试着创造一个几乎完全不一样属于我自己的版本。我决定使用 scikit 这个机器学习库。这是因为它使用和配置起来都特别顺手。

Scikit 同样有着庞大的社区,里面包含了大量的教程,还有许多可以用来训练你自己的神经网络的样本数据集(example datasets )。我创建的这个写手使用了多重支持向量机(SVM)引擎。一个向量机(vector machine)用来对句子结构化,多个小型向量机用对应从词汇表中选取单词算法。

句式结构化

句式结构化非常成功,我目前使用的算法结果准确率已经很高了。这个阶段中最打的障碍就是将训练数据归一化(normals)。我使用了 NLTK 这个自然语言的库来将训练数据转化成词性标签(phrase identifiers),例如:NN(名词),DET(限定词),$(标志)等等。

这代表着我可以利用这些标签对数据进行归一化,像下面这样:

一旦归一化以后就像下面这样:

现在我只需要得到一个目标归一化后的值(target normal),并且将它代入神经网络中开始训练即可。从 二进制大型对象(BLOB)中读取文本时,训练用词就是二进制大型对象中的下一个词,因此:

接下来要做的是拿到大量 J.K Rowling《Harry Potter》的资源并且准备开始模仿她的句式结构。

词汇

词汇在本项目中无疑是最难的部分,我很清楚没有道理不使用递归神经网络,预测每个字母也是更好的办法。然而,我选择的方法产生的结果看起来特别有趣。

词汇以词序矩阵的形式包含在训练用的 BLOB 文件中。每个词分解成了词性标签接着进行归一化。归一化后的值和词汇依然被保留着,因为稍后将归一化的值转换回单词依然要利用此作为映射表。词汇看起来像这样:

尝试应用

使用 HarryPotter(small).txt

这个数据集包含了 346 个训练向量(training vectors)。是一个最小的训练集。

你可以看出神经网络很努力想要学习却缺乏训练数据。它几乎就陷入无限循环中了。

使用 HarryPotter(medium).txt

数据集包含了 2500 个训练向量。

现在你可以看出神经网络已经生成了我们预想的结果。因为增加了训练数据,它的性能得到了大幅度提升。

使用 HarryPotter(large).txt

数据集包含了 4550 个训练向量。

使用 MacbookAirBlog(large).txt

我随便在一个博客上拿到了一份文本。出乎意料的是这个数据集常常能产生更精确的结果。让我们看看。数据集中包含了 3576 个训练向量。

结果是正确的,但词汇有限。10,000 以上训练向量的数据集马上要来了。

进行一些单元测试

程序生成了非常准确的结果当我们试着对下一个顺序的词进行预测。但是当大量序列开始生成后,准确率就下降了。我创建了一个单元测试用来比较生成的下一个词与 J.K Rowling 实际创作中的词。我得到了下面的结果:

通过命令行,你可以看到:

我用同样的想法测试了词汇表:

如果预估(prediction estimation)超过 80% 就会被归为“通过(passed)”。

以上所有的结果都来自于“未完结”的程序,这也就是为什么它们看起来并不准确。

本实验只应用于教育,永不用于商业化。

如果你想查看这个项目,你可以在 github 上看到。

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

任选一种支付方式

3 7 收藏 评论

关于作者:Ree Ray

学习Python 个人主页 · 我的文章 · 22

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部