trennen/zusammenfassen/vergleichen von Text

trennen/zusammenfassen/vergleichen von Text

am 05.10.2007 23:10:24 von Oliver Beck

Guten Abend,

ich habe folgende Aufgabenstellung:

Ich erhalte ein Text-File (resp. .DOC/.RTF, darum kann man sich spaeter
kuemmern). Mit diesem Text-File soll folgendes geschehen:

- Einlesen

open()


- Trennen der einzelnen Saetze

Da manche Saetze ueber das Zeilenende hinaus gehen, tu ich mich
etwas schwer, hier ein ('simplen') RegExp zu nutzen. Aber sicher
muesste ich die Datei als Ganzes in ein grosses Array lesen und
dann viele (abhaengig von der Anzahl Saetze) kleine Arrays
bilden.

- Vergleichen der einzelnen Saetze miteinander

Jetzt wirds tricky (fuer mich :)
Nun sollen alle Saetze (wortbasiert) miteinander verglichen
werden um die Gleichheit in % auszugeben.

Beispiel:

Satz eins: "Das ist Satz eins"
Satz zwei: "Hier steht Satz zwei mit ein wenig mehr Text"
Satz drei: "Das ist Satz 3"
Die Zahl wird nicht als Wort gewertet.

S1 <-> S2 = 1 Wort von 12 gleich / ~8.3%
S1 <-> S3 = 3 Woerter von 7 gleich / ~42.9%
S2 <-> S3 = 1 Wort von 11 gleich / ~9.1%

Ich hoffe, ich konnte es ausreichend erklaeren. Wenn nicht werde ich
auftauchende Fragen umgehend beantworten.

Danke im Voraus!

Mit freundlichen Gruessen/Best Regards Oliver Beck

--
/"\ -ASCII-Ribbon-Campaign- |
\ / Against HTML Mail |
X | -- German GNU/Hurd documentation --
/ \ | - http://de-hurd-doc.berlios.de -

Re: trennen/zusammenfassen/vergleichen von Text

am 05.10.2007 23:17:31 von Frank Seitz

Oliver Beck wrote:
>
> ich habe folgende Aufgabenstellung:
[...]
> Ich hoffe, ich konnte es ausreichend erklaeren. Wenn nicht werde ich
> auftauchende Fragen umgehend beantworten.

Wie sieht Dein bisheriger Lösungsansatz aus?
Was genau ist Dein Problem?

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: trennen/zusammenfassen/vergleichen von Text

am 05.10.2007 23:59:34 von Oliver Beck

Frank Seitz schrieb:

> Wie sieht Dein bisheriger Lösungsansatz aus?

Noch sieht er garnicht aus.
Da ich noch nicht wirklich weiss, wie ich das loesen koennte.
Ich dachte erst daran, die Datei in einzelne Arrays zu Teilen,
wo jeder Satz ein Array bildet und jedes Wort ein Element dessen ist.

Ob das aber bei der Masse an Arrays bei langen Texten so ratsam waere,
weiss ich allerdings nicht.


> Was genau ist Dein Problem?

Wie vergleiche ich den Text? Das dies mit einem RegExp geschieht,
ist mir schon klar. Nur die herangehensweise (unabhaengig von der
Syntax) ist mir unklar.


Mit freundlichen Gruessen/Best Regards Oliver Beck

--
/"\ -ASCII-Ribbon-Campaign- |
\ / Against HTML Mail |
X | -- German GNU/Hurd documentation --
/ \ | - http://de-hurd-doc.berlios.de -

Re: trennen/zusammenfassen/vergleichen von Text

am 06.10.2007 00:32:42 von Daniel Krabbe

Am 05.10.2007 23:10 Uhr schrieb Oliver Beck
> Guten Abend,

Abend.

> [...]
> Satz eins: "Das ist Satz eins"
> Satz zwei: "Hier steht Satz zwei mit ein wenig mehr Text"
> Satz drei: "Das ist Satz 3"
> Die Zahl wird nicht als Wort gewertet.
>
> S1 <-> S2 = 1 Wort von 12 gleich / ~8.3%
> S1 <-> S3 = 3 Woerter von 7 gleich / ~42.9%

Auch wenn das jetzt erst einmal nicht hilft, nur zu meinem eigenen Verständnis:
Ist bei S1->S3 die Lösung nicht 6 von 7 Wörtern = ~86%???

Deiner Lösung nach wäre sonst ein Vergleich der Sätze "Das ist ein Satz" und "Das ist ein
Satz" mit 4 von 8 Wörtern bei grad mal 50% trotz kompletter Übereinstimmung...

Nur das du nachher keine falschen Ergebnisse bekommst.

> Mit freundlichen Gruessen/Best Regards Oliver Beck

Gute Nacht,
Daniel

Re: trennen/zusammenfassen/vergleichen von Text

am 06.10.2007 09:18:47 von Oliver Beck

Daniel Krabbe schrieb:

> Ist bei S1->S3 die Lösung nicht 6 von 7 Wörtern = ~86%???

Naja ... das war gestern schon recht spaet und ich habe mir mehr
Gedanken darueber gemacht, es verstaendlich darzustellen als richtig
zu vergleichen :)

Dennoch danke fuer den Hinweis!


Mit freundlichen Gruessen/Best Regards Oliver Beck

--
/"\ -ASCII-Ribbon-Campaign- |
\ / Against HTML Mail |
X | -- German GNU/Hurd documentation --
/ \ | - http://de-hurd-doc.berlios.de -

Re: trennen/zusammenfassen/vergleichen von Text

am 08.10.2007 01:21:10 von Helmut Wollmersdorfer

Oliver Beck wrote:

> - Trennen der einzelnen Saetze

> Da manche Saetze ueber das Zeilenende hinaus gehen, tu ich mich
> etwas schwer, hier ein ('simplen') RegExp zu nutzen.

Zuerst die Zeilenvorschübe ersetzen mit

s/[\r\n]/ /g

oder so ähnlich.

> - Vergleichen der einzelnen Saetze miteinander

> Jetzt wirds tricky (fuer mich :)
> Nun sollen alle Saetze (wortbasiert) miteinander verglichen
> werden um die Gleichheit in % auszugeben.

Ich verwende für eine ähnliche Aufgabenstellung (Vergleich von
Perl-Subroutinen) Algorithm::Diff - erwartet Listen als Parameter.
Bei mir sind es halt Zeilen, welche ich zuerst mit PPI herausparsen
lasse. Mein Ergebnis sind dann auch Prozent.

Helmut Wollmersdorfer

Re: trennen/zusammenfassen/vergleichen von Text

am 08.10.2007 09:02:07 von Frank Seitz

Oliver Beck wrote:
> Frank Seitz schrieb:
>>
>>Wie sieht Dein bisheriger Lösungsansatz aus?
>
> Noch sieht er garnicht aus.
> Da ich noch nicht wirklich weiss, wie ich das loesen koennte.

Dann mache dir Gedanken. Diese NG ist nicht dafür da,
Aufgabenstellungen hineinzustellen und fertige Lösungen
herauszubekommen.

> Ich dachte erst daran, die Datei in einzelne Arrays zu Teilen,
> wo jeder Satz ein Array bildet und jedes Wort ein Element dessen ist.

Das IMO die goldrichtige Datenstruktur, da du Sätze ja
wortweise untereinander vergleichen willst.

> Ob das aber bei der Masse an Arrays bei langen Texten so ratsam waere,
> weiss ich allerdings nicht.

Das wird viel Speicher verbrauchen, aber schlimmer ist die
kombinatorische Explosion, die in der Natur der Aufgabenstellung liegt.
Wozu brauchst du das überhaupt?

>>Was genau ist Dein Problem?
>
> Wie vergleiche ich den Text? Das dies mit einem RegExp geschieht,
> ist mir schon klar. Nur die herangehensweise (unabhaengig von der
> Syntax) ist mir unklar.

Ich sehe nicht, wozu du Regexes braucht. Strings testet
man in Perl mit eq auf Gleichheit.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: trennen/zusammenfassen/vergleichen von Text

am 08.10.2007 12:41:05 von Oliver Beck

Frank Seitz schrieb:
> Oliver Beck wrote:
>> Frank Seitz schrieb:
>>> Wie sieht Dein bisheriger Lösungsansatz aus?
>> Noch sieht er garnicht aus.
>> Da ich noch nicht wirklich weiss, wie ich das loesen koennte.
>
> Dann mache dir Gedanken. Diese NG ist nicht dafür da,
> Aufgabenstellungen hineinzustellen und fertige Lösungen
> herauszubekommen.

