Popularność literek w polskich słowach

Zainspirowany grafiką obrazującą rozkład położenia liter w słowach (angielskich) znalezioną na reddicie postanowiłem sprawdzić jak to samo wygląda w języku polskim.

Aby sprawdzić na których miejscach w słowach występują poszczególne litery alfabetu potrzebujemy przede wszystkim słów. Bo alfabet znamy. Skąd wziąć słowa? Ze słownika, ktoś powie. Oczywiście to najlepsze miejsce – w słownikach są słowa, po to właśnie są słowniki. Ale słowniki mają jedną wadę – zawierają podstawowe formy słów (rzeczowniki w mianowniku, czasowniki w bezokoliczniku), co znacząco ogranicza liczbę dostępnych słów. A język polski jest bardzo bogaty w różne formy fleksyjne. Spróbujcie wymienić wszystkie możliwe wariacje na temat jakiegoś czasownika – najwięcej zabawy i rubasznego śmiechu będzie przy wulgaryzmach. Do każdego właściwie można dodać na początek wy-, przy-, za-, pod-, s-, roz-. Można dodać też się. Można odmienić czasownik przez osoby i liczby. Podobnie z rzeczownikami, przymiotnikami i innymi częściami mowy. Wystarczy spojrzeć na pierwszy z brzegu link znaleziony w Google.

I właśnie na taki worek słów (bardzo lubię angielskie określenie bag of words) się nastawimy. Bo im więcej kombinacji tym bliższe życiu wyniki użycia literek.

Dlatego nie skorzystamy ze słownika, a z gotowych tekstów – w tym przypadku z ośmiu książek, które już analizowaliśmy w odcinku poświęconym sprawie kryminalnej poszukiwania autora. Im więcej tekstów, najlepiej różnych autorów i z różnych dziedzin, tym większy zbiór słów. W poszukiwaniu danych do dzisiejszego postu natrafiłem na stronę PWN o korpusie języka polskiego – mowa tam o stu milionach słów! Na pewno z uwzględnioną fleksją, bo słów w naszym języku jest zapewne mniej (w formach podstawowych).

Ale nie mamy tych 100 milionów słów, musimy polegać na tym co mamy.

Zaczniemy od potrzebnych pakietów:

Następny krok to wczytanie tekstów. Jak wspomniałem – wykorzystamy książki Zygmunta Miłoszewskiego oraz Remigiusza Mroza (po cztery), skonwertowane do formatu TXT. Każdą z książek wczytujemy do tabeli:

Trochę czyścimy dane pozbywając się znaków przestankowych, cudzysłowów i sprowadzając wszystko do małych liter. Na koniec każde ze słów traktujemy specjalną funkcją, która ponumeruje nam literki w słowie:

Dane już gotowe (mamy nieco ponad 88 i pół tysiąca słów), więc możemy sobie coś pooglądać.

Ale najpierw coś dla fanów Sherlocka Holmesa i opowiadania “Tańczące sylwetki”. To moje ulubione opowiadanie z serii o Holmesie; gdzieś w młodości przeczytane u ciotki na strychu. Idealnie wpasowuje się w chęć młodzieńca lubiącego poszukiwania, rozwiązywanie zagadek, bardzo klarownie pokazuje logiczne i metodyczne podejście do rozwiązywania problemów. Tego wymaga się od analityków (rozumianych jako data scientist – Wiki twierdzi, że polski odpowiednik to mistrz danych… co za bullshit).

Dla tych, którzy nie znają opowiadania mały skrót z fabuły (tej kluczowej tutaj części). Sherlock zajmuje się sprawą tajemniczych zaszyfrowanych liścików – zamiast liter na kartkach narysowane są postacie z różnym ułożeniem rączek i nóżek. Listów jest coraz więcej (coraz więcej danych!), dzięki czemu Sherlock jest w stanie przyporządkować sylwetką odpowiednie litery alfabetu.

