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進数との関連性は理解できていない。
from | to | |
---|---|---|
bin2hex | 2 | 16 |
hex2bin | 16 | 2 |
decbin | 10 | 2 |
decoct | 10 | 8 |
dechex | 10 | 16 |
bindec | 2 | 10 |
octdec | 8 | 10 |
hexdec | 16 | 10 |
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] => ブラッシュアップ

)