自然言語ツールキット-ツリーの変換

以下は、ツリーを変換する2つの理由です-

  • ディープ解析ツリーを変更するには
  • 深い解析木を平坦化するには

ツリーまたはサブツリーを文に変換する

ここで説明する最初のレシピは、ツリーまたはサブツリーを文またはチャンク文字列に変換することです。これは非常に簡単です。次の例で見てみましょう-

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 .'

深い木の平坦化

ネストされたフレーズの深いツリーはチャンクのトレーニングには使用できないため、使用する前にそれらをフラット化する必要があります。次の例では、ネストされたフレーズの深いツリーである3番目の解析された文を使用します。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')]), ('.', '.')])

浅い木の構築

前のセクションでは、最下位レベルのサブツリーのみを保持することにより、ネストされたフレーズの深いツリーをフラット化しました。このセクションでは、最上位のサブツリーのみを保持します。つまり、浅いツリーを構築します。次の例では、ネストされたフレーズの深いツリーである3番目の解析された文を使用します。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チャンクツリーに存在しないラベルタイプ。ただし、解析ツリーを使用してチャンカーをトレーニングする際に、ツリーラベルの一部をより一般的なラベルタイプに変換することで、この種類を減らしたいと考えています。たとえば、2つの代替NPサブツリー、つまりNP-SBLとNP-TMPがあります。両方をNPに変換できます。次の例でそれを行う方法を見てみましょう。

これを実現するために、次の名前の関数を定義しています。 tree_convert() 次の2つの引数を取る-

  • 変換するツリー
  • ラベル変換マッピング

この関数は、マッピングの値に基づいて一致するすべてのラベルが置き換えられた新しいツリーを返します。

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