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
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")
39 # Übertrag von Praefixen auf Wörter ohne Präfix::
41 def praefixabgleich(key
, praefix
, grossklein
=False):
44 praefix
= praefix
.title()
46 if not key
.startswith(join_word(praefix
)):
49 altkey
= key
[len(join_word(praefix
)):]
52 altkey
= toggle_case(altkey
)
55 altentry
= words
[altkey
]
59 entry
= WordEntry(key
)
60 # print "fundum", key, unicode(entry)
61 for wort
in altentry
[1:]:
62 if not wort
.startswith(u
'-'):
64 wort
= toggle_case(wort
)
65 wort
= u
'<'.join([praefix
, wort
])
384 # Nach Länge sortieren, damit spezifischere zuerst Probiert werden:
385 praefixe
.sort(key
= len)
389 # Übertrag von Einträgen auf Wörter mit anderer Endung::
391 def endungsabgleich(key
, alt
, neu
, grossklein
=False):
393 if not key
.endswith(join_word(neu
)):
396 altkey
= key
[:-len(join_word(neu
))] + join_word(alt
)
398 altkey
= toggle_case(altkey
)
401 altentry
= words
[altkey
]
405 entry
= WordEntry(key
)
406 # print "fundum", key, unicode(entry)
407 for wort
in altentry
[1:]:
408 if not wort
.startswith(u
'-'):
410 wort
= wort
[:-len(alt
)]
413 wort
= toggle_case(wort
)
414 if join_word(wort
) != key
:
418 print u
"# Übertragungsproblem: %s -> %s (%s,%s) %s" % (
419 altkey
, key
, alt
, neu
, unicode(entry
))
422 entry
.conflate_fields()
428 # ``(<alt>, <neu>)`` Paare von Endungen::
472 (u
'-en', u
'>bar>keit'),
488 (u
'-sten', u
's-mus'),
510 (u
'e-ren', u
'-ti-on'),
541 (u
'isch', u
'i-sche'),
580 (u
'ph', u
'-phis-mus'),
644 # Zerlege einen String mit von vorn bis hinten wandernder Bruchstelle::
646 # >>> from abgleich_neueintraege import zerlege
647 # >>> list(zerlege(u'wolle'))
648 # [(u'w', u'olle'), (u'wo', u'lle'), (u'wol', u'le'), (u'woll', u'e')]
653 for i
in range(1, len(s
)):
657 # Zerlege String, wenn die Teile in der Wortliste vorhanden sind, setze
658 # sie neu zusammen und übernehme die Trennmarkierer:
661 def trenne_key(key
, grossklein
= False):
663 for k1
, k2
in zerlege(key
):
671 e2
= words
.get(toggle_case(k2
))
673 if len(e1
) != len(e2
):
675 e1
= [e1
[1]] * len(e2
)
677 e2
= [e2
[1]] * len(e1
)
680 entry
= WordEntry(key
)
681 for w1
, w2
in zip(e1
,e2
)[1:]:
682 if w1
.startswith(u
'-'):
684 elif w2
.startswith(u
'-'):
690 if (u
'==' in w1
) or (u
'==' in w2
):
692 elif (u
'=' in w1
) or (u
'=' in w2
):
696 wort
= sep
.join([w1
, w2
])
698 entries
.append(entry
)
702 if __name__
== '__main__':
704 # sys.stdout mit UTF8 encoding.
705 sys
.stdout
= codecs
.getwriter('UTF-8')(sys
.stdout
)
707 # `Wortliste` einlesen::
710 wordfile
= WordFile('wortliste-expandiert') # + Teilwort-Entries
711 words
= wordfile
.asdict()
713 neuwortdatei
= "zusatzwörter-de-1996-hunspell-compact"
715 neueintraege_grossklein
= []
719 # Erstellen der neuen Einträge::
721 for line
in open(neuwortdatei
):
723 key
= line
.decode('utf8').strip()
728 # Test auf vorhandene (Teil-) Wörter:
730 entry
= words
.get(key
)
732 neueintraege
.append(entry
)
735 entry
= words
.get(key
.lower())
737 neueintraege_grossklein
.append(entry
)
740 entry
= words
.get(key
.title())
742 neueintraege_grossklein
.append(entry
)
747 for alt
, neu
in endungen
:
748 entry
= endungsabgleich(key
, alt
, neu
, grossklein
=False)
750 neueintraege
.append(entry
)
756 for alt
, neu
in endungen
:
757 entry
= endungsabgleich(key
, alt
, neu
, grossklein
=True)
759 neueintraege_grossklein
.append(entry
)
767 for praefix
in praefixe
:
768 entry
= praefixabgleich(key
, praefix
, grossklein
=False)
770 neueintraege
.append(entry
)
773 entry
= praefixabgleich(key
, praefix
, grossklein
=True)
775 neueintraege_grossklein
.append(entry
)
781 # Zerlegen und test auf Fugen::
783 entries
= trenne_key(key
, grossklein
=False)
785 neueintraege
.extend(entries
)
787 entries
= trenne_key(key
, grossklein
=True)
789 neueintraege_grossklein
.extend(entries
)
792 # Nicht gefundene Wörter::
794 restwoerter
.append(key
)
799 print u
'# als Teilwörter'
800 for entry
in neueintraege
:
803 print u
'# als Teilwörter (andere Großschreibung)'
804 for entry
in neueintraege_grossklein
:
807 outfile
= open(neuwortdatei
+'-rest', 'w')
809 for wort
in restwoerter
:
810 outfile
.write(wort
.encode('utf8')+'\n')