1

我正在用Python的scikit-learn對Livejournal的博客進行情感分類。我有大約40000個職位,我使用其中的4/5作爲訓練集,剩餘部分作爲測試集。有監督學習的情感分類

有6種情緒:['joy','sadness','anger','surprise','love','fear']

我experiented幾個分類(包括樸素貝葉斯,SVM,SGD ..)但問題是,預測是非常非常不準確的。其實這幾乎是微不足道的,因爲幾乎測試集中的每個博客都被預測爲「喜悅」,這是火車集中最常見的情緒(45%)。

該功能集基本上包括一袋文字功能(我試過unigrams和bigrams),對於unigram,總共有613822個功能。

Besiedes,我添加了一些使用SentiWordnet分數的基於詞典的特徵:計算名詞,形容詞,形容詞,動詞和總詞的正面和負面分數的總和。在博客中。所以每個博客都會有613822 + 5個功能。

我也應用了一些特徵選擇方法,如chi2來減少特徵數量,但沒有任何明顯的改進。

scikit-learn的CountVectorizerDictVectorizer用於向量化特徵,Pipeline.FeatureUnion用於連接它們。

我猜這個糟糕的結果是由於過大的單詞功能集 - 可能是文本中有太多拼錯的單詞? (我已經刪除了停用詞並完成了一些詞形化作業) 我還認爲基於詞典的功能並不真正起作用,因爲BOW功能太大。

我希望在我的方法中找到任何明顯的錯誤,或者我可以做些什麼來提高準確性。

感謝您的任何建議!

+0

原諒潛在的無知問題,但你的任何技術解釋句子長度和標點符號?如果沒有,並且你在乎回答,爲什麼不呢? –

回答

1

你是對的,問題是在這個過於大量的功能和你過擬合到它..

考慮以下幾點:

1-規範化每個博客,刪除號碼,標點符號,鏈接,html標籤(如果有的話)。

2-思考Stemming而不是Lemmatization,Stemmers比lemmatizers更簡單,更小,通常更快,對於許多應用來說,它們的結果足夠好。

http://nlp.stanford.edu/IR-book/html/htmledition/stemming-and-lemmatization-1.html

詞根通常指的是一種粗略的過程,砍掉的話兩端正確地實現這一目標的大部分時間的希望,並且通常包括去除派生詞綴。詞形還原通常是指在使用單詞的詞彙量和形態分析,正確的做事,通常旨在除去變化詞尾只有

3-我在之前類似的問題的工作,我沒有什麼特點的提取,是對於6種情緒中的每一種情緒,我最常見的500個單詞(每個班級),然後刪除它們之間的共同詞幹。 結果列表包含大約2000個字,然後用作功能列表。 然後我使用樸素貝葉斯分類器。