ホームページ >バックエンド開発 >PHPチュートリアル >百度百科の基本単語リンクはどのように実装されていますか?

百度百科の基本単語リンクはどのように実装されていますか?

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

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