标签归档:文本挖掘

COS每周精选:Simply Statistics为你解释GMM

本期投稿  冷静 肖楠 魏太云 谢益辉

  • 统计学家在其他领域大放异彩已经不是什么新鲜事,最近公布的三位诺贝尔经济学奖获得者之一,Lars Hansen,就是其中一员。有趣的是,因为Hansen 的理论过于复杂以致于众多新闻报道乃至经济学评论都对他的成果支支吾吾,一带而过。以至于Chicago Magazine 称之为the forgotten Nobel Prize winner。甚至在是诺贝尔奖委员会(Nobel Prize Committee)对三人研究的介绍中,对GMM究竟是什么也是暧昧不清。其实这一点早就有人担忧过了,Tyler Cowen就说了:“For years now journalists have asked me if Hansen might win, and if so, how they might explain his work to the general reading public.  Good luck with that one.”读到这里,学统计的优越感出来了有没有!要解释统计学家的研究还是得由统计学家来。Wikipedia上的GMM词条被认为太过难懂,正在召唤有志之士把它解释得简单点。Alex Peter 尝试着用基本的统计符号解释GMM ,不过门槛还是有点高。Simply Statistics 决心为普罗大众(general audience)写一篇科普文,如果你看懂了,恭喜你,你已经超越了一般的普罗大众,而成为一个统计学家眼中的普罗大众了。
    当然这一切高深晦涩都不影响Hansen 的GMM模型在资产定价、行为经济学中的广泛应用,因为它的普适性,以后还会应用得更广。这或许就是统计学朴实而深刻的终极目标——有用。与众位共勉。
  • R 的生物信息学小书: 之所以说是小书源于作者将其称为 a simple introduction to bioinformatics,但麻雀虽小,五脏俱全,该有的从头到尾一点不少。本书专注于与热带疾病有关的基因组分析,当然,也少不了我们的主人公R~
  • Julia的福利:Julia 的主要开发者之一在 Strata 站点上撰文阐释了 Julia 在数据科学中的定位: 文章娓娓道来,解释了 Julia 语言的设计、与 R 和  Python 的关系,综述了生态系统的现状,以及对未来的展望~
  • Python:    Troll Detection with Scikit-Learn 漂亮的简单模型 + 模型集成。话不多说,同道中人请点赞~这里附上scikit-learn的网站。
  • 微博速递:刚刚过去的kdd2013上有大牛wright做了一个“Optimization in Learning and Data Analysis“的keynote , slides里面对这方面的新旧内容做了一个很好的review, 实在是一份极好的导引。@晓风_机器学习
  • Xi’an给Beta分布手写了一个计算最高概率密度区间的函数(看看人家教授整天还在捣鼓R代码),下面有读者回复了一个更通用的函数,可是都是假设概率密度函数是单峰的,小编几年前对这个问题也有些兴趣,不过这次小编放狗搜了一下,发现Rob Hyndman十几年前(R诞生的前一年)就有一篇小文章来解决这个问题了:Computing and Graphing Highest Density Regions

微博名人那些事儿(二)

如何评价一个名人的热度?自然而然能想到的方法是,通过粉丝/关注比来评判其“风云”程度(好吧如果不考虑僵尸粉这种特色产物……><)。但实际上,在social network里面,我们真正面临的,是一个“网络”结构。让我们想想,消息在SNS里是怎么传播的呢?关注、粉丝、转发、评论 blablabla……所以,最近我在想,能不能利用这些关系来评判一个人的影响力?

首先面临的问题是,应该用什么样的行为表示人与人之间的关系呢?鉴于想对用户兴趣做一些扩展的探索,我首选了“转发”关系。而且,退一步讲,在新浪在7月2号对API做了调整限制后,关注关系及粉丝关系等就不是我们这种ds小市民那么容易得到的了。(实际上即使能够得到,我个人也认为转发关系是在信息传播力上极为重要的一环)

继续阅读微博名人那些事儿(二)

微博名人那些事儿

微博,这一新生代大规模杀伤性社交武器近年来迅速在国内走红,其来势之汹,范围之广,威力之猛当不可小觑。通过它,我们不仅能第一时间八卦到身边柴米油盐、鸡毛蒜皮的小事儿,而诸如家国天下、业内前沿的大事记也难以逃过公众的法眼。

