← All posts tagged интеграция_данных

PLed76

готовим список улиц к поиску соответствий в базе КЛАДР:

String bra = "(.*)((^| )(";
String ket = ")( +|$)){1}(.*)";

String inp = input_row.Street.toLowerCase();

inp = inp.replaceAll("ё", "е");
inp = inp.replaceAll("([.])([^ ])", "$1 $2");

inp = inp.replaceAll("([0-9]+)-го", "$1");
inp = inp.replaceAll("первого", "1");
inp = inp.replaceAll("второго", "2");
inp = inp.replaceAll("третьего", "3");
inp = inp.replaceAll("четвертого", "4");
inp = inp.replaceAll("пятого", "5");
inp = inp.replaceAll("шестого", "6");
inp = inp.replaceAll("седьмого", "7");
inp = inp.replaceAll("восьмого", "8");
inp = inp.replaceAll("девятого", "9");
inp = inp.replaceAll("десятого", "10");

inp = inp.replaceAll(bra + "[0-9]+(-я|-й)" + ket, "$1$3$7 $4");

inp = inp.replaceAll(bra + "большой|большая|большое|бол[.]|бол|б[.]|б" + ket, "$1$3$6 б.");
inp = inp.replaceAll(bra + "малый|малая|малое|мал[.]|мал|м[.]|м" + ket, "$1$3$6 б.");
inp = inp.replaceAll(bra + "верхний|верхняя|верхнее|верхн[.]|верхн|верх[.]|вер[.]|в[.]" + ket, "$1$3$6 верхн.");
inp = inp.replaceAll(bra + "нижний|нижняя|нижнее|нижн[.]|нижн|ниж[.]|ниж|н[.]" + ket, "$1$3$6 ниж.");

inp = inp.replaceAll(bra + "маршала|марш[.]|марш" + ket, "$1 маршала $6");
inp = inp.replaceAll(bra + "академика|акад[.]|акад|ак[.]|ак" + ket, "$1 академика $6");

String[] p = {
bra + "улица|ул[.]|ул" + ket,
bra + "пер-к|переулок|пер[.]|пер" + ket,
bra + "пр-зд|пр-д|проезд|пр[.]|пр" + ket,
bra + "шоссе|ш[.]|ш" + ket,
bra + "бульвар|б-р|бул[.]|бул" + ket,
bra + "тупик|туп[.]|туп" + ket,
bra + "проспект|просп[.]|пр-кт|пр-т" + ket,
bra + "парк|п[.]" + ket,
bra + "площадь|площ[.]|площ|пл[.]|пл" + ket,
bra + "набережная|набер[.]|набер|наб[.]|наб" + ket
};

if (inp.matches(p[0])) {inp = "ул " + inp.replaceAll(p[0], "$1$3$6");}
else if (inp.matches(p[1])) {inp = "пер " + inp.replaceAll(p[1], "$1$3$6");}
else if (inp.matches(p[2])) {inp = "проезд " + inp.replaceAll(p[2], "$1$3$6");}
else if (inp.matches(p[3])) {inp = "ш " + inp.replaceAll(p[3], "$1$3$6");}
else if (inp.matches(p[4])) {inp = "б-р " + inp.replaceAll(p[4], "$1$3$6");}
else if (inp.matches(p[5])) {inp = "туп " + inp.replaceAll(p[5], "$1$3$6");}
else if (inp.matches(p[6])) {inp = "пр-кт " + inp.replaceAll(p[6], "$1$3$6");}
else if (inp.matches(p[7])) {inp = "парк " + inp.replaceAll(p[7], "$1$3$6");}
else if (inp.matches(p[8])) {inp = "пл " + inp.replaceAll(p[8], "$1$3$6");}
else if (inp.matches(p[9])) {inp = "наб " + inp.replaceAll(p[9], "$1$3$6");}
else inp = "ул " + inp;

output_row.Street = inp.trim();

PLed76

