X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/c3ddc7579a6f2a855cfb8adefbb16e8f3213ba92..3734f1d0b84c642ba89b5a4c39bac845f5627be7:/lib-php/tokenizer/legacy_tokenizer.php?ds=sidebyside diff --git a/lib-php/tokenizer/legacy_tokenizer.php b/lib-php/tokenizer/legacy_tokenizer.php index 570b8828..6f3d2304 100644 --- a/lib-php/tokenizer/legacy_tokenizer.php +++ b/lib-php/tokenizer/legacy_tokenizer.php @@ -1,13 +1,22 @@ aCountryRestriction = $aCountries; - } - - public function normalizeString($sTerm) { if ($this->oNormalizer === null) { @@ -53,6 +56,14 @@ class Tokenizer } + public function mostFrequentWords($iNum) + { + $sSQL = 'SELECT word FROM word WHERE word is not null '; + $sSQL .= 'ORDER BY search_name_count DESC LIMIT '.$iNum; + return $this->oDB->getCol($sSQL); + } + + public function tokensForSpecialTerm($sTerm) { $aResults = array(); @@ -92,6 +103,23 @@ class Tokenizer $sNormQuery .= ','.$this->normalizeString($oPhrase->getPhrase()); $sSQL .= 'make_standard_name(:' .$iPhrase.') as p'.$iPhrase.','; $aParams[':'.$iPhrase] = $oPhrase->getPhrase(); + + // Conflicts between US state abbreviations and various words + // for 'the' in different languages + switch (strtolower($oPhrase->getPhrase())) { + case 'il': + $aParams[':'.$iPhrase] = 'illinois'; + break; + case 'al': + $aParams[':'.$iPhrase] = 'alabama'; + break; + case 'la': + $aParams[':'.$iPhrase] = 'louisiana'; + break; + default: + $aParams[':'.$iPhrase] = $oPhrase->getPhrase(); + break; + } } $sSQL = substr($sSQL, 0, -1); @@ -106,13 +134,14 @@ class Tokenizer $aWordLists = array(); $aTokens = array(); foreach ($aNormPhrases as $sPhrase) { - if (strlen($sPhrase) > 0) { - $aWords = explode(' ', $sPhrase); - Tokenizer::addTokens($aTokens, $aWords); - $aWordLists[] = $aWords; - } else { - $aWordLists[] = array(); + $oWordList = new SimpleWordList($sPhrase); + + foreach ($oWordList->getTokens() as $sToken) { + $aTokens[' '.$sToken] = ' '.$sToken; + $aTokens[$sToken] = $sToken; } + + $aWordLists[] = $oWordList; } Debug::printVar('Tokens', $aTokens); @@ -121,7 +150,7 @@ class Tokenizer $oValidTokens = $this->computeValidTokens($aTokens, $sNormQuery); foreach ($aPhrases as $iPhrase => $oPhrase) { - $oPhrase->computeWordSets($aWordLists[$iPhrase], $oValidTokens); + $oPhrase->setWordSets($aWordLists[$iPhrase]->getWordSets($oValidTokens)); } return $oValidTokens; @@ -206,12 +235,7 @@ class Tokenizer ); } } elseif ($aWord['country_code']) { - // Filter country tokens that do not match restricted countries. - if (!$this->aCountryRestriction - || in_array($aWord['country_code'], $this->aCountryRestriction) - ) { - $oToken = new Token\Country($iId, $aWord['country_code']); - } + $oToken = new Token\Country($iId, $aWord['country_code']); } elseif ($aWord['word_token'][0] == ' ') { $oToken = new Token\Word( $iId, @@ -238,29 +262,4 @@ class Tokenizer } } } - - - /** - * Add the tokens from this phrase to the given list of tokens. - * - * @param string[] $aTokens List of tokens to append. - * - * @return void - */ - private static function addTokens(&$aTokens, $aWords) - { - $iNumWords = count($aWords); - - for ($i = 0; $i < $iNumWords; $i++) { - $sPhrase = $aWords[$i]; - $aTokens[' '.$sPhrase] = ' '.$sPhrase; - $aTokens[$sPhrase] = $sPhrase; - - for ($j = $i + 1; $j < $iNumWords; $j++) { - $sPhrase .= ' '.$aWords[$j]; - $aTokens[' '.$sPhrase] = ' '.$sPhrase; - $aTokens[$sPhrase] = $sPhrase; - } - } - } }