2012-03-21 2 views
1

스탠포드 파서 (Stanford Parser, http://nlp.stanford.edu/software/lex-parser.shtml)는 문맥없는 구문 구조 트리를 다음과 같이 제공합니다. 나무에있는 모든 명사구 (NP)와 동사구 (NP) 같은 것을 추출하는 가장 좋은 방법은 무엇입니까? 이 같은 구조를 읽을 수있는 Python (또는 Java) 라이브러리가 있습니까? 고맙습니다.스탠포드 파서 (Stanford Parser)의 컨텍스트 프리 구문 구조 출력에서 ​​정보 추출

(ROOT 
    (S 
    (S 
     (NP 
     (NP (DT The) (JJS strongest) (NN rain)) 
     (VP 
      (ADVP (RB ever)) 
      (VBN recorded) 
      (PP (IN in) 
      (NP (NNP India))))) 
     (VP 
     (VP (VBD shut) 
      (PRT (RP down)) 
      (NP 
      (NP (DT the) (JJ financial) (NN hub)) 
      (PP (IN of) 
       (NP (NNP Mumbai))))) 
     (, ,) 
     (VP (VBD snapped) 
      (NP (NN communication) (NNS lines))) 
     (, ,) 
     (VP (VBD closed) 
      (NP (NNS airports))) 
     (CC and) 
     (VP (VBD forced) 
      (NP 
      (NP (NNS thousands)) 
      (PP (IN of) 
       (NP (NNS people)))) 
      (S 
      (VP (TO to) 
       (VP 
       (VP (VB sleep) 
        (PP (IN in) 
        (NP (PRP$ their) (NNS offices)))) 
       (CC or) 
       (VP (VB walk) 
        (NP (NN home)) 
        (PP (IN during) 
        (NP (DT the) (NN night)))))))))) 
    (, ,) 
    (NP (NNS officials)) 
    (VP (VBD said) 
     (NP-TMP (NN today))) 
    (. .))) 

답변

2

체크 아웃 nltk.org에서 자연 언어 툴킷 (NLTK).

이 툴킷은 파이썬으로 작성되었으며 이러한 종류의 트리 (다른 많은 것들도)를 정확하게 읽을 수있는 코드를 제공합니다.

또는이 작업을 수행하기 위해 고유 한 재귀 함수를 작성할 수 있습니다. 그것은 매우 직설적 일 것입니다. 그냥 재미를 위해


:

def parse(): 
    itr = iter(filter(lambda x: x, re.split("\\s+", s.replace('(', ' (').replace(')', ') ')))) 

    def _parse(): 
    stuff = [] 
    for x in itr: 
     if x == ')': 
     return stuff 
     elif x == '(': 
     stuff.append(_parse()) 
     else: 
     stuff.append(x) 
    return stuff 

    return _parse()[0] 

def find(parsed, tag): 
    if parsed[0] == tag: 
    yield parsed 
    for x in parsed[1:]: 
    for y in find(x, tag): 
     yield y 

p = parse() 
np = find(p, 'NP') 
for x in np: 
    print x 

수율 :

['NP', ['NP', ['DT', 'The'], ['JJS', 'strongest'], ['NN', 'rain']], ['VP', ['ADVP', ['RB', 'ever']], ['VBN', 'recorded'], ['PP', ['IN', 'in'], ['NP', ['NNP', 'India']]]]] 
['NP', ['DT', 'The'], ['JJS', 'strongest'], ['NN', 'rain']] 
['NP', ['NNP', 'India']] 
['NP', ['NP', ['DT', 'the'], ['JJ', 'financial'], ['NN', 'hub']], ['PP', ['IN', 'of' ['NP', ['NNP', 'Mumbai']]]] 
['NP', ['DT', 'the'], ['JJ', 'financial'], ['NN', 'hub']] 
['NP', ['NNP', 'Mumbai']] 
['NP', ['NN', 'communication'], ['NNS', 'lines']] 
['NP', ['NNS', 'airports']] 
['NP', ['NP', ['NNS', 'thousands']], ['PP', ['IN', 'of'], ['NP', ['NNS', 'people']]]] 
['NP', ['NNS', 'thousands']] 
['NP', ['NNS', 'people']] 
['NP', ['PRP$', 'their'], ['NNS', 'offices']] 
['NP', ['NN', 'home']] 
['NP', ['DT', 'the'], ['NN', 'night']] 
['NP', ['NNS', 'officials']] 
여기 당신이 원하는 것을의 슈퍼 간단한 구현이야