LoginSignup
3
2

More than 3 years have passed since last update.

PHPで分かち書きをする意識低い方法

Last updated at Posted at 2020-02-24

タグの自動生成をしようという事で分かち書きが必要になりましたが、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で回して既出のワードなら挿入させるというやり方にすれば結構、良い線行くんじゃないですかな。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2