Perangkat Bahasa Alami - Mengubah Pohon

Berikut adalah dua alasan untuk mengubah pohon -

  • Untuk memodifikasi pohon parse dalam dan
  • Untuk meratakan pohon parse yang dalam

Mengubah Pohon atau Subtree menjadi Kalimat

Resep pertama yang akan kita bahas di sini adalah mengubah Pohon atau subpohon kembali menjadi kalimat atau rangkaian potongan. Ini sangat sederhana, mari kita lihat pada contoh berikut -

Contoh

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

Keluaran

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

Perataan pohon dalam

Pohon dalam frase bersarang tidak dapat digunakan untuk melatih bongkahan sehingga kita harus meratakannya sebelum menggunakan. Dalam contoh berikut, kita akan menggunakan kalimat parsing ke-3, yang merupakan pohon dalam frase bersarang, daritreebank korpus.

Contoh

Untuk mencapai ini, kami mendefinisikan fungsi bernama deeptree_flat()yang akan mengambil satu Pohon dan akan mengembalikan Pohon baru yang hanya menyimpan pohon dengan tingkat terendah. Untuk melakukan sebagian besar pekerjaan, ini menggunakan fungsi helper yang kami namai sebagaichildtree_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]))

Sekarang, mari kita telepon deeptree_flat() fungsi pada kalimat parsing ke-3, yang merupakan pohon dalam dari frasa bersarang, dari treebankkorpus. Kami menyimpan fungsi ini dalam file bernama deeptree.py.

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

Keluaran

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

Membangun pohon dangkal

Di bagian sebelumnya, kita meratakan pohon dalam frase bersarang dengan hanya mempertahankan subpohon tingkat terendah. Pada bagian ini, kita akan mempertahankan hanya subpohon tingkat tertinggi yaitu untuk membangun pohon dangkal. Dalam contoh berikut kita akan menggunakan kalimat parsing ke-3, yang merupakan pohon dalam frase bersarang, daritreebank korpus.

Contoh

Untuk mencapai ini, kami mendefinisikan fungsi bernama tree_shallow() yang akan menghilangkan semua subpohon bertingkat dengan hanya mempertahankan label subpohon teratas.

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)

Sekarang, mari kita telepon tree_shallow()fungsi pada 3 rd diurai kalimat, yang merupakan pohon yang dalam frase bersarang, daritreebankkorpus. Kami menyimpan fungsi ini dalam file bernama shallowtree.py.

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

Keluaran

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

Kita dapat melihat perbedaannya dengan bantuan ketinggian pohon -

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

Keluaran

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

Keluaran

9

Konversi label pohon

Pada pohon parse ada berbagai macam Treejenis label yang tidak ada di pohon potongan. Tetapi saat menggunakan pohon parse untuk melatih pembuat chunker, kami ingin mengurangi variasi ini dengan mengubah beberapa label Pohon ke jenis label yang lebih umum. Sebagai contoh, kami memiliki dua subpohon NP alternatif yaitu NP-SBL dan NP-TMP. Kita bisa mengubah keduanya menjadi NP. Mari kita lihat bagaimana melakukannya dalam contoh berikut.

Contoh

Untuk mencapai ini kita mendefinisikan fungsi bernama tree_convert() yang membutuhkan dua argumen berikut -

  • Pohon untuk diubah
  • Pemetaan konversi label

Fungsi ini akan mengembalikan Pohon baru dengan semua label yang cocok diganti berdasarkan nilai dalam pemetaan.

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)

Sekarang, mari kita telepon tree_convert() fungsi pada kalimat parsing ke-3, yang merupakan pohon dalam dari frasa bersarang, dari treebankkorpus. Kami menyimpan fungsi ini dalam file bernamaconverttree.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)

Keluaran

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