zhegexiaohuozi 发布的文章

SeimiCrawler v0.1.0终于熬过了他漫漫的开发旅程,对外发布了,目前已经同步至中央maven库。dependency:

<dependency>
    <groupId>cn.wanghaomiao</groupId>
    <artifactId>SeimiCrawler</artifactId>
    <version>0.1.0</version>
</dependency>

简介

SeimiCrawler是一个敏捷的,支持分布式的爬虫开发框架,希望能在最大程度上降低新手开发一个可用性高且性能不差的爬虫系统的门槛,以及提升开发爬虫系统的开发效率。在SeimiCrawler的世界里,绝大多数人只需关心去写抓取的业务逻辑就够了,其余的Seimi帮你搞定。设计思想上SeimiCrawler受Python的爬虫框架Scrapy启发很大,同时融合了Java语言本身特点与Spring的特性,并希望在国内更方便且普遍的使用更有效率的XPath解析HTML,所以SeimiCrawler默认的HTML解析器是JsoupXpath,默认解析提取HTML数据工作均使用XPath来完成(当然,数据处理亦可以自行选择其他解析器)。

项目主页

SeimiCrawler主页

一些特殊的原因,需要利用HttpClient自动的完成Post方法的301重定向,看了默认HttpClient官方给出的默认实现是org.apache.http.impl.client.DefaultRedirectStrategy,可以定向的方法就限定死了,

/**
 * Redirectable methods.
 */
private static final String[] REDIRECT_METHODS = new String[] {
    HttpGet.METHOD_NAME,
    HttpHead.METHOD_NAME
};

显然是无法完成Post/Redirect/Post的,所以还得继续找Apache针对接口org.apache.http.client.RedirectStrategy的实现,还好在IDE的帮助下很快找到了这个Apache关于自动重定向的终极实现org.apache.http.impl.client.LaxRedirectStrategy,这回支持Post的重定向了,但是发现无法将原Post请求Body中的数据传递下去直接丢失了,这显然是非常不理想的,无法保持原有请求的完整性几乎等于白做一样。苦恼之下只能自行实现RedirectStrategy接口,不过可以继承DefaultRedirectStrategy覆盖他的isRedirected和getRedirect,实现关键的获取重定向后的HttpUriRequest即可,即:

    @Override
    public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException {

    }

看了HttpRequest 的接口后瞬间就麻木了,

- 阅读剩余部分 -

前言

接着上一篇的坑往下填。Word2Vec训练完,"苹果"在库里就只有一副面孔的向量,可是"苹果发布了新手机"和"下午吃了个苹果"里的苹果分明是两个物种。这个一词多义的问题,静态词向量从原理上就无解,于是有了这一篇的上下文词向量。

静态词向量的三宗罪

把上一代方案的局限摆清楚,才知道后面的人都在补什么:

- 阅读剩余部分 -

前言

折腾搜索相关的功能,有感记录,想让程序判断"爬虫"和"蜘蛛"意思相近、"爬虫"和"火锅"不相干,这种事对人 trivial 到不值一提,对程序却是要命的原生问题。翻了些资料,发现这个问题的答案就是NLP的第一块基石:词向量。

从一个尴尬说起

计算机表示一个词最原始的办法是one-hot编码:词表里有五万个词,就造一个五万维的向量,这个词所在的位置填1,其他全是0。这样做有两个要命的问题:

- 阅读剩余部分 -