javascript 数据绑定适合数据挖掘吗?

数据挖掘入门教程PDF - 下载频道
- CSDN.NET
&&&&数据挖掘入门教程PDF
数据挖掘入门教程PDF
数据挖掘 数据仓库 入门 PDF 教程
适合入门级用户了解数据挖掘,不错的PDF清晰版教程
嵌到我的页面
<input type="text" readonly="true" value="">
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
课程资源下载排行TalkingData CEO崔晓波深度专访:真正懂大数据的公司不说大数据
发表于 17:54|
作者陈馨影
摘要:去年年底刚拿到北极光1000万美元投资。本文是对TalkingData创始人兼CEO崔晓波的深度专访,内容涵盖他的创业经历、融资过程及对数据的思考。
“友盟被阿里收购了,如果有巨头考虑收购TalkingData,你会同意吗?”“你可以把如果两个字去掉,因为你能想到的巨头都找我们谈过了,但是数据分析这个行业,如果壁垒垒得够高,后来者很难超越,我们一开始就决定继续往上做。”崔晓波如是说。崔晓波是TalkingData创始人兼CEO,公司去年年底刚从北极光创投获得了1000万美元的投资。下面是对崔晓波(如下简称崔)的专访全文:图:崔晓波病毒少年的大学生涯CSDN:可否说说您自己曾经的计算机经历?崔:我1993年到1997年都在南开大学信管专业。1993年那会儿,计算机还处于286、386、586的时代,大家都喜欢研究操作系统,包括当时的OS2、DOS系统,而与操作系统结合紧密的就是病毒,所以那时候也一直在研究病毒,比如第一代大麻病毒、小球病毒、变性病毒等。大一的时候就开始研究学校机房的管理员如何保护计算机,喜欢写一些病毒植入学校机房,某天他们发现有人进入了内部系统,还会留下“CXB”几个字,于是开始调查,最后发现是大一一个叫崔晓波的新生,他在这方面有特殊爱好,于是找到我加入管理团队。也就是在那个时候开始研究加解密,认识了王江民、求伯君、吴晓军。当时大家基本上都在做汉字系统、操作系统,跟他们在算法上交流比较多。自己还发现了操作系统中的一些漏洞。比如微软的系统里面的一些逻辑问题,可能导致系统产生死循环,有次有台机器坏了怎么也无法修补,永远死在Starting MS Dos那个地方,很多老师学生都怀疑是硬件出问题了,但我觉得是系统逻辑上有问题,所以自己又把微软操作系统源码返回去看了一遍,发现系统读硬盘分区表可能会产生死循环,因为是链表结构,如果分区表坏了,循环图过不去就成了死循环,我为了验证猜想就做了一个病毒程序植入系统,把分区表拿出来来看看,发现果然是链表损坏。后来江民做了一个逻辑锁,破KV300,或者KV3000应用的时候,如果发现你是盗版,它就会给你加个逻辑锁,把你的机器锁住,实际上就是用了这个原理。因为当时跟江民交流比较多,东西大家共享也无所谓。身心俱疲后曾欲重返甲骨文CSDN:您是从甲骨文出来的,在毕业后到去甲骨文的这段时间里,您都在忙什么?崔:毕业之后直接去了晓军电脑,后来他正好也在北京的一个国企里面,因为大家比较熟悉,再加上自己当时觉得国企可以解决户口和住房,所以也跟着过去了。在那里待了两年多,到了1999年就出来做网站,当时做了几个网站,比如中国彩票网、51CP、融资网、棉花系统的交易系统。大概到2001年,互联网泡沫破灭,2002年1月进入BEA。大的外企他们的销售流程比较成体系,研发也有专业的流程,所以想进去感受一下。 刚开始做售前,负责对大客户的沟通,包括移动电信银联的沟通,中间几年开始做解决方案,比如高铁客票,电信3G支撑系统,最后被调到研发,所以是从前做到后。在那里待了8年,第七年的时候BEA被Oracle用85亿美金收购,接着进入甲骨文的ANC部门,支撑大的合作伙伴,比如华为、普华永道、东软,做技术总监做了一年多出来。从甲骨文出来之后去了一家创业公司上班,那是一家做邮件推送的公司,产品形态类似于黑莓,但因为方向和当时的创始人看法不一样所以就出来了。2010离开那家公司,中间歇了半年,因为当时在创业公司加班很厉害,一周睡不了几个晚上,邮件服务是个强运营的服务,尤其是做邮件推送,版本迭代升级,大部分都在晚上做,长期疲劳休息不好,有一段时间都差点重返甲骨文,当时都拿了甲骨文offer,但从甲骨文出来的同事说都出来了就别回去了,再加上休息了一段时间以后,心态身体都恢复差不多了,觉得能再折腾一段时间,所以就想再试试。TalkingData的变迁:社交挖掘——推荐——数据分析CSDN:TalkingData最开始是做什么的?崔:从2011年6月开始筹划TalkingData,最开始想做社交网络数据挖掘工具,跟新浪微博也有过合作,包括情感分析、娱情分析等等,后来TalkingData跟新浪运营团队交流少,他们心气也比较高,认为微数据很多水平的方向他们可以自己搞定,给创业团队应该做一些垂直服务,比如礼品、招聘、旅游,但我觉得那个市场太小,所以很快就放弃了那个方向,虽然拿到社交数据的成本低,但大的环境不好,所以就决定做回移动。CSDN:怎么就进入了数据分析这个行业?崔:因为自己接触分布式系统和数据挖掘比较多,在上一家创业公司里也看清楚了趋势,移动互联网肯定是个方向;大数据肯定是个方向,但单纯做工具的意义不大。所以后来开始给应用商店做服务,比如91、机锋、因为它们本身对分布式的理解和投入的资源不够,所以就帮他们做排名和推荐算法,包括一些基于机器学习的推送。比如和机锋合作的云推送,都是基于算法做的,效果还不错,花了四个月的时间把机锋的应用推荐转换率最多提高了10倍,后来同步推也使用我们的推荐引擎,但那时候做得有点早,很多应用商店和应用也都刚起步,没有自己的盈利模式,作为技术提供方,就更没有盈利模式。所以当时很多朋友建议往更多基础的方向去做,比如做数据的统计分析,因为当时移动开发者的需求也就只到这个程度,我也觉得这个方向还不错,于是开始在2011年研发移动统计分析平台。第一个版本从2012年4月正式上线,到目前为止覆盖独立智能设备4.5亿,覆盖2万多款应用,是现在算最大的第三方移动数据服务平台,因为友盟被收购了,Flurry还没有真正进入国内。免费只适合2C,不适合2BCSDN:TalkingData现在的商业模式是什么?崔:在数据分析上经历了三个阶段。最开始是做通用的分析工具,比如留存率分析、活跃度分析,类似于国外的Flurry,那时候Flurry如日中天,MixPanel刚转型到移动,Apsalar也刚刚出来,国外做类似产品的大概有20多款商品,但只有Flurry是免费的,包括国内的友盟也是走这样的路子——免费+广告的模式,但当时我们没太想明白这种模式,所以也没做,加上当时定位就是纯数据相关的服务,没有想过要进入一个特定的业务,所以就没有走F2P路线。其实大家都以为免费好,可能对于普通用户来讲,免费是好,但是对于企业用户,如果你免费了,人家会怀疑你的实力、动机,以及生命力,反倒起反作用。我们的垂直服务,包括游戏、电商、金融等服务全是收费的,其实企业的核心诉求还是服务质量和安全性,比如跟平安、招行的合作,如果免费,人家会认为你一家创业公司能撑多久?一些游戏的开发者很多都很有钱,宝开、触控、乐逗不在乎你的钱,如果你免费,人家会怀疑你是要用我的数据吗?所以免费逻辑在这时候并不成立。数据对很多开发商的意义不同,在电商那里可能是第一敏感,到游戏哪里,可能就不是了,比如移动游戏,很多生命周期都比较短,可能只有一两年,他们在意的是怎么在有限的时间里利用好数据,从而带来更多利益,而不是免费。很多人建议,你现在有移动游戏的几乎所有数据,不仅是活跃度、安装量、还有收入,你们应该做发行平台,很快你们就能成为大的游戏分发商;有的人也建议,你们是最大的移动广告监测平台,差不多有80%的开发商有合作,包括Inmobi,既然有这么多的广告监测数据,就应该做DSP平台,很快就能变大;也有人说,你有那么多的金融客户,就应该做互联网金融。反正有很多人告诉你很多可能性。但从创业开始就想的比较清楚,不会做任何具体业务,只提供数据服务,这份工作本身是个慢活,但需要中立性,一旦进入一个业务,你可能就失去了中立性,所以TalkingData只做数据挖掘、分析。另一方面,如果把移动互联网看成一个数据源,有开发者愿意提供数据,有大客户愿意花钱交换这些数据,TalkingData则提供数据交易平台,这在国外有很多例子。你见过Google或亚马逊说大数据吗?CSDN:你们做数据分析的怎么看待大数据?大家都在说,但其实大家都不懂。崔:第一点,大数据也不是一个新鲜概念,只是大家把许久未解决的问题解决了,然后用新的概念包装了一次。真正做大数据的公司都不谈大数据,比如Google、亚马逊,它们对大数据采集分析处理的能力远远超过同类公司。第二点,在存储领域,摩尔定律已经失效了,存储成本的上升高于摩尔定律。以前大家处理数据都是这样的,只要有数据就存下来,以后再去想怎么分析处理,怎么用于商业,但现在这种方式已经失效了,因为现在存储和处理数据的成本已经远远高于业务能带来的边际收益。大数据给大家带来的第一个问题是数据变现问题,否则业务可能都支撑不住。第三点,现在很多人都在提3V、4V,但我就关注一个V,Value,就是数据真正的价值在哪里?TalkingData从创立以来一直特别注意这点,为什么通用的服务很快就不再推了,因为那些数据没有用,通用的数据,实际上是比较不规则的、无效的、没有价值的,对你来说就意味着成本。当时我们收集了很多数据,试图建立一些模型给伙伴提高转化率,但发现这个信息太弱了。去年和Flurry几个创始人聊过这个问题,他们成本很高,每年会花3100万美金在统计手机上,但并不带来收益,这点他们自己也表示后悔。CSDN:你觉得针对移动互联网,数据分为哪几类?TalkingData主攻哪一类?崔:如果纯针对移动互联网,那么数据类型有三大类:第一个类是基础信息,比如设备信息。用了什么设备?芯片是什么?用了什么运营商的服务?这些信息有用吗?有用,因为很多设备商运营商会购买报告,但是我们没有走这条路,因为在中国卖数据报告是不可行的,至少没有成功的先例,而且容易走偏。第二种类型的数据就是与应用相关的数据,包括客户用了哪些应用?程度有多深?因为和很多应用商店合作,所以我们会交换到很多这种数据,这些数据很有价值,很多投行也会来问我们,那些上市公司应用情况到底是什么样的?在Android的排名到底是不是真的?其实我们都有,但是不会说,说的意义不大,在这样的复杂的环境里面,没必要说。第三种是客户行为数据,反应客户的消费倾向性、交易行为、喜好、位置信息,这些数据蕴含巨大价值,但这些数据价值的挖掘需要找到一种可行的方式,所以现在我们在金融领域大量尝试这种方法。金融实际是数据的大客户,现在所有银行都想推出一些基于风控系统的新型信息系统。CSDN:移动应用的发展,你们应该看得很清楚,能否与开发者分享一下?崔:移动应用发展很快,去年前年就是工具、游戏,到2013年,各种应用已开始与人的生活息息相关。从使用设备的情况来看,人现在使用移动设备时长一般在8个小时左右。从互联网人群渗透率来看,去年活跃的是3.2亿,其中有3亿是游戏人群,每年还在以很高的量增长。CSDN:TalkingData未来是否也会对可穿戴或者物联网的数据进行分析?崔:移动是多维度的,有了传感器、陀螺仪、气压计,数据类型也更丰富,所以现在也做一些客厅、汽车、可穿戴比如健康类数据的研究,客厅市场比想象的来得还快,现在有客户会提需求,比如判断他精准投放广告时,人是否处在家庭里面。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章后使用快捷导航没有帐号?
查看: 1600|回复: 13
分享一下网页数据抓取工具Gooseeker。
高级会员, 积分 690, 距离下一级还需 310 积分
论坛徽章:9
本人在学习gooseeker来解决网页数据抓取,所以跟大家分享一下。但是目前gooseeker抓数的工具使用存在问题。下面是介绍:网页抓取/信息提取/数据抽取软件工具包MetaSeeker V4.11.11正式发布,在线版,源代码可阅读。Firefox 26.x 的配套版本已经发布,如果使用中遇到问题请。自推出以来,深受喜爱,主要应用领域:垂直搜索(Vertical Search):也称为专业搜索,高速、海量和精确抓取是定题网络爬虫DataScraper的强项,每天24小时每周7天无人值守自主调度的周期性批量采集,加上断点续传和软件看门狗(Watch Dog),确保您高枕无忧移动互联网:手机搜索、手机混搭(mashup)、移动社交网络、移动电子商务都离不开结构化的数据内容,DataScraper实时高效地采集内容,输出富含语义元数据的XML格式的抓取结果文件,确保自动化的数据集成和加工,跨越小尺寸屏幕展现和高精准信息检索的障碍。手机互联网不是Web的子集而是全部,由MetaSeeker架设桥梁企业竞争情报采集/数据挖掘:俗称商业智能(Business Intelligence),噪音信息滤除、结构化转换,确保数据的准确性和时效性,独有的广域分布式架构,赋予DataScraper无与伦比的情报采集渗透能力,AJAX/Javascript动态页面、服务器动态网页、静态页面、各种鉴权认证机制,一视同仁。在微博网站数据采集和舆情监测领域远远领先其它产品。
/cn/node/document/front 这是连接。
网页的教程比较详细,但是由于网络变化很快,我学习过程中也是存在一定的问题。可能对于有一定it技术的同学来讲更容易上手。
金牌会员, 积分 2506, 距离下一级还需 494 积分
论坛徽章:3
有否试验过火车头采集器?我抓网页数据一直都在用这个。火车头还支持采集网页上面的图片和附件(例如PDF文件),不知道gooseeker是不是更强大?
高级会员, 积分 690, 距离下一级还需 310 积分
论坛徽章:9
yang.y.xu 发表于
有否试验过火车头采集器?我抓网页数据一直都在用这个。火车头还支持采集网页上面的图片和附件(例如PDF文件 ...
火车头我一直用不起来 您有好的学习资源吗?
金牌会员, 积分 2506, 距离下一级还需 494 积分
论坛徽章:3
那边有个培训视频,我也是看那个视频学习的。。。。火车头有局限性,但是上手还是很快的。
高级会员, 积分 690, 距离下一级还需 310 积分
论坛徽章:9
yang.y.xu 发表于
那边有个培训视频,我也是看那个视频学习的。。。。火车头有局限性,但是上手还是很快的。
您能分享一下吗?感激不尽啊!
注册会员, 积分 132, 距离下一级还需 68 积分
论坛徽章:1
不错,值得一学。
中级会员, 积分 330, 距离下一级还需 170 积分
论坛徽章:8
这个给力呀 没有数据怎么分析 挖掘数据才是重点呀
金牌会员, 积分 1938, 距离下一级还需 1062 积分
论坛徽章:6
只记得当时使用python写的& &解析网页啥的有点麻烦
金牌会员, 积分 2506, 距离下一级还需 494 积分
论坛徽章:3
datalausuai 发表于
您能分享一下吗?感激不尽啊!
视频在这里,可以免费下载的。
高级会员, 积分 667, 距离下一级还需 333 积分
论坛徽章:4
这个软件没有用过,要看看& Category &
先简单介绍下Dump Plugin的由来,在搜索Dump中心服务化的项目中,我们把Dump中心的增量数据产出分为2个阶段,Loader阶段和Join阶段,Loader阶段把数据准备成Key-Values形式,Join阶段将数据取出,计算各种业务逻辑并产出最终数据。业务逻辑的计算是相当繁琐且易出错,这类事情做一遍足以,所以设计了一个接口,按照业务自身划分成一个个小块逻辑实现接口。这些个小业务逻辑模块即构成Dump的业务Plugin。
这样做的好处:
按业务本身划分,结构相对清晰,容易维护。
架构和业务通过接口交互,重构架构将尽可能少的影响业务代码
每个业务模块的耗时能准确统计出并能做针对性的优化。
在最初的版本中,先根据依赖关系计算好plugin的执行顺序,然后顺序执行,是一个串行的过程,如下图:
此种方式,计算耗时与业务的复杂程度成正比。而目前Dump中心已经有十几个个业务逻辑Plugin,并且plugin之间有复杂的依赖关系。所以我们尝试用更高效的并发方式去运行这些plugin。这个项目用的开发语言是Java,Java的多线程有多种成熟的设计模式,结合现有框架,我们设计了两种方案并分别尝试。
方案1,以单条数据为粒度,在一条数据的运行内部实现并行化,如下图:
简单的来说,就是起一个工作线程组来运行plugin,来一条数据后,工作线程根据依赖关系获取当前可运行的plugin,当所有plugin都运行完毕后,输出数据。类似于Work Thread模式,工作线程没数据就等着,来了数据就做。主要代码流程如下:
代码中使用两个Semaphore信号量来同步主线程和工作线程,每条数据都需要激活和同步,并有一个synchronized的方法来获取当前可运行的Plugin,线程同步开销比较大。实现过程中,采用重任务优先,预先计算等方法,降低并行额外引入的开销。在单个Plugin耗时长,关键路径和非关键路径上的plugin耗时相差不大的情况下,此种方案效果不错。但在目前的业务情况下,效果提升不明显,实测约提升了10%。
通过分析plugin的依赖关系,发现目前业务逻辑下,有两个耗时大的plugin均是关键路径上的,方案1的并行是针对单个宝贝的,我们想能否在批量数据或数据流中实现数据维度的并行。数据维度的并行,最简单的方案是将数据逐条扔给ThreadPoolExecutor,每个线程串行执行,但这种方案对于现有结构来说不合适,原因是plugin的代码无法保证线程安全,于是就有了方案2,如下图:
每个Plugin都起一个工作线程,数据像流水线一样从Plugin中间流过,plugin的依赖关系决定数据的流向,类似于Guarded Suspension模式,工作线程维护一个Queue来缓存,等plugin准备好,就从Queue中取数据处理。主要代码流程如下:
代码中同步操作通过BlockingQueue来实现。主线程将数据分发给第一个plugin线程,而最后一个plugin线程负责将数据写回给主线程。主线程用一条特殊的数据来标识这组数据的结尾,而后在主线程队列里一直扫描特殊数据,FIFO队列保证了处理的时序。逻辑上来说,方案2的单条数据的处理还是串行,而是多条数据之间的并行,整体性能只取决于最慢的Plugin的耗时,实测中对于批量数据来说,效果要好于方案1。
总结:实践Dump Plugin并行的两种实现方式,对单数据的列并行和对批量数据/数据流的行并行。&
目前HBase已经运用于淘宝主搜索的全量和增量的数据存储,有效的减低的数据库的压力,增强了业务扩展的能力。Dump系统的特点是要求在短时间内处理大量数据,对延时要求高。在实施这个项目过程中,我们积累了一些优化的实践,抛砖引玉,供大家参考。
环境:Hadoop CDH3U4 + HBase 0.92.1
尽可能用LZO
数据使用LZO,不仅可以节省存储空间尤其是可以提高传输的效率,因为数据是在regionserver端作解压的。通过测试,可以明显提高HBASE从HDFS的读的性能。尽量不用GZ的方式,GZ的方式在bulkload时有线程安全问题。
根据场景调整Block size
由于使用我们非常关注随机读的性能,一条记录的长度较小,通过设置blocksize=8k,可以提高随机读的性能。
在系统空闲的时候,启动major compaction
在实际中,我们发现随着region不停的flush,hfile的增多会影响scan的性能,为了能控制影响,我们设置了hbase.hregion.majorcompaction为一个比较大的时间,通过另外的定时脚本在空闲的时候集中做各表的major compaction。这样可以保证scan的性能是平稳的。
调整balance策略
我们采用了表级别的balance,但是上线后依旧发现有时scan,会抛timeout的异常。通过hmaster的日志,发现当hbase的表多并且当有regionserver挂掉的时候,表级别balance的策略会导致大面积的region移动。后来通过增加阈值控制,每次balance的时候,每张表的region移动的数量不超过整张表region数量的5%。
关注HDFS的问题
当有regionserver挂掉后,有时split log会很慢,会超时导致master不停的重新resubmit split task,最终导致某些scan任务抛timeout异常。原因是datanode的连接数太多,具体原因是 通过升级hdfs到HADOOP CDH3U4之后,问题解决。
注重rowkey设计
使用hash值+具体的key,并且设置一个巨大的MAX_FILESIZE。固定每个region的范围,防止做split,防止split带来的隐患。
尽可能的用batch操作
通过使用batch的方式,能提高近10倍的性能,使原本单条记录的随机读从20ms左右降至2ms左右,因为batch的内部是按regionserver来发送数据的,所以每次batch的List&Row&的大小,应设置成regionserver的若干倍。
如果可以的话,减少数据的versions
由于我们业务只需要一个版本,设置version=1,可以有效的控制hfile的大小,从而控制scan的性能。&
当用户在一个网站浏览或者搜索商品时,在大多数时间他所面对的都是商品标题+商品图片的商品信息形式。只有当这种简要的信息抓住了用户的眼球时或者达到用户的心理预期时才能引导用户进入更详细的商品详情页。这就对其中唯一的文本信息载体:商品标题包含的信息内容质量提出了要求。
我们来看两个商品标题的例子,这是分别来自淘宝网和京东商城的两条普通商品标题:
冲三冠 腾龙AF 17-50mm VC F2.8(B005)送uv包顺丰8折 大陆行货
这条Title里包含了唯一确定商品的关键属性(品牌和型号)、商品性质(行货),商品促销信息(冲三冠折扣、赠品)
能率(NORITZ)GQ-1680CAFE 天然气(12T)16升家用燃气快速热水器 白色
这条Title包含了商品的中英文品牌、型号、产品类型、容量、颜色等信息。
可以看到:作为用户了解商品信息的第一道入口,商品标题包含有丰富而优质的商品信息,能够在第一时间向用户传达商品最重要的特征。有鉴于此, 在一淘网对商品信息的处理过程中,我们对部分商品的标题进行分析分解,将其中包含的语义信息归类。然后提取出需要的语义信息,再进行进一步的产品逻辑处理。为此,我们开发了中文商品的标题信息分析(以下简称Title分析)程序。
Title中商品信息类别
要对Title信息分类,首先需要知道Title中都可能包含哪些类别的信息。我们把Title中的商品信息类别归纳如图1:
Title分析的基本处理思路:
处理的基本单元是词,我们使用了阿里巴巴自己的分词工具AliWS将商品Title切词并获取词的长度、词性、属性等信息。
每一种语义类各自的识别方法包括两种基本类型:词典和特征模式。
某些语义类并没有复杂的组成形式,当某个词在title中出现就可以认为这个词属于该语义类。以品牌词为例,无论在何种情况下,当title中出现了”阿迪达斯”这个词,就可以认为它代表品牌。(当然也有例外情形,如“苹果”有可能是品牌也可能是产品类型。这就需要一些消除歧义的逻辑来补充)。对于这种语义类,我们采用离线挖掘的方式整理出词典,然后在处理过程中按照词典匹配分析。
特征模式:
语义类一般存在有特别的特征模式。包括组成词的词性,词形式,上下文等都满足一定的规则。利用这种模式就可以做基本的语义判断。例如 价格词的基本模式有:数词+价格量词或者价格前置词(如原价、特价)+数词(+价格) 等
实际在各语义类处理时,通常采取以上两种类型之一或者两种类型结合的方式。
各个语义类的处理按照优先级顺序执行,后处理的语义类依赖先处理的语义类的执行结果。当某个词已经被识别为某个语义后,就不会被再识别为其他语义。这样做的好处是:先处理模式清晰,会给其他语义类带来歧义的语义。这样剥离了大量可能会对复杂语义类造成干扰的因素,简化了其他语义类的处理。例如“日销千件”作为销量提取后,“千件”就不会再被识别为数量。“送耳机”作为赠品被提取后,“耳机”就不会再被识别为为产品类型。
Title分析的应用实例:化妆品小样的识别。
首先是识别商品的容量。识别商品容量的方案包括:
然后Title分析处理商品title和属性识别出商品容量
第二是识别小样的商品,借助词表识别小样商品的方案包括:
通过词典进行识别:整理小样可能的词加入特殊规格词典,比如:“小样、中样、中小样”等等,当商品标题中出现了这些词的时候,将商品识别为小样。
商品标题中可能会写:“高丝 精米水凝保湿眼霜50ml送小样”,这时候如果只用词表进行识别,会将此商品错误的识别为小样商品,但实际上不是。这些会被Title分析的赠品识别过滤。
最后是根据容量识别小样商品,根据容量识别小样商品的方案包括:
哪些商品卖的是同一种化妆品。比如,属于同一个产品节点的商品。
根据识别商品的容量和识别小样的商品,找到是小样且识别出了容量的商品,得到此化妆品产品节点的小样容量,比如“高丝 精米水凝保湿眼霜”的小样容量是6ml或者5ml。
HBase 中的LoadBalancer策略控制了如何在集群启动时Assign所有用户Region到各个RegionServer上,以及如何定期检查Region分布情况并重新调整Region位置的。这些工作在0.92之前的版本中都是在HBase Master内核中实现的,开发人员如果希望扩展自己的LoadBalancer插件,只能Hack源码,但这随着社区版本的升级,Hack工作必须移植到新的版本中。幸好在0.92版本中,HBase将LoadBalancer策略从Master内核中抽取了出来,开放了LoadBalancer Interface,允许开发者根据自己的业务特定扩展自己的LoadBalancer插件。
定制LoadBalancer插件需要两个步骤:
继承org.apache.hadoop.hbase.master.LoadBalancer Interface,实现自己的LoadBalancer Class
在hbase-site.xml中增加配置项,使得定制的LoadBalancer生效
&property&
&name&hbase.master.loadbalancer.class&/name&
&value&{your custom loadbalancer class name}&/value&
&description&&/description&
&/property&
因此,开发LoadBalancer插件的前提准备工作便是清楚了解org.apache.hadoop.hbase.master.LoadBalancer这个Interface:
在熟悉了LoadBalancer接口之后,我们可以开始创建一个自定义的LoadBalancer Class,实现定制化的Balance策略。HBase中默认的Balance策略是RegionServer级别的,即保证每个RegionServer中的Region数量均衡,但没有考虑到每个Table内部的Regions在所有RegionServers中的均衡,下图可以清晰的描述这个问题:
由上图可以看出,各个RegionServer中的Regions数量是均衡的,但是每个Table内部都是不均衡的,因此各个Table的访问者很容易出现局部访问热点。我们定制Table Level的LoadBalancer不仅要实现RegionServer级别的Balance,同时也要实现Table级别的Balance,如下图所示:
由上图可以看出,不仅RegionServer间保持均衡,每个Table内部的Region也是均匀分布的。具体实现TableLevelLoadBalancer是,要重点关注LoadBalancer Interface中的以下几个主要方法:
Map&ServerName, List&HRegionInfo&& roundRobinAssignment(List&HRegionInfo&, List&ServerName&),HBase Master启动时将各个用户Table的Regions依次均匀assign到各个RegionServer中,这个可以参考DefaultLoadBalancer中的实现
Map&ServerName, List&HRegionInfo&& retainAssignment(Map&HRegionInfo, ServerName& regions, List&ServerName& servers), HBase Master启动时如果发现hbase.master.startup.retainassign设为true了,则不会进行roundRobinAssignment,而是调用这个方法保持上一次集群的region assign方案,这个方法也可以参考DefaultLoadBalancer中的实现
有一个朋友问,一个用户搜索一个query是“百度”,怎么知道用户真正是想找什么呢。
我回答说,分析之前搜索这个query的用户点了些什么结果啊。
朋友继续问,如果没有用户点击呢。
呃,如果没有点击,这个问题就比较复杂了。整理了下思路,于是写成了本文。主要描述了关于如何预测用户query意图。希望会有所帮助。
首先我们的明确一个标准,如何判断我们对用户意图的猜测是正确的?
用户的思维是很发散的,也许今天搜索“葛优”,是想找“让子弹飞”,明天搜索相同的query,就是想找“非诚勿扰”。
我们确定了要在某个方面的query预测上做一个改进,那么我们首先的把标准定下来,依照这个标准来进行改进。
现在有很多对搜索系统的评价指标,如pv,ipv,ctr,搜索引导的后续转化率等可以量化的指标,这些指标是对搜索系统总体的评价。具体到用户意图预测上,标准很难确定,对于排序比较直观的就是进行side by side的评测,比较原有的效果和改进的效果,看是否会排序更优;对于导航,那我们可以看我们预测的类目和用户实际点的类目的占比,是否能有效降低用户点击非推荐类目的比率。
接下来,我们从2种情况下来回答这个问题,
如果我们已经有了一套完整的系统,有大量的用户访问
先从简单的说起,假设我们已经有了一个完整的搜索系统,有大量的用户访问,我们希望通过对用户query的预测来提高搜索体验。这样的系统的大概架构如下。
包括图所示的几个部分,
1 前端(f2e)
前端负责直接和用户进行交换,当收到用户搜索请求之后,往后端系统传递请求,并接收搜索引擎返回的结果,组织到网页上,展示给用户。
前端还肩负着一个重要的记录日志的工作,这个日志的记录,并不是apache的访问日志,这样的日志内容过于简单。如果要前端记录过多的日志,又会给服务器带来不小的压力。所以目前主要的手段是通过用户在页面上进行搜索或点击等行为时,调用javascript向指定的日志服务器,发送特征url来记录,这种url不会返回内容,仅仅为了给日志服务器添加记录。发送的url会包括从cookie中解析出的用户特有的数据。
2 Query处理
Query处理是线上服务系统,它是对用户意图进行预测后,对用户的搜索结果进行改进。在接收到前端的请求之后,会利用线下对query分析得到的数据,对用户的query和上下文环境进行分析,附加更多的条件到搜索引擎的请求命令之中。常见的Query处理,会有以下的一些类容,query改写,query分类预测,query的导航等。
Query处理这部分主要的意义在于,将用户的搜索query,翻译为对搜索引擎更适合查询串。在大多数情况下,用户使用搜索引擎是为了解决自己的问题,如果能直接获得答案,用户是不大愿意进行搜索的。
用户也许的问题是,“非诚勿扰2里面说的廖凡是谁”这样的一个问题,这样的问题直接搜索是不太会有会令用户比较满意的答案,(除非有向百度知道这样的系统已经存在了类似的问题)。有些用户就会考虑换个关键词试试,搜索下“廖凡”,看是否会有一些答案可以让自己满意。所以很大程度上是搜索引擎在教用户如何使用自己。但是并非所有的用户都对搜索系统如此的熟悉,那我们就需要考虑看看在我们搜索的结果里面效果不太好的query,分析它是怎么构成的。我们也许无法准确回答“非诚勿扰2里面说的廖凡是谁”,但是可以把其中最关键的信息抽取出来“非诚勿扰2”“廖凡”,并且,我们需要回答“是谁”这样的疑问问题。把这些信息传递给引擎,才会有更好的结果。
再例如,用户想找,“1000元左右的手机”,那么对于淘宝来说,可以把搜索的条件转化为800-1200价格限制范围的,手机类目下的宝贝,或者更进一步,把各种型号的手机,列在一起,进行参数的比较。
再深入一步,用户想找“舒淇在非诚勿扰2中用的手机”,如果我们可以把这个问题转化为对“朵唯S920”的搜索,那就是非常非常好的效果了,至于这个query如何对应到这个结果,也许后面的一些分析,能提供一些线索。
具体的实现,可以参考下面几点,
对query的线上处理,如果是较为hot的query,可以以查表为主,可以用hash表,trie树等进行查表,把在线下计算好的数据,通过查表的方式找到对应的结果,附加到给引擎的搜索条件上,并返回。
另外,可以把线下训练好的模型,在线上进行预测,一般的分类算法预测速度都比较快。可以对长尾的query,进行及时的预测。
也可以做一些规则,如我们上面举的例子,“1000元左右”,可以通过正则表达式进行识别,将其转为对应的搜索条件。这些规则如何来定呢,这是比较麻烦的一点,像这类的query,肯定是pv比较低的,属于长尾的query,这些query效果提升可能比较明显,但是对总体搜索系统效果影响会较小。这个问题比较尴尬,如果我们这类query处理的效果好的话,那用户会使用的更多;用户知道了这样的query效果不好,所以就换成了效果好的query。如果要做好规则,那就把长尾的这些query都拿出来,多看看,分下类,再结合实际的问题分类,总结出一些通用的规则,来进行优化。
3 搜索引擎
搜索引擎主要负责检索和排序,一般由一些倒排表和正排表组成。倒排表用于查找对应的文档id,能快速的检索出命中query的文档,在根据正排表来查对应id的数据。
一般将需要字符串类型的文档字段作为倒排表来进行检索,字符型的字段可以放在正排表中,在通过倒排表找到了满足条件的文档,再在正排表中进行过滤。
找到满足条件的文档后,再进行过滤,统计,并根据排序参数进行排序。
排序分为2个部分,一部分是文档自身的静态分,每个文档会有类似pagerank这样分数,另外一部分是还有和query相关的部分,会计算文档和query的关系,例如,query中出现的词的在文档中是否距离较近,query是否为文档的中心词。
4 日志存储
日志存储系统收集前端记录的日志,存储在数据仓库中,解析后用分布式文件系统来存放。有几类日志比较重要,
A、 搜索日志,搜索日志一般会包括以下一些信息,用户id,session &
Hadoop是基于Java的数据计算平台,在我们公司得到了广泛应用。同样mllib也是我们算法组同学经常使用的一个机器学习工具包。但目前mllib工具包只提供了供C++程序调用的so链接库,没有可供java程序调用的jar包。由于这个需求有一定的普遍性,作者将mllib做了进一步封装,并通过jni的方式把其封装成了可供java程序调用的接口。
结构示意图
对mllib的二次封装
原始的mllib开发包对模型的处理(训练,加载,预测)都是per model的,对于每一个模型都需要写一些重复类似的代码。实际应用中我们的模型也一般都是多个的(分行业,或分类目来做),不太会只是用一个大而泛的模型。mllib没有提供一个类似于Manager的类来管理多个模型。所以笔者对mllib进行了二次封装,能够让大家比较方便的通过配置来管理多个模型,也让大家从需要了解mlllib最底层的接口中解放出来。
封装的Manager类:
MlrManager类被封装到了libMlrManagerJni.so链接库中,可供其它C++程序使用。
配置文件说明:
//设置root目录,后面的模型文件只需要指定相对这个root路径的相对路径即可
BASE_PATH = ./mlr_jni.tar/conf/
//模型数目,指定了模型数目后,模型名就可以确定了:MODEL1 , MODEL2 &#8230;. MODEL${ TOTAL_MODEL_NUM }
TOTAL_MODEL_NUM = 4
//模型的类型(回归还是分类),不同的模型类型,预测时实现的方法是不一样的,一定要正确设置
#MODEL_TYPE = classification
MODEL_TYPE = regression
//指定具体某个模型使用的模型文件名称,不同的模型可以使用相同的模型文件。
MODEL1 = 1.model
MODEL2 = 2.model&
在日常工作中,经常需要使用随机算法。比如面对大量的数据, 需要从其中随机选取一些数据来做分析。 又如在得到某个分数后, 为了增加随机性, 需要在该分数的基础上, 添加一个扰动, 并使该扰动服从特定的概率分布。本文主要从这两个方面出发, 介绍一些算法, 供大家参考。
首先假设我们有一个使用的随机函数float frand(), 返回值在(0, 1)上均匀分布。大多数的程序语言库提供这样的函数。 在其他的语言如C/C++中, 可以通过间接方法得到。如 frand()= ((float)rand() ) / RAND_MAX;
1, 随机选取数据
假设我们有一个集合A(a_1,…,a_n), 对于数m,0≤m≤n, 如何从集合A中等概率地选取m个元素呢?
通过计算古典概率公式可以得到, 每个元素被选取的概率为m/n。 如果集合A里面的元素本来就具有随机性, 每个元素在各个位置上出现的概率相等, 并且只在A上选取一次数据,那么直接返回A的前面m个元素就可以了, 或者可以采取每隔k个元素取一个等类似的方法。这样的算法局限很大, 对集合A的要求很高, 因此下面介绍两种其他的算法。
1.1 假设集合A中的元素在各个位置上不具有随机性, 比如已经按某种方式排序了,那么我们可以遍历集合A中的每一个元素a_i, 0&=n 根据一定的概率选取ai。如何选择这个概率呢?
设m’为还需要从A中选取的元素个数, &
“机器学习”这个名词对大家来说想必不是一个陌生的词汇,特别对算法组的同学来说,工作中或多或少接触使用过这种“高科技“。对于我来说,刚来淘宝工作一个月就开始接触了机器学习,当时做主搜索功夫熊猫项目,和小致飘雪一起做交易模型,正是使用了机器学习的方法,也首次接触了treelink模型。做完那个项目后对机器学习解决问题的流程有了一定的了解,但对其内部的工作原理和实现机制还是完全不知道,基本也就是在黑盒使用机器学习工具。后面也多多少少听了一些机器学习的讲座,但都是一些比较宽泛的基本概念,没有深入的原理性的介绍。也自己尝试过专研一下,但生硬晦涩的E文让人望而生畏。一直到今年做导购搜索的项目,又再次需要使用机器学习,“怀揣着对科学真理的向往”,主动请缨做模型方面的工作。经过一个多月的学习实践,算是对treelink模型有了一定的了解。下面做一些对treelink模型通俗版的介绍。都是自己的一些理解,如果有误,多指教。
在介绍treelink之前首先不得不简单介绍一下决策树算法,决策树相信大家都有所了解,任何一本机器学习书籍都会介绍这种算法,也是应用最广的归纳推理算法之一。该模型学习的结果是一棵决策树,这棵决策树可以被表示成多个if-else的规则。下图是一个典型的学习得到决策树。这棵决策树根据两个特征因素来分类“元涵今天的心情好坏”。长方形的表示特征,椭圆型的表示特征的取值,最下面的叶子节点就是最后的分类结果了。
学习得到如上这棵决策树之后,当输入一个待预测的样本实例的时候,我们就可以根据这个样本的两个特征的取值来把这个样本划分到某一个叶子节点,得到分类结果了,这就是决策树模型的预测过程,决策树的学习构建过程这里就不介绍了,大家看书吧,比较经典的有ID3算法和C4.5算法。
切入正题下面开始说treelink算法,treelink这个名字其实只是我们阿里集团内部的叫法,学术上的名称叫GBDT(Gradient boost decision tree)。treelink模型不像决策树模型那样仅由一棵决策树构成,而是由多棵决策树构成,通常都是上百棵树,而且每棵树规模都较小(即树的深度会比较浅)。模型预测的时候,对于输入的一个样本实例,首先会赋予一个初值,然后会遍历每一棵决策树,每棵树都会对预测值进行调整修正,最后得到预测的结果。
F0是设置的初值, Ti是一棵一棵的决策树。对于不同的问题(回归问题或者分类问题)和选择不同的损失函数,初值的设定是不同的。比如回归问题并且选择高斯损失函数,那么这个初值就是训练样本的目标的均值。
下面是一个简单的treelink模型示意图。模型的目标是上海一套普通商品房的价格,特征有三个:房子的面积(连续特征),是否在内环(分类特征),是否学区房(分类特征)。模型由四棵决策树构成,每棵决策树只进行了一次分裂,即树的深度为一(这种树被称为Decision Stump)。实际应用中通常较复杂,深度不会为一。
初值设定为上海普通商品房价格的均值150万,每经过一棵决策树,都会对根据相应特征的取值对预测价格进行调整。比如一个面积为120平的内环非学区房的价格预测值为:150+20-10+30-10=180万。
那为什么要用多棵决策树,一棵决策树为什么不好呢?使用单棵决策树,最大的问题就是会因为过度分裂,而造成过拟合,失去泛化能力。试想一下,对于给定的一批训练数据,完全可以只构造一棵树,不断分裂下去,直到每个叶子节点包含的样本的目标值都一样,然后把这节点的预测值设定成这个目标值,这样构造出来的这棵树就可以在这批训练数据上达到100%的准确性。但这样一棵过度分裂的决策树,对于新的样本基本没有什么预测能力。而如果分裂太少,又会造成学习不够充分。Treelink使用多棵决策树正是希望能够在训练精度和泛化能力两个方面都能达到较好的效果。作为一种boosting算法,Treelink自然包含了boosting的思想:将一系列弱分类器组合起来,构成一个强分类器。它不要求每棵树学到太多的东西,每颗树都学一点点知识,然后将这些学到的知识累加起来构成一个强大的模型。举个现实生活中的例子,电视里的那种益智类节目,如开心词典,答题者有三次请求帮组的机会,其中一个就是请求现场所有观众,通过他们的选择来给出答案。我们可以把每个观众当做一个弱的分类器,他们各个单独的准确率都不高,但把他们的知识综合起来这个准确率会大大提升。也许上面这个例子不太能说服你,我们来把这个例子量化。假如我们有三个观众,他们各自的准确率为60%(非常弱的分类器,只比随机分类器好一点点),如果这三位观众中有大于等于两位的答案是正确的,那么则认为我们正确了,反之则错误。那么我们正确的概率是多少呢?preciseness = p(三个人都正确) + p(三个人中有两个人正确) = 0.6*0.6*0.6 + 3*0.6*0.6*0.4 = 0.648,比单个人0.6的正确率有所提升,验了中国那句老话“三个臭皮匠顶个诸葛亮”。随着人数的增加,这个正确率还会提升。
Treelink模型的学习过程,就是多颗树的构建过程。和决策树模型一样,在树的构建过程中,最重要的就是寻找分裂点(某个特征的某个取值)。我们希望选择的这个分裂点是最能区分样本的。那么如何衡量一个分裂点对样本的区分能力?在treelink算法我们通过Loss(衡量样本预测值与目标值的差异)的减小程度用来衡量这个区分能力,Loss减小得越多,这个分裂点就越好。即以某个分裂点划分,把样本分成两部分,使得分裂后样本的损失函数(Loss Function)值减小的最多。好像有点不太通俗了,没办法。
训练流程:
按如下方式构造M颗树
随机选取部分样本作为本颗树的训练数据
按如下方式寻找最优分裂点,进行N次叶子节点的分裂
对当前所有叶子节点
计算该叶子节点的最优划分以及其增益(损失函数减少量)
选择增益最大的叶子节点及其划分点,进行分裂,将样本划分到子节点中&
hadoop是基于java的数据计算平台,引入第三方库,例如C语言实现的开发包将会大大增强数据分析的效率和能力。 阿里巴巴内部使用的分词软件(用c++实现的,以下简称WS包)是日常工作中最基本的软件包,通过java的jni机制,笔者将WS包成功的运行在hadoop上,深受很多部门的欢迎。下面借这个例子介绍hadoop上jni程序的开发过程。
首先,简单介绍一下WS包中的调用接口和基本结构。
WS包包括词典文件A.dict,对外提供静态链接库文件libWS.a。WS.h如下:
我们的方案是首先生成jni的原型定义,然后根据原型定义,来包装WS类的接口,最后生成可在tasknode上运行的jni程序包。结构如下图所示
第一步,我们先使用java的jni技术,生成C的原型接口(prototype),然后编写Wsjni.java 文件,这是为云梯程序提供的类文件,其中libwsjni.so 就是wrapper类的动态链接库:
Wsjni.h里面的有函数的原型声明,例如:
第二步,根据Wsjni.h实现wrapper类。需要阅读sun公司编写的jni的规范来实现应用,具体不在这里赘述。在Makefile中链接静态库libWs.a,从而生成一个动态的链接库libwsjni.so ,
我们的wrapper类就写好了。我们可以通过java的程序来测试验证jni是否正确。
运行命令是
为了在hadoop上运行Ws包,需要制作两个jar包,一个是wsjni.jar, 通过-libjar选项提供class文件; 一个用于hadoop集群运行,ws.jar里面放了Ws包运行时需要的资源文件,包括链接库和词典文件。
Wsjni.jar中的文件是:
Ws.jar 中的文件是:
第三步,在hadoop上调用Wsjni。hadoop有很特殊的文件系统,这里笔者针对性介绍一下DistributeCache的机制。Hadoop可以将HDFS的一些文件分发到运行的某台机器的工作目录下,并按照一定的逻辑解压。通过以下API实现:
上面的API将ws.jar分发到tasknode上,并解压到工作目录的link目录下。Ws.jar包含ws相关的资源文件。在tasknode上,每个task工作目录下的文件是:
这样的目录结构,使得程序访问文件的路径一目了然,当调用者需要调用WS的接口时,词典A.dict和libwsjni.so 都在./ws 目录下。
因此,调用者的代码如下:
需要设置 lava.library.path的原因是,java虚拟机需要找到libwsjni.so存放的路径。有必要通过ldd 命令看看so依赖哪些库,保证这些库和hadoop集群的tasknode中的库的版本一致。
罗嗦了这么多,都是细节问题,还得各位手动再做一遍,hadoop的程序不太方便调试,但是遇到的困难越多,收获的越多。呵呵。
欢迎各位不吝赐教。&
A quality product by}

我要回帖

更多关于 javascript连接数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信