Conversion hiragana/katakana => rômaji (caractères jap. à convertir en latins

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Conversion hiragana/katakana => rômaji (caractères jap. à convertir en latins

par Hubert Roksor » 28 oct. 2007, 22:30

ce ne sont que des extraits très courts
Comme je disais, tu devrais les traiter en un bloc, donc.

par Masahiro » 28 oct. 2007, 21:24

Dans l'immédiat ce ne sont que des extraits très courts, pour le dico, donc forcément la différence n'est pas énorme.

Pour le listings de phrases, je vais mettre mes pages en cache donc le temps d'execution n'a pas d'importance, c'est juste pour le dico que ça en a.

par Hubert Roksor » 28 oct. 2007, 18:21

strstr, ça a réduit de 20% le temps d'execution !
Euh, en fait je m'attendais plutôt à quelque chose entre 50% et 90% selon la taille du texte (plus le texte est long, plus la différence est favorable à strtr()). Est-ce que tu utilises ce code dans une boucle, sur de nombreuses phrases courtes ? Auquel cas, tu aurais meilleur compte de joindre toutes tes phrases à l'aide d'un séparateur spécial, translitérer, plus re-séparer tes phrases si nécessaire.

par Masahiro » 28 oct. 2007, 10:55

Tout le projet est déjà en UTF-8, c'est juste le forum ici qui ne les a pas acceptés ;-)


PS : pour voir concrètement le résultat de ce script :

http://www.tokidoki.fr/?k=%E8%BE%BC (laissez la souris sur les lectures en japonais).

par Tracker » 28 oct. 2007, 10:53

Salut,

Une autre optimisation que tu pourrais apporter, c'est de passer ton projet en utf-8 voir utf-16, tu réduirais la tailles des tableaux et tu accélèrais sans doute les temps d'accès (les clés étant plus courtes).


Tracker.

par Masahiro » 28 oct. 2007, 10:22

Je vais étudier la question avec l'admin de mon shell pour installer translit, et comparer les performances à ce niveau.

Je pense que ça sera très intéressant mais je ne crois pas que ça s'applique au japonais. Pour les caractères chinois (dans la langue japonaise), il y a plusieurs lectures possibles selon le contexte, les suites de caractères, le sens précis, etc. Du coup, c'est extrêmement difficile d'obtenir un résultat probant.

Merci beaucoup en tous cas pour l'astuce avec strstr, ça a réduit de 20% le temps d'execution !

par Hubert Roksor » 28 oct. 2007, 00:14

Si j'ai bien compris, ton script fonctionne correctement mais tu souhaites le rendre plus rapide c'est bien ça ? Dans ce cas, tu peux remplacer str_replace() par strtr(), qui est plus rapide sur ce type de remplacements multiples. Ainsi, tes quatre str_replace() peuvent être remplacés par
$resultat = strtr($resultat, $hira_kata + $kyakyukyo);
$resultat = strtr($resultat, $tsu);
$resultat = strtr($resultat, $allongements);
Tant que tu y es, tu peux fusionner le contenu des deux variables $hira_kata et $kyakyukyo en une seule, en une seule déclaration pour de meilleures performances. C'est le rôle de l'opérateur +, qui permet d'ajouter un tableau à un autre sans écraser les données préexistantes (contrairement à array_merge()).

En y réfléchissant, on peut économiser une étape en réorganisant les remplacements, ce qui nous donne
$tr1 = array(
	// liste de tous les kana, autrement dit tout ce qui se
	// trouve dans $hira_kata et $kyakyukyo
);

$tr2 = array(
	// liste de tout ce qui se trouve dans $tsu, plus
	'Aー' => 'AA',
	'Iー' => 'II',
	'Uー' => 'UU',
	'Eー' => 'EE',
	'Oー' => 'OO'
);

$resultat = strtr($mot, $tr1);
$resultat = strtr($resultat, $tr2);

Sinon, si tu as les moyens d'ajouter des extensions PHP tu peux regarder du côté de cette extension : translit

Conversion hiragana/katakana => rômaji (caractères jap. à

par Masahiro » 27 oct. 2007, 23:56

Bonjour,

J'ai codé un petit script qui permet de convertir des caractères japonais "illisibles" pour les gens qui ne les connaissent pas, en lettres latines que tout le monde pourra lire.

Le problème, c'est que j'ai du recourir à quatre str_replace d'affilée. Ce système fonctionne mais ce n'est pas très habile.

Voici quelques règles en japonais que je dois prendre en compte pour la conversion :

Les kana sont les deux syllabaires japonais de base. Ce n'est donc pas un alphabet très facile à convertir.

Les kana sont faits de 2 syllabaires : les hiragana (en lettres minuscules par convention) et les katakana (en lettres majuscules).

Il y a ensuite les "petits tsu", qui sont っ et ッ. Ils indiquent que la première consonne du kana qui suit est doublée. Genre っか (っka) va donner kka.


Le problème c'est que si je fais 1 seul str_replace, il ne convertit pas les éléments déjà convertits : par exemple :

か => ka
っk => っk

Même si je lui indique expressément de convertir les っk en kk.


Bref, si vous trouvez une solution plus habile, je vous en serais très reconnaissant. C'est une fonction que je vais énormément utiliser et j'ai besoin de l'optimiser au maximum.

Merci beaucoup !




Ce script génère : ねえ、おまえ、スーパーマーケットにいったかい? > nee, omae, SUUPAAMAAKETTOniittakai?
// 
$mot = 'ねえ、おまえ、スーパーマーケットにいったかい?';
$resultat = $mot;


$hira_kata = array(
	'あ' => 'a',
	'い' => 'i',
	'う' => 'u',
	'え' => 'e',
	'お' => 'o',
	'か' => 'ka',
	'き' => 'ki',
	'く' => 'ku',
	'け' => 'ke',
	'こ' => 'ko',
	'さ' => 'sa',
	'し' => 'shi',
	'す' => 'su',
	'せ' => 'se',
	'そ' => 'so',
	'た' => 'ta',
	'ち' => 'chi',
	'つ' => 'tsu',
	'て' => 'te',
	'と' => 'to',
	'な' => 'na',
	'に' => 'ni',
	'ぬ' => 'nu',
	'ね' => 'ne',
	'の' => 'no',
	'は' => 'ha',
	'ひ' => 'hi',
	'ふ' => 'fu',
	'へ' => 'he',
	'ほ' => 'ho',
	'ま' => 'ma',
	'み' => 'mi',
	'む' => 'mu',
	'め' => 'me',
	'も' => 'mo',
	'や' => 'ya',
	'ゆ' => 'yu',
	'よ' => 'yo',
	'ら' => 'ra',
	'り' => 'ri',
	'る' => 'ru',
	'れ' => 're',
	'ろ' => 'ro',
	'わ' => 'wa',
	'ゐ' => 'wi',
	'ゑ' => 'we',
	'を' => 'wo',
	'ん' => 'n',
	'が' => 'ga',
	'ぎ' => 'gi',
	'ぐ' => 'gu',
	'げ' => 'ge',
	'ご' => 'go',
	'ざ' => 'za',
	'じ' => 'ji',
	'ず' => 'zu',
	'ぜ' => 'ze',
	'ぞ' => 'zo',
	'だ' => 'da',
	'ぢ' => 'di',
	'づ' => 'du',
	'で' => 'de',
	'ど' => 'do',
	'ば' => 'ba',
	'び' => 'bi',
	'ぶ' => 'bu',
	'べ' => 'be',
	'ぼ' => 'bo',
	'ぱ' => 'pa',
	'ぴ' => 'pi',
	'ぷ' => 'pu',
	'ぺ' => 'pe',
	'ぽ' => 'po',
	
	'ア' => 'A',
	'イ' => 'I',
	'ウ' => 'U',
	'エ' => 'E',
	'オ' => 'O',
	'カ' => 'KA',
	'キ' => 'KI',
	'ク' => 'KU',
	'ケ' => 'KE',
	'コ' => 'KO',
	'サ' => 'SA',
	'シ' => 'SHI',
	'ス' => 'SU',
	'セ' => 'SE',
	'ソ' => 'SO',
	'タ' => 'TA',
	'チ' => 'CHI',
	'ツ' => 'TSU',
	'テ' => 'TE',
	'ト' => 'TO',
	'ナ' => 'NA',
	'ニ' => 'NI',
	'ヌ' => 'NU',
	'ネ' => 'NE',
	'ノ' => 'NO',
	'ハ' => 'HA',
	'ヒ' => 'HI',
	'フ' => 'FU',
	'ヘ' => 'HE',
	'ホ' => 'HO',
	'マ' => 'MA',
	'ミ' => 'MI',
	'ム' => 'MU',
	'メ' => 'ME',
	'モ' => 'MO',
	'ヤ' => 'YA',
	'ユ' => 'YU',
	'ヨ' => 'YO',
	'ラ' => 'RA',
	'リ' => 'RI',
	'ル' => 'RU',
	'レ' => 'RE',
	'ロ' => 'RO',
	'ワ' => 'WA',
	'ヰ' => 'WI',
	'ヱ' => 'WE',
	'ヲ' => 'WO',
	'ン' => 'N',
	'ガ' => 'GA',
	'ギ' => 'GI',
	'グ' => 'GU',
	'ゲ' => 'GE',
	'ゴ' => 'GO',
	'ザ' => 'ZA',
	'ジ' => 'JI',
	'ズ' => 'ZU',
	'ゼ' => 'ZE',
	'ゾ' => 'ZO',
	'ダ' => 'DA',
	'ヂ' => 'DI',
	'ヅ' => 'DU',
	'デ' => 'DE',
	'ド' => 'DO',
	'バ' => 'BA',
	'ビ' => 'BI',
	'ブ' => 'BU',
	'ベ' => 'BE',
	'ボ' => 'BO',
	'パ' => 'PA',
	'ピ' => 'PI',
	'プ' => 'PU',
	'ペ' => 'PE',
	'ポ' => 'PO',
	'!' => '!',
	'?' => '?',
	'、' => ', '
);
$resultat = str_replace(array_keys($hira_kata), array_values($hira_kata), $resultat);

$kyakyukyo = array(
	'きゃ' => 'kya',
	'きゅ' => 'kyu',
	'きょ' => 'kyo',
	'しゃ' => 'sha',
	'しゅ' => 'shu',
	'しょ' => 'sho',
	'ちゃ' => 'cha',
	'ちゅ' => 'chu',
	'ちょ' => 'cho',
	'にゃ' => 'nya',
	'にゅ' => 'nyu',
	'にょ' => 'nyo',
	'ひゃ' => 'hya',
	'ひゅ' => 'hyu',
	'ひょ' => 'hyo',
	'みゃ' => 'mya',
	'みゅ' => 'myu',
	'みょ' => 'myo',
	'りゃ' => 'rya',
	'りゅ' => 'ryu',
	'りょ' => 'ryo',
	'ぎゃ' => 'gya',
	'ぎゅ' => 'gyu',
	'ぎょ' => 'gyo',
	'じゃ' => 'ja',
	'じゅ' => 'ju',
	'じょ' => 'jo',
	'びゃ' => 'bya',
	'びゅ' => 'byu',
	'びょ' => 'byo',
	'ぴゃ' => 'pya',
	'ぴゅ' => 'pyu',
	'ぴょ' => 'pyo',
	'キャ' => 'KYA',
	'キュ' => 'KYU',
	'キョ' => 'KYO',
	'シャ' => 'SHA',
	'シュ' => 'SHU',
	'ショ' => 'SHO',
	'チャ' => 'CHA',
	'チュ' => 'CHU',
	'チョ' => 'CHO',
	'ニャ' => 'NYA',
	'ニュ' => 'NYU',
	'ニョ' => 'NYO',
	'ヒャ' => 'HYA',
	'ヒュ' => 'HYU',
	'ヒョ' => 'HYO',
	'ミャ' => 'MYA',
	'ミュ' => 'MYU',
	'ミョ' => 'MYO',
	'リャ' => 'RYA',
	'リュ' => 'RYU',
	'リョ' => 'RYO',
	'ギャ' => 'GYA',
	'ギュ' => 'GYU',
	'ギョ' => 'GYO',
	'ジャ' => 'JA',
	'ジュ' => 'JU',
	'ジョ' => 'JO',
	'ビャ' => 'BYA',
	'ビュ' => 'BYU',
	'ビョ' => 'BYO',
	'ピャ' => 'PYA',
	'ピュ' => 'PYU',
	'ピョ' => 'PYO',
	'ウィ' => 'WI',
	'ウェ' => 'WE',
	'ウォ' => 'WO',
	'シェ' => 'SHE',
	'チェ' => 'CHE',
	'ツァ' => 'TSA',
	'ツェ' => 'TSE',
	'ツォ' => 'TSO',
	'ティ' => 'TI',
	'トゥ' => 'TU',
	'ファ' => 'FA',
	'フィ' => 'FI',
	'フェ' => 'FE',
	'フォ' => 'FO',
	'ジェ' => 'JE',
	'ディ' => 'DI',
	'ドゥ' => 'DU',
	'デュ' => 'DYU'
);
$resultat = str_replace(array_keys($kyakyukyo), array_values($kyakyukyo), $resultat);

$tsu = array(
	'っk' => 'kk',
	'っs' => 'ss',
	'っt' => 'tt',
	'っc' => 'cc',
	'っh' => 'hh',
	'っm' => 'mm',
	'っr' => 'rr',
	'っg' => 'gg',
	'っj' => 'jj',
	'っd' => 'dd',
	'っb' => 'bb',
	'っb' => 'pp',
	'ッK' => 'KK',
	'ッS' => 'SS',
	'ッT' => 'TT',
	'ッC' => 'CC',
	'ッH' => 'HH',
	'ッM' => 'MM',
	'ッR' => 'RR',
	'ッG' => 'GG',
	'ッJ' => 'JJ',
	'ッD' => 'DD',
	'ッB' => 'BB',
	'ッP' => 'PP',
	'ー' => '-'
);
$resultat = str_replace(array_keys($tsu), array_values($tsu), $resultat);

$allongements = array(
	'A-' => 'AA',
	'I-' => 'II',
	'U-' => 'UU',
	'E-' => 'EE',
	'O-' => 'OO'
);
$resultat = str_replace(array_keys($allongements), array_values($allongements), $resultat);



echo $mot .' > '. $resultat;