spark mllib IDF原始碼解析

2021-09-26 10:11:15 字數 1432 閱讀 8366

通常在文字向量化的過程中,通常用的比較多的就是tf-idf、word2vec、countvectorizer的這幾個方法,前面的部落格有分析過hashingtf和countvectorizer方法,今天來分析idf,

通常idf和hashingtf一期聯合使用。

1、idf計算公式:

計算公式:idf = log((m + 1) / (d(t) + 1))

m : 代表語料庫文件數量 t :包含該詞條的文件數量

m+1 和 dt(t) + 1 如果該詞語不在語料庫中,就會導致被除數為零,因此一般情況下使用 dt(t) + 1

2、引數

val mindocfreq 預設為0即最小的文件數

3、裝箱

def fit(dataset: rdd[vector]): idfmodel =
4、檢視documentfrequencyaggregator 的add方法和merge方法

def add(doc: vector): this.type = 

// 模式匹配稀疏向量和稠密向量

// 統計詞元出現的文件數

doc match

k += 1

}case densevector(values) =>

val n = values.length

var j = 0

while (j < n)

j += 1

}case other =>

throw new unsupportedoperationexception(

s"only sparse and dense vectors are supported but got $.")

}m += 1l

this

}// 完成合併

def merge(other: documentfrequencyaggregator): this.type = else

}this

}

5、計算idf

def idf(): vector = 

val n = df.length

val inv = new array[double](n)

var j = 0

while (j < n)

j += 1

}vectors.dense(inv)

}

到此idf計算完成,其實就算過程很簡單;

tips:

當你的模型在訓練的時候會生成idfmodel方法,在模型訓練完成後需要對idfmodel儲存,

在後續使用模型預估資料的過程,需要用idfmodel去轉向量,這樣能最大限度保證輸入資料的一致性。

後續會詳細分析treeaggregate和aggregate方法。

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...