Проверка грамматики Open Office в вашем WEB-приложении

    imageВ проектах, где нужно качественно обрабатывать много мультиязычного контента, практически невозможно обойтись без хорошей проверки грамматики. Писать самим каждый модуль для отдельного языка займет много времени и средств. Более того, нужно очень хорошо разбираться в языке, быть лингвистом и при этом соотносить язык математическим формулам. Задача не из легких. В таком случае, эффективным методом будет взять уже готовое решение и интегрировать его в приложение. Как это сделать простым способом, используя средства Open Office, я расскажу в этой статье.


    Для начала, попробуем разобраться в том, из чего, собственно, состоят грамматические пакеты в OO. В качестве примера, разберем файлы грамматики русского языка. С сайта ОО скачиваем архив с языковым пакетом грамматики. Внутри архива мы найдем три файла: readme.txt, ru_RU.dic, ru_RU.aff. С Readme все понятно – при необходимости его можно прочитать. Файл с расширением dic – представляет собой словарь со словами, которые встречаются в русском языке. Естественно, там не все слова, и его необходимо будет пополнять. Второй файлик с расширением AFF, представляет собой файл грамматики. Формат этого файла будет либо MySpell либо Aspell. В любом случае, он подойдет для нашего модуля.

    Теперь, когда мы разобрались с форматами этих файлов, приступим к самому модулю. Для него нам понадобится Hunspell API, которую можно взять во ссылке внизу статьи. API написана другим разработчиком и подходит для самой примитивной проверки грамматики. Писать будем на Java. Для тестов, мы напишем простой сервлет, который будет получать слово в качестве параметра, проверять его, и возвращать нам исправленный результат, если слово неправильно написано. О том, как создать WEB-приложение в среде Java, написано очень много статей, поэтому на этом особо останавливаться не будем. Начнем сразу же с самого главного. Сделаем небольшую форму, состоящую из поля для ввода и кнопки:

    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>
        </head>
        <body>
            <form method="POST" action="http://localhost:8080/SpellChecker/spellChecker">
                <input type="text" name="input"/>
                <input type="submit" name="submit"/>
            </form>
        </body>
    </html>
    


    Теперь, сделаем непосредственно сам сервлет. В сервлете мы будем получать данные из формы, отправлять их в библиотеку Hunspell, обрабатывать ответ, и отсылать обратно на форму. Рассмотрим методы, которые это будут делать:

    1. protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    2.           throws ServletException, IOException {
    3.        response.setContentType("text/html;charset=UTF-8");
    4.        PrintWriter out = response.getWriter();
    5.        try {
    6.            String input = request.getParameter("input");
    7.            List<String> list = check(input);
    8.            request.setAttribute("output", list);
    9.            Iterator iter = list.iterator();
    10.            while (iter.hasNext()) {
    11.                out.println((String) iter.next());
    12.            }
    13.
    14.        } finally {
    15.            out.close();
    16.        }
    17.}
    


    Рассмотрим все поэтапно:
    1 и 2 строки объявляют функцию, которая обрабатывает запрос. На 3 строке в ответ мы ставим, что тип результата будет HTML страница с кодировкой UTF-8, дабы избежать недоразумений со специальными символами(диактрические знаки). Далее, на 4 строке, инициализируем контейнер для вывода данных, и открываем поток. Тут уже начинается самое интересное. Параметр, расположенный на 6 строке, содержит входные данные, тоесть слово, которое нужно проверить на грамматику. Передаем его в функцию check(String string), которую мы разберем позже. Вкратце скажу, что эта функция проверяет наше слово на ошибки, и в качестве ответа предоставляет список с исправлениями. После этого, мы итерируем по списку исправлений(9-12 строка), и выводим этот список в поток, тоесть, выводим список на экран. На 15 строке закрываем поток.

    
    1.public List<String> check(String input) {
    2.        List<String> list = new ArrayList();
    3.        List<String> stemList = new ArrayList();
    4.        try {
    5.            String newInput = "";
    6.            if (input != null) {
    7.                newInput = new String(input.getBytes("ISO-8859-1"), "UTF-8");
    8.            }
    9.            Hunspell hunspell = Hunspell.getInstance();
    10.            Dictionary dict = hunspell.getDictionary("ru-RU");
    11.            if (dict.misspelled(newInput)) {
    12.                list = dict.suggest(newInput);
    13.            } else {
    14.                list.add(newInput);
    15.            }
    16.
    17.        } catch (FileNotFoundException ex) {
    18.            Logger.getLogger(spellChecker.class.getName()).log(Level.SEVERE, null, ex);
    19.        } catch (UnsupportedEncodingException ex) {
    20.            Logger.getLogger(spellChecker.class.getName()).log(Level.SEVERE, null, ex);
    21.        }
    22.        list.addAll(stemList);
    23.        return list;
    24.    }
    


    А вот и сама функция check(String string). На 2 и 3 строках делаем два новых списка. В первый будем вставлять окончательный результат, а второй используем в качестве временного буфера. Строки 5-8 кодируют наш запрос в UTF-8, потому что словарь понимает только такую кодировку. На 9 строке инициализируем Hunspell, а на 10 указываем, какой словарь будем использовать. В данном случае, это русский словарь. Файлы проверки грамматики(ru_RU.dic, ru_RU.aff) должны быть в том же каталоге, что и программа, поэтому не забудем их туда перенести. Далее(11 строка) идет проверка на то, правильно ли написано слово. Если слово написано неправильно(11-13), то мы получаем результаты того, как правильно нужно написать это слово. Если же слово написано правильно(13-15), то возвращаем его обратно. Все предельно просто и кратко. Строки с 17 по 21 являются обработчиками ошибок. Первая обработка (FileNotFoundException) идет на отсутствие файлов грамматики, а вторая (UnsupportedEncodingException) относится к функции, которая кодирует наш запрос в UTF-8, и обрабатывает подержку кодировки. На 22 строке переносим все из временного буфера(stemList) в результат(list), и на 23 строке возвращаем его.

    Напомню еще раз, что нужно перенести файлы AFF и DIC в папку с приложением, дабы программа могла их задействовать. Если же это сделать нельзя, то можно указать полный путь до словаря в 10 строке. Расширение указывать не нужно.

    При желании, этот сервлет можно переделать в небольшой сервис, который будет общаться через XML. Подключить к нему больше языков Hunspell, которые распространяются бесплатно, и постоянно пополняются. Также, можно подключить библиотеку распознавания языков, о которой я расскажу в следующей статье.

    Теперь поделюсь с вами ссылками, где же можно взять все это добро:
    Hunspell API — dren.dk/hunspell.html
    Словари OpenOffice — wiki.services.openoffice.org/wiki/Dictionaries

    Также, словари можно взять на страницах разработчиков. Там они гораздо «свежее».
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 2

      0
      Имхо отличная статья на важную тему. Даешь грамотность в массы!

      Правда с распространением разных баров, где встроен спеллчекер, проверка грамотности в приложении становиться менее актуальной.
        0
        Надо бы, как карма позволит, перенести в коллективный блог.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое