电网知识图谱项目总结(1)python代码实现RDF三元组自动化标注

文章目录

  • 电网知识图谱项目总结(1)python代码实现RDF三元组自动化标注
    • 简介
    • 文档内容
    • RDF规范
    • 标注思路
    • 代码结构
    • 详细代码
    • 标注结果
    • 总结

简介

本次项目是电网知识图谱相关的,我们的主要任务是三元组的标注知识图谱的构建,本篇讲述Python代码标注三元组的具体实现,相关知识图谱的构建在后期的内容中再进行总结。

总共有几百个文档(包括几百个预案),刚开始时手动标注一个文档需要两三个小时,长一点的文档得三个多小时,加上三元组关系之多,标注一两个文档头脑一片混乱,盯都盯不住了,心态直接炸裂!在手动标注了一个文档后,我尝试用代码标注,写代码的过程也是特别煎熬,毕竟每一种类型的三元组都得用代码实现,不过写多了就觉得简单了,都是一样的套路。花了一天半时间后,写完了近500行代码,若是足够规范的文档,可保证100%的标注准确率,大部分文档的标注准确率也达到了90%以上。在写代码时为某些不好处理的三元组特意做了模糊标注,所以代码标注后的三元组只需要对照文档内容核对检查修改即可,特别方便,几乎不需要新增。原来一个文档两三个小时的任务最后只需几分钟即可完成,极大地提高了效率!

文档内容

最开始的数据格式是.docx文档,每个word文档中包含了针对特定千伏变电站停电时的具体调度,下面以一个预案的具体结构和内容来作为示例。

侯家塘变35千伏其侯线停电风险预案为例,具体内容组织结构如下


  • 侯家塘变35千伏其侯线停电风险预案

    • 一、事故情况及影响

      • 得地调告:侯家塘变全所失电。
      • 侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。
      • 两回全停重要用户有:江苏省金陵监狱
      • 一回停电的双电源用户有:南京自来水公司汤山增压站
    • 二、处理过程

      1. 得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源

      2. 配调:

        • (1)恢复所用电

          侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关

          汤山变:侯家塘线233开关定切保护停用过流时间由1”改为1.5”

          侯家塘变:侯家塘线135开关保护全部停用合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)

          悦民变:百镇#1线118开关定切保护停用过流时间由1”改为1.5”

          雨花急修班:合上#6260开关

          侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)

        • 恢复重要用户供电

          侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)

      3. 汇报地调。

      4. 得地调通知,侯家塘变1号、2号主变已恢复供电,事故方式自行恢复。


其中标黄的内容为每个文档中的固定大纲,部分内容(如变电站等)可能不同,但模式相同,标红的是一些需要标注的部分三元组关键字。

文档内容截图如下

RDF规范

RDF三元组规范如下,共有二十多种类型,要求是将这些三元组标注出并保存在Excel表格中。

侯家塘变35千伏其侯线停电风险预案为例,该预案中包含的所有三元组如下:

