Ходить по синтаксическому дереву рекурсивно - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть предложение, синтаксически проанализированное .Например, «Моя мама хочет готовить».Разбор [('Мой', 1), ('мама', 2), ('хочет', -1), ('к', 2), ('повар', 3)] ,Числа означают индексы предметов, от которых зависят слова: «мама» зависит от «хочет», а «хочет» - это второй элемент массива (как обычно, с нуля).У 'Wants' есть '-1', потому что это ядро ​​предложения, оно не зависит ни от чего другого. Мне нужно ПОЛУЧИТЬ СУБЪЕКТ, который здесь называется «моя мама». Как я могу это сделать?

На данный момент я пробовал писать только циклы, которые работаютне в каждом случае.Дело в том, что предмет может состоять из более чем 2 слов, и это число не определено.Примерно так ...

«Значения» - это [(«Мой», 1), («Мама», 2), («хочет», -1), («к», 2),('cook', 3)]

for indx, value in enumerate(values):
    m = morph.parse(value[0])
    if isinstance(m, list):
        m = m[0]
    if 'NOUN' in m.tag:
        if value[1] == str(index[0]): #it checks if the word (part of the subject) depends on the verb
            terms.append([value[0], indx])

if len(terms) > 0:
    term = terms[0][0]
    t = []
    for indx, value in enumerate(values):
        if value[1] == str(terms[0][1]): #it checks if the word depend on the found part of the subject
            m = morph.parse(value[0])
            if isinstance(m, list):
                m = m[0]
            if 'NOUN' in m.tag:
                t.append([value[0], terms[0][0]])

Алгоритм должен работать следующим образом: обходит весь массив и останавливается, когда находит все зависимости данного слова и все зависимостииз этих зависимостей .(В примере все зависимости 'мама').Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Извините, что я так долго возвращался к вам.
Я наконец понял это.Код внизу, но я объясню, как он работает первым:

, когда вызывается parse(values), он перебирает предложение в значениях и вызывает рекурсив getDepth для каждого слова.`` `getDepth`` вычисляет, сколько словесных отношений существует между данным словом и глаголом.
Например, для "The" глубина равна 1, потому что он напрямую вызывает глагол.
для «короля» это 2, потому что «король» вызывает «The» и «The» вызывает глагол ( где call = имеет указатель, который указывает на определенное слово )


Как только все глубины вычислены, parse находит слово с наибольшей глубиной ("Франция") и использует рекурсивный traceFrom(), чтобы связать вместе предмет.


Все, что вас действительно волнует, это parse(), который принимает предварительно обработанную строку вроде [('My', 1), ('mom', 2), ('want', -1), ('to', 2), ('cook', 3)] и выплевывает весь предмет. Работает для обоих примеров, но вы должны проверить еще.

values = [('The', 4), ('King', 0), ('of', 1), ('France', 2), ('died', -1)]

#values = [('My', 1), ('mom', 2), ('wants', -1), ('to', 2), ('cook', 3)]

def getDepth(i, s, n = 0):
    print('D is %d' % n)
    if s[i][1] == -1:
        return n
    else:
        return getDepth(s[i][1], s, n+1)

def traceFrom(m, s, dt=[]):
    print('Got n:%d, s:' % m, s)
    if s[m][1] == -1:
        d = []
        n = 0
        for i in range(len(s)):
            if i in dt:
                d.append(s[i][0])
        return " ".join(d)
    else:
        dt.append(m)
        return traceFrom(s[m][1], s, dt)


def parse(sentence):
    d = []
    for i in range(len(sentence)):
        d.append(getDepth(i, sentence))
    m = d.index(max(d))
    print('Largest is ' , d[m], ' of ', d)
    return traceFrom(m, sentence)
print('Subject :', parse(values))
0 голосов
/ 28 сентября 2019

Учитывая ваш предварительно обработанный массив, это довольно просто:

values = [('My', 1), ('mom', 2), ('wants', -1), ('to', 2), ('cook', 3)]


def parseFrom(n, data):
        if values[n][1] != -1:
                #print('Stepping (%s,%d)' % (values[n][0], values[n][1]))
                data.append(values[n][0])
                return parseFrom(values[n][1], data)
        else:
                #print('At verb')
                return data

subject = ' '.join(parseFrom(0, []))

print('Sentence has subject:', subject)

Функция является рекурсивной, если текущее слово не является глаголом, в противном случае возвращает субъект в виде массива. Извините, если это не работает на всех предложениях

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...