2017-03-11 2 views
0

NLTK의 정규식 파서에서 문법의 일부로 조건을 작성해야합니다. 구조 'Coffee & Tea' 인 단어를 청크하고 싶지만 시퀀스 앞에 <IN> 단어가있는 경우 청크하지 않아야합니다. 예를 들어, 'in London and Paris'은 파서에 의해 청크되어서는 안됩니다. 다음과 같이NLTK 정규식 파서에서 조건 없음

내 코드는 다음과 같습니다

grammar = r'''NP: {(^<IN>)<NNP>+<CC><NN.*>+}''' 

나는 문제를 해결하기 위해 위의 문법을 시도했지만 누군가가 내가 뭘 잘못 말해주십시오 수 작동하지 않습니다.

예 :

def parse_sentence(sentence): 
    pos_sentence = nltk.pos_tag(nltk.word_tokenize(sentence)) 
    grammar = r'''NP: {<NNP>+<CC><NN.*>+}''' 
    parser = nltk.RegexpParser(grammar) 
    result = parser.parse(pos_sentence) 
    print result 

sentence1 = 'Who is the front man of the band that wrote Coffee & TV?' 
parse_sentence(sentence1) 

sentence2 = 'Who of those resting in Westminster Abbey wrote a book set in London and Paris?' 
parse_sentence(sentence2) 

Result for sentence 1 is: 
(S 
    Who/WP 
    is/VBZ 
    the/DT 
    front/JJ 
    man/NN 
    of/IN 
    the/DT 
    band/NN 
    that/WDT 
    wrote/VBD 
    (NP Coffee/NNP &/CC TV/NN) 
    ?/.) 

Result for sentence2 is: 
(S 
    Who/WP 
    of/IN 
    those/DT 
    resting/VBG 
    in/IN 
    Westminster/NNP 
    Abbey/NNP 
    wrote/VBD 
    a/DT 
    book/NN 
    set/VBN 
    in/IN 
    (NP London/NNP and/CC Paris/NNP) 
    ?/.) 

으로 모두 SENTENCE1에서 볼 나는 덩어리 London and Paris하고자하지는 않지만 Coffee & TeaLondon and Paris 그룹으로 청크 얻을 문구를 SENTENCE2 할 수

. 이 작업을 수행하는 한 가지 방법은 <IN> POS 태그가 앞에 오는 패턴을 무시하는 것입니다.

간단히 말해서 POS 태그의 NOT (부정) 조건을 정규식 파서의 문법에 추가하는 방법을 알아야합니다. '^'다음에 태그 정의를 사용하는 표준 구문이 작동하지 않는 것 같습니다.

+0

당신이 이것을 어떻게 사용하고 있는지 더 자세히 알 수 있습니까? [MCVE]를 제공하면 더 쉬울 것입니다. –

+0

나는 또한 질문에 예제를 추가하고 있습니다. 난 그냥 정규식 파서에 POS 태그에 대한 부정 (부정) 조건을 추가하는 방법을 알아야합니다. '^'다음에 태그 정의를 사용하는 표준 구문은 작동하지 않는 것 같습니다. –

+0

정규 표현식에서'^ '는 일반적으로 줄의 시작을 의미합니다. 그것은 오직 문자 클래스 (대괄호) 안에 "not"를 의미합니다. – alexis

답변

2

"네거티브 lookbehind"표현식이 필요합니다. 불행히도, 그것은 청크 파서에서 작동하지 않습니다, 그래서 당신이 원하는 건 chunking regexp로 지정할 수 없습니다 용의자.

다음은 일반적인 음수 lookbehind입니다 : "Paris"와 일치하지만 앞에는 "and"가없는 경우.

>>> re.findall(r"(?<!and) Paris", "Search in London and Paris etc.") 
[] 

불행하게도, 해당 lookbehind 청킹 규칙은 작동하지 않습니다. nltk의 regexp 엔진은 POS 형식을 해석하기 위해 그것을 전달하는 정규 표현식을 조정하며 lookbehinds로 혼란스러워합니다. (I이 lookbehind 구문의 < 문자를 짐작하는 것은 태그 구분자로 잘못 해석된다.)

>>> parser = nltk.RegexpParser(r"NP: {(?<!<IN>)<NNP>+<CC><NN.*>+}") 
... 
ValueError: Illegal chunk pattern: {(?<!<IN>)<NNP>+<CC><NN.*>+} 
0

cp.2.5 "Chinking"

"우리는 토큰의 연속이 될 수있는 갈라진 틈을 정의 할 수 덩어리 "에 포함되지 않은 것은

http://www.nltk.org/book/ch07.html

배제 역 중괄호를 참조

grammar = 
     r""" 
      NP: 
      {<.*>+}   # Chunk everything 
      }<VBD|IN>+{  # Chink sequences of VBD and IN 

     """ 
+0

나는 NLTK를 모르지만, '런던과 파리'라는 질문의 예에서, "in"뿐만 아니라 "chunked"런던과 파리도 포함시켜야한다. . 그러나 설명을 위해이 대답을 확장 할 수 있다면, 다음 단계를 위해'in' 트리거를 어떻게 만들지 모르겠다. 이것은 유용 할 것이다. –