nicoWnnG のユーザー辞書を作成してみた

Android の IME として nicoWnnG を使っている
昔からある OpenWnn/nicoWnn をベースにしたアプリで
Google日本語入力ATOK 等の有名アプリと比べると変換機能が劣るものの
英字・数字・記号入力時に
PC 同等の数字・記号両方揃った QWERTY 配列が使えるという


他のアプリが持ってない機能
があるため、これまで使ってきた。

nicoWnnG のキーボード

PC のキーボードとほぼ同じ配置。キーが一つ一つが小さく見えるが、思ったより普通に入力できる。
Tab キーや Ctrl キーがあるのも美点。 Ctrl+c でコピーとかできるしね。


これと、例えば Google 日本語入力を比較すると、こんな風に
英字
数字
数字や記号を入力する場合、わざわざキーボードを切り換えなければならない。
日本語、英字、数字で 3 種類のキーボードを切り替えないといけないので面倒だ。


しかし、最近やはり変換精度の悪さが気になりだしてきて…
#「きい」で「紀伊」が変換できないなんて…


もう少しどうにかならんものか…


そうだ!(・。・)b


足りない単語はユーザー辞書に登録すればいいんじゃね?


幸い、 nicoWnnG にはユーザー辞書のインポート機能がある。
ヘルプを見ると…ふんふん、タブ区切りのテキスト形式か。
今 PC で使ってる SKK の辞書を加工したら、簡単にできそうじゃないか。
ただし、登録できる単語数が 10000 までなので、ある程度絞る必要がある。

SKK-JISYO.L 辞書をテキストエディタで開いてと。175832 行あるな。
ざくっと一行一単語で考えると、 1/180 に削る必要がある。


え、∑(=゚ω゚=)マジ!?


まあ…なんとかなるだろw


最初に色々書いてあるが、 ";" で始まる行はコメントで変換関係ないから削除。

次に出てきたのが送り仮名付きの入力を変換するのに使うルール郡。
わるがしこs /悪賢/
「わるがしこさ」「わるがしこそ」等を「悪賢さ」「悪賢そ」等に変換するためのルールであるが、辞書への登録は単語単位なので必要なし。
送り仮名なしの単語郡は ";; okuri-ari entries." 以下に書いてあるので、そこまでの行をざくっと削除

そうすると、半角記号→全角記号の変換ルールが出てきた。
! /!/感嘆符/
必要ないので削除。


その次の数字入りの入力に関する変換ルール
#、#てん /#1、#1点/
これも単語単位でないので削除。

次。
>あい /愛/
接尾辞変換…だから単語単位だっつってんだろうが(゚Д゚)ゴルァ!
削除。

AIDS /エイズ/後天性免疫不全症候群/
アルファベット→カタカナ変換は PC ではよく使うがスマホでは使わね。削除。

あ /亜/吾;私/彼;=吾/阿;阿呆/婀;婀娜っぽい/痾;宿痾/唖;聾唖/亞;「亜」の旧字(人名用漢字)/椏;また/娃;美女/哇/襾/安;?/明;?/嗚;?/
…やっと、普通の変換ルールが出てきた。
しかし、漢字一文字の変換って必要だろうか。いや、必要でない。
久し振りに反語を使ってみたので、削除。

あ> /亜;亜熱帯,亜低木,亜硝酸/
接頭辞変換も以下同文。


…これで、だいぶ減ったはず。
しかし、作業はこれから。
まず、 "/" 区切りになっているのをタブ区切りにしないといけない。
その際、
あいかわ /相川/愛川/鮎川/合川/
となっている箇所は
あいかわ <tab> 相川
あいかわ <tab> 愛川
あいかわ <tab> 鮎川
あいかわ <tab> 合川
のよう一行ずつ読みと変換結果、という形に加工しないといけない。

さすがに、一つ一つ手作業でやってると日が暮れるので、 perl スクリプトを書いて変換。
最終的にできた単語数…
167258

まだ多いわ!!
て言うか減ってねぇ!! (#`皿´) ムキーーーー!




…結果、単語の少ない M 辞書 を使うことで単語数を 5966 まで抑えることができました




どうせまた使うだろうから、使ったスクリプトを残しておく。ついでに "/" の処理だけではなく、その前に書いた「余計な行の削除」も含めておいた。
Dropbox にも置いてあるけど…。ま、自慢念のためってことでw

ちなみに、 SKK の辞書は EUC-JP, nicoWnng の辞書は Shift-JIS である。
また、使った Cygwin の $LANG は utf-8 になっている。


#!/usr/bin/perl
## SKK-JISYO を元に nicoWnng のユーザー辞書を作成
use utf8;
use Encode;

my $outputCode = 'cp932';  # 出力文字コード

## 引数の確認
$fileName = shift(@ARGV);
if (!defined($fileName))
{
 die("Input file name.");
}

open(FILE, "<", $fileName) or die("file open error.");

## ヘッダ (先頭が '!' で始まる行はコメント)
print encode($outputCode, "! convert from $fileName by $0\r\n"); # 改行 CRLF

## 以下、辞書から登録
$okuri_nashi = 0;
while ()
{
 my $line = decode('EUC-JP', $_);

 ## ややこしいので送り仮名なしエントリのみを対象
 if ($line =~ /^;; okuri-nasi entries\./)
 {
  $okuri_nashi = 1;
 }
 if ($okuri_nashi != 1)
 {
  next;
 }

 if ($line =~ /^([ぁ-ん]{2,}) \/(.*)\//) # UTF-8 の文字コードは ぁあぃい… の順
 {          # 一文字の読みは不要
  my $yomi = $1;
  my @words = split('/', $2);
  foreach my $wd (@words)
  {
   $wd =~ s/;.*$//g;    # annotate は不要
   $wd =~ s/[a-zA-Z0-9]+//g; # 英語の読みも不要
   if (length($wd) > 1)   # 一文字の登録も不要
   {
    my $outputLine = encode($outputCode, $yomi."\t".$wd."\r\n");
    print $outputLine;
   }
  }
 }
}
close(FILE);

コメント

人気の投稿