Skripte zum Abgleich mit externen Wortlisten.
[wortliste.git] / skripte / python / abgleich_neueintraege.py
blobf64ca63b72b050d25f790907f172c8e277d85442
1 #!/usr/bin/env python
2 # -*- coding: utf8 -*-
3 # :Copyright: © 2011 Günter Milde.
4 # Released without warranty under the terms of the
5 # GNU General Public License (v. 2 or later)
6 # :Id: $Id: $
8 # Versuche Trennstellen neuer Wörter aus vorhandenen zu ermitteln
9 # ===============================================================
11 # Übertragen von kategorisierten Trennstellen vorhandener Wörter
12 # auf neu aufzunehmende, ungetrennte Wörter.
14 # Erwartet eine Datei mit 1 Wort/Zeile.
16 # Erstellt einen Patch mit den Wörtern, welche durch Abgleich mit der
17 # Datenbasis getrennt werden konnten.
18 # ::
20 import re, sys, codecs, copy, os
21 from werkzeug import WordFile, WordEntry, join_word, toggle_case
22 # sort.py im Überverzeichnis:
23 sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
24 from sort import sortkey_duden
26 # Konfiguration
27 # -------------
29 # Sprachvarianten
30 # ~~~~~~~~~~~~~~~
31 # Sprach-Tag nach [BCP47]_::
33 # sprachvariante = 'de-1901' # "traditionell"
34 sprachvariante = 'de-1996' # Reformschreibung
35 # sprachvariante = 'de-1901-x-GROSS' # ohne ß (Schweiz oder GROSS)
36 # sprachvariante = 'de-1996-x-GROSS' # ohne ß (Schweiz oder GROSS)
37 # sprachvariante = 'de-CH-1901' # ohne ß (Schweiz) ("süssauer")
39 # Funktionen
40 # -----------
42 # Übertrag von Einträgen auf Wörter mit anderer Endung::
44 def endungsabgleich(key, alt, neu, grossklein=False):
46 if not key.endswith(join_word(neu)):
47 return ''
49 altkey = key[:-len(join_word(neu))] + join_word(alt)
50 if grossklein:
51 altkey = toggle_case(altkey)
53 try:
54 altentry = words[altkey]
55 except KeyError:
56 return ''
58 entry = WordEntry(key)
59 # print "fundum", key, unicode(entry)
60 for wort in altentry[1:]:
61 if not wort.startswith(u'-'):
62 if alt:
63 wort = wort[:-len(alt)]
64 wort += neu
65 if grossklein:
66 wort = toggle_case(wort)
67 if join_word(wort) != key:
68 print u"# Übertragungsproblem: %s -> %s (%s,%s) %s" % (
69 altkey, key, alt, neu, wort)
70 return ''
71 entry.append(wort)
73 return entry
76 # Endungen
77 # --------
78 # ``(<alt>, <neu>)`` Paare von Endungen
80 # Achtung: die Auswahl zu testender Wörter erfolgt anhand der "neu"-Endung.
81 # Daher darf diese nicht leer sein!
82 # ::
84 endungen = [
85 (u'', u'-de'),
86 # (u'', u'-en'),
87 # (u'', u'-er'),
88 # (u'', u'-is-mus'),
89 # (u'', u'-ität'),
90 (u'', u'-lein'),
91 (u'', u'-ne'),
92 (u'', u'-nem'),
93 (u'', u'-nen'),
94 (u'', u'-ner'),
95 (u'', u'-sche'),
96 (u'', u'-tum'),
97 (u'', u'>ar-tig'),
98 (u'', u'>chen'),
99 (u'', u'>heit'),
100 (u'', u'>keit'),
101 (u'', u'>schaft'),
102 (u'', u'>schaft'),
103 (u'', u'>weise'),
104 # (u'', u'd'),
105 # (u'', u'e'),
106 # (u'', u'e-rin'),
107 # (u'', u'er'),
108 # (u'', u'is-mus'),
109 # (u'', u'm'),
110 # (u'', u'n'),
111 # (u'', u'ner'),
112 # (u'', u'r'),
113 # (u'', u's'),
114 # (u'', u's-te'),
115 # (u'', u's-te'),
116 # (u'', u's>los'),
117 # (u'', u'st'),
118 # (u'', u't'),
119 # (u'', u't-te'),
120 (u'-al', u'a-le'),
121 (u'-an', u'a-ne'),
122 (u'-at', u'a-te'),
123 (u'-ben', u'b-ne'),
124 # (u'-che', u'ch'),
125 (u'-de', u'd'),
126 (u'-en', u'>bar>keit'),
127 # (u'-en', u'e'),
128 (u'-en', u'e-ne'),
129 (u'-er', u'e-rei'),
130 (u'-er', u'e-rin'),
131 (u'-ern', u'e-re'),
132 (u'-ge', u'g'),
133 (u'-gen', u'g'),
134 (u'-in', u'i-ne'),
135 (u'-on', u'o-nen'),
136 (u'-re', u'r'),
137 (u'-re', u'rt'),
138 (u'-ren', u'r-ne'),
139 (u'-ren', u'rt'),
140 (u'-sche', u'sch'),
141 (u'-sen', u's-ne'),
142 (u'-sten', u's-mus'),
143 (u'-te',u't'),
144 (u'-tern', u't-re'),
145 (u'-ös', u'ö-se'),
146 (u'a', u'-ar'),
147 (u'a', u'-as'),
148 (u'b', u'-be'),
149 (u'b', u'-ber'),
150 (u'bar', u't'),
151 (u'bt', u'b-te'),
152 (u'ce', u'-cen'),
153 (u'ch', u'-che'),
154 (u'ch', u'-cher'),
155 (u'ck', u'-cke'),
156 (u'ck', u'-cker'),
157 (u'd', u'-de'),
158 (u'd', u'-dem'),
159 (u'd', u'-den'),
160 (u'd', u'-der'),
161 (u'd', u'-des'),
162 (u'd', u'>heit'),
163 (u'e', u'-en'),
164 (u'e-ren', u'-ti-on'),
165 (u'e-ren', u'sch'),
166 (u'el', u'le'),
167 # (u'en', u'e'),
168 (u'en', u'em'),
169 (u'en', u'en-de'),
170 (u'en', u'end'),
171 (u'en', u'er'),
172 (u'en', u'es'),
173 (u'en', u'est'),
174 (u'en', u't'),
175 (u'en', u'te'),
176 (u'en', u'us'),
177 (u'end',u'en' ),
178 # (u'er', u'e'),
179 (u'er', u'e-rei'),
180 (u'er', u'ens'),
181 (u'er', u'in'),
182 (u'er', u'ung'),
183 (u'es', u'est'),
184 (u'es', u's-te'),
185 (u'f', u'-fe'),
186 (u'f', u'-fer'),
187 (u'g', u'-ge'),
188 (u'g', u'-gen'),
189 (u'g', u'-ger'),
190 (u'g', u'-ger'),
191 (u'g', u'-ges'),
192 (u'g', u'-gung'),
193 (u'ie', u'e'),
194 (u'in', u'en'),
195 (u'isch', u'i-sche'),
196 (u'k', u'-ke'),
197 (u'k', u'-ken'),
198 (u'k', u'-ker'),
199 (u'l', u'-le'),
200 (u'l', u'-len'),
201 (u'l', u'-ler'),
202 (u'l', u'-lis-mus'),
203 (u'le', u'-ler'),
204 (u'li-che', u'tem'),
205 (u'li-che', u'ten'),
206 (u'ln', u'-le'),
207 (u'lt', u'-le'),
208 (u'm', u'-me'),
209 (u'm', u'-mer'),
210 (u'me', u'-men'),
211 (u'mus', u'men'),
212 (u'mus', u'ten'),
213 (u'mus', u'tik'),
214 (u'n', u'-at'),
215 (u'n', u'-er'),
216 (u'n', u'-ne'),
217 (u'n', u'-nen'),
218 (u'n', u'-nis-mus'),
219 (u'n', u'r'),
220 (u'n', u'st'),
221 (u'n', u't'),
222 (u'n',u'-ner'),
223 (u'nd',u'n'),
224 (u'ne',u'ner'),
225 # (u'ne',u'n'),
226 (u'o',u'-on'),
227 (u'o',u'-os'),
228 (u'o',u'en'),
229 (u'on',u'o-nen'),
230 (u'p', u'-pe'),
231 (u'p', u'-pen'),
232 (u'p', u'-per'),
233 (u'ph', u'-phen'),
234 (u'ph', u'-phis-mus'),
235 (u'r', u'-re'),
236 (u'r', u'-rei'),
237 (u'r', u'-ren'),
238 (u'r', u'-rin'),
239 (u'r', u'-ris-mus'),
240 (u'r', u'-rung'),
241 (u're', u'ste'),
242 (u'ren', u'r-te'),
243 (u'ren', u'rst'),
244 (u'ren', u'rt'),
245 (u'rn', u'-re'),
246 (u'rn', u'-rung'),
247 (u'rn', u'-rung'),
248 (u'rt', u'-re'),
249 (u'rt', u'r-te'),
250 (u's', u''),
251 (u's', u'-se'),
252 (u's', u'-se-re'),
253 (u's', u'-se-res'),
254 (u's', u'-ser'),
255 (u's', u's-se'),
256 (u's', u's-ses'),
257 (u'sch', u'-sche'),
258 (u'sch', u'-schen'),
259 (u'sch', u'-scher'),
260 (u'st', u'-ste'),
261 (u'st', u'-sten'),
262 (u'st', u'n'),
263 (u't', u'-ba-re'),
264 (u't', u'-bar'),
265 (u't', u'-te'),
266 (u't', u'-te'),
267 (u't', u'-ten'),
268 (u't', u'-ter'),
269 (u't', u'-tes'),
270 (u't', u'-tin'),
271 (u't', u'-tis-mus'),
272 # (u't', u'e'),
273 (u't', u'n'),
274 (u't', u'st'),
275 (u'te', u'le'),
276 # (u'te', u't'),
277 (u'ten', u'mus'),
278 (u'ten', u'ren'),
279 (u'ten', u'tung'),
280 (u'ter', u'te-ren'),
281 (u'ti-on', u'tor'),
282 (u'um', u'a'),
283 (u'us', u'en'),
284 (u'v', u'-ve'),
285 (u'v', u'-ver'),
286 (u'v', u'-vis-mus'),
287 (u'-ve', u'v'),
288 (u'z', u'-ten'),
289 (u'z', u'-ze'),
290 (u'z', u'-zen'),
291 (u'z', u'-zer'),
292 (u'ß', u'-ße'),
293 (u'ß', u's-se'),
294 (u'ös', u'ö-se'),
297 if __name__ == '__main__':
299 # sys.stdout mit UTF8 encoding.
300 sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
302 # `Wortliste` einlesen::
304 wordfile = WordFile('wortliste-expandiert') # + Teilwort-Entries
305 words = wordfile.asdict()
307 neuwortdatei = open("zusatzwörter-de-1996-hunspell-compact")
308 neueintraege = []
309 neueintraege_grossklein = []
311 # Erstellen der neuen Einträge::
313 for line in neuwortdatei:
314 key = line.decode('utf8').strip()
316 if len(key) <= 3:
317 continue
319 # Test auf vorhandene (Teil-) Wörter:
321 try:
322 entry = words[key]
323 neueintraege.append(entry)
324 continue
325 except KeyError:
326 pass
327 # kleingeschrieben
328 try:
329 entry = words[key.lower()]
330 neueintraege_grossklein.append(entry)
331 continue
332 except KeyError:
333 pass
334 # Großgeschrieben
335 try:
336 entry = words[key.title()]
337 neueintraege_grossklein.append(entry)
338 continue
339 except KeyError:
340 pass
342 # Endungsabgleich::
344 for alt, neu in endungen:
345 entry = endungsabgleich(key, alt, neu, grossklein=False)
346 if entry:
347 neueintraege.append(entry)
348 # break
350 for alt, neu in endungen:
351 entry = endungsabgleich(key, alt, neu, grossklein=True)
352 if entry:
353 neueintraege_grossklein.append(entry)
354 # break
357 # Patch erstellen::
359 print u'# als Teilwörter'
360 for entry in neueintraege:
361 print unicode(entry)
362 print
363 print u'# als Teilwörter (andere Großschreibung)'
364 for entry in neueintraege_grossklein:
365 print unicode(entry)