詞向量嵌入需要高效率處理大規模文字語料庫。 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
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中文網其他相關文章!