2

ユーザーがブログ投稿などのテキストデータを入力し、リンクのテキスト内の「特別な単語」を置き換えるサービスを作成しようとしています。例えば:

ブログ投稿:

"...Pink Floyd were an English rock band that achieved international 
success with their progressive and psychedelic rock music..."

出力は次のようになります。

"...<a href="http://www.xxx.com?q=pink%20floyd">Pink Floyd</a> 
were an English <a href="http://www.xxx.com?q=rock%20band">rock band</a>
that achieved international success with their 
progressive and psychedelic rock 
<a href="http://www.xxx.com?q=music">music<a/>..."

ウィキペディアのようなものがあります!

一般的なアルゴリズムは非常に単純なようです。

  1. テキストから特殊文字を削除します。
  2. タグを削除します。
  3. テキスト全体を小文字にします。
  4. ストップワードを削除します。
  5. 残った単語についてはデータベースを参照してください。
  6. 元のテキストを取得し、データベースで一致した単語を置き換えます。

しかし、問題は、データベースで約100万語を処理していることです。私はそのためにPHPとMySQLを使用していますが、私の知る限り、PHPはおそらくテキスト処理に最適なツールではありません。

トラフィックとリクエストの数によっては、このアルゴルが非常に遅くなる可能性があるため、パフォーマンスが心配です。

これに対処するための別のツールや方法を見つけようとしました。たくさんのことを見つけましたが、そのどれもがその仕事に適したツールではないと思います。mysqlの全文検索、lucene、sphinx、solrの検索を見つけました。私が間違っている場合は訂正してください。ただし、この種の検索には適切なツールではないと思います。

誰かがこれに適切に対処する方法を私に提案できますか?

考慮事項:

  1. 残念ながら、テキストはポルトガル語の「pt-br」であり、これは問題になると思います。
  2. 完全な用語を取得する必要があります。上記の例では、「ロックバンド」を取得する必要があり、「ロック」と「バンド」に分割する必要はありません。
  3. 私は他のプログラミング言語についての深い知識を持っていませんが、もしそうなら、私は他のテクノロジーにもオープンです!

ありがとう

4

1 に答える 1

1

この問題のパフォーマンスについて心配する必要はありません。

あなたはいつでもすることができます:

  • データベースでインデックスを使用する
  • ストップワードデータベースまたは出力テキストにキャッシュ(たとえば、memcached)を使用する
  • sphinxを使用する(検索エンジン、MySQLで動作)
  • 書式設定されたテキストをデータベースに保持します(ストップワードデータベースを拡張するのがわかりにくい場合の最善の解決策)

また、db内のストップワードを検索するコードの例:

...
$words = strip_tags($origin);
$words = strtolower($words);
// strip anything (symbols, numbers, etc), keep only words
...
$words = explode(' ', $words);
$found = DB::query(Database::SELECT, "SELECT url, word FROM `stop_words` WHERE word IN (".implode(',',$words).")")->execute()->as_array(); // Kohana framework Database module
$patterns = array();
$replacement = array();
foreach($found AS $row)
{
  $patterns[] = '/('.$row['word'].')/i';
  $replacement[] = '<a href="'.$row['url'].'">$1</a>';
}
$origin = preg_replace($patterns, $replacement, $origin);
于 2012-06-27T15:46:54.570 に答える