2010-08-17 4 views
8

복잡한 문장을 nltk 또는 다른 자연 언어 처리 라이브러리의 간단한 문장으로 분해하는 방법이 있습니까? 예를 들어nltk에서 복합 및 복합 문장 분리/분해

: 태양이 설정되고 시원한 바람이 ==> 태양이 설정입니다 불고 때

공원은 매우 훌륭합니다. 시원한 바람이 불고있다. 공원은 너무 멋지다.

답변

10

이것은 훨씬 더 복잡하기 때문에 완벽하게 깨끗한 방법을 찾지 못할 수 있습니다.

그러나 OpenNLP에서 영어 구문 분석기를 사용하여, 당신의 예문을하고 다음 문법 트리를 얻을 수 있습니다 : 당신이 원하는대로

(S 
    (NP (DT The) (NN park)) 
    (VP 
     (VBZ is) 
     (ADJP (RB so) (JJ wonderful)) 
     (SBAR 
     (WHADVP (WRB when)) 
     (S 
      (S (NP (DT the) (NN sun)) (VP (VBZ is) (VP (VBG setting)))) 
      (CC and) 
      (S 
      (NP (DT a) (JJ cool) (NN breeze)) 
      (VP (VBZ is) (VP (VBG blowing))))))) 
    (. .))) 

는 여기에서 떨어져을 선택할 수 있습니다. 최상위 레벨 (NP *) (VP *) - (SBAR *) 섹션을 추출하여 하위 절을 가져올 수 있습니다. 그리고 나서 (SBAR *) 내부의 결합을 다른 두 문장으로 분리 할 수 ​​있습니다.

OpenNLP 파서는 Penn Treebank 코퍼스를 사용하여 학습합니다. 예제 문장에서 꽤 정확한 구문 분석을 얻었지만 파서가 완벽하지 않으며 다른 문장에서 잘못 될 수 있습니다. 태그에 대한 설명은 Look here을 참조하십시오. 그것은 당신이 이미 언어학과 영어 문법에 대한 기본적인 지식을 가지고 있다고 가정합니다.

편집 : Btw, 내가 파이썬에서 OpenNLP에 액세스하는 방법입니다. 여기서는 opennlp-tools-1.4.3 폴더에 OpenNLP jar 및 모델 파일이 있다고 가정합니다.

import os, sys 
from subprocess import Popen, PIPE 
import nltk 

BP = os.path.dirname(os.path.abspath(__file__)) 
CP = "%(BP)s/opennlp-tools-1.4.3.jar:%(BP)s/opennlp-tools-1.4.3/lib/maxent-2.5.2.jar:%(BP)s/opennlp-tools-1.4.3/lib/jwnl-1.3.3.jar:%(BP)s/opennlp-tools-1.4.3/lib/trove.jar" % dict(BP=BP) 
cmd = "java -cp %(CP)s -Xmx1024m opennlp.tools.lang.english.TreebankParser -k 1 -d %(BP)s/opennlp.models/english/parser" % dict(CP=CP, BP=BP) 
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) 
stdin, stdout, stderr = (p.stdin, p.stdout, p.stderr) 
text = "This is my sample sentence." 
stdin.write('%s\n' % text) 
ret = stdout.readline() 
ret = ret.split(' ') 
prob = float(ret[1]) 
tree = nltk.Tree.parse(' '.join(ret[2:])) 
+0

감사합니다. Chris, 작동합니다! – Sharmila

+0

예제 문장을 Stanford corenlp로 파싱했고 하위 절이 올바르게 구문 분석되지 않았습니다. Cerin이 말했듯이 모델은 100 % 정확하지 않으며 부정확 한 구문 분석 트리를 제공 할 수 있습니다. –