前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >前方高能!哈利·波特的咒语已破译(机器学习控必点)

前方高能!哈利·波特的咒语已破译(机器学习控必点)

作者头像
DT数据侠
发布2018-08-08 17:33:32
4680
发布2018-08-08 17:33:32
举报
文章被收录于专栏:DT数据侠

《哈利波特与魔法石》推出的时候,谁也不曾料到,那个最初连一句“Leviosa”羽毛漂浮咒语都念不好的绿眼睛男孩,竟会陪伴我们这群麻瓜整整20年。

当无数哈迷还在重温经典时,这位来自英国赫尔大学的数据侠Jacob已经创造了一个“写手”程序,教大家如何模仿《哈利·波特》的口吻写文章。今后,哪怕没有‍邓布利多‍教授带你玩,你也可以写模仿J.K Rowling的为哈利写一段咒语啦!‍‍‍‍

我创造了个“写手”程序,能模仿大师写作风格哦

我最近在赫尔大学完成了我高级人工智能课程单元。它特别棒。

“机器学习”特别吸引我的地方在于,这项技术的潜在应用看起来无穷无尽。当我成功克服了(人工神经)网络工作原理的陡峭学习曲线后,我决定是时候创作些什么了。

当我疯狂地在互联网上搜索机器学习的奇迹时,我偶然发现了个20上的项目,使用了时间递归神经网络(recurrent neural network,RNN)来模仿莎士比亚的写作风格。我很喜欢这个创意,也想试着创造一个不一样的属于我自己的版本。

DT君小课堂:RNN包含输入单元(input units)群、输出单元(output units)群和隐藏单元(hidden units)。这些隐藏单元完成了最为有意思的工作,它们就像魔法,让你输入的话变得更像莎士比亚和哈利波特。训练RNN存在很多相当具有挑战性的难题,而这仍是一个非常活跃的研究领域。感兴趣的童鞋,请看文末参考资料。

我写了一个人工机器学习“写手”程序,试图通过训练它来模拟人格并模仿著名作家的写作风格写作。我们将尝试模仿莎士比亚,j.k.罗琳和网络上随机的博客。

这个“写手”程序将会这么来做:通过训练数据逐步增加句量,利用NLTK把句子拆解转换成词性标注,训练象征符号的结果,再次增加句量,然后训练词性标注出现的概率。(DT君注:这里看不懂可以直接跳过,反正就是通过训练让机器更懂大师的语言风格,比如最爱用什么句式和词组。)

许多程序尝试通过分析文本来预测特征出现的概率,然而并不准确。而我的这种方法总是能有好的结果。(DT君OS:作者写到这里的时候应该露出了迷之自信的微笑。)

数据分类和归一,都是为了有一个好的模仿对象

DT君小课堂:DT君小课堂:接下来作者就要对数据做分类了。分类是数据挖掘领域中一项非常重要的任务。自然语言处理NLP中,一般的模式分类方法都可用于文本分类研究。常用的分类算法包括:决策树分类法,朴素的贝叶斯分类算法、基于支持向量机(SVM)的分类器,神经网络法,k-最近邻法(k-nearest neighbor,kNN),模糊分类法等等。

我决定使用scikit机器学习库。它使用和配置起来都特别简单。Scikit有着庞大的社区,里面包含了大量的教程和许多可以用来训练你的神经网络的样本数据集(example datasets)。我并没有使用原有的样本数据集,我想把无序的文本转变成归一化的训练数据。我创建的这个“写手”使用了多重支持向量机(SVM)的分类器,一个向量机(vector machine)用作句子结构化,多个小型向量机用于对应从词汇表中选取单词算法。