Wychodzi od wiedzy, że litera E jest najpopularniejsza w angielskim słowie pisanym oraz długości poszczególnych słów – bardzo łatwo rozpoznać “the”, a jak się ma “the” to ma się już trzy symbole. Z czego dwa użyte w “have”, co prowadzi do kolejnych dwóch. Które to a możemy zweryfikować po “at” (oraz samym “a” przed rzeczownikami), zaś po “to” można odszukać sylwetkę dla “o”. “O” oraz “a” pozwolą na weryfikację “n” (na podstawie “on” oraz “an”). I tak dalej, i tak dalej. A wymieniłem tylko kilka podstawowych słów: the, have, on, a, an, at, co daje już siedem liter (z 26 używanych w języku angielskim) – ponad 1/4.

To trochę jak rozpoznawanie kotów na obrazach, czyż nie? Koty Sieci neuronowe trzeba nakarmić (nauczyć) dużą ilością danych – mamy dużo liścików, dużo sylwetek. Później już “tylko” pozostaje odnalezienie odpowiednich patternów.

Sprawdźmy zatem czy wiedza Sherlocka Holmesa o najpopularniejszej literze E ma zastosowanie w języku polskim:

I Sherlock by się pomylił. Najpopularniejsze jest A, E zaś jest dopiero czwarte.

Widać też coś, czego zapewne sobie nie uświadamiamy: najpopularniejsze są samogłoski (kolejno: a, i, o, e). Co więcej, około 42% wykorzystywanych liter to samogłoski (rozumiane jako jedna z a, ą, e, ę, i, o, ó, u, y). Reszta to oczywiście spółgłoski.

Sherlockowi pomogło the – słowo trzyliterowe. A jak wygląda rozkład długości polskich słów?

Wybierając informacje z powyższego histogramu bez ogona można zgodnie z testem Shapiro-Wilka stwierdzić, że to rozkład bliski rozkładowi normalnemu. Pojawia się ów ogon – najdłuższe słowo użyte w 8 badanych tekstach ma 52 znaki (jest to MuszeToKomusWyznacKochamKsiedzaMarkaNieMogeZycPomocy, które jako treść SMSa pada w Uwikłaniu Miłoszewskiego). Cała reszta słów jest krótsza niż 25 znaków (wszystkie dłuższe słowa to: siedemdziesięcioprocentowy, trzydziestosiedmiocalowego, osiemdziesięciosześcioletnia, trzydziestodziewięciostopniową, dziewięćdziesięcioprocentowego oraz wspomniany SMS), zatem dalsze rozważania ograniczymy do słów do 25 znaków włącznie.

Dochodzimy do zamierzonego celu, czyli odpowiedzi na pytanie na jakiej pozycji w słowie występują poszczególne litery?. Zobaczmy to dla każdej z liter z osobna:

Co tutaj widać? Przede wszystkim różną skalę dla każdego z wykresów, na to należy zwrócić uwagę.

Ale nas interesuje każdy z tych wykresów z osobna, a tutaj widzimy, że S występuje najczęściej na początku słowa jako jedna z pierwszych liter (pierwsza prawdę powiedziawszy), podobnie W, P, F czy M. Samogłoski są na kolejnych pozycjach. Tyle tylko, że są to wartości bezwzględne, a słowa jak widzieliśmy mają różną długość – raz pozycja numer trzy to środek słowa, a raz jego koniec.

Musimy zatem przejść na wartości bezwzględne – na przykład na procent długości słowa:

