Приведенный ниже пример кода определяет наилучшее совпадение «идентификатор отдела» и «идентификатор категории» на основе ранга термина для «разных» продуктов.
Проблема, с которой я сталкиваюсь, заключается в попытке определить правильное значение термина (вес) для каждого совпадения, при этом окончательная запись счета не перезаписывается в массиве рангов.
Статические целые числа для значения термина могут привести к дублированию баллов. Я думаю, что float (1,10) или (2,10) будет лучше.
Какие-либо предложения?
Пример кода ниже:
<?php
$string = "EVGA GeForce GTX 980 Ti 6GB 384-Bit GDDR5 PCI Express 3.0 x16 HDCP Ready SLI Support";
$terms_array = array(
'10' => array(
'120' => 'Geforce, NVidia, GTX, Geforce GTX, Radeon, Radeon R7, Radeon R9, AMD, ATI, EVGA, Asus, PNY, MSI, Gigabyte, Sapphire Tech, VisionTek, XFX, SLI, CrossFire, CrossFireX',
'121' => 'term, term, term'
),
'12' => array(
'115' => 'term, term, term',
'181' => 'term, term, term'
),
);
Function Get_Top_Rank($string, $terms_array) {
$result = "";
$ranks = array();
$termvalue = 10;
foreach ($terms_array as $key1 => $val1) {
foreach ($val1 as $key2 => $val2) {
$score = 0;
$terms = explode(",", $val2);
foreach ($terms as $word) {
IF (stripos($string, $word) !== false) {
$score += termvalue;
}
}
$ranks[''.$score.''] = array('key1' => $key1, 'key2' => $key2);
}
}
/*
Example Ranks Result
array(
'130' => array('key1' => '10', 'key2' => '120'),
'20' => array('key1' => '10', 'key2' => '121'),
)
*/
IF (!empty($ranks)) {
krsort($ranks);
$result = reset($ranks);
}
return $result; // array('key1' => '10', 'key2' => '120')
}
?>
Я решил пойти со следующим.
<?php $score += round((strlen($word) * 1.987654321), 8); ?>
Других решений пока нет …