Главная страница
    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.63 MB
Время: 0.037 c
4-1095502259
banderas
2004-09-18 14:10
2004.10.24
Alt+F4?


14-1097066132
Igorek
2004-10-06 16:35
2004.10.24
Отладка многопоточных приложений в Дельфи / Билдере


1-1097568975
Одиг
2004-10-12 12:16
2004.10.24
TSpeedButton и как к нему приделать drag&amp;drop


4-1095508306
Kirill
2004-09-18 15:51
2004.10.24
Кто использует DLL


3-1096468356
Koala
2004-09-29 18:32
2004.10.24
удаление строк из ХП





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский