0

100 万件を超えるニュースのアーカイブを含むニュース サイトを持っています。単語と定義のペアで構成される、約 3000 エントリの単語定義データベースを作成しました。

私がやりたいことは、ニュースでこれらの単語が出現するたびに定義を追加することです. 毎日新しいキーワードを追加できるため、静的な変更を行うことはできません。そのため、リアルタイムまたはキャッシュにすることができます。

問題は、astr_replaceまたは apreg_replaceがテキスト内の 3,000 のキーワードを検索して置換するのに非常に時間がかかるということです。

速い代替手段はありますか?

4

3 に答える 3

1

str_replace は機能しません ("最上級" の "perl" をキーワードにしたい場合を除く)。単語の境界を考慮した何かが必​​要です (例: preg_replace with \b)。もちろん、一度に 3000 個のキーワードすべてを preg_replace することはできませんが、1 つのドキュメントにそれらすべてを含めることはほとんどできません。したがって、たとえば、インデックス テーブル 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 に答える
1

str_replace は非常に高速で、私の知る限り、PHP で最も高速です。必ずキャッシュを保持する必要があります。これにより、パフォーマンスの問題が回避されます。

于 2010-04-14T09:41:20.673 に答える
0

これは、プロセスを高速化し、エラーを減らすための単なる提案です。

  1. ニュース アーカイブをバッチ処理する関数を作成します。
  2. テキストを置き換える関数を作成します。str_replace は私の賭けです。
  3. PHP プロセスを生成する関数を作成します。このスレッドを参照してください
  4. キャッシング機能を追加。
于 2010-04-14T09:58:33.963 に答える