1. 程式人生 > >Spark-初探-文字分類

Spark-初探-文字分類

Spark機器學習文字分類

背景

由於專案組需要對爬蟲獲取的文字進行歸類,最初使用正則表示式按照想到的規則進行解析分類,後來發現這種方式不夠靈活,而且不能窮舉所有的可能。所以專案組覺得使用最近比較流行的機器學習相關的知識去處理。

相關知識

再對文字進行分類之前,需要先對文字進行分詞,然後將分詞轉換為特徵向量,使用機器學習演算法模型對特徵向量和已經知道的標籤資料進行模型擬合,產生理想的模型,通過理想的模型進行預測未來產生的資料

分詞

英文分詞

英文文件已經天然的分好詞,根據空格字元就可以做出很精準的分詞,只要控制好停用詞即可。以下是spark已經為我們封裝好的英文分詞和停用詞API使用介紹。

import org.apache.spark.ml.feature.Tokenizer
import org.apache.spark.sql.functions._
val sentenceDataFrame = spark.createDataFrame(Seq(
  (0, "Hi I heard about Spark"),
  (1, "I wish Java could use case classes"),
  (2, "Logistic,regression,models,are,neat")
)).toDF("id", "sentence")
val tokenizer =
new Tokenizer().setInputCol("sentence").setOutputCol("words") val tokenized = tokenizer.transform(sentenceDataFrame) tokenized.select("sentence", "words").show(false)

以上程式碼輸出結果

+-----------------------------------+------------------------------------------+
|sentence                           |words                                     |
+-----------------------------------+------------------------------------------+
|Hi I heard Spark about Spark       |[hi, i, heard, spark, about, spark]       |
|I wish Java could use case classes |[i, wish, java, could, use, case, classes]|
|Logistic regression models are neat|[logistic, regression, models, are, neat] |
+-----------------------------------+------------------------------------------+

中文分詞

中文分詞比英文分詞複雜很多,需要根據中文語義和中文詞典進行分詞。還好關於中文分詞的工具很多大牛已經幫我們做好了,我們只要根據API去呼叫即可。本人在實踐中最初使用了IKAnalysis,但是發現IKAnalysis分詞器的效能很差,幾百萬的行的文字分詞竟然跑不出來。後來,在同事的推薦下使用了HanNlp中文分詞器,解決了效能上面的瓶頸。

詞向量轉化工具

TF-IDF

TF-IDF是一種統計方法,用以評估一字詞對於一個檔案集或一個語料庫中的其中一份檔案的重要程度。字詞的重要性隨著它在檔案中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜尋引擎應用,作為檔案與使用者查詢之間相關程度的度量或評級。
關於TF-IDF的計算公式如下:
TFIDF=TF×IDFTFIDF=TF × IDF
TF(Term Frequency)是一個單詞在當前文件中的出現次數除以當前文件總詞頻,計算公式如下:
TFi,j=Ni,jkNk,jTF_i,_j=\frac{N_i,_j}{\sum_{k}N_k,_j}
IDF(Invest Document Frequency) 逆文字頻率指數,是等於總的文件數除以包含制定詞的文件數。計算公司如下:
IDF=lgDj:tidjIDF=\lg\frac{|D|}{|j:t_i∈d_j|}

  • |D|:是總的文件集合的總數量
  • 分母:是詞ti出現的文件數

TF-IDF的值越大說明這個詞在文件中的地位越高。如果一個詞在所有的文件裡面都出現,那麼IDF的值等於0,TF-IDF的值也等於0,就算這個詞在文件中出現的頻率再高,對分析沒有什麼參考價值。
spark關於TF-IDF也有對應的API,程式碼

import org.apache.spark.ml.feature.IDF
hahingTF = new HashingTF()
  .setInputCol("words")
  .setOutputCol("rawFeatures").
  setNumFeatures(20)  // 設定特徵向量數
val featurizedData = hashingTF.transform(wordsData)
val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(featurizedData)

