Python-Skripte: Korrekturen nach Sortierung.
[wortliste.git] / skripte / python / edit_tools / hyphenate_neueintraege.py
blob84ed49eb2b39fa7db6ab88df211969dc9a1224ea
1 #!/usr/bin/env python
2 # -*- coding: utf8 -*-
3 # :Copyright: © 2014 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 # 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 (!)³
17 getrennt nach:
19 identisch rekonstruiert
20 wenn die vorhandene Trennmarkierung der ermittelten
21 entspricht.
22 mit Pattern getrennt
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
43 eingepflegt werden.)
44 """
46 import sys, os, codecs, glob, copy, optparse
48 # path for local Python modules (parent dir of this file's dir)
49 sys.path.insert(0,
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::
59 def trenne(entry):
60 key = entry[0]
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
68 p_fugen = ''
69 p_suffix = ''
70 # Kategorisierung der Trennstellen
71 for part_all in parts_all[:-1]:
72 parts.append(part_all)
73 p_major += part_all
74 p_fugen += part_all
75 p_suffix += part_all
76 if p_fugen == parts_fugen[0]:
77 parts_fugen.pop(0)
78 p_fugen = ''
79 parts.append(u'=')
80 elif p_suffix == parts_suffix[0]:
81 parts_suffix.pop(0)
82 p_suffix = ''
83 parts.append(u'>')
84 elif p_major == parts_major[0]:
85 parts_major.pop(0)
86 p_major = ''
87 parts.append(u'<')
88 else:
89 parts.append(u'-')
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
99 return newentry
102 # Hauptfunktion::
104 if __name__ == '__main__':
106 # Optionen::
108 # Die neuesten Pattern-Dateien, welche über die "make"-Ziele
110 # make pattern-refo
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('#')]
157 neue = []
159 for newentry in proposals:
161 # Trennen::
163 entry = trenne(copy.copy(newentry))
164 if entry:
165 neue.append(entry)
168 # Vergleich mit Original::
170 alle_neuen = dict((entry[0].lower(), entry) for entry in neue)
172 identische = {}
173 for proposal in proposals:
174 key = proposal[0].lower()
175 newentry = alle_neuen.get(key)
176 if proposal == newentry:
177 identische[key] = proposal
178 else:
179 if newentry:
180 newentry.proposal = proposal
182 # Ausgabe::
184 print u'\n# identisch rekonstruiert:'
185 for entry in sorted(identische.values(), key=sortkey_duden):
186 print unicode(entry)
188 print u'\n# mit Pattern getrennt'
189 for entry in neue:
190 print_proposal(entry)