|
import spacy |
|
from spacy.language import Language |
|
from typing import List |
|
from spacy.util import registry, compile_suffix_regex |
|
|
|
que_exceptions = [] |
|
|
|
|
|
que_exceptions += [ |
|
"quisque", |
|
"quidque", |
|
"quicque", |
|
"quodque", |
|
"cuiusque", |
|
"cuique", |
|
"quemque", |
|
"quamque", |
|
"quoque", |
|
"quaque", |
|
"quique", |
|
"quaeque", |
|
"quorumque", |
|
"quarumque", |
|
"quibusque", |
|
"quosque", |
|
"quasque", |
|
] |
|
|
|
|
|
que_exceptions += [ |
|
"uterque", |
|
"utraque", |
|
"utrumque", |
|
"utriusque", |
|
"utrique", |
|
"utrumque", |
|
"utramque", |
|
"utroque", |
|
"utraque", |
|
"utrique", |
|
"utraeque", |
|
"utrorumque", |
|
"utrarumque", |
|
"utrisque", |
|
"utrosque", |
|
"utrasque", |
|
] |
|
|
|
|
|
que_exceptions += [ |
|
"quicumque", |
|
"quidcumque", |
|
"quodcumque", |
|
"cuiuscumque", |
|
"cuicumque", |
|
"quemcumque", |
|
"quamcumque", |
|
"quocumque", |
|
"quacumque", |
|
"quicumque", |
|
"quaecumque", |
|
"quorumcumque", |
|
"quarumcumque", |
|
"quibuscumque", |
|
"quoscumque", |
|
"quascumque", |
|
] |
|
|
|
|
|
que_exceptions += [ |
|
"unusquisque", |
|
"unaquaeque", |
|
"unumquodque", |
|
"unumquidque", |
|
"uniuscuiusque", |
|
"unicuique", |
|
"unumquemque", |
|
"unamquamque", |
|
"unoquoque", |
|
"unaquaque", |
|
] |
|
|
|
|
|
que_exceptions += [ |
|
"plerusque", |
|
"pleraque", |
|
"plerumque", |
|
"plerique", |
|
"pleraeque", |
|
"pleroque", |
|
"pleramque", |
|
"plerorumque", |
|
"plerarumque", |
|
"plerisque", |
|
"plerosque", |
|
"plerasque", |
|
] |
|
|
|
|
|
que_exceptions += [ |
|
"absque", |
|
"abusque", |
|
"adaeque", |
|
"adusque", |
|
"aeque", |
|
"antique", |
|
"atque", |
|
"circumundique", |
|
"conseque", |
|
"cumque", |
|
"cunque", |
|
"denique", |
|
"deque", |
|
"donique", |
|
"hucusque", |
|
"inique", |
|
"inseque", |
|
"itaque", |
|
"longinque", |
|
"namque", |
|
"neque", |
|
"oblique", |
|
"peraeque", |
|
"praecoque", |
|
"propinque", |
|
"qualiscumque", |
|
"quandocumque", |
|
"quandoque", |
|
"quantuluscumque", |
|
"quantumcumque", |
|
"quantuscumque", |
|
"quinque", |
|
"quocumque", |
|
"quomodocumque", |
|
"quomque", |
|
"quotacumque", |
|
"quotcumque", |
|
"quotienscumque", |
|
"quotiensque", |
|
"quotusquisque", |
|
"quousque", |
|
"relinque", |
|
"simulatque", |
|
"torque", |
|
"ubicumque", |
|
"ubique", |
|
"undecumque", |
|
"undique", |
|
"usque", |
|
"usquequaque", |
|
"utcumque", |
|
"utercumque", |
|
"utique", |
|
"utrimque", |
|
"utrique", |
|
"utriusque", |
|
"utrobique", |
|
"utrubique", |
|
] |
|
|
|
|
|
@Language.component("normer") |
|
def normer(doc): |
|
def norm(text): |
|
return ( |
|
text.replace("v", "u").replace("j", "i").replace("V", "U").replace("J", "I") |
|
) |
|
|
|
for token in doc: |
|
token.norm_ = norm(token.norm_) |
|
return doc |
|
|
|
|
|
@registry.callbacks("customize_tokenizer") |
|
def make_customize_tokenizer(): |
|
def customize_tokenizer(nlp): |
|
suffixes = nlp.Defaults.suffixes + [ |
|
"que", |
|
"qve", |
|
] |
|
suffix_regex = compile_suffix_regex(suffixes) |
|
nlp.tokenizer.suffix_search = suffix_regex.search |
|
|
|
for item in que_exceptions: |
|
nlp.tokenizer.add_special_case(item, [{"ORTH": item}]) |
|
nlp.tokenizer.add_special_case(item.lower(), [{"ORTH": item.lower()}]) |
|
nlp.tokenizer.add_special_case(item.title(), [{"ORTH": item.title()}]) |
|
nlp.tokenizer.add_special_case(item.upper(), [{"ORTH": item.upper()}]) |
|
|
|
return customize_tokenizer |
|
|
|
|
|
|
|
from spacy.language import Language |
|
from spacy.lookups import load_lookups |
|
from spacy.tokens import Token |
|
from spacy.lookups import Lookups |
|
import string |
|
|
|
blank_nlp = spacy.blank("la") |
|
lookups = Lookups() |
|
|
|
|
|
lookups_data = load_lookups(lang=blank_nlp.vocab.lang, tables=["lemma_lookup"]) |
|
LOOKUPS = lookups_data.get_table("lemma_lookup") |
|
|
|
predicted_lemma_getter = lambda token: token.lemma_ |
|
Token.set_extension( |
|
"predicted_lemma", getter=predicted_lemma_getter |
|
) |
|
|
|
|
|
@Language.component(name="lookup_lemmatizer") |
|
def make_lookup_lemmatizer_function(doc): |
|
for token in doc: |
|
|
|
if token.text in string.punctuation: |
|
token.lemma_ = token.text |
|
token.pos_ = "PUNCT" |
|
token.tag_ = "punc" |
|
|
|
|
|
if token.text == "que" and ( |
|
token.pos_ == "CCONJ" or token.tag_ == "conjunction" |
|
): |
|
token.lemma_ = token.text |
|
|
|
|
|
token.lemma_ = LOOKUPS.get(token.text, token.lemma_) |
|
|
|
|
|
if token.text[0].isupper() and token.text not in LOOKUPS: |
|
token.lemma_ = LOOKUPS.get(token.text.lower(), token.lemma_) |
|
return doc |
|
|
|
|
|
|
|
|