1 Востаннє редагувалося Vo_Vik (31.03.2020 01:05:10)

Тема: Частотний аналіз українського тексту

Пострадав трохи, давно джавою не бавився, то от таке вийшло

import java.util.Scanner;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;

public class Parser {
    public static void main(String[] args){
        int[] f1 =  new int[35];
        int[][] f2 = new int[35][35];
        for (int i = 0; i < 35; i++) {
            f1[i] = 0;
            for (int j = 0; j < 35; j++) f2[i][j] = 0;
        }

        try{
            char[] letters = "абвгґдеєжзиіїйклмнопрстуфхцчшщьюя’ ".toCharArray();
            char[] bletters = "АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ’ ".toCharArray();
            int total = 0;
            FileInputStream fstream = null;
            // command line parameter
            if(args.length != 1) {
                System.err.println("Invalid command line, exactly one argument required");
                System.exit(1);
            }
            
            try {
                fstream = new FileInputStream(args[0]);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Scanner sc = null;
            try {
                int i = 0;
                sc = new Scanner(fstream, "UTF-8");
                while (sc.hasNextLine()) {
                    int prev = 34;
                    int curr = 34;
                    String line = sc.nextLine();
                    int len = line.length();
                    total += len;
                    char[] line_c = line.toCharArray();
                    //System.out.println(line);
                    for (int j = 0; j < len; j++) {
                        for (int ii = 0; ii < 35;  ii++) {
                            if (line_c[j] ==  letters[ii] || line_c[j] ==  bletters[ii]) {
                                curr = ii;
                                break;
                            }
                        }
                        if (line_c[j] == "'".charAt(0) && prev < 33) curr = 33;
                        f1[curr]++;
                        f2[prev][curr]++;
                        //if ' is comming after space that is not apostrof
                        if (curr == 33 && prev > 32) curr = 34;
                        prev = curr;
                    }
                    i++;
                    //if (i>1000000) break;
                }
                // note that Scanner suppresses exceptions
                if (sc.ioException() != null) {
                    throw sc.ioException();
                }
            } finally {
                if (fstream != null) {
                    fstream.close();
                }
                if (sc != null) {
                    sc.close();
                }
            }
            FileWriter myWriter = new FileWriter("results.txt");
            
            myWriter.write("total: "+total+"\n");
            for (int i = 0; i < 35;  i++) {
                //System.out.println(letters[i]+"-"+bletters[i]+": "+f1[i]);
                myWriter.write(letters[i]+"-"+bletters[i]+": "+f1[i]+"\n");
            }
            for (int i = 0; i < 35;  i++) {
                for (int j = 0; j < 35; j++) {
                    //System.out.println(letters[i]+"-"+bletters[i]+": "+f1[i]);
                    myWriter.write(letters[i]+""+letters[j]+": "+f2[i][j]+"\n");
                }
            }
            myWriter.close();
        }catch (Exception e){//Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }


    }
}

Запускати через

java Parser Bibliya_1369054606.txt

Для цього файлу у мене вийшли такі результати

total: 3578675
а-А: 211077
б-Б: 54091
в-В: 170483
г-Г: 57867
ґ-Ґ: 1080
д-Д: 104972
е-Е: 126757
є-Є: 17491
ж-Ж: 23367
з-З: 58780
и-И: 178657
і-І: 179237
ї-Ї: 25475
й-Й: 41547
к-К: 73587
л-Л: 93010
м-М: 88977
н-Н: 161471
о-О: 286861
п-П: 73567
р-Р: 106416
с-С: 124620
т-Т: 123920
у-У: 89684
ф-Ф: 2270
х-Х: 38539
ц-Ц: 18099
ч-Ч: 28415
ш-Ш: 24069
щ-Щ: 17441
ь-Ь: 43199
ю-Ю: 22411
я-Я: 66785
'-': 2874
 - : 611263

Бачу наразі такі проблеми як, нема розрізнення між апстрофом і одиночними лапками в українських текстах.

Подякували: dot, P.Y.2

2 Востаннє редагувалося Vo_Vik (31.03.2020 01:02:37)

Re: Частотний аналіз українського тексту

Добавив

//if ' is comming after space that is not apostrof
                                if (ii == 33 && prev > 32) ii = 34;

В 48-му рядочку

3

Re: Частотний аналіз українського тексту

Хто має якісь цікаві тексти, кидайте.

4

Re: Частотний аналіз українського тексту

Takog pro vsjak treba zaznatcyty, ge Biblyja (pro kotru poky ne znaju, bulo by nepohano pokazaty joji tcy rozkazaty, jakctco je taka zmoha) ne je zrazkom dlja zvytcnoji movy, navitj dlja knygnoji pytomoji Ukrajynsjkoji, oskiljky:
– bahato tcoho je spetsyfytcnoho, osoblyvo jmenja.
– duge moglyvo, ge tam bahato tserkovnoSlovjanyzmiv.

5

Re: Частотний аналіз українського тексту

Mogu pidkazaty – mogec prohanjaty povz nacoho xvoruma, bhh. Ale tut treba, zjvisno, zjminyty kod.

6 Востаннє редагувалося Vo_Vik (31.03.2020 01:02:06)

Re: Частотний аналіз українського тексту

Джорж Орвел 1984
(видалив результати бо ламало сторінку на телефоні, внизу є упдейтнуті результати)

7

Re: Частотний аналіз українського тексту

Переробив підтримку апострофа і упдейтнув перше повідомлення теми.

8 Востаннє редагувалося Vo_Vik (31.03.2020 00:59:16)

Re: Частотний аналіз українського тексту

Тепер Орвел виглядає так(Загрузив в файл, бо ламало сторінку форуму на телефоні)

Post's attachments

results_orvel.txt 11.33 kb, 63 downloads since 2020-03-30 

9 Востаннє редагувалося Vo_Vik (31.03.2020 00:59:46)

Re: Частотний аналіз українського тексту

3-я частина Льоду і Полум'я - Бородьба мечів

Post's attachments

results.txt 11.75 kb, 129 downloads since 2020-03-30 

10 Востаннє редагувалося dot (30.03.2020 23:57:58)

Re: Частотний аналіз українського тексту

Бачу наразі такі проблеми як, нема розрізнення між апстрофом і одиночними лапками в українських текстах.

Rozriznjuje sja vidnosno lehko. Za normamy typoqrafyjy lapky takog vyokremjujutj sja lapkamy, tobto pravo/ljivorutc v zalegnostjy lapky bude probil. A apostrof – lyce bukvamy. Ale je problema, apostrofiv vi vgytku dekiljka, z vidomyx meni: ' ` ’ ʼ. takog dekotri dovbnjy mogutj napysaty pislja apostrofu probil, ale to rjidkistj.

11

Re: Частотний аналіз українського тексту

Бачу наразі такі проблеми як, нема розрізнення між апстрофом і одиночними лапками в українських текстах.

По-моєму, 'одинарні апострофові лапки' для української типографіки такі ж нетипові, як «подвійні кутові лапки» для англійської. По-перше, є нечасті випадки, коли слово закінчується на апостроф (мо', тре' і т.п.), що створює конфлікт з такими ж закриваючими лапками; не впевнений, але, можливо, подібним чином апостроф може виникати також і на початку слова замість пропущеної частини. По-друге, відкриваючі апострофові лапки (як правило, подвійні) пишуться знизу, а не зверху (поширені в наш час відхилення є наслідком недоробок ПЗ та необізнаності редакторів). По-третє, «лапки́» мають лише форму множини (на відміну від «дужок», де може бути й «дужка») — що натякає на відсутність практики використання одинарних лапок в українській письмовій традиції.

12

Re: Частотний аналіз українського тексту

Тим не менше у мене є кілька текстів на яких я запускав тест і там замість апострофа використовують одинарну лапку.
Але це в принципі нічого не міняє. Фактично мене цікавить апостроф тільки перед йотованими, щоб знати коли вони як читаються.

13 Востаннє редагувалося P.Y. (31.03.2020 16:02:47)

Re: Частотний аналіз українського тексту

Vo_Vik написав:

Тим не менше у мене є кілька текстів на яких я запускав тест і там замість апострофа використовують одинарну лапку.
Але це в принципі нічого не міняє. Фактично мене цікавить апостроф тільки перед йотованими, щоб знати коли вони як читаються.

1) На більшості українських розкладок апостроф (де він узагалі є) «програмістський» — '
2) Одинарні верхні прямі лапки (’) в ролі апострофа краще передають форму апострофа, тому часто рекомендують використовувати саме їх. У ролі власне лапок в українських текстах цей символ теж не використовується.
3) Ще є т.зв.  літера-апостроф (ʼ) — графічно подібна до одинарних лапок (втім, залежить від шрифта). Існують рекомендації використовувати в кириличних доменних іменах саме її, хоча на практиці це найменш поширений варіант.
4) Розповсюдженість у минулому розкладки без апострофа призвела до поширення в цій ролі сурогатів (", * та ін.) та пропусків апострофа. Чого, втім, у серйозних текстах, як правило, уникають. Хоча, якщо подвійні "програмістські" лапки використовуються і в ролі лапок, і в ролі апострофа, це справді може призвести до конфлікту.

P.S. 5) У сучасних текстах, що претендують на серйозність, у ролі апострофа подекуди трапляєть гравіс (`) та подібні до нього в частині шрифтів одинарні зворотні лапки (‛). Загалом, теж сурогат, який, проте, набув певної популярності. Знову ж, у ролі лапок він, як правило, в укр. текстах теж не використовується.

14

Re: Частотний аналіз українського тексту

Якщо цікаво попрацювати над програмами для аналізу, пошуку і т.п. укрмовних текстів, то зв'яжіться з цим чуваком

https://github.com/arysin