天天看点

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(。, 处于)      

句法图:

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

继续阅读