поиск подстрок из нескольких массивов категорий в PHP - PullRequest
1 голос
/ 06 декабря 2011

У меня есть кусок текста, длина которого составляет около 1500 слов.Я должен искать вхождения определенных слов в этом тексте и группировать их по категориям.Например, если найдено какое-либо из следующих слов: «далматин», «боксер», «терьер», тогда выводится «Клыки», если найдены «лев», «леопард», «чита», то выводится «Кошачий»" и так далее и тому подобное.Слова, найденные в других словах, также допустимы, например, "foxterrier".

В настоящее время я использую следующее для прохождения строки:

$arrTitle = explode(" ", "Loren ipsum dolor ...............");
// For dogs:
foreach( $arrTitle as $key => $value){
    echo "Name: $key, Value: $value <br />";
    $words = array("dalmation", "boxer", "terrier");
    foreach($words as $word){
        if (stripos($value, $word) !== false) {
            echo "Canines Exists";
        }
    }
}

//For cats:
foreach( $arrTitle as $key => $value){
    echo "Name: $key, Value: $value <br />";
    $words = array("lion", "leopard", "cheeta");
    foreach($words as $word){
        if (stripos($value, $word) !== false) {
            echo "Felines Exists";
        }
    }
}

// ...Repeat the above for all categories.

Обработка занимает много времени, а также яЯ не уверен, что это самый эффективный способ ведения дел.Кто-нибудь может помочь мне найти более быстрый способ сделать это?Ваша помощь будет наиболее ценной.

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

Вы находитесь здесь, в моем районе!

Самый быстрый способ - это array_flip, а затем использовать isset, чтобы проверить, существует ли слово, у меня ушло много времени, чтобы понять это.,Это останется практически мгновенным для буквально миллионов слов (поиск в строке или массиве никогда не будет соответствовать этому по скорости), но в таких случаях он может съесть оперативную память.

Сначала вы должны набрать $words.

$arrTitle = strtolower($arrTitle);
$arrTitle = explode(' ', $arrTitle);

$words=array('dalmation', 'boxer', 'terrier');
$words=array_flip($words);

foreach($arrTitle as $key => $value)
    {
    echo "Name: $key, Value: $value <br />";
    if (isset($words[$value])) echo $value.' Exists <br/>';
    }
2 голосов
/ 06 декабря 2011

Вы можете составить регулярные выражения для похожих слов, а затем выполнить поиск по каждому из них.Регулярные выражения не невероятно быстрые, но они быстрее, чем запуск ваших собственных циклов в PHP.: -)

$groups = array(
  'Canines' => array("dalmation", "boxer", "terrier"),
  'Felines' => array("lion", "leopard", "cheeta")
);

foreach ($groups as $group => $members) {
  $pattern = "/" . implode("|", $members) . "/i";
  if (preg_match($pattern, $src)) {
    print $group;
  }
}

Мета-код.Я не проверял это.

Идея состоит в том, чтобы удалить фактические группы из вашего кода.В конце концов, ваши данные могут быть загружены из базы данных или другого источника;структура данных и данные должны быть отдельными.

Используя массивы, как указано выше, вы можете добавлять новые группы, не изменяя при этом код сравнения.Т.е. «Рыба» становится группой, а не куском кода.

1 голос
/ 06 декабря 2011

В качестве оптимизации для вашего текущего скрипта вы должны проверять все слова в одном цикле, а не запускать foreach для $ arrTitle несколько раз. Или, в качестве альтернативы, просто используйте полосы на весь документ для каждого слова.

Если это для реального рабочего сайта и его нужно многократно запускать, я бы вообще не делал этого на PHP. База данных (MySQL или Solr) с соответствующим индексом для ваших документов даст гораздо более быстрые результаты.

...