目前詞向量主要用的技術(shù)
- word2vec
- fasttext
- glove
1 one-host編碼
one-hot編碼,又稱獨(dú)熱編碼、一位有效編碼。其方法是使用N位狀態(tài)寄存器對N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都有他獨(dú)立的寄存器位,并且在任意時(shí)刻,其中只有一位有效。
one-hot編碼在特征提取上屬于詞袋模型(bag of words)。
優(yōu)點(diǎn):
- 解決了分類器不好處理離散數(shù)據(jù)的問題;
- 在一定程度上也起到了擴(kuò)充特征的作用;
缺點(diǎn):
- 是一個(gè)詞袋模型,未考慮詞與詞之間的順序;
- 假設(shè)詞與詞之間是相互獨(dú)立的,而實(shí)際詞與詞之間是有影響的;
- 得到的特征向量是離散稀疏的,容易出現(xiàn)維度災(zāi)難;
one-hot編碼手動(dòng)實(shí)現(xiàn)
import numpy as np
samples = ["我 畢業(yè) 于 北京 理工大學(xué)", "我 就職 于 中國科學(xué)院技術(shù)研究所"]
token_index = {}
for sample in samples:
for word in sample.split(" "):
if word not in token_index:
token_index[word] = len(token_index) + 1
print(token_index)
print("{},{},{}".format(len(samples), len(token_index)+1, max(token_index.values())+1))
results = np.zeros(shape=(len(samples), len(token_index)+1, max(token_index.values())+1))
print(results.shape)
for i, sample in enumerate(samples):
for j, word in list(enumerate(sample.split())):
index = token_index.get(word)
results[i, j, index] = 1
print(i, j, index, word)
print(results)
results2 = np.zeros(shape=(len(samples), max(token_index.values())+1))
for i, sample in enumerate(samples):
for _, word in list(enumerate(sample.split())):
index = token_index.get(word)
results2[i, index] = 1
print(results2)
Keras中one-hot編碼的實(shí)現(xiàn)
from keras.preprocessing.text import Tokenizer
samples = ["我 畢業(yè) 于 北京 理工大學(xué)", "我 就職 于 中國科學(xué)院技術(shù)研究所"]
# 構(gòu)建單詞索引
tokenizer = Tokenizer()
tokenizer.fit_on_texts(samples)
word_index = tokenizer.word_index
print(word_index)
sequences = tokenizer.texts_to_matrix(samples)
print(sequences)
2 word2vec
word embedding的相關(guān)文章
- Efficient Estimation of Word Representation in Vector Space
- Distributed Representations of Sentences and Documents
- Enriching Word Vectors with Subword Information
word2vec是什么?
- word2vec是詞的一種表示,它將詞以固定維數(shù)的向量表示出來。
- 傳統(tǒng)的基于詞袋模型,one-hot representation在判定同義詞,相似句子的時(shí)候很無力。而Word2vec充分利用上下文信息,對上下文進(jìn)行訓(xùn)練,每個(gè)詞不再只是一個(gè)位置1,其余位置都為0的稀疏向量,word2vec是一個(gè)稠密的固定維數(shù)的向量。
- 經(jīng)過訓(xùn)練之后的詞向量,能夠利用上下文信息,找出相似的詞語。
word2vec有哪幾種實(shí)現(xiàn)方式?
- 方式1:用上下文預(yù)測中心詞,cbow(continue bag of word)
- 方式2:利用中心詞預(yù)測上下文信息,skip-gram
word2vec本質(zhì)是什么
- 無監(jiān)督學(xué)習(xí),因?yàn)檩敵霾]有l(wèi)abel
- 詞向量的本質(zhì)可以看出是一個(gè)只有一層的神經(jīng)網(wǎng)絡(luò),因此必須有輸入、輸出,訓(xùn)練的目的不是為了得到預(yù)測的結(jié)果,而是對單詞進(jìn)行分類。最關(guān)鍵的就是獲得hidden layer的中的權(quán)重。
- 也就是借助sequnece2sequence模型訓(xùn)練過程,得到hidden layer的權(quán)重。
sigmoid和softmax
- sigmoid也就是logistic函數(shù);
- softmax要解決這樣一個(gè)問題:給定一個(gè)向量,用數(shù)學(xué)方法把向量中的所有元素歸一化為一個(gè)概率分布,也就是說該向量中的元素在[0,1]范圍內(nèi),且所有元素的和為1;
- softmax就是這個(gè)數(shù)學(xué)方法,本質(zhì)就是一個(gè)函數(shù);
- 每個(gè)元素都是對向量z內(nèi)的元素求指數(shù),再除以所有元素求指數(shù)后的和。所以softmax函數(shù)也叫做歸一化指數(shù)函數(shù)(normalized exponential function)。
huffman樹和Huffman編碼
- 給定n個(gè)葉子節(jié)點(diǎn),構(gòu)建一棵二叉樹,若它的帶權(quán)路徑長度達(dá)到最小,則稱這樣的二叉樹為最優(yōu)二叉樹,也稱為Huffman樹。
- 利用Huffman樹設(shè)計(jì)的二進(jìn)制前綴編碼,稱為Huffman編碼。不等長編碼,將頻率高的字或者詞用短碼編碼,頻率出現(xiàn)低的詞或者字用長碼編碼?!咀畛跄康木褪菧p少網(wǎng)絡(luò)上傳送報(bào)文的長度】
- 文本領(lǐng)域中,把訓(xùn)練語料中的詞當(dāng)成葉子節(jié)點(diǎn),其在語料中出現(xiàn)的次數(shù)當(dāng)作權(quán)值,通過構(gòu)造相應(yīng)的Huffman樹來對每個(gè)詞進(jìn)行Huffman編碼。
語言模型
- 語言模型就是用來計(jì)算一個(gè)句子的概率模型,也就是判斷一句話是否是人話的概率?
- 那如何計(jì)算一個(gè)句子出現(xiàn)的概率呢?最大似然估計(jì),但是這種方法又有致命的缺陷,一是可能性太大無法估算,二是數(shù)據(jù)稀疏驗(yàn)證?如何解決上述問題呢?馬爾科夫假設(shè)
- 馬爾科夫假設(shè):為了解決參數(shù)空間過大的問題,引入了:任意一個(gè)詞出現(xiàn)的概率只與它前面的一個(gè)或者幾個(gè)詞有關(guān)。
- 根據(jù)大數(shù)定律,當(dāng)樣本量很大的時(shí)候,一個(gè)短語或者詞語出現(xiàn)的概率可以用其頻率來表示。
- 一元語言模型(unigram)
- 二元語言模型(bigram)
- 三元語言模型(trigram)
- 某個(gè)詞出現(xiàn)的概率只和其前N個(gè)詞有關(guān)系。
神經(jīng)網(wǎng)絡(luò)語言模型
- 上述的n-gram模型一般只考慮前面2-3個(gè)詞的信息,不方便考慮更多的詞提供的信息,同時(shí)也未考慮詞與詞之間的相似性。
- 神經(jīng)網(wǎng)絡(luò)語言模型,將詞匯表中的每個(gè)詞表示成一個(gè)在m維空間里的實(shí)數(shù)形式的分布式特征向量,使用序列中詞語的分布式特征向量來表示連續(xù)概率函數(shù),同時(shí)學(xué)習(xí)特征向量和概率函數(shù)的參數(shù)。
3 word2vec實(shí)現(xiàn)方式及優(yōu)化方式
skip-gram(跳字模型)
- 用一個(gè)詞來預(yù)測它正在文本序列周圍的詞。
- 跳字模型需要最大化給定任一中心詞生成所有背景詞的概率。
- 中心詞向量
- 問題=》數(shù)學(xué)=》最大化=》最小化=》梯度下降
CBOW模型,連續(xù)詞袋模型
- CBOW模型用一個(gè)中心詞在文本序列前后的背景詞來預(yù)測該中心詞。
負(fù)采樣
層序softmax
- 二叉樹
4 word2vec實(shí)戰(zhàn)
讀取停用詞
文本預(yù)處理
- 去掉文本中的空格、回車、換行、空白行
- rules = u"([\u4e00-\u9fa5]+)",去掉標(biāo)點(diǎn)符號(hào)
分詞
- " ".join(jieba.cut(line))
- 分詞之后去掉標(biāo)點(diǎn)符號(hào)
5 word2vec之gensim工具包的使用
gensim中word2vec相關(guān)API的說明
在gensim中,word2vec相關(guān)的API都在包gensim.models.word2vec中。和算法相關(guān)的參數(shù)都在類 gensim.models.word2vec.Word2Vec中。
算法中主要的參數(shù):
- sentences,要分析的語料,可以是一個(gè)列表,或者文件中遍歷讀出
- size,詞向量的維度,默認(rèn)是100。這個(gè)維度的取值一般與語料庫的大小相關(guān),如果不大的語料庫,如小于100M的預(yù)料,則使用默認(rèn)值,如果用的語料庫較大,建議增大維度。
- window,即詞向量上下文最大距離,windows越大就和較遠(yuǎn)的詞也會(huì)產(chǎn)生上下文關(guān)系。默認(rèn)值是5。在實(shí)際使用中,可以根據(jù)實(shí)際需求動(dòng)態(tài)調(diào)整windows的大小。如果語料庫較小,這個(gè)值可以設(shè)置的更小。對于一般的語料,通常設(shè)置為[5,10]之間。
- sg:用于cbow和skip-gram模型之間選擇,sg=0,選擇cbow模型;sg=1,則選擇skip-gram模型,默認(rèn)sg=0。
- hs:用于選擇Word2vec求解方法,hs=0,選擇Negative Sampling,即負(fù)采樣;hs=1,且負(fù)采樣個(gè)數(shù)negative大于0,選擇Hoierarchical Softmax求解方式。默認(rèn)hs=0。
- negative,即Negative Sampling時(shí),負(fù)采樣的個(gè)數(shù),默認(rèn)是5,推薦在[3,10]之間。
- cbow_mean,僅用于CBOW在做投影的時(shí)候,若cbow_mean=0,則為上下文向量之和,若cbow_mean=1,則為上下文的向量的平均值。默認(rèn)若cbow_mean=1。
- min_count,需要計(jì)算詞向量的最小詞頻,這個(gè)值可以去掉一些很生僻的低頻次,默認(rèn)是5。如果小語料,可以調(diào)低這個(gè)值。
- iter,隨機(jī)梯度下降法中迭代的最大次數(shù),默認(rèn)是5,對于大語料,可以增大這個(gè)值。
- alpha,隨機(jī)梯度下降法中迭代初始的步長,默認(rèn)是0.025。
- min_alpha,迭代最小的步長值。
注意:對于通用領(lǐng)域可以直接使用已經(jīng)訓(xùn)練好的詞向量
6 fasttext理論部分
- FastText是FAIR(Facebook AIResearch)在2016年推出的一款文本分類工具與向量化工具。
- 官網(wǎng):https://fasttext.cc/
- fasttext高效的文本分類和表示工具。
- 對模型進(jìn)行裁剪和壓縮之后,可以輕松跑在移動(dòng)設(shè)備上。
- 驚艷的地方:和前沿的深度網(wǎng)絡(luò)模型相比,在分類精度等指標(biāo)相同的情況下,fasttext把訓(xùn)練和推斷速度降低了幾個(gè)數(shù)量級。
- 對比的模型:char-CNN、VDCNN、fasttext
- fasttext速度快的兩個(gè)主要秘密武器:
- 利用了詞內(nèi)的n-gram信息(subword n-gram information)
- 利用了層次化softmax(hierarachical softmax)回歸的訓(xùn)練技巧
在fasttext出現(xiàn)之前,大部分的文本向量化工作都是以詞匯表中的獨(dú)立單詞作為基本單元來進(jìn)行訓(xùn)練的,但是這種處理方式有以下兩個(gè)缺點(diǎn):
- 低頻詞、罕見詞,由于在語料庫中出現(xiàn)的次數(shù)少,得不到足夠的訓(xùn)練,效果不佳。
- 未登錄詞,如遇到未在詞典中收錄的詞或者拼寫錯(cuò)誤的詞時(shí),模型的變現(xiàn)就比較差。
subword n-gram
subword n-gram的引入解決了詞變形(morphology)的問題。直觀上,subword n-gram將一個(gè)單詞打散到字符級別,并且利用字符級別的n-gram信息來捕獲字符間的順序關(guān)系,依次豐富單詞內(nèi)部更細(xì)微的語義。
分層softmax
softmax就是logistic regerssion在多分類任務(wù)上的推廣,一般是神經(jīng)網(wǎng)絡(luò)的最后一層。
層次化softmax實(shí)質(zhì)上是將一個(gè)全局多分類問題,轉(zhuǎn)化成若干個(gè)二元分類問題,從而降低計(jì)算的復(fù)雜度。
7 fasttext文本分類實(shí)戰(zhàn)
fasttext模型目前在windows平臺(tái)上不能使用
- 可以實(shí)現(xiàn)文本的分類【主要用于文本分類】
- 可以構(gòu)造一個(gè)詞向量
8 Glove講解
Glove簡介
Glove (Global vectors for word representation),2014年由Stanford NLP Group組織提出,它是一個(gè)基于全局詞頻統(tǒng)計(jì)(cont-based & over statistics)的詞表示工具,它可以把一個(gè)單詞表示成一個(gè)由實(shí)數(shù)組成的向量,這些向量捕捉到了單詞之間一些語義特性,比如相似性、類比性等。
通過對象量的運(yùn)算,如歐幾里得距離或者cosine相似度,可以計(jì)算出兩個(gè)單詞之間的語義相似性。
Glove是一種更別致的詞向量表示。
Glove實(shí)現(xiàn)分為以下三步:
- 構(gòu)建一個(gè)共現(xiàn)矩陣 co-ocurrence matrix
- 構(gòu)建詞向量和共現(xiàn)矩陣之間的關(guān)系
- 構(gòu)造 loss function
Co-ocurrence Matrix
- Co-occurrence: 協(xié)同出現(xiàn)指的是兩個(gè)單詞w1和w2在一個(gè)context window范圍內(nèi)共同出現(xiàn)的次數(shù)。
- Context Windows:指的是某個(gè)單詞w的上下文范圍的大小,也就是前后多少個(gè)單詞以內(nèi)的才算是上下文。
優(yōu)點(diǎn):
- 比字?jǐn)?shù)統(tǒng)計(jì)和tfidf都要進(jìn)步一點(diǎn)。因?yàn)樗辉僬J(rèn)為單詞是獨(dú)立的,而考慮單詞所在附近的上下文。
Glove的實(shí)現(xiàn)
構(gòu)造共現(xiàn)矩陣 Co-ocurrence Matrix,矩陣中每一個(gè)元素Xij代表單詞i和上下文單詞j在特定大小的上下文窗口內(nèi)共同出現(xiàn)的次數(shù)。
構(gòu)建詞向量和共現(xiàn)矩陣之間的近似關(guān)系。
構(gòu)造損失函數(shù)。單詞的權(quán)重要大于哪些很少在一起出現(xiàn)的單詞,所以這個(gè)函數(shù)應(yīng)該是非遞減函數(shù)。權(quán)重不過大,當(dāng)達(dá)到一定程度之后不再增加。如果兩個(gè)單詞沒有在一起出現(xiàn),則Xij=0。
Glove是如何實(shí)現(xiàn)訓(xùn)練的?
雖然很多人聲稱Glove是一種無監(jiān)督學(xué)習(xí),但其是它還是有l(wèi)abel的,只不過這個(gè)label是自動(dòng)標(biāo)記的。
Glove與LSA、Word2vec的比較?
- LSA是一種比較早的count-based詞向量表示工具,計(jì)算量大。
- word2vec,可以分為skip-gram和cbow兩類,但都是基于局部滑動(dòng)窗口計(jì)算的,即利用了局部的上下文特征(Local Context)。
- Glove結(jié)合了LSA的優(yōu)點(diǎn),即利用了全局的特征,減少了計(jì)算量,也使用了局部上下文的特征。
從工程的角度看,word2vec和Glove可以考慮同時(shí)使用