Транслитерация имен

Тема в разделе "Lotus - Программирование", создана пользователем Rosna, 25 май 2011.

Наш партнер Genesis Hackspace
  1. Rosna

    Rosna Well-Known Member

    Регистрация:
    12 ноя 2003
    Сообщения:
    48
    Симпатии:
    0
    Доброго дня!

    Ищу пример реализации функции по тренслитерации имен.
    Нужно имена написанные латинице перевести в имена, написанные кириллицей, но можно и с другими языками.

    Встречал кто-нибудь такое? Или может сам реализовывал?
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.920
    Симпатии:
    1
    моя очень страрая ф-я

    Код (LotusScript):
    '   LangID = 0 - русский, 1 - украинский
    Function Translit( sRusString As String, LangID As Integer ) As String
    Translit = ""

    Const sRuAlph$ = {а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я}
    Const sRu2EnAlph$ = {a,b,v,g,d,e,jo,zh,z,i,j,k,l,m,n,o,p,r,s,t,u,f,h,c,ch,sh,shc,`,y, ,je,y,y}

    Const sUaAlph$ = {а,б,в,г,д,е,є,ж,з,и,і,ї,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ю,я}
    Const sUa2EnAlph$ = {a,b,v,g,d,je,e,zh,z,y,i,ji,j,k,l,m,n,o,p,r,s,t,u,f,h,c,ch,sh,shc,y,y}

    If Len( sRusString ) = 0 Then Exit Function
    Dim sFrom(0 To 1) As String, sTo(0 To 1) As String
    sFrom(0) = sRuAlph
    sFrom(1) = sUaAlph
    sTo(0) = sRu2EnAlph
    sTo(1) = sUa2EnAlph

    Dim aFromLC As Variant, aToLC As Variant
    Dim aFromUC As Variant, aToUC As Variant
    Dim aTo As String
    Dim i As Integer, j As Integer

    aFromLC =   Split ( Lcase(sFrom(LangID)), |,| )
    aToLC = Split ( Lcase(sTo(LangID)), |,| )
    aFromUC =   Split ( Ucase(sFrom(LangID)), |,| )
    aToUC = Split ( Ucase(sTo(LangID)), |,| )

    aTo = sRusString

    For i = 1 To Len(sRusString )           '   для каждого символа строки
    For j = 0 To Ubound( aFromLC )
    If Instr( Lcase( Mid( sRusString, i, 1 ) ) , Lcase( aFromLC(j) ) ) > 0 Then

    ' если для ниж. регистра
    If Instr( Mid(sRusString, i, 1 ) , aFromLC(j) ) > 0 Then    aTo = Implode( Split( aTo, aFromLC(j) ), aToLC(j) )

    ' если для верх. регистра
    If Instr( Mid(sRusString, i, 1 ) , aFromUC(j) ) > 0 Then aTo = Implode( Split( aTo, aFromUC(j) ), aToUC(j) )

    End If
    Next
    Next

    Translit = aTo
    End Function
     
  3. Rosna

    Rosna Well-Known Member

    Регистрация:
    12 ноя 2003
    Сообщения:
    48
    Симпатии:
    0
    Morpheus, большое спасибо!
    Пойду пробовать... :google:
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Как всё сложно. :google:
    Упрощенно так:
    Код (Text):
    a = Split("a b v ...")
    b = Split("а б в ...")
    result = Replace("vasja", a, b)
    Только сочетания типа щ-sch, ш-sh, я-ja и т.п. надо поставить на первое место, чтобы они первыми заменялись.
     
  5. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.920
    Симпатии:
    1
    Medevic
    я ж говорю "старая"
     
  6. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.062
    Симпатии:
    0
    Объясните мне глупому, с каких это пор кириллица и латиница стали языками?
     
  7. Rosna

    Rosna Well-Known Member

    Регистрация:
    12 ноя 2003
    Сообщения:
    48
    Симпатии:
    0
    vitfil, не придирайтесь)
    Само собой, что не языки, но так понятнее.
     
  8. Rosna

    Rosna Well-Known Member

    Регистрация:
    12 ноя 2003
    Сообщения:
    48
    Симпатии:
    0
    Medevic,

    Не выходит так почему-то.
    Пишет Type mismath на строчке с Реплейсом :)

    Код (Text):
    Public Function Translite( sEngString As String ) As String
    '
    Dim lstRus As Variant
    Dim lstEng As Variant
    Dim sRusString As Variant

    lstRus = Split("а б в г д")
    lstEng = Split("a b v g d")

    sRusString = Replace("vasja", lstEng, lstRus)

    Translite = "test"

    End Function ' Translite
     
  9. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
    первым параметром тоже должен быть массив(см. help)
     
  10. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.769
    Симпатии:
    39
    Ребята, не все так просто.
    Простой Replace тут не канает.
    Из какой страны автор поста? В какую кириллицу переводить? В России свои порядки транслитерации, в Украине свои так же как и в Белоруссии, я думаю.
    В первую очередь надо поднять нормативку по правилам транслитерации для определенной страны.
    Например в украинском варианте одна и та же буква в начале и конце слова транслитится по разному.

    Вот русский алфавит, вот украинский вариант
    Причем смотрю что в украинском варианте есть особые нюансы. Разница в том, что в украинском языке есть и ь и ' (апостроф), и в некоторых случаях, где надо писать ' пишется ь
     
  11. Rosna

    Rosna Well-Known Member

    Регистрация:
    12 ноя 2003
    Сообщения:
    48
    Симпатии:
    0
    Я из Минска, но язык русский

    Проблема тут не столько в правилах, сколько в том, что переводить нужно именно с киррилицы на латиницу, а не наоборот.
    Я сделала с помощью наборов символов 4-х, 3-х 2-х и 1-буквенных. Потом их попеременно на слове применяю.
    Правда универсальных правил разработать не получилось. Оказалось, что без словарика с частовстречающимися словами не обойтись.

    За основу брала это:
    http://transliteration.ru/mvd_1047/

    Проблемы имели подобный вид:
    Igor - переводится в - Игор
    мягкий знак никак не присобачить, так как есть имена типа:
    Regnar - которое в кириллице должно выглядеть как - Регнар

    Ну вроде работает. :)

    Morpheus, спасибо еще раз за помощь!
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.188
    Симпатии:
    308
    вот изложу нек. соображения...
    хоца сэкономить кол-во строк кода :), за оптимальность я не могу ничего сказать
    тем не менее - использовать "стандартную" либу (типа от вендора)
    Код (Text):
    import com.ibm.icu.text.Transliterator;
    /**
    * Created by mike on 30.01.15.
    */
    public class Translit {
    public static void main(String args[]){
    String rules = "Ч > Ch; ч > ch ";
    Transliterator tempTrans = Transliterator.createFromRules("temp", rules, Transliterator.FORWARD);
    String tempResult = tempTrans.transform(args[0]);
    Transliterator t=Transliterator.getInstance("Any-Latin");
    System.out.println(t.transliterate(tempResult));
    }
    }
    юзаем кастомную подстановку и поверх фигачим базовую (с цепочкой я поленился разбираться) пример с кот. драл com.ibm.icu в поставке нотусни не присут.

    Добавлено: rules разумеется надо дополнить
     
  13. valmont

    valmont Well-Known Member

    Регистрация:
    27 дек 2004
    Сообщения:
    63
    Симпатии:
    0
    @replacesubstring(str;"a":"b":"c":"d";"а":"б":"ц":"д")
     
  14. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.769
    Симпатии:
    39
    Лишь бы написать?
     
  15. alexas1

    alexas1 Well-Known Member
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    593
    Симпатии:
    217
    Прямая транслитерация (кир->лат) без проблем - по официальным правилам, как написали выше (с приоритетом дифтонгов).
    Обратная - по словарю: взять готовый словарь имён и сделать соответствие им в латинице (автоматом, по официальным правилам).
    Если нет в словаре - тогда уж по обратным правилам. Точность будет оч хорошая.
    Ну и предусмотреть автоматическое дополнение словаря - пусть система сама себя учит.
    На самом деле не так много имён в ходу - примерно 18 000 женских и 22 000 мужских (на всём постсоветском пространстве).

    Кста, так можно весьма точно определять пол (по имени, бывает нужно), с проверкой конечно, если имя встретится в "мужском" и "женском" словаре одновременно.
    Так же позволит слегка автоматизировать ввод имён, если использовать вместе с моей мулькой.
    Если интересно, могу выложить словарики (xlsx) - перегнать в нотус и вперёд.

    Так же и с фамилиями можно поступить их тоже не много, как ни странно (у меня словарика нет - потерялся B) )
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.188
    Симпатии:
    308
    либа позволяет не весь словарь маньячить в массив, а только сочетания, причем - в наглядной форме (чего - во что)
    акцент именно на наглядность и экономию времени составления словаря (поддержки)
    этаже либы поддерживает и реверсивное преобразование
     
  17. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.188
    Симпатии:
    308
    маленькая деталь...
    в нотусневой поставке (эклипсбэйзед - т.е. полной) есть эти либы находятся они в C:\Program Files\IBM\Notes\framework\rcp\eclipse\plugins
    для виндятского 32 разрядного клиента (для 64 бит путь поменяется на ...\Program Files(x86)\... )

    в версии 9.0.1 - это com.ibm.icu_3.8.1.v20120530.jar
    что, собсно, и можно подключить к архивам (для java агента или либы) - Import->Arhive
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.188
    Симпатии:
    308
  19. alexas1

    alexas1 Well-Known Member
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    593
    Симпатии:
    217
    СПСБ. Но лат->кир в шоколаде не пройдёт: (ь ъ) (е ё э) (ы й) не дадут взаимно однозначного соответствия - без словарика не обойтись.
     
Загрузка...

Поделиться этой страницей