您的位置:首页 > 其它

热词

2016-01-11 16:48 190 查看
热词即当下流行的词汇,网络热词就是在网络上使用频率很高的词语或热炒受狂热追捧的网络现象

怎么才能判断热词呢?以搜索为例,点击类似。所有变换和简化须不影响排序结果。

排位变化

排位变化最初的算法参考电影排行榜,统计昨日Top词、前日Top词,然后计算每个词w两天的排位差,排位变化最大的就是最热的词。

排序取出取出排位前 N 的词语集合。

WZ为昨日搜索词TopN集合,WQ为前日搜索词TopN集合。 

SortBySearchCount(WZ, Desc)

SortBySearchCount(WQ, Desc)

for each(w in WZ){

    if(w in WQ)

        PositionChange = Position( w,昨日) - Position( w,前日 )

    else

        PositionChange = Position( w,昨日) - ( N + 1 )

}

SortByPositionChange( WZ)

此算法比较笨,必需做三次排序,但是挑选出的词语效果还是比较好的。

注意,根据上述方法,词条这两天的排位差PositionChange 越小,表示其越火。[b]PositionChange 可以为负值。[/b]

举例:对于在集合WZ中的词条w,给出几种情况:

(1)假设词条w这两天比较火,即分别出现在昨天和前天的词条集合WZ和WQ中了,则

假设昨天拍在第3位,前天排在第5位,则该词条上升了两位。此时PositionChange = -2.

假设昨天拍在第5位,前天排在第3位,则该词条下降了两位。此时PositionChange = 2.

(2)假设词条w只在昨天的集合WZ中,但是不在前天的集合WQ中,则

假设昨天拍在第3位,又因为N = 100,则98位。此时PositionChange = -98.


又因为PositionChange 越小(-98<-2<2),表示其越火,根据排序,可以得到第三情况的词条最火。此时也符合实际情况。




变化率

算法很简单:今日次数/昨日次数,按照变化率排序即可。

WZ为昨日搜索词全集,WQ为前日搜索词全集。

CZ为昨日搜索总次数,CQ为前日搜索总次数。

Cz某词w昨日的次数,Cq某词w前日的次数 

for each(w in WZ){

    if(w not in WQ) {

        Cq = 0

    }

    ChangeRate = (Cz+1)/(Cq+1) - 1

 }

SortByChangeRate(WZ, Desc)

算法很简单,但是哪些前日访问很少的词语,就很占便宜了。


加权变化率

加权变化率是对于算法2的修正,考虑搜索量因素,将搜索量较小的词语加权小,而对于搜索量大的词语加权大,平衡一下访问量因素。此处的权值取两天内此词总共的搜索次数在全部搜索次数中的比例。

WZ为昨日搜索词全集,WQ为前日搜索词全集。

CZ为昨日搜索总次数,CQ为前日搜索总次数。

Cz某词w昨日的次数,Cq某词w前日的次数

 

for each(w in WZ){

    if(w not in WQ) {

        Cq = 0

    }

    ChangeRate = (Cz+1) / (Cq+1) - 1

    Weight = (Cz+Cq) / (CZ+CQ)

    RateWithWeight = ChangeRate * Weight

}

SortByRateWithWeight (WZ, Desc)

因为我们只考虑排序,所以可以对词算法进一步简化

RateWithWeight = ChangeRate * Weight

= ( (Cz+1) / (Cq+1) - 1 ) * (Cz+Cq) / (CZ+CQ)= (Cz-Cq) * (Cz+Cq) / (Cq+1) / (CZ+CQ) 

因为CZ、CQ对于两天内的所有值都是一样的,所以可以不计算,不影响最后的排序结果。

可以取简化后的

RateWithWeight = (Cz-Cq) * (Cz+Cq) / (Cq+1)


总结


方法一:排位差

算法思想:根据词语每天出现次数求出其排在老几,之后计算两天的排位差,根据排位差求热度。

具体步骤:

(1)统计每一个词在昨天和前天出现的次数,并找出排位前 N 的词语集合

(2)对每一个词,计算每个词w两天的排位差

(3)根据词语的排位差进行排序,其中排位变化最大的就是最热的词。

评价:此算法比较笨,必需做三次排序,但是挑选出的词语效果还是比较好的。


方法二:变化率

算法思想:根据词语两天的出现次数求出其出现次数的比值,根据比值求出其热度。

具体步骤:

(1)统计每一个词在昨天和前天出现的次数,并找出排位前 N 的词语集合

(2)对每一个词,计算每个词w两天的变化率,即今日次数/昨日次数。

(3)根据词语的变化率进行排序,其中变化率最大的就是最热的词。

