четверг, 6 декабря 2012 г.

JAVA библиотека padeg

В свободный доступ вышла библиотека padeg. Она позволяет склонять имена, фамилии и нарицательные имена в нужном падеже. В сети встречается сравнение различных библиотек склонения. Эта библиотека имеет процент ошибок 2,5%. В то время как платный аналог за 50000 руб. на сервер имеет 1% ошибок. Прикрепляю библиотеку и пример использования.

Пример можно посмотреть здесь:
https://test-rlab.rhcloud.com/

padeg-3.3.0.24-javadoc.jar
padeg-3.3.0.24.jar

Пример кода под катом



import java.io.Serializable; import java.util.ArrayList; import java.util.List;   import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.model.SelectItem;   import padeg.lib.Padeg;   @ManagedBean public class PadegBean implements Serializable {   private static final long serialVersionUID = 1L;   public class ResultItem implements Serializable { private static final long serialVersionUID = 1L; private int padeg; private String fio; private String appointment; private String office; public int getPadeg() { return padeg; } public String getFio() { return fio; } public String getAppointment() { return appointment; } public String getOffice() { return office; } }   public PadegBean() { }   private String lastName = "Балаганов"; private String firstName = "Шура"; private String middleName; private String appointment = "уполномоченный по копытам"; private String office = "Черноморское отделение Арбатовской конторы по заготовке рогов и копыт"; private List<String> fioResult; private List<String> appointmentResult; private List<String> officeResult; private String sexStr = "true"; private static final SelectItem[] sexItems = { new SelectItem("true","мужской"), new SelectItem("false","женский"), new SelectItem("auto","автоопределение по отчеству") }; private List<ResultItem> resultItems;   public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getAppointment() { return appointment; } public void setAppointment(String appointment) { this.appointment = appointment; } public String getOffice() { return office; } public void setOffice(String office) { this.office = office; } public String getSexStr() { return sexStr; } public void setSexStr(String sexStr) { this.sexStr = sexStr; } public SelectItem[] getSexItems() { return sexItems; }   public List<String> getFioResult() { if (fioResult==null) { declFio(); } return fioResult; } public List<String> getAppointmentResult() { return appointmentResult; } public List<String> getOfficeResult() { return officeResult; } public List<ResultItem> getResultItems() { if (resultItems == null) { declAll(); } return resultItems; }   public void declAll() { resultItems = new ArrayList<PadegBean.ResultItem>(); for (int i=1;i<=6;i++) { ResultItem item = new ResultItem(); item.padeg = i; resultItems.add(item);   try { if ("auto".equals(sexStr)) { item.fio = Padeg.getFIOPadegAS(lastName, firstName, middleName, i); } else { boolean sex = Boolean.parseBoolean(sexStr); item.fio = Padeg.getFIOPadeg(lastName, firstName, middleName, sex, i); } } catch (Exception e) { item.fio = e.getMessage(); }   try { //item.appointment = Padeg.getFullAppointmentPadeg(appointment, office, i); item.appointment = Padeg.getAppointmentPadeg(appointment, i); } catch (Exception e) { item.appointment = e.getMessage(); }   try { item.office = Padeg.getOfficePadeg(office, i); } catch (Exception e) { item.office = e.getMessage(); } } }   public void declFio(){ fioResult = new ArrayList<String>(); if ("auto".equals(sexStr)) { for (int i=1;i<=6;i++) { try { fioResult.add(Padeg.getFIOPadegAS(lastName, firstName, middleName, i)); } catch (Exception e) { fioResult.add(e.getMessage()); } } } else { boolean sex = Boolean.parseBoolean(sexStr); for (int i=1;i<=6;i++) { try { fioResult.add(Padeg.getFIOPadeg(lastName, firstName, middleName, sex, i)); } catch (Exception e) { fioResult.add(e.getMessage()); } } } }   public void declAppointment(){ appointmentResult = new ArrayList<String>(); for (int i=1;i<=6;i++) { appointmentResult.add(Padeg.getFullAppointmentPadeg(appointment, office, i)); } }   public void declOfice(){ officeResult = new ArrayList<String>(); for (int i=1;i<=6;i++) { officeResult.add(Padeg.getOfficePadeg(office, i)); } } }

3 комментария:

  1. Конечно, это интересная библиотека.
    Но, как показывает практика, пользоваться такими алгоритмами надо очень аккуратно. Как меня учили, фамилии, имена и отчества могут не поддаваться алгоритмизации. Для этих сущностей не всегда могут применяться правила _русского_ языка! Они не всегда могут склоняться по правилам. И самый странный случай, который мне встречался по жизни это имя африканца "Ан-24" - да! имя с цифрами! - он родился в самолете, а папа на радостях его так и назвал. К слову сказать, этот человек достаточно грамотно писал по-русски и говорил с Ленинградским акцентом... Я видел документ, где он сам написал: "Мне, Ан-24му ... бла-бла-бла...".

    Из этого можно сделать важные практические выводы:
    1) Результаты работы подобных библиотек падежей могут носить исключительно рекомендательный характер для ФИО. То есть, ПО МОЖЕТ предложить вариант склонения, но в этом случае, ПО ОБЯЗАНО позволить пользователю проверить и откорректировать, если это необходимо.
    2) Для ФИО нельзя ограничивать ввод полей только буквами, в частности только русскими.

    Иначе, мы будем иметь не падеж для ФИО, а падЁж в ПО :-)

    ОтветитьУдалить
    Ответы
    1. Интересный случай с фамилией-самолетом. Вы правы по поводу рекомендаций. Добавил в пост еще немного информации по ошибкам. Было также проверено, что эта библиотека работает не только с ФИО, но и с существительными.

      Удалить
  2. Пример конечно же кривой, но библиотека работает..

    ОтветитьУдалить