Wie die häufigsten Substantive ausgeben?

Danke.

Ich habe nun das Arrays sortiert mit folgendem Inhalt: Array ( [Welt] => 3 [Deutschland] => 2 [Eric] => 1 [Europa] => 1 [Land] => 1 [Hallo] => 1 )

Wie kann ich denn nun die ersten drei Werte ausgaben lassen, also: Welt, Deutschland, Eric

Danke herzlichst
Buzzi
 
Vielleicht so:
PHP:
$keys = array_keys($ausgabe);

$a = 3; // Die häufigsten 3

for($i = 0; $i < $a; $i++) {
    $words[] = $keys[$i];
}

$words; // hier sind jetzt die n-häufigsten Substantive drin
 
array_slice ist da einfacher....
PHP:
<?php 
//Testdaten
    $ausgabe = array('Hallo', 'Hallo', 'C', 'D', 'D', 'D', 'E', 'E', 'Welt');
    $countedWords = array_count_values($ausgabe);
print_r($countedWords);
    asort($countedWords, SORT_NUMERIC);
print_r($countedWords);
//der eigentliche Teil
    $words = array_slice($countedWords, -3);
print_r($words);
?>
 
Bitte.
Auch das aufteilen in die Haubtwörter würde ich vollständig mit regulärem Ausdruck machen....

Der ganze Code:
PHP:
    $n = 3;
    $text = "Hallo Welt. Ich bin Eric von Welt. Ich komme aus Deutschland. Das Land Deutschland liegt in Europa. Europa ist in der Welt.";
    //Alle Haubtwörter in den Array $token extrahieren (Vorsicht, doppelter array!)
    preg_match_all('/[A-Z][\w]+/', $text, $tokens);     
    //Die Treffer zählen
    $countedWords = array_count_values($tokens[0]);
    //Sortieren
    arsort($countedWords, SORT_NUMERIC);
    //die ersten $n-Treffer auswählen  
    $words = array_slice($countedWords, 0, $n);
print_r($words);

@einfach nur Crack
Warum ist ebi deinem PHP-Tag eine Zeilennummerierung drin und bei mir nicht?
 
Zuletzt bearbeitet:
PHP:
$text = "Dieser Text ist nur ein Text, um zu zeigen, dass dieses kleine Script gut ";
$text .= "funktioniert. Wenn du weitere Ideen oder Verbesserungsvorschläge zu ";
$text .= "diesem Script hast, dann schreibe hier weitere Kommentare. ";
$text .= "Vielen Dank an alle, die mir bei diesem Script geholfen haben.";

echo "<b>Ausgangstext:</b> ".$text."<hr>";

//Alle Wörter durch Leerzeichen in ein Array aufspalten
$woerter = explode(" ",$text);

//Durchlauf auf alle Wörter im Array anwenden
for ($i = 0; $i < count($woerter); $i ++)
 {   
   //Filter festlegen für Wörter die Grossbuchstaben haben (Substantive)
   $substantiv_filter = "/^[A-Z]/";
     
   //Durchsucht alle Wörter aus Array, auf denen der Grossbuchstaben-Filter zutrifft 
   if(preg_match($substantiv_filter, $woerter[$i]))
    {
	  //Filter festlegen für Satzzeichen, die herausgefiltert werden sollen
	  $satzzeichen_filter = array(".", ",", ";", ":", "-", "(", ")", "\"");
	 
	  //Satzzeichenfilter auf Substantive mit Satzzeichen anwenden, Satzzeichen werden durch entfernt, alle Substantive in Array gespeichert
	  $substantive[$i] = str_replace($satzzeichen_filter, "", $woerter[$i]);
     }

    //Satzanfangswörter, da auch gross geschrieben, werden herausgefiltert
	if(substr($woerter[$i], strlen($woerter[$i])-1) == ".") 
	{
      $i++;	
    }
 }  

//Häufigkeit der vorkommenden Substantive wird gezählt
$substantive = array_count_values($substantive);

//Sortiere Substantive nach Häufigkeit, die Häufigsten sind die ersten im Array
arsort($substantive); 

//Wandelt die Array Keys um
$keys = array_keys($substantive);
 
//Festlegen, wieviele der häufigsten Substantive, z.B. die häufigsten 3
$a = 3; 

echo "<b>Die ".$a." häufigsten Substantive:</b> ";
//Substantive der Array Keys in neues auslesbares Array umwandeln, Ausgabe der häufigsten Substantive
for($i = 0; $i < $a; $i++) {
    $words[] = $keys[$i];
	echo $words[$i]." ";
}
 
Wenn man kurz googelt findet man die folgende elegante Lösung mit preg_match_all um Wörter die mit einem Grossbuchstaben anfangen und nicht am Satzanfang sind zu erkennen.

http://forum.de.selfhtml.org/archiv/2007/10/t160925/
Code:
/(?<![.!?] )\b[A-ZÄÖÜ][a-zäöüß]+/

Das ergibt kurz und bündig
PHP:
<?php 
    $n = 3;
$text = "Dieser Text ist nur ein Text, um zu zeigen, dass dieses kleine Script gut ";
$text .= "funktioniert. Wenn du weitere Ideen oder Verbesserungsvorschläge zu ";
$text .= "diesem Script hast, dann schreibe hier weitere Kommentare. ";
$text .= "Vielen Dank an alle, die mir bei diesem Script geholfen haben."; 
    //Alle Haubtwörter in den Array $token extrahieren (Vorsicht, doppelter array!)
    preg_match_all('/(?<![.!?] )\b[A-ZÄÖÜ][a-zäöüß]+/', $text, $tokens);     
    //Die Treffer zählen
    $countedWords = array_count_values($tokens[0]);
    //Sortieren
    arsort($countedWords, SORT_NUMERIC);
    //die ersten $n-Treffer auswählen  
    $words = array_slice($countedWords, 0, $n);
print_r($words);
?>
 
Um den ganzen Thread nochmals in zwei Funktionen zusammen zu fassen (auch wenn er schon sehr alt ist - aber das habe ich irgendwie vermisst):

PHP:
function getSubstantivesOf($text, $limit) {
	$text = str_replace("\r\n", "\n", $text);
	$text = str_replace("\n", " ", $text);

	$tokens = explode(" ", $text);
	
	for ($i = 0; $i < count($tokens); $i ++) {
		$pattern = "/^[A-Z]/";
		
		if(preg_match($pattern, $tokens[$i])) {
			$satzzeichen = array(".", ",", ";", ":", "-", "(", ")", "\"");
			$ausgabe[$i] = str_replace($satzzeichen, "", $tokens[$i]);
		}
		
		if(substr($tokens[$i], strlen($tokens[$i]) - 1) == ".") {
			$i++;
		}
	}
	
	$array = array_count_values($ausgabe);
	
	if (arsort(&$array, SORT_NUMERIC)) {
		$result = array();
		$i = 0;
		while(list($k, $v) = each($array)) {
			if ($i++ < $limit)
				array_push($result, $k);
		}
		return $result;
	}
	else {
		return null;
	}
}

PHP:
function getSubstantivesOf2($text, $limit) {
    preg_match_all('/(?<![.!?] )\b[A-ZÄÖÜ][a-zäöüß]+/', $text, $tokens);     
    $countedWords = array_count_values($tokens[0]);
    arsort($countedWords, SORT_NUMERIC);
    return array_slice($countedWords, 0, $limit);
}

Ausgabe mit print_r:

Code:
getSubstantivesOf > Array
(
    [0] => Talent
    [1] => Video
    [2] => Videofunktion
)

getSubstantivesOf2 > Array
(
    [Talent] => 2
    [Videofunktion] => 2
    [Video] => 2
)

Der Text war in beiden Fällen identisch - logisch ;)
Ich nutze nun eine leicht modifizierte Version:

PHP:
function getSubstantivesOf($text, $limit, $minHits = null) {
	$text = str_replace("\r\n", "\n", $text);
	$text = str_replace("\n", " ", $text);
	
    preg_match_all('/(?<![.!?] )\b[A-ZÄÖÜ][a-zäöüß]+/', $text, $tokens);     
    $countedWords = array_count_values($tokens[0]);
    
    if (count($countedWords) > 0 && arsort(&$countedWords, SORT_NUMERIC)) {
    	$i = 0;
    	$result = array();
	    while(list($k, $v) = each($countedWords)) {
	    	if ($i++ < $limit && ($minHits == null || $v >= $minHits)) {
		    	array_push($result, $k);
	    	}
	    }
	    return $result;
    }
    else
    	return null;
}
 
Zuletzt bearbeitet:
Zurück