語法分析器描述了一個句子的語法結構,用來幫助其他的應用進行推理。自然語言引入了很多意外的歧義,以我們對世界的了解可以迅速地發現這些歧義。舉一個我很喜歡的例子:

正確的解析是連接“with”和“pizza”,而錯誤的解析將“with”和“eat”聯系在了一起:

過去的一些年,自然語言處理(NLP)社區在語法分析方面取得了很大的進展?,F在,小小的 Python 實現可能比廣泛應用的 Stanford 解析器表現得更出色。

文章剩下的部分首先設置了問題,接著帶你了解為此準備的簡潔實現。parser.py 代碼中的前 200 行描述了詞性的標注者和學習者(這里)。除非你非常熟悉 NLP 方向的研究,否則在研究這篇文章之前至少應該略讀。
Cython 系統和 Redshift 是為我目前的研究而寫的。和麥考瑞大學的合同到期后,我計劃六月份對它進行改進,用于一般用途。目前的版本托管在 GitHub 上。
問題描述
在你的手機中輸入這樣一條指令是非常友善的:
Set volume to zero when I'm in a meeting, unless John's school calls.
接著進行適當的策略配置。在 Android 系統上,你可以應用 Tasker 做這樣的事情,而 NL 接口會更好一些。接收可以編輯的語義表示,你就能了解到它認為你表達的意思,并且可以修正他的想法,這樣是特別友善的。
這項工作有很多問題需要解決,但一些種類的句法形態絕對是必要的。我們需要知道:
Unless John's school calls, when I'm in a meeting, set volume to zero
是解析指令的又一種方式,而
Unless John's school, call when I'm in a meeting
表達了完全不同的意思。
依賴解析器返回一個單詞與單詞間的關系圖,使推理變得更容易。關系圖是樹形結構,有向邊,每個節點(單詞)有且僅有一個入弧(頭部依賴)。
用法示例:
>>> parser = parser.Parser()>>> tokens = "Set the volume to zero when I 'm in a meeting unless John 's school calls".split()>>> tags, heads = parser.parse(tokens)>>> heads[-1, 2, 0, 0, 3, 0, 7, 5, 7, 10, 8, 0, 13, 15, 15, 11]>>> for i, h in enumerate(heads):... head = tokens[heads[h]] if h >= 1 else 'None'... print(tokens[i] + ' <-- ' + head])Set <-- Nonethe <-- volumevolume <-- Setto <-- Setzero <-- towhen <-- SetI <-- 'm'm <-- whenin <-- 'ma <-- meetingmeeting <-- inunless <-- SetJohn <-- 's's <-- callsschool <-- callscalls <-- unless
新聞熱點
疑難解答