DT君小课堂:支持向量机(SVM)通俗来讲是一种二类分类模型,其学习策略便是间隔最大化,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。想要深入了解,请看《理解SVM的三层境界》(文末参考资料中附网址。

我目前使用的算法能有精准的结果,这使得句式结构化非常成功。这个阶段中最大的障碍就是将训练数据归一化(normals)。

DT君小课堂:归一化,简单的讲就是由于数据单位不一致,所以需要将不同的数据进行格式化,使之在指定的范围内,比如在0-1之间。归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。举个栗子:一张表有两个变量,一个是体重kg,一个是身高cm。假设一般情况下体重这个变量均值为60kg,身高均值为170cm。这两个变量同样是100,对于身高来说很矮,但对于体重来说已经很大了。所以归一化就是要解决这个问题,目的是可以用数值直接来进行比较。

我使用了NLTK(Natural Language Toolkit自然语言工具包)的库来先将训练数据转化成词性标注,例如:NN(名词),DET(限定词),$(符号)等等。(然后再将其归一化)

DT君小课堂:为什么要用NLTK?从计算机处理的角度来看,英语或任何自然语言(口语或普通的语言)都是极不规范和不准确的,需要对它们进行整理。NLTK还提供了一些 “词干分析器” 类,以便进一步规范化单词。

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

["The","cat","jumped"]= ['DET','NN','VP]

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

['DET','NN','VP]= [0.2237823,0.82392,0.342323]

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

["The","cat","jumped"]["towards"]=['DET','NN','VP]["PRP"]=[0.2237823,0.82392,0.342323][0.12121212]

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

努力提高词汇量,这样才能“喂饱”我的“写手”

词汇无疑是本项目中最难的部分,我很清楚地知道没有理由不使用递归神经网络,预测每个字母也是更好的办法。然而,我选择的方法产生非常酷炫的结果。(DT君翻白眼地注:作者迷之微笑了……)

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

[[(cat,[0.232342]),(bat,[0.2553535]),(dog,[0.345454]),(horse,[0.4544646])...]

[(run,[0.12131],(jump,0.232323),(fall,0.43443434)...]

...

]

1. 我们先使用小型文本HarryPotter(small).txt(DT君注:作者所使用的文本,请点击GitHub)。

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

DT君小课堂:机器学习是学习一些数据集的特征属性并将其应用于新的数据。这就是为什么在机器学习用来评估算法时,一般把手中的数据分成两部分。一部分我们称之为训练集,用以学习数据的特征属性。一部分我们称之为测试集,用以检验学习到的特征属性。

Input(输入):"Harry dont look"(哈利不要看)

Output(输出):"Harry dont look had at eleven for witches had been for eleven then with nothing had been for eleven then with nothing had been for eleven then with nothing had been for eleven "(哈利不要看,11,女巫,11,没有事情,11,……)

Input(输入):"Wizards sometimes do"(巫师有时候会做)

Output(输出):"wizards sometimes do , Harry had been been , Harry had been been , Harry had been been , Harry had been been , Harry had been been , Harry had been been "(巫师有时候会做,哈利已经在,哈利已经在,哈利已经在,哈利已经在,哈利已经在,哈利已经在)

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

2. 我们接下来开始使用中型文本HarryPotter(medium).txt。

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

Input(输入):"Harry don't look"(哈利不要看)

Output(输出):"Harry don't look , incredibly that a year for been parents in . followers , Harry , and Potter was been curse . Harry was up a year , Harry was been curse "(哈利不要看,难以置信地有一年父母在。花朵,哈利,波特都被诅咒。哈利长大了,哈利被诅咒)

Input(输入):"Wizards sometimes do"(巫师有时候会做)

Output(输出):"wizards sometimes do parents."(巫师有时候会对父母做)

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

3. 使用大型文本HarryPotter(large). txt,数据集包含了4550个训练向量。

Input(输入):"Harry don't look"(哈利不要看)

Output(输出):"Harry don't look Petunia Harry , incredibly had on the address."(哈利不要看佩妮哈利,有地址)

现在,除了一个错误的停顿应该在Petunia(佩妮)与Harry(哈利)之间,这个句子简直完美。

不过,在这里,训练数据的增加反而给了一个负面的结果。这是罕见的。

Output(输出):"Wizards sometimes do the address on the address on the address."

4.接下来,要使用另一个和哈利波特无关的大型文本MacbookAirBlog(large).txt了。

我随机在一个博客上抓取了一份(与哈利波特无关的)文本。出乎意料的是这个数据集通常能产生更精确的结果。数据集中包含了3576个训练向量。

Input(输入):"Harry don't look"(哈利不要看)

Output(输出):"Harry don't look , also of a scaling on playing . Use for Control weight goes so cable and they've of placed it . you do to want things at at 2015."(哈利不要看,比例玩起来。控制作用体重所以有线和他们放在这里。2015年你的确需要东西。)(DT君OS:真心是什么鬼啊……)

Input(输入):"Wizards sometimes do"(巫师有时候会做)

Output(输出):"Wizards sometimes do When ports a scaling the have object , also of a scaling on playing ."(当港口有货,巫术有时候会做,比例玩起来)

可以看出,当我们试着对下一个顺序的词进行预测时,程序生成了非常准确的结果。于是,我又创建了一个测试单元用来生成之后的大量序列,并比较生成序列与 J.K Rowling 实际创作中的词。

DT君卖关子:想知道Jacob测试单元最终的精准度吗?当大量序列开始生成后,机器“写手”程序能完美实现模仿与预测吗?

注:本实验只应用于教育,永不用于商业化。原文出处:《Artificial machine learning writer》, 本文同时参考了伯乐在线的翻译:《我实现了一个人工机器学习写作器》。本文的编译已经得到作者授权

作者 | Jacob Plaster

编辑 | 沈念祖

参考资料
  • 时间递归神经网络(recurrent neural network,RNN)http://nikhilbuduma.com/2015/01/11/a-deep-dive-into-recurrent-neural-networks
  • 《理解SVM的三层境界》http://www.cnblogs.com/v-July-v/archive/2012/06/01/2539022.html
  • 作者使用的文本 https://github.com/JacobPlaster/ann-writer
数据侠门派

本文数据侠为Jacob Plaster,来自英国赫尔大学。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DT数据侠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ▍我创造了个“写手”程序,能模仿大师写作风格哦
  • ▍数据分类和归一,都是为了有一个好的模仿对象
  • ▍努力提高词汇量,这样才能“喂饱”我的“写手”
  • ▍参考资料
  • ▍数据侠门派
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档