35千伏侯家塘变全停事故预案  事故情况    得地调告:侯家塘变全所失电。
35千伏侯家塘变全停事故预案  事故原因    侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。
35千伏侯家塘变全停事故预案  事故影响    两回全停的重要用户有:江苏省金陵监狱
35千伏侯家塘变全停事故预案  事故影响    一回停电的双电源用户有:南京自来水公司汤山增压站
35千伏侯家塘变全停事故预案  处理过程    得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源  下一步骤    侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关
侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关    下一步骤    汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”   下一步骤    侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)     下一步骤    悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”  下一步骤    雨花急修班:合上#6260开关
雨花急修班:合上#6260开关   下一步骤    侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)    下一步骤    侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)
侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)     下一步骤    汇报地调
回报地调    下一步骤    得地调通知,侯家塘变1号、2号主变已恢复供电,事故方式自行恢复。侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(主)    侯家塘变1号接地变
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(主)    侯家塘变2号接地变
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(被)    侯家塘变1号所用电源
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(被)    侯家塘变2号所用电源得地调告:侯家塘变全所失电。    两回全停    江苏省金陵监狱
江苏省金陵监狱    属性    重要用户
得地调告:侯家塘变全所失电。    一回停电    南京自来水公司汤山增压站
南京自来水公司汤山增压站    属性    双电源用户
南京自来水公司汤山增压站    属性    重要用户得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源    移出    侯家塘变10千伏负荷
得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源    保证    悦民变所用变电源侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关    属性    恢复所供电
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”    属性    恢复所供电
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)    属性    恢复所供电
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”    属性    恢复所供电
雨花急修班:合上#6260开关    属性    恢复所供电
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)     属性    恢复所供电侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关    恢复所供电    侯家塘变
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”    恢复所供电    侯家塘变
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)    恢复所供电    侯家塘变
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”    恢复所供电    侯家塘变
雨花急修班:合上#6260开关    恢复所供电    侯家塘变
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)     恢复所供电    侯家塘变侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)    操作分支    侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)    操作分支    汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关    等价操作    汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)    操作分支    侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)    操作分支    悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关    等价操作    悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关    拉开    侯家塘变1号主变101开关
侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关    拉开    侯家塘变2号主变102开关
侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关    拉开    侯家塘变10千伏出线开关
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”   定切保护停用    汤山变侯家塘线233开关
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”   过流时间由1”改为1.5”    汤山变侯家塘线233开关
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)     保护全部停用    侯家塘变侯家塘线135开关
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)     合上    侯家塘变侯家塘线135开关
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”   定切保护停用    悦民变百镇#1线118开关
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”   过流时间由1”改为1.5”    悦民变百镇#1线118开关
雨花急修班:合上#6260开关   合上    #6260开关
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)    保护全部停用    侯家塘变官塘线235开关
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)    合上    侯家塘变官塘线235开关侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)     合上    龙尚线134开关
侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)    属性    恢复重要用户供电
侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)     恢复重要用户供电    江苏省金陵监狱
侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)     恢复重要用户供电    南京自来水公司汤山增压站供电侯家塘变1号主变101开关    属于    侯家塘变
侯家塘变2号主变102开关    属于    侯家塘变
汤山变侯家塘线233开关     属于    汤山变
侯家塘变侯家塘线135开关    属于    侯家塘变
侯家塘变10千伏Ⅰ段母线    属于    侯家塘变
侯家塘变1号接地变    属于    侯家塘变
悦民变百镇#1线118开关    属于    悦民变
侯家塘变官塘线235开关    属于    侯家塘变
侯家塘变龙尚线134开关    属于    侯家塘变
雨花急修班#6260开关    属于    雨花急修班

标注思路

