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(。, 处于)
句法图: