天天看點

Feature extraction - sklearn文本特征提取

标記(tokenizing) 文本以及為每一個可能的标記(token)配置設定的一個整型id ,例如用白空格和标點符号作為标記的分割符(中文的話涉及到分詞的問題)

計數(counting) 标記在每個文本中的出現頻率

正态化(nomalizating) 降低在大多數樣本/文檔中都出現的标記的權重

在這個方案中,特征和樣本的定義如下:

将 每個标記出現的頻率 (無論是否正态化)作為 特征 。

給定 檔案 中所有标記的出現頻率所構成的向量作為多元 樣本 。

是以,語料檔案可以用一個詞文檔矩陣代表,每行是一個文檔,每列是一個标記(即詞)。

将文檔檔案轉化為數值特征的一般過程被稱為 向量化 。這個特殊的政策(标記,計數和正态化)被稱為 詞袋 或者bag of n-grams表征。用詞頻描述文檔,但是完全忽略詞在文檔中出現的相對位置資訊。

大多數文檔通常隻會使用語料庫中所有詞的一個子集,因而産生的矩陣将有許多特征值是0(通常99%以上都是0)。

例如,一組10,000個短文本(比如email)會使用100,000的詞彙總量,而每個文檔會使用100到1,000個唯一的詞。

為了能夠在記憶體中存儲這個矩陣,同時也提供矩陣/向量代數運算的速度,通常會使用稀疏表征例如在scipy.sparse包中提供的表征。

countvectorizer 在一個類中實作了标記和計數:

讓我們用它來标記和計算一個簡單語料的詞頻:

預設設定通過抽取2個字元以上的詞标記字元。完成這個步驟的具體函數可以直接調用:

在拟合過程中,每一個分析器找到的詞都會配置設定一個在結果矩陣中對應列的整型索引。列的含義可以用下面的方式獲得:

特征名稱與列索引的轉化映射被存儲在向量器(vectorizer)的vocabulary_屬性中:

是以,在訓練語料中沒有出現的詞在後續調用轉化方法時将被完全忽略:

注意在前面的語料中,第一個和最後一個文檔的詞完全相同是以被編碼為等價的向量。但是,我們丢失了最後一個文檔是疑問形式的資訊。為了保留一些局部順序資訊,我們可以在抽取詞的1-grams(詞本身)之外,再抽取2-grams:

是以,由這個向量器抽取的詞表非常大,現在可以解決由于局部位置模型編碼的歧義問題:

特别是疑問形式“is this”隻出現在最後一個文檔:

在較低的文本語料庫中,一些詞非常常見(例如,英文中的“the”,“a”,“is”),是以很少帶有文檔實際内容的有用資訊。

繼續閱讀