使用DeepWalk 和Word2Vec实现单词Embedding

news2024/9/22 17:26:53

0、准备“边”数据集Wiki_edgelist

import pandas as pd

df = 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_node
        
    return 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, # 不加分层softmax
                 negative=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.coloradmin.cn/o/1921506.html

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

相关文章

如何评估独立站的外链质量?

要评估独立站的外链质量时&#xff0c;首先要看的不是别的&#xff0c;而是内容&#xff0c;跟你网站相关的文章内容才是最重要的&#xff0c;其他的一切其实都不重要。什么网站的DA&#xff0c;评级&#xff0c;网站的主要内容跟你的文章内容是否相关其实都不重要&#xff0c;…

git提交大文件服务500

错误如图 需保证git服务端能接收大文件 修改项目下.git文件中的config文件&#xff0c;加入 [http] postBuffer 524288000

逆变-TI视频课笔记

目录 1、全桥逆变 1.1、全桥逆变SPWM仿真 2、半桥逆变 2.1、本课小结 3、多重逆变&#xff08;间接的“交-直-交-直”变流&#xff09; 3.1、多电平逆变的目的 3.2、单逆变桥 3 电平控制时序 3.3、大功率设备的功率因数 3.4、本课小结 视频链接&#xff1a;文字…

怎样在 C 语言中实现堆排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

小程序-设置环境变量

在实际开发中&#xff0c;不同的开发环境&#xff0c;调用的接口地址是不一样的 例如&#xff1a;开发环境需要调用开发版的接口地址&#xff0c;生产环境需要正式版的接口地址 这时候&#xff0c;我们就可以使用小程序提供了 wx.getAccountInfoSync() 接口&#xff0c;用来获取…

分享 | 一文简述模糊测试智能体技术实践

近日&#xff0c;华为2012实验室中央软件院旗下的欧拉多咖创新团队成功举办了【欧拉多咖 — 操作系统研讨会】。本次研讨会以“系统安全AI&#xff1f;”为主题&#xff0c;探讨了大模型技术如何推动基础软件迈向大规模算力时代&#xff0c;并详细讨论了在这一过程中系统软件所…

论文 | LEAST-TO-MOST PROMPTING ENABLES COMPLEXREASONING IN LARGE LANGUAGE MODELS

论文主题&#xff1a; 这篇论文提出了“从简单到复杂提示”&#xff08;Least-to-Most Prompting&#xff09;这一新的提示策略&#xff0c;旨在解决大语言模型在解决比提示示例更复杂的问题时表现不佳的难题。 核心思想&#xff1a; 将复杂问题分解成一系列更简单的子问题。按…

Verilog基础:操作数的位选(bit-select)和域选(part select)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 位选 位选(bit-select)用于选择一个向量(vector)的某位&#xff0c;可以是线网大类(net)&#xff0c;也可以是变量大类(variable)中的reg、integer和time&#xf…

Redis 主从复制,哨兵与集群

目录 一.redis主从复制 1.redis 主从复制架构 2.主从复制特点 3.主从复制的基本原理 4.命令行配置 5.实现主从复制 6.删除主从复制 7.主从复制故障恢复 8.主从复制完整过程 9.主从同步优化配置 二.哨兵模式&#xff08;Sentinel&#xff09; 1.主要组件和概念 2.哨…

半小时获得一张ESG入门证书【详细中英文笔记一】

前些日子&#xff0c;有朋友转发了一则小红书的笔记给我&#xff0c; 标题是《半小时获CFI官方高颜值免费证书 ESG认证》。这对考证狂魔的我来说&#xff0c;必然不能错过啊&#xff0c;有免费的羊毛不薅白不薅。 ESG课程的 CFI 官方网址戳这里&#xff1a;CFI 于是信心满满的…

Electron运行报错:Error Cannot find module ‘node_moduleselectroncli.js‘

Electron运行报错&#xff1a;Error: Cannot find module ‘node_modules\electron\cli.js’ 顾名思义&#xff0c;命令行执行Electron .时候&#xff0c;会优先从项目目录查找对应依赖&#xff0c;如果是报错显示是找不到项目目录下的依赖&#xff0c;我们可以从安装在全局的…

轮转数组(时间复杂度不同的三种思路)

&#xff08;来源&#xff1a;LeetCode&#xff09; 题目 分析 其实一次轮转就是将最后一个数据放到最前面&#xff0c;其他数据整体向后移动一位。k为几就重复这个行为几次。 思路1 我们应该很快能想到最直接的一种思路。while(k--)……循环内完成两件事&#xff0c;保存最…

【C++】函数重载详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

Python面试全攻略:基础知识、特性、算法与实战解析

随着Python的普及&#xff0c;越来越多的人开始学习Python并尝试在面试中展示自己的技能。在这篇文章中&#xff0c;我们将探讨Python面试需要注意的问题以及一些经典的Python算法。 一、Python面试需要注意的问题 基础知识 在Python面试中&#xff0c;基础知识是非常重要的。…

开源浪潮:助力未来科技的飞速发展

文章目录 开源项目有哪些机遇与挑战&#xff1f;开源项目的发展趋势发展现状开源社区的活跃度 我是如何参与开源项目的经验分享选择开源项目贡献代码 开源项目的挑战开源项目面临的挑战 开源项目有哪些机遇与挑战&#xff1f; 随着全球经济和科技环境的快速变化&#xff0c;开源…

设计模式 - 最简单最有趣的方式讲述

别名《我替你看Head First设计模式》 本文以故事的形式带你从0了解设计模式&#xff0c;在其中你仅仅是一名刚入职的实习生&#xff0c;在项目中摸爬滚打。&#xff08;以没有一行真正代码的形式&#xff0c;让你无压力趣味学习&#xff09; 设计模式 策略模式观察者模式装饰者…

【简历】重庆某一本大学:JAVA简历指导,中厂通过率较低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份重庆某一本大学Java同学的简历。那么因为学校是一个一本的学校&#xff0c;就先要确定就业层次在中厂或者大厂&#xff0c;但是…

Zed 编辑器发布了原生 Linux 版本

由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本&#xff01;在过去的几个月里&#xff0c;Zed 的 Linux 支持取得了长足的进步&#xff0c;现在已经进入了更正式的阶段。 今天&#xff0c;这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…

算法的几种常见形式

算法&#xff08;Algorithm&#xff09; 算法&#xff08;Algorithm&#xff09;是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中&#xff0c;算法是程序的核心部分&#xff0c;它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…

如何在小红书上面有效地种草?

文末领取小红书电商开店运营教程&#xff01; 小红书是一个以内容分享为主的社交平台&#xff0c;大家喜欢在这里分享自己的生活体验和心得&#xff0c;其中就包括各种产品的使用感受。 那么我们要想在小红书上有效地种草&#xff0c;首先就需要了解并掌握小红书的种草文化。 …