Nein ... davon ging ich auch nicht aus ... da ich aber bisher nicht
wirklich weiss, wie ich dieses Problem loesen koennte (voellig
unabhaengig von der Umsetzung) dachte ich hier etwaige Denkanstoesse
zu erhalten.

> Das wird viel Speicher verbrauchen, aber schlimmer ist die
> kombinatorische Explosion, die in der Natur der Aufgabenstellung liegt.
> Wozu brauchst du das überhaupt?

Eine Bekannte von mir ist Uebersetzerin. Sie wird bei dem zu
uebersetzenden Text nach Zeilen bezahlt. Diese sind aber nochmal
gestaffelt. Wenn in einer Zeile vorkommen von Phrasen sind, die mehrmals
im Text vorkommen, sinkt der 'Wert' dieser Zeile. Je nachdem, wieviel %
des Satzes doppelt/mehrfach sind.

Sie moechte nun die Ergebnisse selbst ueberpruefen. Und dafuer eben
dieses Script.

> Ich sehe nicht, wozu du Regexes braucht. Strings testet
> man in Perl mit eq auf Gleichheit.

Eben sowas meinte ich mit Denksanstoss ;)


Mit freundlichen Gruessen/Best Regards Oliver Beck

--
/"\ -ASCII-Ribbon-Campaign- |
\ / Against HTML Mail |
X | -- German GNU/Hurd documentation --
/ \ | - http://de-hurd-doc.berlios.de -

Re: trennen/zusammenfassen/vergleichen von Text

am 10.10.2007 23:45:14 von Oliver Beck

Halloechen,

irgendwie haenge ich schon am ersten Punkt ... Das einlesen und trennen
der Datei.

Zum trennen habe ich mich fuer split() entschieden, da es meiner Meinung
nach die treffendste Funktion darstellt. Korrigiert mich, wenn ich mich
irre.

Wie kann ich denn split() mehr als einen Trenner uebergeben?
Ich versuchte es mit

'my @arr_getrenntesaetze = split /\.|\!|\?/, ;'

was allerdings nicht zu erwuenschten Erfolg fuehrte.


Fuer das vergleichen des Textes habe ich folgendes im Auge:

Wenn die Datei eingelesen und korrekt getrennt ist, sodass jeder
einzelne Satz in einem Array-Element steht, dachte ich da an zwei
Schleifen.

foreach my $satzzumvergleich1 (@arr_getrenntesaetze) {
#1. Woerter zaehlen (fuer die Prozentberechnung)
#2. Element aus dem Array entfernen bzw. in ein weiteres, temporaeres
Array schreiben (sodass es im folgenden Schritt nicht mit sich
selbst verglichen wird)
foreach my $satzzumvergleich2 (@arr_getrenntesaetze) {
#1. Woerter zaehlen
#2. wortweises vergleichen von beiden Saetzen:
- zuerst schauen, ob gleiche Worte im Satz vorkommen
- wenn dies der Fall, schauen, ob das folgende Wort sich auch
gleicht
- vorhergehenden Schritt solange wiederholen, bis es kein sich
gleichendes und aufeinanderfolgendes Wort mehr gibt.
- zaehlen der sich gleichenden Woerter/Wortpaarungen
}
}

Irgendwie an sowas dachte ich ...


Mit freundlichen Gruessen/Best Regards Oliver Beck

--
/"\ -ASCII-Ribbon-Campaign- |
\ / Against HTML Mail |
X | -- German GNU/Hurd documentation --
/ \ | - http://de-hurd-doc.berlios.de -

Re: trennen/zusammenfassen/vergleichen von Text

am 11.10.2007 00:12:10 von Wolf Behrenhoff

Oliver Beck schrieb:
> Halloechen,
>
> irgendwie haenge ich schon am ersten Punkt ... Das einlesen und trennen
> der Datei.
>
> Zum trennen habe ich mich fuer split() entschieden, da es meiner Meinung
> nach die treffendste Funktion darstellt. Korrigiert mich, wenn ich mich
> irre.
>
> Wie kann ich denn split() mehr als einen Trenner uebergeben?
> Ich versuchte es mit
>
> 'my @arr_getrenntesaetze = split /\.|\!|\?/, ;'
>
> was allerdings nicht zu erwuenschten Erfolg fuehrte.

