机器学习---微博聚类案例

news/2024/5/20 7:02:01 标签: 机器学习, 聚类, 人工智能

1、微博聚类分析

        要实现广告的精准投放,需要使用聚类找出兴趣一致的用户群体,这样就需要对用户进行聚类找出行为一致的用户,当对所有用户完成聚类之后,再使用关键词分析找出每个聚类群体中的用户的讨论主题,如果主题符合广告内容或者和广告内容相关,那么当前广告就可以推荐给当前用户群体,实现精准投放广告。

2、微博营销案例

object KMeans11 {

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("KMeans1").setMaster("local[*]")
    val sc = new SparkContext(conf)

    val rdd = sc.textFile("./original.txt")
    /**
     * wordRDD 是一个KV格式的RDD
     * 	K:微博ID
     * 	V:微博内容分词后的结果 ArrayBuffer
     */
    var wordRDD = rdd.mapPartitions(iterator => {
      val list = new ListBuffer[(String, ArrayBuffer[String])]
      while (iterator.hasNext) {
        //创建分词对象
        val analyzer = new IKAnalyzer(true)
        val line = iterator.next()
        val textArr = line.split("\t")
        val id = textArr(0)
        val text = textArr(1)
        //分词
        val ts : TokenStream = analyzer.tokenStream("", text)
        val term : CharTermAttribute = ts.getAttribute(classOf[CharTermAttribute])
        ts.reset()
        
        val arr = new ArrayBuffer[String]
        while (ts.incrementToken()) {
          arr.+=(term.toString())
        }
        
        list.append((id, arr))
        analyzer.close()
      }
      list.iterator
    })
    wordRDD = wordRDD.cache() 
    

    /**
     * HashingTF 使用hash表来存储分词
     * 
     * 1000:只是计算每篇微博中1000个单词的词频   最大似然估计思想
     */
    val hashingTF: HashingTF = new HashingTF(1000)

    /**
     * tfRDD
     * K:微博ID
     * V:Vector(tf,tf,tf.....)
     * 
     * hashingTF.transform(x._2) 计算分词频数(TF)
     */
    val tfRDD = wordRDD.map(x => {
      (x._1, hashingTF.transform(x._2))
    })

    /**
     * 得到IDFModel,要计算每个单词在整个语料库中的IDF
     */
    val idf: IDFModel = new IDF().fit(tfRDD.map(_._2))

    /**
     * K:weibo ID
     * V:每一个单词的TF-IDF值
     * tfIdfs这个RDD中的Vector就是训练模型的训练集
     * 
     */
    val tfIdfs: RDD[(String, Vector)] = tfRDD.mapValues(idf.transform(_))
    
    //设置聚类个数
    val kcluster = 20
    val kmeans = new KMeans()
    kmeans.setK(kcluster)
    //使用的是kemans++算法来训练模型
    kmeans.setInitializationMode("k-means||")
    //设置最大迭代次数
    kmeans.setMaxIterations(100)

    val kmeansModel: KMeansModel= kmeans.run(tfIdfs.map(_._2))
    //    kmeansModel.save(sc, "d:/model001")

    //打印模型的20个中心点
    println(kmeansModel.clusterCenters)

    /**
     * 模型预测
     */
    val modelBroadcast = sc.broadcast(kmeansModel)
    /**
     * predicetionRDD KV格式的RDD
     * 	K:微博ID
     * 	V:分类号
     */
    val predicetionRDD = tfIdfs.mapValues(sample => {
      val model = modelBroadcast.value
      model.predict(sample)
    })
//    predicetionRDD.saveAsTextFile("d:/resultttt")

    /**
     * 总结预测结果
     * tfIdfs2wordsRDD:kv格式的RDD
     * K:微博ID
     * V:二元组(Vector(tfidf1,tfidf2....),ArrayBuffer(word,word,word....))
     */
    val tfIdfs2wordsRDD = tfIdfs.join(wordRDD)
    /**
     * result:KV
     * K:微博ID
     * V:(类别号,(Vector(tfidf1,tfidf2....),ArrayBuffer(word,word,word....)))
     */
    val result = predicetionRDD.join(tfIdfs2wordsRDD)

