如何让知识图谱辅助多轮对话

如何在对话中引入知识一直是备受关注的问题,这里的知识常常分为两类:

  • 非结构化知识
  • 结构化知识
    包括知识库、知识图谱、类别属性知识。

在使用知识时,我们常常采用两种方式:

  • 生成式
    把知识转为向量形式丢到模型里面一起训练
  • 检索式
    匹配到相关实体就可以输出预先设定好的回复语句

我采用的是检索知识图谱的形式。
知识图谱一般采用 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 定义两个类

这两个类的作用就是声明了 MovieDirector这两个标签的主键,以及两个是怎么联系的(通过 DIRECT),如果要修改的话应该很好照猫画虎。

class Movie(Model):
    __primarykey__ = "name"
    name = Property()
    DIRECT = RelatedTo("Director")
class Director(Model):
    __primarykey__ = "name"
    name = Property()
    DIRECT = RelatedFrom("Movie")

2.2 检索

这段代码就是先检索出来第一个名字是 nounMovie类型的节点,通过 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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球