首页 > 代码库 > 毕业课题思考记录

毕业课题思考记录

用这篇日志记录在做毕业课题的一些思考,按时间分割。

2014/02至2014/04:
      抽了一些时间,看林轩田老师的《机器学习基石》,大致对机器学习、数据挖掘有了一个认识,数据挖掘更侧重于挖掘大量或潜在的数据,从而对一些问题进行分析,机器学习则是通过大量已知数据的训练,形成机器的思维,从而“学会”对接下来的数据产生比较接近人类思维的反应。
      《基石》的视频只看了三分之一,主要就是对PLA算法构造分类器有了个整体印象,大意应该是,用线上学习的方式,对到来的数据一个接一个进行处理,比如二元感知器中,不断调整分割两个区域直线的角度。其间涉及了一些统计学、数学知识,但具体技术细节,比如是否能够处理不能线性分割的数据、Hoeffding不等式对其改进,还处在十分模糊的阶段。接下来视频的内容似乎是线性回归,总之,所谓的基石,应该就是构造分类器基本算法原理的介绍,十分值得学习,当然也应该改变思路,想办法学得更明白,这个再议。
然后还看了一些论文,一开始对这个题目的认知偏向于了解并实践机器学习算法,满脑子只有一个概念,就是聚类聚类= =。从那些论文中我只能说大概了解:抽取数据可能用到的方法(基于行块分布函数的通用网页正文抽取、现有数据集等),数据预处理用到的方法(各种分词软件、无词典分词等),发现话题可能用到的方法(TF-IDF、SVM、K-Means、LDA,以及各种改进等等),但独独缺了最重要的舆情预警。直到为中期下载的论文看完都没有想明白这个事情,cnki上关于舆情预警的文章不少,但要么就在纸上谈兵,大谈诸如召回率等数据计算,要么似乎很复杂,要构建知识库,对每一个发现事件都需要在数据库中匹配,当然这种预警真正做起来应该是可行的,但似乎和我现有水平不太匹配。
      目前已经做到(或者说感受到的),首先,可以比较准确的抽取出如新浪新闻之类,比较标准的标题+长正文文本;然后对调用开源代码接口有了初步认识,能够顺利用中科院分词系统进行分词,但遗憾的是分词效果并不理想;再有就是下载了一份用TF-IDF、余弦相似性计算、K-means来对若干文本(按行分割)进行分类的代码,对整个处理流程和处理效果有了比较直观的认识。

2014/05/01至2014/05/05
      关于预警方案,进一步的思路:
      首先,我要明确对这个课题效果的认识,这本是一个十分有现实意义的课题,并且其实现在已经存在许多通过各种理论算法、大规模实时数据获取等等建立的预警系统,如何在现有情况下,更贴合实际需求,又不会太复杂从而让我在短期内实现,是我思路方向的基础。
然后再次分析这个题目,由于舆情的演化首要就是要发现新事件,因此,我需要再次考察获取数据的方案。网页新闻获取固然可以反映舆情,但目前的情况是,媒体的数量是有限的,对事件获取并不是最及时的,比如当年512地震,消息是从微博扩散到媒体,再者媒体受到的限制也比较多,未经考证的或者是牵涉一些复杂关系的事件,媒体人有媒体人的角度,但就拿动车脱轨的事件来说,民众的呼声更多是通过微博传播的。因此,如果要从网页中判断舆情,按最开始的思路,通过网页去“发现”,其实并不是最优的。再设想论坛数据,试想如果事件紧急如天灾人祸,第一当事人,基本不会选择先去某个论坛发布消息,所以通过论坛得到新鲜事也似乎不佳。当然网页的新闻、讨论,对后续事件跟踪还是十分有意义的,新闻代表了官方态度,论坛对特定事件的讨论可能比140字限制的微博更深入而且密度更大。
      所以经过这样的分析,我想我应该转战微博的数据(为了获取网页数据我安装各种VS版本折腾boost库现在看来还是比较冲动TAT)。而在后期这件事情传播是否广泛、民众情感倾向等等,可能还要综合微博评论转发、新闻、论坛等等去考虑,目前可以先暂缓,因为如何准确的发现新事件,已经是一个有意义的问题,而且实现起来并非十分容易吧……对我目前的水平而言      对于微博新事件检测,目前分析方案如下:

      1、数据获取。通过微博API接口一次可以获得随机200条最新微博,并且对访问这个借口的频次是有限制的。微博用户众多,想要在哪怕同一时间2000条微博发现新事件,可能都不具备指导意义。目前设想是,想办法定期(每隔一小时吧),获得指定小范围地区(比如南京),所有最新微博数据,这个就涉及到网页爬虫相关技术了。
      2、数据预处理。通过随机的200条最新微博,最明显的现象是,现在微博环境十分十分嘈杂,六成以上广告信息及无意义转发,两成左右人生感悟,一成不便解析的图片、长微博及网址,还有不到一成可能会描述目前身边事或者有意义转发。在这些信息中,最有意义的可能是那不到一成的叙事,当然也不排除图片长微博体现相关事件(比如琼瑶声讨于正抄袭),这里再次明确定位一下本系统的重点——发现普通人身边的新事件,那么我想我的重点,应该是找那一成微博中的原创微博。因为当遇见紧急突发事故,相信一般人不可能先去刷新微博看看有谁描述了这件事,然后对它进行转发,也不可能迅速使用长微博工具撰写一篇文章来描述这件事。我们有理由相信,如果在同一时间段,不同的人以原创微博的方式描述相似的事件,无论其转发量评论量多少(真正身边普通人的转发量评论量相信是不会太多的),那这件事应该是确实存在的新鲜事。当然后续的追踪,如果一些人在发布消息的同时@了相关新闻媒体或者微博领袖型人物,并得到他们的转发,转发量评论量必然有个增长的过程,如果是极其有“价值”的新鲜事,很可能这些数据还会剧增,这才会导致所谓的“网络舆情”。
      而我想我目前的工作,应该是先发现了新鲜事,后续是否可能造成网络舆情,可以通过对这一类主题微博的集合的转发评论数之和来判断。当然在这个过程中,很可能不能发现一些由领袖人物发起的微博讨论,这类讨论的特点是原微博一般就一条,民众以转发评论为主。这类型的新鲜事目前还不在考虑范围,先做一个记录吧。
所以预处理这一块,剔除广告等微博,找到原创微博,并且有条件的继续跟踪原创微博评论转发数,是重点。
      3、数据分析。现在有两条路,爬虫获取数据和api获取数据。但都指向一个问题,用现有的代码后续处理还是weka。现有代码好处是,已知处理的数据格式是txt,其评论数转发数计算代码,因为是C++,我还能自己写写。但不好的地方也很多,分词模块不理想,担心处理算法效率低,不知道如何输出图表。weka好处是,模块多且强大,分析数据应该比较有意思,还有我对这个工具的好奇。不好的地方在于,数据格式要从json或等等不知格式转化成csv、arff,java实在陌生。总之,现有方法上手简单,后面棘手,weka上手困难,但对后续工作应该比较有利。……好吧,经过这样分析,我更倾向于用weka了~

     那对现在思路进行一个小结和安排:
     1、数据获取应该是最关键的选择点,爬虫获取的格式未知,api获取格式可循,但宗旨都是,要获得原创微博正文及微博id,以便后续获得评论转发数。
     2、必须对arff格式有更进一步的了解,以便判断上述选择。
     3、那现在首要步骤应该是weka入门,然后再综合论文资料判断上述选择。

2014/05/07
在weka中进行数据分析目前看来有几个要点:
1、可以对.csv格式选择部分属性转为.arff进行后续分析,因此,只要微博数据获取后可以整合成csv格式就可以了;
2、似乎在weka中如何把每个词都作为一个要分析的点还是个问题,现在的规划是可以参阅《数据挖掘:实用机器学习技术(第二版)》第14章以及其它相关章节去做。

2014/05/08
      在昨天对MongoDB、Python等安装、配置的基础上,今天终于实现了《Cola:一个分布式爬虫框架》中微博正文抽取的单机版,这之间遇到了不少问题,毕竟都是从零开始,不过还是很有收获的,如果晚一些太累了,考虑把调通这个框架遇到的问题和解决方案写写~另外,高兴的发现,用MongoDB中的导入和导出,可以把json格式无压力转成csv!(这意味着如果Cola最终觉得不适用转战微博API也无压力么= =)
      所以现在最紧迫两个任务:
      1、修改Cola相关代码,使它能实现对给定初始用户,
  (1)获取个人信息中“所在地”,如果是指定地(这里假设为南京)则继续,如果不是则忽略这个bundle;
  (2)获取指定时间段微博的微博编号、正文内容(转发内容忽略)、评论数、转发书、赞数;
  (3)获取该用户的关注列表、粉丝列表,将每个相关联的人作为一个bundle存入队列,转至(1)继续执行。
  构思这个算法的前提假设是,如果该用户是普通用户(即非营销账号、非微博大V账号),所在地是南京,那么他的关注和粉丝中应该有比例不小的一部分也在南京。
这样抓取的数据应该是比较有针对性的,但面临的技术问题是:
  (1)新浪对查看好友列表频次和数目的限制。所以我想最终系统运行的时候,可能需要周期性的分析,比如一小时内,用四十五分钟获取上一小时南京的新鲜事,用十五分钟去分析;
  (2)如何修改代码。目前看来,Cola中存入数据库的代码都在网页解析模块Parsers中,需要好好分析。此外,貌似该系统只能遍历指定初始用户的好友列表,好友的好友列表能不能遍历,还有待考察。
  2、调用什么样的分词接口
  中科院的分词系统初步使用效果一般,似乎weka也有分词模块,Lucene也有分词模块,还有介绍无词典分词的方案(基于字符频率计算),到这一步应该再阅读一些微博方面相关论文了。