Datawhale 知识图谱组队学习 之 Task 4 用户输入->知识库的查询语句
目录
一、引言
- 所涉及的背景知识;
- 代码和注释
二、什么是问答系统?
用来回答人提出的自然语言问题的系统
2.1 问答系统简介
2.2 Query理解
2.2.1 Query理解介绍
Query即询问
- 词法;
- 句法;
- 语义;
2.2.2 意图识别
介绍:意图识别是用来检测用户当前输入的意图
2.2.3 槽值填充
- 绍:槽值填充就是根据我们既定的一些结构化字段,将用户输入的信息中与其对应的部分提取出来。因此,槽值填充经常被建模为序列标注的任务。
- 举例介绍:例如下图所示的 Query “北京飞成都的机票”,通过意图分类模型可以识别出 Query的整体意图是订机票,在此基础上进一步语义解析出对应的出发地 Depart=“北京”,到达地 Arrive=“成都”,所以生成的形式化表达可以是:Ticket=Order(Depart,Arrive),Depart={北京},Arrive={成都}。
三、任务实践
四、 主体类 EntityExtractor 框架介绍
五、命名实体识别任务实践
下面展示一些 内联代码片
。
#!/usr/bin/env python3
# coding: utf-8
import os
import ahocorasick
from sklearn.externals import joblib
import jieba
import numpy as np
class EntityExtractor:
def __init__(self):
pass
# 构造actree,加速过滤
def build_actree(self, wordlist):
"""
构造actree,加速过滤
:param wordlist:
:return:
"""
pass
# 模式匹配, 得到匹配的词和类型。如疾病,疾病别名,并发症,症状
def entity_reg(self, question):
"""
模式匹配, 得到匹配的词和类型。如疾病,疾病别名,并发症,症状
:param question:str
:return:
"""
pass
# 当全匹配失败时,就采用相似度计算来找相似的词
def find_sim_words(self, question):
"""
当全匹配失败时,就采用相似度计算来找相似的词
:param question:
:return:
"""
pass
# 采用DP方法计算编辑距离
def editDistanceDP(self, s1, s2):
"""
采用DP方法计算编辑距离
:param s1:
:param s2:
:return:
"""
pass
# 计算词语和字典中的词的相似度
def simCal(self, word, entities, flag):
"""
计算词语和字典中的词的相似度
相同字符的个数/min(|A|,|B|) + 余弦相似度
:param word: str
:param entities:List
:return:
"""
pass
# 基于特征词分类
def check_words(self, wds, sent):
"""
基于特征词分类
:param wds:
:param sent:
:return:
"""
pass
# 提取问题的TF-IDF特征
def tfidf_features(self, text, vectorizer):
"""
提取问题的TF-IDF特征
:param text:
:param vectorizer:
:return:
"""
pass
# 提取问题的关键词特征
def other_features(self, text):
"""
提取问题的关键词特征
:param text:
:return:
"""
pass
# 预测意图
def model_predict(self, x, model):
"""
预测意图
:param x:
:param model:
:return:
"""
pass
# 实体抽取主函数
def extractor(self, question):
pass
还在对代码详细研究中,毕竟小白不可能一下看得懂。。。。。 后面把详细理解过程加进来,不过可以进行对县城初六
具体的代码来自某小伙伴,群内讨论如下:
ttx = self.graph.begin()
count = 0
nodes_tmp = []
for node_name in tqdm(nodes):
node = Node(label,name=node_name)
node_tmp.append(node)
nodes_tmp = Subgraph(nodes_tmp)
tx.create(nodes_tmp)
tx.commit()
修改后,就可以执行了,ssd固态时间为50-80mins就可以完成
Cypher 介绍:作为Neo4j的查询语言,“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。
设计的目的:一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。
思路:Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。
与命令式语言的区别:Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询
总结: Task1将所整个程序跑哪了一遍,其实就是将整个流程了解一遍!其中很多小的知识点,是很多小坑,学到了很多