Warum nicht? Bei mir trennt das wie gewünscht.
Allerdings musst du natürlich beachten, dass du so nur die erste Zeile
einliest. Wenn deine Datei also mehrzeilig ist, kannst du z.B. vorher $/
auf undef setzen.

> Fuer das vergleichen des Textes habe ich folgendes im Auge:

Wie du vergleichst und daraus einen Prozentwert bildest, musst du
letztlich selbst wissen.

Willst du wirklich jeden Satz mit jedem anderen vergleichen oder reicht
es nicht auch, einen Satz mit z.B. den drei oder vier nachfolgenden zu
vergleichen?

Wolf

Re: trennen/zusammenfassen/vergleichen von Text

am 11.10.2007 01:13:38 von Oliver Beck

Wolf Behrenhoff schrieb:
> Oliver Beck schrieb:
>> Halloechen,
>>
>> irgendwie haenge ich schon am ersten Punkt ... Das einlesen und trennen
>> der Datei.
>>
>> Zum trennen habe ich mich fuer split() entschieden, da es meiner Meinung
>> nach die treffendste Funktion darstellt. Korrigiert mich, wenn ich mich
>> irre.
>>
>> Wie kann ich denn split() mehr als einen Trenner uebergeben?
>> Ich versuchte es mit
>>
>> 'my @arr_getrenntesaetze = split /\.|\!|\?/, ;'
>>
>> was allerdings nicht zu erwuenschten Erfolg fuehrte.
>
> Warum nicht? Bei mir trennt das wie gewünscht.
> Allerdings musst du natürlich beachten, dass du so nur die erste Zeile
> einliest. Wenn deine Datei also mehrzeilig ist, kannst du z.B. vorher $/
> auf undef setzen.

Die Datei wird mehrzeilig sein.
Ich vergass auch, die Whitespaces \r\n zu entfernen, wie es schon Helmut
schrieb.

> Wie du vergleichst und daraus einen Prozentwert bildest, musst du
> letztlich selbst wissen.

Ja ... das ueberlege ich an gegebener Zeit. Wollte nur erstmal die Struktur
darlegen und schauen, ob irgendjemand da einen Pferdefuss sieht.

> Willst du wirklich jeden Satz mit jedem anderen vergleichen oder reicht
> es nicht auch, einen Satz mit z.B. den drei oder vier nachfolgenden zu
> vergleichen?

Nein. Es muessen wirklich alle Saetze miteinander verglichen werden.

>>>> Eine Bekannte von mir ist Uebersetzerin. Sie wird bei dem zu
>>>> uebersetzenden Text nach Zeilen bezahlt. Diese sind aber nochmal
>>>> gestaffelt. Wenn in einer Zeile vorkommen von Phrasen sind, die
>>>> mehrmals im Text vorkommen, sinkt der 'Wert' dieser Zeile. Je
>>>> nachdem, wieviel % des Satzes doppelt/mehrfach sind.

Mit freundlichen Gruessen/Best Regards Oliver Beck

--
/"\ -ASCII-Ribbon-Campaign- |
\ / Against HTML Mail |
X | -- German GNU/Hurd documentation --
/ \ | - http://de-hurd-doc.berlios.de -

Re: trennen/zusammenfassen/vergleichen von Text

am 15.10.2007 10:10:55 von Michael Panteleit

Oliver Beck writes:

> Eine Bekannte von mir ist Uebersetzerin. Sie wird bei dem zu
> uebersetzenden Text nach Zeilen bezahlt. Diese sind aber nochmal
> gestaffelt. Wenn in einer Zeile vorkommen von Phrasen sind, die mehrmals
> im Text vorkommen, sinkt der 'Wert' dieser Zeile. Je nachdem, wieviel %
> des Satzes doppelt/mehrfach sind.

Aber dann gehst Du doch von einer ganz falschen Prämisse aus. Denn
Zeilen sind nicht Sätze und Wörter nicht Phrasen.

Was Du dann also zählst hat mit ziemlicher Sicherheit nichts damit
zutun wofür Deine Bekannte bezahlt wird.

Gruß,
Meikel

