歡迎光臨
每天分享高質量文章

【演演算法】利用檔案-詞項矩陣實現文字資料結構化

“詞袋模型”一詞源自“Bag of words”,簡稱 BOW ,是構建檔案-詞項矩陣的基本思想。對於給定的文字,可以是一個段落,也可以是一個檔案,該模型都忽略文字的詞彙順序和語法、句法,假設文字是由無序、獨立的詞彙構成的集合,這個集合可以被直觀的想象成一個詞袋,袋子裡面就是構成文字的各種詞彙。例如,文字內容為“經濟發展新常態研究”的檔案,用詞袋模型可以表示為[經濟,發展,新常態,研究]四個獨立的詞彙。詞袋模型對於詞彙的獨立性假設,簡化了文字資料結構化處理過程中的計算,被廣泛採用,但是另一方面,這種假設忽略了詞彙之間的順序和依賴關係,降低了模型對文字的代表性。


“檔案-詞項矩陣”一詞源自“Document-Term Matrix”,簡稱 DTM,DTM 矩陣轉置後即為 TDM。 我們在第一章簡單介紹過檔案-詞項矩陣的構成,直觀來看,矩陣的行代表檔案,列代表詞彙,矩陣元素即為檔案中某一詞彙出現的次數。例如,有以下兩個檔案:檔案一[經濟,發展,新常態,研究],檔案二[大資料,安全,隱私,保護],基於這兩個檔案構造一個詞典:{1:”經濟”, 2. “發展”, 3. “新常態”, 4. “研究”, 5. “大資料”, 6. “安全”, 7. “隱私”,8. “保護”},這個詞典一共包含 8 個不同的詞彙,利用詞典的索引號,上面兩個檔案都可以用一個 8 維的向量表示:(1,1, 1,1,0,0,0,0)和(0,0,0,0,1,1,1,1),向量元素表示對應維度的詞彙在檔案中出現的次數,兩個向量合併在一起即得到檔案-詞項矩陣。

雖然檔案-詞項矩陣沒有考慮到詞彙之間的依存關係,但是這一簡單假設也大大簡化了後續文字挖掘的計算過程,利用結構化處理的檔案-詞項矩陣已經可以實現很多有意義的分析過程,如計算檔案之間的相關性、文字分類、文字聚類等等。

利用 scikit-learn 庫構建檔案-詞頻矩陣

除了常用的機器學習演演算法外,scikit-learn 庫還提供了很多資料結構化處理的工具,將這類結構化處理統稱為“Feature Extraction”,即“特徵抽取”,文字中的詞彙出現的次數就屬於“特徵”中的一種。透過 sklearn.feature_extraction 包實現相關操作,該包包括從文字和影象中進行特徵抽取的方法。

1 sklearn.feature_extraction.text.CountVectorizer

