2 # :Copyright: © 2014 Günter Milde.
3 # Released without warranty under the terms of the
4 # GNU General Public License (v. 2 or later)
7 # Aussortieren von Wörtern aus einer Liste
8 # ===============================================================
12 """Aussortieren von Wörtern aus einer Liste.
14 Eingabe: 1 ungetrenntes Wort oder Eintrag im Wortliste-Format pro Zeile.
16 Ausgabe: Zeilen, die den Filterkriterien entsprechen.
18 Bsp: python filter_neueintraege.py -n -a < german.dict > neu.todo
24 # -h, --help kurze Hilfe
26 # -i WORTLISTE, --file=WORTLISTE
27 # Vergleichsdatei, Vorgabe "../../../wortliste"
29 # -n, --neue Wörter die in der Vergleichsliste
30 # wörtlich enthalten sind bei der Ausgabe
33 # -a, --ableitungen Wörter, die sich durch einfache Ersetzungen¹
34 # von Zeichen am Wortende aus Wörtern der
35 # Eingabe bilden lassen bei der Ausgabe
38 # Wenn -n und -a gemeinsam angegeben sind, ist die
39 # Vereinigung von Vergleichsliste und Eingabe die
40 # Basis für den Ausschluß ableitbarer Wörter.
44 # -3, --mindestlaenge Einträge mit 3 oder weniger Buchstaben weglassen
46 # -v, --verbose Aussortierte Wörter nicht überspringen sondern
47 # als Kommentare ausgeben.
54 # Benötigte Python Module::
56 import sys
, os
, optparse
57 from collections
import defaultdict
# Wörterbuch mit Default
59 # path for local Python modules (parent dir of this file's dir)
61 os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
))))
62 from wortliste
import WordFile
, WordEntry
, sortkey_duden
67 # In der Wortliste vorhanden Einträge aussortieren::
69 def filter_neuliste(liste
, words
):
71 if line
.startswith('#'):
74 neukey
= line
.split(';')[0]
78 elif neukey
.title() in words
:
79 altkey
= neukey
.title()
80 elif neukey
.lower() in words
:
81 altkey
= neukey
.lower()
86 yield '# %s ∃ %s' % (neukey
, altkey
)
92 # ``(<alt>, <neu>)`` Paare von Endungen. filter_ableitungen_ sortiert
93 # Wörter aus, wenn die Ersetzung <neu> → <alt> ein Wort ergibt, dass
94 # in der Vergleichsliste vorhanden ist.
96 # Die hier angegebenen Ableitungsregeln reduzieren die Wortliste
97 # (``../../../wortliste``) auf ca. 45%. Für die gegenwärtige Wortliste
98 # ist dies nicht gewollt, aber neu einzutragende Zusammensetzungen müssen
99 # nicht mit allen Ableitungsformen aufgenommen werden um korrekte Trennung
100 # zu erreichen. So läßt sich die Wortliste etwas kompakter und leichter
101 # handhabbar halten. ::
109 ('', 'en'), # ! gehen ← geh + 'en'
125 # ('', 'loser'), # ! losere, loserem, loseren, ...
150 # ! Achtung: Kürzen entfernt nicht nur Ableitungen.
151 # (<weglassen>, <hinzufügen<), # Beispiele, Treffer in "wortliste"
153 # ('ben', 'bne'), # ebne ∃ eben (ben←bne) + 1
154 # ('d', 'heit'), # Abwesenheit ∃ abwesend + 25 ! Feinheit ∃ Feind
155 # ('el', 'le'), # bügle ∃ Bügel (el←le) + 180 ! Apple ∃ Appel
156 ('en', 'barkeit'), # Dankbarkeit ∃ danken (en←barkeit) + 100
157 ('en', 'em'), # anderem ∃ anderen (en←em) + 4200
158 ('en', 'er'), # Abbeizer ∃ abbeizen (en←er) + 3800
159 ('en', 'es'), # # dickestes ∃ dickesten + 3783
161 ('en', 't'), # abbiegt ∃ abbiegen (en←t) + 7200
162 ('en', 'te'), # abbuchte ∃ abbuchen (en←te) # 2900
163 ('er', 'erei'), # Bäckerei ∃ Bäcker (er←erei) + 100
164 ('er', 'ens'), # Absendens ∃ Absender (er←ens) + 360
165 # ('er', 'in'), # Göttin ∃ Götter (er←in) + 30 ! Hein ∃ Heer, mein ∃ Meer, hin ∃ her
166 ('er', 'ung'), # Ablesung ∃ Ableser (er←ung) + 500
167 ('er', 'ungen'), # Ablesungen ∃ Ableser + 200
168 ('eren', 'tion'), # Addition ∃ addieren (eren←tion) + 9
169 ('eren', 'sch'), # basisch ∃ basieren (eren←sch) + 30 ! logisch ∃ logieren
170 ('ern', 'ere'), # abfedere ∃ abfedern (ern←ere) + 500
171 ('es', 'ste'), # starrste ∃ starres (es←ste) + 3
172 ('in', 'e'), # Amtsärzte ∃ Amtsärztin (in←e) + 200 ! Allee ∃ allein
173 ('in', 'en'), # Anwälten ∃ Anwältin (in←en) + 252 ! amen ∃ Amin
174 ('ln', 'le'), # abhobele ∃ abhobeln (ln←le) + 300
175 ('lt', 'le'), # abfeile ∃ abfeilt (lt←le) + 300
176 ('mus', 'men'), # Organismen ∃ Organismus (mus←men) + 60
177 ('mus', 'tik'), # Amerikanistik ∃ Amerikanismus (mus←tik)
178 # ('n', 'er'), # Belagerer ∃ belagern (n←er) + 70 ! Bier ∃ bin, Feier ∃ fein, Gier ∃ Gin
179 ('n', 'st'), # behexest ∃ behexen (n←st) # 670
180 # ('o','en'), # Risiken ∃ Risiko (o←en) + 50 ! essen ∃ Esso, harren ∃ Harro, lassen ∃ Lasso, wiesen ∃ wieso, Metren ∃ Metro,
181 ('re', 'ste'), # absurdeste ∃ absurdere + 400
182 # ('ren', 'rne'), # geschorne ∃ geschoren (ren←rne) + 1
183 ('ren', 'rst'), # abhörst ∃ abhören (ren←rst) + 1000
185 ('rn', 'rung'), # Kaperung ∃ Kapern (rn←rung) + 20
186 ('rt', 're'), # abhöre ∃ abhört (rt←re) + 1000
187 ('s', 'sere'), # blassere ∃ blass (s←sere) + 60
188 ('s', 'sse'), # Albatrosse ∃ Albatros + 500
189 ('s', 'sses'), # Atlasses ∃ Atlas +10 !Bisses ∃ bis
190 ('sen', 'sne'), # abgerissne ∃ abgerissen + 2
191 ('t', 'bar'), # ablegbar ∃ ablegt (t←bar) # 600
194 ('t', 'baren'), # 570
195 ('t', 'barer'), # 560
196 ('t', 'bares'), # 590
197 ('t', 'e'), # abbeiße ∃ abbeißt + 3200 ! Gehabe ∃ gehabt (t←e)
198 ('t', 'n'), # abändern ∃ abändert (t←n) + 4000
199 ('t', 'st'), # abbiegst ∃ abbiegt (t←st) + 6000
200 # ('ten', 'mus'), ! Autismus ∃ Autisten
201 ('ten', 'tung'), # Abgeltung ∃ Abgelten + 35
202 ('um', 'a'), # Aktiva ∃ Aktivum (um←a) + 65 ! Alba ∃ Album
203 ('us', 'en'), # Globen ∃ Globus (us←en) + 40
204 # ('ß', 'sse'), # Betonflußabrisse ∃ Betonflußabriß (ß←sse) + 0
208 # filter_ableitungen()
209 # --------------------
211 # Aussortieren von häufigen Ableitungen aus den Einträgen der `liste`::
213 def filter_ableitungen(liste
, words
):
215 if line
.startswith('#'):
218 key
= line
.split(';')[0]
220 for alt
, neu
in endungen
:
221 if not key
.endswith(neu
):
223 basis
= key
[:-len(neu
)] + alt
227 basis
= basis
.lower()
231 basis
= basis
.title()
237 # Ein aussortiertes Wort, soll für den Rest der Liste nicht mehr
238 # als Basis einer Ableitung dienen:
241 yield '# %s ∃ %s (%s←%s)' % (key
, basis
, alt
, neu
)
247 if __name__
== '__main__':
249 # Pfad zu "../../../wortliste" unabhängig vom Arbeitsverzeichnis::
251 default_wortliste
= os
.path
.relpath(os
.path
.join(
252 os
.path
.dirname(os
.path
.dirname(os
.path
.dirname(os
.path
.dirname(
253 os
.path
.abspath(__file__
))))),
258 usage
= '%prog [Optionen]\n' + __doc__
260 parser
= optparse
.OptionParser(usage
=usage
)
261 parser
.add_option('-i', '--file', dest
='wortliste',
262 help='Vergleichsdatei, Vorgabe "%s"'%default
_wortliste
,
263 default
=default_wortliste
)
264 parser
.add_option('-n', '--neue', action
='store_true',
265 help='in WORTLISTE vorhandene Wörter aussortieren',
267 parser
.add_option('-a', '--ableitungen', action
='store_true',
268 help='Ableitungen aussortieren',
270 parser
.add_option('-3', '--mindestlaenge', action
='store_true',
271 help='Einträge mit 3 oder weniger Buchstaben weglassen',
273 parser
.add_option('-v', '--verbose', action
='store_true',
274 help='nur auskommentieren')
275 (options
, args
) = parser
.parse_args()
279 lines
= [line
.rstrip() for line
in sys
.stdin
]
286 for line
in open(options
.wortliste
):
287 if line
.startswith('#'):
289 key
= line
.split(';')[0]
295 lines
= [line
for line
in filter_neuliste(lines
, words
)]
297 if options
.mindestlaenge
:
298 lines
= [line
for line
in lines
299 if len(line
.split(';')[0]) > 3]
301 if options
.ableitungen
:
302 # Vergleichsmenge ergänzen:
304 if line
.startswith('#'):
306 key
= line
.split(';')[0]
309 lines
= [line
for line
in filter_ableitungen(lines
, words
)]