6 Jun

通用爬虫探索(一):适用一般网站的爬虫

这是笔者参加今年的泰迪杯C题的论文简化版。虽然最后只评上了一个安慰奖,但个人感觉里边有些思路对爬虫工作还是有些参加价值的。所以还是放出来供大家参考一下。

简介

一个爬虫可以分为两个步骤:1.把网页下载下来;2.从网页中把所需要的信息抽取出来。这两个步骤都存在相应的技术难点。对于第一个步骤,难度在于如何应对各大网站的反爬虫措施,如访问频率过高则封IP或者给出验证码等,这需要根据不同网站的不同反爬虫措施来设计,理论上不存在通用的可能性。对于第二个步骤,传统的做法是设计对应的正则表达式,随着网站设计上日益多样化,正则表达式的写法也相应变得困难。

显然,想要得到一个通用的爬虫方案,用传统的正则表达式的方案是相当困难的。但如果我们跳出正则表达式的思维局限,从全局的思维来看网站,结合DOM树来解析,那么可以得到一个相当通用的方案。因此,本文的主要内容,是围绕着爬虫的第二个步骤进行展开。本文的工作分为两个部分进行:首先,提出了一个适用于一般网站的信息抽取方案,接着,将这个方案细化,落实到论坛的信息抽取上。

点击阅读全文...

7 Jun

通用爬虫探索(三):效果展示与代码

部分效果

部分网站的爬取效果。其中图1是本博客的爬取效果,表明该方案是适用一般网站的;图2和图3是两个开源的论坛程序搭建起来的论坛的爬取效果,表明对于开源程序能够正常爬取;图4是对著名的天涯论坛的爬取效果,表明哪怕是公司内部开发的论坛,也具有不错的效果。

6-blog

6-blog

点击阅读全文...

24 Jul

基于Xception的腾讯验证码识别(样本+代码)

去年的时候,有幸得到网友提供的一批腾讯验证码样本,因此也研究了一下,过程记录在《端到端的腾讯验证码识别(46%正确率)》中。

后来,这篇文章引起了不少读者的兴趣,有求样本的,有求模型的,有一起讨论的,让我比较意外。事实上,原来的模型做得比较粗糙,尤其是准确率难登大雅之台,参考价值不大。这几天重新折腾了一下,弄了个准确率高一点的模型,同时也把样本公开给大家。

模型的思路跟《端到端的腾讯验证码识别(46%正确率)》是一样的,只不过把CNN部分换成了现成的Xception结构,当然,读者也可以换VGG、Resnet50等玩玩,事实上对验证码识别来说,这些模型都能够胜任。我挑选Xception,是因为它层数不多,模型权重也较小,我比较喜欢而已。

代码

点击阅读全文...

6 Aug

【不可思议的Word2Vec】6. Keras版的Word2Vec

前言

看过我之前写的TF版的Word2Vec后,Keras群里的Yin神问我有没有Keras版的。事实上在做TF版之前,我就写过Keras版的,不过没有保留,所以重写了一遍,更高效率,代码也更好看了。纯Keras代码实现Word2Vec,原理跟《【不可思议的Word2Vec】5. Tensorflow版的Word2Vec》是一样的,现在放出来,我想,会有人需要的。(比如,自己往里边加一些额外输入,然后做更好的词向量模型?)

由于Keras同时支持tensorflow、theano、cntk等多个后端,这就等价于实现了多个框架的Word2Vec了。嗯,这样想就高大上了,哈哈~

代码

点击阅读全文...

8 Aug

【备忘】谈谈dropout

其实这只是一篇备忘...

dropout是深度学习中防止过拟合的一项有效措施,当然,就其思想而言,dropout其实也不仅仅可以用在深度学习中,还可以用在传统的机器学习方法中,只不过在深度学习的神经网络框架下,dropout显得更为自然罢了。

做了什么

dropout是怎么操作的?一般来做,对于输入的张量$x$,dropout就是将部分元素置零,然后将置零后的结果做一个尺度变换。具体来说,以Keras的Dropout(0.6)(x)为例,实际上等价于numpy做的这件事情

import numpy as np

