使用spark TF-IDF特征计算文章间相似度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whzhaochao/article/details/73618956

写在前面

计算字符串之前的相似度可以使用 Levenshtein distance(最小编辑距离)来实现,JAVA实现可以参考http://blog.csdn.net/ironrabbit/article/details/18736185,计算新闻标题间的相似度间可以使用这个算法,如果是计算整篇文章间的相似度使用更适合使用:分词–>特征提取–>向量空间–>计算向量相似度,这样的流程,本文介绍方法纯属个人学习。

文章准备

现有如下图所示文章若干,格式为:

typeId====文章ID====标题====正文

需要输出每篇文章相似度最大的10篇文章
这里写图片描述

计算流程

  1. 分词
    分词工具主要有 :
    ikanalyzer: https://www.oschina.net/p/ikanalyzer
    ansj_seg: http://nlpchina.github.io/ansj_seg/
    NLPIR: http://ictclas.nlpir.org/
    hanlp:http://hanlp.linrunsoft.com/

ansj_seg比较简单易用,效果也还可以,所以本文选择了ansj_seg分词,ansj_seg是java写的,当然用scala也可以直接调用分词代码如下

import breeze.linalg.{SparseVector, norm}
import org.ansj.domain.Term
import org.ansj.splitWord.analysis.ToAnalysis
import org.apache.spark.mllib.feature.{HashingTF, IDF}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.linalg.{SparseVector => SV}

  def  splitWordToSeq(news:String)={
    val terms:java.util.List[Term] =ToAnalysis.parse(news).getTerms;
    val size=terms.size()
    var res="";
    for( i<- 0 until size){
      res+=terms.get(i.toInt).getName+" "
    }
    res.split(" ")
  }  

   //加载数据RDD格式 (id,contnent,typeId,title)
    val src = ctx.textFile(typePath).map(x => x.split("====").toSeq).filter(_.length==4);
    val trainRdd=src.map(x => (x(1),splitWordToSeq(x(3)),x(0),x(2)))

经过这一步操作RDD数据结构为

(文章I,[词1,词2,.],分类ID,标题)

2.TF-IDF

    val hashingTF = new HashingTF(Math.pow(2, 18).toInt)
    //计算TF
    val newSTF = trainRdd.map {
      case (num, seq,typename,title) =>
        val tf = hashingTF.transform(seq)
        (num, tf)
    }
    newSTF.cache()
    newSTF.take(10).foreach(println)
    //构建idf model
    val idf = new IDF().fit(newSTF.values)
    //将tf向量转换成tf-idf向量
    val newsIDF = newSTF.mapValues(v => idf.transform(v))

3.余弦值计算


    //广播一份tf-idf向量集
    val bIDF = ctx.broadcast(newsIDF.collect())
    newsIDF.take(10).foreach(println)

    //计算doc之间余弦相似度
    val docSims = newsIDF.flatMap {
      case (id1, idf1) =>
        val idfs = bIDF.value.filter(_._1 != id1)
        val sv1 = idf1.asInstanceOf[SV]
        //构建向量1
        val bsv1 = new SparseVector[Double](sv1.indices, sv1.values, sv1.size)
        //取相似度最大的前10个
        idfs.map {
          case (id2, idf2) =>
            val sv2 = idf2.asInstanceOf[SV]
            //构建向量2
            val bsv2 = new SparseVector[Double](sv2.indices, sv2.values, sv2.size)
            //计算两向量点乘除以两向量范数得到向量余弦值
            val cosSim = bsv1.dot(bsv2) / (norm(bsv1) * norm(bsv2))
            (id1, id2, cosSim)
        }.sortWith(_._3>_._3).take(10)
    }

4.结果输出

  //每篇文章相似并排序,取最相似的前10个
    val simRdd= docSims.groupBy(x=>x._1)
    val srcJoin=src.map(x=>(x(1),x(2)))

    //广播一份srcJoin
    val bSrcJoin = ctx.broadcast(srcJoin.collect())

    //按标题输出
    srcJoin.join(simRdd).map(x=>(x._1,x._2._1,x._2._2.map(x=>(x._2,x._3)).map(x=>{
      val id=x._1
      val sim=x._2
      val  name=bSrcJoin.value.filter(x=>x._1==id).take(1).toList.mkString(",")
      name+" "+sim
    }
    ))).foreach(x=>println(x._1+" "+x._2+" "+x._3))