评价:算法简单,但是对于访问次数少但变化率大的词语会占便宜。


方法三:加权变化率

算法思想:根据词语两天的出现次数其在总搜索次数的站的份额求出比值,根据比值求出其热度。

具体步骤:

(1)统计每一个词在昨天和前天出现的次数,并找出排位前 N 的词语集合

(2)对每一个词,计算每个词w两天的加权变化率,即(今日次数/昨日次数)* 该词这两天的总搜索次数在全部搜索次数中的比例。

(3)根据词语的加权变化率进行排序,其中加权变化率最大的就是最热的词。

评价:算法简单,弥补了变化率的缺点。

注意:求热词时,单纯比较每天词条的出现次数是不行的,重要的是比较多天之间的出现次数。



下面看个例子:某网站的用户状态数据,首先用每一天状态里的词去和前一天的状态作对比,提取出这一天里特有的词,这样一来,我们就能得到用户状态中提取出的每日热点了!从手里的数据规模看,这是完全有可能的。首先选
12 个比较具有代表性的词,并列出了它们在 x 年 x 月 1 日的用户状态中出现的频数(左列的数),以及 x 年 x 月 2 日的用户状态中出现的频数(右列的数):

下雪3392
那些年139146
李宇春14
看见145695
魔兽2320
高数8283
生日快乐235210
今天14161562
北半球218
脖子2369
悲伤6133
电磁炉03
    大家可以从直觉上迅速判断出,哪些词可以算作是 2 日的热词。比方说,“下雪”一词在 1日只出现了 33 次,在 2日却出现了 92 次,后者是前者的 2.8 倍,这不大可能是巧合,初步判断一定是 2 日真的有什么地方下雪了。“那些年”在 2 日的频数确实比 1 日更多,但相差并不大,我们没有理由认为它是当日的一个热词。

    一个问题摆在了我们面前:我们如何去量化一个词的“当日热度”?第一想法当然是简单地看一看每个词的当日频数和昨日频数之间的倍数关系,不过细想一下你就发现问题了:它不能解决样本过少带来的偶然性。 2 日“李宇春”一词的出现频数是 1日的 4 倍,这超过了“下雪”一词的 2.8 倍,但我们却更愿意相信“李宇春”的现象只是一个偶然。更麻烦的则是“电磁炉”一行, 2 日的频数是 1 日的无穷多倍,但显然我们也不能因此就认为“电磁炉”是
2 日最热的词。

    忽略所有样本过少的词?这似乎也不太好,样本少的词也有可能真的是热词。比如“北半球”一词,虽然它在两天里的频数都很少,但这个 9 倍的关系确实不容忽视。事实上,人眼很容易看出哪些词真的是 2 日的热词:除了“下雪”以外,“看见”、“北半球”和“脖子”也应该是热词。你或许坚信后三个词异峰突起的背后一定有什么原因(并且迫切地想知道这个原因究竟是什么),但却会果断地把“李宇春”和“电磁炉”这两个“异常”归结为偶然原因。你的直觉是对的——
2 日发生了极其壮观的双子座流星雨,此乃北半球三大流星雨之一。白天网友们不断转发新闻,因而“北半球”一词热了起来;晚上网友们不断发消息说“看见了”、“又看见了”,“看见”一词的出现频数猛增;最后呢,仰望天空一晚上,脖子终于出毛病了,于是回家路上一个劲儿地发“脖子难受”。

    让计算机也能聪明地排除偶然因素,这是我们在数据挖掘过程中经常遇到的问题。我们经常需要对样本过少的项目进行“平滑”操作,以避免分母过小带来的奇点。这里,我采用的是一个非常容易理解的方法:一个词的样本太少,就给这个词的热度打折扣。为了便于说明,我们选出四个词为例来分析。

    下表截取了前四个词,右边四列分别表示各词在 1 日出现的频数,在 2 日出现的频数,在两天里一共出现的总频数,以及后一天的频数所占的比重。第三列数字是前两列数字之和,第四列数字则是第二列数字除以第三列数字的结果。最后一列应该是一个 0 到 1 之间的数,它表明对应的词有多大概率出现在了 2 日这一天。最后一列可以看作是各词的得分。可以看到,此时“下雪”的得分低于“李宇春”,这是我们不希望看到的结果。“李宇春”的样本太少,我们想以此为缘由把它的得分拖下去。

