1. 程式人生 > >21.【進階】流行庫模型--word2vec

21.【進階】流行庫模型--word2vec

詞的向量化表示

word2vec模型的採用的思想是,n元語法模型(n-gram model),即假設一個詞只與周圍n個詞有關,而與文字中的其他詞無關

  • 首先,我們要明確,句子中的連續詞彙片段,也被稱為上下文context,詞彙之間的聯絡就是通過無數個這樣的上下文建立的。以The cat is walking in the bedroom.為例,如果我們需要這句話中上下文數量為4(每一個片段中有4個詞彙)的欄位,那麼就有The cat is walking、cat is walking in 、is walking in the 、walking in the bedroom共4個context;
  • 從語言模型的角度來講每個連續片段的最後一個單詞究竟可能是什麼,都會受到該片段中前面所有單詞的制約,因此這就形成了一個根據片段中前面單詞,預測最後一個單詞的監督學習系統;
  • 以神經網路框架來描述,當context數量為n(每一個片段中有n個詞彙)時,提供給這個網路的輸入都是前(n-1)個詞彙片段,在下圖中用淺藍色矩形表示,最終指向的輸出就是片段中的最後一個單詞;
  • 在網路中,需要計算的是這些詞彙的向量表示,如C(W_t-1)表示要計算的是輸入的片段中第(t-1)個單詞的向量表示,圖中每個紅色實心圓都代表了某個詞所對應的向量中的元素,實心圓的個數代表了詞向量的維度,且所有詞彙的維度是一致的;
  • 通過不斷迭代、更新引數,迴圈往復,最終獲得每個詞彙獨特的向量表示。
    這裡寫圖片描述

    實現程式碼:
#-*- coding:utf-8 -*-

#學習任務:使用genism工具包,對新聞文字進行詞向量訓練,並且通過抽樣幾個詞彙,查驗word2vec技術能否尋找到相似的詞彙

from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')
X,y = news.data,news.target

#從bs4裡匯入BeautifulSoup
from bs4 import BeautifulSoup
#匯入nltk,re工具包
import nltk,re
#定義一個函式名為news_to_sentences的方法,將每條新聞中的句子逐一剝離出來,並返回一個句子列表
def news_to_sentences(news): #get_text(): Get all child strings, concatenated(串聯) using the given separator. news_text = BeautifulSoup(news).get_text() tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') raw_sentences = tokenizer.tokenize(news_text) sentences = [] for sent in raw_sentences: #Python的re模組提供了re.sub用於替換字串中的匹配項。 #語法:re.sub(pattern, repl, string, count=0, flags=0) # pattern : 正則中的模式字串。 # repl : 替換的字串,也可為一個函式。 # string : 要被查詢替換的原始字串。 # count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。 sentences.append(re.sub('[^a-zA-Z]',' ',sent.lower().strip()).split()) return sentences #這裡必須空一行 sentences=[] #將長篇新聞文字中的句子剝離出來,用於訓練 for x in X: sentences += news_to_sentences(x) #此處要空一行,表示下一步程式碼寫在for迴圈外面 #從gensim.models匯入word2vec from gensim.models import word2vec #配置詞向量的維度 num_features=300 #被考慮的詞彙的頻度 #min-count 表示設定最低頻率,預設為5,如果一個詞語在文件中出現的次數小於該閾值,那麼該詞就會被捨棄 min_word_count = 20 #設定並行化訓練使用CPU計算核心的數量 num_workers = 2 #定義上下文的視窗大小 context = 5 #定義下采樣的值為10^-3 downsampling=1e-3 #訓練詞模型 Word2Vec #引數說明 轉自:(https://www.cnblogs.com/wuxiangli/p/7183476.html): # sentences:可以是一個·ist,對於大語料集,建議使用BrownCorpus,Text8Corpus或·ineSentence構建。 # sg: 用於設定訓練演算法,預設為0,對應CBOW演算法;sg=1則採用skip-gram演算法。 # size:是指特徵向量的維度,預設為100。大的size需要更多的訓練資料,但是效果會更好. 推薦值為幾十到幾百。 # window:表示當前詞與預測詞在一個句子中的最大距離是多少 # alpha: 是學習速率 # seed:用於隨機數發生器。與初始化詞向量有關。 # min_count: 可以對字典做截斷. 詞頻少於min_count次數的單詞會被丟棄掉, 預設值為5 # max_vocab_size: 設定詞向量構建期間的RAM限制。如果所有獨立單詞個數超過這個,則就消除掉其中最不頻繁的一個。每一千萬個單詞需要大約1GB的RAM。設定成None則沒有限制。 # sample: 高頻詞彙的隨機降取樣的配置閾值,預設為1e-3,範圍是(0,1e-5) # workers:控制訓練的並行數。 # hs: 如果為1則會採用hierarchica·softmax技巧。如果設定為0(defau·t),則negative sampling會被使用。 # negative: 如果>0,則會採用negativesamp·ing,用於設定多少個noise words # cbow_mean: 如果為0,則採用上下文詞向量的和,如果為1(defau·t)則採用均值。只有使用CBOW的時候才起作用。 # hashfxn: hash函式來初始化權重。預設使用python的hash函式 # iter: 迭代次數,預設為5 # trim_rule: 用於設定詞彙表的整理規則,指定那些單詞要留下,哪些要被刪除。可以設定為None(min_count會被使用)或者一個接受()並返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函式。 # sorted_vocab: 如果為1(default),則在分配word index 的時候會先對單詞基於頻率降序排序。 # batch_words:每一批的傳遞給執行緒的單詞的數量,預設為10000 model = word2vec.Word2Vec(sentences,workers=num_workers,\ size=num_features,min_count=min_word_count,\ window=context,sample=downsampling) #這個設定代表當前訓練好的詞向量為最終版,也可以加快模型的訓練速度 model.init_sims(replace=True)
#1.利用訓練好的模型,尋找訓練文字中與morning最相關的十個詞彙
model.most_similar('morning')

輸出:

[(u'afternoon', 0.8229345679283142), (u'weekend', 0.795312225818634), (u'evening', 0.747612476348877), (u'saturday', 0.7321940064430237), (u'night', 0.7067388296127319), (u'friday', 0.6979213356971741), (u'sunday', 0.6577881574630737), (u'monday', 0.6498968601226807), (u'summer', 0.649657666683197), (u'thursday', 0.6478739380836487)]
#2.利用訓練好的模型,尋找訓練文字中與love最相關的十個詞彙
model.most_similar('love')

輸出:

[(u'hate', 0.7348656058311462), (u'praise', 0.605739414691925), (u'pray', 0.5700856447219849), (u'die', 0.5681827068328857), (u'christ', 0.5652735829353333), (u'lord', 0.5511417388916016), (u'preach', 0.5481806397438049), (u'fear', 0.5467240810394287), (u'father', 0.5341935157775879), (u'eternal', 0.5326560735702515)]

總結:在不使用語言學詞典的前提下,詞向量技術仍然可以藉助上下文資訊,找出詞彙之間的相似性,這一技術可以作為基礎模型應用到更加複雜的自然語言處理中。