1. 程式人生 > >Spark-特徵抽取(TF-IDF)

Spark-特徵抽取(TF-IDF)

Spark特徵抽取,基於scala實現TF-IDF例項。
特徵抽取:從原始資料中抽取特徵。

TF-IDF原理

TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術, TFIDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。TFIDF實際上是:TF * IDF,TF詞頻(Term Frequency),IDF反文件頻率(Inverse Document Frequency)。TF表示詞條在文件d中出現的頻率。IDF的主要思想是:如果包含詞條t的文件越少,也就是n越小,IDF越大,則說明詞條t具有很好的類別區分能力。如果某一類文件C中包含詞條t的文件數為m,而其它類包含t的文件總數為k,顯然所有包含t的文件數n=m + k,當m大的時候,n也大,按照IDF公式得到的IDF的值會小,就說明該詞條t類別區分能力不強。但是實際上,如果一個詞條在一個類的文件中頻繁出現,則說明該詞條能夠很好代表這個類的文字的特徵,這樣的詞條應該給它們賦予較高的權重,並選來作為該類文字的特徵詞以區別與其它類文件。這就是IDF的不足之處。

具體的定義

假設t表示一個詞,d表示一片文件,D是語料庫中文件總數。
詞頻TF(t,d)是某個詞t在文件d中出現的次數。
文件頻率DF(t,D)是包含詞t的文件d的數目。
如果我們僅使用詞頻來衡量重要性,則很容易過分強調那些出現非常頻繁但攜帶很少與文件相關資訊量的詞。
比如英語中的“a”、“the”和“of”。如果一個詞在在語料庫中出現非常頻繁,意味著它更不能攜帶特定文件的特定資訊。逆文件頻率就是一個用於度量一個詞能提供多少資訊量的數值:

IDF(t,D)=log |D|/(DF(t,D)+1)

TFIDF(t,d,D)=TF(t,d)×IDF(t,D)

在SparkML庫中,TF-IDF被分為兩部分:TF和IDF


TF:HashingTF 是一個Transformer,在文字處理中,接收詞條的集合然後把這些集合轉化成固定長度的特徵向量。這個演算法在雜湊的同時會統計各個詞條的詞頻。
IDF:IDF是一個Estimator,在一個數據集上應用它的fit()方法,產生一個IDFModel。 該IDFModel 接收特徵向量(由HashingTF產生),然後計算每一個詞在文件中出現的頻次。IDF會減少那些在語料庫中出現頻率較高的詞的權重。

具體的Spark例項

tfidf.txt的檔案如下:

i heard about spark and i love spark
i wish java could use case
classes logistic regression models are neat

例項程式碼如下:

package FeatureExtractionAndTransformation

import org.apache.spark.mllib.feature.{IDF, HashingTF}
import org.apache.spark.{SparkContext, SparkConf}

/**
 * Created by xudong on 2017/5/24.
 */
object TFIDFLearning {

  /**
   * TF-IDF是一種簡單的文字特徵提取演算法
   * 詞頻tf:某個關鍵詞在文字中出現的次數
   * 逆文件頻率idf:大小與一個詞的常見程度成反比
   * tf=某個詞在文章中出現的次數/文章的總詞數
   * idf=log(查詢的文章總數/(包含該詞的文章數+1))
   * tf-idf=tf * idf
   * 未考慮去除停用詞(輔助詞副詞介詞等)和語義重構(資料探勘,資料結構 =》資料,挖掘;資料,結構  50%)
   *
   */

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("tf-idfExamples").setMaster("local")
    val sc=new SparkContext(conf)

    //載入文件(one per line)一行是一個文件
    val documents=sc.textFile("e:/tfidf.txt").map(_.split(" ").toSeq)

    //HashingTF是一個Transformer,文字處理中接收詞條的集合然後把這些集合轉換成固定長度的特徵向量
    //這個演算法在雜湊的同時會統計各個詞條的詞頻
    val hashingTF=new HashingTF()
    val tf=hashingTF.transform(documents)

    tf.cache()
    //idf是一個Estimator,在一個數據集上應用fit方法,產生一個IDFModel
    //該IDFModel接收特徵向量(由HashingTF產生),然後計算每一個詞在文件中出現的頻次
    //IDF會減少那些在語料庫中出現頻率較高的詞的權重。

