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('.', ['.'])])