【词嵌入网络】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))
构建网络
遍历节点集,分别计算节点间关联度,剔除低于阈值的边后网络构建完毕。