3 # :Copyright: © 2014 Günter Milde.
4 # Released without warranty under the terms of the
5 # GNU General Public License (v. 2 or later)
8 # Abgleich der Trennstellen zwischen Woertern mit gleichem Stamm
9 # ==============================================================
11 # Übertragen von kategorisierten Trennstellen von Wörtern auf
12 # Wörter anderer Endung und unkategorisierten Trennstellen.
16 import re
, sys
, codecs
, copy
17 from wortliste
import (WordFile
, WordEntry
, join_word
, udiff
,
18 uebertrage
, TransferError
,
19 sprachabgleich
, toggle_case
)
20 from analyse
import read_teilwoerter
, teilwoerter
21 from abgleich_teilwoerter
import wortliste_to_teilwoerter
28 # Sprach-Tag nach [BCP47]_::
30 # sprachvariante = 'de-1901' # "traditionell"
31 sprachvariante
= 'de-1996' # Reformschreibung
32 # sprachvariante = 'de-1901-x-GROSS' # ohne ß (Schweiz oder GROSS)
33 # sprachvariante = 'de-1996-x-GROSS' # ohne ß (Schweiz oder GROSS)
34 # sprachvariante = 'de-CH-1901' # ohne ß (Schweiz) ("süssauer")
38 # Vergleiche Wörter mit unterschiedlicher Großschreibung
39 # (z.T. reiben <-> Reibung)::
46 # Verwende die Wortliste oder die mit ``analyse.py`` generierte Teilwortliste
47 # als Quelle der kategorisierten Trennungen::
49 use_teilwoerter
= False
50 # use_teilwoerter = True
54 # Bei Composita, verwende nur das Grundwort für den Abgleich
55 # (besonders sinnvoll bei Teilwörtern als Vergleichsbasis)::
57 use_grundwort
= use_teilwoerter
58 # use_grundwort = False
64 # Übertrag kategorisierter Trennungen auf Wörter mit anderer Endung::
66 def endungsabgleich(wort
, endung
, vergleichsendung
=u
'',
67 use_grundwort
=False, grossklein
=False):
69 if not wort
.endswith(endung
):
72 teile
= wort
.split('=')
76 stamm
= grundwort
[:-len(endung
)] + vergleichsendung
77 key
= join_word(stamm
)
79 key
= toggle_case(key
)
81 if key
in words
.trennvarianten
:
82 # print u'fundum', key
83 for altstamm
in words
.trennvarianten
[key
]:
87 altstamm
= toggle_case(altstamm
)
89 neustamm
= uebertrage(altstamm
, stamm
)
90 # Vergleichsendung abtrennen
92 neustamm
= neustamm
[:-len(vergleichsendung
)]
93 # Mit Originalendung einsetzen
94 teile
[-1] = neustamm
+ endung
.replace(u
'·', u
'-')
96 except TransferError
, e
:
97 print unicode(e
), u
"(%s -> %s)" % (vergleichsendung
, endung
)
99 return u
'='.join(teile
)
103 # ``(<alt>, <neu>)`` Paare von Endungen
105 # Achtung: die Auswahl zu testender Wörter erfolgt anhand der "neu"-Endung.
106 # Daher darf diese nicht leer sein!
160 (u
'-sten', u
's·mus'),
173 # (u'ch', u'-che'), # Test "if u'·' not in wort" auskommentieren!
184 # (u'e-ren', u'sch'),
215 (u
'isch', u
'i·sche'),
224 # (u'li-che', u'tem'),
225 # (u'li-che', u'ten'),
254 (u
'ph', u
'·phis·mus'),
277 # (u'sch', u'·schen'),
326 (u
'e-ren', u
'·ti·on'),
327 (u
'-en', u
'·bar·keit'),
331 if __name__
== '__main__':
333 # sys.stdout mit UTF8 encoding.
334 sys
.stdout
= codecs
.getwriter('UTF-8')(sys
.stdout
)
336 # `Wortliste` einlesen::
338 wordfile
= WordFile('../../../wortliste') # ≅ 400 000 Einträge/Zeilen
339 wortliste
= list(wordfile
)
342 # Vergleichswörter einlesen::
345 words
= read_teilwoerter(path
='teilwoerter-%s.txt'%sprachvariante
)
346 else: # Gesamtwörter als "Teilwörter":
347 words
= wortliste_to_teilwoerter(wortliste
, sprachvariante
)
349 # Erstellen der neuen wortliste::
351 for entry
in wortliste
:
353 # Wort mit Trennungen in Sprachvariante
354 wort
= entry
.get(sprachvariante
)
355 if (wort
is None # Wort existiert nicht in der Sprachvariante
356 or u
'·' not in wort
): # Alle Trennstellen kategorisiert
357 wortliste_neu
.append(entry
)
362 for alt
, neu
in endungen
:
363 wort2
= endungsabgleich(wort
, endung
=neu
, vergleichsendung
=alt
,
364 use_grundwort
=use_grundwort
,
365 grossklein
=grossklein
372 if (wort
!= wort2
): #and (u'·' not in wort2):
373 entry
= copy
.copy(entry
)
374 entry
.set(wort2
, sprachvariante
)
375 print u
'%s -> %s' % (wort
, wort2
)
377 sprachabgleich(entry
)
379 wortliste_neu
.append(entry
)
384 patch
= udiff(wortliste
, wortliste_neu
, 'wortliste', 'wortliste-neu')
387 patchfile
= open('wortliste.patch', 'w')
388 patchfile
.write(patch
+ '\n')