2016-04-27 13 views
-2

は現在やってプロジェクトに取り組んで次与えられた文字列に類似した値の配列をチェックする方法は?

  1. は、(すべての良い)のテキストの大きな体に2と5単語間の最も一般的なフレーズを取得
  2. リターン$フレーズ=> $出現した配列

私は今、この配列内の各値を取り、その場合、配列の残りの部分で同様のものがあるかどうかを確認して、1にそれらをマージし、その発生を総括したいです。

similar_text()を使用して、フレーズとどれほど類似しているかを比較し、95より大きい場合はそれらをマージします。

これを行う最も効率的な方法は何ですか?私はミリ秒単位で最適化しようとしています。

今のところ、私はこれを使用しています...しかし、それは10/30k単語の記事を吸っています。特に私はそれらの数十をループしているので。

function merge_similar_phrases($original, $threshold = 90) { 

    foreach ($original as $phrase => $occurrences) { 

     foreach ($original as $s => $n) { 

      similar_text($phrase, $s, $percent); 

      if($percent > 92.5) { 

       $original[$phrase] = $occurrences + $n; 
       unset($original[$s]); 

      } 

     } 

    } 

    return $original; 

} 

ありがとうございます!

+4

あなたの現在のアプローチですか? – Nadir

+0

残念ながら、テキスト類似関数はPHPの実行時間がかなり悪いです。例えば、Levenshteinは、最悪の場合O(nm)を有する。 –

+0

あなたはsimilar_text()を "最適化"できません。それは何をするのでしょうか?また、独自のカスタムPHPバージョンをコンパイルすることを意味する、基礎となるPHPソースコードを最適化せずに変更することはできません。 –

答えて

0

パフォーマンスを向上させるには、foreachループを1つ節約して、array_filterに置き換えることができます。あなたは

(ドキュメント:http://php.net/manual/en/function.array-filter.phpで述べたように)ARRAY_FILTER_USE_KEYフラグを使用できるように5.6+ PHPを使用する必要が

foreach ($original as $phrase => $occurrences) { 

    $similarities = array_filter($original, function($key) use($phrase, $threshold) { 
     similar_text($phrase, $key, $percent); 
     if($percent > $threshold){ 
      return true; 
     } 
     return false; 
    }, ARRAY_FILTER_USE_KEY); 
    unset($similarities[$phrase]); 
    //do the magic with similarities 
} 

しかし、私はどのくらいの時間を確認していない:私はこのような心の何かを持っていますあなたはそれを行うことで余裕ができます..

関連する問題