Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.02.2017, 00:00
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

Нормализация ФИО
Вот написал такую функцию, особо не заморачивался, может кто улучшит.
Так как пользователи пишут фио, то капслоком, то наоборот без заглавных букв, то в неправильном порядке.
Функция не проверяет на валидность - она исправляет, проверять надо после нее.
Простая функция, но эффект достаточно занимательный, я считаю такая должна быть в каждой форме.

function fiofix(param) {
var str = [];
var temp;
var v = param.trim();
function fioporyadok(a,b) {
var f = ["ов","ова","ин","ина","ко"];
var o = ["ич","вна"];
for (var i = 0; i < f.length; i++) {
if (a.lastIndexOf(f[i]) == a.length-f[i].length) return -1;
if (b.lastIndexOf(f[i]) == b.length-f[i].length) return 1;}
for (var i = 0; i < o.length; i++) {
if (a.lastIndexOf(o[i]) == a.length-o[i].length) return 1;
if (b.lastIndexOf(o[i]) == b.length-o[i].length) return -1;}
return 0;}
v = v.replace(/^-*/, '');
v = v.replace(/-{2,}/g, '-');
v = v.replace(/\s{2,}/g, ' ');
v = v.replace(/\s*-\s*/g, '-');
if (v == "") return;
v = v.split(" ");
v.forEach(function(i) {
i = i.trim();
if (i == "") return;
temp = i[0].toUpperCase();
temp += i.substr(1).toLowerCase();
str.push(temp);
});
str.sort(fioporyadok);
v = str.join(" ");
str = [];
v = v.split("-");
v.forEach(function(i) {
temp = i[0].toUpperCase();
temp += i.substr(1);
str.push(temp);
});
return str.join("-");}

alert(fiofix("сергеевна ИРИНА карпова"));

Последний раз редактировалось psiklop, 04.02.2017 в 00:08.
Ответить с цитированием
  #2 (permalink)  
Старый 04.02.2017, 01:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

psiklop,
предположим не карпова а карпенко?

function fiofix(param) {
var str = [];
var temp;
var v = param.trim();
function fioporyadok(a,b) {
var f = ["ов","ова","ин","ина","ко"];
var o = ["ич","вна"];
for (var i = 0; i < f.length; i++) {
if (a.lastIndexOf(f[i]) == a.length-f[i].length) return -1;
if (b.lastIndexOf(f[i]) == b.length-f[i].length) return 1;}
for (var i = 0; i < o.length; i++) {
if (a.lastIndexOf(o[i]) == a.length-o[i].length) return 1;
if (b.lastIndexOf(o[i]) == b.length-o[i].length) return -1;}
return 0;}
v = v.replace(/^-*/, '');
v = v.replace(/-{2,}/g, '-');
v = v.replace(/\s{2,}/g, ' ');
v = v.replace(/\s*-\s*/g, '-');
if (v == "") return;
v = v.split(" ");
v.forEach(function(i) {
i = i.trim();
if (i == "") return;
temp = i[0].toUpperCase();
temp += i.substr(1).toLowerCase();
str.push(temp);
});
str.sort(fioporyadok);
v = str.join(" ");
str = [];
v = v.split("-");
v.forEach(function(i) {
temp = i[0].toUpperCase();
temp += i.substr(1);
str.push(temp);
});
return str.join("-");}

alert(fiofix("сергеевна ИРИНА карпенко"));
Ответить с цитированием
  #3 (permalink)  
Старый 04.02.2017, 04:56
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

все дело в массиве f и o
думаю его можно улучшить так
var f = ["ов","ова","ко","ский","ская","ин","ина"];
var o = ["евич","евна"];


у тебя не вышло знаешь почему, потому как ирина кончается на 'ина',
так может заканчиваться и женская фамилия
если в массиве 'ко' поставить перед 'ина' все будет как надо
идеально конечно наверняка не будет, но все таки

на самом деле дофига женских имен кончается на 'ина' поэтому надо поставить в самый конец массива

Последний раз редактировалось psiklop, 04.02.2017 в 05:24.
Ответить с цитированием
  #4 (permalink)  
Старый 04.02.2017, 05:23
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Может стоит воспользоваться готовым решением https://dadata.ru/
Ответить с цитированием
  #5 (permalink)  
Старый 04.02.2017, 05:47
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

Сообщение от Poznakomlus Посмотреть сообщение
Может стоит воспользоваться готовым решением https://dadata.ru/
фигасе ты очканул, ну плати за нормализацию если хочешь, а я обойдусь своей функцией, ну платить за нормализацию адреса еще соглашусь, но платить за такую ерунду как фио

в общем я подозреваю что функция может и вред принести если не русские, так что улучшений дофига можно править или сортировку можно вообще закоментировать
Ответить с цитированием
  #6 (permalink)  
Старый 04.02.2017, 13:24
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Сообщение от psiklop
ну плати за нормализацию если хочешь
http://joxi.ru/eAO79GkixvO9EA
Вам должно хватить бесплатного сервиса
Ответить с цитированием
  #7 (permalink)  
Старый 04.02.2017, 14:35
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

Сообщение от Poznakomlus Посмотреть сообщение
http://joxi.ru/eAO79GkixvO9EA
Вам должно хватить бесплатного сервиса
нет, не должно, нужна просто нормализация подсказок не надо
Ответить с цитированием
  #8 (permalink)  
Старый 06.02.2017, 09:52
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

psiklop, у нас в задачке есть специальный перечень "нестандартных"
- Фамилий
- Имен
- Отчеств
которые заполняют сами пользователи, если некая комбинация ФИО не обрабатывается нашей программой.
Ответить с цитированием
  #9 (permalink)  
Старый 07.02.2017, 15:25
Профессор
Отправить личное сообщение для psiklop Посмотреть профиль Найти все сообщения от psiklop
 
Регистрация: 04.03.2015
Сообщений: 163

У кого у вас? В какой задачке?
Я написал функцию на javascript на несколько коротких строк, она работает нормально как выяснилось в 99 из 100 и меня это полностью устраивает, может и еще кого устроит
Мне тут предлагают сервис, где надо регаться, получать api ключ, и еще держать в нем положительный баланс, я думаю это не в тему

а массив я еще улучшил кстати
var f = ["ов","ова","ев","ева","ко","ский","ская","чный","чная","ин","ина"];


P.S. Сейчас почта России разрабатывает свой апи (пока BETA), там будет нормализация всего и я не думаю, что это будет стоить денег

Последний раз редактировалось psiklop, 07.02.2017 в 15:30.
Ответить с цитированием
  #10 (permalink)  
Старый 08.02.2017, 08:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от psiklop
У кого у вас? В какой задачке?
Знание этого не принципиально.
Мое сообщение призвано донести до тебя тот факт, что есть очень большое разнообразие "нестандартных" данных по ФИО... Причем у каждого региона свое.
Вот и все.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нормализация DOM namreg Events/DOM/Window 12 10.09.2014 14:31
Помогите в написать короткий скрипт для AdobeAcrobat XI. BSI Общие вопросы Javascript 1 13.08.2013 21:24