目次
サンプル・プログラムの実行例

サンプル・プログラム
NormalizeText.php | サンプル・プログラム本体 |
pahooNormalizeText.php | テキスト正規化クラス pahooNormalizeText。 テキスト正規化クラスの使い方は「PHPで日本語テキストを正規化」を参照ください。include_pathが通ったディレクトリに配置してください。 |
special_table.txt | 特殊文字テーブル |
解説:準備
12: class pahooNormalizeText {
13: var $items; //検索結果格納用
14: var $error; //エラーフラグ
15: var $errmsg; //エラーメッセージ
16: var $hits; //検索ヒット件数
17: var $webapi; //直前に呼び出したWebAPI URL
18:
19: //Yahoo! JAPAN Webサービス アプリケーションID
20: //https://developers.google.com/maps/documentation/javascript/get-api-key
21: var $YAHOO_APPLICATION_ID = '**********************************';
22:
23: //gooラボ アプリケーションID
24: //https://labs.goo.ne.jp/apiregister/
25: var $GOOLABS_APPLICATION_ID = '***********************************';
26:
27: //MeCabの実行プログラム;各自の環境に合わせて変更のこと
28: var $MECAB = 'C:\Program Files\MeCab\bin\mecab.exe';
29: //ユーザー辞書
30: var $FILE_UDIC_MECAB = 'C:\Program Files\MeCab\dic\user_wiki.dic';
31: //特殊変換ファイル名
32: var $FILE_SPECIAL = 'special_table.txt';
33:
34: //正規化モード
35: var $OPTION_SPC_TRIM1 = 't'; //行頭・行末の空白文字を除く
36: var $OPTION_SPC_TRIM2 = 'T'; //全角文字と隣り合う空白文字を除く
37: var $OPTION_NUM_HAN = 'n'; //数字を半角に統一
38: var $OPTION_NUM_ZEN = 'N'; //数字を全角に統一
39: var $OPTION_NUM_KAN = 'K'; //数字を漢字に統一
40: var $OPTION_ALP_HAN = 'a'; //英字を半角に統一
41: var $OPTION_ALP_ZEN = 'A'; //英字を全角に統一
42: var $OPTION_YAK_HAN = 'y'; //記号を半角に統一
43: var $OPTION_YAK_ZEN = 'Y'; //記号を全角に統一
44: var $OPTION_KATA_HAN = 'h'; //カタカナを半角に統一
45: var $OPTION_KATA_ZEN = 'H'; //カタカナを全角に統一
46: var $OPTION_SPEC_HAN = 's'; //特殊文字を半角に統一
47: var $OPTION_SPEC_ZEN = 'S'; //特殊文字を全角に統一
48:
49: //年号エスケープ記号(元号・西暦変換させない)
50: var $ESCYEAR = '\\';

「PHPで形態素解析を行う」で紹介した Yahoo! JAPAN Webサービスを利用するには Yahoo! JAPAN Webサービス アプリケーションIDが必要で、その入手方法は「Yahoo!JAPAN デベロッパーネットワーク - WebAPIの登録方法」を参照されたい。

形態素解析として MeCab を使う場合は、実行プログラムのパスを $MECAB に、ユーザー辞書を $FILE_UDIC_MECAB に、作業ファイルを $TMP_FNAME に代入しておく。MeCabユーザー辞書の作り方は「PHPで MeCabのユーザー辞書を作成する」を参照いただきたい。

それから、変換オプションとして変数 $OPTION_ シリーズを用意しておく。
解説:記号の全角⇔半角相互変換

仕組みは簡単で、半角記号と全角記号のペアを配列 $tbl に用意しておき、入力文字を1文字1文字比較して、変換するというもの。
この配列を追加・削除すれば、全角⇔半角変換を自在に設定できる。
解説:特殊文字の全角⇔半角相互変換

変換テーブルのファイル名は変数 $FILE_SPECIAL に入れておく。変換テーブルはテキストファイルで、1行が1文字の変換に対応しており、タブの左側に半角文字を、右側に対応する全角文字を記述する。

変換の仕組みは、前述のユーザー関数 convert_yakumono と同じである。
したがって、じつは、左側は半角文字でなくても構わないし、右側は全角文字でなくとも構わない。また、各々が2文字以上になっても大丈夫。
サンプルとして用意した変換テーブルには、"@笑顔@" を "😀" に変換するようなルールを記述してある。
解説:日本語テキストを半角に統一
半角に変換するのを担当するのがユーザー関数 toHankaku だ。

まず、中黒の小数点が混じっていたら、組み込み関数 preg_replace_callback を使って、半角数字(小数)に変換する。

次に、テキストを形態素に分解する。
前述の通り、MeCab または Yahoo!JAPAN 日本語形態素解析 Web サービス を利用する。
形態素に分解できたら、漢数字を半角数字に変換していく。

最後に、英字などの半角変換を組み込み関数 mb_convert_kana で、記号はユーザー関数 convert_yakumono で、行頭・行末空白処理を組み込み関数 preg_replace を使って処理する。
解説:日本語テキストを正規化

前述のように、まずユーザー関数 toHankaku によってテキスト全体を半角に統一する。
続いて、変換オプションの値に応じて全角や漢数字に変換していく。
参考サイト
- C++ でテキストの正規化:ぱふぅ家のホームページ
- PHPで日本語テキストを正規化(Windowsアプリ版):ぱふぅ家のホームページ
- PHPで漢数字混じりのテキストを半角数字に統一する:ぱふぅ家のホームページ
- PHPで形態素解析を行う:ぱふぅ家のホームページ
- PHPで漢数字を半角数字に変換する(整数版):ぱふぅ家のホームページ
そこで今回は、PHPを使い、全角英字や漢数字混じりの日本語テキストの全角・半角を統一し、算用数字を漢字に変換することもできるようにするプログラムをつくってみることにする。
プログラムは、「PHPで漢数字混じりのテキストを半角数字に統一する」の発展形である。
数字ではなく単語として使われている漢数字「一緒」「三大祭」を認識させるため、「PHPで MeCabのユーザー辞書を作成する」で紹介した MeCab、または「PHPで形態素解析を行う」で紹介した Yahoo!JAPAN 日本語形態素解析 Web サービスを利用し、テキストを形態素に分解してから正規化を行う。
(2021年7月25日)PHP8対応,リファラ・チェック改良