Экзамен
Задача с экзамена в прошлом году
В прошлогодней задаче используются 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
. Он содержитString
word — слово и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
). - Обучите модель и проверьте ее точность.