日志分類以及TFIDF


TF的概念是Term Frequent,是一個單詞出現的頻率,是一個局部概念,就是這個單詞在指定文件中出現的頻率,公式如下:

但是呢,這個TF其實很沒有說服力,比如the,a之類的頻率很高,但是其實不能實現很好地分類標志,盡管可以在停用詞中進行禁用,但是很多單詞還是無法全部禁用干凈;這個時候就引入了IDF,Inverse Document Frequent,反向文檔頻率(我稱之為區分度公式),公式是

idf = log(N/d)

N是文檔數量,存在該單詞的文檔的個數,這里IDF是一個全局概念,是一個單詞在全局的分布情況,分布的越少,idf的值越高;IDF實現了"對於出現頻率低"的單詞賦予比較高的權重,比如"越位",是一個專業術語,一般只是出現在足球相關的文章中,那么,這個詞的IDF就會比較大,或者說這個詞的區分度會比較大。

TFIDF = TF(t, d) * IDF(t)

這里強調一下,TFIDF是一種評分,TFIDF計算出來的結果是要作為特征值寫入到稀疏矩陣的。

下面說一下對於新聞分類的套路;首先是加載所有的新聞訓練樣本,然后進行分詞,將分詞(term)放入到一張大表中,這是第一張大表:Term(特征)字典表;Term字典表的形成過程:計算每個Term的TFIDF(看到了,TFIDF是term的,在NPL中,每個term就是一個特征,或者說一個維度);這樣就形成了一張key-value表,key就是term的hash值,value就是term的tfidf的值;這里解釋一下,所謂的Hash算法,是指對於每個分詞進行Hash取值,這個值就是分詞的索引;在這個字典表的索引;在文本挖掘里面,每個分詞就是特征,對於分詞取Hash之后,其實就是特征索引值,然后找到對應的特征做統計;為什么要做這么做?簡化流程,否則需要遍歷整張表來查找匹配Term;如果采用Hash的方式,取要查找的分詞的hansh值,直接過去到了索引,將term的比較轉化為了索引值的定位,簡化的查詢的過程;

第一張字典表有了,下面就是形成第二張大表:樣本表;新聞分類是要進行訓練的;來了一條樣本之后,需要進行分詞,然后取各個分詞的hash值,拿着hash值到字典表中找對應的tfidf值,然后把tfidf填充到樣本表中同字典表索引的位置;如此形成一行;所以一條樣本(新聞)其實不會填充幾個term,很多單元格都是空着的;如果多條記錄之后,形成了什么?形成了稀疏矩陣。

采用hash算法獲取索引,那么碰撞了怎么辦?所以這張哈希表一定要大,默認的是2.18,分析雲用的是2.20

比如"美國",這個特征,取hash值為242,首先到字典表索引242中找到tfidf值;然后在樣本(稀疏表)的列索引242的位置設置tfidf值;這樣,就形成了一個特征向量(一個稀疏的向量/矩陣)。

train的這些樣本都是可以作為未來比較的原始樣本;設想新來了一條新聞記錄,然后從任意類別中抽出來一個(特征向量),將兩個特征向量基於余弦相似度衡量,根據余弦值來判斷是否是同類新聞;什么是余弦相似度?

cos(x) = x * y / ||x|| * ||y||

對於稀疏矩陣場景,需要使用余弦定理,對於為0的特征,分子是0,所以適用(不過兩者都是0就跪了)

對於新聞場景還可以繼續進行訓練,就是基於貝葉斯來計算一段文字是某個分類新聞的概率;這個原理就是,計算某段文字中各個單詞是每一種分類的概率,然后把這些概率做相乘;那么怎么計算概率呢?這里采用其實是一半貝葉斯公式,我們知道貝葉斯公式如下:

在這里,B代表類別,A代表具體的某個文檔(由各個分詞組成);在貝葉斯公式中,文檔A是分類B的概率的計算是可以轉化為P(A1|B) * P(A2|B) * P(A3|B)...*P(B),Ai是文檔A的分詞;根據條件我們是可以把類別B某個具體分詞的概率統計出來,分類B占全局分類的概率P(B)也是可以求出來;對於P(A),因為所有的元素P(A)的概率都是一樣的,所以這里可以忽略不記。直接比較分子,誰大,那么誰就是該分類。

在我們日志分析雲中並沒有采用這種(朴素貝葉斯)方式,因為該方式是應用於分類已經很清晰的場景下;而我們的場景下是會有新的日志類型產生。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM