Monthly Archives: Січень 2020

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