学习目标:
作为一名做知识图谱方向的研一菜鸡,想尽快入门知识图谱。文中是我个人对知识图谱最初的认识,刚接触的时候所了解的怕以后会忘记,就记录一下,如有错误理解的地方欢迎大家批评指正。
学习记录:
一、什么是知识图谱
知识图谱是人工智能很重要的一个分支,知识图谱也有很多小的分支,比如说概念提取、关系识别、智能问答、知识推理、图存储等等,细分还有很多可以研究的小方向,比如说概念提取中的NER命名实体识别。
知识图谱简单理解,就是存储知识的图结构,可以理解成“多关系图”,学过计算机的大多都会对图有已经了解吧,图通俗的说就是n个节点通过m条边链接在一起,其中节点代表了现实中的一些实体,边就代表了相邻两个实体之间存在什么样的关系,但是限定了待加入知识图谱数据的格式,他就相当于某个领域内的数据模型,包含了该领域内有意义的概念类型,其中以图数据库(比如Neo4j)存储的图中还可以带着属性,图1差不多就是一个知识图谱的例子,查询某个节点可以找到与其相连的相关节点。
图1
二、知识图谱的用途
学好一个东西,还要根据这个东西来写论文发论文,就需要知道这个东西能做什么,然后再去学习怎么做。早期知识图谱做的好的无非就是微软和 Google,随着后来的发展和其本身功能的强大,知识图谱可以应用的领域越来越广,主要应用于智能问答、商品推荐、反诈骗识别、临床决策、语义搜索等等。
三、知识图谱整体架构
首先要说一说本体这个概念,本体就是结构化知识库的概念模板,一种能在语义和知识层次上描述信息系统的概念模型建模工具,我简单地理解,本体就是一个模板,定义了数据类型啊、关系类型啊这种,相当于定义了一个规则,在构建的过程中对于数据的处理结果都要遵循这个规则,比如定义了学校,学生,老师这三个概念和“任职于”、“就读于”、“教”这三个关系,那么数据中的概念就只能出现这三个概念相关的现实对象,他们的关系也在这三个之中。
知识图谱通常采用本体库来管理知识图谱的模式。通过本体库而形成的知识库不仅层次结构较强,并且冗余程度较小。笼统来讲,知识图谱的构建主要包含了两大部分,一个是搞数据,一个是存数据。搞数据还是比较麻烦的,数据源可以是任何你所要研究的相关领域的文字数据,可以是结构化数据,也可以是非机构化的,不同类型数据处理的方式不同,最终得到的所有现实实体对象都要朝着我们所预先构建的本体靠拢。知识图谱构建从最原始的数据出发,采用一系列自动或者半自动的技术手段,从原始数据库和第三方数据库中提取知识事实,并将其存入相应的图数据库。
四、知识图谱的落地流程
知识图谱平台实施步骤包括了问题定义——>数据收集——>数据预处理——>知识图谱设计——>存储知识图谱——>应用知识图谱——>系统评评估。
数据预处理主要包括数据甄别、数据清洗、数据转换和数据融合等步骤。数据甄别旨在明确建立领域知识图谱的数据来源。数据来源可以是多种多样的,可以是知网数据爬取,也可以是领域的文本数据,应该尽量选择结构化程度相对较高、质量较好的数据源,以尽可能降低知识获取代价。不同来源有着不同的质量,需要不同的数据加工方式。数据清洗、数据转换与数据融合等步骤与传统构建数据仓库所需要的数据处理相类似。数据清洗是对数据中的噪音,特别是来自互联网的错误、虚假等信息进行清洗,对表示不规范的数据进行统一与规范化。数据转换将不同形式、不同格式的数据转换成统一的表达形式。数据融合是针对不同来源的数据在数据层面进行融合。这里的数据融合与后续的知识融合有相似之处,也有不同之处。后续的知识融合是在识别了实体、属性等知识要素之后完成的。而此处的数据融合是字段、元组等层次的融合,数据或信息还未汇聚到实体上。
目前为止我只进行过数据的获取以及预处理(计算机学科领域的),部分数据是来自知网的爬取(比如部分学校老师的专利),用到的是selenium库,来爬取动态网页的结构化信息,爬取到的数据是以特定字段的形式存放在excel表格中,代码如下。
from selenium import webdriver
import time
import os
from bs4 import BeautifulSoup
import csv
from selenium.webdriver.support.ui import Select
def NodeExists(xpath):
try:
driver.find_element_by_xpath(xpath)
return True
except:
return False
# 如果默认的版本不符合要求,重新下一个chromedriver,放在一个纯英文目录就行
# driver_path = r"下载的chromedriver位置"
# driver = webdriver.Chrome(executable_path = driver_path)
out = open('f:/test.csv', 'w', newline='', encoding='UTF-8')
csv_writer = csv.writer(out, dialect='excel')
lis0 = ["seq", "专利名称_链接", "专利名称", "发明人", "发明人1", "申请人", "申请人2", "数据库", "申请日", "公开日", "操作链接", "字段"]
csv_writer.writerow(lis0)
for root, dirs, files in os.walk("F:\dpzl"):
for filename in files:
schoolname = filename.split(".")[0]
lis_allRecord = []
print("开始抓取" + schoolname + "的数据了!")
print("*" * 20)
f = open('f:/dpzl/' + schoolname + '.txt', 'r', encoding='UTF-8')
for name in f.readlines():
print(schoolname)
driver = webdriver.Chrome()
url = "https://kns.cnki.net/kns8/AdvSearch?dbprefix=SCDB&&crossDbcodes=CJFQ%2CCDMD%2CCIPD%2CCCND%2CCISD%2CSNAD%2CBDZK%2CCCJD%2CCCVD%2CCJFN"
xpath = "/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]"
driver.get(url)
time.sleep(1)
inputTag_zl = driver.find_element_by_xpath("/html/body/div[3]/div[1]/div/ul[1]/li[7]/a")
inputTag_zl.click()
time.sleep(1)
inputTag_gjindex = driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/ul/li[5]")
inputTag_gjindex.click()
time.sleep(1)
te = driver.find_element_by_xpath(
"/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/dl/dd[2]/div[1]/ul")
select1 = driver.find_element_by_xpath(
"/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/dl/dd[2]/div[2]/div[1]/div[1]")
select1.click()
time.sleep(1)
inputTag_auth = driver.find_element_by_xpath(
"/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/dl/dd[3]/div[2]/input")
time.sleep(1)
inputTag_auth.send_keys(schoolname)
time.sleep(1)
tagAuthor = driver.find_element_by_xpath(
"/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/dl/dd[2]/div[2]/div[1]/div[2]/ul/li[12]")
tagAuthor.click()
time.sleep(1)
inputTag_auth = driver.find_element_by_xpath(
"/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/dl/dd[2]/div[2]/input")
inputTag_auth.send_keys(name)
time.sleep(2)
if NodeExists("/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody"):
table1 = driver.find_element_by_xpath(
"/html/body/div[3]/div[2]/div[2]/div[2]/form/div/table/tbody").get_attribute('innerHTML')
soup = BeautifulSoup(table1, "html.parser")
table = soup.find_all('tr')
for row in table:
cols = [col.text for col in row.find_all("td")]
t1 = row.find_all("td")[1].find_all("a")
t2 = row.find_all("td")[7].find_all("a") # 找不到这个操作字段
href = ""
href2 = ""
for coll in t2:
href2 = coll.get('href')
break
for col in t1:
href = col.get('href')
cols[1] = cols[1].replace('\n', '')
seq = cols[0] # 序列号
name0 = cols[1] # 专利名
author = cols[2] # 发明人
author_first = name # 发明人1
applicatiopn = cols[3] # 申请人
database = cols[4] # 数据库
time_application = cols[5] # 申请日
time_publish = cols[6] # 发表日
lis = [seq, href, name0, author, author_first, applicatiopn, schoolname, database, time_application,
time_publish, href2, applicatiopn]
lis_temp = [name0, author, applicatiopn, database, time_application, time_publish]
if lis_temp not in lis_allRecord:
lis_allRecord.append(lis_temp)
csv_writer.writerow(lis)
print(name + "的专利存入成功!")
else:
print("节点不存在")
time.sleep(1)
driver.close()
out.close()
最后的结果在excel里大概就是下边这样
总结语:
好了第一次记录就到这吧,上面只是简单的对我了解的知识图谱做了梳理,以及python我都不是很熟练,今年才开始学着用,所以写的很烂。其中包括很多知识图谱的概念我都是很模糊的,很多地方都理解的不到位,刚开始做知识图谱还是很生疏,后续会确定自己的具体研究方向,记录自己的学习过程。