总体来说整个过程可分为三步:

  1. 读取docx文件(import docx
  2. 标注(对str字符的处理)
  3. 写入xlsx文件(import openpyxl

在读取内容后,为了处理字符串的方便,将每段内容句首和句末的空格、制表符、标点符号等去除。

其中最麻烦的是标注代码的编写,本质就是对字符串的一些处理技巧,这个只要掌握了字符串的分割和特定字符的位置查找其实也不难实现。

在三元组分类时要考虑以下两个问题:

  • 哪几种类型的三元组放在一起处理比较好?
  • 哪些内容段包含哪几种类型的三元组?

首先根据三元组的分布对内容进行大致划分,得到固定标题下的内容,这样方便后面特定三元组的处理,缩小查找范围。如layer1layer2层下的内容,datas是所有内容,datas1二、处理过程:下的内容。在处理特定三元组的时候,看它出现在哪些特定的内容中,或者某几条内容中包含几种类型的三元组。根据大致位置和三元组关键词找到包含三元组内容的具体位置,然后根据关键字、标点符号、以及三元组特征对内容进行拆分、拼接和添加,从而得到最后的结果。

下面举两个例子方便大家更好地了解:


内容一:

一、事故情况及影响
得地调告:侯家塘变全所失电
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电
两回全停重要用户有:江苏省金陵监狱。
一回停电的双电源用户有:南京自来水公司汤山增压站。

对于上面这段内容,由于它是连续的,先不考虑每个句子中包含的其他三元组,我们发现事故情况事故原因事故影响这几个三元组放在一起处理比较好,在得到标题后依次写入即可。对应代码中的函数为def step_1(datas, name, layer1, layer2)

35千伏侯家塘变全停事故预案  事故情况    得地调告:侯家塘变全所失电。
35千伏侯家塘变全停事故预案  事故原因    侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。
35千伏侯家塘变全停事故预案  事故影响    两回全停的重要用户有:江苏省金陵监狱
35千伏侯家塘变全停事故预案  事故影响    一回停电的双电源用户有:南京自来水公司汤山增压站

内容二:

侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。

首先是事故原因三元组,这个只要得到标题就可以构成三元组。(这一条我是按照内容一中程相关的三元组一起处理的)

35千伏侯家塘变全停事故预案   事故原因    侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。

其次是失电(主)和失电(被),首先定位接地变对前段话中**“1号”“2号”进行检测根据顿号拆分,得到“失电(主)“三元组,之后定位所用电源对后半句话同样进行字符定位拆分,得到”失电(被)“**三元组。对应代码中的函数为def step_3(datas, layer1)

侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(主)    侯家塘变1号接地变
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(主)    侯家塘变2号接地变
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(被)    侯家塘变1号所用电源
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。    失电(被)    侯家塘变2号所用电源

代码结构

其他的三元组处理方式与此类似,下面是整个代码的函数结构图,详解介绍了各个函数的功能和所要处理的三元组。

详细代码

import docx
import xlwt
import openpyxl
import osswitches_rdf = []def readData(path):file = docx.Document(path)datas = []for p in file.paragraphs:cur = str(p.text.strip())cur.replace('\n', '').replace('\r', '').replace(' ', '')if cur != "":datas.append(cur)return datasdef printRDF(rdfs):if rdfs is None:returnfor rdf in rdfs:print(rdf)# RDF 三元组使用 tuple 存储  (R, D, F)
# step_1  事故情况、事故原因、事故影响、处理过程
def step_1(datas, name, layer1, layer2):rdf1 = []for i in range(layer1 + 1, layer2):data = datas[i]if data.count("得地调告"):rdf1.append((name, "事故情况", data))elif data.count("导致"):rdf1.append((name, "事故原因", data))elif data.count("用户"):if data[-1]  != "无":rdf1.append((name, "事故影响", data))rdf1.append((name, "处理过程", datas[layer2 + 1][2:]))return rdf1# setp_2  (?, 下一步骤, ?)
def step_2(datas, layer2):cycle_data = []for i in range(layer2 + 1, len(datas)):data = datas[i]if data.count("1、得地调要求:"):cycle_data.append(data[2:])elif data.count("2、配调:") or data.count("(1)恢复所用电") or data.count("(2)恢复重要用户供电"):passelif data.count("3、汇报地调"):cycle_data.append(data[2:])elif data.count("4、得地调通知"):cycle_data.append(data[2:])else:cycle_data.append(data)# 使用循环加入三元组rdf2 = []for i in range(0, len(cycle_data) - 1):rdf2.append((cycle_data[i], "下一步骤", cycle_data[i + 1]))return rdf2# step3  失电(主),失电(被)
def step_3(datas, layer1):data = datas[layer1 + 2]head_id = data.find("1号")head_name = data[:head_id]# 使用 , 划分前后部分data_sp = data.split(',')rdf3 = []for i in range(1, 5):if data_sp[0].count(str(i) + "号"):rdf3.append((data, "失电(主)", head_name + str(i) + "号接地变"))# add switches_rdfswitches_rdf.append((head_name + str(i) + "号接地变", "属于", head_name))for i in range(1, 5):if data_sp[1].count(str(i) + "号"):rdf3.append((data, "失电(被)", head_name + str(i) + "号所用电源"))return rdf3# step_4  两回全停、一回停电, 重要度,属性
def step_4(datas, layer1, layer2):s1 = datas[layer1 + 1]fst_s, sec_s = "", ""for i in range(layer1 + 1, layer2):if datas[i].find("两回全停") == 0:fst_s = datas[i]elif datas[i].find("一回停电") == 0:sec_s = datas[i]# 找出两回全停的地点fst_s1 = fst_s.split(":")fst_s_list = fst_s1[1].split("、")# 找出一回停电的地点sec_s1 = sec_s.split(":")sec_s_list = sec_s1[1].split("、")rdf4 = []# 加入 两回全停、一回停电 三元组for s in fst_s_list:if s != "无":rdf4.append((s1, "两回全停", s))for s in sec_s_list:if s != "无":rdf4.append((s1, "一回停电", s))# 处理属性问题 (双电源、 重要用户)if fst_s1[0].count("重要"):for s in fst_s_list:if s != "无":rdf4.append((s, "属性", "重要用户"))if sec_s1[0].count("重要"):for s in sec_s_list:if s != "无":rdf4.append((s, "属性", "重要用户"))if fst_s1[0].count("双电源"):for s in fst_s_list:if s != "无":rdf4.append((s, "属性", "双电源用户"))if sec_s1[0].count("双电源"):for s in sec_s_list:if s != "无":rdf4.append((s, "属性", "双电源用户"))return rdf4# step_5 (?, 移出, ?)  , (?, 保证, ?)
def step_5(datas, layer2):data = datas[layer2 + 1][2:]parts = data[data.find(":") + 1:].split(",")id1 = parts[0].find("移出")id2 = parts[1].find("保证")rdf5 = []rdf5.append((data, "移出", parts[0][:id1]))rdf5.append((data, "保证", parts[1][id2 + 2:]))return rdf5# step_6 (?, 属性, 恢复所供电)  (?, 恢复所供电, ?)
def step_6(datas, layer1, layer2):id1, id2 = 0, 0for i in range(layer2 + 1, len(datas)):data = datas[i]if data.count("(1)恢复所用电"):id1 = ielif data.count("(2)恢复重要用户供电"):id2 = ibreakelse:pass# 得到 (1)恢复所用电 数据cycle_data = []for i in range(id1 + 1, id2):cycle_data.append(datas[i])head_name = datas[layer1 + 1].split(":")[1]head_name = head_name[:head_name.find("全所失电")]rdf6 = []# 添加  (?, 属性, 恢复所供电) 三元组for s in cycle_data:rdf6.append((s, "属性", "恢复所供电"))# 添加 (?, 恢复所供电, ?)for s in cycle_data:rdf6.append((s, "恢复所供电", head_name))return rdf6# step_7 (?, 操作分支, ?)  (?, 等价操作 ,?)
def step_7(datas, layer2):id1, id2 = 0, 0for i in range(layer2 + 1, len(datas)):data = datas[i]if data.count("(1)恢复所用电"):id1 = ielif data.count("(2)恢复重要用户供电"):id2 = ibreakelse:pass# 得到 含有操作分支的数据cycle_data = []for i in range(id1 + 1, id2):if datas[i][-1] == ")":cycle_data.append(datas[i])# 添加 操作分支 和 等价操作 三元组rdf7 = []for s in cycle_data:cur_s = s.replace(")", '')s_list = cur_s.split("(")rdf7.append((s, "操作分支", s_list[0]))rdf7.append((s, "操作分支", s_list[1]))rdf7.append((s_list[0], "等价操作", s_list[1]))return rdf7# step_8 (?, 属性, 恢复重要用户供电)  (?, 恢复重要用户供电 ,?)
def step_8(datas, layer2):id1, id2 = 0, 0for i in range(layer2 + 1, len(datas)):data = datas[i]if data.count("(2)恢复重要用户供电"):id1 = ielif data.count("3、汇报地调"):id2 = ibreakelse:pass# 得到 恢复重要用户供电 的数据cycle_data = []for i in range(id1 + 1, id2):cycle_data.append(datas[i])rdf8 = []# 添加 (?, 属性, 恢复重要用户供电) 三元组for s in cycle_data:rdf8.append((s, "属性", "恢复重要用户供电"))# 添加恢复用户供电的三元组   ?, 恢复重要用户供电 ,?)for s in cycle_data:if s.count("恢复"):id = s.find("恢复")cur_s = s[id + 2:]cur_s = cur_s.replace(")", '').replace("供电", "")cur_s_list = cur_s.split("、")for st in cur_s_list:rdf8.append((s, "恢复重要用户供电", st))return rdf8# 得到 (1)恢复所用电 下的数据
def get_datas1(datas, layer2):id1, id2 = 0, 0for i in range(layer2 + 1, len(datas)):data = datas[i]if data.count("(1)恢复所用电"):id1 = ielif data.count("(2)恢复重要用户供电"):id2 = ibreakelse:passdatas1 = []for i in range(id1 + 1, id2):datas1.append(datas[i])return datas1# 得到 (2)恢复重要用户供电 下的数据
def get_datas2(datas, layer2):id1, id2 = 0, 0for i in range(layer2 + 1, len(datas)):data = datas[i]if data.count("(2)恢复重要用户供电"):id1 = ielif data.count("3、汇报地调"):id2 = ibreakelse:passdatas2 = []for i in range(id1 + 1, id2):datas2.append(datas[i])return datas2# step_9  (1)恢复所用电  (?, 拉开, ?)
def step_9(datas1):if datas1 is None:returnrdf9 = []data = datas1[0]if data.count("拉开"):sp = data.split(":")cur_s = sp[1].replace("及所有", "、").replace("拉开", "").replace(",", "、")switch_list = cur_s.split("、")# print(switch_list)# add switches_rdffor i in range(0, len(switch_list) - 1):switches_rdf.append((sp[0] + switch_list[i], "属于", sp[0]))# print(switches_rdf)for switch in switch_list:rdf9.append((data, "拉开", sp[0] + switch))return rdf9# step_10 (1)恢复所用电  (?, 定切保护停用, ?)  (?, 过流时间由1”改为1.5”  ,?)
def step_10(datas1):rdf10 = []cycle_data = []for data in datas1:if data.count("定切保护停用"):cycle_data.append(data)for d in cycle_data:index1 = d.find("定切保护停用")index2 = d.find(":")head_name = d[:index2]switch_name = d[:index1].replace(":", "")# add switches_rdfswitches_rdf.append((switch_name, "属于", head_name))rdf10.append((d, "定切保护停用", switch_name))rdf10.append((d, "过流时间由1”改为1.5”", switch_name))return rdf10# step11 (1)恢复所用电     (?, 保护全部停用 / 合上,)
def step_11(datas1):rdf11 = []cycle_data = []for data in datas1:if data.count("保护全部停用"):cycle_data.append(data)for d in cycle_data:index1 = d.find("保护全部停用")index2 = d.find(":")switch_name = d[:index1]head_name = d[:index2]switch_name = switch_name.replace(":", "")# add switches_rdfswitches_rdf.append((switch_name, "属于", head_name))rdf11.append((d, "保护全部停用", switch_name))rdf11.append((d, "合上", switch_name))return rdf11# step12  (1)恢复所用电 (2)恢复重要用户供电 直接的 合上 三元组 (?, 合上, ?)
def step_12(datas, layer1):cycle_data = []for data in datas:if data.count("保护全部停用") == 0 and data.count("合上"):cycle_data.append(data)rdf12 = []for d in cycle_data:index1 = d.find("开关")index2 = d.find(":")head_name = d[:index2]switch_name = d[:index1 + 2]switch_name = switch_name.replace(":合上", "")# add switches_rdfswitches_rdf.append((switch_name, "属于", head_name))rdf12.append((d, "合上", switch_name))return rdf12# step13  10KV 1/2/3段母线 (?母线, 属于, ?)
def step_13(datas1):head_name = datas1[0].split(":")[0]rdf13 = []s_nums1 = ["Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ"]s_nums2 = ["I", "II", "Ⅲ", "Ⅳ", "Ⅴ"]nums_spot = [True for i in range(5)]for data in datas1:if data.count("段母线"):for i in range(0, len(s_nums1)):if data.count(s_nums1[i]) or data.count(s_nums2[i]):if nums_spot[i] is False:continuenums_spot[i] = Falses1 = head_name + "10kV" + s_nums1[i] + "段母线"rdf13.append((s1, "属于", head_name))return rdf13def write_to_excel1(all_rdfs, name):savepath = name +  ".xls"workbook = xlwt.Workbook()worksheet = workbook.add_sheet('savepath')for i in range(0, len(all_rdfs)):cur = all_rdfs[i]worksheet.write(i, 0, cur[0])worksheet.write(i, 1, cur[1])worksheet.write(i, 2, cur[2])workbook.save(savepath)def write_to_excel(all_rdfs, name):savepath = name +  ".xlsx"if os.path.exists(savepath):os.remove(savepath)workbook = openpyxl.Workbook()worksheet = workbook.activefor rdf in all_rdfs:worksheet.append(rdf)workbook.save(savepath)if __name__ == '__main__':path = "datasets/35千伏侯家塘变全停事故处理预案模板.docx"datas = readData(path)for i in range(len(datas)):# 此处数据 1" 没有读出,故替换if datas[i].count('过流时间由改为1.5”'):datas[i] = datas[i].replace('过流时间由改为1.5”', '过流时间由1”改为1.5”')print(datas[i])name = ""layer1, layer2 = 0, 0for i in range(0, len(datas)):if datas[i] == "一、事故情况及影响":name = datas[i - 1]layer1 = ielif datas[i] == "二、处理过程:":layer2 = ibreakprint("------------------------ rdf1 ------------------------")rdf1 = step_1(datas, name, layer1, layer2)printRDF(rdf1)print("------------------------ rdf2 ------------------------")rdf2 = step_2(datas, layer2)printRDF(rdf2)print("------------------------ rdf3 ------------------------")rdf3 = step_3(datas, layer1)printRDF(rdf3)print("------------------------ rdf4 ------------------------")rdf4 = step_4(datas, layer1, layer2)printRDF(rdf4)print("------------------------ rdf5 ------------------------")rdf5 = step_5(datas, layer2)printRDF(rdf5)print("------------------------ rdf6 ------------------------")rdf6 = step_6(datas, layer1, layer2)printRDF(rdf6)print("------------------------ rdf7 ------------------------")rdf7 = step_7(datas, layer2)printRDF(rdf7)print("------------------------ rdf8 ------------------------")rdf8 = step_8(datas, layer2)printRDF(rdf8)print("#####################   datas1  #######################")datas1 = get_datas1(datas, layer2)for d in datas1:print(d)print("#####################   datas2  #######################")datas2 = get_datas2(datas, layer2)for d in datas2:print(d)print("------------------------ rdf9 ------------------------")rdf9 = step_9(datas1)printRDF(rdf9)print("------------------------ rdf10 ------------------------")rdf10 = step_10(datas1)printRDF(rdf10)print("------------------------ rdf11 ------------------------")rdf11 = step_11(datas1)printRDF(rdf11)print("------------------------ rdf12 ------------------------")rdf12 = step_12(datas, layer1)printRDF(rdf12)print("------------------------ rdf13 ------------------------")rdf13 = step_13(datas1)printRDF(rdf13)print("------------------------ switches_rdf ------------------------")printRDF(switches_rdf)# 汇总所有的 RDFall_rdfs = []all_rdfs += rdf1all_rdfs += rdf2all_rdfs += rdf3all_rdfs += rdf4all_rdfs += rdf5all_rdfs += rdf6all_rdfs += rdf7all_rdfs += rdf8all_rdfs += rdf9all_rdfs += rdf10all_rdfs += rdf11all_rdfs += rdf12all_rdfs += rdf13all_rdfs += switches_rdf# 保存数据my_path = path.replace(".docx", "")write_to_excel(all_rdfs, my_path)

标注结果

代码输出如下(读取的内容以及识别的三元组)

侯家塘变35千伏其侯线停电
风险预案
国网南京供电公司供电服务指挥中心(配网调控中心)
35千伏侯家塘变35千伏其侯线停电风险预案
一、事故情况及影响
得地调告:侯家塘变全所失电。
侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。
两回全停的重要用户有:江苏省金陵监狱
一回停电的双电源用户有:南京自来水公司汤山增压站
二、处理过程:
1、得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源
2、配调:
(1)恢复所用电
侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”
雨花急修班:合上#6260开关
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)
(2)恢复重要用户供电
侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)
3、汇报地调。
4、得地调通知,侯家塘变1号、2号主变已恢复供电,事故方式自行恢复。
------------------------ rdf1 ------------------------
('35千伏侯家塘变35千伏其侯线停电风险预案', '事故情况', '得地调告:侯家塘变全所失电。')
('35千伏侯家塘变35千伏其侯线停电风险预案', '事故原因', '侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。')
('35千伏侯家塘变35千伏其侯线停电风险预案', '事故影响', '两回全停的重要用户有:江苏省金陵监狱')
('35千伏侯家塘变35千伏其侯线停电风险预案', '事故影响', '一回停电的双电源用户有:南京自来水公司汤山增压站')
('35千伏侯家塘变35千伏其侯线停电风险预案', '处理过程', '得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源')
------------------------ rdf2 ------------------------
('得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源', '下一步骤', '侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关')
('侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关', '下一步骤', '汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”')
('汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”', '下一步骤', '侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)')
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '下一步骤', '悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”')
('悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”', '下一步骤', '雨花急修班:合上#6260开关')
('雨花急修班:合上#6260开关', '下一步骤', '侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '下一步骤', '侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)')
('侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)', '下一步骤', '汇报地调。')
('汇报地调。', '下一步骤', '得地调通知,侯家塘变1号、2号主变已恢复供电,事故方式自行恢复。')
------------------------ rdf3 ------------------------
('侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。', '失电(主)', '侯家塘变1号接地变')
('侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。', '失电(主)', '侯家塘变2号接地变')
('侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。', '失电(被)', '侯家塘变1号所用电源')
('侯家塘变1号、2号接地变失电,导致1号、2号所用电源失电。', '失电(被)', '侯家塘变2号所用电源')
------------------------ rdf4 ------------------------
('得地调告:侯家塘变全所失电。', '两回全停', '江苏省金陵监狱')
('得地调告:侯家塘变全所失电。', '一回停电', '南京自来水公司汤山增压站')
('江苏省金陵监狱', '属性', '重要用户')
('南京自来水公司汤山增压站', '属性', '双电源用户')
------------------------ rdf5 ------------------------
('得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源', '移出', '侯家塘变10千伏负荷')
('得地调要求:侯家塘变10千伏负荷移出,并保证悦民变所用变电源', '保证', '悦民变所用变电源')
------------------------ rdf6 ------------------------
('侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关', '属性', '恢复所供电')
('汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”', '属性', '恢复所供电')
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '属性', '恢复所供电')
('悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”', '属性', '恢复所供电')
('雨花急修班:合上#6260开关', '属性', '恢复所供电')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '属性', '恢复所供电')
('侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关', '恢复所供电', '侯家塘变')
('汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”', '恢复所供电', '侯家塘变')
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '恢复所供电', '侯家塘变')
('悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”', '恢复所供电', '侯家塘变')
('雨花急修班:合上#6260开关', '恢复所供电', '侯家塘变')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '恢复所供电', '侯家塘变')
------------------------ rdf7 ------------------------
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '操作分支', '侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关')
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '操作分支', '汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变')
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关', '等价操作', '汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '操作分支', '侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '操作分支', '悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关', '等价操作', '悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电')
------------------------ rdf8 ------------------------
('侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)', '属性', '恢复重要用户供电')
('侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)', '恢复重要用户供电', '江苏省金陵监狱')
('侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)', '恢复重要用户供电', '南京自来水公司汤山增压站')
#####################   datas1  #######################
侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关
汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”
侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)
悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”
雨花急修班:合上#6260开关
侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)
#####################   datas2  #######################
侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)
------------------------ rdf9 ------------------------
('侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关', '拉开', '侯家塘变1号主变101开关')
('侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关', '拉开', '侯家塘变2号主变102开关')
('侯家塘变:拉开1号主变101开关、2号主变102开关及所有10千伏出线开关', '拉开', '侯家塘变10千伏出线开关')
------------------------ rdf10 ------------------------
('汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”', '定切保护停用', '汤山变侯家塘线233开关')
('汤山变:侯家塘线233开关定切保护停用,过流时间由1”改为1.5”', '过流时间由1”改为1.5”', '汤山变侯家塘线233开关')
('悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”', '定切保护停用', '悦民变百镇#1线118开关')
('悦民变:百镇#1线118开关定切保护停用,过流时间由1”改为1.5”', '过流时间由1”改为1.5”', '悦民变百镇#1线118开关')
------------------------ rdf11 ------------------------
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '保护全部停用', '侯家塘变侯家塘线135开关')
('侯家塘变:侯家塘线135开关保护全部停用,合上侯家塘线135开关(汤山变侯家塘线233开关暂供进侯家塘变10千伏Ⅰ段母线转供1号接地变)', '合上', '侯家塘变侯家塘线135开关')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '保护全部停用', '侯家塘变官塘线235开关')
('侯家塘变:官塘线235开关保护全部停用,合上官塘线235开关(悦民变百镇#1线118开关暂供进侯家塘变10千伏 Ⅱ段母线转供2号接地变并恢复江苏省金陵监狱供电)', '合上', '侯家塘变官塘线235开关')
------------------------ rdf12 ------------------------
('雨花急修班:合上#6260开关', '合上', '雨花急修班#6260开关')
('侯家塘变:合上龙尚线134开关(恢复江苏省金陵监狱、南京自来水公司汤山增压站供电)', '合上', '侯家塘变龙尚线134开关')
------------------------ rdf13 ------------------------
('侯家塘变10kVⅠ段母线', '属于', '侯家塘变')
('侯家塘变10kVⅡ段母线', '属于', '侯家塘变')
------------------------ switches_rdf ------------------------
('侯家塘变1号接地变', '属于', '侯家塘变')
('侯家塘变2号接地变', '属于', '侯家塘变')
('侯家塘变1号主变101开关', '属于', '侯家塘变')
('侯家塘变2号主变102开关', '属于', '侯家塘变')
('汤山变侯家塘线233开关', '属于', '汤山变')
('悦民变百镇#1线118开关', '属于', '悦民变')
('侯家塘变侯家塘线135开关', '属于', '侯家塘变')
('侯家塘变官塘线235开关', '属于', '侯家塘变')
('雨花急修班#6260开关', '属于', '雨花急修班')
('侯家塘变龙尚线134开关', '属于', '侯家塘变')

35千伏侯家塘变全停事故处理预案模板.docx文档为例,代码标注的RDF三元组保存在35千伏侯家塘变全停事故处理预案模板.xlsx表格中截图如下所示,结果与模版给出的三元组相差无几。

总结

三个多月过去再看那时候写的代码,发现还有很多方面需要提高。

  • 函数的命名不够简洁直观
  • 三元组的组织架构有几条比较混乱
  • 有几条三元组的标注还不够完整
  • 代码的容错性较低,遇到不规范的文档会报错(虽然可以将文档改为规范的文档,但对不熟悉代码的其他成员不太友好)

祝大家1024程序员节快乐!

电网知识图谱项目总结(1)python代码实现RDF三元组自动化标注相关推荐

  1. 电网知识图谱项目总结(2)从局部文档RDF到全局知识图谱构建

    电网知识图谱项目总结(2)从局部文档RDF到全局知识图谱构建 文章目录 电网知识图谱项目总结(2)从局部文档RDF到全局知识图谱构建 背景 构建规范 构建框架 最终结果 总结 背景 上一篇总结了三元组 ...

  2. 医药知识图谱项目搭建注意事项(QASystemOnMedicalKG)

    医药知识图谱项目搭建注意事项(QASystemOnMedicalKG)## 标题 1.注意neo4j版本 4.0以上需要安装java11,低于4.0的版本需要java 8,同时注意对应的py2neo驱 ...

  3. 吐血整理!12种通用知识图谱项目简介

    作者:王楠 赵宏宇 蔡月 来源:大数据DT(ID:hzdashuju) 通用知识图谱大体可以分为百科知识图谱(Encyclopedia Knowledge Graph)和常识知识图谱(Common S ...

  4. 化妆品为主题的知识图谱项目

    资源下载地址:https://download.csdn.net/download/sheziqiong/85737431 资源下载地址:https://download.csdn.net/downl ...

  5. 科普 | 典型的知识库/链接数据/知识图谱项目

    从人工智能的概念被提出开始,构建大规模的知识库一直都是人工智能.自然语言理解等领域的核心任务之一.下面首先分别介绍了早期的知识库项目和以互联网为基础构建的新一代知识库项目.并单独介绍了典型的中文知识图 ...

  6. 基于Python面向《海贼王》领域数据的知识图谱项目【100010385】

    <海贼王>知识图谱构建-项目报告 1. 项目背景 本次任务试图为<海贼王>中出现的各个实体,包括人物.地点.组织等,构建一个知识图谱,帮助我们更好的理解这部作品. 2. 项目内 ...

  7. 大数据知识图谱项目——基于知识图谱的医疗知识问答系统(详细讲解及源码)

    基于知识图谱的医疗知识问答系统 一.项目概述 知识图谱是将知识连接起来形成的一个网络.由节点和边组成,节点是实体,边是两个实体的关系,节点和边都可以有属性.知识图谱除了可以查询实体的属性外,还可以很方 ...

  8. 学习开源web知识图谱项目,爬取百度百科中文页面

    github上找到的项目,感觉比较适合知识图谱入门 源码地址:https://github.com/lixiang0/WEB_KG ubuntu环境(如果在windows下跑改下文件路径,我改了一下还 ...

  9. 事件知识图谱项目整理

    事件知识图谱常用命令 一.PyCharm连接MongoDB (一)MongoDB 1.启动MongoDB 2.向 MongoDB Compass 导入json文件 (二)PyCharm连接MongoD ...

最新文章

  1. SQL Server 2016 查询存储性能优化小结
  2. Java中的接口命名[关闭]
  3. Exchange 2013/2016延迟副本重播管理(Reply Log Manager)
  4. Docker中的网络问题
  5. appium java版本错误_升级Appium最新java-client 6.0.0包后-问题来了...
  6. 蚁群优化算法 ACO
  7. oracle pl sql developer 教程,plsql developer怎么使用 plsql developer图文使用教程
  8. 热文:if(a==1且a==2且a==3),有没有可能为true?
  9. 边缘计算与智慧城市应用
  10. 微软产品下载中心--MSDN,我告诉你
  11. 微云百度云等资源 至少1M/s下载提速 无需会员
  12. 一级建造师考试报名需要的材料,点击收藏!
  13. Axios 简单使用指南
  14. 小老虎CSDN博客流量分析
  15. 造车新势力也下场了,滴滴巨亏390亿也拦不住车企布局出行的步伐
  16. 线性代数学习笔记——第五十四讲——非齐次方程组解的性质
  17. Edge浏览器无法登录同步共享问题
  18. RoboWare安装教程
  19. FX3uPLC型号及三菱PLC的分类
  20. MySql索引优化一(算是白话)有问题欢迎评论

热门文章

  1. ThinkPHP 6.0.3版本自创标签方法
  2. GD32F310G8 -【6】硬件I2C软件I2C驱动0.96OLED
  3. 2023第82届中国(天津)教育装备展示会
  4. OpenGL学习笔记(七)底纹
  5. eclipse黑色高亮主题下载和配置
  6. 简短爆笑的小笑话集锦
  7. Hadoop_HDFS的读写流程
  8. 【Leetcode】1474. Delete N Nodes After M Nodes of a Linked List
  9. mysql: [MY-010055] [Server] IP address ‘10.237.0.196‘ could not be resolved
  10. DNS解析不正常,如何配置?---金万维