Автор Тема: обръщане на масив в PHP  (Прочетена 8016 пъти)

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: обръщане на масив в PHP
« Отговор #15 -: Feb 14, 2011, 15:32 »
обратното няма да стане без някакви предварително въведени граматически правила.

То да беше само граматика - "лесно" :) Ама е и лексика.

Горе-долу - правим търсене в правописния речник за всички думи съдържащи "проблемни" конфигурации на буквите, прилагаме граматиката към тях и получаваме речник на думите с различно транслитериране от това в алгоритъма. Би трябвало да се огледаме и за "транслитераторни омоними" - прим. "схат" и "шат" (имагинерни)
« Последна редакция: Feb 14, 2011, 15:36 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

Naka

  • Напреднали
  • *****
  • Публикации: 3402
    • Профил
Re: обръщане на масив в PHP
« Отговор #16 -: Feb 14, 2011, 15:37 »
Общо взето от кирилица към латиница е лесно, но обратното няма да стане без някакви предварително въведени граматически правила.

Обратното няма каk да стане без изкуствен интелект и разпознаване на реч --- щото се губи информация още при правото преобразуване Cyr->Lat

« Последна редакция: Feb 14, 2011, 15:39 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

nov_chovek

  • Напреднали
  • *****
  • Публикации: 536
  • Distribution: Ubuntu 8.10 по принуда
  • Window Manager: Gnome
    • Профил
    • WWW
Re: обръщане на масив в PHP
« Отговор #17 -: Feb 14, 2011, 16:40 »
Окей, значи заключението е, че транслитерация от латиница към кирилица е много трудно да стане. Така ли излиза?
Активен

edmon

  • Гост
Re: обръщане на масив в PHP
« Отговор #18 -: Feb 14, 2011, 19:53 »
Не може ли просто по правилата да се изготви алгоритъм!
Самата транслитерация е правило щом пише Zhrebchevo,  е ясно че в българския само първата буква е главна но няма думи с такива съгласни една до друг т.е. "зх" и явно става въпрос за "ж".
Май ... не е така както си мисля!Но не може да няма начин.
Имам предвид, че те правилата са измислени трябва само да се напише код с алгоритъм който да ги спазва!
Активен

nov_chovek

  • Напреднали
  • *****
  • Публикации: 536
  • Distribution: Ubuntu 8.10 по принуда
  • Window Manager: Gnome
    • Профил
    • WWW
Re: обръщане на масив в PHP
« Отговор #19 -: Feb 14, 2011, 22:59 »
има резон в думите ти edmon. Ако стринга се парсва първо по двойки и тройки букви и се търсят "zh", "sh", "sht" ...е ще има грешки но няма да е болка за умиране...

Едит: от друга страна пък как ще се познава "ъ" ? :)
« Последна редакция: Feb 14, 2011, 23:01 от nov_chovek »
Активен

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: обръщане на масив в PHP
« Отговор #20 -: Feb 15, 2011, 02:32 »
но няма думи с такива съгласни една до друг т.е. "зх" и явно става въпрос за "ж".
иЗХод, беЗХарактерен... Т.е., всички думи, започващи с "х" и с представка "из" или "без", а те са достатъчно много. Със сигурност има и други случаи, за които не се сещам в момента.

Съвършена транслитерация от чужда азбука към основната азбука на даден език се постига само по един начин - речник с всички думи. Важи за всички езици. Описване на всички правила на даден език в кода също не е достатъчно за постигане на съвършена транслитерация - във всеки език има и изключения. Имаме късмета да ползваме азбука и език, предоставящи изписване на думите по същия начин, по който се четат, което ни позволява без речник да имаме добра транслитерация от кирилица към други азбуки. Повечето народи нямат и това :)
Така че, ако някой има желанието да създаде съвършена транслитерация, трябва да се заеме с изписването на речник. Не си губете времето в излишни главоблъсканици - ако имате нужда от транслитерация, но нямате възможност да изпишете речник, опишете основните транслитериращи символи и комбинации от символи и не се занимавайте повече - без речник транслитерацията от чужд език към български винаги ще е далеч от съвършенството ;)
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

morbid_viper

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: (Open)SUSE since v5.3 (1999)
  • Window Manager: KDE ориентиран
    • Профил