    /**
     * 查看0号类别中tf-idf比较高的单词,能代表这类的主题
     */
    result
      .filter(x => x._2._1 == 0)
      .flatMap(line => {
        
        val tfIdfV: Vector = line._2._2._1
        val words: ArrayBuffer[String] = line._2._2._2
        val tfIdfA: Array[Double] = tfIdfV.toArray
        
        val wordL = new ListBuffer[String]()
        val tfIdfL = new ListBuffer[Double]()
        var index = 0
        for(i <- 0 until tfIdfA.length ;if tfIdfV(i) != 0){
          wordL.+=(words(index))
          tfIdfL.+=(tfIdfA(index))
          index += 1
        }
        println(wordL.length + "===" + tfIdfL.length)
        val list = new ListBuffer[(Double, String)]
        for (i <- 0 until wordL.length) {
          list.append((tfIdfV(i), words(i)))
        }
        list
      })
      .sortBy(x => x._1, false)
      .map(_._2)
      .distinct()
      .take(30).foreach(println)
    sc.stop()
  }
}


http://www.niftyadmin.cn/n/5261717.html

相关文章

一篇文章让你快速入门Redis(含安装使用客户端)

声明&#xff1a;文章内容皆取于学习黑马课程、若想了解原版内容请去B站了解黑马程序员Redis课程 1.Redis入门篇 1.什么是Redis Redis全称为Remote Dictionary Server,远程词典服务器,基于内存的键值型NoSQL数据库 NoSQL(Not only SQL)是对不同于传统的关系数据库的数据库管…

XCP详解「4.2·问题-加载信号过多导致FIFO buffer overflow」

APE write报问题 报文也提示80 溢出 检查测量配置

c语言:初识指针

目录 目录 目录 CPU与内存协同工作 访问内存中的“房间” 基础数据类型怎样居住“房间” 取地址运算符 & 声明指针类型的变量 定义 指针类型 空间大小 小结 使用指针 取值运算符 * 指针类型的大小 强制转换指针类型 CPU与内存协同工作 以整型加法为例&…

pytorch中的归一化:BatchNorm、LayerNorm 和 GroupNorm

1 归一化概述 训练深度神经网络是一项具有挑战性的任务。 多年来&#xff0c;研究人员提出了不同的方法来加速和稳定学习过程。 归一化是一种被证明在这方面非常有效的技术。 1.1 为什么要归一化 数据的归一化操作是数据处理的一项基础性工作&#xff0c;在一些实际问题中&am…

VUE篇之日历组件

1.简单日历组件展示 思路&#xff1a;根据当前月的第一天是星期几&#xff0c;来显示日期 <template><div class"wrap"><el-button click"preMonth">上个月</el-button><el-tag>当前年份{{ curYear }}</el-tag><e…

FL Studio20官方体验版如何破解?

水果音乐制作软件FL Studio20是一款功能强大的软件音乐制作环境或数字音频工作站&#xff08;DAW&#xff09;&#xff0c;本文主要针对FL Studio 20怎么安装&#xff1f;以及水果软件FL Studio 20如何破解的问题&#xff0c;来为大家带来了水果软件FL Studio 20安装破解图文详…

0x03 前缀和与差分

0x03 前缀和与差分 1.前缀和 对于一个给定的数组A&#xff0c;它的前缀和数列S是通过递推能求出的基本信息之一&#xff1a; S [ i ] ∑ j 1 i A [ j ] S [ i ] S [ i − 1 ] A [ i ] S[i]\sum_{j1}^iA[j] \\ S[i]S[i-1]A[i] S[i]j1∑i​A[j]S[i]S[i−1]A[i] 一个部分和…

【Git从入门到精通 | 02】.gitignore忽略文件不生效怎么办?

这是机器未来的第64篇文章 原文首发地址&#xff1a;https://robotsfutures.blog.csdn.net/article/details/134989872 《Git源码版本管理系列》快速导航&#xff1a; 【Git从入门到精通 | 01】企业Git使用github工作流最佳实践 文章目录 1. 问题场景2. 原因解析3. 处理办法 写…