Wie die häufigsten Substantive ausgeben?

buzzom

Mitglied
Guten Tag,

ich möchte gerne aus einem Text die 10, am häufigsten vorkommenden Substantive (also groß geschriebene Wörter), ausgeben. Dabei sollen die Satzanfangswörter (da auch gross geschrieben) ausgelassen werden.

Weiss jemand wie man das machen könnte?

Danke vielmals.
Buzzi
 
da gibts an sich mehrere Möglichkeiten.

Ich persönlich würde einen Tokenizer drüber laufen lassen, (Trennzeichen im einfachsten Fall " ", also Leerzeichen)
anschließend durchparsen, alle Elemente nach einem Punkt bzw am Anfang des Textes ignorieren und alle anderen auf einen großen Anfangsbuchstaben überprüfen.

Auf Großbuchstaben checken gibts auch wieder mehrere Wege
entweder das 1. Zeichen/Buchstabe rausfiltern, und auf groß/kleinschreibung prüfen, oder mittels regex

lg
 
Ich kann dir jetz leider keinen funktionierenden code bauen, da ich nix zum testen da habe, aber ich mach mal mein bestes :)

PHP:
$text = "Hallo Welt. Ich bin Christoph";

//mit explode teilst den Text in endlich viele Token auf, Trennzeichen ist jetz das leerzeichen (" ")
$tokens = explode(" ",$text);

//jeden Token durchrennen
for ($i = 0; $i ++; $i < count($tokens)) {
    $pattern = "/^[A-Z]/";
    if(preg_match($pattern, $tokens[$i])) {
        //token merken
    }

    if(substr($tokens[$i],sizeof($tokens[$i]-1),sizeof($tokens[$i])) == ".") {
        $i++; //damit überspringst du den nächsten Token
    }

}

So irgendwie müsste es funktionieren

1. ist hier vorausgesezt, dass die Syntax des Textes stimmt, also immer ein Leerzeichen zwischen zwei Worten bzw nach einem . ist.
Falls du mehrere Leerzeichen berücksichtigen willst kannst du ja noch z.B. ein trim einbauen.

2. Die Datenstruktur in welche du deine Wörter einfügst sollte durchdacht sein, am besten eine Art Tabellarische Struktur (z.B. 2dim Array) um ein Wort mit der Anzahl der vorkommen in Verbindung zu bekommen. Bei doppelten Wörtern dann halt nur den Zähler erhöhen, und nicht noch einmal in das Array einfügen.
Alternativ alle Substantive in ein Array schreiben und nach diesem Vorgang mehrfache zählen.

Hoffe ich konnte weiterhelfen, und dass der Code halbwegs fehlerfrei ist, habs nur schnell ausm kopf gemacht.

Gruß Christoph
 
Statt meinem Kommentar
"//Token merken"
solltest du eine routine implementieren, die dir z.B. die Wörter, enthalten in $token[$i] speichert und weiterverarbeitet.
alternativ kannst du natürlich statt dem Kommentar
PHP:
echo $token[$i]."<br>";
schreiben. Das müsste dir jedes Substantiv in einer eigenen Zeile ausgeben.
 
Ja das hatte ich schon probiert, aber es wird nichts ausgegeben, deshalb habe ich nachgefragt. Scheint so als wenn keine Daten in $tokens[$i] sind.

Es lag an der for Schleife habe mal geändert auf: for ($i = 0; $i < count($tokens); $i++) {

jetzt geht es. Aber das Wort: "Ich" und "Hallo" soll ja raus, weil am Satzanfang. Es dürfen nur "Welt" und "Christoph" ausgegeben werden
 
Zuletzt bearbeitet:
So, ich habs jetzt ausprobiert und noch die Fehler ausgebessert :D

beim for habe ich die Parameter vertauscht (sorry)
und für stringlänge brauchst strlen :D

PHP:
$text = "Hallo Welt. Ich bin Christoph";

//mit explode teilst den Text in endlich viele Token auf, Trennzeichen ist jetz das leerzeichen (" ")
$tokens = explode(" ",$text);

//jeden Token durchrennen
for ($i = 0; $i < count($tokens); $i ++) {
    $pattern = "/^[A-Z]/";
    if(preg_match($pattern, $tokens[$i])) {
        echo $tokens[$i]."<br>";
    }


    if(substr($tokens[$i], strlen($tokens[$i])-1) == ".") {
        $i++;
    }

}

was du selber noch machen musst is den . wegschmeißen ;)

lg

//edit
Satzanfang habe ich vergessen zu berücksichtigen.
Starte die Schleife nicht bei 0 sondern bei 1 ;)
 
Danke aber wie sortiere ich denn jetzt dieses arrays nach den z.B. 3 am meisten vorkommenden Substantiven und wie gebe ich die dann aus?

PHP:
$text = "Hallo Welt. Ich bin Eric von Welt. Ich komme aus Deutschland. Das Land Deutschland liegt in Europa. Europa ist in der Welt.";


$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]);
        //echo $ausgabe[$i]."<br>";
     }

    if(substr($tokens[$i], strlen($tokens[$i])-1) == ".") {
        $i++;	
    }
}  

print_r(array_count_values($ausgabe));

Array Ausgabe ist jetzt: Array ( [Hallo] => 1 [Welt] => 3 [Eric] => 1 [Deutschland] => 2 [Land] => 1 [Europa] => 1 )

Also möchte ich in der Ausgabe folgendes haben: Welt, Deutschland

da sie am häufigsten vorkommen. Es sollen mal 10 werden, wenn der Text länger ist.


Danke nochmals an alle
Buzzi
 

Neue Beiträge

Zurück