使用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.总结

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

你可能感兴趣的:(nlp,spark,nlp)