使用DeepWalk 和Word2Vec实现单词Embedding

0、准备“边”数据集Wiki_edgelist

import pandas as pddf = pd.read_csv('./data/wiki/Wiki_edgelist.txt', sep=' ', header=None, names=["source", "target"])
df.head()

1、读入 起点-终点 边数据,构建图

# 1、读入 起点-终点 边数据,构建图
import networkx as nx
# G = nx.from_pandas_edgelist(df, "source", "target", edge_attr=True, create_using=nx.Graph())
G = nx.read_edgelist('./data/wiki/Wiki_edgelist.txt',create_using=nx.DiGraph(), nodetype=None, data=[('weight', int)])
print(G)
print(len(G))
DiGraph with 2405 nodes and 16523 edges
2405

2. 定义并实现一个输入起始点和随机游走步数的函数

# 2. 定义并实现一个输入起始点和随机游走步数的函数
import random
def get_randomwalk(node, path_length):'''输入起始节点和路径长度,生成随机游走节点序列'''random_walk = [node]for i in range(path_length-1):# 汇总邻接节点temp = list(G.neighbors(node))temp = list(set(temp) - set(random_walk))    if len(temp) == 0:break# 从邻接节点中随机选择下一个节点random_node = random.choice(temp)random_walk.append(random_node)node = random_nodereturn random_walk# 试着从随机森林出发,采样五个节点
# get_randomwalk('random forest', 5)
get_randomwalk('66', 5)
['66', '68', '1449', '1465', '1461']

3. 把所有节点放进一个列表list中。

4. 对每个节点生成随机游走序列

 5. 对每个结点跑DeepWalk

# 3. 把所有节点放进一个列表list中。
all_nodes = list(G.nodes())
print(all_nodes[:10])# 4. 接下来对每个节点生成随机游走序列
gamma = 10 # 每个节点作为起始点生成随机游走序列个数
walk_length = 5 
# walk_length 为随机游走序列最大长度
# 可是是无向图喔,length为什么可以小于5呢,不回原路返回吗?答案是不会,看上面get_randomwalk函数的定义,是会排除掉出发点的from tqdm import tqdm
# 5. 对每个结点跑DeepWalk
random_walks = []for n in tqdm(all_nodes):# 遍历每个节点for i in range(gamma):#每个节点作为起始点生成gamma个随机游走序列random_walks.append(get_randomwalk(n, walk_length))# 跑出来的随机游走序列个数
print(len(random_walks))
# 查看一个节点的 10个随机游走序列
print(random_walks[:gamma])
['1397', '1470', '362', '226', '750', '489', '1462', '1713', '393', '445']
100%|██████████| 2405/2405 [00:00<00:00, 7602.81it/s]
24050
[['1397', '226', '1467', '1466', '1450'], ['1397', '750', '489', '464', '397'], ['1397', '226', '246', '225', '224'], ['1397', '750', '489', '339', '1717'], ['1397', '226', '216', '222', '124'], ['1397', '226', '1464', '1444', '1445'], ['1397', '750', '1525', '1470', '1540'], ['1397', '226', '232', '235', '247'], ['1397', '489', '1825', '1860', '1722'], ['1397', '489', '708', '1530', '1498']]

6. 直接用Word2Vec来处理DeepWalk

# 6. 直接用Word2Vec来处理DeepWalk
from gensim.models import Word2Vec # 自然语言处理
model = Word2Vec(vector_size=256, # Embedding维数window=4, # 窗口宽度,NLP中就是左边看四个词,右边看四个词,graph就是左看四节点,右看四节点sg=1, # Skip-Gram,中心节点预测周围4*2节点;为0就是周围节点预测中心节点hs=0, # 不加分层softmaxnegative=10, # 负采样alpha=0.03,  # 初始学习率min_alpha=0.0007, # 最小学习率seed=14 # 随机数种子)# 用随机游走序列构建词汇表
model.build_vocab(random_walks, progress_per=2)# 训练,启动
model.train(random_walks, total_examples=model.corpus_count, epochs=50, report_delay=1)

7.  分析Wod2Vec(DeepWalk)结果

# 7.  分析Wod2Vec(DeepWalk)结果
# 查看单词/节点 的embedding
print(model.wv.get_vector("66").shape)
model.wv.get_vector("66")

8、查看和单词相似度高的单词(节点)

# 8、查看和单词相似度高的单词(节点)model.wv.similar_by_word("66")
[('966', 0.7036892175674438),('897', 0.6912005543708801),('60', 0.6891793608665466),('183', 0.684368908405304),('67', 0.6747772693634033),('11', 0.6455847024917603),('118', 0.638038694858551),('2006', 0.6363611817359924),('181', 0.6297730803489685),('65', 0.623363196849823)]

9、绘制图 可视化

# 将Embedding用TSNE降维到2维
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, n_iter=1000)
embed_2d = tsne.fit_transform(X)plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:, 0], embed_2d[:, 1])
plt.show()

