使用Spark+Hanlp进行简单的文本处理(中)-Kmeans文本聚类

文本聚类

1. TFIDF

TFIDF全程叫做term frequency–inverse document frequency,即文本频率与逆文档频率指数, TFIDF就是为了表征一个token的重要程度,如果这个token出现的频数很高,出现的频数这个因素就叫做TF,IDF即逆文档频率,就是所有文档的条数与有某词的文档条数的比值的对数,减少“的,了”等频率过高又无意义的词语干扰。
TFIDF是个词袋模型。
Spark有相关的接口

1.导包
import com.hankcs.hanlp.dictionary.stopword.CoreStopWordDictionary
import com.hankcs.hanlp.summary.TextRankKeyword
import com.hankcs.hanlp.tokenizer.StandardTokenizer
import org.apache.hadoop.io.BytesWritable
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.ml.feature.{HashingTF, IDF}
import scala.collection.JavaConversions._
2.读数

def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("GenDClogExample")
    val spark = SparkSession.builder().config(conf).getOrCreate()
    val sc = spark.sparkContext
    
    //自行读取一份文本数据吧
    val click_df = genclickdata(sc,spark)
    //分词,分词可以参考上一篇文章代码
    val words_df = Sentence2Words(click_df,spark)
    //提取下,两列 文本和分词的文本 : String,List[String]
    val docs = words_df.select("desc","desc_all_word")

3. TF-IDF
    //求tf
    val hashingTF = new HashingTF().setInputCol("desc_all_word").setOutputCol("rawFeatures").setNumFeatures(2000)
    val featurizedData = hashingTF.transform(docs)

    //求IDF
    val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
    val idfModel = idf.fit(featurizedData)
    val rescaledData = idfModel.transform(featurizedData).cache()
    
    rescaledData.show(false)

2. K-means

kmeans是比较普遍的聚类算法了,spark有相关的api,可以自行谷歌相关示例.这里根据上面的结果数据直接调取kmeans api即可,对于中心点数的选择也可以采用遍历的方式选择


    val kmeans = new KMeans().setK(25).setSeed(1L)
    val model = kmeans.fit(rescaledData)
    val WSSSE = model.computeCost(rescaledData)
    model.clusterCenters

    val output = model.transform(rescaledData)
    output.schema
    val re_df = output.select("desc","prediction")
    re_df.show(false)

3.总结

很简单的直接掉包进行文本分词聚类分析,然后看看中心数据,不需要标注数据,建立词典等人工操作,当然效果应该很一般,但是胜在操作方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值