3 # :Copyright: © 2011 Günter Milde.
4 # Released without warranty under the terms of the
5 # GNU General Public License (v. 2 or later)
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.
20 import re
, sys
, codecs
, copy
, os
21 from werkzeug
import WordFile
, WordEntry
, join_word
, toggle_case
22 from expand_teilwoerter
import expand_wordfile
29 # Sprach-Tag nach [BCP47]_::
31 # sprachvariante = 'de-1901' # "traditionell"
32 sprachvariante
= 'de-1996' # Reformschreibung
33 # sprachvariante = 'de-1901-x-GROSS' # ohne ß (Schweiz oder GROSS)
34 # sprachvariante = 'de-1996-x-GROSS' # ohne ß (Schweiz oder GROSS)
35 # sprachvariante = 'de-CH-1901' # ohne ß (Schweiz) ("süssauer")
40 # Übertrag von Praefixen auf Wörter ohne Präfix::
42 def praefixabgleich(key
, praefix
, grossklein
=False):
45 praefix
= praefix
.title()
47 if not key
.startswith(join_word(praefix
)):
50 altkey
= key
[len(join_word(praefix
)):]
53 altkey
= toggle_case(altkey
)
56 altentry
= words
[altkey
]
60 entry
= WordEntry(key
)
61 # print "fundum", key, unicode(entry)
62 for wort
in altentry
[1:]:
63 if not wort
.startswith(u
'-'):
65 wort
= toggle_case(wort
)
66 wort
= u
'<'.join([praefix
, wort
])
385 # Nach Länge sortieren, damit spezifischere zuerst Probiert werden:
386 praefixe
.sort(key
= len)
390 # Übertrag von Einträgen auf Wörter mit anderer Endung::
392 def endungsabgleich(key
, alt
, neu
, grossklein
=False):
394 if not key
.endswith(join_word(neu
)):
397 altkey
= key
[:-len(join_word(neu
))] + join_word(alt
)
399 altkey
= toggle_case(altkey
)
402 altentry
= words
[altkey
]
406 entry
= WordEntry(key
)
407 # print "fundum", key, unicode(entry)
408 for wort
in altentry
[1:]:
409 if not wort
.startswith(u
'-'):
411 wort
= wort
[:-len(alt
)]
414 wort
= toggle_case(wort
)
415 if join_word(wort
) != key
:
419 print u
"# Übertragungsproblem: %s -> %s (%s,%s) %s" % (
420 altkey
, key
, alt
, neu
, unicode(entry
))
423 entry
.conflate_fields()
429 # ``(<alt>, <neu>)`` Paare von Endungen::
473 (u
'-en', u
'>bar>keit'),
489 (u
'-sten', u
's-mus'),
511 (u
'e-ren', u
'-ti-on'),
542 (u
'isch', u
'i-sche'),
581 (u
'ph', u
'-phis-mus'),
645 # Zerlege einen String mit von vorn bis hinten wandernder Bruchstelle::
647 # >>> from abgleich_neueintraege import zerlege
648 # >>> list(zerlege(u'wolle'))
649 # [(u'w', u'olle'), (u'wo', u'lle'), (u'wol', u'le'), (u'woll', u'e')]
654 for i
in range(1, len(s
)):
658 # Zerlege String, wenn die Teile in der Wortliste vorhanden sind, setze
659 # sie neu zusammen und übernehme die Trennmarkierer:
662 def trenne_key(key
, grossklein
= False):
664 for k1
, k2
in zerlege(key
):
672 e2
= words
.get(toggle_case(k2
))
674 if len(e1
) != len(e2
):
676 e1
= [e1
[1]] * len(e2
)
678 e2
= [e2
[1]] * len(e1
)
681 entry
= WordEntry(key
)
682 for w1
, w2
in zip(e1
,e2
)[1:]:
683 if w1
.startswith(u
'-'):
685 elif w2
.startswith(u
'-'):
691 if (u
'==' in w1
) or (u
'==' in w2
):
693 elif (u
'=' in w1
) or (u
'=' in w2
):
697 wort
= sep
.join([w1
, w2
])
699 entries
.append(entry
)
703 if __name__
== '__main__':
705 # sys.stdout mit UTF8 encoding.
706 sys
.stdout
= codecs
.getwriter('UTF-8')(sys
.stdout
)
708 # `Wortliste` einlesen::
710 wordfile
= WordFile('../../wortliste')
711 words
= expand_wordfile(wordfile
)
713 # # schon expandierte Liste:
714 # wordfile = WordFile('wortliste-expandiert') # + Teilwort-Entries
715 # words = wordfile.asdict()
718 neuwortdatei
= "zusatzwörter-de-1996-hunspell-compact"
720 neueintraege_grossklein
= []
723 # Erstellen der neuen Einträge::
725 for line
in open(neuwortdatei
):
727 key
= line
.decode('utf8').strip()
732 # Test auf vorhandene (Teil-) Wörter:
734 entry
= words
.get(key
)
736 neueintraege
.append(entry
)
739 entry
= words
.get(key
.lower())
741 neueintraege_grossklein
.append(entry
)
744 entry
= words
.get(key
.title())
746 neueintraege_grossklein
.append(entry
)
751 for alt
, neu
in endungen
:
752 entry
= endungsabgleich(key
, alt
, neu
, grossklein
=False)
754 neueintraege
.append(entry
)
760 for alt
, neu
in endungen
:
761 entry
= endungsabgleich(key
, alt
, neu
, grossklein
=True)
763 neueintraege_grossklein
.append(entry
)
771 for praefix
in praefixe
:
772 entry
= praefixabgleich(key
, praefix
, grossklein
=False)
774 neueintraege
.append(entry
)
777 entry
= praefixabgleich(key
, praefix
, grossklein
=True)
779 neueintraege_grossklein
.append(entry
)
785 # Zerlegen und test auf Fugen::
787 entries
= trenne_key(key
, grossklein
=False)
789 neueintraege
.extend(entries
)
791 entries
= trenne_key(key
, grossklein
=True)
793 neueintraege_grossklein
.extend(entries
)
796 # Nicht gefundene Wörter::
798 restwoerter
.append(key
)
803 print u
'# als Teilwörter'
804 for entry
in neueintraege
:
807 print u
'# als Teilwörter (andere Großschreibung)'
808 for entry
in neueintraege_grossklein
:
811 outfile
= open(neuwortdatei
+'-rest', 'w')
813 for wort
in restwoerter
:
814 outfile
.write(wort
.encode('utf8')+'\n')