Как проверить массив на значения, похожие на заданную строку?

В данный момент работаем над проектом занимаемся следующим:

  1. Подберите наиболее распространенные фразы от 2 до 5 слов в большом тексте (все хорошо)
  2. Вернуть массив с $ фразу => $ вхождений

Теперь я хочу взять каждое значение в этом массиве и проверить, есть ли подобное в остальной части массива, и если да, объединить их в одно и суммировать их вхождения.

Я хочу использовать 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;

}

Спасибо!

-2

Решение

для повышения производительности вы можете сохранить один цикл 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)

Но я не уверен, сколько времени вы можете сэкономить, делая это ..

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]