依存句法分析

依存句法分析

了解语言结构的不同角度就是依存句法结构,通过找到句子中每一个词语所依赖的部分来描述句子结构。如果一个词修饰另一个词,它就是那个词的依赖。例如barking dog中,barking就是dog的依赖。通常用箭头来表示他们的依赖关系,下面是一个画出依存结构的句子:


虽然这种做法低效,速度慢,而且没有基于短语结构文法的规则普适性好,但是这个行为形成了丰富的语言学资源,而且对于目前大火的机器学习来说,这就是我们梦寐以求的具有ground-truth的标注好的数据,这是一个相当具有前瞻性的工程。
在机器学习领域,依存树可以合理地解释句子结构。建议一个可见的、有标注的依存树,最后会给我们提供很多的优势,依存树存在的有点如下:
(1) 首先它可以被重复利用;而每个人写的规则却不同,所以规则不能被重复利用,依存树却可以。
(2) 依存树库使用了真实的、覆盖面广的数据;而人们写规则时只是依靠对语法的直觉判断,容易考虑不周。
(3) 依存树不仅仅能给出所有的可能性,还能给出各种可能性同事发生的概率。
(4) 最重要的一点是他可以评估我们构建的任何系统,因为他给了我们具有ground truth的标准数据。

依存句法树


箭头的初始位置为被修饰的,称为:监督项(头部)
箭头的指向位置是修饰词,称为:下属项(独立项)
上图箭头指向的词语是依赖者,箭头初始位置的词语是被依赖者。也可以根据自己写喜好来颠倒用途。

依存句法分析方法 的 效果评估方法

评测指标有两种。一种是标准是UAS,此标准不考虑标签只考虑弧;另一种标准是LAS,此标准同时考虑标签和弧。
具体例子如下:

英文依存语法关系集

其中‘ROOT’,‘case’,‘det’,'nmod’等符号就是语法关系。
目前国际公认的语法关系定义框架是Universal Dependencies (UD)。英语的通用语法关系有37种:

语法关系解释链接
nsubj名词主语nsubj
nsubjpass被动名词主语nsubjpass
obj宾语obj
iobj间接宾语iobj
csubj从句主语csubj
csubjpass被动从句主语csubjpass
ccomp从句补语ccomp
xcomp开放式补语xcomp
nummod数词修饰语nummod
appos介词修饰语appos
nmod标称修饰语nmod
acl名词从句修饰语acl
acl:relcl相对从句修饰语acl:relcl
amod形容词修饰语amod
det限定词det
det:predet前位限定词det:predet
neg否定修饰符neg
case格标记case
nmod标称修饰符nmod
nmod:npmod名词短语作为副词修饰语nmod:npmod
nmod:tmod时间修饰符nmod:tmod
nmod:poss所有格名词修饰符nmod:poss
advcl状语从句修饰语advcl
advmod状语修饰语advmod
compound复合标识符compound
compound:prt动词短语介副词compound:prt
flat由多个名词性元素组成的专有名词flat
fixed固定的语法化表达式fixed
foreign外来词foreign
goeswithgoeswith
list并列关系list
dislocated错位的元素dislocated
parataxis副词关系parataxis
orphan省略关系orphan
reparandum(演讲中)不流利的地方reparandum
vocative 呼唤(人们)vocative
discourse话语元素discourse
expl专指expl
aux辅助词aux
auxpass被动辅助词auxpass
cop系词cop
mark标记词mark
punct标点符号punct
conj连词conj
cccoordinationcc
cc:preconjpreconjunctcc:preconj
root根节点root
dep无法确定两个词之间的更精确的依赖关系dep

Spacy依存分析代码

spaCy模块有4个非常重要的类:

  • Doc:Doc对象由Tokenizer构造,然后由管道的组件进行适当的修改。doc对象是token的序列
  • Span:Span对象是Doc对象的一个切片。
  • Token:在自然语言处理中,把一个单词,一个标点符号,一个空格等叫做一个token。
  • Vocab:存储词汇表和语言共享的数据。词汇表使用Lexeme对象和StringStore对象来表示。

