Zestaw narzędzi języka naturalnego - przekształcanie drzew
Oto dwa powody, dla których warto przekształcić drzewa -
- Aby zmodyfikować drzewo głębokiej analizy i
- Aby spłaszczyć głębokie drzewa analizy
Konwertowanie drzewa lub poddrzewa na zdanie
Pierwszym przepisem, który tutaj omówimy, jest konwersja drzewa lub poddrzewa z powrotem do zdania lub fragmentu łańcucha. To bardzo proste, zobaczmy na poniższym przykładzie -
Przykład
from nltk.corpus import treebank_chunk
tree = treebank_chunk.chunked_sents()[2]
' '.join([w for w, t in tree.leaves()])
Wynik
'Rudolph Agnew , 55 years old and former chairman of Consolidated Gold Fields
PLC , was named a nonexecutive director of this British industrial
conglomerate .'
Głębokie spłaszczenie drzewa
Głębokie drzewa zagnieżdżonych fraz nie mogą być używane do trenowania fragmentu, dlatego musimy je spłaszczyć przed użyciem. W poniższym przykładzie użyjemy trzeciego parsowanego zdania, które jest głębokim drzewem zagnieżdżonych fraz, ztreebank ciało.
Przykład
Aby to osiągnąć, definiujemy funkcję o nazwie deeptree_flat()to zajmie jedno drzewo i zwróci nowe drzewo, które zachowuje tylko drzewa najniższego poziomu. Aby wykonać większość pracy, używa funkcji pomocniczej, którą nazwaliśmy jakochildtree_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]))
A teraz zadzwońmy deeptree_flat() funkcja na trzecim parsowanym zdaniu, które jest głębokim drzewem zagnieżdżonych fraz, z treebankciało. Zapisaliśmy te funkcje w pliku o nazwie deeptree.py.
from deeptree import deeptree_flat
from nltk.corpus import treebank
deeptree_flat(treebank.parsed_sents()[2])
Wynik
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')]), ('.', '.')])
Budynek Shallow tree
W poprzedniej sekcji spłaszczamy głębokie drzewo zagnieżdżonych fraz, zachowując tylko poddrzewa najniższego poziomu. W tej sekcji zachowamy tylko najwyższe poddrzewa, tj. Zbudujemy płytkie drzewo. W poniższym przykładzie użyjemy trzeciego parsowanego zdania, które jest głębokim drzewem zagnieżdżonych fraz ztreebank ciało.
Przykład
Aby to osiągnąć, definiujemy funkcję o nazwie tree_shallow() to wyeliminuje wszystkie zagnieżdżone poddrzewa, zachowując tylko etykiety najwyższych poddrzew.
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)
A teraz zadzwońmy tree_shallow()Funkcja na 3 rd analizowany zdaniu, które jest głęboko drzewo wyrażeń zagnieżdżonych, odtreebankciało. Zapisaliśmy te funkcje w pliku o nazwie shallowtree.py.
from shallowtree import shallow_tree
from nltk.corpus import treebank
tree_shallow(treebank.parsed_sents()[2])
Wynik
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')]), ('.', '.')])
Różnicę możemy zobaczyć na podstawie wysokości drzew -
from nltk.corpus import treebank
tree_shallow(treebank.parsed_sents()[2]).height()
Wynik
3
from nltk.corpus import treebank
treebank.parsed_sents()[2].height()
Wynik
9
Konwersja etykiet drzew
W drzewach parsowych występuje różnorodność Treetypy etykiet, których nie ma w drzewach porcji. Ale podczas używania drzewa parsowania do trenowania fragmentu chcielibyśmy zmniejszyć tę różnorodność, konwertując niektóre etykiety drzewa na bardziej popularne typy etykiet. Na przykład mamy dwie alternatywne poddrzewa NP, mianowicie NP-SBL i NP-TMP. Możemy zamienić oba z nich na NP. Zobaczmy, jak to zrobić w poniższym przykładzie.
Przykład
Aby to osiągnąć, definiujemy funkcję o nazwie tree_convert() który przyjmuje następujące dwa argumenty -
- Drzewo do konwersji
- Mapowanie konwersji etykiet
Ta funkcja zwróci nowe drzewo ze wszystkimi pasującymi etykietami zamienionymi na podstawie wartości w mapowaniu.
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)
A teraz zadzwońmy tree_convert() funkcja na trzecim parsowanym zdaniu, które jest głębokim drzewem zagnieżdżonych fraz, z treebankciało. Zapisaliśmy te funkcje w pliku o nazwieconverttree.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)
Wynik
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('.', ['.'])])