Z przeliczeniem na procenty jest pewien kłopot – dla słowa trzyliterowego każda z liter to już krok o 33%. Ale abstrahując od tego problemu widzimy, że:

  • to co poprzednio: F, P, S, W oraz Z rozpoczynają słowa
  • A, Ą, E, Ę, I, J, M, U kończą słowa
  • Ć jest tutaj niesamowite – właściwie tylko jako ostatni znak. W połączeniu z Ś (też dominacja na końcu) mamy końcówkę -ść
  • podobnie jest z Ń i Y – najczęściej są ostatnimi literami
  • H podobnie – końcówka -ch
  • ciekawostką jest X – pojawia się rzadko, zapewne w nazwach leków, marek lub firm (niepokonany schemat nazewnictwa firm z lat ’90 XX wieku – Pol-Ex). Ale występuje też w numerach rozdziałów (teksty nie były czyszczone z tego typu elementów)
  • analogicznie jest z Q – występuje jeszcze rzadziej (słowa: tequila, squash i aquapark)
  • Ó występuje najczęściej pod koniec – to wszystkie końcówki -ów
  • B, D, K, L, O, R, T, Z, Ź i Ż dominują w środkach wyrazów

Zestawiając oba wykresy (bezwzględną pozycję w słowie i “pozycję” procentową) widzimy, że:

  • Ą jest najczęściej 5-8 literą, a jednocześnie raczej ostatnią – to słowa 5-8 literowe, takich słów mamy ponad 2200
  • podobnie jest z Ę
  • O występuje najczęściej w okolicach 15-20% długości wyrazu jednocześnie będąc najczęściej drugim znakiem. Skoro 2 znaki to 15% (lub 20%) to całość to słowo ma 13 lub 14 znaków (dla 20% – 10 znaków). Znacie takie słowa? Chwila na zastanowienie się… Znowu mamy ich około 2300, a przykładowe to postanowił oraz powinienem albo monopolowy
  • Ł występuje w 85-90% oraz 95-100% długości słowa jednocześnie będąc gdzieś 5-8 literką. Jakieś 8 tysięcy słów, od urodziłam do zdechł

Bardzo przyjemna rozrywka intelektualna: szukanie słów przy znajomości położenia danej litery i długości słowa. Przypomina scrabble albo krzyżówkę, prawda?

Wróćmy do rozkładu literek po pozycji w wyrazie i zobaczmy te same dane nieco inaczej – w postaci heatmapy:

Widzimy, że żadne słowa nie zaczynają się na Ą, Ę czy Ń. To dość oczywiste.

(nieco) Mniej oczywiste jest to, że Ć nie występuje na drugiej pozycji (ale może być pierwsze – chwila na zastanowienie się – ćpać i okolice oraz ćwiczenia i pochodne). Z Ń jest tak samo, jest dopiero na trzecim miejscu. Wiecie w jakim słowie? W wielu:

Należy pamiętać, że baza słów pochodzi z kilku książek, a nie ze wszystkich słów w języku polskim. Jest to fajna próba, ale raczej nie 100% reprezentatywna.

Zobaczmy jeszcze które litery występują po sobie?

Aby to uzyskać grupujemy dane według słów i przesuwamy (w dodatkowej kolumnie) o jeden każdą literkę. Dzięki temu w wierszu otrzymamy literkę oraz jej następnika – tak słowo po słowie. Następnie zliczamy pary literek.

Mając przygotowane dane możemy pokazać heatmapkę z kolejnością liter – która po której i jak często?

Widać wręcz kilka najmocniejszych połączeń. Najpopularniejsze zbitki to:

Nie. To najpopularniejsza zbitka. Do tego nasze ortograficzne problemy: rz, ch (a takie cz jest bardziej popularne niż ch). Na wykres nie załapało się ść (287 na liście popularności, dla porównania śc – 128), ąc (jest 44 na liście), ów (jest 89) a także uj (94).

 

Fajne? Podziel się linkiem do tekstu ze znajomymi (tam są takie ikonki na dole) albo wrzuć na Wykop. Napisz co myślisz w komentarzu. Zapraszam też na facebookowy fanpage Dane i Analizy gdzie trailery i teasery nowych wpisów, a także linki do ciekawych treści o analizie danych.

