ASGCN之依存句法图的构建

news2024/12/23 23:39:59

文章目录

  • 前言
  • 1.理论部分
    • 1.1 依存句法理论
    • 1.2 依存句法分析
    • 1.3 依存句法的应用
  • 2. 代码实践
    • 2.1 数据集
    • 2.2 代码实现
    • 2.3 效果查看
  • 总结


前言

本文首先介绍依存句法理论,之后通过代码实现ASGCN中的依存句法图数据的构建。


1.理论部分

1.1 依存句法理论

词与词之间存在主从关系,这是一种二元不等价的关系。在句子中,如果一个词修饰另一个词,则称修饰词为从属词(dependent),被修饰的词语称为支配词(head),两者之间的语法关系称为依存关系(dependency relation)。
现代依存语法中,语言学家对依存句法提出了四个约束性公理:

  • 有且只有一个词语(ROOT,虚拟根节点,简称虚根)不依存于其他词语。
  • 除此之外所有单词必须依存于其他单词。
  • 每个单词不能依存于多个单词。
  • 如果单词A依存于B,那么位置处于A和B之间的单词C只能依存于A、B或AB之间的单词。

例子:对于句子“猴子喜欢吃香蕉”,构建其依存句法树如下图所示。

在这里插入图片描述

1.2 依存句法分析

  • 基于图的依存句法分析:树是图的特例,依存句法树其实是完全图的一个子图。如果为完全图中的每条边是否属于句法树的可能性打分,然后就可以利用Prim之类的算法找出最大生成树作为依存句法树了。这样将整棵树的分数分解为每条边上的分数之和,然后在图上搜索最优解的方法统称为基于图的方法。
  • 基于转移的依存句法分析
    我们将一颗依存句法树的构建过程表示为两个动作。如果机器学习模型能够根据句子的某些特征准确地预测这些动作,那么计算机便能够根据这些动作拼装出正确的依存句法树了。这样的拼装动作称为转移。而这类算法统称为基于转移的依存句法分析。

1.3 依存句法的应用

短语缩句、提取文本主要内容、文本分类、情感分析、意见抽取等。

2. 代码实践

2.1 数据集

使用的数据集为acl-14-short-data中的训练集,文件后缀为“.raw”,文件中部分数据如下所示,数据由上千条评论组成,每条评论中方面词被挖出单独放在第二行,空缺位置用$T$表示,每条数据的第三行为数字-1或0,亦或1,表示此方名词对应的情感为消极、积极或中性。

i agree about arafat . i mean , shit , they even gave one to $T$ ha . it should be called ‘’ the worst president ‘’ prize .
jimmy carter
-1
musicmonday $T$ - lucky do you remember this song ? it ` s awesome . i love it .
britney spears
1

2.2 代码实现

# -*- coding: utf-8 -*-
import numpy as np
import spacy
import pickle
import argparse
from spacy.tokens import Doc

class WhitespaceTokenizer(object):
    def __init__(self, vocab):
        self.vocab = vocab

    def __call__(self, text):
        words = text.split()  # 句子切分为单词
        # All tokens 'own' a subsequent space character in this tokenizer
        spaces = [True] * len(words)
        return Doc(self.vocab, words=words, spaces=spaces) # 单词恢复成句子

nlp = spacy.load('en_core_web_sm')
nlp.tokenizer = WhitespaceTokenizer(nlp.vocab) # 将单词变为doc的类

def dependency_adj_matrix(text):
    # https://spacy.io/docs/usage/processing-textco
    tokens = nlp(text)
    words = text.split()  # 句子切分为单次
    matrix = np.zeros((len(words), len(words))).astype('float32')  # 创建n*n的矩阵(n为句子中单词的个数)
    assert len(words) == len(list(tokens))  #做出一些假设,程序运行时如果假设不成立,程序就会中断
    # 构建依存矩阵
    for token in tokens:
        matrix[token.i][token.i] = 1
        for child in token.children:  # 返回依赖token的其他token
            matrix[token.i][child.i] = 1
            matrix[child.i][token.i] = 1

    return matrix

def process(filename):
    fin = open(filename, 'r', encoding='utf-8', newline='\n', errors='ignore')  # 打开文件
    lines = fin.readlines()  # 读入数据
    fin.close() # 关闭文件
    idx2graph = {}
    fout = open('dasgu'+'.graph', 'wb')   # 创建新文件(用于存储图数据)
    for i in range(0, len(lines), 3):
        text_left, _, text_right = [s.strip() for s in lines[i].partition("$T$")]
        aspect = lines[i + 1].strip()
        adj_matrix = dependency_adj_matrix(text_left+' '+aspect+' '+text_right)  # 将方面词回填到句子中
        idx2graph[i] = adj_matrix  # 构建每个句子的依存矩阵
    pickle.dump(idx2graph, fout)  # 将依存树矩阵的数据写入文件
    fout.close() 

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--dataset', default=None, type=str, help='path to dataset')
    opt = parser.parse_args()
    process('./datasets/acl-14-short-data/train.raw')

2.3 效果查看

通过在代码的如下行出打断点调试来查看第一条数据的依赖图数据idx2graph[0]如下图所示。

idx2graph[i] = adj_matrix  # 构建每个句子的依存矩阵

在这里插入图片描述
整个程序结束后在代码文件所在的目录下生成"dasgu.graph"的文件。
在这里插入图片描述


总结

本文简要介绍了依存句法树以依存句法图的代码构建过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3电商项目实战-购物车模块2【04-头部购物车-商品列表-本地、05-头部购物车-删除操作-本地、06-购物车页面-基础布局】

文章目录04-头部购物车-商品列表-本地05-头部购物车-删除操作-本地06-购物车页面-基础布局04-头部购物车-商品列表-本地 目的:根据本地存储的商品获取最新的库存价格和有效状态。 大致步骤: 定义获取最新信息的API定义修改购物车商品信息的mutations定义…

Mybatis工作原理及流程

1、MyBatis介绍 MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型、接口和JavaPOJO(PlainOldJavaObjects,普通老式Java对象)为…

OSSFs挂载工具简介

OSSFs挂载工具 OSSFs挂载工具简介 ​ ossfs允许您在Linux系统中将对象存储OSS的存储空间(Bucket)挂载到本地文件系统。挂载完成后,您能够像操作本地文件一样操作OSS的对象(Object),从而实现数据共享。 ​…

RT_Thread Nano 简介, 移植

官网介绍 RT_Thread Nano 1.简介 RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括…

打怪升级之MFC变量小实验

按惯例,这一篇文章主要还是作者读《深入浅出MFC》整理的一些笔记。不过本次还加上了一些作者自己的理解。 实验的前期准备 做实验前,你最好了解一下MFC的执行流程,从winapp到各类控件的实际变化过程,可以参考博主之前的笔记。 …

SOTA!目标检测开源框架YOLOv6 3.0版本来啦

近日,美团视觉智能部发布了 YOLOv6 3.0 版本,再一次将目标检测的综合性能推向新高。YOLOv6-L6 检测精度和速度超越 YOLOv7-E6E,取得当前实时目标检测榜单 SOTA。本文主要介绍了 YOLOv6 3.0 版本中引入的技术创新和优化,希望能为从…

64. 最小路径和

64. 最小路径和 给定一个包含非负整数的 m∗nm * nm∗n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[…

Hudi的7种索引

1、Bloom Index Bloom Index (default) 使用根据记录键构建的bloom过滤器,也可以使用记录键范围修剪候选文件.原理为计算RecordKey的hash值然后将其存储到bitmap中,为避免hash冲突一般选择计算3次 HoodieKey 主键信息:主要包含recordKey 和p…

[ IFRS 17 ] 新准则下如何确认保险合同

本系列文章:[ IFRS 17 ] 针对保险新准则 IFRS 17 进行一些列文章更新。如若文中如有所疑问或者不同见解,欢迎留言互动交流。 注:本系列文章受众群体较小众,如若对你感到不适,请立刻点击右上角的 【】 本系列文章适用…

RDD持久化原理和共享变量

(一) RDD持久化原理 Spark中有一个非常重要的功能就是可以对RDD进行持久化。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition数据持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存中缓存…

互联网工程师 1480 道 Java 面试题及答案整理 ( 2023 年 整理版)

最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开 Boss 直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉 Java 一个初中级岗位有上千人同时竞争&#…

安卓逆向_4 --- 定位关键Smali、monitor使用、log插桩、栈追踪、methodprofiling(方法分析)

1、快速定位关键 smali 代码 1.分析流程 搜索特征字符串 搜索关键api 通过方法名来判断方法的功能 2.快速定位关键代码 反编译 APK 程序,AndroidManifest.xml > 包名/系统版本/组件 程序的主 activity(程序入口界面) 每个…

Allegro如何画半圆形的线操作指导

Allegro如何画半圆形的线操作指导 在用Allegro设计PCB的时候,在某些应用场合会需要画半圆形,如下图 如何画半圆形,具体操作如下 点击Add点击Arc w/Radius

WebRTC QoS方法之Pacer实现

本文将解读WebRTC中Pacer算法的实现。WebRTC有两套Pacer算法:TaskQueuePacedSender、PacedSender。本文仅介绍PacedSender的实现。(文章中引用的WebRTC代码基于master,commit:3f412945f05ce1ac372a7dad77d85498d23deaae源码分析&a…

算法练习(八)区域搜索

一、腐烂的橘子 1、题目描述: 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的…

从零开始:学习使用 Hugo 构建自己的静态网站

1、什么是 Hugo 1.1、简介 Hugo 是一个由 Go 语言编写的静态网站生成器。它可以帮助用户快速构建高性能的静态网站,特别是博客、文档和个人网站等。与其他静态网站生成器相比,Hugo 的特点是速度快、易于使用、可扩展性强等。Hugo 使用简单的 Markdown …

【项目】游戏-我在万科转生成了一只狗

文章目录学习unity一些基操..位置坐标系父子关系常用工具导入游戏模型资源商店创建地形为地形化妆--纹理绘制脚本组件脚本的生命周期脚本执行顺序标签和图层的作用向量的运算和意义欧拉角和四元数-常用C#预制体-类与对象Debug的使用C#物体属性使用游戏时间使用-C#计时器的设置路…

无需手动编码的XGBoost中的分类特征

无需手动编码的XGBoost中的分类特征 XGBoost 是一种基于梯度提升的基于决策树的集成机器学习算法。 然而,直到最近,它还没有原生支持分类数据。 在将分类特征用于训练或推理之前,必须对其进行手动编码。 在序数类别的情况下,例如…

视觉SLAM十四讲ch4 李群和李代数笔记

视觉SLAM十四讲ch4 李群和李代数视觉SLAM十四讲ch4 李群和李代数李群和李代数基础指数映射与对数映射李代数求导与扰动模型视觉SLAM十四讲ch4 李群和李代数 李群和李代数基础 可以将SO3看成旋转矩阵集合,SE3看成变换矩阵集合 李代数是6个自由度的向量空间…

qsort函数的应用以及模拟实现

前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍库函数qsort函数的模拟实现和应用 金句分享: ✨追…