七 文法分析還是基於特徵好啊

2021-08-28 02:48:18 字數 3351 閱讀 3879

語法分析固然重要,但要想覆蓋語言的全部,需要進一步擴充套件到文法分析,文法分析可以基於規則,但是工作量難以想象,基於特徵的文法分析不但可窮舉,而且可以方便用計算機儲存和計算,本節簡單做乙個介紹,更深層次的內容還需要繼續關注後面的系列文章

還記得上一節中的這個嗎?

(s

(np 小明)

(vp

(v 追趕)

(np

(det 乙隻)

(n 兔子))))

這裡面的n表示名詞,det表示限定詞,np表示名詞短語,v表示動詞,vp表示動詞短語,s表示句子

這種句子分析方法叫做語法分析

因為句子可以無限組合無限擴充套件,所以單純用語法分析來完成自然語言處理這件事情是不可能的,所以出現了文法分析

文法是乙個潛在的無限的句子集合的乙個緊湊的特性,它是通過一組形式化模型來表示的,文法可以覆蓋所有結構的句子,對乙個句子做文法分析,就是把句子往文法模型上靠,如果同時符合多種文法,那就是有歧義的句子

最重要的結論:文法結構範圍相當廣泛,無法用規則類的方法來處理,只有利用基於特徵的方法才能處理

文法特徵舉例:單詞最後乙個字母、詞性標籤、文法類別、正字拼寫、指示物、關係、施事角色、受事角色

因為文法特徵是一種kv,所以特徵結構的儲存形式是字典

不是什麼樣的句子都能提取出每乙個文法特徵的,需要滿足一定的條件,這需要通過一系列的檢查手段來達到,包括:句法協議(比如this dog就是對的,而these dog就是錯的)、屬性和約束、術語

nltk幫我實現了特徵結構:

>>> import nltk

>>> fs1 = nltk.featstruct(tense='past', num='sg')

>>> fs1

[num='sg', tense='past']

>>> fs2 = nltk.featstruct(pos='n', agr=fs1)

>>> fs2

[agr=[num='sg', tense='past'], pos='n']

在nltk的庫里已經有了一些產生式文法描述可以直接使用,位置在:

[root@centos $] ls ~/nltk_data/grammars/book_grammars

background.fol discourse.fcfg drt.fcfg feat0.fcfg feat1.fcfg german.fcfg ******-sem.fcfg sql0.fcfg sql1.fcfg storage.fcfg

我們看其中最簡單的乙個sql0.fcfg,這是乙個查詢國家城市的sql語句的文法:

% 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是句子

我們來載入這個文法描述,並試驗如下:

import nltk

from nltk import load_parser

cp = load_parser('grammars/book_grammars/sql0.fcfg')

query = 'what cities are located in china'

tokens = query.split()

for tree in cp.parse(tokens):

print tree

輸出結果如下:

(s[sem=(select, city from city_table, where, , , country="china")]

(np[sem=(select, city from city_table)]

(det[sem='select'] what)

(n[sem='city from city_table'] cities))

(vp[sem=(, , country="china")]

(iv[sem=''] are)

(ap[sem=(, country="china")]

(a[sem=''] located)

(pp[sem=(, country="china")]

(p[sem=''] in)

(np[sem='country="china"'] china)))))

我們可以看到用特徵結構可以建立對大量廣泛的語言學現象的簡介分析

1029 文法分析

程式 外部宣告 程式 外部宣告 外部宣告 函式定義 定義 函式定義 資料型別 宣告符 復合語句 資料型別 無字元 字元型別 整型 浮點型 宣告符 指標 直接宣告符 直接宣告符 指標 指標 直接宣告符 識別符號 直接宣告符 識別符號 直接宣告符 普通表示式 識別符號 參數列 識別符號 直接宣告符 識別...

LR(0)文法的分析

include include include include include include include include include include include include include using namespace std typedef long long ll const...

編譯原理實驗4 LL(1)文法分析

本來是打算再寫乙個select集生成器的,但是時間有限再加上懶後來還是放棄了 這個 也是需要先新建乙個文字檔案sy4.in 文字檔案中第一行有乙個整數x,代表有x個產生式 接下來x行每行有三個字串,分別代表產生式左邊,右邊還有對應的select集 最後一行還有乙個字母s,代表起始字元 在讀入了資料之...