pyltp实现句法分析并画出句法图

windows下安装pyltp:
    1、下载python对应版本的pyltp wheel文件(以python3.6为例)
    2、在wheel文件所在的目录打开cmd,输入命令 pip install pyltp-0.2.1-cp36-cp36m-win_amd64.whl
下载开源的ltp_data文件(包括ltp训练好的模型):
    1、下载地址https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F(有多个版本,以3.4.0为例)
    2、cws.model 分词模型
       ner.model 实体识别模型
       parser.model 句法分析模型
       pisrl_win.model 语义角色标注模型
       pos.model 词性标注模型
       version 3.4.0
句法分析需要调用的模型(依次调用):
    1、cws.model
    2、pos.model
    3、parser.model
    注:各模型具体调用方法参见https://pyltp.readthedocs.io/zh_CN/latest/api.html
句法分析图:
    1、安装nltk pip install nltk
    2、from nltk import DependencyGraph
    3、conlltree = DependencyGraph(par_result)  # 转换为依存句法图
       tree = conlltree.tree()  # 构建树结构
       tree.draw()  # 显示输出的树
    注:par_result为调用ltp模型生成的结果

程序如下:

import sys, os
from pyltp import *

from nltk import DependencyGraph


class LtpParsing(object):
    def __init__(self, model_dir='ltp_data'):
        self.segmentor = Segmentor()
        self.segmentor.load(os.path.join(model_dir, "cws.model"))
        self.postagger = Postagger()
        self.postagger.load(os.path.join(model_dir, "pos.model"))
        self.parser = Parser()
        self.parser.load(os.path.join(model_dir, "parser.model"))

    def par(self, infilm, outfilm):
        input_data = open(infilm, 'r', encoding='utf-8')
        output_data = open(outfilm, 'w+', encoding='utf=8')
        for line in input_data.readlines():
            line = line.strip()
            # 分词
            words = self.segmentor.segment(line)
            # self.segmentor.load_with_lexicon('lexicon')  # 使用自定义词典,lexicon外部词典文件路径
            # print('分词:' + '\t'.join(words))

            # 词性标注
            postags = self.postagger.postag(words)
            # print('词性标注:' + '\t'.join(postags))

            # 句法分析
            arcs = self.parser.parse(words, postags)
            rely_id = [arc.head for arc in arcs]  # 提取依存父节点id
            relation = [arc.relation for arc in arcs]  # 提取依存关系
            heads = ['Root' if id == 0 else words[id - 1] for id in rely_id]  # 匹配依存父节点词语

            output_data.write(line)
            output_data.write('\n')
            output_data.write('句法分析:')
            par_result = ''
            for i in range(len(words)):
                if arcs[i].head == 0:
                    arcs[i].relation = "ROOT"
                par_result += "\t" + words[i] + "(" + arcs[i].relation + ")" + "\t" + postags[i] + "\t" + str(arcs[i].head) + "\t" + arcs[i].relation + "\n"
                output_data.write(relation[i] + '(' + words[i] + ', ' + heads[i] + ')' + '\n')
            # print(par_result)
            conlltree = DependencyGraph(par_result)  # 转换为依存句法图
            tree = conlltree.tree()  # 构建树结构
            tree.draw()  # 显示输出的树
            output_data.write('\n')
        input_data.close()
        output_data.close()

    def release_model(self):
        # 释放模型
        self.segmentor.release()
        self.postagger.release()
        self.parser.release()

if __name__ == '__main__':
    infilm = 'infilm.txt'
    outfilm = 'outfilm.txt'
    ltp = LtpParsing()
    ltp.par(infilm, outfilm)
    ltp.release_model()

输入文件为:

我叫李明,在清华读书。
多年来,中希贸易始终处于较低的水平,希腊几乎没有在中国投资。

输出文件:

我叫李明,在清华读书。
句法分析:SBV(我, 叫)
HED(叫, Root)
VOB(李明, 叫)
WP(,, 叫)
ADV(在, 读书)
POB(清华, 在)
COO(读书, 叫)
WP(。, 叫)

多年来,中希贸易始终处于较低的水平,希腊几乎没有在中国投资。
句法分析:ATT(多, 年)
ADV(年, 处于)
RAD(来, 年)
WP(,, 年)
ATT(中, 贸易)
COO(希, 中)
SBV(贸易, 处于)
ADV(始终, 处于)
HED(处于, Root)
ADV(较, 低)
ATT(低, 水平)
RAD(的, 低)
VOB(水平, 处于)
WP(,, 处于)
SBV(希腊, 投资)
ADV(几乎, 投资)
ADV(没有, 投资)
ADV(在, 投资)
POB(中国, 在)
COO(投资, 处于)
WP(。, 处于)

句法图:

         

### 依存句法分析概述 依存句法分析旨在通过解析语言单位内部成分间的依存关系揭示其句法结构[^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)) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值