基于知识图谱和知识库的大模型对话系统(二)
基于知识图谱和知识库的大模型对话系统(二)
构建知识图谱
构建抽取规则:
定义实体关系类型: 确定需要识别的实体及其之间的关系类型。
定义优质种子三元组: 选择一些高质量的种子实例,这些实例包含了我们希望识别的关系类型。
类型和人工筛选: 通过机器学习和人工干预的方式对这些种子实例进行筛选和扩充。
标注微调数据:
使用doccano平台对数据进行格式化处理,包括文本格式的转换和数据类型的标准化。
采样代表性数据: 从大量数据中选择具有代表性的样本进行进一步的处理和分析。
进行少量的数据标注: 对选出的代表性数据进行手工标注,以便后续的训练和使用。
模型训练与信息抽取:
预训练统一信息抽取模型: 利用之前准备的数据和标注结果,训练出一个能够识别特定关系类型的模型。
统一信息抽取框架模型微调: 根据具体的业务场景和应用需求,对预训练的模型进行调整和优化。
微调信息抽取模型: 进一步调整模型参数以适应特定的数据分布和特征表示方式。
模型评估: 对训练得到的模型进行性能评估,以确保其满足预期的准确性和效率要求。
构建图谱:通过得到的实体及其对应的关系构建知识图谱
模型训练
预训练模型bert和SPN4RE模型结合使用
微调后的BERT模型:
BERT模型在预训练之后,通常需要在特定任务上进行微调(fine-tuning)。微调是指使用特定任务的标注数据来进一步训练BERT模型,使其适应这个任务的特点。微调后的BERT模型能够更好地捕捉与该任务相关的语言特征。
作为特征提取器:
在微调之后,BERT模型可以被视为一个特征提取器。这意味着我们可以利用它来提取输入文本(如句子)的特征表示,而不是直接用它来进行预测。在传统的机器学习流程中,特征提取是一个重要步骤,用于将原始数据转换为机器学习模型可以处理的格式。
为句子中的每个单词生成深层语义表示:
当一个句子被送入微调后的BERT模型时,模型会为句子中的每个单词输出一个向量表示。这个向量是单词的深层语义表示,它不仅包含了单词的字面意思,还融合了该单词在句子上下文中的含义。这种表示考虑了单词周围的上下文信息,因此可以捕捉到复杂的语义关系和句法结构。
综合起来,这句话的意思是:我们可以使用在特定任务上微调过的BERT模型,来提取输入句子的每个单词的深层语义特征表示。
结合BERT和SPN4RE:
将BERT输出的单词表示作为输入传递给SPN4RE模型。SPN4RE模型利用这些表示来预测实体之间的关系。这通常涉及到以下步骤:
实体识别:首先使用BERT模型进行实体识别,确定句子中的实体位置。
关系分类:然后,SPN4RE模型根据BERT提供的实体表示和它们之间的上下文信息来预测实体之间的关系。
创建知识图谱的流程:初始化:
创建一个
KnowledgeGraphBuilder
实例,设置数据目录、原始文本文件路径、基础知识图谱文件路径、筛选后的知识图谱文件路径、预训练模型路径、GPU编号等。创建数据目录以存储生成的数据。
从文本文件中获取基础知识图谱 (
get_base_kg_from_txt
方法):清洗文本并切分句子。
使用飞浆的信息抽取模型(UIE)来进行简单的获取实体及关系,并保存包含句子ID的结果。
使用BERT Tokenizer检测实体是否在句子中,并将过滤后的结果保存。
人工筛选并保存基础知识图谱。
运行迭代 (
run_iteration
方法):对于每个迭代:
使用bert来进行实体识别,可以想象成多标签任务,知识损失函数一个是sigmoid 一个是sigmax,一个多标签,一个多分类,来得到每个句子的实体和关系。
确定当前迭代的数据路径和输出路径。
创建一个
ModelTrainer
实例来进行训练和测试。如果预测文件不存在,则进行模型的训练和测试;如果存在,则跳过训练。
进行关系对齐和知识图谱的精炼与扩展。
更新知识图谱路径列表,保存当前迭代的状态,并增加版本号。
计算扩展比例 (
extend_ratio
方法):计算当前版本相对于前一个版本的知识图谱中三元组数量的扩展比例。
保存和加载状态 (
save
和load
方法):保存当前状态到文件,以便可以在后续的训练中恢复。
从文件加载以前保存的状态。
整个流程可以概括为:
准备阶段:初始化设置和基础知识图谱的构建。
迭代阶段:多次运行模型训练、测试、关系对齐和知识图谱精炼的过程。
评估阶段:评估每次迭代后知识图谱的增长情况。
持久化阶段:保存和加载训练状态,以便于后续的继续训练或分析。
遇到的问题?
经过 bertTokenizer 之后,实体不在句子中?
这句话的意思是在自然语言处理(NLP)任务中,特别是在使用BERT(Bidirectional Encoder Representations from Transformers)模型进行实体识别或关系抽取时,可能会遇到的一种问题。下面我将详细解释这句话的含义:
BERT Tokenizer:BERT模型在处理文本之前,需要使用一个分词器(tokenizer)将输入的文本拆分成一系列 tokens。这些tokens通常是子词(subwords)或者单词。BERT使用的WordPiece分词器可以将单词拆分成更小的单元,以便更好地处理未登录词(out-of-vocabulary,OOV)。
实体:在NLP中,实体指的是具有特定意义或指代某个对象的词或短语,如人名、地名、组织名等。
三元组:在关系抽取任务中,三元组通常指的是一个包含主体(subject)、关系(relation)和客体(object)的元组,用于表示句子中的某种关系。
现在,让我们分析这句话的具体含义:
当BERT Tokenizer处理一个包含实体的句子时,它可能会将实体拆分成多个tokens。例如,假设有一个实体“北京大学”,在经过分词后可能会被拆分成“北京”和“大学”两个tokens。
“实体不在句子中了”:这意味着在分词后,原始的实体作为一个整体不再出现在tokens列表中。在这种情况下,如果实体对于理解句子的含义非常关键(如在关系抽取任务中),那么实体的拆分可能会导致模型无法正确识别关系。
“自动过滤到一些错误的三元组”:由于实体的拆分,模型可能会错误地识别关系,或者无法识别出正确的关系。例如,如果句子是“张三在北京大学学习”,而“北京大学”在分词后被拆分,模型可能无法正确抽取“张三 - 学习 - 北京大学”这个三元组。因此,需要有一种机制来过滤掉这些由于分词错误导致的不正确的三元组
解决办法:#使用bertTokenizer检测实体是否在句子中,并将过滤后的结果保存。