Дополнительно к поиску звуковых соответствий (см. #114844) мне поставлена задача разбора и выправки почтовых адресов, записанных одной строкой :)
Уже скачал и привинтил базу КЛАДР (официальная, маленькая и свободная — ищется на раз). Начинаю интеллектуальный разбор строки адреса по словам. А звуковой алгоритм теперь понемногу довожу — как перестанут изменения в нём появляться — выложу финальную версию.

PLed76

Вот такая получилась первая версия алгоритма MetaPhoneRUEN, который на моём примере из 7756 именований компаний (русских и английских вперемешку) в итоге предлагает 128 для проверки правильности написания. Пока нифига не ясно, остались ли там незамеченные ошибки, но показатель радует вполне. Будем дотачивать по ходу.

Java code:
String s = input_row.line;
s = s.toLowerCase();

// LAT
s = s.replace("augh", "a");
s = s.replace("ough", "a");
s = s.replace("ea", "y");
s = s.replace("ee", "y");
s = s.replace("oo", "y");
s = s.replace("th", "s");
s = s.replace("a", "a");
s = s.replace("b", "p");
s = s.replace("c", "s");
s = s.replace("d", "t");
s = s.replace("e", "y");
s = s.replace("f", "p");
s = s.replace("g", "y");
s = s.replace("h", " ");
s = s.replace("i", "y");
s = s.replace("j", "y");
s = s.replace("k", "k");
s = s.replace("l", "n");
s = s.replace("m", "n");
s = s.replace("n", "n");
s = s.replace("o", "a");
s = s.replace("p", "p");
s = s.replace("q", " ");
s = s.replace("r", "n");
s = s.replace("s", "s");
s = s.replace("t", "t");
s = s.replace("u", "y");
s = s.replace("v", "p");
s = s.replace("w", "f");
s = s.replace("x", "s");
s = s.replace("y", "y");
s = s.replace("z", "s");

// RUS
s = s.replace("а", "a");
s = s.replace("б", "p");
s = s.replace("в", "p");
s = s.replace("г", "y");
s = s.replace("д", "t");
s = s.replace("е", "y");
s = s.replace("ё", "a");
s = s.replace("ж", "s");
s = s.replace("з", "s");
s = s.replace("и", "y");
s = s.replace("й", "y");
s = s.replace("к", "k");
s = s.replace("л", "n");
s = s.replace("м", "n");
s = s.replace("н", "n");
s = s.replace("о", "a");
s = s.replace("п", "p");
s = s.replace("р", "n");
s = s.replace("с", "s");
s = s.replace("т", "t");
s = s.replace("у", "y");
s = s.replace("ф", "p");
s = s.replace("х", " ");
s = s.replace("ц", "s");
s = s.replace("ч", "s");
s = s.replace("ш", "s");
s = s.replace("щ", "s");
s = s.replace("ъ", " ");
s = s.replace("ы", "y");
s = s.replace("ь", " ");
s = s.replace("э", "y");
s = s.replace("ю", "y");
s = s.replace("я", "a");

// SYMBOLS
s = s.replace("&", "y");
s = s.replace("+", "plys");
s = s.replace("-", "");
s = s.replace(".", "");
s = s.replace("_", "");
s = s.replace("/", "");
s = s.replace("\\", "");

// remove blanks
s = s.replace(" ", "");

// remove doubles
String so = "" + s.charAt(0);
for (int i=1;i if (s.charAt(i) != s.charAt(i-1)) so = so + s.charAt(i);
s = so;

// output
output_row.line = s + "; " + input_row.line;

PLed76


В полный рост стоит задача выверки многоязычных списков названий. В первую очередь касается русско-английской и англо-русской транслитерации. Понятно, что решить её полностью автоматически нереально. Однако, какую помощь можно предложить со стороны ИТ без научно-исследовательских работ?
Под выверкой понимаем:
1) устранение дубликатов и ошибок написания в рамках каждого языка
2) связывание соответствующих названий на разных языках