Skip to content

Commit

Permalink
Optimize Greek language support (#2658)
Browse files Browse the repository at this point in the history
  • Loading branch information
giannisdaras authored and honnibal committed Aug 14, 2018
1 parent 3953e96 commit fe94e69
Show file tree
Hide file tree
Showing 13 changed files with 3,115 additions and 2,880 deletions.
17 changes: 13 additions & 4 deletions spacy/lang/el/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from .stop_words import STOP_WORDS
from .lex_attrs import LEX_ATTRS
from .lemmatizer import LEMMA_RULES, LEMMA_INDEX, LEMMA_EXC
from .lemmatizer.lemmatizer import GreekLemmatizer
from .syntax_iterators import SYNTAX_ITERATORS
from .punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES
from ..tokenizer_exceptions import BASE_EXCEPTIONS
from .norm_exceptions import NORM_EXCEPTIONS
Expand All @@ -20,15 +22,23 @@ class GreekDefaults(Language.Defaults):
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
lex_attr_getters.update(LEX_ATTRS)
lex_attr_getters[LANG] = lambda text: 'el' # ISO code
lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS, NORM_EXCEPTIONS)
lex_attr_getters[NORM] = add_lookups(
Language.Defaults.lex_attr_getters[NORM], BASE_NORMS, NORM_EXCEPTIONS)
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
stop_words = STOP_WORDS
lemma_rules = LEMMA_RULES
lemma_index = LEMMA_INDEX
tag_map = TAG_MAP
prefixes = TOKENIZER_PREFIXES
suffixes = TOKENIZER_SUFFIXES
infixes = TOKENIZER_INFIXES
syntax_iterators = SYNTAX_ITERATORS

@classmethod
def create_lemmatizer(cls, nlp=None):
lemma_rules = LEMMA_RULES
lemma_index = LEMMA_INDEX
lemma_exc = LEMMA_EXC
return GreekLemmatizer(index=lemma_index, exceptions=lemma_exc,
rules=lemma_rules)


class Greek(Language):
Expand All @@ -39,4 +49,3 @@ class Greek(Language):

# set default export – this allows the language class to be lazy-loaded
__all__ = ['Greek']

