В свободный доступ вышла библиотека padeg. Она позволяет склонять имена, фамилии и нарицательные имена в нужном падеже. В сети встречается сравнение различных библиотек склонения. Эта библиотека имеет процент ошибок 2,5%. В то время как платный аналог за 50000 руб. на сервер имеет 1% ошибок. Прикрепляю библиотеку и пример использования.
Пример можно посмотреть здесь:
https://test-rlab.rhcloud.com/
padeg-3.3.0.24-javadoc.jar
padeg-3.3.0.24.jar
Пример кода под катом
Пример можно посмотреть здесь:
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));
}
}
}
Конечно, это интересная библиотека.
ОтветитьУдалитьНо, как показывает практика, пользоваться такими алгоритмами надо очень аккуратно. Как меня учили, фамилии, имена и отчества могут не поддаваться алгоритмизации. Для этих сущностей не всегда могут применяться правила _русского_ языка! Они не всегда могут склоняться по правилам. И самый странный случай, который мне встречался по жизни это имя африканца "Ан-24" - да! имя с цифрами! - он родился в самолете, а папа на радостях его так и назвал. К слову сказать, этот человек достаточно грамотно писал по-русски и говорил с Ленинградским акцентом... Я видел документ, где он сам написал: "Мне, Ан-24му ... бла-бла-бла...".
Из этого можно сделать важные практические выводы:
1) Результаты работы подобных библиотек падежей могут носить исключительно рекомендательный характер для ФИО. То есть, ПО МОЖЕТ предложить вариант склонения, но в этом случае, ПО ОБЯЗАНО позволить пользователю проверить и откорректировать, если это необходимо.
2) Для ФИО нельзя ограничивать ввод полей только буквами, в частности только русскими.
Иначе, мы будем иметь не падеж для ФИО, а падЁж в ПО :-)
Интересный случай с фамилией-самолетом. Вы правы по поводу рекомендаций. Добавил в пост еще немного информации по ошибкам. Было также проверено, что эта библиотека работает не только с ФИО, но и с существительными.
УдалитьПример конечно же кривой, но библиотека работает..
ОтветитьУдалить