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