这样迅捷高效的信息传播是怎样做到的呢?相信每一个微博控都能如数家珍的道出自己心仪的几位微博名人们,不妨就从那些微博名人们入手,看看这些名人们身边的故事。

1、信息采集

信息采集,说白了就是数据爬取。还好,这些名人们可是早就榜上有名了,可以用XML包的readHTMLTable函数爬下来风云榜上来自体育、财经、传媒、科技 and so on的风云人物的微博信息,存为数据集。

以sports数据集为例,代码如下:

library(XML)
# get data from web
webpage <-'http://data.weibo.com/top/influence/famous?class=29&type=day'
tables <- readHTMLTable(webpage,stringsAsFactors = FALSE)
sports=tables[[1]][,c(1,2,3,6)]
names(sports)=c("rank","name","influence","description")

这样,我们就获取了这些名人们的微博大名。
继续阅读微博名人那些事儿

十八般武艺,谁主天下?

十八般武艺各有神通之处,所谓“一弓、二弩、三枪、四刀、五剑、六矛、七盾、八斧、九钺、十戟、十一鞭、十二锏、十三挝、十四殳、十五叉、十六耙、十七绵绳套索、十八白打”,这让一个江湖新手一上来就学全十八般武艺,还真是有点为难人家呢。这在古代,天下可都是一群架一群架扎扎实实打出来的。指挥者可以运筹帷幄决胜于千里之外,但是真要上阵的小兵们可就惨多了——谁若是稍有走神,怕是小命就危在旦夕了。还有那血雨腥风却始终有无数人向往的江湖,或迷人或险恶,总得有一技傍身方觉得安心些。可是,这一技说来容易,到底学才可以雄霸天下呢?嗯,其实一般说来我们是不需要担心这个问题的,可是凡事总有例外——比如做梦的时候…

小编不幸的就在梦中穿越回了古代一回,然后面对着师傅一下子扔出来的一堆兵器傻了眼——这该如何下手呢?直到梦醒,耳边回荡的还是师傅那严厉的声音“给你一天时间考虑,明天来见我的时候告诉我你要学什么”。呃,为了明天做梦的时候不挨骂,还是老老实实的选一样东西吧。可是这也不能信手拈来就是嘛,总要有点科学依据,要不怎么能显得出来我这个辛辛苦苦梦中穿越回去的现代人的智商优越性呢?

于是开始狂翻枕边常备的武侠小说。“问世间情为何物,直叫人生死相许”——正沉浸在杨过和小龙女的离别悲伤之中,恍然觉悟,呃,貌似不对,看错章节了…师傅明天才不会管我怎么谈恋爱呢。可是这么多打打杀杀的,金庸老鬼的十四本巨著这到啥年啥月才能看完呀!晚上就得回师傅答案呢。算了,在这个信息时代,自然要倚仗科技的力量——比如,文本分析神马的应该可以搞定吧?先去百度一下,结果度娘说:

得人心者得天下…
得中原者得天下…
得此女者得天下…
得知识者得天下…
得青年者得天下…
得蜀者得天下…

这些怎么看起来这么不靠谱…算了,还是自己动手丰衣足食吧。眼看太阳就要下山了,小编赶紧打开电脑。噼里啪啦一阵键盘声响起,金庸大侠的十四本小说就乖乖的躺在那里了。稍待片刻,等我做好了分析,嘿嘿,晚上就不怕师傅拷问了。都说群众的智慧是无穷的,听说一博彩公司预测大选什么的比那些专门的学者们还要准…我还是先看看那些大侠们都用什么吧!都说剑品即人品,那我们就来看看这些武器的PR值吧(此处纯属开玩笑 :P,PageRank还是一个比较好用的计算网络权重的指标)。

金庸的武侠世界
金庸的武侠世界

然后看看排名,果然还是学剑最好哇!

剑 0.018411053
刀 0.017516021
掌 0.017137869
抓 0.011880115
拳 0.011605281
圈 0.007458074
船 0.005805638
镖 0.004840676
枪 0.004806615
弓 0.003935635
钩 0.003358054
棍 0.003121407
叉 0.002733994
拐 0.002570806
锤 0.002392814
斧 0.002056493
戟 0.001731019
铲 0.001521452
戚 0.00148074