6 myśli na temat „Popularność literek w polskich słowach

  1. Jestes absolutnie odjechany… czytam z zapartym tchem.
    Biorę się za R bo to co robisz to z jednej strony fun, z drugiej fantastyczne narzędzie poznania świata takim jakim jest. A to przydatne i prywanie i w pracy.

    Brawo.

    Moja znajomosc R do wczoraj byla 0. Będę wdzięczny jeżeli zrobisz kilka tekstów, które pozwolą komuś z nikłą znajomością R odtworzyć to co robisz. Nie wiem czy z tymi analizami mi się uda – dopiero będę próbował.

    Pozdro,
    M

    • Idea jest taka, żeby pokazane kody źródłowe dały się uruchomić u każdego. Najczęściej sprawdzam je na R w wersji 3.2.1 (tak, taką archaiczną mam w pracy – strasznie utrudnia to aktualizację pakietów; niestety bezpieczniki nie dopuszczają oprogramowania, którego nie znają) i 3.4.0 (na AWS) albo 3.4.1. (w domu).
      Nie chcę (i szczerze mówiąc nie zamierzam) prowadzić „kursu programowania w R”. Są od tego inne miejsca i książki (zobacz ostatni wpis). Ja wolę skupić się na konkretnych zastosowaniach.

  2. Otóż jest pod poniższym linkiem, od razu w gotowej formie to analizy, zawiera 2 906 483 unikalnych slow, choć o maksymalnej długości 15 znaków, z uwagi na ograniczenia planszy do gry…

    https://sjp.pl/slownik/growy/

    Na marginesie, jest także plik z pełnym słownikiem, choć pewnie oczyszczenie takiego pliku byłoby dosyć kłopotliwe.

    W każdym razie, owszem, próbuję samodzielnie sobie powtórzyć analizę, jako że interesuję się grami słownymi i miałbym kilka wstępnych pytań:

    Jeżeli już na wejściu mam prawie 3 miliony słów, tj. wierszy, to ile wierszy może liczyć output z funkcji znaki_df? Czy a) mielenie tego nie będzie trwało godzinami b) jaki jest w ogóle górny limit wierszy na jeden df?

    Puściłem sobie te funkcję na bardzo okrojonym zbiorze, żeby sobie przetestować jak to wygląda, ale później natknąłem się na taki błąd „object ‚pl_znaki’ not found.” Czy coś ominąłem po drodze?

    • pl_znaki faktycznie nie ma w kodzie pokazanym w poście (gdzieś mi musiało umknąć), ale to po prostu kolejne małe polskie litery alfabetu, razem z tymi z ogonkami – można użyć wbudowanego w R LETTERS żeby i dodać polskie literki, konkretnie:

      pl_znaki < - tolower(c(LETTERS, "ą", "ć", "ę", "ł", "ń", "ó", "ś", "ź", "ż"))

      Godzinami to chyba nie będzie trwało, chociaż kod jest dość czasochłonny (każde słowo rozbijane nie za bardzo efektywną funkcją na pojedyncze znaki - można znaleźć lepsze rozwiązanie).
      Tutaj (w przypadku słownika z SJP) jeszcze jest ta szczęśliwa sytuacja, że znamy maksymalną długość słowa - z góry można założyć, że mamy 15 kolumn (maks 15 znaków) i w nich umieszczać kolejne litery. Dla przykładu słowo "kot" w kolumnie pierwszej miałoby literę "k", w drugiej - "o", w trzeciej "t". W czwartej i kolejnych NA. Później lepiej policzyć ile jakich liter jest w danej kolumnie. To da ten czerwony wykres (pozycja liter w słowach).

      Limit wierszy (i kolumn) dla data frame to limit dostępnego miejsca w pamięci. Przy większych rozmiarach danych warto skorzystać z jakiejś bazy - chociażby SQLowej, a w przypadku braku serwera - SQLite.

Dodaj komentarz