2013-07-30 40 views
2

我想從樹結構中提取規則而不使用自然語言工具包(NLTK)。例如:
對於ex;樹結構是:從樹結構中重新生成規則但不是沒有nltk

(NP-TMP (NNP December ) (CD 1998 ) ) \n 

,我要提取規則,以便:

NP-TMP -> NNP CD 
NNP -> 'December' 
CD -> '1998' 

我如何能做到這一點可以用Python re庫,而無需使用「NLTK」?

+0

所有的樹都是那樣的嗎? – snf

+0

您需要描述多個規則,因此您是否只是從固定模式進行簡單提取或解析s表達式就會更清楚。 –

+0

正則表達式是* regular *它是遞歸語法的一個子集。即它不能解析遞歸語法的產品,這正是你正在嘗試做的。但是,如果由於某種原因,您反對使用NLTK,您可以查看任何Lisp解析器(它們通常不是非常複雜)來弄清楚如何解析它。還有其他庫,可以幫助您構建特殊類型的解析器。我沒有使用[這一個](http://code.google.com/p/funcparserlib/),但它看起來不錯。 – 2013-07-30 16:29:49

回答

0

極不優雅的解決辦法是

import re 

s_expr = "(NP-TMP (NNP December ) (CD 1998 ) )" 
regex = re.compile("([\\w-]+)") 

matches = re.findall(regex, s_expr) 
# assert the s-expressions are 5 
assert (len(matches) == 5) 
print matches[0], matches[1], matches[3] 
print matches[1], matches[2] 
print matches[3], matches[4] 

在這裏,我承擔所有的s表達式或樹木有兩個後代,如果沒有,這是不是要去工作,也許由按手解析器比正則表達式更好。

+0

我的樹狀結構中的每個節點都有2個或1個節點,當我想提取它的規則時,我不知道它的格式(因爲它應該會自動提取。通過您的解決方案,我無法自動完成) – serenei

+0

@ serenei- fgufyurzt你可以檢查匹配的數字,當它們是對時聲明,並循環它們,在我看來很容易,只是它不是很優雅(根本)。 – snf