В данный момент работаем над проектом занимаемся следующим:
Теперь я хочу взять каждое значение в этом массиве и проверить, есть ли подобное в остальной части массива, и если да, объединить их в одно и суммировать их вхождения.
Я хочу использовать 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;
}
Спасибо!
для повышения производительности вы можете сохранить один цикл foreach и заменить его на array_filter. я имею в виду что-то вроде этого:
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
}
Вы должны использовать php 5.6+, чтобы иметь возможность использовать флаг ARRAY_FILTER_USE_KEY (как упомянуто в документации: http://php.net/manual/en/function.array-filter.php)
Но я не уверен, сколько времени вы можете сэкономить, делая это ..
Других решений пока нет …