Natural Language Toolkit - Bäume transformieren
Im Folgenden sind die beiden Gründe aufgeführt, um die Bäume zu verwandeln:
- Deep Parse Tree ändern und
- Um tiefe Analysebäume zu plattieren
Baum oder Teilbaum in Satz umwandeln
Das erste Rezept, das wir hier diskutieren werden, besteht darin, einen Baum oder Teilbaum wieder in einen Satz oder eine Blockzeichenfolge umzuwandeln. Dies ist sehr einfach, sehen wir uns das folgende Beispiel an:
Beispiel
from nltk.corpus import treebank_chunk
tree = treebank_chunk.chunked_sents()[2]
' '.join([w for w, t in tree.leaves()])
Ausgabe
'Rudolph Agnew , 55 years old and former chairman of Consolidated Gold Fields
PLC , was named a nonexecutive director of this British industrial
conglomerate .'
Tiefe Baumabflachung
Tiefe Bäume mit verschachtelten Phrasen können nicht zum Trainieren eines Chunks verwendet werden, daher müssen wir sie vor der Verwendung abflachen. Im folgenden Beispiel verwenden wir den 3. analysierten Satz, der ein tiefer Baum verschachtelter Phrasen isttreebank Korpus.
Beispiel
Um dies zu erreichen, definieren wir eine Funktion mit dem Namen deeptree_flat()Das nimmt einen einzelnen Baum und gibt einen neuen Baum zurück, der nur die Bäume der niedrigsten Ebene enthält. Um den größten Teil der Arbeit zu erledigen, wird eine Hilfsfunktion verwendet, die wir als benannt habenchildtree_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]))
Rufen wir jetzt an deeptree_flat() Funktion auf dem 3. analysierten Satz, der ein tiefer Baum verschachtelter Phrasen ist, aus dem treebankKorpus. Wir haben diese Funktionen in einer Datei namens deeptree.py gespeichert.
from deeptree import deeptree_flat
from nltk.corpus import treebank
deeptree_flat(treebank.parsed_sents()[2])
Ausgabe
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')]), ('.', '.')])
Flachen Baum bauen
Im vorherigen Abschnitt reduzieren wir einen tiefen Baum verschachtelter Phrasen, indem wir nur die Teilbäume der niedrigsten Ebene beibehalten. In diesem Abschnitt behalten wir nur die Teilbäume der höchsten Ebene bei, dh um den flachen Baum zu bauen. Im folgenden Beispiel verwenden wir den 3. analysierten Satz, der ein tiefer Baum verschachtelter Phrasen isttreebank Korpus.
Beispiel
Um dies zu erreichen, definieren wir eine Funktion mit dem Namen tree_shallow() Dadurch werden alle verschachtelten Teilbäume entfernt, indem nur die obersten Teilbaumbezeichnungen beibehalten werden.
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)
Rufen wir jetzt an tree_shallow()Funktion auf 3 rd analysiert Satz, der tief Baum verschachtelter Sätze ist, aus demtreebankKorpus. Wir haben diese Funktionen in einer Datei namens flattree.py gespeichert.
from shallowtree import shallow_tree
from nltk.corpus import treebank
tree_shallow(treebank.parsed_sents()[2])
Ausgabe
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')]), ('.', '.')])
Wir können den Unterschied anhand der Höhe der Bäume erkennen -
from nltk.corpus import treebank
tree_shallow(treebank.parsed_sents()[2]).height()
Ausgabe
3
from nltk.corpus import treebank
treebank.parsed_sents()[2].height()
Ausgabe
9
Konvertierung von Baumbeschriftungen
In Analysebäumen gibt es eine Vielzahl von TreeEtikettentypen, die in Brockenbäumen nicht vorhanden sind. Bei der Verwendung des Analysebaums zum Trainieren eines Chunkers möchten wir diese Vielfalt verringern, indem wir einige Baumbeschriftungen in häufigere Beschriftungstypen konvertieren. Zum Beispiel haben wir zwei alternative NP-Teilbäume, nämlich NP-SBL und NP-TMP. Wir können beide in NP umwandeln. Lassen Sie uns im folgenden Beispiel sehen, wie es geht.
Beispiel
Um dies zu erreichen, definieren wir eine Funktion namens tree_convert() Das erfordert die folgenden zwei Argumente:
- Baum zum Konvertieren
- Ein Label Conversion Mapping
Diese Funktion gibt einen neuen Baum zurück, in dem alle übereinstimmenden Beschriftungen basierend auf den Werten in der Zuordnung ersetzt werden.
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)
Rufen wir jetzt an tree_convert() Funktion auf dem 3. analysierten Satz, der ein tiefer Baum verschachtelter Phrasen ist, aus dem treebankKorpus. Wir haben diese Funktionen in einer Datei mit dem Namen gespeichertconverttree.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)
Ausgabe
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('.', ['.'])])