先日,旧字・旧仮名遣い変換サーバ misimaserver 2.5 をリリースした。misima SOAP Web Service クライアントからのアクセスにおいて,こちらを利用するようにした。辞書の読み込みをすっ飛ばす分,これまでよりもかなり高速に動作するはずである。
SOAP は実はそれ自体の処理(XML パースなど)が重くて misimaserver の改善効果を減らしてしまう。ソケット通信するクライアントで misimaserver を使うと,先に書いたようにパフォーマンスが大幅に改善される。もし Perl 5.8 以上と,ポート番号 34000 で外に接続できるインターネット環境とをお持ちなら,以下に掲げる Perl コード(misimasc)でアクセスするとよい。これは misimaserver の試験用に作ったものである。標準入力から対象テキストを読んで,標準出力に変換結果を書く仕様なので,配布している SOAP クライアントに置き換えて使うこともできると思う。
端末(コマンドライン)で
% misimasc -S yasuda.homeip.net -P 34000 -kyitq -s c < UTF-8テキスト
などと実行すると変換できるはずである。-S と -P 以外の引数 (-kyitq -s c) は misima 変換オプションである。
#!/usr/bin/perl # -*- mode: cperl; coding: utf-8 -*- # misimasc: misima client connecting by socket to misimaserver # 2007(c) isao yasuda, All Rights Reserved. # $Id: insomnia.txt 222 2014-03-27 11:23:12Z isao $ # DESCRIPTION # ----------- # - misimaserver への電文を組み立てる。 # - misima オプションを <misima_param> と </misima_param> に挿入する。 # - 変換対象テキストをオプションにすぐ続けて連結する。 # - 変換対象テキスト中の改行文字を :#;~ に変換して一行とする。 # - 電文をソケットに送出する。 # - 変換結果中の :#;~ を改行文字に復元する。 # - 変換結果を出力する。 # HISTORY # ------- # - 2007/12/04 Ver.2.5 初期作成 use utf8; # UTF-8 use IO::Socket; # Socket use Getopt::Std; # コマンドライン引数処理 use File::Basename; # ファイル名の取得 use Time::HiRes # 高精度タイマー qw(gettimeofday tv_interval); binmode STDOUT, ":utf8"; binmode STDERR, ":utf8"; # 開始 my $ts = [gettimeofday]; # start time my $host = 'yasuda.homeip.net'; # 接続先 my $port = 34000; # ポート番号 my ($senddata, $moption); # 送信データ # コマンドラインオプション my %opts = ( 'S' => '0', # server hostname 'P' => '0', # port number 's' => '0', # 旧字変換: しない 'y' => 0, # 用字・用語変換: しない 'k' => 0, # 旧かな変換: しない 't' => 0, # 単純変換: しない 'm' => '0', # マーク: しない 'i' => 0, # 連続文字変換: しない 'n' => 0, # 仮名反転: しない 'x' => '0', # TeX 変換: しない 'c' => '0', # OTF \UTFx 文字 'h' => 0, # 十六進形式変換: しない 'q' => 0, # quiet 'g' => 0, # Germany active: しない 'b' => 0, # BibTeX Compatible: しない 'v' => 0, # Verbose 'd' => 0 # デバッグ: なし ); if ($opts{'v'}) { printf STDERR loggingtime() . " * misimaclient start.\n"; } # コマンドラインオプションから misima パラメータを組立て Getopt::Std::getopts('s:ym:ktnx:c:hqidgbvS:P:', \%opts) || usage(); foreach my $op (keys %opts) { if (($opts{$op}) && !($op =~ /[vSP]/)) { $moption .= "-$op "; if ($opts{$op} ne '1') { $moption .= "$opts{$op} "; } } } $host = $opts{'S'} if ($opts{'S'}); $port = $opts{'P'} if ($opts{'P'}); printf STDERR loggingtime() . " * host: $host; port: $port; parameter:\n" if ($opts{'v'}); my $param = "<misima_param>$moption<\/misima_param>"; # 標準入力から対象テキストを読む while (<STDIN>) { utf8::decode($_); $senddata .= $_; } # 改行コードを特定文字列に変換しておく $senddata =~ s/\n/:#;~/gm; # Socket 通信処理 my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp' ) || die "Cannot connect: $@\n"; binmode $socket, ":utf8"; printf STDERR loggingtime() . " * $param\n" if ($opts{'v'}); print $socket $param . $senddata . "\n"; # 送信 $socket->flush(); $buf = <$socket>; # 受信 chomp($buf); printf STDERR loggingtime() . " * receive:\n$buf\n" if ($opts{'v'}); $socket->close(); $buf =~ s/:#;~/\n/gm; # 改行コードを復元 print $buf; # 変換結果出力 # 終了 printf STDERR loggingtime() . " * misimaclient ended. elapse: " . tv_interval($ts) . " sec.\n" if ($opts{'v'}); # ロギング時刻取得 sub loggingtime { my ($epocsec, $microsec) = gettimeofday(); my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($epocsec); return sprintf("%04d/%02d/%02d %02d:%02d:%02d.%06d", $year+1900, $mon+1, $mday, $hour, $min, $sec, $microsec); } # Usage sub usage { my($prog) = basename($0); die <<"EOM"; misima client programm connecting by a socket to misimaserver Ver.2.5 Usage: $prog [-k|-y|-i|-t|-n|-h|-g|-b|-q|-d|-s [opt]|-x [opt]| -c [opt]|-m [opt]|-S server|-P port] -k Convert to historical orthography according to dics and rules -y Convert according to youji-yougo dic -i Convert to iteration marks (No marking) -t Convert according to dic of replace (No marking) -n Invert kana (convert hira to kata, kata to hira; No marking) -s Convert to seiji; available alternative options: c UTF-8 characters h HTML numeric references (hex decimal) u TeX OTF package UTF-8 references (hex decimal) a TeX OTF package CID references m TeX Konjaku-Mojikyo package DAIKANWA ID references -x Convert to TeX commands; available options: k Kanbun kundoku format u Cyrillic, Latin, Greek, UTF8 characters to TeX sequences f force TeX convert of UTF8 characters x use extend tables r Cyrillic to T2A sequences t Thai word breaking and TIS-620 hex conversion T Thai word breaking and UTF-8 output h UTF-8 to hex conversion i iterations of multi characters to kunojiten a k, u and i -c \\UTFx option; available alternative options: K Convert JIS to \\UTFK C Convert JIS to \\UTFC (KANTAIJI) T Convert JIS to \\UTFT (HANTAIJI) -m Mark converted string; available alternative options: h HTML tags t TeX control sequence -g Convert Latin diacritical marks to TeX formats in Germany style -b Convert Latin diacritical marks to TeX formats in BibTeX style -h Convert all characters to hexadecimal strings 0xFFFF -q Quiet run -d Debug: Chasen analysys, dictionary entries display. -v Verbose * The programm reads data from stdin and writes to stdout. EOM } # end of file
実行の様子は以下のとおり。-d (デバッグモード) で起動して,形態素解析状況を表示させている。
% cat t.txt 森鴎外はこう言い,内田百間を団扇であおいだ。 僕は黙っていますよ。 % misimasc -S isolde -P 34000 -kyitnd -s c < t.txt [入力] 森鴎外はこう言い,内田百間を団扇であおいだ。 僕は黙っていますよ。 [形態素解析] 森 森(基本形)-7(名詞) [旧]:(無) [用]:(無) 鴎外 鴎外(基本形)-8(名詞) [旧]:(無) [用]:(無) は は(基本形)-65(助詞) [旧]:(無) [用]:(無) こう こう(基本形)-56(副詞) [旧]:かう 3 [用]:(無) 言い 言う(基本形)-47-21-4(動詞-五段・ワ行促音便-連用形) [旧]:(無) [用]:(無) , ,(基本形)-79(記号) [旧]:(無) [用]:(無) 内田 内田(基本形)-7(名詞) [旧]:(無) [用]:(無) 百間 百間(基本形)-8(名詞) [旧]:(無) [用]:(無) を を(基本形)-61(助詞) [旧]:(無) [用]:(無) 団扇 団扇(基本形)-2(名詞) [旧]:(無) [用]:(無) で で(基本形)-61(助詞) [旧]:(無) [用]:(無) あおい あおぐ(基本形)-47-11-5(動詞-五段・ガ行-連用タ接続) [旧]:あふぐ 1 [用]:(無) [辞書登録語旧仮名変換活用解析] - 変換前: |あおい| - 出現形: |あおい| 型番号: 11 - 基本形: |あおぐ| - 登録語: |あふぐ| - 語幹部: |あふ| - 出語尾: |い| - 登語尾: |ぐ| - 語幹節: 2 - 語尾長: 1 - 変換後: |あふい| だ だ(基本形)-74-54-1(助動詞-特殊・タ-基本形) [旧]:(無) [用]:(無) 。 。(基本形)-78(記号) [旧]:(無) [用]:(無) 僕 僕(基本形)-14(名詞) [旧]:(無) [用]:(無) は は(基本形)-65(助詞) [旧]:(無) [用]:(無) 黙っ 黙る(基本形)-47-17-6(動詞-五段・ラ行-連用タ接続) [旧]:(無) [用]:(無) て て(基本形)-64(助詞) [旧]:(無) [用]:(無) い いる(基本形)-48-6-4(動詞-一段-連用形) [旧]:ゐる 1 [用]:(無) [辞書登録語旧仮名変換活用解析] - 変換前: |い| - 出現形: |い| 型番号: 6 - 基本形: |いる| - 登録語: |ゐる| - 語幹部: |ゐ| - 出語尾: |い| - 登語尾: |る| - 語幹節: 1 - 語尾長: 1 - 変換後: |ゐ| ます ます(基本形)-74-58-1(助動詞-特殊・マス-基本形) [旧]:(無) [用]:(無) よ よ(基本形)-69(助詞) [旧]:(無) [用]:(無) 。 。(基本形)-78(記号) [旧]:(無) [用]:(無) [出力] 森鷗外ハカウ言ヒ,內田百閒ヲ團扇デアフイダ。 僕ハ默ツテヰマスヨ。 %
なぜポート番号が 34000 か。ミシマ(3.4 万)だからですよ。
付記:
旧字・旧仮名遣い変換サービスはその後限定公開としました。上記コードでのアクセスは現在は不可になっています。