本地版pyltp执行结果的格式转换与访问

前文说了如何在本地安装pyltp。在官方的例子中,各功能的处理结果都是纯文本(plain text),这不太便于我们解析和使用其结果。经尝试,可以将他的处理结果转为json格式。我将pyltp的功能放到一个函数中,然后可以在项目的其它程序中调用它。仍以官方example为例,我直接在它上面修改的代码。【注:我没有考虑如何整合语义角色标注结果到json中】

common_callLTP.py,在这里封闭和改造pyltp功能

'''Created on 2015-4-29@author: 郭喜跃'''import sys, osimport jsonfrom pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabellerROOTDIR = os.path.join(os.path.dirname(__file__), os.pardir)sys.path.append(os.path.join(ROOTDIR, "lib"))# 设置模型文件的路径MODELDIR=os.path.join(ROOTDIR, "ltp_data")def callLTP(sentence):# 参数就是待处理的句子# sentence = "国家主席胡锦涛携夫人刘永青出访俄罗斯。"#分词功能segmentor = Segmentor()segmentor.load(os.path.join(MODELDIR, "cws.model"))words = segmentor.segment(sentence)#print ("\t".join(words))#词性标注功能postagger = Postagger()postagger.load(os.path.join(MODELDIR, "pos.model"))postags = postagger.postag(words)#print ("\t".join(postags))#句法依存关系parser = Parser()parser.load(os.path.join(MODELDIR, "parser.model"))arcs = parser.parse(words, postags)#print ("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))#实体识别recognizer = NamedEntityRecognizer()recognizer.load(os.path.join(MODELDIR, "ner.model"))netags = recognizer.recognize(words, postags)#print ("\t".join(netags))#语义角色标注,这个我没有用到,所以全部注释了#labeller = SementicRoleLabeller()#labeller.load(os.path.join(MODELDIR, "srl/"))#roles = labeller.label(words, postags, netags, arcs)#for role in roles:# print (role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))# 结果整合为json。这是重点。我把原代码的print全部注释。resultJson=[] #创建一个空列表,用于保存json数据。for index in range(len(words)):#遍历结果resultJson.append({'id':index,'cont':words[index],'pos':postags[index],'relate':arcs[index].relation,'ne':netags[index]}) #将各功能的结果对应地添加到json中return resultJson # 返回函数结果test.py,这里调用上述函数import common_callLTP;import json;finalResult=common_callLTP.callLTP("国家主席胡锦涛携夫人刘永青出访俄罗斯。")jsonStr=json.dumps(finalResult,ensure_ascii=False,indent=2); #这两行代码用于美观显示json数据,你感受下。如果不这样,直接print(json变量)的话,默认是在一行上显示所有结果,非常不便于查看。print(jsonStr)结果:

至于说得到json数据如何遍历,请参考以下代码:

for eachItem in finalResult:print(eachItem['cont'])作用是输出json中每一项的’cont’键的值。你可以举一反三去使用了。

=====================2015-4-29白天更新================

由于ltp的几个模型文件都很大,所以很占内存,我今天利用上述过程循环读文件并调用callLTP函数进行处理时,处理到第二行文本时就报错了:memoryError。 我机子可是8G内存。这是由于 按照上面的写法,,函数每被调用一次,都要加载一遍那几个巨大的模型文件,内存再大也总会有吃不消的时候。

解决办法是,把callLTP函数中,用于创建各功能实例的句子和加载模型文件的放到函数体的外面(上面),即实现一次创建,重复使用,问题即可解决。

另外,为了保险其见,我还把可能占用较多内存的变量,用后强制销毁(del 变量名;)

人生的成功不过是在紧要处多一份坚持,

本地版pyltp执行结果的格式转换与访问

相关文章:

你感兴趣的文章:

标签云: