staging.inyokaproject.org

String zerlegen bzw. Leerzeichen zwischen Zeichen einfügen

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

track schrieb:

Mein Ansatz war, soweit wie möglich "false positives" zu verhindern. Und je einfacher der Filter, desto weniger Fehler. So ungefähr ...

aha... "false friends" kenn' ich ja...

Bei den Zahlen ist ein Leerzeichen zu viel (vor der Zahl) eigentlich egal, deshalb bin ich da nicht drauf eingestiegen.
Und das Minus habe ich mitgenommen, damit er im Zweifel negative Zahlen auch als "Minus 22" ausspricht. - Nur so auf Verdacht.

Hab das nochmal getestet, Festival sagt zwar "22 + 45 - 86 = 230" (wenn man ihm das unterschiebt), aber wenn kein Leerzeichen vor dem "-" ist, "verschwindet" das Zeichen, und dass die Rechnung nicht stimmt, kann er mir auch nicht ausgeben 😉

Aber die Fein-Anpassung kriegst Du doch sowieso hin, trotz angeblich "keine Ahnung" .. 😉

Nur Versuch macht Kluch 😀 ... um nicht Try'n'Error zu sagen oder Learning by doing zu sagen. Mit zwei alpha]-Dingensen hab' ich jedenfalls bisher keinen Erfolg, da sind mir dann die Ziffern auch gleich mit verschwunden...

so long
hank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Heinrich Schwietering schrieb:

... Mit zwei [[:alpha:]]-Dingensen hab' ich jedenfalls bisher keinen Erfolg, da sind mir dann die Ziffern auch gleich mit verschwunden...

... äh, macht er da was was er nicht soll ? - zeigst Du mal ein Beispiel ?

An sich dachte ich ja, dass der Filter jetzt soweit wasserdicht wäre ...

track

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

track schrieb:

Heinrich Schwietering schrieb:

... Mit zwei [[:alpha:]]-Dingensen hab' ich jedenfalls bisher keinen Erfolg, da sind mir dann die Ziffern auch gleich mit verschwunden...

... äh, macht er da was was er nicht soll ? - zeigst Du mal ein Beispiel ?

$ echo GH67 | sed -r -e 's/([[:alpha:]])([[:alpha:]])([0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'
G H7

→ Falsch

$ echo kf78 | sed -r -e 's/([[:alpha:]][[:alpha:]])([0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'
kf 78

→ Richtig!

$ echo ÖkoCheck567 | sed -r -e 's/([[:alpha:]][[:alpha:]])([0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'
Ökocheck 567

auch gut,

$ echo ÖkoCheck567 | sed -r -e 's/([[:alpha:]][[:alpha:]][0-9])/\1 \2/g; s/([[:lower:]])([[:upper:]])/\1\l\2/g'
sed: -e Ausdruck #1, Zeichen 40: Ungültiger Verweis \2 im rechten Teil (`RHS') des `s'-Befehls

→ murks... Ergo: Klammern falsch gesetzt 😬

so long
hank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

