IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 知识图谱学习笔记 4 -> 正文阅读

[人工智能]知识图谱学习笔记 4

今天学习使用ChatterBot来做一个问答系统。
关于ChatterBot的安装问题可以看这篇博文

程序结构如图:
在这里插入图片描述
medical.json是网上爬取的一个医药相关的包,然后需要通过运行build_medicalgraph在neo4j服务器上建立一个医药图谱。
首先打开neo4j服务,运用以下指令清空之前的图:

MATCH(n)
DETACH DELETE n

运行build_medicalgraph,这个时候程序报错:
在这里插入图片描述
打开neo4j.conf,搜素dbms.security.auth_enabled=false,将前面的井号键#去掉,重新打开neo4j服务,运行build_medicalgraph就可以了。

下面对build_medicalgraph做一个简单的说明。

定义一个MedicalGraph类,创建它的对象,然后用create_graphnodes()函数创建节点,用create_graphrels()函数创建关系。

if __name__ == '__main__':
    handler = MedicalGraph()
    handler.create_graphnodes()
    handler.create_graphrels()
    # handler.export_data()

接下来看MedicalGraph类内部:
在构造函数中,定义了需要读取的json文件地址,以及一个本机的neo4j的数据5-8行为默认数据:

    def __init__(self):
        cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
        self.data_path = os.path.join(cur_dir, 'data/medical.json')
        self.g = Graph(
            host="127.0.0.1",  # neo4j 搭载服务器的ip地址,ifconfig可获取到
            http_port=7474,  # neo4j 服务器监听的端口号
            user="neo4j",  # 数据库user name,如果没有更改过,应该是neo4j
            password="123456")

下面的代码是对知识图谱的节点的一个建立过程,这里的代码只创建了药、食物、检查结果和疾病信息等,其他的节点添加方式相同:

    '''创建知识图谱实体节点类型schema'''
    def create_graphnodes(self):
        Drugs, Foods, Checks, disease_infos = self.read_nodes()
        self.create_diseases_nodes(disease_infos)
        self.create_node('Drug', Drugs)
        # print(len(Drugs))
        self.create_node('Food', Foods)
        # print(len(Foods))
        self.create_node('Check', Checks)
        # print(len(Checks))
        return

    '''创建知识图谱中心疾病的节点'''
    def create_diseases_nodes(self, disease_infos):
        count = 0
        for disease_dict in disease_infos:
            node = Node("Disease", name=disease_dict['name'], desc=disease_dict['desc'],
                        prevent=disease_dict['prevent'] ,cause=disease_dict['cause'])
            self.g.create(node)
            count += 1
            # print(count)
        return

    '''建立节点'''
    def create_node(self, label, nodes):
        count = 0
        for node_name in nodes:
            node = Node(label, name=node_name)
            self.g.create(node)
            count += 1
            # print(count, len(nodes))
        return

在这里插入图片描述
json文件中的每个疾病节点结构如图,根据文件结构,我们读取文件的代码大致如下,这段代码大概的操作就是将json文件中的内容读入到相应的节点中:

    '''读取文件'''
    def read_nodes(self):
        # 几类节点
        foods = [] # 食物
        diseases = [] #疾病

        # 构建节点实体关系
        rels_noteat = [] # 疾病-忌吃食物关系
        rels_doeat = [] # 疾病-宜吃食物关系

        count = 0
        for data in open(self.data_path, encoding='utf-8'):
            disease_dict = {}
            count += 1
            # print(count)
            data_json = json.loads(data)
            disease = data_json['name']
            disease_dict['name'] = disease
            diseases.append(disease)

            if 'not_eat' in data_json:
                not_eat = data_json['not_eat']
                for _not in not_eat:
                    rels_noteat.append([disease, _not])

                foods += not_eat
                do_eat = data_json['do_eat']
                for _do in do_eat:
                    rels_doeat.append([disease, _do])

                foods += do_eat
                recommand_eat = data_json['recommand_eat']

            disease_infos.append(disease_dict)
        return set(drugs), set(foods), set(diseases), disease_infos

接下来我们创建实体的关系边,在第4行,我们可以看到,Disease是一个节点,Food是另一个节点,他们之间的关系是no_eat:

    '''创建实体关系边'''
    def create_graphrels(self):
        Foods, Diseases, rels_noteat, rels_doeat, rels_recommandeat = self.read_nodes()
        self.create_relationship('Disease', 'Food', rels_recommandeat, 'recommand_eat', '推荐食谱')
        self.create_relationship('Disease', 'Food', rels_noteat, 'no_eat', '忌吃')
        self.create_relationship('Disease', 'Food', rels_doeat, 'do_eat', '宜吃')

创建实体关联边的函数create_relationship结构如下:

    '''创建实体关联边'''
    def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
        count = 0
        # 去重处理
        set_edges = []
        for edge in edges:
            set_edges.append('###'.join(edge))
        all = len(set(set_edges))
        for edge in set(set_edges):
            edge = edge.split('###')
            p = edge[0]
            q = edge[1]
            query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-[rel:%s{name:'%s'}]->(q)" % (
                start_node, end_node, p, q, rel_type, rel_name)
            try:
                self.g.run(query)
                count += 1
                # print(rel_type, count, all)
            except Exception as e:
                print(e)
        return

将上述程序运行后,即可以将json文件整个加载到neo4j服务器上,因为json文件比较大,所以这个过程非常慢。

之后可以再写一个文件做一个应答系统,主要代码如下,这个程序主要是构造了一个类,分别完成了对提出问题的解析,和对回答的检索:

    def __init__(self):
        self.classifier = QuestionClassifier()
        self.parser = QuestionPaser()
        self.searcher = AnswerSearcher()

    def chat_main(self, question):
        answer = '您好,我是医药智能助理“小医”,希望可以帮到您。'
        res_classify = self.classifier.classify(question)
        if not res_classify:
            return answer
        res_sql = self.parser.parser_main(res_classify)
        final_answers = self.searcher.search_main(res_sql)
        if not final_answers:
            return answer
        else:
            return '\n'.join(final_answers)
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:32:20  更:2021-08-15 15:32:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:05:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码