Преобразование чистого дерева NLTK в структуру чанкера NLTK

Я новичок в python и борюсь с концепцией типов данных и их преобразованиями.

У меня есть предложения в формате дерева NLTK (полученные из синтаксического анализатора Стэнфорда и преобразованные в дерево NLTK). Мне нужно применить функции, написанные для NLTK Chunker. Однако формат дерева NLTK отличается от формата чанкера NLTK. Оба формата являются деревьями NLTK, но структура элементов кажется разной (см. ниже).

Не могли бы вы помочь мне преобразовать дерево NLTK в выходной формат NLTK Chunker?

Заранее спасибо!

Вот выходные данные чанкера NLTK:

(S
  (NP Pierre/NNP Vinken/NNP)
  ,/,
  (NP 61/CD years/NNS old/JJ)
  ,/,
  will/MD
  join/VB
  (NP the/DT board/NN)
  as/IN
  (NP a/DT nonexecutive/JJ director/NN Nov./NNP 29/CD)
  ./.)

Теперь печатается по элементу и каждому типу элемента:

class 'nltk.tree.Tree' (NP Pierre/NNP Vinken/NNP)
type 'tuple' (',', ',')
class 'nltk.tree.Tree' (NP 61/CD years/NNS old/JJ)
type 'tuple' (',', ',')
type 'tuple' ('will', 'MD')
type 'tuple' ('join', 'VB')
class 'nltk.tree.Tree' (NP the/DT board/NN)
type 'tuple' ('as', 'IN')
class 'nltk.tree.Tree' (NP a/DT nonexecutive/JJ director/NN Nov./NNP 29/CD)
type 'tuple' ('.', '.')

Вот "чистый" вывод дерева NLTK (в точности как в документе NLTK):

(S
  (NP
    (NP (NNP Pierre) (NNP Vinken))
    (, ,)
    (ADJP (NP (CD 61) (NNS years)) (JJ old))
    (, ,))
  (VP
    (MD will)
    (VP
      (VB join)
      (NP (DT the) (NN board))
      (PP (IN as) (NP (DT a) (JJ nonexecutive) (NN director) (NNP Nov.) (CD 29)))
      ))
  (. .))

Теперь печатается по элементу и каждому типу элемента:

class 'nltk.tree.Tree' (NP
  (NP (NNP Pierre) (NNP Vinken))
  (, ,)
  (ADJP (NP (CD 61) (NNS years)) (JJ old))
  (, ,))
class 'nltk.tree.Tree' (NP (NNP Pierre) (NNP Vinken))
class 'nltk.tree.Tree' (NNP Pierre)
type 'str' Pierre
class 'nltk.tree.Tree' (NNP Vinken)
type 'str' Vinken
class 'nltk.tree.Tree' (, ,)
type 'str' ,
class 'nltk.tree.Tree' (ADJP (NP (CD 61) (NNS years)) (JJ old))
class 'nltk.tree.Tree' (NP (CD 61) (NNS years))
class 'nltk.tree.Tree' (CD 61)
type 'str' 61
class 'nltk.tree.Tree' (NNS years)
type 'str' years
class 'nltk.tree.Tree' (JJ old)
type 'str' old
class 'nltk.tree.Tree' (, ,)
type 'str' ,
class 'nltk.tree.Tree' (VP
  (MD will)
  (VP
    (VB join)
    (NP (DT the) (NN board))
    (PP (IN as) (NP (DT a) (JJ nonexecutive) (NN director)))
    (NP (NNP Nov.) (CD 29))))
class 'nltk.tree.Tree' (MD will)
type 'str' will
class 'nltk.tree.Tree' (VP
  (VB join)
  (NP (DT the) (NN board))
  (PP (IN as) (NP (DT a) (JJ nonexecutive) (NN director)))
  (NP (NNP Nov.) (CD 29)))
class 'nltk.tree.Tree' (VB join)
type 'str' join
class 'nltk.tree.Tree' (NP (DT the) (NN board))
class 'nltk.tree.Tree' (DT the)
type 'str' the
class 'nltk.tree.Tree' (NN board)
type 'str' board
class 'nltk.tree.Tree' (PP (IN as) (NP (DT a) (JJ nonexecutive) (NN director)))
class 'nltk.tree.Tree' (IN as)
type 'str' as
class 'nltk.tree.Tree' (NP (DT a) (JJ nonexecutive) (NN director))
class 'nltk.tree.Tree' (DT a)
type 'str' a
class 'nltk.tree.Tree' (JJ nonexecutive)
type 'str' nonexecutive
class 'nltk.tree.Tree' (NN director)
type 'str' director
class 'nltk.tree.Tree' (NP (NNP Nov.) (CD 29))
class 'nltk.tree.Tree' (NNP Nov.)
type 'str' Nov.
class 'nltk.tree.Tree' (CD 29)
type 'str' 29
class 'nltk.tree.Tree' (. .)
type 'str' .

person uzla    schedule 29.12.2013    source источник
comment
добро пожаловать в Stackoverflow, я отредактировал ваш пост, потому что комментарии в кавычках на самом деле сбивают с толку возможный ответ, потому что он выглядит так, как будто это часть кода.   -  person alvas    schedule 30.12.2013
comment
как вы получили вывод чанкера NLTK? какой код генерирует этот вывод?   -  person alvas    schedule 30.12.2013
comment
Это просто стандартный рекурсивный обход дерева: `def trav(tree): for tree_el in tree: print str(type(tree_el)), print tree_el if isinstance(tree_el, nltk.tree.Tree): trav(tree_el)   -  person uzla    schedule 30.12.2013
comment
можете ли вы добавить ссылку на то, как вы получаете формат второго дерева именно из документов NLTK?   -  person alvas    schedule 30.12.2013
comment
Это просто: создайте экземпляр класса nltk.Tree и передайте ему соответственно размеченное предложение: tree = nltk.Tree(sent), а затем print tree. Само предложение строится пользовательской функцией из вывода синтаксического анализатора Стэнфорда. Это слишком длинно и неуместно, чтобы сбрасывать это здесь. Дело в том, что вывод точно соответствует требованиям документации nltk.   -  person uzla    schedule 30.12.2013


Ответы (1)


Частичный ответ (т. е. без кода):

NLTK представляет фрагментированные данные с использованием класса Tree, который действительно предназначен для произвольных синтаксических деревьев. Фрагментированное предложение — это дерево только с одним уровнем группировки, поэтому, чтобы перейти от полного синтаксического анализа к фрагментированной структуре, вам нужно отбросить все виды нерекурсивных групп, кроме одного. Какие группы? Это зависит от вашего приложения, поскольку существуют разные виды "кусков" (например, именованные сущности).

В вашем примере показаны фрагменты NP, поэтому вы можете пройтись по дереву и опустить всю структуру, кроме верхнего уровня NP (или самого низкого уровня, если вы хотите разбить сложные фрагменты NP на более мелкие).

person alexis    schedule 28.06.2014