Advertisement
Anton0093

Lab_7_new

Nov 2nd, 2020
1,888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.07 KB | None | 0 0
  1. import java.math.BigDecimal;
  2. import java.math.RoundingMode;
  3.  
  4. import static java.lang.StrictMath.log;
  5.  
  6. public class Entropy {
  7.  
  8.     public static final String text = "Погиб поэт!- невольник чести - Пал, оклеветанный молвой, " +
  9.             "С свинцом в груди и жаждой мести, Поникнув гордой головой!.. " +
  10.             "Не вынесла душа поэта Позора мелочных обид, " +
  11.             "Восстал он против мнений света Один, как прежде... и убит!";
  12.  
  13.     public static final String alphabet = "абвгдежёзиклмнопрстуфхцчшщьыъэюя";
  14.  
  15.     public static void main(String[] args) {
  16.  
  17.  
  18.         String textWithoutSpace = text.replaceAll("\\s+", ""); //удаляем пробелы
  19.  
  20.         //удаляем знаки препинания и приводим к нижнему регистру
  21.         String textWithoutSpaceAndSymbols = textWithoutSpace.replaceAll("[^а-яA-Я ]", "").toLowerCase();
  22.  
  23.  
  24.         char[] alphabetInCharArray = alphabet.toCharArray(); //переводим строку в массив символов
  25.  
  26.         double entropy = 0.0;
  27.  
  28.         for (int i = 0; i < alphabet.length(); i++) {
  29.             entropy = entropy + EntropyFormula(textWithoutSpaceAndSymbols, alphabetInCharArray[i]); // Σp(x)log2p(x),
  30.         }
  31.  
  32.         System.out.println("H32 = "+round(entropy));
  33.  
  34.         for (int i = 1; i <= 5; i++) {
  35.             entropy = entropy + EntropyFormula(textWithoutSpaceAndSymbols, alphabetInCharArray[i]); // Σp(x)log2p(x),
  36.             System.out.println("H"+i+"/"+i+" = "+ round(entropy/i)); //подсчет энтропии H1/1, ... , H5/5
  37.         }
  38.  
  39.     }
  40.  
  41.     private static double EntropyFormula(String text, char elemInArray) {
  42.  
  43.         double entropy = 0;
  44.         int numbOfLetters = 0;
  45.         int i = 0;
  46.         double entr_i;
  47.  
  48.         while (i < text.length() - 1) {
  49.  
  50.             char ch = text.charAt(i); //присваиваем символу символ в строке по индексу i
  51.  
  52.             if (ch == elemInArray) { //сравниваем символ с символом алфавита
  53.  
  54.                 numbOfLetters += 1; //если равен, увеличиваем счетчик на один
  55.                 i = i + 1;
  56.             }
  57.             else i++; //если нет, переходим к след. символу строки
  58.         }
  59.  
  60.         double probability = (double) numbOfLetters / alphabet.length(); //считаем вероятность
  61.  
  62.  
  63.         if (numbOfLetters == 0) {
  64.             entr_i = 0;
  65.         }
  66.  
  67.         else {
  68.             entr_i = log(1 / probability) * (1/probability); //p(x)log2p(x)
  69.         }
  70.  
  71.         entropy = entropy + entr_i;
  72.  
  73.         return entropy;
  74.     }
  75.  
  76.     private static double round(double value) {
  77.  
  78.         BigDecimal bd = new BigDecimal(Double.toString(value));
  79.         bd = bd.setScale(2, RoundingMode.HALF_UP);
  80.  
  81.         return bd.doubleValue();
  82.     }
  83. }
  84.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement