Advertisement
Anton0093

Lab_7

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