Hunspell
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, але побачило можливість – розклало. Може іони мають бути виняток, бо вони часто трапляються як суфікс.
Напишіть відгук