ホームページ バックエンド開発 PHPチュートリアル RMM に基づく単純な中国語単語の分割

RMM に基づく単純な中国語単語の分割

Jul 25, 2016 am 08:49 AM

このプログラムは、RMM 中国語単語分割のアイデアに基づいた単純な中国語単語分割です。プログラムにはまだ多くの抜け穴があります。神が私に何らかの導きを与えてくれることを願っています。文字化けしたコードの問題は最適化されました。
    /**
  1. * RMM 中国語単語分割 (逆照合法) に基づく
  2. * @author tangpan
  3. * @date 2013-10-12
  4. * @version 1.0.0
  5. **/
  6. class SplitWord {
  7. //public $Tag_dic = array() //ストレージ辞書の単語分割
  8. public $Rec_dic = array();再編成 単語分割
  9. public $Split_char = ' '; //Separator
  10. public $Source_str = ''; //ストレージソース文字列
  11. public $Result_str = ''; public $Dic_maxLen = 28; //辞書内の単語の最大長
  12. public $Dic_minLen = 2 //辞書内の単語の最小長
  13. public function SplitWord() { //オブジェクトを初期化し、メンバーを自動的に実行しますMethods
  14. $ this->__construct();
  15. }
  16. public function __construct() {
  17. $dic_path = dirname(__FILE__).'/words.csv' // 単語の分割速度を向上させるために辞書をプリロードします
  18. $fp = fopen( $ dic_path, 'r' ); //語彙内の単語を読み取ります
  19. while( $line = fgets( $fp, 256 ) ) {
  20. $ws =explode(' ', $line);語彙内の単語 単語を分割します
  21. $ws[0] = trim(iconv('utf-8','GBK',$ws[0])); //エンコード変換
  22. //$this->Tag_dic[ $ws[ 0]] = true; //単語をインデックスとして使用し、シーケンス番号を値として使用します
  23. $this->Rec_dic[strlen($ws[0])][$ws[0]] = true;単語の長さと単語 それぞれ 2 次元配列のインデックスであり、n を値として使用して語彙を再編成します
  24. }
  25. fclose($fp) //語彙を閉じます
  26. }
  27. /**
  28. * ソース文字列を設定します
  29. * @param セグメント化する文字列
  30. * /
  31. public function SetSourceStr( $str ) {
  32. $str = iconv( 'utf-8', 'GBK', $str ); // utf-8 エンコードされた文字を GBK エンコードに変換します
  33. $this->Source_str = $ this->DealStr( $ str ); //文字列の前処理
  34. }
  35. /**
  36. * 文字列をチェック
  37. * @param $str ソース文字列
  38. * @return bool
  39. */
  40. public function checkStr( $str ) {
  41. if (trim($str) == '' ) return; //文字列が空の場合は直接返す
  42. if ( ord( $str[0] ) > 0x80 ) return true; // 漢字の場合は true を返す
  43. else return false;漢字ではありません。 false を返します
  44. }
  45. / **
  46. * RMM 単語分割アルゴリズム
  47. * @param $str 処理される文字列
  48. */
  49. public function SplitRMM( $str = '' ) {
  50. if (rim( $str ) == '' ) return; /文字列が空の場合は直接リターン
  51. else $this- >SetSourceStr( $str ); //文字列が空でない場合はソース文字列を設定
  52. if ( $this->Source_str == ' ' ) return ; //ソース文字列が空の場合は、直接返します
  53. $split_words =explode( ' ', $this->Source_str ) //文字列をスペースで分割します
  54. $lenght = count( $split_words );配列の長さ
  55. for ( $i = $lenght - 1 ; $i >= 0; $i-- ) {
  56. if (rim( $split_words[$i] ) == ' ' ) continue;文字が空の場合は、次のコードをスキップして次の 1 つのループに直接進みます
  57. if ( $this->checkStr( $split_words[$i] ) ) { //文字列が漢字かどうかを確認します
  58. if ( strlen( $split_words[$i] ) >= $this-> ;limit_length ) { //文字列の長さが制限サイズより大きい場合
  59. //文字列を逆引き
  60. $this->Result_str = $this ->pregRmmSplit( $split_words[$i] ).$this-> Split_char.$this->Result_str;
  61. }
  62. } else {
  63. $this->Result_str = $split_words[$i].$this ->Split_char.$this->Result_str;
  64. }
  65. }
  66. $ this->clear( $split_words ) // メモリを解放します
  67. return iconv('GBK', 'utf-8', $this-> ;Result_str);
  68. }
  69. /**
  70. * 逆マッチング法で中国語文字列を分解
  71. * @param $str string
  72. * @return $retStr 単語分割で完成した文字列
  73. */
  74. public function pregRmmSplit( $str ) {
  75. if ( $str == ' ' ) return;
  76. $splen = strlen( $str );
  77. $Split_Result = array();
  78. for ( $j = $splen - 1; $j >= 0; $j--) { //文字を逆方向に一致させる
  79. if ( $splen Dic_minLen ) { //文字長が辞書の最小文字長より大きい場合
  80. if ( $j = = 1 ) { //長さが1の場合
  81. $Split_Result[] = substr( $str, 0, 2 ) ;
  82. }else {
  83. $w = trim( substr( $str, 0, $this->Dic_minLen + 1 ) ); //最初の 4 文字を切り捨てます
  84. if ( $this->IsWord( $w ) ) { //文字が辞書に存在するかどうかを判断します
  85. $Split_Result[] = $w; //存在する場合は、それを配列に書き込みます
  86. } else {
  87. $Split_Result[] = substr( $str, 2, 2); //ストレージを反転します
  88. $Split_Result[] = substr( $str, 0, 2 );
  89. }
  90. }
  91. $j = -1; // ループを閉じます;
  92. Break;
  93. }
  94. if ( $j >= $this->Dic_maxLen ) $max_len = $this->Dic_maxLen; //文字の長さが辞書内の最大の単語の長さを超える場合、最大制限長を割り当てます
  95. それ以外の場合 $max_len = $j;
  96. for ( $k = $max_len; $k >= 0; $k = $k - 2 ) { //1 つのジャンプは 1 つの漢字です
  97. $w = トリム( substr( $str, $j - $k, $ k + 1 ) );
  98. if ( $this-> ;IsWord( $w ) ) {
  99. $Split_Result[] = $w; //単語を保存
  100. $j = $j - $k - 1;位置から一致した文字の位置まで
  101. Break; // 単語の分割が成功すると、現在のループを抜けて次のループに入ります
  102. }
  103. }
  104. }
  105. $retStr = $this->resetWord ( $Split_Result ); // 文字列を再編成し、処理された文字列を返します
  106. $this-> ;clear( $Split_Result ); // メモリを解放します
  107. return $retStr;
  108. }
  109. /**
  110. * 単語セグメントを再識別して結合します
  111. * @param $Split_Result ターゲット文字列を再構築します
  112. * @return $ret_Str 文字列を再構築します
  113. */
  114. function restartWord( $Split_Result ) {
  115. if (trim( $Split_Result[0] ) == '' ) return;
  116. $Len = count( $Split_Result ) - 1;
  117. $ret_Str = '';
  118. $spc = $this ->Split_char;
  119. for ( $i = $Len; $i >= 0 ; $i-- ) {
  120. if (trim( $Split_Result[$i] ) != '' ) {
  121. $Split_Result[$ i] = iconv( 'GBK', 'utf-8', $Split_Result[$i ] );
  122. $ret_Str .= $spc.$Split_Result[$i].' ';
  123. }
  124. }
  125. //$ret_Str = preg_replace('/^'.$spc.'/',',',$ ret_Str);
  126. $ret_Str = iconv('utf-8','GBK',$ret_Str);
  127. return $ret_Str;
  128. }
  129. /**
  130. * 特定の単語が辞書に存在するかどうかを確認します
  131. * @param $okWord 確認する単語
  132. * @return bool;
  133. */
  134. public function IsWord( $okWord ) {
  135. $len = strlen( $okWord );
  136. if ( $len > $this->Dic_maxLen + 1 ) return false;
  137. else { //二次元配列のインデックス照合により単語が存在するかどうかを判定
  138. return isset($this ->Rec_dic[$len][$okWord]);
  139. }
  140. }
  141. /**
  142. * 文字列の予備処理 (特殊文字をスペースに置き換える)
  143. * @param $str 処理対象のソース文字列
  144. * @return $okStr 前処理された文字列を返す
  145. */
  146. public function DealStr( $str ) {
  147. $spc = $this->Split_char
  148. $slen = strlen( $str ); // 文字の長さを計算します
  149. if ( $slen = = 0 ) return; // 文字長が0の場合はそのままリターン
  150. $okstr = ''; // 変数を初期化する
  151. $prechar = 0; // 文字判定変数(0-空白、1-英語、2-中国語) , 3 シンボル)
  152. for ( $i = 0; $i < $slen; $i++ ) {
  153. $str_ord = ord( $str[$i] );
  154. if ( $str_ord < 0x81 ) { //英字の場合
  155. if ( $str_ord < 33 ) { // 英語の空白記号
  156. if ( $str [$i] != 'r' && $str[$i] != 'n' )
  157. $ okstr .= $spc;
  158. $prechar = 0;
  159. continue;
  160. } else if ( ereg('[@. %#:^&_-]',$str[$i]) ) { //次の文字の場合キーワードは数字、英語、特殊文字です
  161. if ( $prechar == 0 ) { //文字が空白文字の場合
  162. $okstr .= $str[$i];
  163. $prechar = 3;
  164. } else {
  165. $okstr .= $spc.$str[$i]; //文字が空白文字でない場合、その文字の前の文字列 先頭の空白文字
  166. $prechar = 3;
  167. }
  168. } else if ( ereg('[0-9a-zA-Z]', $str[$i]) ) { //英語の数字の組み合わせを分割します
  169. if ( (ereg ('[0-9]',$str[$i-1 ]) && ereg('[a-zA-Z]',$str[$i]))
  170. || (ereg('[a-zA -Z]',$str[$i-1]) && ereg ('[0-9]',$str[$i])) ) {
  171. $okstr .= $spc.$str[$i];
  172. } else {
  173. $okstr .= $str[$i];
  174. }
  175. }
  176. }else { //キーワードの 2 番目の文字が漢字の場合
  177. if ( $prechar != 0 && $prechar != 2 ) // 前の文字が中国語以外でスペース以外の場合は、スペースを追加します
  178. $ okstr . = $spc;
  179. if ( isset( $str[$i+1] ) ) { //漢字の場合
  180. $c = $str[$i].$str[$i+1]; //2 つの文字列をまとめて漢字に変換します
  181. $n = hexdec( bin2hex( $c ) ) //ASCII コードを 16 進数に変換し、次に 10 進数に変換します
  182. if ( $n > 0xA13F && $ n < ; 0xAA40 ) { //中国語の句読点の場合
  183. if ( $prechar != 0 ) $okstr .= $spc; //中国語の句読点を空の記号に置き換えます
  184. //else $okstr .= $spc; ; // 前の文字が空の場合は、直接文字列化します
  185. $prechar = 3;
  186. } else { // 中国語の句読点でない場合
  187. $okstr .= $c;
  188. $prechar = 2;
  189. }
  190. $i++ ; // $ i に 1 を加えます (一度に 1 文字ずつ移動する場合も同様) }
  191. }
  192. }
  193. return $okstr;
  194. }
  195. /**
  196. * メモリを解放します
  197. * @param $data 一時データ
  198. */
  199. public function clear( $data ) {
  200. unset( $data ) ; //一時データを削除
  201. }
  202. }
  203. ?>
コードをコピー
RMM に基づく単純な中国語単語の分割

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 PHPのさまざまなエラータイプを説明します(通知、警告、致命的なエラー、解析エラー)。 Apr 08, 2025 am 12:03 AM

PHPには4つの主要なエラータイプがあります。1。notice:わずかなものは、未定義の変数へのアクセスなど、プログラムを中断しません。 2。警告:通知よりも深刻で、ファイルを含むなど、プログラムを終了しません。 3。ファタラー:最も深刻なのは、機能を呼び出すなど、プログラムを終了します。 4。ParseError:構文エラーは、エンドタグの追加を忘れるなど、プログラムの実行を防ぎます。

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか? Apr 17, 2025 am 12:06 AM

PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか? Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPは、ファイルを安全に処理する方法をどのように処理しますか? PHPは、ファイルを安全に処理する方法をどのように処理しますか? Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

PHP OOPで、self ::、parent ::、and static ::の違いを説明します。 PHP OOPで、self ::、parent ::、and static ::の違いを説明します。 Apr 09, 2025 am 12:04 AM

Phpoopでは、self ::は現在のクラスを指し、親::は親クラスを指し、静的::は後期静的結合に使用されます。 1.Self ::静的方法と一定の呼び出しに使用されますが、後期静的結合をサポートしていません。 2.Parent ::サブクラスには、親クラスのメソッドを呼び出すために使用され、プライベートメソッドにアクセスできません。 3.Static ::継承と多型に適した後期静的結合をサポートしますが、コードの読みやすさに影響を与える可能性があります。

See all articles