Экзамен
Задача с экзамена в прошлом году
В прошлогодней задаче используются CSV файлы, вы можете представить, что вместо них я прошу пользоваться json файлом с данными.
Многопоточное программирование
- Используйте
AtomicIntegerвместо synchronized блока для решения задачи про бананы и мартышек. - Многопоточный фрактал
- Добавьте в задачу с фракталом
ProgressBarвнизу окна. - Пусть каждое вычиление фрактала производится в отдельном
Task. - Пусть во время вычисления фрактала обновляется ProgressBar.
- Если начал работать
Taskдля вычисления фрактала, при этом аналогичныйTaskуже работает, предудущий нужно отменить. Используйте методcancel()для отмены, и внутриTaskзавершите вычисления, еслиisCancelled()возвращаетtrue. - Пусть после вычисления очередной строки (столбца) фрактала
Taskобновляет вычисленное значение методомupdateValue, и программа сразу показывает обновленное значение. В этом случае рисование фрактала на экране будет происходить постепенно, а не скачком.
- Добавьте в задачу с фракталом
JSON
- Создайте класс
Authorс полямиnameиsurname. Пусть теперь в Book полеauthorимеет типAuthor. Измените json, чтобы программа могла правильно прочитать книги. - Дано слово
String word = "..."и два языка:String from = "..."иString to = "...". Переведите с слово с одного языка на другой с помощью glosbe.com. Выведите в консоль исходное слово, все переводы, для каждого первода — все смыслы. После этого для каждого перевода укажите источник.
Jar файлы
- Создайте запускаемый jar файл из своей задачи про фракталы.
- Необязательно: добавьте в задачу про фракталы иконку в виде ресурса.
Потоки (Streams)
- Создайте метод getTokenStream, который для заданного файла возвращает поток слов в этом файле.
- Простой способ: прочитайте весь файл в память в виде одной строки (используйте вспомогательные функции из класса
Files), и вызовите для полученной строки методsplit(). - Сложнее. Создайте
Scannerи воспользуйтесь методомStream.generate()для создания потока.
Начинайте решение каждой следующей задачи с вызова метода
getTokenStream. - Простой способ: прочитайте весь файл в память в виде одной строки (используйте вспомогательные функции из класса
- Посчитайте количество слов в потоке.
- Сколько в тексте слов, начинающихся с заглавной буквы?
-
Посчитайте количество слов в потоке без учета стоп-слов. Приводите слова к нижнему регистру для сравнения со стоп словами.
Подсказка: создайте Set
для списка стоп-слов. - Какая средняя длина слова в вашем тексте?
- Посчитайте сразу и среднюю длину слова, и максимальная длину, и минимальную. Подсказка: для вычисления сразу всех статистик есть соответствующий
Collector. - Каких слов больше, с четной длиной или с нечетной длиной? Попробуйте сделать только один проход по потоку для получения ответа.
- Распечатайте «табличку», сколько раз встретилась каждая длина слова. Например, слов длины 1: 10 штук, слов длины 2: 40 штук и т.п.
- Аналогично предыдущей задаче, но должно быть две таблички. С учетом одинаковых слов или без учета одинаковых слов. Т.е. Если некоторое слово встретилось дважды, его нужно считать дваждый в первой таблице, и один раз во второй таблице.
- Посчитайте частоты всех слов файла. Верните Map<String, Integer>, сопоставляющий каждому слову количество раз, которое оно встретилось в файле. Приводите слова к нижнему регистру.
- Получите частоты всех слов в файле с помощью предыдущей задачи и выведите слова в порядке убывания частот. Подсказка. У
Mapесть методentrySetкоторый возвращает множество (Set) записей, содержащих пару из ключа и значения. С этим множеством тоже можно работать с помощью потоков, и сортировать его. - Пусть S = количество стоп-слов. Если взять первые S самых частотных слов вашего текста, сколько совпадений будет со словами стоп-листа?
- Сложно. Определите имена в тексте. Имена — это слова, начинающиеся с заглавной буквы, перед которыми не было конца предложения, т.е. точки, восклицательного знака, вопросительного знака.
- Сложно. Создайте класс
Context. Он содержитStringword — слово иSet<String>— несколько соседних слов, пять до и пять после. (5 — это константа, которую можно менять при создании класса). Превратите поток слов в поток их контекстов.
Сбор данных
- Выберите русскоязычного автора на сайте http://lib.ru, откройте список его произведений и запустите библиотеку
crawler4jдля сбора текстов всех произведений. Сохраните все тексты на диск в папку с именем этого автора. - Повторите это же действие для другого русскоязычного автора.
Определение автора
В этой задаче необходимо написать классификатор, который по предложению определяет его автора. Мы будем определять одного из двух авторов, тексты которых собирали в предыдущем задании.
- У каждого автора прочитайте все его тексты из соответствующей папки и разбейте их на предложения. Используйте
splitдля разделения по точкам, вопросительным и восклицательным знакам. - Каждое предложение разбейте на слова, опять используя split. Приведите слова к нижнему регистру и избавьтесь от всех других знаков препинания. Создайте множество
Set allWordsдля хранения вобще всех слов, встречающихся в текстах, и заполните его словами всех предложений обоих авторов. - Создайте
Instances allSentencesдля хранения всех предложений. Создайте по одному атрибуту для каждого слова изallWordsс двумя значениямиnoиyes. И создайте атрибутauthorс двумя значениями, соответствуюищими именам двух авторов. - Для каждого предложения создайте свой
SparseInstance. Для тех слов, которые встрчаются в предложении, установите значение соответствующих атрибутов вyes, остальные атрибуты заполнитеno. Поместите готовыйSparsenstanceвallSentences. - Разбейте
allSentencesна два набора предложений:trainingSentencesдля обучения иtestSentencesдля проверки. (см. пример в файлеMLExample). - Обучите модель и проверьте ее точность.