├── bin └── readability ├── MANIFEST.in ├── .gitignore ├── LICENSE.txt ├── setup.py ├── README.rst └── readability ├── __init__.py └── langdata.py /bin/readability: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import readability 3 | readability.main() 4 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.rst LICENSE.txt setup.py 2 | recursive-include readability *.py 3 | recursive-include bin * 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | 3 | # C extensions 4 | *.so 5 | 6 | # Packages 7 | *.egg 8 | *.egg-info 9 | dist 10 | build 11 | eggs 12 | parts 13 | var 14 | sdist 15 | develop-eggs 16 | .installed.cfg 17 | lib 18 | lib64 19 | MANIFEST 20 | 21 | # Installer logs 22 | pip-log.txt 23 | 24 | # Unit test / coverage reports 25 | .coverage 26 | .tox 27 | nosetests.xml 28 | 29 | # Translations 30 | *.mo 31 | 32 | # Mr Developer 33 | .mr.developer.cfg 34 | .project 35 | .pydevproject 36 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (C) 2001-2011 NLTK Project 2 | 3 | Licensed under the Apache License, Version 2.0 (the 'License'); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an 'AS IS' BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | 3 | setup( 4 | name='readability', 5 | version='0.3.1', 6 | description=('Measure the readability of a given text ' 7 | 'using surface characteristics'), 8 | long_description=open('README.rst').read(), 9 | author='Andreas van Cranenburgh', 10 | author_email='A.W.vanCranenburgh@uva.nl', 11 | url='https://github.com/andreasvc/readability/', 12 | classifiers=[ 13 | 'Development Status :: 4 - Beta', 14 | 'Environment :: Console', 15 | 'Environment :: Web Environment', 16 | 'Intended Audience :: Science/Research', 17 | 'License :: OSI Approved :: Apache Software License', 18 | 'Operating System :: POSIX', 19 | 'Programming Language :: Python :: 2.7', 20 | 'Programming Language :: Python :: 3.3', 21 | 'Programming Language :: Cython', 22 | 'Topic :: Text Processing :: Linguistic', 23 | ], 24 | packages=['readability',], 25 | scripts=['bin/readability'], 26 | ) 27 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | Readability 2 | =========== 3 | 4 | An implementation of traditional readability measures based on simple surface 5 | characteristics. These measures are basically linear regressions based on the 6 | number of words, syllables, and sentences. 7 | 8 | The functionality is modeled after the UNIX ``style(1)`` command. Compared to the 9 | implementation as part of `GNU diction `_, 10 | this version supports UTF-8 encoded text, but expects sentence-segmented and 11 | word-tokenized text. The syllabification and word type recognition are based on 12 | simple heuristics and only provides a rough measure. The supported languages 13 | are English, German, and Dutch. Adding support for a new language involves the 14 | addition of heuristics for the aforementioned syllabification and word type 15 | recognition; see ``langdata.py``. 16 | 17 | NB: all readability formulas were developed for English, so the scales of the 18 | outcomes are only meaningful for English texts. The Dale-Chall measure uses the 19 | original word list for English, but for Dutch and German lists of frequent 20 | words are used that were not specifically selected for recognizability by 21 | school children. 22 | 23 | For syntactic complexity measures, see 24 | `udstyle `_ 25 | 26 | Installation 27 | ------------ 28 | :: 29 | 30 | $ pip install https://github.com/andreasvc/readability/tarball/master 31 | 32 | Usage 33 | ----- 34 | The following preprocessing is expected: 35 | 36 | - Tokens (words or punctuation) separated by space 37 | - One sentence per line; no line breaks within sentences 38 | - Paragraphs separated by one empty line 39 | 40 | The quality of preprocessing affects the validity of the results. 41 | 42 | From Python; tokenization using `syntok `_: 43 | 44 | .. code:: python 45 | 46 | >>> import readability 47 | >>> import syntok.segmenter as segmenter 48 | >>> text = """ 49 | This is an example sentence. Note that tokens will be separated by spaces 50 | and sentences by newlines. 51 | 52 | This is the second paragraph.""" 53 | >>> tokenized = '\n\n'.join( 54 | '\n'.join(' '.join(token.value for token in sentence) 55 | for sentence in paragraph) 56 | for paragraph in segmenter.analyze(text)) 57 | >>> print(tokenized) 58 | This is an example sentence . 59 | Note that tokens will be separated by spaces and sentences by newlines . 60 | 61 | This is the second paragraph . 62 | >>> results = readability.getmeasures(tokenized, lang='en') 63 | >>> print(results['readability grades']['FleschReadingEase']) 64 | 68.64621212121216 65 | 66 | Command line usage:: 67 | 68 | $ readability --help 69 | Simple readability measures. 70 | 71 | Usage: readability [--lang=] [FILE] 72 | or: readability [--lang=] --csv FILES... 73 | 74 | By default, input is read from standard input. 75 | Text should be encoded with UTF-8, 76 | one sentence per line, tokens space-separated. 77 | 78 | Options: 79 | -L, --lang= Set language (available: de, nl, en). 80 | --csv Produce a table in comma separated value format on 81 | standard output given one or more filenames. 82 | --tokenizer= Specify a tokenizer including options that will be given 83 | each text on stdin and should return tokenized output on 84 | stdout. Not applicable when reading from stdin. 85 | 86 | Recommended tokenizers: 87 | 88 | - For English and German, I recommend "tokenizer", 89 | cf. http://moin.delph-in.net/WeSearch/DocumentParsing 90 | - For Dutch, I recommend the tokenizer that is part of the Alpino parser: 91 | http://www.let.rug.nl/vannoord/alp/Alpino/. 92 | - ``ucto`` is a general multilingual tokenizer: http://ilk.uvt.nl/ucto 93 | 94 | Example using ``ucto``:: 95 | 96 | $ ucto -L en -n -s "''" "CONRAD, Joseph - Lord Jim.txt" | readability 97 | [...] 98 | readability grades: 99 | Kincaid: 5.44 100 | ARI: 6.39 101 | Coleman-Liau: 6.91 102 | FleschReadingEase: 85.17 103 | GunningFogIndex: 9.86 104 | LIX: 31.98 105 | SMOGIndex: 9.39 106 | RIX: 2.56 107 | DaleChallIndex: 8.02 108 | sentence info: 109 | characters_per_word: 4.17 110 | syll_per_word: 1.24 111 | words_per_sentence: 16.35 112 | sentences_per_paragraph: 11.5 113 | type_token_ratio: 0.09 114 | characters: 551335 115 | syllables: 164205 116 | words: 132211 117 | wordtypes: 12071 118 | sentences: 8087 119 | paragraphs: 703 120 | long_words: 20670 121 | complex_words: 10990 122 | complex_words_dc: 29908 123 | word usage: 124 | tobeverb: 3907 125 | auxverb: 1630 126 | conjunction: 4398 127 | pronoun: 18092 128 | preposition: 19290 129 | nominalization: 1167 130 | sentence beginnings: 131 | pronoun: 2578 132 | interrogative: 217 133 | article: 629 134 | subordination: 120 135 | conjunction: 236 136 | preposition: 397 137 | 138 | The option ``--csv`` collects readability measures for a number of texts in 139 | a table. To tokenize documents on-the-fly when using this option, use 140 | the ``--tokenizer`` option. Example with the "tokenize" tool:: 141 | 142 | $ readability --csv --tokenizer='tokenizer -L en-u8 -P -S -E "" -N' */*.txt >readabilitymeasures.csv 143 | 144 | References 145 | ---------- 146 | The following readability metrics are included: 147 | 148 | 1. http://en.wikipedia.org/wiki/Automated_Readability_Index 149 | 2. http://en.wikipedia.org/wiki/SMOG 150 | 3. http://en.wikipedia.org/wiki/Flesch%E2%80%93Kincaid_Grade_Level#Flesch.E2.80.93Kincaid_Grade_Level 151 | 4. http://en.wikipedia.org/wiki/Flesch%E2%80%93Kincaid_readability_test#Flesch_Reading_Ease 152 | 5. http://en.wikipedia.org/wiki/Coleman-Liau_Index 153 | 6. http://en.wikipedia.org/wiki/Gunning-Fog_Index 154 | 7. https://en.wikipedia.org/wiki/Dale%E2%80%93Chall_readability_formula 155 | 156 | For better readability measures, consider the following: 157 | 158 | - Collins-Thompson & Callan (2004). A language modeling approach to predicting reading difficulty. 159 | In Proc. of HLT/NAACL, pp. 193-200. http://aclweb.org/anthology/N04-1025.pdf 160 | - Schwarm & Ostendorf (2005). Reading level assessment using SVM and statistical language models. 161 | Proc. of ACL, pp. 523-530. http://www.aclweb.org/anthology/P05-1065.pdf 162 | - The Lexile framework for reading. http://www.lexile.com 163 | - Coh-Metrix. http://cohmetrix.memphis.edu/ 164 | - Stylene: http://www.clips.ua.ac.be/category/projects/stylene 165 | - T-Scan: http://languagelink.let.uu.nl/tscan 166 | 167 | Acknowledgments 168 | --------------- 169 | The code is based on: https://github.com/mmautner/readability 170 | 171 | Which in turn was based on: https://github.com/nltk/nltk_contrib/tree/master/nltk_contrib/readability 172 | -------------------------------------------------------------------------------- /readability/__init__.py: -------------------------------------------------------------------------------- 1 | """Simple readability measures. 2 | 3 | Usage: %(cmd)s [--lang=] [FILE] 4 | or: %(cmd)s [--lang=] --csv FILES... 5 | 6 | By default, input is read from standard input. 7 | Text should be encoded with UTF-8, 8 | one sentence per line, tokens space-separated. 9 | 10 | Options: 11 | -L, --lang= Set language (available: %(lang)s). 12 | --csv Produce a table in comma separated value format on 13 | standard output given one or more filenames. 14 | --tokenizer= Specify a tokenizer including options that will be given 15 | each text on stdin and should return tokenized output on 16 | stdout. Not applicable when reading from stdin.""" 17 | 18 | from __future__ import division, print_function, unicode_literals 19 | import io 20 | import os 21 | try: 22 | import re2 as re 23 | except ImportError: 24 | import re 25 | import sys 26 | import math 27 | import string 28 | import getopt 29 | import subprocess 30 | import collections 31 | from readability.langdata import LANGDATA 32 | if sys.version[0] >= '3': 33 | unicode = str # pylint: disable=invalid-name,redefined-builtin 34 | 35 | PARARE = re.compile('\n\n+') 36 | SENTRE = re.compile('[^\n]+(?:\n|$)') 37 | PUNCTRE = re.compile("^[%s]+$" % re.escape(string.punctuation)) 38 | 39 | # Match dashes at start of line, or any quotation mark used for direct speech 40 | # if used as separate token (rules out contractions, possessives, and hyphens 41 | # within words, given correct tokenization). 42 | DIRECTSPEECHRE = re.compile( 43 | "^\\s*[-\u2012-\u2015\u2022\u2043].*$" # dashes 44 | "|(?:^| )['\"\u2018-\u201b\u2039\u203a\u02bc" # single quotes 45 | "\u201c-\u201f\u00ab\u00bb](?: |$)") # double quotes 46 | # The following quotation marks are recognize. 47 | # dashes/bullet points: 48 | # U+2012 FIGURE DASH 49 | # U+2013 EN DASH 50 | # U+2014 EM DASH 51 | # U+2015 HORIZONTAL BAR 52 | # U+2022 BULLET 53 | # U+2043 HYPHEN BULLET 54 | 55 | # single/double quotes: 56 | # U+2018 left single quotation mark 57 | # U+2019 right single quotation mark 58 | # U+201A single low-9 quotation mark 59 | # U+201B single high-reversed-9 quotation mark 60 | # U+2039 single left-pointing angle quotation mark 61 | # U+203A single right-pointing angle quotation mark 62 | # U+02BC modifier letter apostrophe 63 | # U+201C left double quotation mark 64 | # U+201D right double quotation mark 65 | # U+201E double low-9 quotation mark 66 | # U+201F double high-reversed-9 quotation mark 67 | # U+00AB left-pointing double angle quotation mark 68 | # U+00BB right-pointing double angle quotation mark 69 | 70 | 71 | def getmeasures(text, lang='en', merge=False): 72 | """Collect surface characteristics of a tokenized text. 73 | 74 | >>> text = "A tokenized sentence .\\nAnother sentence ." 75 | >>> result = getmeasures(text) 76 | >>> result['sentence info']['words'] == 5 77 | True 78 | 79 | :param text: a single unicode string or an iterable of lines, 80 | one sentence per line of space separated tokens. 81 | :param lang: a language code to select the syllabification procedure and 82 | word types to count. 83 | :param merge: if ``True``, return a dictionary results into a single 84 | dictionary of key-value pairs. 85 | :returns: a two-level ordered dictionary with measurements.""" 86 | characters = 0 87 | words = 0 88 | syllables = 0 89 | complex_words = 0 90 | complex_words_dc = 0 91 | long_words = 0 92 | paragraphs = 0 93 | sentences = 0 94 | directspeech = 0 95 | vocabulary = set() 96 | syllcounter = LANGDATA[lang]['syllables'] 97 | wordusageregexps = LANGDATA[lang]['words'] 98 | beginningsregexps = LANGDATA[lang]['beginnings'] 99 | basicwords = LANGDATA[lang].get('basicwords', frozenset()) 100 | 101 | wordusage = collections.OrderedDict([(name, 0) for name, regexp 102 | in wordusageregexps.items()]) 103 | beginnings = collections.OrderedDict([(name, 0) for name, regexp 104 | in beginningsregexps.items()]) 105 | 106 | if isinstance(text, bytes): 107 | raise ValueError('Expected: unicode string or an iterable of lines') 108 | elif isinstance(text, unicode): 109 | # Collect surface characteristics from a string. 110 | # NB: only recognizes UNIX newlines. 111 | paragraphs = sum(1 for _ in PARARE.finditer(text)) + 1 112 | for sent in SENTRE.findall(text): 113 | sentences += 1 114 | directspeech += DIRECTSPEECHRE.search(sent) is not None 115 | # paragraphs = text.count('\n\n') 116 | # sentences = text.count('\n') - paragraphs 117 | for token in text.split(): 118 | if PUNCTRE.match(token) is not None: 119 | continue 120 | vocabulary.add(token) 121 | words += 1 122 | characters += len(token) 123 | syll = syllcounter(token) 124 | syllables += syll 125 | if len(token) >= 7: 126 | long_words += 1 127 | 128 | # ignore proper nouns and numbers 129 | if not token[0].isupper() and not token.isdigit(): 130 | if syll >= 3: 131 | complex_words += 1 132 | if token.lower() not in basicwords: 133 | complex_words_dc += 1 134 | 135 | for name, regexp in wordusageregexps.items(): 136 | wordusage[name] += sum(1 for _ in regexp.finditer(text)) 137 | for name, regexp in beginningsregexps.items(): 138 | beginnings[name] += sum(1 for _ in regexp.finditer(text)) 139 | else: # Collect surface characteristics from an iterable. 140 | prevempty = True 141 | for sent in text: 142 | sent = sent.strip() 143 | 144 | if prevempty and sent: 145 | paragraphs += 1 146 | elif not sent: 147 | prevempty = True 148 | continue 149 | prevempty = False 150 | 151 | sentences += 1 152 | directspeech += DIRECTSPEECHRE.search(sent) is not None 153 | for token in sent.split(): 154 | if PUNCTRE.match(token) is not None: 155 | continue 156 | vocabulary.add(token) 157 | words += 1 158 | characters += len(token) 159 | syll = syllcounter(token) 160 | syllables += syll 161 | if len(token) >= 7: 162 | long_words += 1 163 | 164 | # ignore proper nouns and numbers 165 | if not token[0].isupper() and not token.isdigit(): 166 | if syll >= 3: 167 | complex_words += 1 168 | if token.lower() not in basicwords: 169 | complex_words_dc += 1 170 | 171 | for name, regexp in wordusageregexps.items(): 172 | wordusage[name] += sum(1 for _ in regexp.finditer(sent)) 173 | for name, regexp in beginningsregexps.items(): 174 | beginnings[name] += regexp.match(sent) is not None 175 | 176 | if not words: 177 | raise ValueError("I can't do this, there's no words there!") 178 | 179 | stats = collections.OrderedDict([ 180 | ('characters_per_word', characters / words), 181 | ('syll_per_word', syllables / words), 182 | ('words_per_sentence', words / sentences), 183 | ('sentences_per_paragraph', sentences / paragraphs), 184 | ('type_token_ratio', len(vocabulary) / words), 185 | ('directspeech_ratio', directspeech / sentences), 186 | ('characters', characters), 187 | ('syllables', syllables), 188 | ('words', words), 189 | ('wordtypes', len(vocabulary)), 190 | ('sentences', sentences), 191 | ('paragraphs', paragraphs), 192 | ('long_words', long_words), 193 | ('complex_words', complex_words), 194 | ]) 195 | readability = collections.OrderedDict([ 196 | ('Kincaid', KincaidGradeLevel(syllables, words, sentences)), 197 | ('ARI', ARI(characters, words, sentences)), 198 | ('Coleman-Liau', 199 | ColemanLiauIndex(characters, words, sentences)), 200 | ('FleschReadingEase', 201 | FleschReadingEase(syllables, words, sentences)), 202 | ('GunningFogIndex', 203 | GunningFogIndex(words, complex_words, sentences)), 204 | ('LIX', LIX(words, long_words, sentences)), 205 | ('SMOGIndex', SMOGIndex(complex_words, sentences)), 206 | ('RIX', RIX(long_words, sentences)), 207 | ]) 208 | if basicwords: 209 | stats['complex_words_dc'] = complex_words_dc 210 | readability['DaleChallIndex'] = DaleChallIndex( 211 | words, complex_words_dc, sentences) 212 | if merge: 213 | readability.update(stats) 214 | readability.update(wordusage) 215 | readability.update(beginnings) 216 | return readability 217 | return collections.OrderedDict([ 218 | ('readability grades', readability), 219 | ('sentence info', stats), 220 | ('word usage', wordusage), 221 | ('sentence beginnings', beginnings), 222 | ]) 223 | 224 | 225 | def getdataframe(filenames, lang='en', encoding='utf8', tokenizer=None): 226 | """Return a pandas DataFrame with readability measures for a list of files. 227 | """ 228 | import pandas 229 | filenames = list(filenames) 230 | 231 | return pandas.DataFrame([getmeasures( 232 | applytokenizer(name, tokenizer, encoding), 233 | lang=lang, 234 | merge=True) 235 | for name in filenames], index=filenames) 236 | 237 | 238 | def applytokenizer(filename, tokenizer, encoding): 239 | """Run the tokenizer command on a file, if given, and return text.""" 240 | if tokenizer is None: 241 | return io.open(filename, encoding=encoding).read() 242 | proc = subprocess.Popen( 243 | tokenizer.split(), 244 | stdin=subprocess.PIPE, 245 | stdout=subprocess.PIPE, 246 | stderr=subprocess.PIPE) 247 | out, _err = proc.communicate(open(filename).read()) 248 | return out.decode(encoding) 249 | 250 | 251 | def KincaidGradeLevel(syllables, words, sentences): 252 | return 11.8 * (syllables / words) + 0.39 * ((words / sentences)) - 15.59 253 | 254 | 255 | def ARI(characters, words, sentences): 256 | return 4.71 * (characters / words) + 0.5 * (words / sentences) - 21.43 257 | 258 | 259 | def ColemanLiauIndex(characters, words, sentences): 260 | return (5.879851 * characters / words - 29.587280 * sentences / words 261 | - 15.800804) 262 | 263 | def FleschReadingEase(syllables, words, sentences): 264 | return 206.835 - 84.6 * (syllables / words) - 1.015 * (words / sentences) 265 | 266 | 267 | def GunningFogIndex(words, complex_words, sentences): 268 | return 0.4 * (((words / sentences)) + (100 * (complex_words / words))) 269 | 270 | 271 | def LIX(words, long_words, sentences): 272 | return words / sentences + (100 * long_words) / words 273 | 274 | 275 | def SMOGIndex(complex_words, sentences): 276 | return math.sqrt(complex_words * (30 / sentences)) + 3 277 | 278 | 279 | def RIX(long_words, sentences): 280 | return long_words / sentences 281 | 282 | 283 | def DaleChallIndex(words, complex_words_dc, sentences): 284 | complex_prc = complex_words_dc / words * 100 285 | score = 0.1579 * complex_prc + 0.0496 * words / sentences 286 | if complex_prc <= 5: 287 | score += 3.6365 288 | return score 289 | 290 | 291 | def main(): 292 | shortoptions = 'hL:' 293 | options = 'help csv lang= tokenizer='.split() 294 | cmd = os.path.basename(sys.argv[0]) 295 | usage = __doc__ % dict(cmd=cmd, lang=', '.join(LANGDATA)) 296 | try: 297 | opts, args = getopt.gnu_getopt(sys.argv[1:], shortoptions, options) 298 | except getopt.GetoptError as err: 299 | print('error: %r\n%s' % (err, usage)) 300 | sys.exit(2) 301 | opts = dict(opts) 302 | lang = opts.get('--lang', opts.get('-L', 'en')) 303 | 304 | if '--help' in opts or '-h' in opts: 305 | print(usage) 306 | return 307 | elif '--csv' in opts: 308 | result = getdataframe(args, lang=lang, 309 | tokenizer=opts.get('--tokenizer')) 310 | result.to_csv(sys.stdout) 311 | return 312 | elif len(args) == 0 or args == ['-']: 313 | text = io.TextIOWrapper(sys.stdin.buffer, encoding='utf8') 314 | elif len(args) == 1: 315 | text = applytokenizer(args[0], opts.get('--tokenizer'), 'utf8') 316 | else: 317 | raise ValueError('expected 0 or 1 file argument.') 318 | try: 319 | for cat, data in getmeasures(text, lang).items(): 320 | print('%s:' % cat) 321 | for key, val in data.items(): 322 | print((' %-25s %12.2f' % (key + ':', val) 323 | ).rstrip('0 ').rstrip('.')) 324 | except KeyboardInterrupt: 325 | sys.exit(1) 326 | 327 | 328 | __all__ = ['getmeasures', 'getdataframe'] 329 | 330 | if __name__ == "__main__": 331 | main() 332 | -------------------------------------------------------------------------------- /readability/langdata.py: -------------------------------------------------------------------------------- 1 | # -*- coding: UTF-8 -*- 2 | """Language specific data and functions.""" 3 | 4 | from __future__ import unicode_literals 5 | try: 6 | import re2 as re 7 | except ImportError: 8 | import re 9 | import collections 10 | 11 | VOWELS = 'aoeuiäàâáåãëéèêóòöôõðùúüìíïî' # y is special case; true for en. 12 | 13 | specialsyllables_en = """\ 14 | tottered 2 15 | chummed 1 16 | peeped 1 17 | moustaches 2 18 | shamefully 3 19 | messieurs 2 20 | satiated 4 21 | sailmaker 4 22 | sheered 1 23 | disinterred 3 24 | propitiatory 6 25 | bepatched 2 26 | particularized 5 27 | caressed 2 28 | trespassed 2 29 | sepulchre 3 30 | flapped 1 31 | hemispheres 3 32 | pencilled 2 33 | motioned 2 34 | poleman 2 35 | slandered 2 36 | sombre 2 37 | etc 4 38 | sidespring 2 39 | mimes 1 40 | effaces 2 41 | mr 2 42 | mrs 2 43 | ms 1 44 | dr 2 45 | st 1 46 | sr 2 47 | jr 2 48 | truckle 2 49 | foamed 1 50 | fringed 2 51 | clattered 2 52 | capered 2 53 | mangroves 2 54 | suavely 2 55 | reclined 2 56 | brutes 1 57 | effaced 2 58 | quivered 2 59 | h'm 1 60 | veriest 3 61 | sententiously 4 62 | deafened 2 63 | manoeuvred 3 64 | unstained 2 65 | gaped 1 66 | stammered 2 67 | shivered 2 68 | discoloured 3 69 | gravesend 2 70 | 60 2 71 | lb 1 72 | unexpressed 3 73 | greyish 2 74 | unostentatious 5 75 | """ 76 | 77 | fallback_cache = {} 78 | _fallback_subsyl = ["cial", "tia", "cius", "cious", "gui", "ion", "iou", 79 | "sia$", ".ely$"] 80 | _fallback_addsyl = ["ia", "riet", "dien", "iu", "io", "ii", 81 | "[aeiouy]bl$", "mbl$", 82 | "[aeiou]{3}", 83 | "^mc", "ism$", 84 | "(.)(?!\\1)([aeiouy])\\2l$", 85 | "[^l]llien", 86 | "^coad.", "^coag.", "^coal.", "^coax.", 87 | "(.)(?!\\1)[gq]ua(.)(?!\\2)[aeiou]", 88 | "dnt$"] 89 | fallback_subsyl = [re.compile(a) for a in _fallback_subsyl] 90 | fallback_addsyl = [re.compile(a) for a in _fallback_addsyl] 91 | 92 | 93 | def _normalize_word(word): 94 | return word.strip().lower() 95 | 96 | # Read syllable overrides and populate cache with them 97 | for line in specialsyllables_en.splitlines(): 98 | line = line.strip() 99 | if line: 100 | toks = line.split() 101 | assert len(toks) == 2 102 | fallback_cache[_normalize_word(toks[0])] = int(toks[1]) 103 | 104 | 105 | def countsyllables_en(word): 106 | """Fallback syllable counter. 107 | 108 | This is based on the algorithm in Greg Fast's perl module 109 | Lingua::EN::Syllable.""" 110 | if not word: 111 | return 0 112 | 113 | # Remove final silent 'e' 114 | if word[-1] == "e": 115 | word = word[:-1] 116 | 117 | # Check for a cached syllable count 118 | if word in fallback_cache: 119 | return fallback_cache[word] 120 | 121 | # Count vowel groups 122 | result = 0 123 | prev_was_vowel = False 124 | for char in word: 125 | is_vowel = char in VOWELS or char == 'y' 126 | if is_vowel and not prev_was_vowel: 127 | result += 1 128 | prev_was_vowel = is_vowel 129 | 130 | # Add & subtract syllables 131 | for r in fallback_addsyl: 132 | if r.search(word): 133 | result += 1 134 | for r in fallback_subsyl: 135 | if r.search(word): 136 | result -= 1 137 | 138 | # Cache the syllable count 139 | fallback_cache[word] = result 140 | 141 | return result 142 | 143 | 144 | def countsyllables_nlde(word): 145 | """Count syllables for Dutch / German words by counting vowel-consonant or 146 | consonant-vowel pairs, depending on the first character being a vowel or 147 | not. If it is, a trailing e will be handled with a special rule.""" 148 | result = 0 149 | prev_was_vowel = word[0] in VOWELS 150 | for char in word[1:]: 151 | is_vowel = char in VOWELS 152 | if prev_was_vowel and not is_vowel: 153 | result += 1 154 | prev_was_vowel = is_vowel 155 | 156 | if (len(word) > 1 and word[0] in VOWELS 157 | and word.endswith('e') and not word[-2] in VOWELS): 158 | result += 1 159 | return result or 1 160 | 161 | 162 | conjuction_en = r'and|but|or|yet|nor' 163 | preposition_en = ( 164 | 'board|about|above|according to|across from' 165 | '|after|against|alongside|alongside of|along with' 166 | '|amid|among|apart from|around|aside from|at|away from' 167 | '|back of|because of|before|behind|below|beneath|beside' 168 | '|besides|between|beyond|but|by means of' 169 | '|concerning|considering|despite|down|down from|during' 170 | '|except|except for|excepting for|from among' 171 | '|from between|from under|in addition to|in behalf of' 172 | '|in front of|in place of|in regard to|inside of|inside' 173 | '|in spite of|instead of|into|like|near to|off' 174 | '|on account of|on behalf of|onto|on top of|on|opposite' 175 | '|out of|out|outside|outside of|over to|over|owing to' 176 | '|past|prior to|regarding|round about|round' 177 | '|since|subsequent to|together|with|throughout|through' 178 | '|till|toward|under|underneath|until|unto|up' 179 | '|up to|upon|with|within|without|across|along' 180 | '|by|of|in|to|near|of|from') 181 | pronoun_en = ( 182 | 'i|me|we|us|you|he|him|she|her|it|they' 183 | '|them|thou|thee|ye|myself|yourself|himself' 184 | '|herself|itself|ourselves|yourselves|themselves' 185 | '|oneself|my|mine|his|hers|yours|ours|theirs|its' 186 | '|our|that|their|these|this|those|your') 187 | words_en = collections.OrderedDict([ 188 | ('tobeverb', re.compile( 189 | r'\b(be|being|was|were|been|are|is)\b', re.IGNORECASE)), 190 | ('auxverb', re.compile( 191 | r"\b(will|shall|cannot|may|need to|would|should" 192 | r"|could|might|must|ought|ought to|can't|can)\b", re.IGNORECASE)), 193 | ('conjunction', re.compile( 194 | '\\b(%s)\\b' % conjuction_en, re.IGNORECASE)), 195 | ('pronoun', re.compile( 196 | '\\b(%s)\\b' % pronoun_en, re.IGNORECASE)), 197 | ('preposition', re.compile( 198 | '\\b(%s)\\b' % preposition_en, re.IGNORECASE)), 199 | # a bit limited, but this is exactly what the original style(1) did: 200 | ('nominalization', re.compile( 201 | r'\b\w{3,}(tion|ment|ence|ance)\b', re.IGNORECASE | re.UNICODE)), 202 | ]) 203 | 204 | beginnings_en = collections.OrderedDict([ 205 | ('pronoun', re.compile( 206 | '(^|\\n)(%s)\\b' % pronoun_en, re.IGNORECASE)), 207 | ('interrogative', re.compile( 208 | r'(^|\n)(why|who|what|whom|when|where|how)\b', re.IGNORECASE)), 209 | ('article', re.compile( 210 | r'(^|\n)(the|a|an)\b', re.IGNORECASE)), 211 | ('subordination', re.compile( 212 | r"(^|\n)(after|because|lest|till|'til|although" 213 | r"|before|now that|unless|as|even if|provided that|provided" 214 | r"|until|as if|even though|since|as long as|so that" 215 | r"|whenever|as much as|if|than|as soon as|inasmuch" 216 | r"|in order that|though|while)\b", re.IGNORECASE)), 217 | ('conjunction', re.compile( 218 | '(^|\\n)(%s)\\b' % conjuction_en, re.IGNORECASE)), 219 | ('preposition', re.compile( 220 | '(^|\\n)(%s)\\b' % preposition_en, re.IGNORECASE)), 221 | ]) 222 | 223 | conjuction_nl = 'en|maar|of|want|dus|noch' 224 | preposition_nl = ( 225 | "à|aan|ad|achter|behalve|beneden|betreffende|bij" 226 | "|binnen|blijkens|boven|buiten|circa|conform|contra" 227 | "|cum|dankzij|door|gedurende|gezien|hangende|in" 228 | "|ingevolge|inzake|jegens|krachtens|langs|met|middels" 229 | "|mits|na|naar|naast|nabij|namens|niettegenstaande" 230 | "|nopens|om|omstreeks|omtrent|ondanks|onder|ongeacht" 231 | "|onverminderd|op|over|overeenkomstig|per|plus|richting" 232 | "|qua|rond|rondom|sedert|staande|te|tegen|tegenover" 233 | "|ten|ter|tijdens|tot|tussen|uit|uitgezonderd|van" 234 | "|vanaf|vanuit|vanwege|versus|via|volgens|voor" 235 | "|voorbij|wegens|zonder") 236 | pronoun_nl = ( 237 | # persoonlijk voornaamwoord 238 | "ik|jij|je|u|hij|hem|zij|ze|haar|het" 239 | "|wij|we|ons|jullie|hen|hun" 240 | # wederkerend voornaamwoord 241 | "mij|me|mijzelf|mezelf|je|jezelf|uzelf" 242 | "|zich|zichzelf|haarzelf|onszelf" 243 | "|elkaar|elkaars|elkander|elkanders|mekaar|mekaars" 244 | # pers. vnw: archaisch 245 | "gij|ge" 246 | "|mijnen|deinen|zijnen|haren|onzen|uwen|hunnen|haren" 247 | "|mijner|deiner|zijner|harer|onzer|uwer|hunner|harer" 248 | "|mijnes|deines|zijnes|hares|onzes|uwes|hunnes|hares") 249 | words_nl = collections.OrderedDict([ 250 | ('tobeverb', re.compile( 251 | r'\b(ben|bent|is|zijn|was|waren)\b', re.IGNORECASE)), 252 | ('auxverb', re.compile( 253 | "\\b(" 254 | # NB: past perfect forms of these verbs 255 | # ('gehad', 'geweest', 'geworden') are not auxiliary. 256 | # with past perfect verb 257 | "heb|hebt|heeft|hebben|had|hadden" 258 | "|word|wordt|worden|werd|werden" 259 | # "|ben|bent|is|zijn|was|waren" 260 | # with infinitive 261 | "|zal|zult|zullen|zou|zouden" 262 | "|kan|kan|kunt|kunnen|kon|konden" 263 | "|wil|wilt|willen|wilde|wilden|wou|wouden" 264 | "|moet|moeten|moest|moesten" 265 | # "|mag|mogen|mocht|mochten" 266 | # "|hoef|hoeft|hoeven|hoefde|hoefden" 267 | # "|doe|doet|doen|deed|deden" 268 | ")\\b", re.IGNORECASE)), 269 | ('conjunction', re.compile( 270 | '\\b(%s)\\b' % conjuction_nl, re.IGNORECASE)), 271 | ('pronoun', re.compile( 272 | '\\b(%s)\\b' % pronoun_nl, re.IGNORECASE)), 273 | ('preposition', re.compile( 274 | '\\b(%s)\\b' % preposition_nl, re.IGNORECASE)), 275 | # a bit limited, but this is exactly what the original style(1) did: 276 | ('nominalization', re.compile( 277 | r'\b.{3,}(tie|heid|ing|end|ende)\b', re.IGNORECASE)), 278 | ]) 279 | beginnings_nl = collections.OrderedDict([ 280 | ('pronoun', re.compile( 281 | '(^|\\n)(%s)\\b' % pronoun_nl, re.IGNORECASE)), 282 | ('interrogative', re.compile( 283 | r'(^|\n)(wie|wat|waar|waarom|wanneer|hoe|welk|welke)\b', 284 | re.IGNORECASE)), 285 | ('article', re.compile( 286 | r"(^|\n)(de|het|een|'t)\b", re.IGNORECASE)), 287 | ('subordination', re.compile( 288 | "(^|\\n)(" 289 | # onderschikkende voegwoorden 290 | "aangezien|als|alsof|behalve|daar|daarom|dat" 291 | "|derhalve|doch|doordat|hoewel|indien|mits|nadat" 292 | "|noch|ofschoon|omdat|ondanks|opdat|sedert|sinds" 293 | "|tenzij|terwijl|toen|totdat|voordat|wanneer" 294 | "|zoals|zodat|zodra|zonder dat" 295 | # infitief constructies 296 | "|om te)\\b", re.IGNORECASE)), 297 | ('conjunction', re.compile( 298 | '(^|\\n)(%s)\\b' % conjuction_nl, re.IGNORECASE)), 299 | ('preposition', re.compile( 300 | '(^|\\n)(%s)\\b' % preposition_nl, re.IGNORECASE)), 301 | ]) 302 | 303 | conjuction_de = ('und|oder|aber|sondern|doch|nur|bloß|denn' 304 | 'weder|noch|sowie') 305 | preposition_de = ( 306 | 'aus|außer|bei|mit|nach|seit|von|zu' 307 | '|bis|durch|für|gegen|ohne|um|an|auf' 308 | '|hinter|in|neben|über|unter|vor|zwischen' 309 | '|anstatt|statt|trotz|während|wegen') 310 | pronoun_de = ( 311 | 'ich|du|er|sie|es|wir|ihr' # sie # Nominativ 312 | '|mich|dich|ihn|uns|euch' # sie # Akkusativ 313 | '|mir|dir|ihm|ihnen' # uns euch ihr # Dativ 314 | '|mein|dein|sein|unser|euer' # ihr # Genitiv 315 | '|meiner|deiner|seiner|unserer|eurer|ihrer' # Genitiv 316 | '|meine|deine|seine|unsere|eure|ihre' # Genitiv 317 | '|meines|deines|seines|unseres|eures|ihres' # Genitiv 318 | '|meinem|deinem|seinem|unserem|eurem|ihrem' # Genitiv 319 | '|meinen|deinen|seinen|unseren|euren|ihren' # Genitiv 320 | ) 321 | words_de = collections.OrderedDict([ 322 | ('tobeverb', re.compile("\\b(" 323 | "sein|bin|bist|ist|sind|seid|war|warst|wart" 324 | "|waren|gewesen|wäre|wärst|wär|wären|wärt|wäret" 325 | ")\\b", re.IGNORECASE)), 326 | ('auxverb', re.compile("\\b(" 327 | "haben|habe|hast|hat|habt|gehabt|hätte|hättest" 328 | "|hätten|hättet" 329 | "|werden|werde|wirst|wird|werdet|geworden|würde" 330 | "|würdest|würden|würdet" 331 | "|können|kann|kannst|könnt|konnte|konntest|konnten" 332 | "|konntet|gekonnt|könnte|könntest|könnten|könntet" 333 | "|müssen|muss|muß|musst|müsst|musste|musstest|mussten" 334 | "|gemusst|müsste|müsstest|müssten|müsstet" 335 | "|sollen|soll|sollst|sollt|sollte|solltest|solltet" 336 | "|sollten|gesollt" 337 | ")\\b", re.IGNORECASE)), 338 | ('conjunction', re.compile( 339 | '\\b(%s)\\b' % conjuction_de, re.IGNORECASE)), 340 | ('pronoun', re.compile( 341 | '\\b(%s)\\b' % pronoun_de, re.IGNORECASE)), 342 | ('preposition', re.compile( 343 | '\\b(%s)\\b' % preposition_de, re.IGNORECASE)), 344 | ('nominalization', re.compile( 345 | r'\b.{3,}(ung|heit|keit|nis|tum)\b', re.IGNORECASE)), 346 | ]) 347 | beginnings_de = collections.OrderedDict([ 348 | ('pronoun', re.compile( 349 | '(^|\\n)(%s)\\b' % pronoun_de, re.IGNORECASE)), 350 | ('interrogative', re.compile( 351 | r'(^|\n)(wer|was|wem|wen|wessen|wo|wie|warum|weshalb|wann' 352 | r'|wieso|weswegen)\b', re.IGNORECASE)), 353 | ('article', re.compile( 354 | r"(^|\n)(der|die|das|des|dem|den|ein|eine|einer|eines|einem|einen)\b", 355 | re.IGNORECASE)), 356 | ('subordination', re.compile("(^|\\n)(" 357 | # bei Nebensätzen 358 | "als|als dass|als daß|als ob|anstatt dass|anstatt daß" 359 | "|ausser dass|ausser daß|ausser wenn|bevor|bis|da|damit" 360 | "|dass|daß|ehe|falls|indem|je|nachdem|ob|obgleich" 361 | "|obschon|obwohl|ohne dass|ohne daß|seit|so daß|sodass" 362 | "|sobald|sofern|solange|so oft|statt dass|statt daß" 363 | "|während|weil|wenn|wenn auch|wenngleich|wie|wie wenn" 364 | "|wiewohl|wobei|wohingegen|zumal" 365 | # bei Infinitivgruppen 366 | "|als zu|anstatt zu|ausser zu|ohne zu|statt zu|um zu" 367 | ")\\b", re.IGNORECASE)), 368 | ('conjunction', re.compile( 369 | '(^|\\n)(%s)\\b' % conjuction_de, re.IGNORECASE)), 370 | ('preposition', re.compile( 371 | '(^|\\n)(%s)\\b' % preposition_de, re.IGNORECASE)), 372 | ]) 373 | 374 | # Long Dale-Chall word list of 3000 words recognized by 80 % of fifth graders 375 | basicwords_en = frozenset(""" 376 | n't 'm 'll 'd 's 're 've 377 | t m ll d s re ve don shouldn aren didn hadn hasn haven isn needn shan wasn 378 | a able aboard about above absent accept accident account 379 | ache aching acorn acre across act acts add address admire adventure afar afraid 380 | after afternoon afterward afterwards again against age aged ago agree ah ahead 381 | aid aim air airfield airplane airport airship airy alarm alike alive all alley 382 | alligator allow almost alone along aloud already also always am America 383 | American among amount an and angel anger angry animal another answer ant any 384 | anybody anyhow anyone anything anyway anywhere apart apartment ape apiece 385 | appear apple April apron are aren't arise arithmetic arm armful army arose 386 | around arrange arrive arrived arrow art artist as ash ashes aside ask asleep at 387 | ate attack attend attention August aunt author auto automobile autumn avenue 388 | awake awaken away awful awfully awhile ax axe baa babe babies back background 389 | backward backwards bacon bad badge badly bag bake baker bakery baking ball 390 | balloon banana band bandage bang banjo bank banker bar barber bare barefoot 391 | barely bark barn barrel base baseball basement basket bat batch bath bathe 392 | bathing bathroom bathtub battle battleship bay be beach bead beam bean bear 393 | beard beast beat beating beautiful beautify beauty became because become 394 | becoming bed bedbug bedroom bedspread bedtime bee beech beef beefsteak beehive 395 | been beer beet before beg began beggar begged begin beginning begun behave 396 | behind being believe bell belong below belt bench bend beneath bent berries 397 | berry beside besides best bet better between bib bible bicycle bid big bigger 398 | bill billboard bin bind bird birth birthday biscuit bit bite biting bitter 399 | black blackberry blackbird blackboard blackness blacksmith blame blank blanket 400 | blast blaze bleed bless blessing blew blind blindfold blinds block blood bloom 401 | blossom blot blow blue blueberry bluebird blush board boast boat bob bobwhite 402 | bodies body boil boiler bold bone bonnet boo book bookcase bookkeeper boom boot 403 | born borrow boss both bother bottle bottom bought bounce bow bowl bow-wow box 404 | boxcar boxer boxes boy boyhood bracelet brain brake bran branch brass brave 405 | bread break breakfast breast breath breathe breeze brick bride bridge bright 406 | brightness bring broad broadcast broke broken brook broom brother brought brown 407 | brush bubble bucket buckle bud buffalo bug buggy build building built bulb bull 408 | bullet bum bumblebee bump bun bunch bundle bunny burn burst bury bus bush 409 | bushel business busy but butcher butt butter buttercup butterfly buttermilk 410 | butterscotch button buttonhole buy buzz by bye cab cabbage cabin cabinet cackle 411 | cage cake calendar calf call caller calling came camel camp campfire can canal 412 | canary candle candlestick candy cane cannon cannot canoe can't canyon cap cape 413 | capital captain car card cardboard care careful careless carelessness carload 414 | carpenter carpet carriage carrot carry cart carve case cash cashier castle cat 415 | catbird catch catcher caterpillar catfish catsup cattle caught cause cave 416 | ceiling cell cellar cent center cereal certain certainly chain chair chalk 417 | champion chance change chap charge charm chart chase chatter cheap cheat check 418 | checkers cheek cheer cheese cherry chest chew chick chicken chief child 419 | childhood children chill chilly chimney chin china chip chipmunk chocolate 420 | choice choose chop chorus chose chosen christen Christmas church churn 421 | cigarette circle circus citizen city clang clap class classmate classroom claw 422 | clay clean cleaner clear clerk clever click cliff climb clip cloak clock close 423 | closet cloth clothes clothing cloud cloudy clover clown club cluck clump coach 424 | coal coast coat cob cobbler cocoa coconut cocoon cod codfish coffee coffeepot 425 | coin cold collar college color colored colt column comb come comfort comic 426 | coming company compare conductor cone connect coo cook cooked cooking cookie 427 | cookies cool cooler coop copper copy cord cork corn corner correct cost cot 428 | cottage cotton couch cough could couldn't count counter country county course 429 | court cousin cover cow coward cowardly cowboy cozy crab crack cracker cradle 430 | cramps cranberry crank cranky crash crawl crazy cream creamy creek creep crept 431 | cried croak crook crooked crop cross crossing cross-eyed crow crowd crowded 432 | crown cruel crumb crumble crush crust cry cries cub cuff cup cuff cup cupboard 433 | cupful cure curl curly curtain curve cushion custard customer cut cute cutting 434 | dab dad daddy daily dairy daisy dam damage dame damp dance dancer dancing dandy 435 | danger dangerous dare dark darkness darling darn dart dash date daughter dawn 436 | day daybreak daytime dead deaf deal dear death December decide deck deed deep 437 | deer defeat defend defense delight den dentist depend deposit describe desert 438 | deserve desire desk destroy devil dew diamond did didn't die died dies 439 | difference different dig dim dime dine ding-dong dinner dip direct direction 440 | dirt dirty discover dish dislike dismiss ditch dive diver divide do dock doctor 441 | does doesn't dog doll dollar dolly done donkey don't door doorbell doorknob 442 | doorstep dope dot double dough dove down downstairs downtown dozen drag drain 443 | drank draw drawer draw drawing dream dress dresser dressmaker drew dried drift 444 | drill drink drip drive driven driver drop drove drown drowsy drub drum drunk 445 | dry duck due dug dull dumb dump during dust dusty duty dwarf dwell dwelt dying 446 | each eager eagle ear early earn earth east eastern easy eat eaten edge egg eh 447 | eight eighteen eighth eighty either elbow elder eldest electric electricity 448 | elephant eleven elf elm else elsewhere empty end ending enemy engine engineer 449 | English enjoy enough enter envelope equal erase eraser errand escape eve even 450 | evening ever every everybody everyday everyone everything everywhere evil exact 451 | except exchange excited exciting excuse exit expect explain extra eye eyebrow 452 | fable face facing fact factory fail faint fair fairy faith fake fall false 453 | family fan fancy far faraway fare farmer farm farming far-off farther fashion 454 | fast fasten fat father fault favor favorite fear feast feather February fed 455 | feed feel feet fell fellow felt fence fever few fib fiddle field fife fifteen 456 | fifth fifty fig fight figure file fill film finally find fine finger finish 457 | fire firearm firecracker fireplace fireworks firing first fish fisherman fist 458 | fit fits five fix flag flake flame flap flash flashlight flat flea flesh flew 459 | flies flight flip flip-flop float flock flood floor flop flour flow flower 460 | flowery flutter fly foam fog foggy fold folks follow following fond food fool 461 | foolish foot football footprint for forehead forest forget forgive forgot 462 | forgotten fork form fort forth fortune forty forward fought found fountain four 463 | fourteen fourth fox frame free freedom freeze freight French fresh fret Friday 464 | fried friend friendly friendship frighten frog from front frost frown froze 465 | fruit fry fudge fuel full fully fun funny fur furniture further fuzzy gain 466 | gallon gallop game gang garage garbage garden gas gasoline gate gather gave gay 467 | gear geese general gentle gentleman gentlemen geography get getting giant gift 468 | gingerbread girl give given giving glad gladly glance glass glasses gleam glide 469 | glory glove glow glue go going goes goal goat gobble God god godmother gold 470 | golden goldfish golf gone good goods goodbye good-by goodbye good-bye 471 | good-looking goodness goody goose gooseberry got govern government gown grab 472 | gracious grade grain grand grandchild grandchildren granddaughter grandfather 473 | grandma grandmother grandpa grandson grandstand grape grapes grapefruit grass 474 | grasshopper grateful grave gravel graveyard gravy gray graze grease great green 475 | greet grew grind groan grocery ground group grove grow guard guess guest guide 476 | gulf gum gun gunpowder guy ha habit had hadn't hail hair haircut hairpin half 477 | hall halt ham hammer hand handful handkerchief handle handwriting hang happen 478 | happily happiness happy harbor hard hardly hardship hardware hare hark harm 479 | harness harp harvest has hasn't haste hasten hasty hat hatch hatchet hate haul 480 | have haven't having hawk hay hayfield haystack he head headache heal health 481 | healthy heap hear hearing heard heart heat heater heaven heavy he'd heel height 482 | held hell he'll hello helmet help helper helpful hem hen henhouse her hers herd 483 | here here's hero herself he's hey hickory hid hidden hide high highway hill 484 | hillside hilltop hilly him himself hind hint hip hire his hiss history hit 485 | hitch hive ho hoe hog hold holder hole holiday hollow holy home homely homesick 486 | honest honey honeybee honeymoon honk honor hood hoof hook hoop hop hope hopeful 487 | hopeless horn horse horseback horseshoe hose hospital host hot hotel hound hour 488 | house housetop housewife housework how however howl hug huge hum humble hump 489 | hundred hung hunger hungry hunk hunt hunter hurrah hurried hurry hurt husband 490 | hush hut hymn I ice icy I'd idea ideal if ill I'll I'm important impossible 491 | improve in inch inches income indeed Indian indoors ink inn insect inside 492 | instant instead insult intend interested interesting into invite iron is island 493 | isn't it its it's itself I've ivory ivy jacket jacks jail jam January jar jaw 494 | jay jelly jellyfish jerk jig job jockey join joke joking jolly journey joy 495 | joyful joyous judge jug juice juicy July jump June junior junk just keen keep 496 | kept kettle key kick kid kill killed kind kindly kindness king kingdom kiss 497 | kitchen kite kitten kitty knee kneel knew knife knit knives knob knock knot 498 | know known lace lad ladder ladies lady laid lake lamb lame lamp land lane 499 | language lantern lap lard large lash lass last late laugh laundry law lawn 500 | lawyer lay lazy lead leader leaf leak lean leap learn learned least leather 501 | leave leaving led left leg lemon lemonade lend length less lesson let let's 502 | letter letting lettuce level liberty library lice lick lid lie life lift light 503 | lightness lightning like likely liking lily limb lime limp line linen lion lip 504 | list listen lit little live lives lively liver living lizard load loaf loan 505 | loaves lock locomotive log lone lonely lonesome long look lookout loop loose 506 | lord lose loser loss lost lot loud love lovely lover low luck lucky lumber lump 507 | lunch lying ma machine machinery mad made magazine magic maid mail mailbox 508 | mailman major make making male mama mamma man manager mane manger many map 509 | maple marble march March mare mark market marriage married marry mask mast 510 | master mat match matter mattress may May maybe mayor maypole me meadow meal 511 | mean means meant measure meat medicine meet meeting melt member men mend meow 512 | merry mess message met metal mew mice middle midnight might mighty mile milk 513 | milkman mill miler million mind mine miner mint minute mirror mischief miss 514 | Miss misspell mistake misty mitt mitten mix moment Monday money monkey month 515 | moo moon moonlight moose mop more morning morrow moss most mostly mother motor 516 | mount mountain mouse mouth move movie movies moving mow Mr. Mrs. much mud muddy 517 | mug mule multiply murder music must my myself nail name nap napkin narrow nasty 518 | naughty navy near nearby nearly neat neck necktie need needle needn't Negro 519 | neighbor neighborhood neither nerve nest net never nevermore new news newspaper 520 | next nibble nice nickel night nightgown nine nineteen ninety no nobody nod 521 | noise noisy none noon nor north northern nose not note nothing notice November 522 | now nowhere number nurse nut oak oar oatmeal oats obey ocean o'clock October 523 | odd of off offer office officer often oh oil old old-fashioned on once one 524 | onion only onward open or orange orchard order ore organ other otherwise ouch 525 | ought our ours ourselves out outdoors outfit outlaw outline outside outward 526 | oven over overalls overcoat overeat overhead overhear overnight overturn owe 527 | owing owl own owner ox pa pace pack package pad page paid pail pain painful 528 | paint painter painting pair pal palace pale pan pancake pane pansy pants papa 529 | paper parade pardon parent park part partly partner party pass passenger past 530 | paste pasture pat patch path patter pave pavement paw pay payment pea peas 531 | peace peaceful peach peaches peak peanut pear pearl peck peek peel peep peg pen 532 | pencil penny people pepper peppermint perfume perhaps person pet phone piano 533 | pick pickle picnic picture pie piece pig pigeon piggy pile pill pillow pin pine 534 | pineapple pink pint pipe pistol pit pitch pitcher pity place plain plan plane 535 | plant plate platform platter play player playground playhouse playmate 536 | plaything pleasant please pleasure plenty plow plug plum pocket pocketbook poem 537 | point poison poke pole police policeman polish polite pond ponies pony pool 538 | poor pop popcorn popped porch pork possible post postage postman pot potato 539 | potatoes pound pour powder power powerful praise pray prayer prepare present 540 | pretty price prick prince princess print prison prize promise proper protect 541 | proud prove prune public puddle puff pull pump pumpkin punch punish pup pupil 542 | puppy pure purple purse push puss pussy pussycat put putting puzzle quack quart 543 | quarter queen queer question quick quickly quiet quilt quit quite rabbit race 544 | rack radio radish rag rail railroad railway rain rainy rainbow raise raisin 545 | rake ram ran ranch rang rap rapidly rat rate rather rattle raw ray reach read 546 | reader reading ready real really reap rear reason rebuild receive recess record 547 | red redbird redbreast refuse reindeer rejoice remain remember remind remove 548 | rent repair repay repeat report rest return review reward rib ribbon rice rich 549 | rid riddle ride rider riding right rim ring rip ripe rise rising river road 550 | roadside roar roast rob robber robe robin rock rocky rocket rode roll roller 551 | roof room rooster root rope rose rosebud rot rotten rough round route row 552 | rowboat royal rub rubbed rubber rubbish rug rule ruler rumble run rung runner 553 | running rush rust rusty rye sack sad saddle sadness safe safety said sail 554 | sailboat sailor saint salad sale salt same sand sandy sandwich sang sank sap 555 | sash sat satin satisfactory Saturday sausage savage save savings saw say scab 556 | scales scare scarf school schoolboy schoolhouse schoolmaster schoolroom scorch 557 | score scrap scrape scratch scream screen screw scrub sea seal seam search 558 | season seat second secret see seeing seed seek seem seen seesaw select self 559 | selfish sell send sense sent sentence separate September servant serve service 560 | set setting settle settlement seven seventeen seventh seventy several sew shade 561 | shadow shady shake shaker shaking shall shame shan't shape share sharp shave 562 | she she'd she'll she's shear shears shed sheep sheet shelf shell shepherd shine 563 | shining shiny ship shirt shock shoe shoemaker shone shook shoot shop shopping 564 | shore short shot should shoulder shouldn't shout shovel show shower shut shy 565 | sick sickness side sidewalk sideways sigh sight sign silence silent silk sill 566 | silly silver simple sin since sing singer single sink sip sir sis sissy sister 567 | sit sitting six sixteen sixth sixty size skate skater ski skin skip skirt sky 568 | slam slap slate slave sled sleep sleepy sleeve sleigh slept slice slid slide 569 | sling slip slipped slipper slippery slit slow slowly sly smack small smart 570 | smell smile smoke smooth snail snake snap snapping sneeze snow snowy snowball 571 | snowflake snuff snug so soak soap sob socks sod soda sofa soft soil sold 572 | soldier sole some somebody somehow someone something sometime sometimes 573 | somewhere son song soon sore sorrow sorry sort soul sound soup sour south 574 | southern space spade spank sparrow speak speaker spear speech speed spell 575 | spelling spend spent spider spike spill spin spinach spirit spit splash spoil 576 | spoke spook spoon sport spot spread spring springtime sprinkle square squash 577 | squeak squeeze squirrel stable stack stage stair stall stamp stand star stare 578 | start starve state station stay steak steal steam steamboat steamer steel steep 579 | steeple steer stem step stepping stick sticky stiff still stillness sting stir 580 | stitch stock stocking stole stone stood stool stoop stop stopped stopping store 581 | stork stories storm stormy story stove straight strange stranger strap straw 582 | strawberry stream street stretch string strip stripes strong stuck study stuff 583 | stump stung subject such suck sudden suffer sugar suit sum summer sun Sunday 584 | sunflower sung sunk sunlight sunny sunrise sunset sunshine supper suppose sure 585 | surely surface surprise swallow swam swamp swan swat swear sweat sweater sweep 586 | sweet sweetness sweetheart swell swept swift swim swimming swing switch sword 587 | swore table tablecloth tablespoon tablet tack tag tail tailor take taken taking 588 | tale talk talker tall tame tan tank tap tape tar tardy task taste taught tax 589 | tea teach teacher team tear tease teaspoon teeth telephone tell temper ten 590 | tennis tent term terrible test than thank thanks thankful Thanksgiving that 591 | that's the theater thee their them then there these they they'd they'll they're 592 | they've thick thief thimble thin thing think third thirsty thirteen thirty this 593 | thorn those though thought thousand thread three threw throat throne through 594 | throw thrown thumb thunder Thursday thy tick ticket tickle tie tiger tight till 595 | time tin tinkle tiny tip tiptoe tire tired title to toad toadstool toast 596 | tobacco today toe together toilet told tomato tomorrow ton tone tongue tonight 597 | too took tool toot tooth toothbrush toothpick top tore torn toss touch tow 598 | toward towards towel tower town toy trace track trade train tramp trap tray 599 | treasure treat tree trick tricycle tried trim trip trolley trouble truck true 600 | truly trunk trust truth try tub Tuesday tug tulip tumble tune tunnel turkey 601 | turn turtle twelve twenty twice twig twin two ugly umbrella uncle under 602 | understand underwear undress unfair unfinished unfold unfriendly unhappy unhurt 603 | uniform United States unkind unknown unless unpleasant until unwilling up upon 604 | upper upset upside upstairs uptown upward us use used usefulç valentine valley 605 | valuable value vase vegetable velvet very vessel victory view village vine 606 | violet visit visitor voice vote wag wagon waist wait wake waken walk wall 607 | walnut want war warm warn was wash washer washtub wasn't waste watch watchman 608 | water watermelon waterproof wave wax way wayside we weak weakness weaken wealth 609 | weapon wear weary weather weave web we'd wedding Wednesday wee weed week we'll 610 | weep weigh welcome well went were we're west western wet we've whale what 611 | what's wheat wheel when whenever where which while whip whipped whirl whisky 612 | whiskey whisper whistle white who who'd whole who'll whom who's whose why 613 | wicked wide wife wiggle wild wildcat will willing willow win wind windy 614 | windmill window wine wing wink winner winter wipe wire wise wish wit witch with 615 | without woke wolf woman women won wonder wonderful won't wood wooden woodpecker 616 | woods wool woolen word wore work worker workman world worm worn worry worse 617 | worst worth would wouldn't wound wove wrap wrapped wreck wren wring write 618 | writing written wrong wrote wrung yard yarn year yell yellow yes yesterday yet 619 | yolk yonder you you'd you'll young youngster your yours you're yourself 620 | yourselves youth you've 621 | """.lower().split()) 622 | 623 | # 3000 most frequent word tokens in Sonar 500 corpus 624 | basicwords_nl = frozenset(""" 625 | . de , van het een en in dat is op te zijn voor met ik die niet ) ( : " maar er 626 | ' aan - ook je als om ? hij ze bij dan nog was naar uit of door we heeft over 627 | wat al tot worden meer hebben wordt geen wel jaar kan ! dit nu zich zo hun deze 628 | werd moet mijn haar na kunnen zou veel tegen ... 1 had ; twee heb zal daar toch 629 | andere goed eerste wil moeten waar mensen / onder nieuwe gaat gaan 2 dus hem u 630 | ons me ben weer hier alleen toen omdat hoe doen zegt onze alle heel tussen 631 | maken mij grote eens '' zij waren uur komt iets komen staat zoals euro wij 3 632 | drie af * volgens tijd want altijd één zelf wie zonder mee weet man vooral 633 | eigen ja tweede enkele leven zelfs plaats keer zien toe dag alles jaren laten 634 | the 4 men echt werden zullen willen nooit weg 0 % zeker kinderen laatste kon 635 | tijdens net week kwam terug mag .. 5 land krijgen europese staan per werk 636 | zeggen binnen minder even procent aantal steeds laat niets blijft 6 miljoen 637 | beter samen ging blijven werken zo'n elkaar zit verder anders rond nederland 638 | ten hadden gewoon lang artikel vier misschien via geven vandaag zei iedereen \] 639 | eerst moest jij re goede waarom 10 sinds pas geleden weten later hele geld 640 | wereld zouden mogelijk hen iemand vraag brussel groot belgië vrouw doet houden 641 | deel bijna elke vinden echter huis gisteren vaak \[ vanaf nodig maakt kreeg 642 | opnieuw vind allemaal zitten snel vlaamse nemen ter volgende vijf krijgt achter 643 | der maanden dagen minister stad erg uw denk natuurlijk da la politie nee derde 644 | belgische nederlandse weinig amerikaanse terwijl ligt ga zeer a helemaal 645 | geweest vorig hebt den 7 duidelijk kleine 20 commissie regering vrouwen daarom 646 | gemaakt wanneer manier jullie beste spelen enige vindt 8 waarin naam soms 647 | eigenlijk verschillende groep zie begin paar tien lijkt bijvoorbeeld eerder 648 | gedaan graag weken onderzoek gezien geval mogen bent 15 europa oude voorzitter 649 | partij vragen geeft genoeg seizoen enkel landen open vorige bovendien frank 650 | meteen vlaanderen wilde moment welke kans zes politieke antwerpen zondag zaken 651 | club stond raad bedrijf mannen elk 12 brengen buiten ooit beetje grootste hand 652 | naast slechts 9 ziet probleem bekend nieuw titel niemand problemen vader maakte 653 | school 25 zaterdag vrij ander markt dood 11 gent thuis morgen dezelfde moeilijk 654 | denken aldus jonge einde daarna le 't bestaat moeder stellen eind vast jan 655 | blijkt boven kijken zetten water boek vanuit muziek 30 zaak kind ouders deed 656 | zowel 14 wedstrijd ` 18 vond bedrijven ploeg zoveel gemeente meeste afgelopen 657 | soort punten meest kunt maand les quote geworden & extra zodat sociale meter 658 | film gebruik gebruikt doe beide kom liggen franse halen vroeg zag gezegd 659 | president politiek dingen uiteindelijk langs = hoop valt houdt september b 660 | sommige miljard lange best d belang des vlaams familie zeg liet zat hoofd | ge 661 | 13 bezig à helft nationale neemt juni 16 zorgen ervan sterk jongeren auto et 662 | mei stuk daarmee handen januari niks lid kwamen konden druk trouwens ongeveer 663 | start immers frankrijk 17 internationale nieuws recht vele p belangrijk prijs 664 | 2004 oktober bank rol overheid waarop informatie foto burgemeester waarbij ogen 665 | langer vroeger betalen mooi parlement brugge juist echte kant verhaal bepaalde 666 | zichzelf beginnen waarvan volledig verordening inderdaad basis nadat klein hoge 667 | juli zin lopen duitse wist mens zoon economische anderen hetzelfde radio oorlog 668 | werkt toekomst speelt 2005 's gaf horen meestal huidige reden periode stelt 669 | minuten .... acht verwacht totaal gelijk bestaan daarbij 19 vol december succes 670 | god maart 21 daarvoor hoor gehad ruim ni amsterdam begon loopt idee april 671 | begint licht > eten precies kosten bleef slecht hoog duitsland vorm betekent 672 | eeuw financiële vallen rest ver vrijdag zeven woord jou peter kort grond 673 | premier programma bleek wachten genomen 24 spelers 50 22 gegeven terecht 100 674 | gebied ronde verenigde belangrijke zware partijen plaatsen z'n nr. aandacht 675 | november nam waardoor punt rode gelukkig rust dienst nummer plan staten woorden 676 | kijk publiek hoewel rekening dacht gemeenschap situatie zoek unie volgend 677 | voorbije mocht feit zoeken gebeurt intussen new weekend kamer 23 moesten klaar 678 | koning leden doel trekken gebruiken zwaar verkiezingen britse helpen leren + i 679 | belangrijkste vs trainer centrum gekomen gevonden kregen augustus vierde kennen 680 | waarschijnlijk namen dollar mooie volgen dochter «ik waarmee 2003 daarvan 681 | vertelt buitenlandse lijst komende spreken 2000 gevolg tegenover korte proberen 682 | half vrije maandag top won zet gevallen gingen onderwijs straat vlak steun and 683 | winnen daardoor beeld vrienden maatregelen denkt ene bijzonder nederlands 684 | ruimte vormen leggen europees liep geschiedenis finale gevoel inwoners ondanks 685 | volgt niveau 2001 februari praten hard geloof richting strijd leuk buurt cd&v 686 | blz. heer paul gratis antwoord betrokken voorlopig gekregen 2002 wellicht 687 | verloren volk begonnen directeur gebracht vld lol economie speelde project -- 688 | schepen info winst organisatie voetbal werknemers stemmen 40 verschil momenteel 689 | gebeuren brengt wet systeem internet hoger kilometer leuven nacht oud tom alsof 690 | marc viel liever kopen actie woensdag kun betreft ieder sport wonen gehouden 691 | bevolking kerk wegens fc akkoord vraagt straks cijfers lezen orde algemeen 692 | leiden beleid bart normaal uiteraard ma twintig rijden kost hart jongens 693 | producten wagen oog richtlijn l én irak 28 meisje samenwerking blijkbaar kent 694 | hulp erop klanten jongen namelijk macht 26 hoogte nie 27 schrijven graden 695 | genoemd nauwelijks anderlecht verleden boeken waarde heen oplossing 2006 696 | ziekenhuis du eén luc reeks vriend provincie lokale contact controle donderdag 697 | vanavond witte overigens overal avond geboren deur kiezen ondertussen besluit 698 | keuze hield voldoende blij bepaald media sterke zomer zwarte zee geef rechter 699 | liefde lijn bestuur nou team taal beroep tekst resultaat regio to wou 700 | resultaten oostende dinsdag krant termijn voorbeeld indien slag vertrouwen 701 | doelpunten stand kennis s voorstel inmiddels hoeveel wijze 31 geweld vergeten 702 | david voorbij vervolgens dieren mening gezet groter dankzij woning frans voeren 703 | brand foto's bezoek «de m gesteld telkens 60 hé vertellen leeftijd ontwikkeling 704 | ervaring cultuur geldt lag plannen krijg meisjes aandeel gevraagd km kunst 705 | liefst nogal ervoor china leger lidstaten leerlingen haalde kracht bracht 706 | sprake dicht johan dergelijke ne aandelen crisis los stap groen meerderheid 707 | bezoekers kritiek gewonnen parijs actief eindelijk bedoeling halve persoon ken 708 | tevreden legt iedere delen beslissing 29 relatie kop personen gezicht schreef 709 | betere leek israël leider behalve noemen fout mechelen slechte jong geheel 710 | wacht john daarnaast verkocht gevolgen daarin trekt bang negen bieden c ergens 711 | universiteit klasse voorkomen gang jongste maak gegevens lichaam vervangen 712 | lekker opdracht ii stelde omgeving gebeurd neem minstens direct 2007 «we 713 | slachtoffer groei rug lucht brusselse prijzen bekende verkeer personeel raakte 714 | he gegaan gebouw patrick name kaart gij hou onlangs gewone pakken kwaliteit 715 | twaalf wilt heet scholen moeite midden links doden juiste geschreven «het 716 | verkoop kader amerika tafel voelen stem website bal york voorzien regels sector 717 | museum gesloten advies slachtoffers hoeft biedt contract kansen verkopen jouw 718 | openbare k last plus italiaanse band spel wedstrijden rechtbank verband alvast 719 | indruk hoort activiteiten genk federale 80 gezin antwerpse hoogste un italië 720 | bouwen productie politici voorstellen proces mogelijke beslist spanje _ neer 721 | invloed dertig middelen verslag spreekt gespeeld dirk word opgenomen pb 722 | vastgesteld gebeurde omzet geloven zette 70 leiding zoiets klinkt justitie 723 | stonden telt on amper wilden inzake discussie zon for optreden algemene 724 | gemeenten o feiten peeters ministerie veld dans e moord ontstaan gevaar stoppen 725 | speciale match duur dragen belgen veiligheid aanwezig centrale beperkt trok t 726 | daarop 35 tegenwoordig onmiddellijk loop bewoners rusland hoofdstad verliezen 727 | tv veranderen verlies baan keren kwestie buitenland honderd schade vuur rustig 728 | tel. bed londen 00 brief café eenmaal fr. broer diverse jeugd kortrijk voel 729 | bush vaste gesprek bijlage 1999 merk openbaar mevrouw enorm bron maatschappij 730 | samenleving beelden wim werkte spaanse dank vanwege bedrag sp.a voelt reactie 731 | gehoord dient steden ok beschikking pijn aarde wa toepassing stel schrijft 200 732 | gekozen collega's burgers allerlei dorp hangt post erin provinciale positie cel 733 | internationaal eisen geel haalt 90 advocaat koers 1996 enorme persoonlijke 734 | verlaten kwijt zolang absoluut banken beurs gebrek vriendin goeie kabinet 735 | stappen zege nochtans energie verloor sluiten functie binnenkort positief 736 | standard vrijheid afstand plek winkel welk zorgt voormalige volle verdrag 737 | leterme sociaal hans tegelijk studenten dl rotterdam geluk zowat jammer 738 | roeselare mogelijkheden amerikanen moderne tonen bestaande reed noemt televisie 739 | makkelijk debat mis lijken haag gemiddelde carrière site officiële aanleiding 740 | veroordeeld diensten 1995 bereiken reeds eu sneller regelmatig plots eveneens 741 | geraakt westen wk zorg hof technische das leidt grotere initiatief militaire 742 | auto's betaald terrein hopen russische vijftien grens ontvangen woont pour 743 | sommigen rechten omstandigheden bureau voelde groepen vakantie bereid groene 744 | gewerkt val sfeer respect vlamingen bewijzen oh mogelijkheid gouden probeert 745 | verwachten brandweer rij volledige gemiddeld vijfde hotel rekenen bestuurder 746 | overwegende bedoeld geert wint regen perfect verantwoordelijk persoonlijk blijf 747 | voordeel vijftig product moslims dienen wind n bus comité totale opleiding 748 | redenen gesproken une kijkt risico hasselt voet deden dagelijks waarvoor 749 | beweging nadien kwaad dak bereikt voorsprong vonden gericht klassieke officieel 750 | turkije michel gemakkelijk \\ zaal hangen zaten 1998 werking drinken 751 | overwinning michael films mezelf kaarten handel stil rijk noch droog zomaar 752 | voorwaarden meneer schuld se verhalen vakbonden natuur aangezien verplicht 753 | overeenkomst bedraagt steken rapport mond nodige maakten helaas prins zuiden 754 | dossier uren diep erbij eerlijk studie as pak eigenaar slaan hogere klopt wegen 755 | genieten bergen tour charleroi betreffende bloed uitgevoerd 756 | verantwoordelijkheid jaarlijks thomas kampioen overleden sprak 2008 rechts 757 | vaker leveren coach sturen job overleg station keek you allen parket waaronder 758 | centraal deelnemers gestolen pieter reis nederlanders uitspraak alweer waard 759 | boodschap zwart verklaring engeland speler duizenden toegang tijden eg publieke 760 | gedacht opgepakt h f verboden geregeld bewust lacht angst eraan geplaatst sorry 761 | park que elf bouw zulke cd begrijpen gek ware gele bedankt vereniging voordat 762 | probeerde schrijver gevangenis islam koop hoopt positieve huizen laag waregem 763 | competitie kleur guy wijn versie slapen verdwenen karakter honderden overtuigd 764 | ah harde speciaal onmogelijk bos praktijk 45 albert zoekt waarheid zagen 765 | belgisch zogenaamde di gehaald tientallen noorden 1994 gisteravond koen 766 | afdeling boete lager gewond hoorde chinese rood boom aanpak 75 daarover dokter 767 | nergens beneden directie gevolgd woningen 32 ongeval wees tuin gedurende ding 768 | merken brussels stukken gebouwd rechtstreeks doelman degelijk gentse zekerheid 769 | gedrag democratie toont vooruit 500 x veilig huwelijk passen mijnheer 770 | tentoonstelling aalst lachen wakker wijzen warm baas soorten hond leeft m'n 771 | gewijzigd daders karel vóór ermee onderzoeken qui bert wallonië bezit campagne 772 | klant verdwijnen keuken doordat velen tijdje partner steven welkom ziekte 773 | bijzondere principe raken robert sk effect lichte concurrentie besloten 774 | reageren grenzen groetjes neen medewerkers materiaal ontslag engels turkse 775 | levert model gebieden ofwel lage afgesloten poging ouder hoek serieus 776 | historische voortaan bekijken vreemd vergelijking volgde kern starten veranderd 777 | onderhandelingen herman draait probeer muur jezelf restaurant agenten ogenblik 778 | noodzakelijk fiets gebouwen stijl au vrede aanvankelijk ziek taak vlucht kust 779 | aanbod kim verkeerd engelse duizend verdienen beurt vroegere vertelde 33 eiland 780 | kevin wijst sta begrip past roman onderwerp fortis kandidaten feest flink legde 781 | mate collega soldaten betrekking voeten ondernemingen opgericht moeilijke 782 | oorzaak wijk vlees hè 'n bescherming geest straf woordvoerder japan trein 783 | meerdere verschillen tenminste est traditionele draaien behandeling 1997 zover 784 | combinatie organiseren smaak ie beiden wereldoorlog computer milieu forum vormt 785 | wél gelegen vertrekken recente type limburg oudere wit lief plezier voortdurend 786 | ton manager zestig voort spoor lieten eur verbonden polen avonds bef projecten 787 | tevens j. zorgde inhoud elders reacties il gemeenteraad kende tachtig janssens 788 | uitgebreid vrijwel winnaar bewijs lees vzw veertig neus middel opvallend banen 789 | eeg baby iran instellingen gelegenheid onderneming leuke gerecht vanmorgen 790 | dikke generatie yves festival begrijp werkelijkheid toestand afrika bedoelde 791 | luik nationaal betaalt selectie financieel vielen el eric winter oudste 792 | economisch zelden afkomstig besloot evenwel commerciële reageert bevat c8 blok 793 | sluit franstalige spijt thuisploeg bedoel aanval slot ploegen kv duren mark 794 | dieven leidde vertrek ministers vandaar dichter aanslag organiseert verdere 795 | spits begroting sterker luisteren ideeën verhofstadt podium klacht veroorzaakt 796 | maria waalse plaatselijke acties n-va doelpunt israëlische willem blijken 797 | behoorlijk beschikbaar georganiseerd telefoon mochten wapens par gebaseerd live 798 | twijfel 65 eruit middag bleven 150 olympische operatie 300 oppervlakte 799 | organisaties tegenstelling it anderzijds duurt goe beschouwd drugs deuren pers 800 | oppositie afscheid binnenlandse thema 34 jezus definitief bepalingen serie 801 | louis snelheid relatief bepalen verkeerde blik ongetwijfeld winkels culturele 802 | papier joden afhankelijk olie minuut snelle kandidaat utrecht stof eer 803 | weliswaar eventueel ernstig 36 interessant oosten mama lot 99 hoeven groeien 804 | achteraf gelezen international bod plaatse afghanistan vergadering redactie 805 | prima vervoer procedure bellen helpt allez zo. b. 1992 praat 1993 sloeg belg 806 | zodra redden m. oké min onderdeel uitleg netwerk scoorde lukt willy ontdekt 807 | hoofdpunten trots tenslotte lokeren groot-brittannië uitbreiding droom p. arm 808 | fase clubs erger training filip komst tc gesprekken 46 eentje specifieke 809 | medische oprichting set behoort aanslagen houding armen missen topic studio 810 | betekenis jaarlijkse vliegen behouden mooiste getroffen berichten waarden 811 | stijging militairen programma's bijdrage stijn financiën vb visie 812 | belangstelling glas hopelijk seconden verzoek gerust sindsdien koningin vis 813 | eenvoudig haal vermijden andré meent standaard gelegd dreigt talent destijds 814 | bomen koffie da's gekocht ps draagt bestond 1991 gevaarlijk philippe d. 815 | commentaar roepen 1990 patiënten vliegtuig verjaardag gasten aanwezigheid zak 816 | chris