Re: trennen/zusammenfassen/vergleichen von Text

am 28.10.2007 17:32:19 von das-mehdorn

Hallo!

* Oliver Beck :

> Da manche Saetze ueber das Zeilenende hinaus gehen, tu ich mich
> etwas schwer, hier ein ('simplen') RegExp zu nutzen.

Ich würde zeilenweise einlesen, einen "Ersetzungshash" generieren und
die Ersatzzeile aufbauen. Immer, wenn ein Satzende auftaucht, würde
ich die Ersatzzeile in ein Array pushen, leeren und weitermachen bis zum
Dateiende.

Zum Ersetzungshash: Du liest ein Wort, z. B. "Das" aus dem String "Das
ist ein Satz", und schreibst in den Hash einen Key "Das" mit dem Wert
"a". Mit dem nächsten Wort "ist" machst du das auch so und nimmst den
nächsten freien Wert "b" für den Key "ist". Der Satz sieht dann nach der
Transformation so aus:

abcd

Angenommen, jetzt käme ein weiterer Satz: "Das Auto ist blau". Dann
könnte das nach der Transformation so aussehen:

aebf

("Auto" wurde ein "e" zugeordnet, "blau" ein "f", der Rest war schon
bekannt. Eventuell will man noch lc() benutzen.)

Und man muß freilich nicht bei "a" anfangen, sondern kann auch gern
beim ersten Zeichen anfangen und die gesamte Unicode-Spanne ausnutzen.
Man hat also über 60000 Zeichen zur Verfügung, was für viele Texte
hoffentlich genügt. Sonst muß man eine andere Lösung suchen.


Danach kann man die minimale Editierdistanz der beiden transformierten
Sätze leicht mit adist aus String::Approx ermitteln, also weiß, wieviele
Änderungen man vornehmen muß, um beide Sätze identisch werden zu lassen.

Falls eine Rücktransformation nötig werden sollte, dreht man besser
erst den Hash um, sonst wird es arg ineffizient. Aber das brauchst du
wohl nicht.

> - Vergleichen der einzelnen Saetze miteinander

Du würdest dann vermutlich die mittlere Länge der beiden Sätze mit der
Editierdistanz ins Verhältnis setzen.

Christoph

--
Uebrigens ist mir der Sinn des Lichts im Kuehlschrank bisher
entgangen. Wenn ich den Kuehlschrank aufmache, ist es ohnehin hell
und ausgerechnet dann, wenn ich ihn zumache und es also drinnen
wirklich dunkel ist, geht dort das Licht aus. (Vinzent Hoefler)

Re: trennen/zusammenfassen/vergleichen von Text

am 28.10.2007 22:13:02 von Helmut Wollmersdorfer

Christoph 'Mehdorn' Weber wrote:

> * Oliver Beck :

>> Da manche Saetze ueber das Zeilenende hinaus gehen, tu ich mich
>> etwas schwer, hier ein ('simplen') RegExp zu nutzen.

> Ich würde zeilenweise einlesen, einen "Ersetzungshash" generieren und
> die Ersatzzeile aufbauen. Immer, wenn ein Satzende auftaucht, würde
> ich die Ersatzzeile in ein Array pushen, leeren und weitermachen bis zum
> Dateiende.

Wozu so kompliziert?
Einfach den ganzen Text in einen String einlesen und zuerst mal die
Zeilenvorschübe mit s/[\r\n]//g (innerhalb von Absätzen) wegwerfen.

Ich mach das eigentlich nurmehr so, dass ich unstrukturiertes Zeugs mal
komplett reinsauge und mir zuerst mit s///g in eine bequeme Form bringe.

Zeitgemässe Computer haben genug Speicher, den man auch nutzen sollte.

Helmut Wollmersdorfer

Re: trennen/zusammenfassen/vergleichen von Text

am 02.11.2007 02:15:31 von Oliver Beck

Christoph 'Mehdorn' Weber schrieb:

[...]

viel interessantes!

[...]

Danke fuer Deine Anregungen, Christoph.
Auch wenn ich momentan mal wieder keine Zeit fuer diese Sache finde,
behalte ich Deine Worte im Hinterkopf.

Bei gegebener Zeit melde ich mich wieder. Je nachdem, wann ich wieder
dazu komme, an dem Programm weiter zu arbeiten.