mac单机简单实现一个Spark-特征抽取(TF-IDF)。
TF-IDF原理:
词频TF(t,d)是某个词t在文档d中出现的次数。
文档频率DF(t,D)是包含词t的文档d的数目。
如果我们仅使用词频来衡量重要性,则很容易过分强调那些出现非常频繁但携带很少与文档相关信息量的词。比如:的,地,得一类的。
如果一个词在在语料库中出现非常频繁,意味着它更不能携带特定文档的特定信息。逆文档频率就是一个用于度量一个词能提供多少信息量的数值:
具体定义:
IDF(t,D)=log |D|/(DF(t,D)+1)
TFIDF(t,d,D)=TF(t,d)×IDF(t,D)
在SparkML库中,TF-IDF被分为两部分:TF和IDF 已经实现了,可以直接调用。
代码如下(选取了一个中文例子,英文试了也适用):
import org.apache.spark.sql.{DataFrame, Row, SparkSession}
import org.apache.spark.ml.feature.{HashingTF, _}
object HFTest {
def main(args: Array[String]) {
val spark = SparkSession
.builder
.appName("HFTest")
.getOrCreate()
val sentenceDataFrame = spark.createDataFrame(Seq(
(0, "一种 简单 的 文本 特征 提取 算法"),
(1, "特征 提取 算法"),
(2, "一种 简单")
)).toDF("id", "sentence")
val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
var wordData = tokenizer.transform(sentenceDataFrame)
wordData.select("sentence", "words").show(false)
//HashingTF是一个Transformer,文本处理中接收词条的集合然后把这些集合转换成固定长度的特征向量
//这个算法在哈希的同时会统计各个词条的词频
var hashingTF = new HashingTF()
.setInputCol("words").setOutputCol("tf")
val tf= hashingTF.transform(wordData)
tf.cache()
tf.show(false)
val idf=new IDF().setInputCol("tf").setOutputCol("features").fit(tf)
val tfidf =idf.transform(tf)
println("tfidf: ")
tfidf.show(false)
spark.stop()
}
}
输出:
代码中没有设定HashingTF的大小,系统默认给了262144,如果是集群上设为100万+也是可以的。
+---+-------------------+---------------------------+---------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|id |sentence |words |tf |features |
+---+-------------------+---------------------------+---------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|0 |一种 简单 的 文本 特征 提取 算法|[一种, 简单, 的, 文本, 特征, 提取, 算法]|(262144,[40925,60063,110521,111586,112201,238030,260200],[1.0,1.0,1.0,1.0,1.0,1.0,1.0])|(262144,[40925,60063,110521,111586,112201,238030,260200],[0.28768207245178085,0.28768207245178085,0.6931471805599453,0.28768207245178085,0.28768207245178085,0.6931471805599453,0.28768207245178085])|
|1 |特征 提取 算法 |[特征, 提取, 算法] |(262144,[60063,111586,260200],[1.0,1.0,1.0]) |(262144,[60063,111586,260200],[0.28768207245178085,0.28768207245178085,0.28768207245178085]) |
|2 |一种 简单 |[一种, 简单] |(262144,[40925,112201],[1.0,1.0]) |(262144,[40925,112201],[0.28768207245178085,0.28768207245178085]) |
+---+-------------------+---------------------------+---------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
网友评论