Re: обръщане на масив в PHP
« Отговор #21 -: Feb 15, 2011, 11:05 »
Код
GeSHi (Perl):
  1. # преобразуване на латиницата в кирилица - дава добри резултати за лични имена
  2. sub lat2cyr(){
  3.        my $inStr = shift;
  4.  
  5.        $inStr =~ tr/[A-Z]/[a-z]/;
  6.        $inStr =~ s/([a-zA-Z]+)/\u$1/g;
  7.  
  8.        $inStr =~ s/mitar/митър/g;  $inStr =~ s/r[au]st/ръст/g;
  9.        $inStr =~ s/etar/етър/g;      $inStr =~ s/Kanch/Кънч/g;
  10.        $inStr =~ s/nd[ae]r/ндър/g;
  11.        $inStr =~ s/Dian/Диян/g;    $inStr =~ s/dian/диян/g;
  12.        $inStr =~ s/aria/ария/g;     $inStr =~ s/l[iy]a/лия/g;
  13.        $inStr =~ s/or[iy]a/ория/g;
  14.        $inStr =~ s/Lub/Люб/g;      $inStr =~ s/Lud/Люд/g;
  15.        $inStr =~ s/diyal/дял/g;        $inStr =~ s/sica/сица/g;
  16.        $inStr =~ s/Sia/Сия/g;
  17.        $inStr =~ s/nguel/нгел/g;       $inStr =~ s/[CZ][wv]et/Цвет/g;  
  18.        $inStr =~ s/ueorg/еорг/g;       $inStr =~ s/Can/Цан/g;
  19.        $inStr =~ s/Con/Цон/g;         $inStr =~ s/Lyd[iy]a/Лидия/g;
  20.        $inStr =~ s/S[yi]lv[yi]a/Силвия/g;      $inStr =~ s/Theo/Тео/g;
  21.        $inStr =~ s/Chris/Хрис/g;
  22.  
  23.        $inStr =~ s/[YJ]o?u/Ю/g;    $inStr =~ s/[yj]o?u/ю/g;
  24.        $inStr =~ s/[YJ]o/Йо/g;     $inStr =~ s/([iaoue])[yj]o/$1йо/g;
  25.        $inStr =~ s/[yj]o/ьо/g;
  26.        $inStr =~ s/[YI]a/Я/g;      $inStr =~ s/[yi]a/я/g;
  27.        $inStr =~ s/Sht/Щ/g;        $inStr =~ s/sht/щ/g;
  28.        $inStr =~ s/Sh/Ш/g;         $inStr =~ s/sh/ш/g;
  29.        $inStr =~ s/Ch/Ч/g;         $inStr =~ s/[Tt]?ch/ч/g;
  30.        $inStr =~ s/T[sz]/Ц/g;      $inStr =~ s/t[sz]/ц/g;
  31.        $inStr =~ s/Zh|J/Ж/g;       $inStr =~ s/zh|j/ж/g;
  32.        $inStr =~ s/Ou/У/g;         $inStr =~ s/ou/у/g;
  33.        $inStr =~ s/ss/с/g;         $inStr =~ s/off/ов/g;
  34.        $inStr =~ s/x/кс/g;
  35.  
  36. # след като сме пообработили доста изключения да обърнем по-голямото
  37. # количество буквил
  38. # долната команда това очевидно трябва да е на един ред!!!!
  39.        $inStr =~ tr/[ABVGDEZIKLMNOPRSTUFHabvgdeziklmnoprstufhQqWwCcy]
  40. /[АБВГДЕЗИКЛМНОПРСТУФХабвгдезиклмнопрстуфхЯяВвКкй]/;
  41.  
  42.        return $inStr;
  43. };
  44. sub cyr2lat(){
  45.        my $inStr = shift;
  46.  
  47.        # правим всички главни букви малки
  48.        $inStr =~ tr/[А-ЯA-Z]/[а-яa-z]/;
  49.        # правим голяма първата буква на всяка дума
  50.        $inStr =~ s/([a-zA-Z]+)/\u$1/g;
  51.  
  52.        $inStr =~ s/ългария/ulgaria/g;
  53.        $inStr =~ s/ия([^а-я])/ia$1/g;
  54.  
  55.        $inStr =~ s/Ю/Yu/g;    $inStr =~ s/ю/yu/g;
  56.        $inStr =~ s/Йо/Yo/g;   $inStr =~ s/[йь]о/yo/g;
  57.        $inStr =~ s/Я/Ya/g;    $inStr =~ s/я/ya/g;
  58.        $inStr =~ s/Щ/Sht/g;   $inStr =~ s/щ/sht/g;
  59.        $inStr =~ s/Ш/Sh/g;    $inStr =~ s/ш/sh/g;
  60.        $inStr =~ s/Ч/Ch/g;    $inStr =~ s/ч/ch/g;
  61.        $inStr =~ s/Ц/Ts/g;    $inStr =~ s/ц/ts/g;
  62.        $inStr =~ s/Ж/Zh/g;    $inStr =~ s/ж/zh/g;
  63.        $inStr =~ s/[Ьь]//g;
  64.  
  65.        $inStr =~ tr/[абвгдезийклмнопрстуфхъ]/[abvgdeziyklmnoprstufha]/;
  66.  
  67.        return $inStr;
  68. };
  69.  

ето и моят принос към делото… това съм го писал за една системка, която се обръщат главно лични имена
кодът е на Perl, но ако на някой му трябва лесно ще може да го обърне в РНР
изключенията съм ги правил на прилично голям корпус, но разбира се, не може да се разчита, че на 100% ще е коректно… все пак точността, която съм постигнал съм счел за достатъчна
« Последна редакция: Feb 15, 2011, 11:20 от morbid_viper »
Активен

-------------------------------------------------
Blessed are we to taste this life of sin!
-------------------------------------------------
Registered Linux user #251276

