Самый быстрый подход к расширению запросов фраз - PullRequest
2 голосов
/ 02 декабря 2011

Я использую список синонимов, чтобы направлять процесс расширения запроса.Формат выглядит следующим образом:

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?

Я не хочу проходить каждую пару слов или тройку черезпоиск тоже, и я хочу, чтобы избежать линейного поиска в списке тезаурусов по входным данным, поскольку это неэффективно (хотя список должен быть довольно маленьким, так что это вариант).

Поэтому я ищу способы выполнить бинарный поиск по фразам или построить тезаурус таким образом, чтобы компенсировать фразы.

Я использую PHP для этого.Любые предложения приветствуются.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Простой подход будет использовать 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 голос
/ 02 декабря 2011

Используйте preg_replace_callback вместо того, что вы делали сейчас.PCRE оказывается достаточно эффективным при поиске строк, потому что это то, для чего он был создан.

Вам просто нужно создать один список альтернатив, а затем выполнить фактическую замену через исходную карту / словарь в обратном вызове.1006 *

$phrases = array(...);

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

Просто используя выражение /e здесь, обратный вызов может быть более полезным.

1 голос
/ 02 декабря 2011

Моей первой идеей было бы использовать ассоциативный массив, подобный этому

$thesaurus = array(
   'alphabet'  => 'quick brown fox',
   'space'     => 'out of this world',
   'hello'     => 'why hello there'
);

Таким образом, вы можете использовать встроенные функции array_search, которые будут быстрее, чем все, что вы могли бы написать в PHP (я думаю).

...