Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Нету ли в природе программы транслитерации русских символов?   Найти похожие ветки 

 
Danilka ©   (2004-10-06 11:47) [40]

[37] Игорь Шевченко ©   (06.10.04 11:32)
А для остальных стандартов описать словари легко.
Кроме того, "Правила международной транслитерации русских собственных имен" не подходит, т.к. там, в ряде случаев, используются не латинские буквы.


 
Игорь Шевченко ©   (2004-10-06 11:50) [41]

Danilka ©   (06.10.04 11:47) [40]


> "Правила международной транслитерации русских собственных
> имен" не подходит, т.к. там, в ряде случаев, используются
> не латинские буквы.


В загранпаспортах и на авиабилетах (откуда, собственно и задача возникла) используются только латинские буквы


 
Deep ©   (2004-10-06 12:09) [42]


> Игорь Шевченко ©

уж не для мобильных операторов(sms-ок) софт пишеим? :)


 
Суслик ©   (2004-10-06 12:11) [43]


> уж не для мобильных операторов(sms-ок) софт пишеим? :)

ИШ авиатор.


 
Sergey_Masloff   (2004-10-06 12:29) [44]

Игорь Шевченко ©   (06.10.04 11:50) [41]
>В загранпаспортах и на авиабилетах
Не знаю может подойдет... Если учесть что 40% выезжающих за рубеж едут с нашими полисами и случаев заворота от посольств и таможен не припомню - может это подойдет? Обратной задачи не было поэтому только в лат.

function MakeLatin(s :string) :string;
const
rus_a="АБВГДЖЗИКЛМНОПРСТУФХЕЁЫЙЭЪ";
lat_a="ABVGDJZIKLMNOPRSTUFHEEYIEJ";
var
p :string;
n, i :Integer;
begin
p:=AnsiUpperCase(s)+" ";
while TRUE do
 begin
  n:=Pos("Я",p);
  if n>0 then p:=Copy(p,1,n-1)+"YA"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ч",p);
  if n>0 then
   if (Copy(p,n-1,1)=" ") or (Copy(p,n+1,1)=" ") or (n=1) then
    p:=Copy(p,1,n-1)+"CH"+Copy(p,n+1,255)
   else
    p:=Copy(p,1,n-1)+"TCH"+Copy(p,n+1,255)
  else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ю",p);
  if n>0 then p:=Copy(p,1,n-1)+"YU"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ш",p);
  if n>0 then p:=Copy(p,1,n-1)+"SH"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Щ",p);
  if n>0 then p:=Copy(p,1,n-1)+"SCH"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ц",p);
  if n>0 then p:=Copy(p,1,n-1)+"TS"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Х",p);
  if n>0 then
   if (Copy(p,n-1,1)<="A") or (n=1) then
    p:=Copy(p,1,n-1)+"H"+Copy(p,n+1,255)
   else
    p:=Copy(p,1,n-1)+"KH"+Copy(p,n+1,255)
  else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ж",p);
  if n>0 then
   if (Copy(p,n-1,1)<="A") or (n=1) then
    p:=Copy(p,1,n-1)+"J"+Copy(p,n+1,255)
   else
    p:=Copy(p,1,n-1)+"ZH"+Copy(p,n+1,255)
  else Break;
 end;
