本地版pyltp執行結果的格式轉換與訪問——以json為例
阿新 • • 發佈:2018-11-10
前文說了如何在本地安裝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 變數名;)