3

サイズが約 5.8 MB で、560,000 語を含む「単語」のファイルがあります。結合された文字列から実際の単語を取得するために使用しています。

たとえば、greenbananatruckはそのような文字列である可能性があります。

私はこの関数を非常に速いペースで使用するために書きました。しかし、 0.5 秒より速くすることはできません。8 コア プロセッサ、8 GB RAM のサーバーを使用しています。実際にはCPUは問題ではなく、問題はRAMです。このプロセスを複数のインスタンスで迅速かつ効率的に実行できる必要があります。

public function wordSplitReal( $str ){

  $words = array_filter( $this->dict, function($word) use(&$str) {
      $pos = strpos( $str, $word );
      if ( $pos !== false ){
          $str = substr_replace($str, "", $pos, strlen($word));
          return true;
      }
      return false;
  } );

  return $words;

}

それは非常に簡単です。私が実際に行っているのは、配列「dict」を特定の文字列に含まれる単語のみに「フィルタリング」することです。(複数の単語には興味がありません。) dict は、最長の単語から最短の単語の順に並べ替えられています。すべて小文字のみ。この関数は、シングルトンを使用するより大きなクラスの一部です。

どんな助けでも大歓迎です。

4

1 に答える 1

1

配列は線形時間でアクセスするため、ジョブには不適切なツールです (お気づきのように、辞書には遅すぎます)。おそらく試してみたいと思うでしょう。検索すると、いくつかの PHP 実装があります。(私は PHP トライ ライブラリの経験がないので、お勧めできません。)

アルゴリズムの概要は次のようになります。

While string is non-empty
  For all prefixes of str in decreasing order:
    If it is in trie:
      Drop the prefix
      Add it to the result array
      Next iteration of outer loop
  Return failure
Return result array

(このアルゴリズムは、バックトラッキングを実装していないため、あまり洗練されていません。読者の課題として残しておきます :p )

于 2013-06-05T01:45:35.720 に答える