如何在对话中引入知识一直是备受关注的问题,这里的知识常常分为两类:
- 非结构化知识
- 结构化知识
包括知识库、知识图谱、类别属性知识。
在使用知识时,我们常常采用两种方式:
- 生成式
把知识转为向量形式丢到模型里面一起训练 - 检索式
匹配到相关实体就可以输出预先设定好的回复语句
我采用的是检索知识图谱的形式。
知识图谱一般采用 Neo4j
图数据库存储,存储形式为
1.1 Neo4j界面操作
增加节点
CREATE(n:标签{name:'内容'})
增加关系(节点已存在)
MATCH(a:标签{name:"内容"}),(b:标签{name:"内容"}) with a,b CREATE(a)-[:关系名]->(b)
删除关系
MATCH(n)-[r]-() where id(r)=id号 DELETE r
删除节点和与节点相连的所有关系:
MATCH(n)-[r]-() where id(n)=id号 DELETE n,r
修改节点属性
MATCH(n:标签名{name:"内容"}) SET n.name="新内容"
1.2 python操作知识图谱
这一部分暂时略,我有代码,但是没怎么用过,基本都是手动输入 CQL
操作 Neo4j
2.1 定义两个类
这两个类的作用就是声明了 Movie
和 Director
这两个标签的主键,以及两个是怎么联系的(通过 DIRECT
),如果要修改的话应该很好照猫画虎。
class Movie(Model):
__primarykey__ = "name"
name = Property()
DIRECT = RelatedTo("Director")
class Director(Model):
__primarykey__ = "name"
name = Property()
DIRECT = RelatedFrom("Movie")
2.2 检索
这段代码就是先检索出来第一个名字是 noun
的 Movie
类型的节点,通过 DIRECT
关系找到的第一个尾节点,并提取出内容。
keanu = repo.match(Movie).where(name=noun).first()
if keanu:
s = list(keanu.DIRECT.triples())[0][2]
s = str(s).split("'")[1].replace("_", " ")
print("Let me see...The director of {m} is {d}".format(m=noun, d=s))
break
else:
print("none")
就是这两步了,把需要替换的改成你建立的图谱里的内容即可。
感觉没说明白,但是说不明白了,尽力了…
Original: https://blog.csdn.net/qq_45520647/article/details/124308371
Author: 御用厨师
Title: 如何让知识图谱辅助多轮对话
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/555997/
转载文章受原作者版权保护。转载请注明原作者出处!