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 # hyphenate_neueintraege.py: kategorisierte Trennung mit patgen-patterns.
9 # =======================================================================
11 u
"""Trenne Wörter mittels "hyphenation"-Algorithmus und patgen-patterns¹.
13 Eingabe: Ein ungetrenntes Wort oder Eintrag im Wortliste-Format pro Zeile.²
15 Ausgabe: Wortliste-Einträge (Neueintrag;Neu=ein-trag)
16 ohne Unterscheidung von Sprachvarianten (!)³
19 identisch rekonstruiert
20 wenn die vorhandene Trennmarkierung der ermittelten
23 wenn die Eingabe ungetrennt ist oder eine abweichende
24 Trennmarkierung aufweist
26 Bsp: python hyphenate_neueintraege.py < missing-words.txt > neu.tod
28 ``neu.todo`` kann (nach Durchsicht!!) mit `prepare_patch.py neu`
29 in die Wortliste eingepflegt werden.³
31 ¹ Verwendet Pattern-Dateien welche über die "make" Ziele
32 `make pattern-refo`, `make major pattern-refo`, `make fugen pattern-refo`
33 und `make suffix pattern-refo` im Wurzelverzeichnis der Wortliste generiert
34 werden können (die Fehler bei `make fugen pattern-refo` und `make suffix
35 pattern-refo` können ignoriert werden).
37 ² Tip: mit `abgleich_neueintraege.py --filter < neue.txt > wirklich-neue.txt`
38 können in der WORTLISTE vorhandene Wörter aussortiert werden.
40 ³ `prepare_patch.py neu` nimmt auch eine Unterscheidung nach de-1901/de-1996
41 anhand der wesentlichen Regeländerungen (-st/s-t, ck/c-k, ss/ß)
42 vor. (Schweizer Spezialitäten und andere Grenzfälle müssen per Hand
46 import sys
, os
, codecs
, glob
, copy
, optparse
48 # path for local Python modules (parent dir of this file's dir)
50 os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
))))
52 # import patuse, trennstellenkategorisierung
53 from wortliste
import WordFile
, WordEntry
, join_word
, toggle_case
, sortkey_duden
54 from trennstellenkategorisierung
.abgleich_neueintraege
import print_proposal
55 from patuse
.hyphenation
import Hyphenator
57 # Trenne mit Hyphenator::
61 parts_fugen
= h_fugen
.split_word(key
)
62 parts_major
= h_major
.split_word(key
)
63 parts_suffix
= h_suffix
.split_word(key
)
64 parts_all
= h_all
.split_word(key
)
66 parts
= [] # Liste von Silben und Trennzeichen, wird am Ende zusammengefügt.
67 p_major
= '' # zum Vergleich mit parts_major
70 # Kategorisierung der Trennstellen
71 for part_all
in parts_all
[:-1]:
72 parts
.append(part_all
)
76 if p_fugen
== parts_fugen
[0]:
80 elif p_suffix
== parts_suffix
[0]:
84 elif p_major
== parts_major
[0]:
90 parts
.append(parts_all
[-1])
91 word
= u
''.join(parts
)
93 # Alternative Kategorisierung über Zerlegung der Teilwörter/Wortteile:
94 # word = u'='.join([u'<'.join([h_all.hyphenate_word(part, '-')
95 # for part in h_major.split_word(teilwort)])
96 # for teilwort in h_fugen.split_word(key)])
97 newentry
= WordEntry(key
+ u
';' + word
)
98 newentry
.comment
= entry
.comment
104 if __name__
== '__main__':
108 # Die neuesten Pattern-Dateien, welche über die "make"-Ziele
111 # make major pattern-refo
112 # make fugen pattern-refo
113 # make suffix pattern-refo
115 # im Wurzelverzeichnis der wortliste generiert werden::
117 p_all
= glob
.glob('../../../dehyphn-x/dehyphn-x-*.pat')[-1]
118 p_major
= glob
.glob('../../../dehyphn-x-major/dehyphn-x-major-*.pat')[-1]
119 p_fugen
= glob
.glob('../../../dehyphn-x-fugen/dehyphn-x-fugen-*.pat')[-1]
120 p_suffix
= glob
.glob('../../../dehyphn-x-suffix/dehyphn-x-suffix-*.pat')[-1]
123 usage
= '%prog [Optionen]\n' + __doc__
124 parser
= optparse
.OptionParser(usage
=usage
)
125 parser
.add_option('-p', '--patterns',
126 help='Pattern-Datei (alle Trennstellen), '
127 'Vorgabe "%s"'%p_all
, default
=p_all
)
128 parser
.add_option('--patterns_major',
129 help='Pattern-Datei (Trennstellen an Morphemgrenzen), '
130 'Vorgabe "%s"'%p_major
, default
=p_major
)
131 parser
.add_option('--patterns_fugen',
132 help='Pattern-Datei (Trennstellen an Wortfugen), '
133 'Vorgabe "%s"'%p_fugen
, default
=p_fugen
)
134 parser
.add_option('--patterns_suffix',
135 help='Pattern-Datei (Trennstellen vor Suffixen), '
136 'Vorgabe "%s"'%p_suffix
, default
=p_suffix
)
137 (options
, args
) = parser
.parse_args()
139 # sys.stdout mit UTF8 encoding.
140 sys
.stdout
= codecs
.getwriter('UTF-8')(sys
.stdout
)
142 # Trenner-Instanzen::
144 h_all
= Hyphenator(options
.patterns
)
145 h_major
= Hyphenator(options
.patterns_major
)
146 h_fugen
= Hyphenator(options
.patterns_fugen
)
147 h_suffix
= Hyphenator(options
.patterns_suffix
)
151 # Erstellen der neuen Einträge::
153 proposals
= [WordEntry(line
.decode('utf8').strip().replace(u
'-', u
''))
154 for line
in sys
.stdin
155 if not line
.startswith('#')]
159 for newentry
in proposals
:
163 entry
= trenne(copy
.copy(newentry
))
168 # Vergleich mit Original::
170 alle_neuen
= dict((entry
[0].lower(), entry
) for entry
in neue
)
173 for proposal
in proposals
:
174 key
= proposal
[0].lower()
175 newentry
= alle_neuen
.get(key
)
176 if proposal
== newentry
:
177 identische
[key
] = proposal
180 newentry
.proposal
= proposal
184 print u
'\n# identisch rekonstruiert:'
185 for entry
in sorted(identische
.values(), key
=sortkey_duden
):
188 print u
'\n# mit Pattern getrennt'
190 print_proposal(entry
)