Замена ключевых слов в тексте с помощью php & mysql

0

У меня есть новостной сайт, содержащий архив с более чем 1 миллионом новостей. Я создал базу данных определений слов с около 3000 записей, состоящую из пар слов.

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

Вопрос в том, что str_replace или preg_replace будет очень медленным для поиска 3 тысяч ключевых слов в тексте и их замены.

Есть ли какие-либо быстрые альтернативы?

Теги:
str-replace
preg-replace

3 ответа

1
Лучший ответ

str_replace не будет работать для вас (если вы не хотите, чтобы "perl" в "superlative" был ключевым словом), вам нужно что-то, что учитывает границы слов (например, preg_replace с помощью \b). Конечно, вы не можете предварительно создать все 3000 ключевых слов сразу, но один документ вряд ли может содержать их все, поэтому я бы предложил предварительно проиндексировать все документы, например, поддерживая индексную таблицу doc_id- > word_id. При обслуживании определенного документа запрашивайте индекс и заменяйте только те ключевые слова, которые фактически содержат документ (предположительно не более 100).

С другой стороны, если документы коротки, поддержание индексной таблицы может не стоить проблем. Вы можете просто выполнить предварительную индексацию "на лету", например. с strpos:

 $kw = array();
 foreach($all_keywords as $k) if(strpos($text, $k)) $kw[] = $k;

 // $kw contains only words that actually occur in the text
 // (and perhaps some more, but that doesn't matter)

 preg_replace_callback('/\b(' . implode('|', $kw) . ')\b/',  'insert_keyword', $text)
1

str_replace довольно zippy и, насколько мне известно, самый быстрый, который вы найдете для PHP. Конечно, вы должны хранить кеш; что обойдет проблемы с производительностью.

  • 0
    Я согласен. Нет смысла использовать preg_replace, если у вас есть определенный набор слов.
0

Это всего лишь предложение ускорить процесс, уменьшить ошибки и т.д.

  • Создайте функцию, которая будет группировать архивы новостей.
  • Создайте функцию для замены текста. str_replace - моя ставка.
  • Создайте функцию для запуска процесса php. обратитесь к этому thread
  • Добавить функции кеширования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню