PHP中国語分詞アルゴリズム及びコード実現


簡単な中国語分詞アルゴリズム、二元分詞のPHPコード:
$str = '  ,     paradise!';
//$str = iconv('GB2312','UTF-8',$str);
$result = spStr($str);
print_r($result);

/**
 * UTF-8        
 */
function spStr($str)
{
    $cstr = array();

    $search = array(",", "/", "\\", ".", ";", ":", "\"", "!", "~", "`", "^", "(", ")", "?", "-", "\t", "
", "'", "<", ">", "\r", "\r
", "{1}quot;", "&", "%", "#", "@", "+", "=", "{", "}", "[", "]", ":", ")", "(", ".", "。", ",", "!", ";", "“", "”", "‘", "’", "[", "]", "、", "—", " ", "《", "》", "-", "…", "【", "】",); $str = str_replace($search, " ", $str); preg_match_all("/[a-zA-Z]+/", $str, $estr); preg_match_all("/[0-9]+/", $str, $nstr); $str = preg_replace("/[0-9a-zA-Z]+/", " ", $str); $str = preg_replace("/\s{2,}/", " ", $str); $str = explode(" ", trim($str)); foreach ($str as $s) { $l = strlen($s); $bf = null; for ($i= 0; $i< $l; $i=$i+3) { $ns1 = $s{$i}.$s{$i+1}.$s{$i+2}; if (isset($s{$i+3})) { $ns2 = $s{$i+3}.$s{$i+4}.$s{$i+5}; if (preg_match("/[\x80-\xff]{3}/",$ns2)) $cstr[] = $ns1.$ns2; } else if ($i == 0) { $cstr[] = $ns1; } } } $estr = isset($estr[0])?$estr[0]:array(); $nstr = isset($nstr[0])?$nstr[0]:array(); return array_merge($nstr,$estr,$cstr); }

「蘇杭、人間の天国paradise」は二元分詞を経て、次のように変わった.
Array ( [0] => paradise [1] =>    [2] =>    [3] =>    [4] =>    [5] =>    ) 
次に、以上の結果を1バイトに変換し、md 5、base 64、sha 1などを使用できますが、これらの変換後の文字が長すぎて、記憶空間が多すぎて、漢字、漢字のシフトコードのPHPコードをブロックコードで表すことができます.
foreach ($result as $s) {
    $s = iconv('UTF-8','GB2312',$s);
    $code[] = gbCode($s);
}
$code = implode(" ", $code);
echo $code;

function gbCode($str) {
    $return = null;

    if (!preg_match("/^[\x80-\xff]{2,}$/",$str)) return $str;

    $len = strlen($str);
    for ($i= 0; $i< $len; $i=$i+2) {
        $return .= sprintf("%02d%02d",ord($str{$i})-160,ord($str{$i+1})-160);
    }

    return $return;
}

変換後の結果は次のとおりです.
paradise 43532628 40432868 28682136 21364476 44764435
最後に得られた結果をライブラリに入れ、全文インデックステーブルを挿入し、結果はインデックステーブルのfulltextインデックスフィールドを挿入する必要があります.