文字挖掘預處理之分詞 / 向量化 / TF-IDF / Hash trick 附程式碼 Demo
分詞(tokenizing)
對於一個句子,首先需要將其分為多個單詞或多個片語。
例如, “I come from New York" => "I/come from/New York"
通過標準語料庫,為了簡化計算,通常使用馬爾科夫假設,即每一個分詞出現的概率僅僅和前一個分詞有關,可以近似的計算出所有的分詞之間的二元條件概率。
利用語料庫建立的統計概率,對於一個新的句子,我們就可以通過計算各種分詞方法對應的聯合分佈概率,找到最大概率對應的分詞方法,即為最優分詞。
常用的分詞工具
向量化(vectorize)與Hash Trick
詞袋模型
詞袋模型首先會進行分詞,在分詞之後,通過統計每個詞在文字中出現的次數,我們就可以得到該文字基於詞的特徵,如果將各個文字樣本的這些詞與對應的詞頻放在一起,就是我們常說的向量化。向量化完畢後一般也會使用TF-IDF進行特徵的權重修正,再將特徵進行標準化。 再進行一些其他的特徵工程後,就可以將資料帶入機器學習演算法進行分類聚類了。
每一維的向量依次對應了下面的19個詞。另外由於詞"I"在英文中是停用詞,不參加詞頻的統計。一共有19個詞,所以4個文字都是19維的特徵向量。
["I come to China to travel", "This is a car polupar in China", "I love tea and Apple ", "The work is to write some papers in science"] ### [[0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0] [0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0] [1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0] [0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1]]
由於大部分的文字都只會使用詞彙表中的很少一部分的詞,因此我們的詞向量中會有大量的0。也就是說詞向量是稀疏的。在實際應用中一般使用稀疏矩陣來儲存。
由於詞彙量很大,所以向量化後的維度就很大,將對應的樣本對應特徵矩陣載入記憶體,有可能將記憶體撐爆,要進行特徵的降維,而Hash Trick就是非常常用的文字特徵降維方法。
Hash Trick 降維
在Hash Trick裡,我們會定義一個特徵Hash後對應的雜湊表的大小,這個雜湊表的維度會遠遠小於我們的詞彙表的特徵維度,因此可以看成是降維。具體的方法是,對應任意一個特徵名,我們會用Hash函式找到對應雜湊表的位置,然後將該特徵名對應的詞頻統計值累加到該雜湊表位置。
如果用數學語言表示,假如雜湊函式h使第i個特徵雜湊到位置j,即h(i)=j,則第i個原始特徵的詞頻數值ϕ(i)將累加到雜湊後的第j個特徵的詞頻數值ϕ上
TF-IDF (Term Frequency - Inverse Document Frequency)
- TF 詞頻統計:文字中各個詞的出現頻率統計。
- IDF 逆文字頻率:N代表語料庫中文字的總數,而N(x)代表語料庫中包含詞x的文字總數。
由以上可得,TF−IDF(x)=TF(x)∗IDF(x)
TF-IDF是非常常用的文字挖掘預處理基本步驟,但是如果預處理中使用了Hash Trick,則一般就無法使用TF-IDF了,因為Hash Trick後我們已經無法得到雜湊後的各特徵的IDF的值。使用了IF-IDF並標準化以後,我們就可以使用各個文字的詞特徵向量作為文字的特徵,進行分類或者聚類分析。
英文文字挖掘預處理
-
除去資料中非文字部分:直接用Python的正則表示式(re)刪除
-
拼寫檢查:pyenchant
-
拼寫更正:pyspellchecker
-
詞幹提取(stemming)和詞形還原(lemmatization): 在實際的英文文字挖掘預處理的時候,建議使用基於wordnet的詞形還原就可以。nltk中的WordNetLemmatizer類
-
轉化為小寫:lower()
-
引入停用詞: 在英文文字中有很多無效的詞,比如“a”,“to”,一些短詞,還有一些標點符號,這些我們不想在文字分析的時候引入,因此需要去掉,這些詞就是停用詞。download link
-
特徵處理: TfidfVectorizer類可以幫助我們完成向量化,TF-IDF和標準化三步。