新闻热点发现的设计与实现(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

新闻热点发现的设计与实现

目录:

一.算法设计----------------01

二.数据来源与处理

数据来源------------03

数据处理------------04

三. 实验代码

-------------------04

四. 实验结果

-------------------10

五Spark运作情况

-------------------20

一. 算法设计

实验平台:基于scala+spark(单节点)

实验系统:基于ARCHLinux

使用TF-IDF计算文本相似度,然后聚类,最终得出新闻热点.

二. 数据来源与处理:

数据来源:

本实验的数据来源与课堂实验所附数据

原始数据样式如下:

其格式为: 所属”领域”+”题目”+”内容”,其中领域包括(体育娱乐家居房产教育时尚时政游戏科技财经)

数据处理:

处理目的:由于本实验是热点发现没有领域限制,为了排除影响,用一个只起区别作用的”ID”来代替”所属领域”.

处理代码截图:

处理结果:

数据格式变为:”ID”+”====”+”标题”+”====”+”内容”

三. 实验代码:

import org.ansj.splitWord.analysis.BaseAnalysis

import org.apache.spark.graphx.Graph

import org.apache.spark.mllib.feature.{HashingTF, IDF} import org.apache.spark.{SparkConf, SparkContext}

import org.apache.spark.mllib.linalg.{SparseVector => SV}

object groupNews {

def main(args: Array[String]): Unit = {

//相似度阈值

val sim = 0.5

val sparkconfig = new SparkConf().setAppName("DocSim").setMaster("local[2]")

val ctx = new SparkContext(sparkconfig)

val path = "/home/jiangshen/cnews2.txt"

//加载过滤数据(id,title,content)

val input = ctx.textFile(path).map(x => x.split("====").toSeq).filter(x => x.length == 3 && x(1).length > 1 && x(2).length > 1)

//分词(id,title,[words])

val splitWord = input.map(x => (x(0), x(1), BaseAnalysis.parse(x(2)).toStringWithOutNature(" ").split(" ").toSeq))

//聚类初始化计算文章向量(id,(id,content,title))

val init_rdd = input.map(a => {

(a(0).toLong, a)

})

init_rdd.cache()

//计算TF-IDF特征值

val hashingTF = new HashingTF(Math.pow(2, 18).toInt)

//计算TF

val newSTF = splitWord.map(x => (x._1, hashingTF.transform(x._3))

)

newSTF.cache()

//构建idf model

val idf = new IDF().fit(newSTF.values)

//将tf向量转换成tf-idf向量

val newsIDF = newSTF.mapValues(v => idf.transform(v)).map(a => (a._1, a._2.toSparse))

newsIDF.take(10).foreach(x => println(x))

//构建hashmap索引 ,特征排序取前10个

val indexArray_pairs = newsIDF.map(a => {

val indices = a._2.indices

val values = a._2.values

val result = indices.zip(values).sortBy(-_._2).take(10).map(_._1)

(a._1, result)

})

//(id,[特征ID])

indexArray_pairs.cache()

indexArray_pairs.take(10).foreach(x => println(x._1 + " " + x._2.toSeq))

//倒排序索引 (词ID,[文章ID])

val index_idf_pairs = indexArray_pairs.flatMap(a => a._2.map(x => (x, a._1))).groupByKey()

index_idf_pairs.take(10).foreach(x => println(x._1 + " " + x._2.toSeq))

//倒排序

val b_content = index_idf_pairs.collect.toMap

//广播全局变量

val b_index_idf_pairs = ctx.broadcast(b_content)

//广播TF-IDF特征

val b_idf_parirs = ctx.broadcast(newsIDF.collect.toMap)

//相似度计算indexArray_pairs(id,[特征ID]) b_index_idf_pairs( 124971 CompactBuffer(21520885, 21520803, 21521903, 21521361, 21524603))

val docSims = indexArray_pairs.flatMap(a => {

//将包含特征的所有文章ID

var ids: List[Long] = List()

//存放文章对应的特征

var idfs: List[(Long, SV)] = List()

//遍历特征,通过倒排序索引取包含特征的所有文章,除去自身

a._2.foreach(b => {

ids = ids ++ b_index_idf_pairs.value.get(b).get.filter(x => (!x.equals(a._1))).map(x => x.toLong).toList

})

相关文档
最新文档