0

我有一个新闻网站,其中包含超过 100 万条新闻的档案。我创建了一个包含约 3000 个条目的词定义数据库,由词定义对组成。

我想做的是在新闻中每次出现这些词的旁边添加一个定义。我无法进行静态更改,因为我可以每天添加一个新关键字,因此我可以使其成为实时或缓存。

问题是,astr_replace或 apreg_replace在文本中搜索 3000 个关键字并替换它们会非常慢。

有没有快速的替代品?

4

3 回答 3

1

str_replace 非常活泼,据我所知,它是 PHP 中最快的。您当然应该保留缓存;这将绕过性能问题。

于 2010-04-14T09:41:20.673 回答
1

str_replace 对您不起作用(除非您希望“最高级”中的“perl”成为关键字),您需要考虑单词边界的东西(例如 preg_replace with \b)。当然,你不能一次preg_replace所有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)
于 2010-04-14T10:08:04.633 回答
0

这只是加快流程,减少错误等的建议。

  1. 创建一个批处理新闻档案的函数。
  2. 创建一个函数来替换文本。str_replace 是我的赌注。
  3. 创建一个函数来生成 php 进程。参考这个线程
  4. 添加缓存功能。
于 2010-04-14T09:58:33.963 回答