热爱互联网

Golang Search Engine

这就是哥的毕设,尽管很水,但是不得不写。
大四第一学期开始学的go语言,然后寒假把这个基本写好了,断断续续写了一个月,爬虫还是去表哥那里蹭网测试的。。。
这两天准备写论文了,顺便把代码整理了一遍,目前web界面有点丑,就一个table,一个button,当然遵循MVC模式,到时候把样式改好看的就行了。

记录下比较有意义的地方:

爬虫:整个代码才2500余行,spider就占了500多行,当然麻雀虽小,但五脏俱全,可以配置爬虫的各个参数,比如抓取指定网站下的url, 即使爬虫意外关闭,也可以重新启动从上次断开的地方开始爬取…。 BFS搜索,多个goroutine下载,一个goroutine负责将数据写入磁盘。原理很简单,不过从这个spider中非常能感受到go语言的 channel 和 goroutine 的优美 — 并发之美。

提取网页正文和标题通过正则表达式搞定。

分词:采用双向最大匹配, 写棵 trie 就行了,然后需要记录下状态转移。一开始是用trie去分词的,今天装逼的写了个double array trie去替换掉trie 来优化内存,妈蛋的发现内存差不多, golang里面的map内部是一个非常优化内存了的hash算法,哥的trie就是用map去记录子节点,难怪和double array trie消耗的内存差不多。

关键词提取及索引:哥一开始从人民网上下载了5万多个网页,可以看做一个小型语料库了。然后去计算每个词的逆文档频率(Inverse Document Frequency,缩写为IDF),将这些IDF保存到数据库留作后用。对爬虫下载下来的网页,计算其TF-IDF值,索引之,差不多就完事了。。目前的策略是标题的关键词的权重是正文关键词的数倍。TF-IDF与余弦相似性的应用

数据库是sqlite3,sqliteadmin这个可视化工具不错,方便查看sqlite。当然也可以改用其他数据库,改一个参数就好了。
web方面用的是net/http自带的服务器,template引擎还算凑合。
顺便还写个本地文件搜索,丫的特简单,几十行代码。。

不说了,贴代码:
https://github.com/gansidui/gose

Post a Comment

Your email is kept private. Required fields are marked *