21 changes: 15 additions & 6 deletions spacy/lang/el/examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,20 @@
"""

sentences = [
"Η άνιση κατανομή του πλούτου και του εισοδήματος, η οποία έχει λάβει τρομερές διαστάσεις, δεν δείχνει τάσεις βελτίωσης.",
"Ο στόχος της σύντομης αυτής έκθεσης είναι να συνοψίσει τα κυριότερα συμπεράσματα των επισκοπήσεων κάθε μιας χώρας.",
"Μέχρι αργά χθες το βράδυ ο πλοιοκτήτης παρέμενε έξω από το γραφείο του γενικού γραμματέα του υπουργείου, ενώ είχε μόνον τηλεφωνική επικοινωνία με τον υπουργό.",
"Σύμφωνα με καλά ενημερωμένη πηγή, από την επεξεργασία του προέκυψε ότι οι δράστες της επίθεσης ήταν δύο, καθώς και ότι προσέγγισαν και αποχώρησαν από το σημείο με μοτοσικλέτα.",
'''Η άνιση κατανομή του πλούτου και του εισοδήματος, η οποία έχει λάβει
τρομερές διαστάσεις, δεν δείχνει τάσεις βελτίωσης.''',
'''Ο στόχος της σύντομης αυτής έκθεσης είναι να συνοψίσει τα κυριότερα
συμπεράσματα των επισκοπήσεων κάθε μιας χώρας.''',
'''Μέχρι αργά χθες το βράδυ ο πλοιοκτήτης παρέμενε έξω από το γραφείο του
γενικού γραμματέα του υπουργείου, ενώ είχε μόνον τηλεφωνική επικοινωνία με
τον υπουργό.''',
'''Σύμφωνα με καλά ενημερωμένη πηγή, από την επεξεργασία του προέκυψε ότι
οι δράστες της επίθεσης ήταν δύο, καθώς και ότι προσέγγισαν και αποχώρησαν
από το σημείο με μοτοσικλέτα.''',
"Η υποδομή καταλυμάτων στην Ελλάδα είναι πλήρης και ανανεώνεται συνεχώς.",
"Το επείγον ταχυδρομείο (ήτοι το παραδοτέο εντός 48 ωρών το πολύ) μπορεί να μεταφέρεται αεροπορικώς μόνον εφόσον εφαρμόζονται οι κανόνες ασφαλείας.",
"Στις ορεινές περιοχές του νησιού οι χιονοπτώσεις και οι παγετοί είναι περιορισμένοι ενώ στις παραθαλάσσιες περιοχές σημειώνονται σπανίως."
'''Το επείγον ταχυδρομείο (ήτοι το παραδοτέο εντός 48 ωρών το πολύ) μπορεί
να μεταφέρεται αεροπορικώς μόνον εφόσον εφαρμόζονται οι κανόνες
ασφαλείας''',
''''Στις ορεινές περιοχές του νησιού οι χιονοπτώσεις και οι παγετοί είναι
περιορισμένοι ενώ στις παραθαλάσσιες περιοχές σημειώνονται σπανίως.'''
]
10 changes: 10 additions & 0 deletions spacy/lang/el/lemmatizer/_adjectives_irreg.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,29 @@
ADJECTIVES_IRREG = {
"χειρότερος": ("κακός",),
"χειρότερη": ("κακός",),
"χειρότερης": ("κακός",),
"χειρότερο": ("κακός",),
"χειρότεροι": ("κακός",),
"χειρότερων": ("κακός",),
"χειρότερου": ("κακός",),
"βέλτιστος": ("καλός",),
"βέλτιστη": ("καλός",),
"βέλτιστης": ("καλός",),
"βέλτιστο": ("καλός",),
"βέλτιστοι": ("καλός",),
"βέλτιστων": ("καλός",),
"βέλτιστου": ("καλός",),
"ελάχιστος": ("λίγος",),
"ελάχιστα": ("λίγος",),
"ελάχιστοι": ("λίγος",),
"ελάχιστων": ("λίγος",),
"ελάχιστη": ("λίγος",),
"ελάχιστης": ("λίγος",),
"ελάχιστο": ("λίγος",),
"ελάχιστου": ("λίγος",),
"πλείστος": ("πολύς",),
"πλείστου": ("πολύς",),
"πλείστων": ("πολύς",),
"πολλή": ("πολύ",),
"πολύς": ("πολύ",),
"πολλύ": ("πολύ",),
Expand Down
216 changes: 135 additions & 81 deletions spacy/lang/el/lemmatizer/_lemma_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,94 +3,148 @@


ADJECTIVE_RULES = [
["οί","ός"], # καρδιακοί
["ές","ός"], # επιφανειακές
["ές","ος"], # καρδιακές
["ές","ύς"], # πολλές
["οι","ος"],
["αία","ος"], # ωραία
["ωδη","ες"], # δασώδη
["ώδη","ες"],
["ότερη","ός"],
["ότερος","ός"],
["ότεροι", "ός"],
["ότερων","ός"],
["ότερες", "ός"],
["οί", "ός"], # καρδιακοί -> καρδιακός. Ονομαστική πλ. σε -ός. (m)
["ών", "ός"], # καρδιακών -> καρδιακός. Γενική πλ. σε -ός. (m)
["ού", "ός"], # καρδιακού -> καρδιακός. Γενική εν. σε -ός. (m)
["ή", "ός"], # καρδιακή -> καρδιακός. Ονομαστική εν. σε -ή. (f)
["ής", "ός"], # καρδιακής -> καρδιακός. Γενική εν. σε -ή. (f)
["ές", "ός"], # καρδιακές -> καρδιακός. Ονομαστική πλ. σε -ή. (f)
["οι", "ος"], # ωραίοι -> ωραίος. Ονομαστική πλ. σε -ος. (m)
["ων", "ος"], # ωραίων -> ωραίος. Γενική πλ. σε -ος. (m)
["ου", "ος"], # ωραίου -> ωραίος. Γενική εν. σε -ος. (m)
["ο", "ος"], # ωραίο -> ωραίος. Ονομαστική εν. σε -ο. (n)
["α", "ος"], # χυδαία -> χυδαίος. Ονομαστική πλ. σε -ο. (n)
["ώδη", "ώδες"], # δασώδη -> δασώδες. Ονομαστική πλ. σε -ώδες. (n)
["ύτερη", "ός"], # καλύτερη -> καλός. Συγκριτικός βαθμός σε -ή. (f)
["ύτερης", "ός"], # καλύτερης -> καλός. (f)
["ύτερων", "ός"], # καλύτερων -> καλός. (f)
["ύτερος", "ός"], # καλύτερος -> καλός. Συγκριτικός βαθμός σε -ός. (m)
["ύτερου", "ός"], # καλύτερου -> καλός. (m)
]


# masculine -> m, feminine -> f, neuter -> n.
NOUN_RULES = [
["ιά","ί"], # παιδιά
["ια","ι"], # ποτήρια
["ες","α"], # κεραμίδες
["ές","ά"],
["ές","ά"],
["ες","α"], # εσπερινές
["ες","η"], # ζάχαρη
["ές","ή"], # φυλακές
["ές","ής"], # καθηγητής
["α","ο"], # πρόβατα
["α","α"], # ζήτημα
["ατα","α"], # στόματα
["άτα","άτα"], # ντομάτα
["άτες","άτα"], # πατάτες
["ία","ία"],
["ιά","ιά"],
["οί","ός"], # υπουργοί
["ίας","ία"], # δικτατορίας, δυσωδείας, τρομοκρατίας
["άτων","ατα"], # δικαιωμάτων
["ώπων","ωπος"], # ανθρώπων
["ιού", "ί"], # παιδιού -> παιδί. Γενική ενικού σε -ί. (n)
["ιά", "ί"], # παιδιά -> παιδί. Ονομαστική πληθυντικού σε -ί. (n)
["ιών", "ί"], # παιδιών -> παιδί. Γενική πληθυντικού σε -ί. (n)
["ηριού", "ήρι"], # ποτηριού -> ποτήρι. Γενική ενικού σε -ι. (n)
["ια", "ι"], # ποτήρια -> ποτήρι. Ονομαστική πληθυντικού σε -ι. (n)
["ηριών", "ήρι"], # ποτηριών -> ποτήρι. Γενική πληθυντικού σε -ι. (n)
["ας", "α"], # κεραμίδας -> κεραμίδα. Γενική ενικού σε -α. (f)
["ες", "α"], # κεραμίδες -> κεραμίδα. Ονομαστική πληθυντικού σε -α. (f)
["ων", "α"], # κεραμίδων -> κεραμίδα. Γενική πληθυντικού σε -α. (f)
["άς", "ά"], # βελανιδιάς -> βελανιδιά. Γενική ενικού σε -ά. (f)
["ές", "ά"], # βελανιδιές -> βελανιδιά. Ονομαστική πληθυντικού σε -ά. (f)
["ών", "ά"], # βελανιδιών -> βελανιδιά. Γενική πληθυντικού σε -ά. (f)
["ής", "ή"], # φυλακής -> φυλακή. Γενική ενικού σε -ή. (f)
["ές", "ή"], # φυλακές -> φυλακή. Ονομαστική πληθυντικού σε -ή. (f)
["ών", "ή"], # φυλακών -> φυλακή. Γενική πληθυντικού σε -ή. (f)
["ές", "ής"], # καθηγητές -> καθηγητής. Ονομαστική πληθυντικού σε -ής. (m)
["ών", "ής"], # καθηγητών -> καθηγητής. Γενική πληθυντικού σε -ής. (m)
["ου", "ο"], # προβάτου -> πρόβατο. Γενική ενικού σε -ο. (n)
["α", "ο"], # πρόβατα -> πρόβατο. Ονομαστική πληθυντικού σε -o. (n)
["ων", "ο"], # προβάτων -> πρόβατο. Γενική πληθυντικού σε -ο. (n)
["ητήματος", "ήτημα"], # ζητήματος -> ζήτημα. Γενική ενικού σε -α (n)
# ζητήματα -> ζήτημα. Ονομαστική πληθυντικού σε -α. (n)
["ητήματα", "ήτημα"],
# ζητημάτων -> ζήτημα. Γενική πληθυντικού σε -α. (n)
["ητημάτων", "ήτημα"],
["τος", ""], # στόματος -> στόμα. Γενική ενικού σε -α. (n)
["τα", "α"], # στόματα -> στόμα. Ονομαστική πληθυντικού σε -α. (n)
["ομάτων", "όμα"], # στομάτων -> στόμα. Γενική πληθυντικού σε -α. (n)
["ού", "ός"], # υπουργού -> υπουργός. Γενική ενικού σε -ος. (m)
["οί", "ός"], # υπουργοί -> υπουργούς. Ονομαστική πληυθυντικού σε -ος. (m)
["ών", "ός"], # υπουργών -> υπουργός. Γενική πληθυντικού σε -ος. (m)
["ς", ""], # δικτατορίας -> δικτατορία. Γενική ενικού σε -ας. (f)
# δικτατορίες -> δικτατορία. Ονομαστική πληθυντικού σε -ας. (f)
["ες", "α"],
["ιών", "ία"], # δικτατοριών -> δικτατορία. Γενική πληθυντικού σε -ας. (f)
["α", "ας"], # βασιλιά -> βασιλιάς. Γενική ενικού σε -άς. (m)
["δων", ""], # βασιλιάδων -> βασιλιά. Γενική πληθυντικού σε -άς. (m)
]


VERB_RULES = [
["εις", "ω"],
["εις","ώ"],
["ει","ω"],
["ει","ώ"],
["ουμε","ω"],
["ουμε","ώ"],
["ούμε","ώ"], # θεώρησα
["ούνε","ώ"], #
["ετε","ω"],
["ετε","ώ"],
["ουν","ω"],
["ουν","ώ"],
["είς","ώ"],
["εί","ώ"],
["ούν","ώ"],
["εσαι","ομαι"], #αισθάνεσαι
["εσαι","όμαι"],
["έσαι","ομαι"],
["έσαι","όμαι"],
["εται","ομαι"],
["εται","όμαι"],
["έται","ομαι"],
["έται","όμαι"],
["όμαστε","όμαι"],
["όμαστε","ομαι"],
["έσθε","όμαι"],
["εσθε","όμαι"],
["άς","ώ"], # αγαπάς
["άει","ώ"],
["άμε","ώ"],
["άτε","ώ"],
["άνε","ώ"],
["άν","ώ"],
["άμε","ώ"],
["άω","ώ"], # _verbs.py could contain any of the two
["ώ","άω"],
["όμουν", "ομαι"], # ζαλιζόμουν
["όμουν", "όμαι"],
["όμουν", "αμαι"], # κοιμόμουν
["όμουν", "αμαι"],
["ούσα", "ώ"], # ζητούσα -> ζητώ
["ούσες", "ώ"],
["ούσε", "ώ"],
["ούσαμε", "ώ"],
["ούσατε", "ώ"],
["ούσαν", "ώ"],
["ούσανε", "ώ"],
["εις", "ω"], # πάρεις -> πάρω. Ενεστώτας ρήματος σε -ω.
["ει", "ω"],
["ουμε", "ω"],
["ετε", "ω"],
["ουνε", "ω"],
["ουν", "ω"],
["είς", "ώ"], # πονείς -> πονώ. Ενεστώτας ρήματος σε -ώ vol1.
["εί", "ώ"], # οι κανόνες που λείπουν καλύπτονται από το αγαπώ.
["ούν", "ώ"],
["εσαι", "ομαι"], # αισθάνεσαι -> αισθάνομαι. Ενεστώτας ρήματος σε -ομαι.
["εται", "ομαι"],
["ανόμαστε", "άνομαι"],
["εστε", "ομαι"],
["ονται", "ομαι"],
["άς", "ώ"], # αγαπάς -> αγαπάω (ή αγαπώ). Ενεστώτας ρήματος σε -ώ vol2.
["άει", "ώ"],
["άμε", "ώ"],
["άτε", "ώ"],
["άνε", "ώ"],
["άν", "ώ"],
["άω", "ώ"],
["ώ", "άω"],
# ζαλιζόμουν -> ζαλίζομαι. Παρατατικός ρήματος -ίζομαι.
["ιζόμουν", "ίζομαι"],
["ιζόσουν", "ίζομαι"],
["ιζόταν", "ίζομαι"],
["ιζόμασταν", "ίζομαι"],
["ιζόσασταν", "ίζομαι"],
["ονταν", "ομαι"],
["όμουν", "άμαι"], # κοιμόμουν -> κοιμάμαι. Παρατατικός ρήματος σε -άμαι.
["όσουν", "άμαι"],
["όταν", "άμαι"],
["όμασταν", "άμαι"],
["όσασταν", "άμαι"],
["όντουσταν", "άμαι"],
["ούσα", "ώ"], # ζητούσα -> ζητώ. # Παρατατικός ρήματος σε -ώ.
["ούσες", "ώ"],
["ούσε", "ώ"],
["ούσαμε", "ώ"],
["ούσατε", "ώ"],
["ούσαν", "ώ"],
["ούσανε", "ώ"],
["λαμε", "ζω"], # βγάλαμε -> βγάζω. Αόριστος ρήματος σε -ω vol1.
["λατε", "ζω"],
["ήρα", "άρω"], # πήρα -> πάρω. Αόριστος ρήματος σε -ω vol2.
["ήρες", "άρω"],
["ήρε", "άρω"],
["ήραμε", "άρω"],
["ήρατε", "άρω"],
["ήρα", "άρω"],
["ένησα", "ενώ"], # φιλοξένησα -> φιλοξενώ. Αόριστος ρήματος σε -ώ vol1.
["ένησες", "ενώ"],
["ένησε", "ενώ"],
["ενήσαμε", "ενώ"],
["ένησατε", "ενώ"],
["ένησαν", "ενώ"],
["όνεσα", "ονώ"], # πόνεσα -> πονώ. Αόριστος ρήματος σε -ώ vol2.
["όνεσες", "ονώ"],
["όνεσε", "ονώ"],
["έσαμε", "ώ"],
["έσατε", "ώ"],
["ισα", "ομαι"], # κάθισα -> κάθομαι. Αόριστος ρήματος σε -ομαι.
["ισες", "ομαι"],
["ισε", "ομαι"],
["αθίσαμε", "άθομαι"],
["αθίσατε", "άθομαι"],
["ισαν", "ομαι"],
["άπα", "απώ"], # αγάπα -> αγαπώ. Προστακτική ρήματος σε -άω/ώ vol1.
["ά", "ώ"], # τιμά -> τιμώ. Προστακτική ρήματος σε άω/ώ vol2.
["οντας", "ω"], # βλέποντας -> βλέπω. Μετοχή.
["ξω", "ζω"], # παίξω -> παίζω. Μέλλοντας σε -ω.
["ξεις", "ζω"],
["ξουμε", "ζω"],
["ξετε", "ζω"],
["ξουν", "ζω"],





]


Expand Down
Loading

0 comments on commit fe94e69

Please sign in to comment.