Closed PMKrol closed 1 year ago
stworzyłem tak na szybko plik z morfami, który zdaje się działać poprawnie https://madalinski.it/pb/morphems.txt
są tu błędy:
^?'e{{poradniapwn|id=15042|hasło=odmieniamy=.
(...)
^?ej[http://isip.sejm.gov.pl/servlet/search?todo=open&id=wmp19480780692=.a
(...)
^?snowi{{poradniapwn|id=986|hasło==.
Mogę też spróbować coś wygenerować. Podobno za długie morfy są obcinane xD (nie pamiętam gdzie to przeczytałem).
Na pewno są błędy, bo morfy tworzone są przy okazji tworzenia xdxf'a, chociaż i tak jestem zadowolony z tego jak (już) działa.
Wygląda jakby definicje wleciały do zmiennej z odmianami, może jest jakiś błąd w tabulacji *.txt (coś nie poszło z pythonowymi f-stringami?).
chłopiec chłopca, chłopcach, chłopcami, chłopce, chłopcem, chłopcom, chłopcu, chłopcy, chłopcy{{poradniapwn|id=10726|hasło=chłopak, chłopcze, chłopców, chłopiec
Edit: wywaliłem '{{' i '//' i posortowałem
Jeszcze to:
^?'owania=.'owanie
^?'owaniach=.'owanie
^?'owaniami=.'owanie
^?'owanie=.'owanie
^?'owaniem=.'owanie
^?'owaniom=.'owanie
^?'owaniowi=.'owanie
^?'owaniu=.'owanie
^?'owań=.'owanie
^?czas&nbs;rzyszły&nbs;rosty(ełniący=.otrafić
^?io=.'
Ale trzeba przyznać - robota pierwszoklaśna i chyba całkiem szybko!
Wrzuciłem wersję z Twoimi morfami, sprawdzisz? Co ciekawe nowa wersja jest lżejsza o 9 MB.
teraz w obu widzę te same błędy:
🙈
Ale to chyba jesteśmy ofiarami tej konwencji morphsów... Chyba, że...
Bo ja na początku skupiałem się na tej składni z /
(co mnie potwornie zniechęcało). Ty podszedłeś do tego w stylu 1:1 - co wydało mi się w sumie genialnym pomysłem, ale może autorzy mieli na myśli jednak coś sensownego.
Ja niestety nie mogę porobić testów, więc decyduj: uznajemy to za dość satysfakcjonujące czy popróbujesz z różnymi rozwiązaniami morphów?
Ja ze swojej strony mogę spróbować wygenerować morphy pod względem popularności (np. -ą -> -zacja powinna występować rzadziej niż -ą -> a). To też raczej półśrodek, ale zawsze... Dużo do przemyślenia, programowania pewnie trochę mniej.
1:1 nie działało w ogóle (za długa lista i coverter nie ogarniał), udostępniłem już i tak skróconą, ale regexy są problemowe. Chyba lepiej będzie gdy będzie mniej - te najpopularniejsze/uniwersalne. Będę kombinował, ale na razie dobrze jest jak jest (domyślny słownik EN/PL albo EN/EN jeszcze mniej ogarniał).
A spróbuj czegoś takiego: Najpierw ą=a/zacja, Potem ą=zacja/a. Nie pamiętam składni, ale wiesz o co mi chodzi, mam nadzieję ;)
Stwierdziłem, że najlepsza będzie mrówcza robota, w tej chwili mam taką listę:
^?ce=.cy ^?cym=.cy ^?dze=.dz ^?e=.a ^?ego=.y ^?ki=.k ^?ków=.k ^?na=.ny ^?ne=.ny ^?nym=.ny ^?ty=.ta ^?ów=. ^?ów=.owa ^?ą=.a ^?ędzy=.ądz
jeżeli coś jest głupie, ale działa...
To nie głupie tylko strasznie pracochłonne. Pewnie lepiej by było przeanalizować koniugacje w j. polskim i na ich podstawie to zbudować.
Jak generowałeś poprzednio morphy? To: ^?ą-miastem=.a-miasto
?
Niepokoi mnie ekonomistą -> ekonomizacja
, bo wg tego pliku tekstowego nie powinien przetłumaczyć -stą na -zacja.
Poprzednia lista tworzona była na podstawie pętli porównującej wyraz/hasło z odmianami, i odejmującej ostatnią literę z wyrazu, tak długo aż nie znalazła tego (skróconego) wyrazu w odmianie. Teraz ekonomistą/a jest poprawnie rozpoznawany, przy ponad 20k morfów w liście z automatu nie wiadomo co z czym porównywało (może byłoby lepiej gdyby zawsze zostawała choć jedna litera po prawej stronie, zamiast kropki).
Wstępna macierz morfów wygenerowana na podstawie różnic pomiędzy słowem a odmianą. Nieposortowane jeszcze. morphs_array.txt
["ek"]=>
array(48) {
["ka"]=>
int(3245)
["kiem"]=>
int(3676)
["kowi"]=>
int(3661)
["ku"]=>
int(3673)
["kach"]=>
int(3661)
["kami"]=>
int(3663)
["ki"]=>
int(3568)
["kom"]=>
int(3662)
["ków"]=>
int(3461)
["kowie"]=>
int(1013)
["ki,"]=>
int(3)
["kach,"]=>
int(37)
["kowie/animki"]=>
int(1)
["ków/animki"]=>
int(1)
["ce"]=>
int(200)
["ko"]=>
int(200)
["ką"]=>
int(200)
["kę"]=>
int(200)
["ku,"]=>
int(7)
["kach."]=>
int(9)
["kami."]=>
int(9)
["ki."]=>
int(9)
["kom."]=>
int(9)
["ków."]=>
int(9)
["kowie,"]=>
int(1)
["cy"]=>
int(6)
["ów"]=>
int(1)
["ka/daszku"]=>
int(1)
["u"]=>
int(1)
["ach"]=>
int(1)
["lom"]=>
int(1)
["kowie/"]=>
int(1)
["ki{{poradniapwn|hasło"]=>
int(1)
["owi"]=>
int(1)
["kiem,"]=>
int(2)
["ki}}"]=>
int(1)
["ęk"]=>
int(2)
["ękach"]=>
int(2)
["ękami"]=>
int(2)
["ęki"]=>
int(2)
["ękiem"]=>
int(2)
["ękom"]=>
int(2)
["ękowi"]=>
int(2)
["ęku"]=>
int(2)
["ęków"]=>
int(2)
["ka,"]=>
int(1)
["ku{{poradniapwn|hasło=miasto"]=>
int(1)
["kowie."]=>
int(1)
}
trzeba to czytać tak: jeśli znalazłeś słowo z końcówką -ek, poszukaj tego słowa z końcówką -ka, -kiem itd.
Wierzę, że jak zrobić ^?ek=.ka/.kiem
, to będzie po kolei szukał tych końcówek, więc kolejność wg popularności tu się sprawdzi. =>int(_popularność)
.
Od razu widać skąd mogły być problemy typu kilometromiejsce, np przez ["ku{{poradniapwn|hasło=miasto"]=>
Zdaje się, że odwrotnie - po lewej odmieniec, prawej słowo właściwe (właściwa końcówka), czyli dla powyższego przykładu:
^?ka=.ek
^?kiem=.ek
np. człowieka/człowiekiem -> człowiek Update: w zasadzie dla tego przykładu samo.k
byłoby poprawniejsze
Jeszcze jedna kwestia - sporo haseł z SJP to słowa odmienione/w liczbie mnogiej/zdrobnienia 🫣
Właśnie znalazłem taki przykład:
żołnierza -> żołnierzyk
Wg mnie kolejność jest jak należy
foreach($forms as $form){
$a_str = $form;
$b_str = $word;
if(strpbrk($a_str, "(){}[-],;='\"/?><.&#")!==false){
continue; //usuwa słowa z ^ tymi znakami
}
$a = mb_str_split($a_str);
$b = mb_str_split($b_str);
$len = min(count($a), count($b));
$pos = -1;
for($i = 0; $i < $len; $i++){
if($a[$i] != $b[$i]){
$pos = $i;
break;
}
}
if($pos > 2){ //przynajmniej różnica od 3 znaku, bo robił się problem z przedrostkami. Te trzeba zebrać z internetu, bo generowanie ich jest bez sensu.
$a_end = mb_substr($a_str, $pos);
$b_end = mb_substr($b_str, $pos);
@$morphs_arr[$a_end][$b_end]++;
}
}
Ale, niestety, może to być wina niekonsekwencji SJP. Myślałem kiedyś, żeby powyrzucać słowa, które są w odmianach innych słów, ale to wywaliłoby część słów pożądanych...
Usunąłem konwersje z popularnością <10. morphs_array.txt
Zobacz to: morphs.txt
Jeszcze trzeba by było skleić:
^?łaby=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łabym=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łabyś=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łam=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łaś=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łby=.ć/.ny/.nąć/.nie/.jący/.ony/.enie/.nia/.sz/.na/.j/.ty/.ący
^?łbym=.ć/.ny/.nąć/.nie/.jący/.ony/.enie/.nia/.sz/.na/.j/.ty/.ący
^?łbyś=.ć/.ny/.nąć/.nie/.jący/.ony/.enie/.nia/.sz/.na/.j/.ty/.ący
^?łeś=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.sz/.na/.j/.ty/.ący
^?ło=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łoby=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?ły=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.eł/.na/.j/.ący
^?łyby=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łybyście=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łybyśmy=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łyście=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
^?łyśmy=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
do ^?łaby/^?łabym/.../^?łyśmy=.ć/.nąć/.ny/.nie/.jący/.ony/.enie/.nia/.cie/.ty/.sz/.na/.j/.ący
To już powinno być proste ;)
Dobra, chyba gotowe. Sprawdź proszę, ja już mam dość na dziś ;) morphs2.txt
Zacna lista. To można nawet wyrzucić, bo póki co nie jest w ogóle używane:
%1=aąeęiouóy
%2=bcćdfghjklmnńpqrsśtvwxyzżź
(na moje to zbiór samogłosek/spółgłosek, używany odpowiednio jako 1/2 zamiast ?) Jak na razie wychwyciłem:
^?em=.o/.y/.a/.owie/.ów/.ie/.i/.u brakuje przypadków . i e na przykład: projektem wskazuje na projektodawca zamiast projekt miejscem wskazuje na miejscokilometr zamiast miejsce
To można nawet wyrzucić, bo póki co nie jest w ogóle używane: Racja.
z kropką to się zgadzam, e
to chyba greedy preg ;)
ten przypadek wpada w ^?m=.ć/.wie/.jący/.e/.ny/.nie/.ła/.nia/.ść/.j/.dzieć/.ły
Zgodziłbym się gdyby przykład z miejscem działał, ale nie działa. Z ciekawości sprawdziłem miejscee - też nie działa, ale działa za to miejsceem . PS: po dodaniu kropki projektem jest ok. Edit: po zastanowieniu - gdyby w przypadku z m była opcja kropki, to powinno zadziałać.
Już. morphs3.txt Nowy słownik na (w?) zabałaganionymiejscu.
Dla większości przypadków działa... ale znalazłem wyjątek, który niby powinien działać, ale nie działa:
wynalazku -> wynalezienie
Teoretycznie powinna zadziałać ta linijka:
^?ka/^?kach/^?kami/^?kom/^?kowi/^?ku/^?ków=.ek/.cy
cat morphs3.txt | grep ienie ^?=./.ć/.a/.o/.e/.in/.yć/.ić/.y/.ać/.eć/.cy/.ący/.enie/.ony/.jący/.i/.ny/.nie/.ieć/.ie/.ienie/.iony/.ła/.any/.sz/.wie/.ca/.ść/.ona/.em/.m/.ły/.enia ^?cie=.ć/.t/.ta/.yć/.ić/.ać/.eć/.ący/.enie/.ony/.ty/./.jący/.to/.ny/.nie/.ieć/.ść/.ienie/.iony/.ła/.any/.sz/.j/.ły/.ąca/.enia ^?my=.ć/.yć/.ić/.ać/.eć/.ący/.enie/.ony/./.jący/.ny/.nie/.ieć/.ienie/.iony/.ła/.any/.sz/.ść/.j/.ona/.ły/.enia ^?cież/^?myż=.yć/.ić/.ać/.eć/.ący/.enie/.ony/./.ć/.ieć/.ienie/.iony/.any/.ąca ^?że=.yć/.ić/.ać/.eć/.ący/.enie/.ony/./.ć/.zać/.ieć/.ienie/.iony/.c/.any/.gać/.ąca ^?ęście/^?edli/^?edliby/^?edlibyście/^?edlibyśmy/^?edliście/^?edliśmy/^?ęsie/^?ęsiecie/^?ęsiemy/^?ęsieni/^?ęsienia/^?ęsieniach/^?ęsieniami/^?ęsienie/^?ęsieniem/^?ęsieniom/^?ęsieniu/^?ęsiesz/^?ęsień/^?ęsiona/^?ęsione/^?ęsionego/^?ęsionej/^?ęsionemu/^?ęsiono/^?ęsiony/^?ęsionych/^?ęsionym/^?ęsionymi/^?ęsioną/^?ęsą/^?ęsę/^?ęsła/^?ęsłaby/^?ęsłabym/^?ęsłabyś/^?ęsłam/^?ęsłaś/^?ęsło/^?ęsłoby/^?ęsły/^?ęsłyby/^?ęsłybyście/^?ęsłybyśmy/^?ęsłyście/^?ęsłyśmy/^?ęś/^?ęścież/^?ęśli/^?ęśliby/^?ęślibyście/^?ęślibyśmy/^?ęśliście/^?ęśliśmy/^?ęśmy/^?ęśmyż/^?ęśże=.ąść ^?dł/^?dłby/^?dłbym/^?dłbyś/^?ceni/^?cenia/^?ceniach/^?ceniami/^?cenie/^?ceniem/^?ceniom/^?ceniu/^?ceń/^?ciecie/^?ciemy/^?ciesz/^?ciona/^?cione/^?cionego/^?cionej/^?cionemu/^?ciono/^?ciony/^?cionych/^?cionym/^?cionymi/^?cioną/^?tli/^?tliby/^?tlibyście/^?tlibyśmy/^?tliście/^?tliśmy/^?dli/^?dliby/^?dlibyście/^?dlibyśmy/^?dliście/^?dliśmy/^?dz/^?dzcie/^?dzcież/^?dzeni/^?dzenia/^?dzeniach/^?dzeniami/^?dzenie/^?dzeniem/^?dzeniom/^?dzeniu/^?dzeń/^?dzmy/^?dzmyż/^?dzona/^?dzone/^?dzonego/^?dzonej/^?dzonemu/^?dzono/^?dzony/^?dzonych/^?dzonym/^?dzonymi/^?dzoną/^?dzże/^?dą/^?dę/^?dnie/^?dniecie/^?dniemy/^?dniesz/^?dnij/^?dnijcie/^?dnijcież/^?dnijmy/^?dnijmyż/^?dnijże/^?dnięcia/^?dnięciach/^?dnięciami/^?dnięcie/^?dnięciem/^?dnięciom/^?dnięciu/^?dnięć/^?dną/^?dnę/^?dziona/^?dzione/^?dzionego/^?dzionej/^?dzionemu/^?dziony/^?dzionych/^?dzionym/^?dzionymi/^?dzioną/^?dła/^?dłaby/^?dłabym/^?dłabyś/^?dłam/^?dłaś/^?dłem/^?dłeś/^?dło/^?dłoby/^?dły/^?dłyby/^?dłybyście/^?dłybyśmy/^?dłyście/^?dłyśmy/^?siecie/^?siemy/^?sieni/^?sienia/^?sieniach/^?sieniami/^?sienie/^?sieniem/^?sieniom/^?sieniu/^?siesz/^?sień/^?siona/^?sione/^?sionego/^?sionej/^?sionemu/^?siono/^?siony/^?sionych/^?sionym/^?sionymi/^?sioną/^?sł/^?sła/^?słby/^?słbym/^?słbyś/^?słem/^?słeś/^?dnięto/^?dziono/^?dłszy=.ść ^?ziecie/^?ziemy/^?zieni/^?zienia/^?zieniach/^?zieniami/^?zienie/^?zieniem/^?zieniom/^?zieniu/^?ziesz/^?zień/^?ziona/^?zione/^?zionego/^?zionej/^?zionemu/^?ziono/^?ziony/^?zionych/^?zionym/^?zionymi/^?zioną/^?zł/^?zła/^?złaby/^?złabym/^?złabyś/^?złam/^?złaś/^?złby/^?złbym/^?złbyś/^?złem/^?złeś/^?zło/^?złoby/^?zły/^?złyby/^?złybyście/^?złybyśmy/^?złyście/^?złyśmy=.źć
Może pierwszy wiersz.
Wtedy rozbicie na dwa wiersze nic by nie dało...:
^?ka/^?kach/^?kami/^?kom/^?kowi/^?ku/^?ków=.ek/.cy
^?ku=.ek/.cy
Tak, tyle wystarczyło :|
Nie rozumiem. Edit. Sprawdzisz jakieś inne "długie" definicje? Może jest w tym jakaś reguła.
Przekonwertowałem plik xdxf używając listy morphs3.txt z dodatkową (nadmiarową) linijką ^?ku=.ek/.cy
i słownik wskazał na wynalazek zamiast na wynalezienie
Edit:
wyjątku -> wyjąwszy
zarazku -> zarazowate
kwotami -> kwotowanie
gwoździe -> gwoździk
półkami -> półkanton
może rozdzielanie slashem działa tylko za znakiem równości?
Sprawdź z dwiema końcówkami przed =, a ja niedługo wygeneruję wersję pojedyncza. Edit. Bez sensu. Wygeneruję od razu pojedyncze. Przecież to pewnie ma znikomy wpływ na produkt końcowy...
morphs4.txt - rozdzielenie nie wpłynęło na rozmiar słownika co do kB. Nowy słownik na stronie.
Trzymam kciuki.
edit. przepraszam, wpłyneło - wzrost wagi pliku o 4kB. xD
Sprawdziłem i jak dotąd tylko na gwoździach się rozdrobniło (bo przypadków z "źdź" brak), ale po za tym - RE-WE-LA-CJA. Dzięki wielkie!
Też dziękuję, myślę, że korporacje mogłyby nam pozazdrościć tempa. Ale jeszcze nie skończyliśmy. Zamykam ten wątek jako rozwiązany i zapraszam do nowego. Tym razem przedrostki ^^
Rozmowa z https://swiatczytnikow.pl/slownik-jezyka-polskiego-dla-kindle-nowa-wersja-luty-2023/comment-page-1/#comment-1387117