Example #1
0
 def decompose(self, pattern, gloss):
     'Pattern, Gloss -> Maybe([Gloss])'
     try:
         parts = len(pattern.select.morphemes)
     except (TypeError):
         #FIXME: morphemes=None case. Print some error message?
         parts = 0
     result = []
     if  parts < 2:
         return self.parse(pattern, gloss)
     else:
         if gloss.morphemes:
             #FIXME: use only first non-glossed morpheme as possible stem
             stemgloss, stempos = [(m,pos) for pos,m in enumerate(gloss.morphemes) if not m.gloss][0]
         else:
             stemgloss = gloss
             stempos = -1
         if stemgloss.psmatch(pattern.select):
             stem = stemgloss.form
             if '-' in stem:
                 sparts = stem.split('-')
                 if len(sparts) == parts:
                     decomp = [[emptyGloss._replace(form=f) for f in stem.split('-')]]
                 else:
                     return None
             elif ('mrph',) in [m.ps for m in pattern.select.morphemes]:
                 for m in pattern.select.morphemes:
                     if 'mrph' in m.ps:
                         splitre = u'({})'.format(m.form)
                         decomp = [[emptyGloss._replace(form=f) for f in re.split(splitre, stem)]]
                         break
             else:
                 decomp = [[emptyGloss._replace(form=f) for f in fl] for fl in parse_composite(stem, self.dictionary, parts)]
             if decomp:
                 morphmatches = [tuple(m.matches(p) for m,p in zip(gl, pattern.select.morphemes)) for gl in decomp]
                 newmorphemes = [tuple(m.union(p) for m,p in zip(gl, pattern.select.morphemes)) for gl in decomp]
                 for matches,morphlist in zip(morphmatches,newmorphemes):
                     if all(matches) and all(morphlist):
                         if stempos < 0:
                             newgloss = gloss._replace(morphemes=morphlist)
                         else:
                             mlist = list(gloss.morphemes)
                             mlist[stempos:stempos+1] = list(morphlist)
                             newgloss = gloss._replace(morphemes=tuple(mlist))
                         ng = pattern.apply(newgloss)
                         if ng:
                             for g in self.lookup(ng):
                                 if g and parsed(g):
                                     result.extend([g])
                 return result or None
     return None
Example #2
0
 def lookup_gloss(self, gloss, gdict):
     "Gloss, Dictionary -> tuple(Gloss)"
     lookup_form = None
     try:
         if self.detone:
             bare = detone(gloss.form)
             if bare in gdict:
                 lookup_form = bare
         else:
             if gloss.form in gdict:
                 lookup_form = gloss.form
             else:
                 bare = detone(gloss.form)
                 if not gloss.form == bare and bare in gdict:
                     lookup_form = bare
         if lookup_form:
             pattern = emptyGloss._replace(ps=gloss.ps, gloss=gloss.gloss)
             return tuple([dgloss for dgloss in gdict[lookup_form] if dgloss.matches(pattern)])
         else:
             return ()
     except (KeyError, AttributeError):
         if gloss.form in gdict:
             print "PP", gloss.form, gdict[gloss.form]
         else:
             print "PN", gloss.form
         return ()
Example #3
0
 def lookup_gloss(self, gloss, gdict):
     'Gloss, Dictionary -> tuple(Gloss)'
     lookup_form = None
     parts = None
     try:
         if self.detone:
             bare = detone(gloss.form) 
             if bare in gdict:
                 lookup_form = bare
         else:
             if gloss.form in gdict:
                 lookup_form = gloss.form
             elif '-' in gloss.form:
                 parts = gloss.form.split('-')
                 lookup_form = ''.join(parts)
             else:
                 bare = detone(gloss.form)
                 if not gloss.form == bare and bare in gdict:
                     lookup_form = bare
         if lookup_form:
             pattern = emptyGloss._replace(ps=gloss.ps, gloss=gloss.gloss)
             if parts:
                 out = []
                 for dgloss in gdict[lookup_form]:
                     if dgloss.matches(pattern) and len(dgloss.morphemes) == len(parts) and tones_match(gloss.form, dgloss.form):
                         out.append(dgloss)
                 return tuple(out)
             else:
                 return tuple([dgloss for dgloss in gdict[lookup_form] if dgloss.matches(pattern) and tones_match(gloss.form, dgloss.form)])
         else:
             return ()
     except (KeyError,AttributeError):
         if gloss.form in gdict:
             print 'PP', gloss.form, gdict[gloss.form]
         return ()
