好久没有更新博文了,三月份、四月份都在为春招而呕心准备,期间巩固了 java 基础知识、Android 基础知识以及计算机相关的课程知识。
说回正题,四月末的时间参加了一个数据挖掘竞赛:第五届泰迪杯数据挖掘挑战赛 现在写一篇博文分享一下这次参赛经历吧。
泰迪杯官网:http://www.tipdm.org/bdrace/index.html
有兴趣可以看看。
可选题目有三道,分别是:
A 题涉及金融相关知识,这是绝大多数计算机学生的短板,坦诚地说,很多金融关键词根本看不懂,所以直接跳过。
B 题 中央空调系统的数据分析与控制策略 相对于 A 题 来说,算是有一定的认识,题目和去年第四届泰迪杯的 B 题 铁路旅客流量预测 有一定的共同点。但是鉴于小组三人数学物理功底都不咋地,所以果断放弃这题。
终于看到一道涉及 编程 的题目了,简单分析了题目,题目要求是一个通用的(也就是说得适合绝大多数的)论坛正文提取程序嘛,接下来就是深入分析如何去实现这个程序即可。
总的来说,就是对于任意 BBS 类型的网页,获取其 HTML 文本内容,设计一个智能提取该页面的主贴、所有回帖的算法。如下面的网页截图所示,提取主贴和回帖的区域,提取出相应数据字段(只需要提取文本, 图片、视频、音乐等媒体可以直接忽略),并按规定的数据格式(Json 格式)存储。
看看举办方给的示例:
示例提取这个论坛帖子的内容: http://x.heshuicun.com/forum.php?mod=viewthread&tid=80
如图:
其中官方提取结果如下
http://x.heshuicun.com/forum.php?mod=viewthread&tid=80 { "post": { "content": "本帖最后由 临风有点冷 于 2012-7-27 08:26 编辑 从这条新闻中你得到了什么教训 在网上看个新闻,大概内容是:老公买了一只藏獒幼仔,没时间养,一直是老婆在养;一次老公老婆吵架,老公把老婆打了,结果藏獒冲出来果断把老公手咬断了! 看完新闻我问老公:“从这条新闻中你得到了什么教训?” 本想听他说不能打老婆,没想到这货居然说:“ 游客,如果您要查看本帖隐藏内容请回复”", "title": "从这条新闻中你得到了什么教训?", "publish_date": "20120727" }, "replys": [ { "content": "的分数高如果认购二哥让他退给我", "title": "从这条新闻中你得到了什么教训?", "publish_date": "20160904" }, { "content": "1231231231321321", "title": "从这条新闻中你得到了什么教训?", "publish_date": "20161115" }, { "content": "", "title": "从这条新闻中你得到了什么教训?", "publish_date": "20161208" } ] }细心的朋友应该可以看出,官方给出的示例也是很有问题的,因为很容易看到帖主的内容提取少了(漏了 “打老婆时要把狗栓好!”),而且还提取到了不该提取的内容(如:游客,如果您要查看本帖隐藏内容请回复)。
可见举办方出题方并没有很严谨,示例显然不完美(也许就没打算我们做的多完美吧),更恐怖的是最后官方给出的结果验证数据的 Json 示例连格式都是错的。
接着分析,提取网页中的关键信息,通常的做法是,人工分析每个网页的源代码,找到特定内容对应的标签,通过标签匹配或其他关键字匹配的方法从网页源代码中获取到我们所需要的数据。
但是,不同网站网页所使用的网页格式、网页结构和标签体系都可能是不一样的,对于从互联网中获取的海量网页的批量处理,已经不能利用传统的方法去对每个有差异的网页逐一做人工分析。
不过我们可在传统做法的基础上加以演进,设计一个基于特征提取的机器学习模型,并对模型进行训练,给模型“灌输知识”,从而设计出一个相对智能提取网页正文的算法。
利用大部分网页都是以 HTML 格式文档存在这一特性,我们可使用各数据字段(主贴和回帖中标题,正文,时间等)的 Xpath 路径作为各数据字段的特征,参考决策树、模糊匹配等方法的思想设计各数据字段的学习算法模型,收集大量论坛网页的 HTML 文本作为训练样本有监督地对模型进行训练,得到题目要求算法。
当然这假设挺瞎扯淡的,尼玛这不就是最理想情况了吗?
训练全程需要人工干预,具体过程如下:对于大量的 BBS 论坛网页样本,人工找到主贴正文内容,提取对应的 Xpath 路径(提取特征),所有主贴正文 Xpath 路径组成正文知识集(记为集合U)。 其他数据字段训练过程和正文训练过程一致,在此不重复描述。
(以正文为例)对于任意的BBS论坛网页正文字段,查找网页中是否存在可以使用集合U 中 Xpath 表达式表达的节点,若存在,则直接获取 Xpath 节点内的文本内容作为对应数据字段,若不存在,则使用模糊匹配法。具体流程图如下:
其他数据字段的内容用相同的方法即可获得。
在训练样本较少的情况下,准确率会有所降低。在训练样本过多的情况下,准确率相对较高。 训练完全采用人工训练,工作量较大。 部分干扰字符没有过滤掉。
使用 Python Scrapy 多线程分布式爬虫框架,大大提高爬取效率。 使用 XPath 替代正则匹配,程序更加简洁清晰。
由于刚接触数据挖掘、机器学习,可能有的概念没有很好的把握,文章有不妥的地方欢迎指教哈。
欢迎关注我的公众号,一起学习一起飞。