【词嵌入网络】word2vec词向量网络步骤构建详解(附python代码实现)

前言

构建网络的基础要素有两个,节点节点间的联系
初始数据集存在的情况下,节点间的一层联系就可以通过最基础的共现概率求得。
再往深就到剖析节点间的二层联系的时候了。

word2vec词向量训练

Word2Vec是谷歌在 2013 年推出来的一个自然语言处理工具,可用来计算文本的词向量,从而实现定量的度量词与词之间的关系。

本篇使用gensim库中现成的word2vec模型训练词向量,需要准备的只是语句集参数

语句集示例

假定初始数据列表为

单次购置商品
A,B
B,C
C,D
E,B,F
D,E

那么转换后的语句集就为

sentences = [[A,B],[B,C],[C,D],[E,B,F],[D,E]]
参数说明

min_count:词语频度,低于这个阈值的词语不做词向量
size:每个词对应向量的维度,也就是向量长度
workers:并行训练任务数
其他一般常用default,站里也有不少博客说明,我这里就略过了。

源码

一次训练

import gensim
from gensim.models import word2vec

SIZE = 30

model = word2vec.Word2Vec(sentences, size=SIZE, min_count=10)

# 保存词向量模型,下次只需要load就可以用了
model.save("../dataset/wordvector_network/word2vec_atec")

二次增量训练

# 加载已有模型
model = gensim.models.Word2Vec.load("../dataset/wordvector_network/word2vec_atec")

# 进行增量训练
corpus = [[B,C,D,F],[A,C,D]] # 新增语料
model.build_vocab(corpus, update=True)  # 训练该行
model.train(corpus, total_examples=model.corpus_count, epochs=model.iter)

# 保存增量训练后的新模型
model.save("../dataset/wordvector_network/word2vec_atec")

查看训练完的节点词向量

model.wv[A]

cosine相似度计算

由于角度的余弦值区间为-1到1,而0度的角余弦值正好是1,因此当余弦相似度为1时代表两个向量的指向相同,-1时相反。因此可以通过余弦值来度量相似度,向量夹角越小证明cosine值越大,同时也说明两个节点越相似。

同样调sklearn里的cosine_similarity函数,直接计算。

源码
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

cosine_similarity(np.array(model.wv[A]).reshape(1,SIZE),np.array(model.wv[B]).reshape(1,SIZE))

构建网络

遍历节点集,分别计算节点间关联度,剔除低于阈值的边后网络构建完毕。