sklearn.feature_extraction.text 是 sklearn.feature_extraction 包中進行文字資料結構化處理的模組,其中定義的 CountVectorizer 類可以同時實現分詞處理和詞頻統計,並得到檔案-詞頻矩陣。 實體化方式為:實體=CountVectorizer(input=u’content’, encoding=u’utf-8′, decode_error=u’strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=u'(?u)\b\w\w+\b’, ngram_range=(1, 1), analyzer=u’word’, max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=)

引數說明:

input:有以下三種取值型別
(1)filename:文字內容的檔案名
(2)file:有“read”方法的物件,如 file 物件
(3)content:需要處理的文字

encoding:解碼引數,預設取值為“utf-8”

decode_error:若需要分析的字串中包含未能解碼字元,可以利用該引數設定處理方案,有以下三種方案:
(1)strict:預設缺失值,出現異常報錯
(2)ignore:忽略異常情況
(3)replace

analyzer:指定特徵項為詞(word)還是 n-grams 字元(按照 n 個字元對陳述句進行劃分),有以下幾種取值:
(1)word:指定特徵項為詞
(2)char:指定特徵項為 n-grams 字元
(3)char_wb:僅從文字中詞邊界建立 n-gram 字元
如果傳遞一個用來提取特徵的可呼叫函式,那麼就按照被傳遞的函式進行處理

preprocessor:利用可呼叫函式改寫預測處理函式,同時保留分詞和 n-grams 的處理過程,預設缺失值為“None”

tokenizer:利用可呼叫函式改寫分詞步驟,同時保留預處理和 n-grams 的處理過程,預設缺失值為“None”

ngram_range:設定 n-gram 字元中 “n” 上下界的引數,取值型別為陣列(min_n, max_n),所有 min_n <= n <= max_n 的 n 值都會被使用

stop_words:停用詞設定引數,有以下三種取值:
(1)字串“english”:使用內建的英文停用詞表
(2)自定義停用詞串列:串列中詞彙將會從分詞結果中刪除,只有當引數 analyzer == ‘word’ 時才可以進行此項設定
(3)None:不使用停用詞,可以將引數 max_df 取值設定為 [0.7, 1.0) 基於內部語料庫詞頻自動識別、過濾停用詞

lowercase:在分詞前是否將所有字元都轉換為小寫形式,預設缺失值為 “True”

token_pattern:規定分詞原理的正則運算式,僅在 analyzer == ‘word’ 時才可設定。預設的正則運算式是選擇兩個或者兩個以上的字元(忽略標點符號,將其作為分詞依據)

max_df:閾值引數,構建字典時,忽略詞頻明顯高於該閾值(語料庫的停用詞)的詞項。如果引數取值是浮點數,則代表了檔案比例,如果是整數,則代表計數值。當字典非空時,這個引數會被忽略。

min_df:閾值引數,構建字典時,忽略詞頻明顯低於該閾值的詞項,也被成為截止值。如果引數取值是浮點數,則代表了檔案比例,如果是整數,則代表計數值。當字典非空時,這個引數會被忽略。

max_features:如果該引數取值非 None,構建詞典的時候僅僅考慮語料庫裡詞頻最高的那些特徵,如果詞典非空,這個引數將被忽略。

(1)fit_transform 方法

對 CountVectorizer 類呼叫 fit_transform 方法可以得到檔案詞項矩陣,呼叫方式為:實體.fit_transform(raw_documents),raw_documents 即為需要結構化處理的字串或 file 物件。

2 sklearn.feature_extraction.text.HashingVectorizer

利用 CountVectorizer 類構建檔案詞頻矩陣時,需要呼叫兩次檔案集合,一次用於建立詞典,一次用於建立每個檔案對應的詞頻向量,兩次呼叫會導致記憶體消耗較大。HashingVectorizer 類透過雜湊(hashing)技巧,不建立字典,有效的緩解了這一問題。HashingVectorizer 類實體化方式為:實體=HashingVectorizer(input=u’content’, encoding=u’utf-8′, decode_error=u’strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=u'(?u)\b\w\w+\b’, ngram_range=(1, 1), analyzer=u’word’, n_features=1048576, binary=False, norm=u’l2′, non_negative=False, dtype=)

部分引數說明:

n_features:用於設定輸出矩陣的列數,數值過小可能會引起雜湊衝突,數值過大會導致維度過高

norm:指定標準化矩陣的方式,有以下三種取值
(1)l1:利用 l1 範數進行標準化
(2) l2:利用 l2 範數進行標準化
(3) None:不進行標準化處理

non_negative:輸出矩陣中是否只包括非負值,取值為 True 時,矩陣元素可以理解為頻率,取值為 False 時,輸出結果期望值為零

其餘引數說明可以參考 5.1.3.1 CountVectorizer 類實體化引數。

對 HashingVectorizer 類呼叫 fit_transform 方法即可得到雜湊檔案詞頻矩陣

3 sklearn.feature_extraction.DictVectorizer 模組

有時對文字資料進行分詞和詞頻統計彙總後,得到的結果會直接以鍵、值的形式儲存為字典格式,例如檔案“text mining text analysis”,可以儲存為 {‘text’: 2, ‘mining’: 1, ‘analysis’: 1} ,如何將此種型別的文字分析結果轉換為 DTM 呢?

DictVectorizer 模組下定義的 DictVectorizer 類可以將字典形式的特徵表示轉換為 Numpy 陣列形式,對於分類變數採用“one-hot coding”表示。對於“one-hot coding”可以這樣理解:如果分類變數有 A、B、C 三個取值,利用“one-hot coding”可以依次表示為(1,0,0)、(0,1,0)、(0,0,1),相當於統計學中的虛擬變數。DictVectorizer 類實體化方式為:實體=DictVectorizer(dtype=, separator=’=’, sparse=True, sort=True)

引數說明:

dtype:可選變數,特徵值資料型別,透過該引數傳入 Numpy array 或 scipy.sparse 矩陣建構式

separator:可選變數,構建新的“one-hot coding”特徵值時使用的分隔符

sparse:可選變數,是否生成 scipy.sparse 矩陣

sort:可選變數,是否輸出 featurenames 和 vocabulary 兩個屬性,屬性 feature_names 是特徵名稱串列,對應檔案中的詞彙項,vocabulary_ 是特徵名稱與相應 id 的字典

(1)fit_transform 方法

對 DictVectorizer 類呼叫 fit_transform 方法可以實現特徵表示的陣列形式轉換,呼叫方式為:實體.fit_transform(X),X 即為需要轉換的字典型別的特徵表示。比如在下例中,measurements 是以字典儲存的特徵表示,其中“city”屬於分類變數,“temperature”屬於數值型變數,現要將其轉換為陣列形式。

(2) inverse_transform 方法

inverse_transform 方法是 fit_transform 的逆方法,呼叫方式為:實體.inverse_transform(Y),其中 Y 是需要轉換為字典型別特徵表示的陣列

連結:https://datartisan.gitbooks.io/begining-text-mining-with-python/content/%E7%AC%AC5%E7%AB%A0%20%E6%96%87%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%8C%96%E5%A4%84%E7%90%86/5.1%20%E6%96%87%E6%A1%A3-%E8%AF%8D%E9%A1%B9%E7%9F%A9%E9%98%B5.html

想加入資料人圈子或者商務合作,請加微信luqin360。

親愛的讀者朋友們,您們有什麼想法,請點選【寫留言】按鈕,寫下您的留言。



資料人網(http://shujuren.org)誠邀各位資料人來平臺分享和傳播優質資料知識



公眾號推薦:

360區塊鏈,專註於360度分享區塊鏈內容

    腳印英語,專註於分享實用口語內容。




贊(0)

分享創造快樂

© 2023 知識星球   網站地圖