引言:剛學習模式識別時,讀Earley算法有些晦澀,可能是自己太笨。看了網上各種資料,還是似懂非懂,后來明白了,是網上的前輩們境界太高,寫的最基本的東西還是非常抽象,我都領悟不了,所以決定寫個白痴版的Earley算法入門,因為有時候第一道坎過不了以紀念第一次的學術充電,第一次的互聯網博文。
長話短說,選取的教材是《模式識別原理與應用——李弼程》。
本文分為三部分:一是算法規則介紹,二是算法實例,三是總結后記。
一、Earley算法規則介紹
這里提供算法的規則,下面是圖片截圖,也提供了文本,均是一樣的。
- Earley算法規則(圖片格式)
- Earley算法規則(文本版)(如果在這里看不懂,沒關系可以繼續看,后面在實例理會引用到,我也會在實例中解釋一些意義)
下面有一些符號相似,如
,請注意辨別。
,
是字符串。
[1] 建立初始表I0,其目的為建立一個初始化的表格而已,后續操作由此進行發散衍伸。建立初始化表的方法如下:
a) 若
在P (P是推斷規則集) 中,則將項目
加入到I0中。
| 上句描述的背景是:建立初始化表,跟輸入完全沒關系,初始化過程不必管輸入的字符串,我們只關心初始化的准備工作。 而上句意義在於:凡在規則集中推斷規則符合某條件(凡由起始符開始可推斷出任意字符串),則將其加入初始化表。 分隔點的作用有些像Petri網里的小黑點,即令牌。功能也是為了區分位置關系,會用於后續的規則判定中。 |
b)若
在I0中,對所有
,把
加入I0中。
c)若在I0中,對P中所有形如
的產生式,把項目
加入I0中。
d)重復步驟b與c,直至I0中不增加新的內容位置。
| b) c) d)句的意義不大,一般建立初始化表時用不到,若要理解,可閱讀完本文自行參詳。 |
[2] 建立后續表,並利用I1,I2,…,Ij-1,去建立Ij。直至滿足某種條件,則后續表建立完畢。其目的為通過某種滿足條件,使文法迭代至不能迭代為止。
此時的模塊算法與輸入的待分析的字符串有關,為判定待分析字符串是否屬於本文法產生,則此時在本模塊里需要建立聯系。
建立方法如下:
a)對於每個在Ij-1中的
,
,aj是x的第j個終止符,把項目
加入Ij中。
| 上句描述的背景是:。處於中間的分隔點與終止符的關系。 而上句意義在於:凡在初始化表中規則符合某條件(凡由起始符推斷出,分隔點后面恰為終止符),則將分隔點往后移一位,然后加入后續表。(請注意,這里的初始化表不一定固定不變,對於某個表Ij來說,那么Ij-1就是它的初始化表,不要拘泥。) |
b)若
為Ij中的項目,在Ij中尋找形為
的項目,把項目
加入Ij中。
| 上句描述的背景是:處於末位的分隔點與起始符的關系。 而上句意義在於:凡在后續表中規則符合某條件(凡由起始符A推斷出的分隔點恰為最后一位),則尋找能夠推斷出該起始符A的規則集,並重新打上新位置的分隔點,然后加入后續表。 另,我們把分隔點的位置命名繪圖解釋清楚,如下圖。
|
c)若
,則對P中所有
,把
加入到Ij中。
| 上句描述的背景是:處於中間分隔符與起始符的關系。 而上句意義在於:。凡在后續表中遇到規則式推斷的分隔點后面恰為起始符B,則將B可以推出的所有規則式寫進后續表中,並重新打上新位置的分隔點。 |
二、Earley算法規則介紹
我引用International Journal of Computer Applications (0975 – 8887) Volume 71– No.13, May 2013期刊內的一篇論文《A New Top –Down Context-Free Parsing for Syntactic》實例。
下面通過一個例子來展示該分析法如何分析輸入短語。(若題目已知都看不懂,可以自己補習充電了。)
已知條件:
其中
,
,規則產生式為
語言集有
,輸入短語為
,下表將展示該算法的流程。
下面的表達符號解釋一下,我會直接用1-a表示引用的是規則[1]內的a)規則,而表格里的式(1)或式1指的是規則式的序號而已,請勿混淆。
並請注意,當年我就很白痴地問了一句:你怎么知道什么時候用什么規則呢?我想這一個技術小白的困擾。
很簡單,把規則一個一個帶入,看哪條符合(不僅要范圍上符合,如初始化表用初始化的規則,后續表用后續表規則,而且要規則要符合,不要在后續表中用錯規則),就用哪個。直到不能用算法的規則為止。
|
|
|
式1,2,3引用1-a 針對式2,3,分別使用規則1-c,式2產生了式4,5;式3產生了6,7。所以在這里沒有已知條件里的B產生式出現,這是正確的。 ------------------------------------------------------------------------------------------------------------------- 因為很多題目,幾乎在第一步初始化表時候,都會將規則產生式里所有的式子都會囊括進來,這個題目還比較特殊,按照初始化的規則,有兩個B產生式沒有出現。 ------------------------------------------------------------------------------------------------------------------- 這里解釋一下,規則產生式后面的函數。pred()或scan()等函數是那篇論文所采用的一種方案。可以忽略之,有興趣可以去閱讀這篇論文。函數內的數字表示來源,例如式4后面的pred(2),是說明來自於式2,至於規則可以自己思考得出,實際上這個pred就是代表規則1-c的一個偽代碼函數。 |
|
|
|
此時要考慮輸入的待分析字符串,第一個字符是a,我們這個表目前只與a產生關聯。 ------------------------------------------------------------------------------------------------------------------- 對式4或5運用規則2-a,分別產生了式8或式9。以式4為例,分隔點后為a,恰為輸入字符串aabb的第一位,則分隔點后移一位,添加此后續表L(1)。 ------------------------------------------------------------------------------------------------------------------- 同理對式6或式7,也是規則2-a,然后分別產生了式10或式11。 ------------------------------------------------------------------------------------------------------------------- 然后對式8使用規則2-c,產生了式12,式13。因為式8的分隔點后為起始符,則將所有此起始符可以推出的規則式放入后續表。同理式14和15是由式10產生的,使用的規則也是2-c。 ------------------------------------------------------------------------------------------------------------------- 最麻煩的來了,式16由式11產生,使用的規則是2-b,因為式11的分隔點在最后一位,則在初始化表中尋找能夠產生出該式11的起始字符,並調整分隔點位置。 而最后的式17,式18由式16產生,因為對式16可以使用2-c規則。 至此可以發現,無論再使用哪條規則,都會有重復的。所以不必再使用規則了。 后續表L(1)可以認為建立完成了。 |
|
|
|
此時輸入待分析字符串的第二個字符還是a,我們這行L(2)表目前只與第二位的a產生關聯。 ------------------------------------------------------------------------------------------------------------------- 后面好多……這些公式和文字,絕對都是我親手碼出來的…… 實在是不願寫了~如果想知道后面的規則,可以看各規則式后面的函數內的值,就知道來源啦~請忽略函數comp()攜帶兩數值中的后面的數值,只要閱讀其中前面的數值即可~如果想知道后面的數值意思,可以自行閱讀該論文~ |
|
|
|
此時輸入的待分析字符串,第三個字符是b,我們這行開始的L(3)表目前只與b產生關聯。 ------------------------------------------------------------------------------------------------------------------- |
|
|
|
此時輸入的待分析字符串,第四個字符還是b,我們這行L(4)表目前只與最后一個字符,即b產生關聯。 -------------------------------------------------------------------------------------------------------------------如何判定待分析字符串,由本文法產生呢? 很簡單 判決條件:當最后一個表完結后,只要在最后一個表中,出現形如 那么以本題為例,顯然最后一個表中,出現了式44或式48,均可驗證判決條件正確,說明字符串I=aabb確實為此文法產生。 |
三、總結后記
如果還想驗證自己是否學通學懂,我附上《模式識別原理與應用——李弼程》的例題及解答,可自行學習。

Bitpeach 2014.3.15晚
<<<<<<<<< 寫在文章最后的小額打賞 >>>>>>>>>
如果讀者親願意的話,可以小額打賞我,感謝您的打賞。您的打賞是我的動力,非常感激。
必讀:如您願意打賞,打賞方式任選其一,本頁面右側的公告欄有支付寶方式打賞,微信方式打賞。
避免因打賞產生法律問題,兩種打賞方式的任一打賞金額上限均為5元,謝謝您的支持。
如有問題,請24小時內通知本人郵件。


























































的項目,就認為此字符串確實為此文法產生的。