Thursday,September 8

よみがな自動(じどう)処理(しょり)への(みち)【6】全角(ぜんかく)カタカナ→全角(ぜんかく)ひらがな

前回(ぜんかい)のログで、PerlからMeCabにコマンドを送信(そうしん)して、その形態素(けいたいそ)解析(かいせき)結果(けっか)()けとれるようになりました。
でも、解析(かいせき)結果(けっか)をよみがなにするためには、まだいくつかのヤマがあります。

そのヤマのひとつ。
Mecabの形態素(けいたいそ)解析(かいせき)の「()み」の部分(ぶぶん)は「全角(ぜんかく)カタカナ」です。
ウェブで自然(しぜん)なよみがなとして表示(ひょうじ)するためには、この「全角(ぜんかく)カタカナ」を「全角(ぜんかく)ひらがな」に()()える必要(ひつよう)があります。これがひとつめのヤマ。

今回(こんかい)のログは「全角(ぜんかく)カタカナ」→「全角(ぜんかく)ひらがな」の()()えについてご紹介(しょうかい)します。

(おぼ)えてますか?
よみがな自動(じどう)処理(しょり)への(みち)【3】Shift-JIS→UTF8へ で、MeCabの文字(もじ)コードをUTF8にしたこと。

そうなんです。
ウェブで使(つか)われている文字(もじ)コード、Perlで使用(しよう)している文字(もじ)コード、そしてMeCabの文字(もじ)コードすべてがUTF8に統一(とういつ)されているんです。

UTF8はウェブで表記(ひょうき)するには使(つか)勝手(がって)のよい文字(もじ)コードなんですが、プログラムで(あつか)うには厄介(やっかい)文字(もじ)コードです。

UTF8は2バイト~最大(さいだい)8バイトまでの可変長(かへんちょう)文字(もじ)コードで、そのなかでも半角(はんかく)英数字(えいすうじ)半角(はんかく)記号(きごう)(アスキー文字(もじ))は2バイト、日本語(にほんご)全角(ぜんかく)文字(もじ)は3バイトで()まれています。ウェブで表記(ひょうき)するぶんには、2バイト文字(もじ)と3バイト文字(もじ)認識(にんしき)できれば充分(じゅうぶん)だと(おも)います。

この3バイト文字(もじ)日本語(にほんご)厄介(やっかい)でして。
Perlをはじめプログラムは2バイト文字(もじ)(あつか)うことが基本(きほん)設計(せっけい)になっていることが(おお)いため、不用意(ふようい)に3バイト文字(もじ)日本語(にほんご)(あつか)うととんでもないことになることがあります。

これを解決(かいけつ)する方法(ほうほう)は、日本語(にほんご)が2バイトになっている(べつ)文字(もじ)コードに変換(へんかん)して処理(しょり)(おこな)ったのち、UTF8に変換(へんかん)(なお)すとか、UTF8でも変換(へんかん)(とく)()したモジュールをさがして、それを利用(りよう)するとか。

スタジオムーンリーフでは、「全角(ぜんかく)カタカナ」→「全角(ぜんかく)ひらがな」は変換(へんかん)のなかではシンプルなほうと(かんが)え、オリジナルでコードを()きました。

そもそも、プログラムは2バイト文字(もじ)基本(きほん)設計(せっけい)です。
そこにUTF8の3バイト文字(もじ)日本語(にほんご)()ちこんでも、プログラムは文字(もじ)区切(くぎ)りを識別(しきべつ)できません。でも、3の倍数(ばいすう)バイト(ちょう)のなにがしかの文字(もじ)(れつ)という(ふう)には認識(にんしき)します。したがって、たとえ1文字(もじ)であっても3バイト文字(もじ)を「文字(もじ)(れつ)」として(かんが)えれば意図(いと)した処理(しょり)()めるんです。

()せするのは()ずかしいのですが、ネットで検索(けんさく)をかけても納得(なっとく)できる(かん)じのサンプルコードを()つけることができなかったので公開(こうかい)します。

文字(もじ)コードUTF8で「全角(ぜんかく)カタカナ」→「全角(ぜんかく)ひらがな」変換(へんかん)をするPerlコードです。
(なが)いのでサブルーチン()しました。


