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
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 ()
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 ()
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 ()
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
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