嘻嘻,搞定了晚上梦会师傅的事情,就可以开始玩玩其他的了。顺便,好奇的心情发作…有没有发现,其实这朵花,真的是开了好多瓣呢?一瓣,怕就是一本书吧!

金庸一枝花
金庸:一枝花

好吧,继续过过瘾…既然都这样了,就开始八卦一下这些人物的关系吧!

金庸人物关系网
金庸人物关系网

等等,什么,射雕三部曲居然不在一块儿!这到底是什么个情况!!!

射雕三部曲关系网
射雕三部曲关系网

哎,我的童年彻底毁掉了。什么黄衫姑娘啊,什么郭襄祖师爷啊,原来《倚天屠龙记》跟《神雕侠侣》和《射雕英雄传》根本没那么多血脉相亲…呜呜。

———–废话若干———–
1. 选择金庸的作品只是因为有现成的金庸词库,本来还想弄古龙的呢,结果古龙的没有现成的词库,伤心。
2. 明显的,字数少的作品占劣势,毕竟连接数要少很多呢。
3. “连接关系”的定义和思喆的明朝那些事儿一样,就是在同一个段落中出现。当然,也可以放宽到上下若干段落之内,不过现在已经够复杂的了,再放宽不见得多多少信息量。
4. 可视化部分由Gephi搞定,文本分析部分由R搞定,各取所长嘛。
5. 同义词替换。1.20的上海R沙龙上很多朋友提出来,应该有一些基本的同义词替换,比如“杨过”也可称为“过儿”,小龙女亦作“龙儿”和“姑姑”。这样的替换需要建立一个针对金庸的同义词词典,暂时还没有现成的资源。
6. 同样是沙龙的朋友提出来的,对于关系的定义应该更明确一点,不单单是出现在同一段落。金庸的还好,古龙的文风就更加飘逸,不适合这样定义。然而更细致的定义需要对金庸的文字进行更深入的理解,进行一些语义分析,还有待进一步对于语言理解的深入。

统计词话(一)

不知道这个标题是否有足够的吸引力把你骗进来。如果你认为统计是一个到处充满了期望方差分布回归随机多元和概率的东西,那么……你可能是对的,不过本文想要告诉你的是,你其实还可以用统计来做一些你关心的事情,比如现在,我们既谈风月,也谈统计。:D

相信大家对宋词都不会陌生。无论你是否喜欢,总还是可以吟诵出几句名篇来的。如果你经常找一些宋词来读的话,你可能会发现一个有趣的现象,那就是有些词语或意象似乎特别受到词人的青睐,像是东风,明月,芳草等等。当然,对于这个现象,不同的人有不同的看法。一种观点是这些意象往往具有特定的含义,或是抒发离恨,或是寄托相思,总之是把人们的情感倾注在了这些最常见的事物之中,让人触景生情;而另一种看法则觉得词的雕琢痕迹太明显,内容也相对单调,使得用词容易造成重复。本文当然不是来探讨这些话题的,而是想用统计的方法来给大家展示一下究竟有哪些话语被词人一次一次地书写,被读者一遍一遍地传唱。

从统计的角度来看,上面这个问题其实非常简单,无非就是计算一下宋词之中词语出现的频率,然后做一个排序就可以了。但这个问题对于中文来说恰恰是最难攻克的一个环节。在英语中,词语与词语之间有着天然的分隔符,但对于中文,只有句子之间有标点符号,句子之内只能通过词语的含义来进行辨别。这也就是为什么在文本挖掘领域中,中文的分词依然是一个富有挑战性的任务的原因。

不过好在宋词本身的形式帮了我们很大的忙。首先,宋词的句子一般都非常短,这相当于已经有了一次粗略的词语划分;其次,宋词的用词也很简洁,一个词一般是两个字,偶尔可能有三个字、四个字,超过四个字的词就非常罕见了。于是我们就有一种比较“野蛮”的做法,来对宋词中的用词进行划分。

举个例子来说,《青玉案》中的这句“东风夜放花千树”,如果把所有可能的两个字的组合列出来,就是:

