「濁点/半濁点あと打ち」に対応した かな頻度表

日本語の文章における かな 出現頻度について、 日本語入力用キー配列に関するリンク集@Wiki - テーマ「キー配列制作者に捧げる資料」のリンク集 にリンクがまとめられています。


しかしどの頻度表も「は」「ば」「ぱ」をちがう文字として扱っています。 これは頻度表としては正しいし、ローマ字入力みたいに濁点をあとから付け足さない日本語入力方法にはそのまま参考にできるでしょう。


ただし JISかな入力・新JISかな などの 濁点/半濁点あと打ち の入力方法の場合には、このままではキー押下頻度の参考にはできません。

たとえば「バーバパパ」 (ba-bapapa) という本文があったとします。従来の頻度表だと、

**かな 出現回数**
ば 2 
ー 1 
ぱ 2

となりますが、「濁点/半濁点あと打ち対応頻度表」だと 「ぱ」=「は」+「゜」 というふうに数えるから

**かな 出現回数**
は 4 
ー 1 
゛ 2 
゜ 2

と、なりますね。


この方式で、濁点/半濁点あと打ち対応頻度表を作成してみました。


かな頻度表サンプル


複数人の文章サンプルを統計したものから、3つのサイトを取り上げています。

かな頻度表




この表はHTMLなのでブラウザで表示できますが、Excel2003で出力したものなので、Excelでもそのまま読み込めます。


使用したPerlスクリプト http://japaneseinput.web.fc2.com/freqkana.pl.txt 。従来の頻度表を文字コード EUC-JP にして、スクリプトでフィルタして、Excel でソートしました。


結論

わかったことは、濁点/半濁点あと打ちの場合 濁点こそが最多打鍵キーだったということです。あと、濁点なしの文字の頻度が下がった結果、かな別の頻度も標準とは異なっています。


ちなみに私は現在、濁点/半濁点あと打ちの配列を使っています。最初 濁点・半濁点をかなのあとに入力する方式は「発音」と「打鍵数」が清音・濁音で一致しないという点で、ローマ字とかと比べてよくないのではないか、と思っていました。実際やってみると、日本語をペンで書くときと同じなのでいい感じに入力できています。


追記 : 2013年1月

「1795万字の文章サンプル」 http://www50.atwiki.jp/keylay/pages/16.html が公開されました。

文章サンプルは口語体を多く採用しました。


青空文庫 11,032,631 バイト 長文小説、過去形が多い。目視にて現代的文体を多く選択したが、古さは否めない。
某知恵袋 21,211,842 バイト 短文の集合。多様なテーマの現代の言葉・言い回しを収集できたのではないか。
ビジネス文書 2,278,528 バイト 敬体。特有の言い回しが頻出。
Wikisource 2,092,621 バイト 聖書、法令、数学書、演説、翻訳など。
Wikipedia 964,471 バイト である文
ニュース記事 1,089,780 バイト


漢字かな変換はMeCabを利用しました。

それをグラフに追加しました。「2ちゃんねるで使用される仮名」はグラフから削除しました。



LibreOffice3.6 Calcで作りました。元ファイルは http://japaneseinput.web.fc2.com/frequency-kana-voiced2.ods


濁点/半濁点あと打ち版 かな頻度を求めるのに使用したスクリプトは以下。
freqkana.pl

#!/usr/bin/perl -w
use strict;

my %dakuten = (
    'が'=>'か',
    'ぎ'=>'き',
    'ぐ'=>'く',
    'げ'=>'け',
    'ご'=>'こ',
    'ざ'=>'さ',
    'じ'=>'し',
    'ず'=>'す',
    'ぜ'=>'せ',
    'ぞ'=>'そ',
    'だ'=>'た',
    'ぢ'=>'ち',
    'づ'=>'つ',
    'で'=>'て',
    'ど'=>'と',
    'ば'=>'は',
    'び'=>'ひ',
    'ぶ'=>'ふ',
    'べ'=>'へ',
    'ぼ'=>'ほ',
    'ヴ'=>'う',
);


my %handakuten = (
    'ぱ'=>'は',
    'ぴ'=>'ひ',
    'ぷ'=>'ふ',
    'ぺ'=>'へ',
    'ぽ'=>'ほ',
);

my %total = ();

sub plus{
    my ($letter, $num) = @_;

    if(defined $total{"$letter"}){
        $total{"$letter"} += $num;
    }else{
        $total{"$letter"} = $num;
    }
}

while(<>){
    s,[ \t\r\n]*$,,;
    if(m/^([^ \t]+)[ \t]+([^ \t]+)/){
        my $kana = $1;
        my $hindo = $2;

        if(defined $dakuten{"$kana"}){
            $kana = $dakuten{"$kana"};
            plus("゛", $hindo);
        }elsif(defined $handakuten{"$kana"}){
            $kana = $handakuten{"$kana"};
            plus("゜", $hindo);
        }

        plus("$kana", $hindo);
    }

}

sub hashValueDescending {
    $total{$b} <=> $total{$a}
}

foreach my $k (sort hashValueDescending keys(%total)){
    print $k ."\t". int($total{"$k"} / 1000.0)."\n";
}