Извините, что я так долго возвращался к вам.
Я наконец понял это.Код внизу, но я объясню, как он работает первым:
, когда вызывается 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))