将我们关心的节点展示在二维空间直角坐标系中
# 结合PageRank,计算出PageRank节点重要度前三十的节点,再加上一些手动补充我们关心的节点,把这一些节点进行可视化在二维图里。# 计算PageRank重要度
pagerank = nx.pagerank(G)
# 从高到低排序
node_importance = sorted(pagerank.items(), key=lambda x:x[1], reverse=True) # 排序# 取最高的前n个节点
n = 30
terms_chosen = []
for each in node_importance[:n]:terms_chosen.append(each[0])# 手动补充我们关心的节点
terms_chosen.extend(['666','66'])# 得到一个转换器term2index :输入词条,输出词典中的索引号
term2index = model.wv.key_to_index# 10-2 将刚刚的PageRank节点重要度前三十的节点,再加上一些手动补充我们关心的节点再次展示在二维空间直角坐标系中。 
plt.figure(figsize=(14,14))
plt.scatter(embed_2d[:, 0], embed_2d[:, 1])
for item in terms_chosen:idx = term2index[item]plt.scatter(embed_2d[idx,0], embed_2d[idx,1],c='r',s=50)plt.annotate(item, xy=(embed_2d[idx,0], embed_2d[idx,1]),c='k',fontsize=12)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GIS就业相关问题快问快答

目录 前言1.现在处于经济下行期&#xff0c;GIS就业岗位是否减少了&#xff1f;2.我未来的打算是进体制内研发岗&#xff0c;这方面需要掌握哪些技能呢&#xff1f;3.GIS前端需要掌握哪些知识&#xff1f;4.GIS后端需要掌握哪些知识&#xff1f;5.不论是前端还是后端&#xff0…

编程语言都是哪些人开发出来的?为什么都是国外较小国家的人

编程语言都是哪些人开发出来的&#xff1f; 编程语言的开发者通常是来自计算机科学、软件工程、数学、物理学等领域的专家、学者和工程师。这些开发者具备深厚的编程技能、算法知识、系统设计能力以及创新思维&#xff0c;他们致力于创造出能够解决特定问题或满足特定需求的编…

Docker入门(清晰认识)

为什么学习Docker&#xff1f; 再学完linux后&#xff0c;我们需要远程对Linux虚拟机下载一些软件&#xff0c;如果在Linux里直接用命令下载软件会十分麻烦&#xff0c;所以我们需要通过使用Docker将软件直接下载到Docker中&#xff0c;这样更方便下载和卸载等操作。 一张图弄…

javaScript的面试重点--预解析

目录 一.前言 二.预解析案例 一.前言 关于预解析&#xff0c;我们通过今天学习就能够知道解析器运行JS分为哪两步&#xff1b;能够说出变量提升的步骤和运行过程&#xff1b;能够说出函数提升的步骤和运行过程。 二.预解析案例 预解析&#xff0c;简而言之&#xff0c;也就是…

7.13实训日志

上午 学习网络安全的过程中&#xff0c;我们深入了解了网络的不同层面和技术&#xff0c;从表层网络到深网再到暗网&#xff0c;以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性&#xff0c;还揭示了如何应对和防范各种网络威胁。 首先&#xff0c;我们…

简易秒表的实现

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 请编写一个模块&#xff0c;实现简易秒表的功能&#xff1a;具有两个输出&#xff0c;当输出端口second从1-60循环计数&#xff0c;每当second计数到60&#xff0c;输出端口minute加一&#xff0c;一直…

当在多线程环境中使用 C++进行编程时,怎样确保线程安全以及如何处理线程之间的同步和通信?

在C中确保线程安全性和处理线程之间的同步和通信有多种方法。下面是一些常用的技术和技巧&#xff1a; 互斥锁&#xff1a;使用互斥锁可以确保只有一个线程可以访问共享资源。在访问共享资源之前获取锁&#xff0c;在完成后释放锁。这可以防止多个线程同时访问同一份数据&#…

007-端口隔离

