← 返回首页
依存分析
发表时间:2025-04-04 10:44:16
依存分析

在自然语言处理(NLP)领域,句法依存分析是理解句子结构的重要步骤。它帮助我们了解句子中单词之间的关系,这对于后续的信息提取、情感分析等任务都至关重要。

1.依存分析

句法是指句子的各个组成部分的相互关系,句法分析分为句法结构分析(syntactic structure parsing)和依存关系分析(dependency parsing)。句法结构分析用于获取整个句子的句法结构,依存分析用于获取词汇之间的依存关系,目前的句法分析已经从句法结构分析转向依存句法分析。

依存语法通过分析语言单位内成分之间的依存关系揭示其句法结构,主张句子中核心动词是支配其它成分的中心成分,而它本身却不受其它任何成分的支配,所有受支配成分都以某种依存关系从属于支配者。

在20世纪70年代,Robinson提出依存语法中关于依存关系的四条公理: - 一个句子中只有一个成分是独立的; - 其它成分直接依存于某一成分; - 任何一个成分都不能依存与两个或两个以上的成分; - 如果A成分直接依存于B成分,而C成分在句中位于A和B之间,那么C或者直接依存于B,或者直接依存于A和B之间的某一成分;

依存关系是一个中心词与其从属之间的二元非对称关系,一个句子的中心词通常是动词(Verb),所有其他词要么依赖于中心词,要么通过依赖路径与它关联。

标签表示从属的语法功能,名词性的标签是:

其他常用的标签:

2.Spacy实现依存分析

SpaCy能够快速准确地解析句子的依存关系,并且具有丰富的API用于导航依存关系树,SpaCy使用head和child来描述依存关系中的连接,识别每个Token的依存关系:

对英文进行依存分析:

import spacy

nlp = spacy.load('en_core_web_trf')
#《华尔街日报》刚刚发表了一篇关于加密货币的有趣文章。
doc = nlp("Wall Street Journal just published an interesting piece on crypto currencies.")
for token in doc:
    print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))

打印每个Token的依存关系和head节点,箭头表示从属关系,得到的结果是:

Wall(NNP) <-- compound -- Street(NNP)
Street(NNP) <-- compound -- Joumal(NNP)
Joumal(NNP) <-- nsubj -- published(VBD)
just(RB) <-- advmod -- published(VBD)
published(VBD) <-- ROOT -- published(VBD)
an(DT) <-- det -- piece(NN)
interesting(JJ) <-- amod -- piece(NN)
piece(NN) <-- dobj -- published(VBD)
on(IN) <-- prep -- piece(NN)
crypto(NN) <-- compound -- currencies(NNS)
currencies(NNS) <-- pobj -- on(IN)
.(.) <-- punct -- published(VBD)

也可以使用display来显示依存关系,在浏览器中输入 http://localhost:5000 显示依存结构:

import spacy
from spacy import displacy

nlp = spacy.load('en_core_web_trf')
#《华尔街日报》刚刚发表了一篇关于加密货币的有趣文章。
doc = nlp("Wall Street Journal just published an interesting piece on crypto currencies.")
for token in doc:
    print('{0}({1}) <-- {2} -- {3}({4})'.format(token.text, token.tag_, token.dep_, token.head.text, token.head.tag_))

#http://localhost:5000
displacy.serve(doc, style='dep')

对中文进行依存分析:

import spacy
from spacy import displacy

nlp = spacy.load('zh_core_web_trf')
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_))

#http://localhost:5000
displacy.serve(doc, style='dep')

3.NLTK实现依存分析

下载Stanford Parser: https://nlp.stanford.edu/software/lex-parser.shtml 访问Stanford NLP官网下载最新版Stanford Parser。 解压后获取stanford-parser.jar和模型文件(如stanford-parser-x.x.x-models.jar)。

import nltk

nltk.download('punkt')  # 确保下载了Punkt tokenizer
from nltk.parse.stanford import StanfordDependencyParser
path_to_jar = './jar/stanford-parser.jar'
path_to_models_jar = './jar/stanford-parser-4.2.0-models.jar'

# 初始化依存分析器
dependency_parser = StanfordDependencyParser(
    path_to_jar=path_to_jar,
    path_to_models_jar=path_to_models_jar
)

# 待分析的句子
sentence = "Wall Street Journal just published an interesting piece on crypto currencies."

# 执行依存分析
result = dependency_parser.raw_parse(sentence)
dep_tree = list(result)[0]  # 获取第一个(唯一)解析结果

# 打印依存关系三元组(头词,关系,依赖词)
print("依存关系三元组:")
for triple in dep_tree.triples():
    print(triple)

# 可视化依存结构(需安装graphviz)
dep_tree.plot()  # 可能需额外配置图形库支持

运行效果:

依存关系三元组:
(('published', 'VBD'), 'nsubj', ('Journal', 'NNP'))
(('Journal', 'NNP'), 'compound', ('Street', 'NNP'))
(('Street', 'NNP'), 'compound', ('Wall', 'NNP'))
(('published', 'VBD'), 'advmod', ('just', 'RB'))
(('published', 'VBD'), 'obj', ('piece', 'NN'))
(('piece', 'NN'), 'det', ('an', 'DT'))
(('piece', 'NN'), 'amod', ('interesting', 'JJ'))
(('published', 'VBD'), 'obl', ('currencies', 'NNS'))
(('currencies', 'NNS'), 'case', ('on', 'IN'))
(('currencies', 'NNS'), 'compound', ('crypto', 'NN'))

使用HanNLP对中文进行依存分析:

首先安装依赖:

pip install pyhanlp
from pyhanlp import HanLP

para_sen = "苹果宣布将设立一项基金帮助美国小型开发者。"
sentence = HanLP.parseDependency(para_sen)
print(sentence)

# 输出依存文法的结果 txt文件,在windows系统下的 Dependency Viewer.exe 打开文件
path = "./text_return.txt"
with open(path, "w", encoding='utf-8') as f:
    f.write(str(sentence))
print("path:%s" % (path))

运行结果:

1   苹果  苹果  n   n   _   2   主谓关系    _   _
2   宣布  宣布  v   v   _   0   核心关系    _   _
3   将   将   d   d   _   4   状中结构    _   _
4   设立  设立  v   v   _   2   动宾关系    _   _
5   一   一   m   m   _   6   定中关系    _   _
6   项   项   q   q   _   7   定中关系    _   _
7   基金  基金  n   n   _   4   动宾关系    _   _
8   帮助  帮助  v   v   _   4   并列关系    _   _
9   美国  美国  ns  ns  _   11  定中关系    _   _
10  小型  小型  b   b   _   11  定中关系    _   _
11  开发者 开发者 n   n   _   8   动宾关系    _   _
12  。   。   wp  w   _   2   标点符号    _   _