Parser für Anführungszeichen in einem Text

Hallo zusammen,

wir bearbeiten (im Bereich Buchproduktion) belletristische Texte,
deren Umfänge von etwa 150.000 bis 1.500.000 (Unicode-)Zeichen
variieren (u.U. auch mehr). In Texten kommt natürlich wörtliche Rede
(also Anführungszeichen [einfache und doppelte]) vor. Diese
Anführungszeichen werden von den Autoren (bzw. den Algorithmen von
Word & Co) eigentlich in 90% der Fälle fehlerhaft erfasst.
In mir gärt schon seit längerem die Idee, mal einen eigenen Parser
für dieses leidige Thema zu schreiben, der falsche in richtige
Anführungen tauscht.

Ich bin also auf der Suche nach Algorithmen, Ideen, Tipps, wie ich
dieses Thema mal angehen könnte (Programmiersprache etc. ist erst mal
unerheblich, ich brauche erst mal einen Marschweg).

Prinzipiell habe ich mir 2 Wege ausgedacht und würde gern mal weitere
Meinungen dazu einholen:
1.
Entscheidung über den unmittelbaren Kontext, z.B.
Leerzeichen " Zeichen = doppelte Anführung
Zeichen " Leerzeichen = doppelte Abführung
Bindestrich " Zeichen = doppelte Anführung
usw.

Pärchen suchen. Wenn ich eine Anführung finde, gibt es eine
korrespondierende Abführung?

Neu Erstellen. Wenn ich eine Anführung finde, muss das nächste
Vorkommen eine Abführung sein usw.

Was meint ihr? Ich bin da noch etwas unsicher…

Danke
Gruß
Tobias

Hallo,

wir bearbeiten (im Bereich Buchproduktion) belletristische
Texte,
deren Umfänge von etwa 150.000 bis 1.500.000 (Unicode-)Zeichen
variieren (u.U. auch mehr). In Texten kommt natürlich
wörtliche Rede
(also Anführungszeichen [einfache und doppelte]) vor. Diese
Anführungszeichen werden von den Autoren (bzw. den Algorithmen
von
Word & Co) eigentlich in 90% der Fälle fehlerhaft erfasst.

Eine so hohe Fehlerquote hätte ich jetzt nicht erwartet, aber andererseits haben die meisten Leute nicht die Anforderungen, die ein Setzer an seinen Output hat.

In mir gärt schon seit längerem die Idee, mal einen eigenen
Parser
für dieses leidige Thema zu schreiben, der falsche in richtige
Anführungen tauscht.

Ich bin also auf der Suche nach Algorithmen, Ideen, Tipps, wie
ich
dieses Thema mal angehen könnte (Programmiersprache etc. ist
erst mal
unerheblich, ich brauche erst mal einen Marschweg).

Zur Programmiersprache will ich nur anmerken, dass du auf jeden Fall eine nehmen solltest, die von Haus aus mit Unicode umgehen kann, sonst verbringst du zu viel Zeit damit, dich um das Management des Unicodes zu kümmern. (Perl 6 wird, wenn es mal fertig ist, geradezu traumhafte Unicode-Unterstützung haben, aber so lange willst du nicht warten).

Prinzipiell habe ich mir 2 Wege ausgedacht und würde gern mal
weitere
Meinungen dazu einholen:
1.
Entscheidung über den unmittelbaren Kontext, z.B.
Leerzeichen " Zeichen = doppelte Anführung
Zeichen " Leerzeichen = doppelte Abführung
Bindestrich " Zeichen = doppelte Anführung
usw.

Pärchen suchen. Wenn ich eine Anführung finde, gibt es eine
korrespondierende Abführung?

Ich weiß ja nicht, wie „falsch“ deine Eingabedaten sind, aber vermutlich brauchst du eine Kombination aus beidem.

D.h. du zählst mit, wie viele Anführungszeichen noch offen sind, und die ersten beiden Regeln wie in 1. beschrieben gelten immer, während die dritte Regel ev. und eine Abführung sein kann, wenn noch Anführungen offen sind.

Neu Erstellen. Wenn ich eine Anführung finde, muss das nächste
Vorkommen eine Abführung sein usw.

Was meint ihr? Ich bin da noch etwas unsicher…

Ausprobieren.
Ich kenne mich mit Textsatz und den Eingabedateien, die du verarbeiten willst, nicht aus, deswegen ist es schwer, allgemeine Tipps zu geben.
Letztendlich musst du verschiedene Ansätze ausprobieren und herausfinden, welche für dich funktionieren.

Grüße,
Moritz

Hallo tobias,

Prinzipiell habe ich mir 2 Wege ausgedacht und würde gern mal
weitere
Meinungen dazu einholen:
1.
Entscheidung über den unmittelbaren Kontext, z.B.
Leerzeichen " Zeichen = doppelte Anführung
Zeichen " Leerzeichen = doppelte Abführung
Bindestrich " Zeichen = doppelte Anführung
usw.

Pärchen suchen. Wenn ich eine Anführung finde, gibt es eine
korrespondierende Abführung?

Neu Erstellen. Wenn ich eine Anführung finde, muss das nächste
Vorkommen eine Abführung sein usw.

Ich würde sowas wie die dritte Variante nehmen und mit einen Flag arbeiten, nennen wir es mal

zitat

Am Anfang

zitat=false

setzen.
Dann den Text Zeichen für Zeichen durchscannen.
Wenn Du auf ein " triffst und

zitat==false

