Пример задачи для зачета. Исправление орфографических ошибок
Ваша задача — написать программу, которая ищет орфографические ошибки в тексте и пытается их исправить. Файл со словарем и с двумя текстами для проверки вы можете найти по ссылке exam1.zip (сверху есть кнопка скачать). Мы используем английский язык, потому что в нем слова изменяются значительно меньше, чем в русском.
обязательное упоминание источников текстов для соблюдения лицензий:
- http://wordlist.aspell.net/12dicts/ (2of12inf.txt с убранными суффиксами)
- http://lib.ru/CARROLL/alice.txt
- http://lib.ru/ADAMS/liff.txt
Часть 1
Создайте Java множество (Set
) орфографически корректных вариантов английских слов. Это коллекция будет у нас орфографическим
словарем. Прочитайте слова из файла dictionary.txt
. В этом файле каждое слово находится в отдельной строке. Поэтому
его можно прочитать с помощью метода Files.readAllLines(Path, Charset)
, он возвращает список строчек файла типа List<String>
.
Теперь прочитайте по очереди оба файла с текстами (alice.txt
и liff.txt
) и для каждого слова, не найденного в словаре,
напечатайте его в консоли в отдельной строке.
Используйте следующее регулярное выражение для сканера в качестве разделителя слов: '?[^'a-zA-Z]+'?
myScanner.useDelimiter("'?[^'a-zA-Z]+'?");
Сохраняйте в множество Set
уже выведенные ранее слова. И если какое-то слово уже выводилось как неизвестное,
не выводите его второй раз.
Часть 2
В этой части мы будем предлагать варианты замены для неизвестных слов. Например, для слова qat мы не просто напишем,
qat в отдельной строке, а еще и дополним вариантами исправления:
qat: bat, cat, fat
и другие варианты, которые будут найдены в словаре.
Алгоритм:
Допустим, мы получили слово qat, будем искать в словаре все похожие на него варианты написания:
-
С изменением одной буквы. Пробуем по очереди изменить каждую из букв на все варианты от a до z. Сначала первую букву:
aat, bat, cat, dat, ...
Потом вторую:
qat, qbt, qct, qdt, ...
и т.д.
Вы можете использовать такой цикл для перебора всех букв:
for (char c = 'a'; c <= 'z'; c++)
-
Вариант с убиранием одной из букв. Здесь в нашем примере будут только такие варианты:
at (без первой буквы)
qt (без второй буквы)
qa (без третьей)
-
С вставленной буквой:
В начало: aqat, bqat, cqat, dqat, ……
на вторую позицию qaat, qbat, qcat, qdat, …
и т.д.
Все полученные варианты слов нужно проверить по словарю, и все, что подошло, предложить в качестве вариантов исправления. Вы можете
использовать метод retainAll(Collection)
для множества с вариантами исправлений , чтобы оставить в множестве только те элементы
множества, которые есть в орфографическом словаре.
Решение
Вы можете посмотреть решение по ссылке https://bitbucket.org/iposov/iposov-programming/src/default/JavaCourse/Java%202018-2019/src/Orthography.java.