while TRUE do
 begin
  n:=Pos("ИЙ",p);
  if n>0 then p:=Copy(p,1,n-1)+"Y"+Copy(p,n+2,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("ЫЙ",p);
  if n>0 then p:=Copy(p,1,n-1)+"YI"+Copy(p,n+2,255) else Break;
 end;
i:=1;
while i<=Length(p) do
 begin
  if p[i]="Ь" then begin Delete(p,i,1); Continue; end;
  n:=Pos(p[i],rus_a); if n>0 then p[i]:=lat_a[n];
  i:=i+1;
 end;
Result:=Trim(p);
end;


 
VictorT ©   (2004-10-06 12:31) [45]

Из моего клиента, правда на Си. А передалывал, если не ошибаюсь, из функции, взятой из UBPFD. Т.е. там она должна быть на дельфях. В моём варианте, если не ошибаюсь по Госту.

CString CDeepBrowserDlg::translit(CString str)
{
   CString RArrayL("абвгдеёжзийклмнопрстуфхцчшщьыъэюя");
   CString RArrayU("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ");
   char arr[][33][5] =
   {{"a","b","v","g","d","e","yo","zh","z","i","j",
     "k","l","m","n","o","p","r","s","t","u","f",
     "h","c","ch","sh","sch",""","y",""","e","yu","ya"},
    {"A","B","V","G","D","E","Yo","Zh","Z","I","J",
     "K","L","M","N","O","P","R","S","T","U","F",
     "H","C","Ch","Sh","Sch",""","Y",""","E","Yu","Ya"}};
   long p;
   char d;
   CString result = "";
   long LenS = str.GetLength();
   for (long i = 0; i < LenS; i++) {
       d = 0;
       p = RArrayL.Find(str.GetAt(i));
       if (p == -1) {
           p = RArrayU.Find(str.GetAt(i));
           d = 1;
       }
       if (p != -1)
           result = result + arr[d][p];
       else
           result = result + str.GetAt(i); //если не русская буква, то берем исходную
   }
   return result;
}


 
Игорь Шевченко ©   (2004-10-06 12:36) [46]

Sergey_Masloff   (06.10.04 12:29) [44]

Сергей, спасибо, мне преимущественно обратная перекодировка требуется.

VictorT ©   (06.10.04 12:31) [45]

Это не ГОСТ, насколько я могу судить. Кроме того, мне интереснее обратная перекодировка.


 
Danilka ©   (2004-10-06 12:55) [47]

[41] Игорь Шевченко ©   (06.10.04 11:50)
Тогда, скорее всего, используется что-то другое, например, ГОСТ или ИСО.
А как на билетах пишут Евгений? На водительских правах пишут EVGENY, хотя по тем правилам должны писать JEVGENIY.
Если используется ГОСТ или ИСО, то мой алгоритм подойдет запросто.


 
Igorek ©   (2004-10-06 12:56) [48]

> Игорь Шевченко ©   (06.10.04 10:21) [28]
> Igorek ©   (05.10.04 20:27) [20]
> > А неоднозначностей не может быть?
> Как минимум, один из стандартов (ГОСТ 16876-71) является
> симметричным. За остальные сказать не могу.

Это вроде не одно и то-же. Однозначным может быть как симметричный, так и не симметричный.


 
[lamer]Barmaglot ©   (2004-10-06 13:16) [49]

Хм... Вообщето Koi8-r при отрезании старшего бита начинает писать транслитом... Кроме того в линукс есть программа iconv насколько я помню, поддерживаемые ей кодировки занимают несколько экранов, кроме того исходные тексты естественно присутствуют :-)... Так что вам прямая дорога в линукс :-)


 
Игорь Шевченко ©   (2004-10-06 13:18) [50]

Igorek ©   (06.10.04 12:56) [48]


> Это вроде не одно и то-же. Однозначным может быть как симметричный,
> так и не симметричный.


С этого места подробнее.


 
Anatoly Podgoretsky ©   (2004-10-06 13:32) [51]

Igorek ©   (06.10.04 12:56) [48]
Не может быть симметричным, где из одного символа получается несколько.


 
}|{yk ©   (2004-10-06 13:34) [52]

Почему не может? Может. Ведь мы же можем как-то различить, где это два разных звука, а где один. Значит есть какие-то правила. Но тут нужно к филологам обращаться


 
Anatoly Podgoretsky ©   (2004-10-06 13:38) [53]

ИИ


 
TUser ©   (2004-10-06 13:43) [54]


> Не может быть симметричным, где из одного символа получается
> несколько

Не всегда, наверное. Обычно бывает спец. символ, который трактуется как начало (конец) комбинации, типа "/". В приведенной ссылке, в одном из вариантов рекомендуют h использовать в качестве суффикса для комбинайий символов - тогда там все будет симметрично.


 
Igorek ©   (2004-10-06 16:08) [55]

> Игорь Шевченко ©   (06.10.04 13:18) [50]
> Igorek ©   (06.10.04 12:56) [48]
> > Это вроде не одно и то-же. Однозначным может быть как
> симметричный, так и не симметричный.
> С этого места подробнее.

Напр. допустим символы [ab]-рус, [cd]-лат.

Тогда преобразование (a->c, b->c) однозначно, но не симметрично (не существует обратного преобразования).

А (a->c, ab->c) - неоднозначно (если нету приоритетов).

Не могу счас сказать точно, в какой взаимосвязи состоят не/однозначность и симметричность в общем случае.

---
Не советую применять алгоритмы на основе FindSubString. Лучше парсить строку посимвольно - конечный автомат для лексического анализа.


 
}|{yk ©   (2004-10-06 16:11) [56]

Эт точно. Дж. Бакнелл, гл.11


 
Igorek ©   (2004-10-06 16:34) [57]


> }|{yk ©   (06.10.04 16:11) [56]
> Эт точно. Дж. Бакнелл, гл.11

Чо за книга?


 
}|{yk ©   (2004-10-06 16:40) [58]

Фундаментальные алгоритмы и структуры данных в Delphi

Но всё-таки, как удобно в С++
typedef std::map<String, String> AlphabetMap;


 
Igorek ©   (2004-10-06 17:24) [59]


> }|{yk ©   (06.10.04 16:40) [58]
> Но всё-таки, как удобно в С++
> typedef std::map<String, String> AlphabetMap;

Что именно? Шаблоны вообще или map в частности?


 
}|{yk ©   (2004-10-06 17:27) [60]

Да вообще STL. Вот бы кто перенес её на Obj Pascal :(


 
Игорь Шевченко ©   (2004-10-06 17:34) [61]


> Да вообще STL. Вот бы кто перенес её на Obj Pascal


С написанием компилятора, поддерживающего templates...


 
Igorek ©   (2004-10-06 17:43) [62]

> }|{yk ©   (06.10.04 17:27) [60]
> Игорь Шевченко ©   (06.10.04 17:34) [61]

Не так и фантастично.
Можно сделать подобное на интерфейсах или на published методах.


 
Игорь Шевченко ©   (2004-10-06 17:44) [63]

Igorek ©   (06.10.04 17:43) [62]


> Не так и фантастично.
> Можно сделать подобное на интерфейсах или на published методах


Сделай. :)


 
Igorek ©   (2004-10-06 17:46) [64]

> на published методах.
Вот только проверка конкретизации шаблонного типа уже на стадии компиляции становится невозможной.


 
Суслик ©   (2004-10-06 17:46) [65]


> 62] Igorek ©   (06.10.04 17:43)


> Можно сделать подобное на интерфейсах или на published методах.

нужно ли только кому-то это подобное?


 
Igorek ©   (2004-10-06 17:47) [66]


> Игорь Шевченко ©   (06.10.04 17:44) [63]
> Igorek ©   (06.10.04 17:43) [62]
> > Не так и фантастично.
> > Можно сделать подобное на интерфейсах или на published
> методах
> Сделай. :)

Деньги в нашем жестоком мире решают все. :-(


 
Игорь Шевченко ©   (2004-10-06 17:49) [67]

Igorek ©   (06.10.04 17:47) [66]


> Деньги в нашем жестоком мире решают все. :-(


А ты начни. Задаром. Набросай идею реализации, глядишь, народ подтянется - у нас народ отзывчивый.


 
wisekaa ©   (2004-10-06 19:44) [68]


> Игорь Шевченко ©

Не ужели во всех просторах интернета не нашлось подходящего алгоритма?


 
KilkennyCat ©   (2004-10-06 20:02) [69]

почти закончил. универсальный. в обе стороны симметричные стандарты, несимметричные - в одну. Двухвариантный - для перевода коротких строк и больших текстов (с ресурса или файла напрямую). Осталось проверить на ашипки.


 
}|{yk ©   (2004-10-06 20:04) [70]

Что-то медленно :)


 
KilkennyCat ©   (2004-10-06 20:06) [71]

отвлекают на работе - уже четвертые сутки неспамши, кучу документов готовим-с...


 
Danilka ©   (2004-10-07 09:35) [72]

[55] Igorek ©   (06.10.04 16:08)
> Не советую применять алгоритмы на основе FindSubString.
> Лучше парсить строку посимвольно - конечный автомат для
> лексического анализа.

Угу, если есть необходимость мегабайтные тексты с транслита переводить, а если надо только ФИО, то какие проблемы? :))


 
Anatoly Podgoretsky ©   (2004-10-07 09:53) [73]

Игорь Шевченко ©   (06.10.04 12:36) [46]
Не возможно, только силой интеллекта и в контесте, например посде детранслитеризации получили слово вошод (это простой пример, чаще сложнее), в контексте будет понятно да и то не всегда. Для чатов и форумов это подойдет, а в деле не очень.


 
Игорь Шевченко ©   (2004-10-07 10:02) [74]

Anatoly Podgoretsky ©   (07.10.04 09:53) [73]

Безусловно, интеллект никто не отменяет. Но дать этому интеллекту подспорье, например, в виде возможных вариантов обратной транслитерации, это, я полагаю, решаемая задача.


 
Anatoly Podgoretsky ©   (2004-10-07 10:12) [75]

Игорь Шевченко ©   (07.10.04 10:02) [74]
А подспорье хороше дело, особенно если при этом будет виден оригинал слова и необязательная возможность корректировки.
Программу перекодировки, при наличии таблицы можно написать минут за 30 с отладкой.

При проверке надо учитывать последовательность двойных и тройных символов. Если же добавить грамматический корректор, то качество резко возрастает, это часто используют в OCR

Еще одно неясно для какой цели, если это где то в переписке, чатах, форумах, о встает другая проблема, каждый транслитеризует как бог на душу положит, и очень редко по ГОСТу.


 
Игорь Шевченко ©   (2004-10-07 10:35) [76]

Anatoly Podgoretsky ©   (07.10.04 10:12) [75]


> Еще одно неясно для какой цели


Цель простая - есть авиабилет, на котором написана фамилия пассажира латиницей. В ряде случаев эта же фамилия нужна в ее оригинальном (русском) варианте. В настоящий момент трансляцией занимается тот самый интеллект. Есть предложение сделать поспорье этому интеллекту, предложив несколько вариантов обратной транслитерацией с возможностью выбора нужного и возможной корректировки.


 
Igorek ©   (2004-10-07 10:42) [77]

> Anatoly Podgoretsky ©   (07.10.04 10:12) [75]
> каждый транслитеризует
> как бог на душу положит, и очень редко по ГОСТу.

Вот это имхо главная проблема. Транслитерация сама по себе проста. Вопрос в том, что всегда есть оригинал (рус.фамилия). Если вы конвертируете с лат. обратно в рус. то результат гарантирован только если первое преобразование было вам известным.


 
}|{yk ©   (2004-10-07 10:44) [78]

А написать словарь фамилий и искать точное и близкое совпадения?


 
Игорь Шевченко ©   (2004-10-07 10:47) [79]

}|{yk ©   (07.10.04 10:44) [78]

Невыгодно



Страницы: 1 2 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.64 MB
Время: 0.027 c
1-1097049347
456
2004-10-06 11:55
2004.10.24
создать кнопку (на форме) во время работы программы


1-1097212070
Merlot
2004-10-08 09:07
2004.10.24
Разграничения прав пользователей


3-1095617691
pashaz
2004-09-19 22:14
2004.10.24
Обработка OnLostConnection (FIBPlus)


9-1087477228
Sormy
2004-06-17 17:00
2004.10.24
Как преобразовывать палитры цветов?


1-1097059770
ALex B.
2004-10-06 14:49
2004.10.24
Помоготе с HINT!!!