日猫/猫日翻訳を試す

はじめに

先日北海道で行われたNLP2014(Neko Language Processing 2014)で最優秀賞だった「ビットペア法を用いた日本語-猫語翻訳アルゴリズム」を試してみました。

ネコ氏の鳴き声を分析したところ特徴的なパターンが見られ、日本語とネコ語間の変換ルールを明らかにした事で話題になりました。
アルゴリズムは簡単だったので、これを用いて日ニャー/ニャー日翻訳機を作ってみました。

アルゴリズム

論文によると、日本語をビット列にして隣り合うビットのペアを4パターン(ニャ、ニャッ、ニャン、ニャー)の鳴き方にする事で、意思疎通できたそうです。

コード

日本語からネコ語へ変換
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use utf8;

binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

sub nichinya {
    my ($text) = @_;

    my $arr = unpack("B*", encode('UTF-8', $text));
    my @bin = split(//, $arr);
    for(my $i=0; $i<@bin; $i+=2){
        if   ($bin[$i] eq '1' && $bin[$i+1] eq '1'){ print "ニャッ"; }
        elsif($bin[$i] eq '1' && $bin[$i+1] eq '0'){ print "ニャン"; }
        elsif($bin[$i] eq '0' && $bin[$i+1] eq '1'){ print "ニャー"; }
        else { print "ニャ"; }
    }
    print "\n";
}

while(<>){
    chomp;
    print "翻訳結果\n";
    nichinya($_);
}
ネコ語から日本語へ変換
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use utf8;

binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

sub nyanichi {
    my ($text) = @_;
    
    $text =~ s/ニャッ/11/g;
    $text =~ s/ニャン/10/g;
    $text =~ s/ニャー/01/g;
    $text =~ s/ニャ/00/g;

    my $arr = pack("B*", $text);
    print decode('UTF-8', $arr), "\n";
}

while(<>){
    chomp;
    print "翻訳結果:\n";
    nyanichi($_);
}

結果

# 日本語->猫語
$ perl nichinya.pl
通じてるかにゃ?
翻訳結果:
ニャッニャンニャンニャーニャンニャニャニャニャンニャーニャンニャンニャッニャンニャニャッニャンニャニャニャーニャンニャーニャンニャニャッニャンニャニャッニャンニャニャニャーニャンニャンニャーニャンニャッニャンニャニャッニャンニャニャニャンニャンニャニャンニャッニャッニャンニャニャッニャンニャニャニャーニャンニャニャンニャッニャッニャンニャニャッニャンニャニャニャーニャンニャンニャンニャッニャッニャンニャニャッニャンニャニャニャンニャンニャニャニャッニャッニャンニャッニャッニャンニャッニャッニャニャンニャーニャッニャッ

踏んでください
翻訳結果:
ニャッニャンニャンニャニャンニャッニャンニャニャンニャニャッニャッニャッニャンニャニャッニャンニャニャニャンニャンニャーニャニャッニャッニャンニャニャッニャンニャニャニャーニャンニャンニャーニャッニャッニャンニャニャッニャンニャニャニャーニャンニャニャッニャッニャッニャンニャニャッニャンニャニャニャーニャンニャンニャニャニャッニャンニャニャッニャンニャニャニャーニャンニャーニャーニャーニャッニャンニャニャッニャンニャニャニャーニャンニャニャーニャ

# 猫語->日本語
$ perl nyanichi.pl
ニャッニャンニャンニャーニャンニャニャニャニャンニャーニャンニャンニャッニャンニャニャッニャンニャニャニャーニャンニャーニャンニャニャッニャンニャニャッニャンニャニャニャーニャンニャンニャーニャンニャッニャンニャニャッニャンニャニャニャンニャンニャニャンニャッニャッニャンニャニャッニャンニャニャニャーニャンニャニャンニャッニャッニャンニャニャッニャンニャニャニャーニャンニャンニャンニャッニャッニャンニャニャッニャンニャニャニャンニャンニャニャニャッニャッニャンニャッニャッニャンニャッニャッニャニャンニャーニャッニャッ
翻訳結果:
通じてるかにゃ?

ニャッニャンニャンニャニャンニャンニャーニャッニャンニャンニャーニャンニャッニャンニャニャッニャンニャニャニャンニャンニャニャンニャッニャッニャンニャニャッニャンニャニャニャーニャンニャンニャンニャッニャッニャンニャニャッニャンニャニャニャンニャンニャニャニャッニャッニャンニャッニャッニャンニャッニャッニャニャンニャニャニャー
翻訳結果:
触るにゃ!
           . ィ 
._ .......、._    _ /:/l! 
 :~""''.>゙' "~ ,、、''‐'、|         _ 
゙、'、::::::ノ:::::::_,.-=.  _〜:、         /_.}'':, 
 ``、/:::::::::__....,._ `゙'Y' _.ェ-、....._ /_゙''i゙ノ、ノ 
 ,.--l‐''"~..-_'.x-='"゙ー 、`'-、 ,:'  ノ゙ノブ 
"   .!-'",/  `'-‐'') /\ `/ でノ-〈 
 .-''~ >'゙::    ‐'"゙./  ヽ.,'   ~ / 
   //:::::       ',    /    ,:'゙ 

ニャッニャンニャニャッニャンニャニャニャンニャンニャンニャンニャニャッニャンニャニャッニャンニャニャニャッニャンニャッニャッニャニャッニャンニャニャッニャンニャニャニャッニャンニャーニャーニャッニャッニャンニャニャッニャンニャニャニャッニャンニャンニャンニャンニャッニャンニャニャッニャンニャニャニャッニャンニャンニャンニャッニャッニャンニャニャッニャンニャニャニャッニャンニャーニャーニャーニャッニャンニャニャッニャンニャニャニャッニャンニャッニャッニャニャッニャンニャニャッニャンニャニャニャッニャンニャンニャンニャッニャッニャンニャニャッニャンニャニャニャーニャンニャンニャーニャッニャッニャンニャニャッニャンニャニャニャーニャンニャーニャンニャーニャッニャンニャニャッニャンニャニャニャーニャンニャンニャンニャッニャッニャンニャニャッニャンニャニャニャンニャンニャニャニャッニャニャッニャンニャンニャニャンニャンニャー