ホームページ >バックエンド開発 >PHPチュートリアル >百度百科の基本単語リンクはどのように実装されていますか?
Baidu Encyclopedia のキーワード リンクはどのように実装されていますか?
Baidu Encyclopedia のキーワードにはリンクがあります。単純にリンクに置き換えることができる少数のキーワードを考えています。しかし、Baidu には、おそらく数千万ものキーワードがたくさんあります。何万回も交換すると効率が悪くなりすぎます。この機能はどのように実装されているか教えてください。ありがとう!
添付されたスクリーンショット:
include 'TTrie.php';<br /> <br /> class wordkey extends TTrie {<br /> function b() {<br /> $t = array_pop($this->buffer);<br /> $this->buffer[] = "<b>$t</b>";<br /> }<br /> }<br /> $p = new wordkey;<br /> $p->set('秦始皇', 'b');<br /> $p->set('洛阳', 'b');<br /> $t = $p->match('秦始皇东巡洛阳');<br /> echo join('', $t);<br />a4b561c25d9afb9ac8dc4d70affff419秦の始皇帝0d36329ec37a2cc24d42c7229b69747a東方ツアーa4b561c25d9afb9ac8dc4d70affff419洛陽0d36329ec37a2cc24d42c7229b69747a
クラス TTrie {<br> protected $buffer = array();<br> protected $dict = array( array() );<br> protected $input = 0; //文字列 <br> の現在のオフセット protected $backtracking = 0 //バックトラッキング位置の文字列<br> パブリック $debug = 0;<br> パブリック $savematch = 1;<br> <br> function set($word, $action='') {<br> if(is_array($word)) {<br> foreach($word as $k=>$v) $this->set($k, $v);<br> 戻る;<br> }<br> $p = count($this->dict);<br> $cur = 0; //現在のノード番号<br> foreach(str_split($word) as $c) {<br> if (isset($this->dict[$cur][$c])) { //すでに存在する場合は下に移動します<br> $cur = $this->dict[$cur][$c];<br> 続行;<br> }<br> $this->dict[$p]= array() // 新しいノードを作成します<br> $this->dict[$cur][$c] = $p //親ノードに子ノード番号を記録します<br> $cur = $p; // 現在のノードを新しく挿入された <br> として設定します。 $p ;<br> }<br> $this->dict[$cur]['acc'] = $action; //単語の終わり、リーフノードをマークします<br> }<br> function getto($ch) {<br> $i =& $this->input; //文字列 <br> の現在のオフセット; $p =& $this->backtracking; // 文字列のバックトラック位置<br> $len = strlen($this->doc);<br> $t = '';<br> $this->入力 ;<br> // while($this->inputgt;doc{$this->input} != $ch) $t .= $this->doc{$this->input };<br> // $t .= $this->doc{$this->input };<br> {<br>を実行します if($this->input >= $len) Break;<br> $t .= $this->doc{$this->input};<br> }while($this->doc{$this->input } != $ch);<br> リターントリム($t);<br> }<br> 関数 match($s) {<br> $this->doc =& $s;<br> $this->buffer = array();<br> $ret = array();<br> $cur = 0; //現在のノード、最初はルートノード<br> $i =& $this->input; //文字列 <br> の現在のオフセット; $p =& $this->backtracking; // 文字列のバックトラック位置<br> $i = $p = 0;<br> $s .= " $len = strlen($s);<br> $buf = '';<br> while($i $c = $s{$i};<br> if(isset($this->dict[$cur][$c])) { //存在する場合<br> $cur = $this->dict[$cur][$c] // 対応する場所に移動します<br>; if(isset($this->dict[$cur][$s[$i 1]])) {//長さを先にして、次の文字も一致するかどうかを確認します <br> $i ;<br> 続行;<br> }<br> if(isset($this->dict[$cur]['acc'])) { //これは葉ノードです。単語が一致します。 <br> if($buf != '') {<br> $this->buffer[] = $buf;<br> $buf = '';<br> }<br> if($this->savematch) $this->buffer[] = substr($s, $p, $i - $p 1) // 一致する位置と一致する単語を取得します <br><div class="clear"></div>