下雪33921250.736
那些年1391462850.512
李宇春1450.8
看见1456958400.827
(平均)313.750.719
    怎么做呢?我们把每个词的得分都和全局平均分取一个加权平均!首先计算出这四个词的平均总频数,为 313.75 ;再计算出这四个词的平均得分,为 0.719 。接下来,我们假设已经有 313.75 个人预先给每个词都打了 0.719 分,换句话说每个词都已经收到了 313.75 次评分,并且所有这 313.75 个评分都是 0.719 分。“下雪”这个词则还有额外的 125 个人评分,其中每个人都给了 0.736
分。因此,“下雪”一词的最终得分就是:

下雪(0.736 × 125 + 0.719 × 313.75) / (125 + 313.75) ≈ 0.724
    类似地,其他几个词的得分依次为:

那些年(0.512 × 285 + 0.719 × 313.75) / (285 + 313.75) ≈ 0.62
李宇春(0.8 × 5 + 0.719 × 313.75) / (5 + 313.75) ≈ 0.7202
看见(0.827 × 840 + 0.719 × 313.75) / (840 + 313.75) ≈ 0.798
    容易看出,此时样本越大的词,就越有能力把最终得分拉向自己本来的得分,样本太小的词,最终得分将会与全局平均分非常接近。经过这么一番调整,“下雪”一词的得分便高于了“李宇春”。实际运用中, 313.75 这个数也可以由你自己来定,定得越高就表明你越在意样本过少带来的负面影响。这种与全局平均取加权平均的思想叫做 Bayesian average ,从上面的若干式子里很容易看出,它实际上是最常见的平滑处理方法之一——分子分母都加上一个常数——的一种特殊形式。

    利用之前的抽词程序抽取出某网每一天内用户状态所含的词,把它们的频数都与前一天的作对比,再利用刚才的方法加以平滑,便能得出每一天的热词了。我手上的数据是某网 x 月上半月的数据,因此我可以得出从 x 月 某段时间的热词(选取每日前 5 名,按得分从高到低)。

date1: 第一场雪、北京、金隅、周末、新疆
date2: 荷兰、葡萄牙、死亡之组、欧洲杯、德国
date3: 那些年、宣传、期末、男朋友、升旗
date4: 教室、老师、视帝、体育课、质量
date5: 乔尔、星期二、摄影、经济、音乐
date6: 陈超、星巴克、优秀、童鞋、投票
date7: 曼联、曼城、欧联杯、皇马、冻死
date8: 保罗、月全食、交易、火箭、黄蜂
date9: 变身、罗伊、穿越、皇马、巴萨
date10: 皇马、巴萨、卡卡、梅西、下半场
date11: 淘宝、阿内尔卡、双十二、申花、老师
date12: 南京、南京大屠杀、勿忘国耻、默哀、警报
date13: 流星雨、许愿、愿望、情人节、几颗
date14: 快船、保罗、巴萨、昨晚、龙门飞甲

    看来, date13 日果然有流星雨发生。

    注意,由于我们仅仅对比了相邻两天的状态,因而产生了个别实际上是由工作日/休息日的区别造成的“热词”,比如“教室”、“老师”、“星期二”等。把这样的词当作热词可能并不太妥。结合上周同日的数据,或者干脆直接与之前整个一周的数据来对比,或许可以部分地解决这一问题。

    事实上,有了上述工具,我们可以任意比较两段不同文本中的用词特点。更有趣的是,某网状态的大多数发布者都填写了性别和年龄的个人信息,我们为何不把状态重新分成男性和女性两组,或者 80 后和 90 后两组,挖掘出不同属性的人都爱说什么?要知道,在过去,这样的问题需要进行大规模语言统计调查才能回答!然而,在互联网海量用户生成内容的支持下,我们可以轻而易举地挖掘出答案来。

    我真的做了这个工作(基于另一段日期内的数据)。男性爱说的词有:

兄弟、篮球、男篮、米兰、曼联、足球、蛋疼、皇马、比赛、国足、超级杯、球迷、中国、老婆、政府、航母、踢球、赛季、股市、砸蛋、牛逼、铁道部、媳妇、国际、美国、连败、魔兽、斯内德、红十字、经济、腐败、程序、郭美美、英雄、民主、鸟巢、米兰德比、官员、内涵、历史、训练、评级、金融、体育、记者、事故、程序员、媒体、投资、事件、社会、项目、伊布、主义、决赛、操蛋、纳尼、领导、喝酒、民族、新闻、言论、和谐、农民、体制、城管⋯⋯

    下面则是女性爱说的词:

一起玩、蛋糕、加好友、老公、呜呜、姐姐、嘻嘻、老虎、讨厌、妈妈、呜呜呜、啦啦啦、便宜、减肥、男朋友、老娘、逛街、无限、帅哥、礼物、互相、奶茶、委屈、各种、高跟鞋、指甲、城市猎人、闺蜜、巧克力、第二、爸爸、宠物、箱子、吼吼、大黄蜂、狮子、胃疼、玫瑰、包包、裙子、游戏、遇见、嘿嘿、灰常、眼睛、各位、妈咪、化妆、玫瑰花、蓝精灵、幸福、陪我玩、任务、怨念、舍不得、害怕、狗狗、眼泪、温暖、面膜、收藏、李民浩、神经、土豆、零食、痘痘、戒指、巨蟹、晒黑⋯⋯

    下面是 90 后用户爱用的词:

加好友、作业、各种、乖乖、蛋糕、来访、卧槽、通知书、麻将、聚会、补课、欢乐、刷屏、录取、无限、互相、速度、一起玩、啦啦啦、晚安、求陪同、基友、美女、矮油、巨蟹、五月天、第二、唱歌、老虎、扣扣、啧啧、帅哥、哈哈哈、尼玛、便宜、苦逼、斯内普、写作业、劳资、孩纸、哎哟、炎亚纶、箱子、无聊、求来访、查分、上课、果断、处女、首映、屏蔽、混蛋、暑假、吓死、新东方、组队、下学期、陪我玩、打雷、妹纸、水瓶、射手、搞基、吐槽、同学聚会、出去玩、呜呜、白羊、表白、做作业、签名、姐姐、停机、伏地魔、对象、哈哈、主页、情侣、无压力、共同、摩羯、碎觉、肿么办⋯⋯

    下面则是 80 后用户爱用的词:

加班、培训、周末、工作、公司、各位、值班、砸蛋、上班、任务、公务员、工资、领导、包包、办公室、校内、郭美美、时尚、企业、股市、新号码、英国、常联系、实验室、论文、忙碌、项目、部门、祈福、邀请、招聘、顺利、朋友、红十字、男朋友、媒体、产品、标准、号码、存钱、牛仔裤、曼联、政府、简单、立秋、事故、伯明翰、博士、辞职、健康、销售、深圳、奶茶、搬家、实验、投资、节日快乐、坚持、规则、考验、生活、体制、客户、发工资、忽悠、提供、教育、处理、惠存、沟通、团购、缺乏、腐败、启程、红十字会、结婚、管理、环境、暴跌、服务、变形金刚、祝福、银行⋯⋯

    不仅如此,不少状态还带有地理位置信息,因而我们可以站在空间的维度对信息进行观察。这个地方的人都爱说些什么?爱说这个词的人都分布在哪里?借助这些包含地理位置的签到信息,我们也能挖掘出很多有意思的结果来。例如,对北京用户的签到信息进行抽词,然后对于每一个抽出来的词,筛选出所有包含该词的签到信息并按地理坐标的位置聚类,这样我们便能找出那些地理分布最集中的词。结果非常有趣:“考试”一词集中分布在海淀众高校区,“天津”一词集中出现在北京南站,“逛街”一词则全都在西单附近扎堆。北京首都国际机场也是一个非常特别的地点,“北京”、“登机”、“终于”、“再见”等词在这里出现的密度极高。

    从全国范围来看,不同区域的人也有明显的用词区别。我们可以将全国地图划分成网格,统计出所有签到信息在各个小格内出现的频数,作为标准分布;然后对于每一个抽出来的词,统计出包含该词的签到信息在各个小格内出现的频数,并与标准分布进行对比(可以采用余弦距离等公式),从而找出那些分布最反常的词。程序运行后发现,这样的词还真不少。一些明显具有南北差异的词,分布就会与整个背景相差甚远。例如,在节假日的时候,“滑雪”一词主要在北方出现,“登山”一词则主要在南方出现。地方特色也是造成词语分布差异的一大原因,例如“三里屯”一词几乎只在北京出现,“热干面”一词集中出现在武汉地区,“地铁”一词明显只有个别城市有所涉及。这种由当地人的用词特征反映出来的真实的地方特色,很可能是许多旅游爱好者梦寐以求的信息。另外,方言也会导致用词分布差异,例如“咋这么”主要分布在北方地区,“搞不懂”主要分布在南方城市,“伐”则非常集中地出现在上海地区。当数据规模足够大时,或许我们能通过计算的方法,自动对中国的方言区进行划分。

    其实,不仅仅是发布时间、用户年龄、用户性别、地理位置这四个维度,我们还可以对浏览器、用户职业、用户活跃度、用户行为偏好等各种各样的维度进行分析,甚至可以综合考虑以上维度,在某个特定范围内挖掘热点事件,或者根据语言习惯去寻找出某个特定的人群。或许这听上去太过理想化,不过我坚信,有了合适的算法,这些想法终究会被一一实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  热词