deutsches Stemming
Christoph Zurnieden
- javascript
Hallo zusammen,
da meine stille Hoffnung sich nicht erfüllte, das schon jemand einen deutschen Stemmer in Javascript gebastelt hat, wollte ich nun selber einen basteln. Ist kein problem, dacht ich mir, eine Anleitung gibt's hier, aber wenn ich schon mal beginne zu denken ... ;-)
Bis Punkt zwei einschließlich ging's ja noch flott voran, aber die Anweisungen für Schritt drei sind mir unklar.
<rant>Was ist denn so schlecht an (E)BNF?</rant>
Ich könnte das ganze Geschrumms natürlich so schreiben, wie ich das verstehe, müßte dann aber auch das Backend selber schreiben. Das ist aber ja schon vorhanden, deshalb sollte der Javascriptstemmer dazu passen.
Was tun? Lerne ich jetzt Snowball? Wenig nützlich, da wurden schon für fast alle indogermanischen Sprachen sowie einige der finnisch-ugurischen Stemmer gebastelt.
Den generierten Code auseinanderklamüsern? Das ist bei autogeneriertem Code meistens eine Heidenarbeit, so auch hier.
Ein Javascriptbackend für den Snowballcompiler schreiben? Verlockend, aber _soviel_ wollt' ich da jetzt wirklich nicht reinstecken ;-)
Mal im Selfforum fragen? Ja, das scheint mir doch eine gute Idee:
Könnte mir jemand sagen, was sich unter Schritt 3 bei o.a. Link genau verbirgt? Beispielcode wäre natürlich sehr nett (Laufzeit ziemlich egal, muß immer nur ein einziges Wort bearbeitet werden) nehme aber natürlich jeden kleinen Tip dankend an.
so short
Cristoph Zurnieden
Hi,
Könnte mir jemand sagen, was sich unter Schritt 3 bei o.a. Link genau verbirgt?
die Beschreibung erscheint mir ziemlich eindeutig; davon abgesehen, dass ich jetzt die Bedeutung von "R2" nicht nachgelesen habe. Könntest Du eventuell Dein Problem etwas näher erläutern?
Cheatah
Hi,
Könnte mir jemand sagen, was sich unter Schritt 3 bei o.a. Link genau verbirgt?
die Beschreibung erscheint mir ziemlich eindeutig; davon abgesehen, dass ich jetzt die Bedeutung von "R2" nicht nachgelesen habe. Könntest Du eventuell Dein Problem etwas näher erläutern?
Das Wort wird relativ willkürlich (Nein, natürlich nicht tatsächlich willkürlich, aber ich bin ja auch kein gelernter Linguistiker) in drei Teile geteilt:
R0 ist der Anfang des Wortstammes
R1 und R2 gehen bis zum Ende des Wortes, sind die Teiel, die aktiv bearbeitet werden und was da übrigbleibt, wenn überhaupt, wird an R0 wieder angehangen.
Die Reihenfolge entspricht der Leserichtung v.l.n.r., R1 und R2 überlappen und können auch 0 sein. Hier ist eine kurze aber auch bessere Beschreibung benebst Skizze.
Mein Problem ist die etwas unklare Formulierung der Beschreibung zu Schritt 3. "Ziemlich eindeutig" ist die nämlich leider nur auf den ersten Blick ;-}
end, ung
delete if in R2
if preceded by ig, delete if in R2 and not preceded by e
Das erste ist noch eindeutig, doch was bedeutet das Zweite?
"[^e]ig(end|ung)" oder "ig^e"? An anderer Stelle wird gesagt, das "preceded" nicht an die Grenzen von R[012] gebunden ist, d.h. kann das "[^e]" auch in R1 oder R0 sein? Dito für die anderin möglichen Kombinationen? Es sind ja insgesamt leider zuviele, um sie einfach "mal eben" durchzuprobieren. Eine gewisse Fehlertoleranz kann man ja zugestehen (muß man ja auch, da Umlaute auch als ae,oe usw geschrieben werden könnten), aber ich vermute, das es einfach zuviel an Fehlern wird, wenn ich den dritten Schritt versaue.
so short
Christoph Zurnieden
Hi,
R0 ist der Anfang des Wortstammes
R1 und R2 [...]
okay, danke.
if preceded by ig, delete if in R2 and not preceded by e
Das erste ist noch eindeutig, doch was bedeutet das Zweite?
Ich würde das als logische Reihenfolge ansehen:
"[^e]ig(end|ung)" oder "ig^e"?
"If preceded bei ig" ist im zweiten Fall nicht gegeben. Damit reduzieren sich die zwei Interpretationsmöglichkeiten des Gesamtsatzes auf eine.
An anderer Stelle wird gesagt, das "preceded" nicht an die Grenzen von R[012] gebunden ist, d.h. kann das "[^e]" auch in R1 oder R0 sein?
Demnach ja. Vielleicht könntest Du Deinen Algorithmus optimieren, indem Du die Betrachtung von R2 einfach (bzw. bei Bedarf) als String-Ende-Analyse ansiehst. Übrigens lautet das Muster für "'foo' steht nicht da" "(?!foo)".
Dito für die anderin möglichen Kombinationen? Es sind ja insgesamt leider zuviele, um sie einfach "mal eben" durchzuprobieren.
Naja, die Zahl ist endlich :-) Ich finde es lediglich etwas unschön, dass man das längste Ergebnis suchen soll.
Eine gewisse Fehlertoleranz kann man ja zugestehen (muß man ja auch, da Umlaute auch als ae,oe usw geschrieben werden könnten), aber ich vermute, das es einfach zuviel an Fehlern wird, wenn ich den dritten Schritt versaue.
Gut möglich. Falls es die Usecases zulassen, solltest Du ggf. definieren, dass Umlaute auch als solche geschrieben sind.
Cheatah
Hi,
if preceded by ig, delete if in R2 and not preceded by e
Das erste ist noch eindeutig, doch was bedeutet das Zweite?Ich würde das als logische Reihenfolge ansehen:
"[^e]ig(end|ung)" oder "ig^e"?
"If preceded bei ig" ist im zweiten Fall nicht gegeben.
Argh, ja, jetzt wo Du's sagst seh' ich's auch ;-)
Danke!
Mitunter ist wird man ja betriebsblind vom Starren auf die Zeilen, so ist es mir wohl auch hier ergangen.
Vielleicht könntest Du Deinen Algorithmus optimieren, indem Du die Betrachtung von R2 einfach (bzw. bei Bedarf) als String-Ende-Analyse ansiehst.
Hier wird nix optimiert, erst muß es funktionieren! ;-)
Aber so ähnlich habe ich es auch schon in einem Teil der vorherigen Schritte getan.
Wenn auch nicht unbedingt mit voller Absicht ;-)
Übrigens lautet das Muster für "'foo' steht nicht da" "(?!foo)".
Das habe ich mich nicht getraut, da ich nicht genau weiß, wie abwärtskompatibel das ist. Sollte wenn möglich auch auf den "Vierern" funktionieren
Eine gewisse Fehlertoleranz kann man ja zugestehen (muß man ja auch, da Umlaute auch als ae,oe usw geschrieben werden könnten), aber ich vermute, das es einfach zuviel an Fehlern wird, wenn ich den dritten Schritt versaue.
Gut möglich. Falls es die Usecases zulassen, solltest Du ggf. definieren, dass Umlaute auch als solche geschrieben sind.
Der Fehler ist schon mit eingearbeitet, da ich auf der Backendseite die (bereits fertige) C-Version benutzen wollte und die basiert auf dem gleichem Algorithmus. Und bis Schritt 3 ging das ja auch alles wie geschmiert, obwohl ich nur ein äußerst besch...eidener (Javascript-)Programmierer bin.
Aber auf jeden Fall erstmal meine herzlichsten Dank, jetzt komme ich wieder weiter.
so short
Crhistoph Zurnieden
Hallo,
end, ung
delete if in R2
if preceded by ig, delete if in R2 and not preceded by eDas erste ist noch eindeutig, doch was bedeutet das Zweite?
"[^e]ig(end|ung)" oder "ig^e"?
Erstes, würde ich sagen.
Wortendungen ...eigung und eigend kommen vor. Wortendungen ...igeung bzw. igeend wohl eher nicht ;-))
Die Regel soll wohl den Stamm aus:
Beerdigung -> Beerd -> be erd -> Erde
beleidigend -> beleid -> be leid -> Leid
herausfinden
aber sowas wie
Neigung -> Ne
verschweigend -> verschwe -> ver schwe
verhindern.
viele Grüße
Axel
Hi,
"[^e]ig(end|ung)" oder "ig^e"?
Erstes, würde ich sagen.
Damit wärt ihr schon zwei, denn will ich das mal glauben ;-)
Wortendungen ...eigung und eigend kommen vor. Wortendungen ...igeung bzw. igeend wohl eher nicht ;-))
Im Deutschem nicht und Fremdworte sollen nicht bearbeitet werden. Ja, es _ist_ wirklich logisch, nur war ich wie vernagelt, ich stand davor und habe es eifach nicht gesehen.
Die Regel soll wohl den Stamm aus:
Beerdigung -> Beerd -> be erd -> Erde
beleidigend -> beleid -> be leid -> Leidherausfinden
Nein, noch nicht einmal. Ist kein linguistisch korrektes Stemming, beschränkt sich auf die Suffixe.
Reicht ja auch für die meisten Zwecke.
aber sowas wie
Neigung -> Ne
Du hast Dir die von mir gelinkte Seite nicht durchgelesen, oder? ;-)
(Mindestmenge von 3 wird bereits beim Teilen eingeführt.)
Aber auch Dir natürlich einen herzlichen Dank für die Hilfe!
so short
Christoph Zurnieden
Hallo Christoph,
so langsam bekomme ich wenigstens ansatzweise einen Eindruck, was mit dem "Stemming" wohl gemeint ist.
Der Begriff sagte mir zunächst nichts, und als ich gestern den Titel deines Postings las, hab ich doch allen Ernstes überlegt, ob es sich hier um eine neue Kraftsportart handelt. *fg*
So long,
Martin
Hi,
so langsam bekomme ich wenigstens ansatzweise einen Eindruck, was mit dem "Stemming" wohl gemeint ist.
Ja, ist vielleicht kein sonderlich gutes Wort dafür, aber hier sollen ja keine, nach allen Regeln der Sprachwissenschaft geformten Stammformen gebildet werden, sondern schlicht Datenreduktion. Deshalb erschien mir die Nutzung eines englischen Wortes sinnvoller.
Der Begriff sagte mir zunächst nichts, und als ich gestern den Titel deines Postings las, hab ich doch allen Ernstes überlegt, ob es sich hier um eine neue Kraftsportart handelt. *fg*
"Extrem Stemming"? ;-)
so short
Christoph Zurnieden
Hallo,
"Extrem Stemming"? ;-)
power worddissectioning *aua* ;-))
viele Grüße
Axel