1. 程式人生 > >使用spark TF-IDF特徵計算文章間相似度

使用spark TF-IDF特徵計算文章間相似度

寫在前面

計算字串之前的相似度可以使用 Levenshtein distance(最小編輯距離)來實現,JAVA實現可以參考http://blog.csdn.net/ironrabbit/article/details/18736185,計算新聞標題間的相似度間可以使用這個演算法,如果是計算整篇文章間的相似度使用更適合使用:分詞–>特徵提取–>向量空間–>計算向量相似度,這樣的流程,本文介紹方法純屬個人學習。

文章準備

現有如下圖所示文章若干,格式為:

typeId====文章ID====標題====正文

需要輸出每篇文章相似度最大的10篇文章
這裡寫圖片描述

計算流程

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)