输出结果

281 打开车门,带照明的个性化不锈钢车门槛护板 List((286,此外据官方称,新车内饰将配备独特的运动方) 0.17355059781756424, (981,灯光的颜色会随着模式的不同而变化,全新一) 0.07154584060189653, (476,具体车型价格见下表所示:,赠送礼包(全车) 0.0663799917998182, (372,居家与性能结合的完美作品,整个仪表板总成) 0.06308138351300914, (472,单碟CD,手动空调,还有车窗雾灯控制等也都) 0.056893497309718585, (514,赠送4880元礼包(车膜、电子狗、发动机护板) 0.05632346910876026, (283,后防护结构由外皮和带吸能盒金属杠铁组成,) 0.05514934221670283, (918,全新索兰托明显要比老款更加低矮、修长一些) 0.05467620075042357, (602,逍客的内饰设计方正、简洁,更加偏向于SUV) 0.05345188989008506, (173,新车共推出包括进取型、精英型、尊贵型三种) 0.05260479779073858)
188 标致雪铁龙集团执行董事会主席瓦兰(Philipp List((190,皮卡特在接受采访时还否认了有关标致雪铁龙) 0.28308784004633664, (169,东风标致热销车型3008以及法国标致摩托的全) 0.26921309228870577, (204,则让镜头与关注点再一次聚焦在它的身上,【) 0.20868440839311483, (451,标致Quartz概念车还配备了23英寸多辐轮圈,) 0.14827844905629373, (589,标致此次将新款508引入中国,将很可能一举) 0.1399713488539159, (457,【雪铁龙SM车型】,而雪铁龙C4毕加索车型以) 0.13906010641740565, (593,因此雪铁龙正在计划推出一系列运动车型,新) 0.13636748746481672, (406,标致2008车型未来也将搭载这款1.2THP发动机) 0.12450132789119432, (786,(本标识采用的燃料消耗量数据是根据GB/T,) 0.12167313807761139, (496,全新东风标致508采用了新的标致家族式设计) 0.12029274244691324)
528 丰田发布了ScioniM概念车的官方图片, List((669,搜狐汽车北京编辑从北京丰田经销商(北京华) 0.11501504746179818, (331,通过谍照可以发现,量产版车型秉承了概念车) 0.11112317519674783, (979,具体车型优惠政策如下:,外观方面,雷凌与) 0.10741662908666913, (866,2.7T发动机还将搭载于即将在江铃福特国产的) 0.10233109870646034, (969,C概念车定位五门轿跑,其量产版很有可能是) 0.10170358633432966, (395,丰田中国进一步明确中国事业的三个重要目标) 0.09700854463833553, (388,但是在整车外形方面已经被赋予了更多的量产) 0.0969224361969581, (550,外观方面:新款卡宴GTS配备了全新的运动套) 0.09586847461034306, (451,标致Quartz概念车还配备了23英寸多辐轮圈,) 0.09453268429874259, (914,北京现代名图在动力方面提供了1.8L和2.0L自) 0.0938042150135108)
584 当地蒙古族小伙为跨界之旅的体验者们献上了 List((98,为参与活动的会员及车友们带来了一次愉快、) 0.10144042621410033, (900,●外观:大胆跨界丰富线条极具动感活力,缤) 0.08435250342604701, (661,消费者也拥有了更好更丰富的选择,今天我们) 0.06678491860484939, (602,逍客的内饰设计方正、简洁,更加偏向于SUV) 0.06641661347419316, (356,虽然外观、内饰以及空间方面都足够出色,但) 0.06468750976743301, (247,电脑登录搜狐汽车双11购车节活动专题页面,) 0.06350055512853144, (172,“纵型都市FUN享精彩“广汽本田年轻人都市) 0.05903709932636419, (261,然而这些车型的背后的汽车品牌又有着怎样的) 0.05568197956503549, (12,汽车的设计生产则必须以几近严苛的规矩与标) 0.054981953655597146, (849,汽车设计和工程设计往往成为发展中国家汽车) 0.052715987050102074)
883 更多豪华配置应用于车型,比如,外部后视镜 List((547,BMW3行动至今已成功举办7年,是汽车界首屈) 0.4716876068281059, (604,宝马车型一直以动感时尚,做工精致,配置丰) 0.37444951429283024, (748,xDrive车型将是国产宝马车型首次搭载宝马全) 0.3248377629392127, (868,您觉得宝马给您带来最大的感触是什么?,孔维) 0.283797520879025, (45,“2013BMW售后服务体验之旅”将于41日至1) 0.2607764840693342, (477,配置方面:宝马316Li配备了6.5英寸显示屏、) 0.2252714662316658, (792,宝马将在2015年推出5款全新车型,2015年宝马) 0.19634295413080682, (141,此活动成功加深了华晨宝马与达科之间的战略) 0.17710362862912762, (812,由于是同一平台的细分车型,因此我们从它的) 0.14666740935066, (597,虽然运转时不见了以往直列6缸发动机浑厚的) 0.14218210564143735)
391 选择当天上市的第一辆启辰R30成为启辰品牌 List((234,即启辰首款SUV产品,就是一款完全由启辰研) 0.7379809178271136, (2,作为东风日产旗下的自主品牌,奇骏和逍客使) 0.5618171446403687, (92,2013款车型在哪方面有变化?,2013款启辰D50) 0.4174158130052179, (408,国家还将于201491日起推出针对如晨风这) 0.2797312789474938, (752,搭载6AT的1.6THP车型售价偏高,倒是众泰在) 0.23030218361294036, (75,除了华晨宝马、一汽丰田两家合资企业推出自) 0.1799494445762122, (107,同时在东风风神新H30CROSS上市活动当天,) 0.15510159677821928, (139,东风日产的企业哲学不仅用于己身,更放在了) 0.14440237542192322, (122,进一步强化了长城C30的优势,为消费者提供) 0.1359071861216043, (803,我们搜狐汽车要把市场部、电销部、销售部、) 0.1358706124362036)
346 黄少堂从通用汽车回国,“下嫁”广汽,2013 List((529,惊闻小虞会长逝世的噩耗,虽然已经有心理准) 0.29352314001002766, (499,这个产品被用户接受了,有了一定的量,这个) 0.26315679277910997, (49,还有一系列产品正处于研发中,广汽乘用车密) 0.24265831278192818, (121,让广汽传祺拥有比肩合资的世界级品质,传祺) 0.23985767837453692, (15,我们在设计中还是有机会去给消费者意外的惊) 0.21561977849327923, (951,搜狐汽车:这个我们很早有积累了?,白清源) 0.204593196768207, (612,真正的靠技术推动,我们积累了很多资源,这) 0.19251874489715443, (782,除了全新上市的LEVIN雷凌之外,广汽丰田主) 0.19248053311846638, (210,车联网一定对车主有一定的价值,这里面我们) 0.1921777074753557, (849,汽车设计和工程设计往往成为发展中国家汽车) 0.19139255180500553)
232 ●空间:驾乘空间可满足家用,长城C30采用皮 List((226,●空间:载人储物空间足够日常家用,皮质座) 0.2703664801025661, (413,●储物空间多设置合理,观致3的储物空间表现) 0.2506234960697643, (475,能够获得非常大移动空间了,而在后排,昂科) 0.22281908658721572, (919,后排座椅是亮点;人性化储物空间丰富,长安) 0.20343313304907687, (122,进一步强化了长城C30的优势,为消费者提供) 0.20097038421176572, (430,在乘坐空间上,晨风带给我们的空间感受还是) 0.17836686733443674, (823,家用舒适性还是很不错的,这次佳乐共计有5款) 0.15326005196349493, (578,而且不少车型在最近几个月才“新鲜”上市,) 0.14875885782880913, (22,至于后排座椅的舒适性表现,思铂睿Si版本车) 0.1482747590294383, (556,腰部以及腿部的承托效果也很出色,只不过作) 0.1466919666282025)
982 我们可以发现混合动力款的油耗其实并不乐观 List((926,采用3.0升涡轮增压发动机,在8挡自动变速箱) 0.2949035009939314, (628,这不但保持普通旅行版本的舒适性与空间实用) 0.20280228556217705, (362,不过对于中国用户最关心的充电问题,宝马中) 0.18618869402330898, (798,搜狐汽车北京编辑从北京奥迪经销商(中汽力) 0.18134706774149742, (268,外观造型上新车的造型与现款普通版车型完全) 0.17379506239753093, (422,由于采用了独特设计,这款直列四缸发动机的) 0.17307506715209459, (347,G21项目组一方面要继续进行市销车的开发,) 0.17269390251709493, (909,动力并不激进,但是绝对有型,轴距从最初的2) 0.1724972359845319, (333,起亚汽车宣布将会在巴黎车展期间发布K5(海) 0.16283793812397732, (66,大量新车在4月集中上市或者发布,这其中就包) 0.1550123997087309)
273 【配图为2014款众泰T6001.5T手动尊贵型】, List((569,轴距尺寸几乎可媲美汉兰达,众泰T600的车身) 0.40508262121445704, (952,最大扭矩141N·m/4000rpm,相比海马M3的1.5L) 0.2886101774352213, (752,搭载6AT的1.6THP车型售价偏高,倒是众泰在) 0.2669235200457219, (875,【哈弗H6升级版】,【2013款长城H6升级版1.5) 0.15988001240179284, (976,从泰卡特跟保时捷的关系来看,我们可以看到) 0.13664353792509198, (406,标致2008车型未来也将搭载这款1.2THP发动机) 0.12948473042992487, (304,【此前曝光的全新奔驰C180申报目录图】,) 0.12640540510036014, (239,国产车型仅推出了1.4T车型,日前,我们从相) 0.11880795570371622, (479,动力方面:2015款哈弗H5搭载2.0L和2.0T汽油) 0.11316888573598233, (474,起亚K41.6T车型的内饰设计部分,就不像外观) 0.11267280376125026)
766 车展尚未结束,编辑就在《雷锋编辑部》微信 List((690,长安CS75在公告目录中正式出现,其硬朗的设) 0.39467565298677787, (164,不仅有法兰克福车展刚刚全球首发的CS75,) 0.2306838477806039, (756,睿骋,看点:长安首款中高级轿车,轴距2810m) 0.2000332843387217, (854,主要是增加了三款车型,分别是自动舒适型、) 0.15667503874908364, (960,劲炫CVT变速箱驾驶感受和逍客十分类似,平) 0.14207474099431963, (615,长安汽车特别是自主品牌乘用车的增长,坚持) 0.13960684399664977, (718,小型SUV市场的销量亚军是自主产品长城M4,) 0.13959252428862357, (585,在市委、市政府领导、长安汽车领导以及各大) 0.1308230785251635, (919,后排座椅是亮点;人性化储物空间丰富,长安) 0.13076938394467305, (446,取代了上一代的1.4T机械+涡轮增压发动机,) 0.12962463698820595)
253 丰田开发氢燃料电池汽车算是20年磨一剑,终 List((82,丰田计划向宝马提供燃料电池车驱动总成和氢) 0.5976756059646379, (549,但并不排除丰田因为该车型的定位而使用较为) 0.38660417115657253, (388,但是在整车外形方面已经被赋予了更多的量产) 0.2698028905556529, (347,G21项目组一方面要继续进行市销车的开发,) 0.15978050514097117, (78,实际上,电动车所遭遇的困境已不仅限于汽车) 0.14881709918304173, (681,(本标识采用的燃料消耗量数据是根据GB/T,) 0.13724304002256352, (940,(本标识采用的燃料消耗量数据是根据GB/T,) 0.1363814439933147, (754,店内大众新桑塔纳火热开售,购新桑塔纳部分) 0.13339129700766897, (799,(本标识采用的燃料消耗量数据是根据GB/T,) 0.12851826189535517, (646,搜狐汽车北京编辑从北京现代经销商(北京现) 0.12449225575256725)

猜你喜欢

转载自blog.csdn.net/whzhaochao/article/details/73618956
今日推荐