PHPでコードポイントに触れたお話

タグクラウドっぽいけどタグクラウドじゃないのでワードクラウドと呼ぶ謎の物体を作り上げる

記事を書くごとにカテゴライズやタギングをするのがめんどくさいので本文書いてポンと送信したら本文内のキーワード構成をパパっと抜き出してデータベースに納めてくれる仕様にしたのでこれを綴っておく。(現時点ではまだ要素として画面内に表示させていない。)

仕様について

UTF-8の環境を前提にまずは何をキーワードとするか。若輩ながらにも技術に関するブログをしているので横文字の頻度は結構高くなるということで英字、数字、記号(ASCII)、カタカナのみを対象とし、ひらがな、漢字、絵文字などは対象外とした。これより、コードポイントのピックアップ、コードポイントからわかる文字の属性、その連続性を解釈してフィルタリングする。

コードポイントについて

あ: 	16: e38182 	10: 14909826 	ascii: 12354

い: 	16: e38184 	10: 14909828 	ascii: 12356

う: 	16: e38186 	10: 14909830 	ascii: 12358

え: 	16: e38188 	10: 14909832 	ascii: 12360

お: 	16: e3818a 	10: 14909834 	ascii: 12362

上記は『あ』、『い』、『う』、『え』、『お』に割り当てられている数値である。左から順番に16進数、10進数、ASCIIコードである。ASCIIコードに関しては『mb_ord()』で出したものだが16進数、10進数との関連性は理解できていない。

fromto
bin2hex216
hex2bin162
decbin102
decoct108
dechex1016
bindec210
octdec810
hexdec1610

binはbinary(2進数)、decはdecimal(10進数)、hexはHexadecimal(16進数)である。これらを使って事前に調べておいたコードポイントでふるいにかける流れである。

関数に振り回される

htmlタグを除去するstrip_tags関数がある。この関数でポイっとやると下記のように欲しいキーワードが連結してしまい、文節が必要となる場合には不敵となるので別途実装しなければならない。

<p>キーワード</p>

<p>キーワード</p>

//result キーワードキーワード

これとは別に文中の単語を拾ってくれるstr_word_count関数がある。いかにもインテリジェンスが高そうな関数だがマルチバイト文字には対応しておらず残念な結果となる。下記に記しておく。

str_word_count('this is a pen.this is an apple.あいうえお。かきくけこ。', 1);



//result

array(8) {

  [0]=>

  string(4) "this"

  [1]=>

  string(2) "is"

  [2]=>

  string(1) "a"

  [3]=>

  string(3) "pen"

  [4]=>

  string(4) "this"

  [5]=>

  string(2) "is"

  [6]=>

  string(2) "an"

  [7]=>

  string(5) "apple"

}

この関数で許容できる記号は『-』(ハイフン)と『'』(シングルクォーテーション)のみとなる。

結論

解析するテキストを1行単位に切り分けてキーワードをピックアップし、変数にもたせておいたhtmlタグの配列との差分を利用しているのが現状である。タグ解析の部分を詰めれば拾いこぼしも少なくなると思うのでもう少しブラッシュアップしてみたい。このページのキーワードサンプルを記しておく。

Array

(

	[0] => ASCII

	[1] => ascii

	[2] => ord

	[3] => from

	[4] => bin

	[5] => hex

	[6] => decbin

	[7] => decoct

	[8] => dechex

	[9] => bindec

	[10] => octdec

	[11] => hexdec

	[12] => binary

	[13] => dec

	[14] => decimal

	[15] => Hexadecimal

	[16] => strip

	[17] => tags

	[18] => result

	[19] => str

	[20] => word

	[21] => count

	[22] => 'this

	[23] => pen

	[24] => this

	[25] => apple

	[26] => array

	[27] => string

	[28] => タグクラウド

	[29] => ワードクラウド

	[30] => カテゴライズ

	[31] => タギング

	[32] => ポン

	[33] => キーワード

	[34] => パパ

	[35] => データベース

	[36] => ブログ

	[37] => カタカナ

	[38] => コードポイント

	[39] => ピックアップ

	[40] => フィルタリング

	[41] => コード

	[42] => タグ

	[43] => ポイ

	[44] => キーワードキーワード

	[45] => インテリジェンス

	[46] => マルチバイト

	[47] => ハイフン

	[48] => シングルクォーテーション

	[49] => テキスト

	[50] => ブラッシュアップ

)