Spark词频-逆文档频率

来源:互联网 发布:电脑无法识别9008端口 编辑:程序博客网 时间:2024/05/16 05:21

(文章主要来自于学习整理,好记心不如烂笔头,欢迎大家指正交流)


词频-逆文档频率(TF-IDF),是广泛应用于文本挖掘的用来反映一个词对于语料库中文档的重要性的生成特征向量的方法,用t来表示一个词,d表示一个文档,D表示文档库,词频TF(t,d)就是词t在文档d中出现的次数,文档频率DF(t,D)表示有多少个文档包含词t,如果我们只用词频来衡量重要性,将容易导致过度强调某些出现非常频繁但只装载少量信息的词,比如:"a","the"和"of",如果一个词在文档库中出现非常频繁,它意味着它不装载关于特定文档的特殊信息,逆文档频率是一个词装载信息量的一个数字化的衡量,TF-IDF展示了一个词与特定文档的相关联程度。当你构建后词频向量后,就可以使用IDF来计算逆文档频率,然后将它们与词频相乘来计算TF-IDF

代码例子:
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}


val sentenceData = spark.createDataFrame(Seq(
  (0, "Hi I heard about Spark"),
  (0, "I wish Java could use case classes"),
  (1, "Logistic regression models are neat")
)).toDF("label", "sentence")


val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData = tokenizer.transform(sentenceData)
val hashingTF = new HashingTF()
  .setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(20)
val featurizedData = hashingTF.transform(wordsData)
// alternatively, CountVectorizer can also be used to get term frequency vectors


val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(featurizedData)
val rescaledData = idfModel.transform(featurizedData)
rescaledData.select("features", "label").take(3).foreach(println)


垃圾邮件分类例子:
import org.apache.spark.mlib.classification.LogisticRegressionWithSGD


val spam = sc.textFile("spam.txt")
val normal = sc.textFile("normal.txt")


//创建一个HashingTF实例来把邮件文本映射为包含10000个特征的向量
val tf = new HashingTF(numFeatures = 10000)
//各邮件都被切分为单词,每个单词映射为一个特征
val spamFeatures = spam.map(email=>tf.transform(email.split(" ")))
val noramFeatures = normal.map(email=>tf.transform(email.split(" ")))


//创建LabeledPoint数据集,分别存放阳性(垃圾邮件)和阴性(正常邮件)的例子
val positiveExamples = spamFeatures.map(features=>LabeledPoint(1,features))
val negativeExamples = noramFeatures.map(features=>LabeledPoint(0,features))
val trainingData = positiveExamples.union(negativeExamples)
trainingData.cache() //因为逻辑回归是迭代算法,所以缓存训练数据


//使用SGD算法运行逻辑回归
val model = new LogisticRegressionWithSGD().run(trainingData)
//以阳性(垃圾邮件)与阴性(正常邮件)的例子分别进行测试
val posTest = tf.transform("0 M G GET cheap stuff...".split(" "))
val negTest = tf.transform("".split(" "))
model.predict(posTest) 

0 0
原创粉丝点击