Laden...

Nomenfilter erstellen

Erstellt von csharper123 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.329 Views
C
csharper123 Themenstarter:in
1 Beiträge seit 2018
vor 5 Jahren
Nomenfilter erstellen

Hallo zusammen

In meinem Code will ich nur die Nomen (grossgeschriebenen) Wörter rausfiltern. Dies war auch kein Problem. Jedoch sind die Wörter nach den Satzzeichen auch alle gross geschrieben. Nun bin ich seit einigen Stunden am Probieren, wie ich diese Wörter entfernen kann.

Nun kam ich auf die ide, dass sämtliche Zeichenkombinationen gelöscht werden können . [A-Z]
Somit wenn nach einem . ein Leerzeichen und ein Punkt folgt wird dies einfach gelöscht.

Danach kann man den Satz in Wörter zerlegen und die Grossgeschriebenen Wörter rausfiltern.

Nun mein Problem wie muss ich dies eingeben im Regex, dass es mir den Punkt Space und den Anfang des grossen Buchstaben löscht?

 static void Main(string[] args)
        {
            Regex myRegex = new Regex ("[A-ZÄÖÜ]");
            Regex myRegex1 = new Regex(". [A-Z]");
            String sortiert;

            string beispielSatz = "Dies ist der Test Text man benötigt mich, um zu schauen ob die SQL-Anbindung einwandfrei funktioniert. Die Änderungen sind änderbar. Test!";
            
            

            sortiert = myRegex1.Replace(beispielSatz, "");

            Console.WriteLine(sortiert);
            Console.WriteLine("-------------------------------------------------------------------");

            string[] words = sortiert.Split(' ');
            
            foreach (string word in words)
            {
                if (myRegex.IsMatch(word))
                {
                    Console.WriteLine(word);
                }
            
            }
        Console.ReadLine();
        }
    }
286 Beiträge seit 2011
vor 5 Jahren

Ich würde mir ja mit Split('') ein Array erstellen und das durchlaufen, dann kannst du immer prüfen, was in der vorherigen Zeile enthalten war und somit eine Entscheidung treffen.

Sonderlich weit wird dich das aber nicht bringen, da das Hauptproblem die Entscheidung sein wird ob es nun ein Nomen ist oder ein andere Wort, dass nur aufgrund des Punktes großgeschrieben wurde.

Dazu könntest du einen "intelligenten" Filter bauen, der alle jemals kleingeschriebenen Worte speichert und dies als Entscheidungshilfe nimmt.

Letzten Endes wird das aber auch nur eine begrenzt brauchbare Lösung liefern, dafür ist die deutsche Sprache einfach zu kompliziert und kontextabhängig:
Fliegen fliegen hinter Fliegen, fliegen Fliegen Fliegen hinterher.

Beste Grüße
emuuuu

2+2=5( (für extrem große Werte von 2)

P
441 Beiträge seit 2014
vor 5 Jahren

Ich würde mir ja mit Split('') ein Array erstellen

Das ist gar nicht notwendig, denn string ist bereits ein char-Array, dass man einfach iterieren kann.

16.825 Beiträge seit 2008
vor 5 Jahren

Das ist gar nicht notwendig, denn string ist bereits ein char-Array, dass man einfach iterieren kann.

.. das funktioniert, weil String IEnumerable<char> implementiert.
String ist eine ganz normale Klasse; kein Char-Array.

 
    public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<String>, IEnumerable<char>, IEquatable<String>
49.485 Beiträge seit 2005
vor 5 Jahren

Hallo csharper123,

Split brauchst du gar nicht. Das geht alles mit Regex alleine. Am besten mit Regex.Matche**s**.

Dafür baust du dir ein Regex, der aufs ganze Wort passt und nicht wie bei dir auf ein einzelnes Zeichen. Und an den Anfang dieses Patterns schreibst du einen negativen Lookbehind für den unerwünschten Punkt, der das Ende das vorangegangenen Satzes kennzeichnet. Dran denken, den Punkt zu escapen: "\.". Den Satzanfang am Anfang des Strings erkennst du an "^".

Für Lookarounds und den ganzen Rest siehe [Artikel] Regex-Tutorial (insbesondere Abschnitt "4.13 Positive und negative Lookarounds"). Wenn man Lookarounds erstmal verstanden hat, kann man damit viele nette Sachen machen.

Komfortabel testen kannst du mit On-the-fly Regex-Tester: Regex-Lab.

herbivore

PS: Wie emuuu schon sagte, wird man mit einer syntaktischen Analyse nie eine 100%ig korrekte Trennlinie ziehen können: z.B. Abkürzungen. In diesem selbstbezüglichen Beispiel steht vor dem Nomen "Abkürzungen" ein Punkt, der aber kein Satzende kennzeichnet. Außerdem werden Nomen, die tatsächlich an einem Satzanfang stehen, von der geplanten Methode (fälschlich) nicht als solche erkannt.