端口隔离配置 端口隔离简介 为了实现报文之间的二层隔离&#xff0c;可以将不同的端口加入不同的VLAN&#xff0c;但会浪费有限的VLAN资源。采用端口隔离特性&#xff0c;可以实现同一VLAN内端口之间的隔离。 设备支持以下方式进行端口隔离&#xff1a; 基于隔离组的端口隔…

中介子方程五十七

XXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXαXXpXeXXkXyXWXOXiXXbXXpXXiXpXXhXiXXηXWXXhXuXVXXΣXXΣXyXiXXKXeXuXWXXyXLXαXXaXnXaXXFXXaXnXaXXαXLXyXXWXuXeXKXXiXyXΣXXΣXXVXuXhXXWXηXXiXhXXpXiXXpXXbXXiXOXWXyXkXXeXpXXα…

理解JavaScript中的对象传递与赋值操作

在JavaScript中&#xff0c;对象传递和赋值操作是两个非常重要的概念。它们在日常开发中扮演着关键角色&#xff0c;但也常常会让人感到困惑。本文将通过两个简单的例子&#xff0c;更好地理解它们的区别和实际应用。 示例代码1&#xff1a;修改对象属性 我们先来看第一段示例…

【数据结构】顺序表的应用

目录 一.引言 二.顺序表概念 三.顺序表的实现 1.定义顺序表 2.顺序表初始化 ​编辑 3.检查空间&#xff0c;如果满了&#xff0c;进行增容 4.顺序表尾插 5.顺序表尾删 6.顺序表头插 7.顺序表头删 ​编辑 8.顺序表查找 9.顺序表在pos位置插入x 10.顺序表删…

展开说说:Android页面绘制流程源码解析

说到Android系统View的绘制流程&#xff0c;大家一定知道是分为测量&#xff08;Measure&#xff09;、布局&#xff08;Layout&#xff09;和绘制&#xff08;Draw&#xff09;三个阶段&#xff0c;这篇文章主要聊一聊在这三个步骤之前的源码执行流程&#xff0c;页面启动后是…

C语言丢失精度 如何实现高精度计算

&#xff08;1&#xff09;int 类型举例 int &#xff1a;占4个字节&#xff0c;也就是32位&#xff0c;及最大值是2^32-11024*1024*1024*4-14294967295 以上说法错误&#xff0c;因为Int是有符号类型整数&#xff0c;所以最高位是符号位&#xff0c;及int的最大值应该是2^31…

【Java】链表的头插法和尾插法

头插法 头插法就是在已有的节点的前面插入新节点 如何实现 &#xff08;1&#xff09;先定义一个节点类ListNode&#xff0c;里面有value值和地址 public class ListNode {int value;ListNode next;public ListNode(int value){this.value value;}Overridepublic String t…

开发指南046-机构树控件

为了简化编程&#xff0c;平台封装了很多前端组件。机构树就是常用的组件之一。 基本用法&#xff1a; import QlmOrgTree from /qlmcomponents/tree/QlmOrgTree <QlmOrgTree></QlmOrgTree> 功能&#xff1a; 根据权限和控制参数显示机构树。机构树数据来源于核…

让我们一起来看看这些强大的中国汽车品牌如何勇攀巅峰!

咱们中国的汽车品牌&#xff0c;就是这么牛&#xff01;你知道吗&#xff1f;他们已经悄悄崛起&#xff0c;一步步向着更广阔的海外市场进军了。尽管这个过程可能有点坎坷&#xff0c;但是“勇敢”始终是他们前行的动力&#xff0c;推动着他们不断向前&#xff0c;打造属于我们…

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 目录 AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 一、简单介绍 二、文本摘要 三、在CNN/Daily…

秋招突击——7/9——MySQL索引的使用

文章目录 引言正文B站网课索引基础创建索引如何在一个表中查看索引为字符串建立索引全文索引复合索引复合索引中的排序问题索引失效的情况使用索引进行排序覆盖索引维护索引 数据库基础——文档资料学习整理创建索引删除索引创建唯一索引索引提示复合索引聚集索引索引基数字符串…

C#基于任务的异步模式(TAP)

1、C#异步模式分类 基于任务的异步模式&#xff08;TAP&#xff09; 基于事件的异步模式&#xff08;EAP&#xff09;和异步编程模型模式&#xff08;APM&#xff09; 2、基于任务的异步模式&#xff08;TAP&#xff09; 基于任务的异步模式&#xff08;TAP&#xff09;用单个方…

从零手写实现 nginx-28-error pages 指令

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …