2016-12-15 15 views
2

나는 펜 트리 은행 V2 나무를 처리하고 자주 수동 실제로 더 사용 노드를 수정하는 규칙을 많이 추가 할 수 있습니다ntbt를 사용하여 ptb 구문 분석 트리에서 -NONE- 및 * T * -i를 제거하는 방법은 무엇입니까?

enter image description here

이 (그리고 몇 가지 다른 유형)처럼 -subtrees "서비스를"발생 (태그와 토큰을 구문 분석하고 "오, 거기 보이는"링크가 없거나 "여기에 노드가 있어야합니다"- 스탠포드 파서가 반환 한 것과 같음)하지만 대부분 이러한 서비스 노드 또는 거대한 간격을 남기고 "나뭇 가지를 자른 것"(위의 노드 -NONE-을 제거하면 SBAR은 전혀 아이들이없고 이상하게 보입니다).

from nltk.corpus import ptb; ptb.parsed_sents() 사람의 출력에서 ​​실제 구문 분석 (단어, 태그, 구두점)을 제외하고 모든 것을 제거 할 수 있을지 궁금합니다.

답변

1

추적을 지배하는 하위 트리를 삭제하십시오. 다음에서는 하위 트리를 반복하지만 실제로 하위를 확인합니다. 이렇게하면 빈 하위 트리를 포함하는 노드를 수정하여 빈 하위 트리를 쉽게 삭제할 수 있습니다.

for sub in some_tree.subtrees(): 
    for n, child in enumerate(sub): 
     if isinstance(child, str): 
      continue 
     if all(leaf.startswith("*") for leaf in child.leaves()): 
      del sub[n] # Delete this child 

나는 흔적을 탐지하는 간단한 기준으로 leaf.startswith("*")을 사용했습니다. 필요에 따라 자신의 것으로 교체하십시오.

편집 : 당신이 -NONE- 레이블 만 하위 트리를 포함하는 모든 노드를 삭제할 것인지, 그리고 이러한 각 하위 트리가 정확히 하나 개의 잎을 지배하고 있기 때문에는 다음과 같은 시험 사용 : 지금

if len(list(child.subtrees(filter=lambda x:x.label()=='-NONE-')))==len(child.leaves()): 
     del sub[n] 
+0

무엇에 대해'-NONE-'것? 문제는 모든 종류의 서비스 노드를 모른다는 것입니다. 질문의 구체적인 예를 제시했습니다. –

+0

삭제 기준이 모든 '-NONE-'노드와 결과적으로 비어있는 모든 상위 노드를 삭제하는 것이라면 그에 따라 기준을 수정해야합니다. 이 태그가 항상 높이 1에서 발생하면 꽤 쉽습니다. 나뭇잎이있는만큼 많은'-NONE-'노드를 지배하는 하위 트리를 삭제하십시오. – alexis

+0

@alexis라는 구체적인 답변을 주셔서 대단히 감사합니다! 그것은 매우 유용하지만, 제가 언급 한 문제는 조금 다릅니다; 나는 "그 밖의 모든 것"이 무엇인지를 미리 알지 못하고 그 자체를 파싱하는 것을 제외한 모든 것을 제거 할 수 있는지 궁금해하고있었습니다. 왜냐하면 거기에 이러한 흔적과 공동 인덱스가 있고, 제거하면 남아있을거야. 그것은 처음에는 매우 유용한 스 니펫입니다. –

0

감사합니다, 아래의 대답 @alexsis에를 I 그러한 것들을 흔적 및 공동 색인이라고합니다. treetools 패키지에서 implementationdef ptb_delete_traces(tree) 인 것을 발견했습니다.