Autor Zpráva
Martin Hampl
Profil
Dobrý den, mám docela složitý netechnický problém. :)
Testuji vyhledávač který by měl fungovat tak, že zadáte název jídla a systém vám podle názvu vypíše nejbližší jídla. Problém je v tom, že nedokáži napsat aspoň trochu přesný algoritmus. Nejlepší bude, když uvedu příklad: Do input boxu zadám například "palačinky", systém bez problému najde "palačinky s jahůdkami,palačinky" atd.. Když zadám "Hovězí burger", tak mi to bohužel vypíše i "hovězí svíčkovou, hovězí steak" atd.. , nemohu to vypisovat podle nejlepších shod, protože se to má řadit podle vzálenosti :( . Zde je TESTOVACI verze: www.vyhledavacjidel.cz/beta.php
Napadlo mě vypisovat jenom absolutní shodu, ale v tom případě, kdyby někdo zadal "svíčková na smetaně", tak mu to nenajde svíčkovou.. Také mě napadlo rozeznávat přídavná jména podle koncovek a nebrat jejich shodu v potaz, ale to by potom při zadání "kuřecí steak", vypsalo pouze všechny jídla se shodou na slovo "steak". Napadá někoho něco? Moc děkuji za radu..
Sir Tom
Profil
Martin Hampl:
Též dobrý den,

PHP umí číselně vyjádřit shodu dvou řetezců: http://php.net/manual/en/function.similar-text.php.
Martin Hampl
Profil
Sir Tom:
Aha, to by mohlo řešit můj problém, musím tedy určit nějakej koeficient (délka řetězce/shoda) podle kterýho se rozhodovat, jestli se má výsledek zobrazit.. Zkusím děkuji.


Sir Tom:
Tak nad tím přemejšlím, asi to tak nepůjde, protože není shoda jako shoda, pokuď je shoda například "kuřecí steak" s "hovězí steak" 5 písmen, délka řetězce je 12, cca 42%. Cože je poměřně dost ale přesto špatně, protože oba výrazy znamenají úplně něco jiného. Naopak shoda "svíčková na smetaně s karlovarským knedlíkem" s "svíčková" 8 písmen, délka 44 cca 18% a přesto správně. Problém je určit jaké slovo důležité je, a jaké není. Nejlepší by bylo rozeznávat přidavná jména od podstatných ale to by asi taky nebylo řešení.. :(


Respektivě abych to ještě zamotal :) , jak poznat že přídávné jméno "hovězí" k podstatnému jménu "steak" je významově klíčové a je třeba porovnávat obě slova dohromady tzn "hovězí steak". A jak poznat, že přídavné jméno "hovězí" k podstatnému jménu "svíčková" není důležitý a vyhledat i slova vyhovující pouze na výraz "svíčková" . Je taky možný že to prostě nejde? že to prostě dokonalý udělat nejde?
Sir Tom
Profil
Martin Hampl:
Tak samozřejmě shodnost dvou řetezců můžeš řešit více kritérii než jenom číslem ze similar_text(); Vytvoř si funkci shodnost($str1, $str2), která bude vracet spočtenou shodnost dvou řetězců. Mezi kritéria může být délka řetezce, shodnost jednotlivých slov, shodnost celých řetězců, ... Kombinací těchto kritérií bys mohl dostat dobrý výsledky.

Počítač sám neví, že "hovězí steak" je lepší než "hovězí svíčková"...

Dále můžeš i jednotlivé názvy jídel otagovat a hledat i v nich.
Martin Hampl
Profil
To jsem udělal, porovnával jsem Abolutní shodnost, shodnost prvnich dvou slov, částečnou shodu s absolutní shodou zadaneho vyrazu atd... dohromady 6 kriterii... Teďka po teto diskuzi jsem tam přidal procentuální shodu a vytvořil jsem databází přídavných jmen týkajících se gastronomie a aplikoval vyjímku na první slovo ve výrazu a už to docela jde... :) . Děkuji za diskuzi Sir Tom
Tori
Profil
Martin Hampl:
A nemáte tam nějaké kategorie, na které byste mohl to vyhledávání omezit? Takže např. na zadání "hovězí burger" by se našly jen další burgery (= stejná kategorie), ale už ne h.steaky, protože ty byly třeba pod maso > hovězí > steaky. Nevím odhadnout, jestli by něco mohlo patřit do více kategorií zároveň - např. aby zadání "svíčková na smetaně" našlo jak "svíčková na něčem jiném", tak "králík na smetaně" (=společná nadkategorie maso).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: