Я нашел ответ, который работает на очень больших деревьях, на которых я его тестировал, хотя мне пришлось учитывать элемент <ord>
- обозначающий порядок слова в предложении - чтобы устранить проблему, которая может возникнутьв случае таких предложений, как: «Мужчина и женщина, идущие днем и ночью».
walking
/ \
and and
/ \ / \
man woman day night
Только учет <t_lemma>
приведет к неясной интерпретации функции (child->parent)
,то есть: у нас было бы два и s, к которым ведут слова: мужчина, женщина, день, ночь все это так:
element parent
_______________
man and
woman and
day and
night and
and walking
and walking
Это перевернуло предыдущую таблицув следующее:
element parent
_______________
man:1 and:2
woman:3 and:2
day:5 and:6
night:7 and:6
and:2 walking:4
and:6 walking:4
Итак, вот функциональный код Python:
parentDictionary = {}
def getchildlemma(element, parent):
for i in element.findall("*"):
if i.tag == "t_lemma":
e = i.text
for i in element.findall("*"):
if i.tag == "ord":
e = e +":"+ i.text
parentDictionary[e] = parent
parent = e
else:
e = parent
for i in element.findall("*"):
if i.tag == "children" or i.tag == "LM":
getchildlemma(i,parent)