昨天把一个超高质量的txt知识图谱数据,转换为csv格式!
只有这样,才能深入,摸清楚数据的底!导入到知识图谱中,最终用这个知识图谱,构建RAG应用!
今天,有三大目标,1是摸清楚这个数据的底!2是处理好数据的瑕疵!3是把数据导入到neo4j中!
导入部分(完整数据太大)数据后,是这样的!
现在!这份数据有450万+行数据,如下:
今天,我们深入摸这份数据!
一边摸,一边分析!一边修!
人的专注力只有10分钟,那!话不多说!
① 摸数据!是怎样的数据?多少缺失值?
② 处理数据!找到缺失+非标格式,含进阶策略!
③ 链接neo4j!申请key+接入到本地环境!
④ 导入neo4j!创建节点+边,导入到知识图谱中!
第一部分:摸数据!怎样的数据?
我们刚刚把他转为csv,可以深入摸摸了!
1.1 进入实践环境!
激活conda环境!
激活我们上一篇创建的conda环境-medkg
conda activate medkg
进入jupyter!
输入以下指令,他会自动跳转到浏览器!
jupyter notebook
打开代码!
1.2 了解数据基本情况!
现在,开始摸数据!
导入数据!
这里,你要把下方文件,改为自己存放的路径!
雄哥把他加载到“med_df”的DataFrame中!
# 加载数据``file_path = r'F:\med\CPubMed-KGv2_0.csv'``med_df = pd.read_csv(file_path)
看看数据有多少行、列!
测试一下导入成功没有,数据有多少行,多少列!
# 显示前5行数据,确认成功加载``med_df.head()
看看列的名称!
我们通过下面代码,看到他第一行,表头都是什么!
# 看看列的名字都是啥从左到右``med_df.columns
看看有多少数据!
# 看看多少行多少列``med_df.shape
到这,我们基本知道数据如何了!
继续摸!
因为导入知识图谱的时候,是批量处理的,所以要摸清楚,哪些数据是不符合标准!
这里,雄哥最想摸清楚数据的几个方面!
a.是否有缺失值
–影响kg赋值,无法完成导入
就是单元格中,有空的格子,值是空的
b.是否有特殊符号
–无法使用Cypher,创建图谱时报错
根据 Neo4j 的规范,关系名称不能包含某些特殊字符,如空格、括号((
、)
)、标点符号等;
c.是否有重复值
–影响导入性能,可能重复创建
查重同时,也要注意误判,导致数据缺失
因为我们手上的这份kg数据,质量非常高,所以无需更多其他复杂策略!
做以上这些,只是为了确保,在txt–csv过程中,可能出现问题!
毕竟,我们的数据有460万+条!非常庞大!
1.3 深入摸摸数据
看看缺失值有多少!
这里列出了每一列,分别有多少缺失值!
第二列没有缺失值,后面都有42万多的缺失值!不慌!
# 看看缺失值有多少``med_df.isna().sum()
缺失值打印出来!
我们把每一列的缺失值,都打出来!
这不就是上一篇,我们看到的同义词那一批数据嘛!
另外,在第一列的数据,似乎有特殊情况,125行缺失!
第二部分:处理问题数据
因为这样看不到数据中哪些缺失了!
没关系,雄哥先把缺失值,从原先的DataFrame中剪切出来,然后保存到本地来!
便于后续跟进!
那!这部分数据,本篇就不再上传了!
保存缺失值的数据!
这里另存为到本地了!改为你想保存的路径!
# 保存到CSV文件``missing_rows_df.to_csv('F:\\med\\missing_values.csv', index=False)
![](https://mmbiz.qpic.cn/sz_mmbiz_png/d3c3NxC8H1z2bCsYqvoOwyH0AH4csJQSAQwL4AdibgHbRElykicp5Ys1NLBFCVkHbvWT8DxZVMDnWOk20CzYTTWQ/640?wx_fmt=png&from=appmsg)
2.1 处理缺失值!
直接剪切出来,另存为,我们继续用0缺失值的数据,继续!
# 看看还有没有缺失值``med_df_cleaned.isna().sum()
跟着雄哥,继续摸!
2.2 处理特殊符号!
有没有Cypher不支持的特殊符号!
可能会有些刚开始学的朋友,这里介绍一下Cypher!
Cypher是一种为图形数据库设计的声明式查询语言,与Neo4j图数据库一起使用。专为处理图形数据结构构建
以下是Cypher的一些基本规则和作用:
规则:
-
模式匹配(Pattern Matching):
-
Cypher允许用户通过模式匹配来查询图数据。模式由节点(用圆括号
()
表示)、关系(用中括号[]
表示)和属性(键值对)组成。 -
例如:
(a)-[:FRIEND]->(b)
表示节点a
和节点b
之间有一个类型为FRIEND
的关系。 -
语法结构:
-
一个典型的Cypher查询包括一个
RETURN
子句,用于指定要返回的结果,以及一个或多个MATCH
、WHERE
、WITH
等子句来定义查询逻辑。 -
例如:
MATCH (n) RETURN n;
匹配所有节点并返回它们。 -
命名规则:
-
节点和关系可以用字母、数字和下划线命名,但不能以数字开头。
-
属性名称也遵循类似的规则。
-
大小写敏感性:
-
Cypher对关键字是不区分大小写的,但对属性键和字符串值是区分大小写的。
-
注释:
-
单行注释以
//
开始,多行注释可以用/* ... */
包裹。
作用:
-
数据查询:
-
Cypher可以用来查询图数据库中的节点、关系和属性。
-
可以执行复杂的图算法,如最短路径、路径查找等。
-
数据修改:
-
创建节点和关系:使用
CREATE
关键字。 -
更新属性:使用
SET
关键字。 -
删除节点和关系:使用
DELETE
关键字。 -
模式匹配:
-
可以定义复杂的模式来寻找图中特定的结构。
-
索引和约束:
-
Cypher可以用来创建索引,以加快查询速度。
-
也可以定义约束,比如唯一性约束,保证数据的完整性。
-
批量操作:
-
可以通过Cypher执行批量插入、更新或删除操作。
-
脚本编写:
-
可以将多个Cypher查询组合成一个脚本,进行自动化处理。
-
聚合和分组:
-
支持使用
RETURN
子句中的聚合函数(如COUNT
、SUM
、AVG
等)对查询结果进行分组和聚合。
现在,我们要把数据中特殊符号,处理一下!
这样才能正常导入!
def clean_string(s):` `if isinstance(s, str): # 检查是否为字符串类型` `return re.sub(r'[^\w\s]', '', s) # 替换非字母、数字和空格的字符` `return s # 如果不是字符串,返回原值
跟着代码继续操作!
我们开始准备Neo4J了!
第三部分:链接neo4j!申请key+接入到本地环境!
上面,我们就准备好数据啦!
现在准备接入!
打开下方链接,到Neo4J申请账号!
免费,限量2万个节点!
当然!可以完全本地的!这样的话,就不会限量~!
不管你是在线还是本地的,方法都是一样的!
3.1 申请neo4j账号及实例
复制下方链接
在浏览器打开,确保网络顺畅!
https://console.neo4j.io/
填写邮箱然后下一步创建!
点击发送验证邮件!
然后你在邮箱中点击链接,就可以激活!
回到刚刚的neo4j界面!
刷新一下!点同意!
点击免费的0元!
点了之后,不要关闭!注意!
点击下载配置文件!
一定要点击下载!不然后面你想查询就非常麻烦了!
浏览器会自动下载,打开后,是你的key!
NEO4J_URI=xxxxxxxxxxx``NEO4J_USERNAME=xxxxxxxxxx``NEO4J_PASSWORD=xxxxxxxxxxxxxxx``AURA_INSTANCEID=xxxxxxxxxxxxxxxxx``AURA_INSTANCENAME=xxxxxxxxxxxxxx
在工作目录创建一个.env文件!
把你下载到的key,粘贴进去!
3.2 链接neo4j
现在,我们把这个配置文件,连接到环境中!
from py2neo import Graph``from dotenv import load_dotenv``import os`` ``# 加载 .env 文件``load_dotenv()`` ``# 获取环境变量``neo4j_uri = os.getenv("NEO4J_URI")``neo4j_username = os.getenv("NEO4J_USERNAME")``neo4j_password = os.getenv("NEO4J_PASSWORD")`` ``# 连接到Neo4j``graph = Graph(neo4j_uri, auth=(neo4j_username, neo4j_password))
第四部分:把数据导入到neo4j!
你根据雄哥的代码一步步操作,每一行代码都已经写明白,这行代码是干嘛的!
有些操作就不在这里写了,篇幅有限!
导入的时候,我们要根据数据的情况,导入!雄哥之前已分析过!
这份数据,就这策略!
常量(3个):“疾病”、“其他治疗”、“辅助治疗”
常变量(2个):“胃十二指肠出血”、“禁食”
头实体 | 头实体类型 | 关系 | 尾实体 | 尾实体类型 |
胃十二指肠出血 | 疾病 | 辅助治疗 | 禁食 | 其他治疗 |
A点 | A点属性 | 边 | B点 | B点属性 |
现在,开始创建节点和边!
`# 创建节点和关系` `graph.run(f"""` `MERGE (h:Entity {{name: '{head_entity}', type: '{head_type}'}})` `MERGE (t:Entity {{name: '{tail_entity}', type: '{tail_type}'}})` `MERGE (h)-[:{relation}]->(t)` `""")`
执行后,jupyter右上角开始运行!
干完后,你在neo4j刷新,可以看到导入结果!
点击右上角Open!
就可以看到这个图谱的节点与边!
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。