    /**
     * Spark.mllib 中實現詞頻率統計使用特徵hash的方式,原始特徵通過hash函式,對映到一個索引值。
     * 後面只需要統計這些索引值的頻率,就可以知道對應詞的頻率。
     * 這種方式避免設計一個全域性1對1的詞到索引的對映,這個對映在對映大量語料庫時需要花費更長的時間。
     * 但需要注意,通過hash的方式可能會對映到同一個值的情況,即不同的原始特徵通過Hash對映後是同一個值。
     * 為了降低這種情況出現的概率,我們只能對特徵向量升維。
     * i.e., 提高hash表的桶數,預設特徵維度是 2^20 = 1,048,576.
     */

     tf.foreach(println)

    /**
     * (1048576,[105,96727,182130,336781,585782,586461],[2.0,1.0,1.0,1.0,1.0,2.0])
     * (1048576,[105,79910,109090,116103,479425,503975,949040],[1.0,1.0,1.0,1.0,1.0,1.0,1.0])
     * (1048576,[96852,225888,231466,491585,748138],[1.0,1.0,1.0,1.0,1.0])
     * tf 的輸出值 1048576表示的是hash表的桶數(預設值)
     * 105,96727等代表單詞的hash值,後面是出現的次數
     */

    val idf=new IDF().fit(tf)
    val tfidf =idf.transform(tf)

    println("tfidf: ")
    tfidf.foreach(x => println(x))

  /**tdidf--結果輸出
     * (1048576,[105,96727,182130,336781,585782,586461],[0.5753641449035617,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,1.3862943611198906])
     * (1048576,[105,79910,109090,116103,479425,503975,949040],[0.28768207245178085,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453])
     * (1048576,[96852,225888,231466,491585,748138],[0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453,0.6931471805599453])
     */
//後面的數值是每個單詞的在各文件的tfidf值

    //支援忽略詞頻低於文件最小數,需要把minDocFreq這個數傳給IDF函式。
    // 在此情況下,對應的IDF值設定為0
/*  val idfIgnore=new IDF(minDocFreq = 2).fit(tf)
    val idfIgnore=new IDF(minDocFreq = 2).fit(tf)
    val tfidfIgnore=idfIgnore.transform(tf)
    println("tfidfIgnore: ")
    tfidfIgnore.foreach(x => println(x))
*/

    sc.stop()
  }
}

相關推薦

Spark-特徵抽取TF-IDF

Spark特徵抽取,基於scala實現TF-IDF例項。 特徵抽取:從原始資料中抽取特徵。 TF-IDF原理 TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術, T

三種文字特徵提取TF-IDF/Word2Vec/CountVectorizer

另一類最近比較流行的模型是把每一個單詞表示成一個向量。這些模型一般是基於某種文字中與單詞共現相關的統計量來構造。一旦向量表示算出,就可以像使用TF-IDF向量一樣使用這些模型(例如使用它們作為機器學習的特徵)。一個比較通用的例子是使用單詞的向量表示基於單詞的含義計算兩個單詞的相似度。Word2Vec就是這些

文本分類學習 特征權重TF/IDF和特征提取

才會 有用 卡方檢驗 改變 其中 關於 思想 意義 bsp 上一篇中,主要說的就是詞袋模型。回顧一下,在進行文本分類之前,我們需要把待分類文本先用詞袋模型進行文本表示。首先是將訓練集中的所有單詞經過去停用詞之後組合成一個詞袋,或者叫做字典,實際上一個維度很大的向量。這樣每個

機器學習——文字分類TF-IDF

首先,文字資料屬於非結構化資料,一般要轉換成結構化的資料,一般是將文字轉換成“文件-詞頻矩陣”,矩陣中的元素使用詞頻或者TF-IDF。 TF-IDF的主要思想是:如果某一個詞或短語在一篇文章中出現的頻率高,並且在其他文章中很少出現,則認為此詞或短語具有很好的類別區分能力,適

《數學之美》第11章—如何確定網頁和查詢的相關性TF-IDF演算法

文章目錄 如何查詢關於“原子能的應用”的網頁? 大致思路 問題描述 解決過程 一、使用“總詞頻” 二、加入IDF權重 三、IDF概念的理論支

【NLP】【三】jieba原始碼分析之關鍵字提取TF-IDF/TextRank

【一】綜述 利用jieba進行關鍵字提取時,有兩種介面。一個基於TF-IDF演算法,一個基於TextRank演算法。TF-IDF演算法,完全基於詞頻統計來計算詞的權重,然後排序,在返回TopK個詞作為關鍵字。TextRank相對於TF-IDF,基本思路一致,也是基於統計的思想,只不過其計算詞的權

NLP----關鍵詞提取演算法TextRank,TF/IDF

參考書目:python自然語言處理實戰——核心技術與演算法 TF/IDF 基本思想:TF是計算一個詞在一篇文件中出現的頻率,IDF是一個詞在多少篇文件中出現過,顯然TF越高證明這個詞在這篇文章中的代表性就越強,而INF越低則證明這個詞在具有越強的區分能力。因此中和這兩個數

