WalentyXML.py 8.18 KB
#! /usr/bin/python
# -*- coding: utf-8 -*-

from xml.sax import handler
from importer.Entry import Entry

examples_out_file = 'examples_ambig.txt'
misconnected_examples_out_file = 'examples_to_reattach.txt'


class XMLNode:
    
    def __init__(self, name, attrs, parent):
        self._name = name
        self._attrs = attrs
        self._children = []
        self._parent = parent
        self._content = ""

    def addChild(self, child):
        self._children.append(child)

    def setContent(self, content):
        self._content = content

    def __str__(self):
        att = list(zip(self._attrs.keys(), self._attrs.values()))
        return self._name + '[' + str(att) + '](' + ';'.join([str(temp) for temp in self._children]) + ')'
        
    
class WalentyTeiHandler(handler.ContentHandler):

    def __init__(self, entry_meanings, meanings, frames):
        handler.ContentHandler.__init__(self)
        self._subtree = None
        self._current = None
        self._constructing = False
        self._content = ""
        self._entry_meanings = entry_meanings
        self._meanings = meanings
        self._frames = frames
        self._stored_positions = {}
        self._examples_in = None # @TODO: read disambiguated file
        self._examples_out = open(examples_out_file, "w")
        self._misconnected_out = open(misconnected_examples_out_file, "w")
        
    def startElement(self, name, attrs):
        if name == 'date':
            #self.printMeta(attrs['when'])
            pass
        if name == 'entry':
            self._constructing = True
            self._content = ""
        if (self._constructing):
            node = XMLNode(name, attrs, self._current)
            if self._current is not None:
                self._current.addChild(node)
            else:
                self._subtree = node
            self._current = node


    def endElement(self, name):
        if self._current is not None:
            self._current.setContent(self._content.strip())
            self._current = self._current._parent
            if name == 'entry':
                if self._current is not None:
                    raise TEIStructureError()
                base = self._subtree._children[0]._children[0]._content
                # TODO sprawdzić i poprawić te hasła
                if base not in (
                    'analogiczny', # compar(jak) bez kontroli
                    'charakterystyka', # błąd – kontrola nie od pary
                    'degradacja', # np(gen) + compar(jako) – brakuje kontroli?
                    'dozwalać', 'dozwolić', # w alternacji występuje tylko controllee – błąd czy uwzględniać? (***)
                    'eksploatacja', # xp(abl) + xp(locat) – to chyba jest przesadna fiksacja na koordynacji
                    'fenomen', # np(gen) + compar(jako) – brakuje kontroli?
                    'gnać', # błąd – brak controllera
                    'kompromitacja', # possp + compar(jako) – brakuje kontroli?
                    'metafora', # possp + np(gen) + compar(jako) – brakuje kontroli?
                    'mianować', # dwa pred_controllee, bez controllera – błąd
                    'niewiarygodny', # compar(jako) bez kontroli
                    'obligować', # (***)
                    'odetkać', # w XML-u 20200626 jest dziwna alternacja, chyba błąd
                    #'pieprzyć', # brakuje [co] w modyfikacjach cp(rel[co])
                    'pochwała', # np(gen) + compar(jako) – brakuje kontroli?
                    'podziw', # prepnp(dla,gen) + compar(jako) – brakuje kontroli?
                    #'pognać', # brakuje [co] w modyfikacjach cp(rel[co])
                    'polecać', 'popłacać',  # (***)
                    'porozjeżdżać', # błąd – kontrola nie od pary
                    'powychodzić', # błąd – kontrola nie od pary
                    'praktyka', # possp + compar(jako) – brakuje kontroli?
                    'predestynować', # dziwna alternacja + dlaczego akurat np jest Foreground, a ncp Background?
                    'proklamacja', # np(gen) + compar(jako) – brakuje kontroli?
                    'przestać', 'przestawać',  # (***)
                    'rejestracja', # np(gen) + compar(jako) – brakuje kontroli?
                    'reklama', # np(gen) + compar(jako) – brakuje kontroli?
                    'reprezentacja', # np(gen) + compar(jako) – brakuje kontroli?
                    'rewelacja', # prepncp(o,loc,rel) – powinno być int?
                    'rola', # possp + compar(jako) – brakuje kontroli?
                    'rozpoznawalność', # np(gen) + compar(jako) – brakuje kontroli?
                    'spodziewać', # prędzej + śmierci + compar(niż) – brakuje kontroli?
                    'sprzymierzyć', # imperf – błąd?
                    'staż', # possp + compar(jako) – brakuje kontroli?
                    'stygmatyzacja', # np(gen) + compar(jako) – brakuje kontroli?
                    'trząść', # np(str) + compar(jak) – brakuje kontroli?
                    'uczestnictwo', # possp + compar(jako) – brakuje kontroli?
                    #'umilknąć', # brakuje [jakby] w modyfikacjach cp(rel[co])
                    'ustalać', # błąd – kontrola nie od pary
                    'uważać', # podwójna kontrola – TODO, ale też patrz notatki
                    'uwielbiać', # (***)
                    'uznać', 'uznawać', # podwójna kontrola – TODO, ale też patrz notatki
                    'walor', # possp + compar(jako) – brakuje kontroli?
                    'wczołgiwać', # TODO, ale też patrz notatki
                    'wegetacja', # possp + compar(jako) – brakuje kontroli?
                    'weryfikacja', # np(gen) + compar(jako) – brakuje kontroli?
                    'woleć', # cp(gdy) + compar(niż) – brakuje kontroli?
                    'współbrzmieć', # dziwna alternacja + dlaczego akurat np jest Foreground, a ncp Background?
                    'wybawiać', 'wybawić', # dziwne przypisanie argumentów do fraz w alternacji z koordynacją
                    'wykaligrafować', # w XML-u 20200626 jest przedziwna alternacja
                    'wypruwać', # dziwne schematy z dwiema pozycjami „flaki” i „(jakieś) flaki”
                    'zależeć', # xp(mod[comprepnp(na sposób);advp(mod);lex(prepnp(w,acc),sg,'sposób',atr({adjp(agr)}))]) – dziwna pozycja
                    'zapowiedź', # np(gen) + compar(jako) – brakuje kontroli?
                    'zastygać', 'zastygnąć', # brakuje kontroli?
                    'zatrząść', # np(str) + compar(jak) – brakuje kontroli?
                    'zdarzyć', # (***)
                    'zwać', # (***)
                    'dzwonić', #      – dwie lex(prepnp(w,loc))!
                    'kapać', #        – dwie lex(np(inst))!
                    'popukać', #      – dwie lex(prepnp(do,gen))!
                    'przeczyć', #     – dwie lex(np(dat))!
                    'pukać', #        – dwie lex(prepnp(do,gen))!
                    'regenerować', #  – dwie lex(np(str))!
                    'rosić', #        – dwie lex(np(inst))!
                    'spychać', #      – dwie lex(prepnp(na,acc))!
                    'szwankować', #   – dwie lex(prepnp(na,loc))!
                    'wypchać', #      – dwie lex(np(inst))!
                    'zapukać', #      – dwie lex(prepnp(do,gen))!
                    'zepchnąć', #     – dwie lex(prepnp(na,acc))!
                    'zrosić', #       – dwie lex(np(inst))!
                    ):
                    entry = Entry(self._subtree, self._entry_meanings, self._meanings, self._frames, self._examples_in, self._examples_out, self._misconnected_out)
                    entry.store(self._meanings, self._stored_positions)
            self._content = ''
        else:
            if name == 'title':
                pass
            elif name == 'publisher':
                pass
            elif name == 'licence':
                pass
            elif name == 'p':
                self._content += '\n% '

    def characters(self, content):
        self._content += content
        
    def endDocument(self):
        self._examples_out.close()
        self._misconnected_out.close()