Hunspell розшифровується як “угорський правопис”, і це найбільш просунута програма перевірки правопису якщо не враховувати Grammarly. А все тому що угорська мова – найбільш скажена в плані морфології. Тому якщо щось підходить для угорської – для інших європейських мов точно підійде.
sudo apt install hunspell hunspell-uk hunspell-de-de libhunspell-dev sudo pip install hunspell
hunspell має доволі простий інтерфейс для використання в мовах програмування (хоча й складні словники (читати man hunspell.5
)):
>>> import hunspell >>> spellchecker = hunspell.HunSpell('/usr/share/hunspell/uk_UA.dic', '/usr/share/hunspell/uk_UA.aff') >>> spellchecker.spell('ласка') True >>> spellchecker.spell('ласкає') False >>> spellchecker.suggest('ласкає') ['ласка', 'ласкам', 'лускає', 'ласках', 'ляскає', 'ласка є', 'скалатає']
І враховуючи що метод spell
по суті просто визначає чи належить слово до множини правильних слів мови, ми можемо побудувати наприклад функцію для розкладу слів на прості.
import hunspell EXAMPLES = ''' Landtagsabgeordneter,30039 Nationalsozialistischen,25081 Rechtswissenschaften,24718 Auseinandersetzungen,23109 Bundesverdienstkreuzes,22208 Rechtswissenschaftler,21113 Einwohnerentwicklung,20432 Landwirtschaftlichen,19085 Fußballnationalmannschaft,16235 Landschaftsschutzgebiet,13565 Bundesverdienstkreuz,12084 Reichsdeputationshauptschlusses,698 Sehnsuchtsland,13 ''' def test(): for line in EXAMPLES.splitlines(): if not line: continue word = line.split(',')[0].strip() print(word, '=', decompound(word)) spellchecker = hunspell.HunSpell('/usr/share/hunspell/de_DE.dic', '/usr/share/hunspell/de_DE.aff') def decompound(word): variants = list(decompound_(word)) variants.sort(key=lambda w: w.count('+')) return variants[-1] def decompound_(word): '''yield decompositions of word or if not found whole word if spelled correctly or None if spelled incorreclty''' word = word.capitalize() if len(word) < 6: if spellchecker.spell(word): yield word return for i in range(3,len(word) - 3): p1, p2 = word[:i], word[i:] ok1 = spellchecker.spell(p1) or ( p1.endswith('s') and spellchecker.spell(p1[:-1]) ) if ok1: for dp2 in decompound_(p2): yield p1 + '+' + dp2 if spellchecker.spell(word): yield word if __name__ == '__main__': test()
Sehnsuchtsland нема в словниках hunspell, бо воно у вікіпедії згадується лише 13 разів, зате Sehnsuchts (і очевидно Land) – є:
Landtagsabgeordneter = Land+Tags+Abgeordneter Nationalsozialistischen = National+Sozialistischen Rechtswissenschaften = Rechts+Wissen+Schaften Auseinandersetzungen = Aus+Einander+Set+Zungen Bundesverdienstkreuzes = Bundes+Verdienst+Kreuzes Rechtswissenschaftler = Rechts+Wissenschaftler Einwohnerentwicklung = Einwohner+Entwicklung Landwirtschaftlichen = Land+Wirtschaftlichen Fußballnationalmannschaft = Fuß+Ball+National+Mann+Schaft Landschaftsschutzgebiet = Land+Schafts+Schutz+Gebiet Bundesverdienstkreuz = Bundes+Verdienst+Kreuz Reichsdeputationshauptschlusses = Reichs+Deputat+Ions+Haupt+Schlusses Sehnsuchtsland = Sehnsuchts+Land
Ще воно неправильно розклало Deputat+Ions, але побачило можливість – розклало. Може іони мають бути виняток, бо вони часто трапляються як суфікс.