做网站制作软件,深圳教育网站建设,优秀设计平台,美容店网站建设目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境服务器环境 模块实现1. 构造数据集2. 识别网络3. 命名实体纠错4. 检索问题类别5. 查询结果 系统测试1. 命名实体识别网络测试2. 知识图谱问答系统整体测试 工程源代码下载其它资料下载 前言 
这个项目充分利用了… 目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境服务器环境 模块实现1. 构造数据集2. 识别网络3. 命名实体纠错4. 检索问题类别5. 查询结果 系统测试1. 命名实体识别网络测试2. 知识图谱问答系统整体测试 工程源代码下载其它资料下载 前言 
这个项目充分利用了Google的Bert模型这是一种基于Attention的大规模语料预训练模型以及LSTM命名实体识别网络。项目的目标是设计一套通用的问答系统处理逻辑以实现智能问答任务。 
首先我们采用了Bert模型这是一种在自然语言处理领域非常强大的预训练模型。它具备对上下文的深刻理解和信息抽取能力有助于理解复杂的自然语言问题。 
接着我们构建了一个LSTM命名实体识别网络。这个网络可以识别文本中的命名实体例如人名、地名、组织机构等。这对于问答系统的准确性非常重要因为它有助于识别问题中提到的实体并提供相关信息。 
在项目的设计中我们着重考虑了通用的处理逻辑使得问答系统能够适应各种不同领域和主题的问题。这个通用逻辑包括问题解析、文本理解、命名实体识别、答案生成等步骤。 
最终我们成功地实现了一个智能问答系统它可以接受用户提出的问题并基于Bert模型和LSTM命名实体识别网络理解问题并提供精确的答案。这个系统的通用性使得它在多个领域和应用中都具有广泛的潜力从解答常见问题到处理专业领域的知识查询。 
总体设计 
本部分包括系统整体结构图和系统流程图。 
系统整体结构图 
系统整体结构如图所示。 系统流程图 
系统流程如图所示。 Neo4j数据库流程如图所示。 运行环境 
本部分包括 Python 环境和服务器环境。 
Python 环境 
需要Python 3.7及以上配置在Windows环境下载Anaconda完成Python所需的配置下载地址为https://www.anaconda.com/也可下载虚拟机在Linux环境下运行代码。TensorFlow 1.0, NumPy, py-Levenshtein, jieba, Scikit-learn 依据根目录文件requirement.txt下载。 
pip install -r requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple 服务器环境 
Mac/Windows 10用户可直接从终端通过SSH (Secure Shell)访问服务器。Windows 7用户可安装OpenSSH访问。 
OpenSSH是SSH协议的免费开源实现可以进行远程控制或在计算机之间传送文件。实现此功能的传统方式会使用明文传送密码。缺点:Telnet(终端仿真协议)、RCP、FTP、 Login、 RSH不安全。 
OpenSSH提供了服务器端后台程序和客户端工具用来加密远程控制和文件传输过程中的数据并由此代替原来的类似服务。下 载地址为https://www.mls-software.com/opensshd.html下载后按照默认完成安装即可。打开cmd命令窗口即可远程操作如图所示。 模块实现 
本项目包括5个模块:构造数据集、识别网络、命名实体纠错、检索问题类别、查询结果下面分别给出各模块的功能介绍及相关代码。 
1. 构造数据集 
数据是从北京邮电大学图书馆网站爬取主要包含教师的电话、研究方向、性别以及课程的学分、开设学期等信息。通过循环语句按照中文习惯将爬取的信息构造为问句的形式并对构造的语句进行标注无用实体标记为0将有用实体分为三类: TEA (老师)、COU (课程)、DIR (研究方向)。标注方式为实体开头B——实体类别标注非实体开头为I——实体类别标注训练集数据如图所示。  加载训练集相关代码如下 
def _read_data(cls, input_file):#读取数据集文件with codecs.open(input_file,r,encodingutf-8) as f:lines  []words  []labels  []for line in f:contends  line.strip()tokens  contends.split(\t)if len(tokens)  2:words.append(tokens[0])labels.append(tokens[1])else:if len(contends)  0:l.join([label for label in labels if len(label)  0])w   .join([word for word in words if len(word)  0])lines.append([l, w])words  []labels  []continueif contends.startswith(-DOCSTART-):words.append()continuereturn lines
#读取训练集
def get_train_examples(self, data_dir):return self._create_example(self._read_data(os.path.join(data_dir, train.txt)), train)
#读取验证集
def get_dev_examples(self, data_dir):return self._create_example(self._read_data(os.path.join(data_dir,dev.txt)),dev)
#读取测试集
def get_test_examples(self, data_dir):return self._create_example(self._read_data(os.path.join(data_dir, test.txt)), test)2. 识别网络 
使用Google的Bert调用LSTM模型代码加以修改进行训练。 
def train_ner():  #定义训练import osfrom bert_base.train.train_helper import get_args_parserfrom bert_base.train.bert_lstm_ner import trainargs  get_args_parser()if True:import sysparam_str  \n.join([%20s  %s % (k, v) for k, v in sorted(vars(args).items())])print(usage: %s\n%20s   %s\n%s\n%s\n % ( .join(sys.argv), ARG, VALUE, _ * 50, param_str))print(args)os.environ[CUDA_VISIBLE_DEVICES]  args.device_maptrain(argsargs)
#数据处理代码
def convert_single_example(ex_index, example, label_list, max_seq_length, tokenizer, output_dir, mode):
#将一个样本进行分析字和标签转化为ID结构化到输入特征对象中label_map  {}#1表示从1开始对标签进行索引化for (i, label) in enumerate(label_list, 1):label_map[label]  i#保存label-index 的映射if not os.path.exists(os.path.join(output_dir, label2id.pkl)):with codecs.open(os.path.join(output_dir,label2id.pkl),wb)as w:pickle.dump(label_map, w)textlist  example.text.split( )labellist  example.label.split( )tokens  []labels  []for i, word in enumerate(textlist):#分词不在BERT的vocab.txt中则进行WordPiece处理分字可替换为list(input)token  tokenizer.tokenize(word)tokens.extend(token)label_1  labellist[i]for m in range(len(token)):if m  0:labels.append(label_1)else:  #一般不会出现else分支labels.append(X)#tokens  tokenizer.tokenize(example.text)#序列截断if len(tokens)  max_seq_length - 1:tokens  tokens[0:(max_seq_length - 2)]  
#-2的原因是因为序列需要加一个句首和句尾标志labels  labels[0:(max_seq_length - 2)]ntokens  []segment_ids  []label_ids  []ntokens.append([CLS])  #句子开始设置CLS标志segment_ids.append(0)#append(O) or append([CLS]) not sure!label_ids.append(label_map[[CLS]])  
#O或者CLS会减少标签个数但句首和句尾使用不同的标志标注for i, token in enumerate(tokens):ntokens.append(token)segment_ids.append(0)label_ids.append(label_map[labels[i]])ntokens.append([SEP])  #句尾添加[SEP]标志segment_ids.append(0)#append(O) or append([SEP]) not sure!label_ids.append(label_map[[SEP]])input_ids  tokenizer.convert_tokens_to_ids(ntokens)  
#将序列中的字(ntokens)转化为ID形式input_mask  [1] * len(input_ids)#label_mask  [1] * len(input_ids)#使用padding while len(input_ids)  max_seq_length:input_ids.append(0)input_mask.append(0)segment_ids.append(0)label_ids.append(0)ntokens.append(**NULL**)#label_mask.append(0)#print(len(input_ids))assert len(input_ids)  max_seq_lengthassert len(input_mask)  max_seq_lengthassert len(segment_ids)  max_seq_lengthassert len(label_ids)  max_seq_length#assert len(label_mask)  max_seq_length#打印部分样本数据信息if ex_index  5:tf.logging.info(*** Example ***)tf.logging.info(guid: %s % (example.guid))tf.logging.info(tokens: %s %  .join([tokenization.printable_text(x) for x in tokens]))tf.logging.info(input_ids:%s%  .join([str(x) for x in input_ids]))tf.logging.info(input_mask: %s %  .join([str(x) for x in input_mask]))tf.logging.info(segment_ids: %s %  .join([str(x) for x in segment_ids]))tf.logging.info(label_ids: %s %  .join([str(x) for x in label_ids]))# tf.logging.info(label_mask: %s %  .join([str(x) for x in label_mask]))#结构化为一个类feature  InputFeatures(input_idsinput_ids,input_maskinput_mask,segment_idssegment_ids,label_idslabel_ids,#label_mask  label_mask)#modetest的时候才有效write_tokens(ntokens, output_dir, mode)return feature3. 命名实体纠错 
对识别到的课程实体进行纠错依据为course.txt中存储的所有课程全称采用最短编辑距离匹配法与包含法相结合。 
class Select_course:def __init__(self):self.f  csv.reader(open(QA/dict/course.txt,r))self.course_name  [i[0].strip() for i in self.f]self.led  3self.limit_num  10self.select_word  []self.is_same  Falseself.have_same_length  Falseself.input_word  self.is_include  False#print(self.course_name)#print(列表创建完毕....)#包含搜索def select_first(self, input_word):self.select_word  []self.is_same  Falseself.is_include  Falseself.have_same_length  Falseself.input_word  input_wordif input_word in self.course_name:self.is_same  Trueself.select_word.append(input_word)if self.is_same  False:for i in self.course_name:mark  Truefor one_word in input_word:if not one_word in i:mark  Falseif mark:self.select_word.append(i)if len(self.select_word) ! 0:self.is_include  True#print(第一轮筛选:)#print(self.select_word)#模糊搜索def select_second(self):self.led  3if self.is_same or self.is_include:returnfor name in self.course_name:ed  ls.distance(self.input_word, name)if ed  self.led:self.led  edself.select_word.append(name)select_word_copy1  copy.deepcopy(self.select_word)for name in select_word_copy1:ed  ls.distance(self.input_word, name)if ed  self.led:self.select_word.remove(name)if ed  self.led and len(name)  len(self.input_word):self.hava_same_length  True#print(第二轮筛选:)#print(self.select_word)对识别到的老师实体进行纠错依据为teacher.csv中存储的所有老师姓名全称基于最短编辑距离匹配法并使纠错逻辑符合用户输入错误姓名的规律。 
class Select_name:def __init__(self):  #定义初始化self.f  csv.reader(open(QA/dict/teacher.csv,r))self.teacher_name  [i[0] for i in self.f]self.led  3self.limit_num  10self.select_word  []self.have_same_length  Falseself.is_same  Falseself.input_word  #print(self.teacher_name)#print(列表创建完毕....)def select_first(self, input_word):  #定义首选self.select_word  []self.have_same_length  Falseself.is_same  Falseself.input_word  input_wordif input_word in self.teacher_name:self.is_same  Trueself.select_word.append(input_word)if self.is_same  False:for name in self.teacher_name:ed  ls.distance(self.input_word, name)if ed  self.led:self.led  edself.select_word.append(name)select_word_copy1  copy.deepcopy(self.select_word)for name in select_word_copy1:ed  ls.distance(self.input_word, name)if ed  self.led:self.select_word.remove(name)if ed  self.led and len(name)  len(self.input_word):self.hava_same_length  True#print(第一轮筛选:)#print(self.select_word)returndef select_second3(self):  #定义后续筛选if self.is_same  True or len(self.input_word) ! 3:return select_word_copy2  copy.deepcopy(self.select_word)if self.hava_same_length:for name in select_word_copy2:if len(self.input_word)!len(name):self.select_word.remove(name)#print(第二轮筛选:)#print(self.select_word)def select_third3(self):if self.is_same  True or len(self.input_word) ! 3:return select_word_copy3  copy.deepcopy(self.select_word)self.select_word  []for name in select_word_copy3:if name[0]  self.input_word[0] and name[2]  self.input_word[2]:self.select_word.append(name)for name in select_word_copy3:if not(name[0]self.input_word[0]and name[2] self.input_word[2]):self.select_word.append(name)#print(第三轮筛选:)#print(self.select_word)def limit_name_num(self):while(len(self.select_word)self.limit_num):self.select_word.pop()#print(列表大小限制:)#print(self.select_word)4. 检索问题类别 
以下为三个类别的关键词列表: 
self.direction_qwds [“ 做什么”“干什么”“专长”“专攻”“兴趣”“方向”“方面”“研究”“科研”] 
self.location_qwds  [“地址”“地点”“地方”“在哪”去哪”“到哪”找到”“办公室”“位置”“见到”] 
self.telephone_qwds [“ 座机”“固话”“电话”“号码”“联系”] 
通过识别到的实体类别和检索到的关键词进行问题分类相关代码如下: if self.check_words(self.direction_qwds,question)and(teacher in types):        					question_type  teacher_direction  question_types.append(question_type)  if self.check_words(self.location_qwds, question)and (teacher in types):        question_type  teacher_location  question_types.append(question_type)  if self.check_words(self.telephone_qwds,question)and (teacher in types):        question_type  teacher_telephone  question_types.append(question_type)  5. 查询结果 
根据识别到的具体问题类别将问句翻译成数据库查询语句相关代码如下: 
if final_question_type  teacher_direction:  sql  MATCH (m:Teacher) where m.name  {0} return m.name, m.research_direction.format(i)  
if final_question_type  teacher_location:  sql  MATCH (m:Teacher) where m.name  {0} return m.name, m.office_location.format(i)  
if final_question_type  teacher_telephone:  sql  MATCH (m:Teacher) where m.name  {0} return m.name, m.telephone.format(i)  
#连接数据库
def __init__(self):  self.g  Graph(  http://10.3.55.50:7474/browser,  user********,  password********)  self.num_limit  30  
#查询结果并返回编写的模版答案语句
def search_main(self, sqls, final_question_types):  final_answers  []  temp_data  []  data  []  for i in sqls:  for one_sql in i:  temp_data.append(self.g.run(one_sql).data()[0])  #print(temp_data)  data.append(temp_data)  temp_data  []  #print(data)  temp_answer  []  answer  []  for i in zip(final_question_types, data):  for one_type_and_data in zip(i[0],i[1]):  temp_answer.append(self.answer_prettify(one_type_and_data[0],one_type_and_data[1]))  answer.append(temp_answer)  temp_answer  []  return answer  重复询问以剔除错误的备选例如识别到用户输入的老师姓名为王红但查询到北京邮电大学没有王红存在王春红、王小红此时重复询问用户以确定唯一实体对象。 
ask_again    
final_question_types  []  
for i in zip(tags, pre_words):  #print(i)  if len(i[1])  1:   final_question_types.append(classifier.classify(text, i[0]))  final_words.append(i[1][0])  if len(i[1])  1:  print(1)  if i[0]  teacher:  ask_again  请问您要询问的是哪个老师的信息{0}.format(,.join(i[1]))  if i[0]   course:  ask_again  请问您要询问的是哪门课程的信息{0}.format(,.join(i[1]))  #print(ask_again)  answer_again  input(ask_again)  final_words.append(answer_again)  final_question_types.append(classifier.classify(text, i[0])) 系统测试 
本部分包括命名实体识别网络测试和知识图谱问答系统整体测试。 
1. 命名实体识别网络测试 
输入常用问句从测试结果可知测试基本能实现老师、课程实体的识别模型训练效果如图所示。 2. 知识图谱问答系统整体测试 
输入常用问句从问答系统返回的答案可知系统运行状态良好基本能回答用户提出的问题效果如图所示。 工程源代码下载 
详见本人博客资源下载页 其它资料下载 
如果大家想继续了解人工智能相关学习路线和知识体系欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线所有资料免关注免套路直接网盘下载》 这篇博客参考了Github知名开源平台AI技术平台以及相关领域专家DatawhaleApacheCNAI有道和黄海广博士等约有近100G相关资料希望能帮助到所有小伙伴们。 文章转载自: http://www.morning.jrpmf.cn.gov.cn.jrpmf.cn http://www.morning.kltsn.cn.gov.cn.kltsn.cn http://www.morning.trrd.cn.gov.cn.trrd.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn http://www.morning.mfmrg.cn.gov.cn.mfmrg.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.wflsk.cn.gov.cn.wflsk.cn http://www.morning.qykxj.cn.gov.cn.qykxj.cn http://www.morning.lwlnw.cn.gov.cn.lwlnw.cn http://www.morning.hwcgg.cn.gov.cn.hwcgg.cn http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn http://www.morning.cwqln.cn.gov.cn.cwqln.cn http://www.morning.qrpx.cn.gov.cn.qrpx.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.ghrhb.cn.gov.cn.ghrhb.cn http://www.morning.bnxfj.cn.gov.cn.bnxfj.cn http://www.morning.cwgn.cn.gov.cn.cwgn.cn http://www.morning.lhjmq.cn.gov.cn.lhjmq.cn http://www.morning.jrhcp.cn.gov.cn.jrhcp.cn http://www.morning.fzlk.cn.gov.cn.fzlk.cn http://www.morning.dzzjq.cn.gov.cn.dzzjq.cn http://www.morning.jcxzq.cn.gov.cn.jcxzq.cn http://www.morning.qcdhg.cn.gov.cn.qcdhg.cn http://www.morning.pshtf.cn.gov.cn.pshtf.cn http://www.morning.cryb.cn.gov.cn.cryb.cn http://www.morning.fgsct.cn.gov.cn.fgsct.cn http://www.morning.tqygx.cn.gov.cn.tqygx.cn http://www.morning.kgsws.cn.gov.cn.kgsws.cn http://www.morning.csjps.cn.gov.cn.csjps.cn http://www.morning.qnpyz.cn.gov.cn.qnpyz.cn http://www.morning.dlbpn.cn.gov.cn.dlbpn.cn http://www.morning.fxzlg.cn.gov.cn.fxzlg.cn http://www.morning.wsnbg.cn.gov.cn.wsnbg.cn http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn http://www.morning.yrskc.cn.gov.cn.yrskc.cn http://www.morning.dpflt.cn.gov.cn.dpflt.cn http://www.morning.jfbbq.cn.gov.cn.jfbbq.cn http://www.morning.jkcpl.cn.gov.cn.jkcpl.cn http://www.morning.bpmdh.cn.gov.cn.bpmdh.cn http://www.morning.mgfnt.cn.gov.cn.mgfnt.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.bfwk.cn.gov.cn.bfwk.cn http://www.morning.qblcm.cn.gov.cn.qblcm.cn http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn http://www.morning.cbynh.cn.gov.cn.cbynh.cn http://www.morning.mnslh.cn.gov.cn.mnslh.cn http://www.morning.zmlnp.cn.gov.cn.zmlnp.cn http://www.morning.thlr.cn.gov.cn.thlr.cn http://www.morning.qdsmile.cn.gov.cn.qdsmile.cn http://www.morning.ffbl.cn.gov.cn.ffbl.cn http://www.morning.tthmg.cn.gov.cn.tthmg.cn http://www.morning.knqzd.cn.gov.cn.knqzd.cn http://www.morning.lcmhq.cn.gov.cn.lcmhq.cn http://www.morning.ysnbq.cn.gov.cn.ysnbq.cn http://www.morning.nlysd.cn.gov.cn.nlysd.cn http://www.morning.lhyhx.cn.gov.cn.lhyhx.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.cytr.cn.gov.cn.cytr.cn http://www.morning.ppdr.cn.gov.cn.ppdr.cn http://www.morning.tgczj.cn.gov.cn.tgczj.cn http://www.morning.clkyw.cn.gov.cn.clkyw.cn http://www.morning.tgdys.cn.gov.cn.tgdys.cn http://www.morning.tmpsc.cn.gov.cn.tmpsc.cn http://www.morning.qyhcg.cn.gov.cn.qyhcg.cn http://www.morning.rnqnp.cn.gov.cn.rnqnp.cn http://www.morning.kxymr.cn.gov.cn.kxymr.cn http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn http://www.morning.zfwjh.cn.gov.cn.zfwjh.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.splcc.cn.gov.cn.splcc.cn http://www.morning.zsleyuan.cn.gov.cn.zsleyuan.cn http://www.morning.fhbhr.cn.gov.cn.fhbhr.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn http://www.morning.kpbn.cn.gov.cn.kpbn.cn http://www.morning.gkmwk.cn.gov.cn.gkmwk.cn http://www.morning.cjqcx.cn.gov.cn.cjqcx.cn http://www.morning.dnvhfh.cn.gov.cn.dnvhfh.cn