Php 短语查询扩展的最快方法

Php 短语查询扩展的最快方法,php,binary-search,thesaurus,Php,Binary Search,Thesaurus,我使用同义词列表来指导查询扩展过程。格式如下所示: fu=foo ba=bar etc=etcetera werd=word 我使用一个简单的二进制搜索算法来运行每个用户输入的单词。问题是,当涉及到使用短语时 典型输入:为什么在那里打招呼,我在哪里可以找到“走出这个世界”的hopper? 所需的输出是:hello,我在哪里可以买到太空舱? 我不想在搜索过程中对每个词对或三个词进行搜索,我希望避免对输入进行线性搜索,因为这是低效的(尽管列表应该很小,所以这是一个选项) 因此,我正在寻找对短语进行

我使用同义词列表来指导查询扩展过程。格式如下所示:

fu=foo
ba=bar
etc=etcetera
werd=word
我使用一个简单的二进制搜索算法来运行每个用户输入的单词。问题是,当涉及到使用短语时

典型输入:
为什么在那里打招呼,我在哪里可以找到“走出这个世界”的hopper?

所需的输出是:
hello,我在哪里可以买到太空舱?

我不想在搜索过程中对每个词对或三个词进行搜索,我希望避免对输入进行线性搜索,因为这是低效的(尽管列表应该很小,所以这是一个选项)

因此,我正在寻找对短语进行二进制搜索的方法,或者以补偿短语的方式构建同义词库


我使用PHP来实现这一点。欢迎任何建议。

我的第一个想法是使用这样的关联数组

$thesaurus = array(
   'alphabet'  => 'quick brown fox',
   'space'     => 'out of this world',
   'hello'     => 'why hello there'
);
这样,您就可以使用内置的数组搜索函数,这将比用PHP编写的任何东西都要快(我认为)。

使用它,而不是您现在所做的任何事情。PCRE恰好在字符串搜索方面非常有效,因为这就是它的用途

您只需要构建一个替代列表,然后通过回调中的原始映射/字典进行实际替换

$phrases = array(...);

$rx = implode("|", array_keys($phrases));
$text = preg_replace("/\b($rx)\b/musie", '$phrases["\1"]', $text);

仅在这里使用
/e
表达式,回调可能更有用。

简单的方法是使用。不过我不知道演出的情况

$list = array('out of this world' => 'space');
$str = 'why hello there, where can I get an out of this world hopper?';

foreach ($list as $old => $new) {
    $str = str_replace($old, $new, $str);
}
编辑:
我经常注意到,使用内置函数比编写自己的函数更有效,因为内置函数已经编译好了,但优化算法需要解释,这是一个巨大的减速。

你说得对,这可能比编写自己的算法要快。谢谢。我想如果你把这个和@RCE的答案结合起来,你可能会走上正确的道路。是的,非常感谢。对不起,
/musie
在这里是什么意思?这些是特定的preg标志吗?是的,regex标志。你只需要
/ie
在这里,但其他人不会受伤;看起来很别致。当你经过一个数组时,str_replace在内部执行一个循环。除非有一个超长的主题或几百条条目,否则可能没有意义。
$list = array('out of this world' => 'space');
$str = 'why hello there, where can I get an out of this world hopper?';

foreach ($list as $old => $new) {
    $str = str_replace($old, $new, $str);
}