1. 依存句法分析简介
依存句法分析旨在通过分析句子中词语之间的依存关系来确定句子的句法结构。其中依存句法分析标注关系集合如下图所示:
于是一个实例如下图所示:
通过给出的依存句法分析标注关系集合可以进行对应:“是”这句话中的核心;“百度”和“是”之间存在主谓关系,“百度”是主语,“是”是谓语;“一家”、“高科技”和“公司”之间存在着定中关系(定语与中心词的关系),个人理解既可以说是“一家公司”,也可以说是“高科技公司”;“是”和“公司”之间存在着动宾关系。
依存句法分析作为底层技术,可直接用于提升其他NLP任务的效果,这些任务包括语义角色标注、语义匹配、事件抽取等。
2. 环境依赖安装
依赖环境:
-
python
: ==2.7,>=3.6.0 -
paddlepaddle
: >=2.0 -
LAC
: >=2.1
一键安装
pip install ddparser==1.0.6
python -m pip install paddlepaddle==2.3.1 -i https://mirror.baidu.com/pypi/simple
# Successfully installed opt-einsum-3.3.0 paddle-bfloat-0.1.7 paddlepaddle-2.3.1
# https://github.com/baidu/lac
pip install lac==2.1.2 # Successfully installed lac-2.1.2
# 安装速率更快:pip install lac==2.1.2 -i https://mirror.baidu.com/pypi/simple
pip install tqdm==4.64.1 # 此版本号可选择或不选择
3. 功能使用
未分词方式
- 代码示例
>>> from ddparser import DDParser
>>> ddp = DDParser()
>>> # 单条句子
>>> ddp.parse("百度是一家高科技公司")
[{'word': ['百度', '是', '一家', '高科技', '公司'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']}]
>>> # 多条句子
>>> ddp.parse(["百度是一家高科技公司", "他送了一本书"])
[{'word': ['百度', '是', '一家', '高科技', '公司'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']},
{'word': ['他', '送', '了', '一本', '书'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}]
>>> # 输出概率和词性标签
>>> ddp = DDParser(prob=True, use_pos=True)
>>> ddp.parse(["百度是一家高科技公司"])
[{'word': ['百度', '是', '一家', '高科技', '公司'], 'postag': ['ORG', 'v', 'm', 'n', 'n'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB'], 'prob': [1.0, 1.0, 1.0, 1.0, 1.0]}]
>>> # buckets=True, 数据集长度不均时处理速度更快
>>> ddp = DDParser(buckets=True)
>>> # 使用GPU
>>> ddp = DDParser(use_cuda=True)
已分词方式
- 代码示例
>>> from ddparser import DDParser
>>> ddp = DDParser()
>>> ddp.parse_seg([['百度', '是', '一家', '高科技', '公司'], ['他', '送', '了', '一本', '书']])
[{'word': ['百度', '是', '一家', '高科技', '公司'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB']},
{'word': ['他', '送', '了', '一本', '书'], 'head': [2, 0, 2, 5, 2], 'deprel': ['SBV', 'HED', 'MT', 'ATT', 'VOB']}]
>>> # 输出概率
>>> ddp = DDParser(prob=True)
>>> ddp.parse_seg([['百度', '是', '一家', '高科技', '公司']])
# 这里没有词性标签
[{'word': ['百度', '是', '一家', '高科技', '公司'], 'head': [2, 0, 5, 5, 2], 'deprel': ['SBV', 'HED', 'ATT', 'ATT', 'VOB'], 'prob': [1.0, 1.0, 1.0, 1.0, 1.0]}]
注:标签含义见依存句法分析标注关系集合。==上图
{
'word': list[str], 分词结果。
'head': list[int], 当前成分其支配者的id。
'deprel': list[str], 当前成分与支配者的依存关系。
'prob': list[float], 从属者和支配者依存的概率。
'postag': list[str], 词性标签,只有当texts的元素是未分词的字符串时包含这个键。
}
4. 实例
results = ddp.parse("清华大学研究核能的教授有哪些")
print(f'parse={results[0]}')
result = ddp.parse_seg([['清华大学', '研究', '核能', '的', '教授', '有', '哪些']])
print(print(f'parse_seg={result}'))
输出:
parse={'word': ['清华大学', '研究', '核能', '的', '教授', '有', '哪些'], 'postag': ['ORG', 'v', 'n', 'u', 'n', 'v', 'r'], 'head': [3, 3, 5, 3, 6, 0, 6], 'deprel': ['ATT', 'ATT', 'ATT', 'MT', 'SBV', 'HED', 'VOB']}
parse_seg=[{'word': ['清华大学', '研究', '核能', '的', '教授', '有', '哪些'], 'head': [3, 3, 5, 3, 6, 0, 6], 'deprel': ['ATT', 'ATT', 'ATT', 'MT', 'SBV', 'HED', 'VOB']}]
HanLP进一步封装:Dependency Tree Visualization
官网:
https://gitee.com/yeahking/DDParser
https://github.com/baidu/DDParser