搜索常见的算法和模型思考
浏览:37 时间:2024-3-23

之所以写这篇文章,是因为前几天系里的成员对系里涉及的一些现有算法进行了一个回顾和整理。但是,更尴尬的是,因为老板不在,大家讨论讨论后就变成了吐槽大会,但是有一半的时间是在吐槽产品和业务部门度过的~ ~

不过,这是一件可喜的事情,也可以算是我们的数据部门,已经从开轻型挖掘机走向深挖。

因此,我想借此机会整理一些我接触过、了解过、做过的,勉强可以称之为算法的事情。其实就我而言,我不是天生做算法的。大学的时候,我对网络的研究比较多,不知道什么是数据挖掘算法。

其实就所谓的算法而言,我个人认为我同事说的还是挺对的:所谓的算法,并不是说那些复杂的数学模型就是算法,即使是你写的简单的计算公式,只要能解决现有业务的痛点,有自己的模型思路,也是算法,只是可能不够通用,不能解决具体的业务需求。

在大规模数据的前提下,其实很多复杂的算法流程并没有那么有效,不然我们会尽量简化流程。

举个简单的栗子:假设有一批大规模数据集,以近千万的博文为例。如果提供一篇博文来查询相似度最高的topN,我们通常的思路是什么?通常的方法是计算这篇博文和其他博文的相似度。计算相似度的方法有很多,最简单的就是计算矢量角,根据矢量角来判断相似度。好吧,就算用最简单的计算过程,计算近千万次需要多长时间?也许有人说,我用hadoop,用分布式计算能力来完成这个任务,但如果你真的去操作,你会发现这是多么痛苦。

另一个简单的栗子(OK,多吃栗子):比如SVM就是一个很难收敛的算法。在大数据的前提下,有人想用,但也想用更多的数据来训练模型。毕竟手里的数据量太大了,很多人还是想用尽可能多的数据来训练模型,从而达到模型更精确的目标。然而,随着训练数据量的增加,SVM等难以收敛的算法的计算资源仍然巨大。

东拉西扯说了这么多,但是他的梳理工作还没有完成!

首先是我这些年开的挖掘机

(1)最早的接触应该是贝叶斯的分类

贝叶斯算法是分类算法中最简单的算法。十有八九,第一个学习挖掘机算法的人会爱上它。其实贝叶斯原理真的很简单,就是基于统计学的最大概率原理。这么简单,尼玛这么好用,还屹立多年。

缺乏培训过程。基本上在贝叶斯也是一样的,因为是文本,所以要进行一套流程,包括分词和停词,这是最基本的知识向量,然后计算模型概率。但有趣的是,分类过程是在Storm中完成的,相当于一个实时分类服务。

(2)对于文本来说,分词算法是不可或缺的

其实说到分词算法,也没什么好说的。现在网上各种开源分词工具都做得很好,效果也差不了多少。如果你想进一步提高,那就很难了。至于深入到分词算法内部,涉及到上下文分析、隐式马尔科夫模型等。如果一个人出于兴趣研究它,那么我无话可说;如果是小公司花人力物力优化分词效果,我只能说他们闲着也有痛苦;如果是大公司,金多任性是可以理解的。

因此,到目前为止,人们对分词算法的演变、内部涉及的算法以及几种分词工具的使用都只有初步的了解。

事实上,在文本挖掘方面,仅仅关注文本的分词是不够的,因为很多分词拆分出来的词往往与业务无关。通常的做法是建立相应的业务字典。至于词典的建立,当然也需要分词,然后进行进一步的处理,甚至可能会增加一些人工。

(3)下一步是实时热点分析

我不知道这是不是算法,但说到实时,自然又和Storm有关系(嗯,我承认我做了这个之后就开始摸数据了)。说到实时热点,大家可能都很困惑。举个简单的栗子。

玩hadoop的童鞋都知道经典的栗子字数。在从映射到缩减的过程中,映射缩减通过类似散列的方法自动将相同的键聚合在一起。所以,通过MR数词,既辣又简单。

Storm的实时字数怎么样?嗯,这也是一个可以记录在实时技术历史书上的经典案例(嗯,其实是一个《风暴的地狱世界》)。虽然Storm没有MR那样的自动Hash功能,但也提供了数据包流策略,可以达到类似的效果。另外,它不像MR那样是批量的,它是实时的、流式的,这意味着你可以动态地获得当前改变的词频。

实时热点分析,如果把热点映射成文字,能实时得到当前TopN的热点吗?这个方向很有研究价值。如果我们实时掌握用户的热点取向,就可以动态调整业务策略,从而获得更大的数据价值。

但总体来说,这种数据模型更多的是依赖于实时工具Storm的功能,而模型设计方面的东西很少。至于是否是算法模型,如前所述,