Example #4
0
 def lookup_gloss(self, gloss, gdict):
     'Gloss, Dictionary -> tuple(Gloss)'
     lookup_form = None
     parts = None
     try:
         if self.detone:
             bare = detone(gloss.form)
             if bare in gdict:
                 lookup_form = bare
         else:
             if gloss.form in gdict:
                 lookup_form = gloss.form
             elif '-' in gloss.form:
                 parts = gloss.form.split('-')
                 lookup_form = ''.join(parts)
             else:
                 bare = detone(gloss.form)
                 if not gloss.form == bare and bare in gdict:
                     lookup_form = bare
         if lookup_form:
             pattern = emptyGloss._replace(ps=gloss.ps, gloss=gloss.gloss)
             if parts:
                 out = []
                 for dgloss in gdict[lookup_form]:
                     if dgloss.matches(pattern) and len(
                             dgloss.morphemes) == len(parts):
                         out.append(dgloss)
                 return tuple(out)
             else:
                 return tuple([
                     dgloss for dgloss in gdict[lookup_form]
                     if dgloss.matches(pattern)
                 ])
         else:
             return ()
     except (KeyError, AttributeError):
         if gloss.form in gdict:
             print 'PP', gloss.form, gdict[gloss.form]
         return ()
Example #5
0
    def decompose(self, pattern, gloss):
        "Pattern, Gloss -> Maybe([Gloss])"
        try:
            parts = len(pattern.select.morphemes)
        except (TypeError):
            # FIXME: morphemes=None case. Print some error message?
            pass
        result = []
        if parts < 2:
            return self.parse(pattern, gloss)
        else:
            if gloss.morphemes:
                # FIXME: use only first non-glossed morpheme as possible stem
                stemgloss, stempos = [(m, pos) for pos, m in enumerate(gloss.morphemes) if not m.gloss][0]
            else:
                stemgloss = gloss
                stempos = -1
            if stemgloss.psmatch(pattern.select):
                stem = stemgloss.form

                decomp = [
                    [emptyGloss._replace(form=f) for f in fl] for fl in parse_composite(stem, self.dictionary, parts)
                ]
                if decomp:
                    newmorphemes = [tuple(m.union(p) for m, p in zip(gl, pattern.select.morphemes)) for gl in decomp]
                    for morphlist in newmorphemes:
                        if all(morphlist):
                            if stempos < 0:
                                newgloss = gloss._replace(morphemes=morphlist)
                            else:
                                mlist = list(gloss.morphemes)
                                mlist[stempos : stempos + 1] = list(morphlist)
                                newgloss = gloss._replace(morphemes=tuple(mlist))
                            result.extend(
                                filter(operator.truth, [pattern.apply(g) for g in self.lookup(newgloss) if parsed(g)])
                            )
                    return result or None
        return None
Example #6
0
 def decompose(self, pattern, gloss):
     'Pattern, Gloss -> Maybe([Gloss])'
     try:
         parts = len(pattern.select.morphemes)
     except (TypeError):
         #FIXME: morphemes=None case. Print some error message?
         parts = 0
     result = []
     if parts < 2:
         return self.parse(pattern, gloss)
     else:
         if gloss.morphemes:
             #FIXME: use only first non-glossed morpheme as possible stem
             stemgloss, stempos = [(m, pos)
                                   for pos, m in enumerate(gloss.morphemes)
                                   if not m.gloss][0]
         else:
             stemgloss = gloss
             stempos = -1
         if stemgloss.psmatch(pattern.select):
             stem = stemgloss.form
             if '-' in stem:
                 sparts = stem.split('-')
                 if len(sparts) == parts:
                     decomp = [[
                         emptyGloss._replace(form=f)
                         for f in stem.split('-')
                     ]]
                 else:
                     return None
             elif ('mrph', ) in [m.ps for m in pattern.select.morphemes]:
                 for m in pattern.select.morphemes:
                     if 'mrph' in m.ps:
                         splitre = u'({})'.format(m.form)
                         decomp = [[
                             emptyGloss._replace(form=f)
                             for f in re.split(splitre, stem)
                         ]]
                         break
             else:
                 decomp = [[
                     emptyGloss._replace(form=f) for f in fl
                 ] for fl in parse_composite(stem, self.dictionary, parts)]
             if decomp:
                 morphmatches = [
                     tuple(
                         m.matches(p)
                         for m, p in zip(gl, pattern.select.morphemes))
                     for gl in decomp
                 ]
                 newmorphemes = [
                     tuple(
                         m.union(p)
                         for m, p in zip(gl, pattern.select.morphemes))
                     for gl in decomp
                 ]
                 for matches, morphlist in zip(morphmatches, newmorphemes):
                     if all(matches) and all(morphlist):
                         if stempos < 0:
                             newgloss = gloss._replace(morphemes=morphlist)
                         else:
                             mlist = list(gloss.morphemes)
                             mlist[stempos:stempos + 1] = list(morphlist)
                             newgloss = gloss._replace(
                                 morphemes=tuple(mlist))
                         ng = pattern.apply(newgloss)
                         if ng:
                             for g in self.lookup(ng):
                                 if g and parsed(g):
                                     result.extend([g])
                 return result or None
     return None