在上一篇文章中我們介紹了語(yǔ)義解析模塊中的分詞和句法分析仆潮,句法分析輸出的結(jié)果是語(yǔ)句的句法依存關(guān)系愧哟,而依據(jù)這個(gè)句法依存關(guān)系就能按照語(yǔ)義圖算法構(gòu)建查詢語(yǔ)義圖靴庆。
這一篇介紹語(yǔ)義圖算法及其實(shí)現(xiàn)讲逛。
語(yǔ)義圖算法簡(jiǎn)介
在北京大學(xué)徐坤的論文《面向知識(shí)庫(kù)的中文自然語(yǔ)言問(wèn)句的語(yǔ)義理解》中,提出了一種利用 Stanford Parser 的句法分析樹(shù)構(gòu)建查詢語(yǔ)義圖店诗,從而獲取用戶自然語(yǔ)言表述的語(yǔ)義的方法裹刮,這種方法我稱之為語(yǔ)義圖算法。
在最終構(gòu)建的語(yǔ)義圖中庞瘸,圖的頂點(diǎn)代表著名詞或命名實(shí)體捧弃,頂點(diǎn)之間的連線代表頂點(diǎn)之間的聯(lián)系。
論文中提到擦囊,經(jīng)過(guò)統(tǒng)計(jì)违霞,發(fā)現(xiàn)問(wèn)句的實(shí)體有將近 90% 左右概率是名詞,而其中的關(guān)系有 80% 的概率是名詞或者動(dòng)詞瞬场。因此基于這個(gè)統(tǒng)計(jì)我們可以認(rèn)為語(yǔ)義圖算法在自然語(yǔ)言理解的處理上有一定的準(zhǔn)確性和實(shí)用性买鸽。
語(yǔ)義圖算法詳解
基于上述的統(tǒng)計(jì),語(yǔ)義圖算法的原理為:
分析問(wèn)句中各個(gè)單詞的詞性贯被,如果是名詞眼五,則構(gòu)造名詞性結(jié)點(diǎn),并將名詞性結(jié)點(diǎn)區(qū)分為兩類彤灶,一類為上一步提到的實(shí)體詞典中的命名實(shí)體看幼,如 “周星馳、周杰倫幌陕、美人魚” 等桌吃,另一類則是普通的名詞性變量,如 “導(dǎo)演苞轿、母親” 等。
根據(jù)詞性找到名詞性結(jié)點(diǎn)后,我們需要分析單詞之間的依存關(guān)系闪盔,如果名詞性結(jié)點(diǎn)之間存在修飾關(guān)系违寞,如 “美人魚的導(dǎo)演” 問(wèn)句中,并存在 “美人魚” 修飾 “導(dǎo)演” 這一關(guān)系契邀,其中 “美人魚” 可稱為修飾詞摆寄,而 “導(dǎo)演” 可稱為被修飾詞。在此基礎(chǔ)上坯门,如果被修飾詞是名詞性結(jié)點(diǎn)(而不是命名實(shí)體)微饥,我們并可構(gòu)建一條從修飾詞到被修飾詞的邊,并且邊上的關(guān)系名稱為被修飾詞的名稱(即例句中的“導(dǎo)演”一詞)古戴。
仍然以 “美人魚的導(dǎo)演欠橘?” 為例,其構(gòu)建的語(yǔ)義圖如下圖所示:
上述為對(duì)名詞性結(jié)點(diǎn)的處理现恼。
而對(duì)于詞性為動(dòng)詞的單詞肃续,我們構(gòu)造動(dòng)詞性結(jié)點(diǎn),并且以動(dòng)詞為核心叉袍,根據(jù)依存句法分析的結(jié)果找出動(dòng)詞的主體和動(dòng)詞的客體始锚,也就是謂語(yǔ)的主語(yǔ)和賓語(yǔ),然后構(gòu)建出主體-動(dòng)詞-客體的有向圖關(guān)系喳逛。
現(xiàn)在以 “美人魚的導(dǎo)演是誰(shuí)瞧捌?” 為例,其中 “是” 為動(dòng)詞润文,再根據(jù)上一節(jié)中提到的依存句法分析的結(jié)果姐呐,很容易并能得出謂語(yǔ) “是” 的主語(yǔ)為 “導(dǎo)演”,而賓語(yǔ)則是 “誰(shuí)”转唉,因此我們并可以獲得圖關(guān)系:導(dǎo)演-是-誰(shuí)皮钠,最終結(jié)合之前的名詞性結(jié)點(diǎn)的處理結(jié)果,我們構(gòu)建查詢語(yǔ)義圖如下圖所示:
其中 美人魚-導(dǎo)演-導(dǎo)演 為名詞性結(jié)點(diǎn)處理的結(jié)果赠法,導(dǎo)演(主體)-是(謂語(yǔ))-誰(shuí)(客體)則是動(dòng)詞性結(jié)點(diǎn)處理的結(jié)果麦轰。
語(yǔ)義圖算法實(shí)現(xiàn)
在論文《面向知識(shí)庫(kù)的中文自然語(yǔ)言問(wèn)句的語(yǔ)義理解》中已經(jīng)給出了基于 Stanford Parser 句法解析樹(shù)的語(yǔ)義圖算法實(shí)現(xiàn)的偽碼。但在 Answer 系統(tǒng)中依存句法分析采用 HanLP 的結(jié)果砖织,所以過(guò)程稍微有點(diǎn)不同款侵。
在 Answer 系統(tǒng)中語(yǔ)義圖算法最終實(shí)現(xiàn)的主要步驟如下:
- 第一次遍歷依存關(guān)系分析后輸出的結(jié)果
- 找出其中的名詞性詞語(yǔ),構(gòu)建名詞性結(jié)點(diǎn)侧纯,并加入到名詞性結(jié)點(diǎn)集合中
- 找出其中的動(dòng)詞性詞語(yǔ)新锈,根據(jù)依存關(guān)系,找出謂語(yǔ)的主體和客體(如果是ADV眶熬,構(gòu)建新詞組妹笆,這一點(diǎn)是自己對(duì)語(yǔ)義圖的一個(gè)還沒(méi)有驗(yàn)證準(zhǔn)確度的小優(yōu)化)
- 結(jié)束遍歷
- 第二次遍歷依存關(guān)系分析后輸出的結(jié)果
- 根據(jù)依存關(guān)系块请,建立名詞性結(jié)點(diǎn)集合中修飾詞和被修飾詞之間的圖關(guān)系
- 結(jié)束遍歷
Answer 系統(tǒng)語(yǔ)義圖算法的偽碼如下:
for (CoNLLWord coNLLWord : coNLLsentence) {
if (this.isNounWord(coNLLWord.CPOSTAG))
添加結(jié)點(diǎn)到名詞性結(jié)點(diǎn)集合中
if (this.isVerbWord(coNLLWord.POSTAG))
找出其主謂賓
如果是 ADV,則構(gòu)建新詞組(如 出生地方)
}
for (CoNLLWord word : coNLLsentence) {
遍歷名詞性結(jié)點(diǎn)集合拳缠,造出修飾關(guān)系的名詞構(gòu)建成圖
}
算法實(shí)現(xiàn)過(guò)程如下圖所示:
語(yǔ)義圖算法的實(shí)現(xiàn)源碼可見(jiàn) 查詢語(yǔ)義圖算法源碼
下一篇
人類的自然語(yǔ)言極其復(fù)雜墩新,并非構(gòu)造出查詢語(yǔ)義圖之后,就能完成語(yǔ)義理解窟坐。例如將 “星爺?shù)哪挲g海渊?” 這條問(wèn)句構(gòu)建成語(yǔ)義圖之后,仍然存在很多需要解決的問(wèn)題哲鸳,如句中的星爺指代著誰(shuí)臣疑,是否是某一個(gè)實(shí)體的別名?如果問(wèn)句為 “星爺?shù)哪昙o(jì)徙菠?” 那我們?cè)撊绾谓馕龅鹊取?/p>
在構(gòu)造出查詢語(yǔ)義圖之后讯沈,我們后續(xù)還需要解決同名實(shí)體和實(shí)體別名(實(shí)體消歧)問(wèn)題,同時(shí)也需要進(jìn)行謂語(yǔ)消歧的處理懒豹。
下一篇將介紹這些處理過(guò)程芙盘。
汪
汪.