val rescaledData = idfModel.transform(featurizedData)
rescaledData.select("label", "features").show()

程式碼使用HashingTF模型將前面已經分好的word詞轉化為詞頻向量,使用rawFeatures欄位裡面,然後使用IDF模型將rawFeatures欄位轉化為詞向量放在features欄位裡面。features欄位就是我們想要得到的特徵向量。程式碼輸出結果如下:

+-----+------------------------------------------+--------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|label|words                                     |rawFeatures                                                                           |features                                                                                                                                                                                        |
+-----+------------------------------------------+--------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|0.0  |[hi, i, heard, spark, about, spark]       |(262144,[24417,49304,73197,91137,234657],[1.0,1.0,1.0,1.0,2.0])                       |(262144,[24417,49304,73197,91137,234657],[0.28768207245178085,0.6931471805599453,0.6931471805599453,0.6931471805599453,1.3862943611198906])                                                     |
|0.0  |[i, wish, java, could, use, case, classes]|(262144,[20719,24417,55551,116873,147765,162369,192310],[1.0,1.0,1.0,1.0,1.0,1.0,1.0])|(262144,[20719,24417,55551,116873,147765,162369,192310],[0.6931471805599453,0.28768207245178085,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453])|
|1.0  |[logistic, regression, models, are, neat] |(262144,[13671,91006,132713,167122,190884],[1.0,1.0,1.0,1.0,1.0])                     |(262144,[13671,91006,132713,167122,190884],[0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453])                                                    |
+-----+------------------------------------------+--------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Word2Vec

Word2Vec是一個估計器,它獲取表示文件的單詞序列,並訓練Word2VecModel。該模型將每個單詞對映到一個唯一的固定大小向量。Word2VecModel使用文件中所有單詞的平均值將每個文件轉換為向量;然後這個向量可以用作預測、文件相似度計算等的特徵。 以下是關於word2vec的spark使用案例

import org.apache.spark.ml.feature.Word2Vec
import org.apache.spark.ml.linalg.Vector
val word2Vec = new Word2Vec()
  .setInputCol("words")
  .setOutputCol("features")
  .setVectorSize(3)  // 設定特徵向量數
  .setMinCount(0)
val model = word2Vec.fit(tokenized)
val result = model.transform(tokenized)
result.show(false)

程式碼輸出結果:

+-----+-----------------------------------+------------------------------------------+-----------------------------------------------------------------+
|label|sentence                           |words                                     |features                                                         |
+-----+-----------------------------------+------------------------------------------+-----------------------------------------------------------------+
|0.0  |Hi I heard Spark about Spark       |[hi, i, heard, spark, about, spark]       |[-0.027734022897978623,-0.028992994998892147,0.06874776010711987]|
|0.0  |I wish Java could use case classes |[i, wish, java, could, use, case, classes]|[0.040505675066794665,0.019249096512794495,-0.027486081767295088]|
|1.0  |Logistic regression models are neat|[logistic, regression, models, are, neat] |[0.035547485947608946,0.016720289736986162,0.02818153351545334]  |
+-----+-----------------------------------+------------------------------------------+-----------------------------------------------------------------+

迴歸和分類

關於迴歸和分類的模型在機器學習中有很多,本人初次接觸機器學習,也只是大概知道有這麼些模型,關於模型的具體理論和使用,是本人後面學習的目標。這裡只是列舉以下。

迴歸模型

  • 線性迴歸
  • 決策樹迴歸
  • 隨機森林
  • 梯度提升樹

分類模型

  • 決策數分類
  • 隨機森林
  • 梯度提升樹
  • 神經網路 - 多層感知器分類
  • 朴樹貝葉斯分類

實踐

本人使用TF-IDF對分詞後的文件進行詞向量轉化,然後使用神經網路-多層感知器分類。傳輸層我定義4層,輸入層+2層隱藏層+輸出層

