在自然語言處理中(NLP),如何對特徵進行有效的降維?

我在做一個課程設計,特徵的維度有接近兩萬維 (p = 20,000),每一維度特徵是一個0-1整數,表示一個特定的單詞是否在文章中出現(一個數據點$x in R^{p}$表示一篇文章)。

我知道特徵間的冗餘很大,所以需要降維。我有三個問題:

1)
假設我有一萬個樣本點(n = 10,000),每個樣本點有一萬個特徵(p = 10,000)。哪種降維方式比較有效和高效?矩陣$X in R{n imes p}$維度太大了(不過是稀疏的),在我的電腦上(沒有伺服器:-()直接對$X$用PCA(or SVD,truncated SVD還差不多可以跑) 還是Bag of Words(or K-means) 都跑不太動。

2)
怎樣表徵樣本點的相似度或距離?因為特徵都是binary的,覺得用歐氏距離好像不太合適。L0距離推薦嗎?

3) 如果我用SVM進行分類的話,用什麼Kernel比較好呢?

求大神指點!

------------------------------------------------------------------------------------

補充:謝謝大家的意見,十分有幫助!

其實我們要做的不是分類問題,是回歸問題(Regression)。利用文本信息估計價值。

我們知道的Regression method不多(linear regressin+penalty, SVR, KNN, DTs), 想著能否把prices取bins後進行分類。不知道業界都怎麼處理這樣的問題呢?

關於取bins:我們對price先取log集中下範圍,然後盡量讓各bins的數據一樣多。

繼續向大家學習!


對一些內容進行補充和概括,具體介紹如下:

  • 詞袋模型

文本的降維本質上涉及到了文本的表達形式。在傳統的詞袋模型當中,對於每一個詞採用one-hot稀疏編碼的形式,假設目標語料中共有N個唯一確認的詞,那麼需要一個長度N的詞典,詞典的每一個位置表達了文本中出現的某一個詞。在某一種特徵表達下,比如詞頻、binary、tf-idf等,可以將任意詞,或者文本表達在一個N維的向量空間里。憑藉該向量空間的表達,可以使用機器學習演算法,進行後續任務處理。

這種方式被稱為n-gram語法,指文本中連續出現的n個語詞。當n分別為1、2、3時,又分別稱為一元語法(unigram)、二元語法(bigram)與三元語法(trigram)。

詞袋模型的缺點:

詞袋模型雖然簡單,但也有很明顯的缺點,除了題主所說的文本表達維度過高以外,也不含有語義的信息,比如「喬布斯」和「喬幫主」兩個詞在這個表達下完全是不同的,但在語義上兩者高度相關。

有一些針對上述內容的改善方法,比如,傳統維度選擇方法、主題模型和神經網路。它們都涉及到了降維或語義表達,原理上有些差異。這裡傳統維度選擇方法指日常直接應用到的數據降維方法,這些方法不做語義處理,僅僅是維度篩選,保留主要維度,剔除次要維度。主題模型和神經網路是同時兼顧了降維和語義表達的方法,前者是基於統計共現,後者是基於序列網路關係訓練。具體介紹如下:

  • 維度選擇方法

常用的有卡方、互信息這種統計檢驗的方法;還有藉助機器學習模型降維的方法。比如,使用隨機森林,或者邏輯回歸等模型,篩選出那些在分類任務中具有較大特徵重要性,或者係數絕對值較大的TOP特徵作為降維後的特徵集合。

  • 主題模型

主題模型同時具備了降維和語義表達的效果,比如LSI、LDA、PLSA、HDP等統計主題模型,這些模型尋求文本在低維空間(不同主題上)的表達,在降低維度的同時,儘可能保留原有文本的語義信息。

  • 神經網路

除了上述經典機器學習演算法,在深度學習世界中,也有常用的文本表達方式。神經網路演算法關於詞的表達,充分利用了詞在語義空間中的性質,一般這個過程被稱為embedding,將所有的詞都用向量表達起來,做成一個詞典,後續使用時再到這個大詞典里來「查表」(lookup),是深度學習演算法中很重要的基礎步驟。比如,詞典里有N個唯一的詞,每個詞有100維,那麼這個大詞典的維數有100*N。常用的embedding方法有word2vec,glove模型。

在有了所有詞的embedding表達以後,常採用幾種方式來對一段文本進行向量化:

1. 採用連續若干embedding的卷積形式表達—CNN,常用於分類任務。

2. 採用embedding序列編碼的方式表達—RNN,常用於問答、機器翻譯等任務,也可以用於分類任務。

3. 針對較短的文本,也可以直接採用word2vec平均、求和、tf-idf求和的方式。

以上方式都可以做到對文本的降維,同時盡量保留文本的語義信息。

BY 王天禕


1. 一般用卡方

2. 一般相似度用cosine

3. 實踐出真知~~~分類這種東西= =。。svm反正你用庫的話也就是換個參數,備選核也不超過5個,遍歷一遍

謝謝邀請~~~原諒我。。。答得都比較短,這些網上有很多資料,去查一下吧,多動手~~~


先hashing,然後再做相似或者其他。

如果你不知道hashing是什麼的話,先看看這個吧

NLP中的hashing trick是什麼?-SofaSofa

還有

hashing trick或者feature hashing是什麼-SofaSofa


LSH可以將相似性判斷降複雜度降到sub linear。


也是新手,插兩句嘴,不敢實名,怕被噴。。。liblinear很快的啊我做2,000,000*40000的svm還不如我讀入數據的時間長(在自己筆記本上),也許你的文檔太長導致矩陣過於dense?

文檔分類svm用linear kernel在很多情況下就已經很好了(我現在手頭的文檔分類的問題generalization error降到2%以下沒什麼問題),只除了一些情況比如文檔過短會到3%,涉及語意判斷的麻煩一點有時候能到10%。

相似度同樓上所說,餘弦相似度就可以,http://en.wikipedia.org/wiki/Cosine_similarity。


推薦閱讀:

中國計算機視覺的前途在哪?機器視覺工程師又何去何從?
先進感測器是智能裝備的關鍵硬體入口

TAG:人工智慧 | 機器學習 | 自然語言處理 | 語義識別 | 自然語言 |