项目结构
程序主要由三个部分组成
server : 提供各种服务的接口,并不包含复杂的处理逻辑。主要向客户端提供数据服务。
爬虫: 拉取温大校内的各种网站上的内容,主要任务是生成可疑的新闻列表(可疑是因为有错,会在之后的处理中进一步排除),并缓存爬取的各种网页。(另外爬虫程序一次运行后,长时间不必运行)
内容提取器: 通过新闻列表,获取最新的新闻列表网页,并将其中的新闻打开(先尝试从缓存中获取),通过同级内容的差异来计算新闻的主要内容的模式,运用模式获取新闻的主要内容(在这步计算中会排除一些新闻列表)。保存新闻主要内容
分类器: 负责新闻主要内容的分类,计划用贝叶斯分类算法。因为需要大量的已标注的文档内容,所以还要开发一个方便人类使用的标注文档工具。
server
进度:做了一个拉课表的api,随便弄了下用户模型
具体api的调用接口暂不描述
程序依赖:
django+mysql。
web服务器还没定,计划用Apache
爬虫
进度:基本完成,在个人电脑上运行9小时没有出错
程序结构
如图所示,采用redis内存数据库存储中间数据,因此带给程序额外的特性:分布性
在选择redis作为内存数据库的时候,我就计划着做分布式程序,所以程序将爬虫程序分为三个部分,每个部分都可以开一个以上的程序,充分的利用计算机性能,也可以部署在不同的主机上实现分布式计算。
另外做了一个监控程序,就是第一张图上的内容。每个程序都有独立的日志,便于调试。还有新闻列表和网页内容的缓存都是保存于mysql当中(没有在图上表示出来)
内容提取器
进度:算法完成并通过简单的测试,但没有投入实际的使用环境
算法
上面的算法可以过滤网页的模板,将核心内容提取出来。
上面两个文档计算差异后生成的模式(反正给机器看,乱就乱吧 ^_-):
(1, 'body', [(1, 'div', [(7, 'div', [(1, 'div', [(1, 'div', [(3, 'div', [(1, 'div', [(1, 'div', []), (3, 'div', [])]), (5, 'div', []), (7, 'div', [(0, 'div', [(1, 'div', []), (3, 'div', [])])])])])])])])])
通过模式在文档1中提取的内容数据:
另外:
- 文档1和文档2根据新闻列表来产生,并且产生的模式将会应用于该新闻列表的所有新闻,
- 文档提取的内容没有将html标志去除,因为在之后的开发中会用到超文本信息,比如图片,加粗等信息
- 因为仅计算差异性,所以很可能产生非常不好的模式,比如两个无关的网页计算模式的结果将会把网页的大部分内容保留下来。所以文档内容在直接使用之前需要进一步计算:文档分类中分类无用文档。
分类器
进度:完全没着手