1. 程式人生 > >本地版pyltp執行結果的格式轉換與訪問——以json為例

本地版pyltp執行結果的格式轉換與訪問——以json為例

前文說了如何在本地安裝pyltp。在官方的例子中,各功能的處理結果都是純文字(plain text),這不太便於我們解析和使用其結果。經嘗試,可以將他的處理結果轉為json格式。我將pyltp的功能放到一個函式中,然後可以在專案的其它程式中呼叫它。仍以官方example為例,我直接在它上面修改的程式碼。【注:我沒有考慮如何整合語義角色標註結果到json中】

common_callLTP.py,在這裡封閉和改造pyltp功能

'''
Created on 2015-4-29

@author: 郭喜躍
'''
import sys, os
import json
from pyltp import Segmentor, Postagger, Parser, NamedEntityRecognizer, SementicRoleLabeller
ROOTDIR = 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 變數名;)