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