1. 程式人生 > 其它 >人工智慧——構建依存樹——使用LTP分詞

人工智慧——構建依存樹——使用LTP分詞

人工智慧——構建依存樹——使用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)