Regex

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
uzumwmy
User
Beiträge: 4
Registriert: Donnerstag 26. Mai 2022, 10:16

Hallo Leute,

ich bin dabei eine Sprachanwendung für mein Studium zu erstellen. Dabei möchte ich die Grammatik eines Satzes überprüfen.
Ich baue die Reihenfolge der Wortarten als String zusammen und wollte dann mit einem Ausdruck überprüfen. Meine String wäre "PRONVERBNUMNOUNVERB".
Es soll bspw. auf "VERBPRONVERBNUMNOUNVERB" und "XPUNCTPRONVERBNUMNOUNVERB" reagieren aber nicht auf "PRONVERBADVNUMNOUN". Ich habe es mit dem Ausdruck ""^[a-zA-Z]+$" " probiert aber dieser reagiert leider auch auf "PRONVERBADVNUMNOUN" was er noch nicht soll.
Ich habe bis jetzt keine Erfahrung mit Regex und im Internet bin ich auf meine spezielle Anforderung nicht fündig geworden.

Ich habe es mit dieser Zeile überprüft.

Code: Alles auswählen

x = re.search("^[a-zA-Z]+$", syntax)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich finde schon alleine das zu lesen was du hier darstellst zeigt deutlich, dass dieser Ansatz nicht gelungen ist. Dieses ohnepunktundkommaundleerzeichenaneinendergehaenge ist voellig unnoetig schwer zu entziffern.

Schon wenn du deinen Ausdrucken immer ein Leerzeichen pro Wortklasse anhaengt, wird das ganze um *groessenordnungen* besser zu lesen.

PRON VERB NUM NOUN VERB

XPUNCT PRON VERB NUM NOUN VERB

Und dann kommen wir mal auf dein eigentliches Problem zu sprechen: regex sind in meinen Augen hier die voellig falsche Richtung. Zum einen ist mir mit deinen Beispielen noch nicht klar, ob deren eingeschraenkte Grammatik ueberhaupt diese Probleme loesen kann. Vor allem aber sind sie fundamental zur Verarbeitung einzelner Zeichen gebaut. Natuerlich kann man auch Zeichenketten erkennen, aber da dann zB sowas wie Klassen von Woertern zu definieren etc. wird schwer und unhandlich.

Was du da hast ist ja im Grunde schon ein Token-Stream, und damit wuerde ich das auch als solchen betrachten, und gleich mit einem echten Parser-Framework drangehen. ZB pyparsing, wobei ich auch schon lange in Python nichts mehr mit Parsern gemacht habe, da mag es andere geben, die heutzutage populaerer sind. Aber pyparsing war und ist auch immer noch gut und faehig hier zu helfen, der Bereich ist ja ziemlich abgegessen - seit den 80ern oder so.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@uzumwmy: Aus Interesse: Möchtest du hier eine natürliche Sprache parsen? Wenn ja, welche?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@uzumwmy: Auch wenn reguläre Ausdrücke hier eher nicht passen, noch der Hinweis, dass ich statt `search()` mit einem Muster das sowohl an den Anfang als an das Ende verankert ist, eher `fullmatch()` verwenden würde. Das macht diesen Fall IMHO leichter lesbar/erkennbar und den regulären Ausdruck um zwei Zeichen kürzer: ``x = re.fullmatch(r"[a-zA-Z]+", syntax)``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
uzumwmy
User
Beiträge: 4
Registriert: Donnerstag 26. Mai 2022, 10:16

Ich weiß das Regex nicht der optimalste Ansatz für dieses Problem ist, aber meine Professorin schreibt das so vor. Ich weiß nicht wieso, aber es wird seine Gründe haben.

@__deets__
Ich habe noch etwas rumprobiert und bin selber auf die Idee gekommen, Leerzeichen einzufügen... Danke dennoch für deine Tipps

@sparrow
Die deutsche Sprache. Ich muss eine sprachanwendung entwickeln
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

uzumwmy hat geschrieben: Freitag 27. Mai 2022, 20:17 @sparrow
Die deutsche Sprache. Ich muss eine sprachanwendung entwickeln
"Blanke" reguläre Ausdrücke für sich genommen sind dazu aber der falsche Weg. Das wird die Professorin auch wissen. Ich würde eher vermuten, dass hier vielleicht Infos fehlen.

Ein gängiger Weg, um zu prüfen, ob eine Zeichenkette einer Grammatik gehorcht, ist zum Beispiel, deine Grammatik in Form von Ersetzungregeln sowie Terminal und Nicht-Terminalsymbolen zu formulieren und als Automaten zu implementieren. Dabei können dann auch RegEx als ein Baustein vorkommen. Aber eben nicht als einziger, für sich genommener Mechanismus.
uzumwmy
User
Beiträge: 4
Registriert: Donnerstag 26. Mai 2022, 10:16

@nezzcarth
könntest du mir kurz ein bsp zeigen wie ich das umsetzen kann?

folgende Sätze möchte ich akzeptieren
ich möchte eine/zwei/... salamipizza bestellen
ich möchte eine/zwei/... dicke salamipizza
ich möchte eine salamipizza und eine schinkenpizza
ich möchte eine salamipizza,eine schinkenpizza und eine hawai
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist doch ploetzlich was komplett anderes. Wenn du vorher diese Wortklassen hattest - wie hast du die denn erzeugt?
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@uzumwmy:

Natürliche geschriebene Sprache lässt sich nicht mit regulären Ausdrücken analysieren. Die deutsche Sprache besitzt eine allgemein kontextbehaftete Grammatik. Als solche ist sie Turing-vollständig. Das bedeutet insbesondere, dass es keinen allgemeinen Algorithmus zur Analyse geben kann. Das Stichwort ist Chomsky-Hierarchie. Und selbst, wenn man nur einen kleinen Teil abbilden will, zB. mögliche Pizzabestellungen, ist das alles andere als trivial. Üblicherweise absolviert man dazu vorher ein Studium der Computerlinguistik. Erfahrene Programmierer können sich in das Thema einlesen und was brauchbares bauen. Als Programmieranfänger ist das völlig hoffnungslos.
In specifications, Murphy's Law supersedes Ohm's.
uzumwmy
User
Beiträge: 4
Registriert: Donnerstag 26. Mai 2022, 10:16

__deets__ hat geschrieben: Sonntag 29. Mai 2022, 16:25 Das ist doch ploetzlich was komplett anderes. Wenn du vorher diese Wortklassen hattest - wie hast du die denn erzeugt?
google Natural Language API
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und jetzt sollen wir die auch benutzen, um dein Problem in Gaenze zu loesen? Wird schwierig.

Im Moment sehe ich mich nicht im Stande, aus deinen Angaben etwas zu machen, bei dem ich dir helfen kann. Wir koennen hier bei konkreten Problemen, also Code, Fehlermeldungen oder sowas helfen, und konzeptionell Tipps geben. Aber mit vagen Angaben Hausaufgaben abliefern ist nicht.

Ich wuerde wenn moeglich auch mit Professorin/anderen Kursteilnehmern diskutieren, die sollten ja nun im Thema drin sein.
Antworten