Bộ công cụ ngôn ngữ tự nhiên - Cây biến đổi

Sau đây là hai lý do để biến đổi cây -

  • Để sửa đổi cây phân tích cú pháp sâu và
  • Để làm phẳng cây phân tích cú pháp sâu

Chuyển đổi cây hoặc cây con thành câu

Công thức đầu tiên chúng ta sẽ thảo luận ở đây là chuyển đổi một Cây hoặc cây con trở lại thành một câu hoặc chuỗi phân đoạn. Điều này rất đơn giản, chúng ta hãy xem trong ví dụ sau:

Thí dụ

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

Đầu ra

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

Cây sâu san phẳng

Cây sâu của các cụm từ lồng nhau không thể được sử dụng để đào tạo một đoạn, do đó chúng ta phải làm phẳng chúng trước khi sử dụng. Trong ví dụ sau, chúng ta sẽ sử dụng câu được phân tích cú pháp thứ 3, là cây sâu của các cụm từ lồng nhau, từtreebank ngữ liệu.

Thí dụ

Để đạt được điều này, chúng tôi đang xác định một hàm có tên deeptree_flat()sẽ lấy một Cây duy nhất và sẽ trả về một Cây mới chỉ giữ lại những cây cấp thấp nhất. Để thực hiện hầu hết công việc, nó sử dụng một chức năng trợ giúp mà chúng tôi đặt tên là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]))

Bây giờ, hãy để chúng tôi gọi deeptree_flat() hàm trên câu được phân tích cú pháp thứ 3, là cây sâu của các cụm từ lồng vào nhau, từ treebankngữ liệu. Chúng tôi đã lưu các chức năng này trong một tệp có tên deeptree.py.

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

Đầu ra

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

Xây dựng cây nông

Trong phần trước, chúng ta làm phẳng một cây sâu gồm các cụm từ lồng nhau bằng cách chỉ giữ lại các cây con cấp thấp nhất. Trong phần này, chúng ta sẽ chỉ giữ lại các cây con cấp cao nhất, tức là để xây dựng cây nông. Trong ví dụ sau, chúng ta sẽ sử dụng câu được phân tích cú pháp thứ 3, là cây sâu của các cụm từ lồng nhau, từtreebank ngữ liệu.

Thí dụ

Để đạt được điều này, chúng tôi đang xác định một hàm có tên tree_shallow() điều đó sẽ loại bỏ tất cả các cây con lồng nhau bằng cách chỉ giữ lại các nhãn của cây con trên cùng.

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)

Bây giờ, hãy để chúng tôi gọi tree_shallow()chức năng trên câu được phân tích cú pháp thứ 3 , là cây sâu của các cụm từ lồng nhau, từtreebankngữ liệu. Chúng tôi đã lưu các hàm này trong một tệp có tên là nôngtree.py.

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

Đầu ra

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

Chúng ta có thể thấy sự khác biệt với sự trợ giúp của việc lấy chiều cao của cây -

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

Đầu ra

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

Đầu ra

9

Chuyển đổi nhãn cây

Trong cây phân tích cú pháp có nhiều loại Treeloại nhãn không có trong cây phân nhánh. Tuy nhiên, trong khi sử dụng cây phân tích để đào tạo một con chạch, chúng tôi muốn giảm sự đa dạng này bằng cách chuyển đổi một số nhãn Cây sang các loại nhãn phổ biến hơn. Ví dụ, chúng ta có hai cây con NP thay thế là NP-SBL và NP-TMP. Chúng ta có thể chuyển cả hai thành NP. Hãy để chúng tôi xem cách làm điều đó trong ví dụ sau.

Thí dụ

Để đạt được điều này, chúng tôi đang xác định một hàm có tên tree_convert() có hai đối số sau:

  • Cây để chuyển đổi
  • Ánh xạ chuyển đổi nhãn

Hàm này sẽ trả về một Cây mới với tất cả các nhãn phù hợp được thay thế dựa trên các giá trị trong ánh xạ.

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)

Bây giờ, hãy để chúng tôi gọi tree_convert() hàm trên câu được phân tích cú pháp thứ 3, là cây sâu của các cụm từ lồng vào nhau, từ treebankngữ liệu. Chúng tôi đã lưu các chức năng này trong một tệp có tênconverttree.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)

Đầu ra

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