😀
Ok, dann kurz systematisch:

  • [[:alpha:]] steht für einen (beliebigen) Buchstaben

  • \( ... \) (oder unter der Option "-r" ohne "\" vor den Klammern) markiert eine Gruppe, die dann durchgezählt und mit "\1" usw. referenziert wird.

Zum selber nachlesen: im sed-Tutorium unter Selektives Ersetzen und Gruppieren (ist übrigens gar nicht so schwer, nur eben etwas kryptisch bei sed)

LG,

track

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Naja, dann... Danke! (und ich sach' ja noch, das ich da nich so seeeehr die Ahnung von hab' 😉)

so long
hank

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Ich nochmal; ich raffs einfach nicht...

Ich würde jetzt gerne noch folgende "Kleinigkeit" lösen:

Ein in Spalten geschriebener Text hat etliche Trennstriche, die das Erkennen der Wörter für Festival erschweren, und auch die Rechtschreibprüfung etwas in die Irre führt. Also sollen die Trennstriche entfernt und der Rest des Wortes auf die gleiche Zeile geschrieben werden; wenn es ganz "komfortabel" sein soll, auch noch direkt nach dem Wort umgebrochen werden, das ist aber nicht unbedingt nötig.

Allerdings sollen nur tatsächlich getrennte Wörter berücksichtigt werden, nicht aber "absichtlich" durchgekoppelte Wörter, also

Das Wort wird ge-
trennt. Das Kompositum US-
Amerikaner nicht.

zu

Das Wort wird getrennt. Das Kompositum US-
Amerikaner nicht.

zusammenfassen; oder ganz luxuriös zu

Das Wort wird getrennt.
Das Kompositum US-
Amerikaner nicht.

Das Konstrukt müsste also abfragen, wie nach dem Trennstrich mit folgendem Umbruch weitergeschrieben wird, und wenn nach dem Umbruch großgeschrieben wird entsprechend gar nichts tun, ansonsten aber den Trennstrich mitsamt dem Umbruch entfernen.

Ich scheitere aber schon daran, auch nur den Zeilenumbruch zu eliminieren, ganz unabhängig davon, was danach kommt.... "\n" sei das Zeichen dafür 😬

bin aber gerade auch nicht ganz "zurechnungsfähig", da etwas vergrippt...

guten rutsch
hank

EDIT: Hab' nicht gründlich genug gesucht, sorry: http://forum.ubuntuusers.de/post/2085317/

Mit

sed -i -r -e ':;s/-\n[:lower:]//;N;T' Test.txt

funktioniert es soweit schon ganz gut (wenn ich auch nicht ganz verstehem was da passiert 😉 ); wäre nur noch das Problem mit dem Umbruch direkt nach dem getrennten Wort, aber das ist nicht so wichtig...

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7529

$ sed -r 'N;s/([a-z])-\n([^ ]* ?)/\1\2\n/;P;D' input.txt
Das Wort wird getrennt. 
Das Kompositum US-
Amerikaner nicht.

EDIT: so, behoben

EDIT2: Deine Lösung ist natürlich auch interessant. Ich habe mich um US-Amerikaner zu ignorieren, auf das S- festgelegt statt auf -A. Da müsste man also noch ein [a-z] nach dem \n( einbauen um auch sowas wie Foo-Bar unangetrastet zu lassen. Und überhaupt kann man :lower: nehmen statt [a-z], ich mache letzteres einfach aus alter Gewohnheit 😉

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

Ah, frostschutz, der sed-Wizard! 😀

Dein Konstrukt funktioniert perfekt!, auch für getrennte Hauptwörter! Meinen Fund müsste ich ggf, noch um das "Umbrechen" erweitern... Magst du kurz erläutern, wie genau dein Befehl funktioniert?

Schon mal besten Dank 👍

so long
hank

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7529

Hier nochmal mit :lower:

sed -r -e 'N;s/([[:lower:]])-\n([[:lower:]][^ ]* ?)/\1\2\n/;P;D'

N liest eine Zeile (d.h. zwei Zeilen sind dann zusammengefasst).

Das s/// ersetzt dann kleinbuchstabe, trennstrich, zeilenumbruch, kleinbuchstabe, mehrere zeichen bis zum leerzeichen. Läßt den Trennstrich und das Zeilenumbruch weg und macht dafür einen neuen Zeilenumbruch danach (also nach dem ersten Leerzeichen nach der ursprünglichen Trennung).

P gibt die erste Zeile aus.

D löscht die erste Zeile.

Dann geht es wieder von vorne los, indem N die nächste Zeile einliest.

Der Pattern Space ist also im ersten Durchgang "zeile1\nzeile2", im zweiten Durchgang "zeile2\nzeile3" usw. und da wird dann eben jedes Mal geschaut ob in der Zeile eine Trennung vorhanden ist, die zusammengefügt werden muss.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

An solchen Trennregeln habe ich mich auch schon mal geschafft (mit awk, das ist aber auch nicht einfacher).

Dabei bin ich allerdings über gewollte Trennungen mit kleinem Anfangsbuchstaben in der Folgezeile gestolpert.
Das hieß dann: ein Wörterbuch aufstellen für die Kombinationen, bei denen die Trennung nicht beseitigt werden darf.

Also z.B. "100-prozentig" oder "UV-bestrahlt" (lt. Duden wäre "100prozentig" oder "UVbestrahlt" falsch)

Ist das bei Dir kein Problem ? - bei meinem medizinischen Datenbank-Dump war das jedenfalls am Ende der Haupt-Aufwand.

LG,

track

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7529

100-prozentig wird nicht angefasst, da 0 kein Kleinbuchstabe ist. UV-bestrahlt wird nicht angefasst, da V kein Kleinbuchstabe ist.

Es wird also nur kleinbuchstabe-kleinbuchstabe verwurstet in der letzten Version. Da gibt es sicher auch Beispiele, die dann nicht angefasst werden sollten... die Frage ist wie oft das vorkommt, um deswegen dann mit einer Wörterbuchliste anzufangen...

Idealerweise sollten in der Textdatei eh gar keine Trennungen vorkommen, das macht man ja erst ganz am Ende bei der Ausgabe passend fürs Anzeigegerät oder Seitenformat...

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Damit hast Du in der Tat den Großteil sauber erfassst, ist wohl das beste was ohne Wörterbuch geht.

Dann bleibt tatsächlich die Frage, ob konkrete False Positives (z.B. aus U-
boot
wird U-boot) oder False Negatives (z.B. nordholsteinisch statt nord-holsteinisch wie es richtig wäre) toleriert werden können oder nicht.

Wie Du schon sagst.

track

Heinrich_Schwietering Team-Icon

Wikiteam
Avatar von Heinrich_Schwietering

Anmeldungsdatum:
12. November 2005

Beiträge: 11288

Hi!

@ frostschutz

sed -r -e 'N;s/([[:lower:]])-\n([[:lower:]][^ ]* ?)/\1\2\n/;P;D'

ist erstmal super:

Hunderte von Eisenbahnwa-
gen stehen ungeordnet im Upper-
Westside-Bahnhof New Yorks un-
ter schwerer Be-
wachung, obwohl sie keiner braucht.
Das ist etwas unsinnig

wird zu

Hunderte von Eisenbahnwagen 
stehen ungeordnet im Upper-
Westside-Bahnhof New Yorks unter 
schwerer Bewachung, 
obwohl sie keiner braucht.
Das ist etwas unsinnig.

So bleibt der Text einigermaßen umgebrochen, und die gekoppelten Hauptwörter werden nicht angerührt 👍

Danke auch für die Aufdröselung, ich hoffe, ich habe es jetzt trotz Matschbirne einigermaßen verstanden 😉

@ track

Derartige Feinheiten hab' ich noch nicht im Visier, müsste ich nochmal genauer testen. Im Prinzip geht es nur darum, Festival die Aussprache zu erleichtern, indem keine Trennstriche mehr vorkommen; Duden-Konformität ist nicht unbedingt Ziel, hab' aber solche Geschichten mit 100-prozentig etc. auch noch nicht genauer angeschaut. Theoretisch sollte Festival das bei Zahlen wohl sowieso "akustisch" auftrennen, und bei Abkürzungen auch, wenn die denn vernünftig definiert sind.

feiert schön, so long
hank

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Stimmt, Du brauchst es ja für Dein Festival-Projekt.
Dafür ist das definitiv genug, da sehe ich keine Probleme.

Auch von mir: eine schöne Feier und dann ein gutes Neues Jahr !

track

Antworten |