Archives for the ‘Internet/互联网’ Category

Data Science的入门级工作(1)

最近看到豆瓣的“冒牌HR”挑灯看剑和一亩三分地的Warald老大都写了关于Data Science的一些东西。我也来凑个热闹好了,不过我的出发点是用自己做过的一些项目来让大家有个直观的感受——data science到底做些什么。当然我不是正宗的data scientist,统计、数据挖掘和机器学习的积累都……只有一点点,所以我主要做的是入门级的工作,数据处理(data manipulation)和数据探索(data exploration),外加我自己比较喜欢的数据可视化(data visualization)。如果你想看到的是通过分析来做预测(prediction)、推荐(recommendation)等等,这篇博客可能让你失望。 如果文中有说错和不完全的地方,还请各位指正。 基本上所有跟数据有关的工作,首先要做的不是收集数据更不是计算。第一步,也是最重要的一步是,你要通过数据来回答什么问题。“Twitter上的中文用户和微博上的中文用户讨论的话题是不是一样的”?这就是一个很具体的问题,要回答这个问题,你需要去找Twitter和微博的数据,然后再确定用什么方法来分析。这也是一个典型的统计学理假设再检验的模式。像“明天会不会下雨?”或者“奥巴马会在那几个州选票领先?”这样更加庞大而泛泛的问题,你可能需要先把他们具体化到类似于“根据去年这个时候人们购买雨伞的数量来判断明天会不会下雨”,或者“根据Twitter上的geo tag和tweet内容来分析奥巴马再哪个州有优势”这一类的问题。 总之,先要确定研究问题,然后通过它来确定需要的数据和分析方法。 下面是两个具体例子。 项目1,微博和Twitter。 这个项目是2011年下半年开始的,持续了几个月左右。第一部分可以在这里看到。第一部分主要是做的网络关系分析(network analysis),通过分析社交关系网来探索两个平台上用户的特征。完成第一部分之后,我想进一步的分析一下两个平台在内容上的差异。 首先是收集数据。Twitter的数据好弄,我们学院有一个API,几个学生写了小脚本不断的在爬。我的工作就是从这些已经爬好的数据里挑出中文的tweet。主要方法就是通过encoding,具体代码在github。微博上则通过stream api来收集公共时间轴的数据。整个过程大概持续了一个月,收集的总量现在不太记得了,大概是十几或者几十个GB级别的文本文件。 上面说了,我想回答的问题是两个平台上人们分享、谈论的内容有没有差异。很自然的,我想到了用语言学里的常见方法——建立“词汇模型”(languange model)。大概的思路就是找出两个平台上用户所使用的高频词汇,如果高频词汇差别很大(在统计上呈显著),那么可以断言两个平台上人们在说不一样的东西。由于我们面对的是中文,所以涉及到一个分词的问题。 比如有人有天发了这样一个推“结婚的和尚未结婚的”。那我应该是把它分成“结婚-的-和-尚未-结婚-的”,还是“结婚-的-和尚-未-结婚-的”?这种对于你我来讲很简单的问题对于计算机来说则很头疼。做好中文分词这本身就是一个很难且庞大的话题。我自然不会自己去发明一套分词算法,“善假于物”是做data的人必须知道的技巧。我当然是找一个好用的分词库了。Smallseg是我用的一个python的分词库,另外现在还有个库叫jieba貌似也不错。 分好词以后,记得把stop word去掉。语言学里有个理论是出现屏率太高的词本身没有多少语义分析上的意义,比如中文里的“的地得”、“和”,还有“你我他”等等。如果不把这些词去掉,那么每一个词汇库看起来都可能差不多。 以上,就是所谓的数据处理(data manipulation)的过程了。总结起来这个过程就是把原始数据(raw data)给转换成自己所需要的数据格式。 做好数据处理之后,在微博和Twitter上抓取到的内容就被分解成了一个个的词汇,所谓建立词汇模型,就是计算某一个词汇在整个词汇数据里出现的概率,里面具体牵扯到一个叫Maxim Likelihood的方法理论。上文我还提到需要比较两个词汇库的差异性,这里面用到的则是统计上的T检验(T-test)。 具体分析过程就不在这里赘述了,挑几个有意思的可视化给大家看看吧。 首先是高频词: 图中的横轴是300个高频词,红色的点某个词在Twitter上出现的概率,蓝绿色的点是微博的,这里高频的定义是出现屏率大于0.0005。从图中可以看出,同一个流行词,在Twitter和微博上出现的概率有很大的差别。如果我们把这些词汇按照其在Twitter上出现的概率排序,就会得到另外一个图: 这个可视化里可以看到,在Twitter上经常出现的流行词,在Weibo上不一定是流行的,反之亦然。 然后我还追踪了单独的某个话题,在两个平台上出现的屏率,并以该话题在wikipedia上被编辑的次数作为参考。去年春天薄督闹得满城风雨,下图是就是“薄熙来”这个名字在Twitter和微博上出现的频率,这个图并不用怎么分析就能看出两个平台的差异性: 去年同时还发生了另外一件事,那就是舒淇被挖了老底,我也研究了一下“舒淇”这个名字被提及的概率: 大概可以得到的结论是,两个平台对这种话题都挺有兴趣的。但是,微博上话题的兴起似乎比Twitter晚一些。 另外,这里用Wikipedia上相应词条做对比的原因是我假设当一个话题有突发新闻(breaking news)时,它在的Wikipedia上的页面会有一个编辑高峰期。这个曲线正好可以被用来作为一个参考曲线。 (下一篇我会讲关于Wikipedia编辑记录的数据处理、探索和可视化)

Twitter中文top用户和新浪微博top用户对比

这学期的一个课程项目,写出来跟大家分享一下。 一直都会有这种说法,Twitter上的中文用户比微博上的用户更开放,更喜交流。正好这个学期在上网络分析的课,就试图用课上的知识分析一下两边的网络所呈现的状态。 数据收集 我们先用follower数定义出top用户,按照follower数由大到小排rank,取前100做为top用户。微博本身提供了排行榜,其中人气榜是按照follower数量来的。我们先抓取了人气总榜的前100,后来意识到这个总榜里大多数都是明星,跟Twitter的top中文用户差别太大,于是又抓了微博上草根榜前100。 Twitter中文数据比较难办,我参考Twitese的代码,自己写了一个很简易的版本。抓了14w条最近发的推、简介和用户名里有中文的用户,另外写了一些额外的条件保证韩国和日本友人不要跑到我的数据库里来。最后按照Follower数取了前100. 然后分别分析这三个top用户组之间互相关注的情况,得到了三个用户网络分别是Top_Twitter(Twitter top中文用户),Top_Weibo(微博人气总榜top)和Top_G_Weibo(微博草根人气榜top)。其中每一条Edge都代表一个关注关系,每一个点都代表一个用户。这个网络是directed的,就是说从节点A到节点B的edge和从节点B到A的edge是两条edge。 分析 用户交流: 从下面这个图,大概就能看出三个网络中用户的联系程度了。图中点的颜色越红,代表它受到其他点的关注读越高,Top_G_Weibo里有很多孤立的点。: 详细数据如下。 从这个表里可以看到,Top_Twitter这个网络的关注关系的总量差不多是Top_Weibo的两倍,是Top_G_Weibo的5倍左右。这说明在这个三个网络中间,Twitter用户更愿意关注别人。 Global clustering系数代表了点与点之间联系的紧密程度。系数越大,联系越紧密。从表里面同样可以看到,Top_Twitter网络里的节点联系更紧密。 Strong connected component指的是,如果网络中的一个子网络里没一个节点都能到达另外一个节点,那么这个子网络就是整个网络的一个strong connected component。详细看下表: 表里第一行是component的个数,第二行是每个component里的节点数的列表。Top_Twitter里只有一个点可能不被其他点reach到。而Top_G_Weibo里这样的点多达30个。 另外一个重要的数据是每日发推量。Top_Twitter里的用户平均每日发推数量是10.62,Top_Weibo里是4.56,Top_G_Weibo里是4.35。从这个数据也可以看出Twitter中的top中文用户更活跃,愿意发表意见与人交流。 用户多样性: 用户多样性是一个不太好考查的东西,我们讨论后决定,用用户所在地的分布来分析用户多样性。 三个图中的圆圈上的每一个点都是一个地点,从每个点伸出去的轴都是在同一地点的用户。可以看到三个网络中北京的用户都是处于绝对多数的地位。圆圈的大小则代表100个用户所在地的多样性。Top_Weibo的中心圆最小,明星大多都在香港北京台湾…因为Top_Twitter和Top_G_Weibo里有太多用户的地点是Unknown或者Other,所以他们的多样性,还需要进一步检查。另外注意到Twitter网络里有些用户来几个热点事件地点。 另外我们还考查了几个拥有最大用户数的地点之间的关系: 北京真是一个超大的hub。另外除了中间那个爆多明星的网络,另外两个网络都显示广东跟北京互动的最多。 讨论 整个项目还有很多可以改进的地方,像location就可以尝试抓取更准确的数据。另外抓取的三个网络全部都是搞biased的网络,如果需要知道整个网络的状况,需要更随机的取样。另外如果可以分析retweet、mention和各个推的内容,就能更准确的分析节点之间的互动了。 下个学期注册了独立学习课程,准备把这个项目继续下去。

