ホームページ  >  記事  >  php教程  >  PHP での中国語単語分割のためのシンプルなコード共有

PHP での中国語単語分割のためのシンプルなコード共有

WBOY
WBOYオリジナル
2016-06-13 12:06:581098ブラウズ

もちろん、この記事は中国の検索エンジンについて研究することではなく、PHP を使用してオンサイトの検索エンジンを構築する方法を共有することを目的としています。 この記事はこの系の記事です。
私が使用している単語分割ツールは、中国科学院計算技術研究所の ICTCLAS のオープンソース バージョンです。 オープンソースの Bamboo もありますが、これについても後で調査します。
ICCTCLAS のアルゴリズムは広く普及しており、公開された学術文書があり、コンパイルが簡単で、ライブラリへの依存関係がほとんどないため、 ICTCLAS から始めるのが良い選択です。 ただし、現在提供されているのは C/C、Java、および C# バージョンのコードのみであり、PHP バージョンのコードはありません。 どうすればよいでしょうか? C/C ソース コードと学術文書を研究して、PHP バージョンを開発することができます。 ただし、プロセス間通信を使用して、PHP コードから C/C バージョンの実行可能ファイルを呼び出したいと考えています。
ソース コードをダウンロードして解凍した後、C 開発ライブラリとコンパイル環境を備えたマシン上で ictclas を直接作成します。 Makefile スクリプトにエラーがあり、テストを実行するコードに ' が追加されていません。 /' と表示されますが、もちろん Windows のように正常に実行することはできません。 ただし、コンパイル結果には影響しません。
中国語の単語分割の PHP クラスは以下のとおりです。 proc_open() 関数を使用して単語分割プログラムを実行し、パイプラインを通じて対話し、分割するテキストを入力して、単語分割結果を読み取ります。

コードをコピー コードは次のとおりです:


class NLP{
private static $cmd_path;
// '/' で終了しない
static function set_cmd_path($path){
self::$cmd_path = $path;
}
private function cmd($ str){
$descriptorspec = array(
0 =>array("pipe", "r"),
1 =>array("pipe", "w"),
);
$cmd = self::$cmd_path . "/ictclas";
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) 🎜>$str = iconv('utf-8', 'gbk', $str);
fwrite($pipes[0], $str);
$output = stream_get_contents($pipes[1]) ;
fclose($pipes[0]);
$return_value = proc_close($process);
/*
$ cmd = "printf '$input' | " . self::$cmd_path . "/ictclas";
exec($cmd, $output, $ret);出力);
*/
$output = trim($output);
$output = iconv('gbk', 'utf-8', $output); 🎜>}
/**
* 単語の分割を実行し、単語リストを返します。
*/
関数 tokenize($str){
$tokens = array();
$output = self::cmd($input); 🎜>if( $output){
$ps = preg_split('/s /', $output);
foreach($ps as $p){
list($seg, $tag) = explode('/ ', $p);
$item = array(
'seg' => $seg,
'tag' => $tag,
); $tokens[] = $item;
}
return $tokens;
}
NLP::set_cmd_path(dirname(__FILE__)); ;


使い方は非常に簡単です (ICTCLAS でコンパイルされた実行可能ファイルと辞書が現在のディレクトリにあることを確認してください):



コードをコピーします

コードは次のとおりです。


require_once('NLP.php')
var_dump(NLP::tokenize('Hello, World!' ));
?>

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。