Python-Skript Update
[wortliste.git] / skripte / python / edit_tools / test_teilwoerter.py
blobcec5bfb52819c944d3c1e54f2f9b1ac3c4b55adc
1 #!/usr/bin/env python
2 # -*- coding: utf8 -*-
3 # :Copyright: © 2012 Günter Milde.
4 # :Licence: This work may be distributed and/or modified under
5 # the conditions of the `LaTeX Project Public License`,
6 # either version 1.3 of this license or (at your option)
7 # any later version.
8 # :Version: 0.1 (2012-02-07)
10 # test_teilwoerter.py: Test von Wortteilen/Teilwörtern
11 # ==================================================================
13 # ::
15 """Test der Markierung von Komposita in der `Wortliste`"""
17 # .. contents::
19 # Vorspann
20 # ========
22 # Importiere Python Module::
24 import re # Funktionen und Klassen für reguläre Ausdrücke
25 import sys # sys.exit() zum Abbruch vor Ende (für Testzwecke)
26 from collections import defaultdict # Wörterbuch mit Default
27 from copy import deepcopy
29 from wortliste import WordFile, join_word, udiff
31 # Sprachvarianten
32 # ---------------
34 # Sprach-Tag nach [BCP47]_::
36 sprachvariante = 'de-1901' # "traditionell"
37 # sprachvariante = 'de-1996' # Reformschreibung
38 # sprachvariante = 'de-x-GROSS' # ohne ß (Großbuchstaben und Kapitälchen)
41 # Wortlisten
42 # -------------
44 # Die freie `Wortliste der deutschsprachigen Trennmustermannschaft`_
45 # ("Lembergsche Liste")::
47 wordfile = WordFile('../../../wortliste') # ≅ 400 000 Einträge/Zeilen
48 wortliste = list(wordfile)
50 # Wörterbucher für die Rechtschreibprüfprogramme Ispell/Aspell
51 # (in Debian in den Paketen "wngerman" und "wogerman").
52 # Unterschieden Groß-/Kleinschreibung und beinhalten kurze Wörter.
54 # * Ein Wort/Zeile
55 # * Groß/Kleinschreibung unterschieden
56 # * Kodierung: utf8 (bis auf 'ogerman')
58 # ::
60 if sprachvariante == 'de-1901':
61 words = set(line.rstrip().decode('latin-1')
62 for line in open('/usr/share/dict/ogerman'))
63 else:
64 words = set(line.rstrip().decode('utf8')
65 for line in open('/usr/share/dict/ngerman'))
67 words_fremd = set(line.rstrip().decode('utf8')
68 for line in open('wortteile/fremdsprachlich')
69 if not line.startswith('#'))
71 # Wörter der Wortliste::
73 words.update((entry[0] for entry in wortliste
74 if entry.lang_index(sprachvariante)))
76 # print len(words), 'Wörter aus Wörterbüchern'
79 # Sortierung in::
81 unbekannt = defaultdict(list) # Teilwörter nicht in der Wortliste
82 grossklein = defaultdict(list) # Teilwörter mit anderer Groß/Kleinschreibung
83 # vorsilben = defaultdict(list) # Teilwörter mit zusätzlicher Vorsilbe
84 fremd = defaultdict(list) # fremsprachige Teilwörter
87 # Analyse
88 # =====================
90 # Durchlaufe alle Einträge::
92 for entry in wortliste:
94 # Wort mit Trennungen in Sprachvariante::
96 wort = entry.get(sprachvariante)
97 if wort is None: # Wort existiert nicht in der Sprachvariante
98 continue
99 if sprachvariante != 'de-1901' and wort[0] is not '-1-':
100 continue # Wort mit allgemeingültiger Trennung
102 # Zerlegen an Wortfugen::
104 teile = wort.split('=')
106 if len(teile) == 1:
107 continue
109 # Wortteile analysieren::
111 for teil in teile:
113 # gewichtete Trennzeichen (==) erzeugen "leere" Teile::
115 if not teil:
116 continue
119 # Vorsilben die sich auf mehrere Teilwörter beziehen (z.b. un<=regel=mäßig)
120 # enden auf "<"::
122 if teil.endswith(u'<'):
123 continue
125 # Teilwort ohne Trennung, Groß/Kleinschreibung übertragen::
127 key = join_word(teil)
128 if wort.istitle():
129 key = key.title()
131 # Suche nach Teilwort als Einzelwort::
133 if (key in words
134 or (key.endswith(u's') and key[:-1] in words)
135 # or key.startswith('zu') and key[2:] in words
136 or key + 'e' in words
137 or key + 'en' in words):
138 continue
140 # Teste ohne Berücksichtigung der Groß/Kleinschreibung::
142 if key.lower() in words or key.title() in words:
143 grossklein[key].append(wort)
144 continue
146 if key.endswith('s') and (
147 key[:-1].lower() in words or key[:-1].title() in words):
148 grossklein[key[:-1]+'\s'].append(wort)
149 continue
151 if key.lower() + 'en' in words or key.title() + 'en' in words:
152 grossklein[key+'(en)'].append(wort)
153 continue
155 if key.lower() + 'e' in words or key.title() + 'e' in words:
156 grossklein[key+'(e)'].append(wort)
157 continue
159 # Test auf fremdsprachige Teilwörter::
161 if key.lower() in words_fremd:
162 fremd[key].append(wort)
163 continue
165 # Teilwort mit Vorsilbe::
167 # ohne_vorsilbe = ''
168 # for silbe in praefixe:
169 # if (teil.lower().replace(u'·', u'-').startswith(silbe+'-')
170 # and (key[len(silbe):] in words
171 # or key[len(silbe):].title() in words)):
172 # ohne_vorsilbe = key[len(silbe):]
173 # # print teil.encode('utf8'),
174 # break
175 # if ohne_vorsilbe:
176 # vorsilben[key].append(wort)
177 # continue
179 # Teilwort nicht gefunden::
181 unbekannt[key].append(wort)
184 # Ausgabe
185 # =======
187 # ::
189 def testausgabe(checkdict):
190 checkliste = ['%3d %-15s %s' %
191 (len(checkdict[key]), key, ', '.join(checkdict[key]))
192 for key in sorted(checkdict.keys())]
193 checkliste.sort()
194 return u'\n'.join(checkliste).encode('utf8') + '\n'
196 # Auswertung
197 # ==========
199 # ::
201 print 'Einträge in der Wortliste:', len(wortliste)
202 print 'Gesamtwortzahl (w*german+Wortliste, %s):' % sprachvariante, len(words)
204 print 'Teilwort mit anderer Groß-/Kleinschreibung:', len(grossklein),
205 print '-> siehe Datei "wortteile/-grossklein"'
206 grossklein_file = file('wortteile/-grossklein', 'w')
207 grossklein_file.write(testausgabe(grossklein))
209 # print 'Teilwort mit zusätzlicher Vorsilbe:', len(vorsilben)
210 # vorsilben_file = file('teilwort-vorsilben', 'w')
211 # vorsilben_file.write(testausgabe(vorsilben))
213 print 'fremdsprachige Teilwörter:', len(fremd),
214 print '-> siehe Datei "wortteile/-fremd"'
215 fremd_file = file('wortteile/-fremd', 'w')
216 fremd_file.write(testausgabe(fremd))
218 print 'Teilwort nicht gefunden:', len(unbekannt),
219 print '-> siehe Datei "wortteile/-unbekannt"'
220 unbekannt_file = file('wortteile/-unbekannt', 'w')
221 unbekannt_file.write(testausgabe(unbekannt))
224 # Quellen
225 # =======
227 # .. [BCP47] A. Phillips und M. Davis, (Editoren.),
228 # `Tags for Identifying Languages`, http://www.rfc-editor.org/rfc/bcp/bcp47.txt
230 # .. _Wortliste der deutschsprachigen Trennmustermannschaft:
231 # http://mirrors.ctan.org/language/hyphenation/dehyph-exptl/projektbeschreibung.pdf