Python实现node2vec构建词向量

一、node2vec原理

node2vec是由Perozzi 等学者提出的将 word2vec 的思想用于图节点表示学习的一种Deepwalk 算法, 该算法在Deepwalk的基础上改变了随机游走的序列生成方式, 通过半监督的方式学习 p p p, q q q 两个超参数的值, 控制游走对深度和广度的趋向, 其中 p p p控制跳向前节点邻居的概率, q q q控制跳向前节点非邻居的概率, 如图所示:
在这里插入图片描述
q > 1 q>1 q>1时, 趋向于遍历临近 t t t节点的 x 1 x_1 x1节点,即趋向于BFS;当 p > 1 p>1 p>1时, 趋向于遍历临近 t t t节点的 x 2 x_2 x2 x 3 x_3 x3节点, 即趋向于DFS。在确定要遍历的邻居节点之后, 采用 skip-gram 模型进行训练进而获得节点的向量表示。
node2vec算法的详细推导请移步:https://zhuanlan.zhihu.com/p/46344860

二、Python代码实现

1. node2vec依赖word2vec,以及需要用到网络图,所以需要安装三个包

pip install gensim
pip install node2vec
pip install networkx

2. 导入所需包

import jieba
import networkx as nx
from node2vec import Node2Vec
from gensim.models import Word2Vec

3. 准备中文分词语料

本文省略数据读取部分,直接从分词开始。

content_cut = content.apply(lambda text:jieba.lcut(text))

其中content为pandas读取的中文文档。

4. 构建网络图

graph = nx.Graph()  # 网络初始化
# 构建网络图(笔者选择词的相差长度为1作为共词标准)
for cont in content_cut.values:
    for ind, word, in enumerate(cont[:-1]):
        graph.add_edge(word, cont[ind+1])

5. node2vec图的构建,向量维度设置为200维

node2vec = Node2Vec(graph, dimensions=200, walk_length=30, num_walks=200, workers=1)

6. node2vec模型训练与保存

model = node2vec.fit(window=10, min_count=1, batch_words=4) 
model.save('node2vec.model')

如果数据量大,第五、六步耗时较长,需要耐心等待。

7. 加载模型并构建文档向量

# 加载模型
node2vec = Word2Vec.load(node2vec.model')
def get_text_node2vec():
    text_vec = np.zeros((content.shape[0], 200))
    for ind, text in enumerate(content):
        wlen = len(text)
        vec = np.zeros((1, 200))
        for w in text:
            try:
                vec += node2vec.wv[w]
            except:
                pass
        text_vec[ind] = vec/wlen
    word2vec = pd.DataFrame(data=text_vec)
    word2vec.to_csv('node2vec.csv', index=False)
get_text_node2vec()

以上便完成了node2vec词向量训练,并构建了每个文档的向量,方便后续深入挖掘分析。与word2vec相比,node2vec算法由于涉及到太多的循环迭代,所以训练词向量的时间较长。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饕餮&化骨龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值