効率は非常に客観的なものです。他の用途に変更した場合、その効率は保証できません。
- /* vim: set Expandtab tabstop=4 shftwidth=4: */
- // +--------------------- - -------------------------------------------------
- // 名前: 重み計算
- // 説明: 少し変更すると、単語の分割、単語の頻度統計、全文検索、ガーベジ検出にも使用できます
- // 日付: 2013/12/16 08:51
- / / 著者: 遅れました < latelx64@gmail.com> ------ --------------------------------
- //
-
- /*外部呼び出しの例*/
- /*
- $aItems = array(
- '中国は大きい',
- 'どっちではない',
- 'totalyrightforme',
- );
- $aTable = array(
- '中国,is|小さい',
- '中国,大きい|私' ,
- '中国は |大きい、どれ|私ではない',
- '完全に|正しい、私のために',
- );
-
- $oWeight = new ttrie;
- $oWeight->newItems($aItems);
- $aResult = $oWeight ->newTable($aTable);
- */
-
- クラスの重み {
- protected $aDict = array(array());
- protected $aItems = array();
- protected $sLastRule;
- protected $aMatchs = array( );
- protected $aShow = array();
-
- private function init() {
- //記録されたマッチングテーブルをクリアして結果を出力
- unset($this->aShow);
- }
-
- public function newItems($ mItems) {
- //新しいアイテムをインポートします
- $this->aItems = (is_array($mItems))? $mItems: array($mItems);
- $this->init();
- }
-
- public function newTable(array $aTable) {
- //新しい比較テーブルをインポートし、辞書を生成します
- foreach($aTable as $iTableKey=>$sTableLine) {
- $aTableLine =explode(',', str_replace('|' , ',', $sTableLine));
- $setter = function($v, $k, $paraMeter) {
- $k1 = $oWeight = $paraMeter[1];
- $oWeight-> ;genDict($v, $k1);
- };
- array_walk($aTableLine, $setter, array($iTableKey, $this));
- }
- $this->init();
- }
-
- public function getShow($sRule = 'max') {
- //最終的な表示結果を取得します
- if(empty($this->aItems) || empty($this->aDict))
- return array ();
- if (empty($this->aShow) || $sRule != $this->sLastRule)
- return $this->genShow($sRule);
- return $this->aShow;
- }
-
- public function genShow($sRule) {
- $aShow = array();
- $aMatchs = array();
- $getter = function($v, $k, $oWeight) use(&$aShow, & $aMatchs, $sRule ) {
- $t = array_count_values($oWeight->matchWord($v));
- $aMatchs[] = $t;
- switch ($sRule) {
- case 'max':
- $aShow [$k] = array_keys($t, max($t));
- Break;
- }
- };
- array_walk($this->aItems, $getter, $this);
- $this->aShow = $aShow;
- $ this->aMatchs = $aMatchs;
- return $aShow;
- }
-
- プライベート関数 genDict($mWord, $iKey = '') {
- $iInsertPonit = count($this->aDict) ;
- $iCur = 0; //現在のノード番号
- foreach (str_split($mWord) as $iChar) {
- if (isset($this->aDict[$iCur][$iChar])) {
- $iCur = $this->gt;aDict[$iCur][$iChar];
- 続行;
- }
- $this->aDict[$iInsertPonit] = array();
- $this->aDict[$iCur][$ iChar] = $iInsertPonit ;
- $iCur = $iInsertPonit;
- $iInsertPonit++;
- }
- $this->aDict[$iCur]['acc'][] = $iKey($ sLine) {
- $ iCur = $iOffset = $iPosition = 0;
- $sLine .= "
-
- ?>
コードをコピー
|