Zadejte hledaný výraz...

Problém se strpos(

Sedím u toho už 3 hodiny a obracím se na Vás s prozbou o vyřešení trpaslíkového efektu :)
// vypisujeme popisy a k nem potrebujeme priradit kategorii
foreach ($vypis as $popis)
{
$kategorie_id = "0";
$vyhledavana_kategorie = sql_all("SELECT nazev,ide FROM kategorie_id");
foreach ($vyhledavana_kategorie as $hledam)
{
$vyhledane_slovo = strpos($popis,$hledam);
// pokud slovo najde, zapiseme kategorii
if ($vyhledane_slovo >= "1") {
$kategorie_id = $hledam;
break; // ukoncime hledani
}
}
}
Má to hledat v $popis, kde text má přiřadit do určité kategorie, tak že mám kategorie_id, kde mám naházené různé slova. Pokud je strpos detekuje, přiřadí k tomu ID kategorie.
Bohužel nechápu jednu věc, proč když v $popis není věta o pobytu, ubytování, ale o masáži, tak to prostě hodí jako pobyt a to i přes to, že masáž patří do kategorie masáž.
Udělal jsem si i echo výpis a takhle to vypadá. Mě to už leze na mozek :( Přitom očividně u posledních dvou není v popisu zmínka o pobytu, přesto strpos to detekuje. Není to divné?
Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (24.-26.5.2011) v pensionu s bazénem a saunou
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)
Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (17.-19.5.2011) v pensionu s bazénem a saunou
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)
Medová masáž zad ... 60 minut ... rozkošné ... :)
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)
Káva ... BORBONE RED VENDING 0,5kg zrno
Kategorie_ID: 5 (Nalezeno slovo: pobyt - znak 28)
17. 3. 2011 14:11:42
https://webtrh.cz/diskuse/problem-se-strpos/#reply619863
Ahoj, nemuze to byt tim, ze v podmince $vyhledane_slovo >= "1" mate retezec namisto cisla? Nejspis tam nastava nejaka imlicitni konverze... podle dokumentace strpos vraci int.
Strilim od boku pouhym koukanim...
Michal
17. 3. 2011 14:28:04
https://webtrh.cz/diskuse/problem-se-strpos/#reply619862
Ne ne, tímto to není. Můžu tam klidně doplnit if ($vyhledane_slovo !== false) a nepomůže to.
Na diskusi jakpsatweb.com mě jeden uživatel napsal:
Je to proto, že na začátku to najde slovo pobyt, do $kategorie_id se zapíše pobyt ale jelikož to nic jiného nenajde, v proměnné zůstane pobyt. Máš to špatně navržené.
Bohužel jsem vyčerpal snad vše, co by to mohlo ovlivnit a proto potřebují druhý mozek :)
17. 3. 2011 14:31:16
https://webtrh.cz/diskuse/problem-se-strpos/#reply619861
me by spis zajimalo toto "if ($vyhledane_slovo >= 1)"
17. 3. 2011 14:42:51
https://webtrh.cz/diskuse/problem-se-strpos/#reply619860
hm
verified
rating uzivatele
(20 hodnocení)
17. 3. 2011 14:45:15
pridej na konec druheho foreache toto:
unset($vyhledane_slovo);
17. 3. 2011 14:45:15
https://webtrh.cz/diskuse/problem-se-strpos/#reply619859
Bohužel ani ťuk.
17. 3. 2011 14:49:45
https://webtrh.cz/diskuse/problem-se-strpos/#reply619858
Jak vidno tak si to pamatuje obsah proměnných = nenulují se. Přijde mi tvá konstrukce celkem dosti složitá (osobní pocit)
17. 3. 2011 15:48:27
https://webtrh.cz/diskuse/problem-se-strpos/#reply619857
Bohužel ale jinou kontrukci než tuto nesložím.
Potřebuji jediné. Přiřadit POPIS ke kategorii. Přiřaření je závislé na uložených slovech v mySQL, kde v případě identifikace tohoto slova v POPIS se vypíše IDE daného slova, což ve výsledku bude identifikační číslo kategorie, které se pak k danému POPIS přiřadí.
17. 3. 2011 16:20:41
https://webtrh.cz/diskuse/problem-se-strpos/#reply619856
Snad jsem to pochopil dobre... ja bych to zkusil takto: projet klicove slova z db a postupne zjistovat pritomnost v textu (v poli)... pokud je shoda, id katagorie mas ziskane
require "conn_db.php";
$vypis=array(
'Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (24.-26.5.2011) v pensionu s bazénem a saunou',
'Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (17.-19.5.2011) v pensionu s bazénem a saunou',
'Medová masáž zad ... 60 minut ... rozkošné ... :)',
'Káva ... BORBONE RED VENDING 0,5kg zrno'
);
$q=mysql_query("SELECT nazev,ide FROM kategorie_id");
while($v=mysql_fetch_array($q)) {
$nazev=$v; $ide=$v;
foreach ($vypis as $a) {
if(strpos($a,$nazev)) { echo "OK -> $a || Ktg: $ide
"; }
}
}
17. 3. 2011 17:32:23
https://webtrh.cz/diskuse/problem-se-strpos/#reply619855
ViPErCZ
verified
rating uzivatele
(21 hodnocení)
17. 3. 2011 17:43:18
Omg to je konstrukce teda :-D
Koukám PHP Vám jde, ale ta čeština je děsná :-D
Ale k věci... díval jste se vůbec co posíláte do té konstrukce?
$vyhledane_slovo = strpos($popis,$hledam);
$hledam bych hádal bude mít jinou indexaci než číslo... co takhle $hledam;
Dále určitě jak tu někdo radil: if ($vyhledane_slovo >= "1") { na if ($vyhledane_slovo >= 1) { (int není string).
Každopádně jsem nepochopil tu logiku přiřazování podle nějakého popisu k nějaké kategorii. Možná zkusit následně osvětlit pokud nezaberou rady. ;-)
17. 3. 2011 17:43:18
https://webtrh.cz/diskuse/problem-se-strpos/#reply619854
To není problém se strpos(), ale s celým tímto rozkošným brute-force kódem. Proměnné jsou pojmenované schválně tak, aby každého zmátly (vypis, popis, vyhledavana_kategorie), štítkům, respektive klíčovým slovům se říká kategorie a jejich seznam se načítá v každém cyklu znovu.
V závislosti na tom, čeho chcete dosáhnout (automaticky oštítkovat nabídky v agregátoru slev, předpokládám) a jak to má být přesné, bych začal hledat spíš tímto směrem:
http://stackoverflow.com/questions/67725/is-there-an-algorithm-that-extracts-meaningful-tags-of-english-text
http://en.wikipedia.org/wiki/Tf-idf
http://en.wikipedia.org/wiki/Dimension_reduction
http://lingea.cz/nastroje.asp?v=ful
Když už byste se chtěl ale držet svého postupu, tak spíš nástřelem
$titleTags = array();
foreach($titles AS $titleKey => $title)
{
$titleTags = array();
$title = cleanTitle($title);
$kwds = explode(' ', $title);
$kwds = array_map("normalizeKwd", $kwds);
foreach($kwds AS $kwd)
{
$tagId = getTagId($kwd);
if(false !== $tagId)
{
$titleTags[] = $tagId;
}
}
}
/**
* Cleans the title
* @param string $title The title to be cleaned
* @return string Cleaned title
*/
function cleanTitle($title)
{
// Remove punctuation ...
return $title;
}
/**
* Normalizes the keyword
* @param string The keyword to normalize
* @return string The normalized keyword
*/
function normalizeKwd($kwd)
{
$kwd = mb_strtolower($kwd);
// Get the lemma, stem ...
return $kwd;
}
/**
* Return the tag ID from the set of tags if it exists, or return false
* @param string $kwd The keyword to look for in the set of tags
* @return mixed ID of the found tag or false if not found
*/
function getTagId($kwd)
{
static $kwdSpace = array();
if(!isset($kwdSpace))
{
$kwdSet = sql_all("SELECT nazev,ide FROM kategorie_id");
foreach($kwdSet AS $kwdPair)
{
$kwdSpace] = $kwdPair;
}
}
if(isset($kwdSpace))
{
return $kwdSpace;
}
return false;
}
Samozřejmě by bylo lepší to ještě zapouzdřit - sadu štítků do jedné třídy, její načtení z DB do jiné třídy...
Ale hlavně načtěte štítky jen jednou, uložte je do pole se štítkem jako klíčem a ID jako hodnotou, protože je mnohem rychlejší testovat existenci klíče než hodnoty (princip hash table).
A nedělejte to při každém zobrazení stránky, ale jen poprvé při načtení slevy a výsledek si pak uložte.
17. 3. 2011 18:40:54
https://webtrh.cz/diskuse/problem-se-strpos/#reply619853
killme
verified
rating uzivatele
(1 hodnocení)
18. 3. 2011 00:13:13
taky ti přihodim jeden bruteforce skript, aby to nebylo tak fádní, tak ten nejsložitější a nejzmatenější, co jsem vymyslel
mb_internal_encoding("UTF-8");
$vypis = array(
'Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (24.-26.5.2011) v pensionu s bazénem a saunou',
'Na Šumavě je krásně ... pobyt pro 2 na 2 noci, bezva hotel, s polopenzí - na snídani káva, na oběd 2x káva. !!!MASÁŽ!!! - každý den v ceně (17.-19.5.2011)',
'Medová masáž zad ... 60 minut ... rozkošné ... :)',
'Káva ... BORBONE RED VENDING 0,5kg zrno',
'tohle je text bez kategorie...'
);
//$vyhledavana_kategorie = sql_all("SELECT nazev,ide FROM kategorie_id");
// nevim, co to vrací, předpokládám, že nějaký pole, které vypadá zhruba takhle, pokud ne, tak bys to sem mohl dumpnout
$vyhledavana_kategorie = array(
array('pobyt', 5),
array('ubytováni', 6),
array('hotel', 7),
array('káva', 8),
array('masáž', 9),
array('blablabla', 10)
);
$findCategories = function(&$val, $key, array $params) {
$categories = $params;
$defaultId = isset($params) ? (int) $params : 0;
$popis = (string) $val;
$arr = array();
foreach ($categories as $category) {
if (false !== mb_stristr($popis, $category)) {
array_push($arr, $category);
}
}
$arr = (0 === count($arr)) ? array($defaultId) : $arr;
$val = array(
'popis' => $popis,
'categories' => $arr
);
};
array_walk_recursive($vypis, $findCategories, array($vyhledavana_kategorie, 0));
var_dump($vypis);
vznikne tohle
array
0 =>
array
'popis' => string 'Na Šumavě je krásně ... pobyt pro 2 na 2 noci s polopenzí (24.-26.5.2011) v pensionu s bazénem a saunou' (length=109)
'categories' =>
array
0 => int 5
1 =>
array
'popis' => string 'Na Šumavě je krásně ... pobyt pro 2 na 2 noci, bezva hotel, s polopenzí - na snídani káva, na oběd 2x káva. !!!MASÁŽ!!! - každý den v ceně (17.-19.5.2011)' (length=168)
'categories' =>
array
0 => int 5
1 => int 7
2 => int 8
3 => int 9
2 =>
array
'popis' => string 'Medová masáž zad ... 60 minut ... rozkošné ... :)' (length=54)
'categories' =>
array
0 => int 9
3 =>
array
'popis' => string 'Káva ... BORBONE RED VENDING 0,5kg zrno' (length=40)
'categories' =>
array
0 => int 8
4 =>
array
'popis' => string 'tohle je text bez kategorie...' (length=30)
'categories' =>
array
0 => int 0
minimální konfigurace: php 5.3 (kvuli anonymni funkci)
18. 3. 2011 00:13:13
https://webtrh.cz/diskuse/problem-se-strpos/#reply619852
Pro odpověď se přihlašte.
Přihlásit