Закодировать структуру деревьев разбора
Я работаю над набором данных классификации настроений Стэнфорда и пытаюсь понять эти два файла STree.txt и SOStr.txt, которые кодируют три разбора каждого предложения.
Как я могу декодировать, например, этот анализ три?
Effective|but|too-tepid|biopic
6|6|5|5|7|7|0
файл README говорит, что:
- SOStr.txt и STree.txt кодируют структуру деревьев разбора. STree кодирует деревья в формате родительского указателя. Каждая строка соответствует каждому предложению в файле datasetSentences.txt
есть парсер, который конвертирует предложение в этот формат? как я могу расшифровать этот анализ три?
я печатаю дерево постоянных участников предыдущего предложения с помощью этого скрипта на python:
with open( 'parents.txt') as parentsfile,\
open( 'sents.txt') as toksfile:
parents=[]
toks =[]
const_trees =[]
for line in parentsfile:
parents.append(map(int, line.split()))
for line in toksfile:
toks.append(line.strip().split())
for i in xrange(len(toks)):
const_trees.append(load_constituency_tree(parents[i], toks[i]))
#print (const_trees[i].left.word)
attrs = vars(const_trees[i])
print ', '.join("%s: %s" % item for item in attrs.items())
attrs = vars(const_trees[i].right)
print ', '.join("%s: %s" % item for item in attrs.items())
attrs = vars(const_trees[i].left)
print ', '.join("%s: %s" % item for item in attrs.items())
attrs = vars(const_trees[i].right.right)
print ', '.join("%s: %s" % item for item in attrs.items())
attrs = vars(const_trees[i].right.left)
print ', '.join("%s: %s" % item for item in attrs.items())
attrs = vars(const_trees[i].left.left)
print ', '.join("%s: %s" % item for item in attrs.items())
attrs = vars(const_trees[i].left.right)
print ', '.join("%s: %s" % item for item in attrs.items())
break
и я понимаю, что дерево для первого предложения следующее:
6
|
+-------------+------------+
| |
5 4
+---------+---------+ +---------+---------+
| | | |
Effective but too-tepid biopic
Как описано в этом посте, нетерминальные являются типами фраз, но в этом представлении дерева это индексы, может быть, словарь типов фраз, мой вопрос: где этот словарь? Как я могу преобразовать это INT в типах фраз?
Мое решение: я не уверен, что это решение, но я записываю эту функцию для convet nltk PTree в соответствующий список родительских указателей:
# given the array returned by ptree.trepositions('postorder') of the nltk library i.e
# an array of tuple like this:
# [(0, 0), (0,), (1, 0, 0), (1, 0), (1, 1, 0), (1, 1, 1), (1, 1), (1,), ()]
# that describe the structure of a tree where each index of the array is the index of a node in the tree in a postorder fashion
# return a list of parents for each node i.e [2, 9, 4, 8, 7, 7, 8, 9, 0] where 0 means that is the root.
# the previous array describe the structure for this tree
# S
# ___________|___
# | VP
# | _________|___
# NP V NP
# | | ___|____
# I enjoyed my cookie
def make_parents_list(treepositions):
parents = []
for i in range(0,len(treepositions)):
if len(treepositions[i])==0:
parent = 0
parents.append(parent)
if len(treepositions[i])>0:
parent_s = [j+1 for j in range(0,len(treepositions)) if ((j > i) and (len(treepositions[j]) == (len(treepositions[i])-1))) ]
#print parent_s[0]
parents.append(parent_s[0])
return parents