PHPで日本語テキストを正規化(Windowsアプリ版)

(1/1)
PHP で日本語テキストを正規化」では、全角英字や漢数字混じりの日本語テキストの全角・半角を統一し、算用数字を漢字に変換することもできるプログラムをつくった。
オフィス文書を作るときに、こういったツールがあると便利だろうと考え、今回はサーバやネットが無い環境でも動作するスタンドアロンな Windows アプリとして移植する。

(2020 年 4 月 21 日)制御文字削除,強制的に全角化する文字を追加した。
(2019 年 3 月 30 日)コピー・ボタンと空白削除機能を追加し、不具合修正を行った。

サンプル・プログラム

PHPでWindowsアプリ開発:PHPで日本語テキストを正規化

解説:preg系関数を ereg系関数へ置き換え

PHP でテキストの読みやすさを調べる(Windows アプリ版)」でも触れたが、bamcompile で EXE プログラムをつくる場合、preg 系関数が正常に働かない。まず、これらの関数を ereg 系関数で置き換える。

解説:MeCabの扱い

数字ではなく単語として使われている漢数字「一緒」「三大祭」を認識させるため、「PHP で MeCab のユーザー辞書を作成する」で紹介した MeCabを利用している。
ここでは、MeCab をインストールすることなく利用できるよう工夫している。

0013:     var $MECAB = 'mecab\mecab.exe';              //MeCabの実行プログラム
0014:     var $MECABRC = 'mecab\mecabrc';                //mecabrc
0015:     var $FILE_UDIC_MECAB = 'mecab\dic\user_wiki.dic';  //ユーザー辞書
0016:     var $FILE_SPECIAL = 'ini/special_table.txt';    //特殊文字変換テーブル

まず、最低限必要な実行ファイル "mecab.exe"、設定ファイル "mecabrc"、および Wikipedia見出しから作成したユーザー辞書 "user_wiki.dic" の相対パスを変数に入れておく。

0041: /**
0042:  * 実行プログラムのフルパスを取得
0043:  * @param なし
0044:  * @return string フルパス
0045: */
0046: function getExePath() {
0047:     $path = wb_get_system_info('exepath');
0048:     $path = trim($path);
0049:     if ($path == '\\') $path = '';
0050:     else                $path = ereg_replace("^\"+", '', $path);
0051: 
0052:     return $path;
0053: }

次に、本プログラム "normalizetextwin.exe" がある絶対パスを取得するユーザー関数 getExePath を用意した。
PHP の定数や環境変数ではなく、winbinder が用意する関数 wb_get_system_info によって確実に絶対パスを取得できるようにした。

0119:     if ($format == 1) {
0120:         if (INTERNAL_ENCODING != 'SJIS') {
0121:             $data = mb_convert_encoding($data, 'SJIS', INTERNAL_ENCODING);
0122:         }
0123:     }

実行プログラムのパスに、冒頭で定義した各ファイルの相対パスを結合し、各々のファイルの絶対パスができる。あとは、これをコマンドラインに流し込めば良い。

解説:特殊文字の全角⇔半角相互変換

0016: define('SPECIALFILE', 'ini/special_table.txt');       //特殊文字変換テーブル
0017: 

PHP で日本語テキストを正規化」と同様、あらかじめ用意した変換テーブル(テキストファイル)にしたがい、特殊文字の全角⇔半角相互変換を行うユーザー関数 convert_special を用意している。

変換テーブルのファイル名は、定数 "SPECIALFILE" によって指定する。
変換テーブルを変更してプログラムを再起動すれば、変換条件の変更が反映される。

コンパイル

コマンドラインから "bamcompile normalizetextwin.bcp" を実行する。コンパイルが完了すると、"nengowin.exe" が生成される。"normalizetextwin.exe" は、DLL 不要で、単独で動作する EXE プログラムである。

なお、ダウンロードした圧縮ファイルを解凍すると、フォルダ "mecab\" 以下に MeCab の必要ファイルが解凍される。そのままの位置で使うこと。
ユーザー辞書 "user_wiki.dic" は Wikipedia の見出し語をそのまま引用した大きなものだが、「PHP で MeCab のユーザー辞書を作成する」で紹介したプログラムによって自由に変更することができる。

その他、クリップボードへのコピー機能は、「PHP でクリップボードにテキスト貼り付け(Windows アプリ版)」で紹介したプログラムを流用している。

質疑応答

【質問】

お世話になっております。

こちらから変換用のアプリをダウンロードし、使わせていただこうとしたのですが、変換ボタンを押すとアプリが終了してしまいます。使用環境は Windows10 で間違いありません。
自前のデータだからだと思いましたが再ダウンロード、インストール、直接実行して、デフォルトの文章のままでも同じ現象です。

とても求めていた機能そのもののアプリなのでどうか使わせていただきたいです。

こちらの環境や管理人様のアプリ作成後の Windows アップデートでの問題もあるかもしれません。

どうかよろしくお願いします。


【回答】

まず、ダウンロードしたファイルを解凍した状態で、下記のようなフォルダ構造になっているかご確認ください。

\normalizetextwin
│  normalizetextwin.bcp
│  normalizetextwin.exe
│  
├─mecab
│  │  libmecab.dll
│  │  mecab.exe
│  │  mecabrc
│  │  
│  └─dic
│      │  user_wiki.dic
│      │  
│      └─ipadic
│              char.bin
│              char.def
│              dicrc
│              left-id.def
│              matrix.bin
│              matrix.def
│              pos-id.def
│              rewrite.def
│              right-id.def
│              sys.dic
│              unk.def
│              unk.dic
│              
└─normalizetextwin
    │  application.ico
    │  normalizetextwin.phpw
    │  normalizetextwin.rc
    │  pahooNormalizeTextWin.php
    │  php_mbstring.dll
    │  php_winbinder.dll
    │  
    ├─icon
    │      normalizetextwin.ico
    │      
    ├─include
    │  │  wb_generic.inc.php
    │  │  wb_resources.inc.php
    │  │  wb_windows.inc.php
    │  │  winbinder.php
    │  │  
    │  ├─db
    │  │      ChangeLog_DB.txt
    │  │      db_common.inc.php
    │  │      db_mysql.inc.php
    │  │      db_sqlite.inc.php
    │  │      
    │  └─fi
    │          freeimage.inc.php
    │          
    └─ini
            special_table.txt

正常に解凍されており、それでも動かないようでしたら、Windows イベントビューワで、Windows ログのアプリケーションを確認してください。DLL の呼び出しエラーなどが出ていませんか。もしエラーが出ているようであれば、エラーメッセージをお知らせください。


また、C++で Windows でネイティブに動くプログラムが「C++ でテキストの正規化」からダウンロードできます。こちらもお試しください。

参考サイト

(この項おわり)
header