功能

  1. 找出活动的管道组件
nlp.pipe_names
  1. 禁用/添加管道组件
nlp.disable_pipes('tagger', 'parser') # 禁用
nlp.add_pipe("parser") # 添加
  1. 模型
# 方式一
import spacy
nlp = spacy.load("zh_core_web_sm")
# 方式二
import zh_core_web_sm
nlp = zh_core_web_sm.load()
  1. 依存分析
# -*- coding:utf8 -*-
import spacy
 
nlp = spacy.load('zh_core_web_sm')
 
doc = nlp('猴子喜欢香蕉')
for token in doc:
    print("{0}/{1} <--{2}-- {3}/{4}".format(
            token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))
 
>>> 猴子/NN <--nsubj-- 喜欢/VV
>>> 喜欢/VV <--ROOT-- 喜欢/VV
>>> 香蕉/NN <--dobj-- 喜欢/VV
  1. 可视化
from spacy import displacy
txt = '''In particle physics, a magnetic monopole is a hypothetical elementary particle.'''
displacy.render(nlp(txt), style='dep', jupyter=True, options = {'distance': 90})

from spacy import displacy
displacy.render(doc, style='ent', jupyter=True)

参考

https://blog.csdn.net/u011828519/article/details/84565920

### 依存句法分析概述 依存句法分析旨在通过解析语言单位内部成分间的依存关系揭示其句法结构[^1]。具体而言,该技术能够识别句子中的主要语法成分(如主语、谓语、宾语等),并进一步探讨这些成分间的关系。 ### 使用Python实现依存句法分析的方法 为了利用Python执行依存句法分析,可以采用`pyltp`库作为核心工具之一。此过程涉及加载预训练模型以及处理输入文本数据两个重要环节: #### 加载所需资源 首先需指定LTP数据目录,并从中读取必要的模型文件,包括但不限于词性标注(`pos.model`)和依存句法分析(`parser.model`)模型。 ```python import os from pyltp import Postagger, Parser LTP_DATA_DIR = 'path/to/ltp_data_v3.4.0' postagger = Postagger() postagger.load(os.path.join(LTP_DATA_DIR, "pos.model")) parser = Parser() parser.load(os.path.join(LTP_DATA_DIR, "parser.model")) ``` #### 处理输入文本 对于给定的一段中文文本,先对其进行分词操作;接着基于分好词后的列表进行词性标注;最后运用上述准备好的依存句法分析器完成最终的任务。 ```python words = ["他", "送", "了", "我", "一束花"] postags = postagger.postag(words) arcs = parser.parse(words, list(postags)) for i in range(len(arcs)): print("\t".join([str(i + 1), words[i], str(arcs.head[i]), arcs.relation[i]])) postagger.release() parser.release() ``` 这段代码展示了如何针对特定的词语序列应用依存句法分析功能,并打印出每个单词与其父节点之间存在的依赖关系类型及其索引位置。 ### 可视化与图分析 除了基本的功能外,还可以借助图形展示手段更直观地理解依存树形结构。这不仅有助于研究人员深入探究自然语言内在规律,也为实际应用场景提供了便利条件[^2]。例如,计算不同实体在依存图上的最短路径长度可以帮助衡量它们之间的紧密程度。 ```python def shortest_distance(graph, source, target): visited = set() queue = [(source, 0)] while queue: node, dist = queue.pop(0) if node == target: return dist if node not in visited: visited.add(node) neighbors = graph[node] for neighbor in neighbors: queue.append((neighbor, dist + 1)) return None # 假设graph是一个字典形式表示的无向图, # key为结点名,value为其相邻接点组成的集合. distance1 = shortest_distance(graph, source="他", target1="我") print("'%s'与'%s'在依存句法分析图中的最短距离为: %d" % ("他", "我", distance1)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发呆的比目鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值