import org.apache.spark.ml.classification.MultilayerPerceptronClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
val layers = Array[Int](1000, 60, 50, 10)  // 輸入一個1000個特徵的向量,第一個隱藏層60個節點,第二個隱藏層50個節點,輸出10個分類。
val trainer = new MultilayerPerceptronClassifier()
  .setLayers(layers)
  .setBlockSize(128)
  .setSeed(1234L)
  .setMaxIter(100)
  val model = trainer.fit(trainingDF)
  val preceptronDF = model.transform(testDF)
  val evaluator = new MulticlassClassificationEvaluator()
  .setMetricName("accuracy")
  println("測試資料預測準確度 = " + evaluator.evaluate(predictionAndLabels))

由於資料安全性考慮,本人不在這裡給出真實資料執行結果。以上引數執行70萬行文字進行模型訓練,30萬行文字進行模型測試,準確度能夠達到98%左右。

總結

本人這次接觸機器學習,並使用機器學習在專案中實踐和應用,我感到成長了很多。雖然這次只是知道機器學習的簡單使用,對一些複雜的模型不是很清楚原理,這也將激發我繼續學下去的動力。對於機器學習,很多時候還是要多動動手,同事模型選擇和預測資料的準備也很重要,選對模型,準備好正確的資料,那麼我們就可以行動啦。

相關推薦

Spark-初探-文字分類

Spark機器學習文字分類背景相關知識實踐總結 背景 由於專案組需要對爬蟲獲取的文字進行歸類,最初使用正則表示式按照想到的規則進行解析分類,後來發現這種方式不夠靈活,而且不能窮舉所有的可能。所以專案組覺得使用最近比較流行的機器學習相關的知識去處理。 相關知識 再

spark中文文字分類

最近要做一個點評中文的文字分類模型,想在spark中訓練模型,然後通過把tf過程、idf過程、以及模型封裝到一個類裡面一個java類中,然後寫到redis中,但是spark中idf過程中碰到一些困難,忘高手賜教,先看下面程式碼: package com.meituan.s

利用spark文字分類(樸素貝葉斯模型)

樸素貝葉斯模型 樸素貝葉斯法是基於貝葉斯定理與特徵條件獨立假設的分類方法。對於給定的訓練資料集,首先基於特徵條件獨立假設學習輸入/輸出的聯合概率分佈;然後基於此模型,對給定的輸入x,利用貝葉斯定理求出後驗概率最大的輸出y。至於樸素貝葉斯模型的原理部分,這裡就不

Spark MLlib實現的中文文字分類–Naive Bayes

文字分類是指將一篇文章歸到事先定義好的某一類或者某幾類,在資料平臺的一個典型的應用場景是,通過爬取使用者瀏覽過的頁面內容,識別出使用者的瀏覽偏好,從而豐富該使用者的畫像。 本文介紹使用Spark MLlib提供的樸素貝葉斯(Naive Bayes)演算法,完成對中文文字的

Spark下實現LDA+SVM的文字分類處理

最新發布的Spark1.3.1版本中已經實現了LDA的演算法,並且以前實現過LDA+SVM進行文字分類的處理程式,藉此機會想將程式改為Spark的分散式,Spark已經支援SVM和LDA演算法。Spa

基於NaiveBayes的文字分類Spark實現

 在嘗試了python下面用sklearn進行文字分類(http://blog.csdn.net/a_step_further/article/details/50189727)後,我們再來看下用spark如何實現文字分類的工作,採用的演算法同樣是樸素貝葉斯。    此

基於的樸素貝葉斯的文字分類(附完整程式碼(spark/java)

本文主要包括以下內容: 1)模型訓練資料生成(demo) 2 ) 模型訓練(spark+java),資料儲存在hdfs上 3)預測資料生成(demo) 4)使用生成的模型進行文字分類。 一、訓練資料生成 spark mllib模型訓練的輸入資料格

Spark ML下實現的多分類adaboost+naivebayes演算法在文字分類上的應用

1. Naive Bayes演算法 樸素貝葉斯演算法算是生成模型中一個最經典的分類演算法之一了,常用的有Bernoulli和Multinomial兩種。在文字分類上經常會用到這兩種方法。在詞袋模型中,對於一篇文件$d$中出現的詞$w_0,w_1,...,w_n$, 這篇文章

如何用 Spark 深度整合 Tensorflow 實現文字分類

這篇文章會分成以下 7 個部分:開發環境準備PySpark 基礎:基於 Dataframe 的 wordcount 實現PySpark MLlib 基礎-自動化特徵工程Tensorflow 基礎:Tensorflow 的編碼套路深度學習與 NLP 基礎:如何用深度學習完成 N

Spark垃圾郵件分類(scala+java)

name pac algorithm over email @override logistic es2017 AMF Java程序 import java.util.Arrays; import org.apache.spark.SparkConf; im

5.1、文字分類

1、樸素貝葉斯 NB   三大概率     1、條件概率       Ω是全集,A、B是其中的事件(子集),p是事件發生的概率,則:p(A | B) = p(AB) / p(B),事件B發生,A發生的概率              

tensorflow 教程 文字分類 IMDB電影評論

昨天配置了tensorflow的gpu版本,今天開始簡單的使用一下 主要是看了一下tensorflow的tutorial 裡面的 IMDB 電影評論二分類這個教程 教程裡面主要包括了一下幾個內容:下載IMDB資料集,顯示資料(將陣列轉換回評論文字),準備資料,建立模型(隱層設定,優化器和損失函式的配置),

使用條件隨機場模型解決文字分類問題(附Python程式碼)

對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站!http://www.tensorflownews.com。我們的公眾號:磐創AI。   一. 介紹 世界上每天都在生成數量驚人的文字資料。Google每秒處理超過40,000次搜尋,而根據福布斯報道,

斯坦福大學-自然語言處理入門 筆記 第六課 文字分類與樸素貝葉斯

一、文字分類任務概述 1、應用領域 歸類 垃圾郵件識別 作者識別 性別/年齡識別 等等 2、定義 輸入:一個文件d,一系列固定的型別C={c1,c2,…,cj} 輸出:預測類別c ∈ C 3、分類方法

基於協同訓練的半監督文字分類演算法

標籤: 半監督學習,文字分類 作者:煉己者 --- 本部落格所有內容以學習、研究和分享為主,如需轉載,請聯絡本人,標明作者和出處,並且是非商業用途,謝謝! 如果大家覺得格式看著不舒服,也歡迎大家去看我的簡書 半監督學習文字分類系列 用半監督演算法做文字分類(sklearn) sklearn半監督學習(

文字分類-TextCNN

簡介 TextCNN模型是由 Yoon Kim提出的Convolutional Naural Networks for Sentence Classification一文中提出的使用卷積神經網路來處理NLP問題的模型.相比較nlp中傳統的rnn/lstm等模型,cnn能更加高效的提取重要特徵,這些特徵在分類

【線上直播】人工智慧中的文字分類技術

講師:黃鴻波                            講師簡介: 珠海金山辦公軟體有限公司(WPS)人工智慧領域專家,高階演算法工

使用機器學習完成中文文字分類

資料集來自七月線上練習 import jieba import pandas as pd import random from sklearn.model_selection import train_test_split #劃分訓練/測試集 from sk

文字分類——快速kNN設計實現

內容提要 介紹 普通kNN實現 快速kNN實現 實驗對比 分析總結 介紹   文字分類——常見分類模型   kNN分類模型的主要思想:通過給定一個未標註文件d,分類系統在訓練集中查詢與它距離最接近的k篇相鄰(相似或相同)標註

文字分類——NLV演算法研究與實現

內容提要 1 引言 2 NLV演算法理論 2.1 訓練模型 2.2 分類模型 3 NLV演算法實現 3.1 演算法描述 4 實驗及效能評估 4.1 實驗設計 4