Seite 1 von 2

Verfasst: Donnerstag 25. Juni 2009, 17:33
von CiveX
http://paste.pocoo.org/show/125112/

Code: Alles auswählen

# Definition des reg. Ausdrücks zur klassifizierung von Nomen
# Annahme: Nomen werden mit dem 1. Buchstaben groß geschrieben
nomen = re.compile(r'[A-ZÄÖÜ][a-zöäü]+')
Kann ich den reg. Ausdruck so ändern, dass er Wörter die max. 2 bzw. 3 Zeichen lang sind ignoriert und den rest aufnimmt??

Oder muss ich noch einen reg. Ausdruck erstellen.

Ich habs immer noch nicht so mit den Ausdrücken :(

Andere Frage:

Abwechslung F
Ablehnung F

aber

Zurückhaltung [n.d.]


Warum eigentlich? Ich habe ung als Endung für Feminin gemacht...

Verfasst: Donnerstag 25. Juni 2009, 17:37
von EyDu
Ja: {m,}

Verfasst: Donnerstag 25. Juni 2009, 17:46
von CiveX
Das hilft mir jetzt nicht EyDu, da ich nicht verstehe WO.

nomen = re.compile(r'[A-ZÄÖÜ][a-zöäü]+')

Sucht ja jedes Wort, wo die 1. Buchstabe groß ist. Soweit, so gut.

Nun möchte ich aber zusätzlich noch, dass er dabei Wörter mit max. 2 Buchstaben (So, Ab, An, Am) bzw. 3 (Als, Dem, Den, Der, Die, Das) überspringt.

Klar fallen dabei auch Nomen Ruß, Sex, Aal, Aas, aber die sind vernachlässigbar.

Ich möchte also nomen = re.compile(r'[A-ZÄÖÜ][a-zöäü]+') erweitern. Geht das? Oder muss ich einen neuen Ausdrück formulieren?

Ich dachte an r'[A-ZÄÖÜ]{4,}[a-zöäü]+' aber das scheint nicht zu gehen. Wie du siehst, ich kapier die schreibweise der reg. Ausdrücken überhaupt nicht :(

Edit:

Okay, r'[A-ZÄÖÜ][a-zöäü]{3,}' funktioniert schon viel besser. Allerdings auch nicht ganz richtig.

Es werden zwar 2 und 3 Buchstabige Wörter gefiltert, aber auch:
Abfälle, Abfällen, Klänge, Klöster, Komödie, Kräfte, etc.

Wenn ich mir das richtig anschaue, alle Wörter die mehr als 3 Buchstabe haben, aber das 3. oder 4. Buchstabe ein äöüß ist, wird rausgeworfen.

Verfasst: Donnerstag 25. Juni 2009, 17:58
von Hyperion
Doku hat geschrieben: {m,n}
Causes the resulting RE to match from m to n repetitions of the preceding RE, attempting to match as many repetitions as possible. For example, a{3,5} will match from 3 to 5 'a' characters. Omitting m specifies a lower bound of zero, and omitting n specifies an infinite upper bound. As an example, a{4,}b will match aaaab or a thousand 'a' characters followed by a b, but not aaab. The comma may not be omitted or the modifier would be confused with the previously described form.
Probiers doch mal in ner Shell aus! Fang mit einem kleinen RegExp an und erweitere den dann.

Verfasst: Donnerstag 25. Juni 2009, 18:22
von CiveX
Ja, das versuche ich ja gerade....

r'[A-ZÄÖÜ][a-zöäü]+'

Erster Buchstabe A-Z+ÄÖÜ gefolgt vom Rest in Kleinbuchstaben.

Laut Beispiel:

a{4,}b = aaaab aber nicht aaab oder aaab.

Okay dachte ich: Müsste dann ja einfach sein:

r'[A-ZÄÖÜ][a-zöäü]{4,}', also müsste das ja Wörter rausfiltern, die weniger als 4 Buchstaben haben.

Was ist? Es werden Wörter gefiltert mit 4 Buchstaben.Alles ab 5 Buchstaben wird aufgenommen. Hää?

Ok, dann ändern wir mal in r'[A-ZÄÖÜ][a-zöäü]{3,}', Ausgabedatei geguckt. Uii, klasse, schon viel besser.

Dann aktuelle Ausgabedatei mit alter Ausgabedatei geprüft, und was ist?
Abfälle, Abfällen, Klänge, Klöster, Komödie, Kräfte, etc. werden rausgeworfen, weil die zwar alle länger als 3 Buchstaben sind, ABER deren 3. bzw. 4. Buchstabe ist ein äöü oder ß.

:cry:

Verfasst: Donnerstag 25. Juni 2009, 18:28
von BlackJack
@CiveX: Du hast da keine Buchstaben, sondern Bytes. Und ich vermute mal das die Buchstaben, die Du eingegeben hast, als UTF-8 kodiert sind. Damit ist alles ausserhalb von ASCII als zwei Bytes kodiert. Und damit kannst Du dann reguläre Ausdrücke und *Buchstaben* vergessen. Du solltest konsequent mit Unicode arbeiten, wenn Du mit Text arbeitest.

Verfasst: Donnerstag 25. Juni 2009, 18:31
von Hyperion
Du musst den hinteren Teil "gruppieren". Somit kannst Du dort die Mindestlänge festlegen:

Code: Alles auswählen

In [24]: nomen = re.compile(r"[A-ZÄÖÜ]([a-zöäü]+){2,}")

In [25]: re.match(nomen, "Eins")
Out[25]: <_sre.SRE_Match object at 0x2722648>

In [26]: re.match(nomen, "Ei")

In [27]: re.match(nomen, "Ein")
Out[27]: <_sre.SRE_Match object at 0x2722738>
Du sollest so etwas am besten in ner Shell oder einem Editor für Python RegExps testen. Z.B. Kodos

Verfasst: Donnerstag 25. Juni 2009, 18:37
von CiveX
Nicht laut meiner Ausgabe, BlackJack:

Nomenlexikon
set([u'Chlodwigs', u'Folge', u'Wohltun', u'Weile', u'Mauer'...

Nomentoken-Liste
[u'Chlodwigs', u'Folge', u'Wohltun', u'Weile',....

Nomendictionary
{u'Chlodwigs': '[n.d.]', u'Folge': 'F', u'Wohltun': 'N', u'Weile': 'F', u'Mauer': 'M', u'Paris': 'N'....

Scheint alles in Unicode zu sein!

@Hyperion: OMG! :oops: :shock: me = dumm :oops: ! Danke das geht schonmal besser.

Jetzt muss ich nur noch rausfinden, warum der Kräfte, Geräusche, Städte, etc. rauswirft.

Also der wirft Wörter raus, die zwar mind. 3 Buchstaben lang sind,a ber deren 3. bzw. 4. Buchstabe ein ä,ö,ü, oder ß ist. Das macht überhaupt keinen Sinn :(

Verfasst: Donnerstag 25. Juni 2009, 19:08
von CiveX
Okay, das muss an meinem Code liegen: http://paste.pocoo.org/show/125126/ !

Laut Shell, wie Hyperion wollte, liegt es nicht am reg. Ausdrück:
Bild

Ich glaube Blackjack hat recht, eventuell. Liegt vielleicht am UTF-8/Unicode Gedöns.

Könnte jemand mal schauen bitte? Ich bin ratlos :(

Meine Ausgaben oben zeigen ja, dass es Unicode ist am u'blablub'

Verfasst: Donnerstag 25. Juni 2009, 19:56
von BlackJack
@CiveX: Deine *regulären Ausdrücke* sind kein Unicode, nur die Daten auf die Du sie anwendest.

Verfasst: Donnerstag 25. Juni 2009, 20:29
von CiveX
jo, u'blablub' statt r'blablub', recht haste!

Verfasst: Donnerstag 25. Juni 2009, 21:39
von Leonidas
Am besten ``ur``, damit die Raw-Einstellung beibehalten wird.