Advertisement
dzocesrce

[NP] Уморна приказна

Apr 27th, 2025
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.33 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. import java.io.*;
  6. import java.util.*;
  7. import java.util.stream.Collectors;
  8.  
  9. class TextProcessor {
  10.     List<Text> texts;
  11.     Set<String> allWords;
  12.     Map<String,Integer> wordsByFrequency;
  13.     CosineSimilarityCalculator cosineSimilarityCalculator;
  14.  
  15.     public TextProcessor() {
  16.         this.texts = new ArrayList<>();
  17.         allWords = new TreeSet<>();
  18.         this.wordsByFrequency= new HashMap<>();
  19.     }
  20.  
  21.     public void readText(InputStream in) {
  22.         BufferedReader br= new BufferedReader(new InputStreamReader(in));
  23.         texts= br.lines().map(Text::create).collect(Collectors.toList());
  24.  
  25.         texts.stream().flatMap(i->i.words.stream()).forEach(allWords::add);
  26.  
  27.         texts.stream().flatMap(i->i.words.stream()).forEach(i->wordsByFrequency.putIfAbsent(i,0));
  28.         texts.stream().flatMap(i->i.words.stream()).forEach(i->wordsByFrequency.computeIfPresent(i,
  29.                 (k,v)->v+1));
  30.     }
  31.  
  32.     public void printTextsVectors(PrintStream out) {
  33.         PrintWriter printWriter= new PrintWriter(out);
  34.         List<List<Integer>> vectors= new ArrayList<>();
  35.         for(Text text: texts) {
  36.             List<Integer> vector= new ArrayList<>();
  37.             for(String word : allWords){
  38.                 vector.add(getFrequencyNumber(text,word));
  39.             }
  40.             vectors.add(vector);
  41.         }
  42.  
  43.         vectors.stream().forEach(i->printWriter.println(i));
  44.         printWriter.flush();
  45.     }
  46.  
  47.     private int getFrequencyNumber(Text text, String word) {
  48.         int counter=0;
  49.         for(String s : text.words){
  50.             if(word.equals(s))
  51.                 counter++;
  52.         }
  53.         return counter;
  54.     }
  55.  
  56.     public void printCorpus(PrintStream out, int n, boolean b) {
  57.  
  58.         PrintWriter printWriter= new PrintWriter(out);
  59.         if(!b)
  60.             wordsByFrequency.entrySet().stream().sorted(Comparator.comparing((Map.Entry<String, Integer> entry) -> entry.getValue(), Comparator.reverseOrder())
  61.                     .thenComparing(entry-> entry.getKey(),Comparator.naturalOrder())).limit(n)
  62.                         .forEach(i->printWriter.println(String.format("%s : %d",i.getKey(),i.getValue())));
  63.         else
  64.             wordsByFrequency.entrySet().stream().sorted(Comparator.comparing((Map.Entry<String, Integer> entry) -> entry.getValue(), Comparator.naturalOrder())
  65.                             .thenComparing(entry-> entry.getKey(),Comparator.naturalOrder())).limit(n)
  66.                     .forEach(i->printWriter.println(String.format("%s : %d",i.getKey(),i.getValue())));
  67.  
  68.         printWriter.flush();
  69.     }
  70.  
  71.     public void mostSimilarTexts(PrintStream out) {
  72.         PrintWriter printWriter= new PrintWriter(out);
  73.         List<List<Integer>> vectors= new ArrayList<>();
  74.         for(Text text: texts) {
  75.             List<Integer> vector= new ArrayList<>();
  76.             for(String word : allWords){
  77.                 vector.add(getFrequencyNumber(text,word));
  78.             }
  79.             vectors.add(vector);
  80.         }
  81.         double mostSimular=0;
  82.         int textIndex1=0;
  83.         int textIndex2=0;
  84.         for(int i=0;i<vectors.size();i++) {
  85.             for(int j=i+1;j<vectors.size();j++) {
  86.                 if(cosineSimilarityCalculator.cosineSimilarity(vectors.get(i),vectors.get(j))>mostSimular){
  87.                     mostSimular= cosineSimilarityCalculator.cosineSimilarity(vectors.get(i),vectors.get(j));
  88.                     textIndex1=i;
  89.                     textIndex2=j;
  90.                 }
  91.  
  92.             }
  93.         }
  94.         printWriter.println(texts.get(textIndex1));
  95.         printWriter.println(texts.get(textIndex2));
  96.         printWriter.println(String.format("%.10f",mostSimular));
  97.         printWriter.flush();
  98.     }
  99.  
  100. }
  101.  class  Text{
  102.  
  103.     List<String> words;
  104.  
  105.     public Text(List<String> words) {
  106.         this.words = words;
  107.     }
  108.  
  109.     public static Text create(String line){
  110.         String[] parts = line.split("\\s+");
  111.         List<String> finalWords = new ArrayList<>();
  112.         for(String word : parts){
  113.             for(int i=0;i<word.length();i++){
  114.                 if(!Character.isLetter(word.charAt(i))){
  115.                     if(i!=word.length()-1)
  116.                         word = word.substring(0,i)+word.substring(i+1);
  117.                     else
  118.                         word = word.substring(0,i);
  119.                     i--;
  120.                 }
  121.  
  122.             }
  123.             finalWords.add(word.toLowerCase());
  124.         }
  125.         return new Text(finalWords);
  126.     }
  127.    
  128.         @Override
  129.     public String toString() {
  130.         StringBuilder stringBuilder = new StringBuilder();
  131.         for(int i=0;i<words.size();i++){
  132.             if(i==words.size()-1){
  133.                 stringBuilder.append(words.get(i));
  134.                 break;
  135.             }
  136.             stringBuilder.append(words.get(i)).append(" ");
  137.         }
  138.         return stringBuilder.toString();
  139.     }
  140.  
  141. }
  142.  
  143.  
  144. class CosineSimilarityCalculator {
  145.     public static double cosineSimilarity (Collection<Integer> c1, Collection<Integer> c2) {
  146.         int [] array1;
  147.         int [] array2;
  148.         array1 = c1.stream().mapToInt(i -> i).toArray();
  149.         array2 = c2.stream().mapToInt(i -> i).toArray();
  150.         double up = 0.0;
  151.         double down1=0, down2=0;
  152.  
  153.         for (int i=0;i<c1.size();i++) {
  154.             up+=(array1[i] * array2[i]);
  155.         }
  156.  
  157.         for (int i=0;i<c1.size();i++) {
  158.             down1+=(array1[i]*array1[i]);
  159.         }
  160.  
  161.         for (int i=0;i<c1.size();i++) {
  162.             down2+=(array2[i]*array2[i]);
  163.         }
  164.  
  165.         return up/(Math.sqrt(down1)*Math.sqrt(down2));
  166.     }
  167. }
  168.  
  169. public class TextProcessorTest {
  170.  
  171.     public static void main(String[] args) {
  172.         TextProcessor textProcessor = new TextProcessor();
  173.  
  174.         textProcessor.readText(System.in);
  175.  
  176.         System.out.println("===PRINT VECTORS===");
  177.         textProcessor.printTextsVectors(System.out);
  178.  
  179.         System.out.println("PRINT FIRST 20 WORDS SORTED ASCENDING BY FREQUENCY ");
  180.         textProcessor.printCorpus(System.out,  20, true);
  181.  
  182.         System.out.println("PRINT FIRST 20 WORDS SORTED DESCENDING BY FREQUENCY");
  183.         textProcessor.printCorpus(System.out, 20, false);
  184.  
  185.         System.out.println("===MOST SIMILAR TEXTS===");
  186.         textProcessor.mostSimilarTexts(System.out);
  187.     }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement