词袋模型bow和词向量模型word2vec
在自然語言處理和文本分析的問題中,詞袋(Bag of Words, BOW)和詞向量(Word Embedding)是兩種最常用的模型。更準(zhǔn)確地說,詞向量只能表征單個詞,如果要表示文本,需要做一些額外的處理。下面就簡單聊一下兩種模型的應(yīng)用。
所謂BOW,就是將文本/Query看作是一系列詞的集合。由于詞很多,所以咱們就用袋子把它們裝起來,簡稱詞袋。至于為什么用袋子而不用筐(basket)或者桶(bucket),這咱就不知道了。舉個例子:
文本1:蘇寧易購/是/國內(nèi)/著名/的/B2C/電商/之一
這是一個短文本。“/”作為詞與詞之間的分割。從中我們可以看到這個文本包含“蘇寧易購”,“B2C”,“電商”等詞。換句話說,該文本的的詞袋由“蘇寧易購”,“電商”等詞構(gòu)成。就像這樣:
但計算機(jī)不認(rèn)識字,只認(rèn)識數(shù)字,那在計算機(jī)中怎么表示詞袋模型呢?其實很簡單,給每個詞一個位置/索引就可以了。例如,我們令“蘇寧易購”的索引為0,“電商”的索引為1,其他以此類推。則該文本的詞袋就變成了:
是的,詞袋變成了一串?dāng)?shù)字的(索引)的集合。這樣計算機(jī)就能讀懂了。如果用程序來描述的話,就會像:Set<int>(0,1,2…)。當(dāng)然,剛才的例子中像“蘇寧易購”等詞只出現(xiàn)了一次,如果出現(xiàn)多次,可能就需要支持重復(fù)元素的容器了,如Java/C++中的MultiSet。
可是,在實際的應(yīng)用中(如:文本的相似度計算),用剛才說的容器是非常不方便的(如果要用,需要額外用Map容器來存儲一本字典來表征詞和索引的映射關(guān)系)。因此我們考慮用更簡單的數(shù)據(jù)結(jié)構(gòu)來組織詞袋模型。既然剛才說詞是用數(shù)字(索引)來表示的,那自然我們會想到數(shù)組。例如:
Intwords[10000] = {1,20,500,0,……}
索引:{0,1,2,3,……}
詞: {蘇寧易購,是,國內(nèi),B2C,……}
數(shù)組的下標(biāo)表示不同的詞,數(shù)組中的元素表示詞的權(quán)重(如:TF,TF-IDF)。更為一般的,詞的索引可以用詞的HashCode來計算,即:Index(蘇寧易購) = HashCode(蘇寧易購)。將詞散列到數(shù)組的某個位置,并且是固定的(理論上會有沖突,需要考慮沖突的問題)。因此,HashCode這個函數(shù)起到了字典的作用。轉(zhuǎn)化成了數(shù)組,接下來計算余弦相似度啥的就好辦多了。這就是詞袋模型。
下面講講詞向量模型。實際上,單個詞的詞向量不足以表示整個文本,能表示的僅僅是這個詞本身。往往,這個詞向量是個高維的向量(幾萬甚至幾十萬)。先不說它是如何得到的,單說它的應(yīng)用應(yīng)該是很廣泛的。再舉文本相似度的例子,既然詞可以用一串?dāng)?shù)字表示,那么自然可以用余弦相似度或歐式距離計算與之相近的詞。這樣,詞的聚類什么的都可以做了。那長文本怎么辦呢?一個簡單的辦法是把這個文本中包含的詞的詞向量相加。這樣長文本也就表示成了一串?dāng)?shù)字。可是這種處理方法總讓我們覺得怪怪的。看到過有同學(xué)做的測試,當(dāng)文本只有十幾個字的時候,這種處理方法還算湊合,字多了,結(jié)果就很難看了。至于詞向量是怎么獲得,咱下回再說。目前word2vec有多種版本可供大家使用。至于像doc2vec,sentence2vec的效果還有待評估。
總結(jié)
以上是生活随笔為你收集整理的词袋模型bow和词向量模型word2vec的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《星露谷物语》获得金色小鸡方法
- 下一篇: 【数据结构总结】第三章:栈和队列(线性结