From 357066ee2f40d00369b53e793f2e36c4b5df5041 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 7 Mar 2019 18:32:51 +0100 Subject: [PATCH] Work on morphanalysis class --- spacy/tokens/morphanalysis.pyx | 140 ++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 62 deletions(-) diff --git a/spacy/tokens/morphanalysis.pyx b/spacy/tokens/morphanalysis.pyx index 01ecf458b..11e65c19f 100644 --- a/spacy/tokens/morphanalysis.pyx +++ b/spacy/tokens/morphanalysis.pyx @@ -1,5 +1,10 @@ +from libc.string cimport memset + from ..vocab cimport Vocab -from ..typedefs cimport hash_t +from ..typedefs cimport hash_t, attr_t +from ..morphology cimport check_feature, tag_to_json + +from ..strings import get_string_id cdef class MorphAnalysis: @@ -8,223 +13,234 @@ cdef class MorphAnalysis: self.vocab = vocab self.key = self.vocab.morphology.add(features) analysis = self.vocab.morphology.tags.get(self.key) - self.c = analysis[0] + if analysis is not NULL: + self.c = analysis[0] + else: + memset(&self.c, 0, sizeof(self.c)) @classmethod - def from_id(self, Vocab vocab, hash_t key): - pass + def from_id(cls, Vocab vocab, hash_t key): + cdef MorphAnalysis morph = MorphAnalysis.__new__(MorphAnalysis, vocab) + morph.key = key + analysis = vocab.morphology.tags.get(key) + if analysis is not NULL: + morph.c = analysis[0] + else: + memset(&morph.c, 0, sizeof(morph.c)) + return morph def __contains__(self, feature): - pass + cdef attr_t feat_id = get_string_id(feature) + return check_feature(&self.c, feat_id) def __iter__(self): - pass + raise NotImplementedError def __len__(self): - pass + raise NotImplementedError def __str__(self): - pass + raise NotImplementedError def __repr__(self): - pass + raise NotImplementedError def __hash__(self): - pass + raise NotImplementedError - def get(self, name): - pass + def get(self, field): + raise NotImplementedError def to_json(self): - pass + return tag_to_json(self.c) @property def is_base_form(self): - pass + raise NotImplementedError @property def pos(self): - pass + return self.c.pos @property def pos_(self): - pass + return self.vocab.strings[self.c.pos] - @property - def id(self): - pass + property id: + def __get__(self): + return self.key property abbr: def __get__(self): - pass + return self.c.abbr property adp_type: def __get__(self): - pass + return self.c.adp_type property adv_type: def __get__(self): - pass + return self.c.adv_type property animacy: def __get__(self): - pass + return self.c.animacy property aspect: def __get__(self): - pass + return self.c.aspect property case: def __get__(self): - pass + return self.c.case property conj_type: def __get__(self): - pass + return self.c.conj_type property connegative: def __get__(self): - pass + return self.c.connegative property definite: def __get__(self): - pass + return self.c.definite property degree: def __get__(self): - pass + return self.c.degree property derivation: def __get__(self): - pass + return self.c.derivation property echo: def __get__(self): - pass + return self.c.echo property foreign: def __get__(self): - pass + return self.c.foreign property gender: def __get__(self): - pass + return self.c.gender property hyph: def __get__(self): - pass + return self.c.hyph property inf_form: def __get__(self): - pass + return self.c.inf_form property mood: def __get__(self): - pass + return self.c.mood property name_type: def __get__(self): - pass + return self.c.name_type property negative: def __get__(self): - pass + return self.c.negative property noun_type: def __get__(self): - pass + return self.c.noun_type property number: def __get__(self): - pass + return self.c.number property num_form: def __get__(self): - pass + return self.c.num_form property num_type: def __get__(self): - pass + return self.c.num_type property num_value: def __get__(self): - pass + return self.c.num_value property part_form: def __get__(self): - pass + return self.c.part_form property part_type: def __get__(self): - pass + return self.c.part_type property person: def __get__(self): - pass + return self.c.person property polite: def __get__(self): - pass + return self.c.polite property polarity: def __get__(self): - pass + return self.c.polarity property poss: def __get__(self): - pass + return self.c.poss property prefix: def __get__(self): - pass + return self.c.prefix property prep_case: def __get__(self): - pass + return self.c.prep_case property pron_type: def __get__(self): - pass + return self.c.pron_type property punct_side: def __get__(self): - pass + return self.c.punct_side property punct_type: def __get__(self): - pass + return self.c.punct_type property reflex: def __get__(self): - pass + return self.c.reflex property style: def __get__(self): - pass + return self.c.style property style_variant: def __get__(self): - pass + return self.c.style_variant property tense: def __get__(self): - pass + return self.c.tense property typo: def __get__(self): - pass + return self.c.typo property verb_form: def __get__(self): - pass + return self.c.verb_form property voice: def __get__(self): - pass + return self.c.voice property verb_type: def __get__(self): - pass + return self.c.verb_type property abbr_: def __get__(self):