x = np.random.random((10,100)) #模拟一个batch_size=10、维度为100的输入
def Dropout(x, drop_proba):
    return x*np.random.choice(
                              [0,1], 
                              x.shape,  
                              p=[drop_proba,1-drop_proba]
                             )/(1.-drop_proba)

print Dropout(x, 0.6)

点击阅读全文...

3 Sep

开学啦!咱们来做完形填空~(讯飞杯)

前言

从今年开始,CCL会议将计划同步举办评测活动。笔者这段时间在一创业公司实习,公司也报名参加这个评测,最后实现上就落在我这里,今年的评测任务是阅读理解,名曰《第一届“讯飞杯”中文机器阅读理解评测》。虽说是阅读理解,但事实上任务比较简单,是属于完形填空类型的,即一段材料中挖了一个空,从上下文中选一个词来填入这个空中。最后我们的模型是单系统排名第6,验证集准确率为73.55%,测试集准确率为75.77%,大家可以在这里观摩排行榜。(“广州火焰信息科技有限公司”就是文本的模型)

事实上,这个数据集和任务格式是哈工大去年提出的,所以这次的评测也是哈工大跟科大讯飞一起联合举办的。哈工大去年的论文《Consensus Attention-based Neural Networks for Chinese Reading Comprehension》就研究过另一个同样格式但不同内容的数据集,是用通用的阅读理解模型做的(通用的阅读理解是指给出材料和问题,从材料中找到问题的答案,完形填空可以认为是通用阅读理解的一个非常小的子集)。

虽然,在这次评测任务的介绍中,评测方总有意无意地引导我们将这个问题理解为阅读理解问题。但笔者觉得,阅读理解本身就难得多,这个就一完形填空,只要把它作为纯粹的完形填空题做就是了,所以本文仅仅是采用类似语言模型的做法来做。这种做法的好处是思路简明直观,计算量低(在笔者的GTX1060上可以跑到batch size为160),便于实验。

模型

回到模型上,我们的模型其实比较简单,完全紧扣了“从上下文中选一个词来填空”这一思想,示意图如下。

完形填空模型

完形填空模型

点击阅读全文...

16 Jul

Linux下的误删大坑与简单的恢复技巧

警告

以下内容包含诸多高危动作,请勿随意模仿。未成年人请在父母的陪同下观看~(^_^)

自杀式

Linux系统(下面内容同时适用于Mac OS)以开源自由闻名,然而有些时候它也开放过头了,而笔者也被它无比开发的特性坑了好几次(当然,主要是笔者使用习惯不好),遂总结分享,供大家娱乐。

最经典的例子就是,通过以下命令就可以实现“自杀”:

sudo rm / -rf

这就把你的Linux系统给毁了。显然,如果是在Windows中,这相当于在操作系统中格式化系统盘,这是绝对不允许的。

点击阅读全文...

22 Jul

Keras中自定义复杂的loss函数

Keras是一个搭积木式的深度学习框架,用它可以很方便且直观地搭建一些常见的深度学习模型。在tensorflow出来之前,Keras就已经几乎是当时最火的深度学习框架,以theano为后端,而如今Keras已经同时支持四种后端:theano、tensorflow、cntk、mxnet(前三种官方支持,mxnet还没整合到官方中),由此可见Keras的魅力。

Keras是很方便,然而这种方便不是没有代价的,最为人诟病之一的缺点就是灵活性较低,难以搭建一些复杂的模型。的确,Keras确实不是很适合搭建复杂的模型,但并非没有可能,而是搭建太复杂的模型所用的代码量,跟直接用tensorflow写也差不了多少。但不管怎么说,Keras其友好、方便的特性(比如那可爱的训练进度条),使得我们总有使用它的场景。这样,如何更灵活地定制Keras模型,就成为一个值得研究的课题了。这篇文章我们来关心自定义loss。

输入-输出设计

Keras的模型是函数式的,即有输入,也有输出,而loss即为预测值与真实值的某种误差函数。Keras本身也自带了很多loss函数,如mse、交叉熵等,直接调用即可。而要自定义loss,最自然的方法就是仿照Keras自带的loss进行改写。

点击阅读全文...