夏 添
同濟(jì)大學(xué)軟件學(xué)院,上海 201804
自然語言理解
——原理與工具的介紹
夏 添
同濟(jì)大學(xué)軟件學(xué)院,上海 201804
自然語言理解一直是一個(gè)很大很麻煩的問題,本文討論了自然語言理解的基本概念,以及幾個(gè)實(shí)現(xiàn)自然實(shí)現(xiàn)方法的討論。最后,提出一個(gè)叫做nltk的工具,并介紹這個(gè)工具如何使得開發(fā)自然語言理解應(yīng)用更加迅速
自然語言理解;規(guī)則;nltk
如何來理解自然語言呢?怎樣才能讓機(jī)器理解自然語言呢?這是自然語言理解,特別是計(jì)算語言學(xué)要講的問題。
“理解”是什么意思?事實(shí)我們常常說,“我明白了你的意思”。一個(gè)人說這句話的意思實(shí)際上時(shí)說,他可以利用你剛告訴他的東西進(jìn)行事情推理和利用了。實(shí)際上,對(duì)于計(jì)算機(jī)來說,機(jī)器明白了人的意思實(shí)際上說,機(jī)器可以利用人用自然語言輸入的信息進(jìn)行計(jì)算。
那么如何進(jìn)行映射呢?這里可以參考下編譯原理,編譯原理通過一個(gè)開始符號(hào)一步步往下推導(dǎo),一直到一個(gè)非終結(jié)符號(hào)都沒有的情況,這個(gè)時(shí)候一個(gè)句子就算是解析完成了,而解析出來的句子通過一些符號(hào)運(yùn)算,最終可以映射成計(jì)算機(jī)可以理解的機(jī)器語言。
那么該如何轉(zhuǎn)換呢?比較直觀的想法就是使用編譯原理技術(shù),使用一個(gè)開始符號(hào) S,然后一步步推導(dǎo)到每個(gè)單詞(這里的單詞實(shí)際上就是終結(jié)符號(hào))。然后對(duì)于每次歸約,使用action來操作,最終映射成電腦所能理解的sql。對(duì)于一個(gè)像c語言的語法解析器來說,它在很大的程度上依賴于用戶—也就是程序員—對(duì)于語言的理解,像那個(gè)if else 語法,不管你怎么對(duì)齊,else也就只能和最近的一個(gè)if組成一個(gè)句子。但自然語言的情況就復(fù)雜得多了。在現(xiàn)實(shí)的生活中,不但有一詞多義的多義的情況,而且就是對(duì)于同一句話,斷句不同都會(huì)造成非常不同的效果。比如說對(duì)于like這個(gè)詞來說,在不同的情況就有不同的意思。We like flying 和you are like your mom.的時(shí)候就分別是喜歡和像的意思。如何區(qū)分?我們可以根據(jù)搭配來解決這個(gè)問題。對(duì)于像is like 這種情況我們可以給like的“像”意思一個(gè)比較高的概率,而在另一種情況則給“喜歡”一個(gè)比較高的概率,這樣,碰到不同的搭配就可以有不同意思理解。這個(gè)這種方法可以參考《統(tǒng)計(jì)自然語言處理基礎(chǔ)》中的馬可夫鏈。馬可夫鏈就是就是根據(jù)概率狀態(tài)轉(zhuǎn)移模型來分析在什么樣的情況下,使用哪個(gè)表達(dá)方式更好。
當(dāng)然,在分析一句話的時(shí)候,我們可能會(huì)碰到大量的重復(fù)情況,比如說,對(duì)于“I see a boy on the chair,使用普通分析技術(shù),必定是先分析掉“I” “see”
“a boy on the chair ”再繼續(xù)分析“I see a boy”“on the chair ”。對(duì)于一個(gè)比較大型的系統(tǒng)來說,時(shí)間上可能會(huì)非常吃不消。而在自然語言理解中,我們一般可以這樣做在分析一個(gè)句子的時(shí)候,不是每次只規(guī)約一種情況,而是把所有可規(guī)約的情況都規(guī)約出來,然后再繼續(xù)分析,這樣緩存的結(jié)果就是,我們不必要每次都回溯到開始符號(hào)s來重新分析,而是在分析到每個(gè)詞的時(shí)候更新一下當(dāng)前分析句子的狀態(tài)就可以了。經(jīng)過統(tǒng)計(jì),使用這中技術(shù)的系統(tǒng)比不使用的要快5 000倍~100 000倍,當(dāng)然,同時(shí)因?yàn)榫彺嬷虚g結(jié)果,系統(tǒng)開銷也大得多。
但是,如何才能句子的意思進(jìn)行理解呢?我們回到我開始的那個(gè)問題。對(duì)于像下面一個(gè)對(duì)話:
a.Which country is Athens in? b.Greece
來說,我們可以使用下面的規(guī)則來進(jìn)行
% start S
S[SEM=(?np + WHERE + ?vp)] -> NP[SEM=?np] VP[SEM=?vp]
VP[SEM=(?v + ?pp)] -> IV[SEM=?v] PP[SEM=?pp]
VP[SEM=(?v + ?ap)] -> IV[SEM=?v] AP[SEM=?ap]
NP[SEM=(?det + ?n)] -> Det[SEM=?det] N[SEM=?n]
PP[SEM=(?p + ?np)] -> P[SEM=?p] NP[SEM=?np]
AP[SEM=?pp] -> A[SEM=?a] PP[SEM=?pp]
NP[SEM='Country="greece"'] -> 'Greece'
NP[SEM='Country="china"'] -> 'China'
Det[SEM='SELECT'] -> 'Which' | 'What'
N[SEM='City FROM city_table'] -> 'cities'
IV[SEM=''] -> 'are'
A[SEM=''] -> 'located'
P[SEM=''] -> 'in'
其中,s是代表開始符號(hào),后面的則是一個(gè)個(gè)的推導(dǎo)符號(hào)。而中間最關(guān)鍵的地方就是那個(gè)sem特征,這個(gè)特征可以幫助分析器在規(guī)約的時(shí)候?qū)⒁粋€(gè)簡(jiǎn)單的句子分析成相應(yīng)的sql.
除了有基礎(chǔ)的理論之外,實(shí)現(xiàn)自然語言理解系統(tǒng)也很重要。出于效率的情況,真正的系統(tǒng)可能使用分布式計(jì)算,然后在每個(gè)節(jié)點(diǎn)上使用像c++這樣的語言來進(jìn)行計(jì)算。但是對(duì)于像c++這樣的語言,可能在開發(fā)與調(diào)試上需要大量的時(shí)間和極度的細(xì)致,這對(duì)于新應(yīng)用的研究工作來說是不太合適的。在這種情況,使用基于python的nltk會(huì)比較好一些。
Nltk的全稱是”自然語言工具包”,可以再google code上找到這個(gè)開源項(xiàng)目。目前的最新版本是2.0b9。這個(gè)工具支持了很多關(guān)于自然語言理解方面的技術(shù),是一個(gè)比較好的開發(fā)框架。
我們可以使用這個(gè)工具來簡(jiǎn)單的對(duì)上面的情況進(jìn)行一些講解,首先,我們可以先以上面第2節(jié)提到的規(guī)則作為一個(gè)模板來寫一個(gè)文法文件,它的后綴名是.fcfg(比如a.fcfg)。nltk在處理的時(shí)候會(huì)根據(jù)你所提供文法文件來裝入相應(yīng)的規(guī)則。我們可以進(jìn)行類似如下的操作
>>> from nltk import load_parser
>>> cp = load_parser('grammars/book_grammars/sql0.fcfg')
>>> query = 'What cities are located in China'
>>> trees = cp.nbest_parse(query.split())
>>> answer = trees[0].node['sem']
>>> q = ' '.join(answer)
>>> print q
SELECT City FROM city_table WHERE Country="china"
注意上面的操作,我們通過load_parser方法裝入語法文件,然后再使用nbestparser就可以實(shí)現(xiàn)這些操作了。
從目前的情況的看,自然語言理解不管在從學(xué)術(shù)研究到商業(yè)市場(chǎng)的各個(gè)領(lǐng)域都有比較迫切和強(qiáng)烈的需求,它本身也涵蓋了從人工智能,數(shù)據(jù)挖掘等非常廣泛的領(lǐng)域,而且對(duì)于理論和技術(shù)的要求都比較高。目前來說,nltk應(yīng)該算是比較成熟和穩(wěn)定的工具,值得在各個(gè)研究和實(shí)際的應(yīng)用中使用
TP31
A
1674-6708(2010)30-0243-02