2016-12-15 17 views
2

обрабатываю Penn дерево банка v2 деревьев и часто сталкиваются с «сервис» -subtrees как эти (и некоторые другие типы)Как избавиться от -NONE- и * T * -i в ptb синтаксических деревьев с использованием nltk?

enter image description here

можно вручную добавить много правил, чтобы уточнить узлы, которые я на самом деле использовать дальше (синтаксический анализ с тегами и токенами и без ссылок «oh, look there» или «там, должно быть, был узел здесь» - как и те, которые были получены парсером Stanford), но я чаще всего оставляю некоторые из этих служебных узлов или огромные промежутки и «обрезанные ветви» (например, если вы удалите те узлы -NONE- выше, вы оставите SBAR слева без каких-либо детей, что странно).

Интересно, могу ли я удалить все, кроме фактических анализов (слов, тегов, знаков препинания), из вывода from nltk.corpus import ptb; ptb.parsed_sents() и для всех?

ответ

1

Удалить любое поддерево, которое только доминирует над трассами. Далее я перебираю поддеревья, но на самом деле проверяю их детей; это упрощает удаление пустого поддерева путем изменения узла, который его содержит.

for sub in some_tree.subtrees(): 
    for n, child in enumerate(sub): 
     if isinstance(child, str): 
      continue 
     if all(leaf.startswith("*") for leaf in child.leaves()): 
      del sub[n] # Delete this child 

Я использовал leaf.startswith("*") как простой критерий для обнаружения следов. При необходимости замените его.

Edit: Так как вы хотите, чтобы удалить все узлы, содержащие только поддеревья меченых -NONE-, и каждое такое поддерево доминирует ровно один лист, используйте следующий тест:

if len(list(child.subtrees(filter=lambda x:x.label()=='-NONE-')))==len(child.leaves()): 
     del sub[n] 
+0

Что относительно '-NONE -' вещей? проблема в том, что я не знаю всех видов этих сервисных узлов; Я привел только конкретный пример: –

+0

Если ваш критерий для удаления состоит в том, чтобы удалить каждый узел «-NONE-» и каждый более высокий узел, который становится пустым в результате, вы должны соответствующим образом изменить критерий. Если этот тег всегда встречается с высотой 1, это довольно просто: удалите любое поддерево, которое доминирует над множеством узлов '-NONE-', поскольку оно имеет листья. – alexis

+0

Большое спасибо за конкретный ответ, @alexis! это очень полезно, но проблема, о которой я говорил, немного отличается; Мне было интересно, могу ли я избавиться от всего, кроме самого синтаксиса, не зная заранее, что такое «все остальное» :), потому что оказалось, что там есть куча этих следов и коиндексов, и если вы удалите их, другие останется. Это очень полезный фрагмент для начала, хотя! –

0

Благодаря @alexsis ответ ниже, теперь я знайте, что эти вещи называются следами и коиндексами. Я нашел следующее implementation из def ptb_delete_traces(tree) в пакете treetools.