Natural Language Toolkit-트리 변형

다음은 나무를 변형하는 두 가지 이유입니다.

  • 깊은 구문 분석 트리를 수정하려면
  • 깊은 구문 분석 트리를 평평하게하려면

트리 또는 하위 트리를 문장으로 변환

여기서 논의 할 첫 번째 방법은 트리 또는 하위 트리를 다시 문장 또는 청크 문자열로 변환하는 것입니다. 이것은 매우 간단합니다. 다음 예를 살펴 보겠습니다.

from nltk.corpus import treebank_chunk
tree = treebank_chunk.chunked_sents()[2]
' '.join([w for w, t in tree.leaves()])

산출

'Rudolph Agnew , 55 years old and former chairman of Consolidated Gold Fields
PLC , was named a nonexecutive director of this British industrial
conglomerate .'

깊은 나무 평 평화

중첩 된 문구의 깊은 트리는 청크를 훈련하는 데 사용할 수 없으므로 사용하기 전에 평평하게해야합니다. 다음 예제에서는 중첩 된 구문의 깊은 트리 인 세 번째 구문 분석 된 문장을 사용합니다.treebank 신체.

이를 위해 다음과 같은 함수를 정의합니다. deeptree_flat()단일 트리를 가져 와서 가장 낮은 수준의 트리 만 유지하는 새 트리를 반환합니다. 대부분의 작업을 수행하기 위해 우리가 명명 한 도우미 함수를 사용합니다.childtree_flat().

from nltk.tree import Tree
def childtree_flat(trees):
   children = []
   for t in trees:
      if t.height() < 3:
         children.extend(t.pos())
      elif t.height() == 3:
         children.append(Tree(t.label(), t.pos()))
      else:
         children.extend(flatten_childtrees([c for c in t]))
   return children
def deeptree_flat(tree):
   return Tree(tree.label(), flatten_childtrees([c for c in tree]))

자, 전화합시다 deeptree_flat() 중첩 된 구문의 깊은 트리 인 세 번째 구문 분석 된 문장에서 treebank신체. 이러한 함수를 deeptree.py라는 파일에 저장했습니다.

from deeptree import deeptree_flat
from nltk.corpus import treebank
deeptree_flat(treebank.parsed_sents()[2])

산출

Tree('S', [Tree('NP', [('Rudolph', 'NNP'), ('Agnew', 'NNP')]),
(',', ','), Tree('NP', [('55', 'CD'), 
('years', 'NNS')]), ('old', 'JJ'), ('and', 'CC'),
Tree('NP', [('former', 'JJ'), 
('chairman', 'NN')]), ('of', 'IN'), Tree('NP', [('Consolidated', 'NNP'), 
('Gold', 'NNP'), ('Fields', 'NNP'), ('PLC', 
'NNP')]), (',', ','), ('was', 'VBD'), 
('named', 'VBN'), Tree('NP-SBJ', [('*-1', '-NONE-')]), 
Tree('NP', [('a', 'DT'), ('nonexecutive', 'JJ'), ('director', 'NN')]),
('of', 'IN'), Tree('NP', 
[('this', 'DT'), ('British', 'JJ'), 
('industrial', 'JJ'), ('conglomerate', 'NN')]), ('.', '.')])

얕은 나무 건물

이전 섹션에서는 가장 낮은 수준의 하위 트리 만 유지하여 중첩 된 구문의 깊은 트리를 평면화했습니다. 이 섹션에서는 얕은 트리를 구축하기 위해 가장 높은 수준의 하위 트리 만 유지합니다. 다음 예에서는 중첩 된 구문의 깊은 트리 인 세 번째 구문 분석 된 문장을 사용할 것입니다.treebank 신체.

이를 위해 다음과 같은 함수를 정의합니다. tree_shallow() 상위 하위 트리 레이블 만 유지하여 중첩 된 하위 트리를 모두 제거합니다.

from nltk.tree import Tree
def tree_shallow(tree):
   children = []
   for t in tree:
      if t.height() < 3:
         children.extend(t.pos())
      else:
         children.append(Tree(t.label(), t.pos()))
   return Tree(tree.label(), children)

자, 전화합시다 tree_shallow()내포 된 구문의 깊은 트리 인 세 번째 구문 분석 된 문장 에 대한 함수treebank신체. 이러한 함수를 shallowtree.py라는 파일에 저장했습니다.

