Ищу элегантный способ удалить любые 544 слова из строки - PullRequest
2 голосов
/ 17 февраля 2010

Мне нужно удалить все экземпляры 544 полнотекстовых стоп-слов из введенной пользователем строки поиска, а затем отформатировать ее для запуска полнотекстового поиска с частичным совпадением в логическом режиме.

ввод: "город Нью-Йорк", вывод: "+ йорк * + город *" (слово "новый" - это стоп-слово).

У меня есть ужасное решение, которое работает: разбить строку поиска на массив слов, найти каждое слово в массиве стоп-слов, сбросить их, если есть совпадение, взорвать оставшиеся слова и, наконец, запустить регулярное выражение, чтобы добавить форматирование логического режима. Должно быть более элегантное решение.

Мой вопрос состоит из 2 частей.

1) Как вы думаете, какой самый чистый способ сделать это?

2) Я решил часть проблемы с помощью огромного регулярного выражения, но это подняло другой вопрос.

РЕДАКТИРОВАТЬ: Это на самом деле работает. Мне стыдно сказать, что проблема с памятью (которая, как мне казалось, была моим регулярным выражением) возникла позже в коде из-за огромного количества совпадений после фильтрации стоп-слов.

$tmp  = preg_replace('/(\b('.implode('|',$stopwords).')\b)+/','',$this->val);
$boolified = preg_replace('/([^\s]+)/','+$1*',$tmp);

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

Создайте дерево суффиксов из 544 слов и просто пройдитесь по нему с помощью входной строки буква за буквой и вернитесь к корню дерева в начале каждого нового слова. Когда вы найдете совпадение в конце слова, удалите его. Это O (n) по длине входных строк, если список слов становится статическим.

1 голос
/ 17 февраля 2010

Разделить строку поиска в массиве слов, а затем

  • do array_diff () с массивом стоп-слов
  • или сделайте стоп-слова хэшем и используйте поиск хеша (если isset ($ stopwords [$ word]) тогда ...)
  • или сортируйте стоп-слова и используйте бинарный поиск для каждого слова

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...