Python自然語言處理筆記【二】文本分類之監督式分類的細節問題
一、選擇正確的特征
1.建立分類器的工作中如何選擇相關特征,並且為其編碼來表示這些特征是首要問題。
2.特征提取,要避免過擬合或者欠擬合
- 過擬合,是提供的特征太多,使得算法高度依賴訓練數據的特性,而對於一般化的新例子不起作用,在小型訓練集上通常會出現這種問題。
- 欠擬合,是特征太少,算法不能很好地反映實例的特性
3.用錯誤分析的方法來完善特征集,首先選擇開發集,其中包含用於創建模型的語料數據。然後開發集分為訓練集和開發測試集。
>>> train_names = names[1500:] >>> devtest_names = names[500:1500] >>> test_names = names[:500]
註意:
- 訓練集用於訓練模型,開發測試集用於進行錯誤分析,測試集用於系統的最終評估。進行錯誤分析的是單獨的測試開發集,不是測試集。
- 語料數據分為兩類:開發集和測試集 。 開發集通常被進一步分為訓練集和開發測試集。
- 將語料分為適當的數據集,我們使用訓練集訓練一個模型,然後在開發測試集上運行。
4.使用開發測試集,我們可以生成一個分類器預測名字性別時的錯誤列表。
>>> errors = [] >>> for (name, tag) in devtest_names: ... guess = classifier.classify(gender_features(name)) ... if guess != tag: ... errors.append( (tag, guess, name) )
借助錯誤分析可以調整我們的特征提取器包括兩個字母後綴的特征。這個錯誤分析過程可以不斷重復,檢查存在於由新改進的分類器產生的錯誤中的模式, 每一次錯誤分析過程被重復。
註意:一旦我們已經使用了開發測試集幫助我們開發模型,關於這個模型在新數據會表 現多好,我們將不能再相信它會給我們一個準確地結果!因此,保持測試集分離、未使用過, 直到我們的模型開發完畢是很重要的。
二、文檔分類
對於分類文檔時:
1.構造已經標記類別的文檔清單
2.為文檔定義特征提取器,對於文檔主題識別,可以為每個詞定義一個特性以表示該文檔是否包含這個詞。
三、詞性標註
訓練一個分類器來算出那個後綴最有信息量
1.找出最常見的後綴
>>> from nltk.corpus import brown >>> suffix_fdist = nltk.FreqDist() >>> for word in brown.words(): ... word = word.lower() ... suffix_fdist.inc(word[-1:]) ... suffix_fdist.inc(word[-2:]) ... suffix_fdist.inc(word[-3:]) >>> common_suffixes = suffix_fdist.keys()[:100] >>> print common_suffixes
2.定義一個特征提取器函數,檢查給定的單詞的這些後綴:
>>> def pos_features(word): ... features = {} ... for suffix in common_suffixes: ... features[‘endswith(%s)‘ % suffix] = word.lower().endswith(suffix) ... return features
分類器在標記時,將根據特征提取函數所強調的那些屬性來做標記。
四、探索上下文語境
基於詞的上下文特征,不能只傳遞已標註的詞,而是傳遞整個(未標註的)句子,以及目標詞的索引。
這種方式是使用依賴上下文的特征提取器來定義一個詞性標記分類器。
這能提高詞性標註器的性能,但無法研究一般的情況
五、序列分類
為了獲取相關的分類任務之間的依賴關系,我們可以使用聯合分類器模型,為相關輸入選擇適當的標簽。
在詞性標註的例子中,各種不同的序列分類器模型可以被用來為一個給定的句子中的所有的詞共同選擇詞性標簽。
連續分類或貪婪序列分類策略,即為第一個輸入找到最有可能的 類標簽,然後在此基礎上幫助找到下一個輸入的最佳的標簽。這個過程不斷重復直到所有的輸入都被貼上標簽。
過程:定義特征提取器,可以繼續建立我們的序列分類器。在訓練中,使用 已標註的標記為特征提取器提供適當的歷史信息,但標註新的句子時,我們基於標註器本身的輸出產生歷史信息。
六、其他序列分類方法
轉型聯合分類的工作原理是為輸入的標簽創建一個初始值,然後反復提煉那個值,嘗試修復相關輸入之間的不一致。
Python自然語言處理筆記【二】文本分類之監督式分類的細節問題