关于咆哮体生成器的那点事

上上周末,大概是3月12号的晚上,Leon同学在工作室里安安静静的鼓捣了一下午后,扔给了我一个网址,我打开一看是他做的一个咆哮体生成器的应用,输入一些句子,然后会生成看起来有种咆哮风范的句子。他告诉我思路来自于校内上的一篇咆哮体写作规范,我一看挺有意思,然后跟他探讨了一些具体的改进。如把一段话拆做一行一段,把增加的感叹号个数变得随机,“尼玛”、“有木有”等类似的词的添加随机等等。其中最重要的发现要算,“尼玛”这个词,放在句子里靠前位置的任意一个地方,基本上都是读的通的。比如说“尼玛我要买个电视机”,“我尼玛要买个电视机”,“我要尼玛买个电视机”,“我要买尼玛个电视机”等等。于是我们就在一句话的前几个字符里随机插入“尼玛”,这往往会给句子带来意向不到的效果。 这时候所有东西都是在google app engine中用python写的。

关于网络电台的一些思考(一)- 作为背景音乐的电台

昨天开会,收获很多,自己一边听一边想,也思考了很多。这一系列文章会把自己关于网络电台和相关的服务、模式还有体验等等方面的思考都记录下来。没想到写着写着会有这么多,会分成两到三部分完成,分别是“作为背景音乐的电台”,“社会化的电台”和“电台商业化”。 互联网上的服务大致可以分为两类。一类是原生于网络的,在这个产品出来之前,现实生活中并没有原型。如Twitter,如4square(其实这个可以算“到此一游”的数字化……)。另外一类就是把已经有的原型互联网化,如网络购物等等。基本上这类服务都是将原来的名字前面加一个“网络”的标签。网络电台很明显的属于后者,更进一步讲,网络电台是把传统电台中的音乐节目剥离出来做成一个独立的服务。 (via)

Apple文案翻译小试

这周看了一篇文章叫做《Apple文案初品》,从文案撰写的角度谈了一下Apple在宣传语方面的英语驾驭能力。作者分析了数个让人眼前一亮的文案之后,发出了这样的感慨“汉语有这种情况么?有,而且比英文传神得多。可是我们发现自己没有人家用英文这么顺畅,这也是我们这代人不善文言修辞的痛。”的确,结合我的翻译经验,外加这篇文章里面举出的案例,我的感觉是英语其实是一门非常有趣的语言,在各种看似僵化和复杂的问法背后,是几乎无限的灵活运用的潜力。相比较起来,中文,特别是现在大陆使用的书面简体中文,缺乏这种活泼的性格。除了悲伤逆流成河这种矫情和文思如尿崩这种调侃,我们很难记住有哪些让人眼前一亮的广告词或者口号了。今天接着文案出品一文还冒着热气,我就试着看看能能把那些精妙的Apple口号喊成同样不错的中文 (via)