Spark機器學習實戰 (十一) - 文本情感分類項目實戰

0 相關源碼

將結合前述知識進行綜合實戰,以達到所學即所用。文本情感分類這個項目會將分類算法、文本特徵提取算法等進行關聯,使大家能夠對Spark的具體應用有一個整體的感知與瞭解。

1 項目總體概況

2 數據集概述

3 數據預處理

Spark機器學習實戰 (十一) - 文本情感分類項目實戰

4 文本特徵提取

  • 官方文檔介紹
    Spark機器學習實戰 (十一) - 文本情感分類項目實戰
    提取,轉換和選擇特徵
    本節介紹了使用特徵的算法,大致分爲以下幾組:
  • 提取:從“原始”數據中提取特徵
  • 轉換:縮放,轉換或修改特徵
  • 選擇:從中選擇一個子集一組更大的特徵局部敏感散列(LSH):這類算法將特徵變換的各個方面與其他算法相結合。
    (TF-IDF) 是在文本挖掘中廣泛使用的特徵向量化方法,以反映術語對語料庫中的文檔的重要性。
    用t表示一個術語,用d表示文檔,用D表示語料庫。術語頻率TF(t,d)是術語t出現在文檔d中的次數,而文檔頻率DF(t,D)是包含術語的文檔數T

如果我們僅使用術語頻率來衡量重要性,那麼過分強調經常出現但很少提供有關文檔的信息的術語非常容易,例如: “a”,“the”和“of”。
如果術語在語料庫中經常出現,則表示它不包含有關特定文檔的特殊信息。

  • 反向文檔頻率是術語提供的信息量的數字度量:
    Spark機器學習實戰 (十一) - 文本情感分類項目實戰

其中| D |是語料庫中的文檔總數。由於使用了對數,如果一個術語出現在所有文檔中,其IDF值將變爲0.
請注意,應用平滑術語以避免語料庫外的術語除以零。

  • TF-IDF測量僅僅是TF和IDF的乘積
    Spark機器學習實戰 (十一) - 文本情感分類項目實戰

術語頻率和文檔頻率的定義有幾種變體。在MLlib中,我們將TF和IDF分開以使它們變得靈活。

TF:HashingTF和CountVectorizer都可用於生成術語頻率向量。

HashingTF是一個轉換器,它接受一組術語並將這些集合轉換爲固定長度特徵向量。
在文本處理中,“一組術語”可能是一些單詞。HashingTF利用散列技巧。通過應用散列函數將原始特徵映射到索引(術語)。這裏使用的哈希函數是MurmurHash 3.然後,基於映射的索引計算術語頻率。這種方法避免了計算全局術語到索引映射的需要,這對於大型語料庫來說可能是昂貴的,但是它遭受潛在的哈希衝突,其中不同的原始特徵可能在散列之後變成相同的術語。爲了減少衝突的可能性,我們可以增加目標特徵維度,即哈希表的桶的數量。由於散列值的簡單模數用於確定向量索引,因此建議使用2的冪作爲要素維度,否則要素將不會均勻映射到向量索引。默認要素尺寸爲218 = 262,144218 = 262,144。可選的二進制切換參數控制術語頻率計數。設置爲true時,所有非零頻率計數都設置爲1.這對於模擬二進制而非整數計數的離散概率模型特別有用。

CountVectorizer將文本文檔轉換爲術語計數向量

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()

5 訓練分類模型

  • 代碼
    Spark機器學習實戰 (十一) - 文本情感分類項目實戰

  • data.show(false)
  • println(neg.count(),data.count())//合併
    Spark機器學習實戰 (十一) - 文本情感分類項目實戰

  • result.show(false)
  • println(s"""accuracy is $accuracy""")
    Spark機器學習實戰 (十一) - 文本情感分類項目實戰

6 Spark機器學習實踐系列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章