enky’s essays

скільки слів на букву «…»?

можливо ви колись бачили чи чули такий факт, що «в українській найбільше слів починаються на букву “п”». але я завжди до цього ставився скептично — бо жодних доказів чи іншої статистики подано не було. тому я написав невеличку програму на пітоні, яка проходить через великий електронний словник української мови та перелічує, скільки лем починаються на якусь букву. отже, ось сам код:

import re, locale

# відкриває список слів з лемами і тегами, а точніше ВЕСУМ (https://github.com/brown-uk/dict_uk/tree/master)
dictionary = open("C:\\Program Files\\Git\\dict_uk\\out\\dict_corp_lt.txt", "r")

# підготовлює список лем і таблицю частот слів
dictm = []
flfreq = {}

alphabet = list("абвгґдеєжзиіїйклмнопрстуфхцчшщьюя'")

# теги, які будуть ігноровані
badtags = {"foreign", # запозичення
           "ua_1992", # старий правопис
           "abbr", # абревіатури
           "alt", # альтернативні форми
           "intj", # вигуки
           "prop" # власні назви
           }

# бере кожне слово у словнику, ігнорує саме слово, але зберігає лему…
for line in dictionary.readlines():
    # … лему бере сюди,…
    lemma = line.strip().split(" ")[1]
    # … теги — сюди,…
    tags = line.strip().split(" ")[2].split(":")
    # …, але якщо хоч один із тегів мені не подобається, ігнорує.
    if not any(tag in badtags for tag in tags):
        dictm.append(lemma.lower())

# словник слів тепер нам більше не треба
dictionary.close()

# конвертує список лем спочатку у множину (тобто видаляє дублікати), а потім знову у список
dictm = list(set(dictm))
# налаштовує сортування на українську мову (тобто на український порядок алфавіту).
locale.setlocale(locale.LC_ALL, "uk_UA.UTF-8")
# … і сортує за алфавітом
dictm.sort(key=locale.strxfrm)

# для кожної букви в алфавіті,…
for letter in alphabet:
    # … спочатку налаштовує кількість слів на цю букву на 0 (бо ми ще нічого на цю букву не налічили),…
    flfreq[letter] = 0
    # (створює регулярний вираз для перевірки)
    regex = "^"+letter+".*"
    # …, а потім для кожного слова на цю букву додає 1
    for word in dictm:
        if re.match(regex, word):
            flfreq[letter] += 1
        else:
            continue

# відкриває файл для зберігання результату …
output = open("output.txt", "w+")

# … і в нього записує букву та кількість слів на цю букву …
for item in flfreq:
    output.write(f"{item}: {flfreq[item]}\n")

# … і цей файл нам теж більше не треба.
output.close()

а також його результат:

буква кількість
а 10637
б 13388
в 33013
г 10598
ґ 331
д 15400
е 4963
є 719
ж 1856
з 26647
и 9
і 3974
ї 95
й 259
к 17074
л 5435
м 12000
н 28486
о 14907
п 60927
р 16098
с 24467
т 10597
у 7964
ф 5142
х 3566
ц 1754
ч 2928
ш 3868
щ 7054
ь 0
ю 290
я 4867
' 1

стовпчикова діаграма

а ██████████▊10637
б █████████████▌13388
в █████████████████████████████████▏33013
г ██████████▋10598
ґ ▍331
д ███████████████▌15400
е █████4963
є ▊719
ж █▉1856
з ██████████████████████████▊26647
и ▏9
і ████3974
ї ▏95
й ▍259
к █████████████████▏17074
л █████▌5435
м ████████████12000
н ████████████████████████████▌28486
о ███████████████14907
п █████████████████████████████████████████████████████████████60927
р ████████████████▏16098
с ████████████████████████▌24467
т ██████████▋10597
у ████████7964
ф █████▎5142
х ███▋3566
ц █▉1754
ч ███2928
ш ███▉3868
щ ███████▏7054
ь 0
ю ▍290
я ████▉4867
' ▏1

із цікавого

#language #numbers #ukrainian