morpher.ru +7 (925) 336 9960
[email protected]
 
 
Мой Морфер

Библиотека Morpher.jar

Библиотека реализует следующие функции:

См. также:

Склонение по падежам и числам

За склонение в библиотеке отвечает класс Declension. Вот как им пользоваться:

    Declension declension = new Declension();
    IParse parse = declension.parse("Соединенные Штаты Америки (США)");
    assertEquals("Соединенных Штатов Америки (США)", parse.getForm(Case.Gen, false));

Метод getForm возвращает форму заданного падежа.

Case Описание, примеры
Case.Nom именительный (кто? что?):
  Иванов Петрова Крым Урал
Case.Gen родительный (кого? чего?):
  Иванова Петровой Крыма Урала
Case.Dat дательный (кому? чему?):
  Иванову Петровой Крыму Уралу
Case.Acc винительный (кого? что?):
  Иванова Петрову Крым Урал
Case.Ins творительный (кем? чем?):
  Ивановым Петровой Крымом Уралом
Case.Pre предложный (о ком? о чем?):
  Иванове Петровой Крыме Урале
Case.Loc местный (где?):
  Иванове Петровой Крыму Урале

Метод parse возвращает null, если входная строка не была распознана как словосочетание на русском языке.

Для получения падежных форм множественного числа нужно передать true в метод getForm:

    Declension declension = new Declension();
    IParse parse = declension.parse("воздушный шар");
    assertEquals("воздушные шары", parse.getForm(Case.Nom, true);

Метод getForm со вторым параметром равным true возвращает null для сочетаний фамилии, имени и отчества, а также если исходное словосочетание уже во множественном числе.

Флаги для разрешения неоднозначностей (Hints)

Метод parse имеет перегрузку с параметром hints:

    IParse animate   = declension.parse("коллектор", Arrays.asList(Hint.Animate));
    IParse inanimate = declension.parse("коллектор", Arrays.asList(Hint.Inanimate));
    assertEquals("коллектора",  animate.getForm(Case.Acc, false));
    assertEquals("коллектор", inanimate.getForm(Case.Acc, false));

Подробнее см. Снятие неоднозначности дополнительными признаками.

Определение рода и пола

    Declension declension = new Declension();
    IParse parse = declension.parse("Уитни");
    assertEquals(Gender.Feminine, parse.getGender());

Метод getGender возвращает автоматически определенный род входного словосочетания:

Gender.Masculineмужской род или пол
Gender.Feminineженский род или пол
Gender.Neuterсредний род
Gender.Pluralмножественное число

Определение рода может понадобиться, например, чтобы правильно написать уважаемый или уважаемая, действующий на основании или действующая, оставил комментарий или оставила.

Выделение в строке компонентов ФИО

    Declension declension = new Declension();
    IParse parse = declension.parse("Александр Сергеевич Пушкин");
    IFIO fio = parse.getFIO();
    if (fio != null) {
        assertEquals("Пушкин",    fio.getLastName());
        assertEquals("Александр", fio.getFirstName());
        assertEquals("Сергеевич", fio.getMiddleName());
    } else {
        // Словосочетание не распознано как ФИО.
    }

Склонение прилагательных по родам

    Declension declension = new Declension();
    String dear = declension.changeGender("Уважаемый", Gender.Feminine);
    assertEquals("Уважаемая", dear);

Функция прописи чисел

    NumberSpeller speller = new NumberSpeller(new Declension());
    SpellResult r = speller.spell(38, "попугай");
    assertEquals("тридцать восемь попугаев", r.Number + " " + r.Unit);

Функция spell выбрасывает исключение DeclensionParseException, если единица измерения нерусская или не имеет нужной формы.

Оперативная коррекция склонения при помощи пользовательского словаря

В ситуации, когда необходимо оперативно изменить склонение заданного словосочетания, не прибегая к техподдержке, удобен пользовательский словарь. Словарь представлен в библиотеке интерфейсом IUserDictionary:

public interface IUserDictionary {
    IParse lookup(String nominativeSingular);
}

Если передать объект IUserDictionary в конструктор класса Declension, то он сначала будет искать в пользовательском словаре, а если не найдено или найдены не все грамматические формы, то результат дополняется автоматически построенными формами.

В библиотеке имеется класс XmlUserDictionary, реализующий IUserDictionary, который читает данные из XML-файла (формат файла). Вы можете также самостоятельно реализовать этот интерфейс для любого другого хранилища, например, БД Oracle.

Интерфейс командной строки (CLI)

Если вы программируете на языке, отличном от Java, но имеете на машине среду выполнения Java, то вы можете вызвать morpher.jar через интерфейс командной строки:

C:\Users\Sergey\Documents\morpher>java -jar morpher.jar declension "Джава"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
    <И>Джава</И>
    <Р>Джавы</Р>
    <Д>Джаве</Д>
    <В>Джаву</В>
    <Т>Джавой</Т>
    <П>Джаве</П>
    <П-о>о Джаве</П-о>
    <М>в Джаве</М>
    <множественное>
        <И>Джавы</И>
        <Р>Джав</Р>
        <Д>Джавам</Д>
        <В>Джав</В>
        <Т>Джавами</Т>
        <П>Джавах</П>
        <П-о>о Джавах</П-о>
        <М>в Джавах</М>
    </множественное>
    <род>женский</род>
</xml>

Имена автоматически разбиваются на фамилию, имя и отчество:

C:\Users\Sergey\Documents\morpher>java -jar morpher.jar declension "Билл Гейтс"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
    <И>Билл Гейтс</И>
    <Р>Билла Гейтса</Р>
    <Д>Биллу Гейтсу</Д>
    <В>Билла Гейтса</В>
    <Т>Биллом Гейтсом</Т>
    <П>Билле Гейтсе</П>
    <П-о>о Билле Гейтсе</П-о>
    <М>в Билле Гейтсе</М>
    <ФИО>
        <Ф>Гейтс</Ф>
        <И>Билл</И>
        <О></О>
    </ФИО>
    <род>мужской</род>
</xml>
    

Пример склонения прописи числа и единицы измерения:

C:\Users\Sergey\Documents\morpher>java -jar morpher.jar spell 38 "попугай"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<PropisResult>
    <n>
        <И>тридцать восемь</И>
        <Р>тридцати восьми</Р>
        <Д>тридцати восьми</Д>
        <В>тридцать восемь</В>
        <Т>тридцатью восьмью</Т>
        <П>тридцати восьми</П>
        <М>тридцати восьми</М>
    </n>
    <unit>
        <И>попугаев</И>
        <Р>попугаев</Р>
        <Д>попугаям</Д>
        <В>попугаев</В>
        <Т>попугаями</Т>
        <П>попугаях</П>
        <М>попугаях</М>
    </unit>
</PropisResult>
    

Если в выдаче программы русские буквы не читаются, введите команду chcp 65001, чтобы изменить кодировку консоли на UTF-8.

XML, выдаваемый утилитой, аналогичен тому, что выдает веб-сервис. Поэтому если вы ранее работали с веб-сервисом, то для перехода на утилиту вам потребуются минимальные изменения в программе.

Технические характеристики и комплект поставки

В дистрибутив входят два файла: Java-библиотека morpher.jar и файл с комментариями morpher-javadoc.jar.

Технические характеристики morpher.jar:

  • Выполняется на Java версий 6, 7 и 8.
  • Совместима с Oracle 11.2.0.4.
  • Не имеет зависимостей кроме стандартной библиотеки.
  • Все классы неизменяемы (immutable) и, как следствие, потокобезопасны (thread-safe).
  • Библиотека не имеет никаких внешних зависимостей и не требует прав доступа к диску или сети.
  • Размер ~ 300K.

Установка в Maven-проект

Для установки библиотеки в Maven-проект нужно выполнить следующие шаги:

  1. Установить morpher.jar в локальный Maven-репозиторий. Для этого в папке, где находятся morpher.jar и morpher-javadoc.jar, выполните команду:
    mvn org.apache.maven.plugins:maven-install-plugin:2.5:install-file -Dfile=morpher.jar -Djavadoc=morpher-javadoc.jar
  2. Добавить зависимость от модуля в pom.xml:
    <dependency>
            <groupId>ru.morpher</groupId>
            <artifactId>russian</artifactId>
            <version>2.0</version>
    </dependency>
                
  3. Обнаружив изменения в pom.xml, IntelliJ IDEA выдаст подсказку о необходимости синхронизации проекта IDEA с проектом Maven: Импорт проекта Maven в IDEA Нажмите Import Changes.

Библиотека готова к использованию.

  • Чтобы увидеть документацию (javadoc), наведите курсор на метод и нажмите Ctrl-Q (на Маке Cmd-J): Подсказка с документацией в IntelliJ IDEA

История изменений

Implementation-Version Версия Описание
2019-11-11 2.0 В этой версии было сделано много полезных изменений, но при этом пришлось нарушить обратную совместимость:
  • Конструктор класса Declension теперь не выбрасывает проверяемых исключений.
  • Метод parse класса Declension теперь выбрасывает проверяемые исключения.
  • Тип параметра hints метода parse изменен с ArrayList на List.
  • Удалена чуждая Джаве буква I в названии интерфейса IUserDictionary.
  • Specification-Version повышена с 2.0.0 до 3.0.0 в связи с нарушением обратной совместимости.
  • Версия morpher.jar впервые увеличена. До этого все релизы были под номером 1.0.
  • Добавлена Javadoc документация.
2019-05-06 1.0 Исправлена ошибка определения пола женских имен.
2019-04-23 1.0 Пополнение словаря. Исправлена ошибка функции прописи чисел при обработке дробных чисел. Например, для числа 22,6 неправильно выдавалось "двадцати трёх целых десятых". Слово Армавир само по себе теперь склоняется как неодушевленное.
2018-04-01 1.0 Исправлено склонение "г. Москва" и других с сокращением "г."
2017-03-05 1.0 Исправлены дефекты, обнаруженные в предыдущей версии. Неправильно склонялись слова с беглыми гласными. В частности, слово "кошка" в родительном множественного программа выдавала как "кошк".
2017-03-01 1.0 Добавлены функции склонения прилагательных по родам и прописи чисел. Методы getGenitive, getDative и т.п. интерфейса IParse заменены на метод getForm. Многие недокументированные public классы "спрятаны" (сделаны package-private). Убрана спецификация throws Exception у метода Declension.parse. Так как API библиотеки изменился, Specification-Version изменена с 1.0.0 на 2.0.0.
2017-02-15 1.0 Обеспечена совместимость с Oracle 11.2.0.4.
2017-02-11 1.0 Библиотека пересобрана под JDK 1.6. Ранняя версия была по ошибке собрана под JDK 1.8.
2017-01-26 1.0 Исправлена ошибка (NullPointerException), возникавшая при создании класса Declension в приложениях на Spring.
2017-01-25 1.0 В morpher.jar добавлен файл MANIFEST.MF с информацией о версии. Налажена работа интерфейса командной строки (CLI), нарушенная в одной из предыдущих версий.

 

Библиотеки

© Сергей Слепов, 2003 - 2020.