1 代码来源
本代码来源于github项目地址,项目使用python实现一个简单的基于知识图谱的电影问答系统,相关搭建过程见博客300行python代码从零开始构建基于知识图谱的电影问答系统-目录:。这里通过横向比较基于知识图谱的问答系统1和基于知识图谱的问答系统2,来分析说明不同之处。本项目的与前两个项目在实体提取和意图预测方面存在不同之处。前面两个项目的实体提取通过AC树匹配实现,本项目则直接通过jieba分词中的词性分类来实现,意图预测部分,本项目与基于知识图谱的问答系统2](https://blog.csdn.net/weixin_44023339/article/details/100012074)相同,都是采用基于Tfidf特征的朴素贝叶斯来实现的,但本项目给出了朴素贝叶斯的训练过程。
2 基于jieba的实体提取
jieba不仅可以分词,还可以对词性进行标注,具体可参见jieba分词词性说明。项目基于知识图谱实体类别与名称构建字典,然后加载到jieba中,实现输入语句相关实体的提取。
(1)字典内容
用户字典每行一个词,格式为:
词语 词频 词性
其中词频是一个数字,词性为自定义的词性,要注意的是词频数字和空格都要是半角的。
// userdict.txt
英雄 15 nm
袁咏仪 15 nr
战争 15 ng
字典加载方式为
// 字典加载
import jieba
jieba.load_userdict("./userdict.txt")
由于nr在jieba中的原有词性也是人名,因此随便问一个人名主演的电影,程序都会产生知识图谱的查询操作,但会返回没有结果,因此可以把字典中的nr、ng改为其他非已有词性,提高程序效率。
但从后面的意图分类训练来看,演员是用nnt表示,因此项目在此方面存在不一致,统一同nnt表示演员是合适的,不会与已有的词性混淆,ng表示类型,nm表示电影。
(2)实体提取
jieba通过jieba.posseg进行词性标注。
// 字典加载
from jieba import posseg
# raw_question="刘德华主演了什么电影?"
clean_question = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+","",raw_question)
question_seged=posseg.cut(str(clea