Замена ключевых слов в тексте с помощью php & mysql - PullRequest
0 голосов
/ 14 апреля 2010

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

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

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

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

Ответы [ 3 ]

1 голос
/ 14 апреля 2010

str_replace не будет работать для вас (если вы не хотите, чтобы "perl" в "превосходной степени" было ключевым словом), вам нужно что-то, что учитывает границы слов (например, 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 голос
/ 14 апреля 2010

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

0 голосов
/ 14 апреля 2010

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

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