| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> “基于常识知识的推理问题”源代码分析-语料库预处理 -> 正文阅读 |
|
[人工智能]“基于常识知识的推理问题”源代码分析-语料库预处理 |
2021SC@SDUSC 自从大约半个月之前更换到了新课题——“基于常识知识的推理问题”之后,我就一直在对这一新课题进行摸索。虽然我负责的项目是OpenCSR这一论文项目的源代码解析与运行,但是我还是花了一些时间去稍微了解一下梁同学负责的ACP_CSQA项目,一方面是处于好奇,另一方面也是希望能够起到一些触类旁通的作用。目前来说,虽然不能对我自己负责的项目有所助力,但是我依旧从中收获了不少,在日后的代码解析过程中如果有相关相似的内容或者可以借鉴的地方,我会拿出来讲一讲。 接下来讲述这次源代码分析的内容。某种意义上来说,这是我更换课题以来的第一篇正式意义上的源代码分析报告,它主要的解析对象是corpus_prepro.py这个python脚本,其作用是对语料库进行预处理。当然,在讲述具体的代码的作用以及意义之前,我需要重申一遍,我所认定的核心源代码,是drfact这一模型的相关源代码。而drfact的算法原理需要基于一定的数据结构来实现其数学原理,因此对于原始语料库进行一定程度的预处理是必要的,我会在这篇报告中首先讲述其必要性。 一、模型思想与预处理的必要性在阐述模型思想之前,首先需要理解OpenCSR项目所针对的是开放性的常识推理问题,即没有候选答案的常识推理,因此,它的任务定义也会和有候选答案的常识推理有所不同。基于这个任务定义,模型思想也会发生一些改变。 1. 任务定义F: 一个文本格式的事实知识语料库,其中每个文本𝑓𝑖∈𝐹描述了一段客观事实。 V:由语料库处理得到的概念集合(字典), c𝑖∈𝑉表示一个名词或者名词短语。? 输入q: 一个常识问题(示例:什么可以缓解全球变暖)。 输出Output:{(a𝑖,, 𝑤𝑖)……} 2. 模型思想以一个超图的形式建模推理过程,超图的节点为概念,包含概念的事实𝑓𝑖为超边。 从问题包含的一个概念出发,通过途径不同的事实𝑓𝑖,得到一系列节点集合。 ? 3.预处理的必要性然而,我们一般面对的事实以及概念往往都是一个长字符串的形式出现,如何才能够将这样的原始数据转变成为我们能够通过数学模型来理解的形式呢? 这里用三言两语是比较讲述内部的深层原理的,我自己对这个处理方式也是一知半解。不过,在这个模型中,我们运用最多,也是最重要的一个技术,是BERT编码。 BERT编码是一种基于transformer编码器的全新编码方式,其全称是: Bidirectional Encoder Representations from Transformers, 如果翻译过来也就是双向transformer编码表达。要理解什么是双向transformer编码表达,首先我们需要看一下这张BERT模型图。 ? 上图中的是指的单个字或词,?指的是最终计算得出的隐藏层。经过这样的操作之后,序列里面的每一个字,都含有这个字前面的信息和后面的信息,这就是双向的理解。在这里,一句话中每一个字当前这个字等于用这句话中其他所有字重新表达了一遍,每个字含有了这句话中所有成分的信息。这,就是所谓的BERT编码。 基于BERT编码,我们总算可以对我们的语料库F进行一定程度的处理了。以下是我们所需要的预计算得到的矩阵: D:对事实知识语料库F使用BERT编码得到一个事实矩阵(形成一个|F|?d的矩阵)。 S:根据规则构建事实之间的关联矩阵,即𝑓𝑖→𝑓𝑗(形成一个|F|?|F|的矩阵)。 E: 构建概念到事实之间的共现矩阵(形成一个|V|?|F|的矩阵)。 事实矩阵和关联矩阵可能比较好理解,但共现矩阵则需要一些NLP问题的基础知识。我们知道NLP的数学模型是基于词向量的,而语言模型则表示了一句话 (词组合)出现的概率。但是往往有这么一个问题,语言模型无法衡量词向量之间的关系,且词向量显得过于稀疏。这时候,共现矩阵的出现则解决了这一问题。通过将共现矩阵行(列)作为词向量,可以发现主题,解决词向量相近关系的表示。 ?基于这一些知识储备,我们开始对代码进行解析。 二、源代码解析首先,corpus_prepro.py文件调用了这些python库。其中,spacy是最重要的那个。spacy可以用于进行分词,命名实体识别,词性识别等等,毫不夸张地说,spacy可以解决几乎所有NLP问题,因此其重要性不言而喻。而absl则是一个用于设置参数的python库。
在定义具体的函数之前,本脚本首先先设置了三个参数。这三个参数都会出现在后续的函数定义等过程中。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 8:28:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |