word2vec 詞向量embeding實現

2022-11-24 19:52:00 字數 4585 閱讀 9464

一 word2vec現有三種模型框架:

1 n-gram模型(

eg求大家 喜歡 吃 (蘋果)的概率

(1)計算後驗概率:

p(大家)表示“大家”這個詞在語料庫裡面出現的概率;

p(喜歡|大家)表示“喜歡”這個詞出現在“大家”後面的概率;

p(吃|大家,喜歡)表示“吃”這個詞出現在“大家喜歡”後面的概率;

p(蘋果|大家,喜歡,吃)表示“蘋果”這個詞出現在“大家喜歡吃”後面的概率。

p(大家,喜歡,吃,蘋果)=p(大家)p(喜歡|大家)p(吃|大家,喜歡)p(蘋果|大家,喜歡,吃)

2 cbow(bag of word)詞袋:1one_hot編碼(統計每個詞頻率,編號大頻序號小),2向量化(維度m),3**求和softmax,目標函式是**結果和真實結果的交叉熵。

網路結構圖如下所示:

3 skip—gram模型:根據單詞計算上下文的概率(逆向思維)

cbow和skip—gram模型都是考慮到語境上下文的。

二 word2vec的實現trick

作者的還用到了一些其他的trick,比如每個句子都做取樣,根據詞頻隨機刪掉一些單詞,上下文視窗的大小是隨機的。

距離:1歐式距離 2餘弦距離 (numpy快速實現)

三 程式設計code

1)paddle網路搭建如下:

import math

import paddle.v2

aspaddle

embsize = 32

# 詞向量維度

hiddensize = 256

# 隱層維度

n = 5 # 訓練5-gram

def wordemb(inlayer):

wordemb =paddle.layer.table_projection(

input=inlayer,

size=embsize,

param_attr=paddle.attr.param(

name="

_proj",

initial_std=0.001

, learning_rate=1

, l2_rate=0

, sparse_update=true))

return

wordemb

paddle.init(use_gpu=false, trainer_count=3

) # 初始化paddlepaddle

word_dict =paddle.dataset.imikolov.build_dict()

dict_size =len(word_dict)

# 每個輸入層都接受整形資料,這些資料的範圍是[

0, dict_size)

firstword =paddle.layer.data(

name="

firstw

", type=paddle.data_type.integer_value(dict_size))

secondword =paddle.layer.data(

name="

secondw

", type=paddle.data_type.integer_value(dict_size))

thirdword =paddle.layer.data(

name="

thirdw

", type=paddle.data_type.integer_value(dict_size))

fourthword =paddle.layer.data(

name="

fourthw

", type=paddle.data_type.integer_value(dict_size))

nextword =paddle.layer.data(

name="

fifthw

", type=paddle.data_type.integer_value(dict_size))

efirst =wordemb(firstword)

esecond =wordemb(secondword)

ethird =wordemb(thirdword)

efourth =wordemb(fourthword)

contextemb = paddle.layer.concat(input=[efirst, esecond, ethird, efourth])

hidden1 = paddle.layer.fc(input=contextemb,

size=hiddensize,

act=paddle.activation.sigmoid(),

layer_attr=paddle.attr.extra(drop_rate=0.5

), bias_attr=paddle.attr.param(learning_rate=2

), param_attr=paddle.attr.param(

initial_std=1. / math.sqrt(embsize * 8

), learning_rate=1))

predictword = paddle.layer.fc(input=hidden1,

size=dict_size,

bias_attr=paddle.attr.param(learning_rate=2

), act=paddle.activation.softmax())

cost = paddle.layer.classification_cost(input=predictword, label=nextword)

parameters =paddle.parameters.create(cost)

adagrad =paddle.optimizer.adagrad(

learning_rate=3e-3

, regularization=paddle.optimizer.l2regularization(8e-4

))trainer =paddle.trainer.sgd(cost, parameters, adagrad)

import gzip

def event_handler(

event

):

if isinstance(event, paddle.event

.enditeration):

ifevent.batch_id % 100 == 0

: print

"pass %d, batch %d, cost %f, %s

" %(

event.pass_id, event.batch_id, event.cost, event

.metrics)

if isinstance(event, paddle.event

.endpass):

result =trainer.test(

paddle.batch(

paddle.dataset.imikolov.test(word_dict, n),

32))

print

"pass %d, testing metrics %s

" % (event

.pass_id, result.metrics)

with gzip.open(

"model_%d.tar.gz

"%event.pass_id, '

w') as

f: parameters.to_tar(f)

trainer.train(

paddle.batch(paddle.dataset.imikolov.train(word_dict, n),

32),

num_passes=100

, event_handler=event_handler)

訓練過程截圖:

2)對詞編碼成向量後對應用如下

embeddings = parameters.get("

_proj

").reshape(len(word_dict), embsize)

print embeddings[word_dict[

'

執行結果:

計算兩個詞的相似度:

from

scipy import spatial

emb_1 = embeddings[word_dict['

world']]

emb_2 = embeddings[word_dict['

would']]

print spatial.distance.cosine(emb_1, emb_2)

執行結果:

0.99375076448

升級篇:一種是hierarchical softmax,另一種是negative sampling  

單詞轉換成向量形式 word2vec

word2vec word to vector 是一個將單詞轉換成向量形式的工具。可以把對文字內容的處理簡化為向量空間中的向量運算,計算出向量空間上的相似度,來表示文字語義上的相 似度。word2vec為計算向量詞提供了一種有效的連續詞袋 bag of words 和skip gram架構實現。來自...

基於word2vec的文件向量模型的應用

在 word2vec中的數學 中談到了訓練語言模型的一些方法 比如n gram和神經網路。在使用神經網路訓練語言模型時得到的 副產物 就是word2vec詞向量。基於神經網路訓練語言模型有2種方案 cbow和skip gram,它們是在這篇文章 a neural probabilistic lang...