STRAN.SI

Algoritem ujemanja v PHP

Iz prakse: serializirani array odgovorov, NUJNO / NUJNO POGOJ / SPREJEMLJIVO, barvni kod ujemanja, optimizacija.

← Vsi članki
Aplikacije 10 min branja

Iz prakse: serializirani array odgovorov, NUJNO / NUJNO POGOJ / SPREJEMLJIVO, barvni kod ujemanja.

Kaj je algoritem ujemanja?

Algoritem ujemanja primerja odgovore dveh ali več uporabnikov in izračuna numerično vrednost kompatibilnosti. To je osnova dating aplikacij (Tinder, Bumble), B2B partner matching platform, HR talent matching, recruitment screening-a.

V Sloveniji smo gradili tak sistem za MatchMe.si – platformo za partner matching.

Osnovni princip

Vsako vprašanje ima:

  • Odgovor uporabnika: kako on/ona odgovarja
  • Pričakovanje od partnerja: kako bi rad/a, da partner odgovori
  • Uteženost: NUJNO / NUJNO POGOJ / SPREJEMLJIVO / NEPOMEMBNO

Storage: serializiran array

V MatchMe-ju vsakemu uporabniku shranimo:

$user_answers = [
  'q1_own'      => 'A',   // moj odgovor
  'q1_expect'   => ['A', 'B'], // pričakovanje (sprejemljiva oba)
  'q1_weight'   => 'NUJNO',
  'q2_own'      => 'C',
  'q2_expect'   => ['B', 'C'],
  'q2_weight'   => 'SPREJEMLJIVO',
  // ...
];

// Shranimo serializirano v MySQL TEXT polje:
$serialized = serialize($user_answers);

Algoritem ujemanja – pseudocode

function calculate_match($user_a, $user_b) {
    $score = 0;
    $max_score = 0;
    $hard_fail = false;

    foreach ($user_a as $key => $val) {
        if (str_ends_with($key, '_own')) {
            $q = str_replace('_own', '', $key);

            // A pričakuje B-jev odgovor v tem vprašanju
            $expected_by_a = $user_a[$q . '_expect'] ?? [];
            $b_answer      = $user_b[$q . '_own'] ?? null;
            $weight_a      = $user_a[$q . '_weight'] ?? 'NEPOMEMBNO';

            $points = match($weight_a) {
                'NUJNO'           => 10,
                'NUJNO POGOJ'     => 7,
                'SPREJEMLJIVO'    => 3,
                'NEPOMEMBNO'      => 0,
            };

            $max_score += $points;
            if (in_array($b_answer, $expected_by_a)) {
                $score += $points;
            } elseif ($weight_a === 'NUJNO') {
                $hard_fail = true;
            }
        }
    }

    if ($hard_fail) return 0; // NUJNO ni izpolnjen
    return $max_score > 0 ? ($score / $max_score) * 100 : 0;
}

Barvni kod ujemanja

Rezultat (0–100 %) prikažemo z barvami:

  • 75–100 % – zeleno (visoko ujemanje)
  • 50–74 % – oranžno (srednje ujemanje)
  • 0–49 % – sivo (nizko ujemanje)
  • 0 % (hard fail) – rdeče (NUJNO ni izpolnjen)

Pomembna podrobnost: dvosmernost

Ujemanje A na B ni isto kot B na A. A lahko ima visoke zahteve, B nizke. Zato izračunamo oba smer:

$a_to_b = calculate_match($user_a, $user_b); // 80%
$b_to_a = calculate_match($user_b, $user_a); // 65%

// Prikaz:
// "A ima 80% ujemanje z B"
// "B ima 65% ujemanje z A"
//
// Ali poprečje:
$average = ($a_to_b + $b_to_a) / 2; // 72.5%

Optimizacija za večje populacije

Pri 10.000 uporabnikih je primerjava vsakega z vsakim 100 milijonov primerjav. Optimizacije:

  • Pre-filter po hard NUJNO kriterijih (npr. starost, lokacija) – takoj izloči nemogoče.
  • Cache rezultatov – pri redki spremembi odgovorov.
  • Pre-compute embeddings (vektorska podobnost) za hiter top-N filter.
  • Background job (cron / queue) namesto realnega časa.

B2B variacije

Isti algoritem deluje za:

  • Partner matching: poslovni partnerji po panogi, velikosti, geografiji.
  • Recruitment: kandidati po veščinah, izkušnjah, pričakovanjih.
  • Investor matching: investitorji × startupi.
  • Mentor matching: mentorji × mentee-ji.

Implementacija pri MatchMe.si

Pri MatchMe.si smo zgradili:

  • Vprašalnik s ~50 vprašanji, vsako z lastnim weight-om
  • Profili z fotografijo, kratko predstavitvijo
  • "MATCH" administracijo (kdo komu poslan match request)
  • Squalomail integracijo za masovno e-pošto
  • Naročila in PDF račune
  • Dogodke (offline druženja za matched pare)

Imate vprašanje glede članka ali konkretnega primera?

Pošljite kratek opis svojega primera. Odgovorimo z realno usmeritvijo – tudi če ne potrebujete naših storitev.

Pokliči Povpraševanje