我们都对深度神经网络(deep neural network
)的最新发展感到兴奋。 在深度学习的各种应用当中,自然语言处理(Natural Language Process
)方面的应用引起了相当多的兴趣。 很高兴看到一个机器学习模型可以生成高精度的文本,比如莎士比亚、* 、 哈利·波特 、 奥巴马的演讲 、 星球大战 、甚至是程序代码。
我的问题是,是否有可能使用人工智能来实现一个旅游类博客的自动创作? 如果智能助理可以帮助你自动写下旅游所经之处的故事,作为旅行的记忆,那可就太好了。 事实证明,使用深入学习可以很容易地解决这项任务,因为在网络上有大量的相关数据可供利用。
有很多不同的工具来帮助你使用文本训练一个深度神经网络,已经有很多这方面的资料。 尽管如此,获取到合适的数据依然还是最具挑战性的任务。因此,我会介绍如何使用python
抓取网页。 Python
是数据科学家常用的工具,不过使用它来抓取网络也非常方便。特别是Scrapy
,这是一个从网页中提取数据的Python
开源框架。 如果你没接触过Scrapy
,可以参考这篇非常有用的博客文章:Scrapy:安装与抓取 。
旅游博客
你可以在网上找到很多有趣的、写得很好的旅游博客。 这个列表中包含了50
个最有名的旅游博客:
这些博客都很适合用来采集用于训练神经网络的文本数据。
收集数据
这些旅游博客大部分都使用Wordpress
,因此它们都有相同的HTML
结构。 例如,看以下Nomadic Matt的博客:如果你执行一个空搜索,就可以得到所有博客文章的列表:
用爬虫(Crawler
)遍历所有的页面和其中的链接,就可以采集到博客中所有的文章。 而且,一旦你点击一篇文章,在标有entry-content
的CSS
容器中就可以找到博客的正文内容。 请注意,对于使用Wordpress
搭建的任何博客都是如此:
我用Scrapy
写了一个简单的爬虫,可以在我的GitHub上找到源代码 。 这个爬虫还会从检索到的文本中删除那些乱七八糟的符号。
训练神经网络
一旦收集到足够的数据,就可以训练一个字符级的递归神经网络(Recurrent Neural Network
) 。 我使用Microsoft
的CNTK
来训练这个递归神经网络。 微软提供了一个脚本来训练基于神经网络的字符级语言模型,可以用它来预测一个指定字符序列的下一个字符。 我使用抓取到的数据训练了一个两层的递归神经网络(使用LSTM
单元),其中每层包含256
个隐节点。 一开始,网络生成的文本了无生趣:
Training 910177 parameters in 10 parameter tensors.
Minibatch[2901-3000]: loss = 2.323103 * 10000, metric = 64.5% * 10000
& the the and and and and and and and and and and and and and and and and and and and and and and and
[..]
Minibatch[21901-22000]: loss = 1.455286 * 10000, metric = 43.2% * 10000
^ and the world to the world to the world to the world to the world to the world to the world to the
训练结束后,结果就好得多了:
Minibatch[2851901-2852000]: loss = 0.911839 * 10000, metric = 28.2% * 10000
month the beautiful beaches of the city and the smaller towns and tourism and the surrounding station
[..]
Minibatch[2858901–2859000]: loss = 0.922571 * 10000, metric = 27.8% * 10000
fired islands. There’s a lot of travel writers and travelers that come in the world and the sun set o
语句自动续写
最后,我想看看我的神经网络是否能够续写我给出开头的句子。 要求你的模型从零写出一个旅游博客,可能有点苛刻了。 另一方面,借助于从网络上获得的一些启发来写出博客也是有用的。 在这种情况下,我写出一个句子的开头,然后让网络添加更多细节。 例如,我可以想象自己写着: I am travelling to
。 这些是来自网络的可能输出:
“I am travelling to “
I am travelling to Europe (finding the companions while I was there) on me. You buy reading a night’s
I am travelling to Cornwall: put I follow you to do get the Olymbookality Starbucks pretty packed alo
I am travelling to move on the god dorms time you wan me get this mysterio. Everyone over sizes that
或者我可以写一些类似The hostel was
的东西,网络就会接着写:
“The hostel was “
The hostel was cool. So day in the world, move cards, and come back to why time while I look at the m
The hostel was on the Anded tourist attractions through Europe. 3. The street to the Musen Gudding is
The hostel was probably not even darked to Travel the Bath. I was celebrated so often, a high day, an
我们可以看到结果并不完美,但也不算太差。 很酷的一点是,你可以看到这些续写出的句子并没有出现在原始的训练数据集中,因此网络真的是在创作新的内容,而不只是进行复制。 例如,I am travelling to Europe
或I am travelling to Cornwall
这样的句子并不在原始数据集中。 看到RNN
如何发明并不存在的新地名也很有趣:例如Olymbookality Starbucks
。 这就是在这个任务中,使用字符级RNN
可能是更好的选择的原因。 总的来说,如果训练时间更长,数据更多,网络的性能应该可以大大改善。
让神经网络从零开始写一篇有意义的博客帖子可能还是太有挑战性。 也许更好地利用神经网络的方式是让给它一个开头,然后让它展开,例如The hostel was bad because
。 在目前的状态下,这个网络还不能像人类那样产生有意义、富有创造性的句子。 然而,可以使用神经网络来帮助从一个用于启发的句子进行相关内容的展开。
你可以在这里找到这个博客文章中使用的代码。 请注意,我使用Nomadic Matt
的博客作为例子,因为他写得特别好。 我的文章旨在表明,博客文本也可以通过机器学习生成。 但是,如果你真的想在系统中使用这样的神经网络,你可能需要从博客的原作者处获得许可。