Задача 1:
Получив на входе корпус языка (огромный набор атрибутированных текстов на каком-нибудь языке) построить частотный словарь. Знаки препинания, скобки, кавычки и числа должны быть удалены. Слова, содержащие в себе не буквенные символы, игнорируются целиком.
Задача 2:
При автоматическом переводе необходимо из нескольких слов выбрать наиболее употребительное. Необходимо построить эффективную реализацию функции, которая для данного множества (Set) слов-ключей, определит то, которому соответствует максимальное значение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import java.util.*; import java.lang.*; import java.io.*; /* Name of the class has to be "Main" only if the class is public. */ class Ideone { public static void main (String[] args) throws java.lang.Exception { //Первая часть Map W = new HashMap(); Scanner in = new Scanner(System.in); String txt = new String(); long all = 0; in.useDelimiter("[,.!:;? \n«»()\"]"); while(in.hasNext()){ txt = in.next(); if(!txt.equals("")) if(W.containsKey(txt)){ W.put(txt, W.get(txt) + 1.0); all++;} else{ W.put(txt, 1.0); all++;} } for(String a : W.keySet()) W.put(a, W.get(a)/all); //Бонусная часть (на решение второй задачи не тянет, но все же) //Вместо слов, ключами служат частоты. //Значение представляют из себя массив слов с общей частотой употребления SortedMap<Double, List> SW = new TreeMap<Double, List>(); for(Object a : W.keySet()) if(SW.containsKey(W.get(a))){ SW.get(W.get(a)).add(a); } else{ List buf = new ArrayList(); buf.add(a); SW.put(W.get(a), buf) ; } for(Object a : SW.keySet()){ System.out.print(a + " => " ); int n = SW.get(a).size(); for(int i = 0; i < n; i++){ System.out.print(SW.get(a).get(i) + (i == n - 1? ".\n" : ", ")); } } } } |
Сделайте, пожалуйста, необходимые пояснения к программе.
Повторю замечание, что написал Бронфен-Бове:
К сожалению, нет тестового ввода и вывода (можно для очень маленького файла) и пояснения – какие структуры данных используются. В частности, как упорядочены слова в Вашем словаре (если упорядочены вообще)?
Очевидно, что Вы используете 2 структуры HashMap и TreeMap — и они отличаются в вышеприведенном аспекте — нужно пояснить почему они выбраны.
Кстати, странно, что Вы выбрали тип Double для указания типа, у Вас может быть дробное количество слов. Особенно странно в ответе видеть строчку типа такой: 14.0 => to, of. Наверное: 14 => to, of. Кстати эта строчка пояснена очень туманно — только в комментарии «Бонусная часть». Почему это бонусная часть не совсем понятно, как по мне, это удобное представление ответа к задаче 1, а ни мою, ни тем более Игоря Евгеньевича задачу 2 Вы не решили.
Еще странно, что версия на ideone не совпадает с версией в отчете. Какую мне проверять? Если хотите представить обе версии, то запишите в отчет их обе — или оставьте одну версию и в отчете и на ideone.
А вот что понравилось — то, что Вы разобрались как работает метод useDelimiter для класса Scanner… Хотя чего это я Вас хвалю — на ideone у Вас неверный ответ (в словах присутствуют знаки препинания), а работает ли вариант из отчета, я не знаю.
В общем поправьте отчет / решение — после этого засчитаю баллы.