NLP-文本处理:依存句法分析(主谓、动宾、动补...)【基于“分词后得到的词语列表A”+“A进行词性标注后得到的词性列表B”来进行依存句法分析】【使用成熟的第三方工具包】

本文主要是介绍NLP-文本处理:依存句法分析(主谓、动宾、动补...)【基于“分词后得到的词语列表A”+“A进行词性标注后得到的词性列表B”来进行依存句法分析】【使用成熟的第三方工具包】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

句法分析(syntactic parsing)是自然语言处理中的关键技术之一,它是对输入的文本句子进行分析以得到句子的句法结构的处理过程。对句法结构进行分析,一方面是语言理解的自身需求,句法分析是语言理解的重要一环,另一方面也为其它自然语言处理任务提供支持。例如句法驱动的统计机器翻译需要对源语言或目标语言(或者同时两种语言)进行句法分析。

第三方工具包:

哈工大LTP首页
哈工大LTP4 文档

语义角色类型

在这里插入图片描述

依存句法关系

在这里插入图片描述

语义依存关系

在这里插入图片描述

import os
from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
# pip install pyltp -i https://pypi.tuna.tsinghua.edu.cn/simple 可以先下载好whl文件
#LTP语言平台:http://ltp.ai/index.html
#咱们使用的工具包,pyltp:https://pyltp.readthedocs.io/zh_CN/latest/api.html
#LTP附录:https://ltp.readthedocs.io/zh_CN/latest/appendix.html#id3
#安装方法:https://github.com/HIT-SCIR/pyltp
class LtpParser:def __init__(self):LTP_DIR = "./ltp_data_v3.4.0"self.segmentor = Segmentor()    # 分词self.segmentor.load(os.path.join(LTP_DIR, "cws.model"))self.postagger = Postagger()    # 词性标注self.postagger.load(os.path.join(LTP_DIR, "pos.model"))self.parser = Parser()  # 句法依存分析self.parser.load(os.path.join(LTP_DIR, "parser.model"))self.recognizer = NamedEntityRecognizer()   # 命名实体识别self.recognizer.load(os.path.join(LTP_DIR, "ner.model"))self.labeller = SementicRoleLabeller()  # 语义角色标注self.labeller.load(os.path.join(LTP_DIR, 'pisrl_win.model'))# 依存句法分析【为句子中的每个词语维护一个保存句法依存儿子节点的字典】def build_parse_child_dict(self, words, postags): # words:分词后的结果;postags:词性标注后的结果;arcs:依存句法分析树child_dict_list = []format_parse_list = []arcs = self.parser.parse(words, postags)  # 建立依存句法分析树print("分词列表:words = {}".format(words))print("词性分析:postags = {}".format(postags))rely_ids = [arc.head - 1 for arc in arcs]  # 提取该句话的每一个词的依存父节点id【0为ROOT,词语从1开始编号】: [2, 0, 2, 5, 8, 8, 6, 3] - 1 =  [1, -1, 1, 4, 7, 7, 5, 2]【此时 -1 表示ROOT】print("各个词语所依赖的父节点:rely_ids = {0}".format(rely_ids))heads = ['Root' if rely_id == -1 else words[rely_id] for rely_id in rely_ids]  # 匹配依存父节点词语print("各个词语所依赖的父节点词语 = {0}".format(heads))relations = [arc.relation for arc in arcs]  # 提取依存关系print("各个词语与所依赖的父节点的依赖关系 = {0}".format(relations))for word_index in range(len(words)):print("\n")print("word_index = {0}----word = {1}".format(word_index, words[word_index]))child_dict = dict() # 每个词语与所有其他词语的关系字典for arc_index in range(len(arcs)):  # arc_index==0时表示ROOT【还没进入“我想听一首迪哥的歌”语句】,arc_index==1时表示“我”# 当“依存句法分析树”遍历,遇到当前词语时,说明当前词语在依存句法分析树中与其他词语有依存关系if word_index == rely_ids[arc_index]:  # arcs[arc_index].head 表示arcs[arc_index]所代表的词语依存弧的父结点的索引。 ROOT 节点的索引是 0 ,第一个词开始的索引依次为1,2,3,···【“我”的索引为1】arc. relation 表示依存弧的关系。print("word_index = {0}----arc_index = {1}----rely_ids[arc_index] = {2}----relations[arc_index] = {3}".format(word_index, arc_index, rely_ids[arc_index], relations[arc_index]))if relations[arc_index] in child_dict:  # arcs[arc_index].relation表示arcs[arc_index]所代表的词语与父节点的依存关系(语法关系)child_dict[relations[arc_index]].append(arc_index) # 添加 child_dict = {'ATT': [4]}----> child_dict = {'ATT': [4, 5]}else:child_dict[relations[arc_index]] = [] # 新建child_dict[relations[arc_index]].append(arc_index)  # child_dict = {[]}----> child_dict = {'ATT': [4]}print("child_dict = {0}".format(child_dict))child_dict_list.append(child_dict)# 每个词对应的依存关系父节点和其关系print("\nchild_dict_list = {0}".format(child_dict_list))# 整合每个词语的句法依存关系print()for i in range(len(words)):a = [relations[i], words[i], i, postags[i], heads[i], rely_ids[i]-1, postags[rely_ids[i]-1]]print("整合每个词语的句法依存关系---->a = {}".format(a))format_parse_list.append(a)return child_dict_list, format_parse_list'''parser主函数'''def parser_main(self, sentence):# 分词words = list(self.segmentor.segment(sentence))# 词性标注postags = list(self.postagger.postag(words))# 依存句法分析child_dict_list, format_parse_list = self.build_parse_child_dict(words, postags)return words, postags, child_dict_list, format_parse_listif __name__ == '__main__':parse = LtpParser()sentence = '我想听一首迪哥的歌'words, postags, child_dict_list, format_parse_list = parse.parser_main(sentence)print("\n\n\n分词-->len(words) = {0}----words = {1}".format(len(words), words))print("\n词性标注-->len(postags) = {0}----postags = {1}".format(len(postags), postags))print("\n依存句法分析-->每个词对应的依存关系儿子节点和其关系-->len(child_dict_list) = {0}----child_dict_list = {1}".format(len(child_dict_list), child_dict_list))print("\n依存句法分析--整合-->len(format_parse_list) = {0}----format_parse_list = {1}".format(len(format_parse_list), format_parse_list))

输出结果:

分词列表:words = ['我', '想', '听', '一', '首', '迪哥', '的', '歌']
词性分析:postags = ['r', 'v', 'v', 'm', 'q', 'nh', 'u', 'n']
各个词语所依赖的父节点:rely_ids = [1, -1, 1, 4, 7, 7, 5, 2]
各个词语所依赖的父节点词语 = ['想', 'Root', '想', '首', '歌', '歌', '迪哥', '听']
各个词语与所依赖的父节点的依赖关系 = ['SBV', 'HED', 'VOB', 'ATT', 'ATT', 'ATT', 'RAD', 'VOB']word_index = 0----word = 我child_dict_list = [{}]word_index = 1----word = 想
word_index = 1----arc_index = 0----rely_ids[arc_index] = 1----relations[arc_index] = SBV
child_dict = {'SBV': [0]}
word_index = 1----arc_index = 2----rely_ids[arc_index] = 1----relations[arc_index] = VOB
child_dict = {'SBV': [0], 'VOB': [2]}child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}]word_index = 2----word = 听
word_index = 2----arc_index = 7----rely_ids[arc_index] = 2----relations[arc_index] = VOB
child_dict = {'VOB': [7]}child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}]word_index = 3----word = 一child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}, {}]word_index = 4----word = 首
word_index = 4----arc_index = 3----rely_ids[arc_index] = 4----relations[arc_index] = ATT
child_dict = {'ATT': [3]}child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}, {}, {'ATT': [3]}]word_index = 5----word = 迪哥
word_index = 5----arc_index = 6----rely_ids[arc_index] = 5----relations[arc_index] = RAD
child_dict = {'RAD': [6]}child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}, {}, {'ATT': [3]}, {'RAD': [6]}]word_index = 6----word = 的child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}, {}, {'ATT': [3]}, {'RAD': [6]}, {}]word_index = 7----word = 歌
word_index = 7----arc_index = 4----rely_ids[arc_index] = 7----relations[arc_index] = ATT
child_dict = {'ATT': [4]}
word_index = 7----arc_index = 5----rely_ids[arc_index] = 7----relations[arc_index] = ATT
child_dict = {'ATT': [4, 5]}child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}, {}, {'ATT': [3]}, {'RAD': [6]}, {}, {'ATT': [4, 5]}]整合每个词语的句法依存关系---->a = ['SBV', '我', 0, 'r', '想', 0, 'r']
整合每个词语的句法依存关系---->a = ['HED', '想', 1, 'v', 'Root', -2, 'u']
整合每个词语的句法依存关系---->a = ['VOB', '听', 2, 'v', '想', 0, 'r']
整合每个词语的句法依存关系---->a = ['ATT', '一', 3, 'm', '首', 3, 'm']
整合每个词语的句法依存关系---->a = ['ATT', '首', 4, 'q', '歌', 6, 'u']
整合每个词语的句法依存关系---->a = ['ATT', '迪哥', 5, 'nh', '歌', 6, 'u']
整合每个词语的句法依存关系---->a = ['RAD', '的', 6, 'u', '迪哥', 4, 'q']
整合每个词语的句法依存关系---->a = ['VOB', '歌', 7, 'n', '听', 1, 'v']分词-->len(words) = 8----words = ['我', '想', '听', '一', '首', '迪哥', '的', '歌']词性标注-->len(postags) = 8----postags = ['r', 'v', 'v', 'm', 'q', 'nh', 'u', 'n']依存句法分析-->每个词对应的依存关系儿子节点和其关系-->len(child_dict_list) = 8----child_dict_list = [{}, {'SBV': [0], 'VOB': [2]}, {'VOB': [7]}, {}, {'ATT': [3]}, {'RAD': [6]}, {}, {'ATT': [4, 5]}]依存句法分析--整合-->len(format_parse_list) = 8----format_parse_list = [['SBV', '我', 0, 'r', '想', 0, 'r'], ['HED', '想', 1, 'v', 'Root', -2, 'u'], ['VOB', '听', 2, 'v', '想', 0, 'r'], ['ATT', '一', 3, 'm', '首', 3, 'm'], ['ATT', '首', 4, 'q', '歌', 6, 'u'], ['ATT', '迪哥', 5, 'nh', '歌', 6, 'u'], ['RAD', '的', 6, 'u', '迪哥', 4, 'q'], ['VOB', '歌', 7, 'n', '听', 1, 'v']]Process finished with exit code 0



参考资料:
一文读懂依存句法分析

这篇关于NLP-文本处理:依存句法分析(主谓、动宾、动补...)【基于“分词后得到的词语列表A”+“A进行词性标注后得到的词性列表B”来进行依存句法分析】【使用成熟的第三方工具包】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128873

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测