將結合前述知識進行綜合實戰,以達到所學即所用。文本情感分類這個項目會將分類算法、文本特徵提取算法等進行關聯,使你們可以對Spark的具體應用有一個總體的感知與瞭解。html
TF(t,d)
是術語t出如今文檔d中的次數,而文檔頻率DF(t,D)
是包含術語的文檔數T若是咱們僅使用術語頻率來衡量重要性,那麼過度強調常常出現但不多提供有關文檔的信息的術語很是容易,例如: 「a」,「the」和「of」。 若是術語在語料庫中常常出現,則表示它不包含有關特定文檔的特殊信息。git
其中| D |
是語料庫中的文檔總數。因爲使用了對數,若是一個術語出如今全部文檔中,其IDF值將變爲0. 請注意,應用平滑術語以免語料庫外的術語除以零。github
TF-IDF
測量僅僅是TF和IDF的乘積
術語頻率和文檔頻率的定義有幾種變體。在MLlib中,咱們將TF和IDF分開以使它們變得靈活。算法
HashingTF
是一個轉換器,它接受一組術語並將這些集合轉換爲固定長度特徵向量。 在文本處理中,「一組術語」多是一些單詞。HashingTF
利用散列技巧。經過應用散列函數將原始特徵映射到索引(術語)。這裏使用的哈希函數是MurmurHash 3.而後,基於映射的索引計算術語頻率。這種方法避免了計算全局術語到索引映射的須要,這對於大型語料庫來講多是昂貴的,可是它遭受潛在的哈希衝突,其中不一樣的原始特徵可能在散列以後變成相同的術語。爲了減小衝突的可能性,咱們能夠增長目標特徵維度,即哈希表的桶的數量。因爲散列值的簡單模數用於肯定向量索引,所以建議使用2的冪做爲要素維度,不然要素將不會均勻映射到向量索引。默認要素尺寸爲218 = 262,144218 = 262,144。可選的二進制切換參數控制術語頻率計數。設置爲true時,全部非零頻率計數都設置爲1.這對於模擬二進制而非整數計數的離散機率模型特別有用。apache
CountVectorizer將文本文檔轉換爲術語計數向量bash
IDF:IDF是一個Estimator,它適合數據集並生成IDFModel。 IDFModel採用特徵向量(一般從HashingTF或CountVectorizer建立)並縮放每一個特徵。直觀地說,它下降了在語料庫中頻繁出現的特徵。機器學習
注意:spark.ml不提供文本分割工具.函數
在下面的代碼段中,咱們從一組句子開始。咱們使用Tokenizer將每一個句子分紅單詞。對於每一個句子(單詞包),咱們使用HashingTF將句子散列爲特徵向量。咱們使用IDF從新縮放特徵向量;這一般會在使用文本做爲功能時提升性能。而後咱們的特徵向量能夠傳遞給學習算法。工具
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
val sentenceData = spark.createDataFrame(Seq(
(0.0, "Hi I heard about Spark"),
(0.0, "I wish Java could use case classes"),
(1.0, "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("label", "features").show()
複製代碼
代碼 性能
data.show(false)
println(neg.count(),data.count())//合併
result.show(false)
println(s"""accuracy is $accuracy""")