我正在使用同义词列表来指导查询扩展过程。格式如下:
fu=foo
ba=bar
etc=etcetera
werd=word
我正在使用简单的二进制搜索算法来针对此列表运行每个用户输入字。问题是,当涉及到使用短语时。
quick brown fox=alphabet
out of this world=space
why hello there=hello
典型输入:why hello there, where can I get an out of this world hopper?
所需的输出为:hello, where can I get an space hopper?
我也不想通过搜索来运行每个单词对或tripple,我想避免对输入进行线性搜索同义词列表,因为这是低效的(尽管列表应该非常小,所以这是一个选项)。
因此,我正在寻找在短语上运行二进制搜索的方法,或者以补偿短语的方式构建词库。
我正在使用PHP。任何建议都是最受欢迎的。
答案 0 :(得分:2)
简单的方法是使用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);
}
编辑: 我经常注意到使用内置函数而不是编写自己的函数更有效,因为内置函数已经编译好了,但是需要解释优化算法,这是一个巨大的减速。
答案 1 :(得分:1)
我的第一个想法是使用像这样的关联数组
$thesaurus = array(
'alphabet' => 'quick brown fox',
'space' => 'out of this world',
'hello' => 'why hello there'
);
这样你可以使用内置的array_search函数,这比你在PHP中编写的任何函数都要快(我认为)。
答案 2 :(得分:1)
使用preg_replace_callback
代替您现在所做的任何事情。 PCRE恰好在字符串搜索方面非常有效,因为它就是它的用途。
您只需要构建一个替代列表,然后通过回调中的原始地图/字典进行实际替换。
$phrases = array(...);
$rx = implode("|", array_keys($phrases));
$text = preg_replace("/\b($rx)\b/musie", '$phrases["\1"]', $text);
在这里只使用/e
表达式,回调可能更有用。