机器学习项目(六)医疗知识图谱构建(四)

本文介绍如何利用Neo4j构建医疗知识图谱,包括存储节点和边关系,以及从医疗文本中提取实体并存入数据库。通过设置NodeMatcher查找节点,并将疾病、科室等信息组织为图结构。
摘要由CSDN通过智能技术生成

Neo4j

Neo4j是一个高性能的NOSQL图形数据库,它将机构化数据存储在网络上而不是表中

Node节点 获得图数据库中所有实体节点
relationship 增加所有增删改查的边关系节点
NodeMatcher 查找节点

#coding:utf-8
from py2neo import Graph, Node, Relationship,NodeMatcher
import pandas as pd
import re
buwei = ['全身', '男性股沟', '颈部', '眼', '生殖部位', '下肢', '口', '上肢', '腰部', '耳', '四肢', '腹部', '头部', '皮肤', '女性盆骨', '排泄部位', '胸部', '皮肤', '鼻']
keshi = ['眼科', '五官科', '皮肤科', '骨外科', '康复科', '中医骨伤科', '中医科', '耳鼻喉科', '理疗科', '体检科', '皮肤性病科', '泌尿内科', '遗传病科', '肝胆外科', '中西医结合科', '内科', '心胸外科', '肿瘤内科', '营养科', '药品科', '外科', '肛肠科', '神经内科', '烧伤科', '口腔科', '血液科', '小儿内科', '心理科', '神经外科', '泌尿外科', '肾内科', '消化内科', '肿瘤外科', '风湿免疫科', '呼吸内科', '普外科', '内分泌科', '妇产科', '妇科', '男科', '儿科综合', '精神科', '急诊科', '感染科', '其他科室', '传染科', '中医理疗科', '心内科', '小儿外科', '整形美容科', '儿科', '性病科', '产科', '肿瘤科',
         '生殖健康', '保健养生', '辅助检查', '重症监护', '其他综合', '中医综合', '不孕不育', '肝病', '减肥']
buwei_show_list = []
keshi_show_list = []
linchuang_show_list = []

# from .get_level import get_level
from zhishi_tupu.get_level import get_level

def create_kg():
    graph = Graph("http://localhost:7474", username="neo4j", password='')
    matcher = NodeMatcher(graph)
    graph.delete_all()

    skus = []  # SKU码,
    trade_names = []  # 商品名称,
    generic_names = []  # 通用名称
    specifications = []  # 药物规格,药物规格没有做处理是字符串
    first_commoditys = []  # 药物一级分类
    second_commoditys = []  # 药物二级分类
    third_commoditys = []  # 药物三级分类
    OTC_labels = []  # OTC标识分类
    medicine_classifications = []  # 药物分类
    diseases = []  # 疾病
    symptoms = []  # 病症
    components = []  # 药物成份
    entity_num ={
   
        '商品SKU编码':0,'商品名称':0,'通用名称':0,'规格':0,'商品一级分类':0,'商品二级分类':0,'商品三级分类':0,'OTC标识分类':0,'药物分类':0,'疾病':0,'病症':0,'成份':0,

    }
    relationgship_num ={
   
        '商品名称是':0,'通用名称是':0,'规格是':0,'包括':0,'治疗':0,'导致':0,'包含':0
    }
    xunyiwenyao_entity ={
   
        '科室':0,'部位':0,'临床分级':0
    }
    xunyiwenyao_level, linchuang_medicine_level, graph = get_level()

    data = pd.read_excel('测试数据.xlsx')
    # 商品SKU编码	商品名称	通用名称	规格	商品一级分类	商品二级分类	商品三级分类	OTC标识	分类	疾病	病症	成份

    for i in range(data.shape[0]):
        sku = str(data['商品SKU编码'].loc[i])
        if sku not in skus:
            sku_node = Node('SKU', name=sku)
            graph.create(sku_node)
            entity_num['商品SKU编码']+=1
            skus.append(sku)
        else:
            sku_node = matcher.match("SKU").where(name=sku).first()

        trade_name = str(data['商品名称'].loc[i])
        if trade_name not in trade_names:
            trade_name_node = Node('商品名称', name=trade_name)
            graph.create(trade_name_node)
            entity_num['商品名称']+=1
            trade_names.append(trade_name)
        else:
            trade_name_node = matcher.match("商品名称").where(name=trade_name).first()
        # for medicine_name in linchuang_medicine_level:
        # if trade_name in medicine_name:
        #     print(trade_name,medicine_name)

        # 创建一个relationship 边关系 然后利用graph进行插入
        graph.create(Relationship(sku_node, '商品名称是', trade_name_node))
        relationgship_num['商品名称是']+=1

        generic_name = str(data['通用名称'].loc[i])
        if generic_name not in generic_names:
            generic_name_node = Node('通用名称', name=generic_name)
            graph.create(generic_name_node)
            entity_num['通用名称']+=1
            generic_names.append(generic_name)
        else:
            generic_name_node = matcher.match('通用名称').where(name=generic_name).first()



        graph.create(Relationship(sku_node, '通用名称是', generic_name_node))
        relationgship_num['通用名称是']+=1

        specification = str(data['规格'].loc[i])
        if specification not in specifications:
            specification_node = Node('规格', name=specification)
            graph.create(specification_node)
            entity_num['规格']+=1
            specifications.append(specification)
        else:
            specification_node = matcher.match('规格').where(name=specification).first()
        graph.create(Relationship(sku_node, '规格是', specification_node))
        relationgship_num['规格是']+=1

        first_commodity = str(data['商品一级分类'].loc[i])
        if first_commodity not in first_commoditys:
            first_commodity_node = Node('商品一级分类', name=firs
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值