Нужна помощь с деревьями и соответствием - PullRequest
2 голосов
/ 05 мая 2010

Я реализовал следующую структуру данных:

class Node(object):
    """Rules:
    A node's child is ONLY an iterable of nodes
    A leaf node must NOT have children and MUST have word
    """
    def __init__(self, tag, children=[], word=u""):
        assert isinstance(tag, unicode) and isinstance(word, unicode)
        self.tag=tag
        self.word=word
        self.parent=None                #Set by recursive function
        self.children=children          #Can only be iterable of nodes now
        for child in self.children:
            child.parent=self

    def matches(self, node):
        """Match RECURSIVELY down!"""
        if self.tag == node.tag:
            if all( map( lambda t:t[0].matches(t[1]), zip( self.children, node.children))):
                if self.word != WILDCARD and node.word != WILDCARD:
                    return self.word == node.word
                else:
                    return True
        return False

    def __unicode__(self):
        childrenU= u", ".join( map( unicode, self.children))
        return u"(%s, %s, %s)" % (self.tag, childrenU, self.word)

    def __str__(self):
        return unicode(self).encode('utf-8')

    def __repr__(self):
        return unicode(self)

Таким образом, дерево - это в основном связка этих узлов, соединенных вместе.

Я анализирую S-выражение, как это: (VP (VP (VC w1) (NP (CP (IP (NP (NN w2)) (VP (ADVP (AD w3)) (VP (VA w4)))) (DEC w5)) (NP (NN w6)))) (ADVP (AD w7)))

Так что мне интересно писать, сопоставляя поддерево с большим деревом. Суть в том, что в поддереве есть символы подстановки, и я хотел бы также иметь возможность сопоставлять эти символы.

Например: Если дано поддерево,

    (VP
      (ADVP (AD X))
      (VP (VA Y))))

Операция, которая «соответствует» им обоим, должна вернуть {X: W3, Y: W4}

Кто-нибудь может порекомендовать эффективное и простое решение?

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