东风  风夜  夜放  放花  花千  千树

如果再把三个字的可能组合列出来,则有:

东风夜  风夜放  夜放花  放花千  花千树

如果不考虑其它的可能,那么总共就有11个词语。当然,这其中会有很多无意义的组合,但是我们可以预想的是,这些无意义的组合将不太可能大规模地重复出现,因此在排序的过程中它们自动地就被排在高频词语之后了。通过这种做法,宋词中的每句话大体都能分成10个左右的词语单位,然后对所有的这些词语单位进行频数统计,就可以得到最终的高频词语列表了。

下面就通过一段R程序来进行一次实际的分析,用到的数据是从网络上整理的《全宋词》电子资料,其中可能有部分字词不正确。完整的程序和数据可以从这里下载

首先,当然是读取数据。

txt=read.csv("SongPoem.csv",colClasses="character");

接下来提取出宋词的内容,并根据标点符号对句子进行分割。

sentences=strsplit(txt$Sentence,",|。|!|?|、");
sentences=unlist(sentences);
sentences=sentences[sentences!=""];

对句子进行分割后需要检查一遍,如果有些句子的长度超过了15个字,那么很可能是错误的字符,应该剔除掉。

s.len=nchar(sentences);
sentences=sentences[s.len<=15];
s.len=nchar(sentences);

下面的这个函数非常重要,其作用就是按照之前的做法把所有可能的字的组合计算出来。这里只是考虑了两个字的组合。

splitwords=function(x,x.len) substring(x,1:(x.len-1),2:x.len);

接下来就好办了,无非就是应用上面的函数对句子进行拆分,然后统计词频并排序。

words=mapply(splitwords,sentences,s.len,SIMPLIFY=TRUE,USE.NAMES=FALSE);
words=unlist(words);
words.freq=table(words);
words.freq=sort(words.freq,decreasing=TRUE);
words.freq[1:100];

最后的结果如下:

排序  词语    频数          排序  词语    频数
1     □□     1584         51    匆匆    357
2     东风    1379         52    芙蓉    356
3     何处    1231         53    今日    354
4     人间    1164         54    扁舟    351
5     风流    843          55    西湖    350
6     归去    818          56    憔瘁    349
7     春风    800          57    消息    347
8     西风    782          58    桃花    343
9     归来    768          59    何事    335
10    江南    760          60    一片    333
11    相思    759          61    神仙    332
12    梅花    725          62    一声    331
13    千里    668          63    黄花    330
14    多少    653          64    心事    330
15    回首    649          65    鸳鸯    328
16    如今    647          66    十分    327
17    明月    646          67    人生    324
18    阑干    632          68    断肠    323
19    年年    605          69    佳人    323
20    万里    587          70    长安    321     
21    一笑    579          71    东君    319     
22    黄昏    561          72    桃李    319     
23    当年    537          73    而今    318     
24    芳草    533          74    为谁    317     
25    天涯    531          75    无情    307     
26    相逢    523          76    去年    306     
27    尊前    519          77    天气    306     
28    一枝    510          78    不是    305     
29    风雨    500          79    海棠    305     
30    流水    481          80    少年    305     
31    风吹    474          81    今夜    304     
32    依旧    469          82    不似    303     
33    多情    458          83    十年    303     
34    风月    452          84    行人    300     
35    当时    451          85    谁知    300     
36    故人    445          86    寂寞    299     
37    斜阳    444          87    肠断    297     
38    无人    443          88    江上    297     
39    不知    426          89    悠悠    297     
40    深处    424          90    富贵    295     
41    不见    416          91    时候    295     
42    时节    407          92    昨夜    295     
43    凄凉    404          93    几度    292     
44    平生    394          94    月明    292     
45    春色    393          95    何时    291     
46    无限    381          96    青山    291     
47    一点    374          97    蓬莱    290     
48    功名    366          98    往事    290     
49    杨柳    363          99    如何    287     
50    天上    361          100   惟有    287

需要解释一下的是,排在第一位的方框是词库中的一些出错的字符,直接略去即可。

至此,真相大白。至于这个结果意味着什么,就留给读者自己细细品读吧。