sub Kana2Kana{

  my($string)=@_;

  $string=~ s/ア/あ/gm;
  $string=~ s/イ/い/gm;
  $string=~ s/ウ/う/gm;
  $string=~ s/エ/え/gm;
  $string=~ s/オ/お/gm;
  $string=~ s/ァ/ぁ/gm;
  $string=~ s/ィ/ぃ/gm;
  $string=~ s/ゥ/ぅ/gm;
  $string=~ s/ェ/ぇ/gm;
  $string=~ s/ォ/ぉ/gm;

  $string=~ s/カ/か/gm;
  $string=~ s/キ/き/gm;
  $string=~ s/ク/く/gm;
  $string=~ s/ケ/け/gm;
  $string=~ s/コ/こ/gm;
  $string=~ s/ガ/が/gm;
  $string=~ s/ギ/ぎ/gm;
  $string=~ s/グ/ぐ/gm;
  $string=~ s/ゲ/げ/gm;
  $string=~ s/ゴ/ご/gm;

  $string=~ s/サ/さ/gm;
  $string=~ s/シ/し/gm;
  $string=~ s/ス/す/gm;
  $string=~ s/セ/せ/gm;
  $string=~ s/ソ/そ/gm;
  $string=~ s/ザ/ざ/gm;
  $string=~ s/ジ/じ/gm;
  $string=~ s/ズ/ず/gm;
  $string=~ s/ゼ/ぜ/gm;
  $string=~ s/ゾ/ぞ/gm;

  $string=~ s/タ/た/gm;
  $string=~ s/チ/ち/gm;
  $string=~ s/ツ/つ/gm;
  $string=~ s/テ/て/gm;
  $string=~ s/ト/と/gm;
  $string=~ s/ダ/だ/gm;
  $string=~ s/ヂ/ぢ/gm;
  $string=~ s/ヅ/づ/gm;
  $string=~ s/デ/で/gm;
  $string=~ s/ド/ど/gm;
  $string=~ s/ッ/っ/gm;

  $string=~ s/ナ/な/gm;
  $string=~ s/ニ/に/gm;
  $string=~ s/ヌ/ぬ/gm;
  $string=~ s/ネ/ね/gm;
  $string=~ s/ノ/の/gm;

  $string=~ s/ハ/は/gm;
  $string=~ s/ヒ/ひ/gm;
  $string=~ s/フ/ふ/gm;
  $string=~ s/ヘ/へ/gm;
  $string=~ s/ホ/ほ/gm;
  $string=~ s/バ/ば/gm;
  $string=~ s/ビ/び/gm;
  $string=~ s/ブ/ぶ/gm;
  $string=~ s/ベ/べ/gm;
  $string=~ s/ボ/ぼ/gm;
  $string=~ s/パ/ぱ/gm;
  $string=~ s/ピ/ぴ/gm;
  $string=~ s/プ/ぷ/gm;
  $string=~ s/ペ/ぺ/gm;
  $string=~ s/ポ/ぽ/gm;

  $string=~ s/マ/ま/gm;
  $string=~ s/ミ/み/gm;
  $string=~ s/ム/む/gm;
  $string=~ s/メ/め/gm;
  $string=~ s/モ/も/gm;

  $string=~ s/ヤ/や/gm;
  $string=~ s/ユ/ゆ/gm;
  $string=~ s/ヨ/よ/gm;
  $string=~ s/ャ/ゃ/gm;
  $string=~ s/ュ/ゅ/gm;
  $string=~ s/ョ/ょ/gm;

  $string=~ s/ラ/ら/gm;
  $string=~ s/リ/り/gm;
  $string=~ s/ル/る/gm;
  $string=~ s/レ/れ/gm;
  $string=~ s/ロ/ろ/gm;

  $string=~ s/ワ/わ/gm;
  $string=~ s/ヲ/を/gm;
  $string=~ s/ン/ん/gm;

  return $string
}

コールする(とき)

my $hiragana='';
my $katakana='アイウエオ';

$hiragana = &kana2kana($katakana);
print $hiragana;

結果(けっか)〉あいうえお

文字(もじ)(れつ)マッチング置換(ちかん)「s」の正規(せいき)表現(ひょうげん)使(つか)うのはいいとしても、ごり()しの(ちから)(わざ)にしか()えません((わら)
mオプションは必要(ひつよう)ないかもしれませんが、とりあえず意図(いと)した(とお)りに(うご)くので放置(ほうち)してます。

もちろん、もっとスマートなコードはあると(おも)います。
さしあたり1文字(もじ)の3バイト文字(もじ)文字(もじ)(れつ)として(あつか)おうと(かんが)えるとこんな()(かた)にしか()()きませんでした。でも、()()でわかりやすいでしょ?

コードをシンプルにしようと文字(もじ)マッチング置換(ちかん)「tr」を使(つか)って、

$string=~ tr/アイウエオ/あいうえお/gm;

$string=~ tr/ア-ン/あ-ん/gm;

といったコーディングをすると、エラーというか予期(よき)せぬ変換(へんかん)結果(けっか)(かえ)ってくるのでやめた(ほう)がいいです。(なん)()もいいますが、UTF8の日本語(にほんご)文字(もじ)は3バイト文字(もじ)。プログラムは文字(もじ)を2バイト文字(もじ)として認識(にんしき)しようとします。

「アイウエオ」は3バイト文字(もじ)×5の15バイト。プロラグムでは、2バイト文字(もじ)文字(もじ)とあまりの1バイトの文字(もじ)とマッチングするか、もしくは1バイト文字(もじ)×15とマッチングしようとして、意図(いと)した(とお)りに(うご)きません。「ア-ン」も、「ア」自体(じたい)が3バイト文字(もじ)であるため同様(どうよう)です。


≫ NEXT_LOG よみがな自動(じどう)処理(しょり)への(みち)【7】ヤマにも()ケズ

≪ PREV_LOG よみがな自動(じどう)処理(しょり)への(みち)【5】PerlとMeCabはパイプでつながる

PAGE UP

Google+

スタジオムーンリーフ(2005年1月開設/Since 2005)
代表者:野口 卓洋(Takuhiro Noguchi)
Add:356-0006 埼玉県ふじみ野市霞ヶ丘3-1-22-504

Twitter:@StudioMoonLeaf
Facebook:facebook.com/noguchi.takuhiro


©2017 STUDIO MOON LEAF ALL RIGHTS RESERVED.