Closed misog closed 3 months ago
spellchecker (akýkoľvek) nie je na opravovanie chýb ale na detekciu chýb. Čiže sa snažíte použiť nástroj na účel, na ktorý nebol nebol vytvorený. Návrhy na opravu sú poskytnuté algoritmom, čím viac je chýb v slove, tým menšia šanca, že ponúkne "očakávané správne slovo".
Ďakujem za vysvetlenie. V projekte Hunspell som sa dočítal:
Highly customizable suggestions: word-part replacement tables and stem-level phonetic and other alternative transcriptions to recognize and fix all typical misspellings, don't suggest offensive words etc.
Môže hunspell slovník obsahovať vlastné návrhy slov ku chybným slovám, ktoré potom využije Hunspell knižnica? Ak áno, potom by bolo možné:
Doplňujúca otázka mimo slovníka: Tie algoritmy, ktoré generujú návrhy slov (suggestions) vo Firefox a LibreOffice, sú implementované Firefoxom a LibreOffice, alebo knižnicou Hunspell? Ak sú implementované knižnicou Hunspell, je možné ich upraviť pre potreby konkrétneho jazyka?
Pozrel som sa na to, ako LibreOffice generuje návrhy slov (suggestions). Ide o to, či je návrh v slovníku a aká je priorita návrhu:
Spelling suggestions are picked from all installed dictionaries for the particular language. If you don’t see some suggestion, it’s either missing in the dictionaries or not similar enough to the misspelled word.
Pri slove motyl
je navrhovaných málo slov, takže to naznačuje, že problém nie je v tom, že správne slovo motýľ
by bolo "priveľmi vzdialené". Ale taktiež je možné, že správne slovo motýľ
sa generovalo pridlho.
V tomto článku je uvedený algoritmus, ako funguje Hunspell a ako prioritizuje návrhy slov a že čas generovania je limitovaný. Tu je prehľad pravidiel:
- Change the word to the uppercase (see also “Word case” sub-section below);
- Replace common misspellings, like “f”→”ph” and vice versa, defined by REP table from aff-file;
- Split the word in two parts in every position (with space or dash), to be tested as a single dictionary entry, like “ad hoc” (see also #13 below);
- Replace related chars, like “a”, “å”, “ä”, defined by MAP table from aff-file;
- Swap every two adjacent letters, oh, and for 4- and 5-letter words also try two swaps: “ahev” → “have”;
- Swap two non-adjacent letters (up to distance 4);
- Replace every letter with the adjacent on the keyboard, e.g. “miraclw” → “miracle”. The keyboard layout is defined by KEY directive in aff-file; and, on the same step, with the capitalized version of the character (“paris” → “Paris”, but not vice versa), also considered as a possible keyboard-related error;
- Remove every letter in turn;
- Insert every letter from the language’s alphabet (defined by TRY directive in aff-file) into every position;
- Move every letter forward and backward into all possible positions;
- Replace every letter with every other letter from the language’s alphabet;
- Find a duplicated pair of letters and remove it: “chicicken” → “chicken”;
- Split the word in two in every position, to be tested as two separate words (see also #3 above).
Akým spôsobom je možné upraviť slovník tak, aby ten algoritmus správne navrhoval slová s viacerými chybami v diakritike?
Všimol som si, že hunspell-sk aktuálne neobsahuje MAP. MAP je spomenutý v bode 4. v súvislosti so znakmi “a”, “å”, “ä”
. Pomohlo by definovať MAP?
Eventuálne by možno išlo vytvoriť REP s dvojicami motyl
-> motýľ
... Aký veľký by potom bol slovník?
To repovanie dvojíc podľa mňa nemá zmysel - ono by sa to muselo vytvoriť pre všetky varianty slova. A to nehovorím o komplikáciách v štýle "sud
" (čo je správne: sud
alebo súd
) a k tomu "sut" -> má to byť "suť
" alebo "šút
", alebo je to preklep k "sud
" prípadne "súd
"???
Odstrániť diakritiku je jednoduché - doplniť vôbec nie. Česi mali na to (dávno) nejaký nástroj, ale nepamätám si jeho názov a neviem ho nejako nájsť.
Ak niekto má nápad, kto to riešiť inteligentne v hunspell-sk, tak rád akceptujem pull request.
Repovanie by sa nemuselo vytvoriť pre všetky varianty slova, ale len pre každé slovo: ascii(slovo) -> slovo.
Otázka znie tak, či je možné definovať REP tak, aby to neafektovalo detekciu chýb, ale iba návrhy slov v spomínanom algoritme?
REP je eventuálne riešenie, ktoré by fungovalo za cenu veľkého súboru a možného ovplyvnenia samotnej detekcie chýb (?).
Algoritmus pre návrh slov má však ďalší bod s nižšou prioritou, ktorý vyzerá, že je priamo určený pre návrhy slov s nesprávnou diakritikou (MAP):
4. Replace related chars, like “a”, “å”, “ä”, defined by MAP table from aff-file;
Hunspell-sk aktuálne neobsahuje MAP. Pomohlo by definovať MAP?
Pridal som MAP - skúste či to pomôže (resp. či je potrebné dodefinovať aj veľký písmená).
Inak pre cestinu maju na pridanie diakritiky vlastny nastroj: https://nlp.fi.muni.cz/cz_accent/. Zdrojaky k tomu nie su, ale podla https://nlp.fi.muni.cz/raslan/2012/paper14.pdf pracuje s frekvenciou vyskytu. Podobny postup je navrhnuty aj Hackovani.
Zaujimavy je vysledok:
- Slova neumožňující přidání diakritiky: 58,4%
- Slova vyžadující přidání diakritiky právě jedním způsobem: 18,9%
- Slova s více variantami oháčkování: 22,7%
- Průměrná míra nejednoznačnosti: 1,24
Funguje! Po nahradeni suboru /usr/share/hunspell/sk_SK.aff
a restartovani LibreOffice, sa zacali objavovat spravne navrhy:
Pri MOTYL
ostava spravny navrh vysoko. Pri velkom zaciatocnom pismene Motyl
sa spravny navrh posunie nizsie. Ale samotné veľké písmená, zdá sa, netreba definovať v MAP.
@zdenop Zdravím, všimol som si, že sekcia MAP obsahuje aj písmená ö
a ü
, ktoré nie sú súčasťou slovenského jazyka, a zároveň neobsahuje napríklad písmeno ů
, ktoré je súčasťou českého jazyka.
https://github.com/sk-spell/hunspell-sk/blob/d4f4383564caeb1ce58dc4c5bf08d939d34797ba/sk_SK.aff#L74
Neviem či je vhodnejšie zahrnúť do MAP iba slovenské písmená alebo zahrnúť aj písmená z ďalších jazykov, ktoré ovplyvňujú slovenčinu. Čo myslíte?
Okrem toho, v slovenčine sú aj písmená dz
, dž
, ch
a tie sa v MAP v hunspell-sk aktuálne nenachádzajú. Praktický zmysel pridať ich do MAP má pre slová ako nechcený
s preklepom nehceny
(tu sú dve chyby, takže je potrebná detekcia viacerých chýb cez MAP). Aktuálne, keď nie sú definované tieto písmená, to nefunguje dobre:
Štandard umožňuje definovať aj dvojznakové písmená, minimálne takto:
Use parenthesized groups for character sequences (eg. for composed Unicode characters):
MAP 3
MAP ß(ss) (character sequence)
MAP fi(fi) ("fi" compatibility characters for Unicode fi ligature)
MAP (ọ́)o (composed Unicode character: ó with bottom dot)
Zdroj: https://manpages.ubuntu.com/manpages/xenial/man5/hunspell.5.html
Takže ak funguje MAP ß(ss)
, tak by fungovalo aj MAP h(ch)
. Alebo MAP (ch)h
?
Podľa man müsli
a röntgen
sú súčasťou slovenského jazyka. Na spisovné slovenské slovo s ů
si nespomínam.
Ten MAP h(ch)
/ MAP (ch)h
môžete otestovať? Ja momentálne nejako nestínam...
Pravda. Tie písmená ü
a ö
nie sú súčasťou slovenskej abecedy, ale sú súčasťou prevzatých slov.
Otestoval som MAP h(ch)
v sekcii MAP a funguje to, navrhne spravne slovo pri dvoch preklepoch. Pridanie opacne, teda MAP ch(h)
nema ziadny ucinok.
IMO toto bolo vyriešené pre 9 mesiacmi https://github.com/sk-spell/hunspell-sk/commit/78a0dea27206db6610666a4d2c01d406c97f0a2d
@zdenop
Skvelé, ďakujeme za dlhodobú prácu na hunspell-sk, ktorý sa dostáva do mnohých opensource projektov ako Firefox, LibreOffice a ďalších.
Dobrý deň, zdá sa, že softvér s hunspell-sk (LibreOffice, Firefox, ...) aktuálne správne deteguje iba jednu chybu v diakritike. Ak je slovo napísané s dvoma chybami v diakritike, nenavrhne sa správna oprava. Napríklad, slovu
motyl
chýba dĺžeň a mäkčeň a hunspell-sk nenavrhnemotýľ
. Je to problematické, keď je text písaný bez diakritiky (napr. v LibreOffice) a následne sa diakritika dopĺňa.