読者です 読者をやめる 読者になる 読者になる

日本語文章をローマ字に変換する

Perl

どんなことに使えるかは謎だけど変換する。
単語間が繋がると読みにくいので、スペースを空けることが重要。スペースを空ける方法は振り仮名に応用できて、たとえば幼稚園児でも2ちゃんねるが読めるように文章に振り仮名を振るCGI PROXYとかが簡単に作れる。

use strict;
use utf8;
use Encode;
use MeCab;
use Lingua::JA::Kana;

binmode(STDOUT, ':encoding(ms932)'); # MS-CMD

TEST: {
    print ja2romaji(<<__EOT
ドウモ〜〜〜ッ!!ハジメマシテ〜〜〜ッ!!!!
私は27歳のOLしてるのぉ〜〜〜っ♪(#⌒〇⌒#)キャハ
うーんとー、私メル友がすっごくすっごく欲しくってー、
探してたら(◎_◎)なんとっ!
1さんの素敵なスレッド♪を発見!!!!(^o^)//""" パチパチパチ
てなわけで、ついつい書いちゃったのらー(o^v^o) エヘヘ
メル友に、なってくれるよねっ。(*^-^*)
え?くれないのぉ〜?(;¬_¬)そんなのいやいや〜〜、
なってくれなかったら、( `_)乂(_´ ) 勝負!
☆○(゜ο゜)o ぱ〜んち、☆(゜o(○=(゜ο゜)o バコ〜ン!!
(>_<) いてっ!
(☆o☆)きゃ〜〜(@_@;)やられた〜〜(o_ _)o ドテッ
(+_+) 気絶中。。。
なあんて(#⌒▽⌒#)こんな私っ!σ(^_^)だけど、
お友達になってm(_ _)mくださいませませ♪('-'*)フフ
__EOT
    ), "\n";
}

sub ja2romaji
{
    my $ja = shift;
    my $mecab = new MeCab::Tagger("-l1");
    my $tsu = undef;
    my @romaji_line = ();
    my @romaji = ();
    
    foreach my $line (split(/[\r\n]+/, $ja)) {
        @romaji_line = ();
        for (my $n = $mecab->parseToNode($line); $n; $n = $n->{next}) {
            my @feature = split(',', $n->{feature});
            my ($kana, $pos, $surface) = ($feature[7], $feature[0], $n->{surface});

            Encode::_utf8_on($kana);
            Encode::_utf8_on($pos);
            Encode::_utf8_on($surface);

            if ($kana =~ /ッ$/) { # 「ッ」で切れると変換できないので次で繋げる
                $tsu = { kana => $kana, surface => $surface };
                next;  
            }
            if ($kana ne '*' 
                && $kana ne '' 
                && $pos ne '記号')
            {
                my $word = kana2romaji(($tsu ? $tsu->{kana}:'') . $kana);
                if ($word) {
                    push(@romaji_line, $word);
                }
            } else {
                $surface =~ tr/。、「」/.,""/;
                my $word = kana2romaji(($tsu ? $tsu->{kana}:'') . $surface);
                if ($word) {
                    push(@romaji_line, pop(@romaji_line) . $word);
                }
            }
            $tsu = undef;
        }
        push(@romaji, join(' ', @romaji_line));
    }
    return join("\n", @romaji);
}
> perl romaji.pl
doumo〜〜〜ッ!!hajimemashite〜〜〜ッ!!!!
watashi ha ni nana sai no ooeru shi teru noxo〜〜〜ッ♪(#⌒〇⌒#)kyaha
uun toー, watashimeru tomo ga suggoku suggoku hoshikutteー,
sagashi te tara(◎_◎) nantoッ!
ichi san no suteki nasureddo♪ wo hakken!!!!(^o^)//""" pachi pachi pachi
te na wake de, tsuitsui kai chatta noraー(o^v^o)ehehe
meru tomo ni, natte kureru yoneッ.(*^-^*)
e? kure nai noxo〜?(;¬_¬) sonna no iyaiya〜〜,
natte kure nakattara,(`_)乂(_´) shoubu!
☆○(゜ο゜)opa〜 n chi,☆(゜o(○=(゜ο゜)obako〜 n!!
(>_<) i teッ!
(☆o☆) kya〜〜(@;) yara re ta〜〜(o__)odoteッ
(+_+) kizetsu chuu...
na an te(#⌒▽⌒#) konna watashiッ!σ(^_^) da kedo,
o tomodachi ni nattem(__)m kudasai mase mase♪('-'*)fufu

このコピペを分解できるMeCabすごすぎ。
でも $pos ne '記号' は不安すぎるので、コード的なもので判定したい。定数定義すればいいけど。
あと「っ!」ってローマ字でどう書くのか知らない。