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)
8 # :Version: 0.1 (2012-02-07)
10 # test_teilwoerter.py: Test von Wortteilen/Teilwörtern
11 # ==================================================================
15 """Test der Markierung von Komposita in der `Wortliste`"""
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 werkzeug
import WordFile
, join_word
, udiff
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)
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.
55 # * Groß/Kleinschreibung unterschieden
56 # * Kodierung: utf8 (bis auf 'ogerman')
60 if sprachvariante
== 'de-1901':
61 words
= set(line
.rstrip().decode('latin-1')
62 for line
in open('/usr/share/dict/ogerman'))
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/teilwoerter-fremd')
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'
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
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
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('=')
109 # Wortteile analysieren::
113 # gewichtete Trennzeichen (==) erzeugen "leere" Teile::
119 # Vorsilben die sich auf mehrere Teilwörter beziehen (z.b. un<=regel=mäßig)
122 if teil
.endswith(u
'<'):
125 # Teilwort ohne Trennung, Groß/Kleinschreibung übertragen::
127 key
= join_word(teil
)
131 # Suche nach Teilwort als Einzelwort::
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
):
140 # Teste ohne Berücksichtigung der Groß/Kleinschreibung::
142 if key
.lower() in words
or key
.title() in words
:
143 grossklein
[key
].append(wort
)
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
)
151 if key
.lower() + 'en' in words
or key
.title() + 'en' in words
:
152 grossklein
[key
+'(en)'].append(wort
)
155 if key
.lower() + 'e' in words
or key
.title() + 'e' in words
:
156 grossklein
[key
+'(e)'].append(wort
)
159 # Test auf fremdsprachige Teilwörter::
161 if key
.lower() in words_fremd
:
162 fremd
[key
].append(wort
)
165 # Teilwort mit 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'),
176 # vorsilben[key].append(wort)
179 # Teilwort nicht gefunden::
181 unbekannt
[key
].append(wort
)
189 def testausgabe(checkdict
):
190 checkliste
= ['%3d %-15s %s' %
191 (len(checkdict
[key
]), key
, ', '.join(checkdict
[key
]))
192 for key
in sorted(checkdict
.keys())]
194 return u
'\n'.join(checkliste
).encode('utf8') + '\n'
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
))
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