morbid_viper

  • Напреднали
  • *****
  • Публикации: 266
  • Distribution: (Open)SUSE since v5.3 (1999)
  • Window Manager: KDE ориентиран
    • Профил
Re: обръщане на масив в PHP
« Отговор #22 -: Feb 15, 2011, 11:32 »
Съвършена транслитерация от чужда азбука към основната азбука на даден език се постига само по един начин - речник с всички думи. Важи за всички езици. Описване на всички правила на даден език в кода също не е достатъчно за постигане на съвършена транслитерация - във всеки език има и изключения.
съвършена транслитерация няма! речниковото обработване има доста недостатъци и дори не решава проблема, който ти си мислиш. така например за една дума може да има няколко транлитерации и трябва да се вкарва отделно логика да се решава коя дума е по-най-вярна. да не говорим, че речникът трябва да се поддържа актуален и чист от боклуци. също така заема значително повече памет и за големи езикови множества си е тегавиня…
умните хора са измислили и други инструменти, като речник също се използва, но в една нехомогенна система и по-скоро за обслужване на изключенията.

Не си губете времето в излишни главоблъсканици - ако имате нужда от транслитерация, но нямате възможност да изпишете речник, опишете основните транслитериращи символи и комбинации от символи и не се занимавайте повече - без речник транслитерацията от чужд език към български винаги ще е далеч от съвършенството ;)
винаги ще е далеч, но поне могат да се направят няколко крачки напред. така или иначе драскачите на шльокавица си списват както им дойде наум всичко, за което ги мразя, мразя… мразя-я-я-я-я-я…
Активен

-------------------------------------------------
Blessed are we to taste this life of sin!
-------------------------------------------------
Registered Linux user #251276

Naka

  • Напреднали
  • *****
  • Публикации: 3402
    • Профил
Re: обръщане на масив в PHP
« Отговор #23 -: Feb 15, 2011, 12:02 »
Има още изключения:
4 -> Ч
6 -> Ш  ;D ;D ;D

За какво изобщо ви е небходима обратната транслитерация?

Айде правата има смисъл за да се предостави текст (не превод - а само имена) на чужденец който той ще може да го прочете.

Ами обратната? Да не е за търсене? Ако е за търсачки предполагам, че се изготвя някакъв междинен звуков образ на думите и по този звуков образ се сравняват. Mysql-а имаше нещо подобно.. SpellCheck -овете работят по подобен начин (gnu aspell).

Google-a предполагам също работи по подобен 'звуков' начин, но това не оправя проблемите - по скоро съдейства за налагането на световна Шльоковизация.



« Последна редакция: Feb 15, 2011, 12:10 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

edmon

  • Гост
Re: обръщане на масив в PHP
« Отговор #24 -: Feb 15, 2011, 14:37 »
но няма думи с такива съгласни една до друг т.е. "зх" и явно става въпрос за "ж".
иЗХод, беЗХарактерен... Т.е., всички думи, започващи с "х" и с представка "из" или "без", а те са достатъчно много. Със сигурност има и други случаи, за които не се сещам в момента.

без речник транслитерацията от чужд език към български винаги ще е далеч от съвършенството ;)

Преди 7-8 години като млад ентусиаст бях сканирал и ОCR-ирал правописния речник до буква 'Й' обаче ми писна! А в последствие загубих файловте :(

П.П. Има ли ентусиасти да си разделим някое пълно издание на правописен речник на по няколко букви и да ги из-по-на-сканираме! :)
« Последна редакция: Feb 15, 2011, 14:39 от edmon »
Активен

Naka

  • Напреднали
  • *****
  • Публикации: 3402
    • Профил
Re: обръщане на масив в PHP
« Отговор #25 -: Feb 15, 2011, 17:07 »
П.П. Има ли ентусиасти да си разделим някое пълно издание на правописен речник на по няколко букви и да ги из-по-на-сканираме!

Категорично НЕ!!! Освен ако не плащат по 1 € на дума  [_]3 [_]3 [_]3
Активен

Perl - the only language that looks the same before and after encryption.

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
Re: обръщане на масив в PHP
« Отговор #26 -: Feb 15, 2011, 18:26 »

Преди 7-8 години като млад ентусиаст бях сканирал и ОCR-ирал правописния речник до буква 'Й' обаче ми писна! А в последствие загубих файловте :(

П.П. Има ли ентусиасти да си разделим някое пълно издание на правописен речник на по няколко букви и да ги из-по-на-сканираме! :)
Може, създай нов проект за правописен речник (мисля вече имаше един.. бгофис) и съм вътре и аз.

Забележка: След бърза проверка се оказа че нямам правописен речник - имам само Правоговорен (Пашов, Първев) София 1975 г.
т.е. ..кога им изтичат  авторските права .. или някой ако ги познава тези да ги пита за разрешение. Аз лично като незапознат даже не знам кой трябва да се пита Пашов и Първев или Издателство Наука и изкуство бул. руски 6 (ако още го има)
Активен