common.py 2.25 KB
'''
Created on Nov 7, 2013

@author: mlenart
'''

import codecs

class Lemma(object):
    
    def __init__(self, cutLength, suffixToAdd):
        self.cutLength = cutLength
        self.suffixToAdd = suffixToAdd

class Interpretation(object):
    
    def __init__(self, orth, base, tagnum, namenum, encoder):
        assert type(orth) == unicode
        assert type(base) == unicode
        root = u''
        for o, b in zip(orth, base):
            if o == b:
                root += o
            else:
                break
        cutLength = len(encoder.encodeWord(orth)) - len(encoder.encodeWord(root))
        self.lemma = Lemma(
                           cutLength=cutLength,
                           suffixToAdd=encoder.encodeWord(base[len(root):], lowercase=False))
        self.tagnum = tagnum
        self.namenum = namenum
    
    def getSortKey(self):
        return (self.lemma.cutLength, tuple(self.lemma.suffixToAdd), self.tagnum, self.namenum)
    
    def __eq__(self, other):
        if isinstance(other, Interpretation):
            return self.getSortKey() == other.getSortKey()
        else:
            return False
    
    def __hash__(self):
        return hash(self.getSortKey())

class Tagset(object):
    
    TAGS = 1
    NAMES = 2
    SEP = '\t'
    
    def __init__(self, filename, encoding='utf8'):
        self.tag2tagnum = {}
        self.name2namenum = {}
        self._doInit(filename, encoding)
        print self.tag2tagnum
        print self.name2namenum
    
    def _doInit(self, filename, encoding):
        addingTo = None
        with codecs.open(filename, 'r', encoding) as f:
            for line in f:
                line = line.strip('\n')
                if line == u'[TAGS]':
                    addingTo = Tagset.TAGS
                elif line == u'[NAMES]':
                    addingTo = Tagset.NAMES
                elif line and not line.startswith(u'#'):
                    assert addingTo in [Tagset.TAGS, Tagset.NAMES]
                    res = {Tagset.TAGS: self.tag2tagnum,
                           Tagset.NAMES: self.name2namenum}[addingTo]
                    tagNum = line.split(Tagset.SEP)[0]
                    tag = line.split(Tagset.SEP)[1]
                    assert tag not in res
                    res[tag] = int(tagNum)