kostenloser Webspace werbefrei: lima-city


Keyword-Funktion: wie Worte ausschließen ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    erlebnis

    erlebnis hat kostenlosen Webspace.

    Hallo

    ich habe eine kleine Funktion, die mir aus einem Text die Keywords holt:
    (nur die mit Großbuchtsaben beginnen oder nur aus Großbuchstaben bestehen und eine mindest-Zeichen-Länge haben)

    // ------------------------------------------------------------------ 
    // --- Parameter:     $string     (string) Beschreibung / Text (UTF-8) 
    // --- Parameter:     $length     (int) mindest Länge (Zeichen) je Wort
    // --- Parameter:     $maxkey     (int) maximale Anzahl der Keywords
    // ------------------------------------------------------------------ 
    
    function get_keywords( $string, $length=5, $maxkey=30) {
        
        $xlength = ($length-1); 
        $kdata1 = array(); 
        
        $pattern1 = '/[\p{Lu}]{1}+[(\p{Lu}|\p{Ll})]{'.$xlength.',}/u';  // --- utf-8 --- 
        
        preg_match_all($pattern1, $string, $kdata1);
        
        $kdata2 = array_count_values($kdata1[0]); 
        arsort($kdata2); 
        
        $kdata3 = array_keys($kdata2); 
        $out_arr = array_slice($kdata3, 0, $maxkey); 
        
        return $out_arr; 
    }
    
    
    // ------------------------------------------------------------------


    Wie kann ich da jetzt eine Liste an Worten einfügen, die nicht zu Keywords werden sollen
    also quasi eine Black-List, z.B. ein Array of Keywords, die ausgeschloßen werden sollen

    am besten gleich schon in der Funktion, $blacklist als Parameter-Übergabe oder global definiert.

    $blacklist = array('Elefant', 'Katze'); 
    
    $text = 'Der Gorilla und das Nashorn spielen Golf mit dem Elefant und der Giraffe'; 
    $keyw = get_keywords($text); 
    
    // Ergebnis: $keyw = array( 'Gorilla', 'Nashorn', 'Elefant', 'Giraffe');


    Wie kann ich jetzt die $blacklist in die Funktion einbauen,
    damit diese Wote dann nicht im Ergebnis ankommen ? ... (hier im BSP ohne: Elefant)

    Danke!



    Beitrag zuletzt geändert: 13.10.2012 12:31:35 von erlebnis
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Versuch es mal so:
    function get_keywords_blacklist($string, $blacklist = array(), $length = 5, $maxkey = 30) {
    	$keyw = array_diff(get_keywords($string, $length, $maxkey), $blacklist);
    	asort($keyw);
    	return $keyw;
    }
    
    $blacklist = array('Elefant', 'Katze');
    
    $text = 'Der Gorilla und das Nashorn spielen Golf mit dem Elefant und der Giraffe';
    $keyw = get_keywords_blacklist($text, $blacklist);
    
    // Ergebnis ausgeben
    header('content-type: text/plain');
    print_r($keyw);
  4. Autor dieses Themas

    erlebnis

    erlebnis hat kostenlosen Webspace.

    ok ... Danke ... array_diff() ... vergleicht Arrays und gibt die Unterschiede zurück.

    also gleich alles in einer Funktion dann wohl so:
    (habe noch $ype dazu gemacht für Rückgabe-Format)

    // --------------------------------------------------------------------
    // -------------------- function: get_keywords() ---------------------- 
    // --------------------------------------------------------------------
    // --- Parameter (1):     $string     (string) Beschreibung / Text (UTF-8) 
    // --- Parameter (2):     $blacklist  (array) nicht als Keyword verwenden 
    // --- Parameter (3):     $type       (string) Format: array, string, json 
    // --- Parameter (4):     $length     (int) mindest Länge (Zeichen) je Wort 
    // --- Parameter (5):     $maxkey     (int) maximale Anzahl der Keywords 
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------
    
    function get_keywords( $string, $blacklist=array(), $type='array', $length=5, $maxkey=20 ) {
    	
    	$xlength = ($length-1);
    	$kdata1 = array();
    	
    	$pattern1 = '/[\p{Lu}]{1}+[(\p{Lu}|\p{Ll})]{'.$xlength.',}/u'; 
    	
    	preg_match_all($pattern1, $string, $kdata1);
    	
    	$kdata2 = array_count_values($kdata1[0]);
    	arsort($kdata2);
    	
    	$kdata3 = array_keys($kdata2);
    	
    	if (!empty($blacklist))        { $kdata3 = array_diff($kdata3, $blacklist); } 
    	if (count($kdata3) > $maxkey)  { $kdata3 = array_slice($kdata3, 0, $maxkey); } 
    	
    	if (empty($type) || $type == 'array')   { $out = $kdata3; } 
    	            elseif ($type == 'json')    { $out = json_encode($kdata3); } 
    	            elseif ($type == 'string')  { $out = implode(',',$kdata3); } 
    	
    	return $out;
    }
    
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------



    ok, das if .. elseif ... für $type könnte man auch als switch() machen,
    aber ich glaube, das macht hier keinen großen Unterschied.

    ... mein TEST hat zumindest funktioniert:

    // ------ Ausgangs-Text ------
    $text = 'Der Gorilla und das Nashorn spielen Golf mit dem Elefant und der Giraffe';
    
    // ------ Keyword-Blacklist Array ------
    $nogo = array('Elefant', 'Katze'); 
    
    // ------ Aufruf der Funktion ------
    $keyw = get_keywords($text, $nogo, 'string'); 	
    
    // ------ Ergebnis: $keyw = 'Giraffe,Nashorn,Gorilla' ------
    print "<p>".$keyw."</p>\n";



    die Keywords werden ja schon nach Häufigkeit (Vorkommen) sortiert,
    und man bekommt das Ergebnis als Array oder als Komma getrennter String oder als JSON
    ... hat noch jemand ne Idee, ob (wie) man das noch "besser" machen kann ?

    bzw. meint Ihr dass das mit dem Format ($type) in dieser Funktion Sinn macht ?!?,
    oder "nur" Array Rückgabe, denn umformen kann man dann ja immernoch nach Bedarf



    Beitrag zuletzt geändert: 13.10.2012 16:41:42 von erlebnis
  5. Hallo

    mit dem Pattern:
    $pattern1 = '/[\p{Lu}]{1}+[(\p{Lu}|\p{Ll})]{'.$xlength.',}/u';

    werden auch manche "Sonderzeichen" mit dem Keyword geliefert

    Beispiel:
    // ------ Ausgangs-Text ------
    $text2= 'Der Gorilla (und das Nashorn) spielen Golf mit dem Elefant (und der Giraffe)';
     
    $keyw2 = get_keywords($text2);


    Ergebnis: die "runde Klammer zu" ist Teil der Keywords ????

    array (
         [0] => Gorilla
         [1] => Nashorn)
         [2] => Elefant
         [3] => Giraffe)
    )


    Wie kann man verhindern, das die "runde Klammer zu" (oder andere Sonderzeichen)
    auch Teil des Keyword-Treffers sind ?
    ... weil sie mit
    \p{Lu}
    und / oder
    \p{Ll}
    auch als "Treffer" gelten ??



    Beitrag zuletzt geändert: 16.10.2012 11:50:50 von hostfree
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    hostfree schrieb:
    Ergebnis: die "runde Klammer zu" ist Teil der Keywords ????



    Wie kann man verhindern, das die "runde Klammer zu" (oder andere Sonderzeichen) auch Teil des Keyword-Treffers sind ?
    Das liegt einfach an einem fehlerhaften Regex ;-)

    Damit die Klammern nicht im Keyword enthalten sein dürfen (und auch ein paar andere Fehler nicht vorkommen können) kannst du dieses RegEx verwenden:
    $pattern1 = '/\p{Lu}{1}[\p{Lu}\p{Ll}]{' . $xlength . ',}/u';
    Das macht genau das was eigentlich gefragt ist: Keywords erkennen. Diese müssen mit einem Großbuchstaben anfangen, müssen mindestens
    $xlength + 1
    Zeichen lang sein und können nur (UTF-8-)Buchstaben enthalten.
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!