Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import static java.lang.StrictMath.log;
- public class Entropy {
- public static String text = "Погиб поэт!- невольник чести - Пал, оклеветанный молвой, " +
- "С свинцом в груди и жаждой мести, Поникнув гордой головой!.. " +
- "Не вынесла душа поэта Позора мелочных обид, " +
- "Восстал он против мнений света Один, как прежде... и убит!";
- public static String alphabet = "абвгдежёзиклмнопрстуфхцчшщьыъэюя";
- public static void main(String[] args) {
- text = text.replaceAll("\\s+", ""); //удаляем пробелы
- text = text.replaceAll("[^а-яA-Я ]", "").toLowerCase(); //удаляем знаки препинания и приводим к нижнему регистру
- char[] alphabetInCharArray = alphabet.toCharArray(); //переводим строку в массив символов
- double entropy = 0.0;
- for (int i = 0; i < alphabet.length(); i++) {
- entropy = entropy + EntropyFormula(alphabetInCharArray[i]); // Σp(x)log2p(x),
- }
- System.out.println("H "+entropy);
- for (int i = 1; i <= 5 ; i++) {
- System.out.println("H"+i+" = "+ round(entropy/i)); //подсчет энтропии H1, ... , H5
- }
- }
- private static double EntropyFormula(char elemInArray) {
- double entropy = 0;
- int numbOfLetters = 0;
- int i = 0;
- double entr_i;
- while (i < text.length() - 1) {
- char ch = text.charAt(i); //присваиваем символу символ в строке по индексу i
- if (ch == elemInArray) { //сравниваем символ с символом алфавита
- numbOfLetters += 1; //если равен, увеличиваем счетчик на один
- i = i + 1;
- }
- else i++; //если нет, переходим к след. символу строки
- }
- double probability = (double) numbOfLetters / alphabet.length(); //считаем вероятность
- if (numbOfLetters == 0) {
- entr_i = 0;
- }
- else {
- entr_i = log(1 / probability) * (1/probability); //p(x)log2p(x)
- }
- entropy = entropy + entr_i;
- return entropy;
- }
- private static double round(double value) {
- BigDecimal bd = new BigDecimal(Double.toString(value));
- bd = bd.setScale(2, RoundingMode.HALF_UP);
- return bd.doubleValue();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement