NLP學習-文本特徵向量化

首先說一下文本分析流程:

現在已經到了流程圖的第五塊內容了~

NLP學習-分詞:https://blog.csdn.net/RHJlife/article/details/104748790

NLP學習-清洗:https://blog.csdn.net/RHJlife/article/details/104834980

NLP學習-詞形標準化https://blog.csdn.net/RHJlife/article/details/104835785

NLP學習-文本特徵向量化:https://mp.csdn.net/console/editor/html/104893608

NLP學習-建模:暫無

下面講述文本特徵向量化的相關內容。

前面四個模塊的完成,意味着我們已經有了以爲單元的數據了,但是有個問題...計算機能直接用這些來訓練嗎?答案是不能的,例如如果之前接觸過神經網絡等概念的,或者自己拿別人模型跑着玩的時候就會發現,訓練機是數字數據的時候可以直接用,如果圖片、音頻等其實也都是轉化成數字數據的格式來進行訓練的,那麼...我們如何講詞語也變成數字數據哪?常見的方法有:one-hot編碼、TF-IDF文本向量化、Word2vec文本向量化

one-hot編碼

也稱爲獨熱編碼,獨熱編碼即 One-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每個狀態都有它獨立的寄存器位,並且在任意時候,其中只有一位有效。(百度百科內容)

其實這麼說...光看定義是沒什麼用的,以下我講舉例說明一些one-hot編碼在nlp中的應用,或許大家就明白

例子1:假設詞典是:[我們,去,爬山,你們,聚會,今天,明天],用獨熱編碼則如下:

我們->(1,0,0,0,0,0,0)

去->(0,1,0,0,0,0,0)

爬山->(0,0,1,0,0,0,0)

你們->(0,0,0,1,0,0,0)

聚會->(0,0,0,0,1,0,0)

今天->(0,0,0,0,0,1,0)

明天->(0,0,0,0,0,0,1)

爲什麼是這樣哪?使用N位狀態寄存器來對N個狀態進行編碼的意思就是有多少個需要表示的詞語就要用幾個狀態,我們要表示七個詞,那麼就需要七個狀態,也就是向量是7位的;每個狀態都有它獨立的寄存器位的意思就是每個詞都要有一個向量;並且在任意時候,其中只有一位有效,你們發現了嗎,每個向量僅有1個1,就是這麼個意思。

相信大家和我當初一樣有很多疑惑,爲什麼我們對應的(1,0,0,0,0,0,0,0)不能是其他向量嗎?答案:當然是可以的,遵循上面的規定,我們發現7個詞會對應7個向量(此向量要遵循只有一位有效的規定,那麼比如7個位的向量只有7種向量),但是7個詞語和7個向量是一一對應的(一個詞只能對應一個向量),但是吧...誰對應誰,這個隨意...一般就是按順序來對應的。

獨熱編碼算是比較早期的方法了,它有很多缺點和優點,這個大家可以自行查閱,這個地方大家要了解一下,獨熱編碼並不是nlp中特有的,它有很多應用,你可以瞭解它本身存在的優缺點,以及在不同領域存在的優缺點。下面我就簡單說說我理解的獨熱編碼在nlp中的優缺點:

優點:我個人感覺它最大的優點就是,確實講詞語分來了,並且轉換爲數字形式了,比較嚴謹的意思就是:將離散特徵的取值擴展到了歐式空間,離散特徵的某個取值就對應歐式空間的某個點。

缺點:這個地方有兩個公認的缺點也是最主要的缺點,我就和大家說一下了,第一就是不能表示語義的相似度,舉個例子:今天明天相似度肯定要比今天爬山相似度都高(這句話...如果不理解...我也不太建議看後面了哈...),但是從獨熱編碼上來看是看不出區別來的(因爲獨熱編碼的分配本來就是認爲的,用個比較較真的說法,你假設認爲今天明天獨熱編碼比今天爬山的獨熱編碼更接近,那麼我把明天爬山的獨熱編碼換一下,你還感覺 今天明天獨熱編碼比今天爬山的獨熱編碼更接近嗎?);第二個缺點就是稀疏性的問題,簡單來說7個詞語光表示出來就需要7*7的空間,那麼...8個詞?1000個詞?目前比較全面的詞典庫是10的五次方級的,那麼...一個詞語就要佔用10的五次方級的向量...可想而知...空間耗費有多麼大。

說完了詞的獨熱編碼後,說一下如果表示句子!

S1:我們今天去爬山

S2:昨天我們去爬山,你們去聚餐

以上面兩句話爲例,下面介紹兩種表示方法

第一種方法:boolean(只考慮出現不出現)方法

我們今天去爬山爲例,出現的詞語有我們|今天|去|爬山根據獨熱編碼,我們佔據第一位,今天佔據第六位,佔據第二位,爬山佔據第三位,所以 我們今天去爬山->(1,1,1,0,0,1,0);再看第二句,除了第六位其他的都佔據的,甚至有兩個佔據了兩次第二位,但是結果是這樣滴:昨天我們去爬山,你們去聚餐->(1,1,1,1,1,0,1)這就是(只考慮出現不出現)不考慮出現了幾次,只要出現了就是1沒出現就是0,該方法中僅有0\1,沒有其他數字出現的可能