from shallowtree import shallow_tree
from nltk.corpus import treebank
tree_shallow(treebank.parsed_sents()[2])

산출

Tree('S', [Tree('NP-SBJ-1', [('Rudolph', 'NNP'), ('Agnew', 'NNP'), (',', ','), 
('55', 'CD'), ('years', 'NNS'), ('old', 'JJ'), ('and', 'CC'), 
('former', 'JJ'), ('chairman', 'NN'), ('of', 'IN'), ('Consolidated', 'NNP'), 
('Gold', 'NNP'), ('Fields', 'NNP'), ('PLC', 'NNP'), (',', ',')]), 
Tree('VP', [('was', 'VBD'), ('named', 'VBN'), ('*-1', '-NONE-'), ('a', 'DT'), 
('nonexecutive', 'JJ'), ('director', 'NN'), ('of', 'IN'), ('this', 'DT'), 
('British', 'JJ'), ('industrial', 'JJ'), ('conglomerate', 'NN')]), ('.', '.')])

우리는 나무의 높이를 구하여 차이를 볼 수 있습니다.

from nltk.corpus import treebank
tree_shallow(treebank.parsed_sents()[2]).height()

산출

3
from nltk.corpus import treebank
treebank.parsed_sents()[2].height()

산출

9

트리 레이블 변환

구문 분석 트리에는 다양한 Tree청크 트리에없는 레이블 유형. 그러나 파스 트리를 사용하여 청커를 훈련하는 동안 일부 트리 레이블을 더 일반적인 레이블 유형으로 변환하여 이러한 다양성을 줄이고 싶습니다. 예를 들어, NP-SBL 및 NP-TMP라는 두 개의 대체 NP 하위 트리가 있습니다. 둘 다 NP로 변환 할 수 있습니다. 다음 예에서 방법을 살펴 보겠습니다.

이를 달성하기 위해 우리는 tree_convert() 그것은 다음 두 가지 인수를 취합니다-

  • 변환 할 트리
  • 레이블 변환 매핑

이 함수는 매핑의 값을 기준으로 모든 일치 레이블이 교체 된 새 트리를 반환합니다.

from nltk.tree import Tree
def tree_convert(tree, mapping):
   children = []
   for t in tree:
      if isinstance(t, Tree):
         children.append(convert_tree_labels(t, mapping))
      else:
         children.append(t)
   label = mapping.get(tree.label(), tree.label())
   return Tree(label, children)

자, 전화합시다 tree_convert() 중첩 된 구문의 깊은 트리 인 세 번째 구문 분석 된 문장에서 treebank신체. 이러한 함수를converttree.py.

from converttree import tree_convert
from nltk.corpus import treebank
mapping = {'NP-SBJ': 'NP', 'NP-TMP': 'NP'}
convert_tree_labels(treebank.parsed_sents()[2], mapping)

산출

Tree('S', [Tree('NP-SBJ-1', [Tree('NP', [Tree('NNP', ['Rudolph']), 
Tree('NNP', ['Agnew'])]), Tree(',', [',']), 
Tree('UCP', [Tree('ADJP', [Tree('NP', [Tree('CD', ['55']), 
Tree('NNS', ['years'])]), 
Tree('JJ', ['old'])]), Tree('CC', ['and']), 
Tree('NP', [Tree('NP', [Tree('JJ', ['former']), 
Tree('NN', ['chairman'])]), Tree('PP', [Tree('IN', ['of']), 
Tree('NP', [Tree('NNP', ['Consolidated']), 
Tree('NNP', ['Gold']), Tree('NNP', ['Fields']), 
Tree('NNP', ['PLC'])])])])]), Tree(',', [','])]), 
Tree('VP', [Tree('VBD', ['was']),Tree('VP', [Tree('VBN', ['named']), 
Tree('S', [Tree('NP', [Tree('-NONE-', ['*-1'])]), 
Tree('NP-PRD', [Tree('NP', [Tree('DT', ['a']), 
Tree('JJ', ['nonexecutive']), Tree('NN', ['director'])]), 
Tree('PP', [Tree('IN', ['of']), Tree('NP', 
[Tree('DT', ['this']), Tree('JJ', ['British']), Tree('JJ', ['industrial']), 
Tree('NN', ['conglomerate'])])])])])])]), Tree('.', ['.'])])