sk-spell / hunspell-sk

Slovak dictionary for hunspell
Mozilla Public License 2.0
19 stars 7 forks source link

Detekcia viacerých chýb v diakritike #42

Closed misog closed 3 months ago

misog commented 2 years ago

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 nenavrhne motýľ. motyl Je to problematické, keď je text písaný bez diakritiky (napr. v LibreOffice) a následne sa diakritika dopĺňa.

zdenop commented 2 years 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".

misog commented 2 years ago

Ď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é:

  1. Vygenerovať ASCII zoznam všetkých slov (zapamätať pôvodné relevantné slová)
  2. Ku každému ASCII slovu, ktoré môže byť aj chybným slovom, pridať pôvodné relevantné slová

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?

misog commented 2 years ago

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:

  1. Change the word to the uppercase (see also “Word case” sub-section below);
  2. Replace common misspellings, like “f”→”ph” and vice versa, defined by REP table from aff-file;
  3. 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);
  4. Replace related chars, like “a”, “å”, “ä”, defined by MAP table from aff-file;
  5. Swap every two adjacent letters, oh, and for 4- and 5-letter words also try two swaps: “ahev” → “have”;
  6. Swap two non-adjacent letters (up to distance 4);
  7. 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;
  8. Remove every letter in turn;
  9. Insert every letter from the language’s alphabet (defined by TRY directive in aff-file) into every position;
  10. Move every letter forward and backward into all possible positions;
  11. Replace every letter with every other letter from the language’s alphabet;
  12. Find a duplicated pair of letters and remove it: “chicicken” → “chicken”;
  13. 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?

zdenop commented 2 years ago

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.

misog commented 2 years ago

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?

zdenop commented 2 years ago

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
misog commented 2 years ago

Funguje! Po nahradeni suboru /usr/share/hunspell/sk_SK.aff a restartovani LibreOffice, sa zacali objavovat spravne navrhy: Screenshot from 2022-09-12 10-26-25 Screenshot from 2022-09-12 10-26-32 Screenshot from 2022-09-12 10-28-33

misog commented 2 years ago

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. Screenshot from 2022-09-12 10-35-01 Screenshot from 2022-09-12 10-35-08

misog commented 1 year ago

@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, , 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: Screenshot from 2023-08-02 12-38-25

Š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?

zdenop commented 1 year ago

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...

misog commented 3 months ago

Pravda. Tie písmená ü a ö nie sú súčasťou slovenskej abecedy, ale sú súčasťou prevzatých slov.

misog commented 3 months ago

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. n

zdenop commented 3 months ago

IMO toto bolo vyriešené pre 9 mesiacmi https://github.com/sk-spell/hunspell-sk/commit/78a0dea27206db6610666a4d2c01d406c97f0a2d

misog commented 3 months ago

@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.