第二種方法:count(考慮詞頻)

還是上面兩個例子,我直接給出答案了我們今天去爬山->(1,1,1,0,0,1,0)昨天我們去爬山,你們去聚餐->(1,2,1,1,1,0,1),觀察區別就知道了,向量中的數字代表該狀態位代表詞語的詞頻,因爲出現兩次,所以第二位上爲2

說完了如何表示句子,那麼最後補充兩個計算相似度的方法

1.歐式距離:不考慮方向 d=|s1-s2|

2.餘弦相似度:考慮方向 d=(s1.s2)/(|s1|*|s2|)   (其中s1.s2爲內積)

令剛剛兩句話爲s1,s2(已標註,且採用boolean方法),則歐式距離=根號下(1方+1方+1方+1方)=2;餘弦相似度=(1+1+1)/(根號下(4)*根號下(6))=3/(2*根號6)

(不太會打符號...獻醜了...多擔待)

用上述兩種相似度計算方法計算的相似度,會發現...歐式距離都是根號2,餘弦都是0,這兩種方法是不可行的,但是實際生活中我們還是需要,爲什麼哪?因爲我們你們,肯定比我們遊戲更接近,這個地方出現這兩個問題的原因是:詞的表示上面,而不是相似度的計算上。這個地方又讓大家瞭解了下,one-hot編碼不能表示語義的相似度這一缺點。

TF-IDF文本向量化:

TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。(百度百科內容)

以下我主要說明一下tf-idf在nlp的相關知識,先說一下它是爲了解決什麼?其實它在nlp中解決的並不是出現的越多就越重要,出現的越少就越不重要是這個問題。

舉個例子大家就明白了:他|喜歡|去|游泳,但是|他|也|喜歡|去|滑雪,他|還|喜歡|玩|遊戲,例如我們要做的事是去找他做了什麼的話,可以看出來出現三次,也出現兩次,但是重點應該是游泳滑雪遊戲,而tf-idf方法就是解決這一問題的一個方法。

官方公式:

  • tf-idf(w)=tf(d,w)*idf(w)
  • idf(w)=log(N/N(w))

(w爲詞彙,d爲某文檔,tf(d,w)表示文檔d中的w的詞頻,idf(w)=log(N/N(w)),N是語料庫中的文檔總數,N(W)是含W的文檔數量)

tf(d,w)代表詞語的詞頻,idf(w)代表詞語的重要性

以上就是TF-IDF相關知識。是不是聽了也一臉懵逼?那麼帶你弄例子說明一下,你就明白該怎麼樣去實現了~

詞典:[今天,學習,NLP,知識,的,有,意思,大數據,也]

詞典含有9個單詞->向量是9位的;總共出現了三句話(藍色內容)N=3

1.今天|學習|NLP|知識 

  • 今天出現1次,詞頻是1,今天出現在兩個句子裏面,所以idf(今天)=log(3/2)。所以第一位填1*log(3/2)  (以下內容僅標註tf=多少,idf=多少,不詳細解釋了)
  • 學習tf=1,idf=log(3/1),所以第二位填1*log(3/1)
  • NLPtf=1,idf=log(3/1),所以第三位填1*log(3/1)
  • 知識tf=1,idf=log(3/3),所以第四位填1*log(3/3)
  • 其他詞語tf=0,所以填0

綜上所屬,該句的詞向量爲:今天|學習|NLP|知識 ->(1*log(3/2),1*log(3/1),1*log(3/1),1*log(3/3),0,0,0,0,0)

2.今天|的|知識|有|意思

  • 今天t f=1,idf=log(3/2),所以第一位填1*log(3/2)
  • tf=1,idf=log(3/1),所以第五位填1*log(3/1)
  • 知識tf=1,idf=log(3/3),所以第四位填1*log(3/3)
  • tf=1,idf=log(3/2),所以第六位填1*log(3/2)
  • 意思tf=1,idf=log(3/2),所以第七位填1*log(3/2)
  • 其他詞語tf=0,所以填0

綜上所屬,該句的詞向量爲:今天|的|知識|有|意思 ->(1*log(3/2),0,0,1*log(3/3),1*log(3/1),1*log(3/2),1*log(3/2),0,0)

3.大數據|知識|也|有|意思

  • 大數據t f=1,idf=log(3/1),所以第八位填1*log(3/1)
  • 知識tf=1,idf=log(3/3),所以第四位填1*log(3/3)
  • tf=1,idf=log(3/1),所以第九位填1*log(3/1)
  • tf=1,idf=log(3/2),所以第六位填1*log(3/2)
  • 意思tf=1,idf=log(3/2),所以第七位填1*log(3/2)
  • 其他詞語tf=0,所以填0

綜上所屬,該句的詞向量爲:大數據|知識|也|有|意思 ->(0,0,0,1*log(3/3),0,1*log(3/2),1*log(3/2),1*log(3/1),1*log(3/1))

這樣是不是就學會了?

 

Word2vec文本向量化後續更新,可能額外本文掛鏈接,可能直接寫本文裏,看情況吧~

暫時學習了部分(以後還會更新完善的),Word2vec淺顯的理解https://blog.csdn.net/RHJlife/article/details/104943389

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章