Инструментарий естественного языка - Преобразование деревьев
Ниже приведены две причины для преобразования деревьев:
- Чтобы изменить дерево глубокого разбора и
- Сглаживание деревьев глубокого разбора
Преобразование дерева или поддерева в предложение
Первый рецепт, который мы собираемся здесь обсудить, - это преобразование дерева или поддерева обратно в предложение или строку фрагмента. Это очень просто, давайте посмотрим на следующем примере -
пример
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() функция в 3-м проанализированном предложении, которое представляет собой глубокое дерево вложенных фраз, из 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()функция на 3- м разобранном предложении, которое является глубоким деревом вложенных фраз, из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, а именно NP-SBL и NP-TMP. Мы можем преобразовать их обоих в 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() функция в 3-м проанализированном предложении, которое представляет собой глубокое дерево вложенных фраз, из 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('.', ['.'])])