]> git.openstreetmap.org Git - nominatim.git/blob - lib/Phrase.php
take frequency scores from token description
[nominatim.git] / lib / Phrase.php
1 <?php
2
3 namespace Nominatim;
4
5 /**
6  * Segment of a query string.
7  *
8  * The parts of a query strings are usually separated by commas.
9  */
10 class Phrase
11 {
12     CONST MAX_DEPTH = 7;
13
14     // Complete phrase as a string.
15     private $sPhrase;
16     // Element type for structured searches.
17     private $sPhraseType;
18     // Space-separated words of the phrase.
19     private $aWords;
20     // Possible segmentations of the phrase.
21     private $aWordSets;
22
23
24     public function __construct($sPhrase, $sPhraseType)
25     {
26         $this->sPhrase = trim($sPhrase);
27         $this->sPhraseType = $sPhraseType;
28         $this->aWords = explode(' ', $this->sPhrase);
29         $this->aWordSets = $this->createWordSets($this->aWords, 0);
30     }
31
32     public function getPhraseType()
33     {
34         return $this->sPhraseType;
35     }
36
37     public function getWordSets()
38     {
39         return $this->aWordSets;
40     }
41
42     public function addTokens(&$aTokens)
43     {
44         foreach ($this->aWordSets as $aSet) {
45             foreach ($aSet as $sWord) {
46                 $aTokens[' '.$sWord] = ' '.$sWord;
47                 $aTokens[$sWord] = $sWord;
48             }
49         }
50     }
51
52     public function invertWordSets()
53     {
54         $this->aWordSets = $this->createInverseWordSets($this->aWords, 0);
55     }
56
57     private function createWordSets($aWords, $iDepth)
58     {
59         $aResult = array(array(join(' ', $aWords)));
60         $sFirstToken = '';
61         if ($iDepth < Phrase::MAX_DEPTH) {
62             while (sizeof($aWords) > 1) {
63                 $sWord = array_shift($aWords);
64                 $sFirstToken .= ($sFirstToken?' ':'').$sWord;
65                 $aRest = $this->createWordSets($aWords, $iDepth + 1);
66                 foreach ($aRest as $aSet) {
67                     $aResult[] = array_merge(array($sFirstToken), $aSet);
68                 }
69             }
70         }
71
72         return $aResult;
73     }
74
75     public function createInverseWordSets($aWords, $iDepth)
76     {
77         $aResult = array(array(join(' ', $aWords)));
78         $sFirstToken = '';
79         if ($iDepth < Phrase::MAX_DEPTH) {
80             while (sizeof($aWords) > 1) {
81                 $sWord = array_pop($aWords);
82                 $sFirstToken = $sWord.($sFirstToken?' ':'').$sFirstToken;
83                 $aRest = $this->createInverseWordSets($aWords, $iDepth + 1);
84                 foreach ($aRest as $aSet) {
85                     $aResult[] = array_merge(array($sFirstToken), $aSet);
86                 }
87             }
88         }
89
90         return $aResult;
91     }
92 };