新闻热点发现的设计与实现(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
})