dann ersetze das " durch doppelte Anführung und setze

zitat=true

Wenn Du auf ein " triffst und

zitat==true

dann ersetze das " durch doppelte Abführung und setze

zitat=false

Das funktioniert aber nur, wenn es keine verschachtelten wörtlichen Reden gibt, aber da nimmt man eh andere Anführungszeichen, oder?
Und wenn einer mal das schliessende " ganz vergessen hat bist Du eh völlig aufgeschmissen. Da hilft wahrscheinlich kein Algorithmus, höchstens Wahrscheinlichkeitsannahmen, dass eine wörtliche Rede nicht länger als x Wörter sein dürfte? Aber für solche Sachen müsste man Praktiker sein und konkret wissen, was für Böcke so die Autoren schiessen. Das entzieht sich meiner Kenntnis. Hätte eh gedacht, dass heute im Zeitalter von Autokorrektur die Fehlerquote viel geringer ist.

Mit freundlichen Grüssen
Klaus Bernstein

Hallo

Ich bin also auf der Suche nach Algorithmen, Ideen, Tipps, wie
ich dieses Thema mal angehen könnte (Programmiersprache etc.
ist erst mal unerheblich, ich brauche erst mal einen Marschweg).

In welcher konkreten Form (Format, Codierung etc.) liegen diese
Texte vor, wenn diese Bearbeitung stattfinden soll?

Grüße

CMБ

In welcher konkreten Form (Format, Codierung etc.) liegen
diese Texte vor, wenn diese Bearbeitung stattfinden soll?

Das ist entweder eine Word-Datei (bzw. RTF) oder dann im Layout-
Programm. Dort kann ich sie z.B. als RTF oder als UTF-8 Textdatei
ausgeben, welche die proprietären Formatierungsanweisungen (Adobe
InDesign) als spezielle Tags (XML-ähnlich) enthält.

Für Verarbeitungsgeschwindigkeit und Verarbeitbarkeit würde sich
sicherlich letzteres geradezu aufdrängen …

Gruß
Tobias

Hallo Tobias,

Dafür gibt es keine automatische Lösung, zumindest wenn du davon ausgehen musst, dass bei der Zeichensetzung ein Paarungsfehler vorliegen kann (also das Anführungs- oder Abführungszeichen fehlt).

Dein Problem hat eigentlich jeder Compiler für eine Programmiersprache schon.
z.B. Verarbeitungsblöcke werden mit ‚BEGIN‘ & ‚END‘, ‚{‘ & ‚}‘, ‚IF‘ & ‚ENDIF‘ usw. „geklammert“.

Fehlende „Anführungszeichen“ können erkannt werden, wenn sie Syntaktisch vorgeschrieben sind, z.B. am Anfang einen Funktionsrumpfes, was bei der natürlichen Sprache nicht vorkommt, oder wenn ein „Abführungszeichen“ ohne ein passendes „Anführungszeichen“ auftritt.

Bei einem fehlenden „Anführungszeichen“ liefert der Compiler aber erst dort eine Fehlermeldung wo ihm entweder der Code ausgeht, also wenn die Datei zu Ende gelesen ist, oder wenn ein Konstrukt gefunden wird, welches nur ausserhalb eines Blockes auftreten kann.
Für den letzteren Fall sehe ich bei deinen Büchern nur gerade eine Kapitelüberschrift als Möglichkeit.

Ich kenne aber keinen Compiler, welcher selbständig bestimmen kann, WO jetzt das Fehlende Zeichen im Programm-Code stehen muss (ausgenommen der Fall am Anfang einer Funktion).

Du kannst also nur automatisch prüfen ob die Paarbildung stimmt. Wobei was ist wenn direkte Rede innerhalb einer direkten Rede auftritt und die innere Schachtelung genau falsch herum „geklammert“ ist bzw. für alle vier „Klammern“ das selbe Zeichen verwendet wurde ???

MfG Peter(TOO)

Hallo Peter,

dass ich keine voll-automatische Lösung hinbekomme, weiß ich. Dann
wäre das sicherlich schon in ein Programm wie Word, InDesign, Quark
o.Ä. eingeflossen und ich würde hier nicht posten.
Aber ich bin noch guter Hoffnung, eine bessere Lösung hinzukriegen
als das bisher in den Programmen implementiert ist (da diese ja
zumeist auf englische/amerikanische Anforderungen hin entwickelt
werden und das Deutsche nur eine Lokalisierung ist - immer wieder
auch schmerzlich am Trennprogramm zu merken; aber das ist eine andere
Baustelle :o))).

Danke für deine Ausführungen zur Verarbeitung syntaktischer
strengerer Sprachen wie in einem Preprozessor/Compiler o.Ä. Das war
aufschlussreich.

Ich denke, dass ich nicht drumherum komme, Stellen, die per se
mehrdeutig sind, zu markieren und mit einem manuellen Suchen/
Ersetzenlauf den User entscheiden lassen muss.
Schlussendlich gibt es ja auch noch einen Lektor oder Korrektor
(zumindest bei unseren Kunden gibt es die noch …), der sich das
alles auch nochmal zur Brust nimmt.
Aber eine gewisse Vorarbeit auf dem Gebiet wäre schon ziemlich
klasse.

Ich habe mir auch schon überlegt, dass in OpenOffice ja sicherlich
auch ein SmartQuotes-Algorithmus implementiert sein muss. Leider habe
ich den Code dazu bisher noch nicht aufstöbern können.

Gruß
Tobias