Python-Skript Update.
[wortliste.git] / skripte / python / abgleich_neueintraege.py
blobb198c87f609c56154f8969fe8fed24928ba9f310
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.
15 # Pfad/Dateiname im Abschnitt Konfiguration anpassen!
17 # Schreibt eine Liste von Einträgen für die Wörter, welche durch Abgleich
18 # mit der Datenbasis getrennt werden konnten auf stdout.
20 # Die Liste kann nach ``neu.todo`` gespeichert und (nach Durchsicht) mit
21 # ``prepare_patch.py neu`` in die Wortliste eingepflegt werden.
23 # ::
25 import sys, codecs
26 from collections import defaultdict # Wörterbuch mit Default
27 from werkzeug import WordFile, WordEntry, join_word, toggle_case, sortkey_duden
28 from expand_teilwoerter import expand_wordfile
30 # Konfiguration
31 # -------------
33 # Pfad zur Datei mit den neu einzutragenden Wörtern::
35 # neuwortdatei = "spell/zusatz-de-1996-aspell-compact"
36 neuwortdatei = "spell/dehyph-exptl-MV-KorrekturenA-Z.txt"
37 # neuwortdatei = "spell/DDR.txt"
39 # Vorhandene identische Einträge aus Neueinträgen aussortieren::
41 filtern = False
43 # Funktionen
44 # -----------
46 # Übertrag von Praefixen auf Wörter ohne Präfix::
48 def praefixabgleich(key, praefix, grossklein=False):
50 if key.istitle():
51 praefix = praefix.title()
53 if not key.startswith(join_word(praefix)):
54 return ''
56 altkey = key[len(join_word(praefix)):]
58 if grossklein:
59 altkey = toggle_case(altkey)
61 try:
62 altentry = words[altkey]
63 except KeyError:
64 return ''
66 entry = WordEntry(key)
67 # print "fundum", key, unicode(entry)
68 for wort in altentry[1:]:
69 if not wort.startswith(u'-'):
70 wort = wort.lower()
71 wort = u'<'.join([praefix, wort])
72 entry.append(wort)
74 return entry
76 praefixe = [u'abo',
77 u'ab',
78 u'ab<zu',
79 u'auf<zu',
80 u'aus<zu',
81 u'ein<zu',
82 u'mit<zu',
83 u'um<zu',
84 u'un-ter<zu',
85 u'weg<zu',
86 u'aber',
87 u'ad',
88 u'aero',
89 u'af-ro',
90 u'ag-ro',
91 u'al-lergo',
92 u'al-lein',
93 u'all',
94 u'als',
95 u'am-bi',
96 u'ami-no',
97 u'an-dro',
98 u'an-gio',
99 u'an-thro-po',
100 u'an-ti',
101 u'ang-lo',
102 u'an',
103 u'apo',
104 u'ar-chaeo',
105 u'ar-che',
106 u'ar-chäo',
107 u'ar-terio',
108 u'ar-thro',
109 u'asyn',
110 u'at-mo',
111 u'au-ßer',
112 u'auf',
113 u'aus',
114 u'aus<zu',
115 u'aut',
116 u'ba-ro',
117 u'bak-te-rio',
118 u'be',
119 u'bei',
120 u'ben-zo',
121 u'bi-blio',
122 u'bio',
123 u'che-mo',
124 u'chi-ro',
125 u'chlo-ro',
126 u'cho-reo',
127 u'chro-mo',
128 u'chro-no',
129 u'cy-ano',
130 u'dar',
131 u'de-ka',
132 u'de-zi',
133 u'demo',
134 u'der-ma-to',
135 u'des',
136 u'di-cho',
137 u'di-no',
138 u'dia',
139 u'dis',
140 u'dis-ko',
141 u'down',
142 u'drein',
143 u'durch',
144 u'dys',
145 u'e-tho',
146 u'ego',
147 u'ein',
148 u'elek-tro',
149 u'em-por',
150 u'emp',
151 u'en-do',
152 u'en-te-ro',
153 u'ent',
154 u'epi',
155 u'er-go',
156 u'er',
157 u'es-chato',
158 u'eth-no',
159 u'ety-mo',
160 u'ext-ro',
161 u'ex',
162 u'fe-ro',
163 u'fem-to',
164 u'fer-ro',
165 u'fo-no',
166 u'fort',
167 u'fran-ko',
168 u'für',
169 u'ga-so',
170 u'ge-gen',
171 u'ge-no',
172 u'ge-ron-to',
173 u'geo',
174 u'ge',
175 u'gi-ga',
176 u'gi-gan-to',
177 u'go-no',
178 u'gra-fo',
179 u'gra-pho',
180 u'gy-nä-ko',
181 u'he-lio',
182 u'he-te-ro',
183 u'he-xa',
184 u'hek-to',
185 u'hekt',
186 u'hemi',
187 u'her',
188 u'hier',
189 u'hin',
190 u'hin-ter',
191 u'hint',
192 u'ho-lo',
193 u'ho-mo',
194 u'ho-möo',
195 u'hoch',
196 u'hy-dro',
197 u'hy-per',
198 u'hy-po',
199 u'hym-no',
200 u'hyp-no',
201 u'hä-ma-to',
202 u'hä-mo',
203 u'ideo',
204 u'idio',
205 u'iko-no',
206 u'il',
207 u'im',
208 u'im-mu-no',
209 u'in',
210 u'in-fra',
211 u'in-ter',
212 u'in-tra',
213 u'ins',
214 u'int-ro',
215 u'io-no',
216 u'kar-dio',
217 u'kar-to',
218 u'kata',
219 u'klep-to',
220 u'kli-no',
221 u'kon',
222 u'kon-tra',
223 u'kor-re',
224 u'kos-mo',
225 u'kri-mi-no',
226 u'kri-no',
227 u'kryp-to',
228 u'leu-ko',
229 u'leuk',
230 u'le-xi-ko',
231 u'li-tho',
232 u'lim-no',
233 u'lo-go',
234 u'los',
235 u'lym-pho',
236 u'ma-gne-to',
237 u'mak-ro',
238 u'mam-mo',
239 u'me-ga',
240 u'me-lo',
241 u'me-so',
242 u'me-ta',
243 u'me-teo-ro',
244 u'me-tho-do',
245 u'mik-ro',
246 u'mil-li',
247 u'miss',
248 u'mit',
249 u'mo-no',
250 u'mor-pho',
251 u'mu-si-ko',
252 u'mul-ti',
253 u'my-co',
254 u'my-tho',
255 u'na-no',
256 u'nach',
257 u'ne-ben',
258 u'neo',
259 u'neu-ro',
260 u'neur',
261 u'nie-der',
262 u'no-wo',
263 u'non',
264 u'nost',
265 u'ob',
266 u'oben',
267 u'ober',
268 u'off',
269 u'ohn',
270 u'oli-go',
271 u'olig',
272 u'om-ni',
273 u'on-ko',
274 u'on-to',
275 u'op-to',
276 u'or-tho',
277 u'oszil-lo',
278 u'out',
279 u'over',
280 u'oxy',
281 u'ozea-no',
282 u'pa-ra',
283 u'pa-tho',
284 u'pa-tri',
285 u'pan-to',
286 u'pe-re',
287 u'pen-ta',
288 u'pet-ro',
289 u'phar-ma',
290 u'phar-ma-ko',
291 u'phi-lo',
292 u'phil',
293 u'pho-no',
294 u'pho-to',
295 u'phra-seo',
296 u'phy-lo',
297 u'phy-sio',
298 u'phy-to',
299 u'phä-no',
300 u'pneu-mo',
301 u'po-eto',
302 u'po-li-to',
303 u'po-ly',
304 u'po-ten-tio',
305 u'pro-to',
306 u'prä',
307 u'pseud',
308 u'psy-cho',
309 u'py-ro',
310 u'pä-do',
311 u'päd',
312 u'raus',
313 u're',
314 u'rein',
315 u'ret-ro',
316 u'ri-bo',
317 u'rä-to',
318 u'rück',
319 u'sa-mo',
320 u'sak-ro',
321 u'se-mi',
322 u'seis-mo',
323 u'selb',
324 u'ser-bo',
325 u'si-no',
326 u'so',
327 u'so-zio',
328 u'sou',
329 u'spek-tro',
330 u'ste-no',
331 u'ste-reo',
332 u'ste-tho',
333 u'stra-to',
334 u'su-per',
335 u'sub',
336 u'sup-ra',
337 u'sus',
338 u'syn',
339 u'ta-xo',
340 u'tau-to',
341 u'te-leo',
342 u'te-ra',
343 u'tech-no',
344 u'tele',
345 u'telo',
346 u'ter-mi-no',
347 u'tet-ra',
348 u'ther-mo',
349 u'throm-bo',
350 u'to-mo',
351 u'to-po',
352 u'to-xi-ko',
353 u'tra-gi',
354 u'trans',
355 u'tro-po',
356 u'tur-bo',
357 u'ty-po',
358 u'ul-tra',
359 u'um',
360 u'un',
361 u'un-der',
362 u'un-ter',
363 u'uni',
364 u'ur',
365 u'uro',
366 u'ver',
367 u'vi-no',
368 u'vi-ro',
369 u'vib-ra',
370 u'voll',
371 u'von',
372 u'vor',
373 u'vorn',
374 u'vul-ka-no',
375 u'weg',
376 u'wi-der',
377 u'xe-no',
378 u'xy-lo',
379 u'zen-ti',
380 u'zen-tri',
381 u'zer',
382 u'zu',
383 u'zwie',
384 u'zy-klo',
385 u'zy-to',
386 u'ägyp-to',
387 u'öko',
388 u'über',
391 # Nach Länge sortieren, damit spezifischere zuerst Probiert werden:
392 praefixe.sort(key = len)
393 praefixe.reverse()
396 # Übertrag von Einträgen auf Wörter mit anderer Endung::
398 def endungsabgleich(key, alt, neu, grossklein=False):
400 if not key.endswith(join_word(neu)):
401 return ''
402 OK = True
403 altkey = key[:-len(join_word(neu))] + join_word(alt)
404 if grossklein:
405 altkey = toggle_case(altkey)
407 try:
408 altentry = words[altkey]
409 except KeyError:
410 return ''
412 entry = WordEntry(key)
413 # print "fundum", key, unicode(entry)
414 for wort in altentry[1:]:
415 if not wort.startswith(u'-'):
416 if alt:
417 wort = wort[:-len(alt)]
418 wort += neu
419 if grossklein:
420 wort = toggle_case(wort)
421 if join_word(wort) != key:
422 OK = False
423 entry.append(wort)
424 if OK is False:
425 print u"# Übertragungsproblem: %s -> %s (%s,%s) %s" % (
426 altkey, key, alt, neu, unicode(entry))
427 return ''
429 entry.regelaenderungen()
430 return entry
433 # Endungen
434 # --------
435 # ``(<alt>, <neu>)`` Paare von Endungen::
437 endungen = [
438 (u'', u'-de'),
439 # (u'', u'-en'),
440 # (u'', u'-er'),
441 # (u'', u'-is-mus'),
442 # (u'', u'-ität'),
443 (u'', u'-lein'),
444 (u'', u'-ne'),
445 (u'', u'-nem'),
446 (u'', u'-nen'),
447 (u'', u'-ner'),
448 (u'', u'-sche'),
449 (u'', u'-tum'),
450 (u'', u'>ar-tig'),
451 (u'', u'>chen'),
452 (u'', u'>heit'),
453 (u'', u'>keit'),
454 (u'', u'>los'),
455 (u'', u'>schaft'),
456 (u'', u'>schaft'),
457 (u'', u'>wei-se'),
458 # (u'', u'd'),
459 # (u'', u'e'),
460 # (u'', u'e-rin'),
461 # (u'', u'er'),
462 # (u'', u'is-mus'),
463 # (u'', u'm'),
464 # (u'', u'n'),
465 # (u'', u'ner'),
466 # (u'', u'r'),
467 # (u'', u's'),
468 # (u'', u's-te'),
469 # (u'', u's-te'),
470 # (u'', u's>los'),
471 # (u'', u'st'),
472 # (u'', u't'),
473 # (u'', u't-te'),
474 (u'-al', u'a-le'),
475 (u'-an', u'a-ne'),
476 (u'-at', u'a-te'),
477 (u'-ben', u'b-ne'),
478 # (u'-che', u'ch'),
479 (u'-de', u'd'),
480 (u'-en', u'>bar>keit'),
481 # (u'-en', u'e'),
482 (u'-en', u'e-ne'),
483 (u'-er', u'e-rei'),
484 (u'-er', u'e-rin'),
485 (u'-ern', u'e-re'),
486 (u'-ge', u'g'),
487 (u'-gen', u'g'),
488 (u'-in', u'i-ne'),
489 (u'-on', u'o-nen'),
490 (u'-re', u'r'),
491 (u'-re', u'rt'),
492 (u'-ren', u'r-ne'),
493 (u'-ren', u'rt'),
494 (u'-sche', u'sch'),
495 (u'-sen', u's-ne'),
496 (u'-sten', u's-mus'),
497 (u'-te',u't'),
498 (u'-tern', u't-re'),
499 (u'-ös', u'ö-se'),
500 (u'a', u'ar'),
501 (u'a', u'as'),
502 (u'b', u'-be'),
503 (u'b', u'-ber'),
504 (u'bar', u't'),
505 (u'bt', u'b-te'),
506 (u'ce', u'-cen'),
507 (u'ch', u'-che'),
508 (u'ch', u'-cher'),
509 (u'ck', u'-cke'),
510 (u'ck', u'-cker'),
511 (u'd', u'-de'),
512 (u'd', u'-dem'),
513 (u'd', u'-den'),
514 (u'd', u'-der'),
515 (u'd', u'-des'),
516 (u'd', u'>heit'),
517 (u'e', u'en'),
518 (u'e-ren', u'-ti-on'),
519 (u'e-ren', u'sch'),
520 (u'el', u'le'),
521 # (u'en', u'e'),
522 (u'en', u'em'),
523 (u'en', u'en-de'),
524 (u'en', u'end'),
525 (u'en', u'er'),
526 (u'en', u'es'),
527 (u'en', u'est'),
528 (u'en', u't'),
529 (u'en', u'te'),
530 (u'en', u'us'),
531 (u'end',u'en' ),
532 # (u'er', u'e'),
533 (u'er', u'e-rei'),
534 (u'er', u'ens'),
535 (u'er', u'in'),
536 (u'er', u'ung'),
537 (u'es', u'est'),
538 (u'es', u's-te'),
539 (u'f', u'-fe'),
540 (u'f', u'-fer'),
541 (u'g', u'-ge'),
542 (u'g', u'-gen'),
543 (u'g', u'-ger'),
544 (u'g', u'-ger'),
545 (u'g', u'-ges'),
546 (u'g', u'-gung'),
547 (u'ie', u'e'),
548 (u'in', u'en'),
549 (u'isch', u'i-sche'),
550 (u'k', u'-ke'),
551 (u'k', u'-ken'),
552 (u'k', u'-ker'),
553 (u'l', u'-le'),
554 (u'l', u'-len'),
555 (u'l', u'-ler'),
556 (u'l', u'-lis-mus'),
557 (u'le', u'-ler'),
558 (u'li-che', u'tem'),
559 (u'li-che', u'ten'),
560 (u'ln', u'-le'),
561 (u'lt', u'-le'),
562 (u'm', u'-me'),
563 (u'm', u'-mer'),
564 (u'me', u'-men'),
565 (u'mus', u'men'),
566 (u'mus', u'ten'),
567 (u'mus', u'tik'),
568 (u'n', u'-at'),
569 (u'n', u'-er'),
570 (u'n', u'-ne'),
571 (u'n', u'-nen'),
572 (u'on', u'o-nis-mus'),
573 (u'n', u'-nis-mus'),
574 (u'n', u'r'),
575 (u'n', u'st'),
576 (u'n', u't'),
577 (u'n',u'-ner'),
578 (u'nd',u'n'),
579 (u'ne',u'ner'),
580 # (u'ne',u'n'),
581 (u'o',u'-on'),
582 (u'o',u'-os'),
583 (u'o',u'en'),
584 (u'on',u'o-nen'),
585 (u'p', u'-pe'),
586 (u'p', u'-pen'),
587 (u'p', u'-per'),
588 (u'ph', u'-phen'),
589 (u'ph', u'-phis-mus'),
590 (u'r', u'-re'),
591 (u'r', u'-rei'),
592 (u'r', u'-ren'),
593 (u'r', u'-rin'),
594 (u'r', u'-ris-mus'),
595 (u'r', u'-rung'),
596 (u're', u'ste'),
597 (u'ren', u'r-te'),
598 (u'ren', u'rst'),
599 (u'ren', u'rt'),
600 (u'rn', u'-re'),
601 (u'rn', u'-rung'),
602 (u'rn', u'-rung'),
603 (u'rt', u'-re'),
604 (u'rt', u'r-te'),
605 (u's', u''),
606 (u's', u'-se'),
607 (u's', u'-se-re'),
608 (u's', u'-se-res'),
609 (u's', u'-ser'),
610 (u's', u's-se'),
611 (u's', u's-ses'),
612 (u'sch', u'-sche'),
613 (u'sch', u'-schen'),
614 (u'sch', u'-scher'),
615 (u'st', u'-ste'),
616 (u'st', u'-sten'),
617 (u'st', u'n'),
618 (u't', u'-ba-re'),
619 (u't', u'>bar'),
620 (u't', u'-te'),
621 (u't', u'-te'),
622 (u't', u'-ten'),
623 (u't', u'-ter'),
624 (u't', u'-tes'),
625 (u't', u'-tin'),
626 (u't', u'-tis-mus'),
627 # (u't', u'e'),
628 (u't', u'n'),
629 (u't', u'st'),
630 (u'te', u'le'),
631 # (u'te', u't'),
632 (u'ten', u'mus'),
633 (u'ten', u'ren'),
634 (u'ten', u'tung'),
635 (u'ter', u'te-ren'),
636 (u'ti-on', u'tor'),
637 (u'um', u'a'),
638 (u'us', u'en'),
639 (u'v', u'-ve'),
640 (u'v', u'-ver'),
641 (u'v', u'-vis-mus'),
642 (u'-ve', u'v'),
643 (u'z', u'-ten'),
644 (u'z', u'-ze'),
645 (u'z', u'-zen'),
646 (u'z', u'-zer'),
647 (u'ß', u'-ße'),
648 (u'ß', u's-se'),
649 (u'ös', u'ö-se'),
653 # Zerlege einen String mit von vorn bis hinten wandernder Bruchstelle::
655 # >>> from abgleich_neueintraege import zerlege
656 # >>> list(zerlege(u'wolle'))
657 # [(u'w', u'olle'), (u'wo', u'lle'), (u'wol', u'le'), (u'woll', u'e')]
659 # ::
661 def zerlege(s):
662 for i in range(1, len(s)):
663 yield s[:i], s[i:]
666 # Zerlege String, wenn die Teile in der Wortliste vorhanden sind, setze
667 # sie neu zusammen und übernehme die Trennmarkierer:
670 def trenne_key(key, grossklein = False):
671 entries = []
672 sep = u'='
673 for k1, k2 in zerlege(key):
674 if grossklein:
675 k1 = toggle_case(k1)
676 if k1.istitle():
677 k2 = k2.title()
678 e1 = words.get(k1)
679 e2 = words.get(k2)
680 if not e2:
681 e2 = words.get(toggle_case(k2))
682 if e1 and e2:
683 if len(e1) != len(e2):
684 if len(e1) == 2:
685 e1 = [e1[1]] * len(e2)
686 elif len(e2) == 2:
687 e2 = [e2[1]] * len(e1)
688 else:
689 continue
690 entry = WordEntry(key)
691 for w1, w2 in zip(e1,e2)[1:]:
692 if w1.startswith(u'-'):
693 wort = w1
694 elif w2.startswith(u'-'):
695 wort = w2
696 else:
697 if grossklein:
698 w1 = toggle_case(w1)
699 w2 = w2.lower()
700 level = 1
701 while (level*sep in w1) or (level*sep in w2):
702 level += 1
703 wort = (level*sep).join([w1, w2])
704 entry.append(wort)
705 entry.conflate_fields()
706 entries.append(entry)
707 return entries
710 def filter_neuliste(neuwortdatei, words):
711 neue = []
712 for line in open(neuwortdatei):
713 line = line.decode('utf8').strip()
714 if line.startswith('#'):
715 neue.append(line)
716 continue
717 neueintrag = WordEntry(line)
718 alteintrag = words.get(neueintrag[0])
719 if len(neueintrag) == 1 or neueintrag == alteintrag:
720 print 'vorhanden:', line
721 else:
722 neue.append(line)
723 return neue
726 if __name__ == '__main__':
728 # sys.stdout mit UTF8 encoding.
729 sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
731 # Filtern::
733 if filtern:
734 words = WordFile('../../wortliste').asdict()
735 for line in filter_neuliste(neuwortdatei, words):
736 print line
737 sys.exit()
739 # `Wortliste` einlesen::
741 wordfile = WordFile('../../wortliste')
742 words = expand_wordfile(wordfile)
744 for alt, neu in endungen:
745 words.pop(join_word(neu), None)
747 for unwort in [u'Em']:
748 words.pop(unwort, None)
750 # # schon expandierte Liste:
751 # wordfile = WordFile('wortliste-expandiert') # + Teilwort-Entries
752 # words = wordfile.asdict()
754 neue = []
755 neue_grossklein = []
756 rest = []
758 # Erstellen der neuen Einträge::
760 newentries = [WordEntry(line.decode('utf8').strip())
761 for line in open(neuwortdatei)
762 if not line.startswith('#')]
764 for newentry in newentries:
765 OK = False
766 key = newentry[0]
767 # print key, unicode(newentry)
768 # continue
770 # Test auf vorhandene (Teil-) Wörter:
772 entry = words.get(key)
773 if entry:
774 neue.append(entry)
775 continue
776 # kleingeschrieben
777 entry = words.get(key.lower())
778 if entry:
779 neue_grossklein.append(entry)
780 continue
781 # Großgeschrieben
782 entry = words.get(key.title())
783 if entry:
784 neue_grossklein.append(entry)
785 continue
787 # Endungsabgleich::
789 for alt, neu in endungen:
790 entry = endungsabgleich(key, alt, neu, grossklein=False)
791 if entry:
792 entry.comment = newentry.comment
793 neue.append(entry)
794 OK = True
795 # break
796 if OK:
797 continue
799 for alt, neu in endungen:
800 entry = endungsabgleich(key, alt, neu, grossklein=True)
801 if entry:
802 entry.comment = newentry.comment
803 neue_grossklein.append(entry)
804 OK = True
805 # break
806 if OK:
807 continue
809 # Präfixabgleich::
811 for praefix in praefixe:
812 entry = praefixabgleich(key, praefix, grossklein=False)
813 if entry:
814 entry.comment = newentry.comment
815 neue.append(entry)
816 OK = True
817 break
818 entry = praefixabgleich(key, praefix, grossklein=True)
819 if entry:
820 entry.comment = newentry.comment
821 neue_grossklein.append(entry)
822 OK = True
823 break
824 if OK:
825 continue
827 # Zerlegen und test auf Fugen::
829 entries = trenne_key(key, grossklein=False)
830 if entries:
831 neue.extend(entries)
832 continue
833 entries = trenne_key(key, grossklein=True)
834 if entries:
835 neue_grossklein.extend(entries)
836 continue
838 # Nicht gefundene Wörter::
840 rest.append(newentry)
842 # Mehrdeutige aussortieren::
844 alle_neuen = {}
845 doppelkeys = set()
846 doppelkeys_gleich = defaultdict(int)
848 # doppelte keys finden:
849 for entry in neue + neue_grossklein:
850 key = entry[0].lower()
851 if key in alle_neuen:
852 if entry == alle_neuen[key]:
853 doppelkeys_gleich[key] += 1
854 else:
855 doppelkeys.add(key)
856 alle_neuen[key] = entry
858 # doppelte Einträge "verlegen":
859 eindeutige = []
860 eindeutige_grossklein = []
861 doppelte = []
863 for entry in neue:
864 key = entry[0].lower()
865 if key in doppelkeys:
866 doppelte.append(entry)
867 elif doppelkeys_gleich[key] > 0:
868 doppelkeys_gleich[key] -= 1
869 else:
870 eindeutige.append(entry)
872 for entry in neue_grossklein:
873 key = entry[0].lower()
874 if key in doppelkeys:
875 doppelte.append(entry)
876 elif doppelkeys_gleich[key] > 0:
877 doppelkeys_gleich[key] -= 1
878 else:
879 eindeutige_grossklein.append(entry)
882 # Vergleich mit Original::
884 identische = {}
885 for entry in newentries:
886 altentry = alle_neuen.get(entry[0].lower())
887 if entry == altentry:
888 identische[key] = entry
889 elif altentry:
890 alle_neuen.get(key).comment += u'WL:' + u';'.join(entry[1:])
892 # Ausgabe::
894 print u'\n# identisch rekonstruiert:'
895 for entry in sorted(identische.values(), key=sortkey_duden):
896 print unicode(entry)
898 print u'\n# eindeutig abgeleitet'
899 for entry in eindeutige:
900 if entry[0].lower() not in identische:
901 print unicode(entry)
903 print u'\n# eindeutig abgeleitet (andere Großschreibung)'
904 for entry in eindeutige_grossklein:
905 if entry[0].lower() not in identische:
906 print unicode(entry)
908 print u'\n# mehrdeutig abgeleitet'
909 for entry in doppelte:
910 print unicode(entry)
912 print u'\n# Rest'
914 for entry in rest:
915 print unicode(entry)