fouten ineens fijn gezondheid theater zult 02 inzet instituut 817 | palestijnse teken werkelijk brug wisten gezond troepen uitvoering luchthaven 818 | gemeenschappen auteur reizen dames rock george verzet vrees democratische 819 | kranten gezinnen bericht kleuren vermoord koninklijke defensie benen menselijke 820 | vreemde 55 turnhout joodse allebei redelijk a. editie kindje haast kiest stukje 821 | pierre eddy jos gebleven partners jarenlang investeringen zus gelet datum 822 | standpunt vermoedelijk waarna < motor sur voorstelling vergeet maxima 823 | commissaris professor beschikken zeventig japanse minste martin erik vooraf 824 | literatuur voorkeur kwart euh schip technisch roept voorgesteld show scoren 825 | india sporen slagen tekort prachtige individuele 01 regionale gezocht inkomsten 826 | voornamelijk 38 compleet negatieve nederlaag sven lagere beveren boonen wens 827 | vermogen v. conflict goedgekeurd dubbele geslaagd 98 teksten hallo stichting 828 | toevallig goud negentig pagina tegenstander antwoorden koninkrijk 37 traditie 829 | roger mist behoren stijgen stadsbestuur letterlijk mekaar kleinere vrt westerse 830 | natuurlijke interview straten toon gsm kris goederen zekere geleid belastingen 831 | g beleggers vanmiddag haven rijdt scheidsrechter overeenkomstig streek speelden 832 | wetenschap hiervoor klachten industrie zone uitzondering richten arbeiders 833 | pakte zesde burger slaat inkomen ervaren ontwikkelen prachtig tegelijkertijd 834 | eventuele verklaarde washington tijdelijk link rand zingen bel seks kleren 835 | hiermee communautaire republiek agenda hugo onafhankelijk voert verdeeld wagens 836 | digitale momenten leiders gemeentebestuur gedachten externe heilige vannacht 837 | rome aangeboden gewezen lierse regeling waaraan an 42 hemel geheim islamitische 838 | planten ontslagen noemde tja beschermen aangepast gestuurd instelling raakt 839 | verscheen verdient concert oranje vrouwelijke spa kwartaal absolute feite stop 840 | ruzie verschenen fans verschijnen buren 250 onvoldoende geschorst fietsen 841 | duidelijke 97 voldoen idd qua interne jean ambtenaren been steunen wereldwijd 842 | supporters beslissen gewest ek verbeteren verdachte renners steeg tienen 843 | voorbereiding verandering zicht treden dromen madrid reclame interesse nood 844 | dader sterven oostenrijk aanzien world conclusie normale omhoog sloot 845 | lid-staten behoefte ontstond papa leverde management consument blauwe 846 | uitsluitend omroep heren rit ingediend durven landbouw overname langzaam beker 847 | simpel paus diens uiterlijk verteld bier evolutie begrepen brede verliest 848 | walter kantoor beschikt nummers test kamp my league geleerd 400 jacques 849 | afspraken maximaal gaven pensioen koos dringend aangehouden autoriteiten tal 850 | ernstige achtergrond dr. luister wetgeving dure dier volop 44 allochtonen 851 | hoeveelheid instantie es opgesteld daarentegen piet tenzij geluid behandeld 852 | bewezen menen contacten steve verdediging favoriete y geraken maat boeren 853 | ongeluk gelooft uitvoeren geopend stoffen afloop miljoenen schoenen c. riep 854 | anderhalf moeilijker journalisten beslag lieve adres fonds maatschappelijke 855 | gedeelte analyse meester klas tony wetenschappelijke regisseur boot katholieke 856 | c6 markten dendermonde gemeenschappelijke gast vn mede san bezoeken arts out 857 | gebruikte belangen afspraak nachts alsnog liepen investeren gelden categorie 858 | hierbij getuigen elementen blad vlot bond ramp treedt trap ring normen teveel 859 | prestatie tim bloemen verandert mol grotendeels voedsel bijdragen 85 opvolger 860 | overige gevoelens gebeurtenissen zwanger uitspraken kunstenaar zulte eindigde 861 | logisch aard verdedigen omwille berlijn communicatie waarover usd moe gestegen 862 | ontwikkeld wensen g. strategie alternatief vogels vaststelling 39 stilaan 863 | chauffeur geprobeerd zetels 43 slaap evenwicht raakten gezelschap geweldig 864 | album dubbel lagen wezen huid erover kunstenaars voormalig leest opnemen banden 865 | cercle fiscale aanleg dik deelnemen wolken verdacht united voertuig rijke u. 866 | onbekende 1000 record kristof onderzocht opklaringen warme structuur ideale 867 | ochtend veertien 48 bekeken stuur voorwaarde integratie sneeuw groeit tellen 868 | openen vertrokken oorsprong aanmerking creëren studies be v pvda km² ajax gat 869 | populair nederlander ingezet 1989 portugal belasting negatief uiterst grondwet 870 | beheer moskou vloer roken artsen bevindt stevig prestaties lijden onderzoekers 871 | stadion gedragen evenmin schuldig brood ach bijkomende formule tekenen verre 872 | luidt iii voren budget s. voorbeelden overzicht hierdoor lastig techniek vos 873 | vrachtwagen oudenaarde technologie duitsers enig gaten gelijke zwitserland 874 | koppel berg ce trouw loon collectie werkgevers koud leeg eh guido opening 875 | beperkte voorzichtig vermeld gepland fabriek rente richard toekomstige schoot 876 | eet stopt bob aandeelhouders schrik controleren christelijke toeristen city 877 | risico's 20.00 james kilo gevoerd breed geschikt vluchten oorspronkelijke 878 | sint-niklaas kapitaal kanten greep werkloosheid maal oren minst 41 schorsing 879 | rolleyes belangrijker smet inspanningen historisch pakt real getrokken 880 | kruispunt vorst that zweden trek love st. las beperken verhouding verwachtingen 881 | bestuurders liter toonde evenveel opzichte firma danny arabische verklaard 882 | breken france westerlo achterstand hoi leert raar uitslag € afrikaanse vandaan 883 | journalist klagen geslagen charles kwartier maes zakken schoon onafhankelijke 884 | liedje gewicht realiteit socialistische werkgever meldt zen stevige stemming 885 | bedragen terugkeer aa barcelona boos regel details kleiner tmf klap tis acteur 886 | passagiers aardig spanning gedachte big verscheidene vechten finales schat 887 | fransen concrete rik oproep goedkoper verenigd onzer slotte protest jo bruno 888 | uitstekend integendeel schieten imago onderdelen theorie gedwongen franstaligen 889 | locatie 20.30 overleed cda tegenstanders zevende zwakke concept martens 890 | overtuigen bronnen constant populaire boord jeroen pink fantastisch ingang 891 | linkse college amsterdamse belga religieuze opent onafhankelijkheid vieren 892 | toerisme no haat politicus 2009 congo luxemburg meegemaakt iraakse golf aankoop 893 | gooien kasteel tips coalitie mss betekenen revolutie overeenstemming redacteur 894 | bibliotheek saddam verklaart maatregel champions marcel kiezers dode «in 52 895 | brak vtm zaventem zijde overgenomen reageerde arme super hetgeen paard naartoe 896 | juridische naties zestien opmerkelijk dagelijkse vroege geweten melk vvd stilte 897 | hielden identiteit aangenomen 2010 getrouwd dertien leer pleit portefeuille dom 898 | respectievelijk duo diezelfde makkelijker stak rob broers strand vergelijken 899 | daartoe griekse staatssecretaris lijf kosovo cheer broek hout stijgt toezicht 900 | dossiers fors voordelen e-mail zichtbaar regime @ sowieso jury papieren koude 901 | melden ontwerp verkozen h. toeval dikwijls doorgaans namens verrassing 902 | bevestigd marokkaanse applaus beloften cup geheime vluchtelingen toegepast 903 | leeuw verschijnt schaal australië geïnteresseerd effectief danken armoede von 904 | scherp gewonden wetten voorts automatisch massaal vrezen bord stroom houten 905 | jongere zanger inclusief alcohol uitgesproken ruime cm geconfronteerd stelling 906 | fusie geslacht verlopen pakistan plant zuid-afrika vooruitgang verhogen knie 907 | aparte gepleegd 908 | """.split()) 909 | 910 | # 1000 MFW German; http://www.wortschatz.uni-leipzig.de/Papers/top1000de.txt 911 | basicwords_de = frozenset(""" 912 | der die und in den von zu das mit sich des auf für ist im dem nicht ein Die 913 | eine als auch es an werden aus er hat daß sie nach wird bei einer Der um am 914 | sind noch wie einem über einen Das so Sie zum war haben nur oder aber vor zur 915 | bis mehr durch man sein wurde sei In Prozent hatte kann gegen vom können schon 916 | wenn habe seine Mark ihre dann unter wir soll ich eines Es Jahr zwei Jahren 917 | diese dieser wieder keine Uhr seiner worden Und will zwischen Im immer 918 | Millionen Ein was sagte Er gibt alle DM diesem seit muß wurden beim doch jetzt 919 | waren drei Jahre Mit neue neuen damit bereits da Auch ihr seinen müssen ab 920 | ihrer Nach ohne sondern selbst ersten nun etwa Bei heute ihren weil ihm seien 921 | Menschen Deutschland anderen werde Ich sagt Wir Eine rund Für Aber ihn Ende 922 | jedoch Zeit sollen ins Wenn So seinem uns Stadt geht Doch sehr hier ganz erst 923 | wollen Berlin vor allem sowie hatten kein deutschen machen lassen Als 924 | Unternehmen andere ob dieses steht dabei wegen weiter denn beiden einmal etwas 925 | Wie nichts allerdings vier gut viele wo viel dort alles Auf wäre SPD kommt 926 | vergangenen denen fast fünf könnte nicht nur hätten Frau Am dafür kommen diesen 927 | letzten zwar Diese großen dazu Von Mann Da sollte würde also bisher Leben 928 | Milliarden Welt Regierung konnte ihrem Frauen während Land zehn würden stehen 929 | ja USA heißt dies zurück Kinder dessen ihnen deren sogar Frage gewesen erste 930 | gab liegt gar davon gestern geben Teil Polizei dass hätte eigenen kaum sieht 931 | große Denn weitere Was sehen macht Angaben weniger gerade läßt Geld München 932 | deutsche allen darauf wohl später könne deshalb aller kam Arbeit mich gegenüber 933 | nächsten bleibt wenig lange gemacht Wer Dies Fall mir gehen Berliner mal Weg 934 | CDU wollte sechs keinen Woche dagegen alten möglich gilt erklärte müsse Dabei 935 | könnten Geschichte zusammen finden Tag Art erhalten Man Dollar Wochen jeder nie 936 | bleiben besonders Jahres Deutschen Den Zu zunächst derzeit allein deutlich 937 | Entwicklung weiß einige sollten Präsident geworden statt Bonn Platz inzwischen 938 | Nur Freitag Um pro seines Damit Montag Europa schließlich Sonntag einfach 939 | gehört eher oft Zahl neben hält weit Partei meisten Thema zeigt Politik Aus 940 | zweiten Januar insgesamt je mußte Anfang hinter ebenfalls ging Mitarbeiter 941 | darüber vielen Ziel darf Seite fest hin erklärt Namen Haus An Frankfurt 942 | Gesellschaft Mittwoch damals Dienstag Hilfe Mai Markt Seit Tage Donnerstag 943 | halten gleich nehmen solche Entscheidung besser alte Leute Ergebnis Samstag Daß 944 | sagen System März tun Monaten kleinen lang Nicht knapp bringen wissen Kosten 945 | Erfolg bekannt findet daran künftig wer acht Grünen schnell Grund scheint 946 | Zukunft Stuttgart bin liegen politischen Gruppe Rolle stellt Juni sieben 947 | September nämlich Männer Oktober Mrd überhaupt eigene Dann gegeben Außerdem 948 | Stunden eigentlich Meter ließ Probleme vielleicht ebenso Bereich zum Beispiel 949 | Bis Höhe Familie Während Bild Ländern Informationen Frankreich Tagen schwer 950 | zuvor Vor genau April stellen neu erwartet Hamburg sicher führen Mal Über 951 | mehrere Wirtschaft Mio Programm offenbar Hier weiteren natürlich konnten stark 952 | Dezember Juli ganze kommenden Kunden bekommen eben kleine trotz wirklich Lage 953 | Länder leicht gekommen Spiel laut November kurz politische führt innerhalb 954 | unsere meint immer wieder Form Münchner AG anders ihres völlig beispielsweise 955 | gute bislang August Hand jede GmbH Film Minuten erreicht beide Musik Kritik 956 | Mitte Verfügung Buch dürfen Unter jeweils einigen Zum Umsatz spielen Daten 957 | welche müßten hieß paar nachdem Kunst Euro gebracht Problem Noch jeden Ihre 958 | Sprecher recht erneut längst europäischen Sein Eltern Beginn besteht Seine 959 | mindestens machte Jetzt bietet außerdem Bürger Trainer bald Deutsche Schon 960 | Fragen klar Durch Seiten gehören Dort erstmals Februar zeigen Titel Stück 961 | größten FDP setzt Wert Frankfurter Staat möchte daher wolle Bundesregierung 962 | lediglich Nacht Krieg Opfer Tod nimmt Firma zuletzt Werk hohen leben unter 963 | anderem Dieser Kirche weiterhin gebe gestellt Mitglieder Rahmen zweite Paris 964 | Situation gefunden Wochenende internationalen Wasser Recht sonst stand Hälfte 965 | Möglichkeit versucht blieb junge Mehrheit Straße Sache arbeiten Monate Mutter 966 | berichtet letzte Gericht wollten Ihr zwölf zumindest Wahl genug Weise Vater 967 | Bericht amerikanischen hoch beginnt Wort obwohl Kopf spielt Interesse Westen 968 | verloren Preis Erst jedem erreichen setzen spricht früher teilte Landes zudem 969 | einzelnen bereit Blick Druck Bayern Kilometer gemeinsam Bedeutung Chance 970 | Politiker Dazu Zwei besten Ansicht endlich Stelle direkt Beim Bevölkerung Viele 971 | solchen Alle solle jungen Einsatz richtig größte sofort neuer ehemaligen 972 | unserer dürfte schaffen Augen Rußland Internet Allerdings Raum Mannschaft neun 973 | kamen Ausstellung Zeiten Dem einzige meine Nun Verfahren Angebot Richtung 974 | Projekt niemand Kampf weder tatsächlich Personen dpa Heute geführt Gespräch 975 | Kreis Hamburger Schule guten Hauptstadt durchaus Zusammenarbeit darin Amt 976 | Schritt meist groß zufolge Sprache Region Punkte Vergleich genommen gleichen du 977 | Ob Soldaten Universität verschiedenen Kollegen neues Bürgermeister Angst 978 | stellte Sommer danach anderer gesagt Sicherheit Macht Bau handelt Folge Bilder 979 | lag Osten Handel sprach Aufgabe Chef frei dennoch DDR hohe Firmen bzw Koalition 980 | Mädchen Zur entwickelt fand Diskussion bringt Deshalb Hause Gefahr per zugleich 981 | früheren dadurch ganzen abend erzählt Streit Vergangenheit Parteien 982 | Verhandlungen jedenfalls gesehen französischen Trotz darunter Spieler forderte 983 | Beispiel Meinung wenigen Publikum sowohl meinte mag Auto Lösung Boden Einen 984 | Präsidenten hinaus Zwar verletzt weltweit Sohn bevor Peter mußten keiner 985 | Produktion Ort braucht Zusammenhang Kind Verein sprechen Aktien gleichzeitig 986 | London sogenannten Richter geplant Italien Mittel her freilich Mensch großer 987 | Bonner wenige öffentlichen Unterstützung dritten nahm Bundesrepublik 988 | Arbeitsplätze bedeutet Feld Dr. Bank oben gesetzt Ausland Ministerpräsident 989 | Vertreter z.B. jedes ziehen Parlament berichtete Dieses China aufgrund Stellen 990 | warum Kindern heraus heutigen Anteil Herr Öffentlichkeit Abend Selbst Liebe 991 | Neben rechnen fällt New York Industrie WELT Stuttgarter wären Vorjahr Sicht 992 | Idee Banken verlassen Leiter Bühne insbesondere offen stets Theater ändern 993 | entschieden Staaten Experten Gesetz Geschäft Tochter angesichts gelten Mehr 994 | erwarten läuft fordert Japan Sieg Ist Stimmen wählen russischen gewinnen CSU 995 | bieten Nähe jährlich Bremen Schüler Rede Funktion Zuschauer hingegen anderes 996 | Führung Besucher Drittel Moskau immerhin Vorsitzende Urteil Schließlich Kultur 997 | betonte mittlerweile Saison Konzept suchen Zahlen Roman Gewalt Köln gesamte 998 | indem EU Stunde ehemalige Auftrag entscheiden genannt tragen Börse langen 999 | häufig Chancen Vor allem Position alt Luft Studenten übernehmen stärker ohnehin 1000 | zeigte geplanten Reihe darum verhindern begann Medien verkauft Minister wichtig 1001 | amerikanische sah gesamten einst verwendet vorbei Behörden helfen Folgen 1002 | bezeichnet 1003 | """.lower().split()) 1004 | 1005 | LANGDATA = dict( 1006 | en=dict( 1007 | syllables=countsyllables_en, 1008 | words=words_en, 1009 | beginnings=beginnings_en, 1010 | basicwords=basicwords_en), 1011 | nl=dict( 1012 | syllables=countsyllables_nlde, 1013 | words=words_nl, 1014 | beginnings=beginnings_nl, 1015 | basicwords=basicwords_nl), 1016 | de=dict( 1017 | syllables=countsyllables_nlde, 1018 | words=words_de, 1019 | beginnings=beginnings_de, 1020 | basicwords=basicwords_de), 1021 | ) 1022 | --------------------------------------------------------------------------------