Keyword-Funktion: wie Worte ausschließen ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
code
elefant
ergebnis
funktion
giraffe
golf
gorilla
katze
machen
nashorn
parameter
sonderzeichen
string
teil
text
treffer
type
wort
zeichen
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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);
-
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 -
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
und / oder\p{Lu}
auch als "Treffer" gelten ??\p{Ll}
Beitrag zuletzt geändert: 16.10.2012 11:50:50 von hostfree -
hostfree schrieb:
Das liegt einfach an einem fehlerhaften Regex
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 ?
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
Zeichen lang sein und können nur (UTF-8-)Buchstaben enthalten.$xlength + 1
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage