タグの自動生成をしようという事で分かち書きが必要になりましたが、Yahoo!のAPIは制約があるし、TinySegmenterというライブラリは長いことメンテナンスされてないなと思案して、見つけたのが正規表現を使うというもの。
追記(2021/2/11)
Yahoo!のAPIを使うバージョンも公開しました。こちらもご参照ください
https://qiita.com/emesh/items/b1e1916f85b732c7a664
<?php
$str="吾輩は猫である。名前はまだない。どこで生れたか頓と見当がつかぬ。";
//正規表現でメモを分割する
preg_match_all('/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/u', $str, $matches);
$match_result = $matches[0];
print_r($match_result); // マッチ結果が全出力
?>
で結果は
Array ( [0] => 吾輩 [1] => は [2] => 猫 [3] => である [4] => 名前 [5] => はまだない [6] => どこで [7] => 生 [8] => れたか [9] => 頓 [10] => と [11] => 見当 [12] => がつかぬ )
おお、確かにそれっぽい。ただし「ドラえもん」「海の日」のような漢字カナ交じりの単語には対応していないのでちょっと改良してみます。
<?php
$str="今日は海の日。夏だ一番ドラえもん祭り";
//正規表現でメモを分割する
preg_match_all('/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+/u', $str, $matches);
$match_result = $matches[0];
//2つの配列の結合
$tmp_res1 = array();
if(count($match_result) > 1){
for ($i = 0 ; $i < (count($match_result) - 1); $i++){
$tmp_res1[] = $match_result[$i] . $match_result[$i + 1];
}
}
//3つの配列の結合
$tmp_res2 = array();
if(count($match_result) > 2){
for ($i = 0 ; $i < (count($match_result) - 2); $i++){
$tmp_res2[] = $match_result[$i] . $match_result[$i + 1] . $match_result[$i + 2];
}
}
$match_result = array_merge($match_result, $tmp_res1, $tmp_res2);
print_r($match_result); // マッチ結果が全出力
?>
Array ( [0] => 今日 [1] => は [2] => 海 [3] => の [4] => 日 [5] => 夏 [6] => だ [7] => 一番 [8] => ドラ [9] => えもん [10] => 祭 [11] => り [12] => 今日は [13] => は海 [14] => 海の [15] => の日 [16] => 日夏 [17] => 夏だ [18] => だ一番 [19] => 一番ドラ [20] => ドラえもん [21] => えもん祭 [22] => 祭り [23] => 今日は海 [24] => は海の [25] => 海の日 [26] => の日夏 [27] => 日夏だ [28] => 夏だ一番 [29] => だ一番ドラ [30] => 一番ドラえもん [31] => ドラえもん祭 [32] => えもん祭り )
タグの自動挿入なら配列をforeachで回して既出のワードなら挿入させるというやり方にすれば結構、良い線行くんじゃないですかな。