Update hypenate-neueintraege.py
[wortliste.git] / skripte / python / edit_tools / filter_neueintraege.py
blobbcb323caba8c1e0a180f1af618ea754c8ec6e0f0
1 #!/usr/bin/env python3
2 # :Copyright: © 2014 Günter Milde.
3 # Released without warranty under the terms of the
4 # GNU General Public License (v. 2 or later)
5 # :Id: $Id: $
7 # Aussortieren von Wörtern aus einer Liste
8 # ===============================================================
10 # ::
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
19 """
21 # Optionen
22 # --------
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
31 # überspringen.
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
36 # überspringen.
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.
42 # ¹vgl. Endungen_
44 # -3, --mindestlaenge Einträge mit 3 oder weniger Buchstaben weglassen
46 # -v, --verbose Aussortierte Wörter nicht überspringen sondern
47 # als Kommentare ausgeben.
51 # Abhängigkeiten
52 # --------------
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)
60 sys.path.insert(0,
61 os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
62 from wortliste import WordFile, WordEntry, sortkey_duden
64 # filter_neuliste()
65 # -----------------
67 # In der Wortliste vorhanden Einträge aussortieren::
69 def filter_neuliste(liste, words):
70 for line in liste:
71 if line.startswith('#'):
72 yield line
73 continue
74 neukey = line.split(';')[0]
75 altkey = ''
76 if neukey in words:
77 altkey = neukey
78 elif neukey.title() in words:
79 altkey = neukey.title()
80 elif neukey.lower() in words:
81 altkey = neukey.lower()
82 else:
83 yield line
84 continue
85 if options.verbose:
86 yield '# %s %s' % (neukey, altkey)
89 # endungen
90 # --------
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. ::
103 endungen = [
104 ('', 'artig'),
105 ('', 'chen'),
106 ('', 'd'),
107 ('', 'de'),
108 ('', 'e'),
109 ('', 'en'), # ! gehen ← geh + 'en'
110 ('', 'em'),
111 ('', 'er'),
112 ('', 'es'),
113 ('', 'erin'),
114 ('', 'heit'),
115 ('', 'iat'),
116 ('', 'in'),
117 ('', 'ismus'),
118 ('', 'ismus'),
119 ('', 'ität'),
120 ('', 'keit'),
121 ('', 'lein'),
122 ('', 'los'),
123 ('', 'losem'),
124 ('', 'losen'),
125 # ('', 'loser'), # ! losere, loserem, loseren, ...
126 ('', 'loses'),
127 ('', 'm'),
128 ('', 'n'),
129 ('', 'ne'),
130 ('', 'nem'),
131 ('', 'nen'),
132 ('', 'ner'),
133 ('', 'ner'),
134 ('', 'r'),
135 ('', 's'),
136 ('', 'schaft'),
137 ('', 'sche'),
138 ('', 'slos'),
139 ('', 'st'),
140 ('', 'ste'),
141 ('', 'stem'),
142 ('', 'sten'),
143 ('', 'ster'),
144 ('', 'stes'),
145 ('', 't'),
146 ('', 'tte'),
147 ('', 'tum'),
148 ('', 'ung'),
149 ('', 'weise'),
150 # ! Achtung: Kürzen entfernt nicht nur Ableitungen.
151 # (<weglassen>, <hinzufügen<), # Beispiele, Treffer in "wortliste"
152 # ('bar', 't'), # 0
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
160 # ('en', 'est'), # 0
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
184 # ('ren', 'rt'), 0
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
192 ('t', 'bare'), # 570
193 ('t', 'barem'), # 2
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):
214 for line in liste:
215 if line.startswith('#'):
216 yield line
217 continue
218 key = line.split(';')[0]
219 gibts_schon = False
220 for alt, neu in endungen:
221 if not key.endswith(neu):
222 continue
223 basis = key[:-len(neu)] + alt
224 if basis in words:
225 gibts_schon = True
226 break
227 basis = basis.lower()
228 if basis in words:
229 gibts_schon = True
230 break
231 basis = basis.title()
232 if basis in words:
233 gibts_schon = True
234 break
236 if gibts_schon:
237 # Ein aussortiertes Wort, soll für den Rest der Liste nicht mehr
238 # als Basis einer Ableitung dienen:
239 words.discard(key)
240 if options.verbose:
241 yield '# %s %s (%s%s)' % (key, basis, alt, neu)
242 else:
243 yield line
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__))))),
254 'wortliste'))
256 # Optionen::
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',
266 default=False)
267 parser.add_option('-a', '--ableitungen', action='store_true',
268 help='Ableitungen aussortieren',
269 default=False)
270 parser.add_option('-3', '--mindestlaenge', action='store_true',
271 help='Einträge mit 3 oder weniger Buchstaben weglassen',
272 default=False)
273 parser.add_option('-v', '--verbose', action='store_true',
274 help='nur auskommentieren')
275 (options, args) = parser.parse_args()
277 # Ausgangsliste::
279 lines = [line.rstrip() for line in sys.stdin]
281 # Vergleichsmenge::
283 words = set()
285 if options.neue:
286 for line in open(options.wortliste):
287 if line.startswith('#'):
288 continue
289 key = line.split(';')[0]
290 words.add(key)
292 # Filtern::
294 if options.neue:
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:
303 for line in lines:
304 if line.startswith('#'):
305 continue
306 key = line.split(';')[0]
307 words.add(key)
309 lines = [line for line in filter_ableitungen(lines, words)]
311 # Ausgabe::
313 for line in lines:
314 print(line)