人工智慧——構建依存樹——使用LTP分詞
阿新 • • 發佈:2021-07-12
人工智慧——構建依存樹——使用LTP分詞
導語:此專案使用LTP分詞,python版本為python3.6,windows平臺,使用whl檔案進行安裝。專案完整檔案見人工智慧——構建依存樹——使用LTP分詞
ltp_data檔案中為ltp分詞所需模型
安裝步驟:
將檔案pyltp-0.2.1-cp36-cp36m-win_amd64.whl移至python3.6中Scripts資料夾下,
搜尋框開啟CMD,
輸入命令pip3.6 install pyltp-0.2.1-cp36-cp36m-win_amd64.whl,安裝成功。
句法分析與漢語文字切分:給定句子,比如“Look for the large barking dog by the door in a crate”,進行依存分析研究單詞之間的依賴關係,將依存關係表示為依存樹
效果圖:
程式碼
from pyltp import Segmentor from pyltp import Postagger from pyltp import Parser from pyltp import NamedEntityRecognizer relationch=[['定中關係', 'ATT'], ['數量關係', 'QUN'], ['並列關係', 'COO'], ['同位關係', 'APP'], ['前附加關係', 'LAD'], ['後附加關係', 'RAD'], ['動賓關係', 'VOB'], ['介賓關係', 'POB'], ['主謂關係', 'SBV'], ['比擬關係', 'SIM'], ['核心', 'HED'], ['連動結構', 'VV'], ['關聯結構', 'CNJ'], ['語態結構', 'MT'], ['獨立結構', 'IS'], ['狀中結構', 'ADV'], ['動補結構', 'CMP'], ['“的”', 'DE'], ['“地”', 'DI'], ['“得”', 'DEI'], ['“把”', 'BA'], ['“被”', 'BEI'], ['獨立分句', 'IC'], ['依存分句', 'DC']] ldir = './ltp_data/cws.model' #分詞模型 # dicdir = 'word' #外部字典 # text = "內蒙古大學計算機學院的計科專業好嗎?"楊過和小龍女什麼關係 text = input("請輸入需要處理的語句:") #中文分詞 segmentor = Segmentor() #初始化例項 segmentor.load_with_lexicon(ldir, './ltp_data/lexicon.txt') #載入模型 words = segmentor.segment(text) #分詞 print(text) print(' '.join(words)) #分詞拼接 words = list(words) #轉換list print(u"分詞:", words) segmentor.release() #釋放模型 #詞性標註 pdir = './ltp_data/pos.model' pos = Postagger() #初始化例項 pos.load(pdir) #載入模型 postags = pos.postag(words) #詞性標註 postags = list(postags) print(u"詞性:", postags) pos.release() #釋放模型 data = {"words": words, "tags": postags} print(data) print(" ") #命名實體識別 nermodel = './ltp_data/ner.model' reg = NamedEntityRecognizer() #初始化命名實體例項 reg.load(nermodel) #載入模型 netags = reg.recognize(words, postags) #對分詞、詞性標註得到的資料進行實體標識 netags = list(netags) print(u"命名實體識別:", netags) #實體識別結果 data={"reg": netags,"words":words,"tags":postags} print(data) reg.release() #釋放模型 print(" ") #依存句法分析 parmodel = './ltp_data/parser.model' parser = Parser() #初始化命名實體例項 parser.load(parmodel) #載入模型 arcs = parser.parse(words, postags) #句法分析 #輸出結果 print(words) print("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)) rely_id = [arc.head for arc in arcs] # 提取依存父節點id relation = [arc.relation for arc in arcs] # 提取依存關係 heads = ['根' if id == 0 else words[id-1] for id in rely_id] # 匹配依存父節點詞語 for i in range(len(words)): for m in range(len(relationch)): if(relation[i]==relationch[m][1]): relation[i]=relationch[m][0] print(relation[i] + '(' + words[i] + ', ' + heads[i] + ')') parser.release() #釋放模型 from graphviz import Digraph #這裡指定生成png圖片,不加format屬性則生成pdf檔案 g = Digraph('fenciresult',format="png") g.node(name='根', fontname="Microsoft YaHei") for word in words: g.node(name=word, fontname="Microsoft YaHei") for i in range(len(words)): if relation[i] not in ['HED']: g.edge(words[i], heads[i], label=relation[i], fontname="Microsoft YaHei") else: if heads[i] == '根': g.edge(words[i], '根', label=relation[i], fontname="Microsoft YaHei") else: g.edge(heads[i], '根', label=relation[i], fontname="Microsoft YaHei") g.render(view=False)