首頁  >  文章  >  後端開發  >  詞向量嵌入的實例詳解

詞向量嵌入的實例詳解

PHP中文网
PHP中文网原創
2017-06-21 16:11:303072瀏覽

詞向量嵌入需要高效率處理大規模文字語料庫。 word2vec。簡單方式,將詞送入獨熱編碼(one-hot encoding)學習系統,長度為詞彙表長度的向量,詞語對應位置元素為1,其餘元素為0。向量維數很高,無法刻畫不同字詞的語意關聯。共生關係(co-occurrence)表示單詞,解決語義關聯,遍歷大規模文本語料庫,統計每個單詞一定距離範圍內的周圍詞彙,用附近詞彙規範化數量表示每個詞語。類似語境中詞語語義相似。用PCA或類似方法降維出現向量(occurrence vector),得到更稠密表示。性能好,追蹤所有詞彙共生矩陣,寬度、高度為詞彙表長度。 2013年,Mikolov、Tomas等提出上下文計算詞表示方法,《Efficient estimation of word representations in vector space》(arXiv preprint arXiv:1301.3781(2013))。 skip-gram模型,從隨機表示開始​​,依據當前詞語預測上下文詞語簡單分類器,誤差透過分類器權值和詞表示傳播,對兩者調整減少預測誤差。大規模語料庫訓練模型表示收債量逼近壓縮後共生向量。

資料集, 英文維基百科轉儲檔案包含所有頁面完整修訂歷史,目前頁面版本100GB,。

下載轉儲文件,提取頁面詞語。統計詞語出現次數,建構常見詞彙表。用詞彙表對擷取頁面編碼。逐行讀取文件,結果立即寫入磁碟。在不同步驟間保存檢查點,避免程式崩潰重來。

__iter__遍歷詞語索引清單頁面。 encode取得字串詞語詞彙索引。 decode依據詞彙索引傳回字串字詞。 _read_pages從維基百科轉儲文件(壓縮XML)提取單詞,儲存到頁面文件,每個頁面一行空格分隔的單字。 bz2模組open函數讀取檔案。中間結果壓縮處理。正規表示式可捕捉任意連續字母序列或單獨特殊字母。 _build_vocabulary統計頁面檔案單字數,出現頻率高字寫入檔案。獨熱編碼需要詞彙表。詞彙表索引編碼。移除拼字錯誤、極不常見詞語,詞彙表只包含vocabulary_size - 1個最常見詞語。所有不在詞彙表詞語標記,未出現單字詞向量。

動態形成訓練樣本,組織到大批數據,分類器不佔大量記憶體。 skip-gram模型預測當前詞語的上下文詞語。遍歷文本,當前詞語數據,周圍詞語目標,創建訓練樣本。上下文尺寸R,每個字生成2R樣本,當前字左右各R個字。語意上下文,距離近重要,盡量少創建遠上下文詞語訓練樣本,範圍[1,D=10]隨機選擇詞上下文尺寸。依據skip-gram模型形成訓練對。 Numpy數組產生數值流批資料。

初始,單字表示為隨機向量。分類器根據中層表示預測上下文單字目前表示。傳播誤差,微調權值、輸入單字表示。 MomentumOptimizer 模型最佳化,智能不足,效率高。

分類器是模型核心。噪音對比估計損失(noisecontrastive estimation loss)性能優異。 softmax分類器建模。 tf.nn.nce_loss 新隨機向量負樣本(對照樣本),近似softmax分類器。

訓練模型結束,最終詞向量寫入檔案。維基百科語料庫子集,普通CPU訓練5小時,得到NumPy數組嵌入表示。完整語料庫:  。 AttrDict類別等價Python dict,鍵可屬性存取。

import bz2
   導入集合
   導入 os
   導入 re
   from lxml import etree
   from helpers import download#nm iki  class  '[A-Za-z]+|[!?.:,()]')
        def __init__(self, url, cache_dir,vocabulary_size=10000):##  系統(cache_dir)
            self._pages_path = os.path.join(self._cache_dir, 'pages.bz2')
      sel    ). z2')
            若不是os.path.isfile(self._pages_path):
                print('閱讀頁面')##  page page     順      如果不是os.path.isfile(self._vocabulary_path):
                print('建構字彙表')
                self._build_vocab. , 'rt') 作為字彙表:
                  print('讀字表')
                self._vocabulary = [x.strip() for x invocabulary]
           . def __iter__(self) :
            with bz2.open(self._pages_path, 'rt') 作為頁面:
                page split()
                       words = [self .encode(x) ) 對於單字中的x]
                    產生單字
        @property##  f._vocabulary)
        defencode(self, word):
            return self._indices.get(word, 0)
        def 解碼(self, index):
     . f, url):
            wikipedia_path = download(url , self._cache_dir)
            withbz2.open(wikipedia_path) 作為維基百科, \
           : cp.      for _, etree. iterparse(wikipedia) 中的元素, tag='{*}page'):
                    如果element.find('./{*}redirect') 不是None:##  如果element.find('./{*}redirect') 不是None:##  如果element.find('./{*}redirect') 不是None:##                     page = element.findtext ('./{* }revision/{*}text')
                    Words = self._tokenize(page)
                     element .clear()
        def _build_vocabulary(self,vocabulary_size):
            counter = coll,頁:
                頁中的頁:
                   的話語= pag.strip()。 common = [x [x [0 ] 對於x 的共通點]
            以bz2.open(self._vocabulary_path, 'wt') 作為字彙表:
       vocabulary.write( word + '\n')
@類別方法
        def _tokenize(cls, page):
            Words = cls.TOKEN_REGEX.findall(page)
         張量流as tf
   import numpy as np

   from helpers importlazy_property

   class EmbeddingModel:
      問題 def __init__(self data f.data = data
              self .目標= 目標
            self.params = params
            self.embeddings
      sel   self.embeddings
           @lazy_property
        def embeddings(self):
           初始= tf . random_uniform(
                [self.params.vocabulary_size, self.params.embedding_size],
         .embedding_size],
         . return tf.Variable(initial)
        @lazy_property
       def 最佳化(自我) :
            優化器= tf.train.MomentumOptimizer(
                self. ize(self.cost)
        @lazy_property
        def cost( self):
            嵌入= tf.nn.embedding_lookup(self.embeddings, self.data)
         [self.params.vocabulary_size, self.params 。            target = tf. expand_dims( self.target,1)
返回tf.reduce_mean(tf.nn.n.nce_loss(
重量,偏見,偏見,嵌入式,target,
self.params.contrastive_examples,
self.params.params.params.vocabulary_size))

導入集合
   導入tensorflow as tf
   導入numpy as np
   from batched import batched
   from EmbeddingModel import EmbeddingModel#fimgram  Wikipedia
from helpers import AttrDict
   WIKI_DOWNLOAD_DIR = './wikipedia'
   params = AttrDict(
       vocabulary_size=10000,#      _ ize=200,
       contrastive_examples=100,
Learning_rate=0.5,
       動量=0.5,
       batch_size=1000,
   )
   data = 1.placeer(tfplace.) int32, [無])
   模型= EmbeddingModel(資料、目標、參數)
   語料庫= 維基百科(
        'https://dumps.wikimedia.org/enwiki/20160501/'#wikimedia.org/enwiki/20160501/'#wikimedia.org/enN#20160501/'#wiki 。 params.max_context)
   批次=批量(例如,params.batch_size)
   sess = tf.Session()
   sess.run(tf.initialize_all_variables())
   average = collections.deque(maxlen=100) 批次為# max 列舉(批次):
        feed_dict = {資料:batch[0],目標:batch[1]}
        cost,_ = sess.run([model.cost,model.optimize],feed_dict)
       average.append(cost)
        print('{}: {:5.1f}'.format(index + 1, sum(average) / len(aver age)))
     100000:
           break
#    embeddings = sess.run(model.embeddings)
   np.save(WIKI_DOWNLOAD_DIR + '/embeddbe .npypy#

以上是詞向量嵌入的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn