Распределение ключей по части слова при загрузке списком

232
29 марта 2017, 18:38

Здравствуйте. У меня стоит задача распределить ключевые слова по категориям при загрузке. Например, есть список:

картинки котиков
картинки котять
котики
котики вперед
котики картинки
котиков
котиков вперед
котятя
купить собаку
купить щенка
породы собак
собака
собаки фото
щенки
щенки месяц
щенки немецкой
щенки овчарки

Есть категории "Котики" и "Собаки". Каждой категории соответствуют части слов, которые могут определить категорию. Например, для "Котики": кот, кошк, котя, для "Собаки": собак, щенк. На самом деле и категорий и частей ключевых слов для отбора намного больше. Да и загружаются списки в несколько сот тысяч строк. Сейчас распределение происходит так:

$all_keys = explode("\r\n", $_POST['all_keys']);//разбиваем построчно
foreach($all_keys as $str_keys) {
$name_category = 'unsort';//категория по умолчанию, как несортированные
$cats_key = array ("кот", "кошк", "котя");//список частей ключей для определения категории
foreach ($cats_key as $cats) {
$poisk = stripos ($str_keys, $cats); //проверяем нежелательные слова
if ($poisk !== false)  {
$name_category = 'cats';
goto endsort;//если категория присвоена, то сразу записываем слово в базу
}
}
$dogs_key = array ("собак", "щенк");
foreach ($dogs_key as $dogs) {
$poisk1 = stripos ($str_keys, $dogs);
if ($poisk1 !== false) {
$name_category = 'dogs';
goto endsort;
}
}
endsort: mysqli_query ($db, "INSERT INTO keywords (keyword, theme_key) VALUES ('$str_keys', '$name_category')");
unset ($name_category);
}

Уверен, что есть более вразумительное решение. Если категории будут увеличиваться, кол-во частей слов тоже, то загрузка будет очень тяжелой с таким перебором каждого слова. Посоветуйте, как можно упростить процес разбора строки. Части ключей могут хранится в коде, в текстовом документе, в БД. Заранее спасибо. Дополню предназначение всего этого: Со статистики берутся ключевые слова сплошным списком. В системе готовятся страницы под тематики собак и котов отдельно. Так вот, чтобы оператору по собакам в форму попадали ключи только по собакам и происходит распределение

Answer 1

Тема интересная, и как всегда есть варианты.

На самом деле зависит от того как и для чего будет использоваться результат.

1) Надо, что бы поиск работал. Возьмите Sphinx, Solr, Elasticsearch, настройте радуйтесь ...

2) Самому побаловаться.

Я бы посммотрел в сторону Machine Learning https://github.com/php-ai/php-ml, http://php.net/manual/en/book.fann.php

Сразу скажу про машинное обучение ни чего не знаю, но что то такоe должно работать.

train.data

Первая строка, 1-е число количество тестов, 2-е количество вводов, 3-е резултат.

17 1 1
картинки котиков
cat
картинки котять
cat
котики
cat
котики вперед
cat
котики картинки
cat
котиков
cat
котиков вперед
cat
котятя
cat
купить собаку
dog
купить щенка
dog
породы собак
dog
собака
dog
собаки фото
dog
щенки
dog
щенки месяц
dog
щенки немецкой
dog
щенки овчарки
dog

train.php

<?php
    $num_input = 1;
    $num_output = 1;
    $num_layers = 2;
    $num_neurons_hidden = 3;
    $desired_error = 0.001;
    $max_epochs = 500000;
    $epochs_between_reports = 1000;
    $ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);
    if ($ann) {
        fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
        fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);
        $filename = dirname(__FILE__) . "/train.data";
        if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error))
            fann_save($ann, dirname(__FILE__) . "/evaluator.net");
        fann_destroy($ann);
    }

tester.php

<?php
    $train_file = (dirname(__FILE__) . "/evaluator.net");
    if (!is_file($train_file))
        die("The file evaluator.net has not been created!");
    $ann = fann_create_from_file($train_file);
    if (!$ann)
        die("ANN could not be created");

    $ev = function ($input) use ($ann) {
        // Validation
        return fann_run($ann, [$input]);
    }
    var_dump($ev("картинки котиков"));
    var_dump($ev("котятя"));
    var_dump($ev("породы собак"));
    fann_destroy($ann);
READ ALSO
Как обернуть каждую ссылку wp_list_categories в div?

Как обернуть каждую ссылку wp_list_categories в div?

Есть массив по выводу категорий в виде ссылокНужно каждую ссылку обернуть в div

281
Syntax error при вызове Yii::t()

Syntax error при вызове Yii::t()

Выполняю запрос

255
Вывод txt файлf с HTML тегами в php

Вывод txt файлf с HTML тегами в php

Имею текстовый файл с тегами:

262
Наполнить const char* данными из unsigned char

Наполнить const char* данными из unsigned char

Я формирую буфер из значений типа unsigned charЗначения хранятся в HEX, то есть 0x00, 0x2e и так далее

240