효율성은 매우 객관적입니다. 다른 용도로 변경하면 효율성을 보장할 수 없습니다.
- /* vim: set Expandtab tabstop=4 Shiftwidth=4: */
- // ----------- ------------------------------------- -----------
- // 이름: 가중치 계산
- // 설명: 약간 수정하면 단어 분할, 단어 빈도 통계, 전체 텍스트 검색 및 가비지에도 사용할 수 있습니다. 탐지
- // 날짜 : 2013/12/16 08:51
- // 작성자 : latel
- // ------------- ------------- ----------- ------------- --
- //
-
- /*외부 호출 예시*/
- /*
- $aItems = array(
- ' chinaisbig',
- 'whichisnot',
- 'totalyrightforme',
- );
- $aTable = array(
- 'china,is|small',
- 'china,big|me ',
- 'china,is|big, which |not,me',
- 'totaly|right,for,me',
- );
-
- $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 = 폭발(',' , str_replace('|', ',', $sTableLine))
- $setter = function($v, $k, $paraMeter) {
- $ k1 = $paraMeter[0]; $oWeight = $ paraMeter[1];
- $oWeight->genDict($v, $k1);
- };
- array_walk($aTableLine, $ setter, array($iTableKey, $this));
- }
- $this->init();
- }
-
- 공용 함수 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;
- }
-
- 공개 함수 genShow($sRule) {
- $aShow = array();
- $aMatchs = array();
- $getter = function($v, $k, $ oWeight) use(&$aShow, &$aMatchs, $sRule ) {
- $t = array_count_values($oWeight->matchWord($v));
- $aMatchs[] = $t;
- 스위치($sRule) {
- 케이스 '최대':
- $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->aDict[$iCur][$iChar] ;
- 계속;
- }
- $this->aDict[$iInsertPonit] = array();
- $this-> aDict[$iCur][$iChar] = $iInsertPonit;
- $iCur = $iInsertPonit;
- $iInsertPonit ;
- }
- $this->aDict[$iCur]['acc'] [] = $iKey;
-
- }
-
- function matchWord($sLine) {
- $iCur = $iOffset = $iPosition = 0;
- $sLine .= "
-
- ?>
코드 복사
|