用Python開始機器學習5:文字特徵抽取與向量化

假設我們剛看完諾蘭的大片《星際穿越》,設想如何讓機器來自動分析各位觀眾對電影的評價到底是“贊”(positive)還是“踩”(negative)呢? 這類問題就屬於情感分析問題。這類問題處理的第一步,就是將文字轉換為特徵。 因此,這章我們只學習第一步,如何從文字中抽取特徵,並將其向量化。 由於中文的處理涉及

關鍵詞提取方法學習總結TF-IDF、Topic-model、RAKE

關鍵詞是一篇文件中表達的主要話題,處理文件或句子時,提取關鍵詞是最重要的工作之一,這在NLP中也是一個十分有用的task。 常見的關鍵詞提取方法有:TF-IDF關鍵詞提取方法、Topic-model關鍵詞提取方法和RAKE關鍵詞提取。 TF-IDF: 使用TF-IDF提取

[轉]搜尋引擎的文件相關性計算和檢索模型BM25/TF-IDF

1. 檢索模型概述      搜尋結果排序時搜尋引擎最核心的部分,很大程度度上決定了搜尋引擎的質量好壞及使用者滿意度。實際搜尋結果排序的因子有很多,但最主要的兩個因素是使用者查詢和網頁內容的相關度,以及網頁連結情況。這裡我們主要總結網頁內容和使用者查詢相關的內容。      

用Python開始機器學習5:文字特徵抽取與向量化 sklearn

http://blog.csdn.net/lsldd/article/details/41520953 假設我們剛看完諾蘭的大片《星際穿越》,設想如何讓機器來自動分析各位觀眾對電影的評價到底是“贊”(positive)還是“踩”(negative)呢? 這類問題就屬於情感分析問題。這類問題處理的第一步,就是

Spark-特徵選擇scala

spark特徵選擇,基於scala語言編寫 ChiSqSelector 特徵選擇試圖識別用來構建模型的相關特徵,它減少了特徵空間的大小,既可以提高速度又可以提高統計學習行為的結果。 ChiSqSe

spark HelloWorld程序scala版

special hide dst tproxy top targe 提取 main read 使用本地模式,不需要安裝spark,引入相關JAR包即可: <dependency> <groupId>or

Spark入門1WordCount實現

article sco ack 系列 .text col lines count sta 1 package com.test 2 3 4 import org.apache.spark.{SparkConf, SparkContext} 5 6 7

Spark筆記整理十二:日誌記錄與監控

提交 說明 默認 conf 分布 core view aps 版本 1 Standalone模式下 按照香飄葉子的文檔部署好完全分布式集群後,提交任務到Spark集群中,查看hadoop01:8080,想點擊查看某個已完成應用的歷史情況,出現下面的提示: Event log

斯坦福大學-自然語言處理入門 筆記 第十課 關係抽取relation extraction

一、簡介 關係抽取就是從文件中抽取關係,例子如下: 為什麼進行關係抽取 建立新的關係型知識庫(knowledge bases) 增強目前的知識庫(knowledge bases) 支援問題回答(question answering)

斯坦福大學-自然語言處理入門 筆記 第九課 資訊抽取information extraction

一、介紹 1、資訊抽取(information extraction) 資訊抽取(IE)系統 找到並理解文字中的有限的相關性 從很多的文件之中收集資訊 產生一個相關資訊的結構化的表徵 目的: 進行資

Spark環境搭建多種模式

個人部落格原文連結 Spark環境的搭建相比於Hadoop叢集的搭建還是比較簡單的,而且跟Hadoop叢集的搭建流程也很相似,只是沒有Hadoop叢集那麼多的配置檔案要修改。本文中,我將詳細介紹Spark的本地模式、Standalone模式(偽分佈)、Standalone模式(全分佈)、

Spark】Ubuntu16.04 spark 叢集安裝 standalone模式

一、前言 目前 Apache Spark 支援三種分散式部署方式,分別是: standalone spark on mesos spark on YARN 其中,第一種類似於MapReduce 1.0所採用的模式,內部實現了容錯性和資源管理,後兩種則是未來發

利用Inception-v3現成權重進行特徵提取影象識別

在tensorflow官網的影象識別的中文介紹中,介紹瞭如何用Tensorflow的模型程式碼庫中的classify_image.py進行影象識別。裡面有介紹如何測試,而且還提供了最後一層的1*1*2048維的特徵提取方式,所以在這裡介紹一下。 ...... with tf.Session