Thinking back to the previous examples for tokenization and lexical counting, there is an obvious shortcoming, that it does not assimilate lexically identical words with one another. For example, we may want to count "est" and "sunt" as instances of "esse".
Lemmatization is the non-trivial process of reconciling inflected forms to their dictionary headword. The CLTK offers several methods. We'll show here one of the less sophisticated approaches. (Documentation for a new statistical method is in the works.)
Note: You may have heard of stemming, which is similar in purpose, however it does not convert a word to a dictionary form, but only reduces commonly related forms into a new, unambiguous string (e.g., 'amicitia' --> 'amiciti'). This is not what we need for Greek and Latin.
cato_agri_praef = "Est interdum praestare mercaturis rem quaerere, nisi tam periculosum sit, et item foenerari, si tam honestum. Maiores nostri sic habuerunt et ita in legibus posiverunt: furem dupli condemnari, foeneratorem quadrupli. Quanto peiorem civem existimarint foeneratorem quam furem, hinc licet existimare. Et virum bonum quom laudabant, ita laudabant: bonum agricolam bonumque colonum; amplissime laudari existimabatur qui ita laudabatur. Mercatorem autem strenuum studiosumque rei quaerendae existimo, verum, ut supra dixi, periculosum et calamitosum. At ex agricolis et viri fortissimi et milites strenuissimi gignuntur, maximeque pius quaestus stabilissimusque consequitur minimeque invidiosus, minimeque male cogitantes sunt qui in eo studio occupati sunt. Nunc, ut ad rem redeam, quod promisi institutum principium hoc erit."
# First import a repository: the CLTK data models for Latin
from cltk.corpus.utils.importer import CorpusImporter
corpus_importer = CorpusImporter('latin')
corpus_importer.import_corpus('latin_models_cltk')
# Replace j/v and tokenize
from cltk.stem.latin.j_v import JVReplacer
from cltk.tokenize.word import WordTokenizer
jv_replacer = JVReplacer()
cato_agri_praef = jv_replacer.replace(cato_agri_praef.lower())
word_tokenizer = WordTokenizer('latin')
cato_word_tokens = word_tokenizer.tokenize(cato_agri_praef.lower())
cato_word_tokens = [token for token in cato_word_tokens if token not in ['.', ',', ':', ';']]
from cltk.stem.lemma import LemmaReplacer
lemmatizer = LemmaReplacer('latin')
lemmata = lemmatizer.lemmatize(cato_word_tokens)
print(lemmata)
['edo1', 'interdum', 'praesto2', 'mercor', 'res', 'quaero', 'nitor1', 'tam', 'periculosus', 'sum1', 'et', 'ito', 'foenerari', 'si', 'tam', 'honestus', 'magnus', 'noster', 'sic', 'habeo', 'et', 'ito', 'in', 'lex', 'posiuerunt', 'fur', 'duplum', 'condemno', 'foeneratorem', 'quadruplus', 'quantus', 'malus', 'civis', 'existimo', 'foeneratorem', 'qui1', 'fur', 'hinc', 'liceo1', 'existimo', 'et', 'vir', 'bonus', 'cum', 'laudo', 'ito', 'laudo', 'bonus', 'agricola1', 'bonus', '-que', 'colonus', 'amplus', 'laudo', 'existimo', 'qui1', 'ito', 'laudo', 'mercator', 'autem', 'strenuus', 'studiosus', '-que', 'redeo', 'quaero', 'existimo', 'verus', 'ut', 'supra', 'dico2', 'periculosus', 'et', 'calamitosus', 'at', 'ex', 'agricola1', 'et', 'vir', 'fortis', 'et', 'milito', 'strenuus', 'gigno', 'magnus', '-que', 'pius', 'quaestus', 'stabilissimus', '-que', 'consequor', 'minimus', '-que', 'invidiosus', 'minimus', '-que', 'malus', 'cogito', 'sum1', 'qui1', 'in', 'eo1', 'studium', 'occupo', 'sum1', 'nunc', 'ut', 'ad', 'res', 'redeo', 'qui1', 'promitto', 'instituo', 'principium', 'hic', 'sum1']
# Now we do the same but also return the original form
# This is useful for checking accuracy
lemmata_orig = lemmatizer.lemmatize(cato_word_tokens, return_raw=True)
print(lemmata_orig)
['est/edo1', 'interdum/interdum', 'praestare/praesto2', 'mercaturis/mercor', 'rem/res', 'quaerere/quaero', 'nisi/nitor1', 'tam/tam', 'periculosum/periculosus', 'sit/sum1', 'et/et', 'item/ito', 'foenerari/foenerari', 'si/si', 'tam/tam', 'honestum/honestus', 'maiores/magnus', 'nostri/noster', 'sic/sic', 'habuerunt/habeo', 'et/et', 'ita/ito', 'in/in', 'legibus/lex', 'posiuerunt/posiuerunt', 'furem/fur', 'dupli/duplum', 'condemnari/condemno', 'foeneratorem/foeneratorem', 'quadrupli/quadruplus', 'quanto/quantus', 'peiorem/malus', 'ciuem/civis', 'existimarint/existimo', 'foeneratorem/foeneratorem', 'quam/qui1', 'furem/fur', 'hinc/hinc', 'licet/liceo1', 'existimare/existimo', 'et/et', 'uirum/vir', 'bonum/bonus', 'quom/cum', 'laudabant/laudo', 'ita/ito', 'laudabant/laudo', 'bonum/bonus', 'agricolam/agricola1', 'bonum/bonus', '-que/-que', 'colonum/colonus', 'amplissime/amplus', 'laudari/laudo', 'existimabatur/existimo', 'qui/qui1', 'ita/ito', 'laudabatur/laudo', 'mercatorem/mercator', 'autem/autem', 'strenuum/strenuus', 'studiosum/studiosus', '-que/-que', 'rei/redeo', 'quaerendae/quaero', 'existimo/existimo', 'uerum/verus', 'ut/ut', 'supra/supra', 'dixi/dico2', 'periculosum/periculosus', 'et/et', 'calamitosum/calamitosus', 'at/at', 'ex/ex', 'agricolis/agricola1', 'et/et', 'uiri/vir', 'fortissimi/fortis', 'et/et', 'milites/milito', 'strenuissimi/strenuus', 'gignuntur/gigno', 'maxime/magnus', '-que/-que', 'pius/pius', 'quaestus/quaestus', 'stabilissimus/stabilissimus', '-que/-que', 'consequitur/consequor', 'minime/minimus', '-que/-que', 'inuidiosus/invidiosus', 'minime/minimus', '-que/-que', 'male/malus', 'cogitantes/cogito', 'sunt/sum1', 'qui/qui1', 'in/in', 'eo/eo1', 'studio/studium', 'occupati/occupo', 'sunt/sum1', 'nunc/nunc', 'ut/ut', 'ad/ad', 'rem/res', 'redeam/redeo', 'quod/qui1', 'promisi/promitto', 'institutum/instituo', 'principium/principium', 'hoc/hic', 'erit/sum1']
# Let's count again
# Count all words
print(len(lemmata))
115
# Count unique words
print(len(set(lemmata)))
73
# Finally, measure lexical diversity, using lemmata
print(len(set(lemmata)) / len(lemmata))
0.6347826086956522
Greek
athenaeus_incipit = "Ἀθήναιος μὲν ὁ τῆς βίβλου πατήρ· ποιεῖται δὲ τὸν λόγον πρὸς Τιμοκράτην· Δειπνοσοφιστὴς δὲ ταύτῃ τὸ ὄνομα. Ὑπόκειται δὲ τῷ λόγῳ Λαρήνσιος Ῥωμαῖος, ἀνὴρ τῇ τύχῃ περιφανής, τοὺς κατὰ πᾶσαν παιδείαν ἐμπειροτάτους ἐν αὑτοῦ δαιτυμόνας ποιούμενος· ἐν οἷς οὐκ ἔσθ᾽ οὗτινος τῶν καλλίστων οὐκ ἐμνημόνευσεν. Ἰχθῦς τε γὰρ τῇ βίβλῳ ἐνέθετο καὶ τὰς τούτων χρείας καὶ τὰς τῶν ὀνομάτων ἀναπτύξεις καὶ λαχάνων γένη παντοῖα καὶ ζῴων παντοδαπῶν καὶ ἄνδρας ἱστορίας συγγεγραφότας καὶ ποιητὰς καὶ φιλοσόφους καὶ ὄργανα μουσικὰ καὶ σκωμμάτων εἴδη μυρία καὶ ἐκπωμάτων διαφορὰς καὶ πλούτους βασιλέων διηγήσατο καὶ νηῶν μεγέθη καὶ ὅσα ἄλλα οὐδ᾽ ἂν εὐχερῶς ἀπομνημονεύσαιμι, ἢ ἐπιλίποι μ᾽ ἂν ἡ ἡμέρα κατ᾽ εἶδος διεξερχόμενον. Καί ἐστιν ἡ τοῦ λόγου οἰκονομία μίμημα τῆς τοῦ δείπνου πολυτελείας καὶ ἡ τῆς βίβλου διασκευὴ τῆς ἐν τῷ δείπνῳ παρασκευῆς. Τοιοῦτον ὁ θαυμαστὸς οὗτος τοῦ λόγου οἰκονόμος Ἀθήναιος ἥδιστον λογόδειπνον εἰσηγεῖται κρείττων τε αὐτὸς ἑαυτοῦ γινόμενος, ὥσπερ οἱ Ἀθήνησι ῥήτορες, ὑπὸ τῆς ἐν τῷ λέγειν θερμότητος πρὸς τὰ ἑπόμενα τῆς βίβλου βαθμηδὸν ὑπεράλλεται."
from cltk.corpus.utils.importer import CorpusImporter
corpus_importer = CorpusImporter('greek')
corpus_importer.import_corpus('greek_models_cltk')
from cltk.tokenize.word import WordTokenizer
word_tokenizer = WordTokenizer('greek')
athenaeus_word_tokens = word_tokenizer.tokenize(athenaeus_incipit.lower())
athenaeus_word_tokens = [token for token in athenaeus_word_tokens if token not in ['.', ',', ':', ';']]
from cltk.stem.lemma import LemmaReplacer
lemmatizer = LemmaReplacer('greek')
lemmata = lemmatizer.lemmatize(athenaeus_word_tokens)
print(lemmata)
['ἀθήναιος', 'μὲν', 'ὁ', 'ὁ', 'βίβλος', 'πατήρ·', 'ποιέω', 'δὲ', 'τὸν', 'λόγος', 'πρὸς', 'τιμοκράτην·', 'δειπνοσοφιστὴς', 'δὲ', 'οὗτος', 'τὸ', 'ὄνομα', 'ὑπόκειμαι', 'δὲ', 'ὁ', 'λόγος', 'λαρήνσιος', 'ῥωμαῖος', 'ἀνὴρ', 'ὁ', 'τυγχάνω', 'περιφανής', 'τοὺς', 'κατὰ', 'πᾶς', 'παιδεία', 'ἔμπειρος', 'ἐν', 'ἑαυτοῦ', 'δαιτυμών', 'ποιούμενος·', 'ἐν', 'ὅς', 'οὐ', 'ἔσθ᾽', 'ὅστις', 'ὁ', 'καλός', 'οὐ', 'μνημονεύω', 'ἰχθύς', 'τε', 'γὰρ', 'ὁ', 'βίβλος', 'ἐντίθημι', 'καὶ', 'τὰς', 'οὗτος', 'χρεία', 'καὶ', 'τὰς', 'ὁ', 'ὄνομα', 'ἀναπτύσσω', 'καὶ', 'λάχανον', 'γένος', 'παντοῖος', 'καὶ', 'ζωιόω', 'παντοδαπός', 'καὶ', 'ἀνήρ', 'ἱστορία', 'συγγράφω', 'καὶ', 'ποιητὰς', 'καὶ', 'φιλόσοφος', 'καὶ', 'ὀργαίνω', 'μουσικὰ', 'καὶ', 'σκῶμμα', 'εἶδος', 'μυρίος', 'καὶ', 'ἔκπωμα', 'διαφορὰς', 'καὶ', 'πλοῦτος', 'βασιλίς', 'διηγέομαι', 'καὶ', 'ναῦς', 'μέγεθος', 'καὶ', 'ὅσος', 'ἄλλος', 'οὐδ᾽', 'ἂν', 'εὐχερής', 'ἀπομνημονεύω', 'ἢ', 'ἐπιλείπω', 'μ᾽', 'ἂν', 'ὁ', 'ἥμερος', 'κατ᾽', 'εἶδος', 'διεξέρχομαι', 'καί', 'εἰμί', 'ὁ', 'ὁ', 'λογόω', 'οἰκονομία', 'μίμημα', 'ὁ', 'ὁ', 'δεῖπνος', 'πολυτέλεια', 'καὶ', 'ὁ', 'ὁ', 'βίβλος', 'διασκευὴ', 'ὁ', 'ἐν', 'ὁ', 'δεῖπνος', 'παρασκευάζω', 'τοιοῦτος', 'ὁ', 'θαυμαστὸς', 'οὗτος', 'ὁ', 'λογόω', 'οἰκονόμος', 'ἀθήναιος', 'ἡδύς', 'λογόδειπνον', 'εἰσηγέομαι', 'κρείσσων', 'τε', 'αὐτὸς', 'ἑαυτοῦ', 'γίγνομαι', 'ὥσπερ', 'ὁ', 'ἀθήνευς', 'ῥήτωρ', 'ὑπὸ', 'ὁ', 'ἐν', 'ὁ', 'λέγω1', 'θερμότης', 'πρὸς', 'τὰ', 'ἕπομαι', 'ὁ', 'βίβλος', 'βαθμηδὸν', 'ὑπεράλλομαι']
lemmata_orig = lemmatizer.lemmatize(athenaeus_word_tokens, return_raw=True)
print(lemmata_orig)
['ἀθήναιος/ἀθήναιος', 'μὲν/μὲν', 'ὁ/ὁ', 'τῆς/ὁ', 'βίβλου/βίβλος', 'πατήρ·/πατήρ·', 'ποιεῖται/ποιέω', 'δὲ/δὲ', 'τὸν/τὸν', 'λόγον/λόγος', 'πρὸς/πρὸς', 'τιμοκράτην·/τιμοκράτην·', 'δειπνοσοφιστὴς/δειπνοσοφιστὴς', 'δὲ/δὲ', 'ταύτῃ/οὗτος', 'τὸ/τὸ', 'ὄνομα/ὄνομα', 'ὑπόκειται/ὑπόκειμαι', 'δὲ/δὲ', 'τῷ/ὁ', 'λόγῳ/λόγος', 'λαρήνσιος/λαρήνσιος', 'ῥωμαῖος/ῥωμαῖος', 'ἀνὴρ/ἀνὴρ', 'τῇ/ὁ', 'τύχῃ/τυγχάνω', 'περιφανής/περιφανής', 'τοὺς/τοὺς', 'κατὰ/κατὰ', 'πᾶσαν/πᾶς', 'παιδείαν/παιδεία', 'ἐμπειροτάτους/ἔμπειρος', 'ἐν/ἐν', 'αὑτοῦ/ἑαυτοῦ', 'δαιτυμόνας/δαιτυμών', 'ποιούμενος·/ποιούμενος·', 'ἐν/ἐν', 'οἷς/ὅς', 'οὐκ/οὐ', 'ἔσθ᾽/ἔσθ᾽', 'οὗτινος/ὅστις', 'τῶν/ὁ', 'καλλίστων/καλός', 'οὐκ/οὐ', 'ἐμνημόνευσεν/μνημονεύω', 'ἰχθῦς/ἰχθύς', 'τε/τε', 'γὰρ/γὰρ', 'τῇ/ὁ', 'βίβλῳ/βίβλος', 'ἐνέθετο/ἐντίθημι', 'καὶ/καὶ', 'τὰς/τὰς', 'τούτων/οὗτος', 'χρείας/χρεία', 'καὶ/καὶ', 'τὰς/τὰς', 'τῶν/ὁ', 'ὀνομάτων/ὄνομα', 'ἀναπτύξεις/ἀναπτύσσω', 'καὶ/καὶ', 'λαχάνων/λάχανον', 'γένη/γένος', 'παντοῖα/παντοῖος', 'καὶ/καὶ', 'ζῴων/ζωιόω', 'παντοδαπῶν/παντοδαπός', 'καὶ/καὶ', 'ἄνδρας/ἀνήρ', 'ἱστορίας/ἱστορία', 'συγγεγραφότας/συγγράφω', 'καὶ/καὶ', 'ποιητὰς/ποιητὰς', 'καὶ/καὶ', 'φιλοσόφους/φιλόσοφος', 'καὶ/καὶ', 'ὄργανα/ὀργαίνω', 'μουσικὰ/μουσικὰ', 'καὶ/καὶ', 'σκωμμάτων/σκῶμμα', 'εἴδη/εἶδος', 'μυρία/μυρίος', 'καὶ/καὶ', 'ἐκπωμάτων/ἔκπωμα', 'διαφορὰς/διαφορὰς', 'καὶ/καὶ', 'πλούτους/πλοῦτος', 'βασιλέων/βασιλίς', 'διηγήσατο/διηγέομαι', 'καὶ/καὶ', 'νηῶν/ναῦς', 'μεγέθη/μέγεθος', 'καὶ/καὶ', 'ὅσα/ὅσος', 'ἄλλα/ἄλλος', 'οὐδ᾽/οὐδ᾽', 'ἂν/ἂν', 'εὐχερῶς/εὐχερής', 'ἀπομνημονεύσαιμι/ἀπομνημονεύω', 'ἢ/ἢ', 'ἐπιλίποι/ἐπιλείπω', 'μ᾽/μ᾽', 'ἂν/ἂν', 'ἡ/ὁ', 'ἡμέρα/ἥμερος', 'κατ᾽/κατ᾽', 'εἶδος/εἶδος', 'διεξερχόμενον/διεξέρχομαι', 'καί/καί', 'ἐστιν/εἰμί', 'ἡ/ὁ', 'τοῦ/ὁ', 'λόγου/λογόω', 'οἰκονομία/οἰκονομία', 'μίμημα/μίμημα', 'τῆς/ὁ', 'τοῦ/ὁ', 'δείπνου/δεῖπνος', 'πολυτελείας/πολυτέλεια', 'καὶ/καὶ', 'ἡ/ὁ', 'τῆς/ὁ', 'βίβλου/βίβλος', 'διασκευὴ/διασκευὴ', 'τῆς/ὁ', 'ἐν/ἐν', 'τῷ/ὁ', 'δείπνῳ/δεῖπνος', 'παρασκευῆς/παρασκευάζω', 'τοιοῦτον/τοιοῦτος', 'ὁ/ὁ', 'θαυμαστὸς/θαυμαστὸς', 'οὗτος/οὗτος', 'τοῦ/ὁ', 'λόγου/λογόω', 'οἰκονόμος/οἰκονόμος', 'ἀθήναιος/ἀθήναιος', 'ἥδιστον/ἡδύς', 'λογόδειπνον/λογόδειπνον', 'εἰσηγεῖται/εἰσηγέομαι', 'κρείττων/κρείσσων', 'τε/τε', 'αὐτὸς/αὐτὸς', 'ἑαυτοῦ/ἑαυτοῦ', 'γινόμενος/γίγνομαι', 'ὥσπερ/ὥσπερ', 'οἱ/ὁ', 'ἀθήνησι/ἀθήνευς', 'ῥήτορες/ῥήτωρ', 'ὑπὸ/ὑπὸ', 'τῆς/ὁ', 'ἐν/ἐν', 'τῷ/ὁ', 'λέγειν/λέγω1', 'θερμότητος/θερμότης', 'πρὸς/πρὸς', 'τὰ/τὰ', 'ἑπόμενα/ἕπομαι', 'τῆς/ὁ', 'βίβλου/βίβλος', 'βαθμηδὸν/βαθμηδὸν', 'ὑπεράλλεται/ὑπεράλλομαι']
print(len(lemmata))
162
print(len(set(lemmata)))
106
print(len(set(lemmata)) / len(lemmata))
0.654320987654321