2011-11-21 59 views
2

我想解析自然語言解析器(斯坦福分析器)的結果輸出。 有些結果是如下:解析模式中的元素

dep(Company-1, rent-5') 
conj_or(rent-5, share-10) 
amod(information-12, personal-11) 
prep_about(rent-5, you-14) 
amod(companies-20, non-affiliated-19) 
aux(provide-23, to-22) 
xcomp(you-14, provide-23) 
dobj(provide-23, products-24) 
aux(requested-29, 've-28) 

結果想獲得有:

['dep', 'Company', 'rent'] 
['conj_or', 'rent', 'share'] 
['amod', 'information', 'personal'] 
... 
['amod', 'companies', 'non-affiliated'] 
... 
['aux', 'requested', "'ve"] 

首先,我想直接拿到這些元素,但是失敗了。 然後我意識到正則表達式應該是正確的前進方向。

但是,我完全不熟悉正則表達式。隨着一些探索,我得到了:

m = re.search('(?<=())\w+', line) 
m2 =re.search('(?<=-)\d', line) 

並卡住了。

第一個可以正確獲取第一個元素,例如'dep', 'amod','conj_or',但我其實並沒有完全想到它爲什麼在工作......

第二行試圖獲得第二個元素,例如, 'Company','rent','information',但我只能得到單詞後面的數字。我不知道如何lookbefore,而不是向後看...

順便說一句,我也不知道如何處理例外如'non-affiliated'"'ve"

任何人都可以提供一些提示或幫助。高度讚賞。

回答

1

這是很難給出一個最佳答案不知道完整的範圍可能的輸出,但是,這裏有一個可能的解決方案:

>>> [re.findall(r'[A-Za-z_\'-]+[^-\d\(\)\']', line) for line in s.split('\n')] 
[['dep', 'Company', 'rent'], 
['conj_or', 'rent', 'share'], 
['amod', 'information', 'personal'], 
['prep_about', 'rent', 'you'], 
['amod', 'companies', 'non-affiliated'], 
['aux', 'provide', 'to'], 
['xcomp', 'you', 'provide'], 
['dobj', 'provide', 'products'], 
['aux', 'requested', "'ve"]] 

它通過發現的連續字母所有組([A-Za-z]代表間隔大寫字母A和Z以及小a和z之間)或字符「_」和「'」在同一行中。

此外,它強制執行規則,即您的匹配字符串在最後一個位置不得包含給定的字符列表([^...]是必須包含任何字符的語法(用列表替換「...」字符))。

\逃脫像這些字符「(」或「)」字符,否則將通過正則表達式引擎解析爲指令。

最後,s是你在給的例子字符串問題...

HTH!

1

這裏是你正在尋找: ([\w-]*)\(([\w-]*)-\d*, ([\w-]*)-\d*\)

各地[\w-]*括號是分組,使您可以訪問數據爲:

ex = r'([\w-]*)\(([\w-]*)-\d*, ([\w-]*)-\d*\)' 
m = re.match(ex, line) 
print(m.group(0), m.group(1), m.group(2)) 

順便說一句,我建議使用「科多獸」用Python + PyQT編寫的程序來學習和測試正則表達式。這是我最喜歡的測試正則表達式的工具。

1

如果來自解析器的結果是作爲常規的建議,正則表達式可以不是必需的:

from pprint import pprint 

source = """ 
dep(Company-1, rent-5') 
conj_or(rent-5, share-10) 
amod(information-12, personal-11) 
prep_about(rent-5, you-14) 
amod(companies-20, non-affiliated-19) 
aux(provide-23, to-22) 
xcomp(you-14, provide-23) 
dobj(provide-23, products-24) 
aux(requested-29, 've-28) 
""" 

items = [] 

for line in source.splitlines(): 
    head, sep, tail = line.partition('(') 
    if head: 
     item = [head] 
     head, sep, tail = tail.strip('()').partition(', ') 
     item.append(head.rpartition('-')[0]) 
     item.append(tail.rpartition('-')[0]) 
     items.append(item) 

pprint(items) 

輸出:

[['dep', 'Company', 'rent'], 
['conj_or', 'rent', 'share'], 
['amod', 'information', 'personal'], 
['prep_about', 'rent', 'you'], 
['amod', 'companies', 'non-affiliated'], 
['aux', 'provide', 'to'], 
['xcomp', 'you', 'provide'], 
['dobj', 'provide', 'products'], 
['aux', 'requested', "'ve"]]