diff --git a/.appveyor.yml b/.appveyor.yml index 4dd7b0a31..a379cdd31 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1 +1,55 @@ +environment: + + matrix: + + # For Python versions available on Appveyor, see + # http://www.appveyor.com/docs/installed-software#python + # The list here is complete (excluding Python 2.6, which + # isn't covered by this document) at the time of writing. + + - PYTHON: "C:\\Python27" + #- PYTHON: "C:\\Python33" + #- PYTHON: "C:\\Python34" + #- PYTHON: "C:\\Python35" + #- PYTHON: "C:\\Python27-x64" + #- PYTHON: "C:\\Python33-x64" + #- DISTUTILS_USE_SDK: "1" + #- PYTHON: "C:\\Python34-x64" + #- DISTUTILS_USE_SDK: "1" + #- PYTHON: "C:\\Python35-x64" + - PYTHON: "C:\\Python36-x64" + +install: + # We need wheel installed to build wheels + - "%PYTHON%\\python.exe -m pip install wheel" + - "%PYTHON%\\python.exe -m pip install cython" + - "%PYTHON%\\python.exe -m pip install -r requirements.txt" + - "%PYTHON%\\python.exe -m pip install -e ." + build: off + +test_script: + # Put your test command here. + # If you don't need to build C extensions on 64-bit Python 3.3 or 3.4, + # you can remove "build.cmd" from the front of the command, as it's + # only needed to support those cases. + # Note that you must use the environment variable %PYTHON% to refer to + # the interpreter you're using - Appveyor does not do anything special + # to put the Python version you want to use on PATH. + - "%PYTHON%\\python.exe -m pytest spacy/" + +after_test: + # This step builds your wheels. + # Again, you only need build.cmd if you're building C extensions for + # 64-bit Python 3.3/3.4. And you need to use %PYTHON% to get the correct + # interpreter + - "%PYTHON%\\python.exe setup.py bdist_wheel" + +artifacts: + # bdist_wheel puts your built wheel in the dist directory + - path: dist\* + +#on_success: +# You can use this step to upload your artifacts to a public website. +# See Appveyor's documentation for more details. Or you can simply +# access your wheels from the Appveyor "artifacts" tab for your build. diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml new file mode 100644 index 000000000..9b94e3752 --- /dev/null +++ b/.buildkite/sdist.yml @@ -0,0 +1,11 @@ +steps: + - + command: "fab env clean make test sdist" + label: ":dizzy: :python:" + artifact_paths: "dist/*.tar.gz" + - wait + - trigger: "spacy-sdist-against-models" + label: ":dizzy: :hammer:" + build: + env: + SPACY_VERSION: "{$SPACY_VERSION}" diff --git a/.gitignore b/.gitignore index 52838918c..14097dfcd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,12 @@ # spaCy spacy/data/ corpora/ -models/ +/models/ keys/ # Website website/www/ website/_deploy.sh -website/package.json -website/announcement.jade website/.gitignore # Cython / C extensions @@ -40,7 +38,6 @@ venv/ # Distribution / packaging env/ -bin/ build/ develop-eggs/ dist/ diff --git a/.travis.yml b/.travis.yml index a1f7044b0..b87ffbd06 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,7 @@ os: env: - VIA=compile LC_ALL=en_US.ascii - VIA=compile - -# - VIA=sdist + #- VIA=pypi_nightly install: - "./travis.sh" @@ -23,7 +22,7 @@ install: script: - "pip install pytest pytest-timeout" - if [[ "${VIA}" == "compile" ]]; then python -m pytest --tb=native spacy; fi - - if [[ "${VIA}" == "pypi" ]]; then python -m pytest --tb=native `python -c "import os.path; import spacy; print(os.path.abspath(ospath.dirname(spacy.__file__)))"`; fi + - if [[ "${VIA}" == "pypi_nightly" ]]; then python -m pytest --tb=native --models --en `python -c "import os.path; import spacy; print(os.path.abspath(os.path.dirname(spacy.__file__)))"`; fi - if [[ "${VIA}" == "sdist" ]]; then python -m pytest --tb=native `python -c "import os.path; import spacy; print(os.path.abspath(os.path.dirname(spacy.__file__)))"`; fi notifications: diff --git a/MANIFEST.in b/MANIFEST.in index 697748835..4d804a23e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ recursive-include include *.h include LICENSE include README.rst +include bin/spacy diff --git a/README.rst b/README.rst index e5e2dcc77..244308473 100644 --- a/README.rst +++ b/README.rst @@ -229,7 +229,7 @@ Compile from source The other way to install spaCy is to clone its `GitHub repository `_ and build it from source. That is the common way if you want to make changes to the code base. -You'll need to make sure that you have a development enviroment consisting of a +You'll need to make sure that you have a development environment consisting of a Python distribution including header files, a compiler, `pip `__, `virtualenv `_ and `git `_ installed. The compiler part is the trickiest. diff --git a/bin/spacy b/bin/spacy new file mode 100644 index 000000000..29d9a80e5 --- /dev/null +++ b/bin/spacy @@ -0,0 +1 @@ +python -m spacy "$@" diff --git a/examples/chainer_sentiment.py b/examples/chainer_sentiment.py deleted file mode 100644 index 747ef508a..000000000 --- a/examples/chainer_sentiment.py +++ /dev/null @@ -1,322 +0,0 @@ -'''WIP --- Doesn't work well yet''' -import plac -import random -import six - -import cProfile -import pstats - -import pathlib -import cPickle as pickle -from itertools import izip - -import spacy - -import cytoolz -import cupy as xp -import cupy.cuda -import chainer.cuda - -import chainer.links as L -import chainer.functions as F -from chainer import Chain, Variable, report -import chainer.training -import chainer.optimizers -from chainer.training import extensions -from chainer.iterators import SerialIterator -from chainer.datasets import TupleDataset - - -class SentimentAnalyser(object): - @classmethod - def load(cls, path, nlp, max_length=100): - raise NotImplementedError - #with (path / 'config.json').open() as file_: - # model = model_from_json(file_.read()) - #with (path / 'model').open('rb') as file_: - # lstm_weights = pickle.load(file_) - #embeddings = get_embeddings(nlp.vocab) - #model.set_weights([embeddings] + lstm_weights) - #return cls(model, max_length=max_length) - - def __init__(self, model, max_length=100): - self._model = model - self.max_length = max_length - - def __call__(self, doc): - X = get_features([doc], self.max_length) - y = self._model.predict(X) - self.set_sentiment(doc, y) - - def pipe(self, docs, batch_size=1000, n_threads=2): - for minibatch in cytoolz.partition_all(batch_size, docs): - minibatch = list(minibatch) - sentences = [] - for doc in minibatch: - sentences.extend(doc.sents) - Xs = get_features(sentences, self.max_length) - ys = self._model.predict(Xs) - for sent, label in zip(sentences, ys): - sent.doc.sentiment += label - 0.5 - for doc in minibatch: - yield doc - - def set_sentiment(self, doc, y): - doc.sentiment = float(y[0]) - # Sentiment has a native slot for a single float. - # For arbitrary data storage, there's: - # doc.user_data['my_data'] = y - - -class Classifier(Chain): - def __init__(self, predictor): - super(Classifier, self).__init__(predictor=predictor) - - def __call__(self, x, t): - y = self.predictor(x) - loss = F.softmax_cross_entropy(y, t) - accuracy = F.accuracy(y, t) - report({'loss': loss, 'accuracy': accuracy}, self) - return loss - - -class SentimentModel(Chain): - def __init__(self, nlp, shape, **settings): - Chain.__init__(self, - embed=_Embed(shape['nr_vector'], shape['nr_dim'], shape['nr_hidden'], - set_vectors=lambda arr: set_vectors(arr, nlp.vocab)), - encode=_Encode(shape['nr_hidden'], shape['nr_hidden']), - attend=_Attend(shape['nr_hidden'], shape['nr_hidden']), - predict=_Predict(shape['nr_hidden'], shape['nr_class'])) - self.to_gpu(0) - - def __call__(self, sentence): - return self.predict( - self.attend( - self.encode( - self.embed(sentence)))) - - -class _Embed(Chain): - def __init__(self, nr_vector, nr_dim, nr_out, set_vectors=None): - Chain.__init__(self, - embed=L.EmbedID(nr_vector, nr_dim, initialW=set_vectors), - project=L.Linear(None, nr_out, nobias=True)) - self.embed.W.volatile = False - - def __call__(self, sentence): - return [self.project(self.embed(ts)) for ts in F.transpose(sentence)] - - -class _Encode(Chain): - def __init__(self, nr_in, nr_out): - Chain.__init__(self, - fwd=L.LSTM(nr_in, nr_out), - bwd=L.LSTM(nr_in, nr_out), - mix=L.Bilinear(nr_out, nr_out, nr_out)) - - def __call__(self, sentence): - self.fwd.reset_state() - fwds = map(self.fwd, sentence) - self.bwd.reset_state() - bwds = reversed(map(self.bwd, reversed(sentence))) - return [F.elu(self.mix(f, b)) for f, b in zip(fwds, bwds)] - - -class _Attend(Chain): - def __init__(self, nr_in, nr_out): - Chain.__init__(self) - - def __call__(self, sentence): - sent = sum(sentence) - return sent - - -class _Predict(Chain): - def __init__(self, nr_in, nr_out): - Chain.__init__(self, - l1=L.Linear(nr_in, nr_in), - l2=L.Linear(nr_in, nr_out)) - - def __call__(self, vector): - vector = self.l1(vector) - vector = F.elu(vector) - vector = self.l2(vector) - return vector - - -class SentenceDataset(TupleDataset): - def __init__(self, nlp, texts, labels, max_length): - self.max_length = max_length - sents, labels = self._get_labelled_sentences( - nlp.pipe(texts, batch_size=5000, n_threads=3), - labels) - TupleDataset.__init__(self, - get_features(sents, max_length), - labels) - - def __getitem__(self, index): - batches = [dataset[index] for dataset in self._datasets] - if isinstance(index, slice): - length = len(batches[0]) - returns = [tuple([batch[i] for batch in batches]) - for i in six.moves.range(length)] - return returns - else: - return tuple(batches) - - def _get_labelled_sentences(self, docs, doc_labels): - labels = [] - sentences = [] - for doc, y in izip(docs, doc_labels): - for sent in doc.sents: - sentences.append(sent) - labels.append(y) - return sentences, xp.asarray(labels, dtype='i') - - -class DocDataset(TupleDataset): - def __init__(self, nlp, texts, labels): - self.max_length = max_length - DatasetMixin.__init__(self, - get_features( - nlp.pipe(texts, batch_size=5000, n_threads=3), self.max_length), - labels) - -def read_data(data_dir, limit=0): - examples = [] - for subdir, label in (('pos', 1), ('neg', 0)): - for filename in (data_dir / subdir).iterdir(): - with filename.open() as file_: - text = file_.read() - examples.append((text, label)) - random.shuffle(examples) - if limit >= 1: - examples = examples[:limit] - return zip(*examples) # Unzips into two lists - - -def get_features(docs, max_length): - docs = list(docs) - Xs = xp.zeros((len(docs), max_length), dtype='i') - for i, doc in enumerate(docs): - j = 0 - for token in doc: - if token.has_vector and not token.is_punct and not token.is_space: - Xs[i, j] = token.norm - j += 1 - if j >= max_length: - break - return Xs - - -def set_vectors(vectors, vocab): - for lex in vocab: - if lex.has_vector and (lex.rank+1) < vectors.shape[0]: - lex.norm = lex.rank+1 - vectors[lex.rank + 1] = lex.vector - else: - lex.norm = 0 - return vectors - - -def train(train_texts, train_labels, dev_texts, dev_labels, - lstm_shape, lstm_settings, lstm_optimizer, batch_size=100, nb_epoch=5, - by_sentence=True): - nlp = spacy.load('en', entity=False) - if 'nr_vector' not in lstm_shape: - lstm_shape['nr_vector'] = max(lex.rank+1 for lex in nlp.vocab if lex.has_vector) - if 'nr_dim' not in lstm_shape: - lstm_shape['nr_dim'] = nlp.vocab.vectors_length - print("Make model") - model = Classifier(SentimentModel(nlp, lstm_shape, **lstm_settings)) - print("Parsing texts...") - if by_sentence: - train_data = SentenceDataset(nlp, train_texts, train_labels, lstm_shape['max_length']) - dev_data = SentenceDataset(nlp, dev_texts, dev_labels, lstm_shape['max_length']) - else: - train_data = DocDataset(nlp, train_texts, train_labels) - dev_data = DocDataset(nlp, dev_texts, dev_labels) - train_iter = SerialIterator(train_data, batch_size=batch_size, - shuffle=True, repeat=True) - dev_iter = SerialIterator(dev_data, batch_size=batch_size, - shuffle=False, repeat=False) - optimizer = chainer.optimizers.Adam() - optimizer.setup(model) - updater = chainer.training.StandardUpdater(train_iter, optimizer, device=0) - trainer = chainer.training.Trainer(updater, (1, 'epoch'), out='result') - - trainer.extend(extensions.Evaluator(dev_iter, model, device=0)) - trainer.extend(extensions.LogReport()) - trainer.extend(extensions.PrintReport([ - 'epoch', 'main/accuracy', 'validation/main/accuracy'])) - trainer.extend(extensions.ProgressBar()) - - trainer.run() - - -def evaluate(model_dir, texts, labels, max_length=100): - def create_pipeline(nlp): - ''' - This could be a lambda, but named functions are easier to read in Python. - ''' - return [nlp.tagger, nlp.parser, SentimentAnalyser.load(model_dir, nlp, - max_length=max_length)] - - nlp = spacy.load('en') - nlp.pipeline = create_pipeline(nlp) - - correct = 0 - i = 0 - for doc in nlp.pipe(texts, batch_size=1000, n_threads=4): - correct += bool(doc.sentiment >= 0.5) == bool(labels[i]) - i += 1 - return float(correct) / i - - -@plac.annotations( - train_dir=("Location of training file or directory"), - dev_dir=("Location of development file or directory"), - model_dir=("Location of output model directory",), - is_runtime=("Demonstrate run-time usage", "flag", "r", bool), - nr_hidden=("Number of hidden units", "option", "H", int), - max_length=("Maximum sentence length", "option", "L", int), - dropout=("Dropout", "option", "d", float), - learn_rate=("Learn rate", "option", "e", float), - nb_epoch=("Number of training epochs", "option", "i", int), - batch_size=("Size of minibatches for training LSTM", "option", "b", int), - nr_examples=("Limit to N examples", "option", "n", int) -) -def main(model_dir, train_dir, dev_dir, - is_runtime=False, - nr_hidden=64, max_length=100, # Shape - dropout=0.5, learn_rate=0.001, # General NN config - nb_epoch=5, batch_size=32, nr_examples=-1): # Training params - model_dir = pathlib.Path(model_dir) - train_dir = pathlib.Path(train_dir) - dev_dir = pathlib.Path(dev_dir) - if is_runtime: - dev_texts, dev_labels = read_data(dev_dir) - acc = evaluate(model_dir, dev_texts, dev_labels, max_length=max_length) - print(acc) - else: - print("Read data") - train_texts, train_labels = read_data(train_dir, limit=nr_examples) - dev_texts, dev_labels = read_data(dev_dir, limit=nr_examples) - print("Using GPU 0") - #chainer.cuda.get_device(0).use() - train_labels = xp.asarray(train_labels, dtype='i') - dev_labels = xp.asarray(dev_labels, dtype='i') - lstm = train(train_texts, train_labels, dev_texts, dev_labels, - {'nr_hidden': nr_hidden, 'max_length': max_length, 'nr_class': 2, - 'nr_vector': 5000}, - {'dropout': 0.5, 'lr': learn_rate}, - {}, - nb_epoch=nb_epoch, batch_size=batch_size) - - -if __name__ == '__main__': - #cProfile.runctx("plac.call(main)", globals(), locals(), "Profile.prof") - #s = pstats.Stats("Profile.prof") - #s.strip_dirs().sort_stats("time").print_stats() - plac.call(main) diff --git a/examples/nn_text_class.py b/examples/nn_text_class.py deleted file mode 100644 index 7b4a2fd57..000000000 --- a/examples/nn_text_class.py +++ /dev/null @@ -1,281 +0,0 @@ -"""This script expects something like a binary sentiment data set, such as - that available here: `http://www.cs.cornell.edu/people/pabo/movie-review-data/` - -It expects a directory structure like: `data_dir/train/{pos|neg}` - and `data_dir/test/{pos|neg}`. Put (say) 90% of the files in the former - and the remainder in the latter. -""" - -from __future__ import unicode_literals -from __future__ import print_function -from __future__ import division - -from collections import defaultdict -from pathlib import Path -import numpy -import plac - -import spacy.en - - -def read_data(nlp, data_dir): - for subdir, label in (('pos', 1), ('neg', 0)): - for filename in (data_dir / subdir).iterdir(): - text = filename.open().read() - doc = nlp(text) - if len(doc) >= 1: - yield doc, label - - -def partition(examples, split_size): - examples = list(examples) - numpy.random.shuffle(examples) - n_docs = len(examples) - split = int(n_docs * split_size) - return examples[:split], examples[split:] - - -def minibatch(data, bs=24): - for i in range(0, len(data), bs): - yield data[i:i+bs] - - -class Extractor(object): - def __init__(self, nlp, vector_length, dropout=0.3): - self.nlp = nlp - self.dropout = dropout - self.vector = numpy.zeros((vector_length, )) - - def doc2bow(self, doc, dropout=None): - if dropout is None: - dropout = self.dropout - bow = defaultdict(int) - all_words = defaultdict(int) - for word in doc: - if numpy.random.random() >= dropout and not word.is_punct: - bow[word.lower] += 1 - all_words[word.lower] += 1 - if sum(bow.values()) >= 1: - return bow - else: - return all_words - - def bow2vec(self, bow, E): - self.vector.fill(0) - n = 0 - for orth_id, freq in bow.items(): - self.vector += self.nlp.vocab[self.nlp.vocab.strings[orth_id]].vector * freq - # Apply the fine-tuning we've learned - if orth_id < E.shape[0]: - self.vector += E[orth_id] * freq - n += freq - return self.vector / n - - -class NeuralNetwork(object): - def __init__(self, depth, width, n_classes, n_vocab, extracter, optimizer): - self.depth = depth - self.width = width - self.n_classes = n_classes - self.weights = Params.random(depth, width, width, n_classes, n_vocab) - self.doc2bow = extracter.doc2bow - self.bow2vec = extracter.bow2vec - self.optimizer = optimizer - self._gradient = Params.zero(depth, width, width, n_classes, n_vocab) - self._activity = numpy.zeros((depth, width)) - - def train(self, batch): - activity = self._activity - gradient = self._gradient - activity.fill(0) - gradient.data.fill(0) - loss = 0 - word_freqs = defaultdict(int) - for doc, label in batch: - word_ids = self.doc2bow(doc) - vector = self.bow2vec(word_ids, self.weights.E) - self.forward(activity, vector) - loss += self.backprop(vector, gradient, activity, word_ids, label) - for w, freq in word_ids.items(): - word_freqs[w] += freq - self.optimizer(self.weights, gradient, len(batch), word_freqs) - return loss - - def predict(self, doc): - actv = self._activity - actv.fill(0) - W = self.weights.W - b = self.weights.b - E = self.weights.E - - vector = self.bow2vec(self.doc2bow(doc, dropout=0.0), E) - self.forward(actv, vector) - return numpy.argmax(softmax(actv[-1], W[-1], b[-1])) - - def forward(self, actv, in_): - actv.fill(0) - W = self.weights.W; b = self.weights.b - actv[0] = relu(in_, W[0], b[0]) - for i in range(1, self.depth): - actv[i] = relu(actv[i-1], W[i], b[i]) - - def backprop(self, input_vector, gradient, activity, ids, label): - W = self.weights.W - b = self.weights.b - - target = numpy.zeros(self.n_classes) - target[label] = 1.0 - pred = softmax(activity[-1], W[-1], b[-1]) - delta = pred - target - - for i in range(self.depth, 0, -1): - gradient.b[i] += delta - gradient.W[i] += numpy.outer(delta, activity[i-1]) - delta = d_relu(activity[i-1]) * W[i].T.dot(delta) - - gradient.b[0] += delta - gradient.W[0] += numpy.outer(delta, input_vector) - tuning = W[0].T.dot(delta).reshape((self.width,)) / len(ids) - for w, freq in ids.items(): - if w < gradient.E.shape[0]: - gradient.E[w] += tuning * freq - return -sum(target * numpy.log(pred)) - - -def softmax(actvn, W, b): - w = W.dot(actvn) + b - ew = numpy.exp(w - max(w)) - return (ew / sum(ew)).ravel() - - -def relu(actvn, W, b): - x = W.dot(actvn) + b - return x * (x > 0) - - -def d_relu(x): - return x > 0 - - -class Adagrad(object): - def __init__(self, lr, rho): - self.eps = 1e-3 - # initial learning rate - self.learning_rate = lr - self.rho = rho - # stores sum of squared gradients - #self.h = numpy.zeros(self.dim) - #self._curr_rate = numpy.zeros(self.h.shape) - self.h = None - self._curr_rate = None - - def __call__(self, weights, gradient, batch_size, word_freqs): - if self.h is None: - self.h = numpy.zeros(gradient.data.shape) - self._curr_rate = numpy.zeros(gradient.data.shape) - self.L2_penalty(gradient, weights, word_freqs) - update = self.rescale(gradient.data / batch_size) - weights.data -= update - - def rescale(self, gradient): - if self.h is None: - self.h = numpy.zeros(gradient.data.shape) - self._curr_rate = numpy.zeros(gradient.data.shape) - self._curr_rate.fill(0) - self.h += gradient ** 2 - self._curr_rate = self.learning_rate / (numpy.sqrt(self.h) + self.eps) - return self._curr_rate * gradient - - def L2_penalty(self, gradient, weights, word_freqs): - # L2 Regularization - for i in range(len(weights.W)): - gradient.W[i] += weights.W[i] * self.rho - gradient.b[i] += weights.b[i] * self.rho - for w, freq in word_freqs.items(): - if w < gradient.E.shape[0]: - gradient.E[w] += weights.E[w] * self.rho - - -class Params(object): - @classmethod - def zero(cls, depth, n_embed, n_hidden, n_labels, n_vocab): - return cls(depth, n_embed, n_hidden, n_labels, n_vocab, lambda x: numpy.zeros((x,))) - - @classmethod - def random(cls, depth, nE, nH, nL, nV): - return cls(depth, nE, nH, nL, nV, lambda x: (numpy.random.rand(x) * 2 - 1) * 0.08) - - def __init__(self, depth, n_embed, n_hidden, n_labels, n_vocab, initializer): - nE = n_embed; nH = n_hidden; nL = n_labels; nV = n_vocab - n_weights = sum([ - (nE * nH) + nH, - (nH * nH + nH) * depth, - (nH * nL) + nL, - (nV * nE) - ]) - self.data = initializer(n_weights) - self.W = [] - self.b = [] - i = self._add_layer(0, nE, nH) - for _ in range(1, depth): - i = self._add_layer(i, nH, nH) - i = self._add_layer(i, nL, nH) - self.E = self.data[i : i + (nV * nE)].reshape((nV, nE)) - self.E.fill(0) - - def _add_layer(self, start, x, y): - end = start + (x * y) - self.W.append(self.data[start : end].reshape((x, y))) - self.b.append(self.data[end : end + x].reshape((x, ))) - return end + x - - -@plac.annotations( - data_dir=("Data directory", "positional", None, Path), - n_iter=("Number of iterations (epochs)", "option", "i", int), - width=("Size of hidden layers", "option", "H", int), - depth=("Depth", "option", "d", int), - dropout=("Drop-out rate", "option", "r", float), - rho=("Regularization penalty", "option", "p", float), - eta=("Learning rate", "option", "e", float), - batch_size=("Batch size", "option", "b", int), - vocab_size=("Number of words to fine-tune", "option", "w", int), -) -def main(data_dir, depth=3, width=300, n_iter=5, vocab_size=40000, - batch_size=24, dropout=0.3, rho=1e-5, eta=0.005): - n_classes = 2 - print("Loading") - nlp = spacy.en.English(parser=False) - train_data, dev_data = partition(read_data(nlp, data_dir / 'train'), 0.8) - print("Begin training") - extracter = Extractor(nlp, width, dropout=0.3) - optimizer = Adagrad(eta, rho) - model = NeuralNetwork(depth, width, n_classes, vocab_size, extracter, optimizer) - prev_best = 0 - best_weights = None - for epoch in range(n_iter): - numpy.random.shuffle(train_data) - train_loss = 0.0 - for batch in minibatch(train_data, bs=batch_size): - train_loss += model.train(batch) - n_correct = sum(model.predict(x) == y for x, y in dev_data) - print(epoch, train_loss, n_correct / len(dev_data)) - if n_correct >= prev_best: - best_weights = model.weights.data.copy() - prev_best = n_correct - - model.weights.data = best_weights - print("Evaluating") - eval_data = list(read_data(nlp, data_dir / 'test')) - n_correct = sum(model.predict(x) == y for x, y in eval_data) - print(n_correct / len(eval_data)) - - - -if __name__ == '__main__': - #import cProfile - #import pstats - #cProfile.runctx("main(Path('data/aclImdb'))", globals(), locals(), "Profile.prof") - #s = pstats.Stats("Profile.prof") - #s.strip_dirs().sort_stats("time").print_stats(100) - plac.call(main) diff --git a/examples/multi_word_matches.py b/examples/phrase_matcher.py similarity index 59% rename from examples/multi_word_matches.py rename to examples/phrase_matcher.py index 73f48bf42..ca9b0cc92 100644 --- a/examples/multi_word_matches.py +++ b/examples/phrase_matcher.py @@ -20,72 +20,72 @@ The algorithm is O(n) at run-time for document of length n because we're only ev matching over the tag patterns. So no matter how many phrases we're looking for, our pattern set stays very small (exact size depends on the maximum length we're looking for, as the query language currently has no quantifiers) + +The example expects a .bz2 file from the Reddit corpus, and a patterns file, +formatted in jsonl as a sequence of entries like this: + +{"text":"Anchorage"} +{"text":"Angola"} +{"text":"Ann Arbor"} +{"text":"Annapolis"} +{"text":"Appalachia"} +{"text":"Argentina"} """ from __future__ import print_function, unicode_literals, division -from ast import literal_eval from bz2 import BZ2File import time import math import codecs import plac +import ujson -from preshed.maps import PreshMap -from preshed.counter import PreshCounter -from spacy.strings import hash_string -from spacy.en import English from spacy.matcher import PhraseMatcher +import spacy def read_gazetteer(tokenizer, loc, n=-1): for i, line in enumerate(open(loc)): - phrase = literal_eval('u' + line.strip()) - if ' (' in phrase and phrase.endswith(')'): - phrase = phrase.split(' (', 1)[0] - if i >= n: - break - phrase = tokenizer(phrase) - if all((t.is_lower and t.prob >= -10) for t in phrase): - continue + data = ujson.loads(line.strip()) + phrase = tokenizer(data['text']) + for w in phrase: + _ = tokenizer.vocab[w.text] if len(phrase) >= 2: yield phrase -def read_text(bz2_loc): +def read_text(bz2_loc, n=10000): with BZ2File(bz2_loc) as file_: - for line in file_: - yield line.decode('utf8') + for i, line in enumerate(file_): + data = ujson.loads(line) + yield data['body'] + if i >= n: + break def get_matches(tokenizer, phrases, texts, max_length=6): - matcher = PhraseMatcher(tokenizer.vocab, phrases, max_length=max_length) - print("Match") + matcher = PhraseMatcher(tokenizer.vocab, max_length=max_length) + matcher.add('Phrase', None, *phrases) for text in texts: doc = tokenizer(text) + for w in doc: + _ = doc.vocab[w.text] matches = matcher(doc) - for mwe in doc.ents: - yield mwe + for ent_id, start, end in matches: + yield (ent_id, doc[start:end].text) -def main(patterns_loc, text_loc, counts_loc, n=10000000): - nlp = English(parser=False, tagger=False, entity=False) - print("Make matcher") - phrases = read_gazetteer(nlp.tokenizer, patterns_loc, n=n) - counts = PreshCounter() +def main(patterns_loc, text_loc, n=10000): + nlp = spacy.blank('en') + nlp.vocab.lex_attr_getters = {} + phrases = read_gazetteer(nlp.tokenizer, patterns_loc) + count = 0 t1 = time.time() - for mwe in get_matches(nlp.tokenizer, phrases, read_text(text_loc)): - counts.inc(hash_string(mwe.text), 1) + for ent_id, text in get_matches(nlp.tokenizer, phrases, read_text(text_loc, n=n)): + count += 1 t2 = time.time() - print("10m tokens in %d s" % (t2 - t1)) - - with codecs.open(counts_loc, 'w', 'utf8') as file_: - for phrase in read_gazetteer(nlp.tokenizer, patterns_loc, n=n): - text = phrase.string - key = hash_string(text) - count = counts[key] - if count != 0: - file_.write('%d\t%s\n' % (count, text)) - + print("%d docs in %.3f s. %d matches" % (n, (t2 - t1), count)) + if __name__ == '__main__': if False: diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py new file mode 100644 index 000000000..9b1a8325d --- /dev/null +++ b/examples/pipeline/custom_attr_methods.py @@ -0,0 +1,52 @@ +# coding: utf-8 +"""This example contains several snippets of methods that can be set via custom +Doc, Token or Span attributes in spaCy v2.0. Attribute methods act like +they're "bound" to the object and are partially applied – i.e. the object +they're called on is passed in as the first argument.""" +from __future__ import unicode_literals + +from spacy.lang.en import English +from spacy.tokens import Doc, Span +from spacy import displacy +from pathlib import Path + + +def to_html(doc, output='/tmp', style='dep'): + """Doc method extension for saving the current state as a displaCy + visualization. + """ + # generate filename from first six non-punct tokens + file_name = '-'.join([w.text for w in doc[:6] if not w.is_punct]) + '.html' + output_path = Path(output) / file_name + html = displacy.render(doc, style=style, page=True) # render markup + output_path.open('w', encoding='utf-8').write(html) # save to file + print('Saved HTML to {}'.format(output_path)) + + +Doc.set_extension('to_html', method=to_html) + +nlp = English() +doc = nlp(u"This is a sentence about Apple.") +# add entity manually for demo purposes, to make it work without a model +doc.ents = [Span(doc, 5, 6, label=nlp.vocab.strings['ORG'])] +doc._.to_html(style='ent') + + +def overlap_tokens(doc, other_doc): + """Get the tokens from the original Doc that are also in the comparison Doc. + """ + overlap = [] + other_tokens = [token.text for token in other_doc] + for token in doc: + if token.text in other_tokens: + overlap.append(token) + return overlap + + +Doc.set_extension('overlap', method=overlap_tokens) + +nlp = English() +doc1 = nlp(u"Peach emoji is where it has always been.") +doc2 = nlp(u"Peach is the superior emoji.") +tokens = doc1._.overlap(doc2) +print(tokens) diff --git a/examples/pipeline/custom_component_countries_api.py b/examples/pipeline/custom_component_countries_api.py new file mode 100644 index 000000000..2554af967 --- /dev/null +++ b/examples/pipeline/custom_component_countries_api.py @@ -0,0 +1,108 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import requests + +from spacy.lang.en import English +from spacy.matcher import PhraseMatcher +from spacy.tokens import Doc, Span, Token + + +class RESTCountriesComponent(object): + """Example of a spaCy v2.0 pipeline component that requests all countries + via the REST Countries API, merges country names into one token, assigns + entity labels and sets attributes on country tokens, e.g. the capital and + lat/lng coordinates. Can be extended with more details from the API. + + REST Countries API: https://restcountries.eu + API License: Mozilla Public License MPL 2.0 + """ + name = 'rest_countries' # component name, will show up in the pipeline + + def __init__(self, nlp, label='GPE'): + """Initialise the pipeline component. The shared nlp instance is used + to initialise the matcher with the shared vocab, get the label ID and + generate Doc objects as phrase match patterns. + """ + # Make request once on initialisation and store the data + r = requests.get('https://restcountries.eu/rest/v2/all') + r.raise_for_status() # make sure requests raises an error if it fails + countries = r.json() + + # Convert API response to dict keyed by country name for easy lookup + # This could also be extended using the alternative and foreign language + # names provided by the API + self.countries = {c['name']: c for c in countries} + self.label = nlp.vocab.strings[label] # get entity label ID + + # Set up the PhraseMatcher with Doc patterns for each country name + patterns = [nlp(c) for c in self.countries.keys()] + self.matcher = PhraseMatcher(nlp.vocab) + self.matcher.add('COUNTRIES', None, *patterns) + + # Register attribute on the Token. We'll be overwriting this based on + # the matches, so we're only setting a default value, not a getter. + # If no default value is set, it defaults to None. + Token.set_extension('is_country', default=False) + Token.set_extension('country_capital') + Token.set_extension('country_latlng') + Token.set_extension('country_flag') + + # Register attributes on Doc and Span via a getter that checks if one of + # the contained tokens is set to is_country == True. + Doc.set_extension('has_country', getter=self.has_country) + Span.set_extension('has_country', getter=self.has_country) + + + def __call__(self, doc): + """Apply the pipeline component on a Doc object and modify it if matches + are found. Return the Doc, so it can be processed by the next component + in the pipeline, if available. + """ + matches = self.matcher(doc) + spans = [] # keep the spans for later so we can merge them afterwards + for _, start, end in matches: + # Generate Span representing the entity & set label + entity = Span(doc, start, end, label=self.label) + spans.append(entity) + # Set custom attribute on each token of the entity + # Can be extended with other data returned by the API, like + # currencies, country code, flag, calling code etc. + for token in entity: + token._.set('is_country', True) + token._.set('country_capital', self.countries[entity.text]['capital']) + token._.set('country_latlng', self.countries[entity.text]['latlng']) + token._.set('country_flag', self.countries[entity.text]['flag']) + # Overwrite doc.ents and add entity – be careful not to replace! + doc.ents = list(doc.ents) + [entity] + for span in spans: + # Iterate over all spans and merge them into one token. This is done + # after setting the entities – otherwise, it would cause mismatched + # indices! + span.merge() + return doc # don't forget to return the Doc! + + def has_country(self, tokens): + """Getter for Doc and Span attributes. Returns True if one of the tokens + is a country. Since the getter is only called when we access the + attribute, we can refer to the Token's 'is_country' attribute here, + which is already set in the processing step.""" + return any([t._.get('is_country') for t in tokens]) + + +# For simplicity, we start off with only the blank English Language class and +# no model or pre-defined pipeline loaded. + +nlp = English() +rest_countries = RESTCountriesComponent(nlp) # initialise component +nlp.add_pipe(rest_countries) # add it to the pipeline + +doc = nlp(u"Some text about Colombia and the Czech Republic") + +print('Pipeline', nlp.pipe_names) # pipeline contains component name +print('Doc has countries', doc._.has_country) # Doc contains countries +for token in doc: + if token._.is_country: + print(token.text, token._.country_capital, token._.country_latlng, + token._.country_flag) # country data +print('Entities', [(e.text, e.label_) for e in doc.ents]) # all countries are entities diff --git a/examples/pipeline/custom_component_entities.py b/examples/pipeline/custom_component_entities.py new file mode 100644 index 000000000..a0d9c61ec --- /dev/null +++ b/examples/pipeline/custom_component_entities.py @@ -0,0 +1,85 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from spacy.lang.en import English +from spacy.matcher import PhraseMatcher +from spacy.tokens import Doc, Span, Token + + +class TechCompanyRecognizer(object): + """Example of a spaCy v2.0 pipeline component that sets entity annotations + based on list of single or multiple-word company names. Companies are + labelled as ORG and their spans are merged into one token. Additionally, + ._.has_tech_org and ._.is_tech_org is set on the Doc/Span and Token + respectively.""" + name = 'tech_companies' # component name, will show up in the pipeline + + def __init__(self, nlp, companies=tuple(), label='ORG'): + """Initialise the pipeline component. The shared nlp instance is used + to initialise the matcher with the shared vocab, get the label ID and + generate Doc objects as phrase match patterns. + """ + self.label = nlp.vocab.strings[label] # get entity label ID + + # Set up the PhraseMatcher – it can now take Doc objects as patterns, + # so even if the list of companies is long, it's very efficient + patterns = [nlp(org) for org in companies] + self.matcher = PhraseMatcher(nlp.vocab) + self.matcher.add('TECH_ORGS', None, *patterns) + + # Register attribute on the Token. We'll be overwriting this based on + # the matches, so we're only setting a default value, not a getter. + Token.set_extension('is_tech_org', default=False) + + # Register attributes on Doc and Span via a getter that checks if one of + # the contained tokens is set to is_tech_org == True. + Doc.set_extension('has_tech_org', getter=self.has_tech_org) + Span.set_extension('has_tech_org', getter=self.has_tech_org) + + def __call__(self, doc): + """Apply the pipeline component on a Doc object and modify it if matches + are found. Return the Doc, so it can be processed by the next component + in the pipeline, if available. + """ + matches = self.matcher(doc) + spans = [] # keep the spans for later so we can merge them afterwards + for _, start, end in matches: + # Generate Span representing the entity & set label + entity = Span(doc, start, end, label=self.label) + spans.append(entity) + # Set custom attribute on each token of the entity + for token in entity: + token._.set('is_tech_org', True) + # Overwrite doc.ents and add entity – be careful not to replace! + doc.ents = list(doc.ents) + [entity] + for span in spans: + # Iterate over all spans and merge them into one token. This is done + # after setting the entities – otherwise, it would cause mismatched + # indices! + span.merge() + return doc # don't forget to return the Doc! + + def has_tech_org(self, tokens): + """Getter for Doc and Span attributes. Returns True if one of the tokens + is a tech org. Since the getter is only called when we access the + attribute, we can refer to the Token's 'is_tech_org' attribute here, + which is already set in the processing step.""" + return any([t._.get('is_tech_org') for t in tokens]) + + +# For simplicity, we start off with only the blank English Language class and +# no model or pre-defined pipeline loaded. + +nlp = English() +companies = ['Alphabet Inc.', 'Google', 'Netflix', 'Apple'] # etc. +component = TechCompanyRecognizer(nlp, companies) # initialise component +nlp.add_pipe(component, last=True) # add it to the pipeline as the last element + +doc = nlp(u"Alphabet Inc. is the company behind Google.") + +print('Pipeline', nlp.pipe_names) # pipeline contains component name +print('Tokens', [t.text for t in doc]) # company names from the list are merged +print('Doc has_tech_org', doc._.has_tech_org) # Doc contains tech orgs +print('Token 0 is_tech_org', doc[0]._.is_tech_org) # "Alphabet Inc." is a tech org +print('Token 1 is_tech_org', doc[1]._.is_tech_org) # "is" is not +print('Entities', [(e.text, e.label_) for e in doc.ents]) # all orgs are entities diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py index 9591d1b71..0c5094bb7 100644 --- a/examples/training/train_ner_standalone.py +++ b/examples/training/train_ner_standalone.py @@ -6,31 +6,36 @@ To achieve that, it duplicates some of spaCy's internal functionality. Specifically, in this example, we don't use spaCy's built-in Language class to wire together the Vocab, Tokenizer and EntityRecognizer. Instead, we write -our own simle Pipeline class, so that it's easier to see how the pieces +our own simple Pipeline class, so that it's easier to see how the pieces interact. Input data: https://www.lt.informatik.tu-darmstadt.de/fileadmin/user_upload/Group_LangTech/data/GermEval2014_complete_data.zip Developed for: spaCy 1.7.1 -Last tested for: spaCy 1.7.1 +Last tested for: spaCy 2.0.0a13 ''' from __future__ import unicode_literals, print_function import plac from pathlib import Path import random import json +import tqdm + +from thinc.neural.optimizers import Adam +from thinc.neural.ops import NumpyOps -import spacy.orth as orth_funcs from spacy.vocab import Vocab -from spacy.pipeline import BeamEntityRecognizer -from spacy.pipeline import EntityRecognizer +from spacy.pipeline import TokenVectorEncoder, NeuralEntityRecognizer from spacy.tokenizer import Tokenizer from spacy.tokens import Doc from spacy.attrs import * from spacy.gold import GoldParse -from spacy.gold import _iob_to_biluo as iob_to_biluo +from spacy.gold import iob_to_biluo +from spacy.gold import minibatch from spacy.scorer import Scorer +import spacy.util + try: unicode @@ -38,96 +43,38 @@ except NameError: unicode = str +spacy.util.set_env_log(True) + + def init_vocab(): return Vocab( lex_attr_getters={ LOWER: lambda string: string.lower(), - SHAPE: orth_funcs.word_shape, + NORM: lambda string: string.lower(), PREFIX: lambda string: string[0], SUFFIX: lambda string: string[-3:], - CLUSTER: lambda string: 0, - IS_ALPHA: orth_funcs.is_alpha, - IS_ASCII: orth_funcs.is_ascii, - IS_DIGIT: lambda string: string.isdigit(), - IS_LOWER: orth_funcs.is_lower, - IS_PUNCT: orth_funcs.is_punct, - IS_SPACE: lambda string: string.isspace(), - IS_TITLE: orth_funcs.is_title, - IS_UPPER: orth_funcs.is_upper, - IS_STOP: lambda string: False, - IS_OOV: lambda string: True }) -def save_vocab(vocab, path): - path = Path(path) - if not path.exists(): - path.mkdir() - elif not path.is_dir(): - raise IOError("Can't save vocab to %s\nNot a directory" % path) - with (path / 'strings.json').open('w') as file_: - vocab.strings.dump(file_) - vocab.dump((path / 'lexemes.bin').as_posix()) - - -def load_vocab(path): - path = Path(path) - if not path.exists(): - raise IOError("Cannot load vocab from %s\nDoes not exist" % path) - if not path.is_dir(): - raise IOError("Cannot load vocab from %s\nNot a directory" % path) - return Vocab.load(path) - - -def init_ner_model(vocab, features=None): - if features is None: - features = tuple(EntityRecognizer.feature_templates) - return EntityRecognizer(vocab, features=features) - - -def save_ner_model(model, path): - path = Path(path) - if not path.exists(): - path.mkdir() - if not path.is_dir(): - raise IOError("Can't save model to %s\nNot a directory" % path) - model.model.dump((path / 'model').as_posix()) - with (path / 'config.json').open('w') as file_: - data = json.dumps(model.cfg) - if not isinstance(data, unicode): - data = data.decode('utf8') - file_.write(data) - - -def load_ner_model(vocab, path): - return EntityRecognizer.load(path, vocab) - - class Pipeline(object): - @classmethod - def load(cls, path): - path = Path(path) - if not path.exists(): - raise IOError("Cannot load pipeline from %s\nDoes not exist" % path) - if not path.is_dir(): - raise IOError("Cannot load pipeline from %s\nNot a directory" % path) - vocab = load_vocab(path) - tokenizer = Tokenizer(vocab, {}, None, None, None) - ner_model = load_ner_model(vocab, path / 'ner') - return cls(vocab, tokenizer, ner_model) - def __init__(self, vocab=None, tokenizer=None, entity=None): if vocab is None: vocab = init_vocab() if tokenizer is None: tokenizer = Tokenizer(vocab, {}, None, None, None) if entity is None: - entity = init_ner_model(self.vocab) + entity = NeuralEntityRecognizer(vocab) self.vocab = vocab self.tokenizer = tokenizer self.entity = entity self.pipeline = [self.entity] + def begin_training(self): + for model in self.pipeline: + model.begin_training([]) + optimizer = Adam(NumpyOps(), 0.001) + return optimizer + def __call__(self, input_): doc = self.make_doc(input_) for process in self.pipeline: @@ -147,14 +94,16 @@ class Pipeline(object): gold = GoldParse(doc, entities=annotations) return gold - def update(self, input_, annot): - doc = self.make_doc(input_) - gold = self.make_gold(input_, annot) - for ner in gold.ner: - if ner not in (None, '-', 'O'): - action, label = ner.split('-', 1) - self.entity.add_label(label) - return self.entity.update(doc, gold) + def update(self, inputs, annots, sgd, losses=None, drop=0.): + if losses is None: + losses = {} + docs = [self.make_doc(input_) for input_ in inputs] + golds = [self.make_gold(input_, annot) for input_, annot in + zip(inputs, annots)] + + self.entity.update(docs, golds, drop=drop, + sgd=sgd, losses=losses) + return losses def evaluate(self, examples): scorer = Scorer() @@ -164,43 +113,44 @@ class Pipeline(object): scorer.score(doc, gold) return scorer.scores - def average_weights(self): - self.entity.model.end_training() - - def save(self, path): + def to_disk(self, path): path = Path(path) if not path.exists(): path.mkdir() elif not path.is_dir(): raise IOError("Can't save pipeline to %s\nNot a directory" % path) - save_vocab(self.vocab, path / 'vocab') - save_ner_model(self.entity, path / 'ner') + self.vocab.to_disk(path / 'vocab') + self.entity.to_disk(path / 'ner') + + def from_disk(self, path): + path = Path(path) + if not path.exists(): + raise IOError("Cannot load pipeline from %s\nDoes not exist" % path) + if not path.is_dir(): + raise IOError("Cannot load pipeline from %s\nNot a directory" % path) + self.vocab = self.vocab.from_disk(path / 'vocab') + self.entity = self.entity.from_disk(path / 'ner') -def train(nlp, train_examples, dev_examples, ctx, nr_epoch=5): - next_epoch = train_examples +def train(nlp, train_examples, dev_examples, nr_epoch=5): + sgd = nlp.begin_training() print("Iter", "Loss", "P", "R", "F") for i in range(nr_epoch): - this_epoch = next_epoch - next_epoch = [] - loss = 0 - for input_, annot in this_epoch: - loss += nlp.update(input_, annot) - if (i+1) < nr_epoch: - next_epoch.append((input_, annot)) - random.shuffle(next_epoch) + random.shuffle(train_examples) + losses = {} + for batch in minibatch(tqdm.tqdm(train_examples, leave=False), size=8): + inputs, annots = zip(*batch) + nlp.update(list(inputs), list(annots), sgd, losses=losses) scores = nlp.evaluate(dev_examples) - report_scores(i, loss, scores) - nlp.average_weights() - scores = nlp.evaluate(dev_examples) - report_scores(channels, i+1, loss, scores) + report_scores(i+1, losses['ner'], scores) def report_scores(i, loss, scores): precision = '%.2f' % scores['ents_p'] recall = '%.2f' % scores['ents_r'] f_measure = '%.2f' % scores['ents_f'] - print('%d %s %s %s' % (int(loss), precision, recall, f_measure)) + print('Epoch %d: %d %s %s %s' % ( + i, int(loss), precision, recall, f_measure)) def read_examples(path): @@ -208,7 +158,8 @@ def read_examples(path): with path.open() as file_: sents = file_.read().strip().split('\n\n') for sent in sents: - if not sent.strip(): + sent = sent.strip() + if not sent: continue tokens = sent.split('\n') while tokens and tokens[0].startswith('#'): @@ -217,28 +168,39 @@ def read_examples(path): iob = [] for token in tokens: if token.strip(): - pieces = token.split() + pieces = token.split('\t') words.append(pieces[1]) iob.append(pieces[2]) yield words, iob_to_biluo(iob) +def get_labels(examples): + labels = set() + for words, tags in examples: + for tag in tags: + if '-' in tag: + labels.add(tag.split('-')[1]) + return sorted(labels) + + @plac.annotations( model_dir=("Path to save the model", "positional", None, Path), train_loc=("Path to your training data", "positional", None, Path), dev_loc=("Path to your development data", "positional", None, Path), ) -def main(model_dir=Path('/home/matt/repos/spaCy/spacy/data/de-1.0.0'), - train_loc=None, dev_loc=None, nr_epoch=30): - - train_examples = read_examples(train_loc) +def main(model_dir, train_loc, dev_loc, nr_epoch=30): + print(model_dir, train_loc, dev_loc) + train_examples = list(read_examples(train_loc)) dev_examples = read_examples(dev_loc) - nlp = Pipeline.load(model_dir) + nlp = Pipeline() + for label in get_labels(train_examples): + nlp.entity.add_label(label) + print("Add label", label) - train(nlp, train_examples, list(dev_examples), ctx, nr_epoch) + train(nlp, train_examples, list(dev_examples), nr_epoch) - nlp.save(model_dir) + nlp.to_disk(model_dir) if __name__ == '__main__': - main() + plac.call(main) diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py index 4eae11c75..ab69285a6 100644 --- a/examples/training/train_new_entity_type.py +++ b/examples/training/train_new_entity_type.py @@ -25,7 +25,7 @@ For more details, see the documentation: * Saving and loading models: https://spacy.io/docs/usage/saving-loading Developed for: spaCy 1.7.6 -Last tested for: spaCy 1.7.6 +Last updated for: spaCy 2.0.0a13 """ from __future__ import unicode_literals, print_function @@ -34,55 +34,41 @@ from pathlib import Path import random import spacy -from spacy.gold import GoldParse -from spacy.tagger import Tagger +from spacy.gold import GoldParse, minibatch +from spacy.pipeline import NeuralEntityRecognizer +from spacy.pipeline import TokenVectorEncoder +def get_gold_parses(tokenizer, train_data): + '''Shuffle and create GoldParse objects''' + random.shuffle(train_data) + for raw_text, entity_offsets in train_data: + doc = tokenizer(raw_text) + gold = GoldParse(doc, entities=entity_offsets) + yield doc, gold + + def train_ner(nlp, train_data, output_dir): - # Add new words to vocab - for raw_text, _ in train_data: - doc = nlp.make_doc(raw_text) - for word in doc: - _ = nlp.vocab[word.orth] random.seed(0) - # You may need to change the learning rate. It's generally difficult to - # guess what rate you should set, especially when you have limited data. - nlp.entity.model.learn_rate = 0.001 - for itn in range(1000): - random.shuffle(train_data) - loss = 0. - for raw_text, entity_offsets in train_data: - gold = GoldParse(doc, entities=entity_offsets) - # By default, the GoldParse class assumes that the entities - # described by offset are complete, and all other words should - # have the tag 'O'. You can tell it to make no assumptions - # about the tag of a word by giving it the tag '-'. - # However, this allows a trivial solution to the current - # learning problem: if words are either 'any tag' or 'ANIMAL', - # the model can learn that all words can be tagged 'ANIMAL'. - #for i in range(len(gold.ner)): - #if not gold.ner[i].endswith('ANIMAL'): - # gold.ner[i] = '-' - doc = nlp.make_doc(raw_text) - nlp.tagger(doc) - # As of 1.9, spaCy's parser now lets you supply a dropout probability - # This might help the model generalize better from only a few - # examples. - loss += nlp.entity.update(doc, gold, drop=0.9) - if loss == 0: - break - # This step averages the model's weights. This may or may not be good for - # your situation --- it's empirical. - nlp.end_training() - if output_dir: - if not output_dir.exists(): - output_dir.mkdir() - nlp.save_to_directory(output_dir) + optimizer = nlp.begin_training(lambda: []) + nlp.meta['name'] = 'en_ent_animal' + for itn in range(50): + losses = {} + for batch in minibatch(get_gold_parses(nlp.make_doc, train_data), size=3): + docs, golds = zip(*batch) + nlp.update(docs, golds, losses=losses, sgd=optimizer, update_shared=True, + drop=0.35) + print(losses) + if not output_dir: + return + elif not output_dir.exists(): + output_dir.mkdir() + nlp.to_disk(output_dir) def main(model_name, output_directory=None): - print("Loading initial model", model_name) - nlp = spacy.load(model_name) + print("Creating initial model", model_name) + nlp = spacy.blank(model_name) if output_directory is not None: output_directory = Path(output_directory) @@ -91,6 +77,11 @@ def main(model_name, output_directory=None): "Horses are too tall and they pretend to care about your feelings", [(0, 6, 'ANIMAL')], ), + ( + "Do they bite?", + [], + ), + ( "horses are too tall and they pretend to care about your feelings", [(0, 6, 'ANIMAL')] @@ -109,18 +100,20 @@ def main(model_name, output_directory=None): ) ] - nlp.entity.add_label('ANIMAL') + nlp.pipeline.append(TokenVectorEncoder(nlp.vocab)) + nlp.pipeline.append(NeuralEntityRecognizer(nlp.vocab)) + nlp.pipeline[-1].add_label('ANIMAL') train_ner(nlp, train_data, output_directory) # Test that the entity is recognized - doc = nlp('Do you like horses?') + text = 'Do you like horses?' print("Ents in 'Do you like horses?':") + doc = nlp(text) for ent in doc.ents: print(ent.label_, ent.text) if output_directory: print("Loading from", output_directory) - nlp2 = spacy.load('en', path=output_directory) - nlp2.entity.add_label('ANIMAL') + nlp2 = spacy.load(output_directory) doc2 = nlp2('Do you like horses?') for ent in doc2.ents: print(ent.label_, ent.text) diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py new file mode 100644 index 000000000..4d07ed26a --- /dev/null +++ b/examples/training/train_textcat.py @@ -0,0 +1,121 @@ +'''Train a multi-label convolutional neural network text classifier, +using the spacy.pipeline.TextCategorizer component. The model is then added +to spacy.pipeline, and predictions are available at `doc.cats`. +''' +from __future__ import unicode_literals +import plac +import random +import tqdm + +from thinc.neural.optimizers import Adam +from thinc.neural.ops import NumpyOps +import thinc.extra.datasets + +import spacy.lang.en +from spacy.gold import GoldParse, minibatch +from spacy.util import compounding +from spacy.pipeline import TextCategorizer + +# TODO: Remove this once we're not supporting models trained with thinc <6.9.0 +import thinc.neural._classes.layernorm +thinc.neural._classes.layernorm.set_compat_six_eight(False) + + +def train_textcat(tokenizer, textcat, + train_texts, train_cats, dev_texts, dev_cats, + n_iter=20): + ''' + Train the TextCategorizer without associated pipeline. + ''' + textcat.begin_training() + optimizer = Adam(NumpyOps(), 0.001) + train_docs = [tokenizer(text) for text in train_texts] + train_gold = [GoldParse(doc, cats=cats) for doc, cats in + zip(train_docs, train_cats)] + train_data = list(zip(train_docs, train_gold)) + batch_sizes = compounding(4., 128., 1.001) + for i in range(n_iter): + losses = {} + # Progress bar and minibatching + batches = minibatch(tqdm.tqdm(train_data, leave=False), size=batch_sizes) + for batch in batches: + docs, golds = zip(*batch) + textcat.update(docs, golds, sgd=optimizer, drop=0.2, + losses=losses) + with textcat.model.use_params(optimizer.averages): + scores = evaluate(tokenizer, textcat, dev_texts, dev_cats) + yield losses['textcat'], scores + + +def evaluate(tokenizer, textcat, texts, cats): + docs = (tokenizer(text) for text in texts) + tp = 1e-8 # True positives + fp = 1e-8 # False positives + fn = 1e-8 # False negatives + tn = 1e-8 # True negatives + for i, doc in enumerate(textcat.pipe(docs)): + gold = cats[i] + for label, score in doc.cats.items(): + if label not in gold: + continue + if score >= 0.5 and gold[label] >= 0.5: + tp += 1. + elif score >= 0.5 and gold[label] < 0.5: + fp += 1. + elif score < 0.5 and gold[label] < 0.5: + tn += 1 + elif score < 0.5 and gold[label] >= 0.5: + fn += 1 + precis = tp / (tp + fp) + recall = tp / (tp + fn) + fscore = 2 * (precis * recall) / (precis + recall) + return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore} + + +def load_data(limit=0): + # Partition off part of the train data --- avoid running experiments + # against test. + train_data, _ = thinc.extra.datasets.imdb() + + random.shuffle(train_data) + train_data = train_data[-limit:] + + texts, labels = zip(*train_data) + cats = [{'POSITIVE': bool(y)} for y in labels] + + split = int(len(train_data) * 0.8) + + train_texts = texts[:split] + train_cats = cats[:split] + dev_texts = texts[split:] + dev_cats = cats[split:] + return (train_texts, train_cats), (dev_texts, dev_cats) + + +def main(model_loc=None): + nlp = spacy.lang.en.English() + tokenizer = nlp.tokenizer + textcat = TextCategorizer(tokenizer.vocab, labels=['POSITIVE']) + + print("Load IMDB data") + (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=2000) + + print("Itn.\tLoss\tP\tR\tF") + progress = '{i:d} {loss:.3f} {textcat_p:.3f} {textcat_r:.3f} {textcat_f:.3f}' + + for i, (loss, scores) in enumerate(train_textcat(tokenizer, textcat, + train_texts, train_cats, + dev_texts, dev_cats, n_iter=20)): + print(progress.format(i=i, loss=loss, **scores)) + # How to save, load and use + nlp.pipeline.append(textcat) + if model_loc is not None: + nlp.to_disk(model_loc) + + nlp = spacy.load(model_loc) + doc = nlp(u'This movie sucked!') + print(doc.cats) + + +if __name__ == '__main__': + plac.call(main) diff --git a/examples/vectors_fast_text.py b/examples/vectors_fast_text.py new file mode 100644 index 000000000..9aa9fda56 --- /dev/null +++ b/examples/vectors_fast_text.py @@ -0,0 +1,30 @@ +'''Load vectors for a language trained using FastText + +https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md +''' +from __future__ import unicode_literals +import plac +import numpy + +import spacy.language + + +def main(vectors_loc): + nlp = spacy.language.Language() + + with open(vectors_loc, 'rb') as file_: + header = file_.readline() + nr_row, nr_dim = header.split() + nlp.vocab.clear_vectors(int(nr_dim)) + for line in file_: + line = line.decode('utf8') + pieces = line.split() + word = pieces[0] + vector = numpy.asarray([float(v) for v in pieces[1:]], dtype='f') + nlp.vocab.set_vector(word, vector) + doc = nlp(u'class colspan') + print(doc[0].similarity(doc[1])) + + +if __name__ == '__main__': + plac.call(main) diff --git a/fabfile.py b/fabfile.py index cfa80ead5..2894fe477 100644 --- a/fabfile.py +++ b/fabfile.py @@ -14,6 +14,7 @@ VENV_DIR = path.join(PWD, ENV) def env(lang='python2.7'): if path.exists(VENV_DIR): local('rm -rf {env}'.format(env=VENV_DIR)) + local('pip install virtualenv') local('python -m virtualenv -p {lang} {env}'.format(lang=lang, env=VENV_DIR)) @@ -32,6 +33,10 @@ def make(): local('pip install -r requirements.txt') local('python setup.py build_ext --inplace') +def sdist(): + with virtualenv(VENV_DIR): + with lcd(path.dirname(__file__)): + local('python setup.py sdist') def clean(): with lcd(path.dirname(__file__)): diff --git a/requirements.txt b/requirements.txt index 37259e747..0b46b38d5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ -cython<0.24 +cython>=0.24,<0.27.0 pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.7.3,<6.8.0 +thinc>=6.9.0,<6.10.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six @@ -13,7 +13,7 @@ requests>=2.13.0,<3.0.0 regex==2017.4.5 ftfy>=4.4.2,<5.0.0 pytest>=3.0.6,<4.0.0 -pip>=9.0.0,<10.0.0 mock>=2.0.0,<3.0.0 msgpack-python msgpack-numpy +html5lib==1.0b8 diff --git a/setup.py b/setup.py index df6afdb2c..23b4f9581 100755 --- a/setup.py +++ b/setup.py @@ -28,7 +28,9 @@ MOD_NAMES = [ 'spacy.pipeline', 'spacy.syntax.stateclass', 'spacy.syntax._state', + 'spacy.syntax._beam_utils', 'spacy.tokenizer', + 'spacy._cfile', 'spacy.syntax.parser', 'spacy.syntax.nn_parser', 'spacy.syntax.beam_parser', @@ -187,14 +189,14 @@ def setup_package(): url=about['__uri__'], license=about['__license__'], ext_modules=ext_modules, + scripts=['bin/spacy'], install_requires=[ 'numpy>=1.7', 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.7.3,<6.8.0', + 'thinc>=6.9.0,<6.10.0', 'plac<1.0.0,>=0.9.6', - 'pip>=9.0.0,<10.0.0', 'six', 'pathlib', 'ujson>=1.35', diff --git a/spacy/__init__.py b/spacy/__init__.py index 068282b1a..ba2479106 100644 --- a/spacy/__init__.py +++ b/spacy/__init__.py @@ -4,14 +4,21 @@ from __future__ import unicode_literals from .cli.info import info as cli_info from .glossary import explain from .deprecated import resolve_load_name +#from .about import __version__ from .about import __version__ from . import util def load(name, **overrides): + from .deprecated import resolve_load_name name = resolve_load_name(name, **overrides) return util.load_model(name, **overrides) +def blank(name, **kwargs): + LangClass = util.get_lang_class(name) + return LangClass(**kwargs) + + def info(model=None, markdown=False): return cli_info(None, model, markdown) diff --git a/spacy/__main__.py b/spacy/__main__.py index 214a7b617..99d6b116c 100644 --- a/spacy/__main__.py +++ b/spacy/__main__.py @@ -3,15 +3,25 @@ from __future__ import print_function # NB! This breaks in plac on Python 2!! #from __future__ import unicode_literals - if __name__ == '__main__': import plac import sys - from spacy.cli import download, link, info, package, train, convert + from spacy.cli import download, link, info, package, train, convert, model + from spacy.cli import profile, evaluate, validate from spacy.util import prints - commands = {'download': download, 'link': link, 'info': info, 'train': train, - 'convert': convert, 'package': package} + commands = { + 'download': download, + 'link': link, + 'info': info, + 'train': train, + 'evaluate': evaluate, + 'convert': convert, + 'package': package, + 'model': model, + 'profile': profile, + 'validate': validate + } if len(sys.argv) == 1: prints(', '.join(commands), title="Available commands", exits=1) command = sys.argv.pop(1) @@ -19,5 +29,7 @@ if __name__ == '__main__': if command in commands: plac.call(commands[command]) else: - prints("Available: %s" % ', '.join(commands), - title="Unknown command: %s" % command, exits=1) + prints( + "Available: %s" % ', '.join(commands), + title="Unknown command: %s" % command, + exits=1) diff --git a/spacy/_cfile.pxd b/spacy/_cfile.pxd new file mode 100644 index 000000000..cb0077587 --- /dev/null +++ b/spacy/_cfile.pxd @@ -0,0 +1,26 @@ +from libc.stdio cimport fopen, fclose, fread, fwrite, FILE +from cymem.cymem cimport Pool + +cdef class CFile: + cdef FILE* fp + cdef bint is_open + cdef Pool mem + cdef int size # For compatibility with subclass + cdef int _capacity # For compatibility with subclass + + cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1 + + cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1 + + cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except * + + + +cdef class StringCFile(CFile): + cdef unsigned char* data + + cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1 + + cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1 + + cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except * diff --git a/spacy/_cfile.pyx b/spacy/_cfile.pyx new file mode 100644 index 000000000..ceebe2e59 --- /dev/null +++ b/spacy/_cfile.pyx @@ -0,0 +1,88 @@ +from libc.stdio cimport fopen, fclose, fread, fwrite, FILE +from libc.string cimport memcpy + + +cdef class CFile: + def __init__(self, loc, mode, on_open_error=None): + if isinstance(mode, unicode): + mode_str = mode.encode('ascii') + else: + mode_str = mode + if hasattr(loc, 'as_posix'): + loc = loc.as_posix() + self.mem = Pool() + cdef bytes bytes_loc = loc.encode('utf8') if type(loc) == unicode else loc + self.fp = fopen(bytes_loc, mode_str) + if self.fp == NULL: + if on_open_error is not None: + on_open_error() + else: + raise IOError("Could not open binary file %s" % bytes_loc) + self.is_open = True + + def __dealloc__(self): + if self.is_open: + fclose(self.fp) + + def close(self): + fclose(self.fp) + self.is_open = False + + cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1: + st = fread(dest, elem_size, number, self.fp) + if st != number: + raise IOError + + cdef int write_from(self, void* src, size_t number, size_t elem_size) except -1: + st = fwrite(src, elem_size, number, self.fp) + if st != number: + raise IOError + + cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *: + cdef void* dest = mem.alloc(number, elem_size) + self.read_into(dest, number, elem_size) + return dest + + def write_unicode(self, unicode value): + cdef bytes py_bytes = value.encode('utf8') + cdef char* chars = py_bytes + self.write(sizeof(char), len(py_bytes), chars) + + +cdef class StringCFile: + def __init__(self, mode, bytes data=b'', on_open_error=None): + self.mem = Pool() + self.is_open = 'w' in mode + self._capacity = max(len(data), 8) + self.size = len(data) + self.data = self.mem.alloc(1, self._capacity) + for i in range(len(data)): + self.data[i] = data[i] + + def close(self): + self.is_open = False + + def string_data(self): + return (self.data-self.size)[:self.size] + + cdef int read_into(self, void* dest, size_t number, size_t elem_size) except -1: + memcpy(dest, self.data, elem_size * number) + self.data += elem_size * number + + cdef int write_from(self, void* src, size_t elem_size, size_t number) except -1: + write_size = number * elem_size + if (self.size + write_size) >= self._capacity: + self._capacity = (self.size + write_size) * 2 + self.data = self.mem.realloc(self.data, self._capacity) + memcpy(&self.data[self.size], src, elem_size * number) + self.size += write_size + + cdef void* alloc_read(self, Pool mem, size_t number, size_t elem_size) except *: + cdef void* dest = mem.alloc(number, elem_size) + self.read_into(dest, number, elem_size) + return dest + + def write_unicode(self, unicode value): + cdef bytes py_bytes = value.encode('utf8') + cdef char* chars = py_bytes + self.write(sizeof(char), len(py_bytes), chars) diff --git a/spacy/_ml.py b/spacy/_ml.py index 6d02dfd27..b07e179f0 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -1,24 +1,106 @@ import ujson -from thinc.api import add, layerize, chain, clone, concatenate, with_flatten -from thinc.neural import Model, Maxout, Softmax, Affine -from thinc.neural._classes.hash_embed import HashEmbed -from thinc.neural.ops import NumpyOps, CupyOps +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU +from thinc.i2v import HashEmbed, StaticVectors +from thinc.t2t import ExtractWindow, ParametricAttention +from thinc.t2v import Pooling, max_pool, mean_pool, sum_pool +from thinc.misc import Residual +from thinc.misc import BatchNorm as BN +from thinc.misc import LayerNorm as LN + +from thinc.api import add, layerize, chain, clone, concatenate, with_flatten +from thinc.api import FeatureExtracter, with_getitem +from thinc.api import uniqued, wrap, flatten_add_lengths, noop + +from thinc.linear.linear import LinearModel +from thinc.neural.ops import NumpyOps, CupyOps +from thinc.neural.util import get_array_module + +import random +import cytoolz -from thinc.neural._classes.convolution import ExtractWindow -from thinc.neural._classes.static_vectors import StaticVectors -from thinc.neural._classes.batchnorm import BatchNorm -from thinc.neural._classes.resnet import Residual -from thinc.neural import ReLu from thinc import describe from thinc.describe import Dimension, Synapses, Biases, Gradient from thinc.neural._classes.affine import _set_dimensions_if_needed +import thinc.extra.load_nlp -from .attrs import ID, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP +from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER from .tokens.doc import Doc +from . import util import numpy import io +# TODO: Unset this once we don't want to support models previous models. +import thinc.neural._classes.layernorm +thinc.neural._classes.layernorm.set_compat_six_eight(False) + +VECTORS_KEY = 'spacy_pretrained_vectors' + +@layerize +def _flatten_add_lengths(seqs, pad=0, drop=0.): + ops = Model.ops + lengths = ops.asarray([len(seq) for seq in seqs], dtype='i') + def finish_update(d_X, sgd=None): + return ops.unflatten(d_X, lengths, pad=pad) + X = ops.flatten(seqs, pad=pad) + return (X, lengths), finish_update + + +@layerize +def _logistic(X, drop=0.): + xp = get_array_module(X) + if not isinstance(X, xp.ndarray): + X = xp.asarray(X) + # Clip to range (-10, 10) + X = xp.minimum(X, 10., X) + X = xp.maximum(X, -10., X) + Y = 1. / (1. + xp.exp(-X)) + def logistic_bwd(dY, sgd=None): + dX = dY * (Y * (1-Y)) + return dX + return Y, logistic_bwd + + +@layerize +def add_tuples(X, drop=0.): + """Give inputs of sequence pairs, where each sequence is (vals, length), + sum the values, returning a single sequence. + + If input is: + ((vals1, length), (vals2, length) + Output is: + (vals1+vals2, length) + + vals are a single tensor for the whole batch. + """ + (vals1, length1), (vals2, length2) = X + assert length1 == length2 + + def add_tuples_bwd(dY, sgd=None): + return (dY, dY) + + return (vals1+vals2, length), add_tuples_bwd + + +def _zero_init(model): + def _zero_init_impl(self, X, y): + self.W.fill(0) + model.on_data_hooks.append(_zero_init_impl) + if model.W is not None: + model.W.fill(0.) + return model + + +@layerize +def _preprocess_doc(docs, drop=0.): + keys = [doc.to_array([LOWER]) for doc in docs] + keys = [a[:, 0] for a in keys] + ops = Model.ops + lengths = ops.asarray([arr.shape[0] for arr in keys]) + keys = ops.xp.concatenate(keys) + vals = ops.allocate(keys.shape[0]) + 1 + return (keys, vals, lengths), None + def _init_for_precomputed(W, ops): if (W**2).sum() != 0.: @@ -27,6 +109,7 @@ def _init_for_precomputed(W, ops): ops.xavier_uniform_init(reshaped) W[:] = reshaped.reshape(W.shape) + @describe.on_data(_set_dimensions_if_needed) @describe.attributes( nI=Dimension("Input size"), @@ -130,34 +213,163 @@ class PrecomputableMaxouts(Model): return dXf return Yfp, backward -def Tok2Vec(width, embed_size, preprocess=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE] - with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): - norm = get_col(cols.index(NORM)) >> HashEmbed(width, embed_size, name='embed_lower') - prefix = get_col(cols.index(PREFIX)) >> HashEmbed(width, embed_size//2, name='embed_prefix') - suffix = get_col(cols.index(SUFFIX)) >> HashEmbed(width, embed_size//2, name='embed_suffix') - shape = get_col(cols.index(SHAPE)) >> HashEmbed(width, embed_size//2, name='embed_shape') +# Thinc's Embed class is a bit broken atm, so drop this here. +from thinc import describe +from thinc.neural._classes.embed import _uniform_init - embed = (norm | prefix | suffix | shape ) - tok2vec = ( - with_flatten( - asarray(Model.ops, dtype='uint64') - >> embed - >> Maxout(width, width*4, pieces=3) - >> Residual(ExtractWindow(nW=1) >> Maxout(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> Maxout(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> Maxout(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> Maxout(width, width*3)), - pad=4) + +@describe.attributes( + nV=describe.Dimension("Number of vectors"), + nO=describe.Dimension("Size of output"), + vectors=describe.Weights("Embedding table", + lambda obj: (obj.nV, obj.nO), + _uniform_init(-0.1, 0.1) + ), + d_vectors=describe.Gradient("vectors") +) +class Embed(Model): + name = 'embed' + + def __init__(self, nO, nV=None, **kwargs): + if nV is not None: + nV += 1 + Model.__init__(self, **kwargs) + if 'name' in kwargs: + self.name = kwargs['name'] + self.column = kwargs.get('column', 0) + self.nO = nO + self.nV = nV + + def predict(self, ids): + if ids.ndim == 2: + ids = ids[:, self.column] + return self.ops.xp.ascontiguousarray(self.vectors[ids], dtype='f') + + def begin_update(self, ids, drop=0.): + if ids.ndim == 2: + ids = ids[:, self.column] + vectors = self.ops.xp.ascontiguousarray(self.vectors[ids], dtype='f') + def backprop_embed(d_vectors, sgd=None): + n_vectors = d_vectors.shape[0] + self.ops.scatter_add(self.d_vectors, ids, d_vectors) + if sgd is not None: + sgd(self._mem.weights, self._mem.gradient, key=self.id) + return None + return vectors, backprop_embed + + +def HistoryFeatures(nr_class, hist_size=8, nr_dim=8): + '''Wrap a model, adding features representing action history.''' + if hist_size == 0: + return layerize(noop()) + embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d') + for i in range(hist_size)] + embed = chain(concatenate(*embed_tables), + LN(Maxout(hist_size*nr_dim, hist_size*nr_dim))) + ops = embed.ops + def add_history_fwd(vectors_hists, drop=0.): + vectors, hist_ids = vectors_hists + hist_feats, bp_hists = embed.begin_update(hist_ids, drop=drop) + outputs = ops.xp.hstack((vectors, hist_feats)) + + def add_history_bwd(d_outputs, sgd=None): + d_vectors = d_outputs[:, :vectors.shape[1]] + d_hists = d_outputs[:, vectors.shape[1]:] + bp_hists(d_hists, sgd=sgd) + return embed.ops.xp.ascontiguousarray(d_vectors) + return outputs, add_history_bwd + return wrap(add_history_fwd, embed) + + +def drop_layer(layer, factor=2.): + def drop_layer_fwd(X, drop=0.): + if drop <= 0.: + return layer.begin_update(X, drop=drop) + else: + coinflip = layer.ops.xp.random.random() + if (coinflip / factor) >= drop: + return layer.begin_update(X, drop=drop) + else: + return X, lambda dX, sgd=None: dX + + model = wrap(drop_layer_fwd, layer) + model.predict = layer + return model + +def link_vectors_to_models(vocab): + vectors = vocab.vectors + ops = Model.ops + for word in vocab: + if word.orth in vectors.key2row: + word.rank = vectors.key2row[word.orth] + else: + word.rank = 0 + data = ops.asarray(vectors.data) + # Set an entry here, so that vectors are accessed by StaticVectors + # (unideal, I know) + thinc.extra.load_nlp.VECTORS[(ops.device, VECTORS_KEY)] = data + +def Tok2Vec(width, embed_size, **kwargs): + pretrained_dims = kwargs.get('pretrained_dims', 0) + cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 2) + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] + with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add, + '*': reapply}): + norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') + prefix = HashEmbed(width, embed_size//2, column=cols.index(PREFIX), name='embed_prefix') + suffix = HashEmbed(width, embed_size//2, column=cols.index(SUFFIX), name='embed_suffix') + shape = HashEmbed(width, embed_size//2, column=cols.index(SHAPE), name='embed_shape') + if pretrained_dims is not None and pretrained_dims >= 1: + glove = StaticVectors(VECTORS_KEY, width, column=cols.index(ID)) + + embed = uniqued( + (glove | norm | prefix | suffix | shape) + >> LN(Maxout(width, width*5, pieces=3)), column=5) + else: + embed = uniqued( + (norm | prefix | suffix | shape) + >> LN(Maxout(width, width*4, pieces=3)), column=5) + + + convolution = Residual( + ExtractWindow(nW=1) + >> LN(Maxout(width, width*3, pieces=cnn_maxout_pieces)) ) - if preprocess not in (False, None): - tok2vec = preprocess >> tok2vec + + tok2vec = ( + FeatureExtracter(cols) + >> with_flatten( + embed >> (convolution ** 4), pad=4) + ) + # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width tok2vec.embed = embed return tok2vec +def reapply(layer, n_times): + def reapply_fwd(X, drop=0.): + backprops = [] + for i in range(n_times): + Y, backprop = layer.begin_update(X, drop=drop) + X = Y + backprops.append(backprop) + def reapply_bwd(dY, sgd=None): + dX = None + for backprop in reversed(backprops): + dY = backprop(dY, sgd=sgd) + if dX is None: + dX = dY + else: + dX += dY + return dX + return Y, reapply_bwd + return wrap(reapply_fwd, layer) + + + + def asarray(ops, dtype): def forward(X, drop=0.): return ops.asarray(X, dtype=dtype), None @@ -243,7 +455,8 @@ def zero_init(model): def doc2feats(cols=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE] + if cols is None: + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] def forward(docs, drop=0.): feats = [] for doc in docs: @@ -269,6 +482,46 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.): return vectors, backward +def fine_tune(embedding, combine=None): + if combine is not None: + raise NotImplementedError( + "fine_tune currently only supports addition. Set combine=None") + def fine_tune_fwd(docs_tokvecs, drop=0.): + docs, tokvecs = docs_tokvecs + + lengths = model.ops.asarray([len(doc) for doc in docs], dtype='i') + + vecs, bp_vecs = embedding.begin_update(docs, drop=drop) + flat_tokvecs = embedding.ops.flatten(tokvecs) + flat_vecs = embedding.ops.flatten(vecs) + output = embedding.ops.unflatten( + (model.mix[0] * flat_tokvecs + model.mix[1] * flat_vecs), lengths) + + def fine_tune_bwd(d_output, sgd=None): + flat_grad = model.ops.flatten(d_output) + model.d_mix[0] += flat_tokvecs.dot(flat_grad.T).sum() + model.d_mix[1] += flat_vecs.dot(flat_grad.T).sum() + + bp_vecs([d_o * model.mix[1] for d_o in d_output], sgd=sgd) + if sgd is not None: + sgd(model._mem.weights, model._mem.gradient, key=model.id) + return [d_o * model.mix[0] for d_o in d_output] + return output, fine_tune_bwd + + def fine_tune_predict(docs_tokvecs): + docs, tokvecs = docs_tokvecs + vecs = embedding(docs) + return [model.mix[0]*tv+model.mix[1]*v + for tv, v in zip(tokvecs, vecs)] + + model = wrap(fine_tune_fwd, embedding) + model.mix = model._mem.add((model.id, 'mix'), (2,)) + model.mix.fill(0.5) + model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) + model.predict = fine_tune_predict + return model + + @layerize def flatten(seqs, drop=0.): if isinstance(seqs[0], numpy.ndarray): @@ -282,3 +535,211 @@ def flatten(seqs, drop=0.): return ops.unflatten(d_X, lengths) X = ops.xp.vstack(seqs) return X, finish_update + + +@layerize +def logistic(X, drop=0.): + xp = get_array_module(X) + if not isinstance(X, xp.ndarray): + X = xp.asarray(X) + # Clip to range (-10, 10) + X = xp.minimum(X, 10., X) + X = xp.maximum(X, -10., X) + Y = 1. / (1. + xp.exp(-X)) + def logistic_bwd(dY, sgd=None): + dX = dY * (Y * (1-Y)) + return dX + return Y, logistic_bwd + + +def zero_init(model): + def _zero_init_impl(self, X, y): + self.W.fill(0) + model.on_data_hooks.append(_zero_init_impl) + return model + +@layerize +def preprocess_doc(docs, drop=0.): + keys = [doc.to_array([LOWER]) for doc in docs] + keys = [a[:, 0] for a in keys] + ops = Model.ops + lengths = ops.asarray([arr.shape[0] for arr in keys]) + keys = ops.xp.concatenate(keys) + vals = ops.allocate(keys.shape[0]) + 1 + return (keys, vals, lengths), None + +def getitem(i): + def getitem_fwd(X, drop=0.): + return X[i], None + return layerize(getitem_fwd) + +def build_tagger_model(nr_class, **cfg): + embed_size = util.env_opt('embed_size', 7000) + if 'token_vector_width' in cfg: + token_vector_width = cfg['token_vector_width'] + else: + token_vector_width = util.env_opt('token_vector_width', 128) + pretrained_dims = cfg.get('pretrained_dims', 0) + with Model.define_operators({'>>': chain, '+': add}): + if 'tok2vec' in cfg: + tok2vec = cfg['tok2vec'] + else: + tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=pretrained_dims) + model = ( + tok2vec + >> with_flatten(Softmax(nr_class, token_vector_width)) + ) + model.nI = None + model.tok2vec = tok2vec + return model + + +@layerize +def SpacyVectors(docs, drop=0.): + xp = get_array_module(docs[0].vocab.vectors.data) + width = docs[0].vocab.vectors.data.shape[1] + batch = [] + for doc in docs: + indices = numpy.zeros((len(doc),), dtype='i') + for i, word in enumerate(doc): + if word.orth in doc.vocab.vectors.key2row: + indices[i] = doc.vocab.vectors.key2row[word.orth] + else: + indices[i] = 0 + vectors = doc.vocab.vectors.data[indices] + batch.append(vectors) + return batch, None + + +def foreach(layer, drop_factor=1.0): + '''Map a layer across elements in a list''' + def foreach_fwd(Xs, drop=0.): + drop *= drop_factor + ys = [] + backprops = [] + for X in Xs: + y, bp_y = layer.begin_update(X, drop=drop) + ys.append(y) + backprops.append(bp_y) + def foreach_bwd(d_ys, sgd=None): + d_Xs = [] + for d_y, bp_y in zip(d_ys, backprops): + if bp_y is not None and bp_y is not None: + d_Xs.append(d_y, sgd=sgd) + else: + d_Xs.append(None) + return d_Xs + return ys, foreach_bwd + model = wrap(foreach_fwd, layer) + return model + + +def build_text_classifier(nr_class, width=64, **cfg): + nr_vector = cfg.get('nr_vector', 5000) + pretrained_dims = cfg.get('pretrained_dims', 0) + with Model.define_operators({'>>': chain, '+': add, '|': concatenate, + '**': clone}): + if cfg.get('low_data'): + model = ( + SpacyVectors + >> flatten_add_lengths + >> with_getitem(0, + Affine(width, pretrained_dims) + ) + >> ParametricAttention(width) + >> Pooling(sum_pool) + >> Residual(ReLu(width, width)) ** 2 + >> zero_init(Affine(nr_class, width, drop_factor=0.0)) + >> logistic + ) + return model + + + lower = HashEmbed(width, nr_vector, column=1) + prefix = HashEmbed(width//2, nr_vector, column=2) + suffix = HashEmbed(width//2, nr_vector, column=3) + shape = HashEmbed(width//2, nr_vector, column=4) + + trained_vectors = ( + FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE, ID]) + >> with_flatten( + uniqued( + (lower | prefix | suffix | shape) + >> LN(Maxout(width, width+(width//2)*3)), + column=0 + ) + ) + ) + + if pretrained_dims: + static_vectors = ( + SpacyVectors + >> with_flatten(Affine(width, pretrained_dims)) + ) + # TODO Make concatenate support lists + vectors = concatenate_lists(trained_vectors, static_vectors) + vectors_width = width*2 + else: + vectors = trained_vectors + vectors_width = width + static_vectors = None + cnn_model = ( + vectors + >> with_flatten( + LN(Maxout(width, vectors_width)) + >> Residual( + (ExtractWindow(nW=1) >> LN(Maxout(width, width*3))) + ) ** 2, pad=2 + ) + >> flatten_add_lengths + >> ParametricAttention(width) + >> Pooling(sum_pool) + >> Residual(zero_init(Maxout(width, width))) + >> zero_init(Affine(nr_class, width, drop_factor=0.0)) + ) + + linear_model = ( + _preprocess_doc + >> LinearModel(nr_class, drop_factor=0.) + ) + + model = ( + (linear_model | cnn_model) + >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0)) + >> logistic + ) + model.nO = nr_class + model.lsuv = False + return model + +@layerize +def flatten(seqs, drop=0.): + ops = Model.ops + lengths = ops.asarray([len(seq) for seq in seqs], dtype='i') + def finish_update(d_X, sgd=None): + return ops.unflatten(d_X, lengths, pad=0) + X = ops.flatten(seqs, pad=0) + return X, finish_update + + +def concatenate_lists(*layers, **kwargs): # pragma: no cover + '''Compose two or more models `f`, `g`, etc, such that their outputs are + concatenated, i.e. `concatenate(f, g)(x)` computes `hstack(f(x), g(x))` + ''' + if not layers: + return noop() + drop_factor = kwargs.get('drop_factor', 1.0) + ops = layers[0].ops + layers = [chain(layer, flatten) for layer in layers] + concat = concatenate(*layers) + def concatenate_lists_fwd(Xs, drop=0.): + drop *= drop_factor + lengths = ops.asarray([len(X) for X in Xs], dtype='i') + flat_y, bp_flat_y = concat.begin_update(Xs, drop=drop) + ys = ops.unflatten(flat_y, lengths) + def concatenate_lists_bwd(d_ys, sgd=None): + return bp_flat_y(ops.flatten(d_ys), sgd=sgd) + return ys, concatenate_lists_bwd + model = wrap(concatenate_lists_fwd, concat) + return model diff --git a/spacy/about.py b/spacy/about.py index 8364dcfc9..699b61aff 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,14 +3,15 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a1' +__version__ = '2.0.0a17' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' __email__ = 'contact@explosion.ai' __license__ = 'MIT' +__release__ = False -__docs_models__ = 'https://spacy.io/docs/usage/models' +__docs_models__ = 'https://alpha.spacy.io/usage/models' __download_url__ = 'https://github.com/explosion/spacy-models/releases/download' __compatibility__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/compatibility.json' __shortcuts__ = 'https://raw.githubusercontent.com/explosion/spacy-models/master/shortcuts.json' diff --git a/spacy/attrs.pxd b/spacy/attrs.pxd index a8ee9cac0..74397fa64 100644 --- a/spacy/attrs.pxd +++ b/spacy/attrs.pxd @@ -1,5 +1,5 @@ # Reserve 64 values for flag features -cpdef enum attr_id_t: +cdef enum attr_id_t: NULL_ATTR IS_ALPHA IS_ASCII diff --git a/spacy/attrs.pyx b/spacy/attrs.pyx index ba95e1e72..8efd9e189 100644 --- a/spacy/attrs.pyx +++ b/spacy/attrs.pyx @@ -94,6 +94,7 @@ IDS = { # ATTR IDs, in order of the symbol NAMES = [key for key, value in sorted(IDS.items(), key=lambda item: item[1])] +locals().update(IDS) def intify_attrs(stringy_attrs, strings_map=None, _do_deprecated=False): diff --git a/spacy/cli/__init__.py b/spacy/cli/__init__.py index 2b4f98a88..2595dcc03 100644 --- a/spacy/cli/__init__.py +++ b/spacy/cli/__init__.py @@ -2,5 +2,9 @@ from .download import download from .info import info from .link import link from .package import package +from .profile import profile from .train import train +from .evaluate import evaluate from .convert import convert +from .model import model +from .validate import validate diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index a0a76e5ec..d9a812a15 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import plac from pathlib import Path -from .converters import conllu2json, iob2json +from .converters import conllu2json, iob2json, conll_ner2json from ..util import prints # Converters are matched by file extension. To add a converter, add a new entry @@ -12,19 +12,22 @@ from ..util import prints # from /converters. CONVERTERS = { - '.conllu': conllu2json, - '.conll': conllu2json, - '.iob': iob2json + 'conllu': conllu2json, + 'conll': conllu2json, + 'ner': conll_ner2json, + 'iob': iob2json, } @plac.annotations( input_file=("input file", "positional", None, str), output_dir=("output directory for converted file", "positional", None, str), - n_sents=("Number of sentences per doc", "option", "n", float), + n_sents=("Number of sentences per doc", "option", "n", int), + converter=("Name of converter (auto, iob, conllu or ner)", "option", "c", str), morphology=("Enable appending morphology to tags", "flag", "m", bool) ) -def convert(cmd, input_file, output_dir, n_sents, morphology): +def convert(cmd, input_file, output_dir, n_sents=1, morphology=False, + converter='auto'): """ Convert files into JSON format for use with train command and other experiment management functions. @@ -35,9 +38,11 @@ def convert(cmd, input_file, output_dir, n_sents, morphology): prints(input_path, title="Input file not found", exits=1) if not output_path.exists(): prints(output_path, title="Output directory not found", exits=1) - file_ext = input_path.suffix - if not file_ext in CONVERTERS: - prints("Can't find converter for %s" % input_path.parts[-1], - title="Unknown format", exits=1) - CONVERTERS[file_ext](input_path, output_path, - n_sents=n_sents, use_morphology=morphology) + if converter == 'auto': + converter = input_path.suffix[1:] + if not converter in CONVERTERS: + prints("Can't find converter for %s" % converter, + title="Unknown format", exits=1) + func = CONVERTERS[converter] + func(input_path, output_path, + n_sents=n_sents, use_morphology=morphology) diff --git a/spacy/cli/converters/__init__.py b/spacy/cli/converters/__init__.py index 9026d16c6..02b596d4d 100644 --- a/spacy/cli/converters/__init__.py +++ b/spacy/cli/converters/__init__.py @@ -1,2 +1,3 @@ from .conllu2json import conllu2json from .iob2json import iob2json +from .conll_ner2json import conll_ner2json diff --git a/spacy/cli/converters/conll_ner2json.py b/spacy/cli/converters/conll_ner2json.py new file mode 100644 index 000000000..e3bd82e7e --- /dev/null +++ b/spacy/cli/converters/conll_ner2json.py @@ -0,0 +1,50 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...compat import json_dumps, path2str +from ...util import prints +from ...gold import iob_to_biluo + + +def conll_ner2json(input_path, output_path, n_sents=10, use_morphology=False): + """ + Convert files in the CoNLL-2003 NER format into JSON format for use with train cli. + """ + docs = read_conll_ner(input_path) + + output_filename = input_path.parts[-1].replace(".conll", "") + ".json" + output_filename = input_path.parts[-1].replace(".conll", "") + ".json" + output_file = output_path / output_filename + with output_file.open('w', encoding='utf-8') as f: + f.write(json_dumps(docs)) + prints("Created %d documents" % len(docs), + title="Generated output file %s" % path2str(output_file)) + + +def read_conll_ner(input_path): + text = input_path.open('r', encoding='utf-8').read() + i = 0 + delimit_docs = '-DOCSTART- -X- O O' + output_docs = [] + for doc in text.strip().split(delimit_docs): + doc = doc.strip() + if not doc: + continue + output_doc = [] + for sent in doc.split('\n\n'): + sent = sent.strip() + if not sent: + continue + lines = [line.strip() for line in sent.split('\n') if line.strip()] + words, tags, chunks, iob_ents = zip(*[line.split() for line in lines]) + biluo_ents = iob_to_biluo(iob_ents) + output_doc.append({'tokens': [ + {'orth': w, 'tag': tag, 'ner': ent} for (w, tag, ent) in + zip(words, tags, biluo_ents) + ]}) + output_docs.append({ + 'id': len(output_docs), + 'paragraphs': [{'sentences': output_doc}] + }) + output_doc = [] + return output_docs diff --git a/spacy/cli/converters/conllu2json.py b/spacy/cli/converters/conllu2json.py index 618810584..4d3fb58e4 100644 --- a/spacy/cli/converters/conllu2json.py +++ b/spacy/cli/converters/conllu2json.py @@ -73,10 +73,10 @@ def generate_sentence(sent): tokens = [] for i, id in enumerate(id_): token = {} - token["orth"] = word[id] - token["tag"] = tag[id] - token["head"] = head[id] - i - token["dep"] = dep[id] + token["orth"] = word[i] + token["tag"] = tag[i] + token["head"] = head[i] - id + token["dep"] = dep[i] tokens.append(token) sentence["tokens"] = tokens return sentence diff --git a/spacy/cli/converters/iob2json.py b/spacy/cli/converters/iob2json.py index 4849345e9..74bc22ada 100644 --- a/spacy/cli/converters/iob2json.py +++ b/spacy/cli/converters/iob2json.py @@ -1,5 +1,6 @@ # coding: utf8 from __future__ import unicode_literals +from cytoolz import partition_all, concat from ...compat import json_dumps, path2str from ...util import prints @@ -10,11 +11,9 @@ def iob2json(input_path, output_path, n_sents=10, *a, **k): """ Convert IOB files into JSON format for use with train cli. """ - # TODO: This isn't complete yet -- need to map from IOB to - # BILUO with input_path.open('r', encoding='utf8') as file_: - docs = read_iob(file_) - + sentences = read_iob(file_) + docs = merge_sentences(sentences, n_sents) output_filename = input_path.parts[-1].replace(".iob", ".json") output_file = output_path / output_filename with output_file.open('w', encoding='utf-8') as f: @@ -23,9 +22,9 @@ def iob2json(input_path, output_path, n_sents=10, *a, **k): title="Generated output file %s" % path2str(output_file)) -def read_iob(file_): +def read_iob(raw_sents): sentences = [] - for line in file_: + for line in raw_sents: if not line.strip(): continue tokens = [t.split('|') for t in line.split()] @@ -43,3 +42,15 @@ def read_iob(file_): paragraphs = [{'sentences': [sent]} for sent in sentences] docs = [{'id': 0, 'paragraphs': [para]} for para in paragraphs] return docs + +def merge_sentences(docs, n_sents): + counter = 0 + merged = [] + for group in partition_all(n_sents, docs): + group = list(group) + first = group.pop(0) + to_extend = first['paragraphs'][0]['sentences'] + for sent in group[1:]: + to_extend.extend(sent['paragraphs'][0]['sentences']) + merged.append(first) + return merged diff --git a/spacy/cli/download.py b/spacy/cli/download.py index b6e5549da..28ae07865 100644 --- a/spacy/cli/download.py +++ b/spacy/cli/download.py @@ -8,7 +8,7 @@ import subprocess import sys from .link import link -from ..util import prints +from ..util import prints, get_package_path from .. import about @@ -24,24 +24,29 @@ def download(cmd, model, direct=False): with version. """ if direct: - download_model('{m}/{m}.tar.gz'.format(m=model)) + dl = download_model('{m}/{m}.tar.gz'.format(m=model)) else: shortcuts = get_json(about.__shortcuts__, "available shortcuts") model_name = shortcuts.get(model, model) compatibility = get_compatibility() version = get_version(model_name, compatibility) - download_model('{m}-{v}/{m}-{v}.tar.gz'.format(m=model_name, v=version)) - try: - link(None, model_name, model, force=True) - except: - # Dirty, but since spacy.download and the auto-linking is mostly - # a convenience wrapper, it's best to show a success message and - # loading instructions, even if linking fails. - prints("Creating a shortcut link for 'en' didn't work (maybe you " - "don't have admin permissions?), but you can still load " - "the model via its full package name:", - "nlp = spacy.load('%s')" % model_name, - title="Download successful") + dl = download_model('{m}-{v}/{m}-{v}.tar.gz'.format(m=model_name, v=version)) + if dl == 0: + try: + # Get package path here because link uses + # pip.get_installed_distributions() to check if model is a package, + # which fails if model was just installed via subprocess + package_path = get_package_path(model_name) + link(None, model_name, model, force=True, model_path=package_path) + except: + # Dirty, but since spacy.download and the auto-linking is mostly + # a convenience wrapper, it's best to show a success message and + # loading instructions, even if linking fails. + prints("Creating a shortcut link for 'en' didn't work (maybe you " + "don't have admin permissions?), but you can still load " + "the model via its full package name:", + "nlp = spacy.load('%s')" % model_name, + title="Download successful") def get_json(url, desc): @@ -73,6 +78,6 @@ def get_version(model, comp): def download_model(filename): download_url = about.__download_url__ + '/' + filename - subprocess.call([sys.executable, '-m', + return subprocess.call([sys.executable, '-m', 'pip', 'install', '--no-cache-dir', download_url], env=os.environ.copy()) diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py new file mode 100644 index 000000000..29e30b7d2 --- /dev/null +++ b/spacy/cli/evaluate.py @@ -0,0 +1,120 @@ +# coding: utf8 +from __future__ import unicode_literals, division, print_function + +import plac +import json +from collections import defaultdict +import cytoolz +from pathlib import Path +import dill +import tqdm +from thinc.neural._classes.model import Model +from thinc.neural.optimizers import linear_decay +from timeit import default_timer as timer +import random +import numpy.random + +from ..tokens.doc import Doc +from ..scorer import Scorer +from ..gold import GoldParse, merge_sents +from ..gold import GoldCorpus, minibatch +from ..util import prints +from .. import util +from .. import about +from .. import displacy +from ..compat import json_dumps + +random.seed(0) +numpy.random.seed(0) + + +@plac.annotations( + model=("Model name or path", "positional", None, str), + data_path=("Location of JSON-formatted evaluation data", "positional", None, str), + gold_preproc=("Use gold preprocessing", "flag", "G", bool), + gpu_id=("Use GPU", "option", "g", int), + displacy_path=("Directory to output rendered parses as HTML", "option", "dp", str), + displacy_limit=("Limit of parses to render as HTML", "option", "dl", int) +) +def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False, + displacy_path=None, displacy_limit=25): + """ + Evaluate a model. To render a sample of parses in a HTML file, set an output + directory as the displacy_path argument. + """ + if gpu_id >= 0: + util.use_gpu(gpu_id) + util.set_env_log(False) + data_path = util.ensure_path(data_path) + displacy_path = util.ensure_path(displacy_path) + if not data_path.exists(): + prints(data_path, title="Evaluation data not found", exits=1) + if displacy_path and not displacy_path.exists(): + prints(displacy_path, title="Visualization output directory not found", exits=1) + corpus = GoldCorpus(data_path, data_path) + nlp = util.load_model(model) + dev_docs = list(corpus.dev_docs(nlp, gold_preproc=gold_preproc)) + begin = timer() + scorer = nlp.evaluate(dev_docs, verbose=False) + end = timer() + nwords = sum(len(doc_gold[0]) for doc_gold in dev_docs) + print_results(scorer, time=end - begin, words=nwords, + wps=nwords / (end - begin)) + if displacy_path: + docs, golds = zip(*dev_docs) + render_deps = 'parser' in nlp.meta.get('pipeline', []) + render_ents = 'ner' in nlp.meta.get('pipeline', []) + render_parses(docs, displacy_path, model_name=model, limit=displacy_limit, + deps=render_deps, ents=render_ents) + prints(displacy_path, title="Generated %s parses as HTML" % displacy_limit) + + +def render_parses(docs, output_path, model_name='', limit=250, deps=True, ents=True): + docs[0].user_data['title'] = model_name + if ents: + with (output_path / 'entities.html').open('w') as file_: + html = displacy.render(docs[:limit], style='ent', page=True) + file_.write(html) + if deps: + with (output_path / 'parses.html').open('w') as file_: + html = displacy.render(docs[:limit], style='dep', page=True, options={'compact': True}) + file_.write(html) + + +def print_progress(itn, losses, dev_scores, wps=0.0): + scores = {} + for col in ['dep_loss', 'tag_loss', 'uas', 'tags_acc', 'token_acc', + 'ents_p', 'ents_r', 'ents_f', 'wps']: + scores[col] = 0.0 + scores['dep_loss'] = losses.get('parser', 0.0) + scores['ner_loss'] = losses.get('ner', 0.0) + scores['tag_loss'] = losses.get('tagger', 0.0) + scores.update(dev_scores) + scores['wps'] = wps + tpl = '\t'.join(( + '{:d}', + '{dep_loss:.3f}', + '{ner_loss:.3f}', + '{uas:.3f}', + '{ents_p:.3f}', + '{ents_r:.3f}', + '{ents_f:.3f}', + '{tags_acc:.3f}', + '{token_acc:.3f}', + '{wps:.1f}')) + print(tpl.format(itn, **scores)) + + +def print_results(scorer, time, words, wps): + results = { + 'Time': '%.2f s' % time, + 'Words': words, + 'Words/s': '%.0f' % wps, + 'TOK': '%.2f' % scorer.token_acc, + 'POS': '%.2f' % scorer.tags_acc, + 'UAS': '%.2f' % scorer.uas, + 'LAS': '%.2f' % scorer.las, + 'NER P': '%.2f' % scorer.ents_p, + 'NER R': '%.2f' % scorer.ents_r, + 'NER F': '%.2f' % scorer.ents_f} + util.print_table(results, title="Results") diff --git a/spacy/cli/link.py b/spacy/cli/link.py index a8ee01565..712a05aee 100644 --- a/spacy/cli/link.py +++ b/spacy/cli/link.py @@ -14,7 +14,7 @@ from .. import util link_name=("name of shortuct link to create", "positional", None, str), force=("force overwriting of existing link", "flag", "f", bool) ) -def link(cmd, origin, link_name, force=False): +def link(cmd, origin, link_name, force=False, model_path=None): """ Create a symlink for models within the spacy/data directory. Accepts either the name of a pip package, or the local path to the model data @@ -23,7 +23,7 @@ def link(cmd, origin, link_name, force=False): if util.is_package(origin): model_path = util.get_package_path(origin) else: - model_path = Path(origin) + model_path = Path(origin) if model_path is None else Path(model_path) if not model_path.exists(): prints("The data should be located in %s" % path2str(model_path), title="Can't locate model data", exits=1) diff --git a/spacy/cli/model.py b/spacy/cli/model.py new file mode 100644 index 000000000..14e75647e --- /dev/null +++ b/spacy/cli/model.py @@ -0,0 +1,137 @@ +# coding: utf8 +from __future__ import unicode_literals + +import bz2 +import gzip +import math +from ast import literal_eval +from pathlib import Path + +import numpy as np +import spacy +from preshed.counter import PreshCounter + +from .. import util +from ..compat import fix_text + + +def model(cmd, lang, model_dir, freqs_data, clusters_data, vectors_data, + min_doc_freq=5, min_word_freq=200): + model_path = Path(model_dir) + freqs_path = Path(freqs_data) + clusters_path = Path(clusters_data) if clusters_data else None + vectors_path = Path(vectors_data) if vectors_data else None + + check_dirs(freqs_path, clusters_path, vectors_path) + vocab = util.get_lang_class(lang).Defaults.create_vocab() + nlp = spacy.blank(lang) + vocab = nlp.vocab + probs, oov_prob = read_probs( + freqs_path, min_doc_freq=int(min_doc_freq), min_freq=int(min_doc_freq)) + clusters = read_clusters(clusters_path) if clusters_path else {} + populate_vocab(vocab, clusters, probs, oov_prob) + add_vectors(vocab, vectors_path) + create_model(model_path, nlp) + + +def add_vectors(vocab, vectors_path): + with bz2.BZ2File(vectors_path.as_posix()) as f: + num_words, dim = next(f).split() + vocab.clear_vectors(int(dim)) + for line in f: + word_w_vector = line.decode("utf8").strip().split(" ") + word = word_w_vector[0] + vector = np.array([float(val) for val in word_w_vector[1:]]) + if word in vocab: + vocab.set_vector(word, vector) + + +def create_model(model_path, model): + if not model_path.exists(): + model_path.mkdir() + model.to_disk(model_path.as_posix()) + + +def read_probs(freqs_path, max_length=100, min_doc_freq=5, min_freq=200): + counts = PreshCounter() + total = 0 + freqs_file = check_unzip(freqs_path) + for i, line in enumerate(freqs_file): + freq, doc_freq, key = line.rstrip().split('\t', 2) + freq = int(freq) + counts.inc(i + 1, freq) + total += freq + counts.smooth() + log_total = math.log(total) + freqs_file = check_unzip(freqs_path) + probs = {} + for line in freqs_file: + freq, doc_freq, key = line.rstrip().split('\t', 2) + doc_freq = int(doc_freq) + freq = int(freq) + if doc_freq >= min_doc_freq and freq >= min_freq and len( + key) < max_length: + word = literal_eval(key) + smooth_count = counts.smoother(int(freq)) + probs[word] = math.log(smooth_count) - log_total + oov_prob = math.log(counts.smoother(0)) - log_total + return probs, oov_prob + + +def read_clusters(clusters_path): + clusters = {} + with clusters_path.open() as f: + for line in f: + try: + cluster, word, freq = line.split() + word = fix_text(word) + except ValueError: + continue + # If the clusterer has only seen the word a few times, its + # cluster is unreliable. + if int(freq) >= 3: + clusters[word] = cluster + else: + clusters[word] = '0' + # Expand clusters with re-casing + for word, cluster in list(clusters.items()): + if word.lower() not in clusters: + clusters[word.lower()] = cluster + if word.title() not in clusters: + clusters[word.title()] = cluster + if word.upper() not in clusters: + clusters[word.upper()] = cluster + return clusters + + +def populate_vocab(vocab, clusters, probs, oov_prob): + for word, prob in reversed( + sorted(list(probs.items()), key=lambda item: item[1])): + lexeme = vocab[word] + lexeme.prob = prob + lexeme.is_oov = False + # Decode as a little-endian string, so that we can do & 15 to get + # the first 4 bits. See _parse_features.pyx + if word in clusters: + lexeme.cluster = int(clusters[word][::-1], 2) + else: + lexeme.cluster = 0 + + +def check_unzip(file_path): + file_path_str = file_path.as_posix() + if file_path_str.endswith('gz'): + return gzip.open(file_path_str) + else: + return file_path.open() + + +def check_dirs(freqs_data, clusters_data, vectors_data): + if not freqs_data.is_file(): + util.sys_exit(freqs_data.as_posix(), title="No frequencies file found") + if clusters_data and not clusters_data.is_file(): + util.sys_exit( + clusters_data.as_posix(), title="No Brown clusters file found") + if vectors_data and not vectors_data.is_file(): + util.sys_exit( + vectors_data.as_posix(), title="No word vectors file found") diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 1c720c2b5..5ffc493c3 100644 --- a/spacy/cli/package.py +++ b/spacy/cli/package.py @@ -15,10 +15,11 @@ from .. import about @plac.annotations( input_dir=("directory with model data", "positional", None, str), output_dir=("output parent directory", "positional", None, str), - meta=("path to meta.json", "option", "m", str), + meta_path=("path to meta.json", "option", "m", str), + create_meta=("create meta.json, even if one exists in directory", "flag", "c", bool), force=("force overwriting of existing folder in output directory", "flag", "f", bool) ) -def package(cmd, input_dir, output_dir, meta=None, force=False): +def package(cmd, input_dir, output_dir, meta_path=None, create_meta=False, force=False): """ Generate Python package for model data, including meta and required installation files. A new directory will be created in the specified @@ -26,7 +27,7 @@ def package(cmd, input_dir, output_dir, meta=None, force=False): """ input_path = util.ensure_path(input_dir) output_path = util.ensure_path(output_dir) - meta_path = util.ensure_path(meta) + meta_path = util.ensure_path(meta_path) if not input_path or not input_path.exists(): prints(input_path, title="Model directory not found", exits=1) if not output_path or not output_path.exists(): @@ -38,7 +39,7 @@ def package(cmd, input_dir, output_dir, meta=None, force=False): template_manifest = get_template('MANIFEST.in') template_init = get_template('xx_model_name/__init__.py') meta_path = meta_path or input_path / 'meta.json' - if meta_path.is_file(): + if not create_meta and meta_path.is_file(): prints(meta_path, title="Reading meta.json from file") meta = util.read_json(meta_path) else: @@ -100,12 +101,15 @@ def generate_meta(): def generate_pipeline(): prints("If set to 'True', the default pipeline is used. If set to 'False', " "the pipeline will be disabled. Components should be specified as a " - "comma-separated list of component names, e.g. vectorizer, tagger, " + "comma-separated list of component names, e.g. tensorizer, tagger, " "parser, ner. For more information, see the docs on processing pipelines.", title="Enter your model's pipeline components") pipeline = util.get_raw_input("Pipeline components", True) - replace = {'True': True, 'False': False} - return replace[pipeline] if pipeline in replace else pipeline.split(', ') + subs = {'True': True, 'False': False} + if pipeline in subs: + return subs[pipeline] + else: + return [p.strip() for p in pipeline.split(',')] def validate_meta(meta, keys): diff --git a/spacy/cli/profile.py b/spacy/cli/profile.py new file mode 100644 index 000000000..db6fc5b41 --- /dev/null +++ b/spacy/cli/profile.py @@ -0,0 +1,45 @@ +# coding: utf8 +from __future__ import unicode_literals, division, print_function + +import plac +from pathlib import Path +import ujson +import cProfile +import pstats + +import spacy +import sys +import tqdm +import cytoolz + + +def read_inputs(loc): + if loc is None: + file_ = sys.stdin + file_ = (line.encode('utf8') for line in file_) + else: + file_ = Path(loc).open() + for line in file_: + data = ujson.loads(line) + text = data['text'] + yield text + + +@plac.annotations( + lang=("model/language", "positional", None, str), + inputs=("Location of input file", "positional", None, read_inputs) +) +def profile(cmd, lang, inputs=None): + """ + Profile a spaCy pipeline, to find out which functions take the most time. + """ + nlp = spacy.load(lang) + texts = list(cytoolz.take(10000, inputs)) + cProfile.runctx("parse_texts(nlp, texts)", globals(), locals(), "Profile.prof") + s = pstats.Stats("Profile.prof") + s.strip_dirs().sort_stats("time").print_stats() + + +def parse_texts(nlp, texts): + for doc in nlp.pipe(tqdm.tqdm(texts), batch_size=128): + pass diff --git a/spacy/cli/train.py b/spacy/cli/train.py index af028dae5..2faea72e7 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -8,8 +8,11 @@ import cytoolz from pathlib import Path import dill import tqdm +from thinc.neural._classes.model import Model from thinc.neural.optimizers import linear_decay from timeit import default_timer as timer +import random +import numpy.random from ..tokens.doc import Doc from ..scorer import Scorer @@ -17,9 +20,13 @@ from ..gold import GoldParse, merge_sents from ..gold import GoldCorpus, minibatch from ..util import prints from .. import util +from .. import about from .. import displacy from ..compat import json_dumps +random.seed(0) +numpy.random.seed(0) + @plac.annotations( lang=("model language", "positional", None, str), @@ -29,13 +36,17 @@ from ..compat import json_dumps n_iter=("number of iterations", "option", "n", int), n_sents=("number of sentences", "option", "ns", int), use_gpu=("Use GPU", "option", "g", int), - resume=("Whether to resume training", "flag", "R", bool), + vectors=("Model to load vectors from", "option", "v"), no_tagger=("Don't train tagger", "flag", "T", bool), no_parser=("Don't train parser", "flag", "P", bool), - no_entities=("Don't train NER", "flag", "N", bool) + no_entities=("Don't train NER", "flag", "N", bool), + gold_preproc=("Use gold preprocessing", "flag", "G", bool), + version=("Model version", "option", "V", str), + meta_path=("Optional path to meta.json. All relevant properties will be overwritten.", "option", "m", Path) ) -def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, - use_gpu=-1, resume=False, no_tagger=False, no_parser=False, no_entities=False): +def train(cmd, lang, output_dir, train_data, dev_data, n_iter=30, n_sents=0, + use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False, + gold_preproc=False, version="0.0.0", meta_path=None): """ Train a model. Expects data in spaCy's JSON format. """ @@ -44,19 +55,26 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, output_path = util.ensure_path(output_dir) train_path = util.ensure_path(train_data) dev_path = util.ensure_path(dev_data) + meta_path = util.ensure_path(meta_path) if not output_path.exists(): output_path.mkdir() if not train_path.exists(): prints(train_path, title="Training data not found", exits=1) if dev_path and not dev_path.exists(): prints(dev_path, title="Development data not found", exits=1) + if meta_path is not None and not meta_path.exists(): + prints(meta_path, title="meta.json not found", exits=1) + meta = util.read_json(meta_path) if meta_path else {} + if not isinstance(meta, dict): + prints("Expected dict but got: {}".format(type(meta)), + title="Not a valid meta.json format", exits=1) + meta.setdefault('lang', lang) + meta.setdefault('name', 'unnamed') - lang_class = util.get_lang_class(lang) - - pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] - if no_tagger and 'tags' in pipeline: pipeline.remove('tags') - if no_parser and 'dependencies' in pipeline: pipeline.remove('dependencies') - if no_entities and 'entities' in pipeline: pipeline.remove('entities') + pipeline = ['tagger', 'parser', 'ner'] + if no_tagger and 'tagger' in pipeline: pipeline.remove('tagger') + if no_parser and 'parser' in pipeline: pipeline.remove('parser') + if no_entities and 'ner' in pipeline: pipeline.remove('ner') # Take dropout and batch size as generators of values -- dropout # starts high and decays sharply, to force the optimizer to explore. @@ -66,27 +84,29 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.env_opt('dropout_to', 0.2), util.env_opt('dropout_decay', 0.0)) batch_sizes = util.compounding(util.env_opt('batch_from', 1), - util.env_opt('batch_to', 64), + util.env_opt('batch_to', 16), util.env_opt('batch_compound', 1.001)) - - if resume: - prints(output_path / 'model19.pickle', title="Resuming training") - nlp = dill.load((output_path / 'model19.pickle').open('rb')) - else: - nlp = lang_class(pipeline=pipeline) corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() + lang_class = util.get_lang_class(lang) + nlp = lang_class() + meta['pipeline'] = pipeline + nlp.meta.update(meta) + if vectors: + util.load_model(vectors, vocab=nlp.vocab) + for name in pipeline: + nlp.add_pipe(nlp.create_pipe(name), name=name) optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) + nlp._optimizer = None - print("Itn.\tLoss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") + print("Itn.\tP.Loss\tN.Loss\tUAS\tNER P.\tNER R.\tNER F.\tTag %\tToken %") try: + train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, + gold_preproc=gold_preproc, max_length=0) + train_docs = list(train_docs) for i in range(n_iter): - if resume: - i += 20 with tqdm.tqdm(total=n_train_words, leave=False) as pbar: - train_docs = corpus.train_docs(nlp, projectivize=True, - gold_preproc=False, max_length=0) losses = {} for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) @@ -98,24 +118,51 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.set_env_log(False) epoch_model_path = output_path / ('model%d' % i) nlp.to_disk(epoch_model_path) - with (output_path / ('model%d.pickle' % i)).open('wb') as file_: - dill.dump(nlp, file_, -1) - nlp_loaded = lang_class(pipeline=pipeline) - nlp_loaded = nlp_loaded.from_disk(epoch_model_path) - scorer = nlp_loaded.evaluate( - corpus.dev_docs( + nlp_loaded = util.load_model_from_path(epoch_model_path) + dev_docs = list(corpus.dev_docs( nlp_loaded, - gold_preproc=False)) + gold_preproc=gold_preproc)) + nwords = sum(len(doc_gold[0]) for doc_gold in dev_docs) + start_time = timer() + scorer = nlp_loaded.evaluate(dev_docs) + end_time = timer() + if use_gpu < 0: + gpu_wps = None + cpu_wps = nwords/(end_time-start_time) + else: + gpu_wps = nwords/(end_time-start_time) + with Model.use_device('cpu'): + nlp_loaded = util.load_model_from_path(epoch_model_path) + dev_docs = list(corpus.dev_docs( + nlp_loaded, gold_preproc=gold_preproc)) + start_time = timer() + scorer = nlp_loaded.evaluate(dev_docs) + end_time = timer() + cpu_wps = nwords/(end_time-start_time) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: file_.write(json_dumps(scorer.scores)) + meta_loc = output_path / ('model%d' % i) / 'meta.json' + meta['accuracy'] = scorer.scores + meta['speed'] = {'nwords': nwords, 'cpu':cpu_wps, 'gpu': gpu_wps} + meta['lang'] = nlp.lang + meta['pipeline'] = pipeline + meta['spacy_version'] = '>=%s' % about.__version__ + meta.setdefault('name', 'model%d' % i) + meta.setdefault('version', version) + + with meta_loc.open('w') as file_: + file_.write(json_dumps(meta)) util.set_env_log(True) - print_progress(i, losses, scorer.scores) + print_progress(i, losses, scorer.scores, cpu_wps=cpu_wps, gpu_wps=gpu_wps) finally: print("Saving model...") - with (output_path / 'model-final.pickle').open('wb') as file_: - with nlp.use_params(optimizer.averages): - dill.dump(nlp, file_, -1) + try: + with (output_path / 'model-final.pickle').open('wb') as file_: + with nlp.use_params(optimizer.averages): + dill.dump(nlp, file_, -1) + except: + print("Error saving model") def _render_parses(i, to_render): @@ -128,25 +175,30 @@ def _render_parses(i, to_render): file_.write(html) -def print_progress(itn, losses, dev_scores, wps=0.0): +def print_progress(itn, losses, dev_scores, cpu_wps=0.0, gpu_wps=0.0): scores = {} for col in ['dep_loss', 'tag_loss', 'uas', 'tags_acc', 'token_acc', - 'ents_p', 'ents_r', 'ents_f', 'wps']: + 'ents_p', 'ents_r', 'ents_f', 'cpu_wps', 'gpu_wps']: scores[col] = 0.0 scores['dep_loss'] = losses.get('parser', 0.0) + scores['ner_loss'] = losses.get('ner', 0.0) scores['tag_loss'] = losses.get('tagger', 0.0) scores.update(dev_scores) - scores['wps'] = wps + scores['cpu_wps'] = cpu_wps + scores['gpu_wps'] = gpu_wps or 0.0 tpl = '\t'.join(( '{:d}', '{dep_loss:.3f}', + '{ner_loss:.3f}', '{uas:.3f}', '{ents_p:.3f}', '{ents_r:.3f}', '{ents_f:.3f}', '{tags_acc:.3f}', '{token_acc:.3f}', - '{wps:.1f}')) + '{cpu_wps:.1f}', + '{gpu_wps:.1f}', + )) print(tpl.format(itn, **scores)) diff --git a/spacy/cli/validate.py b/spacy/cli/validate.py new file mode 100644 index 000000000..c1f992ed6 --- /dev/null +++ b/spacy/cli/validate.py @@ -0,0 +1,123 @@ +# coding: utf8 +from __future__ import unicode_literals + +import requests +import pkg_resources +from pathlib import Path + +from ..compat import path2str, locale_escape +from ..util import prints, get_data_path, read_json +from .. import about + + +def validate(cmd): + """Validate that the currently installed version of spaCy is compatible + with the installed models. Should be run after `pip install -U spacy`. + """ + r = requests.get(about.__compatibility__) + if r.status_code != 200: + prints("Couldn't fetch compatibility table.", + title="Server error (%d)" % r.status_code, exits=1) + compat = r.json()['spacy'] + all_models = set() + for spacy_v, models in dict(compat).items(): + all_models.update(models.keys()) + for model, model_vs in models.items(): + compat[spacy_v][model] = [reformat_version(v) for v in model_vs] + + current_compat = compat[about.__version__] + model_links = get_model_links(current_compat) + model_pkgs = get_model_pkgs(current_compat, all_models) + incompat_links = {l for l, d in model_links.items() if not d['compat']} + incompat_models = {d['name'] for _, d in model_pkgs.items() if not d['compat']} + incompat_models.update([d['name'] for _, d in model_links.items() if not d['compat']]) + na_models = [m for m in incompat_models if m not in current_compat] + update_models = [m for m in incompat_models if m in current_compat] + + prints(path2str(Path(__file__).parent.parent), + title="Installed models (spaCy v{})".format(about.__version__)) + if model_links or model_pkgs: + print(get_row('TYPE', 'NAME', 'MODEL', 'VERSION', '')) + for name, data in model_pkgs.items(): + print(get_model_row(current_compat, name, data, 'package')) + for name, data in model_links.items(): + print(get_model_row(current_compat, name, data, 'link')) + else: + prints("No models found in your current environment.", exits=0) + + if update_models: + cmd = ' python -m spacy download {}' + print("\n Use the following commands to update the model packages:") + print('\n'.join([cmd.format(pkg) for pkg in update_models])) + + if na_models: + prints("The following models are not available for spaCy v{}: {}" + .format(about.__version__, ', '.join(na_models))) + + if incompat_links: + prints("You may also want to overwrite the incompatible links using " + "the `spacy link` command with `--force`, or remove them from " + "the data directory. Data path: {}" + .format(path2str(get_data_path()))) + + +def get_model_links(compat): + links = {} + data_path = get_data_path() + if data_path: + models = [p for p in data_path.iterdir() if is_model_path(p)] + for model in models: + meta_path = Path(model) / 'meta.json' + if not meta_path.exists(): + continue + meta = read_json(meta_path) + link = model.parts[-1] + name = meta['lang'] + '_' + meta['name'] + links[link] = {'name': name, 'version': meta['version'], + 'compat': is_compat(compat, name, meta['version'])} + return links + + +def get_model_pkgs(compat, all_models): + pkgs = {} + for pkg_name, pkg_data in pkg_resources.working_set.by_key.items(): + package = pkg_name.replace('-', '_') + if package in all_models: + version = pkg_data.version + pkgs[pkg_name] = {'name': package, 'version': version, + 'compat': is_compat(compat, package, version)} + return pkgs + + +def get_model_row(compat, name, data, type='package'): + tpl_row = ' {:<10}' + (' {:<20}' * 4) + tpl_red = '\x1b[38;5;1m{}\x1b[0m' + tpl_green = '\x1b[38;5;2m{}\x1b[0m' + if data['compat']: + comp = tpl_green.format(locale_escape('✔', errors='ignore')) + version = tpl_green.format(data['version']) + else: + comp = '--> {}'.format(compat.get(data['name'], ['n/a'])[0]) + version = tpl_red.format(data['version']) + return get_row(type, name, data['name'], version, comp) + + +def get_row(*args): + tpl_row = ' {:<10}' + (' {:<20}' * 4) + return tpl_row.format(*args) + + +def is_model_path(model_path): + exclude = ['cache', 'pycache', '__pycache__'] + name = model_path.parts[-1] + return model_path.is_dir() and name not in exclude and not name.startswith('.') + + +def is_compat(compat, name, version): + return name in compat and version in compat[name] + + +def reformat_version(version): + if version.endswith('-alpha'): + return version.replace('-alpha', 'a0') + return version.replace('-alpha', 'a') diff --git a/spacy/compat.py b/spacy/compat.py index 848ea816a..81243ce1b 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -5,6 +5,8 @@ import six import ftfy import sys import ujson +import itertools +import locale from thinc.neural.util import copy_array @@ -35,6 +37,7 @@ CudaStream = CudaStream cupy = cupy fix_text = ftfy.fix_text copy_array = copy_array +izip = getattr(itertools, 'izip', zip) is_python2 = six.PY2 is_python3 = six.PY3 @@ -44,21 +47,31 @@ is_osx = sys.platform == 'darwin' if is_python2: + import imp bytes_ = str unicode_ = unicode basestring_ = basestring input_ = raw_input - json_dumps = lambda data: ujson.dumps(data, indent=2).decode('utf8') + json_dumps = lambda data: ujson.dumps(data, indent=2, escape_forward_slashes=False).decode('utf8') path2str = lambda path: str(path).decode('utf8') elif is_python3: + import importlib.util bytes_ = bytes unicode_ = str basestring_ = str input_ = input - json_dumps = lambda data: ujson.dumps(data, indent=2) + json_dumps = lambda data: ujson.dumps(data, indent=2, escape_forward_slashes=False) path2str = lambda path: str(path) + +def b_to_str(b_str): + if is_python2: + return b_str + # important: if no encoding is set, string becomes "b'...'" + return str(b_str, encoding='utf8') + + def getattr_(obj, name, *default): if is_python3 and isinstance(name, bytes): name = name.decode('utf8') @@ -92,3 +105,21 @@ def normalize_string_keys(old): return new +def import_file(name, loc): + loc = str(loc) + if is_python2: + return imp.load_source(name, loc) + else: + spec = importlib.util.spec_from_file_location(name, str(loc)) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def locale_escape(string, errors='replace'): + ''' + Mangle non-supported characters, for savages with ascii terminals. + ''' + encoding = locale.getpreferredencoding() + string = string.encode(encoding, errors).decode('utf8') + return string diff --git a/spacy/deprecated.py b/spacy/deprecated.py index 77273d193..ad52bfe24 100644 --- a/spacy/deprecated.py +++ b/spacy/deprecated.py @@ -15,7 +15,7 @@ def depr_model_download(lang): lang (unicode): Language shortcut, 'en' or 'de'. """ prints("The spacy.%s.download command is now deprecated. Please use " - "python -m spacy download [model name or shortcut] instead. For " + "spacy download [model name or shortcut] instead. For " "more info, see the documentation:" % lang, about.__docs_models__, "Downloading default '%s' model now..." % lang, diff --git a/spacy/displacy/__init__.py b/spacy/displacy/__init__.py index 8468720cd..7c479f94c 100644 --- a/spacy/displacy/__init__.py +++ b/spacy/displacy/__init__.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from .render import DependencyRenderer, EntityRenderer from ..tokens import Doc +from ..compat import b_to_str from ..util import prints, is_in_jupyter @@ -65,7 +66,9 @@ def serve(docs, style='dep', page=True, minify=False, options={}, manual=False, def app(environ, start_response): - start_response('200 OK', [('Content-type', 'text/html; charset=utf-8')]) + # headers and status need to be bytes in Python 2, see #1227 + headers = [(b_to_str(b'Content-type'), b_to_str(b'text/html; charset=utf-8'))] + start_response(b_to_str(b'200 OK'), headers) res = _html['parsed'].encode(encoding='utf-8') return [res] diff --git a/spacy/glossary.py b/spacy/glossary.py index 4df5264a6..ed1c22c21 100644 --- a/spacy/glossary.py +++ b/spacy/glossary.py @@ -60,7 +60,7 @@ GLOSSARY = { 'JJR': 'adjective, comparative', 'JJS': 'adjective, superlative', 'LS': 'list item marker', - 'MD': 'verb, modal auxillary', + 'MD': 'verb, modal auxiliary', 'NIL': 'missing tag', 'NN': 'noun, singular or mass', 'NNP': 'noun, proper singular', @@ -91,7 +91,7 @@ GLOSSARY = { 'NFP': 'superfluous punctuation', 'GW': 'additional word in multi-word expression', 'XX': 'unknown', - 'BES': 'auxillary "be"', + 'BES': 'auxiliary "be"', 'HVS': 'forms of "have"', diff --git a/spacy/gold.pxd b/spacy/gold.pxd index 364e083fb..a1550b1ef 100644 --- a/spacy/gold.pxd +++ b/spacy/gold.pxd @@ -9,6 +9,7 @@ cdef struct GoldParseC: int* tags int* heads int* has_dep + int* sent_start attr_t* labels int** brackets Transition* ner @@ -29,6 +30,7 @@ cdef class GoldParse: cdef public list ner cdef public list ents cdef public dict brackets + cdef public object cats cdef readonly list cand_to_gold cdef readonly list gold_to_cand diff --git a/spacy/gold.pyx b/spacy/gold.pyx index 42aaf1f84..5729af667 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -7,6 +7,7 @@ import re import ujson import random import cytoolz +import itertools from .syntax import nonproj from .util import ensure_path @@ -146,9 +147,13 @@ def minibatch(items, size=8): '''Iterate over batches of items. `size` may be an iterator, so that batch-size can vary on each step. ''' + if isinstance(size, int): + size_ = itertools.repeat(8) + else: + size_ = size items = iter(items) while True: - batch_size = next(size) #if hasattr(size, '__next__') else size + batch_size = next(size_) batch = list(cytoolz.take(int(batch_size), items)) if len(batch) == 0: break @@ -208,7 +213,7 @@ class GoldCorpus(object): train_tuples = self.train_tuples if projectivize: train_tuples = nonproj.preprocess_training_data( - self.train_tuples) + self.train_tuples, label_freq_cutoff=100) random.shuffle(train_tuples) gold_docs = self.iter_gold_docs(nlp, train_tuples, gold_preproc, max_length=max_length, @@ -381,7 +386,8 @@ cdef class GoldParse: make_projective=make_projective) def __init__(self, doc, annot_tuples=None, words=None, tags=None, heads=None, - deps=None, entities=None, make_projective=False): + deps=None, entities=None, make_projective=False, + cats=None): """Create a GoldParse. doc (Doc): The document the annotations refer to. @@ -392,6 +398,15 @@ cdef class GoldParse: entities (iterable): A sequence of named entity annotations, either as BILUO tag strings, or as `(start_char, end_char, label)` tuples, representing the entity positions. + cats (dict): Labels for text classification. Each key in the dictionary + may be a string or an int, or a `(start_char, end_char, label)` + tuple, indicating that the label is applied to only part of the + document (usually a sentence). Unlike entity annotations, label + annotations can overlap, i.e. a single word can be covered by + multiple labelled spans. The TextCategorizer component expects + true examples of a label to have the value 1.0, and negative examples + of a label to have the value 0.0. Labels not in the dictionary are + treated as missing -- the gradient for those labels will be zero. RETURNS (GoldParse): The newly constructed object. """ if words is None: @@ -399,11 +414,11 @@ cdef class GoldParse: if tags is None: tags = [None for _ in doc] if heads is None: - heads = [token.i for token in doc] + heads = [None for token in doc] if deps is None: deps = [None for _ in doc] if entities is None: - entities = ['-' for _ in doc] + entities = [None for _ in doc] elif len(entities) == 0: entities = ['O' for _ in doc] elif not isinstance(entities[0], basestring): @@ -419,8 +434,10 @@ cdef class GoldParse: self.c.heads = self.mem.alloc(len(doc), sizeof(int)) self.c.labels = self.mem.alloc(len(doc), sizeof(attr_t)) self.c.has_dep = self.mem.alloc(len(doc), sizeof(int)) + self.c.sent_start = self.mem.alloc(len(doc), sizeof(int)) self.c.ner = self.mem.alloc(len(doc), sizeof(Transition)) + self.cats = {} if cats is None else dict(cats) self.words = [None] * len(doc) self.tags = [None] * len(doc) self.heads = [None] * len(doc) @@ -474,8 +491,12 @@ cdef class GoldParse: """ return not nonproj.is_nonproj_tree(self.heads) + @property + def sent_starts(self): + return [self.c.sent_start[i] for i in range(self.length)] -def biluo_tags_from_offsets(doc, entities): + +def biluo_tags_from_offsets(doc, entities, missing='O'): """Encode labelled spans into per-token tags, using the Begin/In/Last/Unit/Out scheme (BILUO). @@ -527,7 +548,7 @@ def biluo_tags_from_offsets(doc, entities): if i in entity_chars: break else: - biluo[token.i] = 'O' + biluo[token.i] = missing return biluo diff --git a/spacy/lang/bn/__init__.py b/spacy/lang/bn/__init__.py index c2cf12f12..ff560afae 100644 --- a/spacy/lang/bn/__init__.py +++ b/spacy/lang/bn/__init__.py @@ -16,15 +16,13 @@ from ...util import update_exc class BengaliDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'bn' - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) tag_map = TAG_MAP stop_words = STOP_WORDS lemma_rules = LEMMA_RULES - - prefixes = tuple(TOKENIZER_PREFIXES) - suffixes = tuple(TOKENIZER_SUFFIXES) - infixes = tuple(TOKENIZER_INFIXES) + prefixes = TOKENIZER_PREFIXES + suffixes = TOKENIZER_SUFFIXES + infixes = TOKENIZER_INFIXES class Bengali(Language): diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index bec685646..89774b17d 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -27,13 +27,21 @@ ALPHA_UPPER = merge_char_classes(_upper + _uncased) _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm nm yd in ft ' 'kg g mg µg t lb oz m/s km/h kmh mph hPa Pa mbar mb MB kb KB gb GB tb ' - 'TB T G M K') + 'TB T G M K %') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' -_punct = r'… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' -_quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «' -_hyphens = '- – — -- ---' + +# These expressions contain various unicode variations, including characters +# used in Chinese (see #1333, #1340, #1351) – unless there are cross-language +# conflicts, spaCy's base tokenizer should handle all of those by default +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ ·' +_quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‘‘ ’’ ‚ , „ » « 「 」 『 』 ( ) 〔 〕 【 】 《 》 〈 〉' +_hyphens = '- – — -- --- —— ~' + +# Various symbols like dingbats, but also emoji +# Details: https://www.compart.com/en/unicode/category/So _other_symbols = r'[\p{So}]' + UNITS = merge_chars(_units) CURRENCY = merge_chars(_currency) QUOTES = merge_chars(_quotes) diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py index 99babdc2c..86e47c00d 100644 --- a/spacy/lang/da/__init__.py +++ b/spacy/lang/da/__init__.py @@ -15,9 +15,8 @@ class DanishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'da' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) + stop_words = STOP_WORDS class Danish(Language): diff --git a/spacy/lang/da/examples.py b/spacy/lang/da/examples.py new file mode 100644 index 000000000..549f71fb5 --- /dev/null +++ b/spacy/lang/da/examples.py @@ -0,0 +1,18 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.da.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple overvejer at købe et britisk statup for 1 milliard dollar", + "Selvkørende biler flytter forsikringsansvaret over på producenterne", + "San Francisco overvejer at forbyde leverandørrobotter på fortov", + "London er en stor by i Storbritannien" +] diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py index b8a7580a0..e8e7a12db 100644 --- a/spacy/lang/de/__init__.py +++ b/spacy/lang/de/__init__.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .norm_exceptions import NORM_EXCEPTIONS +from .punctuation import TOKENIZER_INFIXES from .tag_map import TAG_MAP from .stop_words import STOP_WORDS from .lemmatizer import LOOKUP @@ -11,7 +12,6 @@ from .syntax_iterators import SYNTAX_ITERATORS from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups @@ -21,15 +21,12 @@ class GermanDefaults(Language.Defaults): lex_attr_getters[LANG] = lambda text: 'de' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], NORM_EXCEPTIONS, BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - tag_map = dict(TAG_MAP) - stop_words = set(STOP_WORDS) - syntax_iterators = dict(SYNTAX_ITERATORS) - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + infixes = TOKENIZER_INFIXES + tag_map = TAG_MAP + stop_words = STOP_WORDS + syntax_iterators = SYNTAX_ITERATORS + lemma_lookup = LOOKUP class German(Language): diff --git a/spacy/lang/de/examples.py b/spacy/lang/de/examples.py new file mode 100644 index 000000000..49ac0e14b --- /dev/null +++ b/spacy/lang/de/examples.py @@ -0,0 +1,22 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.de.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Die ganze Stadt ist ein Startup: Shenzhen ist das Silicon Valley für Hardware-Firmen", + "Wie deutsche Startups die Technologie vorantreiben wollen: Künstliche Intelligenz", + "Trend zum Urlaub in Deutschland beschert Gastwirten mehr Umsatz", + "Bundesanwaltschaft erhebt Anklage gegen mutmaßlichen Schweizer Spion", + "San Francisco erwägt Verbot von Lieferrobotern", + "Autonome Fahrzeuge verlagern Haftpflicht auf Hersteller", + "Wo bist du?", + "Was ist die Hauptstadt von Deutschland?" +] diff --git a/spacy/lang/de/punctuation.py b/spacy/lang/de/punctuation.py new file mode 100644 index 000000000..7024ed118 --- /dev/null +++ b/spacy/lang/de/punctuation.py @@ -0,0 +1,20 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ..char_classes import LIST_ELLIPSES, LIST_ICONS +from ..char_classes import QUOTES, ALPHA, ALPHA_LOWER, ALPHA_UPPER + + +_quotes = QUOTES.replace("'", '') + +_infixes = (LIST_ELLIPSES + LIST_ICONS + + [r'(?<=[{}])\.(?=[{}])'.format(ALPHA_LOWER, ALPHA_UPPER), + r'(?<=[{a}])[,!?](?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}"])[:<>=](?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}])([{q}\)\]\(\[])(?=[\{a}])'.format(a=ALPHA, q=_quotes), + r'(?<=[{a}])--(?=[{a}])'.format(a=ALPHA), + r'(?<=[0-9])-(?=[0-9])']) + + +TOKENIZER_INFIXES = _infixes diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py index ec14fecd0..63fd9c2b4 100644 --- a/spacy/lang/en/__init__.py +++ b/spacy/lang/en/__init__.py @@ -7,7 +7,7 @@ from .tag_map import TAG_MAP from .stop_words import STOP_WORDS from .lex_attrs import LEX_ATTRS from .morph_rules import MORPH_RULES -from .lemmatizer import LEMMA_RULES, LEMMA_INDEX, LEMMA_EXC +from .lemmatizer import LEMMA_RULES, LEMMA_INDEX, LEMMA_EXC, LOOKUP from .syntax_iterators import SYNTAX_ITERATORS from ..tokenizer_exceptions import BASE_EXCEPTIONS @@ -23,15 +23,15 @@ class EnglishDefaults(Language.Defaults): lex_attr_getters[LANG] = lambda text: 'en' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS, NORM_EXCEPTIONS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - tag_map = dict(TAG_MAP) - stop_words = set(STOP_WORDS) - morph_rules = dict(MORPH_RULES) - lemma_rules = dict(LEMMA_RULES) - lemma_index = dict(LEMMA_INDEX) - lemma_exc = dict(LEMMA_EXC) - syntax_iterators = dict(SYNTAX_ITERATORS) + tag_map = TAG_MAP + stop_words = STOP_WORDS + morph_rules = MORPH_RULES + lemma_rules = LEMMA_RULES + lemma_index = LEMMA_INDEX + lemma_exc = LEMMA_EXC + lemma_lookup = LOOKUP + syntax_iterators = SYNTAX_ITERATORS class English(Language): diff --git a/spacy/lang/en/examples.py b/spacy/lang/en/examples.py new file mode 100644 index 000000000..b92d4a65c --- /dev/null +++ b/spacy/lang/en/examples.py @@ -0,0 +1,22 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.en.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple is looking at buying U.K. startup for $1 billion", + "Autonomous cars shift insurance liability toward manufacturers", + "San Francisco considers banning sidewalk delivery robots", + "London is a big city in the United Kingdom.", + "Where are you?", + "Who is the president of France?", + "What is the capital of the United States?", + "When was Barack Obama born?" +] diff --git a/spacy/lang/en/morph_rules.py b/spacy/lang/en/morph_rules.py index 4e95dc747..fedb89700 100644 --- a/spacy/lang/en/morph_rules.py +++ b/spacy/lang/en/morph_rules.py @@ -59,7 +59,8 @@ MORPH_RULES = { "VBP": { "are": {LEMMA: "be", "VerbForm": "Fin", "Tense": "Pres", "Mood": "Ind"}, - "'re": {LEMMA: "be", "VerbForm": "Fin", "Tense": "Pres", "Mood": "Ind"} + "'re": {LEMMA: "be", "VerbForm": "Fin", "Tense": "Pres", "Mood": "Ind"}, + "am": {LEMMA: "be", "VerbForm": "Fin", "Person": "One", "Tense": "Pres", "Mood": "Ind"}, }, "VBD": { diff --git a/spacy/lang/en/syntax_iterators.py b/spacy/lang/en/syntax_iterators.py index 4240bd657..bb1a6b7f7 100644 --- a/spacy/lang/en/syntax_iterators.py +++ b/spacy/lang/en/syntax_iterators.py @@ -8,7 +8,7 @@ def noun_chunks(obj): """ Detect base noun phrases from a dependency parse. Works on both Doc and Span. """ - labels = ['nsubj', 'dobj', 'nsubjpass', 'pcomp', 'pobj', + labels = ['nsubj', 'dobj', 'nsubjpass', 'pcomp', 'pobj', 'dative', 'appos', 'attr', 'ROOT'] doc = obj.doc # Ensure works on both Doc and Span. np_deps = [doc.vocab.strings.add(label) for label in labels] diff --git a/spacy/lang/en/tokenizer_exceptions.py b/spacy/lang/en/tokenizer_exceptions.py index 392532619..b9fde7882 100644 --- a/spacy/lang/en/tokenizer_exceptions.py +++ b/spacy/lang/en/tokenizer_exceptions.py @@ -232,7 +232,10 @@ for verb_data in [ {ORTH: "are", LEMMA: "be", NORM: "are", TAG: "VBP", "number": 2}, {ORTH: "is", LEMMA: "be", NORM: "is", TAG: "VBZ"}, {ORTH: "was", LEMMA: "be", NORM: "was"}, - {ORTH: "were", LEMMA: "be", NORM: "were"}]: + {ORTH: "were", LEMMA: "be", NORM: "were"}, + {ORTH: "have", NORM: "have"}, + {ORTH: "has", LEMMA: "have", NORM: "has"}, + {ORTH: "dare", NORM: "dare"}]: verb_data_tc = dict(verb_data) verb_data_tc[ORTH] = verb_data_tc[ORTH].title() for data in [verb_data, verb_data_tc]: diff --git a/spacy/lang/es/__init__.py b/spacy/lang/es/__init__.py index 1e7f55be8..661f0bbec 100644 --- a/spacy/lang/es/__init__.py +++ b/spacy/lang/es/__init__.py @@ -10,7 +10,6 @@ from .syntax_iterators import SYNTAX_ITERATORS from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups @@ -19,15 +18,11 @@ class SpanishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'es' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - tag_map = dict(TAG_MAP) - stop_words = set(STOP_WORDS) - sytax_iterators = dict(SYNTAX_ITERATORS) - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + tag_map = TAG_MAP + stop_words = STOP_WORDS + sytax_iterators = SYNTAX_ITERATORS + lemma_lookup = LOOKUP class Spanish(Language): diff --git a/spacy/lang/es/examples.py b/spacy/lang/es/examples.py new file mode 100644 index 000000000..61fe8c9be --- /dev/null +++ b/spacy/lang/es/examples.py @@ -0,0 +1,22 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.es.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple está buscando comprar una startup del Reino Unido por mil millones de dólares", + "Los coches autónomos delegan la responsabilidad del seguro en sus fabricantes", + "San Francisco analiza prohibir los robots delivery", + "Londres es una gran ciudad del Reino Unido", + "El gato come pescado", + "Veo al hombre con el telescopio", + "La araña come moscas", + "El pingüino incuba en su nido" +] diff --git a/spacy/lang/fi/__init__.py b/spacy/lang/fi/__init__.py index 931ad5341..7f74495c5 100644 --- a/spacy/lang/fi/__init__.py +++ b/spacy/lang/fi/__init__.py @@ -15,9 +15,8 @@ class FinnishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'fi' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) + stop_words = STOP_WORDS class Finnish(Language): diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py index a243b6268..42acd0736 100644 --- a/spacy/lang/fr/__init__.py +++ b/spacy/lang/fr/__init__.py @@ -4,32 +4,29 @@ from __future__ import unicode_literals from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_INFIXES from .stop_words import STOP_WORDS +from .lex_attrs import LEX_ATTRS from .lemmatizer import LOOKUP from .syntax_iterators import SYNTAX_ITERATORS from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups class FrenchDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters.update(LEX_ATTRS) lex_attr_getters[LANG] = lambda text: 'fr' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) - infixes = tuple(TOKENIZER_INFIXES) - suffixes = tuple(TOKENIZER_SUFFIXES) + stop_words = STOP_WORDS + infixes = TOKENIZER_INFIXES + suffixes = TOKENIZER_SUFFIXES token_match = TOKEN_MATCH - syntax_iterators = dict(SYNTAX_ITERATORS) - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + syntax_iterators = SYNTAX_ITERATORS + lemma_lookup = LOOKUP class French(Language): diff --git a/spacy/lang/fr/_tokenizer_exceptions_list.py b/spacy/lang/fr/_tokenizer_exceptions_list.py index 37df0ba16..eb6d5bbce 100644 --- a/spacy/lang/fr/_tokenizer_exceptions_list.py +++ b/spacy/lang/fr/_tokenizer_exceptions_list.py @@ -1,42 +1,44 @@ # coding: utf8 from __future__ import unicode_literals - FR_BASE_EXCEPTIONS = [ +"(+)-amphétamine", +"(5R,6S)-7,8-didehydro-4,5-époxy-3-méthoxy-N-méthylmorphinan-6-ol", +"(R)-amphétamine", +"(S)-amphétamine", +"(−)-amphétamine", "0-day", "0-days", +"1,1-diméthylhydrazine", +"1,2,3-tris-nitrooxy-propane", +"1,2-diazine", +"1,2-dichloropropane", +"1,3-diazine", +"1,3-dichloropropène", +"1,4-diazine", +"1-DDOL", +"1-TDOL", +"1-alpha,2-alpha,3-bêta,4-alpha,5-alpha,6-bêta-hexachlorocyclohexane", +"1-dodécanol", +"1-méthyl-2,4,6-trinitrobenzène", +"1-tétradécanol", "1000Base-T", "100Base-T", "100Base-T4", "100Base-TX", "10BASE-F", "10Base-T", -"1,1-diméthylhydrazine", -"11-septembre", "11-Septembre", +"11-septembre", "120-cellules", -"1,2,3-tris-nitrooxy-propane", -"1,2-diazine", -"1,2-dichloropropane", -"1,3-diazine", -"1,3-dichloropropène", "14-18", -"1,4-diazine", "16-cellules", -"1-alpha,2-alpha,3-bêta,4-alpha,5-alpha,6-bêta-hexachlorocyclohexane", -"1-DDOL", -"1-dodécanol", -"1-méthyl-2,4,6-trinitrobenzène", -"1-TDOL", -"1-tétradécanol", "1T-SRAM", -"22-dihydroergocalciférol", "2,2'-iminodi(éthylamine)", "2,3,6-TBA", "2,4,5-T", "2,4,5-TP", "2,4,6-trinitrophénol", -"24-cellules", "2,4-D", "2,4-DB", "2,4-DP", @@ -45,12 +47,13 @@ FR_BASE_EXCEPTIONS = [ "2-désoxyribose", "2-méthylpropane", "2-méthylpropanes", +"22-dihydroergocalciférol", +"24-cellules", "2′-O-méthyla", "2′-O-méthylai", "2′-O-méthylaient", "2′-O-méthylais", "2′-O-méthylait", -"2′-O-méthylâmes", "2′-O-méthylant", "2′-O-méthylas", "2′-O-méthylasse", @@ -58,12 +61,7 @@ FR_BASE_EXCEPTIONS = [ "2′-O-méthylasses", "2′-O-méthylassiez", "2′-O-méthylassions", -"2′-O-méthylât", -"2′-O-méthylâtes", "2′-O-méthyle", -"2′-O-méthylé", -"2′-O-méthylée", -"2′-O-méthylées", "2′-O-méthylent", "2′-O-méthyler", "2′-O-méthylera", @@ -72,103 +70,79 @@ FR_BASE_EXCEPTIONS = [ "2′-O-méthylerais", "2′-O-méthylerait", "2′-O-méthyleras", -"2′-O-méthylèrent", "2′-O-méthylerez", "2′-O-méthyleriez", "2′-O-méthylerions", "2′-O-méthylerons", "2′-O-méthyleront", "2′-O-méthyles", -"2′-O-méthylés", "2′-O-méthylez", "2′-O-méthyliez", "2′-O-méthylions", "2′-O-méthylons", -"33-tours", +"2′-O-méthylâmes", +"2′-O-méthylât", +"2′-O-méthylâtes", +"2′-O-méthylèrent", +"2′-O-méthylé", +"2′-O-méthylée", +"2′-O-méthylées", +"2′-O-méthylés", "3,4-DCPA", "3,6-DCP", -"39-45", "3-hydroxyflavone", "3-méthylmorphine", +"33-tours", +"39-45", "4-3-3", "4-5-1", -"4-acétylaminophénol", "4-CPA", +"4-acétylaminophénol", "5-4-1", -"5-cellules", "5-HPETE", -"(5R,6S)-7,8-didehydro-4,5-époxy-3-méthoxy-N-méthylmorphinan-6-ol", -"600-cellules", +"5-cellules", "6-benzyladénine", +"600-cellules", "8-hydroxyquinoléine", "9-2", "9-3", +"A-EF", +"A-OF", +"A-ÉF", +"A.-Vict.", "AAAA-MM-JJ", "Aarle-Rixtel", -"abaisse-langue", -"abaisse-langues", "Abanto-Zierbena", "Abaucourt-Hautecourt", "Abbans-Dessous", "Abbans-Dessus", "Abbaye-sous-Plancy", +"Abbeville-Saint-Lucien", "Abbéville-la-Rivière", "Abbéville-lès-Conflans", -"Abbeville-Saint-Lucien", "Abcoude-Baambrugge", "Abcoude-Proostdij", "Abel-François", "Abergement-Clémenciat", +"Abergement-Saint-Jean", +"Abergement-Sainte-Colombe", "Abergement-de-Cuisery", "Abergement-de-Varey", "Abergement-la-Ronce", "Abergement-le-Grand", "Abergement-le-Petit", "Abergement-lès-Thésy", -"Abergement-Sainte-Colombe", -"Abergement-Saint-Jean", "Abitibi-Témiscamien", "Abitibi-Témiscamingue", "Abjat-sur-Bandiat", -"Ablaincourt-Pressoir", "Ablain-Saint-Nazaire", +"Ablaincourt-Pressoir", "Ablon-sur-Seine", "Aboncourt-Gesincourt", "Aboncourt-sur-Seille", -"abou-hannès", -"abou-mengel", -"abou-mengels", -"abricotier-pays", -"abricot-pêche", -"abricots-pêches", -"abri-sous-roche", -"abris-sous-roche", -"abris-vent", -"abri-vent", -"absorbeur-neutralisateur", -"acajou-amer", -"acajou-bois", -"acajous-amers", -"acajous-bois", -"accord-cadre", -"accords-cadres", -"accroche-coeur", -"accroche-cœur", -"accroche-coeurs", -"accroche-cœurs", -"accroche-pied", -"accroche-pieds", -"accroche-plat", -"accroche-plats", -"acétyl-salicylate", -"acétyl-salicylates", -"achard-bourgeois", "Achard-Bourgeois", -"achard-bourgeoise", "Achard-Bourgeoise", -"achard-bourgeoises", "Achard-Bourgeoises", -"Achères-la-Forêt", "Acheux-en-Amiénois", "Acheux-en-Vimeu", "Achiet-le-Grand", @@ -176,168 +150,65 @@ FR_BASE_EXCEPTIONS = [ "Achter-Drempt", "Achter-Lindt", "Achter-Thesinge", -"acibenzolar-S-méthyle", -"acide-N-1-naphtyl-phtalamique", -"acide-phénol", -"acides-phénols", -"acido-alcalimétrie", -"acido-alcoolo-résistance", -"acido-alcoolo-résistances", -"acido-alcoolo-résistant", -"acido-alcoolo-résistante", -"acido-alcoolo-résistantes", -"acido-alcoolo-résistants", -"acido-basique", -"acido-résistant", -"acido-résistants", -"acquae-sextien", +"Achères-la-Forêt", "Acquae-Sextien", -"acquae-sextienne", "Acquae-Sextienne", -"acquae-sextiennes", "Acquae-Sextiennes", -"acquae-sextiens", "Acquae-Sextiens", -"acqua-toffana", -"acqua-toffanas", "Acquin-Westbécourt", -"acquit-à-caution", -"acquit-patent", -"acquits-à-caution", -"acquits-patents", -"acting-out", -"actino-uranium", -"Acy-en-Multien", "Acy-Romance", +"Acy-en-Multien", +"Ad-Dawr", "Adam-lès-Passavant", "Adam-lès-Vercel", -"Ad-Dawr", "Addis-Abeba", "Addis-Abebien", "Addis-Abébien", -"add-on", "Adelans-et-le-Val-de-Bithaine", "Adervielle-Pouchergues", -"adieu-mes-couilles", -"adieu-tout", -"adieu-touts", -"adieu-va", -"adieu-vas", -"adieu-vat", -"adieu-vats", -"adiposo-génital", -"adiposo-génitale", -"adiposo-génitales", -"adiposo-génitaux", -"adjudant-chef", -"adjudants-chefs", "Admannshagen-Bargeshagen", "Adrets-de-Fréjus", "Adwick-le-Street", -"A-EF", -"A-ÉF", -"africain-américain", "Africain-Américain", -"africaine-américaine", "Africaine-Américaine", -"africaines-américaines", "Africaines-Américaines", -"africains-américains", "Africains-Américains", -"africano-brésilien", -"africano-brésilienne", -"africano-brésiliennes", -"africano-brésiliens", -"africano-taïwanais", -"africano-taïwanaise", -"africano-taïwanaises", -"agace-pissette", -"agar-agar", -"agasse-tambourinette", -"agatha-christien", "Agatha-christien", "Agen-d'Aveyron", -"agit-prop", "Agnam-Goly", "Agnez-lès-Duisans", "Agnicourt-et-Séchelles", "Agnières-en-Dévoluy", -"agnus-castus", -"agnus-dei", "Agon-Coutainville", -"agora-phobie", -"agora-phobies", "Agos-Vidalos", "Ahaxe-Alciette-Bascassan", "Ahlefeld-Bistensee", "Ahrenshagen-Daskow", -"aï-aï", "Aibar-Oibar", "Aichach-Friedberg", -"ai-cham", -"Aïcirits-Camou-Suhast", -"aide-comptable", -"aide-écuyer", -"aide-écuyers", -"aide-éducateur", -"Aïd-el-Kébir", -"Aïd-el-Séghir", -"aide-mémoire", -"aide-mémoires", -"aide-soignant", -"aide-soignante", -"aide-soignantes", -"aide-soignants", -"aides-soignantes", -"aides-soignants", -"aigle-bar", "Aignay-le-Duc", "Aignes-et-Puypéroux", -"aigre-douce", -"aigre-doux", "Aigrefeuille-d'Aunis", "Aigrefeuille-sur-Maine", -"aigre-moines", -"aigres-douces", -"aigres-doux", "Aiguebelette-le-Lac", -"aigue-marine", -"aigue-marines", -"aigues-juntais", "Aigues-Juntais", -"aigues-juntaise", "Aigues-Juntaise", -"aigues-juntaises", "Aigues-Juntaises", "Aigues-Juntes", -"aigues-marines", -"aigues-mortais", "Aigues-Mortais", -"aigues-mortaise", "Aigues-Mortaise", -"aigues-mortaises", "Aigues-Mortaises", "Aigues-Mortes", "Aigues-Vives", -"aigues-vivesien", "Aigues-Vivesien", -"aigues-vivesienne", "Aigues-Vivesienne", -"aigues-vivesiennes", "Aigues-Vivesiennes", -"aigues-vivesiens", "Aigues-Vivesiens", -"aigues-vivien", -"aigues-vivois", "Aigues-Vivois", -"aigues-vivoise", "Aigues-Vivoise", -"aigues-vivoises", "Aigues-Vivoises", "Aiguillon-sur-Mer", "Aiguillon-sur-Vie", -"aiguise-crayon", -"aiguise-crayons", "Aillant-sur-Milleron", "Aillant-sur-Tholon", "Aillevillers-et-Lyaumont", @@ -352,18 +223,14 @@ FR_BASE_EXCEPTIONS = [ "Ainay-le-Château", "Ainay-le-Vieil", "Ainhice-Mongelos", -"Aínsa-Sobrarbe", -"ainu-ken", "Ainval-Septoutre", "Aire-la-Ville", -"airelle-myrtille", "Aire-sur-l'Adour", "Aire-sur-la-Lys", "Airon-Notre-Dame", "Airon-Saint-Vaast", "Aische-en-Refail", "Aiseau-Presles", -"aiseau-preslois", "Aiseau-Preslois", "Aiseau-Presloise", "Aisey-et-Richecourt", @@ -371,146 +238,85 @@ FR_BASE_EXCEPTIONS = [ "Aisonville-et-Bernoville", "Aisy-sous-Thil", "Aisy-sur-Armançon", +"Aix-Noulette", +"Aix-Villemaur-Pâlis", "Aix-en-Diois", "Aix-en-Ergny", "Aix-en-Issart", "Aix-en-Othe", "Aix-en-Provence", -"Aixe-sur-Vienne", "Aix-la-Chapelle", "Aix-la-Fayette", "Aix-les-Bains", -"Aix-Noulette", -"Aix-Villemaur-Pâlis", +"Aixe-sur-Vienne", "Aizecourt-le-Bas", "Aizecourt-le-Haut", "Aizy-Jouy", "Ajoupa-Bouillon", -"aka-bea", -"aka-bo", -"aka-cari", -"aka-jeru", -"aka-kede", -"aka-kora", -"akar-bale", -"akhal-teke", -"akua-ba", -"Alaincourt-la-Côte", -"al-Anbar", "Al-Anbar", -"al-Anbâr", "Al-Anbâr", -"al-Anbār", "Al-Andalus", -"Alba-la-Romaine", -"albano-letton", -"Albaret-le-Comtal", -"Albaret-Sainte-Marie", +"Al-Dour", +"Al-Khwarizmi", +"Al-Qaida", +"Al-Qaïda", +"Alaincourt-la-Côte", "Alb-Danube", +"Alba-la-Romaine", +"Albaret-Sainte-Marie", +"Albaret-le-Comtal", "Albefeuille-Lagarde", "Albepierre-Bredons", "Albergaria-a-Velha", -"Albiez-le-Jeune", "Albiez-Montrond", +"Albiez-le-Jeune", "Albigny-sur-Saône", "Albon-d'Ardèche", "Alby-sur-Chéran", -"alcalino-terreuse", -"alcalino-terreuses", -"alcalino-terreux", -"Alçay-Alçabéhéty-Sunharette", -"alcoolo-dépendance", -"alcoolo-dépendances", -"alcool-phénol", -"alcools-phénols", -"Al-Dour", "Aldridge-Brownhills", "Alegría-Dulantzi", -"aléseuse-fraiseuse", -"aléseuses-fraiseuses", "Alet-les-Bains", -"algéro-marocain", -"algéro-tuniso-lybien", -"algéro-tuniso-marocain", -"algo-carburant", -"algo-carburants", "Alignan-du-Vent", "Alise-Sainte-Reine", -"al-Kachi", -"Al-Khwarizmi", "Allaines-Mervilliers", "Allainville-aux-Bois", "Allainville-en-Beauce", "Alland'Huy", "Alland'Huy-et-Sausseuil", -"allanto-chorion", -"allanto-chorions", "Allas-Bocage", "Allas-Champagne", "Allas-les-Mines", -"Allègre-les-Fumades", "Allemagne-en-Provence", "Allemanche-Launay-et-Soyer", "Allemans-du-Dropt", "Allennes-les-Marais", "Allerey-sur-Saône", -"aller-retour", -"aller-retours", -"allers-retours", "Alles-sur-Dordogne", "Allez-et-Cazeneuve", -"allez-vous-en", -"allez-y", -"Allières-et-Risset", "Alligny-Cosne", "Alligny-en-Morvan", +"Allières-et-Risset", "Allondrelle-la-Malmaison", "Allonzier-la-Caille", "Allouville-Bellefosse", -"alloxydime-sodium", -"allume-cigare", -"allume-cigares", -"allume-feu", -"allume-feux", -"allume-gaz", -"allumette-bougie", -"allumettes-bougies", +"Allègre-les-Fumades", "Almon-les-Junies", "Almont-les-Junies", "Alos-Sibas-Abense", "Aloxe-Corton", -"Alpes-de-Haute-Provence", "Alpes-Maritimes", -"alpha-amylase", -"alpha-amylases", -"alpha-conversion", -"alpha-conversions", -"alpha-test", -"alpha-tests", -"alpha-tridymite", -"alpha-tridymites", -"alpha-variscite", -"alpha-variscites", +"Alpes-de-Haute-Provence", "Alphen-Boshoven", "Alphen-Chaam", "Alphen-Oosterwijk", "Alphen-sur-le-Rhin", -"al-Qaida", -"Al-Qaida", -"al-Qaïda", -"Al-Qaïda", "Alsace-Champagne-Ardenne-Lorraine", "Alsace-Lorraine", -"alsacien-lorrain", "Alsbach-Hähnlein", "Althen-des-Paluds", "Altmark-Salzwedel", -"alto-basso", -"alto-bassos", -"aluminium-épidote", -"aluminium-épidotes", -"alumu-tesu", "Alzey-Worms", +"Alçay-Alçabéhéty-Sunharette", "Amagne-Lucquy", "Amareins-Francheleins-Cesseins", "Amathay-Vésigneux", @@ -518,72 +324,32 @@ FR_BASE_EXCEPTIONS = [ "Amayé-sur-Seulles", "Ambarès-et-Lagrave", "Amberg-Sulzbach", -"Ambérieu-en-Bugey", -"Ambérieux-en-Dombes", "Ambillou-Château", "Amblans-et-Velotte", "Ambly-Fleury", "Ambly-sur-Aisne", "Ambly-sur-Meuse", -"ambre-gris", "Ambrières-les-Vallées", -"ambystomes-tigres", -"ambystome-tigre", -"Amélie-les-Bains", -"Amélie-les-Bains-Palalda", +"Ambérieu-en-Bugey", +"Ambérieux-en-Dombes", "Amel-sur-l'Etang", "Amel-sur-l'Étang", "Amendeuix-Oneix", -"âme-sœur", -"âmes-sœurs", +"Amfreville-Saint-Amand", "Amfreville-la-Campagne", "Amfreville-la-Mi-Voie", "Amfreville-les-Champs", -"Amfreville-Saint-Amand", "Amfreville-sous-les-Monts", "Amfreville-sur-Iton", -"ami-ami", -"amiante-ciment", "Amigny-Rouy", -"amino-acétique", -"amino-acide", -"amino-acides", "Amlikon-Bissegg", "Amont-et-Effreney", "Amorebieta-Etxano", "Amorots-Succos", -"amour-en-cage", -"amour-propre", -"amours-en-cage", -"amours-propres", -"ampère-heure", -"ampères-heures", -"(+)-amphétamine", -"(−)-amphétamine", -"Ampilly-les-Bordes", "Ampilly-le-Sec", -"ampli-syntoniseur", -"amuse-bouche", -"amuse-bouches", -"amuse-gueule", -"amuse-gueules", -"analyste-programmeur", -"analystes-programmeurs", -"ananas-bois", -"anarcho-capitalisme", -"anarcho-capitalismes", -"anarcho-fasciste", -"anarcho-fascistes", -"anarcho-punk", -"anarcho-punks", -"anarcho-syndicalisme", -"anarcho-syndicalismes", -"anarcho-syndicaliste", -"anarcho-syndicalistes", -"anatomo-pathologie", -"anatomo-pathologies", -"anatomo-pathologique", -"anatomo-pathologiques", +"Ampilly-les-Bordes", +"Amélie-les-Bains", +"Amélie-les-Bains-Palalda", "Ance-Féas", "Anchenoncourt-et-Chazel", "Ancourteville-sur-Héricourt", @@ -595,8 +361,8 @@ FR_BASE_EXCEPTIONS = [ "Ancy-le-Libre", "Ancy-sur-Moselle", "Andelot-Blancheville", -"Andelot-en-Montagne", "Andelot-Morval", +"Andelot-en-Montagne", "Andernos-les-Bains", "Andert-et-Condon", "Andilly-en-Bassigny", @@ -606,34 +372,27 @@ FR_BASE_EXCEPTIONS = [ "Andréenne-de-l'Est", "Andréennes-de-l'Est", "Andréens-de-l'Est", -"andrézien-bouthéonnais", "Andrézien-Bouthéonnais", -"andrézienne-bouthéonnaise", "Andrézienne-Bouthéonnaise", -"andréziennes-bouthéonnaises", "Andréziennes-Bouthéonnaises", -"andréziens-bouthéonnais", "Andréziens-Bouthéonnais", "Andrézieux-Bouthéon", -"Anéran-Camors", -"ânes-zèbres", -"âne-zèbre", -"Angeac-Champagne", -"Angeac-Charente", "Ange-Gardienois", "Ange-Gardienoise", +"Angeac-Champagne", +"Angeac-Charente", "Angerville-Bailleul", +"Angerville-l'Orcher", "Angerville-la-Campagne", "Angerville-la-Martel", -"Angerville-l'Orcher", "Anglards-de-Saint-Flour", "Anglards-de-Salers", "Anglars-Juillac", "Anglars-Nozac", "Anglars-Saint-Félix", -"Anglesqueville-la-Bras-Long", -"Anglesqueville-l'Esneval", "Angles-sur-l'Anglin", +"Anglesqueville-l'Esneval", +"Anglesqueville-la-Bras-Long", "Anglure-sous-Dun", "Angluzelles-et-Courcelles", "Angoustrine-Villeneuve-des-Escaldes", @@ -641,85 +400,44 @@ FR_BASE_EXCEPTIONS = [ "Angoville-en-Saire", "Angoville-sur-Ay", "Anguilcourt-le-Sart", -"anguille-spaghetti", "Angviller-lès-Bisping", "Anhalt-Bitterfeld", -"animal-garou", -"animalier-soigneur", -"animaux-garous", "Anizy-le-Château", "Annaberg-Buchholz", "Annay-la-Côte", "Annay-sur-Serein", "Anne-Charlotte", -"Annecy-le-Vieux", -"année-homme", -"année-lumière", -"années-homme", -"années-hommes", -"années-lumière", "Anne-Laure", "Anne-Marie", "Anne-Sophie", +"Annecy-le-Vieux", "Annesse-et-Beaulieu", "Annet-sur-Marne", "Anneville-Ambourville", "Anneville-en-Saire", -"Annéville-la-Prairie", "Anneville-sur-Mer", "Anneville-sur-Scie", "Annevoie-Rouillon", "Annoisin-Chatelans", "Annouville-Vilmesnil", -"ano-génital", -"ano-génitale", -"ano-génitales", -"ano-génitaux", +"Annéville-la-Prairie", "Ansac-sur-Vienne", -"ansbach-triesdorfer", +"Anse-Bertrand", "Anse-aux-Fraisois", "Anse-aux-Fraisoise", -"Anse-Bertrand", -"ante-bois", -"anté-diluvien", -"anté-hypophyse", -"anté-hypophyses", -"ante-meridiem", -"ante-meridiems", -"ante-mortem", -"ante-mortems", -"antenne-relais", -"antennes-radar", -"antennes-relais", -"anté-pénultième", -"anté-pénultièmes", -"anté-prédécesseur", -"anté-prédécesseurs", "Antey-Saint-André", "Antezant-la-Chapelle", "Antheuil-Portes", -"anthropo-gammamétrie", -"anthropo-gammamétries", -"anthropo-toponyme", -"anthropo-toponymes", -"anthropo-zoomorphe", -"anthropo-zoomorphes", "Anthy-sur-Léman", "Antichan-de-Frontignes", "Anticostien-Minganien", "Antigny-la-Ville", "Antigua-et-Barbuda", -"antiguais-barbudien", "Antiguais-Barbudien", -"antiguais-barbudiens", "Antiguais-Barbudiens", -"antiguaise-barbudienne", -"Antiguaise-Barbudienne", -"antiguaises-barbudiennes", -"Antiguaises-Barbudiennes", -"antiguais-et-barbudien", "Antiguais-et-Barbudien", -"antilope-chevreuil", +"Antiguaise-Barbudienne", +"Antiguaises-Barbudiennes", "Antogny-le-Tillac", "Antoine-Labellois", "Antonne-et-Trigonant", @@ -728,78 +446,33 @@ FR_BASE_EXCEPTIONS = [ "Anzat-le-Luguet", "Anzin-Saint-Aubin", "Anzy-le-Duc", -"A-OF", +"Anéran-Camors", "Aouste-sur-Sye", "Apenburg-Winterfeld", -"apico-alvéolaire", -"apico-dental", -"appartements-témoins", -"appartement-témoin", -"appel-contre-appel", -"appels-contre-appels", "Appelterre-Eichem", "Appenai-sous-Bellême", "Appeville-Annebault", -"apprentie-sorcière", -"apprenties-sorcières", -"apprenti-sorcellerie", -"apprenti-sorcelleries", -"apprenti-sorcier", -"apprentis-sorciers", -"appui-bras", -"appuie-main", -"appuie-mains", -"appuie-tête", -"appuie-têtes", -"appui-livres", -"appui-main", -"appui-mains", -"appui-pied", -"appui-pieds", -"appui-pot", -"appui-pots", -"appuis-main", -"appuis-pot", -"appuis-tête", -"appui-tête", -"appui-têtes", "Apremont-la-Forêt", "Apremont-sur-Allier", -"aquae-sextien", "Aquae-Sextien", -"aquae-sextienne", "Aquae-Sextienne", -"aquae-sextiennes", "Aquae-Sextiennes", -"aquae-sextiens", "Aquae-Sextiens", -"aqua-tinta", -"aqua-toffana", -"aquila-alba", "Aquitaine-Limousin-Poitou-Charentes", -"Arâches-la-Frasse", -"araignée-crabe", -"araignée-loup", -"araignées-crabes", -"araignées-loups", -"aralo-caspien", -"aralo-caspienne", "Arandon-Passins", "Arbedo-Castione", -"Arbérats-Sillègue", "Arbigny-sous-Varennes", "Arblade-le-Bas", "Arblade-le-Haut", "Arbonne-la-Forêt", "Arbouet-Sussaute", -"arbre-à-la-fièvre", -"arbre-de-Moïse", -"arbres-de-Moïse", -"arbres-refuges", -"arcado-chypriote", -"arcado-chypriotes", -"arcado-cypriote", -"arcado-cypriotes", +"Arbérats-Sillègue", +"Arc-en-Barrois", +"Arc-et-Senans", +"Arc-lès-Gray", +"Arc-sous-Cicon", +"Arc-sous-Montenot", +"Arc-sur-Tille", "Arces-Dilo", "Arcis-le-Ponsart", "Arcis-sur-Aube", @@ -810,134 +483,55 @@ FR_BASE_EXCEPTIONS = [ "Arcy-Sainte-Restitue", "Arcy-sur-Cure", "Ardenay-sur-Mérize", -"ardennite-(As)", -"ardennite-(As)s", -"Ardeuil-et-Montfauxelles", "Ardeuil-Montfauxelles", -"ardi-gasna", +"Ardeuil-et-Montfauxelles", "Arelaune-en-Seine", "Arfeuille-Châtain", "Argelès-Bagnères", "Argelès-Gazost", "Argelès-sur-Mer", "Argens-Minervois", +"Argent-sur-Sauldre", "Argentat-sur-Dordogne", "Argenteuil-sur-Armançon", "Argentière-la-Bessée", -"argentite-β", -"argentite-βs", -"argent-métal", -"argento-analcime", -"argento-analcimes", "Argenton-Château", +"Argenton-Notre-Dame", "Argenton-l'Eglise", "Argenton-l'Église", "Argenton-les-Vallées", -"Argenton-Notre-Dame", "Argenton-sur-Creuse", -"argento-perrylite", -"argento-perrylites", "Argentré-du-Plessis", -"Argent-sur-Sauldre", -"argilo-calcaire", -"argilo-calcaires", -"argilo-gréseuse", -"argilo-gréseuses", -"argilo-gréseux", -"argilo-loessique", -"argilo-loessiques", -"argilo-siliceuse", -"argilo-siliceuses", -"argilo-siliceux", -"arginine-méthyla", -"arginine-méthylai", -"arginine-méthylaient", -"arginine-méthylais", -"arginine-méthylait", -"arginine-méthylâmes", -"arginine-méthylant", -"arginine-méthylas", -"arginine-méthylasse", -"arginine-méthylassent", -"arginine-méthylasses", -"arginine-méthylassiez", -"arginine-méthylassions", -"arginine-méthylât", -"arginine-méthylâtes", -"arginine-méthyle", -"arginine-méthylé", -"arginine-méthylée", -"arginine-méthylées", -"arginine-méthylent", -"arginine-méthyler", -"arginine-méthylera", -"arginine-méthylerai", -"arginine-méthyleraient", -"arginine-méthylerais", -"arginine-méthylerait", -"arginine-méthyleras", -"arginine-méthylèrent", -"arginine-méthylerez", -"arginine-méthyleriez", -"arginine-méthylerions", -"arginine-méthylerons", -"arginine-méthyleront", -"arginine-méthyles", -"arginine-méthylés", -"arginine-méthylez", -"arginine-méthyliez", -"arginine-méthylions", -"arginine-méthylons", -"arginine-vasopressine", "Argiusta-Moriccio", "Argut-Dessous", "Argut-Dessus", -"ariaco-dompierrois", "Ariaco-Dompierrois", -"ariaco-dompierroise", "Ariaco-Dompierroise", -"ariaco-dompierroises", "Ariaco-Dompierroises", "Aries-Espénan", -"aristo-bourgeoisie", -"aristo-bourgeoisies", -"aristotélico-thomiste", -"aristotélico-thomistes", -"arivey-lingeois", "Arivey-Lingeois", -"arivey-lingeoise", "Arivey-Lingeoise", -"arivey-lingeoises", "Arivey-Lingeoises", "Arles-sur-Tech", "Arleux-en-Gohelle", -"armançon-martinois", "Armançon-Martinois", -"armançon-martinoise", "Armançon-Martinoise", -"armançon-martinoises", "Armançon-Martinoises", "Armbouts-Cappel", -"armbouts-cappellois", "Armbouts-Cappellois", -"armbouts-cappelloise", "Armbouts-Cappelloise", -"armbouts-cappelloises", "Armbouts-Cappelloises", "Armenonville-les-Gâtineaux", "Armentières-en-Brie", "Armentières-sur-Avre", "Armentières-sur-Ourcq", "Armous-et-Cau", -"Arnac-la-Poste", "Arnac-Pompadour", +"Arnac-la-Poste", "Arnac-sur-Dourdou", "Arnaud-Guilhem", -"arnaud-guilhémois", "Arnaud-Guilhémois", -"arnaud-guilhémoise", "Arnaud-Guilhémoise", -"arnaud-guilhémoises", "Arnaud-Guilhémoises", "Arnay-le-Duc", "Arnay-sous-Vitteaux", @@ -953,10 +547,6 @@ FR_BASE_EXCEPTIONS = [ "Arpheuilles-Saint-Priest", "Arques-la-Bataille", "Arquettes-en-Val", -"arrache-clou", -"arrache-clous", -"arrache-pied", -"arrache-sonde", "Arraia-Maeztu", "Arrancy-sur-Crusne", "Arras-en-Lavedan", @@ -968,39 +558,27 @@ FR_BASE_EXCEPTIONS = [ "Arrayou-Lahitte", "Arrens-Marsous", "Arrentès-de-Corcieux", -"arrêt-buffet", -"arrêt-court", -"arrête-boeuf", -"arrête-bœuf", -"arrête-bœufs", -"arrêts-buffet", -"arrêts-courts", "Arricau-Bordes", "Arrien-en-Bethmale", "Arrodets-ez-Angles", "Arromanches-les-Bains", -"Arros-de-Nay", "Arros-d'Oloron", -"arrow-root", -"Arsac-en-Velay", -"Ars-en-Ré", -"ars-laquenexois", +"Arros-de-Nay", "Ars-Laquenexois", -"ars-laquenexoise", "Ars-Laquenexoise", -"ars-laquenexoises", "Ars-Laquenexoises", "Ars-Laquenexy", +"Ars-en-Ré", "Ars-les-Favets", "Ars-sur-Formans", "Ars-sur-Moselle", +"Arsac-en-Velay", "Arsure-Arsurette", +"Art-sur-Meurthe", "Artaise-le-Vivier", "Artalens-Souin", "Artannes-sur-Indre", "Artannes-sur-Thouet", -"artério-sclérose", -"artério-scléroses", "Arthaz-Pont-Notre-Dame", "Arthez-d'Armagnac", "Arthez-d'Asson", @@ -1008,59 +586,15 @@ FR_BASE_EXCEPTIONS = [ "Arthon-en-Retz", "Artignosc-sur-Verdon", "Artigues-près-Bordeaux", -"artisan-créateur", -"artisans-créateurs", -"Art-sur-Meurthe", -"art-thérapie", -"art-thérapies", "Arzacq-Arraziguet", "Arzenc-d'Apcher", "Arzenc-de-Randon", "Arzillières-Neuville", +"Arâches-la-Frasse", "Asasp-Arros", "Asbach-Bäumenheim", "Asbach-Sickenberg", "Aschères-le-Marché", -"a-sexualisa", -"a-sexualisai", -"a-sexualisaient", -"a-sexualisais", -"a-sexualisait", -"a-sexualisâmes", -"a-sexualisant", -"a-sexualisas", -"a-sexualisasse", -"a-sexualisassent", -"a-sexualisasses", -"a-sexualisassiez", -"a-sexualisassions", -"a-sexualisât", -"a-sexualisâtes", -"a-sexualise", -"a-sexualisé", -"a-sexualisée", -"a-sexualisées", -"a-sexualisent", -"a-sexualiser", -"a-sexualiser", -"a-sexualisera", -"a-sexualiserai", -"a-sexualiseraient", -"a-sexualiserais", -"a-sexualiserait", -"a-sexualiseras", -"a-sexualisèrent", -"a-sexualiserez", -"a-sexualiseriez", -"a-sexualiserions", -"a-sexualiserons", -"a-sexualiseront", -"a-sexualises", -"a-sexualisés", -"a-sexualisez", -"a-sexualisiez", -"a-sexualisions", -"a-sexualisons", "Asnans-Beauvoisin", "Asnières-en-Bessin", "Asnières-en-Montagne", @@ -1074,70 +608,32 @@ FR_BASE_EXCEPTIONS = [ "Asnières-sur-Saône", "Asnières-sur-Seine", "Asnières-sur-Vègre", +"Aspach-Michelbach", "Aspach-le-Bas", "Aspach-le-Haut", -"Aspach-Michelbach", "Aspin-Aure", "Aspin-en-Lavedan", "Aspres-lès-Corps", "Aspres-sur-Buëch", "Aspret-Sarrat", -"assa-foetida", "Assais-les-Jumeaux", -"Assé-le-Bérenger", -"Assé-le-Boisne", -"Assé-le-Riboul", -"assemble-nuages", -"assiette-à-beurre", -"assis-debout", "Assis-sur-Serre", -"assurance-chômage", -"assurance-chômages", -"assurance-emploi", -"assurances-chômage", -"assurances-vie", -"assurance-vie", -"assyro-chaldéen", "Assyro-Chaldéen", +"Assé-le-Boisne", +"Assé-le-Bérenger", +"Assé-le-Riboul", "Aste-Béon", "Aston-Jonction", -"astronome-astrologue", -"astronomes-astrologues", -"astur-léonais", -"ataxie-télangiectasie", -"Athée-sur-Cher", "Athesans-Etroitefontaine", "Athesans-Étroitefontaine", "Athies-sous-Laon", -"Athis-de-l'Orne", "Athis-Mons", +"Athis-Val de Rouvre", +"Athis-de-l'Orne", "Athos-Aspis", -"attache-bossette", -"attache-bossettes", -"attaché-case", -"attaché-cases", -"attache-doudou", -"attache-doudous", -"attachés-cases", +"Athée-sur-Cher", "Attenrode-Wever", -"attentats-suicides", -"attentat-suicide", "Attignat-Oncin", -"atto-ohm", -"atto-ohms", -"attrape-couillon", -"attrape-couillons", -"attrape-minette", -"attrape-minettes", -"attrape-minon", -"attrape-minons", -"attrape-mouche", -"attrape-mouches", -"attrape-nigaud", -"attrape-nigauds", -"attrape-rêves", -"attrape-tout", -"attrape-vilain", "Aubenas-les-Alpes", "Aubencheul-au-Bac", "Aubencheul-aux-Bois", @@ -1145,19 +641,16 @@ FR_BASE_EXCEPTIONS = [ "Aubepierre-sur-Aube", "Auberives-en-Royans", "Auberives-sur-Varèze", +"Aubermesnil-Beaumais", "Aubermesnil-aux-Erables", "Aubermesnil-aux-Érables", -"Aubermesnil-Beaumais", "Aubert-Gallionnais", "Auberville-la-Campagne", "Auberville-la-Manuel", "Auberville-la-Renault", "Aubeterre-sur-Dronne", -"aube-vigne", "Aubie-et-Espessas", -"Aubigné-Briand", -"Aubigné-Racan", -"Aubigné-sur-Layon", +"Aubigny-Les Clouzeaux", "Aubigny-au-Bac", "Aubigny-aux-Kaisnes", "Aubigny-en-Artois", @@ -1169,6 +662,9 @@ FR_BASE_EXCEPTIONS = [ "Aubigny-lès-Sombernon", "Aubigny-sur-Badin", "Aubigny-sur-Nère", +"Aubigné-Briand", +"Aubigné-Racan", +"Aubigné-sur-Layon", "Aubin-Saint-Vaast", "Auboncourt-Vauzelles", "Aubry-du-Hainaut", @@ -1180,44 +676,25 @@ FR_BASE_EXCEPTIONS = [ "Auchay-sur-Vendée", "Auchy-au-Bois", "Auchy-la-Montagne", -"Auchy-lès-Hesdin", "Auchy-les-Mines", "Auchy-lez-Orchies", -"au-deçà", -"au-dedans", -"au-dehors", -"au-delà", -"au-delàs", +"Auchy-lès-Hesdin", "Aude-Line", -"Audenhove-Sainte-Marie", "Audenhove-Saint-Géry", -"au-dessous", -"au-dessus", -"au-devant", -"audio-numérique", -"audio-numériques", -"audio-prothésiste", -"audio-prothésistes", -"audio-visuel", -"audio-visuelle", -"audio-visuelles", -"audio-visuels", +"Audenhove-Sainte-Marie", "Audouville-la-Hubert", "Audun-le-Roman", "Audun-le-Tiche", "Auffreville-Brasseuil", "Auffrique-et-Nogent", +"Auge-Saint-Médard", "Auger-Saint-Vincent", "Augers-en-Brie", "Augerville-la-Rivière", -"Auge-Saint-Médard", "Augy-sur-Aubois", "Aujan-Mournède", -"aujourd'hui", "Aulhat-Flat", "Aulhat-Saint-Privat", -"aulnaie-frênaie", -"aulnaies-frênaies", "Aulnay-aux-Planches", "Aulnay-l'Aître", "Aulnay-la-Rivière", @@ -1229,17 +706,15 @@ FR_BASE_EXCEPTIONS = [ "Aulnois-sous-Laon", "Aulnois-sous-Vertuzey", "Aulnois-sur-Seille", -"Aulnoye-Aymeries", "Aulnoy-lez-Valenciennes", "Aulnoy-sur-Aube", -"au-lof", -"auloi-jumeaux", +"Aulnoye-Aymeries", "Aulus-les-Bains", "Aulx-lès-Cromary", -"Auménancourt-le-Petit", "Aumeville-Lestre", "Aumont-Aubrac", "Aumont-en-Halatte", +"Auménancourt-le-Petit", "Aunac-sur-Charente", "Aunay-en-Bazois", "Aunay-les-Bois", @@ -1251,78 +726,52 @@ FR_BASE_EXCEPTIONS = [ "Aunou-sur-Orne", "Aurec-sur-Loire", "Aurelle-Verlac", +"Auriac-Lagast", "Auriac-de-Bourzac", "Auriac-du-Périgord", -"Auriac-Lagast", "Auriac-l'Eglise", "Auriac-l'Église", "Auriac-sur-Dropt", "Auriac-sur-Vendinelle", "Auribeau-sur-Siagne", -"auriculo-ventriculaire", -"auriculo-ventriculaires", "Aurions-Idernes", -"aurum-musivum", "Aussac-Vadalle", -"aussi-tost", -"aussi-tôt", "Australie-Méridionale", "Australie-Occidentale", -"australo-américain", -"austro-asiatique", -"austro-asiatiques", -"austro-hongrois", "Austro-Hongrois", -"austro-hongroise", "Austro-Hongroise", -"austro-hongroises", "Austro-Hongroises", -"austro-occidental", -"austro-occidentale", -"austro-occidentales", -"austro-occidentaux", "Autechaux-Roide", -"auteur-compositeur", -"auteure-compositrice", -"auteures-compositrices", -"auteurs-compositeurs", "Autevielle-Saint-Martin-Bideren", "Autheuil-Authouillet", "Autheuil-en-Valois", "Authieux-Ratiéville", -"Authon-du-Perche", "Authon-Ebéon", -"Authon-Ébéon", +"Authon-du-Perche", "Authon-la-Plaine", +"Authon-Ébéon", "Autigny-la-Tour", "Autigny-le-Grand", "Autigny-le-Petit", -"autos-caravanes", -"autos-mitrailleuses", -"autos-scooters", -"autos-tamponnantes", -"autos-tamponneuses", -"au-tour", -"Autrecourt-et-Pourron", -"Autrécourt-sur-Aire", +"Autrans-Méaudre en Vercors", "Autre-Église", -"autre-églisois", "Autre-Églisois", "Autre-Églisoise", -"autre-littérature", -"Autréville-Saint-Lambert", -"Autreville-sur-la-Renne", +"Autrecourt-et-Pourron", "Autreville-sur-Moselle", +"Autreville-sur-la-Renne", +"Autrey-le-Vay", "Autrey-lès-Cerre", "Autrey-lès-Gray", -"Autrey-le-Vay", "Autriche-Hongrie", "Autruy-sur-Juine", "Autry-Issards", "Autry-le-Châtel", +"Autrécourt-sur-Aire", +"Autréville-Saint-Lambert", "Auvergne-Rhône-Alpes", -"Auvers-le-Hamon", "Auvers-Saint-Georges", +"Auvers-le-Hamon", "Auvers-sous-Montfaucon", "Auvers-sur-Oise", "Auvet-et-la-Chapelotte", @@ -1338,90 +787,63 @@ FR_BASE_EXCEPTIONS = [ "Auxon-Dessus", "Auzat-la-Combelle", "Auzat-sur-Allier", -"Auzéville-en-Argonne", "Auzeville-Tolosane", "Auzouer-en-Touraine", "Auzouville-Auberbosc", "Auzouville-l'Esneval", "Auzouville-sur-Ry", "Auzouville-sur-Saâne", -"Availles-en-Châtellerault", +"Auzéville-en-Argonne", "Availles-Limouzine", +"Availles-Thouarsais", +"Availles-en-Châtellerault", "Availles-sur-Chizé", "Availles-sur-Seiche", -"Availles-Thouarsais", -"avale-tout", -"avale-tout-cru", -"avale-touts", "Avanne-Aveney", -"avants-centres", -"avants-postes", +"Avant-lès-Marcilly", +"Avant-lès-Ramerupt", "Avaux-la-Ville", "Ave-et-Auffe", -"ave-et-auffois", "Ave-et-Auffois", "Ave-et-Auffoise", "Avenay-Val-d'Or", "Avernas-le-Bauduin", "Avernes-Saint-Gourgon", "Avernes-sous-Exmes", -"averno-méditerranéen", -"averno-méditerranéenne", -"averno-méditerranéennes", -"averno-méditerranéens", -"Avéron-Bergelle", "Avesnes-Chaussoy", "Avesnes-en-Bray", "Avesnes-en-Saosnois", "Avesnes-en-Val", "Avesnes-le-Comte", +"Avesnes-le-Sec", "Avesnes-les-Aubert", "Avesnes-lès-Bapaume", -"Avesnes-le-Sec", "Avesnes-sur-Helpe", -"aveugle-né", -"aveugle-née", -"aveugles-nés", "Avezac-Prat-Lahitte", -"A.-Vict.", -"Avignonet-Lauragais", "Avignon-lès-Saint-Claude", +"Avignonet-Lauragais", "Avillers-Sainte-Croix", "Avilly-Saint-Léonard", -"avion-cargo", -"avions-cargos", "Avirey-Lingey", -"avoir-du-poids", "Avon-la-Pèze", "Avon-les-Roches", "Avrigney-Virey", -"Avrillé-les-Ponceaux", "Avril-sur-Loire", +"Avrillé-les-Ponceaux", +"Avéron-Bergelle", "Awala-Yalimapo", "Ax-les-Thermes", -"axo-missien", "Axo-Missien", -"axo-missienne", "Axo-Missienne", -"axo-missiennes", "Axo-Missiennes", -"axo-missiens", "Axo-Missiens", +"Ay-sur-Moselle", "Ayala-Aiara", -"ayant-cause", -"ayant-droit", -"ayants-cause", -"ayants-droit", "Ayat-sur-Sioule", -"Aÿ-Champagne", -"aye-aye", "Ayer's-Cliffois", -"ayes-ayes", "Ayguatébia-Talau", "Ayguemorte-les-Graves", "Ayros-Arbouix", -"Ay-sur-Moselle", -"ayur-veda", "Ayzac-Ost", "Azannes-et-Soumazannes", "Azanuy-Alins", @@ -1435,247 +857,141 @@ FR_BASE_EXCEPTIONS = [ "Azay-sur-Indre", "Azay-sur-Thouet", "Azilone-Ampaza", -"azinphos-éthyl", -"azinphos-méthyl", "Azy-le-Vif", "Azy-sur-Marne", +"Aínsa-Sobrarbe", +"Aïcirits-Camou-Suhast", +"Aïd-el-Kébir", +"Aïd-el-Séghir", +"Aÿ-Champagne", "B-52", +"B-frame", +"B-spline", +"B-splines", +"BVD-MD", "Baaks-Sweijer", "Baar-Ebenhausen", "Baarle-Nassau", "Baarle-Nassau-Grens", -"baa'thisa", -"baa'thisai", -"baa'thisaient", -"baa'thisais", -"baa'thisait", -"baa'thisâmes", -"baa'thisant", -"baa'thisas", -"baa'thisasse", -"baa'thisassent", -"baa'thisasses", -"baa'thisassiez", -"baa'thisassions", -"baa'thisât", -"baa'thisâtes", -"baa'thise", -"baa'thisé", -"baa'thisée", -"baa'thisées", -"baa'thisent", -"baa'thiser", -"baa'thisera", -"baa'thiserai", -"baa'thiseraient", -"baa'thiserais", -"baa'thiserait", -"baa'thiseras", -"baa'thisèrent", -"baa'thiserez", -"baa'thiseriez", -"baa'thiserions", -"baa'thiserons", -"baa'thiseront", -"baa'thises", -"baa'thisés", -"baa'thisez", -"baa'thisiez", -"baa'thisions", -"baa'thisons", -"b-a-ba", -"b.a.-ba", "Babeau-Bouldoux", -"babil's", -"babine-witsuwit'en", -"baby-beef", -"baby-beefs", -"baby-boom", -"baby-boomer", -"baby-boomers", -"baby-boomeur", -"baby-boomeurs", -"baby-boomeuse", -"baby-boomeuses", -"baby-foot", -"baby-foots", -"baby-sitter", -"baby-sitters", -"baby-sitting", -"baby-sittings", -"bachat-long", -"bachat-longs", -"bachi-bouzouck", -"bachi-bouzoucks", -"bachi-bouzouk", -"bachi-bouzouks", "Bachos-Binos", "Bachte-Maria-Leerne", "Bacouel-sur-Selle", "Bacqueville-en-Caux", +"Bade-Wurtemberg", "Badecon-le-Pin", "Badefols-d'Ans", "Badefols-de-Cadouin", "Badefols-sur-Dordogne", "Baden-Baden", -"Bade-Wurtemberg", "Badménil-aux-Bois", "Badonvilliers-Gérauvilliers", "Baerle-Duc", "Bagat-en-Quercy", -"Bâgé-la-Ville", -"Bâgé-le-Châtel", "Bagnac-sur-Célé", "Bagneaux-sur-Loing", -"Bagnères-de-Bigorre", -"Bagnères-de-Luchon", "Bagneux-la-Fosse", +"Bagnoles de l'Orne Normandie", "Bagnoles-de-l'Orne", "Bagnols-en-Forêt", "Bagnols-les-Bains", "Bagnols-sur-Cèze", +"Bagnères-de-Bigorre", +"Bagnères-de-Luchon", "Baguer-Morvan", "Baguer-Pican", -"bahá'í", -"bahá'íe", -"bahá'íes", -"bahá'ís", -"Bahá'u'lláh", "Bahus-Soubiran", +"Bahá'u'lláh", "Baie-Catherinois", "Baie-Comelien", "Baie-Comellien", "Baie-Comien", "Baie-Comois", -"Baie-des-Sablien", -"Baie-du-Febvre", "Baie-Jolien", "Baie-Mahault", -"baie-mahaultien", "Baie-Mahaultien", -"baie-mahaultienne", "Baie-Mahaultienne", -"baie-mahaultiennes", "Baie-Mahaultiennes", -"baie-mahaultiens", "Baie-Mahaultiens", "Baie-Saint-Paulois", "Baie-Trinitois", +"Baie-des-Sablien", +"Baie-du-Febvre", "Baignes-Sainte-Radegonde", "Baigneux-les-Juifs", "Baigts-de-Béarn", "Bailleau-Armenonville", -"Bailleau-le-Pin", "Bailleau-l'Evêque", "Bailleau-l'Évêque", -"baille-blé", +"Bailleau-le-Pin", "Baillet-en-France", +"Bailleul-Neuville", +"Bailleul-Sir-Berthoult", "Bailleul-aux-Cornailles", "Bailleul-la-Vallée", "Bailleul-le-Soc", "Bailleul-lès-Pernes", -"Bailleul-Neuville", -"Bailleul-Sir-Berthoult", "Bailleul-sur-Thérain", -"Bailly-aux-Forges", "Bailly-Carrois", +"Bailly-Romainvilliers", +"Bailly-aux-Forges", "Bailly-en-Rivière", "Bailly-le-Franc", -"Bailly-Romainvilliers", "Bain-de-Bretagne", -"bain-douche", -"bain-marie", -"bains-douches", "Bains-les-Bains", -"bains-marie", "Bains-sur-Oust", "Bainville-aux-Miroirs", "Bainville-aux-Saules", "Bainville-sur-Madon", -"Bairon-le-Mont-Dieu", "Bairon-Mont-Dieu", -"baise-en-ville", -"baise-main", +"Bairon-le-Mont-Dieu", "Baisy-Thy", "Bakkum-Noord", "Balagny-sur-Thérain", "Balaguier-d'Olt", "Balaguier-sur-Rance", -"balai-brosse", -"balais-brosses", "Balaives-et-Butz", -"Balaruc-les-Bains", "Balaruc-le-Vieux", -"Bâle-Campagne", -"baleine-pilote", -"baleines-pilotes", +"Balaruc-les-Bains", "Balesmes-sur-Marne", -"Bâle-Ville", "Baliracq-Maumusson", -"Ballancourt-sur-Essonne", "Ballan-Miré", -"balle-molle", -"balle-queue", +"Ballancourt-sur-Essonne", "Balleroy-sur-Drôme", -"ballon-panier", +"Ballon-Saint Mars", "Ballon-Saint-Mars", -"ballon-sonde", -"ballons-panier", -"ballons-paniers", -"ballons-sondes", -"ballon-volant", "Ballrechten-Dottingen", -"ball-trap", -"bal-musette", "Balnot-la-Grange", "Balnot-sur-Laignes", -"bals-musette", -"bana-bana", -"bana-banas", -"banana-split", -"banana-splits", -"Banassac-Canilhac", -"bande-annonce", +"Ban-Saint-Martin", +"Ban-Saint-Martinois", +"Ban-Saint-Martinoise", +"Ban-Saint-Martinoises", "Ban-de-Laveline", -"ban-de-lavelinois", "Ban-de-Lavelinois", -"ban-de-lavelinoise", "Ban-de-Lavelinoise", -"ban-de-lavelinoises", "Ban-de-Lavelinoises", -"bandes-annonces", "Ban-de-Sapt", -"bande-son", -"bank-note", -"bank-notes", +"Ban-sur-Meurthe", +"Ban-sur-Meurthe-Clefcy", +"Banassac-Canilhac", "Banneville-la-Campagne", "Banneville-sur-Ajon", "Bannost-Villegagnon", "Banogne-Recouvrance", -"Ban-Saint-Martin", -"ban-saint-martinois", -"Ban-Saint-Martinois", -"ban-saint-martinoise", -"Ban-Saint-Martinoise", -"ban-saint-martinoises", -"Ban-Saint-Martinoises", -"Ban-sur-Meurthe", -"Ban-sur-Meurthe-Clefcy", "Banyuls-dels-Aspres", "Banyuls-sur-Mer", "Baons-le-Comte", "Bapeaume-lès-Rouen", +"Bar-et-Harricourt", +"Bar-le-Duc", +"Bar-lès-Buzancy", +"Bar-sur-Aube", +"Bar-sur-Seine", "Barbazan-Debat", "Barbazan-Dessus", -"barbe-à-papa", "Barbe-Bleue", -"barbe-de-bouc", -"barbe-de-capucin", -"barbe-de-chèvre", -"barbe-de-Jupiter", "Barberey-Saint-Sulpice", -"barbes-de-capucin", -"barbes-de-Jupiter", "Barbey-Seroux", "Barbezieux-Saint-Hilaire", "Barbirey-sur-Ouche", @@ -1683,13 +999,11 @@ FR_BASE_EXCEPTIONS = [ "Barcelonne-du-Gers", "Bard-le-Régulier", "Bard-lès-Epoisses", -"Bard-lès-Époisses", "Bard-lès-Pesmes", +"Bard-lès-Époisses", "Barenton-Bugny", "Barenton-Cel", "Barenton-sur-Serre", -"Barésia-sur-l'Ain", -"Bar-et-Harricourt", "Barger-Compascuum", "Barger-Erfscheidenveen", "Barger-Oosterveen", @@ -1698,16 +1012,6 @@ FR_BASE_EXCEPTIONS = [ "Barisey-au-Plain", "Barisey-la-Côte", "Barisis-aux-Bois", -"barium-adulaire", -"barium-adulaires", -"barium-anorthite", -"barium-anorthites", -"barium-phlogopite", -"barium-phlogopites", -"barium-sanidine", -"barium-sanidines", -"Bar-le-Duc", -"Bar-lès-Buzancy", "Barletta-Andria-Trani", "Barneville-Carteret", "Barneville-la-Bertran", @@ -1716,9 +1020,7 @@ FR_BASE_EXCEPTIONS = [ "Barou-en-Auge", "Barrais-Bussolles", "Barraute-Camu", -"barré-bandé", "Barre-des-Cévennes", -"barrés-bandés", "Barret-de-Lioure", "Barret-le-Bas", "Barret-le-Haut", @@ -1726,95 +1028,36 @@ FR_BASE_EXCEPTIONS = [ "Barriac-les-Bosquets", "Barrow-in-Furness", "Barry-d'Islemade", -"bars-tabacs", -"Bar-sur-Aube", -"Bar-sur-Seine", -"bar-tabac", -"bar-tabacs", "Bartenshagen-Parkentin", "Barvaux-Condroz", "Barville-en-Gâtinais", -"baryton-basse", -"barytons-basses", -"baryum-orthose", -"baryum-orthoses", "Barzy-en-Thiérache", "Barzy-sur-Marne", +"Barésia-sur-l'Ain", +"Bas-Lieu", +"Bas-Mauco", +"Bas-en-Basset", +"Bas-et-Lezat", "Basadingen-Schlattingen", -"basco-béarnaise", -"basco-navarrais", -"base-ball", -"base-balls", -"base-jump", -"base-jumpeur", -"base-jumpeurs", -"base-jumpeuse", -"base-jumpeuses", -"basi-sphénoïdal", -"basket-ball", -"basket-balls", "Baslieux-lès-Fismes", "Baslieux-sous-Châtillon", -"baso-cellulaire", -"baso-cellulaires", -"basque-uruguayen", -"basset-hound", -"bassi-colica", -"bassi-colicas", +"Basse-Goulaine", +"Basse-Ham", +"Basse-Pointe", +"Basse-Rentgen", +"Basse-Terre", +"Basse-sur-le-Rupt", "Bassignac-le-Bas", "Bassignac-le-Haut", "Bassillac-et-Auberoche", "Bassillon-Vauzé", -"bassins-versants", -"bassin-versant", "Bassoles-Aulers", -"bat-à-beurre", -"bat-à-bourre", -"bateau-bus", -"bateau-citerne", -"bateau-dragon", -"bateau-école", -"bateau-feu", -"bateau-lavoir", -"bateau-logement", -"bateau-mère", -"bateau-mouche", -"bateau-phare", -"bateau-usine", -"bateau-vanne", -"bateaux-bus", -"bateaux-citernes", -"bateaux-dragons", -"bateaux-écoles", -"bateaux-feu", -"bateaux-lavoirs", -"bateaux-logements", -"bateaux-mères", -"bateaux-mouches", -"bateaux-phare", -"bateaux-usines", -"bateaux-vanne", -"bat-flanc", -"bat-flancs", "Bathelémont-lès-Bauzemont", "Batignolles-Monceaux", "Batilly-en-Gâtinais", "Batilly-en-Puisaye", -"bat-l'eau", -"bats-à-beurre", -"bats-à-bourre", -"bats-l'eau", -"battant-l'oeil", -"battant-l'œil", -"battants-l'oeil", -"battants-l'œil", -"batte-lessive", -"batte-mare", -"Battenans-les-Mines", "Battenans-Varin", -"batte-plate", -"batte-queue", -"battes-plates", +"Battenans-les-Mines", "Batz-sur-Mer", "Baudinard-sur-Verdon", "Baugé-en-Anjou", @@ -1822,36 +1065,30 @@ FR_BASE_EXCEPTIONS = [ "Baulne-en-Brie", "Baume-les-Dames", "Baume-les-Messieurs", -"baussery-montain", "Baussery-Montain", -"baussery-montaine", "Baussery-Montaine", -"baussery-montaines", "Baussery-Montaines", -"baussery-montains", "Baussery-Montains", +"Bay-sur-Aube", "Bayard-sur-Marne", "Bayenghem-lès-Eperlecques", -"Bayenghem-lès-Éperlecques", "Bayenghem-lès-Seninghem", +"Bayenghem-lès-Éperlecques", "Bayerfeld-Steckweiler", -"bay-ice", -"bay-ices", "Bayon-sur-Gironde", "Bayonville-sur-Mad", -"Bay-sur-Aube", "Bazeilles-sur-Othain", "Bazincourt-sur-Epte", "Bazincourt-sur-Saulx", "Bazoches-au-Houlme", "Bazoches-en-Dunois", -"Bazoches-lès-Bray", "Bazoches-les-Gallerandes", "Bazoches-les-Hautes", +"Bazoches-lès-Bray", "Bazoches-sur-Guyonne", "Bazoches-sur-Hoëne", -"Bazoches-sur-le-Betz", "Bazoches-sur-Vesles", +"Bazoches-sur-le-Betz", "Bazoges-en-Paillers", "Bazoges-en-Pareds", "Bazoilles-et-Ménil", @@ -1861,23 +1098,16 @@ FR_BASE_EXCEPTIONS = [ "Bazouges-sur-le-Loir", "Bazus-Aure", "Bazus-Neste", -"beach-volley", -"beach-volleys", -"beagle-harrier", -"Béard-Géovreissiat", "Beaubec-la-Rosière", +"Beaucamps-Ligny", "Beaucamps-le-Jeune", "Beaucamps-le-Vieux", -"Beaucamps-Ligny", "Beauchamps-sur-Huillard", -"beau-chasseur", "Beauchery-Saint-Martin", "Beaucourt-en-Santerre", "Beaucourt-sur-l'Ancre", "Beaucourt-sur-l'Hallue", -"beau-dabe", "Beauficel-en-Lyons", -"beau-fils", "Beaufort-Blavincourt", "Beaufort-en-Anjou", "Beaufort-en-Argonne", @@ -1885,30 +1115,35 @@ FR_BASE_EXCEPTIONS = [ "Beaufort-en-Vallée", "Beaufort-sur-Gervanne", "Beaufour-Druval", -"beau-frais", -"beau-frère", "Beaugies-sous-Bois", "Beaujeu-Saint-Vallier-Pierrejux-et-Quitteur", -"beaujolais-villages", "Beaulieu-en-Argonne", "Beaulieu-les-Fontaines", "Beaulieu-lès-Loches", "Beaulieu-sous-Bressuire", -"Beaulieu-sous-la-Roche", "Beaulieu-sous-Parthenay", +"Beaulieu-sous-la-Roche", "Beaulieu-sur-Dordogne", "Beaulieu-sur-Layon", "Beaulieu-sur-Loire", "Beaulieu-sur-Mer", "Beaulieu-sur-Oudon", "Beaulieu-sur-Sonnette", -"beau-livre", "Beaulne-et-Chivy", "Beaumerie-Saint-Martin", "Beaumes-de-Venise", "Beaumetz-lès-Aire", "Beaumetz-lès-Cambrai", "Beaumetz-lès-Loges", +"Beaumont-Hague", +"Beaumont-Hamel", +"Beaumont-Louestault", +"Beaumont-Monteux", +"Beaumont-Pied-de-Bœuf", +"Beaumont-Pied-de-Bœuf", +"Beaumont-Saint-Cyr", +"Beaumont-Sardolles", +"Beaumont-Village", "Beaumont-de-Lomagne", "Beaumont-de-Pertuis", "Beaumont-du-Gâtinais", @@ -1922,8 +1157,6 @@ FR_BASE_EXCEPTIONS = [ "Beaumont-en-Diois", "Beaumont-en-Verdunois", "Beaumont-en-Véron", -"Beaumont-Hague", -"Beaumont-Hamel", "Beaumont-la-Chartre", "Beaumont-la-Ferrière", "Beaumont-la-Ronce", @@ -1933,11 +1166,6 @@ FR_BASE_EXCEPTIONS = [ "Beaumont-les-Nonains", "Beaumont-lès-Randan", "Beaumont-lès-Valence", -"Beaumont-Louestault", -"Beaumont-Monteux", -"Beaumont-Pied-de-Bœuf", -"Beaumont-Saint-Cyr", -"Beaumont-Sardolles", "Beaumont-sur-Dême", "Beaumont-sur-Grosne", "Beaumont-sur-Lèze", @@ -1945,7 +1173,6 @@ FR_BASE_EXCEPTIONS = [ "Beaumont-sur-Sarthe", "Beaumont-sur-Vesle", "Beaumont-sur-Vingeanne", -"Beaumont-Village", "Beaumotte-Aubertans", "Beaumotte-lès-Montbozon-et-Aubertans", "Beaumotte-lès-Pin", @@ -1953,188 +1180,79 @@ FR_BASE_EXCEPTIONS = [ "Beaune-la-Rolande", "Beaune-les-Mines", "Beaune-sur-Arzon", -"beau-papa", -"beau-parent", -"beau-partir", -"beau-père", -"beau-petit-fils", "Beaupréau-en-Mauges", "Beaurains-lès-Noyon", "Beauregard-Baret", +"Beauregard-Vendon", "Beauregard-de-Terrasson", "Beauregard-et-Bassac", "Beauregard-l'Evêque", "Beauregard-l'Évêque", -"Beauregard-Vendon", "Beaurepaire-en-Bresse", "Beaurepaire-sur-Sambre", -"beau-revoir", -"beau-semblant", -"Beaussais-sur-Mer", "Beaussais-Vitré", +"Beaussais-sur-Mer", "Beauvais-sur-Matha", "Beauvais-sur-Tescou", "Beauval-en-Caux", +"Beauvoir-Rivière", +"Beauvoir-Wavans", "Beauvoir-de-Marc", "Beauvoir-en-Lyons", "Beauvoir-en-Royans", -"Beauvoir-Rivière", "Beauvoir-sur-Mer", "Beauvoir-sur-Niort", "Beauvoir-sur-Sarce", -"Beauvoir-Wavans", "Beauvois-en-Cambrésis", "Beauvois-en-Vermandois", -"beaux-arts", "Beaux-Arts", -"beaux-dabes", -"beaux-enfants", -"beaux-esprits", -"beaux-fils", -"beaux-frères", -"beaux-oncles", -"beaux-parents", -"beaux-pères", -"beaux-petits-fils", "Beaux-Rivageois", -"bébé-bulle", -"bébé-bus", -"bébé-éprouvette", -"bébé-médicament", -"bébé-nageur", -"bébés-bulles", -"bébés-éprouvette", -"bébés-médicament", -"bébés-nageurs", -"bêche-de-mer", -"bêches-de-mer", +"Bec-de-Mortagne", "Bech-Kleinmacher", -"Bécon-les-Granits", -"Bécordel-Bécourt", -"becque-cornu", -"becques-cornus", -"becs-cornus", -"becs-courbes", -"becs-d'âne", -"becs-d'argent", -"becs-de-cane", -"becs-de-canon", -"becs-de-cigogne", -"becs-de-cire", -"becs-de-corbeau", -"becs-de-crosse", -"becs-de-cygne", -"becs-de-faucon", -"becs-de-grue", -"becs-de-hache", -"becs-de-héron", -"becs-de-lézard", -"becs-de-lièvre", -"becs-de-perroquet", -"becs-de-pigeon", -"becs-de-vautour", -"becs-d'oie", -"becs-durs", -"becs-en-ciseaux", -"becs-en-fourreau", -"becs-ouverts", -"becs-plats", -"becs-pointus", -"becs-ronds", -"becs-tranchants", "Bedburg-Hau", -"Bédeilhac-et-Aynat", -"bedlington-terrier", -"Bédouès-Cocurès", "Beemte-Broekland", "Beffu-et-le-Morthomme", -"bégler-beg", -"béglier-beg", -"Bégrolles-en-Mauges", -"behā'ī", -"Béhasque-Lapiste", -"Behren-lès-Forbach", "Behren-Lübchin", +"Behren-lès-Forbach", "Beiersdorf-Freudenberg", "Beine-Nauroy", "Beintza-Labaien", "Beire-le-Châtel", "Beire-le-Fort", -"bekkō-amé", "Belan-sur-Ource", +"Belbèze-Escoulis", "Belbèze-de-Lauragais", "Belbèze-en-Comminges", "Belbèze-en-Lomagne", -"Belbèze-Escoulis", "Belcastel-et-Buc", -"bel-enfant", -"bel-esprit", -"Bélesta-en-Lauragais", -"bel-étage", -"Belforêt-en-Perche", "Belfort-du-Quercy", "Belfort-sur-Rebenty", -"belgo-hollandais", +"Belforêt-en-Perche", "Belhomert-Guéhouville", "Belin-Béliet", "Belle-Ansois", -"belle-à-voir", -"Bellecombe-en-Bauges", -"Bellecombe-Tarendol", -"belle-dabe", -"belle-dame", -"belle-de-jour", -"belle-de-nuit", -"belle-doche", -"belle-d'onze-heures", -"belle-d'un-jour", "Belle-Eglise", -"Belle-Église", +"Belle-Isle-en-Mer", +"Belle-Isle-en-Terre", "Belle-et-Houllefort", -"belle-étoile", -"belle-famille", -"belle-fille", -"belle-fleur", +"Belle-Église", +"Belle-Île-en-Mer", +"Bellecombe-Tarendol", +"Bellecombe-en-Bauges", +"Bellegarde-Marsal", +"Bellegarde-Poussieu", +"Bellegarde-Sainte-Marie", "Bellegarde-du-Razès", "Bellegarde-en-Diois", "Bellegarde-en-Forez", "Bellegarde-en-Marche", -"Bellegarde-Marsal", -"Bellegarde-Poussieu", -"Bellegarde-Sainte-Marie", "Bellegarde-sur-Valserine", -"Belle-Île-en-Mer", -"Belle-Isle-en-Mer", -"Belle-Isle-en-Terre", -"belle-maman", -"belle-mère", "Bellenod-sous-Origny", "Bellenod-sur-Seine", "Bellenot-sous-Pouilly", -"belle-petite-fille", -"belle-pucelle", "Bellerive-sur-Allier", -"belles-dabes", -"belles-dames", "Belles-Dames", -"belles-de-jour", -"belles-de-nuit", -"belles-doches", -"belles-d'un-jour", -"belles-étoiles", -"belles-familles", -"belles-filles", -"belles-fleurs", "Belles-Forêts", -"belles-lettres", -"belles-mères", -"belle-soeur", -"belle-sœur", -"belles-pucelles", -"belles-soeurs", -"belles-sœurs", -"belles-tantes", -"belle-tante", "Bellevaux-Ligneuville", "Bellevigne-en-Layon", "Belleville-en-Caux", @@ -2149,124 +1267,86 @@ FR_BASE_EXCEPTIONS = [ "Bellou-en-Houlme", "Bellou-le-Trichard", "Bellou-sur-Huisne", +"Belloy-Saint-Léonard", "Belloy-en-France", "Belloy-en-Santerre", -"Belloy-Saint-Léonard", "Belloy-sur-Somme", "Belmont-Bretenoux", +"Belmont-Luthézieu", +"Belmont-Sainte-Foi", +"Belmont-Tramonet", "Belmont-d'Azergues", "Belmont-de-la-Loire", "Belmont-lès-Darney", -"Belmont-Luthézieu", -"Belmont-Sainte-Foi", "Belmont-sur-Buttant", "Belmont-sur-Lausanne", "Belmont-sur-Rance", "Belmont-sur-Vair", "Belmont-sur-Yverdon", -"Belmont-Tramonet", -"bel-oncle", -"bel-outil", "Belrupt-en-Verdunois", -"bels-outils", "Belt-Schutsloot", "Belval-Bois-des-Dames", "Belval-en-Argonne", "Belval-et-Sury", "Belval-sous-Châtillon", -"Belvédère-Campomoro", +"Belvianes-et-Cavirac", "Belvès-de-Castillon", "Belvèze-du-Razès", -"Belvianes-et-Cavirac", +"Belvédère-Campomoro", "Ben-Ahin", -"ben-ahinois", "Ben-Ahinois", "Ben-Ahinoise", "Beneden-Haastrecht", "Beneden-Leeuwen", "Benerville-sur-Mer", -"Bénesse-lès-Dax", -"Bénesse-Maremne", -"Bénévent-et-Charbillac", -"Bénévent-l'Abbaye", "Beney-en-Woëvre", "Bengy-sur-Craon", "Beni-Khiran", -"Béning-lès-Saint-Avold", -"béni-non-non", -"béni-oui-oui", -"Bénivay-Ollon", -"benne-kangourou", "Benque-Dessous-et-Dessus", "Benqué-Molère", -"bensulfuron-méthyle", "Bentayou-Sérée", -"bény-bocain", -"Bény-Bocain", -"bény-bocaine", -"Bény-Bocaine", -"bény-bocaines", -"Bény-Bocaines", -"bény-bocains", -"Bény-Bocains", -"Bény-sur-Mer", -"benzoylprop-éthyl", -"bêque-bois", -"bèque-fleur", -"bèque-fleurs", "Berbérust-Lias", "Bercenay-en-Othe", "Bercenay-le-Hayer", -"Berchem-Sainte-Agathe", "Berchem-Saint-Laurent", -"Berchères-les-Pierres", +"Berchem-Sainte-Agathe", "Berchères-Saint-Germain", +"Berchères-les-Pierres", "Berchères-sur-Vesgre", "Berd'huis", -"berd'huisien", "Berd'huisien", -"berd'huisienne", "Berd'huisienne", -"berd'huisiennes", "Berd'huisiennes", -"berd'huisiens", "Berd'huisiens", "Berendrecht-Zandvliet-Lillo", -"Bérengeville-la-Campagne", +"Berg-op-Zoom", +"Berg-sur-Moselle", +"Bergouey-Viellenave", +"Bergues-sur-Sambre", "Bergères-lès-Vertus", "Bergères-sous-Montmirail", -"Berg-op-Zoom", -"Bergouey-Viellenave", -"Berg-sur-Moselle", -"Bergues-sur-Sambre", -"Bérig-Vintrange", "Berkel-Enschot", "Berkholz-Meyenburg", "Berlencourt-le-Cauroy", -"Berles-au-Bois", "Berles-Monchel", +"Berles-au-Bois", "Berlin-Est", "Berlin-Ouest", "Bernac-Debat", "Bernac-Dessus", "Bernadets-Debat", "Bernadets-Dessus", -"bernard-l'ermite", -"bernard-l'hermite", -"Bernay-en-Champagne", -"Bernay-en-Ponthieu", "Bernay-Saint-Martin", "Bernay-Vilbert", +"Bernay-en-Champagne", +"Bernay-en-Ponthieu", "Berne-Mittelland", "Bernes-sur-Oise", "Berneuil-en-Bray", "Berneuil-sur-Aisne", "Berneval-le-Grand", -"bernico-montois", "Bernico-Montois", -"bernico-montoise", "Bernico-Montoise", -"bernico-montoises", "Bernico-Montoises", "Bernières-d'Ailly", "Bernières-le-Patry", @@ -2276,18 +1356,17 @@ FR_BASE_EXCEPTIONS = [ "Bernkastel-Wittlich", "Bernos-Beaulac", "Bernuy-Zapardiel", -"Berny-en-Santerre", "Berny-Rivière", +"Berny-en-Santerre", "Berny-sur-Noye", -"Bérou-la-Mulotière", "Berre-des-Alpes", -"Berre-les-Alpes", "Berre-l'Etang", "Berre-l'Étang", +"Berre-les-Alpes", "Berrias-et-Casteljau", "Berrogain-Laruns", -"Berry-au-Bac", "Berry-Bouy", +"Berry-au-Bac", "Bersac-sur-Rivalier", "Bersillies-l'Abbaye", "Bertaucourt-Epourdon", @@ -2298,62 +1377,49 @@ FR_BASE_EXCEPTIONS = [ "Bertsdorf-Hörnitz", "Berville-en-Roumois", "Berville-la-Campagne", -"Berviller-en-Moselle", "Berville-sur-Mer", "Berville-sur-Seine", +"Berviller-en-Moselle", +"Berzy-le-Sec", "Berzé-la-Ville", "Berzé-le-Châtel", -"Berzy-le-Sec", "Besny-et-Loizy", "Bessais-le-Fromental", "Bessay-sur-Allier", -"Bessède-de-Sault", "Besse-et-Saint-Anastaise", -"Bessé-sur-Braye", "Besse-sur-Issole", "Bessey-en-Chaume", "Bessey-la-Cour", "Bessey-lès-Cîteaux", "Bessines-sur-Gartempe", "Bessy-sur-Cure", -"béta-cyfluthrine", -"béta-gal", +"Bessède-de-Sault", +"Bessé-sur-Braye", "Betbezer-d'Armagnac", "Betcave-Aguin", -"Béthancourt-en-Valois", -"Béthancourt-en-Vaux", -"Béthemont-la-Forêt", -"Béthencourt-sur-Mer", -"Béthencourt-sur-Somme", -"Béthisy-Saint-Martin", -"Béthisy-Saint-Pierre", "Beton-Bazoches", -"Betoncourt-lès-Brotte", -"Betoncourt-les-Ménétriers", "Betoncourt-Saint-Pancras", +"Betoncourt-les-Ménétriers", +"Betoncourt-lès-Brotte", "Betoncourt-sur-Mance", "Betpouey-Barèges", "Bettancourt-la-Ferrée", "Bettancourt-la-Longue", "Bettange-sur-Mess", "Bettegney-Saint-Brice", -"bette-marine", "Bettencourt-Rivière", "Bettencourt-Saint-Ouen", -"bettes-marines", "Betting-lès-Saint-Avold", "Betton-Bettonet", "Bettoncourt-le-Haut", "Betz-le-Château", "Beulotte-Saint-Laurent", -"beun'aise", "Beura-Cardezza", "Beurey-Bauguay", "Beurey-sur-Saulx", -"beurre-frais", "Beuvron-en-Auge", -"Beuvry-la-Forêt", "Beuvry-Nord", +"Beuvry-la-Forêt", "Beuzec-Cap-Sizun", "Beuzec-Conq", "Beuzeville-au-Plain", @@ -2361,33 +1427,22 @@ FR_BASE_EXCEPTIONS = [ "Beuzeville-la-Grenier", "Beuzeville-la-Guérard", "Beveland-Nord", -"Béville-le-Comte", "Bexhill-on-Sea", +"Bey-sur-Seille", "Beychac-et-Caillau", "Beynac-et-Cazenac", "Beyne-Heusay", -"Beyrède-Jumet", "Beyren-lès-Sierck", "Beyrie-en-Béarn", "Beyrie-sur-Joyeuse", -"Bey-sur-Seille", +"Beyrède-Jumet", +"Bez-et-Esparon", "Bezange-la-Grande", "Bezange-la-Petite", -"Bézaudun-les-Alpes", -"Bézaudun-sur-Bîne", -"Bez-et-Esparon", "Bezins-Garraux", -"Bézues-Bajon", -"Bézu-la-Forêt", -"Bézu-le-Guéry", -"Bézu-Saint-Eloi", -"Bézu-Saint-Éloi", -"Bézu-Saint-Germain", -"B-frame", "Biache-Saint-Vaast", "Bians-les-Usiers", "Biars-sur-Cère", -"biche-cochon", "Bichelsee-Balterswil", "Bidania-Goiatz", "Bief-des-Maisons", @@ -2396,81 +1451,30 @@ FR_BASE_EXCEPTIONS = [ "Biel-Benken", "Biencourt-sur-Orge", "Bienne-lez-Happart", -"biens-fonds", "Bienville-la-Petite", "Bienvillers-au-Bois", -"bière-pong", "Bierre-lès-Semur", "Bierry-les-Belles-Fontaines", "Biesme-sous-Thuin", "Biest-Houtakker", "Bietigheim-Bissingen", -"Biéville-Beuville", -"Biéville-en-Auge", -"Biéville-Quétiéville", -"Biéville-sur-Orne", "Big-bang", -"big-endian", "Bignicourt-sur-Marne", "Bignicourt-sur-Saulx", -"bil-ka", -"bil-kas", "Billens-Hennens", "Billigheim-Ingenheim", "Billy-Berclau", "Billy-Chevannes", +"Billy-Montigny", "Billy-le-Grand", "Billy-lès-Chanceaux", -"Billy-Montigny", -"Billy-sous-les-Côtes", "Billy-sous-Mangiennes", +"Billy-sous-les-Côtes", "Billy-sur-Aisne", "Billy-sur-Oisy", "Billy-sur-Ourcq", -"bin-bin", -"bin-bins", -"binge-watcha", -"binge-watchai", -"binge-watchaient", -"binge-watchais", -"binge-watchait", -"binge-watchâmes", -"binge-watchant", -"binge-watchas", -"binge-watchasse", -"binge-watchassent", -"binge-watchasses", -"binge-watchassiez", -"binge-watchassions", -"binge-watchât", -"binge-watchâtes", -"binge-watche", -"binge-watché", -"binge-watchée", -"binge-watchées", -"binge-watchent", -"binge-watcher", -"binge-watchera", -"binge-watcherai", -"binge-watcheraient", -"binge-watcherais", -"binge-watcherait", -"binge-watcheras", -"binge-watchèrent", -"binge-watcherez", -"binge-watcheriez", -"binge-watcherions", -"binge-watcherons", -"binge-watcheront", -"binge-watches", -"binge-watchés", -"binge-watchez", -"binge-watchiez", -"binge-watchions", -"binge-watchons", "Binic-Étables-sur-Mer", "Binnen-Moerdijk", -"bin's", "Binson-et-Orquigny", "Bioley-Magnoux", "Bioley-Orjulaz", @@ -2479,7 +1483,6 @@ FR_BASE_EXCEPTIONS = [ "Birken-Honigsessen", "Bischtroff-sur-Sarre", "Bissao-Guinéen", -"bissau-guinéen", "Bissau-Guinéen", "Bissau-Guinéenne", "Bissau-Guinéennes", @@ -2490,112 +1493,47 @@ FR_BASE_EXCEPTIONS = [ "Bissy-sous-Uxelles", "Bissy-sur-Fley", "Bisten-en-Lorraine", -"bistro-brasserie", -"bistro-brasseries", -"bit-el-mal", "Bithaine-et-le-Val", "Bitschwiller-lès-Thann", "Bitterfeld-Wolfen", -"bitter-pit", "Biurrun-Olcoz", "Biville-la-Baignarde", "Biville-la-Rivière", "Biville-sur-Mer", "Bize-Minervois", -"bla-bla", -"bla-bla-bla", -"black-bass", -"black-blanc-beur", -"black-bottom", -"black-bottoms", +"Biéville-Beuville", +"Biéville-Quétiéville", +"Biéville-en-Auge", +"Biéville-sur-Orne", "Black-Lakien", -"black-out", -"black-outa", -"black-outai", -"black-outaient", -"black-outais", -"black-outait", -"black-outâmes", -"black-outant", -"black-outas", -"black-outasse", -"black-outassent", -"black-outasses", -"black-outassiez", -"black-outassions", -"black-outât", -"black-outâtes", -"black-oute", -"black-outé", -"black-outée", -"black-outées", -"black-outent", -"black-outer", -"black-outera", -"black-outerai", -"black-outeraient", -"black-outerais", -"black-outerait", -"black-outeras", -"black-outèrent", -"black-outerez", -"black-outeriez", -"black-outerions", -"black-outerons", -"black-outeront", -"black-outes", -"black-outés", -"black-outez", -"black-outiez", -"black-outions", -"black-outons", -"black-outs", -"black-rot", "Blagny-sur-Vingeanne", "Blaincourt-lès-Précy", "Blaincourt-sur-Aube", "Blainville-Crevon", -"Blainville-sur-l'Eau", "Blainville-sur-Mer", "Blainville-sur-Orne", +"Blainville-sur-l'Eau", "Blaise-sous-Arzillières", "Blaise-sous-Hauteville", "Blaison-Gohier", "Blaison-Saint-Sulpice", "Blaisy-Bas", "Blaisy-Haut", -"blanche-coiffe", "Blanche-Eglise", +"Blanche-Neige", "Blanche-Église", "Blanchefosse-et-Bay", -"Blanche-Neige", -"blanche-queue", -"blanche-raie", -"blanches-coiffes", -"blancs-becs", -"blancs-bocs", -"blancs-bois", -"blancs-de-baleine", -"blancs-d'Espagne", -"blancs-en-bourre", -"blancs-estocs", -"blancs-étocs", -"blancs-mangers", -"blancs-manteaux", -"blancs-raisins", -"blancs-seings", -"blancs-signés", "Blandouet-Saint-Jean", "Blangerval-Blangermont", +"Blangy-Tronville", "Blangy-le-Château", "Blangy-sous-Poix", "Blangy-sur-Bresle", "Blangy-sur-Ternoise", -"Blangy-Tronville", "Blankenfelde-Mahlow", "Blanquefort-sur-Briolance", -"Blanzac-lès-Matha", "Blanzac-Porcheresse", +"Blanzac-lès-Matha", "Blanzaguet-Saint-Cybard", "Blanzay-sur-Boutonne", "Blanzy-la-Salonnaise", @@ -2604,114 +1542,99 @@ FR_BASE_EXCEPTIONS = [ "Blaye-et-Sainte-Luce", "Blaye-les-Mines", "Bleigny-le-Carreau", -"Blénod-lès-Pont-à-Mousson", -"Blénod-lès-Toul", -"bleu-bite", -"bleu-manteau", -"bleu-merle", "Bleury-Saint-Symphorien", -"bleus-manteaux", "Bleyen-Genschmar", "Blies-Ebersing", -"Blies-Ébersing", -"blies-ebersingeois", "Blies-Ebersingeois", -"blies-ébersingeois", -"Blies-Ébersingeois", -"blies-ebersingeoise", "Blies-Ebersingeoise", -"blies-ébersingeoise", -"Blies-Ébersingeoise", -"blies-ebersingeoises", "Blies-Ebersingeoises", -"blies-ébersingeoises", -"Blies-Ébersingeoises", "Blies-Guersviller", +"Blies-Ébersing", +"Blies-Ébersingeois", +"Blies-Ébersingeoise", +"Blies-Ébersingeoises", "Bligny-en-Othe", -"Bligny-lès-Beaune", "Bligny-le-Sec", +"Bligny-lès-Beaune", "Bligny-sous-Beaune", "Bligny-sur-Ouche", -"bling-bling", -"bling-blings", "Blis-et-Born", -"blis-et-bornois", "Blis-et-Bornois", -"blis-et-bornoise", "Blis-et-Bornoise", -"blis-et-bornoises", "Blis-et-Bornoises", -"bloc-cylindres", -"bloc-eau", -"bloc-film", -"bloc-films", -"block-système", -"bloc-moteur", -"bloc-moteurs", -"bloc-note", -"bloc-notes", -"blocs-eau", -"blocs-films", -"blocs-notes", "Blois-sur-Seille", "Blonville-sur-Mer", "Blosseville-Bonsecours", "Blot-l'Eglise", "Blot-l'Église", "Blousson-Sérian", -"blue-jean", -"blue-jeans", -"blue-lias", -"blu-ray", -"boat-people", -"bobby-soxer", -"bobby-soxers", +"Blénod-lès-Pont-à-Mousson", +"Blénod-lès-Toul", "Bobenheim-Roxheim", "Bobo-Dioulasso", "Bodeghem-Saint-Martin", "Bodegraven-Reeuwijk", "Bodenrode-Westhausen", "Bodman-Ludwigshafen", -"body-building", "Boeil-Bezing", -"Boën-sur-Lignon", -"Boëssé-le-Sec", -"boeuf-carotte", -"bœuf-carotte", -"bœuf-carottes", -"bœuf-garou", -"Bœurs-en-Othe", "Boevange-sur-Attert", "Bogis-Bossey", "Bogny-lès-Murtin", "Bogny-sur-Meuse", "Bohain-en-Vermandois", "Bohas-Meyriat-Rignat", -"Böhl-Iggelheim", "Boigny-sur-Bionne", "Boinville-en-Mantois", "Boinville-en-Woëvre", "Boinville-le-Gaillard", "Boiry-Becquerelle", "Boiry-Notre-Dame", -"Boiry-Sainte-Rictrude", "Boiry-Saint-Martin", -"Boisleux-au-Mont", +"Boiry-Sainte-Rictrude", +"Bois-Anzeray", +"Bois-Arnault", +"Bois-Bernard", +"Bois-Colombes", +"Bois-Grenier", +"Bois-Guilbert", +"Bois-Guillaume", +"Bois-Herpin", +"Bois-Himont", +"Bois-Héroult", +"Bois-Jérôme-Saint-Ouen", +"Bois-Normand-près-Lyre", +"Bois-Sainte-Marie", +"Bois-d'Amont", +"Bois-d'Arcy", +"Bois-d'Ennebourg", +"Bois-de-Champ", +"Bois-de-Céné", +"Bois-de-Gand", +"Bois-de-la-Pierre", +"Bois-l'Évêque", +"Bois-le-Roi", +"Bois-lès-Pargny", "Boisleux-Saint-Marc", -"Boissei-la-Lande", +"Boisleux-au-Mont", +"Boisné-La Tude", "Boisse-Penchot", -"Boisset-et-Gaujac", -"Boisset-lès-Montrond", -"Boisset-les-Prévanches", +"Boissei-la-Lande", "Boisset-Saint-Priest", +"Boisset-et-Gaujac", +"Boisset-les-Prévanches", +"Boisset-lès-Montrond", "Boissey-le-Châtel", "Boissise-la-Bertrand", "Boissise-le-Roi", +"Boissy-Fresnoy", +"Boissy-Lamberville", +"Boissy-Maugien", +"Boissy-Maugis", +"Boissy-Mauvoisin", +"Boissy-Saint-Léger", "Boissy-aux-Cailles", "Boissy-en-Drouais", -"Boissy-Fresnoy", "Boissy-l'Aillerie", -"Boissy-Lamberville", "Boissy-la-Rivière", "Boissy-le-Bois", "Boissy-le-Châtel", @@ -2719,287 +1642,147 @@ FR_BASE_EXCEPTIONS = [ "Boissy-le-Repos", "Boissy-le-Sec", "Boissy-lès-Perche", -"boissy-maugien", -"Boissy-Maugien", -"boissy-maugienne", -"boissy-maugiennes", -"boissy-maugiens", -"Boissy-Maugis", -"Boissy-Mauvoisin", -"Boissy-Saint-Léger", "Boissy-sans-Avoir", "Boissy-sous-Saint-Yon", "Boissy-sur-Damville", "Boisville-la-Saint-Père", -"boîtes-à-musique", -"boîtes-à-musiques", -"boit-sans-soif", "Bokholt-Hanredder", -"bolivo-paraguayen", "Bollendorf-Pont", -"bombardiers-torpilleurs", -"bombardier-torpilleur", -"Bonac-Irazein", -"bon-air", -"bon-bec", -"Bonchamp-lès-Laval", -"bon-chrétien", -"Boncourt-le-Bois", -"Boncourt-sur-Meuse", -"bon-creux", -"bon-encontrais", "Bon-Encontrais", -"bon-encontraise", "Bon-Encontraise", -"bon-encontraises", "Bon-Encontraises", "Bon-Encontre", -"bon-fieux", -"bon-fils", -"bon-henri", -"bonheur-du-jour", +"Bon-Secourois", +"Bon-Secours", +"Bonac-Irazein", +"Bonchamp-lès-Laval", +"Boncourt-le-Bois", +"Boncourt-sur-Meuse", "Bonlieu-sur-Roubion", -"bon-mot", "Bonnac-la-Côte", -"bonne-dame", -"bonne-encontre", -"bonne-ente", -"bonne-ententiste", -"bonne-ententistes", -"bonne-femme", -"bonne-grâce", -"bonne-main", -"bonne-maman", -"bonnes-dames", -"bonnes-entes", -"bonnes-femmes", -"bonnes-grâces", -"bonnes-mamans", -"bonnes-vilaines", -"bonnes-voglies", -"bonnet-chinois", -"bonnet-de-prêtre", -"bonnet-rouge", -"bonnets-chinois", -"bonnets-de-prêtres", -"bonnets-verts", -"bonnet-vert", +"Bonneuil-Matours", "Bonneuil-en-France", "Bonneuil-en-Valois", "Bonneuil-les-Eaux", -"Bonneuil-Matours", "Bonneuil-sur-Marne", "Bonneval-en-Diois", "Bonneval-sur-Arc", "Bonnevaux-le-Prieuré", -"Bonnevent-et-Velloreille-lès-Bonnevent", "Bonnevent-Velloreille", -"bonne-vilaine", +"Bonnevent-et-Velloreille-lès-Bonnevent", "Bonneville-Aptot", "Bonneville-et-Saint-Avit-de-Fumadières", "Bonneville-la-Louvet", "Bonneville-sur-Touques", -"bonne-voglie", -"Bonnières-sur-Seine", "Bonningues-lès-Ardres", "Bonningues-lès-Calais", +"Bonnières-sur-Seine", "Bonny-sur-Loire", -"bon-ouvrier", -"bon-ouvriers", -"bon-papa", -"bon-plein", "Bonrepos-Riquet", "Bonrepos-sur-Aussonnelle", -"bons-chrétiens", -"Bon-Secourois", -"Bon-Secours", -"Bons-en-Chablais", -"bons-mots", -"bons-papas", "Bons-Tassilly", -"bon-tour", +"Bons-en-Chablais", "Bonvillers-Mont", -"boogie-woogie", -"boogie-woogies", -"Boô-Silhen", "Bootle-cum-Linacre", +"Bor-et-Bar", "Bora-Bora", "Boran-sur-Oise", "Borcq-sur-Airvault", -"Bordeaux-en-Gâtinais", +"Bord-Saint-Georges", "Bordeaux-Saint-Clair", -"Börde-Hakel", +"Bordeaux-en-Gâtinais", "Bordel's", -"borde-plats", -"Bordères-et-Lamensans", +"Bordes-Uchentein", +"Bordes-de-Rivière", "Bordères-Louron", +"Bordères-et-Lamensans", "Bordères-sur-l'Echez", "Bordères-sur-l'Échez", -"border-terrier", -"Bordes-de-Rivière", -"Bordes-Uchentein", -"bord-opposé", -"Bord-Saint-Georges", -"bore-out", -"bore-outs", "Boresse-et-Martron", -"Bor-et-Bar", "Borgdorf-Seedorf", -"Börgerende-Rethwisch", "Borger-Odoorn", "Bormes-les-Mimosas", "Born-de-Champs", -"borne-couteau", -"borne-fontaine", -"borne-fusible", -"borne-fusibles", -"bornes-couteaux", -"bornes-fontaines", +"Bors (Canton de Baignes-Sainte-Radegonde)", +"Bors (Canton de Montmoreau-Saint-Cybard)", "Bors-de-Baignes", "Bors-de-Montmoreau", "Borstel-Hohenraden", -"Bort-les-Orgues", "Bort-l'Etang", "Bort-l'Étang", +"Bort-les-Orgues", +"Bosc-Bordel", "Bosc-Bénard-Commin", "Bosc-Bénard-Crescy", "Bosc-Bérenger", -"Bosc-Bordel", "Bosc-Edeline", -"Bosc-Édeline", -"bosc-guérardais", -"Bosc-Guérardais", -"bosc-guérardaise", -"Bosc-Guérardaise", -"bosc-guérardaises", -"Bosc-Guérardaises", "Bosc-Guérard-Saint-Adrien", +"Bosc-Guérardais", +"Bosc-Guérardaise", +"Bosc-Guérardaises", "Bosc-Hyons", -"Bosc-le-Hard", "Bosc-Mesnil", "Bosc-Renoult-en-Ouche", "Bosc-Renoult-en-Roumois", -"bosc-renoulthien", "Bosc-Renoulthien", -"bosc-renoulthienne", "Bosc-Renoulthienne", -"bosc-renoulthiennes", "Bosc-Renoulthiennes", -"bosc-renoulthiens", "Bosc-Renoulthiens", "Bosc-Roger-sur-Buchy", +"Bosc-le-Hard", +"Bosc-Édeline", "Bosguérard-de-Marcouville", -"Bösleben-Wüllersleben", "Bosmie-l'Aiguille", "Bosmont-sur-Serre", "Bosmoreau-les-Mines", -"Bosnie-et-Herzégovine", "Bosnie-Herzégovine", -"bosno-serbe", -"bosno-serbes", +"Bosnie-et-Herzégovine", "Bossay-sur-Claise", "Bosseval-et-Briancourt", "Bossus-lès-Rumigny", "Bossut-Gottechain", -"botte-chaussettes", -"bottom-up", "Botz-en-Mauges", "Boubers-lès-Hesmond", "Boubers-sur-Canche", +"Bouc-Bel-Air", "Bouchamps-lès-Craon", "Bouchavesnes-Bergen", -"bouche-à-bouche", -"bouche-en-flûte", -"bouche-nez", -"bouche-pora", -"bouche-porai", -"bouche-poraient", -"bouche-porais", -"bouche-porait", -"bouche-porâmes", -"bouche-porant", -"bouche-poras", -"bouche-porasse", -"bouche-porassent", -"bouche-porasses", -"bouche-porassiez", -"bouche-porassions", -"bouche-porât", -"bouche-porâtes", -"bouche-pore", -"bouche-poré", -"bouche-porée", -"bouche-porées", -"bouche-porent", -"bouche-porer", -"bouche-porera", -"bouche-porerai", -"bouche-poreraient", -"bouche-porerais", -"bouche-porerait", -"bouche-poreras", -"bouche-porèrent", -"bouche-porerez", -"bouche-poreriez", -"bouche-porerions", -"bouche-porerons", -"bouche-poreront", -"bouche-pores", -"bouche-porés", -"bouche-porez", -"bouche-poriez", -"bouche-porions", -"bouche-porons", "Bouches-du-Rhône", -"bouche-trou", -"bouche-trous", "Bouchy-Saint-Genest", "Boucieu-le-Roi", "Boucle-Saint-Blaise", "Boucle-Saint-Denis", "Boucoiran-et-Nozières", -"Bouconville-sur-Madt", "Bouconville-Vauclair", "Bouconville-Vauclerc", +"Bouconville-sur-Madt", "Boudy-de-Beauregard", "Boueilh-Boueilho-Lasque", -"bouffe-curé", -"bouffe-curés", -"bouffe-galette", -"Bougé-Chambalud", "Bouges-le-Château", -"Bougy-lez-Neuville", "Bougy-Villars", +"Bougy-lez-Neuville", +"Bougé-Chambalud", "Bouhans-et-Feurg", "Bouhans-lès-Lure", "Bouhans-lès-Montbozon", -"boui-boui", -"bouig-bouig", "Bouilh-Devant", "Bouilh-Péreuilh", "Bouillancourt-en-Séry", "Bouillancourt-la-Bataille", +"Bouilly-en-Gâtinais", "Bouillé-Courdault", "Bouillé-Loretz", "Bouillé-Ménard", "Bouillé-Saint-Paul", -"bouillon-blanc", -"Bouilly-en-Gâtinais", "Bouin-Plumoison", -"bouis-bouis", "Boujan-sur-Libron", -"Boulay-les-Barres", -"Boulay-les-Ifs", -"boulay-morinois", "Boulay-Morinois", -"boulay-morinoise", "Boulay-Morinoise", -"boulay-morinoises", "Boulay-Morinoises", "Boulay-Moselle", +"Boulay-les-Barres", +"Boulay-les-Ifs", "Boule-d'Amont", -"boule-dogue", -"boules-dogues", "Boulieu-lès-Annonay", "Boullay-les-Troux", "Boulogne-Billancourt", @@ -3009,57 +1792,69 @@ FR_BASE_EXCEPTIONS = [ "Boulogne-sur-Mer", "Boult-aux-Bois", "Boult-sur-Suippe", -"boum-boum", "Bouray-sur-Juine", "Bourbach-le-Bas", "Bourbach-le-Haut", "Bourbon-Lancy", +"Bourbon-Vendée", "Bourbon-l'Archambault", "Bourbonne-les-Bains", -"Bourbon-Vendée", "Bourbourg-Campagne", "Bourcefranc-le-Chapus", "Bourdons-sur-Rognon", "Bouret-sur-Canche", -"bourgeois-bohème", -"bourgeois-bohèmes", -"bourgeoise-bohème", -"bourgeoises-bohèmes", +"Bourg-Achard", +"Bourg-Archambault", +"Bourg-Argental", +"Bourg-Beaudouin", +"Bourg-Blanc", +"Bourg-Bruche", +"Bourg-Charente", +"Bourg-Fidèle", +"Bourg-Lastic", +"Bourg-Madame", +"Bourg-Saint-Andéol", +"Bourg-Saint-Bernard", +"Bourg-Saint-Christophe", +"Bourg-Saint-Maurice", +"Bourg-Sainte-Marie", +"Bourg-d'Oueil", +"Bourg-de-Bigorre", +"Bourg-de-Péage", +"Bourg-de-Sirod", +"Bourg-de-Visa", +"Bourg-des-Comptes", +"Bourg-des-Maisons", +"Bourg-du-Bost", +"Bourg-en-Bresse", +"Bourg-et-Comin", +"Bourg-l'Évêque", +"Bourg-la-Reine", +"Bourg-le-Comte", +"Bourg-le-Roi", +"Bourg-lès-Valence", +"Bourg-sous-Châtelet", "Bourget-en-Huile", +"Bourgneuf-Val-d'Or", "Bourgneuf-en-Mauges", "Bourgneuf-en-Retz", -"Bourgneuf-Val-d'Or", "Bourgogne-Franche-Comté", "Bourgogne-Fresne", "Bourgoin-Jallieu", "Bourgtheroulde-Infreville", -"bourgue-épine", -"bourgues-épines", "Bourguignon-lès-Conflans", -"Bourguignon-lès-la-Charité", "Bourguignon-lès-Morey", +"Bourguignon-lès-la-Charité", "Bourguignon-sous-Coucy", "Bourguignon-sous-Montbavin", "Bournainville-Faverolles", "Bourneville-Sainte-Croix", "Bournoncle-Saint-Pierre", "Bouroum-Bouroum", -"bourre-chrétien", -"bourre-de-Marseille", -"bourre-goule", -"bourre-goules", -"bourre-noix", -"bourre-pif", -"bourre-pifs", -"bourres-de-Marseille", "Bourriot-Bergonce", "Bourron-Marlotte", -"bourse-à-berger", -"bourse-à-pasteur", "Bourseigne-Neuve", "Bourseigne-Vieille", -"bourses-à-berger", -"bourses-à-pasteur", "Boury-en-Vexin", "Bousignies-sur-Roc", "Boussac-Bourg", @@ -3068,67 +1863,26 @@ FR_BASE_EXCEPTIONS = [ "Boussu-en-Fagne", "Boussu-lez-Walcourt", "Boussy-Saint-Antoine", -"bout-avant", -"bout-d'aile", -"bout-d'argent", -"bout-dehors", -"bout-de-l'an", "Bout-de-l'Îlien", -"bout-de-manche", -"bout-de-quièvre", "Bout-du-Pont-de-Larn", -"bout-du-pont-de-l'arnais", "Bout-du-Pont-de-l'Arnais", -"bout-du-pont-de-l'arnaise", "Bout-du-Pont-de-l'Arnaise", -"bout-du-pont-de-l'arnaises", "Bout-du-Pont-de-l'Arnaises", -"boute-à-port", -"boute-charge", -"boute-dehors", -"boute-de-lof", -"boute-en-courroie", -"boute-en-train", -"boute-feu", -"boute-hache", -"boute-hors", "Bouteilles-Saint-Sébastien", -"boute-joie", -"boute-lof", "Boutenac-Touvent", -"boutes-à-port", -"boute-selle", -"boute-selles", -"boute-tout-cuire", "Boutiers-Saint-Trojan", "Boutigny-Prouais", "Boutigny-sur-Essonne", -"bouton-d'or", -"bouton-poussoir", -"bouton-pression", -"boutons-d'or", -"boutons-pression", -"bout-rimé", -"bout-saigneux", -"bouts-avant", -"bouts-d'aile", -"bouts-d'argent", -"bouts-dehors", -"bouts-de-l'an", -"bouts-de-manche", -"bouts-de-quièvre", -"bouts-rimés", -"bouts-saigneux", "Bouvaincourt-sur-Bresle", "Bouvesse-Quirieu", "Bouvignes-sur-Meuse", "Bouvigny-Boyeffles", "Bouvincourt-en-Vermandois", +"Boux-sous-Salmaise", "Bouxières-aux-Bois", "Bouxières-aux-Chênes", "Bouxières-aux-Dames", "Bouxières-sous-Froidmont", -"Boux-sous-Salmaise", "Bouy-Luxembourg", "Bouy-sur-Orvin", "Bouze-lès-Beaune", @@ -3136,176 +1890,109 @@ FR_BASE_EXCEPTIONS = [ "Bouzonville-aux-Bois", "Bouzonville-en-Beauce", "Bouzy-la-Forêt", -"Bovée-sur-Barboure", "Boven-Haastrecht", "Boven-Hardinxveld", "Boven-Leeuwen", "Bovisio-Masciago", -"bow-string", -"bow-strings", -"bow-window", -"bow-windows", -"box-calf", -"boxer-short", -"boxer-shorts", -"box-office", -"box-offices", +"Bovée-sur-Barboure", "Boyeux-Saint-Jérôme", -"boy-scout", -"boy-scouts", +"Boën-sur-Lignon", +"Boëssé-le-Sec", +"Boô-Silhen", +"Brabant-Septentrional", +"Brabant-Wallon", "Brabant-du-Nord", "Brabant-en-Argonne", "Brabant-le-Roi", -"Brabant-Septentrional", "Brabant-sur-Meuse", -"Brabant-Wallon", -"bracelet-montre", -"bracelets-montres", -"brachio-céphalique", -"brachio-céphaliques", -"brachio-radial", "Bragelogne-Beauvoir", "Bragny-en-Charollais", "Bragny-sur-Saône", "Brailly-Cornehotte", +"Brain-sur-Allonnes", +"Brain-sur-Longuenée", +"Brain-sur-Vilaine", +"Brain-sur-l'Authion", "Braine-l'Alleud", "Braine-le-Château", "Braine-le-Comte", "Brains-sur-Gée", "Brains-sur-les-Marches", -"Brain-sur-Allonnes", -"Brain-sur-l'Authion", -"Brain-sur-Longuenée", -"Brain-sur-Vilaine", "Brainville-sur-Meuse", "Braisnes-sur-Aronde", -"branches-ursines", -"branche-ursine", "Brancourt-en-Laonnois", "Brancourt-le-Grand", -"brancs-ursines", -"branc-ursine", -"branc-ursines", -"Brandebourg-sur-la-Havel", "Brande-Hörnerkirchen", -"branle-bas", -"branle-gai", -"branle-long", -"branle-queue", -"branles-bas", -"branles-gais", -"branles-longs", +"Brandebourg-sur-la-Havel", "Branoux-les-Taillades", -"branque-ursine", "Branville-Hague", -"Bras-d'Asse", -"bras-d'assien", -"Bras-d'Assien", -"bras-d'assienne", -"Bras-d'Assienne", -"bras-d'assiennes", -"Bras-d'Assiennes", -"bras-d'assiens", -"Bras-d'Assiens", -"brash-ice", -"brash-ices", "Bras-Panon", -"Brassac-les-Mines", -"brasse-camarade", -"brasse-camarades", +"Bras-d'Asse", +"Bras-d'Assien", +"Bras-d'Assienne", +"Bras-d'Assiennes", +"Bras-d'Assiens", "Bras-sur-Meuse", +"Brassac-les-Mines", "Braud-et-Saint-Louis", "Braunau-am-Inn", -"Braux-le-Châtel", -"Braux-Sainte-Cohière", "Braux-Saint-Remy", +"Braux-Sainte-Cohière", +"Braux-le-Châtel", "Bray-Dunes", -"bray-dunois", "Bray-Dunois", -"bray-dunoise", "Bray-Dunoise", -"bray-dunoises", "Bray-Dunoises", -"Braye-en-Laonnois", -"Braye-en-Thiérache", +"Bray-Saint-Aignan", +"Bray-Saint-Christophe", "Bray-en-Val", -"Braye-sous-Faye", -"Braye-sur-Maulne", "Bray-et-Lû", "Bray-la-Campagne", "Bray-lès-Mareuil", -"Bray-Saint-Aignan", -"Bray-Saint-Christophe", "Bray-sur-Seine", "Bray-sur-Somme", +"Braye-en-Laonnois", +"Braye-en-Thiérache", +"Braye-sous-Faye", +"Braye-sur-Maulne", "Brazey-en-Morvan", "Brazey-en-Plaine", -"brazza-congolais", "Brazza-Congolais", -"Bréal-sous-Montfort", -"Bréal-sous-Vitré", -"Bréau-et-Salagosse", -"brèche-dent", -"brèche-dents", -"Brécy-Brières", -"brécy-brièrois", -"Brécy-Brièrois", -"brécy-brièroise", -"Brécy-Brièroise", -"brécy-brièroises", -"Brécy-Brièroises", -"bredi-breda", -"Brégnier-Cordon", -"Bréhain-la-Ville", -"Bréhan-Loudéac", "Breil-sur-Roya", "Breistroff-la-Grande", "Breitenbach-Haut-Rhin", -"brelic-breloque", -"brelique-breloque", -"Brémontier-Merval", "Brem-sur-Mer", -"Brémur-et-Vaurois", "Bresse-sur-Grosne", "Bressey-sur-Tille", "Bretagne-d'Armagnac", "Bretagne-de-Marsan", "Bretigney-Notre-Dame", -"Brétignolles-le-Moulin", "Bretignolles-sur-Mer", "Bretigny-sur-Morrens", -"Brétigny-sur-Orge", "Bretnig-Hauswalde", "Brette-les-Pins", -"Bretteville-du-Grand-Caux", -"Bretteville-le-Rabet", -"Bretteville-l'Orgueilleuse", "Bretteville-Saint-Laurent", +"Bretteville-du-Grand-Caux", +"Bretteville-l'Orgueilleuse", +"Bretteville-le-Rabet", "Bretteville-sur-Ay", "Bretteville-sur-Dives", "Bretteville-sur-Laize", "Bretteville-sur-Odon", "Breuil-Barret", -"breuil-bernardin", "Breuil-Bernardin", -"breuil-bernardine", "Breuil-Bernardine", -"breuil-bernardines", "Breuil-Bernardines", -"breuil-bernardins", "Breuil-Bernardins", "Breuil-Bois-Robert", "Breuil-Chaussée", +"Breuil-Magné", "Breuil-la-Réorte", "Breuil-le-Sec", -"breuil-le-secquois", "Breuil-le-Secquois", -"breuil-le-secquoise", "Breuil-le-Secquoise", -"breuil-le-secquoises", "Breuil-le-Secquoises", "Breuil-le-Vert", -"Breuil-Magné", "Breuil-sur-Marne", "Breukelen-Nijenrode", "Breukelen-Sint-Pieters", @@ -3314,39 +2001,28 @@ FR_BASE_EXCEPTIONS = [ "Breuvery-sur-Coole", "Breux-Jouy", "Breux-sur-Avre", -"Bréville-les-Monts", -"Bréville-sur-Mer", -"Bréxent-Enocq", -"Bréxent-Énocq", "Brey-et-Maison-du-Bois", "Briancourt-et-Montimont", "Briarres-sur-Essonne", -"bric-à-brac", -"brick-goélette", "Bricquebec-en-Cotentin", "Bricqueville-la-Blouette", "Bricqueville-sur-Mer", "Brides-les-Bains", "Brie-Comte-Robert", -"Brié-et-Angonnes", -"Briel-sur-Barse", -"Brienne-la-Vieille", -"Brienne-le-Château", -"Brienne-sur-Aisne", -"Brienon-sur-Armançon", -"Brières-et-Crécy", -"Brières-les-Scellés", -"Brieskow-Finkenheerd", "Brie-sous-Archiac", "Brie-sous-Barbezieux", "Brie-sous-Chalais", "Brie-sous-Matha", "Brie-sous-Mortagne", +"Briel-sur-Barse", +"Brienne-la-Vieille", +"Brienne-le-Château", +"Brienne-sur-Aisne", +"Brienon-sur-Armançon", +"Brieskow-Finkenheerd", "Brieuil-sur-Chizé", "Brieulles-sur-Bar", "Brieulles-sur-Meuse", -"brigadier-chef", -"brigadiers-chefs", "Brig-Glis", "Brignac-la-Plaine", "Brignano-Frascata", @@ -3354,62 +2030,19 @@ FR_BASE_EXCEPTIONS = [ "Brigue-Glis", "Brigueil-le-Chantre", "Briis-sous-Forges", -"brillat-savarin", -"brillet-pontin", "Brillet-Pontin", -"brillet-pontine", "Brillet-Pontine", -"brillet-pontines", "Brillet-Pontines", -"brillet-pontins", "Brillet-Pontins", "Brillon-en-Barrois", -"brin-d'amour", -"brin-d'estoc", +"Brin-sur-Seille", "Brinon-sur-Beuvron", "Brinon-sur-Sauldre", -"brins-d'amour", -"brins-d'estoc", -"Brin-sur-Seille", "Brion-près-Thouet", "Brion-sur-Ource", "Briosne-lès-Sables", "Brioux-sur-Boutonne", "Briquemesnil-Floxicourt", -"bris-d'huis", -"brise-bise", -"brise-bises", -"brise-burnes", -"brise-cou", -"brise-cous", -"brise-fer", -"brise-fers", -"brise-flots", -"brise-glace", -"brise-glaces", -"brise-image", -"brise-images", -"brise-lame", -"brise-lames", -"brise-lunette", -"brise-mariage", -"brise-motte", -"brise-mottes", -"brise-mur", -"brise-murs", -"brise-os", -"brise-pierre", -"brise-pierres", -"brise-raison", -"brise-raisons", -"brise-roche", -"brise-roches", -"brise-scellé", -"brise-scellés", -"brise-soleil", -"brise-tout", -"brise-vent", -"brise-vents", "Brisgau-Haute-Forêt-Noire", "Brison-Saint-Innocent", "Brissac-Quincé", @@ -3424,160 +2057,109 @@ FR_BASE_EXCEPTIONS = [ "Brives-Charensac", "Brives-sur-Charente", "Brixey-aux-Chanoines", +"Brières-et-Crécy", +"Brières-les-Scellés", +"Brié-et-Angonnes", "Brocourt-en-Argonne", "Brohl-Lützing", "Bromont-Lamothe", -"bromophos-éthyl", -"broncho-pneumonie", -"broncho-pneumonies", -"broncho-pulmonaire", -"broncho-pulmonaires", "Broons-sur-Vilaine", "Brot-Dessous", "Brot-Plamboz", "Brotte-lès-Luxeuil", "Brotte-lès-Ray", -"brou-brou", -"broue-pub", -"broue-pubs", -"brouille-blanche", -"brouille-blanches", +"Brou-sur-Chantereine", "Brousse-le-Château", "Brousses-et-Villaret", -"Broussey-en-Blois", "Broussey-Raulecourt", +"Broussey-en-Blois", "Broussy-le-Grand", "Broussy-le-Petit", -"Brou-sur-Chantereine", -"broute-minou", -"broute-minous", -"Broût-Vernet", -"broût-vernetois", -"Broût-Vernetois", -"broût-vernetoise", -"Broût-Vernetoise", -"broût-vernetoises", -"Broût-Vernetoises", "Brouzet-lès-Alès", "Brouzet-lès-Quissac", "Brovello-Carpugnino", -"brown-nosers", -"brown-out", "Broye-Aubigney-Montseugny", +"Broye-Vully", "Broye-les-Loups-et-Verfontaine", "Broye-lès-Pesmes-Aubigney-Montseugny", -"Broye-Vully", +"Broût-Vernet", +"Broût-Vernetois", +"Broût-Vernetoise", +"Broût-Vernetoises", "Bruay-la-Buissière", "Bruay-sur-l'Escaut", +"Bruc-sur-Aff", "Bruchhausen-Vilsen", "Bruchmühlbach-Miesau", "Bruchweiler-Bärenbach", -"Brücken-Hackpfüffel", -"Bruc-sur-Aff", "Brue-Auriac", "Brueil-en-Vexin", -"Bruère-Allichamps", -"bruesme-d'auffe", -"bruesmes-d'auffe", "Bruges-Capbis-Mifaget", "Brugny-Vaudancourt", -"Bruille-lez-Marchiennes", "Bruille-Saint-Amand", -"brûle-amorce", -"brûle-bout", -"brule-gueule", -"brûle-gueule", -"brule-gueules", -"brûle-gueules", -"brule-maison", -"brûle-maison", -"brule-maisons", -"brûle-maisons", -"brule-parfum", -"brûle-parfum", -"brule-parfums", -"brûle-parfums", -"brûle-pourpoint", -"brûle-queue", -"brûle-tout", -"Brûly-de-Pesche", -"brûly-de-peschois", -"Brûly-de-Peschois", -"Brûly-de-Peschoise", +"Bruille-lez-Marchiennes", "Brunstatt-Didenheim", -"brun-suisse", "Brunvillers-la-Motte", -"brute-bonne", -"brut-ingénu", -"bruts-ingénus", "Bruttig-Fankel", "Bruxelles-ville", "Bruyères-et-Montbérault", "Bruyères-le-Châtel", "Bruyères-sur-Fère", "Bruyères-sur-Oise", +"Bruère-Allichamps", "Bry-sur-Marne", -"B-spline", -"B-splines", +"Bréal-sous-Montfort", +"Bréal-sous-Vitré", +"Bréau-et-Salagosse", +"Brécy-Brières", +"Brécy-Brièrois", +"Brécy-Brièroise", +"Brécy-Brièroises", +"Brégnier-Cordon", +"Bréhain-la-Ville", +"Bréhan-Loudéac", +"Brémontier-Merval", +"Brémur-et-Vaurois", +"Brétignolles-le-Moulin", +"Brétigny-sur-Orge", +"Bréville-les-Monts", +"Bréville-sur-Mer", +"Bréxent-Enocq", +"Bréxent-Énocq", +"Brûly-de-Pesche", +"Brûly-de-Peschois", +"Brûly-de-Peschoise", +"Brücken-Hackpfüffel", "Buais-Les-Monts", -"buccin-marin", -"buccins-marins", -"bucco-dentaire", -"bucco-dentaires", -"bucco-génital", -"bucco-génitale", -"bucco-génitales", -"bucco-génitaux", -"bucco-labial", -"bucco-pharyngé", -"bucco-pharyngée", -"bucco-pharyngées", -"bucco-pharyngés", "Bucey-en-Othe", "Bucey-lès-Gy", "Bucey-lès-Traves", -"buck-béan", -"buck-béans", +"Bucy-Saint-Liphard", "Bucy-le-Long", "Bucy-le-Roi", "Bucy-lès-Cerny", "Bucy-lès-Pierrepont", -"Bucy-Saint-Liphard", "Budel-Dorplein", "Budel-Schoot", "Bueil-en-Touraine", -"buenos-airien", "Buenos-Airien", "Buenos-Ayres", -"buen-retiro", "Buhl-Lorraine", +"Buigny-Saint-Maclou", "Buigny-l'Abbé", "Buigny-lès-Gamaches", -"Buigny-Saint-Maclou", -"Buire-au-Bois", "Buire-Courcelles", +"Buire-au-Bois", "Buire-le-Sec", "Buire-sur-l'Ancre", -"Buis-les-Baronnies", -"buis-prévenchais", "Buis-Prévenchais", -"buis-prévenchaise", "Buis-Prévenchaise", -"buis-prévenchaises", "Buis-Prévenchaises", -"buisson-ardent", -"buissons-ardents", +"Buis-les-Baronnies", "Buis-sur-Damville", "Bulat-Pestivien", -"bull-dogs", -"bull-mastiff", -"bull-terrier", -"bull-terriers", "Bully-les-Mines", -"bungee-jumping", -"bungy-jumping", "Buno-Bonnevaux", -"bureau-chef", "Bure-les-Templiers", "Bures-en-Bray", "Bures-les-Monts", @@ -3586,63 +2168,21 @@ FR_BASE_EXCEPTIONS = [ "Burey-en-Vaux", "Burey-la-Côte", "Burg-Reuland", -"burg-reulandais", "Burg-Reulandais", "Burg-Reulandaise", +"Burkina-Faso", "Burkina-be", "Burkina-bes", -"Burkina-Faso", "Burkina-fassien", "Burnhaupt-le-Bas", "Burnhaupt-le-Haut", -"burn-out", -"burn-outa", -"burn-outai", -"burn-outaient", -"burn-outais", -"burn-outait", -"burn-outâmes", -"burn-outant", -"burn-outas", -"burn-outasse", -"burn-outassent", -"burn-outasses", -"burn-outassiez", -"burn-outassions", -"burn-outât", -"burn-outâtes", -"burn-oute", -"burn-outé", -"burn-outée", -"burn-outées", -"burn-outent", -"burn-outer", -"burn-outera", -"burn-outerai", -"burn-outeraient", -"burn-outerais", -"burn-outerait", -"burn-outeras", -"burn-outèrent", -"burn-outerez", -"burn-outeriez", -"burn-outerions", -"burn-outerons", -"burn-outeront", -"burn-outes", -"burn-outés", -"burn-outez", -"burn-outiez", -"burn-outions", -"burn-outons", -"burn-outs", "Burosse-Mendousse", "Burthecourt-aux-Chênes", +"Bus-Saint-Rémy", "Bus-la-Mésière", "Bus-lès-Artois", "Bussac-Forêt", "Bussac-sur-Charente", -"Bus-Saint-Rémy", "Busserotte-et-Montenaille", "Bussière-Badil", "Bussière-Boffy", @@ -3655,8 +2195,11 @@ FR_BASE_EXCEPTIONS = [ "Bussunarits-Sarrasquette", "Bussus-Bussuel", "Bussy-Albieux", -"Bussy-aux-Bois", "Bussy-Chardonney", +"Bussy-Lettrée", +"Bussy-Saint-Georges", +"Bussy-Saint-Martin", +"Bussy-aux-Bois", "Bussy-en-Othe", "Bussy-la-Côte", "Bussy-la-Pesle", @@ -3665,171 +2208,108 @@ FR_BASE_EXCEPTIONS = [ "Bussy-le-Repos", "Bussy-lès-Daours", "Bussy-lès-Poix", -"Bussy-Lettrée", -"Bussy-Saint-Georges", -"Bussy-Saint-Martin", "Bussy-sur-Moudon", -"buste-reliquaire", -"bustes-reliquaires", "Bustince-Iriberry", -"Butot-en-Caux", "Butot-Vénesville", +"Butot-en-Caux", "Butry-sur-Oise", -"but-sur-balles", "Butte-Montmartre", -"butter-oil", "Buttes-Chaumont", "Buxières-d'Aillac", +"Buxières-les-Mines", "Buxières-lès-Clefmont", "Buxières-lès-Froncles", -"Buxières-les-Mines", "Buxières-lès-Villiers", -"Buxières-sous-les-Côtes", "Buxières-sous-Montaigut", +"Buxières-sous-les-Côtes", "Buxières-sur-Arce", "Buzet-sur-Baïse", "Buzet-sur-Tarn", "Buzy-Darmont", -"BVD-MD", "Byans-sur-Doubs", -"bye-bye", "Byhleguhre-Byhlen", -"by-passa", -"by-passai", -"by-passaient", -"by-passais", -"by-passait", -"by-passâmes", -"by-passant", -"by-passas", -"by-passasse", -"by-passassent", -"by-passasses", -"by-passassiez", -"by-passassions", -"by-passât", -"by-passâtes", -"by-passe", -"by-passé", -"by-passée", -"by-passées", -"by-passent", -"by-passer", -"by-passera", -"by-passerai", -"by-passeraient", -"by-passerais", -"by-passerait", -"by-passeras", -"by-passèrent", -"by-passerez", -"by-passeriez", -"by-passerions", -"by-passerons", -"by-passeront", -"by-passes", -"by-passés", -"by-passez", -"by-passiez", -"by-passions", -"by-passons", +"Bœurs-en-Othe", +"Bâgé-la-Ville", +"Bâgé-le-Châtel", +"Bâle-Campagne", +"Bâle-Ville", +"Béard-Géovreissiat", +"Bécon-les-Granits", +"Bécordel-Bécourt", +"Bédeilhac-et-Aynat", +"Bédouès-Cocurès", +"Bégrolles-en-Mauges", +"Béhasque-Lapiste", +"Bélesta-en-Lauragais", +"Bénesse-Maremne", +"Bénesse-lès-Dax", +"Béning-lès-Saint-Avold", +"Bénivay-Ollon", +"Bény-Bocain", +"Bény-Bocaine", +"Bény-Bocaines", +"Bény-Bocains", +"Bény-sur-Mer", +"Bénévent-et-Charbillac", +"Bénévent-l'Abbaye", +"Bérengeville-la-Campagne", +"Bérig-Vintrange", +"Bérou-la-Mulotière", +"Béthancourt-en-Valois", +"Béthancourt-en-Vaux", +"Béthemont-la-Forêt", +"Béthencourt-sur-Mer", +"Béthencourt-sur-Somme", +"Béthisy-Saint-Martin", +"Béthisy-Saint-Pierre", +"Béville-le-Comte", +"Bézaudun-les-Alpes", +"Bézaudun-sur-Bîne", +"Bézu-Saint-Eloi", +"Bézu-Saint-Germain", +"Bézu-Saint-Éloi", +"Bézu-la-Forêt", +"Bézu-le-Guéry", +"Bézues-Bajon", +"Böhl-Iggelheim", +"Börde-Hakel", +"Börgerende-Rethwisch", +"Bösleben-Wüllersleben", +"Bœurs-en-Othe", "C-4", +"C-blanc", +"C-blancs", +"C.-Antip.", +"CD-R", +"CD-ROM", +"CD-RW", +"CD-WORM", "Cabanac-Cazaux", -"Cabanac-et-Villagrains", "Cabanac-Séguenville", -"cabane-roulotte", -"cabanes-roulottes", +"Cabanac-et-Villagrains", "Cabas-Loumassès", -"câblo-opérateur", -"câblo-opérateurs", "Cabrières-d'Aigues", "Cabrières-d'Avignon", -"cacasse-à-cul-nu", -"cacasses-à-cul-nu", -"c-à-d", -"c.-à-d.", "Cadegliano-Viconago", "Cadeilhan-Trachère", "Cadillac-en-Fronsadais", -"cadrage-débordement", "Cadzand-Bad", -"caf'conc", -"café-au-lait", -"café-bar", -"café-bistro", -"café-calva", -"café-comptoir", -"café-concert", -"café-crème", -"café-filtre", -"cafés-bars", -"cafés-concerts", -"cafés-crèmes", -"cafés-filtre", -"cafés-théâtres", -"café-théâtre", -"cages-théâtres", -"cage-théâtre", "Cagnac-les-Mines", "Cagnes-sur-Mer", -"cague-braille", -"cague-brailles", -"cahin-caha", "Cahuzac-sur-Adour", "Cahuzac-sur-Vère", -"cail-cédra", -"cail-cédras", -"cail-cédrin", -"cail-cédrins", -"caillé-blanc", -"caille-lait", -"caille-laits", -"caillés-blancs", -"cailleu-tassart", -"caillot-rosat", -"caillots-rosats", -"Caillouël-Crépigny", "Caillouet-Orgeville", "Cailloux-sur-Fontaines", +"Caillouël-Crépigny", "Cailly-sur-Eure", -"caïque-bazar", -"caïques-bazars", -"caisse-outre", -"caisse-palette", -"caisses-outres", -"caisses-palettes", -"cake-walk", -"cake-walks", "Calasca-Castiglione", "Calatafimi-Segesta", -"calcite-rhodochrosite", -"calcites-rhodochrosites", -"calcium-autunite", -"calcium-autunites", -"calcium-pyromorphite", -"calcium-pyromorphites", -"calcium-rhodochrosite", -"calcium-rhodochrosites", -"cale-bas", -"caleçon-combinaison", -"caleçons-combinaisons", -"cale-dos", -"cale-hauban", -"cale-haubans", -"cale-pied", -"cale-pieds", "Calleville-les-Deux-Eglises", "Calleville-les-Deux-Églises", -"call-girl", -"call-girls", "Calmels-et-le-Viala", -"calo-moulinotin", "Calo-Moulinotin", -"calo-moulinotine", "Calo-Moulinotine", -"calo-moulinotines", "Calo-Moulinotines", -"calo-moulinotins", "Calo-Moulinotins", "Calonne-Ricouart", "Calonne-sur-la-Lys", @@ -3849,27 +2329,20 @@ FR_BASE_EXCEPTIONS = [ "Cambon-lès-Lavaur", "Cambounet-sur-le-Sor", "Cambron-Casteau", +"Cambron-Saint-Vincent", "Cambronne-lès-Clermont", "Cambronne-lès-Ribécourt", -"Cambron-Saint-Vincent", -"came-cruse", -"caméra-lucida", -"caméra-piéton", -"caméra-piétons", "Camiac-et-Saint-Denis", -"camion-bélier", -"camion-citerne", -"camion-cuisine", -"camion-cuisines", -"camion-poubelle", -"camions-béliers", -"camions-bennes", -"camions-citernes", -"camions-poubelles", "Camou-Cihigue", "Camou-Mixe-Suhast", -"Campagnac-lès-Quercy", +"Camp-Auriol", +"Camp-Dumy", +"Camp-Mégier", +"Camp-Méjan", +"Camp-Public", +"Camp-Réal", "Campagna-de-Sault", +"Campagnac-lès-Quercy", "Campagne-d'Armagnac", "Campagne-lès-Boulonnais", "Campagne-lès-Guines", @@ -3878,10 +2351,6 @@ FR_BASE_EXCEPTIONS = [ "Campagne-sur-Arize", "Campagne-sur-Aude", "Campandré-Valcongrain", -"campanulo-infundibiliforme", -"campanulo-infundibiliformes", -"Camp-Auriol", -"Camp-Dumy", "Campestre-et-Luc", "Campet-et-Lamolère", "Campezo-Kanpezu", @@ -3892,46 +2361,23 @@ FR_BASE_EXCEPTIONS = [ "Campigneulles-les-Petites", "Campillos-Paravientos", "Campillos-Sierra", -"camping-car", -"camping-cars", -"camping-gaz", "Camping-Gaz", "Camplong-d'Aude", -"Camp-Mégier", -"Camp-Méjan", -"campo-haltien", "Campo-Haltien", -"campo-haltienne", -"campo-haltiennes", -"campo-haltiens", -"campo-laïcien", "Campo-Laïcien", -"campo-laïcienne", "Campo-Laïcienne", -"campo-laïciennes", "Campo-Laïciennes", -"campo-laïciens", "Campo-Laïciens", -"Camp-Public", -"Camp-Réal", +"Camps-Saint-Mathurin-Léobazel", "Camps-en-Amiénois", "Camps-la-Source", -"Camps-Saint-Mathurin-Léobazel", "Camps-sur-l'Agly", "Camps-sur-l'Isle", -"camps-volants", -"camp-volant", "Canada-Uni", -"canadien-français", "Canale-di-Verde", -"canapé-lit", -"canapés-lits", "Canaules-et-Argentières", -"candau-casteidois", "Candau-Casteidois", -"candau-casteidoise", "Candau-Casteidoise", -"candau-casteidoises", "Candau-Casteidoises", "Candes-Saint-Martin", "Candé-sur-Beuvron", @@ -3939,28 +2385,18 @@ FR_BASE_EXCEPTIONS = [ "Canet-de-Salars", "Canet-en-Roussillon", "Caniac-du-Causse", -"cani-joering", -"cani-rando", -"canne-épée", "Cannes-Ecluse", -"Cannes-Écluse", -"cannes-épées", "Cannes-et-Clairan", -"cannib's", +"Cannes-Écluse", "Canny-sur-Matz", "Canny-sur-Thérain", -"canoë-kayak", -"canoë-kayaks", -"canon-revolver", -"canons-revolvers", "Cantaing-sur-Escaut", "Cante-Greil", "Cante-Grel", "Cante-Grillet", +"Cante-Perdris", "Cantenay-Epinard", "Cantenay-Épinard", -"Cante-Perdris", -"C.-Antip.", "Cantonnier-de-l'Est", "Canville-la-Rocque", "Canville-les-Deux-Eglises", @@ -3968,83 +2404,34 @@ FR_BASE_EXCEPTIONS = [ "Cany-Barville", "Caorches-Saint-Nicolas", "Caouënnec-Lanvézéac", +"Cap-d'Ail", "Capaccio-Paestum", "Capdenac-Gare", "Capelle-Fermont", -"capelle-filismontin", "Capelle-Filismontin", -"capelle-filismontine", "Capelle-Filismontine", -"capelle-filismontines", "Capelle-Filismontines", -"capelle-filismontins", "Capelle-Filismontins", "Capelle-les-Grands", "Capelle-lès-Hesdin", -"capélo-hugonais", -"Capélo-Hugonais", -"capélo-hugonaise", -"Capélo-Hugonaise", -"capélo-hugonaises", -"Capélo-Hugonaises", "Capesterre-Belle-Eau", "Capesterre-de-Marie-Galante", -"capi-aga", -"capi-agas", -"capigi-bassi", -"capigi-bassis", "Capitale-Nationale", -"capital-risque", -"capital-risques", -"capital-risqueur", -"capital-risqueurs", -"capitan-pacha", -"capitan-pachas", -"capitaux-risqueurs", -"caporal-chef", -"caporaux-chefs", "Capoulet-et-Junac", "Cappelle-Brouck", "Cappelle-en-Pévèle", "Cappelle-la-Grande", -"capsule-congé", -"capsules-congés", -"capuchon-de-moine", -"caput-mortuum", -"caque-denier", -"carbo-azotine", -"carbonate-apatite", -"carbonate-apatites", +"Capélo-Hugonais", +"Capélo-Hugonaise", +"Capélo-Hugonaises", "Carbon-Blanc", -"carbone-14", -"carbones-14", "Carbonia-Iglesias", "Carcarès-Sainte-Croix", "Carcen-Ponson", -"carcere-duro", "Carcheto-Brustico", -"cardio-chirurgien", -"cardio-chirurgienne", -"cardio-chirurgiennes", -"cardio-chirurgiens", -"cardio-kickboxing", -"cardio-kickboxings", -"cardio-thoracique", -"cardio-thoraciques", -"cardio-training", -"cardio-vasculaire", -"cardio-vasculaires", "Cardo-Torgia", -"carême-prenant", -"carfentrazone-éthyle", -"car-ferries", -"car-ferry", -"car-ferrys", -"cargo-dortoir", -"cargos-dortoirs", "Carhaix-Plouguer", "Carignan-de-Bordeaux", -"car-jacking", "Carla-Bayle", "Carla-de-Roquefort", "Carla-le-Comte", @@ -4052,16 +2439,9 @@ FR_BASE_EXCEPTIONS = [ "Carmzow-Wallmow", "Carnac-Rouffiac", "Carnoux-en-Provence", -"caro-percyais", "Caro-Percyais", -"caro-percyaise", "Caro-Percyaise", -"caro-percyaises", "Caro-Percyaises", -"carré-bossu", -"carrée-bossue", -"carrées-bossues", -"carrés-bossus", "Carresse-Cassaber", "Carrières-sous-Poissy", "Carrières-sur-Seine", @@ -4069,210 +2449,98 @@ FR_BASE_EXCEPTIONS = [ "Carsac-Aillac", "Carsac-de-Gurson", "Carsac-de-Villefranche", -"carte-cadeau", -"carte-fille", -"carte-index", -"carte-lettre", -"carte-maximum", -"carte-mère", -"cartes-cadeaux", -"cartes-filles", -"cartes-lettres", -"cartes-maximum", -"cartes-mères", -"carte-soleil", -"cartes-vues", -"carte-vue", "Cartigny-l'Epinay", "Cartigny-l'Épinay", -"carton-index", -"carton-pâte", -"carton-pierre", -"cartons-pâte", -"Carville-la-Folletière", "Carville-Pot-de-Fer", +"Carville-la-Folletière", "Cascastel-des-Corbières", "Case-Pilote", "Cases-de-Pène", -"cash-back", -"cash-flow", -"cash-flows", -"cas-limite", -"cas-limites", -"casque-de-Jupiter", "Cassagnabère-Tournas", "Cassagnes-Bégonhès", -"casse-aiguille", -"casse-bélier", -"casse-béliers", -"casse-bonbon", -"casse-bonbons", -"casse-bouteille", -"casse-bras", -"casse-burnes", -"casse-claouis", -"casse-coeur", -"casse-cœur", -"casse-coeurs", -"casse-cœurs", -"casse-cou", -"casse-couille", -"casse-couilles", -"casse-cous", -"casse-croute", -"casse-croûte", -"casse-croutes", -"casse-croûtes", -"casse-cul", -"casse-culs", -"casse-dalle", -"casse-dalles", -"casse-fer", -"casse-fil", -"casse-fils", -"casse-graine", -"casse-graines", -"casse-gueule", -"casse-gueules", -"casse-langue", -"casse-langues", -"casse-lunette", -"casse-lunettes", -"casse-mariages", -"casse-motte", -"casse-museau", -"casse-museaux", -"casse-noisette", -"casse-noisettes", -"casse-noix", -"casse-nole", -"casse-noyaux", -"casse-olives", -"casse-patte", -"casse-pattes", -"casse-péter", -"casse-pied", -"casse-pieds", -"casse-pierre", -"casse-pierres", -"casse-pipe", -"casse-pipes", -"casse-poitrine", -"casse-pot", -"casse-tête", -"casse-têtes", -"casse-vessie", -"cassi-ascher", -"cassi-aschers", "Castaignos-Souslens", -"Castanet-le-Haut", "Castanet-Tolosan", +"Castanet-le-Haut", "Casteide-Cami", "Casteide-Candau", "Casteide-Doat", -"castel-ambillouçois", "Castel-Ambillouçois", -"castel-ambillouçoise", "Castel-Ambillouçoise", -"castel-ambillouçoises", "Castel-Ambillouçoises", -"Castelbello-Ciardes", -"castel-chalonnais", "Castel-Chalonnais", -"castel-chalonnaise", "Castel-Chalonnaise", -"castel-chalonnaises", "Castel-Chalonnaises", +"Castel-Lévézien", +"Castel-Lévézienne", +"Castel-Lévéziennes", +"Castel-Lévéziens", +"Castel-Pontin", +"Castel-Pontine", +"Castel-Pontines", +"Castel-Pontins", +"Castel-Sarrazin", +"Castel-Symphorinois", +"Castel-Symphorinoise", +"Castel-Symphorinoises", +"Castelbello-Ciardes", "Castell'Alfero", -"Castellare-di-Casinca", -"Castellare-di-Mercurio", "Castell'Arquato", "Castell'Azzara", -"Castellet-lès-Sausses", -"castel-lévézien", -"Castel-Lévézien", -"castel-lévézienne", -"Castel-Lévézienne", -"castel-lévéziennes", -"Castel-Lévéziennes", -"castel-lévéziens", -"Castel-Lévéziens", -"Castello-di-Rostino", "Castell'Umberto", +"Castellare-di-Casinca", +"Castellare-di-Mercurio", +"Castellet-lès-Sausses", +"Castello-di-Rostino", "Castelmoron-d'Albret", "Castelmoron-sur-Lot", +"Castelnau d'Auzan Labarrère", "Castelnau-Barbarens", "Castelnau-Chalosse", +"Castelnau-Durban", +"Castelnau-Durbannais", +"Castelnau-Durbannaise", +"Castelnau-Durbannaises", +"Castelnau-Magnoac", +"Castelnau-Montratier", +"Castelnau-Montratier-Sainte-Alauzie", +"Castelnau-Picampeau", +"Castelnau-Pégayrols", +"Castelnau-Rivière-Basse", +"Castelnau-Tursan", +"Castelnau-Valence", "Castelnau-d'Anglès", "Castelnau-d'Arbieu", "Castelnau-d'Aude", "Castelnau-d'Auzan", -"Castelnaud-de-Gratecambe", +"Castelnau-d'Estrétefonds", "Castelnau-de-Brassac", "Castelnau-de-Guers", "Castelnau-de-Lévis", "Castelnau-de-Mandailles", -"Castelnau-de-Médoc", "Castelnau-de-Montmiral", -"Castelnau-d'Estrétefonds", -"Castelnaud-la-Chapelle", -"Castelnau-Durban", -"castelnau-durbannais", -"Castelnau-Durbannais", -"castelnau-durbannaise", -"Castelnau-Durbannaise", -"castelnau-durbannaises", -"Castelnau-Durbannaises", +"Castelnau-de-Médoc", "Castelnau-le-Lez", -"Castelnau-Magnoac", -"Castelnau-Montratier", -"Castelnau-Montratier-Sainte-Alauzie", -"Castelnau-Pégayrols", -"Castelnau-Picampeau", -"Castelnau-Rivière-Basse", "Castelnau-sur-Gupie", "Castelnau-sur-l'Auvignon", -"Castelnau-Tursan", -"Castelnau-Valence", -"castel-pontin", -"Castel-Pontin", -"castel-pontine", -"Castel-Pontine", -"castel-pontines", -"Castel-Pontines", -"castel-pontins", -"Castel-Pontins", -"Castel-Sarrazin", +"Castelnaud-de-Gratecambe", +"Castelnaud-la-Chapelle", "Castels-et-Bézenac", -"castel-symphorinois", -"Castel-Symphorinois", -"castel-symphorinoise", -"Castel-Symphorinoise", -"castel-symphorinoises", -"Castel-Symphorinoises", -"Castéra-Bouzet", -"Castéra-Lanusse", -"Castéra-Lectourois", -"Castéra-Lou", -"Castéra-Loubix", -"Castéra-Verduzan", -"Castéra-Vignoles", "Castet-Arrouy", -"castet-arrouyais", "Castet-Arrouyais", -"castet-arrouyaise", "Castet-Arrouyaise", -"castet-arrouyaises", "Castet-Arrouyaises", "Castetnau-Camblong", "Castets-en-Dorthe", "Castex-d'Armagnac", +"Casti-Wergenstein", "Casties-Labrande", -"castillano-aragonais", "Castille-et-León", "Castillejo-Sierra", "Castillo-Albaráñez", +"Castillon (Canton d'Arthez-de-Béarn)", "Castillon-Debats", +"Castillon-Massas", +"Castillon-Savès", "Castillon-de-Castets", "Castillon-de-Larboust", "Castillon-de-Saint-Martory", @@ -4281,20 +2549,19 @@ FR_BASE_EXCEPTIONS = [ "Castillon-en-Couserans", "Castillon-et-Capitourlan", "Castillon-la-Bataille", -"Castillon-Massas", -"Castillon-Savès", -"Casti-Wergenstein", "Castres-Gironde", "Castrillo-Tejeriego", -"Castrop-Rauxel", "Castro-Urdiales", -"catalan-valencien-baléare", -"catalase-positive", -"cat-boat", +"Castrop-Rauxel", +"Castéra-Bouzet", +"Castéra-Lanusse", +"Castéra-Lectourois", +"Castéra-Lou", +"Castéra-Loubix", +"Castéra-Verduzan", +"Castéra-Vignoles", "Catillon-Fumechon", "Catillon-sur-Sambre", -"cato-cathartique", -"cato-cathartiques", "Caubios-Loos", "Caubon-Saint-Sauveur", "Cauchy-à-la-Tour", @@ -4309,8 +2576,8 @@ FR_BASE_EXCEPTIONS = [ "Caumont-sur-Garonne", "Caumont-sur-Orne", "Caunes-Minervois", -"Caunettes-en-Val", "Caunette-sur-Lauquet", +"Caunettes-en-Val", "Caupenne-d'Armagnac", "Cauroy-lès-Hermonville", "Cause-de-Clérans", @@ -4322,96 +2589,35 @@ FR_BASE_EXCEPTIONS = [ "Cauverville-en-Roumois", "Cauville-sur-Mer", "Caux-et-Sauzens", -"ça-va-ça-vient", "Cavaglio-Spoccia", "Cavalaire-sur-Mer", "Cavallino-Treporti", -"ça-voir", -"ça-voirs", "Cavron-Saint-Martin", "Cayeux-en-Santerre", "Cayeux-sur-Mer", "Cayre-four", "Cazals-des-Baylès", -"Cazarilh-Laspènes", "Cazaril-Laspènes", "Cazaril-Tambourès", -"Cazaux-d'Anglès", +"Cazarilh-Laspènes", "Cazaux-Debat", "Cazaux-Fréchet-Anéran-Camors", "Cazaux-Layrisse", "Cazaux-Savès", "Cazaux-Villecomtal", +"Cazaux-d'Anglès", "Cazeaux-de-Larboust", "Cazenave-Serres-et-Allens", "Cazeneuve-Montaut", -"Cazères-sur-l'Adour", "Cazes-Mondenard", "Cazouls-d'Hérault", "Cazouls-lès-Béziers", -"C-blanc", -"C-blancs", -"c-commanda", -"c-commandai", -"c-commandaient", -"c-commandais", -"c-commandait", -"c-commandâmes", -"c-commandant", -"c-commandas", -"c-commandasse", -"c-commandassent", -"c-commandasses", -"c-commandassiez", -"c-commandassions", -"c-commandât", -"c-commandâtes", -"c-commande", -"c-commandé", -"c-commandée", -"c-commandées", -"c-commandent", -"c-commander", -"c-commandera", -"c-commanderai", -"c-commanderaient", -"c-commanderais", -"c-commanderait", -"c-commanderas", -"c-commandèrent", -"c-commanderez", -"c-commanderiez", -"c-commanderions", -"c-commanderons", -"c-commanderont", -"c-commandes", -"c-commandés", -"c-commandez", -"c-commandiez", -"c-commandions", -"c-commandons", -"CD-R", -"CD-ROM", -"CD-RW", -"CD-WORM", -"Céaux-d'Allègre", +"Cazères-sur-l'Adour", "Ceaux-en-Couhé", "Ceaux-en-Loudun", -"cédez-le-passage", "Ceilhes-et-Rocozels", -"cejourd'hui", -"céleri-rave", -"cèleri-rave", -"céléri-rave", -"cèleri-raves", -"céleris-raves", -"Céleste-Empire", -"celle-ci", -"celle-là", "Celle-Lévescault", -"celles-ci", "Celles-en-Bassigny", -"celles-là", "Celles-lès-Condé", "Celles-sur-Aisne", "Celles-sur-Belle", @@ -4419,63 +2625,19 @@ FR_BASE_EXCEPTIONS = [ "Celles-sur-Ource", "Celles-sur-Plaine", "Cellier-du-Luc", -"celto-nordique", -"celto-nordiques", -"celui-ci", -"celui-là", -"Cély-en-Bière", -"Cénac-et-Saint-Julien", "Cenne-Monestiés", "Cenon-sur-Vienne", -"cent-cinquante-cinq", -"cent-cinquante-cinquièmes", -"cent-garde", -"cent-gardes", -"cent-lances", -"cent-mille", -"centre-bourg", -"centre-droit", -"Centre-du-Québec", "Centre-Est", -"centre-gauche", "Centre-Mauricien", "Centre-Nord", "Centre-Ouest", -"centres-bourgs", "Centre-Sud", -"centres-villes", -"centre-tir", -"centre-ville", +"Centre-du-Québec", "Centro-Américain", "Centro-Américaine", "Centro-Américains", -"cent-suisse", -"cent-suisses", -"céphalo-pharyngien", -"céphalo-pharyngienne", -"céphalo-pharyngiennes", -"céphalo-pharyngiens", -"céphalo-rachidien", -"Cérans-Foulletourte", "Cercy-la-Tour", -"cérébro-lésion", -"cérébro-lésions", -"cérébro-rachidien", -"cérébro-rachidienne", -"cérébro-rachidiennes", -"cérébro-rachidiens", -"cérébro-spinal", -"cérébro-spinale", -"cérébro-spinales", -"cérébro-spinaux", -"Céré-la-Ronde", "Cerexhe-Heuseux", -"cerfs-veaux", -"cerfs-volants", -"cerfs-volistes", -"cerf-veau", -"cerf-volant", -"cerf-voliste", "Cerisy-Belle-Etoile", "Cerisy-Belle-Étoile", "Cerisy-Buleux", @@ -4483,60 +2645,34 @@ FR_BASE_EXCEPTIONS = [ "Cerisy-la-Forêt", "Cerisy-la-Salle", "Cernay-en-Dormois", -"Cernay-la-Ville", "Cernay-l'Eglise", "Cernay-l'Église", +"Cernay-la-Ville", "Cernay-lès-Reims", "Cernoy-en-Berry", "Cerny-en-Laonnois", "Cerny-lès-Bucy", -"Céroux-Mousty", "Cerre-lès-Noroy", -"certificat-cadeau", -"césaro-papisme", -"césaro-papismes", -"césaro-papiste", -"césaro-papistes", -"Césarville-Dossainville", -"césium-analcime", -"césium-analcimes", -"Cesny-aux-Vignes", "Cesny-Bois-Halbout", -"cesoird'hui", +"Cesny-aux-Vignes", "Cessenon-sur-Orb", "Cessey-sur-Tille", -"cessez-le-feu", -"cession-bail", "Cesson-Sévigné", "Cessoy-en-Montois", "Cessy-les-Bois", -"c'est-à-dire", -"cesta-punta", "Cette-Eygun", -"ceux-ci", -"ceux-là", -"chabada-bada", -"cha'ban", -"chabazite-Ca", -"chabazite-Cas", -"chabazite-Na", -"chabazite-Nas", -"cha-cha", -"cha-cha-cha", -"cha-chas", "Chagny-lès-Omont", -"Chaillac-sur-Vienne", -"Chaillé-les-Marais", "Chail-les-Bains", -"Chaillé-sous-les-Ormeaux", +"Chaillac-sur-Vienne", "Chailly-en-Bière", "Chailly-en-Brie", "Chailly-en-Gâtinais", "Chailly-lès-Ennery", "Chailly-sur-Armançon", "Chailly-sur-Montreux", +"Chaillé-les-Marais", +"Chaillé-sous-les-Ormeaux", "Chainaz-les-Frasses", -"Chaînée-des-Coupis", "Chaintrix-Bierges", "Chaise-Dieu-du-Theil", "Chalain-d'Uzore", @@ -4545,7 +2681,6 @@ FR_BASE_EXCEPTIONS = [ "Chalautre-la-Grande", "Chalautre-la-Petite", "Chalautre-la-Reposte", -"Châlette-sur-Loing", "Chalette-sur-Voire", "Chalivoy-Milon", "Challain-la-Potherie", @@ -4554,27 +2689,20 @@ FR_BASE_EXCEPTIONS = [ "Challes-la-Montagne", "Challes-les-Eaux", "Chalmazel-Jeansagnière", +"Chalo-Saint-Mars", +"Chalon-sur-Saône", "Chalonnes-sous-le-Lude", "Chalonnes-sur-Loire", -"Châlon's", -"Châlons-du-Maine", "Chalons-en-Champagne", -"Châlons-en-Champagne", -"Châlons-sur-Marne", -"Châlons-sur-Vesle", -"Chalon-sur-Saône", -"Chalo-Saint-Mars", "Chalou-Moulineux", "Chamalières-sur-Loire", "Chamarandes-Choignes", "Chambaron-sur-Morge", -"Chambéry-le-Vieux", "Chambley-Bussières", -"chambolle-musigny", "Chambolle-Musigny", +"Chambon-Sainte-Croix", "Chambon-la-Forêt", "Chambon-le-Château", -"Chambon-Sainte-Croix", "Chambon-sur-Cisse", "Chambon-sur-Dolore", "Chambon-sur-Lac", @@ -4583,13 +2711,19 @@ FR_BASE_EXCEPTIONS = [ "Chambornay-lès-Pin", "Chambost-Allières", "Chambost-Longessaigne", -"chamboule-tout", "Chambourg-sur-Indre", "Chambray-lès-Tours", -"chamito-sémitique", -"chamito-sémitiques", +"Chambéry-le-Vieux", "Chamonix-Mont-Blanc", "Chamoux-sur-Gelon", +"Champ-Dolent", +"Champ-Haut", +"Champ-Laurent", +"Champ-d'Oiseau", +"Champ-du-Boult", +"Champ-le-Duc", +"Champ-sur-Barse", +"Champ-sur-Drac", "Champagnac-de-Belair", "Champagnac-la-Noaille", "Champagnac-la-Prune", @@ -4597,21 +2731,21 @@ FR_BASE_EXCEPTIONS = [ "Champagnac-le-Vieux", "Champagnat-le-Jeune", "Champagne-Ardenne", +"Champagne-Mouton", +"Champagne-Vigny", "Champagne-au-Mont-d'Or", "Champagne-de-Blanzac", "Champagne-en-Valromey", "Champagne-et-Fontaine", -"Champagné-le-Sec", -"Champagné-les-Marais", -"Champagne-Mouton", -"Champagné-Saint-Hilaire", "Champagne-sur-Loue", "Champagne-sur-Oise", "Champagne-sur-Seine", "Champagne-sur-Vingeanne", -"Champagne-Vigny", "Champagny-en-Vanoise", "Champagny-sous-Uxelles", +"Champagné-Saint-Hilaire", +"Champagné-le-Sec", +"Champagné-les-Marais", "Champaubert-aux-Bois", "Champdeniers-Saint-Denis", "Champdor-Corcelles", @@ -4620,8 +2754,8 @@ FR_BASE_EXCEPTIONS = [ "Champeaux-sur-Sarthe", "Champey-sur-Moselle", "Champigneul-Champagne", -"Champigneulles-en-Bassigny", "Champigneul-sur-Vence", +"Champigneulles-en-Bassigny", "Champignol-lez-Mondeville", "Champigny-en-Beauce", "Champigny-en-Rochereau", @@ -4638,13 +2772,12 @@ FR_BASE_EXCEPTIONS = [ "Champniers-et-Reilhac", "Champrond-en-Gâtine", "Champrond-en-Perchet", -"champs-clos", -"Champs-Élysées", "Champs-Romain", "Champs-sur-Marne", "Champs-sur-Tarentaine-Marchal", "Champs-sur-Yonne", "Champs-zé", +"Champs-Élysées", "Champteussé-sur-Baconne", "Champtocé-sur-Loire", "Champvans-les-Baume", @@ -4655,15 +2788,11 @@ FR_BASE_EXCEPTIONS = [ "Chanceaux-sur-Choisille", "Chang-Haï", "Changis-sur-Marne", -"changxing'ien", "Changxing'ien", "Channay-sur-Lathan", "Chanos-Curson", -"chanos-cursonnais", "Chanos-Cursonnais", -"chanos-cursonnaise", "Chanos-Cursonnaise", -"chanos-cursonnaises", "Chanos-Cursonnaises", "Chanoz-Châtenay", "Chante-Clair", @@ -4675,70 +2804,28 @@ FR_BASE_EXCEPTIONS = [ "Chantemerle-sur-la-Soie", "Chantenay-Saint-Imbert", "Chantenay-Villedieu", -"chantilly-tiffany", "Chapdes-Beaufort", -"chape-chuta", -"chape-chutai", -"chape-chutaient", -"chape-chutais", -"chape-chutait", -"chape-chutâmes", -"chape-chutant", -"chape-chutas", -"chape-chutasse", -"chape-chutassent", -"chape-chutasses", -"chape-chutassiez", -"chape-chutassions", -"chape-chutât", -"chape-chutâtes", -"chape-chute", -"chape-chuté", -"chape-chutent", -"chape-chuter", -"chape-chutera", -"chape-chuterai", -"chape-chuteraient", -"chape-chuterais", -"chape-chuterait", -"chape-chuteras", -"chape-chutèrent", -"chape-chuterez", -"chape-chuteriez", -"chape-chuterions", -"chape-chuterons", -"chape-chuteront", -"chape-chutes", -"chape-chutez", -"chape-chutiez", -"chape-chutions", -"chape-chutons", -"chapelloise-fortinienne", -"Chapelloise-Fortinienne", -"chapelloises-fortiniennes", -"Chapelloises-Fortiniennes", -"chapellois-fortinien", +"Chapelle-Guillaume", +"Chapelle-Royale", +"Chapelle-Spinasse", +"Chapelle-Vallon", +"Chapelle-Viviers", +"Chapelle-Voland", +"Chapelle-d'Huin", +"Chapelle-des-Bois", "Chapellois-Fortinien", -"chapellois-fortiniens", "Chapellois-Fortiniens", +"Chapelloise-Fortinienne", +"Chapelloises-Fortiniennes", "Chapon-Seraing", -"chapon-sérésien", "Chapon-Sérésien", "Chapon-Sérésienne", -"char-à-bancs", -"charbon-de-pierre", -"charbon-de-terre", +"Charbonnier-les-Mines", "Charbonnières-les-Bains", "Charbonnières-les-Sapins", "Charbonnières-les-Varennes", "Charbonnières-les-Vieilles", -"Charbonnier-les-Mines", -"charbons-de-pierre", -"charbons-de-terre", "Charcé-Saint-Ellier-sur-Aubance", -"chardon-Marie", -"chardon-Roland", -"chardons-Marie", "Chareil-Cintrat", "Charency-Vezin", "Charente-Inférieure", @@ -4746,7 +2833,6 @@ FR_BASE_EXCEPTIONS = [ "Charenton-du-Cher", "Charenton-le-Pont", "Charette-Varennes", -"chargeuse-pelleteuse", "Chargey-lès-Gray", "Chargey-lès-Port", "Charles-Quint", @@ -4755,20 +2841,18 @@ FR_BASE_EXCEPTIONS = [ "Charlevoisien-de-l'Est", "Charly-Oradour", "Charly-sur-Marne", -"charme-houblon", +"Charmes-Saint-Valbert", "Charmes-en-l'Angle", -"charmes-houblons", "Charmes-la-Côte", "Charmes-la-Grande", -"Charmes-Saint-Valbert", -"Charmes-sur-l'Herbasse", "Charmes-sur-Rhône", +"Charmes-sur-l'Herbasse", "Charmois-devant-Bruyères", "Charmois-l'Orgueilleux", "Charmont-en-Beauce", -"Charmontois-l'Abbé", "Charmont-sous-Barbuise", "Charmont-sur-Marne", +"Charmontois-l'Abbé", "Charnay-lès-Chalon", "Charnay-lès-Mâcon", "Charnoz-sur-Ain", @@ -4777,169 +2861,323 @@ FR_BASE_EXCEPTIONS = [ "Charrey-sur-Saône", "Charrey-sur-Seine", "Charritte-de-Bas", -"chars-à-bancs", -"charte-partie", "Chartres-de-Bretagne", "Chartrier-Ferrière", "Charvieu-Chavagneux", "Chasné-sur-Illet", "Chassagne-Montrachet", "Chassagne-Saint-Denis", -"chasse-avant", -"chasse-bondieu", -"chasse-bondieux", -"chasse-carrée", -"chasse-carrées", -"chasse-chien", -"chasse-chiens", -"chasse-clou", -"chasse-clous", -"chasse-cœur", -"chasse-coquin", -"chasse-cousin", -"chasse-cousins", -"chasse-crapaud", -"chassé-croisé", -"chasse-derrière", -"chasse-derrières", -"chasse-diable", -"chasse-diables", -"chasse-ennui", -"chasse-fièvre", -"chasse-fleurée", -"chasse-fleurées", -"chasse-goupille", -"chasse-goupilles", -"chasse-gueux", -"chasse-marée", -"chasse-marées", -"chasse-morte", -"chasse-mouche", -"chasse-mouches", -"chasse-mulet", -"chasse-mulets", -"chasse-neige", -"chasse-neiges", +"Chasse-sur-Rhône", "Chasseneuil-du-Poitou", "Chasseneuil-sur-Bonnieure", -"chasse-noix", -"chasse-partie", -"chasse-parties", -"chasse-pierre", -"chasse-pierres", -"chasse-poignée", -"chasse-pointe", -"chasse-pointes", -"chasse-pommeau", -"chasse-punaise", -"chasse-rivet", -"chasse-rivets", -"chasse-rondelle", -"chasse-roue", -"chasse-roues", -"chassés-croisés", -"chasses-parties", -"Chasse-sur-Rhône", -"chasse-taupe", -"chasseur-bombardier", -"chasseur-cueilleur", -"chasseurs-bombardiers", -"chasseurs-cueilleurs", "Chassey-Beaupré", "Chassey-le-Camp", "Chassey-lès-Montbozon", "Chassey-lès-Scey", -"chassez-déchassez", -"chassez-huit", "Chassigny-sous-Dun", -"châssis-support", -"châssis-supports", "Chastel-Arnaud", -"Chastellux-sur-Cure", "Chastel-Nouvel", "Chastel-sur-Murat", +"Chastellux-sur-Cure", "Chastenay-le-Bas", "Chastenay-le-Haut", "Chastre-Villeroux-Blanmont", -"châtaigne-d'eau", -"châtaigne-de-mer", -"châtaignes-d'eau", -"châtaignes-de-mer", +"Chatel-Chéhéry", +"Chatenay-Mâcheron", +"Chatenay-Vaudin", +"Chatonrupt-Sommermont", +"Chatuzange-le-Goubet", +"Chauconin-Neufmontiers", +"Chaudefonds-sur-Layon", +"Chaudenay-la-Ville", +"Chaudenay-le-Château", +"Chaudeney-sur-Moselle", +"Chaudes-Aigues", +"Chaudière-Appalaches", +"Chaudon-Norante", +"Chaudron-en-Mauges", +"Chauffour-lès-Bailly", +"Chauffour-lès-Etréchy", +"Chauffour-lès-Étréchy", +"Chauffour-sur-Vell", +"Chaufour-Notre-Dame", +"Chaufour-lès-Bonnières", +"Chaume-et-Courchamp", +"Chaume-lès-Baigneux", +"Chaumes-en-Brie", +"Chaumes-en-Retz", +"Chaumont-Gistoux", +"Chaumont-Porcien", +"Chaumont-Saint-Quentin", +"Chaumont-d'Anjou", +"Chaumont-devant-Damvillers", +"Chaumont-en-Vexin", +"Chaumont-la-Ville", +"Chaumont-le-Bois", +"Chaumont-le-Bourg", +"Chaumont-sur-Aire", +"Chaumont-sur-Loire", +"Chaumont-sur-Tharonne", +"Chaumoux-Marcilly", +"Chaussoy-Epagny", +"Chaussée-Notre-Dame-Louvignies", +"Chauvac-Laux-Montaux", +"Chauvency-Saint-Hubert", +"Chauvency-le-Château", +"Chauvigny-du-Perche", +"Chauvincourt-Provemont", +"Chauvirey-le-Châtel", +"Chauvirey-le-Vieil", +"Chaux-Champagny", +"Chaux-Neuve", +"Chaux-de-Fonnier", +"Chaux-des-Crotenay", +"Chaux-des-Prés", +"Chaux-la-Lotière", +"Chaux-lès-Clerval", +"Chaux-lès-Passavant", +"Chaux-lès-Port", +"Chavagnes-en-Paillers", +"Chavagnes-les-Redoux", +"Chavagneux-Montbertand", +"Chavaniac-Lafayette", +"Chavannes-de-Bogis", +"Chavannes-des-Bois", +"Chavannes-le-Chêne", +"Chavannes-le-Veyron", +"Chavannes-les-Grands", +"Chavannes-près-Renens", +"Chavannes-sur-Moudon", +"Chavannes-sur-Reyssouze", +"Chavannes-sur-Suran", +"Chavannes-sur-l'Etang", +"Chavannes-sur-l'Étang", +"Chavigny-Bailleul", +"Chavot-Courcourt", +"Chazay-d'Azergues", +"Chazelles-sur-Albe", +"Chazelles-sur-Lavieu", +"Chazelles-sur-Lyon", +"Chazey-Bons", +"Chazey-sur-Ain", +"Chazé-Henry", +"Chazé-sur-Argos", +"Chaînée-des-Coupis", +"Chef-Boutonnais", +"Chef-Boutonnaise", +"Chef-Boutonnaises", +"Chef-Boutonne", +"Chef-Haut", +"Chef-du-Pont", +"Cheffreville-Tonnencourt", +"Cheignieu-la-Balme", +"Cheilly-lès-Maranges", +"Chein-Dessus", +"Cheix-en-Retz", +"Chelle-Debat", +"Chelle-Spou", +"Chemilly-les-Raves", +"Chemilly-près-Seignelay", +"Chemilly-sur-Serein", +"Chemilly-sur-Yonne", +"Chemillé-Melay", +"Chemillé-en-Anjou", +"Chemillé-sur-Dême", +"Chemillé-sur-Indrois", +"Chemin-d'Aisey", +"Chemiré-en-Charnie", +"Chemiré-le-Gaudin", +"Chemiré-sur-Sarthe", +"Chenac-Saint-Seurin-d'Uzet", +"Chenailler-Mascheix", +"Chenay-le-Châtel", +"Chenecey-Buillon", +"Chenevrey-et-Morogne", +"Chenillé-Champteussé", +"Chenillé-Changé", +"Chennery-et-Landreville", +"Chennevières-lès-Louvres", +"Chennevières-sur-Marne", +"Chens-sur-Léman", +"Cheppes-la-Prairie", +"Cherbourg-Octeville", +"Cherbourg-en-Cotentin", +"Chermizy-Ailles", +"Cherveix-Cubas", +"Cherves-Châtelars", +"Cherves-Richemont", +"Chesalles-sur-Moudon", +"Cheseaux-Noréaz", +"Cheseaux-sur-Lausanne", +"Chesne-Arnoul", +"Chesne-Carré", +"Chesne-Dolley", +"Chesnois-Auboncourt", +"Chessy-les-Prés", +"Chester-le-Street", +"Chevagny-les-Chevrières", +"Chevagny-sur-Guye", +"Chevaigné-du-Maine", +"Cheval-Blanc", +"Chevannes-Changy", +"Chevigney-lès-Vercel", +"Chevigney-sur-l'Ognon", +"Chevigny-Saint-Sauveur", +"Chevigny-en-Valière", +"Chevillon-sur-Huillard", +"Chevilly-Larue", +"Cheviré-le-Rouge", +"Chevresis-Monceau", +"Chevry-Cossigny", +"Chevry-en-Sereine", +"Chevry-sous-le-Bignon", +"Cheylard-l'Evêque", +"Cheylard-l'Évêque", +"Chezal-Benoît", +"Chibougamo-Chapien", +"Chigny-les-Roses", +"Chilleurs-aux-Bois", +"Chilly-Mazarin", +"Chilly-le-Vignoble", +"Chilly-sur-Salins", +"Chiopris-Viscone", +"Chirac-Bellevue", +"Chirat-l'Eglise", +"Chirat-l'Église", +"Chiry-Ourscamp", +"Chiry-Ourscamps", +"Chiré-en-Montreuil", +"Chissay-en-Touraine", +"Chissey-en-Morvan", +"Chissey-lès-Mâcon", +"Chissey-sur-Loue", +"Chitry-les-Mines", +"Chivres-Val", +"Chivres-en-Laonnois", +"Chivy-lès-Etouvelles", +"Chivy-lès-Étouvelles", +"Choilley-Dardenay", +"Choisy-au-Bac", +"Choisy-en-Brie", +"Choisy-la-Victoire", +"Choisy-le-Roi", +"Choloy-Ménillot", +"Chonas-l'Amballan", +"Chonville-Malaumont", +"Choqueuse-les-Bénards", +"Chorey-les-Beaune", +"Chouzy-sur-Cisse", +"Chouzé-sur-Loire", +"Chuffilly-Roche", +"Châlette-sur-Loing", +"Châlon's", +"Châlons-du-Maine", +"Châlons-en-Champagne", +"Châlons-sur-Marne", +"Châlons-sur-Vesle", +"Château-Arnoux-Saint-Auban", +"Château-Bernard", +"Château-Bréhain", +"Château-Chalon", +"Château-Chervix", +"Château-Chinon (Campagne)", +"Château-Chinon (Ville)", +"Château-Gaillard", +"Château-Garnier", +"Château-Gontier", +"Château-Guibert", +"Château-Landon", +"Château-Larcher", +"Château-Porcien", +"Château-Renard", +"Château-Renault", +"Château-Rouge", +"Château-Salins", +"Château-Thierry", +"Château-Thébaud", +"Château-Verdun", +"Château-Ville-Vieille", +"Château-Voué", +"Château-d'Olonne", +"Château-des-Prés", +"Château-du-Loir", +"Château-l'Abbaye", +"Château-l'Hermitage", +"Château-l'Évêque", +"Château-la-Vallière", +"Château-sur-Allier", +"Château-sur-Cher", +"Château-sur-Epte", "Châteauneuf-Calcernier", +"Châteauneuf-Grasse", +"Châteauneuf-Miravail", +"Châteauneuf-Val-Saint-Donat", +"Châteauneuf-Val-de-Bargis", +"Châteauneuf-Villevieille", +"Châteauneuf-d'Entraunes", +"Châteauneuf-d'Ille-et-Vilaine", +"Châteauneuf-d'Isère", +"Châteauneuf-d'Oze", "Châteauneuf-de-Bordette", "Châteauneuf-de-Chabre", "Châteauneuf-de-Contes", "Châteauneuf-de-Gadagne", "Châteauneuf-de-Galaure", -"Châteauneuf-d'Entraunes", "Châteauneuf-de-Randon", "Châteauneuf-de-Vernoux", -"Châteauneuf-d'Ille-et-Vilaine", -"Châteauneuf-d'Isère", -"Châteauneuf-d'Oze", "Châteauneuf-du-Faou", -"châteauneuf-du-pape", "Châteauneuf-du-Pape", "Châteauneuf-du-Rhône", "Châteauneuf-en-Thymerais", -"Châteauneuf-Grasse", "Châteauneuf-la-Forêt", "Châteauneuf-le-Rouge", "Châteauneuf-les-Bains", "Châteauneuf-les-Martigues", "Châteauneuf-lès-Moustiers", -"Châteauneuf-Miravail", "Châteauneuf-sur-Charente", "Châteauneuf-sur-Cher", "Châteauneuf-sur-Isère", "Châteauneuf-sur-Loire", "Châteauneuf-sur-Sarthe", -"Châteauneuf-Val-de-Bargis", -"Châteauneuf-Val-Saint-Donat", -"Châteauneuf-Villevieille", "Châteauroux-les-Alpes", "Châteauvieux-les-Fossés", -"châteaux-forts", -"Châtelaillon-Plage", "Châtel-Censoir", -"Chatel-Chéhéry", +"Châtel-Guyon", +"Châtel-Gérard", +"Châtel-Montagne", +"Châtel-Moron", +"Châtel-Saint-Denis", +"Châtel-Saint-Germain", "Châtel-de-Joux", "Châtel-de-Neuvre", "Châtel-en-Trièves", -"Châtel-Gérard", -"Châtel-Guyon", -"Châtel-Montagne", -"Châtel-Moron", -"Châtelraould-Saint-Louvent", -"Châtel-Saint-Denis", -"Châtel-Saint-Germain", "Châtel-sur-Montsalvens", "Châtel-sur-Moselle", -"Châtelus-le-Marcheix", +"Châtelaillon-Plage", +"Châtelraould-Saint-Louvent", "Châtelus-Malvaleix", -"Châtenay-en-France", -"Chatenay-Mâcheron", +"Châtelus-le-Marcheix", "Châtenay-Malabry", +"Châtenay-en-France", "Châtenay-sur-Seine", -"Chatenay-Vaudin", "Châtenois-les-Forges", "Châtenoy-en-Bresse", "Châtenoy-le-Royal", "Châtillon-Coligny", +"Châtillon-Guyotte", +"Châtillon-Saint-Jean", "Châtillon-en-Bazois", "Châtillon-en-Diois", "Châtillon-en-Dunois", "Châtillon-en-Michaille", "Châtillon-en-Vendelais", -"Châtillon-Guyotte", "Châtillon-la-Borde", "Châtillon-la-Palud", "Châtillon-le-Duc", "Châtillon-le-Roi", "Châtillon-lès-Sons", -"Châtillon-Saint-Jean", -"Châtillon-sous-les-Côtes", "Châtillon-sous-Maîche", +"Châtillon-sous-les-Côtes", "Châtillon-sur-Bar", "Châtillon-sur-Broué", "Châtillon-sur-Chalaronne", @@ -4956,499 +3194,44 @@ FR_BASE_EXCEPTIONS = [ "Châtillon-sur-Seiche", "Châtillon-sur-Seine", "Châtillon-sur-Thouet", -"Chatonrupt-Sommermont", "Châtres-la-Forêt", "Châtres-sur-Cher", -"Chatuzange-le-Goubet", -"chauche-branche", -"chauche-branches", -"chauche-poule", -"Chauconin-Neufmontiers", -"Chaudefonds-sur-Layon", -"Chaudenay-la-Ville", -"Chaudenay-le-Château", -"Chaudeney-sur-Moselle", -"Chaudière-Appalaches", -"Chaudon-Norante", -"Chaudron-en-Mauges", -"chauffe-assiette", -"chauffe-assiettes", -"chauffe-bain", -"chauffe-bains", -"chauffe-biberon", -"chauffe-biberons", -"chauffe-bloc", -"chauffe-blocs", -"chauffe-chemise", -"chauffe-cire", -"chauffe-double", -"chauffe-eau", -"chauffe-eaux", -"chauffe-la-couche", -"chauffe-linge", -"chauffe-linges", -"chauffe-lit", -"chauffe-lits", -"chauffe-moteur", -"chauffe-pied", -"chauffe-pieds", -"chauffe-plat", -"chauffe-plats", -"chauffes-doubles", -"Chauffour-lès-Bailly", -"Chauffour-lès-Etréchy", -"Chauffour-lès-Étréchy", -"Chauffour-sur-Vell", -"Chaufour-lès-Bonnières", -"Chaufour-Notre-Dame", -"Chaume-et-Courchamp", -"Chaume-lès-Baigneux", -"Chaumes-en-Brie", -"Chaumes-en-Retz", -"Chaumont-d'Anjou", -"Chaumont-devant-Damvillers", -"Chaumont-en-Vexin", -"Chaumont-Gistoux", -"Chaumont-la-Ville", -"Chaumont-le-Bois", -"Chaumont-le-Bourg", -"Chaumont-Porcien", -"Chaumont-Saint-Quentin", -"Chaumont-sur-Aire", -"Chaumont-sur-Loire", -"Chaumont-sur-Tharonne", -"Chaumoux-Marcilly", -"Chaussée-Notre-Dame-Louvignies", -"chausse-pied", -"chausse-pieds", -"chausse-trape", -"chausse-trapes", -"chausse-trappe", -"chausse-trappes", -"Chaussoy-Epagny", -"Chauvac-Laux-Montaux", -"Chauvency-le-Château", -"Chauvency-Saint-Hubert", -"chauve-souriceau", -"chauve-souricelle", -"chauve-souricière", -"chauve-souricières", -"chauve-souris", -"chauve-souris-garou", -"chauves-souriceaux", -"chauves-souricelles", -"chauves-souris", -"chauves-souris-garous", -"Chauvigny-du-Perche", -"Chauvincourt-Provemont", -"Chauvirey-le-Châtel", -"Chauvirey-le-Vieil", -"chaux-azote", -"chaux-azotes", -"Chaux-Champagny", -"Chaux-de-Fonnier", -"Chaux-des-Crotenay", -"Chaux-des-Prés", -"Chaux-la-Lotière", -"Chaux-lès-Clerval", -"Chaux-lès-Passavant", -"Chaux-lès-Port", -"Chaux-Neuve", -"Chavagnes-en-Paillers", -"Chavagnes-les-Redoux", -"Chavagneux-Montbertand", -"Chavaniac-Lafayette", -"Chavannes-de-Bogis", -"Chavannes-des-Bois", -"Chavannes-le-Chêne", -"Chavannes-les-Grands", -"Chavannes-le-Veyron", -"Chavannes-près-Renens", -"Chavannes-sur-l'Etang", -"Chavannes-sur-l'Étang", -"Chavannes-sur-Moudon", -"Chavannes-sur-Reyssouze", -"Chavannes-sur-Suran", -"Chavigny-Bailleul", -"Chavot-Courcourt", -"Chazay-d'Azergues", -"Chazé-Henry", -"Chazelles-sur-Albe", -"Chazelles-sur-Lavieu", -"Chazelles-sur-Lyon", -"Chazé-sur-Argos", -"Chazey-Bons", -"Chazey-sur-Ain", -"check-up", -"check-ups", -"cheese-cake", -"cheese-cakes", -"chef-boutonnais", -"Chef-Boutonnais", -"chef-boutonnaise", -"Chef-Boutonnaise", -"chef-boutonnaises", -"Chef-Boutonnaises", -"Chef-Boutonne", -"chef-d'oeuvre", -"chef-d'œuvre", -"Chef-du-Pont", -"Cheffreville-Tonnencourt", -"Chef-Haut", -"chef-lieu", -"chef-mets", -"chef-mois", -"chefs-d'oeuvre", -"chefs-d'œuvre", -"chefs-lieux", -"Cheignieu-la-Balme", -"Cheilly-lès-Maranges", -"Chein-Dessus", -"Cheix-en-Retz", -"Chelle-Debat", -"Chelle-Spou", -"Chémeré-le-Roi", "Chémery-Chéhéry", "Chémery-les-Deux", "Chémery-sur-Bar", -"Chemillé-en-Anjou", -"Chemillé-Melay", -"Chemillé-sur-Dême", -"Chemillé-sur-Indrois", -"Chemilly-les-Raves", -"Chemilly-près-Seignelay", -"Chemilly-sur-Serein", -"Chemilly-sur-Yonne", -"Chemin-d'Aisey", -"Chemiré-en-Charnie", -"Chemiré-le-Gaudin", -"Chemiré-sur-Sarthe", -"Chenac-Saint-Seurin-d'Uzet", -"Chenailler-Mascheix", -"Chenay-le-Châtel", +"Chémeré-le-Roi", +"Chérencé-le-Héron", +"Chérencé-le-Roussel", +"Chéry-Chartreuve", +"Chéry-Chartreuvois", +"Chéry-Chartreuvoise", +"Chéry-Chartreuvoises", +"Chéry-lès-Pouilly", +"Chéry-lès-Rozoy", +"Chézery-Forens", +"Chézy-en-Orxois", +"Chézy-sur-Marne", "Chêne-Arnoult", "Chêne-Bernard", "Chêne-Bougeries", "Chêne-Bourg", "Chêne-Carré", -"Chenecey-Buillon", "Chêne-Chenu", "Chêne-Dolley", -"Chêne-en-Semine", -"chêne-gomme", -"Chênehutte-Trèves-Cunault", -"chêne-liège", -"chêne-marin", "Chêne-Pâquier", -"chêne-pommier", "Chêne-Sec", -"chênes-gommes", -"chênes-lièges", -"chênes-marins", -"Chenevrey-et-Morogne", -"Chenillé-Champteussé", -"Chenillé-Changé", -"Chennery-et-Landreville", -"Chennevières-lès-Louvres", -"Chennevières-sur-Marne", -"Chens-sur-Léman", -"Cheppes-la-Prairie", -"chèque-cadeau", -"chèque-repas", -"chèque-restaurant", -"chèques-cadeaux", -"chèques-repas", -"chèques-restaurants", -"chèques-vacances", -"chèque-vacances", -"Cherbourg-en-Cotentin", -"Cherbourg-Octeville", -"cherche-fiche", -"cherche-merde", -"cherche-midi", -"cherche-pointe", -"Chérencé-le-Héron", -"Chérencé-le-Roussel", -"Chermizy-Ailles", -"Cherveix-Cubas", -"Cherves-Châtelars", -"Cherves-Richemont", -"Chéry-Chartreuve", -"chéry-chartreuvois", -"Chéry-Chartreuvois", -"chéry-chartreuvoise", -"Chéry-Chartreuvoise", -"chéry-chartreuvoises", -"Chéry-Chartreuvoises", -"Chéry-lès-Pouilly", -"Chéry-lès-Rozoy", -"Chesalles-sur-Moudon", -"Cheseaux-Noréaz", -"Cheseaux-sur-Lausanne", -"Chesne-Arnoul", -"Chesne-Carré", -"Chesne-Dolley", -"Chesnois-Auboncourt", -"Chessy-les-Prés", -"Chester-le-Street", -"Chevagny-les-Chevrières", -"Chevagny-sur-Guye", -"Chevaigné-du-Maine", -"Cheval-Blanc", -"cheval-fondu", -"cheval-garou", -"cheval-heure", -"cheval-jupon", -"cheval-vapeur", -"Chevannes-Changy", -"chevau-léger", -"chevau-légers", -"chevaux-léger", -"chevaux-légers", -"chevaux-vapeur", -"cheveu-de-Marie-Madeleine", -"cheveux-de-Marie-Madeleine", -"Chevigney-lès-Vercel", -"Chevigney-sur-l'Ognon", -"Chevigny-en-Valière", -"Chevigny-Saint-Sauveur", -"Chevillon-sur-Huillard", -"Chevilly-Larue", -"Cheviré-le-Rouge", -"chèvre-choutiste", -"chèvre-choutistes", -"chèvre-feuille", -"chèvre-pied", -"chèvre-pieds", -"chèvres-feuilles", -"Chevresis-Monceau", -"Chevry-Cossigny", -"Chevry-en-Sereine", -"Chevry-sous-le-Bignon", -"chewing-gum", -"chewing-gums", -"Cheylard-l'Evêque", -"Cheylard-l'Évêque", -"Chezal-Benoît", -"Chézery-Forens", -"chez-moi", -"chez-soi", -"chez-sois", -"Chézy-en-Orxois", -"Chézy-sur-Marne", -"Chibougamo-Chapien", -"chiche-face", -"chiche-kebab", -"chiche-kébab", -"chiches-faces", -"chiches-kebabs", -"chie-en-lit", -"chie-en-lits", -"chien-assis", -"chien-cerf", -"chien-chaud", -"chien-chauds", -"chien-de-mer", -"chien-garou", -"chien-loup", -"chienne-louve", -"chiennes-louves", -"chien-nid", -"chien-rat", -"chiens-assis", -"chiens-cerf", -"chiens-de-mer", -"chiens-garous", -"chiens-loups", -"chiens-nids", -"chiens-rats", -"chiffres-clés", -"chiffres-taxes", -"chiffre-taxe", -"Chigny-les-Roses", -"Chilleurs-aux-Bois", -"Chilly-le-Vignoble", -"Chilly-Mazarin", -"Chilly-sur-Salins", -"china-paya", -"Chiopris-Viscone", -"chiotte-kès", -"chiottes-kès", -"Chirac-Bellevue", -"Chirat-l'Eglise", -"Chirat-l'Église", -"Chiré-en-Montreuil", -"chirurgien-dentiste", -"chirurgiens-dentistes", -"Chiry-Ourscamp", -"Chiry-Ourscamps", -"Chissay-en-Touraine", -"Chissey-en-Morvan", -"Chissey-lès-Mâcon", -"Chissey-sur-Loue", -"Chitry-les-Mines", -"Chivres-en-Laonnois", -"Chivres-Val", -"Chivy-lès-Etouvelles", -"Chivy-lès-Étouvelles", -"ch'kâra", -"ch'kâras", -"ch.-l.", -"chloro-IPC", -"chlorpyriphos-éthyl", -"chlorpyriphos-méthyl", -"ch'ni", -"choano-organismes", -"choche-pierre", -"choche-poule", -"Choilley-Dardenay", -"Choisy-au-Bac", -"Choisy-en-Brie", -"Choisy-la-Victoire", -"Choisy-le-Roi", -"Choloy-Ménillot", -"Chonas-l'Amballan", -"Chonville-Malaumont", -"Choqueuse-les-Bénards", -"Chorey-les-Beaune", -"choux-choux", -"choux-fleurs", -"choux-navets", -"choux-palmistes", -"choux-raves", -"Chouzé-sur-Loire", -"Chouzy-sur-Cisse", -"chow-chow", -"chow-chows", -"chrétiens-démocrates", -"christe-marine", -"christes-marines", -"chrom-brugnatellite", -"chrom-brugnatellites", -"chrome-clinozoïsite", -"chrome-clinozoïsites", -"chrome-fluorite", -"chrome-fluorites", -"chrome-pistazite", -"chrome-pistazites", -"chrome-trémolite", -"chrome-trémolites", -"chrome-zoïsite", -"chrome-zoïsites", -"chrono-localisation", -"chrono-localisations", -"ch't'aime", -"ch'ti", -"ch'tiisa", -"ch'tiisai", -"ch'tiisaient", -"ch'tiisais", -"ch'tiisait", -"ch'tiisâmes", -"ch'tiisant", -"ch'tiisas", -"ch'tiisasse", -"ch'tiisassent", -"ch'tiisasses", -"ch'tiisassiez", -"ch'tiisassions", -"ch'tiisât", -"ch'tiisâtes", -"ch'tiise", -"ch'tiisé", -"ch'tiisée", -"ch'tiisées", -"ch'tiisent", -"ch'tiiser", -"ch'tiisera", -"ch'tiiserai", -"ch'tiiseraient", -"ch'tiiserais", -"ch'tiiserait", -"ch'tiiseras", -"ch'tiisèrent", -"ch'tiiserez", -"ch'tiiseriez", -"ch'tiiserions", -"ch'tiiserons", -"ch'tiiseront", -"ch'tiises", -"ch'tiisés", -"ch'tiisez", -"ch'tiisiez", -"ch'tiisions", -"ch'tiisons", -"ch'timi", -"ch'tis", -"Chuffilly-Roche", -"chuteur-op", -"chuteurs-ops", -"cia-cia", -"ci-après", -"ci-attaché", -"ci-contre", -"ci-delez", -"ci-dessous", -"ci-dessus", -"ci-devant", +"Chêne-en-Semine", +"Chênehutte-Trèves-Cunault", "Cier-de-Luchon", "Cier-de-Rivière", "Cierges-sous-Montfaucon", "Cierp-Gaud", -"ci-gisent", -"ci-git", -"ci-gît", -"ci-haut", -"ci-hauts", -"ci-incluse", -"ci-incluses", -"ci-joint", -"ci-jointe", -"ci-jointes", -"ci-joints", -"ciné-club", -"ciné-clubs", -"cinéma-dinatoire", -"cinéma-dinatoires", -"ciné-parc", -"cinq-cents", -"cinq-dix-quinze", -"cinq-huitième", -"cinq-marsien", -"Cinq-Marsien", -"cinq-marsienne", -"Cinq-Marsienne", -"cinq-marsiennes", -"Cinq-Marsiennes", -"cinq-marsiens", -"Cinq-Marsiens", "Cinq-Mars-la-Pile", -"cinq-mâts", -"cinq-quatre-un", -"cinq-six", -"cinquante-cinq", -"cinquante-cinquante", -"cinquante-deux", -"cinquante-et-un", -"cinquante-et-une", -"cinquante-et-unième", -"cinquante-et-unièmes", -"cinquante-huit", -"cinquante-neuf", -"cinquante-quatre", -"cinquante-sept", -"cinquante-six", -"cinquante-trois", -"ci-plus-bas", -"ci-plus-haut", -"circolo-mezzo", -"circonscriptions-clés", +"Cinq-Marsien", +"Cinq-Marsienne", +"Cinq-Marsiennes", +"Cinq-Marsiens", "Circourt-sur-Mouzon", -"circum-aural", -"circum-continental", -"Ciré-d'Aunis", -"cire-pompe", -"cire-pompes", "Cires-lès-Mello", "Cirey-lès-Mareilles", "Cirey-lès-Pontailler", @@ -5456,25 +3239,12 @@ FR_BASE_EXCEPTIONS = [ "Cirey-sur-Vezouze", "Cirfontaines-en-Azois", "Cirfontaines-en-Ornois", -"cirque-ménagerie", -"cirques-ménageries", -"cirques-théâtres", -"cirque-théâtre", -"Ciry-le-Noble", "Ciry-Salsogne", +"Ciry-le-Noble", +"Ciré-d'Aunis", "Cisai-Saint-Aubin", -"cis-gangétique", -"cis-gangétiques", "Cissac-Médoc", "Cisternes-la-Forêt", -"cis-verbénol", -"cité-dortoir", -"cité-État", -"cités-dortoirs", -"cités-États", -"citizen-band", -"citron-pays", -"citrons-pays", "Civrac-de-Blaye", "Civrac-de-Dordogne", "Civrac-en-Médoc", @@ -5487,141 +3257,74 @@ FR_BASE_EXCEPTIONS = [ "Civry-la-Forêt", "Civry-sur-Serein", "Cizay-la-Madeleine", -"clac-clac", -"clac-clacs", "Clacton-on-Sea", "Clacy-et-Thierret", "Clairefontaine-en-Yvelines", "Clairvaux-d'Aveyron", "Clairvaux-les-Lacs", "Clairy-Saulchoix", -"claque-merde", -"claque-oreille", -"claque-oreilles", -"claque-patin", -"claque-patins", "Clarafond-Arcine", "Clausthal-Zellerfeld", "Clavans-en-Haut-Oisans", -"clavi-cylindre", -"clavi-harpe", "Claville-Motteville", -"clavi-lyre", "Clavy-Warby", "Claye-Souilly", -"Cléden-Cap-Sizun", -"Cléden-Poher", -"clématites-viornes", -"clématite-viorne", -"Clémence-d'Ambel", -"Cléon-d'Andran", -"Cléré-du-Bois", -"Cléré-les-Pins", -"Cléré-sur-Layon", -"Clérey-la-Côte", -"Clérey-sur-Brenon", -"clérico-nationaliste", -"clérico-nationalistes", +"Clef Vallée d'Eure", "Clermont-Créans", -"Clermont-de-Beauregard", "Clermont-Dessous", "Clermont-Dessus", -"Clermont-d'Excideuil", -"Clermont-en-Argonne", "Clermont-Ferrand", -"Clermont-le-Fort", -"Clermont-les-Fermes", -"Clermont-l'Hérault", "Clermont-Pouyguillès", "Clermont-Savès", "Clermont-Soubiran", +"Clermont-d'Excideuil", +"Clermont-de-Beauregard", +"Clermont-en-Argonne", +"Clermont-l'Hérault", +"Clermont-le-Fort", +"Clermont-les-Fermes", "Clermont-sous-Huy", "Clermont-sur-Lauquet", -"Cléry-en-Vexin", -"Cléry-Grand", -"Cléry-le-Grand", -"Cléry-le-Petit", -"Cléry-Petit", -"Cléry-Saint-André", -"Cléry-sur-Somme", -"clic-clac", "Clichy-sous-Bois", -"client-cible", -"client-cibles", -"client-serveur", -"cligne-musette", -"climato-sceptique", -"climato-sceptiques", "Clinchamps-sur-Orne", -"clin-foc", -"clin-focs", -"cloche-pied", -"cloche-pieds", -"cloche-plaque", -"clodinafop-propargyl", "Clohars-Carnoët", "Clohars-Fouesnant", "Clonas-sur-Varèze", -"clopin-clopant", -"cloquintocet-mexyl", "Clos-Fontaine", -"clos-fontainois", "Clos-Fontainois", -"clos-fontainoise", "Clos-Fontainoise", -"clos-fontainoises", "Clos-Fontainoises", -"clos-masure", -"clos-masures", -"clos-vougeot", -"clos-vougeots", "Cloyes-les-Trois-Rivières", -"Cloyes-sur-le-Loir", "Cloyes-sur-Marne", -"club-house", -"clubs-houses", +"Cloyes-sur-le-Loir", "Cluj-Napoca", "Clun's", "Clussais-la-Pommeraie", "Clux-Villeneuve", "Cluze-et-Pâquier", +"Cléden-Cap-Sizun", +"Cléden-Poher", +"Clémence-d'Ambel", +"Cléon-d'Andran", +"Clérey-la-Côte", +"Clérey-sur-Brenon", +"Cléry-Grand", +"Cléry-Petit", +"Cléry-Saint-André", +"Cléry-en-Vexin", +"Cléry-le-Grand", +"Cléry-le-Petit", +"Cléry-sur-Somme", +"Cléré-du-Bois", +"Cléré-les-Pins", +"Cléré-sur-Layon", "Coat-Méal", -"coat-méalien", "Coat-Méalien", -"coat-méalienne", "Coat-Méalienne", -"coat-méaliennes", "Coat-Méaliennes", -"coat-méaliens", "Coat-Méaliens", -"cobalt-gris", -"cobalt-mica", -"cobalt-ochre", -"cobalto-épsomite", -"cobalto-épsomites", -"cobalto-sphaérosidérite", -"cobalto-sphaérosidérites", -"cobalts-gris", -"cobalts-micas", -"cobalts-ochres", "Cochem-Zell", -"cochon-garou", -"cochons-garous", -"coco-de-mer", -"coco-fesses", -"cocotte-minute", "Cocquio-Trevisago", -"codes-barres", -"codes-clés", -"cœur-de-Jeannette", -"coeur-de-pigeon", -"cœur-de-pigeon", -"coeurs-de-pigeon", -"coeurs-de-pigeons", -"cœurs-de-pigeons", -"Cœuvres-et-Valsery", -"coffre-fort", -"coffres-forts", "Cognac-la-Forêt", "Cognac-le-Froid", "Cognat-Lyonne", @@ -5629,23 +3332,12 @@ FR_BASE_EXCEPTIONS = [ "Cognocoli-Monticchi", "Coiffy-le-Bas", "Coiffy-le-Haut", -"coin-coin", -"coin-coins", "Coin-lès-Cuvry", "Coin-sur-Seille", "Coise-Saint-Jean-Pied-Gauthier", "Coizard-Joches", "Colayrac-Saint-Cirq", -"colin-maillard", -"colin-tampon", -"colis-route", -"colis-routes", "Collandres-Quincarnon", -"collant-pipette", -"collant-pipettes", -"collé-serré", -"collés-serrés", -"collet-monté", "Colleville-Montgomery", "Colleville-sur-Mer", "Colleville-sur-Orne", @@ -5653,8 +3345,6 @@ FR_BASE_EXCEPTIONS = [ "Colligis-Crandelain", "Colligny-Maizery", "Colline-Beaumont", -"colloid-calcite", -"colloid-calcites", "Collombey-Muraz", "Collonge-Bellerive", "Collonge-en-Charollais", @@ -5668,100 +3358,75 @@ FR_BASE_EXCEPTIONS = [ "Colmesnil-Manneville", "Colmier-le-Bas", "Colmier-le-Haut", -"col-nu", -"Colombé-la-Fosse", "Colombe-lès-Bithaine", -"Colombé-le-Sec", "Colombe-lès-Vesoul", "Colombey-les-Belles", -"Colombey-lès-Choiseul", "Colombey-les-Deux-Eglises", "Colombey-les-Deux-Églises", +"Colombey-lès-Choiseul", "Colombie-Anglaise", "Colombie-Britannique", "Colombier-Châtelot", -"Colombier-en-Brionnais", -"Colombières-sur-Orb", "Colombier-Fontaine", +"Colombier-Saugnieu", +"Colombier-en-Brionnais", "Colombier-le-Cardinal", "Colombier-le-Jeune", "Colombier-le-Vieux", -"Colombier-Saugnieu", "Colombiers-du-Plessis", "Colombiers-sur-Seulles", +"Colombières-sur-Orb", "Colomby-Anguerny", "Colomby-sur-Thaon", +"Colombé-la-Fosse", +"Colombé-le-Sec", "Colonard-Corubert", "Colpach-Bas", "Colpach-Haut", "Colroy-la-Grande", "Colroy-la-Roche", -"cols-nus", -"cols-verts", -"col-vert", -"col-verts", -"colville-okanagan", "Comberanche-et-Epeluche", "Comberanche-et-Épeluche", -"combi-short", -"combi-shorts", -"Comblain-au-Pont", "Comblain-Fairon", -"comble-lacune", -"comble-lacunes", +"Comblain-au-Pont", "Combles-en-Barrois", "Combres-sous-les-Côtes", "Combs-la-Ville", -"com'com", -"come-back", -"comédie-ballet", -"comédies-ballets", "Comezzano-Cizzago", -"Comines-Warneton", "Comin-Yanga", +"Comines-Warneton", "Commelle-Vernay", -"commissaire-priseur", -"commissaires-priseurs", -"commis-voyageur", -"commis-voyageurs", "Communailles-en-Montagne", -"compère-loriot", -"compères-loriot", -"compositeur-typographe", -"compositeur-typographes", "Comps-la-Grand-Ville", "Comps-sur-Artuby", -"comptes-rendus", -"concavo-concave", -"concavo-convexe", "Conches-en-Ouche", "Conches-sur-Gondoire", "Conchez-de-Béarn", "Conchil-le-Temple", "Conchy-les-Pots", "Conchy-sur-Canche", -"Concœur-et-Corboin", "Concourson-sur-Layon", +"Concœur-et-Corboin", "Condat-en-Combraille", "Condat-lès-Montboissier", "Condat-sur-Ganaveix", "Condat-sur-Trincou", -"Condat-sur-Vézère", "Condat-sur-Vienne", +"Condat-sur-Vézère", +"Condeixa-a-Nova", +"Condom-d'Aubrac", +"Condé-Folie", +"Condé-Northen", +"Condé-Sainte-Libiaire", "Condé-en-Brie", "Condé-en-Normandie", -"Condé-Folie", -"Condeixa-a-Nova", "Condé-lès-Autry", "Condé-lès-Herpy", "Condé-lès-Vouziers", -"Condé-Northen", -"Condé-Sainte-Libiaire", "Condé-sur-Aisne", "Condé-sur-Huisne", "Condé-sur-Ifs", "Condé-sur-Iton", -"Condé-sur-l'Escaut", "Condé-sur-Marne", "Condé-sur-Noireau", "Condé-sur-Risle", @@ -5770,165 +3435,85 @@ FR_BASE_EXCEPTIONS = [ "Condé-sur-Suippe", "Condé-sur-Vesgre", "Condé-sur-Vire", -"Condom-d'Aubrac", -"conférences-débats", -"Conflans-en-Jarnisy", +"Condé-sur-l'Escaut", "Conflans-Sainte-Honorine", +"Conflans-en-Jarnisy", "Conflans-sur-Anille", "Conflans-sur-Lanterne", "Conflans-sur-Loing", "Conflans-sur-Seine", "Confolent-Port-Dieu", -"conforte-main", "Confort-Meilars", "Congerville-Thionville", -"Congé-sur-Orne", "Congis-sur-Thérouanne", "Congo-Brazzaville", -"congo-kinois", "Congo-Kinshasa", "Congo-Léo", "Congo-Léopoldville", -"congolo-kinois", -"congolo-kinoise", -"congolo-kinoises", +"Congé-sur-Orne", "Conie-Molitard", "Conilhac-Corbières", "Conilhac-de-la-Montagne", "Connantray-Vaurefroy", -"Conne-de-la-Barde", "Conne-de-Labarde", +"Conne-de-la-Barde", "Conques-en-Rouergue", "Conques-sur-Orbiel", -"conseil-général", +"Cons-Sainte-Colombe", "Cons-la-Grandville", "Consolation-Maisonnettes", -"Cons-Sainte-Colombe", "Contamine-Sarzin", "Contamine-sur-Arve", "Conteville-en-Ternois", "Conteville-lès-Boulogne", -"contra-latéral", -"contrat-cadre", -"contrats-cadres", "Contres-en-Vairais", -"contrôle-commande", "Contz-les-Bains", -"convexo-concave", -"copiable-collable", -"copiables-collables", -"copia-colla", -"copiage-collage", -"copiages-collages", -"copiai-collai", -"copiaient-collaient", -"copiais-collais", -"copiait-collait", -"copiâmes-collâmes", -"copiant-collant", -"copias-collas", -"copiasse-collasse", -"copiassent-collassent", -"copiasses-collasses", -"copiassiez-collassiez", -"copiassions-collassions", -"copiât-collât", -"copiâtes-collâtes", -"copie-colle", -"copié-collé", -"copié-collés", -"copiée-collée", -"copiées-collées", -"copie-lettres", -"copient-collent", -"copiera-collera", -"copierai-collerai", -"copieraient-colleraient", -"copierais-collerais", -"copierait-collerait", -"copieras-colleras", -"copier-coller", -"copier-collers", -"copièrent-collèrent", -"copierez-collerez", -"copieriez-colleriez", -"copierions-collerions", -"copierons-collerons", -"copieront-colleront", -"copies-colles", -"copiés-collés", -"copiez-collez", -"copiez-colliez", -"copions-collions", -"copions-collons", -"coq-à-l'âne", -"coq-de-roche", -"coq-héron", -"coqs-de-roche", -"coq-souris", -"coquel'œil", -"coquel'œils", -"coral-rag", -"corbeau-pêcheur", -"corbeaux-pêcheurs", "Corbeil-Cerf", "Corbeil-Essonnes", -"corbeil-essonnois", "Corbeil-Essonnois", -"corbeil-essonnoise", "Corbeil-Essonnoise", -"corbeil-essonnoises", "Corbeil-Essonnoises", "Corbère-Abères", "Corbère-les-Cabanes", "Corcelle-Mieslot", "Corcelles-Cormondrèche", -"Corcelles-en-Beaujolais", "Corcelles-Ferrières", +"Corcelles-en-Beaujolais", "Corcelles-le-Jorat", "Corcelles-les-Arts", -"Corcelles-lès-Cîteaux", "Corcelles-les-Monts", +"Corcelles-lès-Cîteaux", "Corcelles-près-Concise", "Corcelles-près-Payerne", "Corcelles-sur-Chavornay", "Corcoué-sur-Logne", -"Cordes-sur-Ciel", "Cordes-Tolosannes", -"cordons-bleus", -"Corée-du-Nord", -"Corée-du-Sud", +"Cordes-sur-Ciel", "Corgnac-sur-l'Isle", "Cormaranche-en-Bugey", "Corme-Ecluse", +"Corme-Royal", "Corme-Écluse", "Cormeilles-en-Parisis", "Cormeilles-en-Vexin", "Cormelles-le-Royal", -"Corme-Royal", "Cormoranche-sur-Saône", -"Cormot-le-Grand", "Cormot-Vauchignon", -"corned-beef", -"corned-beefs", +"Cormot-le-Grand", "Corneilla-de-Conflent", "Corneilla-del-Vercol", "Corneilla-la-Rivière", "Corneville-la-Fouquetière", "Corneville-sur-Risle", -"corn-flake", -"corn-flakes", -"Cornillé-les-Caves", "Cornillon-Confoux", "Cornillon-en-Trièves", "Cornillon-sur-l'Oule", -"Corny-la-Ville", +"Cornillé-les-Caves", "Corny-Machéroménil", +"Corny-la-Ville", "Corny-sur-Moselle", "Corpataux-Magnedens", "Corpoyer-la-Chapelle", -"corps-mort", -"corps-morts", "Corps-Nuds", "Corral-Rubio", "Corrençon-en-Vercors", @@ -5936,17 +3521,14 @@ FR_BASE_EXCEPTIONS = [ "Corroy-le-Grand", "Corse-du-Sud", "Corsier-sur-Vevey", -"cortico-cortical", -"cortico-corticale", -"cortico-corticales", -"cortico-corticaux", "Cortil-Noirmont", -"cortil-noirmontois", "Cortil-Noirmontois", "Cortil-Noirmontoise", "Cortil-Wodon", "Corvol-d'Embernard", "Corvol-l'Orgueilleux", +"Corée-du-Nord", +"Corée-du-Sud", "Coslédaà-Lube-Boast", "Cosne-Cours-sur-Loire", "Cosne-d'Allier", @@ -5954,119 +3536,71 @@ FR_BASE_EXCEPTIONS = [ "Cossé-d'Anjou", "Cossé-en-Champagne", "Cossé-le-Vivien", -"costard-cravate", -"costards-cravates", "Costa-Rica", "Costa-Ricain", -"costa-ricien", "Costa-Ricien", -"costa-ricienne", "Costa-Ricienne", -"costa-riciennes", "Costa-Riciennes", -"costa-riciens", "Costa-Riciens", -"costo-claviculaire", -"costo-sternal", -"costo-thoracique", -"costo-vertébral", -"costo-vertébrale", -"costo-vertébrales", -"costo-vertébraux", -"cosy-corner", -"cosy-corners", "Coteau-Landais", "Coteau-Libre", "Coteaux-du-Lizon", -"Côtes-d'Armor", -"côtes-de-toul", -"Côtes-du-Nord", -"côtes-du-rhône", -"côtes-du-Rhône", -"côtes-du-rhônes", "Coti-Chiavari", -"coton-poudre", -"coton-poudres", -"cotons-poudres", -"cotons-tiges", -"coton-tige", -"cotte-hardie", -"cottes-hardies", -"couble-soiffière", -"couche-culotte", -"couche-point", -"couche-points", -"couches-culottes", "Couches-les-Mines", -"couche-tard", -"couche-tôt", -"couci-couça", -"couci-couci", "Coucy-la-Ville", "Coucy-le-Château", "Coucy-le-Château-Auffrique", -"Coucy-lès-Eppes", "Coucy-les-Saints", -"coude-à-coude", -"cou-de-jatte", +"Coucy-lès-Eppes", "Coudekerque-Branche", -"Coudekerque-sur-le-Rhin", "Coudekerque-Village", -"cou-de-pied", -"coude-pied", +"Coudekerque-sur-le-Rhin", "Coudeville-sur-Mer", -"Coudray-au-Perche", "Coudray-Rabut", +"Coudray-au-Perche", "Couesmes-Vaucé", "Couffy-sur-Sarsonne", "Couilly-Pont-aux-Dames", -"cou-jaune", "Coulanges-la-Vineuse", "Coulanges-lès-Nevers", "Coulanges-sur-Yonne", "Coulans-sur-Gée", "Coulans-sur-Lizon", -"coule-sang", "Coulmier-le-Sec", "Coulombs-en-Valois", "Coulommes-et-Marqueny", "Coulommes-la-Montagne", "Coulommes-lès-Attigny", "Coulommiers-la-Tour", -"Coulonges-Cohan", -"Coulonges-les-Sablons", -"Coulonges-sur-l'Autize", -"Coulonges-sur-Sarthe", -"Coulonges-Thouarsais", "Coulonge-sur-Charente", +"Coulonges-Cohan", +"Coulonges-Thouarsais", +"Coulonges-les-Sablons", +"Coulonges-sur-Sarthe", +"Coulonges-sur-l'Autize", "Couloumé-Mondebat", "Coulounieix-Chamiers", "Coulouvray-Boisbenâtre", -"cou-nu", -"coupé-cabriolet", -"coupé-collé", -"coupé-décalé", -"coupé-lit", "Coupelle-Neuve", "Coupelle-Vieille", -"couper-coller", -"coupés-cabriolets", -"coupés-collés", -"coupés-décalés", -"coupés-lits", -"coupon-réponse", -"coupons-réponses", -"coups-de-poing", -"courant-jet", -"courants-jets", -"Courcelles-au-Bois", +"Cour-Cheverny", +"Cour-Maugis sur Huisne", +"Cour-Saint-Maurice", +"Cour-et-Buis", +"Cour-l'Evêque", +"Cour-l'Évêque", +"Cour-sur-Heure", +"Cour-sur-Loire", "Courcelles-Chaussy", +"Courcelles-Epayelles", +"Courcelles-Frémoy", +"Courcelles-Sapicourt", +"Courcelles-Val-d'Esnoms", +"Courcelles-au-Bois", "Courcelles-de-Touraine", "Courcelles-en-Barrois", "Courcelles-en-Bassée", "Courcelles-en-Montagne", -"Courcelles-Epayelles", -"Courcelles-Frémoy", "Courcelles-la-Forêt", "Courcelles-le-Comte", "Courcelles-lès-Châtillon", @@ -6075,7 +3609,6 @@ FR_BASE_EXCEPTIONS = [ "Courcelles-lès-Montbard", "Courcelles-lès-Montbéliard", "Courcelles-lès-Semur", -"Courcelles-Sapicourt", "Courcelles-sous-Châtenois", "Courcelles-sous-Moyencourt", "Courcelles-sous-Thoix", @@ -6088,54 +3621,24 @@ FR_BASE_EXCEPTIONS = [ "Courcelles-sur-Vesles", "Courcelles-sur-Viosne", "Courcelles-sur-Voire", -"Courcelles-Val-d'Esnoms", -"Cour-Cheverny", "Courcy-aux-Loges", "Courdimanche-sur-Essonne", -"Cour-et-Buis", -"coure-vite", -"Cour-l'Evêque", -"Cour-l'Évêque", "Courlon-sur-Yonne", -"cour-masure", "Cournon-d'Auvergne", -"Cour-Saint-Maurice", -"Coursan-en-Othe", "Cours-de-Monségur", "Cours-de-Pile", -"cours-de-pilois", "Cours-de-Pilois", -"cours-de-piloise", "Cours-de-Piloise", -"cours-de-piloises", "Cours-de-Piloises", -"course-poursuite", -"courses-poursuites", -"Courseulles-sur-Mer", "Cours-la-Ville", "Cours-les-Bains", "Cours-les-Barres", -"Courson-les-Carrières", +"Coursan-en-Othe", +"Courseulles-sur-Mer", "Courson-Monteloup", -"Cour-sur-Heure", -"Cour-sur-Loire", -"courte-botte", -"courte-épée", -"courte-épine", -"courte-épines", -"courte-graisse", -"courte-lettre", +"Courson-les-Carrières", "Courtemont-Varennes", -"courte-pointe", -"courte-pointier", -"courte-queue", -"courtes-bottes", -"courtes-épées", -"courtes-lettres", "Courtesoult-et-Gatey", -"courtes-pattes", -"courtes-pointes", -"courtes-queues", "Courtetain-et-Salans", "Courtine-le-Trucq", "Courtois-sur-Yonne", @@ -6144,483 +3647,202 @@ FR_BASE_EXCEPTIONS = [ "Courtonne-les-Deux-Églises", "Courtrai-Dutsel", "Courtrizy-et-Fussigny", -"courts-bandages", -"courts-boutons", -"courts-circuits", -"courts-côtés", -"courts-cureaux", -"courts-jus", -"courts-métrages", -"courts-tours", "Courville-sur-Eure", "Cousances-au-Bois", "Cousances-les-Forges", "Cousances-lès-Triconville", -"cous-cous", -"cous-de-jatte", -"cous-de-pied", -"cous-jaunes", "Coussac-Bonneval", "Coussay-les-Bois", -"cout'donc", -"couteau-de-chasse", -"couteau-scie", -"couteaux-de-chasse", -"couteaux-scie", "Couthures-sur-Garonne", -"Couture-d'Argenson", "Couture-Saint-Germain", +"Couture-d'Argenson", "Couture-sur-Loir", -"couvre-casque", -"couvre-casques", -"couvre-chaussure", -"couvre-chaussures", -"couvre-chef", -"couvre-chefs", -"couvre-clef", -"couvre-clefs", -"couvre-face", -"couvre-faces", -"couvre-feu", -"couvre-feux", -"couvre-giberne", -"couvre-gibernes", -"couvre-joint", -"couvre-joints", -"couvre-lit", -"couvre-lits", -"couvre-livre", -"couvre-livres", -"couvre-lumière", -"couvre-lumières", -"couvre-manche", -"couvre-manches", -"couvre-nuque", -"couvre-nuques", -"couvre-objet", -"couvre-objets", -"couvre-orteil", -"couvre-orteils", -"couvre-pied", -"couvre-pieds", -"couvre-plat", -"couvre-plats", -"couvre-shako", -"couvre-shakos", -"couvre-sol", -"couvre-sols", -"couvreur-zingueur", "Couvron-et-Aumencourt", +"Coux et Bigaroque-Mouzens", "Coux-et-Bigaroque", "Couze-et-Saint-Front", "Couzon-au-Mont-d'Or", "Couzon-sur-Coulange", -"cover-girl", -"cover-girls", -"cow-boy", -"cow-boys", -"coxa-retrorsa", -"coxo-fémoral", "Coye-la-Forêt", -"c'que", -"c'qui", -"crabe-araignée", -"crabes-araignées", -"crac-crac", -"crachouillot-thérapeute", -"craignant-Dieu", -"Crandelain-et-Malval", -"cran-gevrien", "Cran-Gevrien", -"cran-gevrienne", "Cran-Gevrienne", -"cran-gevriennes", "Cran-Gevriennes", -"cran-gevriens", "Cran-Gevriens", "Cran-Gevrier", -"cranio-facial", +"Crandelain-et-Malval", "Crannes-en-Champagne", "Crans-près-Céligny", "Cranves-Sales", -"cranves-salien", "Cranves-Salien", -"cranves-saliène", -"Cranves-Saliène", -"cranves-saliènes", -"Cranves-Saliènes", -"cranves-saliens", "Cranves-Saliens", -"crapaud-buffle", -"crapauds-buffles", -"crapet-soleil", +"Cranves-Saliène", +"Cranves-Saliènes", "Craponne-sur-Arzon", "Cras-Avernas", "Cras-sur-Reyssouze", "Crasville-la-Mallet", "Crasville-la-Rocquefort", "Cravant-les-Côteaux", -"crayon-feutre", -"crayons-feutre", -"crayons-feutres", -"crayon-souris", -"créateur-typographe", -"Crécey-sur-Tille", -"Crêches-sur-Saône", -"Crécy-au-Mont", -"Crécy-Couvé", -"Crécy-en-Ponthieu", -"Crécy-la-Chapelle", -"Crécy-sur-Serre", -"crédit-bail", -"crédits-bail", -"crédits-bails", -"crédits-baux", -"crédits-temps", -"crédit-temps", -"Crégy-lès-Meaux", "Crempigny-Bonneguête", "Creney-près-Troyes", "Crennes-sur-Fraubée", -"Créon-d'Armagnac", -"Crépieux-la-Pape", -"Crépy-en-Laonnois", -"Crépy-en-Valois", "Crespy-le-Neuf", "Cressac-Saint-Genis", "Cressin-Rochefort", "Cressy-Omencourt", "Cressy-sur-Somme", "Crest-Voland", -"crest-volantain", "Crest-Volantain", -"crest-volantaine", "Crest-Volantaine", -"crest-volantaines", "Crest-Volantaines", -"crest-volantains", "Crest-Volantains", -"Cré-sur-Loir", -"crête-de-coq", -"crête-marine", -"crêtes-de-coq", -"crêtes-marines", "Creutzwald-la-Croix", "Creuzier-le-Neuf", "Creuzier-le-Vieux", "Crevans-et-la-Chapelle-lès-Granges", "Crevant-Laveine", -"crève-chassis", -"crève-chien", -"crève-chiens", -"crève-coeur", -"crève-cœur", -"Crèvecoeur-en-Auge", -"Crèvecœur-en-Auge", -"Crèvecœur-en-Brie", -"Crèvecœur-le-Grand", -"Crèvecœur-le-Petit", -"crève-coeurs", -"crève-cœurs", -"Crèvecoeur-sur-l'Escaut", -"Crèvecœur-sur-l'Escaut", -"crève-la-dalle", -"crève-la-faim", -"crevette-mante", -"crevettes-mantes", -"crève-vessie", -"crève-vessies", "Creys-Mépieu", "Creyssensac-et-Pissot", -"Crézançay-sur-Cher", -"Crézancy-en-Sancerre", -"cric-crac", -"crico-trachéal", -"crico-trachéale", -"crico-trachéales", -"crico-trachéaux", "Cricqueville-en-Auge", "Cricqueville-en-Bessin", -"cri-cri", -"cri-cris", "Criel-sur-Mer", "Crillon-le-Brave", "Criquebeuf-en-Caux", "Criquebeuf-la-Campagne", "Criquebeuf-sur-Seine", -"Criquetot-le-Mauconduit", "Criquetot-l'Esneval", +"Criquetot-le-Mauconduit", "Criquetot-sur-Longueville", "Criquetot-sur-Ouville", "Crissay-sur-Manse", -"cristallo-électrique", -"cristallo-électriques", -"criste-marine", "Criteuil-la-Magdeleine", -"croad-langshan", -"croc-en-jambe", -"crocs-en-jambe", -"croiseur-école", -"croiseurs-écoles", +"Cro-Magnon", +"Cro-Magnons", "Croissy-Beaubourg", "Croissy-sur-Celle", "Croissy-sur-Seine", "Croisy-sur-Andelle", "Croisy-sur-Eure", -"croix-caluois", "Croix-Caluois", -"croix-caluoise", "Croix-Caluoise", -"croix-caluoises", "Croix-Caluoises", "Croix-Caluyau", "Croix-Chapeau", -"croix-de-feu", -"croix-de-Malte", -"Croix-de-Vie", -"Croix-en-Ternois", "Croix-Fonsomme", "Croix-Fonsommes", -"Croix-lez-Rouveroy", "Croix-Mare", "Croix-Moligneaux", -"croix-pile", "Croix-Rousse", -"croix-roussien", -"Croix-roussien", -"croix-roussienne", -"Croix-roussienne", -"croix-roussiennes", -"Croix-roussiennes", -"croix-roussiens", -"Croix-roussiens", "Croix-Valmer", +"Croix-de-Vie", +"Croix-en-Ternois", +"Croix-lez-Rouveroy", +"Croix-roussien", +"Croix-roussienne", +"Croix-roussiennes", +"Croix-roussiens", "Croizet-sur-Gand", -"Cro-Magnon", -"Cro-Magnons", -"cromlec'h", -"cromlec'hs", -"croque-abeilles", -"croque-au-sel", -"croque-en-bouche", -"croque-lardon", -"croque-lardons", -"croque-madame", -"croque-madames", -"croque-mademoiselle", -"croque-mademoiselles", -"croque-messieurs", -"croque-mitaine", -"croque-mitaines", -"croque-monsieur", -"croque-monsieurs", -"croque-mort", -"croque-morts", -"croque-moutons", -"croque-noisette", -"croque-noisettes", -"croque-noix", -"croque-note", "Cros-de-Géorand", "Cros-de-Montvert", "Cros-de-Ronesque", "Crosey-le-Grand", "Crosey-le-Petit", -"crossing-over", "Crosville-la-Vieille", "Crosville-sur-Douve", "Crosville-sur-Scie", -"crotte-du-diable", -"crotte-du-Diable", -"crottes-du-diable", -"crottes-du-Diable", "Crottes-en-Pithiverais", "Crouttes-sur-Marne", -"Crouy-en-Thelle", "Crouy-Saint-Pierre", +"Crouy-en-Thelle", "Crouy-sur-Cosson", "Crouy-sur-Ourcq", "Crouzet-Migette", -"crown-glass", "Crozes-Hermitage", "Crozon-sur-Vauvre", "Crucey-Villages", -"cruci-capétien", "Cruci-Capétien", -"cruci-capétienne", "Cruci-Capétienne", -"cruci-capétiennes", "Cruci-Capétiennes", -"cruci-capétiens", "Cruci-Capétiens", -"cruci-falgardien", "Cruci-Falgardien", -"cruci-falgardienne", "Cruci-Falgardienne", -"cruci-falgardiennes", "Cruci-Falgardiennes", -"cruci-falgardiens", "Cruci-Falgardiens", -"crud-ammoniac", "Cruquius-Oost", "Cruviers-Lascours", "Crux-la-Ville", "Cruzilles-lès-Mépillat", "Cruzy-le-Châtel", -"crypto-communiste", -"crypto-luthérien", -"crypto-luthérienne", -"crypto-luthériennes", -"crypto-luthériens", -"crypto-monnaie", -"crypto-monnaies", -"c'te", +"Crèvecoeur-en-Auge", +"Crèvecoeur-sur-l'Escaut", +"Crèvecœur-en-Auge", +"Crèvecœur-en-Brie", +"Crèvecœur-le-Grand", +"Crèvecœur-le-Petit", +"Crèvecœur-sur-l'Escaut", +"Crèvecœur-en-Auge", +"Crèvecœur-en-Brie", +"Crèvecœur-le-Grand", +"Crèvecœur-le-Petit", +"Crèvecœur-sur-l'Escaut", +"Cré-sur-Loir", +"Crécey-sur-Tille", +"Crécy-Couvé", +"Crécy-au-Mont", +"Crécy-en-Ponthieu", +"Crécy-la-Chapelle", +"Crécy-sur-Serre", +"Crégy-lès-Meaux", +"Créon-d'Armagnac", +"Crépieux-la-Pape", +"Crépy-en-Laonnois", +"Crépy-en-Valois", +"Crézancy-en-Sancerre", +"Crézançay-sur-Cher", +"Crêches-sur-Saône", "Cubières-sur-Cinoble", -"cubito-carpien", -"cubito-carpienne", -"cubito-carpiennes", -"cubito-carpiens", "Cubjac-Auvézère-Val-d'Ans", -"cubo-prismatique", -"cubo-prismatiques", "Cubry-lès-Faverney", "Cubry-lès-Soing", "Cubzac-les-Ponts", -"cucu-la-praline", -"cucul-la-praline", -"cueille-essaim", -"cueille-fruits", -"cueilleur-égreneur", -"cueilleurs-égreneurs", -"cueilleuse-égreneuse", -"cueilleuse-épanouilleuse", -"cueilleuses-égreneuses", -"cueilleuses-épanouilleuses", "Cuges-les-Bains", "Cuges-les-Pins", "Cugliate-Fabiasco", "Cugny-lès-Crouttes", -"cui-cui", "Cuigy-en-Bray", -"çui-là", -"cuir-laine", "Cuiry-Housse", -"cuiry-houssien", "Cuiry-Houssien", -"cuiry-houssienne", "Cuiry-Houssienne", -"cuiry-houssiennes", "Cuiry-Houssiennes", -"cuiry-houssiens", "Cuiry-Houssiens", "Cuiry-lès-Chaudardes", "Cuiry-lès-Iviers", "Cuise-la-Motte", -"cuisse-de-nymphe", -"cuisse-madame", -"cuisse-madames", "Cuissy-et-Geny", "Cuisy-en-Almont", -"cuit-poires", -"cuit-pommes", -"cuit-vapeur", -"cuit-vapeurs", "Cujavie-Poméranie", -"cul-bas", -"cul-bénit", -"cul-blanc", -"cul-brun", -"cul-cul", -"culcul-la-praline", -"cul-culs", -"cul-de-basse-fosse", -"cul-de-bouteille", -"cul-de-chien", -"cul-de-four", -"cul-de-jatte", -"cul-de-lampe", -"cul-de-plomb", -"cul-de-porc", -"cul-de-poule", -"cul-de-sac", -"cul-des-sartois", "Cul-des-Sartois", "Cul-des-Sartoise", "Cul-des-Sarts", -"cul-doré", "Culey-le-Patry", -"culit-api", "Culles-les-Roches", -"cul-levé", -"cul-rouge", -"cul-rousselet", -"culs-bénits", -"culs-blancs", -"culs-de-basse-fosse", -"culs-de-bouteille", -"culs-de-chien", -"culs-de-four", -"culs-de-jatte", -"culs-de-lampe", -"culs-de-plomb", -"culs-de-poule", -"culs-de-sac", -"culs-levés", -"culs-rouges", -"culs-terreux", -"cul-terreux", -"cultivateurs-tasseurs", -"cultivateur-tasseur", -"culturo-scientifique", -"culturo-scientifiques", "Cumières-le-Mort-Homme", -"cumulo-nimbus", "Cuncy-lès-Varzy", -"cunéo-scaphoïdien", -"cupro-allophane", -"cupro-allophanes", -"cupro-aluminium", -"cupro-aluminiums", -"cupro-ammoniacal", -"cupro-elbaïte", -"cupro-elbaïtes", -"cupro-fraipontite", -"cupro-fraipontites", -"cupro-nickel", -"cupro-nickels", "Cuq-Toulza", -"Curçay-sur-Dive", "Curciat-Dongalon", "Curcy-sur-Orne", -"cure-dent", -"cure-dents", -"cure-feu", -"cure-feux", "Cureghem-lez-Bruxelles", -"cure-langue", -"cure-langues", -"cure-môle", -"cure-ongle", -"cure-ongles", -"cure-oreille", -"cure-oreilles", -"cure-pied", -"cure-pieds", -"cure-pipe", -"cure-pipes", "Curis-au-Mont-d'Or", "Cursolo-Orasso", +"Curti-Marignacais", +"Curti-Marignacaise", +"Curti-Marignacaises", "Curtil-Saint-Seine", +"Curtil-Vergy", "Curtil-sous-Buffières", "Curtil-sous-Burnand", -"Curtil-Vergy", -"curti-marignacais", -"Curti-Marignacais", -"curti-marignacaise", -"Curti-Marignacaise", -"curti-marignacaises", -"Curti-Marignacaises", "Curzay-sur-Vonne", +"Curçay-sur-Dive", "Cuse-et-Adrisans", "Cussac-Fort-Médoc", "Cussac-sur-Loire", @@ -6631,68 +3853,62 @@ FR_BASE_EXCEPTIONS = [ "Cussy-la-Colonne", "Cussy-le-Châtel", "Cussy-les-Forges", -"custodi-nos", "Cuttoli-Corticchiato", "Cuverville-sur-Yères", "Cuxac-Cabardès", "Cuxac-d'Aude", -"Cuyk-Sainte-Agathe", "Cuy-Saint-Fiacre", -"cycle-car", -"cycle-cars", -"cyclo-bus", -"cyclo-cross", -"cyclo-draisine", -"cyclo-draisines", -"cyclo-nomade", -"cyclo-nomades", -"cyclo-octyl-diméthylurée", -"cyclo-pousse", -"cyclo-pousses", -"cyhalofop-butyl", -"cylindro-conique", +"Cuyk-Sainte-Agathe", "Cys-la-Commune", -"cyth's", -"cyto-architectonie", -"cyto-architectonies", -"cyto-architectonique", -"cyto-architectoniques", +"Cœuvres-et-Valsery", +"Céaux-d'Allègre", +"Céleste-Empire", +"Cély-en-Bière", +"Cénac-et-Saint-Julien", +"Cérans-Foulletourte", +"Céroux-Mousty", +"Céré-la-Ronde", +"Césarville-Dossainville", +"Côtes-d'Armor", +"Côtes-du-Nord", +"Cœuvres-et-Valsery", +"D'Huison-Longueville", +"D-Day", +"D-glucuronate", +"D-glucuronates", +"D-glycéraldéhyde", +"D-sucre", +"D-sucres", +"DIN-31635", +"DMTA-P", +"DOM-ROM", +"DOM-TOM", +"DVD-RAM", +"DVD-ROM", +"DVD-RW", "Dagny-Lambercy", "Dahme-Forêt-de-Spree", "Dain-en-Saulnois", "Dainville-Bertheléville", -"dalai-lama", -"dalaï-lama", -"dalai-lamas", -"dalaï-lamas", "Dalberg-Wendelstorf", "Dallgow-Döberitz", "Damas-aux-Bois", "Damas-et-Bettegney", "Dambach-la-Ville", "Dambenoît-lès-Colombe", -"dame-aubert", -"dame-d'onze-heures", -"dame-jeanne", "Dame-Marie", "Dame-Marie-les-Bois", -"dame-pipi", -"dame-ronde", -"dames-d'onze-heures", -"dames-jeannes", -"dames-pipi", -"dames-rondes", "Dammarie-en-Puisaye", "Dammarie-les-Lys", "Dammarie-sur-Loing", "Dammarie-sur-Saulx", +"Dammartin-Marpain", "Dammartin-en-Goële", "Dammartin-en-Serve", "Dammartin-les-Templiers", -"Dammartin-Marpain", "Dammartin-sur-Meuse", "Dammartin-sur-Tigeaux", -"d-amphétamine", +"Dampierre-Saint-Nicolas", "Dampierre-au-Temple", "Dampierre-en-Bray", "Dampierre-en-Bresse", @@ -6705,7 +3921,6 @@ FR_BASE_EXCEPTIONS = [ "Dampierre-le-Château", "Dampierre-les-Bois", "Dampierre-lès-Conflans", -"Dampierre-Saint-Nicolas", "Dampierre-sous-Bouhy", "Dampierre-sous-Brou", "Dampierre-sur-Aube", @@ -6713,162 +3928,63 @@ FR_BASE_EXCEPTIONS = [ "Dampierre-sur-Avre", "Dampierre-sur-Blévy", "Dampierre-sur-Boutonne", -"Dampierre-sur-le-Doubs", "Dampierre-sur-Linotte", "Dampierre-sur-Loire", "Dampierre-sur-Moivre", "Dampierre-sur-Salon", -"Dampvalley-lès-Colombe", +"Dampierre-sur-le-Doubs", "Dampvalley-Saint-Pancras", +"Dampvalley-lès-Colombe", "Dancourt-Popincourt", "Dangé-Saint-Romain", "Danne-et-Quatre-Vents", "Dannemarie-sur-Crète", "Dannstadt-Schauernheim", -"danse-poteau", "Danube-Ries", "Danvou-la-Ferrière", -"Dão-Lafões", -"dare-dare", -"dar-et-dar", "Darmstadt-Dieburg", "Darney-aux-Chênes", -"datte-de-mer", +"Daubeuf-Serville", "Daubeuf-la-Campagne", "Daubeuf-près-Vatteville", -"Daubeuf-Serville", "Daumazan-sur-Arize", "Dauzat-sur-Vodable", -"D-Day", -"dead-line", -"dead-lines", -"débat-spectacle", -"Débats-Rivière-d'Orpra", -"débauche-embauche", -"déca-ampère", -"déca-ampères", -"de-ci", -"Décines-Charpieu", -"découd-vite", -"découpe-neige", -"découpes-neige", -"décrochez-moi-ça", -"Dégrad-Edmond", -"Dégrad-Samson", -"déjà-vu", -"de-là", "Delap-Uliga-Darrit", "Delley-Portalban", "Delouze-Rosières", "Demange-aux-Eaux", -"déméton-méthyl", +"Demi-Quartier", "Demitz-Thumitz", -"démocrate-chrétien", -"démocrate-chrétienne", -"démocrates-chrétiennes", -"démocrates-chrétiens", -"démonte-pneu", -"démonte-pneus", -"dena'ina", -"dena'inas", -"Deneuille-lès-Chantelle", "Deneuille-les-Mines", -"Dénezé-sous-Doué", -"Dénezé-sous-le-Lude", +"Deneuille-lès-Chantelle", "Dennweiler-Frohnbach", -"dent-de-cheval", -"dent-de-chien", -"dent-de-lion", -"dent-de-loup", -"dent-de-rat", -"dento-facial", -"dents-de-cheval", -"dents-de-chien", -"dents-de-lion", -"dépose-minute", -"dépôts-ventes", -"dépôt-vente", -"député-maire", -"députés-maires", -"dermato-allergologue", -"dermato-allergologues", -"dernière-née", -"dernier-né", -"dernier-nés", -"derniers-nés", -"des-agreable", -"des-agreables", -"déséthyl-terbuméton", -"dès-méshui", "Dessau-Rosslau", -"dessinateur-typographe", -"dessous-de-bouteille", -"dessous-de-bras", -"dessous-de-plat", -"dessous-de-table", -"dessous-de-tables", -"dessus-de-lit", -"dessus-de-plat", -"dessus-de-porte", -"dessus-de-tête", -"Détain-et-Bruant", "Deuil-la-Barre", "Deux-Acren", -"deux-cents", -"deux-cent-vingt-et-un", "Deux-Chaises", -"deux-chaisois", "Deux-Chaisois", -"deux-chaisoise", "Deux-Chaisoise", -"deux-chaisoises", "Deux-Chaisoises", -"deux-chevaux", -"deux-dents", "Deux-Evailles", -"Deux-Évailles", "Deux-Jumeaux", -"deux-mâts", -"deux-mille", "Deux-Montagnais", +"Deux-Ponts", +"Deux-Rivières", +"Deux-Sèvres", +"Deux-Verges", +"Deux-Évailles", "Deuxnouds-aux-Bois", "Deuxnouds-devant-Beauzée", -"deux-peccable", -"deux-peccables", -"deux-pièces", -"deux-points", -"deux-ponts", -"Deux-Ponts", -"deux-quatre", -"Deux-Rivières", -"deux-roues", -"Deux-Sèvres", -"deux-temps", -"Deux-Verges", -"Déville-lès-Rouen", -"devrai-gondragnier", "Devrai-Gondragnier", -"devrai-gondragnière", -"Devrai-Gondragnière", -"devrai-gondragnières", -"Devrai-Gondragnières", -"devrai-gondragniers", "Devrai-Gondragniers", -"dextro-volubile", +"Devrai-Gondragnière", +"Devrai-Gondragnières", "Dezize-lès-Maranges", -"D-glucuronate", -"D-glucuronates", -"D-glycéraldéhyde", -"di-1-p-menthène", -"diam's", +"Dhuys et Morin-en-Brie", "Diane-Capelle", -"diastéréo-isomère", -"diastéréo-isomères", -"dichloro-diphényl-dichloroéthane", -"dichlorprop-p", -"diclofop-méthyl", "Dieffenbach-au-Val", "Dieffenbach-lès-Woerth", +"Dieffenbach-lès-Wœrth", "Dieffenbach-lès-Wœrth", "Diekhusen-Fahrstedt", "Diennes-Aubigny", @@ -6877,157 +3993,41 @@ FR_BASE_EXCEPTIONS = [ "Diera-Zehren", "Dierrey-Saint-Julien", "Dierrey-Saint-Pierre", -"diesel-électrique", -"diésel-électrique", -"diesels-électriques", -"diésels-électriques", -"diéthyl-diphényl-dichloroéthane", "Dietzenrode-Vatterode", "Dieue-sur-Meuse", "Diffembach-lès-Hellimer", "Digne-les-Bains", -"digue-digue", -"dihydro-oxycodéinone", -"dik-dik", -"dik-diks", -"dikégulac-sodium", "Dilsen-Stokkem", -"diméthénamide-P", -"diméthyl-dixanthogène", -"DIN-31635", -"dîner-spectacle", -"dîners-spectacles", "Dingolfing-Landau", -"Dingy-en-Vuache", "Dingy-Saint-Clair", -"dining-room", -"dining-rooms", +"Dingy-en-Vuache", "Dinsheim-sur-Bruche", "Dio-et-Valquières", -"diola-kasa", "Dion-Valmont", -"diony-sapinois", "Diony-Sapinois", -"diony-sapinoise", "Diony-Sapinoise", -"diony-sapinoises", "Diony-Sapinoises", -"diptéro-sodomie", -"diptéro-sodomies", -"disc-jockey", -"disc-jockeys", "Dissay-sous-Courcillon", "Dissen-Striesow", "Dissé-sous-Ballon", "Dissé-sous-le-Lude", -"distance-temps", "Dittelsheim-Heßloch", "Divatte-sur-Loire", -"divergi-nervé", "Dives-sur-Mer", "Divitz-Spoldershagen", "Divonne-les-Bains", -"dix-cors", -"dix-en-dix", -"dix-heura", -"dix-heurai", -"dix-heuraient", -"dix-heurais", -"dix-heurait", -"dix-heurâmes", -"dix-heurant", -"dix-heuras", -"dix-heurasse", -"dix-heurassent", -"dix-heurasses", -"dix-heurassiez", -"dix-heurassions", -"dix-heurât", -"dix-heurâtes", -"dix-heure", -"dix-heuré", -"dix-heurent", -"dix-heurer", -"dix-heurera", -"dix-heurerai", -"dix-heureraient", -"dix-heurerais", -"dix-heurerait", -"dix-heureras", -"dix-heurèrent", -"dix-heurerez", -"dix-heureriez", -"dix-heurerions", -"dix-heurerons", -"dix-heureront", -"dix-heures", -"dix-heurez", -"dix-heuriez", -"dix-heurions", -"dix-heurons", -"dix-huit", -"dix-huitième", -"dix-huitièmement", -"dix-huitièmes", -"dix-huitiémisme", -"dix-huitiémismes", -"dix-huitiémiste", -"dix-huitièmiste", -"dix-huitiémistes", -"dix-huitièmistes", -"dix-mille", -"dix-millième", -"dix-millièmes", -"dix-millionième", -"dix-millionièmes", -"dix-neuf", -"dix-neuvième", -"dix-neuvièmement", -"dix-neuvièmes", -"dix-neuviémisme", -"dix-neuviémismes", -"dix-neuviémiste", -"dix-neuvièmiste", -"dix-neuviémistes", -"dix-neuvièmistes", -"dix-roues", -"dix-sept", -"dix-septième", -"dix-septièmement", -"dix-septièmes", -"dix-septiémisme", -"dix-septiémismes", -"dix-septiémiste", -"dix-septièmiste", -"dix-septiémistes", -"dix-septièmistes", "Dizy-le-Gros", -"djoumada-l-oula", -"djoumada-t-tania", -"DMTA-P", -"doati-casteidois", "Doati-Casteidois", -"doati-casteidoise", "Doati-Casteidoise", -"doati-casteidoises", "Doati-Casteidoises", "Dobbin-Linstow", "Doberlug-Kirchhain", "Doberschau-Gaußig", -"docu-fiction", -"docu-fictions", -"documentaire-choc", -"documentaires-chocs", -"dodémorphe-acétate", -"Dœuil-sur-le-Mignon", -"dog-cart", -"dog-carts", "Dohm-Lammersdorf", -"doigt-de-gant", -"doigts-de-gant", "Dol-de-Bretagne", "Dolus-d'Oléron", "Dolus-le-Sec", +"Dom-le-Mesnil", "Domart-en-Ponthieu", "Domart-sur-la-Luce", "Dombasle-devant-Darney", @@ -7040,21 +4040,15 @@ FR_BASE_EXCEPTIONS = [ "Domburg-Buiten", "Domecy-sur-Cure", "Domecy-sur-le-Vault", -"Domèvre-en-Haye", -"Domèvre-sous-Montfort", -"Domèvre-sur-Avière", -"Domèvre-sur-Durbion", -"Domèvre-sur-Vezouze", "Domezain-Berraute", "Domfront-en-Champagne", "Domfront-en-Poiraie", "Domléger-Longvillers", -"Dom-le-Mesnil", -"dommage-intérêt", -"dommages-intérêts", "Dommarie-Eulmont", -"Dommartin-aux-Bois", "Dommartin-Dampierre", +"Dommartin-Lettrée", +"Dommartin-Varimont", +"Dommartin-aux-Bois", "Dommartin-la-Chapelle", "Dommartin-la-Chaussée", "Dommartin-la-Montagne", @@ -7065,22 +4059,20 @@ FR_BASE_EXCEPTIONS = [ "Dommartin-lès-Remiremont", "Dommartin-lès-Toul", "Dommartin-lès-Vallois", -"Dommartin-Lettrée", "Dommartin-sous-Amance", "Dommartin-sous-Hans", "Dommartin-sur-Vraine", -"Dommartin-Varimont", "Dommary-Baroncourt", "Domnom-lès-Dieuze", "Domnon-lès-Dieuze", -"Dompierre-aux-Bois", "Dompierre-Becquincourt", +"Dompierre-aux-Bois", "Dompierre-du-Chemin", "Dompierre-en-Morvan", "Dompierre-les-Eglises", -"Dompierre-les-Églises", "Dompierre-les-Ormes", "Dompierre-les-Tilleuls", +"Dompierre-les-Églises", "Dompierre-sous-Sanvignes", "Dompierre-sur-Authie", "Dompierre-sur-Besbre", @@ -7094,199 +4086,79 @@ FR_BASE_EXCEPTIONS = [ "Dompierre-sur-Veyle", "Dompierre-sur-Yon", "Domptail-en-l'Air", -"dompte-venin", -"dompte-venins", +"Domremy-Landéville", "Domremy-aux-Bois", "Domremy-la-Canne", -"Domremy-Landéville", "Domrémy-la-Pucelle", -"DOM-ROM", -"DOM-TOM", -"dom-tomien", -"dom-tomienne", -"dom-tomiennes", -"dom-tomiens", -"donation-partage", -"donations-partages", +"Domèvre-en-Haye", +"Domèvre-sous-Montfort", +"Domèvre-sur-Avière", +"Domèvre-sur-Durbion", +"Domèvre-sur-Vezouze", "Donchery-sur-Meuse", "Doncourt-aux-Templiers", "Doncourt-lès-Conflans", "Doncourt-lès-Longuyon", "Doncourt-sur-Meuse", "Dongen-Vaart", -"don-juanisme", -"don-juanismes", -"donnant-donnant", -"donne-jour", "Donnemain-Saint-Mamès", "Donnemarie-Dontilly", -"don-quichottisme", -"don-quichottismes", "Donville-les-Bains", "Donzy-le-National", "Donzy-le-Pertuis", -"doom-death", "Dore-l'Eglise", "Dore-l'Église", -"Dörfles-Esbach", -"Dornburg-Camburg", "Dorn-Dürkheim", -"dorso-vélaire", -"dorso-vélaires", -"dos-d'âne", +"Dornburg-Camburg", "Dossenheim-Kochersberg", "Dossenheim-sur-Zinsel", -"doubet-talibautier", "Doubet-Talibautier", -"doubet-talibautière", -"Doubet-Talibautière", -"doubet-talibautières", -"Doubet-Talibautières", -"doubet-talibautiers", "Doubet-Talibautiers", -"doubles-aubiers", -"doubles-bécassines", -"doubles-bouches", -"doubles-bulbes", -"doubles-canons", -"doubles-chaînes", -"doubles-clics", -"doubles-croches", -"doubles-feuilles", -"doubles-fonds", -"doubles-mains", -"doubles-sens", -"douce-amère", -"douces-amères", -"Douchy-lès-Ayette", -"Douchy-les-Mines", +"Doubet-Talibautière", +"Doubet-Talibautières", "Douchy-Montcorbon", +"Douchy-les-Mines", +"Douchy-lès-Ayette", "Doucy-en-Bauges", "Doudeauville-en-Vexin", -"Doué-en-Anjou", -"Doué-la-Fontaine", "Doulaincourt-Saucourt", "Doulevant-le-Château", "Doulevant-le-Petit", -"dou-l-hidjja", -"dou-l-qa'da", "Doumely-Bégny", "Dourd'Hal", "Douville-en-Auge", "Douville-sur-Andelle", "Douvres-la-Délivrande", -"doux-agnel", -"doux-à-l'agneau", -"doux-amer", -"doux-amers", -"doux-ballon", -"doux-vert", "Douy-la-Ramée", -"down-loada", -"down-loadai", -"down-loadaient", -"down-loadais", -"down-loadait", -"down-loadâmes", -"down-loadant", -"down-loadas", -"down-loadasse", -"down-loadassent", -"down-loadasses", -"down-loadassiez", -"down-loadassions", -"down-loadât", -"down-loadâtes", -"down-loade", -"down-loadé", -"down-loadée", -"down-loadées", -"down-loadent", -"down-loader", -"down-loadera", -"down-loaderai", -"down-loaderaient", -"down-loaderais", -"down-loaderait", -"down-loaderas", -"down-loadèrent", -"down-loaderez", -"down-loaderiez", -"down-loaderions", -"down-loaderons", -"down-loaderont", -"down-loades", -"down-loadés", -"down-loadez", -"down-loadiez", -"down-loadions", -"down-loadons", +"Doué-en-Anjou", +"Doué-la-Fontaine", "Drachenbronn-Birlenbach", +"Dracy-Saint-Loup", "Dracy-le-Fort", "Dracy-lès-Couches", -"Dracy-Saint-Loup", "Dracy-sur-Ouanne", "Dragey-Ronthon", -"dragonnet-lyre", -"drainage-taupe", -"draineuses-trancheuses", -"draineuse-trancheuse", -"drap-housse", -"drap-housses", "Dreis-Brück", -"drelin-drelin", -"Drémil-Lafage", "Dreuil-Hamel", "Dreuil-lès-Amiens", "Dreuil-lès-Molliens", "Driebergen-Rijsenburg", -"drift-ice", -"drift-ices", -"dring-dring", -"drive-in", -"drive-ins", -"drive-way", -"drive-ways", -"droit-fil", -"droit-fils", -"drop-goal", -"drop-goals", "Droue-sur-Drouette", "Droupt-Saint-Basle", "Droupt-Sainte-Marie", "Drouvin-le-Marais", -"drug-store", -"drug-stores", "Drumettaz-Clarafond", -"Druyes-les-Belles-Fontaines", "Druy-Parigny", -"dry-tooleur", -"dry-tooleurs", -"dry-tooling", -"D-sucre", -"D-sucres", -"dual-core", -"dual-cores", -"duc-d'albe", -"duc-d'Albe", +"Druyes-les-Belles-Fontaines", +"Drémil-Lafage", "Duc-de-Thol", -"duché-pairie", -"duchés-pairies", -"ducs-d'albe", -"ducs-d'Albe", +"Ducey-Les Chéris", "Ducy-Sainte-Marguerite", -"duffel-coat", -"duffel-coats", -"duffle-coat", -"duffle-coats", "Dugny-sur-Meuse", "Duhamellois-de-l'Ouest", "Duhort-Bachen", "Duilhac-sous-Peyrepertuse", "Duino-Aurisina", -"dum-dum", -"Dunières-sur-Eyrieux", -"Dunière-sur-Eyrieux", "Dun-le-Palestel", "Dun-le-Palleteau", "Dun-le-Poëlier", @@ -7294,350 +4166,115 @@ FR_BASE_EXCEPTIONS = [ "Dun-sur-Auron", "Dun-sur-Grandry", "Dun-sur-Meuse", -"duo-tang", -"duo-tangs", -"duplicato-dentelé", +"Dunière-sur-Eyrieux", +"Dunières-sur-Eyrieux", "Dupont-Lajoie", "Durban-Corbières", "Durban-sur-Arize", -"dur-bec", "Durdat-Larequille", -"dure-mère", -"dure-peau", -"dures-mères", -"dures-peaux", -"Durfort-et-Saint-Martin-de-Sossenac", "Durfort-Lacapelette", +"Durfort-et-Saint-Martin-de-Sossenac", +"Dœuil-sur-le-Mignon", +"Dão-Lafões", +"Débats-Rivière-d'Orpra", +"Décines-Charpieu", +"Dégrad-Edmond", +"Dégrad-Samson", +"Dénezé-sous-Doué", +"Dénezé-sous-le-Lude", +"Détain-et-Bruant", +"Déville-lès-Rouen", +"Dörfles-Esbach", "Dürrröhrsdorf-Dittersbach", -"durs-becs", -"duty-free", -"DVD-RAM", -"DVD-ROM", -"DVD-RW", -"dynamo-électrique", -"dynamo-électriques", +"Dœuil-sur-le-Mignon", "E7,Z9-12:Ac", "E7-Z9-dodécadiénylacétate", "E8,E10-dodécadiène-1-ol", -"e-administration", -"e-administrations", -"eau-bénitier", -"eau-bénitiers", +"EE-8,10-DDDOL", "Eaucourt-sur-Somme", -"eau-de-vie", -"eau-forte", -"eaux-bonnais", "Eaux-Bonnais", -"eaux-bonnaise", "Eaux-Bonnaise", -"eaux-bonnaises", "Eaux-Bonnaises", "Eaux-Bonnes", -"eaux-de-vie", -"eaux-fortes", "Eaux-Puiseaux", -"eaux-vannes", -"Ében-Émael", "Eberbach-Seltz", "Eberbach-Wœrth", "Ebersbach-Musbach", "Ebnat-Kappel", -"e-book", -"e-business", "Ecalles-Alix", -"Écalles-Alix", "Ecardenville-la-Campagne", -"Écardenville-la-Campagne", "Ecardenville-sur-Eure", -"Écardenville-sur-Eure", -"e-carte", -"e-cartes", -"écarts-types", -"écart-type", -"Écaussinnes-d'Enghien", -"Écaussinnes-Lalaing", "Eccica-Suarella", "Echarri-Aranaz", "Echelle-Saint-Aurin", -"Échelle-Saint-Aurin", "Echenans-sous-Mont-Vaudois", -"Échenans-sous-Mont-Vaudois", "Echenoz-la-Méline", -"Échenoz-la-Méline", "Echenoz-le-Sec", -"Échenoz-le-Sec", -"écho-location", -"écho-locations", -"échos-radars", "Echt-Susteren", -"e-cig", -"e-cigarette", -"e-cigarettes", -"e-cigs", -"e-cinéma", -"e-cinémas", "Eclans-Nenon", -"Éclans-Nenon", "Eclaron-Braucourt-Sainte-Livière", -"Éclaron-Braucourt-Sainte-Livière", -"e-client", -"e-clope", -"e-clopes", "Eclose-Badinières", "Eclusier-Vaux", -"Éclusier-Vaux", "Ecole-Valentin", -"École-Valentin", -"e-commerçant", -"e-commerçants", -"e-commerce", -"écorche-œil", -"Ecotay-l'Olme", -"Écotay-l'Olme", "Ecot-la-Combe", -"Écot-la-Combe", -"Écouché-les-Vallées", -"e-couponing", +"Ecotay-l'Olme", "Ecourt-Saint-Quentin", -"Écourt-Saint-Quentin", "Ecoust-Saint-Mein", -"Écoust-Saint-Mein", -"écoute-s'il-pleut", -"Écoute-s'il-pleut", -"écrase-merde", -"écrase-merdes", "Ecretteville-lès-Baons", -"Écretteville-lès-Baons", "Ecretteville-sur-Mer", -"Écretteville-sur-Mer", -"e-criminalité", -"e-criminalités", -"Écry-le-Franc", "Ectot-l'Auber", "Ectot-lès-Baons", "Ecurey-en-Verdunois", -"Écurey-en-Verdunois", -"écurie-ménagerie", -"écuries-ménageries", "Ecury-le-Repos", -"Écury-le-Repos", "Ecury-sur-Coole", -"Écury-sur-Coole", "Edam-Volendam", -"e-délinquance", -"e-délinquances", "Ediger-Eller", "Edingen-Neckarhausen", -"edit-a-thon", -"edit-a-thons", -"Édouard-Josse", -"EE-8,10-DDDOL", "Eelde-Paterswolde", "Effelder-Rauenstein", -"effet-bulle", -"effets-bulles", "Efringen-Kirchen", -"égal-à-tous", -"Egée-Méridionale", -"Égée-Méridionale", -"Egée-Septentrionale", -"Égée-Septentrionale", "Eggenstein-Leopoldshafen", -"Eglise-aux-Bois", -"Église-aux-Bois", -"église-halle", -"Egliseneuve-d'Entraigues", -"Égliseneuve-d'Entraigues", -"Egliseneuve-des-Liards", -"Égliseneuve-des-Liards", -"Eglise-Neuve-de-Vergt", -"Église-Neuve-de-Vergt", "Eglise-Neuve-d'Issac", -"Église-Neuve-d'Issac", +"Eglise-Neuve-de-Vergt", +"Eglise-aux-Bois", +"Egliseneuve-d'Entraigues", +"Egliseneuve-des-Liards", "Egliseneuve-près-Billom", -"Égliseneuve-près-Billom", "Egmond-Binnen", -"ego-document", -"ego-documents", "Egriselles-le-Bocage", -"Égriselles-le-Bocage", "Eguille-sur-Seudre", -"Éguille-sur-Seudre", "Eguilly-sous-Bois", -"Éguilly-sous-Bois", "Eguzon-Chantôme", -"Éguzon-Chantôme", -"égypto-lybien", -"égypto-tchado-soudanais", -"Éhein-bas", +"Egée-Méridionale", +"Egée-Septentrionale", "Ehlange-sur-Mess", "Ehra-Lessien", "Eifel-Bitburg-Prüm", "Eijsden-Margraten", "Einville-au-Jard", -"éka-actinide", -"éka-actinides", -"éka-aluminium", -"éka-astate", -"éka-bismuth", -"éka-bore", -"éka-borium", -"éka-francium", -"éka-mercure", -"éka-plomb", -"éka-polonium", -"éka-prométhium", -"éka-silicium", -"e-la", -"e-la-fa", -"e-la-mi", -"el-âsker", "Elbe-Elster", "Elbe-Parey", "Elbeuf-en-Bray", "Elbeuf-sur-Andelle", "Elburgo-Burgelu", "Elchesheim-Illingen", -"électron-volt", -"électron-volts", -"élément-clé", -"éléments-clés", "Eleu-dit-Leauwette", -"Éleu-dit-Leauwette", "Elincourt-Sainte-Marguerite", -"Élincourt-Sainte-Marguerite", "Elisabeth-Sophien-Koog", "Elise-Daucourt", -"Élise-Daucourt", -"elle-même", "Ellenz-Poltersdorf", -"elles-mêmes", "Ellignies-Sainte-Anne", -"ello-rhénan", -"ello-rhénane", -"ello-rhénanes", -"ello-rhénans", "Elsdorf-Westermühlen", "Elvillar-Bilar", -"e-mail", -"e-maila", -"e-mailai", -"e-mailaient", -"e-mailais", -"e-mailait", -"e-mailâmes", -"e-mailant", -"e-mailas", -"e-mailasse", -"e-mailassent", -"e-mailasses", -"e-mailassiez", -"e-mailassions", -"e-mailât", -"e-mailâtes", -"e-maile", -"e-mailé", -"e-mailée", -"e-mailées", -"e-mailent", -"e-mailer", -"e-mailera", -"e-mailerai", -"e-maileraient", -"e-mailerais", -"e-mailerait", -"e-maileras", -"e-mailèrent", -"e-mailerez", -"e-maileriez", -"e-mailerions", -"e-mailerons", -"e-maileront", -"e-mailes", -"e-mailés", -"e-maileur", -"e-maileurs", -"e-maileuse", -"e-maileuses", -"e-mailez", -"e-mailiez", -"e-mailing", -"e-mailings", -"e-mailions", -"e-mailons", -"e-marketeur", -"e-marketeurs", -"e-marketeuse", -"e-marketeuses", -"e-marketing", -"e-marketings", -"emballage-bulle", -"emballage-coque", -"emballages-bulles", -"emballages-coques", "Embres-et-Castelmaure", -"e-merchandiser", -"émetteur-récepteur", -"émetteur-récepteurs", -"émilienne-romagnole", -"Émilienne-Romagnole", -"émiliennes-romagnoles", -"Émiliennes-Romagnoles", -"émilien-romagnol", -"Émilien-Romagnol", -"émiliens-romagnols", -"Émiliens-Romagnols", -"Émilie-Romagne", -"émirato-algérien", -"émirato-allemand", -"émirato-allemands", -"émirato-britannique", -"émirato-britanniques", -"émirato-helvétique", -"émirato-helvétiques", -"émirato-indien", -"émirato-iranien", -"émirato-japonais", -"émission-débat", "Emmelsbüll-Horsbüll", "Emmer-Compascuum", "Emmer-Erfscheidenveen", "Emmingen-Liptingen", -"emo-sexualité", -"emo-sexualités", -"emporte-pièce", -"emporte-pièces", -"énargite-beta", -"énargite-betas", -"en-avant", -"en-avants", -"en-but", -"en-buts", -"en-cas", "Encausse-les-Thermes", "Enclave-de-la-Martinière", -"en-cours", -"en-deçà", -"en-dessous", -"en-dessus", "Enencourt-Léage", -"Énencourt-Léage", "Enencourt-le-Sec", -"Énencourt-le-Sec", -"enfant-bulle", -"enfant-roi", -"enfants-bulles", -"enfant-soldat", -"enfants-robots", -"enfants-rois", -"enfants-soldats", -"enfile-aiguille", -"enfile-aiguilles", -"enfle-boeuf", -"enfle-bœuf", -"enfle-boeufs", -"enfle-bœufs", -"en-garant", "Enge-Sande", "Enghien-les-Bains", "Englesqueville-en-Auge", @@ -7645,2204 +4282,65 @@ FR_BASE_EXCEPTIONS = [ "Enkenbach-Alsenborn", "Ennepe-Ruhr", "Ennetières-en-Weppes", -"enquêtes-minute", "Enquin-les-Mines", "Enquin-lez-Guinegatte", "Enquin-sur-Baillons", -"enseignant-chercheur", -"enseignante-chercheuse", -"enseignantes-chercheuses", -"enseignants-chercheurs", "Ensuès-la-Redonne", -"entéro-colite", -"entéro-colites", -"entéro-cystocèle", -"entéro-épiplocèle", -"entéro-épiplocèles", -"entéro-hémorrhagie", -"entéro-hydrocèle", -"entéro-hydromphale", -"entéro-mérocèle", -"entéro-mésentérite", -"entéro-pneumatose", -"entéro-rénal", -"entéro-rénale", -"entéro-rénales", -"entéro-rénaux", -"entéro-sarcocèle", -"entéro-sarcocèles", -"entéro-sténose", -"entéro-sténoses", -"en-tête", -"en-têtes", -"en-tout-cas", -"entr'abat", -"entr'abattaient", -"entr'abattait", -"entr'abattant", -"entr'abatte", -"entr'abattent", -"entr'abattez", -"entr'abattiez", -"entr'abattîmes", -"entr'abattions", -"entr'abattirent", -"entr'abattissent", -"entr'abattissions", -"entr'abattit", -"entr'abattît", -"entr'abattîtes", -"entr'abattons", -"entr'abattra", -"entr'abattraient", -"entr'abattrait", -"entr'abattre", -"entr'abattre", -"entr'abattrez", -"entr'abattriez", -"entr'abattrions", -"entr'abattrons", -"entr'abattront", -"entr'abattu", -"entr'abattue", -"entr'abattues", -"entr'abattus", -"entr'aborda", -"entr'abordaient", -"entr'abordait", -"entr'abordâmes", -"entr'abordant", -"entr'abordassent", -"entr'abordassiez", -"entr'abordassions", -"entr'abordât", -"entr'abordâtes", -"entr'aborde", -"entr'abordé", -"entr'abordées", -"entr'abordent", -"entr'aborder", -"entr'aborder", -"entr'abordera", -"entr'aborderaient", -"entr'aborderait", -"entr'abordèrent", -"entr'aborderez", -"entr'aborderiez", -"entr'aborderions", -"entr'aborderons", -"entr'aborderont", -"entr'abordés", -"entr'abordez", -"entr'abordiez", -"entr'abordions", -"entr'abordons", -"entr'accola", -"entr'accolaient", -"entr'accolait", -"entr'accolâmes", -"entr'accolant", -"entr'accolassent", -"entr'accolassiez", -"entr'accolassions", -"entr'accolât", -"entr'accolâtes", -"entr'accole", -"entr'accolé", -"entr'accolées", -"entr'accolent", -"entr'accoler", -"entr'accoler", -"entr'accolera", -"entr'accoleraient", -"entr'accolerait", -"entr'accolèrent", -"entr'accolerez", -"entr'accoleriez", -"entr'accolerions", -"entr'accolerons", -"entr'accoleront", -"entr'accolés", -"entr'accolez", -"entr'accoliez", -"entr'accolions", -"entr'accolons", -"entr'accorda", -"entr'accordaient", -"entr'accordait", -"entr'accordâmes", -"entr'accordant", -"entr'accordassent", -"entr'accordassiez", -"entr'accordassions", -"entr'accordât", -"entr'accordâtes", -"entr'accorde", -"entr'accordé", -"entr'accordées", -"entr'accordent", -"entr'accorder", -"entr'accorder", -"entr'accordera", -"entr'accorderaient", -"entr'accorderait", -"entr'accordèrent", -"entr'accorderez", -"entr'accorderiez", -"entr'accorderions", -"entr'accorderons", -"entr'accorderont", -"entr'accordés", -"entr'accordez", -"entr'accordiez", -"entr'accordions", -"entr'accordons", -"entr'accrocha", -"entr'accrochaient", -"entr'accrochait", -"entr'accrochâmes", -"entr'accrochant", -"entr'accrochassent", -"entr'accrochassiez", -"entr'accrochassions", -"entr'accrochât", -"entr'accrochâtes", -"entr'accroche", -"entr'accroché", -"entr'accrochées", -"entr'accrochent", -"entr'accrocher", -"entr'accrocher", -"entr'accrochera", -"entr'accrocheraient", -"entr'accrocherait", -"entr'accrochèrent", -"entr'accrocherez", -"entr'accrocheriez", -"entr'accrocherions", -"entr'accrocherons", -"entr'accrocheront", -"entr'accrochés", -"entr'accrochez", -"entr'accrochiez", -"entr'accrochions", -"entr'accrochons", -"entr'accusa", -"entr'accusaient", -"entr'accusait", -"entr'accusâmes", -"entr'accusant", -"entr'accusassent", -"entr'accusassiez", -"entr'accusassions", -"entr'accusât", -"entr'accusâtes", -"entr'accuse", -"entr'accusé", -"entr'accusées", -"entr'accusent", -"entr'accuser", -"entr'accuser", -"entr'accusera", -"entr'accuseraient", -"entr'accuserait", -"entr'accusèrent", -"entr'accuserez", -"entr'accuseriez", -"entr'accuserions", -"entr'accuserons", -"entr'accuseront", -"entr'accusés", -"entr'accusez", -"entr'accusiez", -"entr'accusions", -"entr'accusons", -"entr'acte", -"entr'actes", -"entr'adapta", -"entr'adaptaient", -"entr'adaptait", -"entr'adaptâmes", -"entr'adaptant", -"entr'adaptassent", -"entr'adaptassiez", -"entr'adaptassions", -"entr'adaptât", -"entr'adaptâtes", -"entr'adapte", -"entr'adapté", -"entr'adaptées", -"entr'adaptent", -"entr'adapter", -"entr'adapter", -"entr'adaptera", -"entr'adapteraient", -"entr'adapterait", -"entr'adaptèrent", -"entr'adapterez", -"entr'adapteriez", -"entr'adapterions", -"entr'adapterons", -"entr'adapteront", -"entr'adaptés", -"entr'adaptez", -"entr'adaptiez", -"entr'adaptions", -"entr'adaptons", -"entr'admira", -"entr'admirai", -"entr'admiraient", -"entr'admirais", -"entr'admirait", -"entr'admirâmes", -"entr'admirant", -"entr'admiras", -"entr'admirasse", -"entr'admirassent", -"entr'admirasses", -"entr'admirassiez", -"entr'admirassions", -"entr'admirât", -"entr'admirâtes", -"entr'admire", -"entr'admiré", -"entr'admirée", -"entr'admirées", -"entr'admirent", -"entr'admirer", -"entr'admirer", -"entr'admirera", -"entr'admirerai", -"entr'admireraient", -"entr'admirerais", -"entr'admirerait", -"entr'admireras", -"entr'admirèrent", -"entr'admirerez", -"entr'admireriez", -"entr'admirerions", -"entr'admirerons", -"entr'admireront", -"entr'admires", -"entr'admirés", -"entr'admirez", -"entr'admiriez", -"entr'admirions", -"entr'admirons", -"entr'admonesta", -"entr'admonestaient", -"entr'admonestait", -"entr'admonestâmes", -"entr'admonestant", -"entr'admonestassent", -"entr'admonestassiez", -"entr'admonestassions", -"entr'admonestât", -"entr'admonestâtes", -"entr'admoneste", -"entr'admonesté", -"entr'admonestées", -"entr'admonestent", -"entr'admonester", -"entr'admonester", -"entr'admonestera", -"entr'admonesteraient", -"entr'admonesterait", -"entr'admonestèrent", -"entr'admonesterez", -"entr'admonesteriez", -"entr'admonesterions", -"entr'admonesterons", -"entr'admonesteront", -"entr'admonestés", -"entr'admonestez", -"entr'admonestiez", -"entr'admonestions", -"entr'admonestons", -"entr'adressa", -"entr'adressaient", -"entr'adressait", -"entr'adressâmes", -"entr'adressant", -"entr'adressassent", -"entr'adressassiez", -"entr'adressassions", -"entr'adressât", -"entr'adressâtes", -"entr'adresse", -"entr'adressé", -"entr'adressées", -"entr'adressent", -"entr'adresser", -"entr'adresser", -"entr'adressera", -"entr'adresseraient", -"entr'adresserait", -"entr'adressèrent", -"entr'adresserez", -"entr'adresseriez", -"entr'adresserions", -"entr'adresserons", -"entr'adresseront", -"entr'adressés", -"entr'adressez", -"entr'adressiez", -"entr'adressions", -"entr'adressons", -"entr'affronta", -"entr'affrontaient", -"entr'affrontait", -"entr'affrontâmes", -"entr'affrontant", -"entr'affrontassent", -"entr'affrontassiez", -"entr'affrontassions", -"entr'affrontât", -"entr'affrontâtes", -"entr'affronte", -"entr'affronté", -"entr'affrontées", -"entr'affrontent", -"entr'affronter", -"entr'affronter", -"entr'affrontera", -"entr'affronteraient", -"entr'affronterait", -"entr'affrontèrent", -"entr'affronterez", -"entr'affronteriez", -"entr'affronterions", -"entr'affronterons", -"entr'affronteront", -"entr'affrontés", -"entr'affrontez", -"entr'affrontiez", -"entr'affrontions", -"entr'affrontons", -"entr'aida", -"entr'aidaient", -"entr'aidait", -"entr'aidâmes", -"entr'aidant", -"entr'aidassent", -"entr'aidassiez", -"entr'aidassions", -"entr'aidât", -"entr'aidâtes", -"entr'aide", -"entr'aidé", -"entr'aidées", -"entr'aident", -"entr'aider", -"entr'aider", -"entr'aidera", -"entr'aideraient", -"entr'aiderait", -"entr'aidèrent", -"entr'aiderez", -"entr'aideriez", -"entr'aiderions", -"entr'aiderons", -"entr'aideront", -"entr'aides", -"entr'aidés", -"entr'aidez", -"entr'aidiez", -"entr'aidions", -"entr'aidons", "Entraigues-sur-la-Sorgue", -"entr'aiguisa", -"entr'aiguisaient", -"entr'aiguisait", -"entr'aiguisâmes", -"entr'aiguisant", -"entr'aiguisassent", -"entr'aiguisassiez", -"entr'aiguisassions", -"entr'aiguisât", -"entr'aiguisâtes", -"entr'aiguise", -"entr'aiguisé", -"entr'aiguisées", -"entr'aiguisent", -"entr'aiguiser", -"entr'aiguiser", -"entr'aiguisera", -"entr'aiguiseraient", -"entr'aiguiserait", -"entr'aiguisèrent", -"entr'aiguiserez", -"entr'aiguiseriez", -"entr'aiguiserions", -"entr'aiguiserons", -"entr'aiguiseront", -"entr'aiguisés", -"entr'aiguisez", -"entr'aiguisiez", -"entr'aiguisions", -"entr'aiguisons", -"entr'aima", -"entr'aimai", -"entr'aimaient", -"entr'aimais", -"entr'aimait", -"entr'aimâmes", -"entr'aimant", -"entr'aimas", -"entr'aimasse", -"entr'aimassent", -"entr'aimasses", -"entr'aimassiez", -"entr'aimassions", -"entr'aimât", -"entr'aimâtes", -"entr'aime", -"entr'aimé", -"entr'aimée", -"entr'aimées", -"entr'aiment", -"entr'aimer", -"entr'aimer", -"entr'aimera", -"entr'aimerai", -"entr'aimeraient", -"entr'aimerais", -"entr'aimerait", -"entr'aimeras", -"entr'aimèrent", -"entr'aimerez", -"entr'aimeriez", -"entr'aimerions", -"entr'aimerons", -"entr'aimeront", -"entr'aimes", -"entr'aimés", -"entr'aimez", -"entr'aimiez", -"entr'aimions", -"entr'aimons", "Entrains-sur-Nohain", -"entr'anima", -"entr'animaient", -"entr'animait", -"entr'animâmes", -"entr'animant", -"entr'animassent", -"entr'animassiez", -"entr'animassions", -"entr'animât", -"entr'animâtes", -"entr'anime", -"entr'animé", -"entr'animées", -"entr'animent", -"entr'animer", -"entr'animer", -"entr'animera", -"entr'animeraient", -"entr'animerait", -"entr'animèrent", -"entr'animerez", -"entr'animeriez", -"entr'animerions", -"entr'animerons", -"entr'animeront", -"entr'animés", -"entr'animez", -"entr'animiez", -"entr'animions", -"entr'animons", -"entr'apercevaient", -"entr'apercevais", -"entr'apercevait", -"entr'apercevant", -"entr'apercevez", -"entr'aperceviez", -"entr'apercevions", -"entr'apercevoir", -"entr'apercevons", -"entr'apercevra", -"entr'apercevrai", -"entr'apercevraient", -"entr'apercevrais", -"entr'apercevrait", -"entr'apercevras", -"entr'apercevrez", -"entr'apercevriez", -"entr'apercevrions", -"entr'apercevrons", -"entr'apercevront", -"entr'aperçois", -"entr'aperçoit", -"entr'aperçoive", -"entr'aperçoivent", -"entr'aperçoives", -"entr'aperçu", -"entr'aperçue", -"entr'aperçues", -"entr'aperçûmes", -"entr'aperçurent", -"entr'aperçus", -"entr'aperçusse", -"entr'aperçussent", -"entr'aperçusses", -"entr'aperçussiez", -"entr'aperçussions", -"entr'aperçut", -"entr'aperçût", -"entr'aperçûtes", -"entr'apparais", -"entr'apparaissaient", -"entr'apparaissais", -"entr'apparaissait", -"entr'apparaissant", -"entr'apparaisse", -"entr'apparaissent", -"entr'apparaisses", -"entr'apparaissez", -"entr'apparaissiez", -"entr'apparaissions", -"entr'apparaissons", -"entr'apparait", -"entr'apparaît", -"entr'apparaitra", -"entr'apparaîtra", -"entr'apparaitrai", -"entr'apparaîtrai", -"entr'apparaitraient", -"entr'apparaîtraient", -"entr'apparaitrais", -"entr'apparaîtrais", -"entr'apparaitrait", -"entr'apparaîtrait", -"entr'apparaitras", -"entr'apparaîtras", -"entr'apparaitre", -"entr'apparaître", -"entr'apparaitrez", -"entr'apparaîtrez", -"entr'apparaitriez", -"entr'apparaîtriez", -"entr'apparaitrions", -"entr'apparaîtrions", -"entr'apparaitrons", -"entr'apparaîtrons", -"entr'apparaitront", -"entr'apparaîtront", -"entr'apparu", -"entr'apparue", -"entr'apparues", -"entr'apparûmes", -"entr'apparurent", -"entr'apparus", -"entr'apparusse", -"entr'apparussent", -"entr'apparusses", -"entr'apparussiez", -"entr'apparussions", -"entr'apparut", -"entr'apparût", -"entr'apparûtes", -"entr'appela", -"entr'appelaient", -"entr'appelait", -"entr'appelâmes", -"entr'appelant", -"entr'appelassent", -"entr'appelassiez", -"entr'appelassions", -"entr'appelât", -"entr'appelâtes", -"entr'appelé", -"entr'appelées", -"entr'appeler", -"entr'appeler", -"entr'appelèrent", -"entr'appelés", -"entr'appelez", -"entr'appeliez", -"entr'appelions", -"entr'appelle", -"entr'appellent", -"entr'appellera", -"entr'appelleraient", -"entr'appellerait", -"entr'appellerez", -"entr'appelleriez", -"entr'appellerions", -"entr'appellerons", -"entr'appelleront", -"entr'appelles", -"entr'appelons", -"entr'apprenaient", -"entr'apprenait", -"entr'apprenant", -"entr'apprend", -"entr'apprendra", -"entr'apprendraient", -"entr'apprendrait", -"entr'apprendre", -"entr'apprendre", -"entr'apprendriez", -"entr'apprendrions", -"entr'apprendrons", -"entr'apprendront", -"entr'apprenez", -"entr'appreniez", -"entr'apprenions", -"entr'apprenne", -"entr'apprennent", -"entr'apprennes", -"entr'apprenons", -"entr'apprîmes", -"entr'apprirent", -"entr'appris", -"entr'apprise", -"entr'apprises", -"entr'apprissent", -"entr'apprissiez", -"entr'apprissions", -"entr'apprit", -"entr'apprît", -"entr'apprîtes", -"entr'approcha", -"entr'approchaient", -"entr'approchait", -"entr'approchâmes", -"entr'approchant", -"entr'approchassent", -"entr'approchassiez", -"entr'approchassions", -"entr'approchât", -"entr'approchâtes", -"entr'approche", -"entr'approché", -"entr'approchées", -"entr'approchent", -"entr'approcher", -"entr'approcher", -"entr'approchera", -"entr'approcheraient", -"entr'approcherait", -"entr'approchèrent", -"entr'approcherez", -"entr'approcheriez", -"entr'approcherions", -"entr'approcherons", -"entr'approcheront", -"entr'approchés", -"entr'approchez", -"entr'approchiez", -"entr'approchions", -"entr'approchons", -"entr'arquebusa", -"entr'arquebusaient", -"entr'arquebusait", -"entr'arquebusâmes", -"entr'arquebusant", -"entr'arquebusassent", -"entr'arquebusassiez", -"entr'arquebusassions", -"entr'arquebusât", -"entr'arquebusâtes", -"entr'arquebuse", -"entr'arquebusé", -"entr'arquebusées", -"entr'arquebusent", -"entr'arquebuser", -"entr'arquebuser", -"entr'arquebusera", -"entr'arquebuseraient", -"entr'arquebuserait", -"entr'arquebusèrent", -"entr'arquebuserez", -"entr'arquebuseriez", -"entr'arquebuserions", -"entr'arquebuserons", -"entr'arquebuseront", -"entr'arquebusés", -"entr'arquebusez", -"entr'arquebusiez", -"entr'arquebusions", -"entr'arquebusons", -"entr'assassina", -"entr'assassinaient", -"entr'assassinait", -"entr'assassinâmes", -"entr'assassinant", -"entr'assassinassent", -"entr'assassinassiez", -"entr'assassinassions", -"entr'assassinât", -"entr'assassinâtes", -"entr'assassine", -"entr'assassiné", -"entr'assassinées", -"entr'assassinent", -"entr'assassiner", -"entr'assassiner", -"entr'assassinera", -"entr'assassineraient", -"entr'assassinerait", -"entr'assassinèrent", -"entr'assassinerez", -"entr'assassineriez", -"entr'assassinerions", -"entr'assassinerons", -"entr'assassineront", -"entr'assassinés", -"entr'assassinez", -"entr'assassiniez", -"entr'assassinions", -"entr'assassinons", -"entr'assigna", -"entr'assignaient", -"entr'assignait", -"entr'assignâmes", -"entr'assignant", -"entr'assignassent", -"entr'assignassiez", -"entr'assignassions", -"entr'assignât", -"entr'assignâtes", -"entr'assigne", -"entr'assigné", -"entr'assignées", -"entr'assignent", -"entr'assigner", -"entr'assigner", -"entr'assignera", -"entr'assigneraient", -"entr'assignerait", -"entr'assignèrent", -"entr'assignerez", -"entr'assigneriez", -"entr'assignerions", -"entr'assignerons", -"entr'assigneront", -"entr'assignés", -"entr'assignez", -"entr'assigniez", -"entr'assignions", -"entr'assignons", -"entr'assomma", -"entr'assommaient", -"entr'assommait", -"entr'assommâmes", -"entr'assommant", -"entr'assommassent", -"entr'assommassiez", -"entr'assommassions", -"entr'assommât", -"entr'assommâtes", -"entr'assomme", -"entr'assommé", -"entr'assommées", -"entr'assomment", -"entr'assommer", -"entr'assommer", -"entr'assommera", -"entr'assommeraient", -"entr'assommerait", -"entr'assommèrent", -"entr'assommerez", -"entr'assommeriez", -"entr'assommerions", -"entr'assommerons", -"entr'assommeront", -"entr'assommés", -"entr'assommez", -"entr'assommiez", -"entr'assommions", -"entr'assommons", -"entr'attaqua", -"entr'attaquaient", -"entr'attaquait", -"entr'attaquâmes", -"entr'attaquant", -"entr'attaquassent", -"entr'attaquassiez", -"entr'attaquassions", -"entr'attaquât", -"entr'attaquâtes", -"entr'attaque", -"entr'attaqué", -"entr'attaquées", -"entr'attaquent", -"entr'attaquer", -"entr'attaquer", -"entr'attaquera", -"entr'attaqueraient", -"entr'attaquerait", -"entr'attaquèrent", -"entr'attaquerez", -"entr'attaqueriez", -"entr'attaquerions", -"entr'attaquerons", -"entr'attaqueront", -"entr'attaqués", -"entr'attaquez", -"entr'attaquiez", -"entr'attaquions", -"entr'attaquons", -"entr'attend", -"entr'attendaient", -"entr'attendait", -"entr'attendant", -"entr'attende", -"entr'attendent", -"entr'attendez", -"entr'attendiez", -"entr'attendîmes", -"entr'attendions", -"entr'attendirent", -"entr'attendissent", -"entr'attendissiez", -"entr'attendissions", -"entr'attendit", -"entr'attendît", -"entr'attendîtes", -"entr'attendons", -"entr'attendra", -"entr'attendraient", -"entr'attendrait", -"entr'attendre", -"entr'attendre", -"entr'attendrez", -"entr'attendriez", -"entr'attendrions", -"entr'attendrons", -"entr'attendront", -"entr'attendu", -"entr'attendue", -"entr'attendues", -"entr'attendus", -"entr'autres", -"entr'averti", -"entr'averties", -"entr'avertîmes", -"entr'avertir", -"entr'avertir", -"entr'avertira", -"entr'avertiraient", -"entr'avertirait", -"entr'avertirent", -"entr'avertirez", -"entr'avertiriez", -"entr'avertirions", -"entr'avertirons", -"entr'avertiront", -"entr'avertis", -"entr'avertissaient", -"entr'avertissait", -"entr'avertissant", -"entr'avertisse", -"entr'avertissent", -"entr'avertissez", -"entr'avertissiez", -"entr'avertissions", -"entr'avertissons", -"entr'avertit", -"entr'avertît", -"entr'avertîtes", -"entr'avoua", -"entr'avouaient", -"entr'avouait", -"entr'avouâmes", -"entr'avouant", -"entr'avouassent", -"entr'avouassiez", -"entr'avouassions", -"entr'avouât", -"entr'avouâtes", -"entr'avoue", -"entr'avoué", -"entr'avouées", -"entr'avouent", -"entr'avouer", -"entr'avouer", -"entr'avouera", -"entr'avoueraient", -"entr'avouerait", -"entr'avouèrent", -"entr'avouerez", -"entr'avoueriez", -"entr'avouerions", -"entr'avouerons", -"entr'avoueront", -"entr'avoués", -"entr'avouez", -"entr'avouiez", -"entr'avouions", -"entr'avouons", -"entr'axe", -"entr'axes", "Entraygues-sur-Truyère", -"entr'ébranla", -"entr'ébranlaient", -"entr'ébranlait", -"entr'ébranlâmes", -"entr'ébranlant", -"entr'ébranlassent", -"entr'ébranlassiez", -"entr'ébranlassions", -"entr'ébranlât", -"entr'ébranlâtes", -"entr'ébranle", -"entr'ébranlé", -"entr'ébranlées", -"entr'ébranlent", -"entr'ébranler", -"entr'ébranlera", -"entr'ébranleraient", -"entr'ébranlerait", -"entr'ébranlèrent", -"entr'ébranlerez", -"entr'ébranleriez", -"entr'ébranlerions", -"entr'ébranlerons", -"entr'ébranleront", -"entr'ébranlés", -"entr'ébranlez", -"entr'ébranliez", -"entr'ébranlions", -"entr'ébranlons", -"entr'éclairci", -"entr'éclaircies", -"entr'éclaircîmes", -"entr'éclaircir", -"entr'éclaircir", -"entr'éclaircira", -"entr'éclairciraient", -"entr'éclaircirait", -"entr'éclaircirent", -"entr'éclaircirez", -"entr'éclairciriez", -"entr'éclaircirions", -"entr'éclaircirons", -"entr'éclairciront", -"entr'éclaircis", -"entr'éclaircissaient", -"entr'éclaircissait", -"entr'éclaircissant", -"entr'éclaircisse", -"entr'éclaircissent", -"entr'éclaircissez", -"entr'éclaircissiez", -"entr'éclaircissions", -"entr'éclaircissons", -"entr'éclaircit", -"entr'éclaircît", -"entr'éclaircîtes", -"entr'éclore", -"entr'éclose", -"entr'écouta", -"entr'écoutaient", -"entr'écoutait", -"entr'écoutâmes", -"entr'écoutant", -"entr'écoutassent", -"entr'écoutassiez", -"entr'écoutassions", -"entr'écoutât", -"entr'écoutâtes", -"entr'écoute", -"entr'écouté", -"entr'écoutées", -"entr'écoutent", -"entr'écouter", -"entr'écoutera", -"entr'écouteraient", -"entr'écouterait", -"entr'écoutèrent", -"entr'écouterez", -"entr'écouteriez", -"entr'écouterions", -"entr'écouterons", -"entr'écouteront", -"entr'écoutés", -"entr'écoutez", -"entr'écoutiez", -"entr'écoutions", -"entr'écoutons", -"entr'écrasa", -"entr'écrasai", -"entr'écrasaient", -"entr'écrasais", -"entr'écrasait", -"entr'écrasâmes", -"entr'écrasant", -"entr'écrasas", -"entr'écrasasse", -"entr'écrasassent", -"entr'écrasasses", -"entr'écrasassiez", -"entr'écrasassions", -"entr'écrasât", -"entr'écrasâtes", -"entr'écrase", -"entr'écrasé", -"entr'écrasée", -"entr'écrasées", -"entr'écrasent", -"entr'écraser", -"entr'écraser", -"entr'écrasera", -"entr'écraserai", -"entr'écraseraient", -"entr'écraserais", -"entr'écraserait", -"entr'écraseras", -"entr'écrasèrent", -"entr'écraserez", -"entr'écraseriez", -"entr'écraserions", -"entr'écraserons", -"entr'écraseront", -"entr'écrases", -"entr'écrasés", -"entr'écrasez", -"entr'écrasiez", -"entr'écrasions", -"entr'écrasons", -"entr'écrira", -"entr'écriraient", -"entr'écrirait", -"entr'écrire", -"entr'écrire", -"entr'écrirez", -"entr'écririez", -"entr'écririons", -"entr'écrirons", -"entr'écriront", -"entr'écrit", -"entr'écrite", -"entr'écrites", -"entr'écrits", -"entr'écrivaient", -"entr'écrivait", -"entr'écrivant", -"entr'écrive", -"entr'écrivent", -"entr'écrivez", -"entr'écriviez", -"entr'écrivîmes", -"entr'écrivions", -"entr'écrivirent", -"entr'écrivissent", -"entr'écrivissions", -"entr'écrivit", -"entr'écrivît", -"entr'écrivîtes", -"entr'écrivons", -"entrée-sortie", -"entrées-sorties", -"entr'égorge", -"entr'égorgé", -"entr'égorgea", -"entr'égorgeai", -"entr'égorgeaient", -"entr'égorgeait", -"entr'égorgeâmes", -"entr'égorgeant", -"entr'égorgeassent", -"entr'égorgeassiez", -"entr'égorgeassions", -"entr'égorgeât", -"entr'égorgeâtes", -"entr'égorgée", -"entr'égorgées", -"entr'égorgemens", -"entr'égorgement", -"entr'égorgements", -"entr'égorgent", -"entr'égorgeons", -"entr'égorger", -"entr'égorger", -"entr'égorgera", -"entr'égorgeraient", -"entr'égorgerait", -"entr'égorgèrent", -"entr'égorgerez", -"entr'égorgeriez", -"entr'égorgerions", -"entr'égorgerons", -"entr'égorgeront", -"entr'égorges", -"entr'égorgés", -"entr'égorgez", -"entr'égorgiez", -"entr'égorgions", -"entr'égratigna", -"entr'égratignaient", -"entr'égratignait", -"entr'égratignâmes", -"entr'égratignant", -"entr'égratignassent", -"entr'égratignassiez", -"entr'égratignassions", -"entr'égratignât", -"entr'égratignâtes", -"entr'égratigne", -"entr'égratigné", -"entr'égratignées", -"entr'égratignent", -"entr'égratigner", -"entr'égratigner", -"entr'égratignera", -"entr'égratigneraient", -"entr'égratignerait", -"entr'égratignèrent", -"entr'égratignerez", -"entr'égratigneriez", -"entr'égratignerions", -"entr'égratignerons", -"entr'égratigneront", -"entr'égratignés", -"entr'égratignez", -"entr'égratigniez", -"entr'égratignions", -"entr'égratignons", -"entr'embarrassa", -"entr'embarrassaient", -"entr'embarrassait", -"entr'embarrassâmes", -"entr'embarrassant", -"entr'embarrassassent", -"entr'embarrassassiez", -"entr'embarrassassions", -"entr'embarrassât", -"entr'embarrassâtes", -"entr'embarrasse", -"entr'embarrassé", -"entr'embarrassées", -"entr'embarrassent", -"entr'embarrasser", -"entr'embarrasser", -"entr'embarrassera", -"entr'embarrasseraient", -"entr'embarrasserait", -"entr'embarrassèrent", -"entr'embarrasserez", -"entr'embarrasseriez", -"entr'embarrasserions", -"entr'embarrasserons", -"entr'embarrasseront", -"entr'embarrassés", -"entr'embarrassez", -"entr'embarrassiez", -"entr'embarrassions", -"entr'embarrassons", -"entr'embrassa", -"entr'embrassaient", -"entr'embrassait", -"entr'embrassâmes", -"entr'embrassant", -"entr'embrassassent", -"entr'embrassassiez", -"entr'embrassassions", -"entr'embrassât", -"entr'embrassâtes", -"entr'embrasse", -"entr'embrassé", -"entr'embrassées", -"entr'embrassent", -"entr'embrasser", -"entr'embrasser", -"entr'embrassera", -"entr'embrasseraient", -"entr'embrasserait", -"entr'embrassèrent", -"entr'embrasserez", -"entr'embrasseriez", -"entr'embrasserions", -"entr'embrasserons", -"entr'embrasseront", -"entr'embrassés", -"entr'embrassez", -"entr'embrassiez", -"entr'embrassions", -"entr'embrassons", +"Entre-Deux", +"Entre-deux-Eaux", +"Entre-deux-Guiers", +"Entre-deux-Monts", "Entremont-le-Vieux", -"entr'empêcha", -"entr'empêchaient", -"entr'empêchait", -"entr'empêchâmes", -"entr'empêchant", -"entr'empêchassent", -"entr'empêchassiez", -"entr'empêchassions", -"entr'empêchât", -"entr'empêchâtes", -"entr'empêche", -"entr'empêché", -"entr'empêchées", -"entr'empêchent", -"entr'empêcher", -"entr'empêcher", -"entr'empêchera", -"entr'empêcheraient", -"entr'empêcherait", -"entr'empêchèrent", -"entr'empêcherez", -"entr'empêcheriez", -"entr'empêcherions", -"entr'empêcherons", -"entr'empêcheront", -"entr'empêchés", -"entr'empêchez", -"entr'empêchiez", -"entr'empêchions", -"entr'empêchons", -"entr'encourage", -"entr'encouragé", -"entr'encouragea", -"entr'encourageaient", -"entr'encourageait", -"entr'encourageâmes", -"entr'encourageant", -"entr'encourageassent", -"entr'encourageassiez", -"entr'encourageassions", -"entr'encourageât", -"entr'encourageâtes", -"entr'encouragées", -"entr'encouragent", -"entr'encourageons", -"entr'encourager", -"entr'encourager", -"entr'encouragera", -"entr'encourageraient", -"entr'encouragerait", -"entr'encouragèrent", -"entr'encouragerez", -"entr'encourageriez", -"entr'encouragerions", -"entr'encouragerons", -"entr'encourageront", -"entr'encouragés", -"entr'encouragez", -"entr'encouragiez", -"entr'encouragions", -"entr'enleva", -"entr'enlevaient", -"entr'enlevait", -"entr'enlevâmes", -"entr'enlevant", -"entr'enlevassent", -"entr'enlevassiez", -"entr'enlevassions", -"entr'enlevât", -"entr'enlevâtes", -"entr'enlève", -"entr'enlevé", -"entr'enlevées", -"entr'enlèvent", -"entr'enlever", -"entr'enlever", -"entr'enlèvera", -"entr'enlèveraient", -"entr'enlèverait", -"entr'enlevèrent", -"entr'enlèverez", -"entr'enlèveriez", -"entr'enlèverions", -"entr'enlèverons", -"entr'enlèveront", -"entr'enlevés", -"entr'enlevez", -"entr'enleviez", -"entr'enlevions", -"entr'enlevons", -"entr'entend", -"entr'entendaient", -"entr'entendait", -"entr'entendant", -"entr'entende", -"entr'entendent", -"entr'entendez", -"entr'entendiez", -"entr'entendîmes", -"entr'entendions", -"entr'entendirent", -"entr'entendissent", -"entr'entendissiez", -"entr'entendissions", -"entr'entendit", -"entr'entendît", -"entr'entendîtes", -"entr'entendons", -"entr'entendra", -"entr'entendraient", -"entr'entendrait", -"entr'entendre", -"entr'entendre", -"entr'entendrez", -"entr'entendriez", -"entr'entendrions", -"entr'entendrons", -"entr'entendront", -"entr'entendu", -"entr'entendue", -"entr'entendues", -"entr'entendus", -"entr'enverra", -"entr'enverrai", -"entr'enverraient", -"entr'enverrais", -"entr'enverrait", -"entr'enverras", -"entr'enverrez", -"entr'enverriez", -"entr'enverrions", -"entr'enverrons", -"entr'enverront", -"entr'envoie", -"entr'envoient", -"entr'envoies", -"entr'envoya", -"entr'envoyai", -"entr'envoyaient", -"entr'envoyais", -"entr'envoyait", -"entr'envoyâmes", -"entr'envoyant", -"entr'envoyas", -"entr'envoyasse", -"entr'envoyassent", -"entr'envoyasses", -"entr'envoyassiez", -"entr'envoyassions", -"entr'envoyât", -"entr'envoyâtes", -"entr'envoyé", -"entr'envoyée", -"entr'envoyées", -"entr'envoyer", -"entr'envoyer", -"entr'envoyèrent", -"entr'envoyés", -"entr'envoyez", -"entr'envoyiez", -"entr'envoyions", -"entr'envoyons", -"entr'épia", -"entr'épiaient", -"entr'épiait", -"entr'épiâmes", -"entr'épiant", -"entr'épiassent", -"entr'épiassiez", -"entr'épiassions", -"entr'épiât", -"entr'épiâtes", -"entr'épie", -"entr'épié", -"entr'épiées", -"entr'épient", -"entr'épier", -"entr'épier", -"entr'épiera", -"entr'épieraient", -"entr'épierait", -"entr'épièrent", -"entr'épierez", -"entr'épieriez", -"entr'épierions", -"entr'épierons", -"entr'épieront", -"entr'épiés", -"entr'épiez", -"entr'épiiez", -"entr'épiions", -"entr'épions", -"entr'éprouva", -"entr'éprouvaient", -"entr'éprouvait", -"entr'éprouvâmes", -"entr'éprouvant", -"entr'éprouvassent", -"entr'éprouvassiez", -"entr'éprouvassions", -"entr'éprouvât", -"entr'éprouvâtes", -"entr'éprouve", -"entr'éprouvé", -"entr'éprouvées", -"entr'éprouvent", -"entr'éprouver", -"entr'éprouver", -"entr'éprouvera", -"entr'éprouveraient", -"entr'éprouverait", -"entr'éprouvèrent", -"entr'éprouverez", -"entr'éprouveriez", -"entr'éprouverions", -"entr'éprouverons", -"entr'éprouveront", -"entr'éprouvés", -"entr'éprouvez", -"entr'éprouviez", -"entr'éprouvions", -"entr'éprouvons", -"entrer-coucher", -"entr'escroqua", -"entr'escroquaient", -"entr'escroquait", -"entr'escroquâmes", -"entr'escroquant", -"entr'escroquassent", -"entr'escroquassiez", -"entr'escroquassions", -"entr'escroquât", -"entr'escroquâtes", -"entr'escroque", -"entr'escroqué", -"entr'escroquées", -"entr'escroquent", -"entr'escroquer", -"entr'escroquer", -"entr'escroquera", -"entr'escroqueraient", -"entr'escroquerait", -"entr'escroquèrent", -"entr'escroquerez", -"entr'escroqueriez", -"entr'escroquerions", -"entr'escroquerons", -"entr'escroqueront", -"entr'escroqués", -"entr'escroquez", -"entr'escroquiez", -"entr'escroquions", -"entr'escroquons", -"entr'étouffa", -"entr'étouffaient", -"entr'étouffait", -"entr'étouffâmes", -"entr'étouffant", -"entr'étouffassent", -"entr'étouffassiez", -"entr'étouffassions", -"entr'étouffât", -"entr'étouffâtes", -"entr'étouffe", -"entr'étouffé", -"entr'étouffées", -"entr'étouffent", -"entr'étouffer", -"entr'étouffer", -"entr'étouffera", -"entr'étoufferaient", -"entr'étoufferait", -"entr'étouffèrent", -"entr'étoufferez", -"entr'étoufferiez", -"entr'étoufferions", -"entr'étoufferons", -"entr'étoufferont", -"entr'étouffés", -"entr'étouffez", -"entr'étouffiez", -"entr'étouffions", -"entr'étouffons", -"entr'étripa", -"entr'étripaient", -"entr'étripait", -"entr'étripâmes", -"entr'étripant", -"entr'étripassent", -"entr'étripassiez", -"entr'étripassions", -"entr'étripât", -"entr'étripâtes", -"entr'étripe", -"entr'étripé", -"entr'étripées", -"entr'étripent", -"entr'étriper", -"entr'étriper", -"entr'étripera", -"entr'étriperaient", -"entr'étriperait", -"entr'étripèrent", -"entr'étriperez", -"entr'étriperiez", -"entr'étriperions", -"entr'étriperons", -"entr'étriperont", -"entr'étripés", -"entr'étripez", -"entr'étripiez", -"entr'étripions", -"entr'étripons", -"entr'eux", -"entr'éveilla", -"entr'éveillaient", -"entr'éveillait", -"entr'éveillâmes", -"entr'éveillant", -"entr'éveillassent", -"entr'éveillassiez", -"entr'éveillassions", -"entr'éveillât", -"entr'éveillâtes", -"entr'éveille", -"entr'éveillé", -"entr'éveillées", -"entr'éveillent", -"entr'éveiller", -"entr'éveiller", -"entr'éveillera", -"entr'éveilleraient", -"entr'éveillerait", -"entr'éveillèrent", -"entr'éveillerez", -"entr'éveilleriez", -"entr'éveillerions", -"entr'éveillerons", -"entr'éveilleront", -"entr'éveillés", -"entr'éveillez", -"entr'éveilliez", -"entr'éveillions", -"entr'éveillons", -"entr'excita", -"entr'excitaient", -"entr'excitait", -"entr'excitâmes", -"entr'excitant", -"entr'excitassent", -"entr'excitassiez", -"entr'excitassions", -"entr'excitât", -"entr'excitâtes", -"entr'excite", -"entr'excité", -"entr'excitées", -"entr'excitent", -"entr'exciter", -"entr'exciter", -"entr'excitera", -"entr'exciteraient", -"entr'exciterait", -"entr'excitèrent", -"entr'exciterez", -"entr'exciteriez", -"entr'exciterions", -"entr'exciterons", -"entr'exciteront", -"entr'excités", -"entr'excitez", -"entr'excitiez", -"entr'excitions", -"entr'excitons", -"entr'exhorta", -"entr'exhortaient", -"entr'exhortait", -"entr'exhortâmes", -"entr'exhortant", -"entr'exhortassent", -"entr'exhortassiez", -"entr'exhortassions", -"entr'exhortât", -"entr'exhortâtes", -"entr'exhorte", -"entr'exhorté", -"entr'exhortées", -"entr'exhortent", -"entr'exhorter", -"entr'exhorter", -"entr'exhortera", -"entr'exhorteraient", -"entr'exhorterait", -"entr'exhortèrent", -"entr'exhorterez", -"entr'exhorteriez", -"entr'exhorterions", -"entr'exhorterons", -"entr'exhorteront", -"entr'exhortés", -"entr'exhortez", -"entr'exhortiez", -"entr'exhortions", -"entr'exhortons", -"entr'hiver", -"entr'hiverna", -"entr'hivernai", -"entr'hivernaient", -"entr'hivernais", -"entr'hivernait", -"entr'hivernâmes", -"entr'hivernant", -"entr'hivernas", -"entr'hivernasse", -"entr'hivernassent", -"entr'hivernasses", -"entr'hivernassiez", -"entr'hivernassions", -"entr'hivernât", -"entr'hivernâtes", -"entr'hiverne", -"entr'hiverné", -"entr'hivernée", -"entr'hivernées", -"entr'hivernent", -"entr'hiverner", -"entr'hivernera", -"entr'hivernerai", -"entr'hiverneraient", -"entr'hivernerais", -"entr'hivernerait", -"entr'hiverneras", -"entr'hivernèrent", -"entr'hivernerez", -"entr'hiverneriez", -"entr'hivernerions", -"entr'hivernerons", -"entr'hiverneront", -"entr'hivernes", -"entr'hivernés", -"entr'hivernez", -"entr'hiverniez", -"entr'hivernions", -"entr'hivernons", -"entr'honora", -"entr'honoraient", -"entr'honorait", -"entr'honorâmes", -"entr'honorant", -"entr'honorassent", -"entr'honorassiez", -"entr'honorassions", -"entr'honorât", -"entr'honorâtes", -"entr'honore", -"entr'honoré", -"entr'honorées", -"entr'honorent", -"entr'honorer", -"entr'honorer", -"entr'honorera", -"entr'honoreraient", -"entr'honorerait", -"entr'honorèrent", -"entr'honorerez", -"entr'honoreriez", -"entr'honorerions", -"entr'honorerons", -"entr'honoreront", -"entr'honorés", -"entr'honorez", -"entr'honoriez", -"entr'honorions", -"entr'honorons", -"entr'immola", -"entr'immolaient", -"entr'immolait", -"entr'immolâmes", -"entr'immolant", -"entr'immolassent", -"entr'immolassiez", -"entr'immolassions", -"entr'immolât", -"entr'immolâtes", -"entr'immole", -"entr'immolé", -"entr'immolées", -"entr'immolent", -"entr'immoler", -"entr'immoler", -"entr'immolera", -"entr'immoleraient", -"entr'immolerait", -"entr'immolèrent", -"entr'immolerez", -"entr'immoleriez", -"entr'immolerions", -"entr'immolerons", -"entr'immoleront", -"entr'immolés", -"entr'immolez", -"entr'immoliez", -"entr'immolions", -"entr'immolons", -"entr'incommoda", -"entr'incommodaient", -"entr'incommodait", -"entr'incommodâmes", -"entr'incommodant", -"entr'incommodassent", -"entr'incommodassiez", -"entr'incommodassions", -"entr'incommodât", -"entr'incommodâtes", -"entr'incommode", -"entr'incommodé", -"entr'incommodées", -"entr'incommodent", -"entr'incommoder", -"entr'incommoder", -"entr'incommodera", -"entr'incommoderaient", -"entr'incommoderait", -"entr'incommodèrent", -"entr'incommoderez", -"entr'incommoderiez", -"entr'incommoderions", -"entr'incommoderons", -"entr'incommoderont", -"entr'incommodés", -"entr'incommodez", -"entr'incommodiez", -"entr'incommodions", -"entr'incommodons", -"entr'injuria", -"entr'injuriaient", -"entr'injuriait", -"entr'injuriâmes", -"entr'injuriant", -"entr'injuriassent", -"entr'injuriassiez", -"entr'injuriassions", -"entr'injuriât", -"entr'injuriâtes", -"entr'injurie", -"entr'injurié", -"entr'injuriées", -"entr'injurient", -"entr'injurier", -"entr'injurier", -"entr'injuriera", -"entr'injurieraient", -"entr'injurierait", -"entr'injurièrent", -"entr'injurierez", -"entr'injurieriez", -"entr'injurierions", -"entr'injurierons", -"entr'injurieront", -"entr'injuriés", -"entr'injuriez", -"entr'injuriiez", -"entr'injuriions", -"entr'injurions", -"entr'instruira", -"entr'instruiraient", -"entr'instruirait", -"entr'instruire", -"entr'instruire", -"entr'instruirez", -"entr'instruiriez", -"entr'instruirions", -"entr'instruirons", -"entr'instruiront", -"entr'instruisaient", -"entr'instruisait", -"entr'instruisant", -"entr'instruise", -"entr'instruisent", -"entr'instruisez", -"entr'instruisiez", -"entr'instruisîmes", -"entr'instruisions", -"entr'instruisirent", -"entr'instruisissent", -"entr'instruisissions", -"entr'instruisit", -"entr'instruisît", -"entr'instruisîtes", -"entr'instruisons", -"entr'instruit", -"entr'instruite", -"entr'instruites", -"entr'instruits", -"entr'oblige", -"entr'obligé", -"entr'obligea", -"entr'obligeaient", -"entr'obligeait", -"entr'obligeâmes", -"entr'obligeant", -"entr'obligeassent", -"entr'obligeassiez", -"entr'obligeassions", -"entr'obligeât", -"entr'obligeâtes", -"entr'obligées", -"entr'obligent", -"entr'obligeons", -"entr'obliger", -"entr'obliger", -"entr'obligera", -"entr'obligeraient", -"entr'obligerait", -"entr'obligèrent", -"entr'obligerez", -"entr'obligeriez", -"entr'obligerions", -"entr'obligerons", -"entr'obligeront", -"entr'obligés", -"entr'obligez", -"entr'obligiez", -"entr'obligions", -"entr'offensa", -"entr'offensaient", -"entr'offensait", -"entr'offensâmes", -"entr'offensant", -"entr'offensassent", -"entr'offensassiez", -"entr'offensassions", -"entr'offensât", -"entr'offensâtes", -"entr'offense", -"entr'offensé", -"entr'offensées", -"entr'offensent", -"entr'offenser", -"entr'offenser", -"entr'offensera", -"entr'offenseraient", -"entr'offenserait", -"entr'offensèrent", -"entr'offenserez", -"entr'offenseriez", -"entr'offenserions", -"entr'offenserons", -"entr'offenseront", -"entr'offensés", -"entr'offensez", -"entr'offensiez", -"entr'offensions", -"entr'offensons", -"entr'oie", -"entr'oient", -"entr'oies", -"entr'ois", -"entr'oit", -"entr'ombrage", -"entr'ombragé", -"entr'ombragea", -"entr'ombrageaient", -"entr'ombrageait", -"entr'ombrageâmes", -"entr'ombrageant", -"entr'ombrageassent", -"entr'ombrageassiez", -"entr'ombrageassions", -"entr'ombrageât", -"entr'ombrageâtes", -"entr'ombragées", -"entr'ombragent", -"entr'ombrageons", -"entr'ombrager", -"entr'ombrager", -"entr'ombragera", -"entr'ombrageraient", -"entr'ombragerait", -"entr'ombragèrent", -"entr'ombragerez", -"entr'ombrageriez", -"entr'ombragerions", -"entr'ombragerons", -"entr'ombrageront", -"entr'ombragés", -"entr'ombragez", -"entr'ombragiez", -"entr'ombragions", -"entr'opercule", -"entr'orraient", -"entr'orrais", -"entr'orrait", -"entr'orriez", -"entr'orrions", -"entr'oublia", -"entr'oubliaient", -"entr'oubliait", -"entr'oubliâmes", -"entr'oubliant", -"entr'oubliassent", -"entr'oubliassiez", -"entr'oubliassions", -"entr'oubliât", -"entr'oubliâtes", -"entr'oublie", -"entr'oublié", -"entr'oubliées", -"entr'oublient", -"entr'oublier", -"entr'oublier", -"entr'oubliera", -"entr'oublieraient", -"entr'oublierait", -"entr'oublièrent", -"entr'oublierez", -"entr'oublieriez", -"entr'oublierions", -"entr'oublierons", -"entr'oublieront", -"entr'oubliés", -"entr'oubliez", -"entr'oubliiez", -"entr'oubliions", -"entr'oublions", -"entr'ouï", -"entr'ouïe", -"entr'ouïes", -"entr'ouïmes", -"entr'ouïr", -"entr'ouïra", -"entr'ouïrai", -"entr'ouïraient", -"entr'ouïrais", -"entr'ouïrait", -"entr'ouïras", -"entr'ouïrent", -"entr'ouïrez", -"entr'ouïriez", -"entr'ouïrions", -"entr'ouïrons", -"entr'ouïront", -"entr'ouïs", -"entr'ouïsse", -"entr'ouïssent", -"entr'ouïsses", -"entr'ouïssiez", -"entr'ouïssions", -"entr'ouït", -"entr'ouïtes", -"entr'outrage", -"entr'outragé", -"entr'outragea", -"entr'outrageaient", -"entr'outrageait", -"entr'outrageâmes", -"entr'outrageant", -"entr'outrageassent", -"entr'outrageassiez", -"entr'outrageassions", -"entr'outrageât", -"entr'outrageâtes", -"entr'outragées", -"entr'outragent", -"entr'outrageons", -"entr'outrager", -"entr'outrager", -"entr'outragera", -"entr'outrageraient", -"entr'outragerait", -"entr'outragèrent", -"entr'outragerez", -"entr'outrageriez", -"entr'outragerions", -"entr'outragerons", -"entr'outrageront", -"entr'outragés", -"entr'outragez", -"entr'outragiez", -"entr'outragions", -"entr'ouvert", -"entr'ouverte", -"entr'ouvertes", -"entr'ouverts", -"entr'ouverture", -"entr'ouvraient", -"entr'ouvrais", -"entr'ouvrait", -"entr'ouvrant", -"entr'ouvre", -"entr'ouvrent", -"entr'ouvres", -"entr'ouvrez", -"entr'ouvriez", -"entr'ouvrîmes", -"entr'ouvrions", -"entr'ouvrir", -"entr'ouvrir", -"entr'ouvrira", -"entr'ouvrirai", -"entr'ouvriraient", -"entr'ouvrirais", -"entr'ouvrirait", -"entr'ouvriras", -"entr'ouvrirent", -"entr'ouvrirez", -"entr'ouvririez", -"entr'ouvririons", -"entr'ouvrirons", -"entr'ouvriront", -"entr'ouvris", -"entr'ouvrisse", -"entr'ouvrissent", -"entr'ouvrisses", -"entr'ouvrissiez", -"entr'ouvrissions", -"entr'ouvrit", -"entr'ouvrît", -"entr'ouvrîtes", -"entr'ouvrons", -"entr'oyaient", -"entr'oyais", -"entr'oyait", -"entr'oyant", -"entr'oyez", -"entr'oyiez", -"entr'oyions", -"entr'oyons", -"entr'usa", -"entr'usaient", -"entr'usait", -"entr'usâmes", -"entr'usant", -"entr'usassent", -"entr'usassiez", -"entr'usassions", -"entr'usât", -"entr'usâtes", -"entr'use", -"entr'usé", -"entr'usées", -"entr'usent", -"entr'user", -"entr'user", -"entr'usera", -"entr'useraient", -"entr'userait", -"entr'usèrent", -"entr'userez", -"entr'useriez", -"entr'userions", -"entr'userons", -"entr'useront", -"entr'usés", -"entr'usez", -"entr'usiez", -"entr'usions", -"entr'usons", -"Éole-en-Beauce", -"éoli-harpe", +"Eole-en-Beauce", "Epagne-Epagnette", -"Épagne-Épagnette", -"épargne-logement", -"épaulé-jeté", -"épaulés-jetés", +"Epagny Metz-Tessy", "Epaux-Bézu", -"Épaux-Bézu", "Epeigné-les-Bois", -"Épeigné-les-Bois", "Epeigné-sur-Dême", -"Épeigné-sur-Dême", "Epercieux-Saint-Paul", -"Épercieux-Saint-Paul", "Epernay-sous-Gevrey", -"Épernay-sous-Gevrey", -"Epiais-lès-Louvres", -"Épiais-lès-Louvres", -"Epiais-Rhus", -"Épiais-Rhus", "Epi-Contois", -"épi-contois", -"Épi-Contois", "Epi-Contoise", -"épi-contoise", -"Épi-Contoise", "Epi-Contoises", -"épi-contoises", -"Épi-Contoises", -"épidote-gris", +"Epiais-Rhus", +"Epiais-lès-Louvres", "Epieds-en-Beauce", -"Épieds-en-Beauce", "Epiez-sur-Chiers", -"Épiez-sur-Chiers", "Epiez-sur-Meuse", -"Épiez-sur-Meuse", -"Épinac-les-Mines", -"épinard-fraise", "Epinay-Champlâtreux", -"Épinay-Champlâtreux", "Epinay-le-Comte", -"Épinay-le-Comte", "Epinay-sous-Sénart", -"Épinay-sous-Sénart", "Epinay-sur-Duclair", -"Épinay-sur-Duclair", "Epinay-sur-Odon", -"Épinay-sur-Odon", "Epinay-sur-Orge", -"Épinay-sur-Orge", "Epinay-sur-Seine", -"Épinay-sur-Seine", -"Epineau-les-Voves", -"Épineau-les-Voves", "Epine-aux-Bois", -"Épine-aux-Bois", -"épine-du-Christ", -"épine-fleurie", -"épines-vinettes", -"Epineuil-le-Fleuriel", -"Épineuil-le-Fleuriel", +"Epineau-les-Voves", "Epineu-le-Chevreuil", -"Épineu-le-Chevreuil", +"Epineuil-le-Fleuriel", "Epineux-le-Seguin", -"Épineux-le-Seguin", -"épine-vinette", -"épiplo-entérocèle", -"épiplo-ischiocèle", -"épiplo-mérocèle", -"épluche-légume", -"épluche-légumes", -"Eppenberg-Wöschnau", "Eppe-Sauvage", +"Eppenberg-Wöschnau", "Epreville-en-Lieuvin", -"Épreville-en-Lieuvin", "Epreville-en-Roumois", -"Épreville-en-Roumois", "Epreville-près-le-Neubourg", -"Épreville-près-le-Neubourg", -"e-procurement", -"e-procurements", -"ep's", -"épuises-volantes", -"épuise-volante", -"équato-guinéen", -"équato-guinéenne", -"équato-guinéennes", -"équato-guinéens", -"Équatoria-Central", -"Équatoria-Occidental", -"Équatoria-Oriental", "Equennes-Eramecourt", -"Équennes-Éramecourt", "Equeurdreville-Hainneville", -"Équeurdreville-Hainneville", "Equihen-Plage", -"Équihen-Plage", "Eragny-sur-Epte", -"Éragny-sur-Epte", -"Éragny-sur-Oise", "Erbes-Büdesheim", "Erbéviller-sur-Amezule", "Ercé-en-Lamée", "Ercé-près-Liffré", "Erdre-en-Anjou", -"e-reader", -"e-readers", -"e-réputation", -"e-réputations", -"e-réservation", -"e-réservations", "Ergué-Armel", "Ergué-Gabéric", -"Erize-la-Brûlée", -"Érize-la-Brûlée", -"Érize-la-Grande", -"Erize-la-Petite", -"Érize-la-Petite", "Erize-Saint-Dizier", -"Érize-Saint-Dizier", +"Erize-la-Brûlée", +"Erize-la-Petite", "Erlangen-Höchstadt", "Erlbach-Kirchberg", "Ermenonville-la-Grande", @@ -9853,20 +4351,19 @@ FR_BASE_EXCEPTIONS = [ "Ernemont-sur-Buchy", "Erneville-aux-Bois", "Ernolsheim-Bruche", -"Ernolsheim-lès-Saverne", "Ernolsheim-Saverne", +"Ernolsheim-lès-Saverne", "Erny-Saint-Julien", "Erpe-Mere", "Erps-Kwerps", -"Erquinghem-le-Sec", "Erquinghem-Lys", +"Erquinghem-le-Sec", "Ervy-le-Châtel", -"e-santé", "Esboz-Brest", -"Eschbach-au-Val", -"Eschêne-Autrage", "Esch-sur-Alzette", "Esch-sur-Sûre", +"Eschbach-au-Val", +"Eschêne-Autrage", "Esclassan-Labastide", "Esclavolles-Lurey", "Escles-Saint-Pierre", @@ -9876,59 +4373,35 @@ FR_BASE_EXCEPTIONS = [ "Escry-le-Franc", "Escueillens-et-Saint-Just-de-Bélengard", "Escures-sur-Favières", -"eskimau-aléoute", -"eskimo-aléoute", -"eskimo-aléoutes", "Eslourenties-Daban", "Esmery-Hallon", "Esnes-en-Argonne", -"éso-narthex", -"espace-boutique", -"espaces-temps", -"espaces-ventes", -"espace-temps", -"espace-vente", -"espadon-voilier", "Espagnac-Sainte-Eulalie", "Espaly-Saint-Marcel", "Esparron-de-Verdon", "Esparron-la-Bâtie", -"Espès-Undurein", "Espierres-Helchin", "Espinasse-Vozelle", "Espira-de-Conflent", "Espira-de-l'Agly", "Esplantas-Vazeilles", "Esplas-de-Sérou", -"e-sport", -"e-sportif", -"e-sportifs", -"e-sports", -"esprit-de-bois", -"esprit-de-sel", -"esprit-de-vin", -"esprit-fort", "Esprit-Saint", -"esprits-forts", +"Espès-Undurein", "Esquay-Notre-Dame", "Esquay-sur-Seulles", "Esquièze-Sère", -"esquimau-aléoute", -"esquimo-aléoute", "Essche-Saint-Liévin", +"Essert-Pittet", +"Essert-Romanais", +"Essert-Romanaise", +"Essert-Romanaises", +"Essert-Romand", "Essertenne-et-Cecey", "Essertines-en-Châtelneuf", "Essertines-en-Donzy", "Essertines-sur-Rolle", "Essertines-sur-Yverdon", -"Essert-Pittet", -"essert-romanais", -"Essert-Romanais", -"essert-romanaise", -"Essert-Romanaise", -"essert-romanaises", -"Essert-Romanaises", -"Essert-Romand", "Esserts-Blay", "Esserts-Salève", "Esserval-Combe", @@ -9936,286 +4409,73 @@ FR_BASE_EXCEPTIONS = [ "Essey-et-Maizerais", "Essey-la-Côte", "Essey-les-Eaux", -"Essey-lès-Nancy", "Essey-les-Ponts", +"Essey-lès-Nancy", "Essigny-le-Grand", "Essigny-le-Petit", -"Eßleben-Teutleben", "Essômes-sur-Marne", -"essuie-glace", -"essuie-glaces", -"essuie-main", -"essuie-mains", -"essuie-meuble", -"essuie-meubles", -"essuie-phare", -"essuie-phares", -"essuie-pied", -"essuie-pieds", -"essuie-plume", -"essuie-plumes", -"essuie-tout", -"essuie-touts", -"essuie-verre", -"essuie-verres", "Estavayer-le-Lac", "Estinnes-au-Mont", "Estinnes-au-Val", "Estouteville-Ecalles", "Estouteville-Écalles", "Estrée-Blanche", -"estrée-blanchois", "Estrée-Blanchois", -"estrée-blanchoise", "Estrée-Blanchoise", -"estrée-blanchoises", "Estrée-Blanchoises", -"estrée-cauchois", "Estrée-Cauchois", -"estrée-cauchoise", "Estrée-Cauchoise", -"estrée-cauchoises", "Estrée-Cauchoises", "Estrée-Cauchy", +"Estrée-Wamin", +"Estrée-Waminois", +"Estrée-Waminoise", +"Estrée-Waminoises", "Estrées-Deniécourt", +"Estrées-Mons", +"Estrées-Saint-Denis", "Estrées-en-Chaussée", "Estrées-la-Campagne", "Estrées-lès-Crécy", -"Estrées-Mons", -"Estrées-Saint-Denis", "Estrées-sur-Noye", -"Estrée-Wamin", -"estrée-waminois", -"Estrée-Waminois", -"estrée-waminoise", -"Estrée-Waminoise", -"estrée-waminoises", -"Estrée-Waminoises", "Esves-le-Moutier", "Etables-sur-Mer", -"Étables-sur-Mer", "Etais-la-Sauvin", -"Étais-la-Sauvin", -"étalon-or", "Etampes-sur-Marne", -"Étampes-sur-Marne", "Etang-Bertrand", -"Étang-Bertrand", -"Etang-la-Ville", -"Étang-la-Ville", "Etang-Salé", -"Étang-Salé", "Etang-Saléen", -"étang-saléen", -"Étang-Saléen", "Etang-Saléenne", -"étang-saléenne", -"Étang-Saléenne", "Etang-Saléennes", -"étang-saléennes", -"Étang-Saléennes", "Etang-Saléens", -"étang-saléens", -"Étang-Saléens", -"Etang-sur-Arroux", -"Étang-sur-Arroux", "Etang-Vergy", -"Étang-Vergy", -"état-limite", -"état-major", -"État-major", -"État-Major", -"État-nation", -"État-nounou", -"État-providence", -"états-civils", -"états-généraux", -"États-Généraux", -"états-limites", -"états-majors", -"États-majors", -"États-Majors", -"états-nations", -"États-nations", -"États-nounous", -"États-providence", -"états-unianisa", -"états-unianisai", -"états-unianisaient", -"états-unianisais", -"états-unianisait", -"états-unianisâmes", -"états-unianisant", -"états-unianisas", -"états-unianisasse", -"états-unianisassent", -"états-unianisasses", -"états-unianisassiez", -"états-unianisassions", -"états-unianisât", -"états-unianisâtes", -"états-unianise", -"états-unianisé", -"états-unianisée", -"états-unianisées", -"états-unianisent", -"états-unianiser", -"états-unianisera", -"états-unianiserai", -"états-unianiseraient", -"états-unianiserais", -"états-unianiserait", -"états-unianiseras", -"états-unianisèrent", -"états-unianiserez", -"états-unianiseriez", -"états-unianiserions", -"états-unianiserons", -"états-unianiseront", -"états-unianises", -"états-unianisés", -"états-unianisez", -"états-unianisiez", -"états-unianisions", -"états-unianisons", -"états-unien", -"États-Unien", -"états-unienne", -"États-Unienne", -"états-uniennes", -"États-Uniennes", -"états-uniens", -"États-Uniens", +"Etang-la-Ville", +"Etang-sur-Arroux", "Etats-Unis", -"États-Unis", -"étau-limeur", -"étaux-limeurs", "Etaves-et-Bocquiaux", -"Étaves-et-Bocquiaux", -"éthane-1,2-diol", -"éthéro-chloroforme", -"ethnico-religieux", -"éthyl-benzène", -"e-ticket", -"e-tickets", -"Étinehem-Méricourt", "Etival-Clairefontaine", -"Étival-Clairefontaine", "Etival-lès-le-Mans", -"Étival-lès-le-Mans", "Etoile-Saint-Cyrice", -"Étoile-Saint-Cyrice", "Etoile-sur-Rhône", -"Étoile-sur-Rhône", -"étouffe-chrétien", -"étouffe-chrétiens", -"e-tourisme", -"étrangle-chat", -"étrangle-chien", -"étrangle-loup", -"étrangle-loups", -"être-en-soi", -"être-là", "Etrelles-et-la-Montbleuse", -"Étrelles-et-la-Montbleuse", "Etrelles-sur-Aube", -"Étrelles-sur-Aube", -"êtres-en-soi", "Etricourt-Manancourt", -"Étricourt-Manancourt", "Etricourt-Manancourtois", -"étricourt-manancourtois", -"Étricourt-Manancourtois", "Etricourt-Manancourtoise", -"étricourt-manancourtoise", -"Étricourt-Manancourtoise", "Etricourt-Manancourtoises", -"étricourt-manancourtoises", -"Étricourt-Manancourtoises", "Etten-Leur", -"Étueffont-Bas", "Etxarri-Aranatz", "Eugénie-les-Bains", "Euilly-et-Lombut", "Eure-et-Loir", -"euro-africain", -"euro-africaines", "Euro-Afrique", -"euro-asiatique", -"euro-asiatiques", -"euro-bashing", -"euro-manifestation", -"euro-manifestations", -"euro-obligation", -"euro-obligations", "Eurville-Bienville", -"eusses-tu-cru", -"eux-mêmes", "Evaux-et-Ménil", -"Évaux-et-Ménil", "Evaux-les-Bains", -"Évaux-les-Bains", "Evette-Salbert", -"Évette-Salbert", "Evian-les-Bains", -"Évian-les-Bains", "Evin-Malmaison", -"Évin-Malmaison", "Evry-Grégy-sur-Yerre", -"Évry-Grégy-sur-Yerre", -"Évry-Petit-Bourg", -"exa-ampère", -"exa-ampères", -"exa-électron-volt", -"exaélectron-volt", -"exa-électron-volts", -"exaélectron-volts", -"ex-aequo", -"ex-æquo", -"ex-ante", -"exa-octet", -"exa-octets", -"ex-champions", -"excito-nervin", -"excito-nervine", -"excito-nervines", -"excito-nervins", -"ex-copains", -"excusez-moi", -"ex-député", -"ex-députée", -"ex-députées", -"ex-députés", -"ex-femme", -"ex-femmes", -"ex-fumeur", -"ex-fumeurs", -"ex-libris", -"ex-mari", -"ex-maris", -"exo-noyau", -"exo-noyaux", -"expert-comptable", -"ex-petits", -"ex-présidents", -"ex-sacs", -"ex-sergents", -"ex-serviteurs", -"ex-soldats", -"ex-strip-teaseuse", -"extracto-chargeur", -"extracto-chargeurs", -"extracto-résine", -"extracto-résineux", -"extrêmes-droites", -"extrêmes-gauches", -"extrêmes-onctions", -"extro-déterminé", -"ex-voto", -"ex-votos", -"ex-Zaïre", -"eye-liner", -"eye-liners", "Eygluy-Escoulin", "Eygurande-et-Gardedeuil", "Eyres-Moncube", @@ -10223,98 +4483,24 @@ FR_BASE_EXCEPTIONS = [ "Eyzin-Pinet", "Ezkio-Itsaso", "Ezy-sur-Eure", -"Ézy-sur-Eure", -"face-à-face", -"face-à-main", -"face-B", -"face-kini", -"face-kinis", -"faces-à-main", -"faces-B", -"face-sitting", -"face-sittings", +"Eßleben-Teutleben", "Faches-Thumesnil", -"faches-thumesnilois", "Faches-Thumesnilois", -"faches-thumesniloise", "Faches-Thumesniloise", -"faches-thumesniloises", "Faches-Thumesniloises", -"fac-simila", -"fac-similai", -"fac-similaient", -"fac-similaire", -"fac-similais", -"fac-similait", -"fac-similâmes", -"fac-similant", -"fac-similas", -"fac-similasse", -"fac-similassent", -"fac-similasses", -"fac-similassiez", -"fac-similassions", -"fac-similât", -"fac-similâtes", -"fac-simile", -"fac-similé", -"fac-similée", -"fac-similées", -"fac-similent", -"fac-similer", -"fac-similera", -"fac-similerai", -"fac-simileraient", -"fac-similerais", -"fac-similerait", -"fac-simileras", -"fac-similèrent", -"fac-similerez", -"fac-simileriez", -"fac-similerions", -"fac-similerons", -"fac-simileront", -"fac-similes", -"fac-similés", -"fac-similez", -"fac-similiez", -"fac-similions", -"fac-similons", "Faget-Abbatial", "Fahy-lès-Autrey", -"faim-valle", "Fain-lès-Montbard", "Fain-lès-Moutiers", -"Fains-la-Folie", "Fains-Véel", -"faire-part", -"faire-savoir", -"faire-valoir", -"fair-play", -"fair-plays", -"fait-à-fait", -"fait-divers", -"fait-diversier", -"fait-diversiers", -"fait-main", -"faits-divers", -"faits-diversier", -"faits-diversiers", -"fait-tout", +"Fains-la-Folie", "Fajac-en-Val", "Fajac-la-Relenque", "Falkenberg-sur-Elster", -"fan-club", -"fan-clubs", -"fancy-fair", -"fancy-fairs", -"farcy-pontain", +"Far-West", "Farcy-Pontain", -"farcy-pontaine", "Farcy-Pontaine", -"farcy-pontaines", "Farcy-Pontaines", -"farcy-pontains", "Farcy-Pontains", "Fargau-Pratjau", "Farges-Allichamps", @@ -10323,341 +4509,134 @@ FR_BASE_EXCEPTIONS = [ "Farges-lès-Mâcon", "Fargues-Saint-Hilaire", "Fargues-sur-Ourbise", -"Far-West", -"fast-food", -"fast-foods", "Fatouville-Grestain", "Fatu-Hiva", +"Fau-de-Peyre", "Faucogney-et-la-Mer", "Faucon-de-Barcelonnette", "Faucon-du-Caire", -"Fau-de-Peyre", "Faulx-les-Tombes", "Fauquemont-sur-Gueule", -"fausse-braie", -"fausse-couche", -"fausse-limande", -"fausse-monnayeuse", -"fausse-porte", -"fausses-braies", -"fausses-couches", -"fausses-monnayeuses", "Fauville-en-Caux", -"faux-acacia", -"faux-acacias", -"faux-ami", -"faux-amis", -"faux-bourdon", -"faux-bourdons", -"faux-bras", -"faux-carré", -"faux-carrés", -"faux-champlevé", -"faux-col", -"faux-cols", -"faux-cul", -"faux-derche", -"faux-derches", -"faux-filet", -"faux-filets", -"faux-frais", -"faux-frère", -"faux-frères", "Faux-Fresnay", -"faux-fruit", -"faux-fruits", -"faux-fuyans", -"faux-fuyant", -"faux-fuyants", -"faux-garou", -"faux-grenier", -"faux-greniers", -"faux-jeton", -"faux-jetons", -"Faux-la-Montagne", "Faux-Mazuras", -"faux-monnayage", -"faux-monnayages", -"faux-monnayeur", -"faux-monnayeurs", -"faux-nez", -"faux-palais", -"faux-persil", -"faux-poivrier", -"faux-poivriers", -"faux-pont", -"faux-ponts", -"faux-positif", -"faux-positifs", -"faux-saunage", -"faux-saunier", -"faux-saunière", -"faux-saunières", -"faux-sauniers", -"faux-scaphirhynque", -"faux-semblans", -"faux-semblant", -"faux-semblants", -"faux-sens", -"faux-vampire", -"faux-vampires", -"Faux-Vésigneul", "Faux-Villecerf", -"faux-vin", +"Faux-Vésigneul", +"Faux-la-Montagne", "Faveraye-Mâchelles", -"Faverges-de-la-Tour", "Faverges-Seythenex", +"Faverges-de-la-Tour", "Faverolles-et-Coëmy", "Faverolles-la-Campagne", -"Faverolles-lès-Lucey", "Faverolles-les-Mares", +"Faverolles-lès-Lucey", "Faverolles-sur-Cher", -"fax-tractage", -"fax-tractages", "Fay-aux-Loges", "Fay-de-Bretagne", -"Faye-d'Anjou", -"Faye-l'Abbesse", -"Faye-la-Vineuse", "Fay-en-Montagne", -"Faye-sur-Ardin", -"Fayet-le-Château", -"Fayet-Ronaye", -"Fayl-Billot", -"fayl-billotin", -"Fayl-Billotin", -"fayl-billotine", -"Fayl-Billotine", -"fayl-billotines", -"Fayl-Billotines", -"fayl-billotins", -"Fayl-Billotins", "Fay-le-Clos", "Fay-les-Etangs", "Fay-les-Étangs", "Fay-lès-Marcilly", -"Faÿ-lès-Nemours", +"Fay-sur-Lignon", +"Faye-d'Anjou", +"Faye-l'Abbesse", +"Faye-la-Vineuse", +"Faye-sur-Ardin", +"Fayet-Ronaye", +"Fayet-le-Château", +"Fayl-Billot", +"Fayl-Billotin", +"Fayl-Billotine", +"Fayl-Billotines", +"Fayl-Billotins", "Fayl-la-Forêt", "Fays-la-Chapelle", "Fays-les-Veneurs", -"Fay-sur-Lignon", "Fayt-le-Franc", "Fayt-lez-Manage", +"Faÿ-lès-Nemours", "Febvin-Palfart", -"Fêche-l'Eglise", -"Fêche-l'Église", -"fech-fech", -"feed-back", "Fehl-Ritzhausen", "Feins-en-Gâtinais", "Feissons-sur-Isère", "Feissons-sur-Salins", "Felben-Wellhausen", "Feldkirchen-Westerham", -"Félines-Minervois", -"Félines-sur-Rimandoule", -"Félines-Termenès", -"femelle-stérile", -"femelle-stériles", -"femme-enfant", -"femme-objet", -"femme-orchestre", -"femme-renarde", -"femmes-enfants", -"femmes-orchestres", -"femmes-renardes", -"fémoro-tibial", -"femto-ohm", -"femto-ohms", "Fenouillet-du-Razès", -"fénoxaprop-éthyl", -"fénoxaprop-P-éthyl", -"féodo-vassalique", -"féodo-vassaliques", -"fer-à-cheval", -"fer-blanc", "Fercé-sur-Sarthe", -"fer-chaud", -"fer-de-lance", -"fer-de-moulin", -"Fère-Champenoise", -"Fère-en-Tardenois", -"ferme-bourse", -"ferme-circuit", -"ferme-circuits", "Ferme-Neuvien", -"ferme-porte", -"ferme-portes", -"fermes-hôtels", -"fermier-général", -"Fernán-Núñez", "Ferney-Voltaire", -"Férolles-Attilly", +"Fernán-Núñez", "Ferrals-les-Corbières", "Ferrals-les-Montagnes", -"ferrando-forézienne", -"ferre-mule", "Ferreux-Quincey", +"Ferrière-Larçon", "Ferrière-et-Lafolie", "Ferrière-la-Grande", "Ferrière-la-Petite", -"Ferrière-Larçon", -"Ferrières-en-Bray", -"Ferrières-en-Brie", -"Ferrières-en-Gâtinais", +"Ferrière-sur-Beaulieu", "Ferrières-Haut-Clocher", -"Ferrières-la-Verrerie", -"Ferrières-le-Lac", -"Ferrières-les-Bois", -"Ferrières-lès-Ray", -"Ferrières-lès-Scey", -"Ferrières-les-Verreries", "Ferrières-Poussarou", "Ferrières-Saint-Hilaire", "Ferrières-Saint-Mary", +"Ferrières-en-Bray", +"Ferrières-en-Brie", +"Ferrières-en-Gâtinais", +"Ferrières-la-Verrerie", +"Ferrières-le-Lac", +"Ferrières-les-Bois", +"Ferrières-les-Verreries", +"Ferrières-lès-Ray", +"Ferrières-lès-Scey", "Ferrières-sur-Ariège", "Ferrières-sur-Sichon", -"Ferrière-sur-Beaulieu", -"ferro-axinite", -"ferro-axinites", -"ferro-magnésien", -"ferro-magnétisme", -"ferro-magnétismes", -"ferro-phlogopite", -"ferro-phlogopites", -"ferro-prussiate", -"ferro-prussiates", -"ferry-boat", -"ferry-boats", -"fers-à-cheval", -"fers-blancs", -"fers-de-lance", "Fesches-le-Châtel", -"fesh-fesh", "Fesmy-le-Sart", "Fessanvilliers-Mattanvilliers", -"fesse-cahier", -"fesse-mathieu", -"fesse-mathieus", -"fesse-mathieux", "Fessenheim-le-Bas", -"fesse-tonneau", -"fesse-tonneaux", "Fessey-Dessous-et-Dessus", -"fest-deiz", "Festes-et-Saint-André", -"fest-noz", -"fest-nozs", -"Fête-Dieu", -"fétu-en-cul", -"fétus-en-cul", "Feuguerolles-Bully", "Feuguerolles-sur-Orne", "Feuguerolles-sur-Seulles", -"feuille-caillou-ciseaux", -"feuille-morte", "Feuquières-en-Vimeu", -"Fexhe-le-Haut-Clocher", "Fexhe-Slins", +"Fexhe-le-Haut-Clocher", "Fey-en-Haye", -"fibre-cellule", -"fibro-cartilage", -"fibro-cellulaire", -"fibro-cystique", -"fibro-cystiques", -"fibro-granulaire", -"fibro-muqueux", -"fibro-séreux", -"fibro-soyeux", -"fiche-échalas", "Fichous-Riumayou", -"fiducie-sûreté", "Fieffes-Montrelet", -"fier-à-bras", -"fiers-à-bras", "Fierville-Bray", "Fierville-les-Mines", "Fierville-les-Parcs", -"fie-vïnnamide", -"fie-vïnnamides", -"fifty-fifty", "Figaró-Montmany", -"figuier-mûrier", -"filet-poubelle", -"filets-poubelles", -"fille-mère", -"filles-mères", -"film-fleuve", -"films-annonces", -"fils-de-puterie", -"filtre-presse", -"filtres-presses", -"fine-metal", "Finkenbach-Gersweiler", -"finno-ougrien", -"finno-ougrienne", -"finno-ougriennes", -"finno-ougriens", -"fin-or", "Fiquefleur-Equainville", "Fiquefleur-Équainville", -"first-fit", "Fischbach-Göslikon", "Fischbach-Oberraden", -"fisse-larron", -"fisses-larrons", -"fist-fucking", -"fist-fuckings", "Fitz-James", -"fitz-jamois", "Fitz-Jamois", -"fitz-jamoise", "Fitz-Jamoise", -"fitz-jamoises", "Fitz-Jamoises", -"fixe-chaussette", -"fixe-chaussettes", -"fixe-fruit", -"fixe-fruits", -"fixe-longe", -"fixe-moustaches", -"fixe-ruban", -"fixe-rubans", "Fix-Saint-Geneys", -"fix-up", "Fize-Fontaine", "Fize-le-Marsal", -"f'jer", -"f'jers", -"Flacé-lès-Mâcon", "Flacey-en-Bresse", -"fla-fla", -"fla-flas", +"Flacé-lès-Mâcon", "Flagey-Echézeaux", -"Flagey-Échézeaux", -"Flagey-lès-Auxonne", "Flagey-Rigney", +"Flagey-lès-Auxonne", +"Flagey-Échézeaux", "Flaignes-Havys", "Flaignes-les-Oliviers", "Flamets-Frétils", -"flanc-de-chien", "Flanc-de-chien", -"flanc-garde", -"flanc-gardes", -"flanc-mou", "Flancourt-Catelon", "Flancourt-Crescy-en-Roumois", -"flancs-de-chien", "Flancs-de-chien", -"flancs-gardes", -"flancs-mous", "Flandre-Occidentale", "Flandre-Orientale", -"flash-back", -"flash-ball", -"flash-balls", -"flash-mob", -"flash-mobs", "Flassans-sur-Issole", "Flaujac-Gare", "Flaujac-Poujols", @@ -10668,60 +4647,18 @@ FR_BASE_EXCEPTIONS = [ "Flavigny-sur-Ozerain", "Flavy-le-Martel", "Flavy-le-Meldeux", -"Fléac-sur-Seugne", -"Flémalle-Grande", -"Flémalle-Haute", -"Fléré-la-Rivière", "Flers-en-Escrebieux", "Flers-lez-Lille", "Flers-sur-Noye", -"fleur-bleuisa", -"fleur-bleuisai", -"fleur-bleuisaient", -"fleur-bleuisais", -"fleur-bleuisait", -"fleur-bleuisâmes", -"fleur-bleuisant", -"fleur-bleuisas", -"fleur-bleuisasse", -"fleur-bleuisassent", -"fleur-bleuisasses", -"fleur-bleuisassiez", -"fleur-bleuisassions", -"fleur-bleuisât", -"fleur-bleuisâtes", -"fleur-bleuise", -"fleur-bleuisé", -"fleur-bleuisée", -"fleur-bleuisées", -"fleur-bleuisent", -"fleur-bleuiser", -"fleur-bleuisera", -"fleur-bleuiserai", -"fleur-bleuiseraient", -"fleur-bleuiserais", -"fleur-bleuiserait", -"fleur-bleuiseras", -"fleur-bleuisèrent", -"fleur-bleuiserez", -"fleur-bleuiseriez", -"fleur-bleuiserions", -"fleur-bleuiserons", -"fleur-bleuiseront", -"fleur-bleuises", -"fleur-bleuisés", -"fleur-bleuisez", -"fleur-bleuisiez", -"fleur-bleuisions", -"fleur-bleuisons", -"fleur-de-mai", "Fleurey-lès-Faverney", "Fleurey-lès-Lavoncourt", "Fleurey-lès-Saint-Loup", "Fleurey-sur-Ouche", -"fleur-feuille", "Fleurieu-sur-Saône", "Fleurieux-sur-l'Arbresle", +"Fleury-Montmarin", +"Fleury-Mérogis", +"Fleury-Vallée-d'Aillant", "Fleury-devant-Douaumont", "Fleury-en-Bière", "Fleury-et-Montmarin", @@ -10730,251 +4667,140 @@ FR_BASE_EXCEPTIONS = [ "Fleury-la-Rivière", "Fleury-la-Vallée", "Fleury-les-Aubrais", -"Fleury-Mérogis", -"Fleury-Montmarin", "Fleury-sur-Aire", "Fleury-sur-Andelle", "Fleury-sur-Loire", "Fleury-sur-Orne", -"Fleury-Vallée-d'Aillant", -"Fléville-devant-Nancy", -"Fléville-Lixières", "Flez-Cuzy", -"flic-flac", -"flic-flaqua", -"flic-flaquai", -"flic-flaquaient", -"flic-flaquais", -"flic-flaquait", -"flic-flaquâmes", -"flic-flaquant", -"flic-flaquas", -"flic-flaquasse", -"flic-flaquassent", -"flic-flaquasses", -"flic-flaquassiez", -"flic-flaquassions", -"flic-flaquât", -"flic-flaquâtes", -"flic-flaque", -"flic-flaqué", -"flic-flaquent", -"flic-flaquer", -"flic-flaquera", -"flic-flaquerai", -"flic-flaqueraient", -"flic-flaquerais", -"flic-flaquerait", -"flic-flaqueras", -"flic-flaquèrent", -"flic-flaquerez", -"flic-flaqueriez", -"flic-flaquerions", -"flic-flaquerons", -"flic-flaqueront", -"flic-flaques", -"flic-flaquez", -"flic-flaquiez", -"flic-flaquions", -"flic-flaquons", "Flieth-Stegelitz", -"Flines-lès-Mortagne", "Flines-lez-Raches", +"Flines-lès-Mortagne", "Flins-Neuve-Eglise", "Flins-Neuve-Église", "Flins-sur-Seine", -"flint-glass", -"flip-flap", -"flirty-fishing", -"float-tube", -"float-tubes", "Flogny-la-Chapelle", "Floh-Seligenthal", "Florent-en-Argonne", "Florentin-la-Capelle", "Florimont-Gaumier", -"Flörsheim-Dalsheim", -"flos-ferré", -"flos-ferri", "Flottemanville-Hague", -"flotte-tube", -"flotte-tubes", -"flou-flou", -"fluazifop-butyl", -"fluazifop-P-butyl", "Fluorn-Winzeln", -"fluoro-phlogopite", -"fluoro-phlogopites", -"flupyrsulfuron-méthyle", -"fluroxypyr-meptyl", -"fluvio-marin", -"fly-over", -"fly-overs", -"fly-tox", -"f'nêtre", -"f'nêtres", +"Fléac-sur-Seugne", +"Flémalle-Grande", +"Flémalle-Haute", +"Fléré-la-Rivière", +"Fléville-Lixières", +"Fléville-devant-Nancy", +"Flörsheim-Dalsheim", "Foameix-Ornel", -"foc-en-l'air", -"Föhrden-Barl", "Fohren-Linden", -"foie-de-boeuf", -"foies-de-boeuf", -"foi-menti", -"foi-mentie", -"foire-exposition", -"foires-expositions", "Foissy-lès-Vézelay", "Foissy-sur-Vanne", -"folk-lore", -"folk-lores", "Follainville-Dennemont", -"folle-avoine", -"folle-blanche", -"folles-avoines", -"folle-verte", "Folx-les-Caves", -"folx-les-cavien", "Folx-les-Cavien", "Folx-les-Cavienne", "Fonches-Fonchette", "Foncine-le-Bas", "Foncine-le-Haut", "Fondachelli-Fantina", -"fond-de-teinta", -"fond-de-teintai", -"fond-de-teintaient", -"fond-de-teintais", -"fond-de-teintait", -"fond-de-teintâmes", -"fond-de-teintant", -"fond-de-teintas", -"fond-de-teintasse", -"fond-de-teintassent", -"fond-de-teintasses", -"fond-de-teintassiez", -"fond-de-teintassions", -"fond-de-teintât", -"fond-de-teintâtes", -"fond-de-teinte", -"fond-de-teinté", -"fond-de-teintée", -"fond-de-teintées", -"fond-de-teintent", -"fond-de-teinter", -"fond-de-teintera", -"fond-de-teinterai", -"fond-de-teinteraient", -"fond-de-teinterais", -"fond-de-teinterait", -"fond-de-teinteras", -"fond-de-teintèrent", -"fond-de-teinterez", -"fond-de-teinteriez", -"fond-de-teinterions", -"fond-de-teinterons", -"fond-de-teinteront", -"fond-de-teintes", -"fond-de-teintés", -"fond-de-teintez", -"fond-de-teintiez", -"fond-de-teintions", -"fond-de-teintons", "Fonds-Saint-Denis", -"fon-gbe", "Fons-sur-Lussan", -"Fontaine-au-Bois", -"Fontaine-au-Pire", +"Font-Romeu-Odeillo-Via", +"Font-de-Carpentin", +"Font-rubí", "Fontaine-Bellenger", "Fontaine-Bethon", "Fontaine-Bonneleau", -"fontaine-brayen", "Fontaine-Brayen", -"fontaine-brayenne", "Fontaine-Brayenne", -"fontaine-brayennes", "Fontaine-Brayennes", -"fontaine-brayens", "Fontaine-Brayens", "Fontaine-Chaalis", "Fontaine-Chalendray", "Fontaine-Couverte", "Fontaine-Denis", "Fontaine-Denis-Nuisy", -"Fontaine-de-Vaucluse", -"Fontaine-en-Bray", -"Fontaine-en-Dormois", "Fontaine-Etoupefour", -"Fontaine-Étoupefour", "Fontaine-Fourches", "Fontaine-Française", "Fontaine-Guérin", "Fontaine-Henry", "Fontaine-Heudebourg", +"Fontaine-Lavaganne", +"Fontaine-Luyères", +"Fontaine-Milon", +"Fontaine-Mâcon", +"Fontaine-Notre-Dame", +"Fontaine-Raoul", +"Fontaine-Saint-Lucien", +"Fontaine-Simon", +"Fontaine-Uterte", +"Fontaine-Valmont", +"Fontaine-au-Bois", +"Fontaine-au-Pire", +"Fontaine-de-Vaucluse", +"Fontaine-en-Bray", +"Fontaine-en-Dormois", "Fontaine-l'Abbé", +"Fontaine-l'Etalon", +"Fontaine-l'Étalon", +"Fontaine-l'Évêque", "Fontaine-la-Gaillarde", "Fontaine-la-Guyon", "Fontaine-la-Louvet", "Fontaine-la-Mallet", "Fontaine-la-Rivière", "Fontaine-la-Soret", -"Fontaine-Lavaganne", "Fontaine-le-Bourg", "Fontaine-le-Comte", "Fontaine-le-Dun", "Fontaine-le-Pin", "Fontaine-le-Port", "Fontaine-le-Puits", +"Fontaine-le-Sec", "Fontaine-les-Bassets", +"Fontaine-les-Coteaux", +"Fontaine-les-Grès", +"Fontaine-les-Ribouts", "Fontaine-lès-Boulans", "Fontaine-lès-Cappy", "Fontaine-lès-Clercs", "Fontaine-lès-Clerval", -"Fontaine-les-Coteaux", "Fontaine-lès-Croisilles", "Fontaine-lès-Dijon", -"Fontaine-le-Sec", -"Fontaine-les-Grès", "Fontaine-lès-Hermans", "Fontaine-lès-Luxeuil", -"Fontaine-les-Ribouts", "Fontaine-lès-Vervins", -"Fontaine-l'Etalon", -"Fontaine-l'Étalon", -"Fontaine-l'Évêque", -"Fontaine-Luyères", -"Fontaine-Mâcon", -"Fontaine-Milon", -"Fontaine-Notre-Dame", -"Fontaine-Raoul", -"Fontaine-Saint-Lucien", -"Fontaines-d'Ozillac", -"Fontaines-en-Duesmois", -"Fontaines-en-Sologne", -"Fontaine-Simon", -"Fontaines-les-Sèches", "Fontaine-sous-Jouy", "Fontaine-sous-Montaiguillon", "Fontaine-sous-Montdidier", "Fontaine-sous-Pezou", "Fontaine-sous-Préaux", -"Fontaines-Saint-Clair", -"Fontaines-Saint-Martin", -"Fontaines-sur-Grandson", -"Fontaines-sur-Marne", -"Fontaines-sur-Saône", "Fontaine-sur-Ay", "Fontaine-sur-Coole", "Fontaine-sur-Maye", "Fontaine-sur-Somme", -"Fontaine-Uterte", -"Fontaine-Valmont", -"Fontanès-de-Sault", +"Fontaine-Étoupefour", +"Fontaines-Saint-Clair", +"Fontaines-Saint-Martin", +"Fontaines-d'Ozillac", +"Fontaines-en-Duesmois", +"Fontaines-en-Sologne", +"Fontaines-les-Sèches", +"Fontaines-sur-Grandson", +"Fontaines-sur-Marne", +"Fontaines-sur-Saône", "Fontanes-du-Causse", "Fontanil-Cornillon", +"Fontanès-de-Sault", "Fontcouverte-la-Toussuire", -"Font-de-Carpentin", "Fontenai-les-Louvets", "Fontenai-sur-Orne", +"Fontenay-Mauvoisin", +"Fontenay-Saint-Père", +"Fontenay-Torcy", +"Fontenay-Trésigny", "Fontenay-aux-Roses", "Fontenay-de-Bossery", "Fontenay-en-Parisis", @@ -10983,12 +4809,10 @@ FR_BASE_EXCEPTIONS = [ "Fontenay-le-Fleury", "Fontenay-le-Marmion", "Fontenay-le-Pesnel", -"Fontenay-lès-Briis", "Fontenay-le-Vicomte", -"Fontenay-Mauvoisin", +"Fontenay-lès-Briis", "Fontenay-près-Chablis", "Fontenay-près-Vézelay", -"Fontenay-Saint-Père", "Fontenay-sous-Bois", "Fontenay-sous-Fouronnes", "Fontenay-sur-Conie", @@ -10996,10 +4820,8 @@ FR_BASE_EXCEPTIONS = [ "Fontenay-sur-Loing", "Fontenay-sur-Mer", "Fontenay-sur-Vègre", -"Fontenay-Torcy", -"Fontenay-Trésigny", -"Fontenelle-en-Brie", "Fontenelle-Montby", +"Fontenelle-en-Brie", "Fontenille-Saint-Martin-d'Entraigues", "Fontenilles-d'Aigueparse", "Fontenois-la-Ville", @@ -11012,175 +4834,86 @@ FR_BASE_EXCEPTIONS = [ "Fontevraud-l'Abbaye", "Fontiers-Cabardès", "Fontiès-d'Aude", -"Font-Romeu-Odeillo-Via", -"Font-rubí", -"food-court", -"food-courts", -"food-truck", -"food-trucks", "Forcelles-Saint-Gorgon", "Forcelles-sous-Gugney", "Forceville-en-Vimeu", -"force-vivier", "Forchies-la-Marche", "Forel-sur-Lucens", -"Forest-en-Cambrésis", -"Forest-l'Abbaye", "Forest-Montiers", "Forest-Saint-Julien", +"Forest-en-Cambrésis", +"Forest-l'Abbaye", "Forest-sur-Marque", -"forêt-clairière", -"forêt-climax", -"forêt-galerie", -"Forêt-la-Folie", -"Forêt-Noire", -"Forêt-Noire-Baar", -"forêt-parc", -"forêts-clairières", -"forêts-climax", -"forêts-galeries", -"forêts-parcs", -"forge-mètre", "Forge-Philippe", "Forges-la-Forêt", "Forges-les-Bains", "Forges-les-Eaux", "Forges-sur-Meuse", "Forlì-Cesena", -"formica-leo", -"formule-choc", -"formule-chocs", -"forsétyl-al", "Forst-Längenbühl", +"Fort-Louis", +"Fort-Mahon-Plage", +"Fort-Moville", +"Fort-de-France", +"Fort-du-Plasne", "Fortel-en-Artois", -"forte-piano", -"forte-pianos", -"forts-vêtu", -"Fosbury-flop", -"fosétyl-Al", -"Fossès-et-Baleyssac", -"Fosses-la-Ville", +"Forêt-Noire", +"Forêt-Noire-Baar", +"Forêt-la-Folie", "Fos-sur-Mer", -"Foucaucourt-en-Santerre", +"Fosbury-flop", +"Fosses-la-Ville", +"Fossès-et-Baleyssac", "Foucaucourt-Hors-Nesle", +"Foucaucourt-en-Santerre", "Foucaucourt-sur-Thabas", "Fouchères-aux-Bois", -"foué-toutrac", -"foué-toutracs", -"fouette-cul", -"fouette-culs", -"fouette-queue", -"fouette-queues", "Foufflin-Ricametz", "Foufnie-les-Berdouilles", "Fougax-et-Barrineuf", -"fougère-aigle", -"fougères-aigles", -"Fougères-sur-Bièvre", "Fougerolles-du-Plessis", -"fouille-au-pot", -"fouille-merde", -"foule-crapaud", +"Fougères-sur-Bièvre", "Fouquières-lès-Béthune", "Fouquières-lès-Lens", "Fourcatier-et-Maison-Neuve", -"fourche-fière", -"fourmi-lion", -"fourmis-lions", "Fourneaux-le-Val", "Fournes-Cabardès", "Fournes-en-Weppes", "Fournet-Blancheroche", "Fournets-Luisans", -"Fouron-le-Comte", "Fouron-Saint-Martin", "Fouron-Saint-Pierre", +"Fouron-le-Comte", "Fourques-sur-Garonne", -"fourre-tout", "Fours-en-Vexin", "Foussais-Payré", "Fouta-Diallon", "Fouta-Djalon", -"Fouvent-le-Bas", "Fouvent-Saint-Andoche", +"Fouvent-le-Bas", "Fox-Amphoux", -"fox-hound", -"fox-hounds", -"fox-terrier", -"fox-terriers", -"fox-trot", -"fox-trott", -"fox-trotta", -"fox-trottai", -"fox-trottaient", -"fox-trottais", -"fox-trottait", -"fox-trottâmes", -"fox-trottant", -"fox-trottas", -"fox-trottasse", -"fox-trottassent", -"fox-trottasses", -"fox-trottassiez", -"fox-trottassions", -"fox-trottât", -"fox-trottâtes", -"fox-trotte", -"fox-trotté", -"fox-trottent", -"fox-trotter", -"fox-trottera", -"fox-trotterai", -"fox-trotteraient", -"fox-trotterais", -"fox-trotterait", -"fox-trotteras", -"fox-trottèrent", -"fox-trotterez", -"fox-trotteriez", -"fox-trotterions", -"fox-trotterons", -"fox-trotteront", -"fox-trottes", -"fox-trottez", -"fox-trottiez", -"fox-trottions", -"fox-trottons", -"fox-trotts", "Foy-Notre-Dame", -"foy-notre-damien", "Foy-Notre-Damien", "Foy-Notre-Damienne", "Foz-Calanda", +"Fragnes-La Loyère", "Frahier-et-Chatebier", "Fraignot-et-Vesvrotte", -"frais-chier", "Fraisnes-en-Saintois", "Fraisse-Cabardès", -"Fraissé-des-Corbières", "Fraisse-sur-Agout", "Fraissinet-de-Fourques", "Fraissinet-de-Lozère", +"Fraissé-des-Corbières", "Framerville-Rainecourt", -"Francfort-sur-le-Main", "Francfort-sur-l'Oder", +"Francfort-sur-le-Main", "Franche-Comté", "Franches-Montagnes", "Francillon-sur-Roubion", "Francilly-Selency", "Frangy-en-Bresse", -"Fränkisch-Crumbach", "Franqueville-Saint-Pierre", -"frappe-abord", -"frappe-à-bord", -"frappe-à-mort", -"frappe-babord", -"frappe-d'abord", -"frappe-devant", -"frappe-main", -"frappe-mains", -"frappe-plaque", -"frappe-plaques", "Frasnay-Reugny", "Frasne-le-Château", "Frasne-les-Meulières", @@ -11189,86 +4922,71 @@ FR_BASE_EXCEPTIONS = [ "Frasnes-lez-Couvin", "Frasnes-lez-Gosselies", "Frayssinet-le-Gélat", -"Fréchet-Aure", -"Fréchou-Fréchet", -"Frédéric-Fontaine", "Fredersdorf-Vogelsdorf", -"free-lance", -"Freienstein-Teufen", "Frei-Laubersheim", -"freins-vapeur", -"frein-vapeur", +"Freienstein-Teufen", "Freix-Anglards", -"Frémeréville-sous-les-Côtes", "Frenelle-la-Grande", "Frenelle-la-Petite", "Freneuse-sur-Risle", "Fresnay-en-Retz", +"Fresnay-l'Evêque", +"Fresnay-l'Évêque", "Fresnay-le-Comte", "Fresnay-le-Gilmert", "Fresnay-le-Long", "Fresnay-le-Samson", -"Fresnay-l'Evêque", -"Fresnay-l'Évêque", "Fresnay-sur-Sarthe", -"Fresneaux-Montchevreuil", "Fresne-Cauverville", -"Fresné-la-Mère", -"Fresne-l'Archevêque", "Fresne-Léguillon", +"Fresne-Saint-Mamès", +"Fresne-l'Archevêque", "Fresne-le-Plan", "Fresne-lès-Reims", -"Fresne-Saint-Mamès", +"Fresneaux-Montchevreuil", +"Fresnes-Mazancourt", +"Fresnes-Tilloloy", "Fresnes-au-Mont", "Fresnes-en-Saulnois", "Fresnes-en-Tardenois", "Fresnes-en-Woëvre", "Fresnes-lès-Montauban", "Fresnes-lès-Reims", -"Fresnes-Mazancourt", "Fresnes-sur-Apance", "Fresnes-sur-Escaut", "Fresnes-sur-Marne", -"Fresnes-Tilloloy", "Fresney-le-Puceux", "Fresney-le-Vieux", "Fresnicourt-le-Dolmen", "Fresnois-la-Montagne", "Fresnoy-Andainville", +"Fresnoy-Folny", "Fresnoy-au-Val", "Fresnoy-en-Bassigny", "Fresnoy-en-Chaussée", "Fresnoy-en-Gohelle", "Fresnoy-en-Thelle", -"Fresnoy-Folny", "Fresnoy-la-Rivière", "Fresnoy-le-Château", "Fresnoy-le-Grand", "Fresnoy-le-Luat", "Fresnoy-lès-Roye", +"Fresné-la-Mère", "Fresse-sur-Moselle", "Fretigney-et-Velloreille", -"Frétoy-le-Château", -"Fréville-du-Gâtinais", -"Frévin-Capelle", "Freycenet-la-Cuche", "Freycenet-la-Tour", "Freyming-Merlebach", -"freyming-merlebachois", "Freyming-Merlebachois", -"freyming-merlebachoise", "Freyming-Merlebachoise", -"freyming-merlebachoises", "Freyming-Merlebachoises", "Freyung-Grafenau", "Fribourg-en-Brisgau", -"fric-frac", -"fric-fracs", "Friedrich-Wilhelm-Lübke-Koog", -"Frières-Faillouël", -"Frise-du-Nord", "Frise-Occidentale", +"Frise-du-Nord", "Friville-Escarbotin", +"Frières-Faillouël", "Frohen-le-Grand", "Frohen-le-Petit", "Frohen-sur-Authie", @@ -11276,100 +4994,58 @@ FR_BASE_EXCEPTIONS = [ "Fromeréville-les-Vallons", "Frontenay-Rohan-Rohan", "Frontenay-sur-Dive", -"Frontignan-de-Comminges", "Frontignan-Savès", -"fronto-iniaque", +"Frontignan-de-Comminges", "Frotey-lès-Lure", "Frotey-lès-Vesoul", -"frou-frou", -"frou-frous", -"frous-frous", "Frugerès-les-Mines", "Frugières-le-Pin", "Frutigen-Bas-Simmental", -"fuel-oil", -"fuel-oils", -"Fuente-Álamo", +"Fränkisch-Crumbach", +"Fréchet-Aure", +"Fréchou-Fréchet", +"Frédéric-Fontaine", +"Frémeréville-sous-les-Côtes", +"Frétoy-le-Château", +"Fréville-du-Gâtinais", +"Frévin-Capelle", "Fuente-Olmedo", "Fuente-Tójar", -"full-contact", +"Fuente-Álamo", "Full-Reuenthal", -"full-stack", -"fulmi-coton", -"fulmi-cotons", -"fume-cigare", -"fume-cigares", -"fume-cigarette", -"fume-cigarettes", -"fumée-gelée", -"fusée-sonde", -"fusilier-commando", -"fusilier-marin", -"fusiliers-commandos", -"fusiliers-marins", -"fusil-mitrailleur", -"fusils-mitrailleurs", -"fusion-acquisition", -"fute-fute", -"futes-futes", -"fût-et-fare", -"fut's", -"futuna-aniwa", +"Fère-Champenoise", +"Fère-en-Tardenois", +"Félines-Minervois", +"Félines-Termenès", +"Félines-sur-Rimandoule", +"Férolles-Attilly", +"Fêche-l'Eglise", +"Fêche-l'Église", +"Fête-Dieu", +"Föhrden-Barl", "Gaag-Maasland", "Gaag-Schipluiden", "Gaasterlân-Sleat", "Gabbioneta-Binanuova", -"gabrielino-fernandeño", -"gâche-métier", "Gadz'Arette", "Gadz'Arettes", -"gadz'arts", "Gadz'Arts", "Gageac-et-Rouillac", "Gagnac-sur-Cère", "Gagnac-sur-Garonne", -"gagnante-gagnante", -"gagnante-gagnante-gagnante", -"gagnantes-gagnantes", -"gagnantes-gagnantes-gagnantes", -"gagnant-gagnant", -"gagnant-gagnant-gagnant", -"gagnants-gagnants", -"gagnants-gagnants-gagnants", "Gagne-monopanglotte", -"gagne-pain", -"gagne-pains", -"gagne-petit", -"Gaillac-d'Aveyron", "Gaillac-Toulza", +"Gaillac-d'Aveyron", "Gaillan-en-Médoc", "Gaillardbois-Cressenville", -"gaillet-gratteron", -"gaillets-gratterons", "Gaillon-sur-Montcient", -"gaine-culotte", -"gaines-culottes", "Gaja-et-Villedieu", "Gaja-la-Selve", -"galaïco-portugais", -"galégo-portugais", -"galeries-refuges", -"galette-saucisse", -"galette-saucisses", "Gallargues-le-Montueux", "Gallin-Kuppentin", -"galvano-cautère", -"galvano-magnétique", -"galvano-magnétiques", -"galvano-magnétisme", -"galvano-magnétismes", "Gamaches-en-Vexin", "Gamarde-les-Bains", "Gamiz-Fika", -"gamma-1,2,3,4,5,6-hexachlorocyclohexane", -"gamma-HCH", -"gamma-hexachlorobenzène", -"gamma-hexachlorocyclohexane", "Gampel-Bratsch", "Gancourt-Saint-Etienne", "Gancourt-Saint-Étienne", @@ -11377,11 +5053,9 @@ FR_BASE_EXCEPTIONS = [ "Garancières-en-Beauce", "Garancières-en-Drouais", "Garcelles-Secqueville", -"garcette-goitre", +"Garde-Colombe", "Gardegan-et-Tourtirac", -"garden-parties", -"garden-party", -"garden-partys", +"Gardes-le-Pontaroux", "Garennes-sur-Eure", "Garges-lès-Gonesse", "Gargilesse-Dampierre", @@ -11390,155 +5064,83 @@ FR_BASE_EXCEPTIONS = [ "Garnat-sur-Engièvre", "Garrigues-Sainte-Eulalie", "Garzau-Garzin", -"gas-oil", -"gas-oils", "Gaspé-Nordien", "Gaspésie-Îles-de-la-Madeleine", "Gastines-sur-Erve", "Gasville-Oisème", -"gâte-bois", -"gâte-ménage", -"gâte-ménages", -"gâte-métier", -"gâte-métiers", -"gâte-papier", -"gâte-papiers", -"gâte-pâte", -"gâte-sauce", -"gâte-sauces", "Gatteville-le-Phare", "Gau-Algesheim", "Gau-Bickelheim", "Gau-Bischofsheim", -"gauche-fer", +"Gau-Heppenheim", +"Gau-Odernheim", +"Gau-Weinheim", "Gauchin-Légal", "Gauchin-Verloingt", "Gaudreville-la-Rivière", -"Gau-Heppenheim", -"Gau-Odernheim", "Gaurain-Ramecroix", "Gauville-la-Campagne", -"Gau-Weinheim", "Gavarnie-Gèdre", "Gavarret-sur-Aulouste", -"gay-friendly", -"gays-friendly", "Gazax-et-Baccarisse", -"gaz-cab", -"gazelle-girafe", -"gaz-poivre", -"Gée-Rivière", "Geest-Gérompont", "Geest-Gérompont-Petit-Rosière", -"Géfosse-Fontenay", -"gélatino-bromure", -"gélatino-bromures", -"gel-douche", -"gel-douches", "Geldrop-Mierlo", "Gelvécourt-et-Adompt", "Gemert-Bakel", "Genac-Bignac", -"Génicourt-sous-Condé", -"Génicourt-sur-Meuse", -"génie-conseil", -"génies-conseils", -"génio-hyoïdien", -"génio-hyoïdienne", -"génio-hyoïdiennes", -"génio-hyoïdiens", -"génito-crural", -"génito-urinaire", -"génito-urinaires", "Gennes-Ivergny", +"Gennes-Val de Loire", "Gennes-sur-Glaize", "Gennes-sur-Seiche", "Gensac-de-Boulogne", "Gensac-la-Pallue", "Gensac-sur-Garonne", "Gentioux-Pigerolles", -"gentleman-rider", -"gentlemen-riders", "Georges-Fontaine", "Gerbécourt-et-Haplemont", "Gercourt-et-Drillancourt", -"Gère-Bélesten", -"gère-bélestinois", -"Gère-Bélestinois", -"gère-bélestinoise", -"Gère-Bélestinoise", -"gère-bélestinoises", -"Gère-Bélestinoises", -"germanate-analcime", -"germanate-analcimes", -"germano-américain", -"germano-américaine", -"germano-américaines", -"germano-américains", -"germano-anglais", -"germano-anglaises", -"germano-iranien", "Germano-Iranien", -"germano-italo-japonais", +"Germigny-Pend-la-Pie", "Germigny-des-Prés", +"Germigny-l'Evêque", +"Germigny-l'Exempt", +"Germigny-l'Évêque", "Germigny-lès-Machault", "Germigny-lès-Machaut", -"Germigny-l'Evêque", -"Germigny-l'Évêque", -"Germigny-l'Exempt", -"Germigny-Pend-la-Pie", "Germigny-sous-Coulombs", "Germigny-sur-Loire", +"Germo-Roburien", +"Germo-Roburienne", +"Germo-Roburiennes", +"Germo-Roburiens", "Germolles-sur-Grosne", "Germond-Rouvre", -"germo-roburien", -"Germo-Roburien", -"germo-roburienne", -"Germo-Roburienne", -"germo-roburiennes", -"Germo-Roburiennes", -"germo-roburiens", -"Germo-Roburiens", "Germs-sur-l'Oussouet", "Gernika-Lumo", "Gerville-la-Forêt", "Gesnes-en-Argonne", "Gesnes-le-Gandelin", -"gestalt-thérapie", -"gestalt-thérapies", "Gesvres-le-Chapitre", -"gétah-lahoë", -"Géus-d'Arzacq", -"Geüs-d'Oloron", "Gevigney-et-Mercey", "Gevrey-Chambertin", "Gez-ez-Angles", "Gezier-et-Fontelenay", -"Gézier-et-Fontenelay", +"Geüs-d'Oloron", "Giardini-Naxos", "Giel-Courteilles", "Gien-sur-Cure", "Giessen-Nieuwkerk", "Giessen-Oudekerk", "Giey-sur-Aujon", -"Giffaumont-Champaubert", "Gif-sur-Yvette", -"giga-ampère", -"giga-ampères", -"gigabit-ethernet", -"giga-électron-volt", -"gigaélectron-volt", -"giga-électron-volts", -"gigaélectron-volts", -"giga-ohm", -"giga-ohms", +"Giffaumont-Champaubert", "Gignac-la-Nerthe", "Gigny-Bussy", "Gigny-sur-Saône", "Gigors-et-Lozeron", "Gilhac-et-Bruzac", "Gilhoc-sur-Ormèze", -"gill-box", "Gilly-lès-Cîteaux", "Gilly-sur-Isère", "Gilly-sur-Loire", @@ -11570,77 +5172,32 @@ FR_BASE_EXCEPTIONS = [ "Givry-lès-Loisy", "Givry-sur-Aisne", "Glabbeek-Zuurbemde", -"glabello-iniaque", "Glaine-Montaigut", -"Glaire-et-Villette", "Glaire-Latour", -"Glane-Beekhoek", +"Glaire-et-Villette", "Glan-Münchweiler", -"glass-cord", -"glauco-ferrugineuse", -"glauco-ferrugineuses", -"glauco-ferrugineux", +"Glane-Beekhoek", "Glaude-Arbourois", "Gleiszellen-Gleishorbach", -"glisser-déposer", -"globe-trotter", -"globe-trotters", -"globe-trotteur", -"globe-trotteurs", -"globe-trotteuse", -"globe-trotteuses", "Glos-la-Ferrière", -"glosso-épiglottique", -"glosso-épiglottiques", -"glosso-pharyngien", -"glosso-staphylin", -"glosso-staphylins", "Glos-sur-Risle", -"gloubi-boulga", -"gluco-corticoïde", -"gluco-corticoïdes", -"glufosinate-ammonium", "Glux-en-Glenne", -"glycéraldéhyde-3-phosphate", -"glycosyl-phosphatidylinositol", -"goal-average", -"goal-averages", -"goal-ball", -"gobe-dieu", -"gobe-goujons", -"gobe-mouche", -"gobe-moucherie", -"gobe-moucherons", -"gobe-mouches", -"gobe-mouton", -"gode-ceinture", -"gode-miché", -"gode-michés", -"godes-ceintures", -"Gœgnies-Chaussée", "Goeree-Overflakkee", "Gognies-Chaussée", -"Göhren-Döhlen", -"Göhren-Lebbin", "Goldbach-Altenbach", -"goma-dare", "Gometz-la-Ville", "Gometz-le-Châtel", -"gomme-cogne", -"gomme-cognes", -"gomme-gutte", "Gommenec'h", -"gomme-résine", -"gommo-résineux", "Gomzé-Andoumont", -"Gondenans-les-Moulins", +"Gond-Pontouvre", "Gondenans-Montby", "Gondenans-Moulins", -"Gond-Pontouvre", +"Gondenans-les-Moulins", "Gondrecourt-Aix", "Gondrecourt-le-Château", "Gonfreville-Caillot", "Gonfreville-l'Orcher", +"Gonneville-Le Theil", "Gonneville-en-Auge", "Gonneville-la-Mallet", "Gonneville-sur-Honfleur", @@ -11648,54 +5205,11 @@ FR_BASE_EXCEPTIONS = [ "Gonneville-sur-Merville", "Gonneville-sur-Scie", "Gontaud-de-Nogaret", -"google-isa", -"google-isai", -"google-isaient", -"google-isais", -"google-isait", -"google-isâmes", -"google-isant", -"google-isas", -"google-isasse", -"google-isassent", -"google-isasses", -"google-isassiez", -"google-isassions", -"google-isât", -"google-isâtes", -"google-ise", -"google-isé", -"google-isée", -"google-isées", -"google-isent", -"google-iser", -"google-isera", -"google-iserai", -"google-iseraient", -"google-iserais", -"google-iserait", -"google-iseras", -"google-isèrent", -"google-iserez", -"google-iseriez", -"google-iserions", -"google-iserons", -"google-iseront", -"google-ises", -"google-isés", -"google-isez", -"google-isiez", -"google-isions", -"google-isons", "Gorden-Staupitz", -"gorge-bleue", -"gorge-de-pigeon", -"gorge-fouille", "Gorges-du-Tarn-Causses", "Gornate-Olona", "Gorom-Gorom", "Gors-Opleeuw", -"go-slow", "Gossersweiler-Stein", "Gotein-Libarrenx", "Gouaux-de-Larboust", @@ -11704,242 +5218,151 @@ FR_BASE_EXCEPTIONS = [ "Goudelancourt-lès-Pierrepont", "Goulier-et-Olbier", "Gourdan-Polignan", -"gourdan-polignanais", "Gourdan-Polignanais", -"gourdan-polignanaise", "Gourdan-Polignanaise", -"gourdan-polignanaises", "Gourdan-Polignanaises", "Gourdon-Murat", -"gouris-taitien", "Gouris-Taitien", -"gouris-taitienne", "Gouris-Taitienne", -"gouris-taitiennes", "Gouris-Taitiennes", -"gouris-taitiens", "Gouris-Taitiens", +"Gournay-Loizé", "Gournay-en-Bray", "Gournay-le-Guérin", -"Gournay-Loizé", "Gournay-sur-Aronde", "Gournay-sur-Marne", "Gout-Rossignol", -"goutte-à-goutte", -"goutte-de-sang", -"goutte-de-suif", -"goutte-rose", -"gouttes-de-sang", -"Goux-lès-Dambelin", "Goux-les-Usiers", +"Goux-lès-Dambelin", "Goux-sous-Landet", -"Gouy-en-Artois", -"Gouy-en-Ternois", -"Gouy-les-Groseillers", -"Gouy-lez-Piéton", -"Gouy-l'Hôpital", "Gouy-Saint-André", "Gouy-Servins", +"Gouy-en-Artois", +"Gouy-en-Ternois", +"Gouy-l'Hôpital", +"Gouy-les-Groseillers", +"Gouy-lez-Piéton", "Gouy-sous-Bellonne", -"gouzi-gouzi", -"gouzis-gouzis", -"goyave-ananas", -"goyaves-ananas", "Graal-Müritz", "Graben-Neudorf", "Grabow-Below", -"Grâce-Berleur", -"Grâce-Hollogne", -"Grâce-Uzel", -"gracieux-berluron", "Gracieux-Berluron", "Gracieux-Berluronne", -"grâcieux-hollognois", -"Grâcieux-Hollognois", -"Grâcieux-Hollognoise", "Graffigny-Chemin", "Graignes-Mesnil-Angot", "Graincourt-lès-Havrincourt", -"grain-d'orge", "Grainville-Langannerie", +"Grainville-Ymauville", "Grainville-la-Teinturière", "Grainville-sur-Odon", "Grainville-sur-Ry", -"Grainville-Ymauville", "Grancey-le-Château-Neuvelle", "Grancey-sur-Ource", +"Grand'Combe-Châteleu", +"Grand'Combe-des-Bois", +"Grand'Landais", +"Grand'Landaise", +"Grand'Landaises", +"Grand'Landes", +"Grand'Mèrois", +"Grand'Mérien", +"Grand'Mérois", +"Grand'Rivière", +"Grand'hamien", +"Grand'hamienne", +"Grand'hamiennes", +"Grand'hamiens", +"Grand'mérois", +"Grand-Auverné", +"Grand-Bourg", +"Grand-Brassac", +"Grand-Camp", +"Grand-Champ", +"Grand-Charmont", +"Grand-Corent", +"Grand-Couronne", +"Grand-Failly", +"Grand-Fayt", +"Grand-Fort-Philippe", +"Grand-Fougeray", +"Grand-Laviers", +"Grand-Rozoy", +"Grand-Rullecourt", +"Grand-Santi", +"Grand-Verly", "Grandcamp-Maisy", "Grandchamp-le-Château", "Grandchamps-des-Fontaines", -"grand'chose", -"Grand'Combe-Châteleu", -"Grand'Combe-des-Bois", -"grand'faim", +"Grande-Rivière", +"Grande-Synthe", "Grandfontaine-sur-Creuse", -"grand'garde", -"grand'gardes", -"grandgousier-pélican", -"grand'hamien", -"Grand'hamien", -"grand'hamienne", -"Grand'hamienne", -"grand'hamiennes", -"Grand'hamiennes", -"grand'hamiens", -"Grand'hamiens", -"grand'honte", -"grand'hontes", -"grand'landais", -"Grand'Landais", -"grand'landaise", -"Grand'Landaise", -"grand'landaises", -"Grand'Landaises", -"Grand'Landes", "Grandlup-et-Fay", -"grand'maman", -"grand'mamans", -"grand'maternité", -"grand'maternités", -"grand'mère", -"grand'mères", -"Grand'Mérien", -"Grand'mérois", -"Grand'Mérois", -"Grand'Mèrois", -"grand'messe", -"grand'messes", -"grand'paternité", -"grand'paternités", "Grandpuits-Bailly-Carrois", -"Grand'Rivière", "Grandrupt-de-Bains", -"grand'tante", -"grand'tantes", -"Grandvelle-et-le-Perrenot", "Grandvelle-et-Perrenot", +"Grandvelle-et-le-Perrenot", "Grandville-Gaudreville", "Grandvillers-aux-Bois", "Grange-de-Vaivre", "Grange-le-Bocage", "Granges-Aumontzey", +"Granges-Maillot", +"Granges-Narboz", +"Granges-Paccot", +"Granges-Sainte-Marie", "Granges-d'Ans", "Granges-de-Plombières", "Granges-de-Vienney", "Granges-la-Ville", "Granges-le-Bourg", "Granges-les-Beaumont", -"Granges-Maillot", -"Granges-Narboz", -"Granges-Paccot", -"Granges-Sainte-Marie", "Granges-sur-Aube", "Granges-sur-Baume", "Granges-sur-Lot", "Granges-sur-Vologne", -"grano-lamellaire", "Granzay-Gript", -"grap-fruit", -"grap-fruits", -"grapho-moteur", -"grappe-fruit", -"gras-double", -"gras-doubles", -"gras-fondu", "Grateloup-Saint-Gayrand", -"grattes-ciels", -"grave-cimens", -"grave-ciment", -"grave-ciments", "Graveron-Sémerville", -"graves-ciment", "Graves-Saint-Amant", -"gravi-kora", +"Gray-la-Ville", +"Gray-la-Villois", +"Gray-la-Villoise", +"Gray-la-Villoises", "Grayan-et-l'Hôpital", "Graye-et-Charnay", "Graye-sur-Mer", -"Gray-la-Ville", -"gray-la-villois", -"Gray-la-Villois", -"gray-la-villoise", -"Gray-la-Villoise", -"gray-la-villoises", -"Gray-la-Villoises", -"Grébault-Mesnil", "Grebs-Niendorf", -"Grèce-Centrale", -"Grèce-Occidentale", -"Gréez-sur-Roc", -"Grégy-sur-Yerre", "Gremersdorf-Buchholz", "Grenade-sur-Garonne", "Grenade-sur-l'Adour", -"grenadiers-voltigeurs", -"grenadier-voltigeur", "Grenand-lès-Sombernon", "Grenant-lès-Sombernon", "Greneville-en-Beauce", "Grenier-Montgon", -"grenouilles-taureaux", -"grenouille-taureau", "Grenville-sur-la-Rouge", "Grenzach-Wyhlen", -"Gréoux-les-Bains", -"Grésigny-Sainte-Reine", "Gresse-en-Vercors", "Gressoney-La-Trinité", "Gressoney-Saint-Jean", -"Grésy-sur-Aix", -"Grésy-sur-Isère", "Gretz-Armainvilliers", -"Gréville-Hague", "Grez-Doiceau", -"Grez-en-Bouère", -"Grézet-Cavagnan", -"Grézieu-la-Varenne", -"Grézieu-le-Marché", -"Grézieux-le-Fromental", "Grez-Neuville", -"grez-neuvillois", "Grez-Neuvillois", -"grez-neuvilloise", "Grez-Neuvilloise", -"grez-neuvilloises", "Grez-Neuvilloises", +"Grez-en-Bouère", "Grez-sur-Loing", -"griche-dents", "Griesbach-au-Val", "Griesbach-le-Bastberg", "Griesheim-près-Molsheim", "Griesheim-sur-Souffel", "Griesheim-sur-Souffle", -"gri-gri", -"gri-gris", -"gril-au-vent", -"grille-midi", -"grille-pain", -"grille-pains", "Grimaucourt-en-Woëvre", "Grimaucourt-près-Sampigny", "Grincourt-lès-Pas", "Grindorff-Bizing", -"grippe-argent", -"grippe-chair", -"grippe-fromage", -"grippe-fromages", -"grippe-minaud", -"grippe-minauds", -"grippe-sou", -"grippe-sous", -"grise-bonne", -"grises-bonnes", -"gris-farinier", -"gris-fariniers", -"gris-gris", -"gris-pendart", -"gris-pendarts", -"Grisy-les-Plâtres", "Grisy-Suisnes", +"Grisy-les-Plâtres", "Grisy-sur-Seine", "Grivy-Loisy", "Groot-Abeele", @@ -11949,82 +5372,64 @@ FR_BASE_EXCEPTIONS = [ "Groot-Loon", "Groot-Valkenisse", "Groot-Wetsinge", +"Gros-Chastang", +"Gros-Morne", +"Gros-Réderching", "Grosbois-en-Montagne", "Grosbois-lès-Tichey", -"Groslée-Saint-Benoît", "Grosley-sur-Risle", -"Groß-Bieberau", -"grosse-de-fonte", -"grosse-gorge", +"Groslée-Saint-Benoit", +"Groslée-Saint-Benoît", +"Gross-Gerau", "Grosse-Islois", "Grosseto-Prugna", -"Gross-Gerau", -"Groß-Gerau", -"grosso-modo", -"Groß-Rohrheim", -"Großtreben-Zwethau", -"Groß-Umstadt", -"Groß-Zimmern", "Grote-Brogel", "Grote-Spouwen", "Grouches-Luchuel", -"Gruchet-le-Valasse", +"Groß-Bieberau", +"Groß-Gerau", +"Groß-Rohrheim", +"Groß-Umstadt", +"Groß-Zimmern", +"Großtreben-Zwethau", "Gruchet-Saint-Siméon", +"Gruchet-le-Valasse", "Gruey-lès-Surance", "Grugé-l'Hôpital", "Grun-Bordas", -"Grünhain-Beierfeld", "Grunow-Dammendorf", -"g-strophanthine", -"guarasu'we", +"Grâce-Berleur", +"Grâce-Hollogne", +"Grâce-Uzel", +"Grâcieux-Hollognois", +"Grâcieux-Hollognoise", +"Grèce-Centrale", +"Grèce-Occidentale", +"Grébault-Mesnil", +"Gréez-sur-Roc", +"Grégy-sur-Yerre", +"Gréoux-les-Bains", +"Grésigny-Sainte-Reine", +"Grésy-sur-Aix", +"Grésy-sur-Isère", +"Gréville-Hague", +"Grézet-Cavagnan", +"Grézieu-la-Varenne", +"Grézieu-le-Marché", +"Grézieux-le-Fromental", +"Grünhain-Beierfeld", "Gudmont-Villiers", -"Guéblange-lès-Dieuze", -"Guéblange-lès-Sarralbe", -"gué-d'allérien", -"Gué-d'Allérien", -"gué-d'allérienne", -"Gué-d'Allérienne", -"gué-d'allériennes", -"Gué-d'Allériennes", -"gué-d'allériens", -"Gué-d'Allériens", -"Gué-d'Hossus", -"Guémené-Penfao", -"Guémené-sur-Scorff", -"guerre-éclair", "Guessling-Hémering", -"guet-apens", -"guet-à-pent", -"guet-appens", -"guets-apens", -"guette-chemin", -"gueule-bée", -"gueule-de-loup", -"gueules-de-loup", "Gueutteville-les-Grès", "Gueytes-et-Labastide", "Gugney-aux-Aulx", -"guide-âne", -"guide-ânes", -"guide-fil", -"guide-fils", -"guide-main", -"guigne-cul", -"guigne-culs", "Guigneville-sur-Essonne", "Guignicourt-sur-Vence", "Guiler-sur-Goyen", -"guilherandaise-grangeoise", -"Guilherandaise-Grangeoise", -"guilherandaises-grangeoises", -"Guilherandaises-Grangeoises", -"guilherandais-grangeois", -"Guilherandais-Grangeois", "Guilherand-Granges", -"guili-guili", -"guili-guilis", -"guillemet-apostrophe", -"guillemets-apostrophes", +"Guilherandais-Grangeois", +"Guilherandaise-Grangeoise", +"Guilherandaises-Grangeoises", "Guilligomarc'h", "Guillon-les-Bains", "Guinarthe-Parenties", @@ -12036,86 +5441,65 @@ FR_BASE_EXCEPTIONS = [ "Guipry-Messac", "Guiry-en-Vexin", "Guitalens-L'Albarède", -"guitare-harpe", -"guitare-violoncelle", -"guitare-violoncelles", "Guitera-les-Bains", -"guit-guit", "Gujan-Mestras", -"gulf-stream", -"gulf-streams", -"Gülitz-Reetz", "Gulpen-Wittem", -"Gülzow-Prüzen", "Gumbrechtshoffen-Oberbronn", -"Günthersleben-Wechmar", "Gurcy-le-Châtel", "Gurgy-la-Ville", "Gurgy-le-Château", -"gusathion-éthyl", -"gusathion-méthyl", "Gusow-Platkow", "Gutenzell-Hürbel", "Gutierre-Muñoz", -"gut-komm", -"gutta-percha", "Guttet-Feschel", -"gutturo-maxillaire", "Guyans-Durnes", "Guyans-Vennes", "Guyencourt-Saulcourt", "Guyencourt-sur-Noye", -"gwich'in", +"Gué-d'Allérien", +"Gué-d'Allérienne", +"Gué-d'Allériennes", +"Gué-d'Allériens", +"Gué-d'Hossus", +"Guéblange-lès-Dieuze", +"Guéblange-lès-Sarralbe", +"Guémené-Penfao", +"Guémené-sur-Scorff", "Gy-en-Sologne", -"Gyé-sur-Seine", -"Gy-les-Nonains", "Gy-l'Evêque", "Gy-l'Évêque", +"Gy-les-Nonains", +"Gyé-sur-Seine", +"Gère-Bélesten", +"Gère-Bélestinois", +"Gère-Bélestinoise", +"Gère-Bélestinoises", +"Gée-Rivière", +"Géfosse-Fontenay", +"Génicourt-sous-Condé", +"Génicourt-sur-Meuse", +"Géus-d'Arzacq", +"Gézier-et-Fontenelay", +"Göhren-Döhlen", +"Göhren-Lebbin", +"Gülitz-Reetz", +"Gülzow-Prüzen", +"Günthersleben-Wechmar", +"Gœgnies-Chaussée", "Ha'ava", "Habay-la-Neuve", "Habay-la-Vieille", "Habère-Lullin", "Habère-Poche", -"hache-bâché", -"hache-écorce", -"hache-écorces", -"hache-légume", -"hache-légumes", -"hache-paille", -"hache-pailles", "Hadancourt-le-Haut-Clocher", "Hadigny-les-Verrières", "Hadonville-lès-Lachaussée", -"Häg-Ehrsberg", "Hagenthal-le-Bas", "Hagenthal-le-Haut", -"hagio-onomastique", -"hagio-onomastiques", "Hagnéville-et-Roncourt", -"ha-ha", -"hâ-hâ", -"ha-has", -"hâ-hâs", "Haine-Saint-Paul", "Haine-Saint-Pierre", -"hakko-ryu", -"hale-à-bord", -"hale-avans", -"hale-avant", -"hale-avants", -"hale-bas", -"hale-breu", -"hale-croc", -"hale-dedans", -"hale-dehors", -"haleine-de-Jupiter", -"haleines-de-Jupiter", "Halenbeck-Rohlsdorf", -"half-and-half", -"half-pipe", -"half-pipes", -"half-track", -"half-tracks", "Halifaxois-du-Sud", "Halle-Booienhoven", "Halle-Heide", @@ -12125,181 +5509,114 @@ FR_BASE_EXCEPTIONS = [ "Halling-lès-Boulay", "Halling-lès-Boulay-Moselle", "Halloy-lès-Pernois", -"halo-halo", -"halo-lunaire", -"halos-lunaires", -"haloxyfop-éthoxyéthyl", -"haloxyfop-R", -"halte-garderie", -"halte-garderies", -"halte-là", -"haltes-garderies", -"halvadji-bachi", -"Hamblain-les-Prés", -"Hamelin-Pyrmont", -"Ham-en-Artois", -"Hames-Boucres", -"hames-boucrois", -"Hames-Boucrois", -"hames-boucroise", -"Hames-Boucroise", -"hames-boucroises", -"Hames-Boucroises", -"Ham-les-Moines", -"Hamme-Mille", -"hamme-millois", -"Hamme-Millois", -"Hamme-Milloise", -"ham-nalinnois", "Ham-Nalinnois", "Ham-Nalinnoise", "Ham-Nordois", -"Hamont-Achel", +"Ham-en-Artois", +"Ham-les-Moines", "Ham-sans-Culottes", "Ham-sous-Varsberg", "Ham-sur-Heure", "Ham-sur-Heure-Nalinnes", "Ham-sur-Meuse", "Ham-sur-Sambre", +"Hamblain-les-Prés", +"Hamelin-Pyrmont", +"Hames-Boucres", +"Hames-Boucrois", +"Hames-Boucroise", +"Hames-Boucroises", +"Hamme-Mille", +"Hamme-Millois", +"Hamme-Milloise", +"Hamont-Achel", "Han-devant-Pierrepont", -"handi-accessible", -"handi-accessibles", +"Han-lès-Juvigny", +"Han-sur-Lesse", +"Han-sur-Meuse", +"Han-sur-Nied", "Hanerau-Hademarschen", "Hangen-Weisheim", "Hangest-en-Santerre", "Hangest-sur-Somme", -"Han-lès-Juvigny", "Hannogne-Saint-Martin", "Hannogne-Saint-Rémy", -"Hannonville-sous-les-Côtes", "Hannonville-Suzémont", -"Han-sur-Lesse", -"Han-sur-Meuse", -"Han-sur-Nied", +"Hannonville-sous-les-Côtes", "Hantes-Wihéries", -"happe-chair", -"happe-chat", -"happe-foie", -"harai-goshi", -"haraï-goshi", -"hara-kiri", -"hara-kiris", -"hara-kiriser", -"hara-kiriser", "Haraucourt-sur-Seille", -"hard-discount", -"hard-discountisa", -"hard-discountisai", -"hard-discountisaient", -"hard-discountisais", -"hard-discountisait", -"hard-discountisâmes", -"hard-discountisant", -"hard-discountisas", -"hard-discountisasse", -"hard-discountisassent", -"hard-discountisasses", -"hard-discountisassiez", -"hard-discountisassions", -"hard-discountisât", -"hard-discountisâtes", -"hard-discountise", -"hard-discountisé", -"hard-discountisée", -"hard-discountisées", -"hard-discountisent", -"hard-discountiser", -"hard-discountisera", -"hard-discountiserai", -"hard-discountiseraient", -"hard-discountiserais", -"hard-discountiserait", -"hard-discountiseras", -"hard-discountisèrent", -"hard-discountiserez", -"hard-discountiseriez", -"hard-discountiserions", -"hard-discountiserons", -"hard-discountiseront", -"hard-discountises", -"hard-discountisés", -"hard-discountisez", -"hard-discountisiez", -"hard-discountisions", -"hard-discountisons", -"hard-discounts", "Hardecourt-aux-Bois", "Hardencourt-Cocherel", "Hardinxveld-Giessendam", -"hardi-petit", "Hardivillers-en-Vexin", "Hargarten-aux-Mines", "Hargeville-sur-Chée", -"harpe-guitare", -"harpe-luth", "Harréville-les-Chanteurs", "Hartennes-et-Taux", "Harth-Pöllnitz", "Hartmannsdorf-Reichenau", -"has-been", -"has-beens", "Hastière-Lavaux", "Hastière-par-delà", +"Haucourt-Moulaine", "Haucourt-en-Cambrésis", "Haucourt-la-Rigole", -"Haucourt-Moulaine", "Hauenstein-Ifenthal", "Haumont-lès-Lachaussée", "Haumont-près-Samogneux", "Hauptwil-Gottshaus", -"hausse-col", -"hausse-cols", -"hausse-pied", -"hausse-pieds", -"hausse-queue", -"Hautecourt-lès-Broville", +"Haut-Bocage", +"Haut-Clocher", +"Haut-Lieu", +"Haut-Loquin", +"Haut-Mauco", +"Haut-de-Bosdarros", +"Haut-du-Them-Château-Lambert", +"Haute-Amance", +"Haute-Avesnes", +"Haute-Goulaine", +"Haute-Isle", +"Haute-Kontz", +"Haute-Rivoire", +"Haute-Vigneulles", +"Haute-Épine", "Hautecourt-Romanèche", +"Hautecourt-lès-Broville", "Hautefage-la-Tour", -"Hautem-Sainte-Marguerite", "Hautem-Saint-Liévin", +"Hautem-Sainte-Marguerite", "Hautepierre-le-Châtelet", "Hauterive-la-Fresse", +"Hautes-Duyes", "Hauteville-Gondon", -"Hauteville-la-Guichard", -"Hauteville-lès-Dijon", "Hauteville-Lompnes", "Hauteville-Lompnés", +"Hauteville-la-Guichard", +"Hauteville-lès-Dijon", "Hauteville-sur-Fier", "Hauteville-sur-Mer", "Hauthem-Saint-Liévin", +"Hautot-Saint-Sulpice", "Hautot-l'Auvray", "Hautot-le-Vatois", -"Hautot-Saint-Sulpice", "Hautot-sur-Mer", "Hautot-sur-Seine", "Hautteville-Bocage", "Hautvillers-Ouville", "Havre-Saint-Pierrois", -"haye-le-comtois", "Haye-le-Comtois", -"haye-le-comtoise", "Haye-le-Comtoise", -"haye-le-comtoises", "Haye-le-Comtoises", -"Haÿ-les-Roses", "Hazerswoude-Dorp", "Hazerswoude-Rijndijk", +"Haÿ-les-Roses", "Hechtel-Eksel", "Heckelberg-Brunow", -"hecto-ohm", -"hecto-ohms", -"Hédé-Bazouges", "Heeswijk-Dinther", "Heeze-Leende", -"Heiltz-le-Hutier", -"Heiltz-le-Maurupt", "Heiltz-l'Evêque", "Heiltz-l'Évêque", +"Heiltz-le-Hutier", +"Heiltz-le-Maurupt", "Heining-lès-Bouzonville", "Heist-op-den-Berg", "Heist-sur-la-Montagne", @@ -12310,75 +5627,36 @@ FR_BASE_EXCEPTIONS = [ "Hellschen-Heringsand-Unterschaar", "Helmstadt-Bargen", "Hem-Hardinval", -"hémi-dodécaèdre", -"hémi-épiphyte", -"hémi-épiphytes", -"hémi-octaèdre", "Hem-Lenglet", "Hem-Monacu", "Hendecourt-lès-Cagnicourt", "Hendecourt-lès-Ransart", "Hendrik-Ido-Ambacht", -"Hénin-Beaumont", -"Hénin-sur-Cojeul", "Henri-Chapelle", "Henstedt-Ulzburg", -"hentai-gana", -"hépato-biliaire", -"hépato-cystique", -"hépato-cystiques", -"hépato-gastrique", -"hépato-gastrite", -"hépato-gastrites", -"herbe-à-cochon", -"herbe-au-bitume", -"herbe-aux-femmes-battues", -"herbe-aux-plaies", -"herbes-à-cochon", -"herbes-au-bitume", -"herbes-aux-femmes-battues", -"herbes-aux-plaies", -"herbes-aux-taupes", -"Herck-la-Ville", "Herck-Saint-Lambert", -"herd-book", +"Herck-la-Ville", "Herdwangen-Schönach", -"Héricourt-en-Caux", -"Héricourt-Saint-Samson", -"Héricourt-sur-Thérain", "Heringen-sur-Helme", -"Hérinnes-lez-Enghien", "Herlin-le-Sec", "Hermalle-sous-Argenteau", "Hermalle-sous-Huy", "Hermanville-sur-Mer", "Hermeton-sur-Meuse", -"Herméville-en-Woëvre", "Hermitage-Lorge", "Hermival-les-Vaux", +"Herméville-en-Woëvre", "Hernán-Pérez", -"héroï-comique", -"héroï-comiques", -"Hérouville-en-Vexin", -"Hérouville-Saint-Clair", "Herpy-l'Arlésienne", "Herren-Sulzbach", "Herrlisheim-près-Colmar", "Herschweiler-Pettersheim", "Hersfeld-Rotenburg", "Hersin-Coupigny", -"Héry-sur-Alby", "Herzebrock-Clarholz", -"Hesdigneul-lès-Béthune", "Hesdigneul-lès-Boulogne", +"Hesdigneul-lès-Béthune", "Hesdin-l'Abbé", -"hétéro-céphalophorie", -"hétéro-céphalophories", -"hétéro-épitaxie", -"hétéro-évaluation", -"hétéro-évaluations", -"hétéro-réparation", -"hétéro-réparations", "Hettange-Grande", "Heubécourt-Haricourt", "Heuchelheim-Klingen", @@ -12393,253 +5671,73 @@ FR_BASE_EXCEPTIONS = [ "Heuilley-sur-Saône", "Heume-l'Eglise", "Heume-l'Église", -"heure-homme", "Heure-le-Romain", "Heure-le-Tixhe", -"heure-lumière", -"heures-hommes", -"heures-lumière", -"heurte-pot", "Heusden-Zolder", -"hexa-core", -"hexa-cores", -"hexa-rotor", -"hexa-rotors", -"Hières-sur-Amby", "Hiers-Brouage", -"hi-fi", -"high-life", -"high-tech", "Higuères-Souye", -"hi-han", "Hilgertshausen-Tandern", -"himène-plume", "Hinzert-Pölert", -"hip-hop", -"hip-hopisa", -"hip-hopisai", -"hip-hopisaient", -"hip-hopisais", -"hip-hopisait", -"hip-hopisâmes", -"hip-hopisant", -"hip-hopisas", -"hip-hopisasse", -"hip-hopisassent", -"hip-hopisasses", -"hip-hopisassiez", -"hip-hopisassions", -"hip-hopisât", -"hip-hopisâtes", -"hip-hopise", -"hip-hopisé", -"hip-hopisée", -"hip-hopisées", -"hip-hopisent", -"hip-hopiser", -"hip-hopisera", -"hip-hopiserai", -"hip-hopiseraient", -"hip-hopiserais", -"hip-hopiserait", -"hip-hopiseras", -"hip-hopisèrent", -"hip-hopiserez", -"hip-hopiseriez", -"hip-hopiserions", -"hip-hopiserons", -"hip-hopiseront", -"hip-hopises", -"hip-hopisés", -"hip-hopisez", -"hip-hopisiez", -"hip-hopisions", -"hip-hopisons", -"hippocampe-feuillu", -"hippocampes-feuillus", "Hirz-Maulsbach", -"hispano-américain", -"hispano-américaine", -"hispano-américaines", -"hispano-américains", -"hispano-arabe", -"hispano-arabes", -"hispano-mauresque", -"hispano-moresque", -"hispano-moresques", -"histoire-géo", -"historico-culturelle", -"hitléro-trotskisme", -"hitléro-trotskiste", -"hit-parade", -"hit-parades", "Hiva-Oa", -"hoat-chi", +"Hières-sur-Amby", "Hochdorf-Assenheim", -"hoche-cul", -"hoche-culs", -"hoche-queue", -"Hô-Chi-Minh-Ville", "Hochstetten-Dhaun", "Hodenc-en-Bray", "Hodenc-l'Evêque", "Hodenc-l'Évêque", -"Hodeng-au-Bosc", "Hodeng-Hodenger", +"Hodeng-au-Bosc", "Hofstetten-Flüh", +"Hohen-Sülzen", "Hohenberg-Krusemark", "Hohenfels-Essingen", -"Höhenkirchen-Siegertsbrunn", "Hohenstein-Ernstthal", -"Hohen-Sülzen", -"Höhr-Grenzhausen", -"hokkaïdo-ken", -"hold-up", -"Hollande-du-Nord", -"Hollande-du-Sud", "Hollande-Méridionale", "Hollande-Septentrionale", +"Hollande-du-Nord", +"Hollande-du-Sud", "Hollern-Twielenfleth", "Hollogne-aux-Pierres", "Hollogne-sur-Geer", "Holstein-de-l'Est", "Hombourg-Budange", "Hombourg-Haut", -"Hôme-Chamondot", -"home-jacking", -"home-jackings", -"home-sitter", -"home-sitters", -"home-sitting", -"home-sittings", -"home-trainer", -"home-trainers", -"homme-animal", -"homme-chacal", -"homme-clé", -"homme-femme", -"homme-fourmi", -"homme-grenouille", -"homme-léopard", -"homme-loup", -"homme-mort", -"homme-morts", -"homme-objet", -"homme-orchestre", -"homme-robot", -"homme-sandwich", -"hommes-chacals", -"hommes-clés", -"hommes-femmes", -"hommes-fourmis", -"hommes-grenouilles", -"hommes-léopards", -"hommes-loups", -"hommes-objets", -"hommes-orchestres", -"hommes-robots", -"hommes-sandwiches", -"hommes-sandwichs", -"hommes-troncs", -"homme-tronc", -"homo-épitaxie", -"homo-épitaxies", -"honey-dew", -"Hong-Kong", -"hong-kongais", -"Hong-kongais", -"hong-kongaise", -"Hong-kongaise", -"hong-kongaises", -"Hong-kongaises", -"Honguemare-Guenouville", -"hon-hergeois", "Hon-Hergeois", -"hon-hergeoise", "Hon-Hergeoise", -"hon-hergeoises", "Hon-Hergeoises", "Hon-Hergies", +"Hong-Kong", +"Hong-kongais", +"Hong-kongaise", +"Hong-kongaises", +"Honguemare-Guenouville", "Honnecourt-sur-Escaut", "Honnécourt-sur-l'Escaut", "Honor-de-Cos", "Hoog-Baarlo", "Hoog-Caestert", -"Hoogezand-Sappemeer", "Hoog-Geldrop", "Hoog-Keppel", +"Hoogezand-Sappemeer", "Hoorebeke-Saint-Corneille", "Hoorebeke-Sainte-Marie", -"Hôpital-Camfrout", -"Hôpital-d'Orion", -"Hôpital-du-Grosbois", -"Hôpital-le-Grand", -"Hôpital-le-Mercier", -"Hôpital-Saint-Blaise", -"Hôpital-Saint-Lieffroy", -"Hôpital-sous-Rochefort", "Hoppstädten-Weiersbach", "Horbourg-Wihr", "Horion-Hozémont", "Horndon-on-the-Hill", "Hornow-Wadelsdorf", "Hornoy-le-Bourg", -"horo-kilométrique", -"horo-kilométriques", "Horrenbach-Buchen", -"hors-bord", -"hors-bords", -"hors-champ", -"hors-concours", -"hors-d'oeuvre", -"hors-d'œuvre", -"horse-ball", -"horse-guard", -"horse-guards", -"Hörselberg-Hainich", -"hors-fonds", -"hors-jeu", -"hors-jeux", -"hors-la-loi", -"hors-ligne", -"hors-lignes", -"hors-norme", -"hors-piste", -"hors-pistes", -"hors-sac", -"hors-série", -"hors-séries", -"hors-service", -"hors-sol", -"hors-sols", -"hors-sujet", -"hors-temps", -"hors-texte", -"hors-textes", "Horville-en-Ornois", "Hospitalet-du-Larzac", "Hospitalet-près-l'Andorre", "Hoste-Haut", -"hostello-flavien", "Hostello-Flavien", -"hostello-flavienne", "Hostello-Flavienne", -"hostello-flaviennes", "Hostello-Flaviennes", -"hostello-flaviens", "Hostello-Flaviens", -"hot-dog", -"hot-dogs", -"Hôtel-de-Ville", -"hôtel-Dieu", -"Hôtel-Dieu", -"Hôtellerie-de-Flée", -"hôtellerie-restauration", -"hôtels-Dieu", -"hot-melt", -"hot-melts", "Hotot-en-Auge", -"hot-plug", "Hottot-les-Bagues", "Houdain-lez-Bavay", "Houdelaucourt-sur-Othain", @@ -12648,181 +5746,82 @@ FR_BASE_EXCEPTIONS = [ "Houdeng-Gœgnies", "Houlbec-Cocherel", "Houlbec-près-le-Gros-Theil", -"houl'eau", "Houphouët-Boigny", "Houplin-Ancoisne", -"house-boats", -"Houtain-le-Val", -"Houtain-l'Évêque", -"Houtain-Saint-Siméon", "Hout-Blerick", +"Houtain-Saint-Siméon", +"Houtain-l'Évêque", +"Houtain-le-Val", "Houthalen-Helchteren", "Houville-en-Vexin", "Houville-la-Branche", "Houvin-Houvigneul", -"houx-frelon", -"houx-frelons", "Hoya-Gonzalo", "Huanne-Montmartin", "Hubert-Folie", "Huby-Saint-Leu", -"Huércal-Overa", -"Huétor-Tájar", "Hugleville-en-Caux", "Huilly-sur-Seille", -"huis-clos", "Huisnes-sur-Mer", "Huison-Longueville", "Huisseau-en-Beauce", "Huisseau-sur-Cosson", "Huisseau-sur-Mauves", -"huitante-neuf", -"huitante-neuvième", -"huitante-neuvièmes", -"huit-marsiste", -"huit-marsistes", -"huit-pieds", -"huit-reflets", -"huit-ressorts", "Humes-Jorquenay", -"hume-vent", -"huppe-col", "Hures-la-Parade", "Hurons-Wendat", -"huron-wendat", -"Husseren-les-Châteaux", "Husseren-Wesserling", +"Husseren-les-Châteaux", "Hussigny-Godbrange", -"hydrargyro-cyanate", -"hydrargyro-cyanates", -"hydraulico-pneumatique", -"hydro-aviation", -"hydro-aviations", -"hydro-avion", -"hydro-avions", -"hydro-électricité", -"hydro-électricités", -"hydro-électrique", -"hydro-électriques", -"hydro-ensemencement", -"hydro-ensemencements", -"hydro-météorologie", +"Huércal-Overa", +"Huétor-Tájar", "Hyencourt-le-Grand", "Hyencourt-le-Petit", -"hyène-garou", -"hyènes-garous", "Hyèvre-Magny", "Hyèvre-Paroisse", -"hyo-épiglottique", -"hyo-épiglottiques", -"hyo-pharyngien", -"hypo-centre", -"hypo-centres", -"hypo-iodeuse", -"hypo-iodeuses", -"hypo-iodeux", -"hypothético-déductif", -"hystéro-catalepsie", -"hystéro-catalepsies", -"hystéro-épilepsie", -"hystéro-épilepsies", +"Häg-Ehrsberg", +"Hédé-Bazouges", +"Hénin-Beaumont", +"Hénin-sur-Cojeul", +"Héricourt-Saint-Samson", +"Héricourt-en-Caux", +"Héricourt-sur-Thérain", +"Hérinnes-lez-Enghien", +"Hérouville-Saint-Clair", +"Hérouville-en-Vexin", +"Héry-sur-Alby", +"Hô-Chi-Minh-Ville", +"Hôme-Chamondot", +"Hôpital-Camfrout", +"Hôpital-Saint-Blaise", +"Hôpital-Saint-Lieffroy", +"Hôpital-d'Orion", +"Hôpital-du-Grosbois", +"Hôpital-le-Grand", +"Hôpital-le-Mercier", +"Hôpital-sous-Rochefort", +"Hôtel-Dieu", +"Hôtel-de-Ville", +"Hôtellerie-de-Flée", +"Höhenkirchen-Siegertsbrunn", +"Höhr-Grenzhausen", +"Hörselberg-Hainich", +"I-frame", +"II-VI", +"III-V", +"IS-IS", "Iamalo-Nénètsie", -"iatro-magique", -"iatro-magiques", -"ibéro-roman", -"i-butane", -"i-butanes", -"ice-belt", -"ice-belts", -"ice-berg", -"ice-bergs", -"ice-blink", -"ice-blinks", -"ice-bloc", -"ice-blocs", -"ice-cream", -"ice-creams", -"ice-foot", -"ice-foots", -"ice-rapt", -"ice-rapts", -"ice-table", -"ice-tables", -"ici-bas", "Idanha-a-Nova", "Idar-Oberstein", "Idaux-Mendy", -"idéal-type", -"idée-force", -"idée-maîtresse", -"idées-forces", -"idées-maîtresses", -"idio-électricité", -"idio-électrique", -"idio-électriques", "Idrac-Respaillès", "Ids-Saint-Roch", -"i.-e.", -"ifira-mele", -"ifira-meles", -"I-frame", "Igny-Comblizy", -"igny-marin", "Igny-Marin", -"igny-marine", "Igny-Marine", -"igny-marines", "Igny-Marines", -"igny-marins", "Igny-Marins", -"III-V", -"II-VI", -"Île-aux-Moines", -"Île-Bouchard", -"Île-d'Aix", -"Île-d'Anticosti", -"Île-d'Arz", -"Île-de-Batz", -"Île-de-Bréhat", "Ile-de-France", -"île-de-France", -"Île-de-France", -"Île-d'Elle", -"Île-de-Sein", -"Île-d'Houat", -"Île-d'Olonne", -"Île-du-Prince-Édouard", -"Île-d'Yeu", -"île-État", -"Île-Molène", -"iléo-cæcal", -"iléo-cæcale", -"iléo-cæcales", -"iléo-cæcaux", -"iléo-colique", -"iléo-coliques", -"iléos-meldois", -"Iléos-Meldois", -"iléos-meldoise", -"Iléos-Meldoise", -"iléos-meldoises", -"Iléos-Meldoises", -"île-prison", -"Île-Rousse", -"Île-Saint-Denis", -"Îles-de-la-Madeleine", -"îles-États", -"îles-prisons", -"île-tudiste", -"Île-Tudiste", -"île-tudistes", -"Île-Tudistes", -"Île-Tudy", -"iliaco-fémoral", -"iliaco-musculaire", -"ilio-pectiné", -"ilio-pubien", -"ilio-scrotal", "Ille-et-Vilaine", "Ille-sur-Têt", "Illeville-sur-Montfort", @@ -12832,198 +5831,82 @@ FR_BASE_EXCEPTIONS = [ "Illiers-l'Évêque", "Illkirch-Graffenstaden", "Illnau-Effretikon", -"ilo-dionysien", "Ilo-Dionysien", -"îlo-dionysien", -"Îlo-Dionysien", -"ilo-dionysienne", "Ilo-Dionysienne", -"Îlo-Dionysienne", -"ilo-dionysiennes", "Ilo-Dionysiennes", -"ilo-dionysiens", "Ilo-Dionysiens", -"image-gradient", -"imazaméthabenz-méthyl", -"immuno-pharmacologie", -"immuno-pharmacologies", -"impari-nervé", -"impari-nervié", -"impari-penné", -"impératrice-mère", -"impératrices-mères", -"import-export", -"in-12", -"in-12º", -"in-16", -"in-16º", -"in-18", -"in-18º", -"in-32", -"in-4", -"in-4º", -"in-4.º", -"in-4to", -"in-6", -"in-6º", -"in-8", -"in-8º", -"in-8.º", -"in-8vo", -"in-cent-vingt-huit", -"inch'allah", -"inch'Allah", -"Inch'allah", +"Iléos-Meldois", +"Iléos-Meldoise", +"Iléos-Meldoises", "Inch'Allah", +"Inch'allah", "Inchy-en-Artois", -"incito-moteur", -"incito-motricité", -"income-tax", -"indane-1,3-dione", -"inde-plate", -"india-océanisme", -"india-océanismes", -"in-dix-huit", -"in-douze", "Indre-et-Loire", -"in-duodecimo", -"in-fº", -"info-ballon", -"info-ballons", -"info-bulle", -"info-bulles", -"in-folio", -"ingénieur-conseil", -"ingénieur-docteur", -"ingénieure-conseil", -"ingénieures-conseils", -"ingénieur-maître", -"ingénieurs-conseils", -"ingénieurs-docteurs", -"ingénieurs-maîtres", +"Ingrandes-Le Fresne sur Loire", "Ingrandes-de-Touraine", -"in-huit", -"injonction-bâillon", "Injoux-Génissiat", -"in-manus", -"in-octavo", -"in-plano", -"in-plº", -"in-promptu", -"in-quarto", -"insecto-mortifère", -"insecto-mortifères", -"in-sedecimo", -"in-seize", -"in-six", -"inspecteur-chef", -"inspecteurs-chefs", -"insulino-dépendant", -"insulino-dépendante", -"insulino-dépendantes", -"insulino-dépendants", "Interlaken-Oberhasli", -"interno-médial", -"interro-négatif", -"intervertébro-costal", -"in-trente-deux", "Intville-la-Guétard", -"inuit-aléoute", -"inuit-aléoutes", "Inval-Boiron", -"in-vingt-quatre", -"in-vitro", "Inzinzac-Lochrist", -"iodo-borique", -"iodo-chlorure", -"iodosulfuron-méthyl-sodium", -"iowa-oto", -"iowa-otos", -"Î.-P.-É.", -"Iré-le-Sec", "Iruraiz-Gauna", -"ischio-anal", -"ischio-clitorien", -"ischio-fémoral", -"ischio-fémorale", -"ischio-fémorales", -"ischio-fémoraux", -"ischio-jambier", -"ischio-jambière", -"ischio-jambières", -"ischio-jambiers", -"ischio-périnéal", -"ischio-tibial", -"ischio-tibiaux", +"Iré-le-Sec", "Is-en-Bassigny", +"Is-sur-Tille", "Isigny-le-Buat", "Isigny-sur-Mer", -"IS-IS", "Isle-Adam", "Isle-Arné", "Isle-Aubigny", "Isle-Aumont", "Isle-Bouzon", -"Isle-d'Abeau", -"Isle-de-Noé", -"Isle-d'Espagnac", -"Isle-en-Dodon", -"Isle-et-Bardais", "Isle-Jourdain", "Isle-Saint-Georges", -"Isles-les-Meldeuses", -"Isles-lès-Villenoy", +"Isle-Vertois", +"Isle-d'Abeau", +"Isle-d'Espagnac", +"Isle-de-Noé", +"Isle-en-Dodon", +"Isle-et-Bardais", "Isle-sous-Montréal", -"Isles-sur-Suippe", -"Isle-sur-la-Sorgue", -"Isle-sur-le-Doubs", "Isle-sur-Marne", "Isle-sur-Serein", -"Isle-Vertois", +"Isle-sur-la-Sorgue", +"Isle-sur-le-Doubs", +"Isles-les-Meldeuses", +"Isles-lès-Villenoy", +"Isles-sur-Suippe", "Isolaccio-di-Fiumorbo", -"isoxadifen-éthyl", -"israélo-syrienne", "Issancourt-et-Rumel", "Issoudun-Létrieix", -"Is-sur-Tille", -"Issy-les-Moulineaux", "Issy-l'Evêque", "Issy-l'Évêque", -"istro-roumain", +"Issy-les-Moulineaux", "Ithorots-Olhaïby", "Ivano-Fracena", "Ivoy-le-Petit", "Ivoy-le-Pré", "Ivoz-Ramet", -"ivre-mort", -"ivre-morte", -"ivres-mortes", -"ivres-morts", "Ivry-en-Montagne", "Ivry-la-Bataille", "Ivry-le-Temple", "Ivry-sur-Seine", "Izaut-de-l'Hôtel", -"Izel-lès-Equerchin", -"Izel-lès-Équerchin", -"Izel-lès-Hameau", "Izel-les-Hameaux", +"Izel-lès-Equerchin", +"Izel-lès-Hameau", +"Izel-lès-Équerchin", "Izon-la-Bruisse", +"J-pop", +"J-rock", +"JAX-RPC", +"JAX-RS", "Jabreilles-les-Bordes", -"jack-russell", "Jacob-Bellecombette", "Jagny-sous-Bois", -"jaguar-garou", -"jaguars-garous", -"jaï-alaï", -"jaï-alaïs", "Jailly-les-Moulins", "Jaligny-sur-Besbre", -"jambon-beurre", -"jambon-des-jardiniers", -"jambons-des-jardiniers", "Jammu-et-Cachemire", -"jam-sessions", "Jandrain-Jandrenouille", "Janville-sur-Juine", "Jard-sur-Mer", @@ -13033,98 +5916,27 @@ FR_BASE_EXCEPTIONS = [ "Jassans-Riottier", "Jau-Dignac-et-Loirac", "Jaunay-Clan", -"jaunay-clanais", "Jaunay-Clanais", -"jaunay-clanaise", "Jaunay-Clanaise", -"jaunay-clanaises", "Jaunay-Clanaises", "Jaunay-Marigny", "Javerlhac-et-la-Chapelle-Saint-Robert", "Javron-les-Chapelles", -"JAX-RPC", -"JAX-RS", "Jeannois-Mitissien", -"jeans-de-gand", -"jeans-de-janten", -"je-m'en-fichisme", -"je-m'en-fichismes", -"je-m'en-fichiste", -"je-m'en-fichistes", -"je-m'en-foutisme", -"je-m'en-foutismes", -"je-m'en-foutiste", -"je-m'en-foutistes", "Jemeppe-sur-Sambre", -"je-ne-sais-quoi", -"jérôme-boschisme", -"jérôme-boschismes", -"Jésus-Christ", -"jet-set", -"jet-sets", -"jet-settisa", -"jet-settisai", -"jet-settisaient", -"jet-settisais", -"jet-settisait", -"jet-settisâmes", -"jet-settisant", -"jet-settisas", -"jet-settisasse", -"jet-settisassent", -"jet-settisasses", -"jet-settisassiez", -"jet-settisassions", -"jet-settisât", -"jet-settisâtes", -"jet-settise", -"jet-settisé", -"jet-settisée", -"jet-settisées", -"jet-settisent", -"jet-settiser", -"jet-settisera", -"jet-settiserai", -"jet-settiseraient", -"jet-settiserais", -"jet-settiserait", -"jet-settiseras", -"jet-settisèrent", -"jet-settiserez", -"jet-settiseriez", -"jet-settiserions", -"jet-settiserons", -"jet-settiseront", -"jet-settises", -"jet-settisés", -"jet-settisez", -"jet-settisiez", -"jet-settisions", -"jet-settisons", -"jet-stream", -"jet-streams", -"jette-bouts", "Jettingen-Scheppach", -"Jeu-les-Bois", "Jeu-Maloches", -"jeu-malochois", "Jeu-Malochois", -"jeu-malochoise", "Jeu-Malochoise", -"jeu-malochoises", "Jeu-Malochoises", -"jeu-parti", +"Jeu-les-Bois", "Jeux-lès-Bard", "Ji-hu", "Ji-hun", -"jiu-jitsu", "Jodoigne-Souveraine", "John-Bull", "Joigny-sur-Meuse", -"joint-venture", -"joint-ventures", "Joinville-le-Pont", -"joli-bois", "Jollain-Merlin", "Jonchery-sur-Suippe", "Jonchery-sur-Vesle", @@ -13134,24 +5946,14 @@ FR_BASE_EXCEPTIONS = [ "Jonzier-Epagny", "Jonzier-Épagny", "Jorat-Menthue", -"Jouars-Pontchartrain", -"Joué-du-Bois", -"Joué-du-Plain", -"Joué-en-Charnie", -"Joué-Étiau", -"Joué-l'Abbé", -"Joué-lès-Tours", -"Joué-sur-Erdre", -"Jouet-sur-l'Aubois", -"jour-homme", -"jour-lumière", -"Jours-en-Vaux", -"jours-hommes", -"Jours-lès-Baigneux", -"jours-lumière", "Jou-sous-Monjou", +"Jouars-Pontchartrain", +"Jouet-sur-l'Aubois", +"Jours-en-Vaux", +"Jours-lès-Baigneux", "Joux-la-Ville", "Jouxtens-Mézery", +"Jouy-Mauvoisin", "Jouy-aux-Arches", "Jouy-en-Argonne", "Jouy-en-Josas", @@ -13160,48 +5962,22 @@ FR_BASE_EXCEPTIONS = [ "Jouy-le-Moutier", "Jouy-le-Potier", "Jouy-lès-Reims", -"Jouy-Mauvoisin", "Jouy-sous-Thelle", "Jouy-sur-Eure", "Jouy-sur-Morin", -"J-pop", -"J-rock", -"j't'aime", +"Joué-du-Bois", +"Joué-du-Plain", +"Joué-en-Charnie", +"Joué-l'Abbé", +"Joué-lès-Tours", +"Joué-sur-Erdre", +"Joué-Étiau", "Juan-les-Pins", "Juaye-Mondaye", "Jubbega-Schurega", -"Jû-Belloc", -"judéo-allemand", -"judéo-alsacien", -"judéo-arabe", -"judéo-arabes", -"judéo-asiatique", -"judéo-bolchévisme", -"judéo-centrisme", -"judéo-chrétien", -"judéo-chrétienne", -"judéo-chrétiennes", -"judéo-chrétiens", -"judéo-christianisme", -"judéo-christiano-islamique", -"judéo-christiano-islamiques", -"judéo-christiano-musulman", -"judéo-espagnol", -"judéo-espagnole", -"judéo-espagnoles", -"judéo-espagnols", -"judéo-iranien", -"judéo-libyen", -"judéo-lybien", -"judéo-maçonnique", -"judéo-maçonniques", -"judéo-musulman", -"judéo-musulmans", -"judéo-nazi", -"judéo-nazis", "Jugeals-Nazareth", "Jugon-les-Lacs", -"juǀ'hoan", +"Jugon-les-Lacs - Commune nouvelle", "Juif-Errant", "Juifs-Errants", "Juigné-Béné", @@ -13209,74 +5985,56 @@ FR_BASE_EXCEPTIONS = [ "Juigné-sur-Loire", "Juigné-sur-Sarthe", "Juillac-le-Coq", -"ju-jitsu", -"ju-ju", -"juke-box", -"juke-boxes", -"Jully-lès-Buxy", -"jully-sarçois", "Jully-Sarçois", -"jully-sarçoise", "Jully-Sarçoise", -"jully-sarçoises", "Jully-Sarçoises", +"Jully-lès-Buxy", "Jully-sur-Sarce", "Jumilhac-le-Grand", -"junk-food", -"junk-foods", -"jupe-culotte", -"jupes-culottes", "Jupille-sur-Meuse", -"juridico-politique", -"juridico-politiques", -"jusque-là", "Jussecourt-Minecourt", "Jussy-Champagne", "Jussy-le-Chaudrier", -"juste-à-temps", -"juste-au-corps", "Justine-Herbigny", +"Juvigny Val d'Andaine", +"Juvigny-Val-d'Andaine", "Juvigny-en-Perthois", -"Juvigny-les-Vallées", "Juvigny-le-Tertre", +"Juvigny-les-Vallées", "Juvigny-sous-Andaine", "Juvigny-sur-Loison", "Juvigny-sur-Orne", "Juvigny-sur-Seulles", -"Juvigny-Val-d'Andaine", "Juvincourt-et-Damary", "Juvisy-sur-Orge", -"juxta-position", -"juxta-positions", -"Juzet-de-Luchon", "Juzet-d'Izaut", +"Juzet-de-Luchon", +"Jésus-Christ", +"Jû-Belloc", +"K-POP", +"K-Pop", +"K-bis", +"K-pop", +"K-way", +"K-ways", "Kaala-Gomen", "Kabardino-Balkarie", "Kaiser-Wilhelm-Koog", "Kalenborn-Scheuern", -"kali'na", "Kamerik-Houtdijken", "Kamerik-Mijzijde", "Kamp-Bornhofen", +"Kamp-Lintfort", "Kamperzeedijk-Oost", "Kamperzeedijk-West", -"Kamp-Lintfort", "Kani-Kéli", -"kan-kan", -"kan-kans", -"kansai-ben", "Kapel-Avezaath", -"Kapellen-Drusweiler", "Kapelle-op-den-Bos", +"Kapellen-Drusweiler", "Kappel-Grafenhausen", -"karachay-balkar", -"karafuto-ken", -"kara-gueuz", -"kara-kalpak", "Kara-Koum", "Karangasso-Sambla", "Karangasso-Vigué", -"karatchaï-balkar", "Karatchaïévo-Tcherkassie", "Karbow-Vietlübbe", "Karlsdorf-Neuthard", @@ -13286,14 +6044,8 @@ FR_BASE_EXCEPTIONS = [ "Kastel-Staadt", "Katlenburg-Lindau", "Kaysersberg-Vignoble", -"K-bis", -"Kédange-sur-Canner", "Kelpen-Oler", -"kem's", "Kenz-Küstrow", -"kérato-pharyngien", -"kérato-staphylin", -"kérato-staphylins", "Kerckom-lez-Saint-Trond", "Kergrist-Moëlou", "Kerk-Avezaath", @@ -13308,81 +6060,14 @@ FR_BASE_EXCEPTIONS = [ "Kersbeek-Miskom", "Kessel-Eik", "Kessel-Lo", -"khambo-lama", -"khambo-lamas", -"khatti-chérif", -"khatti-chérifs", -"khi-carré", -"khi-carrés", -"khi-deux", "Kiel-Windeweer", -"kif-kif", -"kilo-électrons-volts", -"kiloélectrons-volts", -"kilo-électron-volt", -"kiloélectron-volt", -"kilo-électron-volts", -"kiloélectron-volts", -"kilogramme-force", -"kilogramme-poids", -"kilogrammes-force", -"kilogrammes-poids", -"kilomètre-heure", -"kilomètres-heure", -"kilo-ohm", -"kilo-ohms", -"kin-ball", "Kingston-sur-Tamise", "Kingston-upon-Hull", "Kingston-upon-Thames", -"kino-congolais", "Kino-Congolais", -"kip-kap", -"kip-kaps", "Kirkby-in-Ashfield", "Kirrwiller-Bosselshausen", "Kirsch-lès-Sierck", -"kirsch-wasser", -"kirsch-wassers", -"kiss-in", -"kite-surf", -"kite-surfa", -"kite-surfai", -"kite-surfaient", -"kite-surfais", -"kite-surfait", -"kite-surfâmes", -"kite-surfant", -"kite-surfas", -"kite-surfasse", -"kite-surfassent", -"kite-surfasses", -"kite-surfassiez", -"kite-surfassions", -"kite-surfât", -"kite-surfâtes", -"kite-surfe", -"kite-surfé", -"kite-surfent", -"kite-surfer", -"kite-surfera", -"kite-surferai", -"kite-surferaient", -"kite-surferais", -"kite-surferait", -"kite-surferas", -"kite-surfèrent", -"kite-surferez", -"kite-surferiez", -"kite-surferions", -"kite-surferons", -"kite-surferont", -"kite-surfers", -"kite-surfes", -"kite-surfez", -"kite-surfiez", -"kite-surfions", -"kite-surfons", "Kizil-Arvat", "Klazienaveen-Noord", "Klein-Amsterdam", @@ -13391,127 +6076,715 @@ FR_BASE_EXCEPTIONS = [ "Klein-Delfgauw", "Klein-Doenrade", "Klein-Dongen", -"Kleine-Brogel", -"Kleine-Spouwen", "Klein-Overleek", "Klein-Ulsda", "Klein-Valkenisse", "Klein-Wetsinge", "Klein-Winternheim", "Klein-Zundert", +"Kleine-Brogel", +"Kleine-Spouwen", "Kleßen-Görne", "Klooster-Lidlum", "Klosters-Serneus", -"knicker-bocker", -"knicker-bockers", -"knock-out", -"knock-outa", -"knock-outai", -"knock-outaient", -"knock-outais", -"knock-outait", -"knock-outâmes", -"knock-outant", -"knock-outas", -"knock-outasse", -"knock-outassent", -"knock-outasses", -"knock-outassiez", -"knock-outassions", -"knock-outât", -"knock-outâtes", -"knock-oute", -"knock-outé", -"knock-outée", -"knock-outées", -"knock-outent", -"knock-outer", -"knock-outera", -"knock-outerai", -"knock-outeraient", -"knock-outerais", -"knock-outerait", -"knock-outeras", -"knock-outèrent", -"knock-outerez", -"knock-outeriez", -"knock-outerions", -"knock-outerons", -"knock-outeront", -"knock-outes", -"knock-outés", -"knock-outez", -"knock-outiez", -"knock-outions", -"knock-outons", -"knock-outs", "Knokke-Heist", "Knopp-Labach", "Kobern-Gondorf", -"Kœur-la-Grande", -"Kœur-la-Petite", "Kohren-Sahlis", -"Kölln-Reisiek", "Komki-Ipala", -"Königsbach-Stein", -"Königshain-Wiederau", "Korbeek-Dijle", "Korbeek-Lo", "Korntal-Münchingen", -"ko-soto-gake", "Kottweiler-Schwanden", -"kouan-hoa", -"kouign-aman", -"kouign-amann", -"kouign-amanns", -"kouign-amans", -"K-pop", -"K-Pop", -"K-POP", "Kradolf-Schönenberg", -"krav-naga", "Kreba-Neudorf", "Kreimbach-Kaulbach", -"krésoxim-méthyl", "Kröppelshagen-Fahrendorf", "Kuhlen-Wendorf", -"kung-fu", -"k-voisinage", -"k-voisinages", -"kwan-li-so", -"k-way", -"K-way", -"k-ways", -"K-ways", "KwaZulu-Natal", "Kyzyl-Arvat", +"Kœur-la-Grande", +"Kœur-la-Petite", +"Kédange-sur-Canner", +"Kölln-Reisiek", +"Königsbach-Stein", +"Königshain-Wiederau", +"Kœur-la-Grande", +"Kœur-la-Petite", +"L'Abergement-Clémenciat", +"L'Abergement-Sainte-Colombe", +"L'Abergement-de-Cuisery", +"L'Abergement-de-Varey", +"L'Absie", +"L'Aigle", +"L'Aiguillon", +"L'Aiguillon-sur-Mer", +"L'Aiguillon-sur-Vie", +"L'Ajoupa-Bouillon", +"L'Albenc", +"L'Albère", +"L'Arbresle", +"L'Argentière-la-Bessée", +"L'Aubépin", +"L'Escale", +"L'Escarène", +"L'Estréchure", +"L'Habit", +"L'Haÿ-les-Roses", +"L'Herbergement", +"L'Herm", +"L'Hermenault", +"L'Hermitage", +"L'Honor-de-Cos", +"L'Horme", +"L'Hosmes", +"L'Hospitalet", +"L'Hospitalet-du-Larzac", +"L'Hospitalet-près-l'Andorre", +"L'Houmeau", +"L'Huisserie", +"L'Hôme-Chamondot", +"L'Hôpital", +"L'Hôpital-Saint-Blaise", +"L'Hôpital-Saint-Lieffroy", +"L'Hôpital-d'Orion", +"L'Hôpital-du-Grosbois", +"L'Hôpital-le-Grand", +"L'Hôpital-le-Mercier", +"L'Hôpital-sous-Rochefort", +"L'Hôtellerie", +"L'Hôtellerie-de-Flée", +"L'Isle-Adam", +"L'Isle-Arné", +"L'Isle-Bouzon", +"L'Isle-Jourdain", +"L'Isle-d'Abeau", +"L'Isle-d'Espagnac", +"L'Isle-de-Noé", +"L'Isle-en-Dodon", +"L'Isle-sur-Serein", +"L'Isle-sur-la-Sorgue", +"L'Isle-sur-le-Doubs", +"L'Orbrie", +"L'Oudon", +"L'Union", +"L'Écaille", +"L'Échelle", +"L'Échelle-Saint-Aurin", +"L'Écouvotte", +"L'Église-aux-Bois", +"L'Éguille", +"L'Épine", +"L'Épine-aux-Bois", +"L'Étang-Bertrand", +"L'Étang-Salé", +"L'Étang-Vergy", +"L'Étang-la-Ville", +"L'Étoile", +"L'Étrat", +"L'Île-Bouchard", +"L'Île-Rousse", +"L'Île-Saint-Denis", +"L'Île-d'Elle", +"L'Île-d'Olonne", +"L'Île-d'Yeu", +"L-aminoacide", +"L-aminoacides", +"L-flampropisopropyl", +"L-glycéraldéhyde", +"LGBTI-friendly", +"LGBTI-phobie", +"LGBTI-phobies", +"La Balme-d'Épy", +"La Balme-de-Sillingy", +"La Balme-de-Thuy", +"La Balme-les-Grottes", +"La Barre-de-Monts", +"La Barre-de-Semilly", +"La Barthe-de-Neste", +"La Basse-Vaivre", +"La Bastide-Clairence", +"La Bastide-Pradines", +"La Bastide-Puylaurent", +"La Bastide-Solages", +"La Bastide-d'Engras", +"La Bastide-de-Besplas", +"La Bastide-de-Bousignac", +"La Bastide-de-Lordat", +"La Bastide-de-Sérou", +"La Bastide-des-Jourdans", +"La Bastide-du-Salat", +"La Bastide-sur-l'Hers", +"La Baule-Escoublac", +"La Baume-Cornillane", +"La Baume-d'Hostun", +"La Baume-de-Transit", +"La Bazoche-Gouet", +"La Bazoge-Montpinçon", +"La Bazouge-de-Chemeré", +"La Bazouge-des-Alleux", +"La Bazouge-du-Désert", +"La Bernerie-en-Retz", +"La Besseyre-Saint-Mary", +"La Boissière-d'Ans", +"La Boissière-de-Montaigu", +"La Boissière-des-Landes", +"La Boissière-du-Doré", +"La Boissière-en-Gâtine", +"La Boissière-École", +"La Bollène-Vésubie", +"La Bonneville-sur-Iton", +"La Bosse-de-Bretagne", +"La Bourdinière-Saint-Loup", +"La Breille-les-Pins", +"La Bretonnière-la-Claye", +"La Brosse-Montceaux", +"La Bruère-sur-Loir", +"La Brée-les-Bains", +"La Bussière-sur-Ouche", +"La Bâtie-Montgascon", +"La Bâtie-Montsaléon", +"La Bâtie-Neuve", +"La Bâtie-Rolland", +"La Bâtie-Vieille", +"La Bâtie-des-Fonds", +"La Bégude-de-Mazenc", +"La Bénisson-Dieu", +"La Cadière-d'Azur", +"La Cadière-et-Cambo", +"La Caillère-Saint-Hilaire", +"La Capelle-Balaguier", +"La Capelle-Bleys", +"La Capelle-Bonance", +"La Capelle-et-Masmolène", +"La Capelle-lès-Boulogne", +"La Celle-Condé", +"La Celle-Dunoise", +"La Celle-Guenand", +"La Celle-Saint-Avant", +"La Celle-Saint-Cloud", +"La Celle-Saint-Cyr", +"La Celle-en-Morvan", +"La Celle-les-Bordes", +"La Celle-sous-Chantemerle", +"La Celle-sous-Gouzon", +"La Celle-sur-Loire", +"La Celle-sur-Morin", +"La Celle-sur-Nièvre", +"La Chaise-Baudouin", +"La Chaise-Dieu", +"La Chaize-Giraud", +"La Chaize-le-Vicomte", +"La Chapelle-Achard", +"La Chapelle-Agnon", +"La Chapelle-Anthenaise", +"La Chapelle-Aubareil", +"La Chapelle-Baloue", +"La Chapelle-Bayvel", +"La Chapelle-Bertin", +"La Chapelle-Bertrand", +"La Chapelle-Biche", +"La Chapelle-Blanche", +"La Chapelle-Blanche-Saint-Martin", +"La Chapelle-Bouëxic", +"La Chapelle-Bâton", +"La Chapelle-Chaussée", +"La Chapelle-Craonnaise", +"La Chapelle-Cécelin", +"La Chapelle-Enchérie", +"La Chapelle-Erbrée", +"La Chapelle-Faucher", +"La Chapelle-Felcourt", +"La Chapelle-Forainvilliers", +"La Chapelle-Fortin", +"La Chapelle-Gaceline", +"La Chapelle-Gaugain", +"La Chapelle-Gauthier", +"La Chapelle-Geneste", +"La Chapelle-Glain", +"La Chapelle-Gonaguet", +"La Chapelle-Grésignac", +"La Chapelle-Hareng", +"La Chapelle-Hermier", +"La Chapelle-Heulin", +"La Chapelle-Hugon", +"La Chapelle-Hullin", +"La Chapelle-Huon", +"La Chapelle-Iger", +"La Chapelle-Janson", +"La Chapelle-Lasson", +"La Chapelle-Launay", +"La Chapelle-Laurent", +"La Chapelle-Marcousse", +"La Chapelle-Montabourlet", +"La Chapelle-Montbrandeix", +"La Chapelle-Montligeon", +"La Chapelle-Montlinard", +"La Chapelle-Montmartin", +"La Chapelle-Montmoreau", +"La Chapelle-Montreuil", +"La Chapelle-Moulière", +"La Chapelle-Moutils", +"La Chapelle-Naude", +"La Chapelle-Neuve", +"La Chapelle-Onzerain", +"La Chapelle-Orthemale", +"La Chapelle-Palluau", +"La Chapelle-Pouilloux", +"La Chapelle-Rablais", +"La Chapelle-Rainsouin", +"La Chapelle-Rambaud", +"La Chapelle-Réanville", +"La Chapelle-Saint-André", +"La Chapelle-Saint-Aubert", +"La Chapelle-Saint-Aubin", +"La Chapelle-Saint-Fray", +"La Chapelle-Saint-Géraud", +"La Chapelle-Saint-Jean", +"La Chapelle-Saint-Laud", +"La Chapelle-Saint-Laurent", +"La Chapelle-Saint-Laurian", +"La Chapelle-Saint-Luc", +"La Chapelle-Saint-Martial", +"La Chapelle-Saint-Martin", +"La Chapelle-Saint-Martin-en-Plaine", +"La Chapelle-Saint-Maurice", +"La Chapelle-Saint-Mesmin", +"La Chapelle-Saint-Ouen", +"La Chapelle-Saint-Quillain", +"La Chapelle-Saint-Rémy", +"La Chapelle-Saint-Sauveur", +"La Chapelle-Saint-Sulpice", +"La Chapelle-Saint-Sépulcre", +"La Chapelle-Saint-Ursin", +"La Chapelle-Saint-Étienne", +"La Chapelle-Souëf", +"La Chapelle-Taillefert", +"La Chapelle-Thireuil", +"La Chapelle-Thouarault", +"La Chapelle-Thècle", +"La Chapelle-Thémer", +"La Chapelle-Urée", +"La Chapelle-Vaupelteigne", +"La Chapelle-Vendômoise", +"La Chapelle-Vicomtesse", +"La Chapelle-Viel", +"La Chapelle-Villars", +"La Chapelle-au-Mans", +"La Chapelle-au-Moine", +"La Chapelle-au-Riboul", +"La Chapelle-aux-Bois", +"La Chapelle-aux-Brocs", +"La Chapelle-aux-Chasses", +"La Chapelle-aux-Choux", +"La Chapelle-aux-Filtzméens", +"La Chapelle-aux-Lys", +"La Chapelle-aux-Naux", +"La Chapelle-aux-Saints", +"La Chapelle-d'Abondance", +"La Chapelle-d'Alagnon", +"La Chapelle-d'Aligné", +"La Chapelle-d'Angillon", +"La Chapelle-d'Armentières", +"La Chapelle-d'Aunainville", +"La Chapelle-d'Aurec", +"La Chapelle-de-Bragny", +"La Chapelle-de-Brain", +"La Chapelle-de-Guinchay", +"La Chapelle-de-Surieu", +"La Chapelle-de-la-Tour", +"La Chapelle-des-Fougeretz", +"La Chapelle-des-Marais", +"La Chapelle-des-Pots", +"La Chapelle-devant-Bruyères", +"La Chapelle-du-Bard", +"La Chapelle-du-Bois", +"La Chapelle-du-Bois-des-Faulx", +"La Chapelle-du-Bourgay", +"La Chapelle-du-Châtelard", +"La Chapelle-du-Lou-du-Lac", +"La Chapelle-du-Mont-de-France", +"La Chapelle-du-Mont-du-Chat", +"La Chapelle-du-Noyer", +"La Chapelle-en-Lafaye", +"La Chapelle-en-Serval", +"La Chapelle-en-Valgaudémar", +"La Chapelle-en-Vercors", +"La Chapelle-en-Vexin", +"La Chapelle-la-Reine", +"La Chapelle-lès-Luxeuil", +"La Chapelle-près-Sées", +"La Chapelle-sous-Brancion", +"La Chapelle-sous-Dun", +"La Chapelle-sous-Orbais", +"La Chapelle-sous-Uchon", +"La Chapelle-sur-Aveyron", +"La Chapelle-sur-Chézy", +"La Chapelle-sur-Coise", +"La Chapelle-sur-Dun", +"La Chapelle-sur-Erdre", +"La Chapelle-sur-Furieuse", +"La Chapelle-sur-Loire", +"La Chapelle-sur-Oreuse", +"La Chapelle-sur-Oudon", +"La Chapelle-sur-Usson", +"La Charité-sur-Loire", +"La Chartre-sur-le-Loir", +"La Chaussée-Saint-Victor", +"La Chaussée-Tirancourt", +"La Chaussée-d'Ivry", +"La Chaussée-sur-Marne", +"La Chaux-du-Dombief", +"La Chaux-en-Bresse", +"La Chaze-de-Peyre", +"La Châtre-Langlin", +"La Cluse-et-Mijoux", +"La Colle-sur-Loup", +"La Combe-de-Lancey", +"La Condamine-Châtelard", +"La Couarde-sur-Mer", +"La Cour-Marigny", +"La Couture-Boussey", +"La Croisille-sur-Briance", +"La Croix-Avranchin", +"La Croix-Blanche", +"La Croix-Comtesse", +"La Croix-Helléan", +"La Croix-Valmer", +"La Croix-aux-Bois", +"La Croix-aux-Mines", +"La Croix-de-la-Rochette", +"La Croix-du-Perche", +"La Croix-en-Brie", +"La Croix-en-Champagne", +"La Croix-en-Touraine", +"La Croix-sur-Gartempe", +"La Croix-sur-Ourcq", +"La Croix-sur-Roudoule", +"La Côte-Saint-André", +"La Côte-d'Arbroz", +"La Côte-en-Couzan", +"La Digne-d'Amont", +"La Digne-d'Aval", +"La Fage-Montivernoux", +"La Fage-Saint-Julien", +"La Fare-en-Champsaur", +"La Fare-les-Oliviers", +"La Faute-sur-Mer", +"La Ferrière-Airoux", +"La Ferrière-Bochard", +"La Ferrière-Béchet", +"La Ferrière-au-Doyen", +"La Ferrière-aux-Étangs", +"La Ferrière-de-Flée", +"La Ferrière-en-Parthenay", +"La Ferrière-sur-Risle", +"La Ferté-Alais", +"La Ferté-Beauharnais", +"La Ferté-Bernard", +"La Ferté-Chevresis", +"La Ferté-Gaucher", +"La Ferté-Hauterive", +"La Ferté-Imbault", +"La Ferté-Loupière", +"La Ferté-Macé", +"La Ferté-Milon", +"La Ferté-Saint-Aubin", +"La Ferté-Saint-Cyr", +"La Ferté-Saint-Samson", +"La Ferté-Vidame", +"La Ferté-Villeneuil", +"La Ferté-en-Ouche", +"La Ferté-sous-Jouarre", +"La Ferté-sur-Chiers", +"La Folletière-Abenon", +"La Fontaine-Saint-Martin", +"La Forest-Landerneau", +"La Forêt-Fouesnant", +"La Forêt-Sainte-Croix", +"La Forêt-de-Tessé", +"La Forêt-du-Parc", +"La Forêt-du-Temple", +"La Forêt-le-Roi", +"La Forêt-sur-Sèvre", +"La Fosse-Corduan", +"La Foye-Monjault", +"La Fresnaie-Fayel", +"La Frette-sur-Seine", +"La Garde-Adhémar", +"La Garde-Freinet", +"La Garenne-Colombes", +"La Gonterie-Boulouneix", +"La Grand-Combe", +"La Grand-Croix", +"La Grande-Fosse", +"La Grande-Motte", +"La Grande-Paroisse", +"La Grande-Résie", +"La Grande-Verrière", +"La Gripperie-Saint-Symphorien", +"La Grève-sur-Mignon", +"La Grée-Saint-Laurent", +"La Guerche-de-Bretagne", +"La Guerche-sur-l'Aubois", +"La Haie-Fouassière", +"La Haie-Traversaine", +"La Haute-Beaume", +"La Haute-Maison", +"La Haye-Aubrée", +"La Haye-Bellefond", +"La Haye-Malherbe", +"La Haye-Pesnel", +"La Haye-Saint-Sylvestre", +"La Haye-d'Ectot", +"La Haye-de-Calleville", +"La Haye-de-Routot", +"La Haye-du-Theil", +"La Haye-le-Comte", +"La Houssaye-Béranger", +"La Houssaye-en-Brie", +"La Jaille-Yvon", +"La Jarrie-Audouin", +"La Jonchère-Saint-Maurice", +"La Lande-Chasles", +"La Lande-Patry", +"La Lande-Saint-Léger", +"La Lande-Saint-Siméon", +"La Lande-d'Airou", +"La Lande-de-Fronsac", +"La Lande-de-Goult", +"La Lande-de-Lougé", +"La Lande-sur-Drôme", +"La Lanterne-et-les-Armonts", +"La Loge-Pomblin", +"La Loge-aux-Chèvres", +"La Londe-les-Maures", +"La Louptière-Thénard", +"La Louvière-Lauragais", +"La Lucerne-d'Outremer", +"La Madelaine-sous-Montreuil", +"La Madeleine-Bouvet", +"La Madeleine-Villefrouin", +"La Madeleine-de-Nonancourt", +"La Madeleine-sur-Loing", +"La Magdelaine-sur-Tarn", +"La Maison-Dieu", +"La Marolle-en-Sologne", +"La Mazière-aux-Bons-Hommes", +"La Meilleraie-Tillay", +"La Meilleraye-de-Bretagne", +"La Membrolle-sur-Choisille", +"La Monnerie-le-Montel", +"La Mothe-Achard", +"La Mothe-Saint-Héray", +"La Motte-Chalancon", +"La Motte-Fanjas", +"La Motte-Feuilly", +"La Motte-Fouquet", +"La Motte-Saint-Jean", +"La Motte-Saint-Martin", +"La Motte-Servolex", +"La Motte-Ternant", +"La Motte-Tilly", +"La Motte-d'Aigues", +"La Motte-d'Aveillans", +"La Motte-de-Galaure", +"La Motte-du-Caire", +"La Motte-en-Bauges", +"La Motte-en-Champsaur", +"La Mure-Argens", +"La Neuve-Grange", +"La Neuve-Lyre", +"La Neuvelle-lès-Lure", +"La Neuvelle-lès-Scey", +"La Neuveville-devant-Lépanges", +"La Neuveville-sous-Châtenois", +"La Neuveville-sous-Montfort", +"La Neuville-Bosmont", +"La Neuville-Chant-d'Oisel", +"La Neuville-Garnier", +"La Neuville-Housset", +"La Neuville-Roy", +"La Neuville-Saint-Pierre", +"La Neuville-Sire-Bernard", +"La Neuville-Vault", +"La Neuville-au-Pont", +"La Neuville-aux-Bois", +"La Neuville-aux-Joûtes", +"La Neuville-aux-Larris", +"La Neuville-d'Aumont", +"La Neuville-du-Bosc", +"La Neuville-en-Beine", +"La Neuville-en-Hez", +"La Neuville-en-Tourne-à-Fuy", +"La Neuville-lès-Bray", +"La Neuville-lès-Dorengt", +"La Neuville-lès-Wasigny", +"La Neuville-sur-Essonne", +"La Neuville-sur-Oudeuil", +"La Neuville-sur-Ressons", +"La Neuville-à-Maire", +"La Nocle-Maulaix", +"La Noë-Blanche", +"La Noë-Poulain", +"La Palud-sur-Verdon", +"La Penne-sur-Huveaune", +"La Penne-sur-l'Ouvèze", +"La Petite-Boissière", +"La Petite-Fosse", +"La Petite-Marche", +"La Petite-Pierre", +"La Petite-Raon", +"La Petite-Verrière", +"La Plaine-des-Palmistes", +"La Plaine-sur-Mer", +"La Poterie-Cap-d'Antifer", +"La Poterie-Mathieu", +"La Proiselière-et-Langle", +"La Queue-en-Brie", +"La Queue-les-Yvelines", +"La Rivière-Drugeon", +"La Rivière-Enverse", +"La Rivière-Saint-Sauveur", +"La Rivière-de-Corps", +"La Robine-sur-Galabre", +"La Roche-Bernard", +"La Roche-Blanche", +"La Roche-Canillac", +"La Roche-Chalais", +"La Roche-Clermault", +"La Roche-Derrien", +"La Roche-Guyon", +"La Roche-Mabile", +"La Roche-Maurice", +"La Roche-Morey", +"La Roche-Noire", +"La Roche-Posay", +"La Roche-Rigault", +"La Roche-Vanneau", +"La Roche-Vineuse", +"La Roche-de-Glun", +"La Roche-de-Rame", +"La Roche-des-Arnauds", +"La Roche-en-Brenil", +"La Roche-l'Abeille", +"La Roche-sur-Foron", +"La Roche-sur-Grane", +"La Roche-sur-Yon", +"La Roche-sur-le-Buis", +"La Rochebeaucourt-et-Argentine", +"La Rochette-du-Buis", +"La Ronde-Haye", +"La Roque-Alric", +"La Roque-Baignard", +"La Roque-Esclapon", +"La Roque-Gageac", +"La Roque-Sainte-Marguerite", +"La Roque-d'Anthéron", +"La Roque-en-Provence", +"La Roque-sur-Cèze", +"La Roque-sur-Pernes", +"La Roquette-sur-Siagne", +"La Roquette-sur-Var", +"La Rue-Saint-Pierre", +"La Répara-Auriples", +"La Résie-Saint-Martin", +"La Salette-Fallavaux", +"La Salle-en-Beaumont", +"La Salle-les-Alpes", +"La Salvetat-Belmontet", +"La Salvetat-Lauragais", +"La Salvetat-Peyralès", +"La Salvetat-Saint-Gilles", +"La Salvetat-sur-Agout", +"La Sauvetat-de-Savères", +"La Sauvetat-du-Dropt", +"La Sauvetat-sur-Lède", +"La Sauzière-Saint-Jean", +"La Selle-Craonnaise", +"La Selle-Guerchaise", +"La Selle-en-Coglès", +"La Selle-en-Hermoy", +"La Selle-en-Luitré", +"La Selle-la-Forge", +"La Selle-sur-le-Bied", +"La Serre-Bussière-Vieille", +"La Seyne-sur-Mer", +"La Suze-sur-Sarthe", +"La Séauve-sur-Semène", +"La Terrasse-sur-Dorlay", +"La Teste-de-Buch", +"La Tour-Blanche", +"La Tour-Saint-Gelin", +"La Tour-d'Aigues", +"La Tour-d'Auvergne", +"La Tour-de-Salvagny", +"La Tour-de-Sçay", +"La Tour-du-Crieu", +"La Tour-du-Meix", +"La Tour-du-Pin", +"La Tour-en-Jarez", +"La Tour-sur-Orb", +"La Tourette-Cabardès", +"La Tranche-sur-Mer", +"La Trinité-Porhoët", +"La Trinité-Surzur", +"La Trinité-de-Réville", +"La Trinité-de-Thouberville", +"La Trinité-des-Laitiers", +"La Trinité-du-Mont", +"La Trinité-sur-Mer", +"La Vacheresse-et-la-Rouillie", +"La Vacquerie-et-Saint-Martin-de-Castries", +"La Valette-du-Var", +"La Valla-en-Gier", +"La Valla-sur-Rochefort", +"La Vallée-Mulâtre", +"La Vallée-au-Blé", +"La Vendue-Mignot", +"La Vespière-Friardel", +"La Vicomté-sur-Rance", +"La Vieille-Loye", +"La Vieille-Lyre", +"La Vieux-Rue", +"La Ville-Dieu-du-Temple", +"La Ville-aux-Bois", +"La Ville-aux-Bois-lès-Dizy", +"La Ville-aux-Bois-lès-Pontavert", +"La Ville-aux-Clercs", +"La Ville-aux-Dames", +"La Ville-du-Bois", +"La Ville-sous-Orbais", +"La Ville-ès-Nonais", +"La Villedieu-du-Clain", +"La Villedieu-en-Fontenette", +"La Villeneuve-Bellenoye-et-la-Maize", +"La Villeneuve-au-Châtelot", +"La Villeneuve-au-Chêne", +"La Villeneuve-en-Chevrie", +"La Villeneuve-les-Convers", +"La Villeneuve-lès-Charleville", +"La Villeneuve-sous-Thury", +"La Voulte-sur-Rhône", +"La Vraie-Croix", +"La-Fertois", +"La-Fertoise", +"La-Fertoises", "Laag-Caestert", "Laag-Keppel", "Laag-Nieuwkoop", "Laag-Soeren", -"Laà-Mondrans", "Labarthe-Bleys", "Labarthe-Inard", "Labarthe-Rivière", "Labarthe-sur-Lèze", -"là-bas", "Labastide-Beauvoir", "Labastide-Castel-Amouroux", -"Labastide-Cézéracq", "Labastide-Chalosse", "Labastide-Clairence", "Labastide-Clermont", -"Labastide-d'Anjou", -"Labastide-d'Armagnac", -"Labastide-de-Juvinas", -"Labastide-de-Lévis", +"Labastide-Cézéracq", "Labastide-Dénat", -"Labastide-de-Penne", -"Labastide-de-Virac", -"Labastide-du-Haut-Mont", -"Labastide-du-Temple", -"Labastide-du-Vert", -"Labastide-en-Val", "Labastide-Esparbairenque", "Labastide-Gabausse", "Labastide-Marnhac", @@ -13523,49 +6796,60 @@ FR_BASE_EXCEPTIONS = [ "Labastide-Saint-Pierre", "Labastide-Saint-Sernin", "Labastide-Savès", -"Labastide-sur-Bésorgues", "Labastide-Villefranche", +"Labastide-d'Anjou", +"Labastide-d'Armagnac", +"Labastide-de-Juvinas", +"Labastide-de-Lévis", +"Labastide-de-Penne", +"Labastide-de-Virac", +"Labastide-du-Haut-Mont", +"Labastide-du-Temple", +"Labastide-du-Vert", +"Labastide-en-Val", +"Labastide-sur-Bésorgues", "Labatie-d'Andaure", "Labatut-Rivière", -"Labécède-Lauragais", -"Labergement-du-Navois", "Labergement-Foigney", +"Labergement-Sainte-Marie", +"Labergement-du-Navois", "Labergement-lès-Auxonne", "Labergement-lès-Seurre", -"Labergement-Sainte-Marie", "Labessière-Candeil", "Labets-Biscay", -"lab-ferment", -"lab-ferments", +"Laboissière-Saint-Martin", "Laboissière-en-Santerre", "Laboissière-en-Thelle", -"Laboissière-Saint-Martin", "Labruyère-Dorsa", -"lac-à-l'épaule", +"Labécède-Lauragais", +"Lac-Beauportois", +"Lac-Bouchettien", +"Lac-Carréen", +"Lac-Etcheminois", +"Lac-Humquien", +"Lac-Poulinois", +"Lac-Saguayen", +"Lac-aux-Sables", +"Lac-des-Rouges-Truites", +"Lac-ou-Villers", +"Lac-Édouard", "Lacam-d'Ourcet", "Lacapelle-Barrès", "Lacapelle-Biron", "Lacapelle-Cabanac", -"Lacapelle-del-Fraisse", "Lacapelle-Livron", "Lacapelle-Marival", "Lacapelle-Pinet", "Lacapelle-Ségalar", "Lacapelle-Viescamp", +"Lacapelle-del-Fraisse", "Lacarry-Arhan-Charritte-de-Haut", -"Lac-aux-Sables", -"Lac-Beauportois", -"Lac-Bouchettien", -"Lac-Carréen", -"Lac-des-Rouges-Truites", -"Lac-Édouard", -"Lac-Etcheminois", "Lachamp-Raphaël", -"Lachapelle-aux-Pots", "Lachapelle-Auzac", -"Lachapelle-en-Blaisy", "Lachapelle-Graillouse", "Lachapelle-Saint-Pierre", +"Lachapelle-aux-Pots", +"Lachapelle-en-Blaisy", "Lachapelle-sous-Aubenas", "Lachapelle-sous-Chanéac", "Lachapelle-sous-Chaux", @@ -13573,77 +6857,46 @@ FR_BASE_EXCEPTIONS = [ "Lachapelle-sous-Rougemont", "Lachaussée-du-Bois-d'Ecu", "Lachaussée-du-Bois-d'Écu", -"lache-bras", -"lâcher-tout", -"Lac-Humquien", -"lac-laque", -"lac-laques", -"là-contre", "Lacougotte-Cadoul", "Lacour-d'Arcenay", "Lacourt-Saint-Pierre", -"Lac-ou-Villers", -"Lac-Poulinois", -"lacrima-christi", -"lacrima-Christi", "Lacrima-Christi", "Lacroix-Barrez", "Lacroix-Falgarde", "Lacroix-Saint-Ouen", "Lacroix-sur-Meuse", -"lacryma-christi", -"lacryma-Christi", "Lacryma-Christi", -"Lac-Saguayen", -"lacs-à-l'épaule", -"lacto-végétarisme", -"lacto-végétarismes", -"là-dedans", -"là-delez", "Ladern-sur-Lauquet", -"là-dessous", -"là-dessus", "Ladevèze-Rivière", "Ladevèze-Ville", "Ladignac-le-Long", "Ladignac-sur-Rondelles", "Ladoix-Serrigny", "Ladoye-sur-Seille", -"laemmer-geier", -"laemmer-geiers", -"læmmer-geyer", -"læmmer-geyers", -"Laethem-Sainte-Marie", "Laethem-Saint-Martin", +"Laethem-Sainte-Marie", "Lafage-sur-Sombre", "Laferté-sur-Amance", "Laferté-sur-Aube", -"la-fertois", -"La-Fertois", -"la-fertoise", -"La-Fertoise", -"la-fertoises", -"La-Fertoises", "Lafeuillade-en-Vézie", "Laffite-Toupière", -"Lafitte-sur-Lot", "Lafitte-Vigordane", +"Lafitte-sur-Lot", "Lafresguimont-Saint-Martin", -"Lagarde-d'Apt", "Lagarde-Enval", "Lagarde-Hachan", -"Lagardelle-sur-Lèze", "Lagarde-Paréol", +"Lagarde-d'Apt", "Lagarde-sur-le-Né", +"Lagardelle-sur-Lèze", "Lagnicourt-Marcel", "Lagny-le-Sec", "Lagny-sur-Marne", -"Lagrâce-Dieu", -"Lagraulet-du-Gers", "Lagraulet-Saint-Nicolas", +"Lagraulet-du-Gers", +"Lagrâce-Dieu", "Laguian-Mazous", "Laguinge-Restoue", -"là-haut", "Lahaye-Saint-Romain", "Lahitte-Toupière", "Lahn-Dill", @@ -13651,21 +6904,9 @@ FR_BASE_EXCEPTIONS = [ "Lailly-en-Val", "Laines-aux-Bois", "Lainville-en-Vexin", -"laissée-pour-compte", -"laissées-pour-compte", -"laissé-pour-compte", -"laisser-aller", -"laisser-allers", -"laisser-courre", -"laisser-faire", -"laisser-sur-place", -"laissés-pour-compte", -"laissez-faire", -"laissez-passer", -"Laître-sous-Amance", +"Laissac-Sévérac l'Église", "Laize-Clinchamps", "Laize-la-Ville", -"la-la-la", "Lalande-de-Pomerol", "Lalande-en-Son", "Lalanne-Arqué", @@ -13681,67 +6922,38 @@ FR_BASE_EXCEPTIONS = [ "Lamarque-Rustaing", "Lamazière-Basse", "Lamazière-Haute", -"lambda-cyhalothrine", -"Lambres-lès-Aire", "Lambres-lez-Aire", "Lambres-lez-Douai", +"Lambres-lès-Aire", "Lamenay-sur-Loire", -"L-aminoacide", -"L-aminoacides", "Lamonzie-Montastruc", "Lamonzie-Saint-Martin", "Lamothe-Capdeville", "Lamothe-Cassel", "Lamothe-Cumont", -"Lamothe-en-Blaisy", "Lamothe-Fénelon", "Lamothe-Goas", "Lamothe-Landerron", "Lamothe-Montravel", +"Lamothe-en-Blaisy", "Lamotte-Beuvron", "Lamotte-Brebière", "Lamotte-Buleux", -"Lamotte-du-Rhône", "Lamotte-Warfusée", +"Lamotte-du-Rhône", "Lampaul-Guimiliau", "Lampaul-Plouarzel", "Lampaul-Ploudalmézeau", -"lampes-tempête", -"lampe-tempête", -"l-amphétamine", -"lampris-lune", "Lamure-sur-Azergues", -"lance-amarres", -"lance-balles", -"lance-bombe", -"lance-bombes", -"lance-flamme", -"lance-flammes", -"lance-fusée", -"lance-fusées", -"lance-grenade", -"lance-grenades", -"lance-missile", -"lance-missiles", -"lance-patates", -"lance-pierre", -"lance-pierres", -"lance-roquette", -"lance-roquettes", -"lance-torpille", -"lance-torpilles", "Lanches-Saint-Hilaire", "Lanciego-Lantziego", "Lancken-Granitz", -"Lançon-Provence", "Lande-de-Libourne", "Landelles-et-Coupigny", "Landerrouet-sur-Ségur", +"Landes-Vieilles-et-Neuves", "Landes-le-Gaulois", "Landes-sur-Ajon", -"Landes-Vieilles-et-Neuves", -"land-ice", -"land-ices", "Landifay-et-Bertaignemont", "Landouzy-la-Cour", "Landouzy-la-Ville", @@ -13756,54 +6968,37 @@ FR_BASE_EXCEPTIONS = [ "Laneuveville-devant-Nancy", "Laneuveville-en-Saulnois", "Laneuveville-lès-Lorquin", -"Laneuville-à-Rémy", "Laneuville-au-Bois", "Laneuville-au-Pont", "Laneuville-au-Rupt", "Laneuville-sur-Meuse", +"Laneuville-à-Rémy", "Langemark-Poelkapelle", "Langenleuba-Niederhain", "Langrolay-sur-Rance", "Langrune-sur-Mer", -"langue-de-boeuf", -"langue-de-chat", -"langue-de-moineau", -"langue-de-serpent", -"langue-de-vache", "Languedoc-Roussillon", "Languedoc-Roussillon-Midi-Pyrénées", -"langues-de-boeuf", -"langues-de-chat", -"langues-de-vache", -"langues-toit", -"langue-toit", "Languevoisin-Quiquery", "Lanitz-Hassel-Tal", -"Lanne-en-Barétous", "Lanne-Soubiran", -"lanne-soubiranais", "Lanne-Soubiranais", -"lanne-soubiranaise", "Lanne-Soubiranaise", -"lanne-soubiranaises", "Lanne-Soubiranaises", +"Lanne-en-Barétous", "Lannoy-Cuillère", "Lanques-sur-Rognon", -"Lansen-Schönau", "Lans-en-Vercors", -"Lanslebourg-Mont-Cenis", "Lans-l'Hermitage", +"Lansen-Schönau", +"Lanslebourg-Mont-Cenis", "Lantenne-Vertière", "Lanty-sur-Aube", +"Lançon-Provence", "Lapanouse-de-Cernon", "Laperrière-sur-Saône", "Lapeyrouse-Fossat", "Lapeyrouse-Mornay", -"lapin-garou", -"lapins-garous", -"lapis-lazuli", -"là-pour-ça", -"lapu-lapu", "Laragne-Montéglin", "Larceveau-Arros-Cibits", "Lardier-et-Valença", @@ -13811,23 +7006,21 @@ FR_BASE_EXCEPTIONS = [ "Largny-sur-Automne", "Larians-et-Munans", "Larivière-Arnoncourt", -"larme-de-Job", -"larmes-de-Job", "Larmor-Baden", "Larmor-Plage", -"Laroche-près-Feyt", "Laroche-Saint-Cydroine", +"Laroche-près-Feyt", +"Laroque-Timbaut", +"Laroque-d'Olmes", "Laroque-de-Fa", "Laroque-des-Albères", "Laroque-des-Arcs", -"Laroque-d'Olmes", -"Laroque-Timbaut", "Larribar-Sorhapuru", "Larrivière-Saint-Savin", "Larroque-Engalin", "Larroque-Saint-Sernin", -"Larroque-sur-l'Osse", "Larroque-Toirac", +"Larroque-sur-l'Osse", "Lasarte-Oria", "Lascellas-Ponzano", "Lasne-Chapelle-Saint-Lambert", @@ -13836,7 +7029,6 @@ FR_BASE_EXCEPTIONS = [ "Lasserre-de-Prouille", "Lasseube-Propre", "Lathus-Saint-Rémy", -"Lâ-Todin", "Latouille-Lentillac", "Latour-Bas-Elne", "Latour-de-Carol", @@ -13845,101 +7037,63 @@ FR_BASE_EXCEPTIONS = [ "Latrecey-Ormoy-sur-Aube", "Lattre-Saint-Quentin", "Lau-Balagnas", -"lau-balutin", "Lau-Balutin", -"lau-balutine", "Lau-Balutine", -"lau-balutines", "Lau-Balutines", -"lau-balutins", "Lau-Balutins", "Laucha-sur-Unstrut", "Lauda-Königshofen", "Laudio-Llodio", "Laudun-l'Ardoise", "Laufen-Uhwiesen", -"launay-villersois", "Launay-Villersois", -"launay-villersoise", "Launay-Villersoise", -"launay-villersoises", "Launay-Villersoises", "Launay-Villiers", "Launois-sur-Vence", "Laurac-en-Vivarais", "Laure-Minervois", -"laurier-cerise", -"laurier-rose", -"laurier-sauce", -"lauriers-cerises", -"lauriers-roses", -"lauriers-tins", -"laurier-tarte", -"laurier-thym", -"laurier-tin", "Lauwin-Planque", "Laux-Montaux", "Laval-Atger", +"Laval-Morency", +"Laval-Pradel", +"Laval-Roquecezière", +"Laval-Saint-Roman", "Laval-d'Aix", "Laval-d'Aurelle", "Laval-de-Cère", -"laval-de-cérois", "Laval-de-Cérois", -"laval-de-céroise", "Laval-de-Céroise", -"laval-de-céroises", "Laval-de-Céroises", "Laval-du-Tarn", "Laval-en-Brie", "Laval-en-Laonnois", "Laval-le-Prieuré", -"Laval-Morency", -"Laval-Pradel", -"Laval-Roquecezière", -"Laval-Saint-Roman", "Laval-sur-Doulon", "Laval-sur-Luzège", "Laval-sur-Tourbe", "Laval-sur-Vologne", "Lavancia-Epercy", -"Lavans-lès-Dole", -"Lavans-lès-Saint-Claude", -"lavans-quingeois", "Lavans-Quingeois", -"lavans-quingeoise", "Lavans-Quingeoise", -"lavans-quingeoises", "Lavans-Quingeoises", "Lavans-Quingey", -"Lavans-sur-Valouse", "Lavans-Vuillafans", -"Lavault-de-Frétoy", -"Lavault-Sainte-Anne", +"Lavans-lès-Dole", +"Lavans-lès-Saint-Claude", +"Lavans-sur-Valouse", "Lavau-sur-Loire", +"Lavault-Sainte-Anne", +"Lavault-de-Frétoy", "Lavaux-Oron", "Lavaux-Sainte-Anne", "Lavaveix-les-Mines", -"lave-auto", -"lave-autos", -"lavé-de-vert", -"lave-glace", "Lavelanet-de-Comminges", "Laveline-devant-Bruyères", "Laveline-du-Houx", -"lave-linge", -"lave-linges", -"lave-main", -"lave-mains", "Laveno-Mombello", -"lave-pont", -"lave-ponts", "Lavernose-Lacasse", -"lavés-de-vert", -"lave-tête", -"lave-têtes", -"laveuse-sécheuse", -"lave-vaisselle", -"lave-vaisselles", "Lavey-Morcles", "Laville-aux-Bois", "Lavilleneuve-au-Roi", @@ -13948,122 +7102,438 @@ FR_BASE_EXCEPTIONS = [ "Lavoûte-sur-Loire", "Lawarde-Mauger-l'Hortoy", "Lay-Lamidou", -"Layrac-sur-Tarn", "Lay-Saint-Christophe", "Lay-Saint-Remy", +"Layrac-sur-Tarn", "Lays-sur-le-Doubs", -"lazur-apatite", -"lazur-apatites", -"Léa-Lisa", -"lease-back", -"leather-jacket", -"lèche-botta", -"lèche-bottai", -"lèche-bottaient", -"lèche-bottais", -"lèche-bottait", -"lèche-bottâmes", -"lèche-bottant", -"lèche-bottas", -"lèche-bottasse", -"lèche-bottassent", -"lèche-bottasses", -"lèche-bottassiez", -"lèche-bottassions", -"lèche-bottât", -"lèche-bottâtes", -"lèche-botte", -"lèche-botté", -"lèche-bottée", -"lèche-bottées", -"lèche-bottent", -"lèche-botter", -"lèche-bottera", -"lèche-botterai", -"lèche-botteraient", -"lèche-botterais", -"lèche-botterait", -"lèche-botteras", -"lèche-bottèrent", -"lèche-botterez", -"lèche-botteriez", -"lèche-botterions", -"lèche-botterons", -"lèche-botteront", -"lèche-bottes", -"lèche-bottés", -"lèche-bottez", -"lèche-bottiez", -"lèche-bottions", -"lèche-bottons", -"lèche-cul", -"lèche-culs", -"lèche-vitrine", -"lèche-vitrines", -"lecteur-graveur", -"lecteurs-graveurs", -"Lédas-et-Penthiès", -"Leers-et-Fosteau", +"Laà-Mondrans", +"Laître-sous-Amance", +"Le Ban-Saint-Martin", +"Le Bar-sur-Loup", +"Le Bec-Hellouin", +"Le Bec-Thomas", +"Le Bellay-en-Vexin", +"Le Bignon-Mirabeau", +"Le Bignon-du-Maine", +"Le Blanc-Mesnil", +"Le Bois-Hellain", +"Le Bois-Plage-en-Ré", +"Le Bois-Robert", +"Le Bois-d'Oingt", +"Le Bosc-Renoult", +"Le Bosc-Roger-en-Roumois", +"Le Bouchet-Mont-Charvin", +"Le Bouchet-Saint-Nicolas", +"Le Bouchon-sur-Saulx", +"Le Boulay-Morin", +"Le Boullay-Mivoye", +"Le Boullay-Thierry", +"Le Boullay-les-Deux-Églises", +"Le Bourg-Dun", +"Le Bourg-Saint-Léonard", +"Le Bourg-d'Hem", +"Le Bourg-d'Iré", +"Le Bourg-d'Oisans", +"Le Bourget-du-Lac", +"Le Bourgneuf-la-Forêt", +"Le Bousquet-d'Orb", +"Le Breil-sur-Mérize", +"Le Breuil-Bernard", +"Le Breuil-en-Auge", +"Le Breuil-en-Bessin", +"Le Breuil-sur-Couze", +"Le Brouilh-Monbert", +"Le Buisson-de-Cadouin", +"Le Bû-sur-Rouvres", +"Le Cannet-des-Maures", +"Le Castellard-Mélan", +"Le Cateau-Cambrésis", +"Le Caule-Sainte-Beuve", +"Le Chaffaut-Saint-Jurson", +"Le Chambon-Feugerolles", +"Le Chambon-sur-Lignon", +"Le Champ-Saint-Père", +"Le Champ-de-la-Pierre", +"Le Champ-près-Froges", +"Le Château-d'Almenêches", +"Le Château-d'Oléron", +"Le Châtelet-en-Brie", +"Le Châtelet-sur-Meuse", +"Le Châtelet-sur-Retourne", +"Le Châtelet-sur-Sormonne", +"Le Châtenet-en-Dognon", +"Le Cloître-Pleyben", +"Le Cloître-Saint-Thégonnec", +"Le Collet-de-Dèze", +"Le Coudray-Macouard", +"Le Coudray-Montceaux", +"Le Coudray-Saint-Germer", +"Le Coudray-sur-Thelle", +"Le Fay-Saint-Quentin", +"Le Freney-d'Oisans", +"Le Fresne-Camilly", +"Le Fresne-Poret", +"Le Frestoy-Vaux", +"Le Gault-Perche", +"Le Gault-Saint-Denis", +"Le Gault-Soigny", +"Le Genest-Saint-Isle", +"Le Grand-Bornand", +"Le Grand-Bourg", +"Le Grand-Celland", +"Le Grand-Lemps", +"Le Grand-Lucé", +"Le Grand-Madieu", +"Le Grand-Pressigny", +"Le Grand-Quevilly", +"Le Grand-Serre", +"Le Grand-Village-Plage", +"Le Grau-du-Roi", +"Le Gué-d'Alleré", +"Le Gué-de-Longroi", +"Le Gué-de-Velluire", +"Le Gué-de-la-Chaîne", +"Le Haut-Corlay", +"Le Hommet-d'Arthenay", +"Le Housseau-Brétignolles", +"Le Hérie-la-Viéville", +"Le Kremlin-Bicêtre", +"Le Lac-d'Issarlès", +"Le Lardin-Saint-Lazare", +"Le Lauzet-Ubaye", +"Le Lion-d'Angers", +"Le Loroux-Bottereau", +"Le Louroux-Béconnais", +"Le Malzieu-Forain", +"Le Malzieu-Ville", +"Le Marais-la-Chapelle", +"Le Mas-d'Agenais", +"Le Mas-d'Artige", +"Le Mas-d'Azil", +"Le Mas-de-Tence", +"Le Masnau-Massuguiès", +"Le May-sur-Èvre", +"Le Mayet-d'École", +"Le Mayet-de-Montagne", +"Le Meix-Saint-Epoing", +"Le Meix-Tiercelin", +"Le Mesnil-Adelée", +"Le Mesnil-Amand", +"Le Mesnil-Amelot", +"Le Mesnil-Amey", +"Le Mesnil-Aubert", +"Le Mesnil-Aubry", +"Le Mesnil-Auzouf", +"Le Mesnil-Benoist", +"Le Mesnil-Caussois", +"Le Mesnil-Conteville", +"Le Mesnil-Durdent", +"Le Mesnil-Esnard", +"Le Mesnil-Eudes", +"Le Mesnil-Eury", +"Le Mesnil-Fuguet", +"Le Mesnil-Garnier", +"Le Mesnil-Gilbert", +"Le Mesnil-Guillaume", +"Le Mesnil-Hardray", +"Le Mesnil-Herman", +"Le Mesnil-Jourdain", +"Le Mesnil-Lieubray", +"Le Mesnil-Mauger", +"Le Mesnil-Ozenne", +"Le Mesnil-Patry", +"Le Mesnil-Rainfray", +"Le Mesnil-Robert", +"Le Mesnil-Rogues", +"Le Mesnil-Rouxelin", +"Le Mesnil-Réaume", +"Le Mesnil-Saint-Denis", +"Le Mesnil-Saint-Firmin", +"Le Mesnil-Simon", +"Le Mesnil-Thomas", +"Le Mesnil-Théribus", +"Le Mesnil-Tôve", +"Le Mesnil-Vigot", +"Le Mesnil-Villeman", +"Le Mesnil-Villement", +"Le Mesnil-Véneron", +"Le Mesnil-au-Grain", +"Le Mesnil-au-Val", +"Le Mesnil-en-Thelle", +"Le Mesnil-le-Roi", +"Le Mesnil-sous-Jumièges", +"Le Mesnil-sur-Blangy", +"Le Mesnil-sur-Bulles", +"Le Mesnil-sur-Oger", +"Le Minihic-sur-Rance", +"Le Molay-Littry", +"Le Monastier-sur-Gazeille", +"Le Monestier-du-Percy", +"Le Mont-Dieu", +"Le Mont-Saint-Adrien", +"Le Mont-Saint-Michel", +"Le Monteil-au-Vicomte", +"Le Monêtier-les-Bains", +"Le Morne-Rouge", +"Le Morne-Vert", +"Le Moulinet-sur-Solin", +"Le Mée-sur-Seine", +"Le Ménil-Broût", +"Le Ménil-Bérard", +"Le Ménil-Ciboult", +"Le Ménil-Guyon", +"Le Ménil-Scelleur", +"Le Ménil-Vicomte", +"Le Ménil-de-Briouze", +"Le Mêle-sur-Sarthe", +"Le Nouvion-en-Thiérache", +"Le Noyer-en-Ouche", +"Le Palais-sur-Vienne", +"Le Pas-Saint-l'Homer", +"Le Pavillon-Sainte-Julie", +"Le Perray-en-Yvelines", +"Le Perreux-sur-Marne", +"Le Petit-Bornand-les-Glières", +"Le Petit-Celland", +"Le Petit-Fougeray", +"Le Petit-Mercey", +"Le Petit-Pressigny", +"Le Petit-Quevilly", +"Le Pian-Médoc", +"Le Pian-sur-Garonne", +"Le Pin-Murelet", +"Le Pin-au-Haras", +"Le Pin-la-Garenne", +"Le Plan-de-la-Tour", +"Le Plessier-Huleu", +"Le Plessier-Rozainvillers", +"Le Plessier-sur-Bulles", +"Le Plessier-sur-Saint-Just", +"Le Plessis-Belleville", +"Le Plessis-Bouchard", +"Le Plessis-Brion", +"Le Plessis-Dorin", +"Le Plessis-Feu-Aussoux", +"Le Plessis-Gassot", +"Le Plessis-Grammoire", +"Le Plessis-Grimoult", +"Le Plessis-Grohan", +"Le Plessis-Hébert", +"Le Plessis-Lastelle", +"Le Plessis-Luzarches", +"Le Plessis-Patte-d'Oie", +"Le Plessis-Placy", +"Le Plessis-Pâté", +"Le Plessis-Robinson", +"Le Plessis-Sainte-Opportune", +"Le Plessis-Trévise", +"Le Plessis-aux-Bois", +"Le Plessis-l'Échelle", +"Le Plessis-l'Évêque", +"Le Poiré-sur-Velluire", +"Le Poiré-sur-Vie", +"Le Poizat-Lalleyriat", +"Le Pont-Chrétien-Chabenet", +"Le Pont-de-Beauvoisin", +"Le Pont-de-Claix", +"Le Port-Marly", +"Le Poujol-sur-Orb", +"Le Poët-Célard", +"Le Poët-Laval", +"Le Poët-Sigillat", +"Le Poët-en-Percip", +"Le Pré-Saint-Gervais", +"Le Pré-d'Auge", +"Le Puy-Notre-Dame", +"Le Puy-Sainte-Réparade", +"Le Puy-en-Velay", +"Le Péage-de-Roussillon", +"Le Quesnel-Aubry", +"Le Quesnoy-en-Artois", +"Le Relecq-Kerhuon", +"Le Revest-les-Eaux", +"Le Rouget-Pers", +"Le Rousset-Marizy", +"Le Sap-André", +"Le Sappey-en-Chartreuse", +"Le Sauze-du-Lac", +"Le Sel-de-Bretagne", +"Le Taillan-Médoc", +"Le Tartre-Gaudran", +"Le Temple-de-Bretagne", +"Le Temple-sur-Lot", +"Le Tertre-Saint-Denis", +"Le Theil-Nolent", +"Le Theil-de-Bretagne", +"Le Theil-en-Auge", +"Le Thil-Riberpré", +"Le Thoult-Trosnay", +"Le Thuit de l'Oison", +"Le Tilleul-Lambert", +"Le Tilleul-Othon", +"Le Torp-Mesnil", +"Le Touquet-Paris-Plage", +"Le Tour-du-Parc", +"Le Tremblay-Omonville", +"Le Tremblay-sur-Mauldre", +"Le Val d'Hazey", +"Le Val d'Ocre", +"Le Val-David", +"Le Val-Saint-Germain", +"Le Val-Saint-Père", +"Le Val-Saint-Éloi", +"Le Val-d'Ajol", +"Le Val-d'Esnoms", +"Le Val-de-Gouhenans", +"Le Val-de-Guéblange", +"Le Vanneau-Irleau", +"Le Verdon-sur-Mer", +"Le Vernet-Sainte-Marguerite", +"Le Vieil-Dampierre", +"Le Vieil-Évreux", +"Le Vieux-Bourg", +"Le Vieux-Cérier", +"Le Vieux-Marché", +"Le Vivier-sur-Mer", "Leers-Nord", -"Lées-Athas", +"Leers-et-Fosteau", "Leeuw-Saint-Pierre", -"Lège-Cap-Ferret", -"Légéville-et-Bonfays", -"Légion-d'Honneur", -"Léguillac-de-Cercles", -"Léguillac-de-l'Auche", -"légume-feuille", -"légume-fleur", -"légume-fruit", -"légume-racine", -"légumes-feuilles", -"légumes-fleurs", -"légumes-fruits", -"légumes-racines", -"légumes-tiges", -"légume-tige", "Leidschendam-Voorburg", -"Leigné-les-Bois", "Leignes-sur-Fontaine", +"Leigné-les-Bois", "Leigné-sur-Usseau", "Leinefelde-Worbis", "Leinfelden-Echterdingen", "Leintz-Gatzaga", "Lelin-Lapujolle", -"Leménil-Mitry", -"lemmer-geyer", -"lemmer-geyers", "Lempdes-sur-Allagnon", "Lempire-aux-Bois", +"Leménil-Mitry", "Lens-Lestang", "Lens-Saint-Remy", "Lens-Saint-Servais", "Lens-sur-Geer", -"Lentillac-du-Causse", "Lentillac-Lauzès", "Lentillac-Saint-Blaise", -"léopard-garou", -"léopards-garous", +"Lentillac-du-Causse", "Leo-Stichting", -"Lépanges-sur-Vologne", -"Lépin-le-Lac", -"lépisostée-alligator", -"Lépron-les-Vallées", -"lepto-kurticité", -"lepto-kurticités", -"lepto-kurtique", -"lepto-kurtiques", "Lepuix-Neuf", "Lerm-et-Musset", -"Leschères-sur-le-Blaiseron", +"Les Adrets-de-l'Estérel", +"Les Aix-d'Angillon", +"Les Alluets-le-Roi", +"Les Ancizes-Comps", +"Les Angles-sur-Corrèze", +"Les Anses-d'Arlet", +"Les Artigues-de-Lussac", +"Les Autels-Villevillon", +"Les Authieux-Papion", +"Les Authieux-du-Puits", +"Les Authieux-sur-Calonne", +"Les Authieux-sur-le-Port-Saint-Ouen", +"Les Avanchers-Valmorel", +"Les Avenières Veyrins-Thuellin", +"Les Baux-Sainte-Croix", +"Les Baux-de-Breteuil", +"Les Baux-de-Provence", +"Les Bois d'Anjou", +"Les Bordes-Aumont", +"Les Bordes-sur-Arize", +"Les Bordes-sur-Lez", +"Les Cent-Acres", +"Les Champs-Géraux", +"Les Champs-de-Losque", +"Les Chapelles-Bourbon", +"Les Chavannes-en-Maurienne", +"Les Châtelliers-Notre-Dame", +"Les Clayes-sous-Bois", +"Les Contamines-Montjoie", +"Les Corvées-les-Yys", +"Les Costes-Gozon", +"Les Côtes-d'Arey", +"Les Côtes-de-Corps", +"Les Deux-Fays", +"Les Deux-Villes", +"Les Essards-Taignevaux", +"Les Essarts-le-Roi", +"Les Essarts-le-Vicomte", +"Les Essarts-lès-Sézanne", +"Les Eyzies-de-Tayac-Sireuil", +"Les Grandes-Armoises", +"Les Grandes-Chapelles", +"Les Grandes-Loges", +"Les Grandes-Ventes", +"Les Grands-Chézeaux", +"Les Granges-Gontardes", +"Les Granges-le-Roi", +"Les Hautes-Rivières", +"Les Hauts-de-Chée", +"Les Hôpitaux-Neufs", +"Les Hôpitaux-Vieux", +"Les Isles-Bardel", +"Les Istres-et-Bury", +"Les Landes-Genusson", +"Les Loges-Marchis", +"Les Loges-Margueron", +"Les Loges-Saulces", +"Les Loges-en-Josas", +"Les Loges-sur-Brécey", +"Les Lucs-sur-Boulogne", +"Les Lèves-et-Thoumeyragues", +"Les Magnils-Reigniers", +"Les Martres-d'Artière", +"Les Martres-de-Veyre", +"Les Moitiers-d'Allonne", +"Les Moitiers-en-Bauptois", +"Les Monts d'Andaine", +"Les Monts-Verts", +"Les Moutiers-en-Auge", +"Les Moutiers-en-Cinglais", +"Les Moutiers-en-Retz", +"Les Noës-près-Troyes", +"Les Ollières-sur-Eyrieux", +"Les Ormes-sur-Voulzie", +"Les Pavillons-sous-Bois", +"Les Pennes-Mirabeau", +"Les Petites-Armoises", +"Les Petites-Loges", +"Les Plains-et-Grands-Essarts", +"Les Planches-en-Montagne", +"Les Planches-près-Arbois", +"Les Ponts-de-Cé", +"Les Portes-en-Ré", +"Les Quatre-Routes-du-Lot", +"Les Rivières-Henruel", +"Les Roches-de-Condrieu", +"Les Roches-l'Évêque", +"Les Rosiers-sur-Loire", +"Les Rouges-Eaux", +"Les Rues-des-Vignes", +"Les Sables-d'Olonne", +"Les Salles-Lavauguyon", +"Les Salles-de-Castillon", +"Les Salles-du-Gardon", +"Les Salles-sur-Verdon", +"Les Souhesmes-Rampont", +"Les Terres-de-Chaux", +"Les Thilliers-en-Vexin", +"Les Touches-de-Périgny", +"Les Trois-Bassins", +"Les Trois-Domaines", +"Les Trois-Moutiers", +"Les Trois-Pierres", +"Les Trois-Îlets", +"Les Ventes-de-Bourse", +"Les Verchers-sur-Layon", +"Les Villards-sur-Thônes", +"Les Églises-d'Argenteuil", +"Les Églisottes-et-Chalaures", "Lesches-en-Diois", +"Leschères-sur-le-Blaiseron", "Lescouët-Gouarec", "Lescouët-Jugon", -"Lescure-d'Albigeois", "Lescure-Jaoul", -"lèse-majesté", -"lèse-majestés", -"Lésignac-Durand", +"Lescure-d'Albigeois", "Lesparre-Médoc", "Lespielle-Germenaud-Lannegrasse", "Lesquielles-Saint-Germain", @@ -14083,135 +7553,64 @@ FR_BASE_EXCEPTIONS = [ "Leuville-sur-Orge", "Leuze-en-Hainaut", "Leval-Chaudeville", -"Levallois-Perret", "Leval-Trahegnies", -"lève-cul", -"lève-culs", -"lève-gazon", -"lève-glace", -"lève-glaces", -"lever-dieu", +"Levallois-Perret", "Levesville-la-Chenard", -"lève-tard", -"lève-tôt", -"lève-vitre", -"lève-vitres", -"Lévignac-de-Guyenne", -"Lévis-Saint-Nom", -"lévi-straussien", -"lévi-straussienne", -"lévi-straussiennes", -"lévi-straussiens", -"Lévy-Saint-Nom", "Leyritz-Moncassin", -"Lézat-sur-Lèze", "Lez-Fontaine", -"Lézignan-Corbières", -"Lézignan-la-Cèbe", -"L-flampropisopropyl", -"lgbti-friendly", -"LGBTI-friendly", -"lgbti-phobie", -"LGBTI-phobie", -"lgbti-phobies", -"LGBTI-phobies", -"L-glycéraldéhyde", +"Li-Fi", "Liancourt-Fosse", "Liancourt-Saint-Pierre", -"liane-corail", -"lianes-corail", "Lias-d'Armagnac", -"libéral-conservateur", -"libéral-conservatisme", -"liberum-veto", -"libidino-calotin", "Libramont-Chevigny", -"libre-choix", -"libre-échange", -"libre-échangisme", -"libre-échangismes", -"libre-échangiste", -"libre-échangistes", -"libre-penseur", -"libre-penseuse", -"libres-choix", -"libre-service", -"libres-penseurs", -"libres-penseuses", -"libres-services", "Libre-Ville", -"libyco-berbère", -"libyco-berbères", -"lice-po", "Licey-sur-Vingeanne", "Lichans-Sunhar", -"liche-casse", +"Lichterfeld-Schacksdorf", "Lichères-près-Aigremont", "Lichères-sur-Yonne", -"Lichterfeld-Schacksdorf", -"licol-drisse", -"licols-drisses", "Licq-Athérey", "Licy-Clignon", -"lie-de-vin", -"Lierde-Sainte-Marie", "Lierde-Saint-Martin", +"Lierde-Sainte-Marie", "Liesse-Notre-Dame", "Liesville-sur-Douve", -"lieu-dit", +"Lieu-Saint-Amand", +"Lieu-Saint-Amandinois", +"Lieu-Saint-Amandinoise", +"Lieu-Saint-Amandinoises", "Lieuran-Cabrières", "Lieuran-lès-Béziers", -"Lieu-Saint-Amand", -"lieu-saint-amandinois", -"Lieu-Saint-Amandinois", -"lieu-saint-amandinoise", -"Lieu-Saint-Amandinoise", -"lieu-saint-amandinoises", -"Lieu-Saint-Amandinoises", -"lieutenant-colonel", -"lieutenant-général", -"lieutenant-gouverneur", -"lieutenants-colonels", -"lieux-dits", "Liffol-le-Grand", "Liffol-le-Petit", -"Li-Fi", "Lignan-de-Bazas", "Lignan-de-Bordeaux", "Lignan-sur-Orb", -"ligne-de-foulée", -"lignes-de-foulée", "Lignières-Châtelain", +"Lignières-Orgères", +"Lignières-Sonneville", "Lignières-de-Touraine", "Lignières-en-Vimeu", "Lignières-la-Carelle", -"Lignières-Orgères", -"Lignières-Sonneville", "Lignières-sur-Aire", "Lignol-le-Château", +"Ligny-Haucourt", +"Ligny-Saint-Flochel", +"Ligny-Thilloy", "Ligny-en-Barrois", "Ligny-en-Brionnais", "Ligny-en-Cambrésis", -"Ligny-Haucourt", "Ligny-le-Châtel", "Ligny-le-Ribault", "Ligny-lès-Aire", -"Ligny-Saint-Flochel", "Ligny-sur-Canche", -"Ligny-Thilloy", "Lille-sous-Mauréal", "Lille-sous-Montréal", "Lillois-Witterzée", -"limande-sole", -"limande-soles", -"limandes-soles", "Limbach-Oberfrohna", "Limburg-Weilburg", -"lime-bois", "Limeil-Brévannes", "Limetz-Villez", -"lime-uranite", -"lime-uranites", "Limey-Remenauville", "Limoges-Fourches", "Limogne-en-Quercy", @@ -14222,20 +7621,15 @@ FR_BASE_EXCEPTIONS = [ "Lindre-Haute", "Linières-Bouton", "Linkenheim-Hochstetten", -"linon-batiste", -"linon-batistes", "Lintot-les-Bois", "Liny-devant-Dun", "Lion-devant-Dun", "Lion-en-Beauce", "Lion-en-Sullias", -"lion-garou", -"lions-garous", "Lion-sur-Mer", "Liorac-sur-Louyre", "Lioux-les-Monges", "Lippersdorf-Erdmannsdorf", -"lire-écrire", "Lisle-en-Barrois", "Lisle-en-Rigault", "Lisle-sur-Tarn", @@ -14243,237 +7637,78 @@ FR_BASE_EXCEPTIONS = [ "Lissac-sur-Couze", "Lissay-Lochy", "Lisse-en-Champagne", -"Listrac-de-Durèze", "Listrac-Médoc", -"lit-cage", -"lit-clos", +"Listrac-de-Durèze", "Lit-et-Mixe", -"litho-typographia", -"litho-typographiai", -"litho-typographiaient", -"litho-typographiais", -"litho-typographiait", -"litho-typographiâmes", -"litho-typographiant", -"litho-typographias", -"litho-typographiasse", -"litho-typographiassent", -"litho-typographiasses", -"litho-typographiassiez", -"litho-typographiassions", -"litho-typographiât", -"litho-typographiâtes", -"litho-typographie", -"litho-typographié", -"litho-typographiée", -"litho-typographiées", -"litho-typographient", -"litho-typographier", -"litho-typographiera", -"litho-typographierai", -"litho-typographieraient", -"litho-typographierais", -"litho-typographierait", -"litho-typographieras", -"litho-typographièrent", -"litho-typographierez", -"litho-typographieriez", -"litho-typographierions", -"litho-typographierons", -"litho-typographieront", -"litho-typographies", -"litho-typographiés", -"litho-typographiez", -"litho-typographiiez", -"litho-typographiions", -"litho-typographions", -"lits-cages", -"lits-clos", -"little-endian", "Livarot-Pays-d'Auge", "Liverdy-en-Brie", "Livers-Cazelles", "Livet-en-Saosnois", "Livet-et-Gavet", "Livet-sur-Authou", -"living-room", -"living-rooms", "Livinhac-le-Haut", -"Livré-la-Touche", -"livres-cassettes", -"Livré-sur-Changeon", -"livret-police", "Livron-sur-Drôme", "Livry-Gargan", "Livry-Louvercy", "Livry-sur-Seine", +"Livré-la-Touche", +"Livré-sur-Changeon", "Lixing-lès-Rouhling", "Lixing-lès-Saint-Avold", "Lizy-sur-Ourcq", -"localité-type", -"location-financement", +"Lo-Reninge", "Loc-Brévalaire", "Loc-Eguiner", -"Loc-Éguiner", "Loc-Eguiner-Saint-Thégonnec", -"Loc-Éguiner-Saint-Thégonnec", "Loc-Envel", +"Loc-Éguiner", +"Loc-Éguiner-Saint-Thégonnec", "Loches-sur-Ource", "Loché-sur-Indrois", -"lock-out", -"lock-outa", -"lock-outai", -"lock-outaient", -"lock-outais", -"lock-outait", -"lock-outâmes", -"lock-outant", -"lock-outas", -"lock-outasse", -"lock-outassent", -"lock-outasses", -"lock-outassiez", -"lock-outassions", -"lock-outât", -"lock-outâtes", -"lock-oute", -"lock-outé", -"lock-outée", -"lock-outées", -"lock-outent", -"lock-outer", -"lock-outera", -"lock-outerai", -"lock-outeraient", -"lock-outerais", -"lock-outerait", -"lock-outeras", -"lock-outèrent", -"lock-outerez", -"lock-outeriez", -"lock-outerions", -"lock-outerons", -"lock-outeront", -"lock-outes", -"lock-outés", -"lock-outez", -"lock-outiez", -"lock-outions", -"lock-outons", -"lock-outs", "Locmaria-Berrien", "Locmaria-Grand-Champ", "Locmaria-Plouzané", "Locoal-Mendon", -"locoalo-mendonnais", "Locoalo-Mendonnais", -"locoalo-mendonnaise", "Locoalo-Mendonnaise", -"locoalo-mendonnaises", "Locoalo-Mendonnaises", -"locution-phrase", -"locutions-phrases", -"Loèche-les-Bains", -"Loèche-Ville", -"loemmer-geyer", -"lœmmer-geyer", -"loemmer-geyers", -"lœmmer-geyers", "Loenen-Kronenburg", -"logan-berry", -"logan-berrys", "Loge-Fougereuse", -"logiciel-socle", "Logny-Bogny", "Logny-lès-Aubenton", "Logny-lès-Chaumont", "Logonna-Daoulas", "Logonna-Quimerch", -"logo-syllabique", -"logo-syllabiques", -"Logrian-et-Comiac-de-Florian", "Logrian-Florian", -"Loguivy-lès-Lannion", +"Logrian-et-Comiac-de-Florian", "Loguivy-Plougras", +"Loguivy-lès-Lannion", "Lohe-Föhrden", "Lohe-Rickelshof", "Lohitzun-Oyhercq", "Lohn-Ammannsegg", -"loi-cadre", -"loi-écran", -"Loigné-sur-Mayenne", "Loigny-la-Bataille", -"loi-programme", +"Loigné-sur-Mayenne", +"Loir-et-Cher", "Loire-Atlantique", "Loire-Authion", "Loire-Inférieure", "Loire-les-Marais", -"Loiré-sur-Nie", "Loire-sur-Rhône", -"Loir-et-Cher", "Loiron-Ruillé", -"lois-cadre", -"lois-écrans", +"Loiré-sur-Nie", "Loisey-Culey", "Loison-sous-Lens", "Loison-sur-Créquoise", -"lois-programme", "Loisy-en-Brie", "Loisy-sur-Marne", "Loitsche-Heinrichsberg", "Lombeek-Notre-Dame", -"lombo-costal", -"lombo-costo-trachélien", -"lombo-dorso-trachélien", -"lombo-huméral", -"lombo-sacré", -"lombri-composta", -"lombri-compostai", -"lombri-compostaient", -"lombri-compostais", -"lombri-compostait", -"lombri-compostâmes", -"lombri-compostant", -"lombri-compostas", -"lombri-compostasse", -"lombri-compostassent", -"lombri-compostasses", -"lombri-compostassiez", -"lombri-compostassions", -"lombri-compostât", -"lombri-compostâtes", -"lombri-composte", -"lombri-composté", -"lombri-compostée", -"lombri-compostées", -"lombri-compostent", -"lombri-composter", -"lombri-compostera", -"lombri-composterai", -"lombri-composteraient", -"lombri-composterais", -"lombri-composterait", -"lombri-composteras", -"lombri-compostèrent", -"lombri-composterez", -"lombri-composteriez", -"lombri-composterions", -"lombri-composterons", -"lombri-composteront", -"lombri-compostes", -"lombri-compostés", -"lombri-compostez", -"lombri-compostiez", -"lombri-compostions", -"lombri-compostons", "Lomont-sur-Crête", -"lompénie-serpent", "Lona-Lases", "Longchamp-sous-Châtenois", -"Longchamps-sur-Aire", "Longchamp-sur-Aujon", -"long-courrier", -"long-courriers", +"Longchamps-sur-Aire", "Longeau-Percey", "Longecourt-en-Plaine", "Longecourt-lès-Culêtre", @@ -14482,63 +7717,39 @@ FR_BASE_EXCEPTIONS = [ "Longeville-en-Barrois", "Longeville-lès-Metz", "Longeville-lès-Saint-Avold", -"Longevilles-Mont-d'Or", -"Longeville-sur-la-Laines", "Longeville-sur-Mer", "Longeville-sur-Mogne", -"long-grain", -"long-jointé", -"long-jointée", -"long-métrage", +"Longeville-sur-la-Laines", +"Longevilles-Mont-d'Or", "Longny-au-Perche", "Longny-les-Villages", "Longpont-sur-Orge", -"Longpré-les-Corps-Saints", "Longpré-le-Sec", -"longs-courriers", -"longs-métrages", -"long-temps", -"long-tems", -"longue-épine", +"Longpré-les-Corps-Saints", +"Longue-Rivois", "Longueil-Annel", "Longueil-Sainte-Marie", -"Longué-Jumelles", -"longue-langue", "Longuenée-en-Anjou", -"Longue-Rivois", -"longues-épines", -"longues-langues", "Longues-sur-Mer", -"longues-vues", "Longueval-Barbonval", "Longueville-sur-Aube", "Longueville-sur-Scie", -"longue-vue", -"Longwé-l'Abbaye", +"Longué-Jumelles", "Longwy-sur-le-Doubs", +"Longwé-l'Abbaye", "Lonlay-l'Abbaye", "Lonlay-le-Tesson", "Lons-le-Saunier", "Loon-Plage", "Loos-en-Gohelle", -"loqu'du", -"loqu'due", -"loqu'dues", -"loqu'dus", -"lord-lieutenance", -"lord-lieutenances", -"lord-lieutenant", -"lord-lieutenants", -"lord-maire", -"Lo-Reninge", "Loreto-di-Casinca", "Loreto-di-Tallano", "Loriol-du-Comtat", "Loriol-sur-Drôme", "Lorp-Sentaraille", "Lorrez-le-Bocage-Préaux", -"Lorry-lès-Metz", "Lorry-Mardigny", +"Lorry-lès-Metz", "Loscouët-sur-Meu", "Louan-Villegruis-Fontaine", "Loubens-Lauragais", @@ -14547,108 +7758,72 @@ FR_BASE_EXCEPTIONS = [ "Louette-Saint-Denis", "Louette-Saint-Pierre", "Lougé-sur-Maire", -"louise-bonne", -"louises-bonnes", -"Loulans-les-Forges", "Loulans-Verchamp", -"loup-cerve", -"loup-cervier", -"loup-garou", -"Loupiac-de-la-Réole", +"Loulans-les-Forges", "Loup-Maëlle", +"Loupiac-de-la-Réole", "Louppy-le-Château", "Louppy-sur-Chée", "Louppy-sur-Loison", -"loups-cerves", -"loups-cerviers", -"loups-garous", "Lourdios-Ichère", -"lourd-léger", "Lourdoueix-Saint-Michel", "Lourdoueix-Saint-Pierre", -"lourds-légers", "Loures-Barousse", "Louresse-Rochemenier", "Lourouer-Saint-Laurent", "Louroux-Bourbonnais", +"Louroux-Hodement", "Louroux-de-Beaune", "Louroux-de-Bouble", -"Louroux-Hodement", -"lourouzien-bourbonnais", "Lourouzien-Bourbonnais", -"lourouzienne-bourbonnaise", "Lourouzienne-Bourbonnaise", -"lourouziennes-bourbonnaises", "Lourouziennes-Bourbonnaises", -"lourouziens-bourbonnais", "Lourouziens-Bourbonnais", "Lourties-Monbrun", "Loussous-Débat", "Louvain-la-Neuve", -"louve-garelle", -"louve-garolle", -"louve-garou", "Louvemont-Côte-du-Poivre", -"louves-garelles", -"louves-garolles", -"louves-garous", -"louveteau-garou", -"louveteaux-garous", "Louvie-Juzon", -"Louvières-en-Auge", "Louvie-Soubiron", -"louvie-soubironnais", "Louvie-Soubironnais", -"louvie-soubironnaise", "Louvie-Soubironnaise", -"louvie-soubironnaises", "Louvie-Soubironnaises", -"Louvigné-de-Bais", -"Louvigné-du-Désert", "Louvignies-Bavay", "Louvignies-Quesnoy", +"Louvigné-de-Bais", +"Louvigné-du-Désert", "Louville-la-Chenard", "Louvilliers-en-Drouais", "Louvilliers-lès-Perche", +"Louvières-en-Auge", "Louzac-Saint-André", -"love-in", -"low-cost", -"low-costs", -"low-tech", "Loye-sur-Arnon", "Lozoyuela-Navas-Sieteiglesias", +"Loèche-Ville", +"Loèche-les-Bains", "Lubret-Saint-Luc", "Luby-Betmont", "Luc-Armau", -"Luçay-le-Libre", -"Luçay-le-Mâle", -"Lucbardez-et-Bargues", -"Lucenay-le-Duc", -"Lucenay-lès-Aix", -"Lucenay-l'Evêque", -"Lucenay-l'Évêque", "Luc-en-Diois", -"Lucé-sous-Ballon", -"Luché-Pringé", -"Luché-sur-Brioux", -"Luché-Thouarsais", -"Lüchow-Dannenberg", "Luc-la-Primaube", -"Lucq-de-Béarn", "Luc-sur-Aude", "Luc-sur-Mer", "Luc-sur-Orbieu", +"Lucbardez-et-Bargues", +"Lucenay-l'Evêque", +"Lucenay-l'Évêque", +"Lucenay-le-Duc", +"Lucenay-lès-Aix", +"Luché-Pringé", +"Luché-Thouarsais", +"Luché-sur-Brioux", +"Lucq-de-Béarn", "Lucy-le-Bocage", "Lucy-le-Bois", "Lucy-sur-Cure", "Lucy-sur-Yonne", -"ludo-éducatif", +"Lucé-sous-Ballon", "Ludon-Médoc", -"ludo-sportif", -"ludo-sportifs", -"ludo-sportive", -"ludo-sportives", -"Lué-en-Baugeois", "Lugaut-Retjons", "Lugny-Bourbonnais", "Lugny-Champagne", @@ -14656,27 +7831,22 @@ FR_BASE_EXCEPTIONS = [ "Lugo-di-Nazza", "Lugon-et-l'Île-du-Carnay", "Luhe-Wildenau", -"lui-même", -"lumen-seconde", -"lumens-secondes", -"Luméville-en-Ornois", "Lumigny-Nesles-Ormeaux", +"Luméville-en-Ornois", "Lunel-Viel", -"luni-solaire", -"luni-solaires", "Lunow-Stolzenhagen", "Lupiñén-Ortilla", "Luppé-Violles", "Lurbe-Saint-Christau", -"Lurcy-le-Bourg", "Lurcy-Lévis", "Lurcy-Lévy", +"Lurcy-le-Bourg", "Lury-sur-Arnon", +"Lus-la-Croix-Haute", "Lusignan-Grand", "Lusignan-Petit", "Lusigny-sur-Barse", "Lusigny-sur-Ouche", -"Lus-la-Croix-Haute", "Lussac-les-Châteaux", "Lussac-les-Eglises", "Lussac-les-Églises", @@ -14686,365 +7856,181 @@ FR_BASE_EXCEPTIONS = [ "Lussault-sur-Loire", "Lussery-Villars", "Lussy-sur-Morges", -"Lüterkofen-Ichertswil", -"Lüterswil-Gächliwil", "Luthenay-Uxeloup", -"Łutselk'e", "Luttenbach-près-Munster", -"Lüttow-Valluhn", "Lutz-en-Dunois", -"Luxémont-et-Villotte", "Luxe-Sumberraute", "Luxeuil-les-Bains", +"Luxémont-et-Villotte", "Luz-Saint-Sauveur", "Luzy-Saint-Martin", "Luzy-sur-Marne", +"Luçay-le-Libre", +"Luçay-le-Mâle", +"Lué-en-Baugeois", "Ly-Fontaine", "Lyons-la-Forêt", -"lyro-guitare", "Lys-Haut-Layon", -"Lys-lez-Lannoy", "Lys-Saint-Georges", +"Lys-lez-Lannoy", +"Lâ-Todin", +"Lège-Cap-Ferret", +"Léa-Lisa", +"Lédas-et-Penthiès", +"Lées-Athas", +"Légion-d'Honneur", +"Léguillac-de-Cercles", +"Léguillac-de-l'Auche", +"Légéville-et-Bonfays", +"Lépanges-sur-Vologne", +"Lépin-le-Lac", +"Lépron-les-Vallées", +"Lésignac-Durand", +"Lévignac-de-Guyenne", +"Lévis-Saint-Nom", +"Lévy-Saint-Nom", +"Lézat-sur-Lèze", +"Lézignan-Corbières", +"Lézignan-la-Cèbe", +"Lüchow-Dannenberg", +"Lüterkofen-Ichertswil", +"Lüterswil-Gächliwil", +"Lüttow-Valluhn", +"M'Tsangamouji", "Maarke-Kerkem", "Maast-et-Violaine", -"mac-adamisa", -"mac-adamisai", -"mac-adamisaient", -"mac-adamisais", -"mac-adamisait", -"mac-adamisâmes", -"mac-adamisant", -"mac-adamisas", -"mac-adamisasse", -"mac-adamisassent", -"mac-adamisasses", -"mac-adamisassiez", -"mac-adamisassions", -"mac-adamisât", -"mac-adamisâtes", -"mac-adamise", -"mac-adamisé", -"mac-adamisée", -"mac-adamisées", -"mac-adamisent", -"mac-adamiser", -"mac-adamisera", -"mac-adamiserai", -"mac-adamiseraient", -"mac-adamiserais", -"mac-adamiserait", -"mac-adamiseras", -"mac-adamisèrent", -"mac-adamiserez", -"mac-adamiseriez", -"mac-adamiserions", -"mac-adamiserons", -"mac-adamiseront", -"mac-adamises", -"mac-adamisés", -"mac-adamisez", -"mac-adamisiez", -"mac-adamisions", -"mac-adamisons", +"Machecoul-Saint-Même", "Macédoine-Centrale", "Macédoine-Occidentale", "Macédoine-Orientale-et-Thrace", -"mac-ferlane", -"mac-ferlanes", -"mâche-bouchons", -"Machecoul-Saint-Même", -"mâche-dru", -"mâche-laurier", -"machin-chose", -"machin-choses", -"machin-chouette", -"machine-outil", -"machines-outils", -"machins-chouettes", -"machon-gorgeon", -"mac-kintosh", -"mac-kintoshs", -"Mâcot-la-Plagne", -"ma'di", "Madlitz-Wilmersdorf", "Madonne-et-Lamerey", -"maël-carhaisien", -"Maël-Carhaisien", -"maël-carhaisienne", -"Maël-Carhaisienne", -"maël-carhaisiennes", -"Maël-Carhaisiennes", -"maël-carhaisiens", -"Maël-Carhaisiens", -"Maël-Carhaix", -"Maël-Pestivien", -"Maen-Roch", "Mae-West", "Mae-Wests", -"magasin-pilote", -"magasins-pilotes", +"Maen-Roch", "Magnac-Bourg", "Magnac-Laval", "Magnac-Lavalette-Villars", "Magnac-sur-Touvre", "Magnat-l'Etrange", "Magnat-l'Étrange", -"magnésio-anthophyllite", -"magnésio-anthophyllites", -"magnésio-axinite", -"magnésio-axinites", -"magnésio-calcite", -"magnésio-calcites", -"magnéto-électrique", -"magnéto-électriques", -"magnéto-optique", -"magnéto-optiques", "Magneux-Haute-Rive", "Magnicourt-en-Comte", "Magnicourt-sur-Canche", "Magny-Châtelard", "Magny-Cours", "Magny-Danigon", -"Magny-en-Bessin", -"Magny-en-Vexin", "Magny-Fouchard", "Magny-Jobert", +"Magny-Lambert", +"Magny-Lormes", +"Magny-Montarlot", +"Magny-Saint-Médard", +"Magny-Vernois", +"Magny-en-Bessin", +"Magny-en-Vexin", "Magny-la-Campagne", "Magny-la-Fosse", -"Magny-Lambert", "Magny-la-Ville", "Magny-le-Désert", "Magny-le-Freule", "Magny-le-Hongre", -"Magny-lès-Aubigny", "Magny-les-Hameaux", +"Magny-lès-Aubigny", "Magny-lès-Jussey", "Magny-lès-Villers", -"Magny-Lormes", -"Magny-Montarlot", -"Magny-Saint-Médard", "Magny-sur-Tille", -"Magny-Vernois", "Magstatt-le-Bas", "Magstatt-le-Haut", -"mahi-mahi", -"mah-jong", -"mah-jongs", "Maignaut-Tauzia", "Maignelay-Montigny", -"mail-coach", "Mailhac-sur-Benaize", "Mailleroncourt-Charette", "Mailleroncourt-Saint-Pancras", "Mailley-et-Chazelot", -"mailly-castellois", "Mailly-Castellois", -"mailly-castelloise", "Mailly-Castelloise", -"mailly-castelloises", "Mailly-Castelloises", "Mailly-Champagne", +"Mailly-Maillet", +"Mailly-Raineval", "Mailly-la-Ville", "Mailly-le-Camp", "Mailly-le-Château", -"Mailly-Maillet", -"Mailly-Raineval", "Mailly-sur-Seille", -"main-brune", -"main-courante", -"Maincourt-sur-Yvette", -"main-d'oeuvre", -"main-d'œuvre", -"maine-anjou", -"Maine-de-Boixe", -"Maine-et-Loire", -"main-forte", "Main-Kinzig", -"main-militaire", -"mains-courantes", -"mains-d'oeuvre", -"mains-d'œuvre", "Main-Spessart", "Main-Tauber", "Main-Taunus", -"maire-adjoint", -"Mairé-Levescault", -"maires-adjoints", +"Maincourt-sur-Yvette", +"Maine-de-Boixe", +"Maine-et-Loire", "Mairy-Mainville", "Mairy-sur-Marne", +"Mairé-Levescault", "Maisdon-sur-Sèvre", "Maisey-le-Duc", "Maisières-Notre-Dame", "Maisnil-lès-Ruitz", "Maison-Blanche", -"Maisoncelle-et-Villers", +"Maison-Feyne", +"Maison-Maugis", +"Maison-Ponthieu", +"Maison-Roland", +"Maison-Rouge", +"Maison-des-Champs", "Maisoncelle-Saint-Pierre", +"Maisoncelle-Tuilerie", +"Maisoncelle-et-Villers", +"Maisoncelles-Pelvey", "Maisoncelles-du-Maine", "Maisoncelles-en-Brie", "Maisoncelles-en-Gâtinais", "Maisoncelles-la-Jourdan", -"Maisoncelles-Pelvey", "Maisoncelles-sur-Ajon", -"Maisoncelle-Tuilerie", -"Maison-des-Champs", -"Maison-Feyne", -"Maison-Maugis", -"maison-mère", "Maisonnais-sur-Tardoire", -"Maison-Ponthieu", -"Maison-Roland", -"Maison-Rouge", "Maisons-Alfort", +"Maisons-Laffitte", "Maisons-du-Bois-Lièvremont", "Maisons-en-Champagne", -"Maisons-Laffitte", "Maisons-lès-Chaource", "Maisons-lès-Soulaines", -"maisons-mères", -"maître-assistant", -"maitre-autel", -"maître-autel", -"maître-bau", -"maitre-chanteur", -"maître-chanteur", -"maître-chanteuse", -"maitre-chien", -"maître-chien", -"maître-cylindre", -"maître-jacques", -"maître-mot", -"maitre-nageur", -"maître-nageur", -"maitre-nageuse", -"maître-nageuse", -"maîtres-assistants", -"maîtres-autels", -"maîtres-chanteurs", -"maîtres-chanteuses", -"maitres-chiens", -"maîtres-chiens", -"maîtres-cylindres", -"maîtres-jacques", -"maîtres-mots", -"maitres-nageurs", -"maîtres-nageurs", -"maitres-nageuses", -"maîtres-nageuses", -"maîtresse-femme", -"maitresse-nageuse", -"maîtresse-nageuse", -"maîtresses-femmes", -"maitresses-nageuses", -"maîtresses-nageuses", "Maizières-la-Grande-Paroisse", "Maizières-lès-Brienne", "Maizières-lès-Metz", "Maizières-lès-Vic", "Maizières-sur-Amance", -"ma-jong", -"ma-jongs", -"make-up", -"make-ups", -"making-of", -"makura-e", -"makura-es", -"mal-aimé", -"mal-aimée", -"mal-aimés", +"Mal-Peigné", +"Mal-Peignée", "Malaincourt-sur-Meuse", "Malancourt-la-Montagne", "Malarce-sur-la-Thines", "Malaucourt-sur-Seille", "Malay-le-Grand", "Malay-le-Petit", -"malayo-polynésien", -"malayo-polynésienne", -"malayo-polynésiennes", -"malayo-polynésiens", "Malayo-Polynésiens", -"mal-baisé", -"mal-baisée", -"mal-baisées", -"mal-baisés", "Malborghetto-Valbruna", -"mal-comprenant", -"mal-comprenants", -"malécite-passamaquoddy", -"mal-égal", "Malemort-du-Comtat", "Malemort-sur-Corrèze", -"mal-en-point", -"mâles-stériles", -"mâle-stérile", -"mâle-stériles", -"mal-être", -"mal-êtres", -"Malèves-Sainte-Marie-Wastines", -"malgré-nous", "Malherbe-sur-Ajon", "Malicorne-sur-Sarthe", "Malines-sur-Meuse", -"mal-information", -"mal-informations", -"mal-jugé", -"mal-jugés", "Mallefougasse-Augès", -"malle-poste", "Malleret-Boussac", "Mallersdorf-Pfaffenberg", "Malleval-en-Vercors", "Malleville-les-Grès", "Malleville-sur-le-Bec", -"mal-logement", -"mal-logements", "Malo-les-Bains", "Malons-et-Elze", -"mal-peigné", -"Mal-Peigné", -"mal-peignée", -"Mal-Peignée", -"mal-pensans", -"mal-pensant", -"mal-pensante", -"mal-pensantes", -"mal-pensants", -"Malsburg-Marzell", -"mals-peignées", "Mals-Peignées", -"mals-peignés", "Mals-Peignés", -"mal-venant", -"mal-venants", +"Malsburg-Marzell", "Malves-en-Minervois", -"mal-voyant", -"mal-voyants", -"m'amie", -"mamie-boomeuse", -"mamie-boomeuses", -"mam'selle", -"mam'selles", -"mamy-boomeuse", -"mamy-boomeuses", -"mam'zelle", -"mam'zelles", +"Malèves-Sainte-Marie-Wastines", "Manas-Bastanous", -"man-bun", -"man-buns", "Mancenans-Lizerne", -"manche-à-balle", -"manche-à-balles", -"manco-liste", -"manco-listes", "Mandailles-Saint-Julien", -"mandant-dépendant", -"mandat-carte", -"mandat-cash", -"mandat-lettre", -"mandat-poste", -"mandats-cartes", -"mandats-cash", -"mandats-lettres", -"mandats-poste", "Mandelieu-la-Napoule", "Mandeville-en-Bessin", "Mandres-aux-Quatre-Tours", @@ -15053,31 +8039,14 @@ FR_BASE_EXCEPTIONS = [ "Mandres-les-Roses", "Mandres-sur-Vair", "Manent-Montané", -"manganico-potassique", -"mangano-ankérite", -"mangano-ankérites", -"mangano-phlogopite", -"mangano-phlogopites", -"manganoso-ammonique", -"mange-Canayen", -"mange-debout", -"mange-disque", -"mange-disques", -"mange-merde", -"mange-piles", -"mange-tout", "Mango-Rosa", -"maniaco-dépressif", -"maniaco-dépressifs", -"maniaco-dépressive", -"maniaco-dépressives", "Maninghen-Henne", "Manneken-pis", -"Manneville-ès-Plains", "Manneville-la-Goupil", "Manneville-la-Pipard", "Manneville-la-Raoult", "Manneville-sur-Risle", +"Manneville-ès-Plains", "Mannweiler-Cölln", "Manoncourt-en-Vermois", "Manoncourt-en-Woëvre", @@ -15089,8 +8058,6 @@ FR_BASE_EXCEPTIONS = [ "Mantes-la-Jolie", "Mantes-la-Ville", "Manzac-sur-Vern", -"mappe-monde", -"mappes-mondes", "Marainville-sur-Madon", "Marais-Vernier", "Marange-Silvange", @@ -15098,33 +8065,28 @@ FR_BASE_EXCEPTIONS = [ "Marat-sur-Aisne", "Maraye-en-Othe", "Marbourg-Biedenkopf", +"Marc-la-Tour", "Marcellaz-Albanais", -"Marcé-sur-Esves", "Marcey-les-Grèves", "Marchais-Beton", "Marchais-Béton", "Marchais-en-Brie", -"Marché-Allouarde", "Marche-en-Famenne", -"marché-gare", -"marché-gares", "Marche-les-Dames", "Marche-lez-Écaussinnes", -"marche-palier", -"Marchéville-en-Woëvre", "Marchienne-au-Pont", "Marchiennes-Campagne", +"Marché-Allouarde", +"Marchéville-en-Woëvre", "Marcigny-sous-Thil", "Marcilhac-sur-Célé", -"Marcillac-la-Croisille", -"Marcillac-la-Croze", "Marcillac-Lanville", "Marcillac-Saint-Quentin", "Marcillac-Vallon", +"Marcillac-la-Croisille", +"Marcillac-la-Croze", "Marcillat-en-Combraille", -"Marcillé-la-Ville", -"Marcillé-Raoul", -"Marcillé-Robert", +"Marcilly-Ogny", "Marcilly-d'Azergues", "Marcilly-en-Bassigny", "Marcilly-en-Beauce", @@ -15138,33 +8100,29 @@ FR_BASE_EXCEPTIONS = [ "Marcilly-le-Pavé", "Marcilly-lès-Buxy", "Marcilly-lès-Vitteaux", -"Marcilly-Ogny", "Marcilly-sur-Eure", "Marcilly-sur-Maulne", "Marcilly-sur-Seine", "Marcilly-sur-Tille", "Marcilly-sur-Vienne", -"Marc-la-Tour", +"Marcillé-Raoul", +"Marcillé-Robert", +"Marcillé-la-Ville", "Marcols-les-Eaux", -"marco-lucanien", -"marco-lucanienne", -"marco-lucaniennes", -"marco-lucaniens", +"Marcq-en-Barœul", "Marcq-en-Barœul", "Marcq-en-Ostrevent", "Marcq-et-Chevières", "Marcy-l'Etoile", "Marcy-l'Étoile", "Marcy-sous-Marle", +"Marcé-sur-Esves", "Mareau-aux-Bois", "Mareau-aux-Prés", -"maréchal-ferrant", -"maréchaux-ferrans", -"maréchaux-ferrants", +"Mareil-Marly", "Mareil-en-Champagne", "Mareil-en-France", "Mareil-le-Guyon", -"Mareil-Marly", "Mareil-sur-Loir", "Mareil-sur-Mauldre", "Maren-Kessel", @@ -15185,98 +8143,71 @@ FR_BASE_EXCEPTIONS = [ "Mareuil-sur-Ourcq", "Marey-lès-Fussey", "Marey-sur-Tille", -"margarino-sulfurique", "Margaux-Cantenac", "Margerie-Chantagret", "Margerie-Hancourt", -"margis-chef", -"margis-chefs", "Margny-aux-Cerises", "Margny-lès-Compiègne", "Margny-sur-Matz", "Margouët-Meymes", -"mariage-sacrement", "Maria-Hoop", "Marie-Ange", "Marie-Antoinette", -"Marie-blanque", -"marie-chantal", "Marie-Chantal", -"marie-chantalerie", -"marie-chantaleries", "Marie-Christine", "Marie-Claire", "Marie-Claude", -"marie-couche-toi-là", -"Marie-couche-toi-là", "Marie-Crochet", -"Marie-Élise", -"Marie-Ève", "Marie-France", "Marie-Françoise", -"marie-galante", "Marie-Galante", -"marie-galantes", "Marie-Gisèle", "Marie-Hélène", -"marie-jeanne", -"marie-jeannes", "Marie-José", "Marie-Laure", -"marie-louise", "Marie-Louise", -"marie-louises", "Marie-Madeleine", "Marie-Marc", -"marie-monastérien", "Marie-Monastérien", -"marie-monastérienne", "Marie-Monastérienne", -"marie-monastériennes", "Marie-Monastériennes", -"marie-monastériens", "Marie-Monastériens", -"marie-montois", "Marie-Montois", -"marie-montoise", "Marie-Montoise", -"marie-montoises", "Marie-Montoises", "Marie-Noëlle", "Marie-Paule", "Marie-Pier", "Marie-Pierre", -"marie-salope", -"maries-salopes", "Marie-Thérèse", -"marie-trintigner", -"Marignac-en-Diois", +"Marie-blanque", +"Marie-couche-toi-là", +"Marie-Ève", +"Marie-Élise", +"Marigna-sur-Valouse", "Marignac-Lasclares", "Marignac-Laspeyres", -"Marigna-sur-Valouse", -"Marigné-Laillé", -"Marigné-Peuton", +"Marignac-en-Diois", "Marigny-Brizay", "Marigny-Chemereau", -"Marigny-en-Orxois", -"Marigny-le-Cahouët", -"Marigny-le-Châtel", -"Marigny-l'Eglise", -"Marigny-l'Église", "Marigny-Le-Lozon", -"Marigny-lès-Reullée", -"Marigny-les-Usages", "Marigny-Marmande", "Marigny-Saint-Marcel", +"Marigny-en-Orxois", +"Marigny-l'Eglise", +"Marigny-l'Église", +"Marigny-le-Cahouët", +"Marigny-le-Châtel", +"Marigny-les-Usages", +"Marigny-lès-Reullée", "Marigny-sur-Yonne", +"Marigné-Laillé", +"Marigné-Peuton", "Marillac-le-Franc", "Marimont-lès-Bénestroff", "Maring-Noviand", -"marin-pêcheur", -"marins-pêcheurs", -"Marizy-Sainte-Geneviève", "Marizy-Saint-Mard", -"marka-dafing", +"Marizy-Sainte-Geneviève", "Markina-Xemein", "Marles-en-Brie", "Marles-les-Mines", @@ -15291,64 +8222,21 @@ FR_BASE_EXCEPTIONS = [ "Marnay-sur-Seine", "Marnes-la-Coquette", "Marnhagues-et-Latour", -"marno-bitumineux", -"marno-calcaire", -"marno-calcaires", "Marolles-en-Beauce", "Marolles-en-Brie", "Marolles-en-Hurepoix", -"Marolles-lès-Bailly", "Marolles-les-Braults", "Marolles-les-Buis", +"Marolles-lès-Bailly", "Marolles-lès-Saint-Calais", "Marolles-sous-Lignières", "Marolles-sur-Seine", "Marqueny-au-Vallage", -"marque-ombrelle", -"marque-page", -"marque-pagé", -"marque-pagea", -"marque-pageai", -"marque-pageaient", -"marque-pageais", -"marque-pageait", -"marque-pageâmes", -"marque-pageant", -"marque-pageas", -"marque-pageasse", -"marque-pageassent", -"marque-pageasses", -"marque-pageassiez", -"marque-pageassions", -"marque-pageât", -"marque-pageâtes", -"marque-pagée", -"marque-pagées", -"marque-pagent", -"marque-pageons", -"marque-pager", -"marque-pagera", -"marque-pagerai", -"marque-pageraient", -"marque-pagerais", -"marque-pagerait", -"marque-pageras", -"marque-pagèrent", -"marque-pagerez", -"marque-pageriez", -"marque-pagerions", -"marque-pagerons", -"marque-pageront", -"marque-pages", -"marque-pagés", -"marque-pagez", -"marque-pagiez", -"marque-pagions", -"marque-produit", -"marque-produits", -"marques-ombrelles", "Marquette-en-Ostrevant", "Marquette-lez-Lille", +"Mars-la-Tour", +"Mars-sous-Bourcq", +"Mars-sur-Allier", "Marsac-en-Livradois", "Marsac-sur-Don", "Marsac-sur-l'Isle", @@ -15358,125 +8246,71 @@ FR_BASE_EXCEPTIONS = [ "Marseille-en-Beauvaisis", "Marseille-lès-Aubigny", "Marseilles-lès-Aubigny", -"Mars-la-Tour", "Marson-sur-Barboure", "Marssac-sur-Tarn", -"Mars-sous-Bourcq", -"Mars-sur-Allier", "Martailly-lès-Brancion", "Martainville-Epreville", "Martainville-Épreville", -"marteau-de-mer", -"marteau-pilon", -"marteau-piqueur", -"marteaux-pilons", -"marteaux-piqueurs", -"marte-piquant", -"marte-piquants", "Martignas-sur-Jalle", -"Martigné-Briand", -"Martigné-Ferchaud", -"Martigné-sur-Mayenne", "Martigny-Combe", "Martigny-Courpierre", "Martigny-le-Comte", "Martigny-les-Bains", "Martigny-les-Gerbonvaux", "Martigny-sur-l'Ante", -"martin-bâton", -"Martin-bâton", -"martin-bâtons", -"Martin-bâtons", -"martin-chasseur", -"Martincourt-sur-Meuse", +"Martigné-Briand", +"Martigné-Ferchaud", +"Martigné-sur-Mayenne", "Martin-Eglise", +"Martin-bâton", +"Martin-bâtons", "Martin-Église", -"martin-pêcheur", -"martins-chasseurs", -"martin-sec", -"martin-sire", -"martins-pêcheurs", -"martins-sires", -"martins-sucrés", -"martin-sucré", +"Martincourt-sur-Meuse", "Martouzin-Neuville", +"Martres-Tolosane", "Martres-d'Artières", "Martres-de-Rivière", "Martres-sur-Morge", -"Martres-Tolosane", -"martres-zibelines", -"martre-zibeline", -"Maruéjols-lès-Gardon", "Maruri-Jatabe", +"Maruéjols-lès-Gardon", "Marvaux-Vieux", -"Marville-les-Bois", "Marville-Moutiers-Brûlé", -"marxisme-léninisme", -"marxiste-léniniste", -"marxistes-léninistes", +"Marville-les-Bois", "Mary-sur-Marne", -"m'as", -"masa'il", -"masa'ils", -"Masbaraud-Mérignat", "Mas-Blanc", "Mas-Blanc-des-Alpilles", "Mas-Cabardès", -"Mascaraàs-Haron", -"mas-chélyen", "Mas-Chélyen", -"mas-chélyenne", "Mas-Chélyenne", -"mas-chélyennes", "Mas-Chélyennes", -"mas-chélyens", "Mas-Chélyens", +"Mas-Grenier", +"Mas-Saint-Chély", +"Mas-Saintes-Puelles", +"Mas-Tençois", +"Mas-Tençoise", +"Mas-Tençoises", "Mas-d'Auvignon", +"Mas-d'Orcières", "Mas-de-Londres", "Mas-des-Cours", -"Mas-d'Orcières", +"Masbaraud-Mérignat", +"Mascaraàs-Haron", "Masevaux-Niederbruck", -"Mas-Grenier", "Masnuy-Saint-Jean", "Masnuy-Saint-Pierre", "Maspie-Lalonquère-Juillacq", "Massa-Carrara", "Massac-Séran", -"Mas-Saint-Chély", -"Mas-Saintes-Puelles", "Massen-Niederlausitz", -"masseur-kinésithérapeute", -"masseurs-kinésithérapeutes", -"masseuse-kinésithérapeute", -"masseuses-kinésithérapeutes", "Massignieu-de-Rives", "Massillargues-Attuech", "Massingy-lès-Semur", "Massingy-lès-Vitteaux", -"mass-média", -"mass-médias", -"mas-tençois", -"Mas-Tençois", -"mas-tençoise", -"Mas-Tençoise", -"mas-tençoises", -"Mas-Tençoises", -"m'as-tu-vu", -"m'as-tu-vue", -"m'as-tu-vues", -"m'as-tu-vus", "Matafelon-Granges", "Matagne-la-Grande", "Matagne-la-Petite", -"materno-infantile", -"materno-infantiles", -"mathématico-informatique", -"mathématico-informatiques", "Matignicourt-Goncourt", -"matthéo-lucanien", -"matthéo-lucanienne", -"matthéo-lucaniennes", -"matthéo-lucaniens", "Matton-et-Clémency", "Matzlow-Garwitz", "Maubert-Fontaine", @@ -15484,8 +8318,8 @@ FR_BASE_EXCEPTIONS = [ "Maudétour-en-Vexin", "Mauges-sur-Loire", "Mauléon-Barousse", -"Mauléon-d'Armagnac", "Mauléon-Licharre", +"Mauléon-d'Armagnac", "Maulévrier-Sainte-Gertrude", "Maumusson-Laguian", "Maupertus-sur-Mer", @@ -15494,8 +8328,6 @@ FR_BASE_EXCEPTIONS = [ "Maureilhan-et-Raméjean", "Maureillas-las-Illas", "Maurens-Scopont", -"mauritano-marocain", -"mauritano-sénégalais", "Maurupt-le-Montois", "Maussane-les-Alpilles", "Mauves-sur-Huisne", @@ -15506,100 +8338,55 @@ FR_BASE_EXCEPTIONS = [ "Mauvezin-sur-Gupie", "Mauzac-et-Grand-Castang", "Mauzens-et-Miremont", -"Mauzé-sur-le-Mignon", "Mauzé-Thouarsais", +"Mauzé-sur-le-Mignon", "Mavilly-Mandelot", "Mawashi-geri", "Maxey-sur-Meuse", "Maxey-sur-Vaise", "Maxhütte-Haidhof", -"maxillo-dentaire", -"maxillo-facial", -"maxillo-labial", -"maxillo-musculaire", "Maxilly-sur-Léman", "Maxilly-sur-Saône", -"Mayence-Bingen", -"Mayen-Coblence", "May-en-Multien", +"May-sur-Orne", +"Mayen-Coblence", +"Mayence-Bingen", "Mayres-Savel", "Mayrinhac-Lentour", -"May-sur-Orne", "Mazan-l'Abbaye", -"Mazé-Milon", "Mazerat-Aurouze", -"Mazères-de-Neste", -"Mazères-Lezons", -"Mazères-sur-Salat", "Mazerolles-du-Razès", "Mazerolles-le-Salin", "Mazet-Saint-Voy", "Mazeyrat-Aurouze", "Mazeyrat-d'Allier", +"Mazières-Naresse", "Mazières-de-Touraine", "Mazières-en-Gâtine", "Mazières-en-Mauges", -"Mazières-Naresse", "Mazières-sur-Béronne", +"Mazères-Lezons", +"Mazères-de-Neste", +"Mazères-sur-Salat", +"Mazé-Milon", +"Maël-Carhaisien", +"Maël-Carhaisienne", +"Maël-Carhaisiennes", +"Maël-Carhaisiens", +"Maël-Carhaix", +"Maël-Pestivien", "Mbanza-Ngungu", -"m'bororo", "McDonald's", -"m-commerce", -"m'demma", -"mea-culpa", -"meâ-culpâ", "Meaulne-Vitray", "Meaux-la-Montagne", "Mechelen-aan-de-Maas", -"Mecklembourg-du-Nord-Ouest", "Mecklembourg-Poméranie-Occidentale", "Mecklembourg-Strelitz", -"mécoprop-P", -"médecine-ball", -"médecine-balls", -"médiévale-fantastique", -"médiévales-fantastiques", -"médiéval-fantastique", -"médiévaux-fantastiques", +"Mecklembourg-du-Nord-Ouest", "Medina-Sidonia", -"médio-dorsal", -"médio-européen", -"médio-européenne", -"médio-européennes", -"médio-européens", -"médio-jurassique", -"médio-jurassiques", -"médio-latin", -"médio-latine", -"médio-latines", -"médio-latins", -"médio-océanique", -"médio-océaniques", -"méduse-boite", -"méduse-boîte", -"méduses-boites", -"méduses-boîtes", "Meensel-Kiezegem", "Meerlo-Wanssum", "Meeuwen-Gruitrode", -"méfenpyr-diéthyl", -"méga-ampère", -"méga-ampères", -"méga-église", -"méga-églises", -"méga-électron-volt", -"mégaélectron-volt", -"méga-électron-volts", -"mégaélectron-volts", -"méga-herbivore", -"méga-herbivores", -"mégalo-martyr", -"mégalo-martyrs", -"méga-océan", -"méga-océans", -"méga-ohm", -"méga-ohms", -"mégléno-roumain", "Mehun-sur-Yèvre", "Meigné-le-Vicomte", "Meilhan-sur-Garonne", @@ -15607,109 +8394,33 @@ FR_BASE_EXCEPTIONS = [ "Meilly-sur-Rouvres", "Meix-devant-Virton", "Meix-le-Tige", -"Méjannes-le-Clap", -"Méjannes-lès-Alès", -"mêlé-cass", -"mêlé-casse", -"mêlé-casses", -"mêlé-cassis", -"mele-fila", -"mêle-tout", -"Méligny-le-Grand", -"Méligny-le-Petit", -"méli-mélo", -"mêli-mêlo", -"mélis-mélos", -"mêlis-mêlos", "Mellenbach-Glasbach", "Melleray-la-Vallée", "Melun-Sénart", "Melz-sur-Seine", -"membrano-calcaire", -"Ménestérol-Montignac", -"Ménestreau-en-Villette", "Menetou-Couture", "Menetou-Râtel", "Menetou-Salon", "Menetou-sur-Nahon", -"Ménétréol-sous-Sancerre", -"Ménétréols-sous-Vatan", -"Ménétréol-sur-Sauldre", -"Ménétreux-le-Pitois", -"Menétru-le-Vignoble", -"Menétrux-en-Joux", -"m'enfin", "Mengersgereuth-Hämmern", -"Ménil-Annelles", -"ménil-annellois", -"Ménil-Annellois", -"ménil-annelloise", -"Ménil-Annelloise", -"ménil-annelloises", -"Ménil-Annelloises", -"Ménil-aux-Bois", -"Ménil-de-Senones", -"Ménil-en-Xaintois", -"Ménil-Erreux", -"Ménil-Froger", -"Ménil-Gondouin", -"ménil-gondoyen", -"Ménil-Gondoyen", -"ménil-gondoyenne", -"Ménil-Gondoyenne", -"ménil-gondoyennes", -"Ménil-Gondoyennes", -"ménil-gondoyens", -"Ménil-Gondoyens", -"Ménil-Hermei", -"Ménil-Hubert-en-Exmes", -"Ménil-Hubert-sur-Orne", -"Ménil-Jean", -"Ménil-la-Horgne", -"Ménil-la-Tour", -"Ménil-Lépinois", -"Ménil'muche", -"Ménil-sur-Belvitte", -"Ménil-sur-Saulx", -"Ménil-Vin", -"méningo-encéphalite", -"méningo-gastrique", -"méningo-gastriques", "Mennetou-sur-Cher", -"menthe-coq", +"Menthon-Saint-Bernard", "Menthonnex-en-Bornes", "Menthonnex-sous-Clermont", -"Menthon-Saint-Bernard", "Mentque-Nortbécourt", -"menuisier-moulurier", -"Méolans-Revel", -"Méounes-lès-Montrieux", -"mépiquat-chlorure", -"Merbes-le-Château", +"Menétru-le-Vignoble", +"Menétrux-en-Joux", "Merbes-Sainte-Marie", +"Merbes-le-Château", "Mercey-le-Grand", "Mercey-sur-Saône", "Mercin-et-Vaux", "Merck-Saint-Liévin", "Mercurol-Veaunes", -"mercuroso-mercurique", "Mercury-Gémilly", "Mercus-Garrabet", "Mercy-le-Bas", "Mercy-le-Haut", -"mère-grand", -"Mérens-les-Vals", -"mères-grand", -"Mérey-sous-Montrond", -"Mérey-Vieilley", -"Méricourt-en-Vimeu", -"Méricourt-l'Abbé", -"Méricourt-sur-Somme", -"mérier-blanc", -"mériers-blancs", -"Mérindol-les-Oliviers", -"merisier-pays", -"merisiers-pays", "Merkers-Kieselbach", "Merkwiller-Pechelbronn", "Merle-Leignec", @@ -15717,22 +8428,13 @@ FR_BASE_EXCEPTIONS = [ "Merlieux-et-Fouquerolles", "Meroux-Moval", "Merrey-sur-Arce", -"Merry-la-Vallée", "Merry-Sec", +"Merry-la-Vallée", "Merry-sur-Yonne", "Mers-les-Bains", "Mers-sur-Indre", -"Merville-au-Bois", "Merville-Franceville-Plage", -"Méry-Bissières-en-Auge", -"Méry-Corbon", -"Méry-ès-Bois", -"Méry-la-Bataille", -"Méry-Prémecy", -"Méry-sur-Cher", -"Méry-sur-Marne", -"Méry-sur-Oise", -"Méry-sur-Seine", +"Merville-au-Bois", "Merzig-Wadern", "Mesbrecourt-Richecourt", "Meschers-sur-Gironde", @@ -15741,212 +8443,114 @@ FR_BASE_EXCEPTIONS = [ "Meslay-le-Vidame", "Meslin-l'Évêque", "Mesnard-la-Barotière", -"Mesnières-en-Bray", +"Mesnil-Bruntel", +"Mesnil-Clinchamps", +"Mesnil-Domqueur", +"Mesnil-Follemprise", +"Mesnil-Lettre", +"Mesnil-Martinsart", +"Mesnil-Mauger", +"Mesnil-Panneville", +"Mesnil-Raoul", +"Mesnil-Rousset", +"Mesnil-Saint-Georges", +"Mesnil-Saint-Laurent", +"Mesnil-Saint-Loup", +"Mesnil-Saint-Nicaise", +"Mesnil-Saint-Père", +"Mesnil-Sellières", +"Mesnil-Verclives", +"Mesnil-en-Arrouaise", +"Mesnil-en-Ouche", +"Mesnil-la-Comtesse", +"Mesnil-sous-Vienne", +"Mesnil-sur-l'Estrée", "Mesnils-sur-Iton", -"méso-américain", -"méso-américaine", -"méso-américaines", -"méso-américains", -"Méso-Amérique", -"méso-diastolique", -"méso-diastoliques", -"méso-hygrophile", -"méso-hygrophiles", -"mésosulfuron-méthyl-sodium", -"méso-systolique", -"méso-systoliques", +"Mesnières-en-Bray", "Messey-sur-Grosne", "Messia-sur-Sorne", "Messigny-et-Vantoux", "Messimy-sur-Saône", "Mesves-sur-Loire", -"métacarpo-phalangien", -"Métairies-Saint-Quirin", -"métalaxyl-M", -"métam-sodium", -"métaphysico-théologo-cosmolo-nigologie", -"métaphysico-théologo-cosmolo-nigologies", -"métatarso-phalangien", -"météo-dépendant", -"météo-dépendante", -"météo-dépendantes", -"météo-dépendants", -"méthyl-buténol", -"métirame-zinc", -"mètre-ruban", -"mètres-ruban", -"métro-boulot-dodo", -"mets-en", "Metz-Campagne", -"Metz-en-Couture", -"Metzerlen-Mariastein", -"Metz-le-Comte", "Metz-Robert", -"metz-tesseran", "Metz-Tesseran", -"metz-tesseranne", "Metz-Tesseranne", -"metz-tesserannes", "Metz-Tesserannes", -"metz-tesserans", "Metz-Tesserans", "Metz-Tessy", "Metz-Ville", +"Metz-en-Couture", +"Metz-le-Comte", +"Metzerlen-Mariastein", "Meulan-en-Yvelines", "Meunet-Planches", "Meunet-sur-Vatan", "Meung-sur-Loire", -"meurt-de-faim", -"meurt-de-soif", "Meurthe-et-Moselle", -"meurt-la-faim", "Meuselbach-Schwarzmühle", -"meuse-rhin-yssel", -"Mévergnies-lez-Lens", "Meyrieu-les-Etangs", "Meyrieu-les-Étangs", "Meyrieux-Trouet", "Meyrignac-l'Eglise", "Meyrignac-l'Église", -"Mézidon-Canon", -"Mézières-au-Perche", -"Mézières-en-Brenne", -"Mézières-en-Drouais", -"Mézières-en-Gâtinais", -"Mézières-en-Santerre", -"Mézières-en-Vexin", -"Mézières-lez-Cléry", -"Mézières-sous-Lavardin", -"Mézières-sur-Couesnon", -"Mézières-sur-Issoire", -"Mézières-sur-Oise", -"Mézières-sur-Ponthouin", -"Mézières-sur-Seine", -"Mézy-Moulins", -"Mézy-sur-Seine", -"mezzo-soprano", -"mezzo-sopranos", -"mezzo-termine", -"mezzo-tinto", "Mezzovico-Vira", -"m'halla", -"m'hallas", -"miam-miam", -"miaou-miaou", "Michel-Ange", -"michel-angélesque", -"michel-angélesques", "Michelbach-le-Bas", "Michelbach-le-Haut", -"microélectron-volt", -"microélectron-volts", "Midden-Delfland", "Midden-Drenthe", "Midden-Eierland", -"midi-chlorien", -"midi-chloriens", -"midi-pelle", -"midi-pelles", -"midi-pyrénéen", "Midi-Pyrénéen", "Midi-Pyrénéens", "Midi-Pyrénées", "Midsland-Noord", "Mielen-boven-Aalst", "Mierlo-Hout", -"mieux-disant", -"mieux-disante", -"mieux-disantes", -"mieux-disants", -"mieux-être", "Mignaloux-Beauvoir", "Migné-Auxances", "Milhac-d'Auberoche", "Milhac-de-Nontron", -"militaro-bureaucratique", -"militaro-bureaucratiques", -"militaro-industriel", -"militaro-industrielle", -"militaro-industrielles", -"militaro-industriels", "Milizac-Guipronvel", -"milk-bar", -"milk-bars", -"milk-shake", -"milk-shakes", -"mille-au-godet", -"mille-canton", -"mille-feuille", -"mille-feuilles", -"mille-fleurs", "Mille-Islois", "Millencourt-en-Ponthieu", -"mille-pattes", -"mille-pertuis", -"mille-pieds", -"mille-points", -"milliampère-heure", -"milliampères-heures", -"milli-électron-volt", -"milliélectron-volt", -"milli-électron-volts", -"milliélectron-volts", "Millienhagen-Oebelitz", "Millingen-sur-Rhin", -"milli-ohm", -"milli-ohms", -"Milly-la-Forêt", "Milly-Lamartine", +"Milly-la-Forêt", "Milly-sur-Bradon", "Milly-sur-Thérain", "Milon-la-Chapelle", -"mime-acrobate", +"Min-jun", +"Min-seo", "Minaucourt-le-Mesnil-lès-Hurlus", "Minden-Lübbecke", "Minho-Lima", "Miniac-Morvan", "Miniac-sous-Bécherel", "Minihy-Tréguier", -"ministre-présidence", -"ministre-présidences", -"ministre-président", -"ministres-présidents", -"Min-jun", -"minn'gotain", "Minn'Gotain", -"minn'gotaine", "Minn'Gotaine", -"minn'gotaines", "Minn'Gotaines", -"minn'gotains", "Minn'Gotains", -"Min-seo", -"minus-habens", -"minute-lumière", -"minutes-lumière", "Miossens-Lanusse", "Miquelon-Langlade", "Mirabel-aux-Baronnies", "Mirabel-et-Blacons", +"Miramont-Latour", +"Miramont-Sensacq", "Miramont-d'Astarac", "Miramont-de-Comminges", "Miramont-de-Guyenne", "Miramont-de-Quercy", -"Miramont-Latour", -"Miramont-Sensacq", "Mirandol-Bourgnounac", "Miraval-Cabardes", "Mirebeau-sur-Bèze", -"mire-oeuf", -"mire-œuf", -"mire-oeufs", -"mire-œufs", "Mirepoix-sur-Tarn", "Mireval-Lauragais", "Miribel-Lanchâtre", "Miribel-les-Echelles", "Miribel-les-Échelles", -"miro-miro", "Miserey-Salines", "Misery-Courtion", "Missen-Wilhams", @@ -15956,79 +8560,44 @@ FR_BASE_EXCEPTIONS = [ "Misy-sur-Yonne", "Mitry-Mory", "Mittainvilliers-Vérigny", -"mixed-border", -"mixti-unibinaire", -"m'kahla", -"m'kahlas", -"mobil-home", -"mobil-homes", "Moca-Croce", -"modèle-vue-contrôleur", -"modern-style", -"Moëlan-sur-Mer", -"Mœurs-Verdey", "Moffans-et-Vacheresse", -"mofu-gudur", "Moidieu-Détourbe", "Moigny-sur-Ecole", "Moigny-sur-École", -"moi-même", -"moins-disant", -"moins-disants", -"moins-que-rien", -"moins-value", -"moins-values", "Moinville-la-Jeulin", "Moirans-en-Montagne", "Moirey-Flabas-Crépion", "Moisdon-la-Rivière", -"mois-homme", -"mois-hommes", -"mois-lumière", "Moissac-Bellevue", "Moissac-Vallée-Française", "Moissieu-sur-Dolon", -"moissonner-battre", -"moissonneuse-batteuse", -"moissonneuse-lieuse", -"moissonneuses-batteuses", -"moissonneuses-lieuses", "Moissy-Cramayel", "Moissy-Moulinot", -"moite-moite", -"moitié-moitié", "Moitron-sur-Sarthe", -"mojeño-ignaciano", -"mojeño-javierano", -"mojeño-loretano", -"mojeño-trinitario", "Molenbeek-Saint-Jean", "Molenbeek-Wersbeek", -"Molières-Cavaillac", -"Molières-Glandaz", -"Molières-sur-Cèze", -"Molières-sur-l'Alberte", "Moliets-et-Maa", "Molines-en-Queyras", "Molins-sur-Aube", "Molitg-les-Bains", +"Molières-Cavaillac", +"Molières-Glandaz", +"Molières-sur-Cèze", +"Molières-sur-l'Alberte", "Mollans-sur-Ouvèze", -"Molliens-au-Bois", "Molliens-Dreuil", -"mollo-mollo", -"moment-clé", -"moment-clés", -"moments-clés", +"Molliens-au-Bois", "Monacia-d'Aullène", "Monacia-d'Orezza", "Monassut-Audiracq", "Moncayolle-Larrory-Mendibieu", -"Monceau-en-Ardenne", "Monceau-Imbrechies", -"Monceau-le-Neuf-et-Faucouzy", -"Monceau-lès-Leups", -"Monceau-le-Waast", "Monceau-Saint-Waast", +"Monceau-en-Ardenne", +"Monceau-le-Neuf-et-Faucouzy", +"Monceau-le-Waast", +"Monceau-lès-Leups", "Monceau-sur-Oise", "Monceau-sur-Sambre", "Monceaux-au-Perche", @@ -16036,42 +8605,38 @@ FR_BASE_EXCEPTIONS = [ "Monceaux-l'Abbaye", "Monceaux-le-Comte", "Monceaux-sur-Dordogne", -"Moncé-en-Belin", -"Moncé-en-Saosnois", "Moncel-lès-Lunéville", "Moncel-sur-Seille", "Moncel-sur-Vair", -"Moncetz-l'Abbaye", "Moncetz-Longevas", +"Moncetz-l'Abbaye", "Monchaux-Soreng", "Monchaux-sur-Ecaillon", "Monchaux-sur-Écaillon", "Moncheaux-lès-Frévent", "Monchel-sur-Canche", -"Mönchpfiffel-Nikolausrieth", -"Monchy-au-Bois", "Monchy-Breton", "Monchy-Cayeux", "Monchy-Humières", "Monchy-Lagache", -"Monchy-le-Preux", "Monchy-Saint-Eloi", "Monchy-Saint-Éloi", +"Monchy-au-Bois", +"Monchy-le-Preux", "Monchy-sur-Eu", "Monclar-de-Quercy", "Monclar-sur-Losse", "Moncorneil-Grazan", +"Moncé-en-Belin", +"Moncé-en-Saosnois", "Mondariz-Balneario", "Mondement-Montgivroux", "Mondonville-Saint-Jean", "Mondorf-les-Bains", -"Monestier-d'Ambel", -"Monestier-de-Clermont", "Monestier-Merlines", "Monestier-Port-Dieu", -"Monétay-sur-Allier", -"Monétay-sur-Loire", -"Monêtier-Allemont", +"Monestier-d'Ambel", +"Monestier-de-Clermont", "Monferran-Plavès", "Monferran-Savès", "Monflorite-Lascasas", @@ -16080,42 +8645,89 @@ FR_BASE_EXCEPTIONS = [ "Monistrol-d'Allier", "Monistrol-sur-Loire", "Monlaur-Bernet", -"Monléon-Magnoac", "Monlezun-d'Armagnac", -"monnaie-du-pape", -"Monnetier-Mornex", +"Monléon-Magnoac", "Monnet-la-Ville", +"Monnetier-Mornex", +"Mons-Boubert", +"Mons-en-Barœul", +"Mons-en-Laonnois", +"Mons-en-Montois", +"Mons-en-Pévèle", "Monsempron-Libos", -"monsieur-dame", "Monsteroux-Milieu", +"Mont-Bernanchon", +"Mont-Bonvillers", +"Mont-Cauvaire", +"Mont-Dauphin", +"Mont-Disse", +"Mont-Dol", +"Mont-Dore", +"Mont-Laurent", +"Mont-Louis", +"Mont-Notre-Dame", +"Mont-Ormel", +"Mont-Roc", +"Mont-Saint-Aignan", +"Mont-Saint-Jean", +"Mont-Saint-Léger", +"Mont-Saint-Martin", +"Mont-Saint-Père", +"Mont-Saint-Remy", +"Mont-Saint-Sulpice", +"Mont-Saint-Vincent", +"Mont-Saint-Éloi", +"Mont-Saxonnex", +"Mont-d'Astarac", +"Mont-d'Origny", +"Mont-de-Galié", +"Mont-de-Lans", +"Mont-de-Laval", +"Mont-de-Marrast", +"Mont-de-Marsan", +"Mont-de-Vougney", +"Mont-devant-Sassey", +"Mont-et-Marré", +"Mont-l'Étroit", +"Mont-l'Évêque", +"Mont-le-Vernois", +"Mont-le-Vignoble", +"Mont-lès-Lamarche", +"Mont-lès-Neufchâteau", +"Mont-lès-Seurre", +"Mont-près-Chambord", +"Mont-sous-Vaudrey", +"Mont-sur-Courville", +"Mont-sur-Meurthe", +"Mont-sur-Monnet", "Montacher-Villegardin", -"Montagnac-d'Auberoche", -"Montagnac-la-Crempse", -"Montagnac-Montpezat", -"Montagnac-sur-Auvignon", -"Montagnac-sur-Lède", "Montagna-le-Reconduit", "Montagna-le-Templier", +"Montagnac-Montpezat", +"Montagnac-d'Auberoche", +"Montagnac-la-Crempse", +"Montagnac-sur-Auvignon", +"Montagnac-sur-Lède", "Montagne-Fayel", "Montagney-Servigney", +"Montagny-Sainte-Félicité", "Montagny-en-Vexin", +"Montagny-les-Lanches", "Montagny-lès-Beaune", "Montagny-lès-Buxy", -"Montagny-les-Lanches", "Montagny-lès-Seurre", "Montagny-près-Louhans", "Montagny-près-Yverdon", -"Montagny-Sainte-Félicité", "Montagny-sur-Grosne", "Montaignac-Saint-Hippolyte", +"Montaigu-Zichem", "Montaigu-de-Quercy", -"Montaiguët-en-Forez", "Montaigu-la-Brisette", "Montaigu-le-Blin", "Montaigu-les-Bois", "Montaigut-le-Blanc", "Montaigut-sur-Save", -"Montaigu-Zichem", +"Montaiguët-en-Forez", "Montalba-d'Amélie", "Montalba-le-Château", "Montalet-le-Bois", @@ -16124,9 +8736,9 @@ FR_BASE_EXCEPTIONS = [ "Montaren-et-Saint-Médiers", "Montarlot-lès-Champlitte", "Montarlot-lès-Rioz", +"Montastruc-Savès", "Montastruc-de-Salies", "Montastruc-la-Conseillère", -"Montastruc-Savès", "Montauban-de-Bretagne", "Montauban-de-Luchon", "Montauban-de-Picardie", @@ -16136,21 +8748,21 @@ FR_BASE_EXCEPTIONS = [ "Montboucher-sur-Jabron", "Montbrison-sur-Lez", "Montbrun-Bocage", -"Montbrun-des-Corbières", "Montbrun-Lauragais", +"Montbrun-des-Corbières", "Montbrun-les-Bains", "Montceau-et-Echarnant", "Montceau-et-Écharnant", "Montceau-les-Mines", +"Montceaux-Ragny", +"Montceaux-l'Etoile", +"Montceaux-l'Étoile", "Montceaux-lès-Meaux", "Montceaux-lès-Provins", "Montceaux-lès-Vaudes", -"Montceaux-l'Etoile", -"Montceaux-l'Étoile", -"Montceaux-Ragny", "Montchanin-les-Mines", -"Montclar-de-Comminges", "Montclar-Lauragais", +"Montclar-de-Comminges", "Montclar-sur-Gervanne", "Montcombroux-les-Mines", "Montcornet-en-Ardenne", @@ -16158,47 +8770,25 @@ FR_BASE_EXCEPTIONS = [ "Montcuq-en-Quercy-Blanc", "Montcy-Notre-Dame", "Montcy-Saint-Pierre", -"monte-au-ciel", "Monte-Carlo", -"monte-charge", -"monte-charges", -"monte-courroie", -"monte-courroies", -"monte-en-l'air", -"monte-escalier", -"monte-escaliers", -"Montégut-Arros", -"Montégut-Bourjac", -"Montégut-en-Couserans", -"Montégut-Lauragais", -"Montégut-Plantaurel", -"Montégut-Savès", "Monteignet-sur-l'Andelot", -"monte-jus", -"monte-lait", "Montel-de-Gelat", -"monte-meuble", -"monte-meubles", "Montemor-o-Novo", "Montemor-o-Velho", -"monte-pente", -"monte-pentes", -"monte-plat", -"monte-plats", "Montereau-Fault-Yonne", "Montereau-faut-Yonne", "Montereau-sur-le-Jard", "Montescourt-Lizerolles", "Montesquieu-Avantès", -"Montesquieu-des-Albères", "Montesquieu-Guittaut", "Montesquieu-Lauragais", "Montesquieu-Volvestre", +"Montesquieu-des-Albères", "Montestruc-sur-Gers", "Montet-et-Bouxal", +"Montfaucon-Montigné", "Montfaucon-d'Argonne", "Montfaucon-en-Velay", -"Montfaucon-Montigné", "Montferrand-du-Périgord", "Montferrand-la-Fare", "Montferrand-le-Château", @@ -16211,36 +8801,35 @@ FR_BASE_EXCEPTIONS = [ "Montfort-sur-Boulzane", "Montfort-sur-Meu", "Montfort-sur-Risle", -"Montgaillard-de-Salies", "Montgaillard-Lauragais", +"Montgaillard-de-Salies", "Montgaillard-sur-Save", -"Montgé-en-Goële", "Montgru-Saint-Hilaire", +"Montgé-en-Goële", "Monthou-sur-Bièvre", "Monthou-sur-Cher", "Monthureux-le-Sec", "Monthureux-sur-Saône", -"monti-corcellois", "Monti-Corcellois", -"monti-corcelloise", "Monti-Corcelloise", -"monti-corcelloises", "Monti-Corcelloises", "Montier-en-Der", "Montier-en-l'Isle", "Montiers-sur-Saulx", "Monties-Aussos", "Montignac-Charente", +"Montignac-Toupinerie", "Montignac-de-Lauzun", "Montignac-le-Coq", -"Montignac-Toupinerie", -"Montigné-le-Brillant", -"Montigné-lès-Rairies", -"Montigné-sur-Moine", -"Montignies-lez-Lens", "Montignies-Saint-Christophe", +"Montignies-lez-Lens", "Montignies-sur-Roc", "Montignies-sur-Sambre", +"Montigny-Lencoup", +"Montigny-Lengrain", +"Montigny-Montfort", +"Montigny-Mornay-Villeneuve-sur-Vingeanne", +"Montigny-Saint-Barthélemy", "Montigny-aux-Amognes", "Montigny-devant-Sassey", "Montigny-en-Arrouaise", @@ -16255,22 +8844,17 @@ FR_BASE_EXCEPTIONS = [ "Montigny-le-Franc", "Montigny-le-Gannelon", "Montigny-le-Guesdier", -"Montigny-Lencoup", -"Montigny-Lengrain", +"Montigny-le-Teigneux", +"Montigny-le-Tilleul", +"Montigny-les-Jongleurs", +"Montigny-les-Monts", "Montigny-lès-Arsures", "Montigny-lès-Cherlieu", "Montigny-lès-Condé", "Montigny-lès-Cormeilles", -"Montigny-les-Jongleurs", "Montigny-lès-Metz", -"Montigny-les-Monts", "Montigny-lès-Vaucouleurs", "Montigny-lès-Vesoul", -"Montigny-le-Teigneux", -"Montigny-le-Tilleul", -"Montigny-Montfort", -"Montigny-Mornay-Villeneuve-sur-Vingeanne", -"Montigny-Saint-Barthélemy", "Montigny-sous-Marle", "Montigny-sur-Armançon", "Montigny-sur-Aube", @@ -16278,25 +8862,24 @@ FR_BASE_EXCEPTIONS = [ "Montigny-sur-Canne", "Montigny-sur-Chiers", "Montigny-sur-Crécy", -"Montigny-sur-l'Ain", -"Montigny-sur-l'Hallue", "Montigny-sur-Loing", "Montigny-sur-Meuse", "Montigny-sur-Vence", "Montigny-sur-Vesle", +"Montigny-sur-l'Ain", +"Montigny-sur-l'Hallue", +"Montigné-le-Brillant", +"Montigné-lès-Rairies", +"Montigné-sur-Moine", "Montilly-sur-Noireau", -"montis-fagussin", "Montis-Fagussin", -"montis-fagussine", "Montis-Fagussine", -"montis-fagussines", "Montis-Fagussines", -"montis-fagussins", "Montis-Fagussins", "Montjean-sur-Loire", +"Montjoie-Saint-Martin", "Montjoie-en-Couserans", "Montjoie-le-Château", -"Montjoie-Saint-Martin", "Montjustin-et-Velotte", "Montlaur-en-Diois", "Montlay-en-Auxois", @@ -16325,30 +8908,23 @@ FR_BASE_EXCEPTIONS = [ "Montpezat-sous-Bauzon", "Montpon-Ménestérol", "Montpont-en-Bresse", -"Montréal-la-Cluse", -"Montréal-les-Sources", -"montréalo-centrisme", -"montre-bracelet", -"montre-chronomètre", -"Montredon-des-Corbières", "Montredon-Labessonnié", -"montres-bracelets", -"montres-chronomètres", -"Montreuil-au-Houlme", -"Montreuil-aux-Lions", +"Montredon-des-Corbières", "Montreuil-Bellay", "Montreuil-Bonnin", +"Montreuil-Juigné", +"Montreuil-Poulay", +"Montreuil-au-Houlme", +"Montreuil-aux-Lions", "Montreuil-des-Landes", "Montreuil-en-Auge", "Montreuil-en-Caux", "Montreuil-en-Touraine", -"Montreuil-Juigné", -"Montreuil-la-Cambe", "Montreuil-l'Argillé", +"Montreuil-la-Cambe", "Montreuil-le-Chétif", "Montreuil-le-Gast", "Montreuil-le-Henri", -"Montreuil-Poulay", "Montreuil-sous-Bois", "Montreuil-sous-Pérouse", "Montreuil-sur-Barse", @@ -16359,8 +8935,8 @@ FR_BASE_EXCEPTIONS = [ "Montreuil-sur-Loir", "Montreuil-sur-Lozon", "Montreuil-sur-Maine", -"Montreuil-sur-Thérain", "Montreuil-sur-Thonnance", +"Montreuil-sur-Thérain", "Montreux-Château", "Montreux-Jeune", "Montreux-Vieux", @@ -16369,38 +8945,46 @@ FR_BASE_EXCEPTIONS = [ "Montrichard-Val-de-Cher", "Montricher-Albanne", "Montrieux-en-Sologne", -"Montrœul-au-Bois", -"Montrœul-sur-Haine", "Montrol-Sénard", "Montrond-le-Château", "Montrond-les-Bains", +"Montréal-la-Cluse", +"Montréal-les-Sources", +"Montrœul-au-Bois", +"Montrœul-sur-Haine", +"Monts-en-Bessin", +"Monts-en-Ternois", +"Monts-sur-Guesnes", "Montsauche-les-Settons", "Montsecret-Clairefougère", -"Montségur-sur-Lauzon", "Montsinéry-Tonnegrande", +"Montségur-sur-Lauzon", "Montureux-et-Prantigny", "Montureux-lès-Baulay", "Montval-sur-Loir", +"Montégut-Arros", +"Montégut-Bourjac", +"Montégut-Lauragais", +"Montégut-Plantaurel", +"Montégut-Savès", +"Montégut-en-Couserans", +"Monétay-sur-Allier", +"Monétay-sur-Loire", +"Monêtier-Allemont", "Moon-sur-Elle", -"Moorea-Maiao", "Moor-Rolofshagen", -"moque-dieu", +"Moorea-Maiao", "Morainville-Jouveaux", "Morainville-près-Lieurey", "Morannes-sur-Sarthe", "Moras-en-Valloire", -"mords-cheval", -"Mörel-Filet", -"Morêtel-de-Mailles", "Moret-sur-Loing", "Morey-Saint-Denis", -"Mörfelden-Walldorf", "Morgenröthe-Rautenkranz", "Morgny-en-Thiérache", "Morgny-la-Pommeraye", -"Morières-lès-Avignon", "Morigny-Champigny", -"Möriken-Wildegg", +"Morières-lès-Avignon", "Morlanwelz-Mariemont", "Morlhon-le-Haut", "Mormant-sur-Vernisson", @@ -16409,7 +8993,6 @@ FR_BASE_EXCEPTIONS = [ "Mornay-Berry", "Mornay-sur-Allier", "Morne-à-l'Eau", -"morphine-base", "Morsang-sur-Orge", "Morsang-sur-Seine", "Morsbronn-les-Bains", @@ -16419,93 +9002,42 @@ FR_BASE_EXCEPTIONS = [ "Mortagne-sur-Gironde", "Mortagne-sur-Sèvre", "Mortain-Bocage", -"mort-aux-rats", -"mort-bois", -"mort-chien", -"mort-de-chien", -"mort-dieu", "Morteaux-Couliboeuf", +"Morteaux-Coulibœuf", "Morteaux-Coulibœuf", -"morte-eau", "Mortefontaine-en-Thelle", -"morte-paye", -"morte-payes", "Morterolles-sur-Semme", -"morte-saison", -"mortes-eaux", "Mortes-Frontières", -"mortes-payes", -"mortes-saisons", -"mortes-vivantes", -"morte-vivante", -"mort-né", -"mort-née", -"mort-nées", -"mort-nés", -"mort-plain", -"mort-plains", -"morts-bois", -"morts-chiens", -"morts-flats", -"morts-terrains", -"morts-vivants", -"mort-terrain", -"mort-vivant", "Morville-en-Beauce", "Morville-lès-Vic", -"Morvillers-Saint-Saturnin", "Morville-sur-Andelle", "Morville-sur-Nied", "Morville-sur-Seille", +"Morvillers-Saint-Saturnin", "Mory-Montcrux", -"moteur-fusée", -"moteurs-fusées", +"Morêtel-de-Mailles", "Motey-Besuche", "Motey-sur-Saône", -"moto-cross", -"moto-crotte", -"moto-crottes", -"moto-école", -"moto-écoles", -"moto-réducteur", -"moto-réducteurs", "Mouans-Sartoux", -"mouche-araignée", -"mouche-sans-raison", -"mouche-scorpion", -"mouches-sans-raison", -"mouches-scorpions", "Mouchy-le-Châtel", "Mougon-Thorigné", -"mouille-bouche", +"Mouilleron-Saint-Germain", "Mouilleron-en-Pareds", "Mouilleron-le-Captif", -"Mouilleron-Saint-Germain", -"moule-bite", -"moule-burnes", -"moule-fesses", -"moules-burnes", -"Moulès-et-Baucels", -"Moulézan-et-Montagnac", "Mouliets-et-Villemartin", -"moulin-à-vent", -"Moulin-l'Évêque", "Moulin-Mage", -"moulin-mageois", "Moulin-Mageois", -"moulin-mageoise", "Moulin-Mageoise", -"moulin-mageoises", "Moulin-Mageoises", "Moulin-Neuf", -"moulins-à-vent", +"Moulin-l'Évêque", +"Moulin-sous-Touvent", "Moulins-Engilbert", +"Moulins-Saint-Hubert", "Moulins-en-Tonnerrois", "Moulins-la-Marche", "Moulins-le-Carbonnel", "Moulins-lès-Metz", -"Moulin-sous-Touvent", -"Moulins-Saint-Hubert", "Moulins-sous-Fléron", "Moulins-sur-Céphons", "Moulins-sur-Orne", @@ -16513,6 +9045,8 @@ FR_BASE_EXCEPTIONS = [ "Moulins-sur-Yèvre", "Moulis-en-Médoc", "Moult-Chicheboville", +"Moulès-et-Baucels", +"Moulézan-et-Montagnac", "Mounes-Prohencoux", "Mourioux-Vieilleville", "Mourmelon-le-Grand", @@ -16522,262 +9056,170 @@ FR_BASE_EXCEPTIONS = [ "Mours-Saint-Eusèbe", "Mourvilles-Basses", "Mourvilles-Hautes", -"Mousseaux-lès-Bray", "Mousseaux-Neuville", +"Mousseaux-lès-Bray", "Mousseaux-sur-Seine", +"Moussy-Verneuil", "Moussy-le-Neuf", "Moussy-le-Vieux", -"Moussy-Verneuil", +"Moustier-Ventadour", "Moustier-en-Fagne", "Moustiers-Sainte-Marie", -"Moustier-Ventadour", -"moustiques-tigres", -"moustique-tigre", "Moustoir-Ac", "Moustoir-Remungol", "Moutaine-Aresches", "Mouterre-Silly", "Mouterre-sur-Blourde", -"Mouthier-en-Bresse", "Mouthier-Haute-Pierre", +"Mouthier-en-Bresse", "Mouthiers-sur-Boëme", -"Moutier-d'Ahun", "Moutier-Malcard", "Moutier-Rozeille", +"Moutier-d'Ahun", +"Moutiers-Saint-Jean", "Moutiers-au-Perche", "Moutiers-en-Puisaye", "Moutiers-les-Mauxfaits", -"Moutiers-Saint-Jean", "Moutiers-sous-Argenton", "Moutiers-sous-Chantemerle", "Moutiers-sur-le-Lay", -"mouton-noirisa", -"mouton-noirisai", -"mouton-noirisaient", -"mouton-noirisais", -"mouton-noirisait", -"mouton-noirisâmes", -"mouton-noirisant", -"mouton-noirisas", -"mouton-noirisasse", -"mouton-noirisassent", -"mouton-noirisasses", -"mouton-noirisassiez", -"mouton-noirisassions", -"mouton-noirisât", -"mouton-noirisâtes", -"mouton-noirise", -"mouton-noirisé", -"mouton-noirisée", -"mouton-noirisées", -"mouton-noirisent", -"mouton-noiriser", -"mouton-noirisera", -"mouton-noiriserai", -"mouton-noiriseraient", -"mouton-noiriserais", -"mouton-noiriserait", -"mouton-noiriseras", -"mouton-noirisèrent", -"mouton-noiriserez", -"mouton-noiriseriez", -"mouton-noiriserions", -"mouton-noiriserons", -"mouton-noiriseront", -"mouton-noirises", -"mouton-noirisés", -"mouton-noirisez", -"mouton-noirisiez", -"mouton-noirisions", -"mouton-noirisons", -"mouve-chaux", "Moux-en-Morvan", "Mouy-sur-Seine", "Mouzeuil-Saint-Martin", "Mouzieys-Panens", "Mouzieys-Teulet", -"Moÿ-de-l'Aisne", "Moyencourt-lès-Poix", "Moyenne-Franconie", -"moyens-ducs", "Moyeuvre-Grande", "Moyeuvre-Petite", "Mozé-sur-Louet", -"m-paiement", -"m-paiements", -"m'sieur", -"M'Tsangamouji", +"Moëlan-sur-Mer", +"Moÿ-de-l'Aisne", "Muad-Dib", -"muco-pus", -"mud-minnow", "Muespach-le-Haut", "Muhlbach-sur-Bruche", "Muhlbach-sur-Munster", -"Mühlhausen-Ehingen", "Muides-sur-Loire", "Muille-Villette", -"mule-jenny", -"Mülheim-Kärlich", -"mull-jenny", -"multiplate-forme", -"multiplates-formes", -"mu-métal", -"Mümliswil-Ramiswil", "Muncq-Nieurlet", "Muneville-le-Bingard", "Muneville-sur-Mer", -"Münster-Geschinen", -"Münster-Sarmsheim", +"Mur-de-Barrez", +"Mur-de-Sologne", "Murat-le-Quaire", "Murat-sur-Vèbre", -"Mur-de-Barrez", -"Mûr-de-Bretagne", -"Mur-de-Sologne", "Muret-et-Crouttes", "Muret-le-Château", -"murnau-werdenfels", -"mur-rideau", -"Mûrs-Erigné", -"Mûrs-Érigné", "Murs-et-Gélignieux", -"murs-rideaux", "Murtin-Bogny", "Murtin-et-Bogny", "Murtin-et-le-Châtelet", "Murviel-lès-Béziers", "Murviel-lès-Montpellier", -"musculo-cutané", -"musettes-repas", -"music-hall", -"music-hallesque", -"music-hallesques", -"music-halls", "Mussey-sur-Marne", "Mussy-la-Fosse", "Mussy-la-Ville", "Mussy-sous-Dun", "Mussy-sur-Seine", -"mu'ugalavyáni", -"n-3", +"Mœurs-Verdey", +"Mâcot-la-Plagne", +"Méjannes-le-Clap", +"Méjannes-lès-Alès", +"Méligny-le-Grand", +"Méligny-le-Petit", +"Ménestreau-en-Villette", +"Ménestérol-Montignac", +"Ménil'muche", +"Ménil-Annelles", +"Ménil-Annellois", +"Ménil-Annelloise", +"Ménil-Annelloises", +"Ménil-Erreux", +"Ménil-Froger", +"Ménil-Gondouin", +"Ménil-Gondoyen", +"Ménil-Gondoyenne", +"Ménil-Gondoyennes", +"Ménil-Gondoyens", +"Ménil-Hermei", +"Ménil-Hubert-en-Exmes", +"Ménil-Hubert-sur-Orne", +"Ménil-Jean", +"Ménil-Lépinois", +"Ménil-Vin", +"Ménil-aux-Bois", +"Ménil-de-Senones", +"Ménil-en-Xaintois", +"Ménil-la-Horgne", +"Ménil-la-Tour", +"Ménil-sur-Belvitte", +"Ménil-sur-Saulx", +"Ménétreux-le-Pitois", +"Ménétréol-sous-Sancerre", +"Ménétréol-sur-Sauldre", +"Ménétréols-sous-Vatan", +"Méolans-Revel", +"Méounes-lès-Montrieux", +"Mérens-les-Vals", +"Mérey-Vieilley", +"Mérey-sous-Montrond", +"Méricourt-en-Vimeu", +"Méricourt-l'Abbé", +"Méricourt-sur-Somme", +"Mérindol-les-Oliviers", +"Méry-Bissières-en-Auge", +"Méry-Corbon", +"Méry-Prémecy", +"Méry-la-Bataille", +"Méry-sur-Cher", +"Méry-sur-Marne", +"Méry-sur-Oise", +"Méry-sur-Seine", +"Méry-ès-Bois", +"Méso-Amérique", +"Métairies-Saint-Quirin", +"Mévergnies-lez-Lens", +"Mézidon-Canon", +"Mézières-au-Perche", +"Mézières-en-Brenne", +"Mézières-en-Drouais", +"Mézières-en-Gâtinais", +"Mézières-en-Santerre", +"Mézières-en-Vexin", +"Mézières-lez-Cléry", +"Mézières-sous-Lavardin", +"Mézières-sur-Couesnon", +"Mézières-sur-Issoire", +"Mézières-sur-Oise", +"Mézières-sur-Ponthouin", +"Mézières-sur-Seine", +"Mézy-Moulins", +"Mézy-sur-Seine", +"Mönchpfiffel-Nikolausrieth", +"Mörel-Filet", +"Mörfelden-Walldorf", +"Möriken-Wildegg", +"Mûr-de-Bretagne", +"Mûrs-Erigné", +"Mûrs-Érigné", +"Mühlhausen-Ehingen", +"Mülheim-Kärlich", +"Mümliswil-Ramiswil", +"Münster-Geschinen", +"Münster-Sarmsheim", +"Mœurs-Verdey", +"N'Djamena", +"N'Djaména", +"N'Tcham", +"N'dorola", +"N,N-dinitronitramide", "N-(4-hydroxyphényl)éthanamide", -"n-6", -"n-9", "N-acétylcystéine", -"Nachrodt-Wiblingwerde", -"Nadaillac-de-Rouge", -"na-dené", -"na-déné", -"Nagel-Séez-Mesnil", -"Nages-et-Solorgues", -"Nagorno-Karabakh", -"Nagorny-Karabagh", -"Nagorny-Karabakh", -"Nago-Torbole", -"Nahetal-Waldau", -"Nainville-les-Roches", -"n-aire", -"n-aires", -"Naisey-les-Granges", -"Naives-en-Blois", -"Naives-Rosières", -"Naix-aux-Forges", -"name-dropping", -"nam-nam", -"nam-nams", -"Nampcelles-la-Cour", -"Namps-au-Mont", -"Namps-Maisnil", -"Nampteuil-sous-Muret", -"Nanc-lès-Saint-Amour", -"Nançois-le-Grand", -"Nançois-sur-Ornain", -"Nancray-sur-Rimarde", -"Nancy-sur-Cluses", -"Nandin-sur-Aisne", -"nano-ohm", -"nano-ohms", -"Nans-les-Pins", -"Nan-sous-Thil", -"Nans-sous-Sainte-Anne", -"Nanteau-sur-Essonne", -"Nanteau-sur-Lunain", -"Nantes-en-Ratier", -"Nanteuil-Auriac-de-Bourzac", -"Nanteuil-en-Vallée", -"Nanteuil-la-Forêt", -"Nanteuil-la-Fosse", -"Nanteuil-le-Haudouin", -"Nanteuil-lès-Meaux", -"Nanteuil-Notre-Dame", -"Nanteuil-sur-Aisne", -"Nanteuil-sur-Marne", -"Nant-le-Grand", -"Nant-le-Petit", -"naphtoxy-2-acétamide", -"Napoléon-Vendée", -"narco-État", -"narco-États", -"narco-guérilla", -"narco-guérillas", -"narcotico-âcre", -"narco-trafiquant", -"narco-trafiquants", -"naso-génien", -"naso-lobaire", -"naso-lobaires", -"naso-oculaire", -"naso-palatin", -"naso-palpébral", -"naso-sourcilier", -"naso-transversal", -"Nassandres-sur-Risle", -"nat-gadaw", -"nat-gadaws", -"nationale-socialiste", -"nationales-socialistes", -"national-socialisme", -"national-socialiste", -"nationaux-socialistes", -"nat-kadaw", -"nat-kadaws", -"natro-feldspat", -"natro-feldspats", -"natu-majorité", -"Naujac-sur-Mer", -"Naujan-et-Postiac", -"Naussac-Fontanes", -"nautico-estival", -"Navailles-Angos", -"navarro-aragonais", -"navarro-labourdin", -"Nâves-Parmelan", -"navire-citerne", -"navire-école", -"navire-mère", -"navires-citernes", -"navires-écoles", -"navires-mères", -"navire-usine", -"Nay-Bourdettes", -"Nayemont-les-Fosses", -"Nazelles-Négron", -"Naz-Sciaves", -"n-boule", -"n-boules", -"n-butane", -"n-butanes", -"n-butyle", -"n-cube", -"n-cubes", -"N.-D.", -"n'dama", -"n'damas", "N-déméthyla", "N-déméthylai", "N-déméthylaient", "N-déméthylais", "N-déméthylait", -"N-déméthylâmes", "N-déméthylant", "N-déméthylas", "N-déméthylasse", @@ -16785,12 +9227,7 @@ FR_BASE_EXCEPTIONS = [ "N-déméthylasses", "N-déméthylassiez", "N-déméthylassions", -"N-déméthylât", -"N-déméthylâtes", "N-déméthyle", -"N-déméthylé", -"N-déméthylée", -"N-déméthylées", "N-déméthylent", "N-déméthyler", "N-déméthylera", @@ -16799,24 +9236,118 @@ FR_BASE_EXCEPTIONS = [ "N-déméthylerais", "N-déméthylerait", "N-déméthyleras", -"N-déméthylèrent", "N-déméthylerez", "N-déméthyleriez", "N-déméthylerions", "N-déméthylerons", "N-déméthyleront", "N-déméthyles", -"N-déméthylés", "N-déméthylez", "N-déméthyliez", "N-déméthylions", "N-déméthylons", -"n-dimensionnel", -"N'Djamena", -"N'Djaména", +"N-déméthylâmes", +"N-déméthylât", +"N-déméthylâtes", +"N-déméthylèrent", +"N-déméthylé", +"N-déméthylée", +"N-déméthylées", +"N-déméthylés", +"N-méthyla", +"N-méthylai", +"N-méthylaient", +"N-méthylais", +"N-méthylait", +"N-méthylant", +"N-méthylas", +"N-méthylasse", +"N-méthylassent", +"N-méthylasses", +"N-méthylassiez", +"N-méthylassions", +"N-méthyle", +"N-méthylent", +"N-méthyler", +"N-méthylera", +"N-méthylerai", +"N-méthyleraient", +"N-méthylerais", +"N-méthylerait", +"N-méthyleras", +"N-méthylerez", +"N-méthyleriez", +"N-méthylerions", +"N-méthylerons", +"N-méthyleront", +"N-méthyles", +"N-méthylez", +"N-méthyliez", +"N-méthylions", +"N-méthylons", +"N-méthylâmes", +"N-méthylât", +"N-méthylâtes", +"N-méthylèrent", +"N-méthylé", +"N-méthylée", +"N-méthylées", +"N-méthylés", +"N-éthyléthanamine", +"N.-D.", +"N.-W.", "NDM-1", -"N'dorola", -"Néant-sur-Yvel", +"Nachrodt-Wiblingwerde", +"Nadaillac-de-Rouge", +"Nagel-Séez-Mesnil", +"Nages-et-Solorgues", +"Nago-Torbole", +"Nagorno-Karabakh", +"Nagorny-Karabagh", +"Nagorny-Karabakh", +"Nahetal-Waldau", +"Nainville-les-Roches", +"Naisey-les-Granges", +"Naives-Rosières", +"Naives-en-Blois", +"Naix-aux-Forges", +"Nampcelles-la-Cour", +"Namps-Maisnil", +"Namps-au-Mont", +"Nampteuil-sous-Muret", +"Nan-sous-Thil", +"Nanc-lès-Saint-Amour", +"Nancray-sur-Rimarde", +"Nancy-sur-Cluses", +"Nandin-sur-Aisne", +"Nans-les-Pins", +"Nans-sous-Sainte-Anne", +"Nant-le-Grand", +"Nant-le-Petit", +"Nanteau-sur-Essonne", +"Nanteau-sur-Lunain", +"Nantes-en-Ratier", +"Nanteuil-Auriac-de-Bourzac", +"Nanteuil-Notre-Dame", +"Nanteuil-en-Vallée", +"Nanteuil-la-Forêt", +"Nanteuil-la-Fosse", +"Nanteuil-le-Haudouin", +"Nanteuil-lès-Meaux", +"Nanteuil-sur-Aisne", +"Nanteuil-sur-Marne", +"Nançois-le-Grand", +"Nançois-sur-Ornain", +"Napoléon-Vendée", +"Nassandres-sur-Risle", +"Naujac-sur-Mer", +"Naujan-et-Postiac", +"Naussac-Fontanes", +"Navailles-Angos", +"Nay-Bourdettes", +"Nayemont-les-Fosses", +"Naz-Sciaves", +"Nazelles-Négron", "Neaufles-Auvergny", "Neaufles-Saint-Martin", "Neaufles-sur-Risle", @@ -16828,211 +9359,148 @@ FR_BASE_EXCEPTIONS = [ "Neckar-Odenwald", "Neder-Betuwe", "Neder-Hardinxveld", +"Neder-Over-Heembeek", +"Neder-over-Heembeek", "Nederhemert-Noord", "Nederhemert-Zuid", -"Neder-over-Heembeek", -"Neder-Over-Heembeek", "Nederweert-Eind", "Nederzwalm-Hermelgem", "Neewiller-près-Lauterbourg", -"néfaste-food", -"néfaste-foods", -"nègre-soie", -"nègres-soies", -"negro-spiritual", -"negro-spirituals", -"nègue-chien", -"nègue-fol", "Nehwiller-près-Wœrth", "Neige-Côtier", "Neiße-Malxetal", -"ne-m'oubliez-pas", "Nempont-Saint-Firmin", "Nemsdorf-Göhrendorf", -"Néons-sur-Creuse", -"néphro-angiosclérose", -"néphro-angioscléroses", -"néphro-gastrique", -"néphro-urétérectomie", -"néphro-urétérectomies", -"neptuno-plutonien", -"neptuno-plutonienne", -"neptuno-plutoniens", -"nerf-ferrure", -"nerf-férure", -"Néris-les-Bains", -"Néronde-sur-Dore", "Nerville-la-Forêt", -"Nesle-et-Massoult", "Nesle-Hodeng", +"Nesle-Normandeuse", +"Nesle-et-Massoult", +"Nesle-l'Hôpital", "Nesle-la-Reposte", "Nesle-le-Repons", -"Nesle-l'Hôpital", -"Nesle-Normandeuse", "Nesles-la-Gilberde", "Nesles-la-Montagne", "Nesles-la-Vallée", -"net-citoyen", -"net-citoyens", -"N-éthyléthanamine", -"nettoie-pipe", "Neu-Anspach", "Neu-Bamberg", +"Neu-Eichenberg", +"Neu-Isenburg", +"Neu-Moresnet", +"Neu-Seeland", +"Neu-Ulm", "Neublans-Abergement", "Neubourg-sur-le-Danube", "Neuburg-Schrobenhausen", "Neuchâtel-Urtière", "Neudorf-Bornstein", -"Neu-Eichenberg", "Neuendorf-Sachsenbande", "Neuenkirchen-Vörden", "Neuf-Berquin", -"neuf-berquinois", "Neuf-Berquinois", -"neuf-berquinoise", "Neuf-Berquinoise", -"neuf-berquinoises", "Neuf-Berquinoises", "Neuf-Brisach", -"neuf-cents", -"Neufchâtel-en-Bray", -"Neufchâtel-en-Saosnois", -"Neufchâtel-Hardelot", -"Neufchâtel-sur-Aisne", "Neuf-Eglise", -"Neuf-Église", "Neuf-Marché", "Neuf-Mesnil", +"Neuf-Église", +"Neufchâtel-Hardelot", +"Neufchâtel-en-Bray", +"Neufchâtel-en-Saosnois", +"Neufchâtel-sur-Aisne", "Neufmoutiers-en-Brie", "Neufvy-sur-Aronde", "Neugartheim-Ittlenheim", "Neuhaus-Schierschnitz", "Neuillay-les-Bois", -"Neuillé-le-Lierre", -"Neuillé-Pont-Pierre", +"Neuilly-Plaisance", +"Neuilly-Saint-Front", "Neuilly-en-Donjon", "Neuilly-en-Dun", "Neuilly-en-Sancerre", "Neuilly-en-Thelle", "Neuilly-en-Vexin", +"Neuilly-l'Evêque", +"Neuilly-l'Hôpital", +"Neuilly-l'Évêque", "Neuilly-la-Forêt", "Neuilly-le-Bisson", "Neuilly-le-Brignon", "Neuilly-le-Dien", "Neuilly-le-Malherbe", "Neuilly-le-Réal", -"Neuilly-lès-Dijon", "Neuilly-le-Vendin", -"Neuilly-l'Evêque", -"Neuilly-l'Évêque", -"Neuilly-l'Hôpital", -"Neuilly-Plaisance", -"Neuilly-Saint-Front", +"Neuilly-lès-Dijon", "Neuilly-sous-Clermont", "Neuilly-sur-Eure", "Neuilly-sur-Marne", "Neuilly-sur-Seine", "Neuilly-sur-Suize", -"Neu-Isenburg", +"Neuillé-Pont-Pierre", +"Neuillé-le-Lierre", "Neukirchen-Balbini", "Neukirchen-Vluyn", "Neumagen-Dhron", -"Neu-Moresnet", "Neung-sur-Beuvron", -"Neunkirchen-lès-Bouzonville", -"Neunkirchen-Seelscheid", "Neunkirch-lès-Sarreguemines", +"Neunkirchen-Seelscheid", +"Neunkirchen-lès-Bouzonville", "Neurey-en-Vaux", "Neurey-lès-la-Demie", -"neuro-acoustique", -"neuro-acoustiques", -"neuro-anatomie", -"neuro-anatomies", -"neuro-humoral", -"neuro-humorale", -"neuro-humorales", -"neuro-humoraux", -"neuro-imagerie", -"neuro-imageries", -"neuro-linguistique", -"neuro-linguistiques", -"neuro-musculaire", -"neuro-musculaires", -"neuro-stimulation", -"neuro-végétatif", -"neuro-végétatifs", -"neuro-végétative", -"neuro-végétatives", "Neusalza-Spremberg", -"Neu-Seeland", "Neussargues-Moissac", "Neustadt-Glewe", -"neutro-alcalin", -"Neu-Ulm", "Neuve-Chapelle", -"neuve-chapellois", "Neuve-Chapellois", -"neuve-chapelloise", "Neuve-Chapelloise", -"neuve-chapelloises", "Neuve-Chapelloises", "Neuve-Eglise", -"Neuve-Église", -"Neuvéglise-sur-Truyère", -"neuve-grangeais", "Neuve-Grangeais", -"neuve-grangeaise", "Neuve-Grangeaise", -"neuve-grangeaises", "Neuve-Grangeaises", +"Neuve-Maison", +"Neuve-Église", "Neuvelle-lès-Champlitte", "Neuvelle-lès-Cromary", "Neuvelle-lès-Grancey", -"Neuvelle-lès-la-Charité", "Neuvelle-lès-Voisey", -"Neuve-Maison", +"Neuvelle-lès-la-Charité", "Neuves-Maisons", "Neuvic-Entier", -"Neuvicq-le-Château", "Neuvicq-Montguyon", -"Neuville-au-Bois", -"Neuville-au-Cornet", -"Neuville-au-Plain", -"Neuville-aux-Bois", +"Neuvicq-le-Château", "Neuville-Bosc", -"neuville-boscien", "Neuville-Boscien", -"neuville-boscienne", "Neuville-Boscienne", -"neuville-bosciennes", "Neuville-Bosciennes", -"neuville-bosciens", "Neuville-Bosciens", "Neuville-Bourjonval", "Neuville-Coppegueule", "Neuville-Day", +"Neuville-Ferrières", +"Neuville-Saint-Amand", +"Neuville-Saint-Rémy", +"Neuville-Saint-Vaast", +"Neuville-Vitasse", +"Neuville-au-Bois", +"Neuville-au-Cornet", +"Neuville-au-Plain", +"Neuville-aux-Bois", "Neuville-de-Poitou", "Neuville-en-Avesnois", "Neuville-en-Beaumont", "Neuville-en-Condroz", "Neuville-en-Ferrain", "Neuville-en-Verdunois", -"Neuville-Ferrières", "Neuville-les-Dames", +"Neuville-lez-Beaulieu", "Neuville-lès-Decize", "Neuville-lès-Dieppe", +"Neuville-lès-Lœuilly", "Neuville-lès-Lœuilly", "Neuville-lès-This", "Neuville-lès-Vaucouleurs", -"Neuville-lez-Beaulieu", "Neuville-près-Sées", -"Neuviller-la-Roche", -"Neuviller-lès-Badonviller", -"Neuvillers-sur-Fave", -"Neuviller-sur-Moselle", -"Neuville-Saint-Amand", -"Neuville-Saint-Rémy", -"Neuville-Saint-Vaast", "Neuville-sous-Arzillières", "Neuville-sous-Montreuil", "Neuville-sur-Ailette", @@ -17043,138 +9511,71 @@ FR_BASE_EXCEPTIONS = [ "Neuville-sur-Margival", "Neuville-sur-Oise", "Neuville-sur-Ornain", -"Neuville-sur-Saône", "Neuville-sur-Sarthe", +"Neuville-sur-Saône", "Neuville-sur-Seine", "Neuville-sur-Touques", "Neuville-sur-Vanne", "Neuville-sur-Vannes", +"Neuviller-la-Roche", +"Neuviller-lès-Badonviller", +"Neuviller-sur-Moselle", +"Neuvillers-sur-Fave", "Neuvillette-en-Charnie", -"Neuville-Vitasse", "Neuvilly-en-Argonne", -"Neuvy-au-Houlme", "Neuvy-Bouin", "Neuvy-Deux-Clochers", +"Neuvy-Grandchamp", +"Neuvy-Pailloux", +"Neuvy-Saint-Sépulchre", +"Neuvy-Sautour", +"Neuvy-Sautourien", +"Neuvy-Sautourienne", +"Neuvy-Sautouriennes", +"Neuvy-Sautouriens", +"Neuvy-au-Houlme", "Neuvy-en-Beauce", "Neuvy-en-Champagne", "Neuvy-en-Dunois", "Neuvy-en-Mauges", "Neuvy-en-Sullias", -"Neuvy-Grandchamp", "Neuvy-le-Barrois", "Neuvy-le-Roi", -"Neuvy-Pailloux", -"Neuvy-Saint-Sépulchre", -"Neuvy-Sautour", -"neuvy-sautourien", -"Neuvy-Sautourien", -"neuvy-sautourienne", -"Neuvy-Sautourienne", -"neuvy-sautouriennes", -"Neuvy-Sautouriennes", -"neuvy-sautouriens", -"Neuvy-Sautouriens", "Neuvy-sur-Barangeon", "Neuvy-sur-Loire", +"Neuvéglise-sur-Truyère", "Neuwiller-lès-Saverne", "Nevi'im", -"Néville-sur-Mer", -"névro-mimosie", -"névro-mimosies", "Nevy-lès-Dole", "Nevy-sur-Seille", -"Newcastle-under-Lyme", "New-Glasgois", +"New-York", +"New-Yorkais", +"New-Yorkaise", +"New-Yorkaises", +"Newcastle-under-Lyme", "Newton-in-Makerfield", "Newton-le-Willows", -"newton-mètre", -"newtons-mètres", -"New-York", -"new-yorkais", -"New-Yorkais", -"new-yorkaise", -"New-Yorkaise", -"new-yorkaises", -"New-Yorkaises", -"new-yorkisa", -"new-yorkisai", -"new-yorkisaient", -"new-yorkisais", -"new-yorkisait", -"new-yorkisâmes", -"new-yorkisant", -"new-yorkisas", -"new-yorkisasse", -"new-yorkisassent", -"new-yorkisasses", -"new-yorkisassiez", -"new-yorkisassions", -"new-yorkisât", -"new-yorkisâtes", -"new-yorkise", -"new-yorkisé", -"new-yorkisée", -"new-yorkisées", -"new-yorkisent", -"new-yorkiser", -"new-yorkisera", -"new-yorkiserai", -"new-yorkiseraient", -"new-yorkiserais", -"new-yorkiserait", -"new-yorkiseras", -"new-yorkisèrent", -"new-yorkiserez", -"new-yorkiseriez", -"new-yorkiserions", -"new-yorkiserons", -"new-yorkiseront", -"new-yorkises", -"new-yorkisés", -"new-yorkisez", -"new-yorkisiez", -"new-yorkisions", -"new-yorkisons", -"nez-en-cœur", -"Nézignan-l'Evêque", -"Nézignan-l'Évêque", -"nez-percé", -"ngaï-ngaï", -"ngaï-ngaïs", -"n-gone", -"n-gones", -"n-gramme", -"n-grammes", -"nian-nian", +"Ni-Skutterudites", "Nicey-sur-Aire", -"niche-crédence", -"nickel-ankérite", -"nickel-ankérites", -"nickel-magnésite", -"nickel-magnésites", -"nickel-skuttérudite", -"nickel-skuttérudites", "Nicolétain-du-Sud", -"nid-de-poule", -"Niederbronn-les-Bains", "Nieder-Hilbersheim", "Nieder-Olm", "Nieder-Wiesen", +"Niederbronn-les-Bains", "Niefern-Öschelbronn", "Niel-bij-As", "Niel-bij-Sint-Truiden", "Nielles-lès-Ardres", "Nielles-lès-Bléquin", "Nielles-lès-Calais", -"n-ième", -"n-ièmes", "Nieuil-l'Espoir", "Nieul-le-Dolent", -"Nieul-lès-Saintes", -"Nieulle-sur-Seudre", "Nieul-le-Virouil", -"Nieul-sur-l'Autise", +"Nieul-lès-Saintes", "Nieul-sur-Mer", +"Nieul-sur-l'Autise", +"Nieulle-sur-Seudre", "Nieuw-Amsterdam", "Nieuw-Annerveen", "Nieuw-Balinge", @@ -17184,16 +9585,12 @@ FR_BASE_EXCEPTIONS = [ "Nieuw-Buinen", "Nieuw-Dijk", "Nieuw-Dordrecht", -"Nieuwer-Amstel", -"Nieuwe-Tonge", "Nieuw-Ginneken", "Nieuw-Heeten", "Nieuw-Helvoet", -"Nieuwkerken-Waas", "Nieuw-Loosdrecht", "Nieuw-Milligen", "Nieuw-Namen", -"Nieuwolda-Oost", "Nieuw-Reemst", "Nieuw-Roden", "Nieuw-Scheemda", @@ -17203,102 +9600,30 @@ FR_BASE_EXCEPTIONS = [ "Nieuw-Vossemeer", "Nieuw-Weerdinge", "Nieuw-Wehl", +"Nieuwe-Tonge", +"Nieuwer-Amstel", +"Nieuwkerken-Waas", +"Nieuwolda-Oost", "Niger-Congo", -"nigéro-congolais", -"night-club", -"night-clubbing", -"night-clubs", "Nijni-Taguil", -"nilo-saharien", -"nilo-saharienne", -"nilo-sahariennes", -"nilo-sahariens", "Nil-Saint-Martin", "Nil-Saint-Vincent", "Nil-Saint-Vincent-Saint-Martin", -"ni-ni", -"nin-nin", "Niort-de-Sault", "Niort-la-Fontaine", -"nippo-américain", -"nippo-américaine", -"nippo-américaines", -"nippo-américains", -"nique-douille", -"nique-douilles", -"Ni-Skutterudites", "Nissan-lez-Enserune", "Nister-Möhrendorf", "Nistos-Haut-et-Bas", -"nitro-cellulose", -"nitro-celluloses", -"nitro-hydrochlorique", -"nitro-hydrochloriques", -"nitrotal-isopropyl", -"niuafo'ou", -"niuafo'ous", "Nivigne-et-Suran", -"nivo-glaciaire", -"nivo-glaciaires", "Nivolas-Vermelle", "Nivollet-Montgriffon", -"nivo-pluvial", "Nixéville-Blercourt", "Nizan-Gesse", "Nizy-le-Comte", "Nlle-Calédonie", -"Nlle-Écosse", "Nlle-Zélande", -"N-méthyla", -"N-méthylai", -"N-méthylaient", -"N-méthylais", -"N-méthylait", -"N-méthylâmes", -"N-méthylant", -"N-méthylas", -"N-méthylasse", -"N-méthylassent", -"N-méthylasses", -"N-méthylassiez", -"N-méthylassions", -"N-méthylât", -"N-méthylâtes", -"N-méthyle", -"N-méthylé", -"N-méthylée", -"N-méthylées", -"N-méthylent", -"N-méthyler", -"N-méthylera", -"N-méthylerai", -"N-méthyleraient", -"N-méthylerais", -"N-méthylerait", -"N-méthyleras", -"N-méthylèrent", -"N-méthylerez", -"N-méthyleriez", -"N-méthylerions", -"N-méthylerons", -"N-méthyleront", -"N-méthyles", -"N-méthylés", -"N-méthylez", -"N-méthyliez", -"N-méthylions", -"N-méthylons", -"N,N-dinitronitramide", -"n-octaèdre", -"n-octaèdres", +"Nlle-Écosse", "Nod-sur-Seine", -"Noël-Cerneux", -"Noé-les-Mallets", -"Noë-les-Mallets", -"nœud-nœud", -"nœuds-nœuds", -"Nœux-lès-Auxi", -"Nœux-les-Mines", "Nogent-en-Othe", "Nogent-l'Abbesse", "Nogent-l'Artaud", @@ -17315,65 +9640,44 @@ FR_BASE_EXCEPTIONS = [ "Nogent-sur-Oise", "Nogent-sur-Seine", "Nogent-sur-Vernisson", +"Nohant-Vic", "Nohant-en-Goût", "Nohant-en-Graçay", -"Nohant-Vic", "Noidans-le-Ferroux", "Noidans-lès-Vesoul", "Noidant-Chatenoy", "Noidant-le-Rocheux", -"noie-chien", "Noirmoutier-en-l'Île", "Noiron-sous-Gevrey", "Noiron-sur-Bèze", "Noiron-sur-Seine", -"noir-pie", -"noir-pioche", -"noir-pioches", -"noir-ployant", +"Noisy-Rudignon", +"Noisy-Rudignonais", +"Noisy-Rudignonaise", +"Noisy-Rudignonaises", "Noisy-le-Grand", "Noisy-le-Roi", "Noisy-le-Sec", -"Noisy-Rudignon", -"noisy-rudignonais", -"Noisy-Rudignonais", -"noisy-rudignonaise", -"Noisy-Rudignonaise", -"noisy-rudignonaises", -"Noisy-Rudignonaises", "Noisy-sur-Ecole", -"Noisy-sur-École", "Noisy-sur-Oise", +"Noisy-sur-École", "Nojals-et-Clotte", "Nojeon-en-Vexin", "Nojeon-le-Sec", -"no-kill", -"no-kills", -"noli-me-tangere", -"nonante-cinq", -"nonante-deux", -"nonante-et-un", -"nonante-huit", -"nonante-neuf", -"nonante-quatre", -"nonante-sept", -"nonante-six", -"nonante-trois", "Nonant-le-Pin", "Noncourt-sur-le-Rongeant", "Nonette-Orsonnette", "Nonsard-Lamarche", "Nonvilliers-Grandhoux", -"Noorder-Koggenland", "Noord-Polsbroek", "Noord-Scharwoude", "Noord-Sleen", "Noord-Spierdijk", "Noord-Stroe", "Noord-Waddinxveen", +"Noorder-Koggenland", "Noordwijk-Binnen", "Noordwolde-Zuid", -"no-poo", "Norges-la-Ville", "Noron-l'Abbaye", "Noron-la-Poterie", @@ -17384,56 +9688,69 @@ FR_BASE_EXCEPTIONS = [ "Norrey-en-Auge", "Norrey-en-Bessin", "Norroy-le-Sec", -"Norroy-lès-Pont-à-Mousson", "Norroy-le-Veneur", -"Nörten-Hardenberg", +"Norroy-lès-Pont-à-Mousson", "Nort-Leulinghem", -"nort-leulinghemois", "Nort-Leulinghemois", -"nort-leulinghemoise", "Nort-Leulinghemoise", -"nort-leulinghemoises", "Nort-Leulinghemoises", "Nort-sur-Erdre", "Norwich-terrier", "Nossage-et-Bénévent", +"Notre-Dame-d'Aliermont", +"Notre-Dame-d'Allençon", +"Notre-Dame-d'Estrées-Corbon", +"Notre-Dame-d'Oé", +"Notre-Dame-d'Épine", +"Notre-Dame-de-Bellecombe", +"Notre-Dame-de-Bliquetuit", +"Notre-Dame-de-Boisset", +"Notre-Dame-de-Bondeville", +"Notre-Dame-de-Cenilly", +"Notre-Dame-de-Commiers", +"Notre-Dame-de-Livaye", +"Notre-Dame-de-Livoye", +"Notre-Dame-de-Londres", +"Notre-Dame-de-Monts", +"Notre-Dame-de-Mésage", +"Notre-Dame-de-Riez", +"Notre-Dame-de-Sanilhac", +"Notre-Dame-de-Vaulx", +"Notre-Dame-de-l'Isle", +"Notre-Dame-de-l'Osier", +"Notre-Dame-de-la-Rouvière", +"Notre-Dame-des-Landes", +"Notre-Dame-des-Millières", +"Notre-Dame-du-Bec", +"Notre-Dame-du-Cruet", +"Notre-Dame-du-Hamel", +"Notre-Dame-du-Parc", +"Notre-Dame-du-Pré", +"Notre-Dame-du-Pé", "Nouaillé-Maupertuis", "Nouan-le-Fuzelier", -"Nouans-les-Fontaines", "Nouan-sur-Loire", +"Nouans-les-Fontaines", "Noues-de-Sienne", "Nourard-le-Franc", -"nous-même", -"nous-mêmes", +"Nousseviller-Saint-Nabor", "Nousseviller-lès-Bitche", "Nousseviller-lès-Puttelange", -"Nousseviller-Saint-Nabor", "Nouveau-Brunswick", "Nouveau-Connecticut", "Nouveau-Continent", "Nouveau-Cornouaille", "Nouveau-Cornouailles", "Nouveau-Cornwall", -"nouveau-gallois", "Nouveau-Hanovre", "Nouveau-Léon", "Nouveau-Mexique", "Nouveau-Monde", -"nouveau-né", -"nouveau-née", -"nouveau-nées", -"nouveau-nés", "Nouveau-Norfolk", "Nouveau-Santander", "Nouveau-Shetland", -"nouveau-venu", -"nouveaux-nés", "Nouveaux-Pays-Bas", -"nouveaux-venus", "Nouvel-Âge", -"nouvel-âgeuse", -"nouvel-âgeuses", -"nouvel-âgeux", "Nouvelle-Albion", "Nouvelle-Amsterdam", "Nouvelle-Andalousie", @@ -17444,42 +9761,38 @@ FR_BASE_EXCEPTIONS = [ "Nouvelle-Cornouaille", "Nouvelle-Cornouailles", "Nouvelle-Cythère", -"Nouvelle-Écosse", "Nouvelle-Eglise", -"Nouvelle-Église", "Nouvelle-Espagne", "Nouvelle-France", "Nouvelle-Galles", -"Nouvelle-Géorgie", "Nouvelle-Grenade", "Nouvelle-Guinée", +"Nouvelle-Géorgie", "Nouvelle-Hanovre", "Nouvelle-Hollande", "Nouvelle-Irlande", -"nouvelle-née", -"Nouvelle-Néerlande", "Nouvelle-Norfolk", +"Nouvelle-Néerlande", "Nouvelle-Orléans", "Nouvelle-Poméranie", -"Nouvelles-Hébrides", "Nouvelle-Sibérie", -"nouvelles-nées", -"nouvelles-venues", -"nouvelle-venue", "Nouvelle-Zamble", -"Nouvelle-Zélande", "Nouvelle-Zemble", +"Nouvelle-Zélande", +"Nouvelle-Écosse", +"Nouvelle-Église", +"Nouvelles-Hébrides", "Nouvion-et-Catillon", "Nouvion-le-Comte", "Nouvion-le-Vineux", "Nouvion-sur-Meuse", "Nouvron-Vingré", -"Novéant-sur-Moselle", "Noviant-aux-Prés", "Noville-les-Bois", "Noville-sur-Mehaigne", "Novion-Porcien", "Novy-Chevrières", +"Novéant-sur-Moselle", "Noyal-Châtillon-sur-Seiche", "Noyal-Muzillac", "Noyal-Pontivy", @@ -17491,20 +9804,19 @@ FR_BASE_EXCEPTIONS = [ "Noyant-et-Aconin", "Noyant-la-Gravoyère", "Noyant-la-Plaine", -"noyé-d'eau", -"Noyelles-en-Chaussée", +"Noyelle-Vion", "Noyelles-Godault", +"Noyelles-en-Chaussée", "Noyelles-lès-Humières", "Noyelles-lès-Seclin", "Noyelles-lès-Vermelles", "Noyelles-sous-Bellonne", "Noyelles-sous-Lens", "Noyelles-sur-Escaut", -"Noyelles-sur-l'Escaut", "Noyelles-sur-Mer", "Noyelles-sur-Sambre", "Noyelles-sur-Selle", -"Noyelle-Vion", +"Noyelles-sur-l'Escaut", "Noyen-sur-Sarthe", "Noyen-sur-Seine", "Noyers-Auzécourt", @@ -17512,113 +9824,49 @@ FR_BASE_EXCEPTIONS = [ "Noyers-Missy", "Noyers-Pont-Maugis", "Noyers-Saint-Martin", +"Noyers-Thélonne", "Noyers-sur-Cher", "Noyers-sur-Jabron", -"Noyers-Thélonne", -"n-polytope", -"n-polytopes", -"n-simplexe", -"n-simplexes", -"n-sphère", -"n-sphères", -"n'srani", -"N'Tcham", +"Noé-les-Mallets", +"Noë-les-Mallets", +"Noël-Cerneux", "Nuaillé-d'Aunis", "Nuaillé-sur-Boutonne", "Nueil-les-Aubiers", "Nueil-sous-Faye", "Nueil-sous-les-Aubiers", "Nueil-sur-Layon", -"nue-propriétaire", -"nue-propriété", -"nuer-dinka", -"nues-propriétaires", -"nues-propriétés", "Nuillé-le-Jalais", "Nuillé-sur-Ouette", "Nuillé-sur-Vicoin", "Nuisement-aux-Bois", "Nuisement-sur-Coole", -"nuit-deboutiste", -"nuit-deboutistes", "Nuits-Saint-Georges", "Nuka-Hiva", "Nuku-Hiva", "Nuncq-Hautecôte", -"nuoc-mam", -"nuoc-mâm", -"nu-pied", -"nu-pieds", -"n-uple", -"n-uples", -"n-uplet", -"n-uplets", -"nu-propriétaire", "Nuret-le-Ferron", "Nurieux-Volognat", -"nus-propriétaires", -"nu-tête", "Nuthe-Urstromtal", -"N.-W.", -"Oberdorf-Spachbach", -"Oberehe-Stroheich", -"Ober-Flörsheim", -"Oberhausen-Rheinhausen", -"Ober-Hilbersheim", -"Oberhoffen-lès-Wissembourg", -"Oberhoffen-sur-Moder", -"Oberhonnefeld-Gierend", -"Obermaßfeld-Grimmenthal", -"Obermodern-Zutzendorf", -"Ober-Mörlen", -"Obernheim-Kirchenarnbach", -"Ober-Olm", -"Ober-Ramstadt", -"Oberweiler-Tiefenbach", -"Oberwil-Lieli", -"occipito-atloïdien", -"occipito-atloïdienne", -"occipito-atloïdiennes", -"occipito-atloïdiens", -"occipito-axoïdien", -"occipito-axoïdienne", -"occipito-axoïdiennes", -"occipito-axoïdiens", -"occipito-cotyloïdien", -"occipito-cotyloïdienne", -"occipito-cotyloïdiennes", -"occipito-cotyloïdiens", -"occipito-frontal", -"occipito-méningien", -"occipito-pariétal", -"occipito-pétreuse", -"occipito-pétreuses", -"occipito-pétreux", -"occipito-sacré", -"occipito-sacro-iliaque", -"occitano-roman", -"octante-deux", -"octante-et-un", -"octante-neuf", -"Octeville-l'Avenel", -"Octeville-la-Venelle", -"Octeville-sur-Mer", -"octo-core", -"octo-cores", -"octo-rotor", -"octo-rotors", -"oculo-motricité", -"oculo-motricités", -"oculo-musculaire", -"oculo-musculaires", -"oculo-zygomatique", -"Odeillo-Via", +"Nœux-les-Mines", +"Nœux-lès-Auxi", +"Nâves-Parmelan", +"Néant-sur-Yvel", +"Néons-sur-Creuse", +"Néris-les-Bains", +"Néronde-sur-Dore", +"Néville-sur-Mer", +"Nézignan-l'Evêque", +"Nézignan-l'Évêque", +"Nörten-Hardenberg", +"Nœux-les-Mines", +"Nœux-lès-Auxi", +"O-desvenlafaxine", "O-déméthyla", "O-déméthylai", "O-déméthylaient", "O-déméthylais", "O-déméthylait", -"O-déméthylâmes", "O-déméthylant", "O-déméthylas", "O-déméthylasse", @@ -17626,12 +9874,7 @@ FR_BASE_EXCEPTIONS = [ "O-déméthylasses", "O-déméthylassiez", "O-déméthylassions", -"O-déméthylât", -"O-déméthylâtes", "O-déméthyle", -"O-déméthylé", -"O-déméthylée", -"O-déméthylées", "O-déméthylent", "O-déméthyler", "O-déméthylera", @@ -17640,135 +9883,29 @@ FR_BASE_EXCEPTIONS = [ "O-déméthylerais", "O-déméthylerait", "O-déméthyleras", -"O-déméthylèrent", "O-déméthylerez", "O-déméthyleriez", "O-déméthylerions", "O-déméthylerons", "O-déméthyleront", "O-déméthyles", -"O-déméthylés", "O-déméthylez", "O-déméthyliez", "O-déméthylions", "O-déméthylons", -"Oder-Spree", -"O-desvenlafaxine", -"odonto-stomatologie", -"Oebisfelde-Weferlingen", -"oeil-de-boeuf", -"œil-de-bœuf", -"oeil-de-chat", -"œil-de-chat", -"oeil-de-lièvre", -"oeil-de-paon", -"oeil-de-perdrix", -"œil-de-perdrix", -"oeil-de-pie", -"œil-de-pie", -"oeil-de-serpent", -"œil-de-serpent", -"oeil-de-tigre", -"œil-de-tigre", -"oeil-du-soleil", -"œil-du-soleil", -"oeils-de-boeuf", -"œils-de-bœuf", -"oeils-de-chat", -"oeils-de-lièvre", -"oeils-de-paon", -"oeils-de-perdrix", -"oeils-de-pie", -"œils-de-pie", -"oeils-de-serpent", -"œils-de-serpent", -"oeils-de-tigre", -"œils-de-tigre", -"Oer-Erkenschwick", -"oesophago-gastro-duodénoscopie", -"œsophago-gastro-duodénoscopie", -"oesophago-gastro-duodénoscopies", -"œsophago-gastro-duodénoscopies", -"Oestrich-Winkel", -"œuf-coque", -"Œuf-en-Ternois", -"œufs-coque", -"Offenbach-Hundheim", -"Offenbach-sur-le-Main", -"off-market", -"off-shore", -"Ogenne-Camptort", -"Ogeu-les-Bains", -"ogivo-cylindrique", -"Ogooué-Maritime", -"Ogy-Montoy-Flanville", -"ohm-mètre", -"ohms-mètres", -"oie-cygne", -"Oignies-en-Thiérache", -"Oigny-en-Valois", -"Oinville-Saint-Liphard", -"Oinville-sous-Auneau", -"Oinville-sur-Montcient", -"oiseau-chameau", -"oiseau-cloche", -"oiseau-éléphant", -"oiseau-lyre", -"oiseau-mouche", -"oiseau-papillon", -"oiseau-tonnerre", -"oiseau-trompette", -"oiseaux-chameaux", -"oiseaux-cloches", -"oiseaux-lyres", -"oiseaux-mouches", -"oiseaux-papillons", -"oiseaux-tonnerres", -"oiseaux-trompettes", -"Oiselay-et-Grachaux", -"Oisseau-le-Petit", -"Oisy-le-Verger", -"Ojos-Albos", -"Olbia-Tempio", -"Ölbronn-Dürrn", -"old-ice", -"old-ices", -"Oléac-Debat", -"Oléac-Dessus", -"oléo-calcaire", -"oléo-calcaires", -"olé-olé", -"oligo-élément", -"oligo-éléments", -"Olizy-Primat", -"Olizy-sur-Chiers", -"olla-podrida", -"Olloy-sur-Viroin", -"Olmeta-di-Capocorso", -"Olmeta-di-Tuda", -"Olmet-et-Villecun", -"Olmi-Cappella", -"Olonne-sur-Mer", -"Oloron-Sainte-Marie", -"Oloron-Sainte-Marie", -"Ols-et-Rinhodes", -"Olst-Wijhe", -"omaha-ponca", -"omaha-poncas", -"omble-chevalier", -"ombre-chevalier", -"Ombret-Rawsa", -"ombro-thermique", -"ombro-thermiques", -"oméga-3", -"oméga-6", -"oméga-9", +"O-déméthylâmes", +"O-déméthylât", +"O-déméthylâtes", +"O-déméthylèrent", +"O-déméthylé", +"O-déméthylée", +"O-déméthylées", +"O-déméthylés", "O-méthyla", "O-méthylai", "O-méthylaient", "O-méthylais", "O-méthylait", -"O-méthylâmes", "O-méthylant", "O-méthylas", "O-méthylasse", @@ -17776,12 +9913,7 @@ FR_BASE_EXCEPTIONS = [ "O-méthylasses", "O-méthylassiez", "O-méthylassions", -"O-méthylât", -"O-méthylâtes", "O-méthyle", -"O-méthylé", -"O-méthylée", -"O-méthylées", "O-méthylent", "O-méthyler", "O-méthylera", @@ -17790,121 +9922,123 @@ FR_BASE_EXCEPTIONS = [ "O-méthylerais", "O-méthylerait", "O-méthyleras", -"O-méthylèrent", "O-méthylerez", "O-méthyleriez", "O-méthylerions", "O-méthylerons", "O-méthyleront", "O-méthyles", -"O-méthylés", "O-méthylez", "O-méthyliez", "O-méthylions", "O-méthylons", +"O-méthylâmes", +"O-méthylât", +"O-méthylâtes", +"O-méthylèrent", +"O-méthylé", +"O-méthylée", +"O-méthylées", +"O-méthylés", +"Ober-Flörsheim", +"Ober-Hilbersheim", +"Ober-Mörlen", +"Ober-Olm", +"Ober-Ramstadt", +"Oberdorf-Spachbach", +"Oberehe-Stroheich", +"Oberhausen-Rheinhausen", +"Oberhoffen-lès-Wissembourg", +"Oberhoffen-sur-Moder", +"Oberhonnefeld-Gierend", +"Obermaßfeld-Grimmenthal", +"Obermodern-Zutzendorf", +"Obernheim-Kirchenarnbach", +"Oberweiler-Tiefenbach", +"Oberwil-Lieli", +"Octeville-l'Avenel", +"Octeville-la-Venelle", +"Octeville-sur-Mer", +"Odeillo-Via", +"Oder-Spree", +"Oebisfelde-Weferlingen", +"Oer-Erkenschwick", +"Oestrich-Winkel", +"Offenbach-Hundheim", +"Offenbach-sur-le-Main", +"Ogenne-Camptort", +"Ogeu-les-Bains", +"Ogooué-Maritime", +"Ogy-Montoy-Flanville", +"Oignies-en-Thiérache", +"Oigny-en-Valois", +"Oinville-Saint-Liphard", +"Oinville-sous-Auneau", +"Oinville-sur-Montcient", +"Oiselay-et-Grachaux", +"Oisseau-le-Petit", +"Oisy-le-Verger", +"Ojos-Albos", +"Olbia-Tempio", +"Olizy-Primat", +"Olizy-sur-Chiers", +"Olloy-sur-Viroin", +"Olmet-et-Villecun", +"Olmeta-di-Capocorso", +"Olmeta-di-Tuda", +"Olmi-Cappella", +"Olonne-sur-Mer", +"Oloron-Sainte-Marie", +"Ols-et-Rinhodes", +"Olst-Wijhe", +"Oléac-Debat", +"Oléac-Dessus", +"Ombret-Rawsa", "Omonville-la-Petite", "Omonville-la-Rogue", -"omphalo-mésentérique", -"omphalo-mésentériques", -"omphalo-phlébite", -"omphalo-phlébites", "Oncy-sur-Ecole", "Oncy-sur-École", -"on-dit", "Ondreville-sur-Essonne", -"one-man-show", -"one-shot", -"Onesse-et-Laharie", "Onesse-Laharie", -"one-step", -"one-steps", +"Onesse-et-Laharie", "Onet-le-Château", -"one-woman-show", "Ons-en-Bray", "Onze-Lieve-Vrouw-Waver", "Oost-Barendrecht", "Oost-Cappel", -"oost-cappelois", "Oost-Cappelois", -"oost-cappeloise", "Oost-Cappeloise", -"oost-cappeloises", "Oost-Cappeloises", -"Ooster-Dalfsen", -"Oosterzee-Buren", "Oost-Graftdijk", "Oost-Maarland", "Oost-Souburg", "Oost-Vlieland", -"opal-AN", -"open-source", -"open-space", -"open-spaces", -"opéra-comique", -"Opéra-Comique", -"opéras-comiques", +"Ooster-Dalfsen", +"Oosterzee-Buren", "Ophain-Bois-Seigneur-Isaac", "Opoul-Périllos", -"opt-in", -"opto-strié", -"opt-out", +"Opéra-Comique", +"Or-Blanois", "Oradour-Fanais", "Oradour-Saint-Genest", "Oradour-sur-Glane", "Oradour-sur-Vayres", -"orang-outan", -"orang-outang", -"orangs-outangs", -"orangs-outans", "Oranienbaum-Wörlitz", "Orbais-l'Abbaye", "Orbigny-au-Mont", "Orbigny-au-Val", -"orbito-nasal", -"orbito-palpébral", -"Or-Blanois", "Orchamps-Vennes", "Ordan-Larroque", -"Orée-d'Anjou", -"oreille-d'abbé", -"oreille-d'âne", -"oreille-de-lièvre", -"oreille-de-loup", -"oreille-de-mer", -"oreille-de-souris", -"oreille-d'ours", -"oreilles-d'âne", -"oreilles-de-mer", -"oreilles-de-souris", -"oreilles-d'ours", -"organo-calcaire", -"organo-calcaires", -"organo-chloré", -"organo-chlorée", -"organo-chlorées", -"organo-chlorés", -"organo-halogéné", -"organo-halogénée", -"organo-halogénées", -"organo-halogénés", -"organo-phosphoré", -"organo-phosphorée", -"organo-phosphorées", -"organo-phosphorés", "Orgeans-Blanchefontaine", -"Orgères-en-Beauce", -"Orgères-la-Roche", "Orgnac-l'Aven", "Orgnac-sur-Vézère", -"orienté-objet", -"orienteur-marqueur", +"Orgères-en-Beauce", +"Orgères-la-Roche", +"Origny-Sainte-Benoite", "Origny-en-Thiérache", "Origny-le-Butin", "Origny-le-Roux", "Origny-le-Sec", -"Origny-Sainte-Benoite", -"o-ring", -"o-rings", "Oriol-en-Royans", "Oris-en-Rattier", "Orliac-de-Bar", @@ -17913,58 +10047,44 @@ FR_BASE_EXCEPTIONS = [ "Ormesson-sur-Marne", "Ormont-Dessous", "Ormont-Dessus", +"Ormoy-Villers", "Ormoy-la-Rivière", "Ormoy-le-Davien", "Ormoy-lès-Sexfontaines", "Ormoy-sur-Aube", -"Ormoy-Villers", "Ornolac-Ussat-les-Bains", "Oroz-Betelu", "Orp-Jauche", -"orp-jauchois", "Orp-Jauchois", "Orp-Jauchoise", "Orp-le-Grand", "Orry-la-Ville", "Orsingen-Nenzingen", "Orsmaal-Gussenhoven", -"or-sol", -"ortho-sympathique", -"ortho-sympathiques", "Orthoux-Sérignac-Quilhan", "Orveau-Bellesauve", "Orvillers-Sorel", "Orvilliers-Saint-Julien", +"Orée d'Anjou", +"Orée-d'Anjou", +"Os-Marsillon", "Osann-Monzel", "Osly-Courtil", -"Os-Marsillon", "Osmoy-Saint-Valery", "Osne-le-Val", "Ossas-Suhare", -"ossau-iraty", -"ossau-iratys", "Osse-en-Aspe", "Osselle-Routelle", "Osserain-Rivareyte", -"Ossétie-du-Nord-Alanie", "Ossey-les-Trois-Maisons", "Ossun-ez-Angles", +"Ossétie-du-Nord-Alanie", "Ostabat-Asme", -"ostéo-arthrite", -"ostéo-arthrites", -"Osterholz-Scharmbeck", "Oster-Ohrstedt", +"Osterholz-Scharmbeck", "Osthausen-Wülfershausen", -"ôte-agrafes", -"oto-rhino", -"oto-rhino-laryngologie", -"oto-rhino-laryngologies", -"oto-rhino-laryngologiste", -"oto-rhino-laryngologistes", -"oto-rhinos", "Ottendorf-Okrilla", "Ottignies-Louvain-la-Neuve", -"ouaf-ouaf", "Oud-Aa", "Oud-Alblas", "Oud-Annerveen", @@ -17973,9 +10093,6 @@ FR_BASE_EXCEPTIONS = [ "Oud-Dijk", "Oud-Drimmelen", "Oud-Empel", -"Ouder-Amstel", -"Ouderkerk-sur-l'Amstel", -"Oude-Tonge", "Oud-Gastel", "Oud-Heverlee", "Oud-Kamerik", @@ -17991,25 +10108,20 @@ FR_BASE_EXCEPTIONS = [ "Oud-Vroenhoven", "Oud-Wulven", "Oud-Zuilen", -"ouèche-ouèche", -"ouèches-ouèches", +"Oude-Tonge", +"Ouder-Amstel", +"Ouderkerk-sur-l'Amstel", "Ougney-Douvot", -"oui-da", -"ouï-dire", +"Oui-Oui", "Ouilly-du-Houley", "Ouilly-le-Basset", "Ouilly-le-Tesson", "Ouilly-le-Vicomte", -"oui-non-bof", -"Oui-Oui", -"ouïr-dire", "Oulan-Bator", "Oulches-la-Vallée-Foulon", "Oulchy-la-Ville", "Oulchy-le-Château", "Oulens-sous-Échallens", -"ouralo-altaïque", -"ouralo-altaïques", "Ourcel-Maison", "Ourches-sur-Meuse", "Ourdis-Cotdoussan", @@ -18018,22 +10130,17 @@ FR_BASE_EXCEPTIONS = [ "Ouroux-en-Morvan", "Ouroux-sous-le-Bois-Sainte-Marie", "Ouroux-sur-Saône", -"Oursel-Maison", -"ours-garou", -"ours-garous", "Ours-Mons", +"Oursel-Maison", "Ourville-en-Caux", -"Ousse-et-Suzan", "Ousse-Suzan", +"Ousse-et-Suzan", "Ousson-sur-Loire", "Oussoy-en-Gâtinais", "Oust-Marest", "Ouve-Wirquin", -"ouve-wirquinois", "Ouve-Wirquinois", -"ouve-wirquinoise", "Ouve-Wirquinoise", -"ouve-wirquinoises", "Ouve-Wirquinoises", "Ouville-l'Abbaye", "Ouville-la-Bien-Tournée", @@ -18050,26 +10157,11 @@ FR_BASE_EXCEPTIONS = [ "Ouzoun-Ada", "Over-Diemen", "Ovillers-la-Boisselle", -"ovo-lacto-végétarisme", -"ovo-lacto-végétarismes", -"ovo-urinaire", -"ovo-végétarisme", -"ovo-végétarismes", -"oxidéméton-méthyl", -"oxo-biodégradable", -"oxo-biodégradables", -"oxo-dégradable", -"oxo-dégradables", -"oxydéméton-méthyl", -"oxydo-réduction", -"oxydo-réductions", -"oxy-iodure", -"oxy-iodures", -"Oye-et-Pallet", -"Oye-Plage", "Oy-Mittelberg", -"Oyón-Oion", +"Oye-Plage", +"Oye-et-Pallet", "Oytier-Saint-Oblas", +"Oyón-Oion", "Oza-Cesuras", "Ozenx-Montestrucq", "Ozoir-la-Ferrière", @@ -18077,18 +10169,14 @@ FR_BASE_EXCEPTIONS = [ "Ozouer-le-Repos", "Ozouer-le-Voulgis", "Ozouër-le-Voulgis", -"pa'anga", -"p-acétylaminophénol", -"package-deal", -"package-deals", -"pack-ice", -"pack-ices", +"P-ATA", +"P-DG", +"P-frame", +"P.-D.G.", +"PPD-T", +"Pa-O", "Pacy-sur-Armançon", "Pacy-sur-Eure", -"p-adique", -"p-adiques", -"pagano-chrétien", -"page-turner", "Pagney-derrière-Barine", "Pagny-la-Blanche-Côte", "Pagny-la-Ville", @@ -18096,163 +10184,37 @@ FR_BASE_EXCEPTIONS = [ "Pagny-lès-Goin", "Pagny-sur-Meuse", "Pagny-sur-Moselle", -"paille-en-cul", -"paille-en-queue", -"pailles-en-cul", -"pailles-en-queue", -"pail-mail", -"pain-beurre", -"pain-d'épicier", -"pain-d'épicière", -"pain-d'épicières", -"pain-d'épiciers", -"pain-de-pourceau", -"pains-de-pourceau", -"pair-à-pair", "Pair-et-Grandrupt", -"pair-programma", -"pair-programmai", -"pair-programmaient", -"pair-programmais", -"pair-programmait", -"pair-programmâmes", -"pair-programmant", -"pair-programmas", -"pair-programmasse", -"pair-programmassent", -"pair-programmasses", -"pair-programmassiez", -"pair-programmassions", -"pair-programmât", -"pair-programmâtes", -"pair-programme", -"pair-programmé", -"pair-programment", -"pair-programmer", -"pair-programmera", -"pair-programmerai", -"pair-programmeraient", -"pair-programmerais", -"pair-programmerait", -"pair-programmeras", -"pair-programmèrent", -"pair-programmerez", -"pair-programmeriez", -"pair-programmerions", -"pair-programmerons", -"pair-programmeront", -"pair-programmes", -"pair-programmez", -"pair-programmiez", -"pair-programmions", -"pair-programmons", "Paisy-Cosdon", +"Paizay-Naudouin-Embourie", "Paizay-le-Chapt", "Paizay-le-Sec", "Paizay-le-Tort", -"Paizay-Naudouin-Embourie", "Palais-Bourbon", "Palatinat-Sud-Ouest", -"palato-labial", -"palato-labiale", -"palato-pharyngien", -"palato-pharyngite", -"palato-pharyngites", -"palato-salpingien", -"palato-staphylin", -"palato-staphylins", "Palau-de-Cerdagne", "Palau-del-Vidre", "Palau-sator", "Palau-saverdera", "Palavas-les-Flots", -"paléo-continental", -"paléo-lac", -"paléo-lacs", -"paléo-reconstruction", -"paléo-reconstructions", -"pal-fer", -"palladico-potassique", "Palluau-sur-Indre", -"palmier-chanvre", -"palmier-dattier", -"palmiers-chanvre", -"palmiers-dattiers", -"palpe-mâchoire", -"palu'e", -"palu'es", -"pama-nyungan", -"panchen-lama", -"pancréatico-duodénal", +"Palmas d'Aveyron", "Pancy-Courtecon", -"pan-européen", -"pan-européenne", -"pan-européennes", -"pan-européens", -"panier-repas", -"paniers-repas", -"pan-lucanisme", -"pan-mandingue", -"pan-mandingues", -"panpan-cucul", "Panschwitz-Kuckau", -"panthère-garou", -"panthères-garous", "Pant'ruche", -"Pa-O", -"papa-gâteau", -"papas-gâteaux", -"papier-caillou-ciseaux", -"papier-calque", -"papier-cul", -"papier-filtre", -"papier-monnaie", -"papiers-calque", "Papouasie-Nouvelle-Guinée", -"papy-boom", -"papy-boomer", -"papy-boomers", -"papy-boomeur", -"papy-boomeurs", -"paquet-cadeau", -"paquets-cadeaux", -"para-acétyl-amino-phénol", -"parachute-frein", -"parachutes-freins", -"para-continental", -"para-dichlorobenzène", -"para-légal", -"para-légale", -"para-légales", -"para-légaux", -"parathion-éthyl", -"parathion-méthyl", "Paray-Douaville", +"Paray-Vieille-Poste", "Paray-le-Frésil", "Paray-le-Monial", "Paray-sous-Briailles", -"Paray-Vieille-Poste", -"Parçay-les-Pins", -"Parçay-Meslay", -"Parçay-sur-Vienne", "Parc-d'Anxtot", -"parc-d'anxtotais", "Parc-d'Anxtotais", -"parc-d'anxtotaise", "Parc-d'Anxtotaise", -"parc-d'anxtotaises", "Parc-d'Anxtotaises", -"Parcé-sur-Sarthe", -"par-cœur", "Parcoul-Chenaud", "Parcy-et-Tigny", -"par-dehors", -"par-delà", -"par-derrière", -"par-dessous", -"par-dessus", -"par-devant", -"par-devers", +"Parcé-sur-Sarthe", "Pardies-Piétat", "Parentis-en-Born", "Parey-Saint-Césaire", @@ -18260,306 +10222,98 @@ FR_BASE_EXCEPTIONS = [ "Parfouru-l'Éclin", "Parfouru-sur-Odon", "Pargny-Filain", +"Pargny-Resson", "Pargny-la-Dhuys", "Pargny-les-Bois", "Pargny-lès-Reims", -"Pargny-Resson", "Pargny-sous-Mureau", "Pargny-sur-Saulx", -"Parigné-le-Pôlin", -"Parigné-l'Evêque", -"Parigné-l'Évêque", -"Parigné-sur-Braye", "Parigny-la-Rose", "Parigny-les-Vaux", +"Parigné-l'Evêque", +"Parigné-l'Évêque", +"Parigné-le-Pôlin", +"Parigné-sur-Braye", "Paris-Brest", "Paris-l'Hôpital", -"parking-relais", -"parler-pour-ne-rien-dire", -"Parné-sur-Roc", "Parnoy-en-Bassigny", -"parotido-auriculaire", -"parotido-auriculaires", +"Parné-sur-Roc", "Paroy-en-Othe", "Paroy-sur-Saulx", "Paroy-sur-Tholon", -"Parsac-Rimondeix", "Pars-lès-Chavanges", "Pars-lès-Romilly", +"Parsac-Rimondeix", "Parthenay-de-Bretagne", -"participation-pari", -"particule-dieu", -"particules-dieu", -"parti-pris", -"parva-pétricien", "Parva-Pétricien", -"parva-pétricienne", "Parva-Pétricienne", -"parva-pétriciennes", "Parva-Pétriciennes", -"parva-pétriciens", "Parva-Pétriciens", "Parves-et-Nattages", "Parvillers-le-Quesnoy", -"pas-à-pas", -"pascal-seconde", -"pascals-secondes", -"pas-d'âne", +"Parçay-Meslay", +"Parçay-les-Pins", +"Parçay-sur-Vienne", "Pas-de-Calais", "Pas-de-Jeu", -"pas-de-porte", "Pas-en-Artois", -"paso-doble", -"paso-dobles", "Passavant-en-Argonne", "Passavant-la-Rochère", "Passavant-sur-Layon", -"passif-agressif", -"passifs-agressifs", -"passing-shot", -"passing-shots", -"Passy-en-Valois", "Passy-Grigny", +"Passy-en-Valois", "Passy-les-Tours", "Passy-sur-Marne", "Passy-sur-Seine", -"P-ATA", -"pâtissier-chocolatier", -"Pätow-Steegen", -"patronnière-gradeuse", -"patronnières-gradeuses", -"patronnier-gradeur", -"patronniers-gradeurs", -"patte-de-lièvre", -"patte-d'oie", -"patte-pelu", -"patte-pelus", -"pattes-de-lièvre", -"pattes-d'oie", -"pauci-relationnel", -"pauci-relationnelle", -"pauci-relationnelles", -"pauci-relationnels", -"pauci-spécifique", -"pauci-spécifiques", -"Paulhac-en-Margeride", "Paul-Olivier", -"pause-café", -"pause-carrière", -"pause-santé", -"pauses-café", -"pauses-carrière", -"pauses-santé", +"Paulhac-en-Margeride", "Paussac-et-Saint-Vivien", "Pautaines-Augeville", -"payé-emporté", -"pay-per-view", "Payra-sur-l'Hers", -"Payré-sur-Vendée", "Payrin-Augmontel", "Payros-Cazautets", -"pays-bas", +"Payré-sur-Vendée", "Pays-Bas", "Pays-d'Altenbourg", +"Pays-d'Enhaut", "Pays-de-Berchtesgaden", "Pays-de-Jerichow", -"Pays-d'Enhaut", "Pays-de-Nuremberg", -"pay-to-win", "Payzac-de-Lanouaille", -"pc-banking", -"P-DG", -"P.-D.G.", -"p.-ê.", -"peau-bleue", -"peau-de-chienna", -"peau-de-chiennai", -"peau-de-chiennaient", -"peau-de-chiennais", -"peau-de-chiennait", -"peau-de-chiennâmes", -"peau-de-chiennant", -"peau-de-chiennas", -"peau-de-chiennasse", -"peau-de-chiennassent", -"peau-de-chiennasses", -"peau-de-chiennassiez", -"peau-de-chiennassions", -"peau-de-chiennât", -"peau-de-chiennâtes", -"peau-de-chienne", -"peau-de-chienné", -"peau-de-chiennée", -"peau-de-chiennées", -"peau-de-chiennent", -"peau-de-chienner", -"peau-de-chiennera", -"peau-de-chiennerai", -"peau-de-chienneraient", -"peau-de-chiennerais", -"peau-de-chiennerait", -"peau-de-chienneras", -"peau-de-chiennèrent", -"peau-de-chiennerez", -"peau-de-chienneriez", -"peau-de-chiennerions", -"peau-de-chiennerons", -"peau-de-chienneront", -"peau-de-chiennes", -"peau-de-chiennés", -"peau-de-chiennez", -"peau-de-chienniez", -"peau-de-chiennions", -"peau-de-chiennons", -"peau-rouge", "Peau-Rouge", "Peau-Verte", -"peaux-rouges", "Peaux-Rouges", "Peaux-Vertes", -"Pécharic-et-le-Py", -"pêche-bernard", -"pêche-bernards", "Pech-Luna", -"pédal'eau", -"pédicure-podologue", -"pédicures-podologues", "Pedro-Rodríguez", -"peer-to-peer", -"Pégairolles-de-Buèges", -"Pégairolles-de-l'Escalette", -"peigne-cul", -"peigne-culs", -"peigne-zizi", -"peine-à-jouir", -"peis-coua", "Peisey-Nancroix", -"pele-ata", "Pel-et-Der", -"pelle-à-cul", -"pelle-pioche", -"pelles-à-cul", -"pelles-bêches", -"pelles-pioches", "Pellouailles-les-Vignes", -"pelure-d'oignon", -"pelvi-crural", -"pelvi-trochantérien", -"pelvi-trochantérienne", -"pelvi-trochantériennes", -"pelvi-trochantériens", -"Peñacerrada-Urizaharra", -"Peñarroya-Pueblonuevo", -"pencak-silat", -"pénicillino-résistance", -"pénicillino-résistances", -"pénicillino-sensibilité", -"pénicillino-sensibilités", "Penne-d'Agenais", "Pennes-le-Sec", -"penn-ty", -"pense-bête", -"pense-bêtes", "Penta-Acquatella", -"penta-cœur", -"penta-cœurs", -"penta-continental", -"penta-core", -"penta-cores", "Penta-di-Casinca", -"pen-testeur", -"pen-testeurs", -"pen-testeuse", -"pen-testeuses", -"pen-ty", -"people-isa", -"people-isai", -"people-isaient", -"people-isais", -"people-isait", -"people-isâmes", -"people-isant", -"people-isas", -"people-isasse", -"people-isassent", -"people-isasses", -"people-isassiez", -"people-isassions", -"people-isât", -"people-isâtes", -"people-ise", -"people-isé", -"people-isée", -"people-isées", -"people-isent", -"people-iser", -"people-isera", -"people-iserai", -"people-iseraient", -"people-iserais", -"people-iserait", -"people-iseras", -"people-isèrent", -"people-iserez", -"people-iseriez", -"people-iserions", -"people-iserons", -"people-iseront", -"people-ises", -"people-isés", -"people-isez", -"people-isiez", -"people-isions", -"people-isons", "Percey-le-Grand", "Percey-le-Pautel", "Percey-sous-Montormentier", -"perche-brochet", "Perche-en-Nocé", -"perche-soleil", "Percy-en-Auge", "Percy-en-Normandie", -"perdante-perdante", -"perdantes-perdantes", -"perdant-perdant", -"perdants-perdants", -"perd-sa-queue", -"perd-tout", -"père-la-pudeur", -"Père-la-pudeur", -"pères-la-pudeur", -"Péret-Bel-Air", -"perfo-vérif", "Pergain-Taillac", -"Périers-en-Auge", -"Périers-sur-le-Dan", -"Pérignat-ès-Allier", -"Pérignat-lès-Sarliève", -"Pérignat-sur-Allier", -"Périgny-la-Rose", "Perles-et-Castelet", "Perly-Certoux", "Pernand-Vergelesses", -"Pernes-lès-Boulogne", "Pernes-les-Fontaines", +"Pernes-lès-Boulogne", "Pero-Casevecchie", -"Pérols-sur-Vézère", -"péronéo-calcanéen", -"péronéo-malléolaire", -"péronéo-malléolaires", -"péronéo-phalangien", -"péronéo-tibial", -"Péronne-en-Mélantois", -"Péronnes-lez-Antoing", -"Péroy-les-Gombries", -"Perpète-la-ouf", -"Perpète-les-Alouettes", -"Perpète-les-Oies", -"Perpète-lès-Oies", -"Perpète-les-Olivettes", "Perpette-les-Oies", "Perpezac-le-Blanc", "Perpezac-le-Noir", +"Perpète-la-ouf", +"Perpète-les-Alouettes", +"Perpète-les-Oies", +"Perpète-les-Olivettes", +"Perpète-lès-Oies", "Perrancey-les-Vieux-Moulins", "Perrecy-les-Forges", "Perriers-en-Beauficel", @@ -18567,113 +10321,44 @@ FR_BASE_EXCEPTIONS = [ "Perriers-sur-Andelle", "Perrigny-lès-Dijon", "Perrigny-sur-Armançon", -"Perrigny-sur-l'Ognon", "Perrigny-sur-Loire", +"Perrigny-sur-l'Ognon", "Perrogney-les-Fontaines", -"perroquet-hibou", -"perroquets-hiboux", "Perros-Guirec", -"perruche-moineau", -"perruches-moineaux", -"Pers-en-Gâtinais", "Pers-Jussy", +"Pers-en-Gâtinais", "Perthes-lès-Brienne", "Perthes-lès-Hurlus", "Pertheville-Ners", -"pesco-végétarien", -"pèse-acide", -"pèse-acides", -"pèse-alcool", -"pèse-alcools", -"pèse-bébé", -"pèse-bébés", -"pèse-esprit", -"pèse-esprits", -"pèse-lait", -"pèse-laits", -"pèse-lettre", -"pèse-lettres", -"pèse-liqueur", -"pèse-liqueurs", -"pèse-mout", -"pèse-moût", -"pèse-mouts", -"pèse-moûts", -"pèse-nitre", -"pèse-nitres", -"pèse-personne", -"pèse-personnes", -"pèse-sel", -"pèse-sels", -"pèse-sirop", -"pèse-sirops", -"pèse-vernis", -"Pessac-sur-Dordogne", "Pessa'h", +"Pessac-sur-Dordogne", "Pessat-Villeneuve", -"péta-ampère", -"péta-ampères", -"péta-électron-volt", -"pétaélectron-volt", -"péta-électron-volts", -"pétaélectron-volts", -"pet'che", -"pet-d'âne", -"pet-de-loup", -"pet-de-nonne", -"pet-de-soeur", -"pet-de-sœur", "Petegem-aan-de-Leie", "Petegem-aan-de-Schelde", -"pet-en-l'air", "Peterswald-Löffelscheid", -"pète-sec", -"pète-sèche", -"pète-sèches", -"pète-secs", -"petites-bourgeoises", -"petites-bourgeoisies", -"petites-filles", -"petites-mains", -"petites-maîtresses", -"petites-nièces", -"petites-russes", -"petits-beurre", -"petits-bourgeois", -"petits-chênes", -"petits-déjeuners", -"petits-ducs", -"petits-enfants", -"petits-fils", -"petits-fours", -"petits-gris", -"petits-laits", -"petits-maîtres", -"petits-neveux", -"petits-russes", -"petits-suisses", -"petits-trains", +"Petit-Auverné", +"Petit-Bersac", +"Petit-Bourg", +"Petit-Canal", +"Petit-Caux", +"Petit-Couronne", +"Petit-Croix", +"Petit-Failly", +"Petit-Fayt", +"Petit-Landau", +"Petit-Mars", +"Petit-Mesnil", +"Petit-Noir", +"Petit-Palais-et-Cornemps", +"Petit-Réderching", +"Petit-Tenquin", +"Petit-Verly", +"Petite-Chaux", +"Petite-Forêt", +"Petite-Rosselle", +"Petite-Île", "Petreto-Bicchisano", -"pétrolier-minéralier", -"pétro-monarchie", -"pétro-monarchies", -"pétro-occipital", -"pétro-salpingo-staphylin", -"pétro-salpingo-staphylins", -"pétro-staphylin", -"pétrus-colien", -"Pétrus-Colien", -"pétrus-colienne", -"Pétrus-Colienne", -"pétrus-coliennes", -"Pétrus-Coliennes", -"pétrus-coliens", -"Pétrus-Coliens", -"pets-de-loup", -"pets-de-nonne", -"peul-peul", "Peumerit-Quintin", -"peut-être", "Peux-et-Couffouleux", "Peypin-d'Aigues", "Peyrat-de-Bellac", @@ -18684,778 +10369,348 @@ FR_BASE_EXCEPTIONS = [ "Peyrefitte-sur-l'Hers", "Peyrelongue-Abos", "Peyret-Saint-André", -"Peyriac-de-Mer", "Peyriac-Minervois", +"Peyriac-de-Mer", "Peyrillac-et-Millac", "Peyrolles-en-Provence", "Peyrusse-Grande", -"Peyrusse-le-Roc", "Peyrusse-Massas", "Peyrusse-Vieille", +"Peyrusse-le-Roc", "Peyzac-le-Moustier", "Peyzieux-sur-Saône", "Pezé-le-Robert", -"Pézènes-les-Mines", -"Pézilla-de-Conflent", -"Pézilla-la-Rivière", +"Peñacerrada-Urizaharra", +"Peñarroya-Pueblonuevo", "Pfaffen-Schwabenheim", -"P-frame", -"p-graphe", -"p-graphes", -"pharyngo-laryngite", -"pharyngo-laryngites", -"pharyngo-staphylin", -"phénico-punique", -"phénico-puniques", -"philosopho-théologique", -"philosopho-théologiques", -"pH-mètre", -"phonético-symbolique", -"phoque-garou", -"phoque-léopard", -"phoques-garous", -"phoséthyl-Al", -"phosétyl-Al", -"phosphate-allophane", -"phosphate-allophanes", -"photos-finish", -"phragmito-scirpaie", -"phragmito-scirpaies", -"phrase-clé", -"phrases-clés", -"phréno-glottisme", -"phréno-glottismes", -"physico-chimie", -"physico-chimies", -"physico-chimique", -"physico-chimiques", -"physico-mathématique", -"physico-mathématiques", -"physio-pathologie", -"physio-pathologies", -"piane-piane", -"piano-bar", -"piano-bars", -"piano-forte", -"piano-fortes", -"piano-manivelle", +"Pi-Ramsès", "Pianotolli-Caldarello", "Pianottoli-Caldarello", -"pian's", -"pichot-chêne", -"pichots-chênes", -"pick-up", -"pick-ups", -"pico-condensateur", -"pico-condensateurs", -"pico-ohm", -"pico-ohms", -"pics-verts", "Picto-Charentais", -"pic-vert", -"pic-verts", -"pidgin-english", -"pièces-au-cul", -"pied-à-terre", -"pied-bot", -"pied-d'alouette", -"pied-de-banc", -"pied-de-biche", -"pied-de-boeuf", -"pied-de-bœuf", -"Pied-de-Borne", -"pied-de-chat", -"pied-de-cheval", -"pied-de-chèvre", -"pied-de-coq", -"pied-de-corbeau", -"pied-de-griffon", -"pied-de-lion", -"pied-de-loup", -"pied-de-mouche", -"pied-de-mouton", -"pied-de-pélican", -"pied-de-pigeon", -"pied-de-poule", -"pied-d'étape", -"pied-de-veau", -"pied-d'oiseau", -"pied-droit", -"pié-de-lion", -"pied-fort", -"Piedicorte-di-Gaggio", -"pied-noir", -"pied-noire", -"pied-noirisa", -"pied-noirisai", -"pied-noirisaient", -"pied-noirisais", -"pied-noirisait", -"pied-noirisâmes", -"pied-noirisant", -"pied-noirisas", -"pied-noirisasse", -"pied-noirisassent", -"pied-noirisasses", -"pied-noirisassiez", -"pied-noirisassions", -"pied-noirisât", -"pied-noirisâtes", -"pied-noirise", -"pied-noirisé", -"pied-noirisée", -"pied-noirisées", -"pied-noirisent", -"pied-noiriser", -"pied-noirisera", -"pied-noiriserai", -"pied-noiriseraient", -"pied-noiriserais", -"pied-noiriserait", -"pied-noiriseras", -"pied-noirisèrent", -"pied-noiriserez", -"pied-noiriseriez", -"pied-noiriserions", -"pied-noiriserons", -"pied-noiriseront", -"pied-noirises", -"pied-noirisés", -"pied-noirisez", -"pied-noirisiez", -"pied-noirisions", -"pied-noirisons", "Pie-d'Orezza", -"pied-plat", -"pied-rouge", -"pieds-bots", -"pieds-d'alouette", -"pieds-de-biche", -"pieds-de-boeuf", -"pieds-de-bœuf", -"pieds-de-chat", -"pieds-de-chèvre", -"pieds-de-coq", -"pieds-de-corbeau", -"pieds-de-griffon", -"pieds-de-lion", -"pieds-de-mouche", -"pieds-de-mouton", -"pieds-de-veau", -"pieds-d'oiseau", -"pieds-droits", -"pieds-forts", -"pieds-noires", -"pieds-noirs", -"pieds-paquets", -"pieds-plats", -"pieds-tendres", -"pied-tendre", -"pied-vert", -"piège-à-cons", -"pièges-à-cons", -"pie-grièche", -"Piégros-la-Clastre", -"Piégut-Pluviers", -"pie-mère", +"Pied-de-Borne", +"Piedicorte-di-Gaggio", "Piennes-Onvillers", -"pie-noir", -"pie-noire", -"pie-noires", -"pie-noirs", -"pie-rouge", -"pierre-bénitain", +"Pierre-Buffière", +"Pierre-Buffiérois", +"Pierre-Buffiéroise", +"Pierre-Buffiéroises", "Pierre-Bénitain", -"pierre-bénitaine", "Pierre-Bénitaine", -"pierre-bénitaines", "Pierre-Bénitaines", -"pierre-bénitains", "Pierre-Bénitains", "Pierre-Bénite", -"Pierre-Buffière", -"pierre-buffiérois", -"Pierre-Buffiérois", -"pierre-buffiéroise", -"Pierre-Buffiéroise", -"pierre-buffiéroises", -"Pierre-Buffiéroises", "Pierre-Chanel", "Pierre-Châtel", -"pierre-châtelois", "Pierre-Châtelois", -"pierre-châteloise", "Pierre-Châteloise", -"pierre-châteloises", "Pierre-Châteloises", +"Pierre-Levée", +"Pierre-Levéen", +"Pierre-Levéenne", +"Pierre-Levéennes", +"Pierre-Levéens", +"Pierre-Louis", +"Pierre-Marie", +"Pierre-Montois", +"Pierre-Montoise", +"Pierre-Montoises", +"Pierre-Morains", +"Pierre-Olivier", +"Pierre-Percée", +"Pierre-Perthuis", +"Pierre-Yves", "Pierre-de-Bresse", +"Pierre-la-Treiche", "Pierrefeu-du-Var", -"pierre-feuille-ciseaux", +"Pierrefitte-Nestalas", "Pierrefitte-en-Auge", "Pierrefitte-en-Beauvaisis", "Pierrefitte-en-Cinglais", -"Pierrefitte-ès-Bois", -"Pierrefitte-Nestalas", "Pierrefitte-sur-Aire", "Pierrefitte-sur-Loire", "Pierrefitte-sur-Sauldre", "Pierrefitte-sur-Seine", -"Pierrefontaine-lès-Blamont", +"Pierrefitte-ès-Bois", "Pierrefontaine-les-Varans", -"Pierre-la-Treiche", -"Pierre-Levée", -"pierre-levéen", -"Pierre-Levéen", -"pierre-levéenne", -"Pierre-Levéenne", -"pierre-levéennes", -"Pierre-Levéennes", -"pierre-levéens", -"Pierre-Levéens", -"Pierre-Louis", -"Pierre-Marie", -"pierre-montois", -"Pierre-Montois", -"pierre-montoise", -"Pierre-Montoise", -"pierre-montoises", -"Pierre-Montoises", +"Pierrefontaine-lès-Blamont", "Pierremont-sur-Amance", -"Pierre-Morains", -"Pierre-Olivier", -"pierre-papier-ciseaux", -"Pierre-Percée", -"Pierre-Perthuis", "Pierrepont-sur-Avre", "Pierrepont-sur-l'Arentèle", -"pierre-qui-vire", -"pierres-qui-virent", -"Pierre-Yves", -"piés-de-lion", -"pies-grièches", -"pies-mères", -"piétin-échaudage", -"piétin-verse", "Pietra-di-Verde", "Piets-Plasence-Moustrou", -"piézo-électricité", -"piézo-électricités", -"piézo-électrique", -"piézo-électriques", "Pihen-lès-Guînes", "Pijnacker-Nootdorp", "Pila-Canale", -"pile-poil", -"pilo-sébacé", "Pin-Balma", -"pince-balle", -"pince-balles", -"pince-érigne", -"pince-érignes", -"pince-fesse", -"pince-fesses", -"pince-lisière", -"pince-maille", -"pince-mailles", -"pince-monseigneur", -"pince-nez", -"pince-notes", -"pince-oreille", -"pince-oreilles", -"pince-sans-rire", -"pinces-monseigneur", -"Pinel-Hauterive", -"ping-pong", -"ping-pongs", "Pin-Moriès", -"pino-balméen", -"Pino-Balméen", -"pino-balméenne", -"Pino-Balméenne", -"pino-balméennes", -"Pino-Balméennes", -"pino-balméens", -"Pino-Balméens", -"pin-pon", -"pin's", "Pin-Saint-Denis", +"Pinel-Hauterive", +"Pino-Balméen", +"Pino-Balméenne", +"Pino-Balméennes", +"Pino-Balméens", "Pins-Justaret", -"pins-justarétois", "Pins-Justarétois", -"pins-justarétoise", "Pins-Justarétoise", -"pins-justarétoises", "Pins-Justarétoises", -"Piñuécar-Gandullas", -"pin-up", -"piou-piou", -"piou-pious", -"pipe-line", -"pipe-lines", -"piqueur-suceur", -"Pi-Ramsès", -"Piré-sur-Seiche", "Piriac-sur-Mer", -"pirimiphos-éthyl", -"pirimiphos-méthyl", -"pis-aller", -"pis-allers", -"pisse-au-lit", -"pisse-chien", -"pisse-chiens", -"pisse-copie", -"pisse-copies", -"pisse-debout", -"pisse-froid", -"pisse-mémé", -"pisse-mémère", -"pisse-sang", -"pisse-trois-gouttes", -"pisse-vinaigre", -"pisse-vinaigres", -"pisse-z-yeux", -"pissy-pôvillais", +"Piré-sur-Seiche", "Pissy-Pôvillais", -"pissy-pôvillaise", "Pissy-Pôvillaise", -"pissy-pôvillaises", "Pissy-Pôvillaises", "Pissy-Pôville", -"pistillo-staminé", -"pistolet-mitrailleur", -"pistolets-mitrailleurs", -"pit-bulls", "Pithiviers-le-Vieil", -"pixie-bob", +"Piégros-la-Clastre", +"Piégut-Pluviers", +"Piñuécar-Gandullas", "Plachy-Buyon", -"plachy-buyonnais", "Plachy-Buyonnais", -"plachy-buyonnaise", "Plachy-Buyonnaise", -"plachy-buyonnaises", "Plachy-Buyonnaises", "Placy-Montaigu", -"Plaimbois-du-Miroir", "Plaimbois-Vennes", +"Plaimbois-du-Miroir", "Plaimpied-Givaudins", -"plain-chant", "Plain-de-Corravillers", -"Plaine-de-Walsch", "Plaine-Haute", +"Plaine-de-Walsch", "Plaines-Saint-Lange", -"plain-pied", -"plains-chants", -"plains-pieds", "Plaisance-du-Touch", -"plaît-il", -"Plancher-Bas", -"Plancher-les-Mines", -"planches-contacts", -"Plancy-l'Abbaye", "Plan-d'Aups", "Plan-d'Aups-Sainte-Baume", +"Plan-d'Orgon", "Plan-de-Baix", "Plan-de-Cuques", "Plan-de-la-Tour", -"Plan-d'Orgon", "Plan-les-Ouates", -"plan-masse", -"plan-plan", -"plan-planisme", -"plan-planismes", -"plan-séquence", -"plan-séquences", -"plans-masses", -"plan-socialisa", -"plan-socialisai", -"plan-socialisaient", -"plan-socialisais", -"plan-socialisait", -"plan-socialisâmes", -"plan-socialisant", -"plan-socialisas", -"plan-socialisasse", -"plan-socialisassent", -"plan-socialisasses", -"plan-socialisassiez", -"plan-socialisassions", -"plan-socialisât", -"plan-socialisâtes", -"plan-socialise", -"plan-socialisé", -"plan-socialisée", -"plan-socialisées", -"plan-socialisent", -"plan-socialiser", -"plan-socialisera", -"plan-socialiserai", -"plan-socialiseraient", -"plan-socialiserais", -"plan-socialiserait", -"plan-socialiseras", -"plan-socialisèrent", -"plan-socialiserez", -"plan-socialiseriez", -"plan-socialiserions", -"plan-socialiserons", -"plan-socialiseront", -"plan-socialises", -"plan-socialisés", -"plan-socialisez", -"plan-socialisiez", -"plan-socialisions", -"plan-socialisons", -"plans-séquences", -"plante-crayon", -"plante-éponge", -"plantes-crayons", -"plaque-bière", -"plaque-tonnerre", +"Plancher-Bas", +"Plancher-les-Mines", +"Plancy-l'Abbaye", "Plassac-Rouffiac", -"plat-bord", -"plat-cul", -"plat-culs", -"plat-de-bierre", "Plateau-Central", -"plateau-repas", -"plateaux-repas", -"plate-bande", -"plate-bière", -"plate-face", -"plate-forme", -"plate-longe", -"plates-bandes", -"plates-formes", -"plates-longes", -"platinico-ammonique", -"plats-bords", -"play-back", -"play-backs", -"play-boy", -"play-boys", -"play-off", -"play-offs", -"plein-cintre", -"pleine-fougerais", "Pleine-Fougerais", -"pleine-fougeraise", "Pleine-Fougeraise", -"pleine-fougeraises", "Pleine-Fougeraises", "Pleine-Fougères", -"plein-emploi", "Pleine-Selve", "Pleine-Sève", "Pleines-Œuvres", -"pleins-cintres", "Pleisweiler-Oberhofen", -"Plélan-le-Grand", -"Plélan-le-Petit", -"Plénée-Jugon", -"Pléneuf-Val-André", "Pleslin-Trigavou", -"plessis-ansoldien", "Plessis-Ansoldien", -"plessis-ansoldienne", "Plessis-Ansoldienne", -"plessis-ansoldiennes", "Plessis-Ansoldiennes", -"plessis-ansoldiens", "Plessis-Ansoldiens", "Plessis-Barbuise", -"plessis-brionnais", "Plessis-Brionnais", -"plessis-brionnaise", "Plessis-Brionnaise", -"plessis-brionnaises", "Plessis-Brionnaises", -"plessis-bucardésien", "Plessis-Bucardésien", -"plessis-bucardésienne", "Plessis-Bucardésienne", -"plessis-bucardésiennes", "Plessis-Bucardésiennes", -"plessis-bucardésiens", "Plessis-Bucardésiens", -"Plessis-de-Roye", -"Plessis-du-Mée", -"plessis-episcopien", "Plessis-Episcopien", -"plessis-épiscopien", -"Plessis-Épiscopien", -"plessis-episcopienne", "Plessis-Episcopienne", -"plessis-épiscopienne", -"Plessis-Épiscopienne", -"plessis-episcopiennes", "Plessis-Episcopiennes", -"plessis-épiscopiennes", -"Plessis-Épiscopiennes", -"plessis-episcopiens", "Plessis-Episcopiens", -"plessis-épiscopiens", -"Plessis-Épiscopiens", "Plessis-Gatebled", -"plessis-grammoirien", "Plessis-Grammoirien", -"plessis-grammoirienne", "Plessis-Grammoirienne", -"plessis-grammoiriennes", "Plessis-Grammoiriennes", -"plessis-grammoiriens", "Plessis-Grammoiriens", -"plessis-luzarchois", "Plessis-Luzarchois", -"plessis-luzarchoise", "Plessis-Luzarchoise", -"plessis-luzarchoises", "Plessis-Luzarchoises", -"plessis-macéen", "Plessis-Macéen", -"plessis-macéenne", "Plessis-Macéenne", -"plessis-macéennes", "Plessis-Macéennes", -"plessis-macéens", "Plessis-Macéens", "Plessis-Saint-Benoist", "Plessis-Saint-Jean", +"Plessis-de-Roye", +"Plessis-du-Mée", +"Plessis-Épiscopien", +"Plessis-Épiscopienne", +"Plessis-Épiscopiennes", +"Plessis-Épiscopiens", "Plessix-Balisson", "Plestin-les-Grèves", "Pleudihen-sur-Rance", "Pleumeur-Bodou", "Pleumeur-Gautier", -"pleu-pleu", -"pleure-misère", -"pleure-misères", -"pleuronecte-guitare", -"pleuro-péricardite", "Pleyber-Christ", -"plieuse-inséreuse", -"plieuses-inséreuses", "Plobannalec-Lesconil", -"Plœuc-L'Hermitage", -"Plœuc-sur-Lié", +"Ploeuc-L'Hermitage", "Plogastel-Saint-Germain", "Plombières-les-Bains", "Plombières-lès-Dijon", "Plonéour-Lanvern", -"Plonévez-du-Faou", "Plonévez-Porzay", -"plongée-spéléo", -"plongées-spéléo", +"Plonévez-du-Faou", "Plorec-sur-Arguenon", -"Plouëc-du-Trieux", -"Plouégat-Guérand", -"Plouégat-Moysan", -"Plouër-sur-Rance", "Plouezoc'h", -"plouezoc'hois", "Plouezoc'hois", -"plouezoc'hoise", "Plouezoc'hoise", -"plouezoc'hoises", "Plouezoc'hoises", "Plougastel-Daoulas", "Ploulec'h", -"ploulec'hois", "Ploulec'hois", -"ploulec'hoise", "Ploulec'hoise", -"ploulec'hoises", "Ploulec'hoises", "Ploumanac'h", "Plounéour-Brignogan-Plages", "Plounéour-Ménez", "Plounéour-Trez", -"plounéour-trezien", "Plounéour-Trezien", -"plounéour-trezienne", "Plounéour-Trezienne", -"plounéour-treziennes", "Plounéour-Treziennes", -"plounéour-treziens", "Plounéour-Treziens", "Plounévez-Lochrist", "Plounévez-Moëdec", "Plounévez-Quintin", "Plourac'h", "Plourin-lès-Morlaix", +"Plouégat-Guérand", +"Plouégat-Moysan", +"Plouëc-du-Trieux", +"Plouër-sur-Rance", "Ployart-et-Vaurseine", -"ploye-ressort", -"plui-plui", -"plumbo-aragonite", -"plumbo-aragonites", -"plum-cake", -"plum-cakes", -"plume-couteau", -"plumes-couteaux", -"plum-pudding", -"plû-part", -"pluri-continental", -"pluri-interprétable", -"pluri-interprétables", -"pluri-journalier", -"pluri-modal", -"pluri-national", -"pluri-nationale", -"pluri-nationales", -"pluri-nationaux", -"plus-d'atouts", -"plus-disant", -"plus-part", -"plus-payé", -"plus-pétition", -"plus-produit", -"plus-produits", -"plus-que-parfait", -"plus-que-parfaits", -"plus-value", -"plus-values", -"pluto-neptunien", -"pluvier-hirondelle", +"Plélan-le-Grand", +"Plélan-le-Petit", +"Pléneuf-Val-André", +"Plénée-Jugon", +"Plœuc-L'Hermitage", +"Plœuc-sur-Lié", "Pobé-Mengao", "Pocé-les-Bois", "Pocé-sur-Cisse", -"poche-cuiller", -"poche-revolver", -"poches-revolver", -"pochettes-surprise", -"pochettes-surprises", -"pochette-surprise", -"podio-régalien", "Podio-Régalien", -"podio-régalienne", "Podio-Régalienne", -"podio-régaliennes", "Podio-Régaliennes", -"podio-régaliens", "Podio-Régaliens", -"podo-orthésiste", -"podo-orthésistes", -"poët-lavalien", -"Poët-Lavalien", -"poët-lavalienne", -"Poët-Lavalienne", -"poët-lavaliennes", -"Poët-Lavaliennes", -"poët-lavaliens", -"Poët-Lavaliens", -"Poey-de-Lescar", "Poey-d'Oloron", +"Poey-de-Lescar", +"Poggio-Marinaccio", +"Poggio-Mezzana", +"Poggio-Mezzanais", +"Poggio-Mezzanaise", +"Poggio-Mezzanaises", +"Poggio-d'Oletta", "Poggio-di-Nazza", "Poggio-di-Tallano", "Poggio-di-Venaco", -"Poggio-d'Oletta", -"Poggio-Marinaccio", -"Poggio-Mezzana", -"poggio-mezzanais", -"Poggio-Mezzanais", -"poggio-mezzanaise", -"Poggio-Mezzanaise", -"poggio-mezzanaises", -"Poggio-Mezzanaises", -"pogne-cul", -"pogne-culs", "Poids-de-Fiole", -"poids-lourd", -"poids-lourds", "Poigny-la-Forêt", "Poilcourt-Sydney", -"Poillé-sur-Vègre", "Poilly-lez-Gien", "Poilly-sur-Serein", "Poilly-sur-Tholon", -"Poinçon-lès-Larrey", +"Poillé-sur-Vègre", "Poinson-lès-Fayl", "Poinson-lès-Grancey", "Poinson-lès-Nogent", -"point-arrière", -"point-col", -"Pointe-à-Pitre", "Pointe-Claire", -"pointe-de-coeur", -"pointe-de-cœur", -"pointe-de-diamant", -"Pointe-du-Laquois", "Pointe-Fortunais", "Pointe-Fortunien", -"pointe-noirais", "Pointe-Noirais", -"pointe-noiraise", "Pointe-Noiraise", -"pointe-noiraises", "Pointe-Noiraises", "Pointe-Noire", -"pointer-et-cliquer", -"pointes-de-coeur", -"pointes-de-cœur", -"pointes-de-diamant", -"Pointis-de-Rivière", +"Pointe-du-Laquois", +"Pointe-à-Pitre", "Pointis-Inard", -"point-milieu", -"point-selle", -"points-virgules", -"points-voyelles", -"point-virgule", -"point-voyelle", +"Pointis-de-Rivière", +"Poinçon-lès-Larrey", "Poiseul-la-Grange", "Poiseul-la-Ville-et-Laperrière", "Poiseul-lès-Saulx", -"poissonnier-écailler", -"poitevin-saintongeais", "Poitou-Charentes", -"poivre-sel", +"Poix-Terron", "Poix-de-Picardie", "Poix-du-Nord", -"poix-résine", -"Poix-Terron", -"poka-yoké", "Polaincourt-et-Clairefontaine", "Poleymieux-au-Mont-d'Or", "Poliez-Pittet", -"politico-économique", -"politico-économiques", -"politico-idéologique", -"politico-idéologiques", -"politico-médiatique", -"politico-religieuse", -"politico-religieuses", -"politico-religieux", -"pollueur-payeur", -"pollueurs-payeurs", -"poly-articulaire", -"poly-articulaires", -"polychlorodibenzo-p-dioxine", -"polychlorodibenzo-p-dioxines", -"poly-insaturé", -"poly-insaturée", -"poly-insaturées", -"poly-insaturés", -"poly-sexuel", -"poly-sexuelle", -"Poméranie-Occidentale-de-l'Est", -"Poméranie-Occidentale-du-Nord", -"pomme-de-pin", -"pomme-grenade", "Pommerit-Jaudy", "Pommerit-le-Vicomte", -"pommes-de-pin", "Pommier-de-Beaurepaire", -"Pommiers-la-Placette", "Pommiers-Moulons", -"pompages-turbinages", -"pompage-turbinage", +"Pommiers-la-Placette", "Pompierre-sur-Doubs", -"Poncé-sur-le-Loir", +"Poméranie-Occidentale-de-l'Est", +"Poméranie-Occidentale-du-Nord", "Poncey-lès-Athée", "Poncey-sur-l'Ignon", "Ponches-Estruval", +"Poncé-sur-le-Loir", "Ponet-et-Saint-Auban", "Ponlat-Taillebourg", "Ponsan-Soubiran", "Ponson-Debat-Pouts", "Ponson-Dessus", +"Pont de Montvert - Sud Mont Lozère", +"Pont-Arcy", +"Pont-Audemer", +"Pont-Authou", +"Pont-Aven", +"Pont-Bellanger", +"Pont-Croix", +"Pont-Farcy", +"Pont-Hébert", +"Pont-Melvez", +"Pont-Noyelles", +"Pont-Péan", +"Pont-Remy", +"Pont-Saint-Esprit", +"Pont-Saint-Mard", +"Pont-Saint-Martin", +"Pont-Saint-Pierre", +"Pont-Saint-Vincent", +"Pont-Sainte-Marie", +"Pont-Sainte-Maxence", +"Pont-Salomon", +"Pont-Scorff", +"Pont-d'Ain", +"Pont-d'Héry", +"Pont-d'Ouilly", +"Pont-de-Barret", +"Pont-de-Buis-lès-Quimerch", +"Pont-de-Chéruy", +"Pont-de-Labeaume", +"Pont-de-Larn", +"Pont-de-Metz", +"Pont-de-Poitte", +"Pont-de-Roide-Vermondans", +"Pont-de-Ruan", +"Pont-de-Salars", +"Pont-de-Vaux", +"Pont-de-Veyle", +"Pont-de-l'Arche", +"Pont-de-l'Isère", +"Pont-du-Bois", +"Pont-du-Casse", +"Pont-du-Château", +"Pont-du-Navoy", +"Pont-en-Royans", +"Pont-et-Massène", +"Pont-l'Abbé", +"Pont-l'Abbé-d'Arnoult", +"Pont-l'Évêque", +"Pont-la-Ville", +"Pont-les-Moulins", +"Pont-lès-Bonfays", +"Pont-sur-Madon", +"Pont-sur-Meuse", +"Pont-sur-Sambre", +"Pont-sur-Seine", +"Pont-sur-Vanne", +"Pont-sur-Yonne", +"Pont-sur-l'Ognon", +"Pont-Évêque", +"Pont-à-Marcq", +"Pont-à-Mousson", +"Pont-à-Vendin", "Pontailler-sur-Saône", "Pontamafrey-Montpascal", "Pontault-Combault", @@ -19467,97 +10722,69 @@ FR_BASE_EXCEPTIONS = [ "Pontiacq-Viellepinte", "Pontoise-lès-Noyon", "Pontonx-sur-l'Adour", -"ponts-bascules", -"ponts-canaux", -"ponts-de-céais", "Ponts-de-Céais", -"ponts-de-céaise", "Ponts-de-Céaise", -"ponts-de-céaises", "Ponts-de-Céaises", "Ponts-et-Marais", -"ponts-levis", -"ponts-neufs", -"popa'a", -"pop-corn", -"pop-in", -"pop-ins", -"pop-punk", -"pop-up", -"pop-ups", -"porc-épic", "Porcieu-Amblagnieu", -"porcs-épics", +"Port-Brillet", +"Port-Jérôme-sur-Seine", +"Port-Launay", +"Port-Lesney", +"Port-Louis", +"Port-Mort", +"Port-Saint-Louis-du-Rhône", +"Port-Saint-Père", +"Port-Sainte-Foy-et-Ponchapt", +"Port-Sainte-Marie", +"Port-Vendres", +"Port-Villez", +"Port-d'Envaux", +"Port-de-Bouc", +"Port-de-Lanne", +"Port-de-Piles", +"Port-des-Barques", +"Port-en-Bessin-Huppain", +"Port-la-Nouvelle", +"Port-le-Grand", +"Port-sur-Saône", +"Port-sur-Seille", +"Porte-Joie", "Portel-des-Corbières", -"Porté-Puymorens", "Portes-en-Valdaine", -"portes-fenêtres", "Portes-lès-Valence", -"portes-tambour", "Portet-d'Aspet", "Portet-de-Luchon", "Portet-sur-Garonne", -"porteur-de-peau", "Porto-Novo", "Porto-Ricain", "Porto-Ricaine", "Porto-Ricaines", "Porto-Ricains", "Porto-Rico", -"porto-vecchiais", "Porto-Vecchiais", -"porto-vecchiaise", "Porto-Vecchiaise", -"porto-vecchiaises", "Porto-Vecchiaises", "Porto-Vecchio", -"portrait-charge", -"portrait-robot", -"portraits-charges", -"portraits-robots", -"posé-décollé", -"posé-décollés", -"pose-tubes", -"post-11-Septembre", +"Porté-Puymorens", "Postbauer-Heng", -"potassico-ammonique", -"potassico-mercureux", -"pot-au-feu", -"pot-au-noir", -"pot-beurrier", -"pot-bouille", -"pot-de-vin", -"pot-en-tête", -"poto-poto", -"pot-pourri", -"potron-jacquet", -"potron-minet", "Potsdam-Mittelmark", -"pots-de-vin", -"pots-pourris", "Pouan-les-Vallées", -"pouce-pied", -"pouces-pieds", -"pou-de-soie", -"poudre-éclair", -"poudres-éclair", -"poudres-éclairs", -"pouët-pouët", "Pougne-Hérisson", "Pougues-les-Eaux", -"Pouillé-les-Côteaux", "Pouilley-Français", "Pouilley-les-Vignes", "Pouilly-en-Auxois", "Pouilly-le-Monial", -"Pouilly-lès-Feurs", "Pouilly-les-Nonains", +"Pouilly-lès-Feurs", "Pouilly-sous-Charlieu", "Pouilly-sur-Loire", "Pouilly-sur-Meuse", "Pouilly-sur-Saône", "Pouilly-sur-Serre", "Pouilly-sur-Vingeanne", +"Pouillé-les-Côteaux", "Poulan-Pouzols", "Pouldavid-sur-Mer", "Poule-les-Echarmeaux", @@ -19565,76 +10792,40 @@ FR_BASE_EXCEPTIONS = [ "Pouligney-Lusans", "Pouligny-Notre-Dame", "Pouligny-Saint-Martin", -"pouligny-saint-pierre", "Pouligny-Saint-Pierre", "Poullan-sur-Mer", -"poult-de-soie", "Poulton-le-Fylde", -"poults-de-soie", "Pouques-Lormes", -"pour-boire", -"pour-cent", "Pournoy-la-Chétive", "Pournoy-la-Grasse", -"pourri-gâté", "Poursay-Garnaud", "Poursiugues-Boucoue", -"poursuite-bâillon", -"Pouru-aux-Bois", "Pouru-Saint-Remy", -"pousse-au-crime", -"pousse-au-jouir", -"pousse-au-vice", -"pousse-broche", -"pousse-broches", -"pousse-café", -"pousse-cafés", -"pousse-caillou", -"pousse-cailloux", -"pousse-cambrure", -"pousse-cambrures", -"pousse-cul", -"pousse-culs", -"pousse-fiche", -"pousse-goupille", -"pousse-mégot", -"pousse-mégots", -"pousse-navette", -"pousse-pied", -"pousse-pieds", -"pousse-pointe", -"pousse-pointes", -"pousse-pousse", +"Pouru-aux-Bois", "Poussy-la-Campagne", -"pout-de-soie", -"pouts-de-soie", -"poux-de-soie", -"Pouy-de-Touges", "Pouy-Loubrin", -"pouy-roquelain", "Pouy-Roquelain", -"pouy-roquelaine", "Pouy-Roquelaine", -"pouy-roquelaines", "Pouy-Roquelaines", -"pouy-roquelains", "Pouy-Roquelains", "Pouy-Roquelaure", +"Pouy-de-Touges", "Pouy-sur-Vannes", "Pouzols-Minervois", "Pouzy-Mésangy", -"pow-wow", -"pow-wows", "Pozo-Lorente", -"PPD-T", +"Poët-Lavalien", +"Poët-Lavalienne", +"Poët-Lavaliennes", +"Poët-Lavaliens", "Pradelles-Cabardès", "Pradelles-en-Val", -"Pradère-les-Bourguets", +"Prades-Salars", "Prades-d'Aubrac", "Prades-le-Lez", -"Prades-Salars", "Prades-sur-Vernazobre", "Prads-Haute-Bléone", +"Pradère-les-Bourguets", "Pralognan-la-Vanoise", "Prat-Bonrepaux", "Prat-et-Bonrepaux", @@ -19645,212 +10836,49 @@ FR_BASE_EXCEPTIONS = [ "Prats-de-Sournia", "Prats-du-Périgord", "Praz-sur-Arly", -"Préaux-Bocage", -"Préaux-du-Perche", -"Préaux-Saint-Sébastien", -"Préchacq-Josbaig", -"Préchacq-les-Bains", -"Préchacq-Navarrenx", -"Préchac-sur-Adour", -"Précy-le-Sec", -"Précy-Notre-Dame", -"Précy-Saint-Martin", -"Précy-sous-Thil", -"Précy-sur-Marne", -"Précy-sur-Oise", -"Précy-sur-Vrin", "Pregny-Chambésy", "Premeaux-Prissey", -"premier-ministra", "Premier-ministrable", "Premier-ministrables", -"premier-ministrai", -"premier-ministraient", -"premier-ministrais", -"premier-ministrait", -"premier-ministrâmes", -"premier-ministrant", -"premier-ministras", -"premier-ministrasse", -"premier-ministrassent", -"premier-ministrasses", -"premier-ministrassiez", -"premier-ministrassions", -"premier-ministrât", -"premier-ministrâtes", -"premier-ministre", -"premier-ministré", -"premier-ministrée", -"premier-ministrées", -"premier-ministrent", -"premier-ministrer", -"premier-ministrera", -"premier-ministrerai", -"premier-ministreraient", -"premier-ministrerais", -"premier-ministrerait", -"premier-ministreras", -"premier-ministrèrent", -"premier-ministrerez", -"premier-ministreriez", -"premier-ministrerions", -"premier-ministrerons", -"premier-ministreront", -"premier-ministres", -"premier-ministrés", -"premier-ministrez", -"premier-ministriez", -"premier-ministrions", -"premier-ministrons", -"premier-né", -"premiers-nés", "Premosello-Chiovenda", -"prés-bois", -"président-candidat", -"présidente-candidate", -"présidentes-candidates", -"présidents-candidats", -"présidents-directeurs", "Presles-en-Brie", "Presles-et-Boves", "Presles-et-Thierny", -"presqu'accident", -"presqu'accidents", -"presqu'ile", -"presqu'île", -"presqu'iles", -"presqu'îles", "Pressagny-l'Orgueilleux", -"prés-salés", -"press-book", -"press-books", -"presse-agrume", -"presse-agrumes", -"presse-ail", -"presse-artère", -"presse-artères", -"presse-citron", -"presse-citrons", -"presse-étoffe", -"presse-étoffes", -"presse-étoupe", -"presse-étoupes", -"presse-fruits", -"presse-légumes", -"presse-papier", -"presse-papiers", -"presse-purée", -"presse-purées", -"presse-urètre", -"presse-urètres", -"pressignaco-vicois", -"Pressignaco-Vicois", -"pressignaco-vicoise", -"Pressignaco-Vicoise", -"pressignaco-vicoises", -"Pressignaco-Vicoises", "Pressignac-Vicq", +"Pressignaco-Vicois", +"Pressignaco-Vicoise", +"Pressignaco-Vicoises", "Pressigny-les-Pins", "Pressy-sous-Dondin", -"prés-vergers", -"prêt-à-monter", -"prêt-à-penser", -"prêt-à-porter", -"prêt-à-poster", -"prête-nom", -"prête-noms", -"Prétot-Sainte-Suzanne", -"Prétot-Vicquemare", -"prêtres-ouvriers", -"prêts-à-penser", -"prêts-à-porter", "Pretz-en-Argonne", "Preuilly-la-Ville", "Preuilly-sur-Claise", "Preutin-Higny", +"Preux-Romanien", +"Preux-Romanienne", +"Preux-Romaniennes", +"Preux-Romaniens", "Preux-au-Bois", "Preux-au-Sart", -"preux-romanien", -"Preux-Romanien", -"preux-romanienne", -"Preux-Romanienne", -"preux-romaniennes", -"Preux-Romaniennes", -"preux-romaniens", -"Preux-Romaniens", -"Prévessin-Moëns", "Preyssac-d'Excideuil", "Prez-sous-Lafauche", "Prez-sur-Marne", "Prez-vers-Noréaz", -"prie-Dieu", "Prignac-en-Médoc", "Prignac-et-Marcamps", "Prignitz-de-l'Est-Ruppin", -"prima-mensis", -"prime-sautier", -"prim'holstein", -"prince-édouardien", -"Prince-Édouardien", -"prince-édouardienne", -"Prince-Édouardienne", -"prince-édouardiennes", -"Prince-Édouardiennes", -"prince-édouardiens", -"Prince-Édouardiens", -"prince-électeur", -"prince-président", -"prince-sans-rire", -"princes-électeurs", -"princes-présidents", -"Principauté-Ultérieure", "Prin-Deyrançon", +"Prince-Édouardien", +"Prince-Édouardienne", +"Prince-Édouardiennes", +"Prince-Édouardiens", +"Principauté-Ultérieure", "Prinsuéjols-Malbouzon", -"prisons-écoles", "Prissé-la-Charrière", -"privat-docent", -"privat-docentisme", -"privat-docentismes", -"prix-choc", -"prix-chocs", "Prix-lès-Mézières", -"p'rlotte", "Proche-Orient", "Proença-a-Nova", -"programme-cadre", -"programmes-cadres", -"prohexadione-calcium", -"promène-couillon", -"promène-couillons", -"promis-juré", -"promis-jurée", -"promis-jurées", -"promis-jurés", -"prône-misère", -"pronom-adjectif", -"pronoms-adjectifs", -"propre-à-rien", -"propres-à-rien", -"prostato-péritonéal", -"prostato-péritonéale", -"prostato-péritonéales", -"prostato-péritonéaux", -"protège-cahier", -"protège-cahiers", -"protège-dent", -"protège-dents", -"protège-mamelon", -"protège-mamelons", -"protège-oreille", -"protège-oreilles", -"protège-slip", -"protège-slips", -"protège-tibia", -"protège-tibias", -"prout-prout", -"prout-proute", -"prout-proutes", -"prout-prouts", "Provence-Alpes-Côte-d'Azur", "Provenchères-et-Colroy", "Provenchères-lès-Darney", @@ -19859,15 +10887,9 @@ FR_BASE_EXCEPTIONS = [ "Provenchères-sur-Meuse", "Provinces-Unies", "Proviseux-et-Plesnoy", -"prud'homal", -"prud'homale", -"prud'homales", -"prud'homaux", -"prud'homie", -"prud'homies", -"Pruillé-le-Chétif", "Pruillé-l'Eguillé", "Pruillé-l'Éguillé", +"Pruillé-le-Chétif", "Prunay-Belleville", "Prunay-Cassereau", "Prunay-en-Yvelines", @@ -19876,492 +10898,175 @@ FR_BASE_EXCEPTIONS = [ "Prunay-sur-Essonne", "Prunelli-di-Casacconi", "Prunelli-di-Fiumorbo", -"Prunet-et-Belpuig", -"prunet-puigois", "Prunet-Puigois", -"prunet-puigoise", "Prunet-Puigoise", -"prunet-puigoises", "Prunet-Puigoises", -"prunier-cerise", -"pruniers-cerises", +"Prunet-et-Belpuig", "Pruniers-en-Sologne", "Prusly-sur-Ource", "Prusse-Orientale", -"pschitt-pschitt", -"psycho-physiologique", -"psycho-physiologiques", -"psycho-physique", -"psycho-physiques", -"psycho-pop", -"p'tain", -"ptérygo-pharyngien", -"p't-être", -"p'tit", -"p'tite", -"p'tites", -"p'tits", -"pub-restaurant", -"pub-restaurants", -"puce-chique", -"puces-chiques", +"Pré-Saint-Martin", +"Pré-Saint-Évroult", +"Pré-en-Pail-Saint-Samson", +"Préaux-Bocage", +"Préaux-Saint-Sébastien", +"Préaux-du-Perche", +"Préchac-sur-Adour", +"Préchacq-Josbaig", +"Préchacq-Navarrenx", +"Préchacq-les-Bains", +"Précy-Notre-Dame", +"Précy-Saint-Martin", +"Précy-le-Sec", +"Précy-sous-Thil", +"Précy-sur-Marne", +"Précy-sur-Oise", +"Précy-sur-Vrin", +"Prétot-Sainte-Suzanne", +"Prétot-Vicquemare", +"Prévessin-Moëns", "Puch-d'Agenais", "Puech-Cabrier", -"pue-la-sueur", "Puget-Rostang", -"Puget-sur-Argens", "Puget-Théniers", "Puget-Ville", +"Puget-sur-Argens", "Pugny-Chatenod", "Puig-reig", "Puilly-et-Charbeaux", "Puiselet-le-Marais", -"puiset-doréen", "Puiset-Doréen", -"puiset-doréenne", "Puiset-Doréenne", -"puiset-doréennes", "Puiset-Doréennes", -"puiset-doréens", "Puiset-Doréens", +"Puiseux-Pontoise", "Puiseux-en-Bray", "Puiseux-en-France", "Puiseux-en-Retz", "Puiseux-le-Hauberger", "Puiseux-les-Louvres", -"Puiseux-Pontoise", "Puisieux-et-Clanlieu", -"puis-je", "Puits-et-Nuisement", "Puits-la-Lande", "Puits-la-Vallée", "Pujo-le-Plan", "Pujols-sur-Ciron", "Puligny-Montrachet", -"pull-buoy", -"pull-buoys", -"pull-over", -"pull-overs", -"pull-up", -"pulmo-aortique", -"pulso-réacteurs", -"pulvérisateur-mélangeur", -"punaise-mouche", -"punaises-mouches", -"punching-ball", -"punching-balls", -"punkah-wallah", -"pure-laine", -"purge-mariage", -"purge-mariages", -"pur-sang", -"pur-sangs", -"purs-sangs", -"push-back", -"push-up", "Pusy-et-Epenoux", "Pusy-et-Épenoux", -"Putanges-le-Lac", "Putanges-Pont-Ecrepin", "Putanges-Pont-Écrepin", -"putot-bessinois", +"Putanges-le-Lac", "Putot-Bessinois", -"putot-bessinoise", "Putot-Bessinoise", -"putot-bessinoises", "Putot-Bessinoises", "Putot-en-Auge", "Putot-en-Bessin", "Puttelange-aux-Lacs", "Puttelange-lès-Farschviller", "Puttelange-lès-Thionville", +"Puy-Guillaume", +"Puy-Malsignat", +"Puy-Saint-André", +"Puy-Saint-Eusèbe", +"Puy-Saint-Gulmier", +"Puy-Saint-Martin", +"Puy-Saint-Pierre", +"Puy-Saint-Vincent", +"Puy-Sanières", +"Puy-d'Arnac", +"Puy-de-Serre", +"Puy-du-Lac", +"Puy-l'Évêque", "Puygaillard-de-Lomagne", "Puygaillard-de-Quercy", "Puyol-Cazalet", -"pyraflufen-éthyl", "Pyrénées-Atlantiques", "Pyrénées-Orientales", -"pyrimiphos-éthyl", -"pyrimiphos-méthyl", -"pyro-électricité", -"pyro-électricités", -"pyro-électrique", -"pyro-électriques", -"q'anjob'al", +"Pätow-Steegen", +"Père-la-pudeur", +"Pécharic-et-le-Py", +"Pégairolles-de-Buèges", +"Pégairolles-de-l'Escalette", +"Péret-Bel-Air", +"Périers-en-Auge", +"Périers-sur-le-Dan", +"Pérignat-lès-Sarliève", +"Pérignat-sur-Allier", +"Pérignat-ès-Allier", +"Périgny-la-Rose", +"Pérols-sur-Vézère", +"Péronne-en-Mélantois", +"Péronnes-lez-Antoing", +"Péroy-les-Gombries", +"Pétrus-Colien", +"Pétrus-Colienne", +"Pétrus-Coliennes", +"Pétrus-Coliens", +"Pézilla-de-Conflent", +"Pézilla-la-Rivière", +"Pézènes-les-Mines", "Qo'noS", -"quad-core", -"quad-cores", -"quadri-accélération", -"quadri-accélérationnellement", -"quadri-ailé", -"quadri-couche", -"quadri-couches", -"quadri-courant", -"quadri-dimensionnel", -"quadri-dimensionnelle", -"quadri-dimensionnelles", -"quadri-dimensionnels", -"quadri-rotor", -"quadri-rotors", -"quadruple-croche", -"quadruples-croches", "Quaix-en-Chartreuse", -"quant-à-moi", -"quant-à-soi", -"quarante-cinq", -"quarante-deux", -"quarante-douze", -"quarante-et-un", -"quarante-et-une", -"quarante-huit", -"quarante-huitard", -"quarante-huitarde", -"quarante-huitardes", -"quarante-huitards", -"quarante-huitième", -"quarante-huitièmes", -"quarante-langues", -"quarante-neuf", -"quarante-neuvième", -"quarante-neuvièmes", -"quarante-quatre", -"quarante-sept", -"quarante-six", -"quarante-trois", -"quarante-vingt", "Quarré-les-Tombes", -"quart-arrière", -"quart-biscuité", -"quart-de-cercle", -"quart-de-finaliste", -"quart-de-finalistes", -"quart-de-pouce", -"quart-d'heure", -"quarte-fagot", -"quartier-général", -"quartier-maitre", -"quartier-maître", -"quartier-maitres", -"quartier-mestre", -"quartiers-maîtres", -"quart-monde", -"quarts-arrières", -"quarts-de-cercle", -"quart-temps", -"quatorze-marsiste", -"quatorze-marsistes", -"quatre-cent-vingt-et-un", "Quatre-Champs", -"quatre-chevaux", -"quatre-cinq-un", -"quatre-cornes", -"quatre-de-chiffre", -"quatre-épées", -"quatre-épices", -"quatre-feuilles", -"quatre-heura", -"quatre-heurai", -"quatre-heuraient", -"quatre-heurais", -"quatre-heurait", -"quatre-heurâmes", -"quatre-heurant", -"quatre-heuras", -"quatre-heurasse", -"quatre-heurassent", -"quatre-heurasses", -"quatre-heurassiez", -"quatre-heurassions", -"quatre-heurât", -"quatre-heurâtes", -"quatre-heure", -"quatre-heuré", -"quatre-heurent", -"quatre-heurer", -"quatre-heurera", -"quatre-heurerai", -"quatre-heureraient", -"quatre-heurerais", -"quatre-heurerait", -"quatre-heureras", -"quatre-heurèrent", -"quatre-heurerez", -"quatre-heureriez", -"quatre-heurerions", -"quatre-heurerons", -"quatre-heureront", -"quatre-heures", -"quatre-heurez", -"quatre-heuriez", -"quatre-heurions", -"quatre-heurons", -"quatre-huit", -"quatre-mâts", "Quatre-Nations", -"quatre-œil", -"quatre-pieds", -"quatre-quart", -"quatre-quarts", -"quatre-quatre", -"quatre-quatre-deux", -"quatre-quint", -"quatre-quints", -"quatre-quinze", -"quatre-quinzes", -"quatre-routois", "Quatre-Routois", -"quatre-routoise", "Quatre-Routoise", -"quatre-routoises", "Quatre-Routoises", -"quatre-saisons", -"quatres-de-chiffre", -"quatre-temps", -"quatre-trois-trois", -"quatre-vingt", -"quatre-vingtaine", -"quatre-vingtaines", -"quatre-vingt-cinq", -"quatre-vingt-deux", -"quatre-vingt-dix", -"quatre-vingt-dix-huit", -"quatre-vingt-dixième", -"quatre-vingt-dixièmes", -"quatre-vingt-dix-neuf", -"quatre-vingt-dix-neuvième", -"quatre-vingt-dix-neuvièmes", -"quatre-vingt-dix-sept", -"quatre-vingt-dizaine", -"quatre-vingt-dizaines", -"quatre-vingt-douze", -"quatre-vingt-huit", -"quatre-vingtième", -"quatre-vingtièmes", -"quatre-vingt-neuf", -"quatre-vingt-onze", -"quatre-vingt-quatorze", -"quatre-vingt-quatre", -"quatre-vingt-quinze", -"quatre-vingts", -"quatre-vingt-seize", -"quatre-vingt-sept", -"quatre-vingt-six", -"quatre-vingt-treize", -"quatre-vingt-trois", -"quatre-vingt-un", -"quatre-vingt-une", -"quat'z'arts", "Quelaines-Saint-Gault", -"quelques-unes", -"quelques-uns", -"quelqu'un", -"quelqu'une", "Quemigny-Poisot", "Quemigny-sur-Seine", "Quemper-Guézennec", -"que'ques", "Quesnay-Guesnon", "Quesnoy-le-Montant", "Quesnoy-sur-Airaines", "Quesnoy-sur-Deûle", -"questche-wasser", -"question-piège", -"questions-pièges", -"questions-réponses", -"questions-tags", -"question-tag", "Quet-en-Beaumont", "Quettreville-sur-Sienne", -"queue-d'aronde", -"queue-de-carpe", -"queue-de-chat", -"queue-de-cheval", -"queue-de-cochon", -"queue-de-lion", -"queue-de-loup", -"queue-de-morue", -"queue-de-paon", -"queue-de-pie", -"queue-de-poêle", -"queue-de-poireau", -"queue-de-porc", -"queue-de-pourceau", -"queue-de-rat", -"queue-de-renard", -"queue-de-scorpion", -"queue-de-souris", -"queue-de-vache", -"queue-d'hironde", -"queue-d'oison", -"queue-d'or", "Queue-du-Bois", -"queue-du-chat", -"queue-fourchue", -"queue-rouge", -"queues-d'aronde", -"queues-de-chat", -"queues-de-cheval", -"queues-de-cochon", -"queues-de-morue", -"queues-de-pie", -"queues-de-poêle", -"queues-de-pourceau", -"queues-de-rat", -"queues-de-renard", -"queues-de-vache", -"queues-d'hironde", -"queues-d'or", -"Quévreville-la-Poterie", -"Quévy-le-Grand", -"Quévy-le-Petit", "Queyssac-les-Vignes", -"quick-and-dirty", "Quiers-sur-Bézonde", -"Quiéry-la-Motte", "Quillebeuf-sur-Seine", "Quincampoix-Fleuzy", "Quincié-en-Beaujolais", "Quincy-Basse", "Quincy-Landzécourt", -"Quincy-le-Vicomte", -"Quincy-sous-le-Mont", -"Quincy-sous-Sénart", "Quincy-Voisins", -"qu-in-situ", +"Quincy-le-Vicomte", +"Quincy-sous-Sénart", +"Quincy-sous-le-Mont", "Quint-Fonsegrives", -"quintuple-croche", -"quintuples-croches", -"quinze-vingt", -"quinze-vingts", "Quiry-le-Sec", -"qui-va-là", -"qui-vive", -"quizalofop-éthyl", -"quizalofop-p-éthyl", -"quizalofop-P-éthyl", +"Quiéry-la-Motte", +"Quœux-Haut-Maînil", +"Quévreville-la-Poterie", +"Quévy-le-Grand", +"Quévy-le-Petit", "Quœux-Haut-Maînil", -"quote-part", -"quotes-parts", "Qwa-Qwa", +"R'n'B", +"R.-V.", +"RS-232", "Raa-Besenbek", "Rabastens-de-Bigorre", -"rabat-eau", -"rabat-eaux", -"rabat-joie", -"rabat-joies", "Rabat-les-Trois-Seigneurs", "Rabenkirchen-Faulück", -"rabi'-oul-aououal", -"rabi'-out-tani", "Rablay-sur-Layon", -"Rachecourt-sur-Marne", "Rachecourt-Suzémont", -"racine-blanche", -"racines-blanches", -"radars-tronçons", -"radar-tronçon", +"Rachecourt-sur-Marne", "Raddon-et-Chapendu", -"radicale-socialiste", -"radicales-socialistes", -"radical-socialisme", -"radical-socialismes", -"radical-socialiste", -"radicaux-socialistes", "Radinghem-en-Weppes", -"radio-actinium", -"radio-activité", -"radio-activités", -"radio-amateur", -"radio-amateurs", -"radio-canadien", -"radio-carpien", -"radio-carpienne", -"radio-carpiennes", -"radio-carpiens", -"radio-crochet", -"radio-crochets", -"radio-cubital", -"radio-diffusion", -"radio-étiquette", -"radio-étiquettes", -"radio-gramophone", -"radio-gramophones", -"radio-identification", -"radio-identifications", -"radio-interféromètre", -"radio-interféromètres", -"radio-isotope", -"radio-isotopes", -"radio-opacité", -"radio-opacités", -"radio-palmaire", -"radio-phonographe", -"radio-phonographes", -"radio-réalité", -"radio-réalités", -"radio-réveil", -"radio-taxi", -"radio-télévisé", -"radio-télévisée", -"radio-télévisées", -"radio-télévisés", -"radio-télévision", -"radio-télévisions", -"radio-thorium", -"rad-soc", -"rad'soc", -"rad-socs", -"rad'socs", "Ragow-Merz", -"rag-time", -"rag-times", "Raguhn-Jeßnitz", -"rahat-lokoum", -"rahat-lokoums", -"rahat-loukoum", -"rahat-loukoums", -"raid-aventure", -"rai-de-coeur", -"rai-de-cœur", -"raie-aigle", -"raie-guitare", -"raie-papillon", -"raies-aigles", -"raies-papillons", "Raillencourt-Sainte-Olle", -"rail-road", -"rail-route", -"Raï'n'B", -"rais-de-coeur", -"rais-de-cœur", -"raisin-de-chien", -"raisins-de-chien", "Raissac-d'Aude", "Raissac-sur-Lampy", "Ralbitz-Rosenthal", -"ralé-poussé", -"râlé-poussé", -"Râlé-Poussé", -"rallie-papier", -"rallonge-bouton", -"rallonge-boutons", -"ramasse-bourrier", -"ramasse-bourriers", -"ramasse-couvert", -"ramasse-couverts", -"ramasse-miette", -"ramasse-miettes", -"ramasse-monnaie", -"ramasse-poussière", -"ramasse-poussières", -"ramasse-ton-bras", -"ramasseuse-presse", -"ramasseuses-presses", "Rambluzin-et-Benoite-Vaux", "Ramegnies-Chin", "Ramillies-Offus", "Ramonville-Saint-Agne", -"(R)-amphétamine", "Ramstein-Miesenbach", "Rancourt-sur-Ornain", "Rang-du-Fliers", @@ -20370,283 +11075,45 @@ FR_BASE_EXCEPTIONS = [ "Ranspach-le-Haut", "Ranville-Breuillaud", "Raon-aux-Bois", -"Raon-lès-Leau", "Raon-l'Etape", "Raon-l'Étape", +"Raon-lès-Leau", "Raon-sur-Plaine", "Rapide-Danseurois", "Rapperswil-Jona", "Raschau-Markersbach", -"ras-de-cou", -"rase-motte", -"rase-mottes", -"rase-pet", -"rase-pets", -"ras-la-moule", -"ras-le-bol", -"ras-le-bonbon", -"ras-le-cresson", -"ras-les-fesses", -"rat-baillet", -"rat-bayard", -"rat-de-cave", -"rat-garou", -"ratisse-caisse", -"rats-de-cave", -"rats-garous", -"rat-taupe", -"rat-trompette", "Raucourt-au-Bois", "Raucourt-et-Flaba", "Rauville-la-Bigot", "Rauville-la-Place", "Ravel-et-Ferriers", "Raville-sur-Sânon", -"Raye-sur-Authie", -"ray-grass", -"Rayol-Canadel-sur-Mer", "Ray-sur-Saône", -"Razac-de-Saussignac", +"Raye-sur-Authie", +"Rayol-Canadel-sur-Mer", "Razac-d'Eymet", +"Razac-de-Saussignac", "Razac-sur-l'Isle", -"raz-de-marée", -"ready-made", -"reality-show", -"reality-shows", -"réal-politique", -"réal-politiques", -"réarc-bouta", -"réarc-boutai", -"réarc-boutaient", -"réarc-boutais", -"réarc-boutait", -"réarc-boutâmes", -"réarc-boutant", -"réarc-boutas", -"réarc-boutasse", -"réarc-boutassent", -"réarc-boutasses", -"réarc-boutassiez", -"réarc-boutassions", -"réarc-boutât", -"réarc-boutâtes", -"réarc-boute", -"réarc-bouté", -"réarc-boutée", -"réarc-boutées", -"réarc-boutent", -"réarc-bouter", -"réarc-boutera", -"réarc-bouterai", -"réarc-bouteraient", -"réarc-bouterais", -"réarc-bouterait", -"réarc-bouteras", -"réarc-boutèrent", -"réarc-bouterez", -"réarc-bouteriez", -"réarc-bouterions", -"réarc-bouterons", -"réarc-bouteront", -"réarc-boutes", -"réarc-boutés", -"réarc-boutez", -"réarc-boutiez", -"réarc-boutions", -"réarc-boutons", -"Réaup-Lisse", +"Raï'n'B", "Rebecq-Rognon", "Rebreuve-Ranchicourt", "Rebreuve-sur-Canche", -"rebrousse-poil", -"réception-cadeaux", "Recey-sur-Ource", "Rechenberg-Bienenmühle", -"Réchicourt-la-Petite", -"Réchicourt-le-Château", -"récipient-mesure", -"récipient-mesures", "Reckange-sur-Mess", "Reckingen-Gluringen", "Recologne-lès-Rioz", "Recoubeau-Jansac", +"Recoules-Prévinquières", "Recoules-d'Aubrac", "Recoules-de-Fumas", -"Recoules-Prévinquières", -"recourbe-cils", -"Récourt-le-Creux", "Recques-sur-Course", "Recques-sur-Hem", -"recto-vaginal", -"recto-verso", -"redouble-cliqua", -"redouble-cliquai", -"redouble-cliquaient", -"redouble-cliquais", -"redouble-cliquait", -"redouble-cliquâmes", -"redouble-cliquant", -"redouble-cliquas", -"redouble-cliquasse", -"redouble-cliquassent", -"redouble-cliquasses", -"redouble-cliquassiez", -"redouble-cliquassions", -"redouble-cliquât", -"redouble-cliquâtes", -"redouble-clique", -"redouble-cliqué", -"redouble-cliquent", -"redouble-cliquer", -"redouble-cliquera", -"redouble-cliquerai", -"redouble-cliqueraient", -"redouble-cliquerais", -"redouble-cliquerait", -"redouble-cliqueras", -"redouble-cliquèrent", -"redouble-cliquerez", -"redouble-cliqueriez", -"redouble-cliquerions", -"redouble-cliquerons", -"redouble-cliqueront", -"redouble-cliques", -"redouble-cliquez", -"redouble-cliquiez", -"redouble-cliquions", -"redouble-cliquons", -"redresse-seins", -"re'em", -"re'ems", -"réentr'apercevaient", -"réentr'apercevais", -"réentr'apercevait", -"réentr'apercevant", -"réentr'apercevez", -"réentr'aperceviez", -"réentr'apercevions", -"réentr'apercevoir", -"réentr'apercevons", -"réentr'apercevra", -"réentr'apercevrai", -"réentr'apercevraient", -"réentr'apercevrais", -"réentr'apercevrait", -"réentr'apercevras", -"réentr'apercevrez", -"réentr'apercevriez", -"réentr'apercevrions", -"réentr'apercevrons", -"réentr'apercevront", -"réentr'aperçois", -"réentr'aperçoit", -"réentr'aperçoive", -"réentr'aperçoivent", -"réentr'aperçoives", -"réentr'aperçu", -"réentr'aperçue", -"réentr'aperçues", -"réentr'aperçûmes", -"réentr'aperçurent", -"réentr'aperçus", -"réentr'aperçusse", -"réentr'aperçussent", -"réentr'aperçusses", -"réentr'aperçussiez", -"réentr'aperçussions", -"réentr'aperçut", -"réentr'aperçût", -"réentr'aperçûtes", -"réentr'ouvert", -"réentr'ouverte", -"réentr'ouvertes", -"réentr'ouverts", -"réentr'ouvraient", -"réentr'ouvrais", -"réentr'ouvrait", -"réentr'ouvrant", -"réentr'ouvre", -"réentr'ouvrent", -"réentr'ouvres", -"réentr'ouvrez", -"réentr'ouvriez", -"réentr'ouvrîmes", -"réentr'ouvrions", -"réentr'ouvrir", -"réentr'ouvrira", -"réentr'ouvrirai", -"réentr'ouvriraient", -"réentr'ouvrirais", -"réentr'ouvrirait", -"réentr'ouvriras", -"réentr'ouvrirent", -"réentr'ouvrirez", -"réentr'ouvririez", -"réentr'ouvririons", -"réentr'ouvrirons", -"réentr'ouvriront", -"réentr'ouvris", -"réentr'ouvrisse", -"réentr'ouvrissent", -"réentr'ouvrisses", -"réentr'ouvrissiez", -"réentr'ouvrissions", -"réentr'ouvrit", -"réentr'ouvrît", -"réentr'ouvrîtes", -"réentr'ouvrons", -"Réez-Fosse-Martin", -"refox-trotta", -"refox-trottai", -"refox-trottaient", -"refox-trottais", -"refox-trottait", -"refox-trottâmes", -"refox-trottant", -"refox-trottas", -"refox-trottasse", -"refox-trottassent", -"refox-trottasses", -"refox-trottassiez", -"refox-trottassions", -"refox-trottât", -"refox-trottâtes", -"refox-trotte", -"refox-trotté", -"refox-trottent", -"refox-trotter", -"refox-trottera", -"refox-trotterai", -"refox-trotteraient", -"refox-trotterais", -"refox-trotterait", -"refox-trotteras", -"refox-trottèrent", -"refox-trotterez", -"refox-trotteriez", -"refox-trotterions", -"refox-trotterons", -"refox-trotteront", -"refox-trottes", -"refox-trottez", -"refox-trottiez", -"refox-trottions", -"refox-trottons", -"regardez-moi", -"régis-borgien", -"Régis-Borgien", -"régis-borgienne", -"Régis-Borgienne", -"régis-borgiennes", -"Régis-Borgiennes", -"régis-borgiens", -"Régis-Borgiens", "Regis-Breitingen", -"Regnéville-sur-Mer", -"Regnéville-sur-Meuse", -"Régnié-Durette", "Regnière-Ecluse", "Regnière-Écluse", +"Regnéville-sur-Mer", +"Regnéville-sur-Meuse", "Rehburg-Loccum", "Rehlingen-Siersburg", "Rehm-Flehde-Bargen", @@ -20657,370 +11124,44 @@ FR_BASE_EXCEPTIONS = [ "Reignier-Esery", "Reignier-Ésery", "Reims-la-Brûlée", -"reine-claude", -"reine-des-bois", -"reine-des-prés", -"reine-marguerite", -"reines-claudes", -"reines-des-bois", -"reines-des-prés", -"reines-marguerites", "Reinhardtsdorf-Schöna", "Rejet-de-Beaulieu", -"relève-gravure", -"relève-gravures", -"relève-moustache", -"relève-moustaches", -"relève-quartier", -"relève-quartiers", -"relève-selle", -"relève-selles", -"Rémalard-en-Perche", "Rembercourt-Sommaisne", "Rembercourt-sur-Mad", "Remda-Teichel", -"Rémering-lès-Hargarten", -"Rémering-lès-Puttelange", -"remettez-vous", -"remicro-onda", -"remicro-ondai", -"remicro-ondaient", -"remicro-ondais", -"remicro-ondait", -"remicro-ondâmes", -"remicro-ondant", -"remicro-ondas", -"remicro-ondasse", -"remicro-ondassent", -"remicro-ondasses", -"remicro-ondassiez", -"remicro-ondassions", -"remicro-ondât", -"remicro-ondâtes", -"remicro-onde", -"remicro-ondé", -"remicro-ondée", -"remicro-ondées", -"remicro-ondent", -"remicro-onder", -"remicro-ondera", -"remicro-onderai", -"remicro-onderaient", -"remicro-onderais", -"remicro-onderait", -"remicro-onderas", -"remicro-ondèrent", -"remicro-onderez", -"remicro-onderiez", -"remicro-onderions", -"remicro-onderons", -"remicro-onderont", -"remicro-ondes", -"remicro-ondés", -"remicro-ondez", -"remicro-ondiez", -"remicro-ondions", -"remicro-ondons", "Remilly-Aillicourt", +"Remilly-Wirquin", +"Remilly-Wirquinois", +"Remilly-Wirquinoise", +"Remilly-Wirquinoises", "Remilly-en-Montagne", "Remilly-les-Pothées", "Remilly-sur-Lozon", "Remilly-sur-Tille", -"Remilly-Wirquin", -"remilly-wirquinois", -"Remilly-Wirquinois", -"remilly-wirquinoise", -"Remilly-Wirquinoise", -"remilly-wirquinoises", -"Remilly-Wirquinoises", "Remire-Montjoly", -"Rémondans-Vaivre", -"remonte-pente", -"remonte-pentes", "Remoray-Boujeons", "Rems-Murr", -"remue-ménage", -"remue-ménages", -"remue-méninge", -"remue-méninges", -"remue-queue", -"remue-queues", -"rémy-montais", -"Rémy-Montais", -"rémy-montaise", -"Rémy-Montaise", -"rémy-montaises", -"Rémy-Montaises", -"renarde-garou", -"renard-garou", -"rendez-vous", -"r'endormaient", -"r'endormais", -"r'endormait", -"r'endormant", -"r'endorme", -"r'endorment", -"r'endormes", -"r'endormez", -"r'endormi", -"r'endormie", -"r'endormies", -"r'endormiez", -"r'endormîmes", -"r'endormions", -"r'endormir", -"r'endormira", -"r'endormirai", -"r'endormiraient", -"r'endormirais", -"r'endormirait", -"r'endormiras", -"r'endormirent", -"r'endormirez", -"r'endormiriez", -"r'endormirions", -"r'endormirons", -"r'endormiront", -"r'endormis", -"r'endormisse", -"r'endormissent", -"r'endormisses", -"r'endormissiez", -"r'endormissions", -"r'endormit", -"r'endormît", -"r'endormîtes", -"r'endormons", -"r'endors", -"r'endort", "Rendsburg-Eckernförde", "Rennes-en-Grenouilles", "Rennes-le-Château", "Rennes-les-Bains", -"rennes-robots", "Rennes-sur-Loue", -"renouée-bambou", -"rentre-dedans", -"rentr'ouvert", -"rentr'ouverte", -"rentr'ouvertes", -"rentr'ouverts", -"rentr'ouvraient", -"rentr'ouvrais", -"rentr'ouvrait", -"rentr'ouvrant", -"rentr'ouvre", -"rentr'ouvrent", -"rentr'ouvres", -"rentr'ouvrez", -"rentr'ouvriez", -"rentr'ouvrîmes", -"rentr'ouvrions", -"rentr'ouvrir", -"rentr'ouvrira", -"rentr'ouvrirai", -"rentr'ouvriraient", -"rentr'ouvrirais", -"rentr'ouvrirait", -"rentr'ouvriras", -"rentr'ouvrirent", -"rentr'ouvrirez", -"rentr'ouvririez", -"rentr'ouvririons", -"rentr'ouvrirons", -"rentr'ouvriront", -"rentr'ouvris", -"rentr'ouvrisse", -"rentr'ouvrissent", -"rentr'ouvrisses", -"rentr'ouvrissiez", -"rentr'ouvrissions", -"rentr'ouvrit", -"rentr'ouvrît", -"rentr'ouvrîtes", -"rentr'ouvrons", -"renvoi-instruire", -"repetit-déjeuna", -"repetit-déjeunai", -"repetit-déjeunaient", -"repetit-déjeunais", -"repetit-déjeunait", -"repetit-déjeunâmes", -"repetit-déjeunant", -"repetit-déjeunas", -"repetit-déjeunasse", -"repetit-déjeunassent", -"repetit-déjeunasses", -"repetit-déjeunassiez", -"repetit-déjeunassions", -"repetit-déjeunât", -"repetit-déjeunâtes", -"repetit-déjeune", -"repetit-déjeuné", -"repetit-déjeunent", -"repetit-déjeuner", -"repetit-déjeunera", -"repetit-déjeunerai", -"repetit-déjeuneraient", -"repetit-déjeunerais", -"repetit-déjeunerait", -"repetit-déjeuneras", -"repetit-déjeunèrent", -"repetit-déjeunerez", -"repetit-déjeuneriez", -"repetit-déjeunerions", -"repetit-déjeunerons", -"repetit-déjeuneront", -"repetit-déjeunes", -"repetit-déjeunez", -"repetit-déjeuniez", -"repetit-déjeunions", -"repetit-déjeunons", -"repique-niqua", -"repique-niquai", -"repique-niquaient", -"repique-niquais", -"repique-niquait", -"repique-niquâmes", -"repique-niquant", -"repique-niquas", -"repique-niquasse", -"repique-niquassent", -"repique-niquasses", -"repique-niquassiez", -"repique-niquassions", -"repique-niquât", -"repique-niquâtes", -"repique-nique", -"repique-niqué", -"repique-niquent", -"repique-niquer", -"repique-niquera", -"repique-niquerai", -"repique-niqueraient", -"repique-niquerais", -"repique-niquerait", -"repique-niqueras", -"repique-niquèrent", -"repique-niquerez", -"repique-niqueriez", -"repique-niquerions", -"repique-niquerons", -"repique-niqueront", -"repique-niques", -"repique-niquez", -"repique-niquiez", -"repique-niquions", -"repique-niquons", -"répondeur-enregistreur", -"répondeur-enregistreurs", -"repose-pied", -"repose-pieds", -"repose-poignet", -"repose-poignets", -"repose-tête", -"repose-têtes", -"requin-baleine", -"requin-chabot", -"requin-chat", -"requin-chats", -"requin-citron", -"requin-corail", -"requin-crocodile", -"requin-garou", -"requin-griset", -"requin-hâ", -"requin-maquereau", -"requin-marteau", -"requin-nourrice", -"requin-renard", -"requins-baleines", -"requins-citrons", -"requins-crocodiles", -"requins-garous", -"requins-hâ", -"requins-marteaux", -"requins-taupes", -"requins-tigres", -"requin-taupe", -"requin-taureau", -"requin-tigre", -"requin-vache", -"requin-zèbre", -"r'es", -"résino-gommeux", "Ressons-l'Abbaye", "Ressons-le-Long", "Ressons-sur-Matz", -"r'est", -"restaurant-bar", -"restaurant-bistro", -"restaurant-brasserie", -"restaurant-pub", -"restaurants-bistros", -"reste-avec", -"resto-bar", -"resto-bistro", -"resto-brasserie", -"rest-o-pack", -"resto-pub", -"r'étaient", -"r'étais", -"r'était", -"r'étant", -"r'été", -"r'êtes", -"r'étiez", -"r'étions", -"retraite-chapeau", -"retraites-chapeaux", -"r'être", -"retroussons-nos-manches", "Reuil-en-Brie", -"Reuilly-Sauvigny", "Reuil-sur-Brêche", +"Reuilly-Sauvigny", "Reulle-Vergy", -"réunion-bilan", -"réunions-bilan", -"rêve-creux", -"réveille-matin", -"réveille-matins", -"réveil-matin", "Revel-Tourdan", -"revenant-bon", -"revenants-bons", -"revenez-y", "Reventin-Vaugris", +"Revest-Saint-Martin", "Revest-des-Brousses", "Revest-du-Bion", "Revest-les-Roches", -"Revest-Saint-Martin", "Revigny-sur-Ornain", -"Réville-aux-Bois", -"rex-castor", -"rex-castors", -"rez-de-chaussée", -"rez-de-cour", -"rez-de-jardin", -"rez-mur", "Rheda-Wiedenbrück", "Rheingau-Taunus", -"Rhêmes-Notre-Dame", -"Rhêmes-Saint-Georges", -"Rhénanie-du-Nord-Westphalie", -"Rhénanie-Palatinat", -"rhéo-épaississant", -"rhéo-épaississante", -"rhéo-épaississantes", -"rhéo-épaississants", -"rhéo-fluidifiant", -"rhéo-fluidifiante", -"rhéo-fluidifiantes", -"rhéo-fluidifiants", -"rhéto-roman", -"rhéto-romane", -"rhéto-romanes", -"rhéto-romans", "Rhin-Berg", "Rhin-Erft", "Rhin-Hunsrück", @@ -21028,72 +11169,31 @@ FR_BASE_EXCEPTIONS = [ "Rhin-Neckar", "Rhin-Palatinat", "Rhin-Sieg", -"Rhode-Sainte-Agathe", "Rhode-Saint-Genèse", "Rhode-Saint-Pierre", -"rhodesian-ridgeback", +"Rhode-Sainte-Agathe", +"Rhénanie-Palatinat", +"Rhénanie-du-Nord-Westphalie", +"Rhêmes-Notre-Dame", +"Rhêmes-Saint-Georges", "Rhône-Alpes", "Rhön-Grabfeld", "Ria-Sirach", -"ria-sirachois", "Ria-Sirachois", -"ria-sirachoise", "Ria-Sirachoise", -"ria-sirachoises", "Ria-Sirachoises", "Ribaute-les-Tavernes", -"Ribécourt-Dreslincourt", -"Ribécourt-la-Tour", "Ribemont-sur-Ancre", "Ribnitz-Damgarten", -"ric-à-rac", +"Ribécourt-Dreslincourt", +"Ribécourt-la-Tour", "Ricarville-du-Val", "Richebourg-Saint-Vaast", "Richelieu-Yamaskois", -"rick-rolla", -"rick-rollai", -"rick-rollaient", -"rick-rollais", -"rick-rollait", -"rick-rollâmes", -"rick-rollant", -"rick-rollas", -"rick-rollasse", -"rick-rollassent", -"rick-rollasses", -"rick-rollassiez", -"rick-rollassions", -"rick-rollât", -"rick-rollâtes", -"rick-rolle", -"rick-rollé", -"rick-rollée", -"rick-rollées", -"rick-rollent", -"rick-roller", -"rick-rollera", -"rick-rollerai", -"rick-rolleraient", -"rick-rollerais", -"rick-rollerait", -"rick-rolleras", -"rick-rollèrent", -"rick-rollerez", -"rick-rolleriez", -"rick-rollerions", -"rick-rollerons", -"rick-rolleront", -"rick-rolles", -"rick-rollés", -"rick-rollez", -"rick-rolliez", -"rick-rollions", -"rick-rollons", -"ric-rac", "Riec-sur-Bélon", "Ried-Brig", -"Rielasingen-Worblingen", "Riel-les-Eaux", +"Rielasingen-Worblingen", "Riencourt-lès-Bapaume", "Riencourt-lès-Cagnicourt", "Rieschweiler-Mühlbach", @@ -21101,42 +11201,31 @@ FR_BASE_EXCEPTIONS = [ "Rietz-Neuendorf", "Rietzneuendorf-Staakow", "Rieutort-de-Randon", +"Rieux-Minervois", +"Rieux-Volvestre", "Rieux-de-Pelleport", "Rieux-en-Cambrésis", "Rieux-en-Val", -"rieux-en-valois", "Rieux-en-Valois", -"rieux-en-valoise", "Rieux-en-Valoise", -"rieux-en-valoises", "Rieux-en-Valoises", -"Rieux-Minervois", -"Rieux-Volvestre", -"rigaud-montain", +"Rig-Véda", "Rigaud-Montain", -"rigaud-montaine", "Rigaud-Montaine", -"rigaud-montaines", "Rigaud-Montaines", -"rigaud-montains", "Rigaud-Montains", "Rigil-K", "Rignieux-le-Franc", +"Rigny-Saint-Martin", +"Rigny-Ussé", +"Rigny-Usséen", +"Rigny-Usséenne", +"Rigny-Usséennes", +"Rigny-Usséens", "Rigny-la-Nonneuse", "Rigny-la-Salle", "Rigny-le-Ferron", -"Rigny-Saint-Martin", "Rigny-sur-Arroux", -"Rigny-Ussé", -"rigny-usséen", -"Rigny-Usséen", -"rigny-usséenne", -"Rigny-Usséenne", -"rigny-usséennes", -"Rigny-Usséennes", -"rigny-usséens", -"Rigny-Usséens", -"Rig-Véda", "Rijssen-Holten", "Rilhac-Lastours", "Rilhac-Rancon", @@ -21144,9 +11233,9 @@ FR_BASE_EXCEPTIONS = [ "Rilhac-Xaintrie", "Rilland-Bath", "Rillieux-la-Pape", +"Rilly-Sainte-Syre", "Rilly-aux-Oies", "Rilly-la-Montagne", -"Rilly-Sainte-Syre", "Rilly-sur-Aisne", "Rilly-sur-Loire", "Rilly-sur-Vienne", @@ -21154,159 +11243,105 @@ FR_BASE_EXCEPTIONS = [ "Rimbach-près-Masevaux", "Rimbez-et-Baudiets", "Rimon-et-Savel", -"rince-bouche", -"rince-bouches", -"rince-bouteille", -"rince-bouteilles", -"rince-doigt", -"rince-doigts", -"Riom-ès-Montagnes", "Riom-Parsonz", +"Riom-ès-Montagnes", "Rion-des-Landes", "Rioux-Martin", -"Risch-Rotkreuz", "Ris-Orangis", -"risque-tout", +"Risch-Rotkreuz", "Risum-Lindholm", "Rivas-Vaciamadrid", -"Rive-de-Gier", -"Rivedoux-Plage", "Rive-Nord", -"Rives-en-Seine", "Rive-Sud", "Rive-Sudois", +"Rive-de-Gier", +"Rivedoux-Plage", +"Rives d'Andaine", +"Rives de l'Yon", +"Rives-en-Seine", "Riviera-Pays-d'Enhaut", "Rivière-Devant", -"Rivière-du-Loup", -"Rivière-les-Fosses", "Rivière-Pilote", "Rivière-Saas-et-Gourby", "Rivière-Salée", -"Rivières-le-Bois", +"Rivière-du-Loup", +"Rivière-les-Fosses", "Rivière-sur-Tarn", +"Rivières-le-Bois", "Rizaucourt-Buchey", -"riz-pain-sel", -"R'n'B", -"road-book", -"road-books", +"Ro-Ro", +"Ro-Ros", "Roannes-Saint-Mary", -"roast-beef", -"roast-beefs", -"robe-chandail", -"robe-housse", "Robert-Espagne", -"robert-le-diable", "Robert-Magny", -"robert-messin", "Robert-Messin", -"robert-messine", "Robert-Messine", -"robert-messines", "Robert-Messines", -"robert-messins", "Robert-Messins", -"robes-chandails", -"robes-housses", "Robiac-Rochessadoule", "Robleda-Cervantes", -"robot-chien", -"robots-chiens", -"roche-blanchais", +"Roc-Libre", "Roche-Blanchais", -"roche-blanchaise", "Roche-Blanchaise", -"roche-blanchaises", "Roche-Blanchaises", "Roche-Charles-la-Mayrand", +"Roche-Saint-Secret-Béconne", "Roche-d'Agoux", "Roche-en-Régnier", "Roche-et-Méry", "Roche-et-Raucourt", +"Roche-la-Molière", +"Roche-le-Peyroux", +"Roche-lez-Beaupré", +"Roche-lès-Clerval", +"Roche-sur-Linotte-et-Sorans-les-Cordiers", +"Rochefort-Montagne", +"Rochefort-Samson", "Rochefort-du-Gard", "Rochefort-en-Terre", "Rochefort-en-Valdaine", "Rochefort-en-Yvelines", -"Rochefort-Montagne", -"Rochefort-Samson", "Rochefort-sur-Brévon", -"Rochefort-sur-la-Côte", "Rochefort-sur-Loire", "Rochefort-sur-Nenon", -"Roche-la-Molière", -"Roche-le-Peyroux", -"Roche-lès-Clerval", -"Roche-lez-Beaupré", -"roche-mère", -"roche-papier-ciseaux", -"Roche-Saint-Secret-Béconne", +"Rochefort-sur-la-Côte", "Roches-Bettaincourt", -"Roches-lès-Blamont", -"roches-mères", "Roches-Prémarie-Andillé", +"Roches-lès-Blamont", "Roches-sur-Marne", "Roches-sur-Rognon", -"Roche-sur-Linotte-et-Sorans-les-Cordiers", "Rochetaillée-sur-Saône", "Rochy-Condé", -"rock-a-billy", -"rocking-chair", -"rocking-chairs", -"rock'n'roll", "Roclenge-Looz", "Roclenge-sur-Geer", -"Roc-Libre", "Rocourt-Saint-Martin", "Rocquigny-la-Hardoye", "Rodengo-Saiano", -"Rödersheim-Gronau", "Roesbrugge-Haringe", -"Roézé-sur-Sarthe", -"roge-bougeron", "Roge-Bougeron", -"roge-bougeronne", "Roge-Bougeronne", -"roge-bougeronnes", "Roge-Bougeronnes", -"roge-bougerons", "Roge-Bougerons", -"roger-bontemps", -"rogne-cul", -"rogne-pied", -"rogne-pieds", -"rogne-salaires", "Rogny-les-Sept-Ecluses", "Rogny-les-Sept-Écluses", "Rohrbach-lès-Bitche", -"roi-de-rats", -"Roinville-sous-Auneau", -"rois-de-rats", "Roi-Soleil", +"Roinville-sous-Auneau", "Roissy-en-Brie", "Roissy-en-France", "Rollegem-Kapelle", "Rolleghem-Cappelle", -"roller-derby", -"roller-derbys", -"roll-out", -"roll-outs", -"Romagne-sous-les-Côtes", "Romagne-sous-Montfaucon", +"Romagne-sous-les-Côtes", "Romagny-Fontenay", "Romagny-sous-Rougemont", "Romain-aux-Bois", -"Romainmôtier-Envy", "Romain-sur-Meuse", -"Romanèche-Thorins", +"Romainmôtier-Envy", "Romanel-sur-Lausanne", "Romanel-sur-Morges", -"roman-feuilleton", -"roman-fleuve", -"roman-photo", -"roman-photos", -"romans-feuilletons", -"romans-fleuves", -"romans-photos", "Romans-sur-Isère", +"Romanèche-Thorins", "Rombach-le-Franc", "Rombies-et-Marchipont", "Romeny-sur-Marne", @@ -21315,67 +11350,14 @@ FR_BASE_EXCEPTIONS = [ "Romilly-sur-Andelle", "Romilly-sur-Seine", "Romorantin-Lanthenay", -"rompt-pierre", -"rompt-pierres", "Roncherolles-en-Bray", "Roncherolles-sur-le-Vivier", -"rond-de-cuir", -"ronde-bosse", -"ronde-bosses", -"rondes-bosses", -"rond-point", -"rond-ponna", -"rond-ponnai", -"rond-ponnaient", -"rond-ponnais", -"rond-ponnait", -"rond-ponnâmes", -"rond-ponnant", -"rond-ponnas", -"rond-ponnasse", -"rond-ponnassent", -"rond-ponnasses", -"rond-ponnassiez", -"rond-ponnassions", -"rond-ponnât", -"rond-ponnâtes", -"rond-ponne", -"rond-ponné", -"rond-ponnent", -"rond-ponner", -"rond-ponnera", -"rond-ponnerai", -"rond-ponneraient", -"rond-ponnerais", -"rond-ponnerait", -"rond-ponneras", -"rond-ponnèrent", -"rond-ponnerez", -"rond-ponneriez", -"rond-ponnerions", -"rond-ponnerons", -"rond-ponneront", -"rond-ponnes", -"rond-ponnez", -"rond-ponniez", -"rond-ponnions", -"rond-ponnons", -"ronds-de-cuir", -"ronds-points", -"ronge-bois", -"ronge-maille", -"rongo-rongo", -"ron-ron", "Ronzo-Chienis", -"Roôcourt-la-Côte", "Roodt-sur-Eisch", "Roodt-sur-Syre", "Roost-Warendin", -"roost-warendinois", "Roost-Warendinois", -"roost-warendinoise", "Roost-Warendinoise", -"roost-warendinoises", "Roost-Warendinoises", "Roquebrune-Cap-Martin", "Roquebrune-sur-Argens", @@ -21390,16 +11372,13 @@ FR_BASE_EXCEPTIONS = [ "Roquelaure-Saint-Aubin", "Roquestéron-Grasse", "Rorbach-lès-Dieuze", -"Ro-Ro", -"Ro-Ros", "Rosay-sur-Lieure", -"rose-croix", -"rose-de-mer", "Rose-Marie", -"rose-marine", "Rosenthal-Bielatal", -"roses-marines", "Roset-Fluans", +"Rosiers-d'Egletons", +"Rosiers-d'Égletons", +"Rosiers-de-Juillac", "Rosières-aux-Salines", "Rosières-devant-Bar", "Rosières-en-Blois", @@ -21408,9 +11387,6 @@ FR_BASE_EXCEPTIONS = [ "Rosières-près-Troyes", "Rosières-sur-Barbèche", "Rosières-sur-Mance", -"Rosiers-d'Egletons", -"Rosiers-d'Égletons", -"Rosiers-de-Juillac", "Rosnay-l'Hôpital", "Rosny-sous-Bois", "Rosny-sur-Seine", @@ -21418,83 +11394,40 @@ FR_BASE_EXCEPTIONS = [ "Rosoy-en-Multien", "Rosoy-le-Vieil", "Rosoy-sur-Amance", -"rosti-montois", "Rosti-Montois", -"rosti-montoise", "Rosti-Montoise", -"rosti-montoises", "Rosti-Montoises", "Rotheux-Rimière", -"Rötsweiler-Nockenthal", "Rottach-Egern", "Rottal-Inn", +"Rou-Marson", "Rouessé-Fontaine", "Rouessé-Vassé", +"Rouffiac-Tolosan", "Rouffiac-d'Aude", "Rouffiac-des-Corbières", -"Rouffiac-Tolosan", -"Rouffignac-de-Sigoulès", "Rouffignac-Saint-Cernin-de-Reilhac", -"rouge-aile", -"rouge-bord", -"rouge-brun", -"rouge-flasher", -"rouge-gorge", -"rouge-herbe", -"rouge-herbes", -"Rougemont-le-Château", -"rouge-noir", +"Rouffignac-de-Sigoulès", "Rouge-Perriers", -"rouge-pie", -"rouge-queue", -"rouges-ailes", -"rouges-gorges", -"rouges-queues", -"rouget-barbet", -"rouget-grondin", +"Rougemont-le-Château", "Rouilly-Sacey", "Rouilly-Saint-Loup", -"roulage-décollage", -"roulé-boulé", -"roule-goupille", -"roule-goupilles", -"rouler-bouler", -"roulé-saucisse", -"roulés-boulés", -"roule-ta-bosse", "Roullet-Saint-Estèphe", -"roullet-stéphanois", "Roullet-Stéphanois", -"roullet-stéphanoise", "Roullet-Stéphanoise", -"roullet-stéphanoises", "Roullet-Stéphanoises", -"roul-sa-bosse", -"Rou-Marson", "Roumazières-Loubert", "Rouperroux-le-Coquet", "Rousseau-esque", "Rousseau-esques", -"rousses-têtes", -"rousse-tête", "Rousset-les-Vignes", "Roussillon-en-Morvan", "Roussy-le-Village", -"r'ouvert", -"r'ouverte", -"r'ouvertes", -"r'ouverts", -"r'ouvraient", -"r'ouvrais", -"r'ouvrait", -"r'ouvrant", "Rouvray-Catillon", "Rouvray-Saint-Denis", -"Rouvray-Sainte-Croix", "Rouvray-Saint-Florentin", -"r'ouvre", -"r'ouvrent", -"r'ouvres", +"Rouvray-Sainte-Croix", +"Rouvres-Saint-Jean", "Rouvres-en-Multien", "Rouvres-en-Plaine", "Rouvres-en-Woëvre", @@ -21502,81 +11435,52 @@ FR_BASE_EXCEPTIONS = [ "Rouvres-la-Chétive", "Rouvres-les-Bois", "Rouvres-les-Vignes", -"Rouvres-Saint-Jean", "Rouvres-sous-Meilly", "Rouvres-sur-Aube", -"r'ouvrez", -"r'ouvriez", -"r'ouvrîmes", -"r'ouvrions", -"r'ouvrir", -"r'ouvrira", -"r'ouvrirai", -"r'ouvriraient", -"r'ouvrirais", -"r'ouvrirait", -"r'ouvriras", -"r'ouvrirent", -"r'ouvrirez", -"r'ouvririez", -"r'ouvririons", -"r'ouvrirons", -"r'ouvriront", -"r'ouvris", -"r'ouvrisse", -"r'ouvrissent", -"r'ouvrisses", -"r'ouvrissiez", -"r'ouvrissions", -"r'ouvrit", -"r'ouvrît", -"r'ouvrîtes", "Rouvrois-sur-Meuse", "Rouvrois-sur-Othain", -"r'ouvrons", +"Rouvroy-Ripont", "Rouvroy-en-Santerre", "Rouvroy-les-Merles", "Rouvroy-les-Pothées", -"Rouvroy-Ripont", "Rouvroy-sur-Audry", "Rouvroy-sur-Marne", "Rouvroy-sur-Serre", -"Rouxmesnil-Bouteilles", -"roux-mirien", "Roux-Mirien", "Roux-Mirienne", "Roux-Miroir", +"Rouxmesnil-Bouteilles", "Rouy-le-Grand", "Rouy-le-Petit", "Rouziers-de-Touraine", "Roville-aux-Chênes", "Roville-devant-Bayon", +"Roy-Boissy", "Royaucourt-et-Chailvet", "Royaume-Uni", -"Roy-Boissy", -"Royère-de-Vassivière", "Roye-sur-Matz", +"Royère-de-Vassivière", +"Roz-Landrieux", +"Roz-sur-Couesnon", "Rozay-en-Brie", "Rozet-Saint-Albin", "Rozier-Côtes-d'Aurec", "Rozier-en-Donzy", +"Roziers-Saint-Georges", "Rozières-en-Beauce", "Rozières-sur-Crise", "Rozières-sur-Mouzon", -"Roziers-Saint-Georges", -"Roz-Landrieux", "Rozoy-Bellevalle", "Rozoy-le-Vieil", "Rozoy-sur-Serre", -"Roz-sur-Couesnon", -"RS-232", +"Roézé-sur-Sarthe", +"Roôcourt-la-Côte", "Ruan-sur-Egvonne", "Rubécourt-et-Lamécourt", "Rudeau-Ladosse", "Rudolfstetten-Friedlisberg", -"Rüdtligen-Alchenflüh", -"Rueil-la-Gadelière", "Rueil-Malmaison", +"Rueil-la-Gadelière", "Ruelle-sur-Touvre", "Rueyres-les-Prés", "Ruffey-le-Château", @@ -21584,14 +11488,10 @@ FR_BASE_EXCEPTIONS = [ "Ruffey-lès-Echirey", "Ruffey-lès-Échirey", "Ruffey-sur-Seille", -"rufino-sulfurique", -"rufino-sulfuriques", -"Ruillé-en-Champagne", "Ruillé-Froid-Fonds", +"Ruillé-en-Champagne", "Ruillé-le-Gravelais", "Ruillé-sur-Loir", -"ruine-babine", -"ruine-babines", "Rullac-Saint-Cirq", "Rumersheim-le-Haut", "Rumilly-en-Cambrésis", @@ -21604,26 +11504,42 @@ FR_BASE_EXCEPTIONS = [ "Rupt-sur-Othain", "Rupt-sur-Saône", "Rurange-lès-Thionville", -"russo-allemand", -"russo-allemande", -"russo-allemandes", -"russo-allemands", -"russo-américain", -"russo-japonaise", -"russo-polonaise", "Russy-Bémont", "Ruttersdorf-Lotschen", -"rü'üsá", +"Ruy-Montceau", "Ruynes-en-Margeride", -"R.-V.", +"Râlé-Poussé", +"Réaup-Lisse", +"Réchicourt-la-Petite", +"Réchicourt-le-Château", +"Récourt-le-Creux", +"Réez-Fosse-Martin", +"Régis-Borgien", +"Régis-Borgienne", +"Régis-Borgiennes", +"Régis-Borgiens", +"Régnié-Durette", +"Rémalard-en-Perche", +"Rémering-lès-Hargarten", +"Rémering-lès-Puttelange", +"Rémondans-Vaivre", +"Rémy-Montais", +"Rémy-Montaise", +"Rémy-Montaises", +"Réville-aux-Bois", +"Rödersheim-Gronau", +"Rötsweiler-Nockenthal", +"Rüdtligen-Alchenflüh", "S-6-verbénol", -"Saâcy-sur-Marne", +"S-chanf", +"S-métolachlore", +"S.-E.", +"S.-W.", "Saalburg-Ebersdorf", "Saaldorf-Surheim", "Saale-Holzland", "Saale-Orla", "Saalfeld-Rudolstadt", -"Saâne-Saint-Just", "Saar-Mark", "Saas-Almagell", "Saas-Balen", @@ -21631,132 +11547,3627 @@ FR_BASE_EXCEPTIONS = [ "Saas-Grund", "Sabadel-Latronquière", "Sabadel-Lauzès", -"sa'ban", -"Sablé-sur-Sarthe", "Sablons-sur-Huisne", -"sabre-peuple", -"saccharo-glycose", +"Sablé-sur-Sarthe", "Saceda-Trasierra", "Sacierges-Saint-Martin", -"sac-jacking", "Saconin-et-Breuil", -"sac-poubelle", -"sacré-coeur", -"sacré-cœur", "Sacré-Cœur", "Sacré-Cœurin", "Sacré-Cœurois", -"sacro-iliaques", -"sacro-lombaire", -"sacro-saint", -"sacro-sainte", -"sacro-saintement", -"sacro-saintes", -"sacro-saints", -"sacro-vertébral", -"sacs-poubelle", -"sacs-poubelles", "Sacy-le-Grand", "Sacy-le-Petit", -"sado-maso", -"sado-masochisme", -"sado-masochiste", -"sado-masochistes", -"safari-parc", -"safari-parcs", -"sage-femme", -"sage-homme", -"sages-femmes", "Sagnes-et-Goudoulet", "Saguenay-Jeannois", "Saguenay-Lac-Saint-Jean", -"sahélo-saharien", -"sahélo-saharienne", -"sahélo-sahariennes", -"sahélo-sahariens", -"saigne-nez", -"Saillat-sur-Vienne", "Sail-les-Bains", +"Sail-sous-Couzan", +"Saillat-sur-Vienne", "Sailly-Achâtel", -"Sailly-au-Bois", -"Sailly-en-Ostrevent", "Sailly-Flibeaucourt", "Sailly-Labourse", "Sailly-Laurette", +"Sailly-Saillisel", +"Sailly-au-Bois", +"Sailly-en-Ostrevent", "Sailly-le-Sec", "Sailly-lez-Cambrai", "Sailly-lez-Lannoy", -"Sailly-Saillisel", "Sailly-sur-la-Lys", -"Sail-sous-Couzan", "Sain-Bel", -"sain-belois", "Sain-Belois", -"sain-beloise", "Sain-Beloise", -"sain-beloises", "Sain-Beloises", -"sain-bois", "Saincaize-Meauce", -"sain-foin", "Sainghin-en-Mélantois", "Sainghin-en-Weppes", +"Sains-Morainvillers", +"Sains-Richaumont", "Sains-du-Nord", "Sains-en-Amiénois", "Sains-en-Gohelle", "Sains-lès-Fressin", "Sains-lès-Marquion", "Sains-lès-Pernes", -"Sains-Morainvillers", -"Sains-Richaumont", +"Saint Antoine l'Abbaye", +"Saint Aulaye-Puymangou", +"Saint Geniez d'Olt et d'Aubrac", +"Saint Martin de l'If", +"Saint-Abit", +"Saint-Abraham", +"Saint-Acheul", +"Saint-Adjutory", +"Saint-Adrien", +"Saint-Affrique", +"Saint-Affrique-les-Montagnes", +"Saint-Agathon", +"Saint-Agil", +"Saint-Agnan", +"Saint-Agnan-de-Cernières", +"Saint-Agnan-en-Vercors", +"Saint-Agnan-sur-Sarthe", +"Saint-Agnant", +"Saint-Agnant-de-Versillat", +"Saint-Agnant-près-Crocq", +"Saint-Agne", +"Saint-Agnet", +"Saint-Agnin-sur-Bion", +"Saint-Agoulin", +"Saint-Agrève", +"Saint-Aignan", +"Saint-Aignan-Grandlieu", +"Saint-Aignan-de-Couptrain", +"Saint-Aignan-de-Cramesnil", +"Saint-Aignan-des-Gués", +"Saint-Aignan-des-Noyers", +"Saint-Aignan-le-Jaillard", +"Saint-Aignan-sur-Roë", +"Saint-Aignan-sur-Ry", +"Saint-Aigny", +"Saint-Aigulin", +"Saint-Ail", +"Saint-Albain", +"Saint-Alban", +"Saint-Alban-Auriolles", +"Saint-Alban-Leysse", +"Saint-Alban-d'Ay", +"Saint-Alban-d'Hurtières", +"Saint-Alban-de-Montbel", +"Saint-Alban-de-Roche", +"Saint-Alban-des-Villards", +"Saint-Alban-du-Rhône", +"Saint-Alban-en-Montagne", +"Saint-Alban-les-Eaux", +"Saint-Alban-sur-Limagnole", +"Saint-Albin-de-Vaulserre", +"Saint-Alexandre", +"Saint-Algis", +"Saint-Allouestre", +"Saint-Alpinien", +"Saint-Alyre-d'Arlanc", +"Saint-Alyre-ès-Montagne", +"Saint-Amadou", +"Saint-Amancet", +"Saint-Amand", +"Saint-Amand-Jartoudeix", +"Saint-Amand-Longpré", +"Saint-Amand-Magnazeix", +"Saint-Amand-Montrond", +"Saint-Amand-de-Coly", +"Saint-Amand-de-Vergt", +"Saint-Amand-en-Puisaye", +"Saint-Amand-le-Petit", +"Saint-Amand-les-Eaux", +"Saint-Amand-sur-Fion", +"Saint-Amand-sur-Ornain", +"Saint-Amand-sur-Sèvre", +"Saint-Amandin", +"Saint-Amans", +"Saint-Amans-Soult", +"Saint-Amans-Valtoret", +"Saint-Amans-de-Pellagal", +"Saint-Amans-des-Cots", +"Saint-Amans-du-Pech", +"Saint-Amant-Roche-Savine", +"Saint-Amant-Tallende", +"Saint-Amant-de-Boixe", +"Saint-Amant-de-Bonnieure", +"Saint-Amant-de-Montmoreau", +"Saint-Amant-de-Nouère", +"Saint-Amarin", +"Saint-Ambreuil", +"Saint-Ambroix", +"Saint-Amour", +"Saint-Amour-Bellevue", +"Saint-Amé", +"Saint-Andelain", +"Saint-Andeux", +"Saint-Andiol", +"Saint-Androny", +"Saint-André", +"Saint-André-Capcèze", +"Saint-André-Farivillers", +"Saint-André-Goule-d'Oie", +"Saint-André-Lachamp", +"Saint-André-d'Allas", +"Saint-André-d'Apchon", +"Saint-André-d'Embrun", +"Saint-André-d'Huiriat", +"Saint-André-d'Hébertot", +"Saint-André-d'Olérargues", +"Saint-André-de-Bohon", +"Saint-André-de-Boëge", +"Saint-André-de-Briouze", +"Saint-André-de-Buèges", +"Saint-André-de-Bâgé", +"Saint-André-de-Chalencon", +"Saint-André-de-Corcy", +"Saint-André-de-Cruzières", +"Saint-André-de-Cubzac", +"Saint-André-de-Double", +"Saint-André-de-Lancize", +"Saint-André-de-Lidon", +"Saint-André-de-Majencoules", +"Saint-André-de-Messei", +"Saint-André-de-Najac", +"Saint-André-de-Roquelongue", +"Saint-André-de-Roquepertuis", +"Saint-André-de-Rosans", +"Saint-André-de-Sangonis", +"Saint-André-de-Seignanx", +"Saint-André-de-Valborgne", +"Saint-André-de-Vézines", +"Saint-André-de-l'Eure", +"Saint-André-de-l'Épine", +"Saint-André-de-la-Roche", +"Saint-André-des-Eaux", +"Saint-André-du-Bois", +"Saint-André-en-Barrois", +"Saint-André-en-Bresse", +"Saint-André-en-Morvan", +"Saint-André-en-Royans", +"Saint-André-en-Terre-Plaine", +"Saint-André-en-Vivarais", +"Saint-André-et-Appelles", +"Saint-André-la-Côte", +"Saint-André-le-Bouchoux", +"Saint-André-le-Coq", +"Saint-André-le-Désert", +"Saint-André-le-Gaz", +"Saint-André-le-Puy", +"Saint-André-les-Alpes", +"Saint-André-les-Vergers", +"Saint-André-lez-Lille", +"Saint-André-sur-Cailly", +"Saint-André-sur-Orne", +"Saint-André-sur-Sèvre", +"Saint-André-sur-Vieux-Jonc", +"Saint-Andéol", +"Saint-Andéol-de-Berg", +"Saint-Andéol-de-Fourchades", +"Saint-Andéol-de-Vals", +"Saint-Andéol-le-Château", +"Saint-Ange-et-Torçay", +"Saint-Ange-le-Viel", +"Saint-Angeau", +"Saint-Angel", +"Saint-Anthot", +"Saint-Anthème", +"Saint-Antoine", +"Saint-Antoine-Cumond", +"Saint-Antoine-d'Auberoche", +"Saint-Antoine-de-Breuilh", +"Saint-Antoine-de-Ficalba", +"Saint-Antoine-du-Queyret", +"Saint-Antoine-du-Rocher", +"Saint-Antoine-la-Forêt", +"Saint-Antoine-sur-l'Isle", +"Saint-Antonin", +"Saint-Antonin-Noble-Val", +"Saint-Antonin-de-Lacalm", +"Saint-Antonin-de-Sommaire", +"Saint-Antonin-du-Var", +"Saint-Antonin-sur-Bayon", +"Saint-Aoustrille", +"Saint-Août", +"Saint-Apollinaire", +"Saint-Apollinaire-de-Rias", +"Saint-Appolinaire", +"Saint-Appolinard", +"Saint-Aquilin", +"Saint-Aquilin-de-Corbion", +"Saint-Aquilin-de-Pacy", +"Saint-Araille", +"Saint-Arailles", +"Saint-Arcons-d'Allier", +"Saint-Arcons-de-Barges", +"Saint-Arey", +"Saint-Armel", +"Saint-Armou", +"Saint-Arnac", +"Saint-Arnoult", +"Saint-Arnoult-des-Bois", +"Saint-Arnoult-en-Yvelines", +"Saint-Arroman", +"Saint-Arroumex", +"Saint-Astier", +"Saint-Auban", +"Saint-Auban-d'Oze", +"Saint-Auban-sur-l'Ouvèze", +"Saint-Aubert", +"Saint-Aubin", +"Saint-Aubin-Celloville", +"Saint-Aubin-Fosse-Louvain", +"Saint-Aubin-Montenoy", +"Saint-Aubin-Rivière", +"Saint-Aubin-Routot", +"Saint-Aubin-d'Appenai", +"Saint-Aubin-d'Arquenay", +"Saint-Aubin-d'Aubigné", +"Saint-Aubin-d'Écrosville", +"Saint-Aubin-de-Blaye", +"Saint-Aubin-de-Bonneval", +"Saint-Aubin-de-Branne", +"Saint-Aubin-de-Cadelech", +"Saint-Aubin-de-Courteraie", +"Saint-Aubin-de-Crétot", +"Saint-Aubin-de-Lanquais", +"Saint-Aubin-de-Locquenay", +"Saint-Aubin-de-Médoc", +"Saint-Aubin-de-Nabirat", +"Saint-Aubin-de-Scellon", +"Saint-Aubin-de-Terregatte", +"Saint-Aubin-des-Bois", +"Saint-Aubin-des-Chaumes", +"Saint-Aubin-des-Châteaux", +"Saint-Aubin-des-Coudrais", +"Saint-Aubin-des-Landes", +"Saint-Aubin-des-Ormeaux", +"Saint-Aubin-des-Préaux", +"Saint-Aubin-du-Cormier", +"Saint-Aubin-du-Désert", +"Saint-Aubin-du-Pavail", +"Saint-Aubin-du-Perron", +"Saint-Aubin-du-Plain", +"Saint-Aubin-du-Thenney", +"Saint-Aubin-en-Bray", +"Saint-Aubin-en-Charollais", +"Saint-Aubin-la-Plaine", +"Saint-Aubin-le-Cauf", +"Saint-Aubin-le-Cloud", +"Saint-Aubin-le-Dépeint", +"Saint-Aubin-le-Monial", +"Saint-Aubin-le-Vertueux", +"Saint-Aubin-les-Forges", +"Saint-Aubin-lès-Elbeuf", +"Saint-Aubin-sous-Erquery", +"Saint-Aubin-sur-Aire", +"Saint-Aubin-sur-Gaillon", +"Saint-Aubin-sur-Loire", +"Saint-Aubin-sur-Mer", +"Saint-Aubin-sur-Quillebeuf", +"Saint-Aubin-sur-Scie", +"Saint-Aubin-sur-Yonne", +"Saint-Aubin-Épinay", +"Saint-Augustin", +"Saint-Augustin-des-Bois", +"Saint-Aulaire", +"Saint-Aulais-la-Chapelle", +"Saint-Aunix-Lengros", +"Saint-Aunès", +"Saint-Aupre", +"Saint-Austremoine", +"Saint-Auvent", +"Saint-Avaugourd-des-Landes", +"Saint-Aventin", +"Saint-Avertin", +"Saint-Avit", +"Saint-Avit-Frandat", +"Saint-Avit-Rivière", +"Saint-Avit-Saint-Nazaire", +"Saint-Avit-Sénieur", +"Saint-Avit-de-Soulège", +"Saint-Avit-de-Tardes", +"Saint-Avit-de-Vialard", +"Saint-Avit-le-Pauvre", +"Saint-Avit-les-Guespières", +"Saint-Avold", +"Saint-Avre", +"Saint-Avé", +"Saint-Ay", +"Saint-Aybert", +"Saint-Babel", +"Saint-Baldoph", +"Saint-Bandry", +"Saint-Baraing", +"Saint-Barbant", +"Saint-Bard", +"Saint-Bardoux", +"Saint-Barnabé", +"Saint-Barthélemy", +"Saint-Barthélemy-Grozon", +"Saint-Barthélemy-Lestra", +"Saint-Barthélemy-d'Agenais", +"Saint-Barthélemy-d'Anjou", +"Saint-Barthélemy-de-Bellegarde", +"Saint-Barthélemy-de-Bussière", +"Saint-Barthélemy-de-Séchilienne", +"Saint-Barthélemy-de-Vals", +"Saint-Barthélemy-le-Meil", +"Saint-Barthélemy-le-Plain", +"Saint-Basile", +"Saint-Baslemont", +"Saint-Baudel", +"Saint-Baudelle", +"Saint-Baudille-de-la-Tour", +"Saint-Baudille-et-Pipet", +"Saint-Bauld", +"Saint-Baussant", +"Saint-Bauzeil", +"Saint-Bauzile", +"Saint-Bauzille-de-Montmel", +"Saint-Bauzille-de-Putois", +"Saint-Bauzille-de-la-Sylve", +"Saint-Bauzély", +"Saint-Bazile", +"Saint-Bazile-de-Meyssac", +"Saint-Bazile-de-la-Roche", +"Saint-Beaulize", +"Saint-Beauzeil", +"Saint-Beauzile", +"Saint-Beauzire", +"Saint-Beauzély", +"Saint-Benin", +"Saint-Benin-d'Azy", +"Saint-Benin-des-Bois", +"Saint-Benoist-sur-Mer", +"Saint-Benoist-sur-Vanne", +"Saint-Benoit-en-Diois", +"Saint-Benoît", +"Saint-Benoît-d'Hébertot", +"Saint-Benoît-de-Carmaux", +"Saint-Benoît-des-Ombres", +"Saint-Benoît-des-Ondes", +"Saint-Benoît-du-Sault", +"Saint-Benoît-la-Chipotte", +"Saint-Benoît-la-Forêt", +"Saint-Benoît-sur-Loire", +"Saint-Benoît-sur-Seine", +"Saint-Berain-sous-Sanvignes", +"Saint-Bernard", +"Saint-Berthevin", +"Saint-Berthevin-la-Tannière", +"Saint-Bertrand-de-Comminges", +"Saint-Biez-en-Belin", +"Saint-Bihy", +"Saint-Blaise", +"Saint-Blaise-du-Buis", +"Saint-Blaise-la-Roche", +"Saint-Blancard", +"Saint-Blimont", +"Saint-Blin", +"Saint-Bohaire", +"Saint-Boil", +"Saint-Boingt", +"Saint-Bomer", +"Saint-Bon", +"Saint-Bon-Tarentaise", +"Saint-Bonnet", +"Saint-Bonnet-Avalouze", +"Saint-Bonnet-Briance", +"Saint-Bonnet-Elvert", +"Saint-Bonnet-Tronçais", +"Saint-Bonnet-de-Bellac", +"Saint-Bonnet-de-Chavagne", +"Saint-Bonnet-de-Chirac", +"Saint-Bonnet-de-Condat", +"Saint-Bonnet-de-Cray", +"Saint-Bonnet-de-Four", +"Saint-Bonnet-de-Joux", +"Saint-Bonnet-de-Montauroux", +"Saint-Bonnet-de-Mure", +"Saint-Bonnet-de-Rochefort", +"Saint-Bonnet-de-Salendrinque", +"Saint-Bonnet-de-Salers", +"Saint-Bonnet-de-Valclérieux", +"Saint-Bonnet-de-Vieille-Vigne", +"Saint-Bonnet-des-Bruyères", +"Saint-Bonnet-des-Quarts", +"Saint-Bonnet-du-Gard", +"Saint-Bonnet-en-Bresse", +"Saint-Bonnet-en-Champsaur", +"Saint-Bonnet-l'Enfantier", +"Saint-Bonnet-la-Rivière", +"Saint-Bonnet-le-Bourg", +"Saint-Bonnet-le-Chastel", +"Saint-Bonnet-le-Château", +"Saint-Bonnet-le-Courreau", +"Saint-Bonnet-le-Froid", +"Saint-Bonnet-le-Troncy", +"Saint-Bonnet-les-Oules", +"Saint-Bonnet-les-Tours-de-Merle", +"Saint-Bonnet-lès-Allier", +"Saint-Bonnet-près-Bort", +"Saint-Bonnet-près-Orcival", +"Saint-Bonnet-près-Riom", +"Saint-Bonnet-sur-Gironde", +"Saint-Bonnot", +"Saint-Bouize", +"Saint-Boès", +"Saint-Brancher", +"Saint-Branchs", +"Saint-Brandan", +"Saint-Bresson", +"Saint-Bressou", +"Saint-Brevin-les-Pins", +"Saint-Briac-sur-Mer", +"Saint-Brice", +"Saint-Brice-Courcelles", +"Saint-Brice-de-Landelles", +"Saint-Brice-en-Coglès", +"Saint-Brice-sous-Forêt", +"Saint-Brice-sous-Rânes", +"Saint-Brice-sur-Vienne", +"Saint-Brieuc", +"Saint-Brieuc-de-Mauron", +"Saint-Brieuc-des-Iffs", +"Saint-Bris-des-Bois", +"Saint-Bris-le-Vineux", +"Saint-Brisson", +"Saint-Brisson-sur-Loire", +"Saint-Broing", +"Saint-Broing-les-Moines", +"Saint-Broingt-le-Bois", +"Saint-Broingt-les-Fosses", +"Saint-Broladre", +"Saint-Brès", +"Saint-Bueil", +"Saint-Béat", +"Saint-Bénigne", +"Saint-Bénézet", +"Saint-Bérain", +"Saint-Bérain-sur-Dheune", +"Saint-Béron", +"Saint-Bômer-les-Forges", +"Saint-Calais", +"Saint-Calais-du-Désert", +"Saint-Calez-en-Saosnois", +"Saint-Cannat", +"Saint-Caprais", +"Saint-Caprais-de-Blaye", +"Saint-Caprais-de-Bordeaux", +"Saint-Caprais-de-Lerm", +"Saint-Capraise-d'Eymet", +"Saint-Capraise-de-Lalinde", +"Saint-Caradec", +"Saint-Caradec-Trégomel", +"Saint-Carné", +"Saint-Carreuc", +"Saint-Cassien", +"Saint-Cassin", +"Saint-Cast-le-Guildo", +"Saint-Castin", +"Saint-Cergues", +"Saint-Cernin", +"Saint-Cernin-de-Labarde", +"Saint-Cernin-de-Larche", +"Saint-Cernin-de-l'Herm", +"Saint-Chabrais", +"Saint-Chaffrey", +"Saint-Chamant", +"Saint-Chamarand", +"Saint-Chamas", +"Saint-Chamassy", +"Saint-Chamond", +"Saint-Champ", +"Saint-Chaptes", +"Saint-Charles-la-Forêt", +"Saint-Chartier", +"Saint-Chef", +"Saint-Chels", +"Saint-Chinian", +"Saint-Christ-Briost", +"Saint-Christaud", +"Saint-Christo-en-Jarez", +"Saint-Christol", +"Saint-Christol-de-Rodières", +"Saint-Christol-lès-Alès", +"Saint-Christoly-Médoc", +"Saint-Christoly-de-Blaye", +"Saint-Christophe", +"Saint-Christophe-Dodinicourt", +"Saint-Christophe-Vallon", +"Saint-Christophe-d'Allier", +"Saint-Christophe-de-Chaulieu", +"Saint-Christophe-de-Double", +"Saint-Christophe-de-Valains", +"Saint-Christophe-des-Bardes", +"Saint-Christophe-des-Bois", +"Saint-Christophe-du-Bois", +"Saint-Christophe-du-Foc", +"Saint-Christophe-du-Jambet", +"Saint-Christophe-du-Ligneron", +"Saint-Christophe-du-Luat", +"Saint-Christophe-en-Bazelle", +"Saint-Christophe-en-Boucherie", +"Saint-Christophe-en-Bresse", +"Saint-Christophe-en-Brionnais", +"Saint-Christophe-en-Champagne", +"Saint-Christophe-en-Oisans", +"Saint-Christophe-et-le-Laris", +"Saint-Christophe-le-Chaudry", +"Saint-Christophe-sur-Avre", +"Saint-Christophe-sur-Condé", +"Saint-Christophe-sur-Dolaison", +"Saint-Christophe-sur-Guiers", +"Saint-Christophe-sur-Roc", +"Saint-Christophe-sur-le-Nais", +"Saint-Christophe-à-Berry", +"Saint-Chély-d'Apcher", +"Saint-Chély-d'Aubrac", +"Saint-Chéron", +"Saint-Cibard", +"Saint-Cierge-la-Serre", +"Saint-Cierge-sous-le-Cheylard", +"Saint-Ciergues", +"Saint-Ciers-Champagne", +"Saint-Ciers-d'Abzac", +"Saint-Ciers-de-Canesse", +"Saint-Ciers-du-Taillon", +"Saint-Ciers-sur-Bonnieure", +"Saint-Ciers-sur-Gironde", +"Saint-Cirgue", +"Saint-Cirgues", +"Saint-Cirgues-de-Jordanne", +"Saint-Cirgues-de-Malbert", +"Saint-Cirgues-de-Prades", +"Saint-Cirgues-en-Montagne", +"Saint-Cirgues-la-Loutre", +"Saint-Cirgues-sur-Couze", +"Saint-Cirice", +"Saint-Cirq", +"Saint-Cirq-Lapopie", +"Saint-Cirq-Madelon", +"Saint-Cirq-Souillaguet", +"Saint-Civran", +"Saint-Clair", +"Saint-Clair-d'Arcey", +"Saint-Clair-de-Halouze", +"Saint-Clair-de-la-Tour", +"Saint-Clair-du-Rhône", +"Saint-Clair-sur-Epte", +"Saint-Clair-sur-Galaure", +"Saint-Clair-sur-l'Elle", +"Saint-Clair-sur-les-Monts", +"Saint-Clar", +"Saint-Clar-de-Rivière", +"Saint-Claud", +"Saint-Claude", +"Saint-Claude-de-Diray", +"Saint-Clet", +"Saint-Cloud", +"Saint-Cloud-en-Dunois", +"Saint-Clément", +"Saint-Clément-Rancoudray", +"Saint-Clément-de-Rivière", +"Saint-Clément-de-Régnat", +"Saint-Clément-de-Valorgue", +"Saint-Clément-de-Vers", +"Saint-Clément-de-la-Place", +"Saint-Clément-des-Baleines", +"Saint-Clément-des-Levées", +"Saint-Clément-les-Places", +"Saint-Clément-sur-Durance", +"Saint-Clément-sur-Guye", +"Saint-Clément-sur-Valsonne", +"Saint-Clément-à-Arnes", +"Saint-Colomb-de-Lauzun", +"Saint-Colomban", +"Saint-Colomban-des-Villards", +"Saint-Congard", +"Saint-Connan", +"Saint-Connec", +"Saint-Constant-Fournoulès", +"Saint-Contest", +"Saint-Corneille", +"Saint-Cosme", +"Saint-Cosme-en-Vairais", +"Saint-Couat-d'Aude", +"Saint-Couat-du-Razès", +"Saint-Coulitz", +"Saint-Coulomb", +"Saint-Coutant", +"Saint-Coutant-le-Grand", +"Saint-Crespin", +"Saint-Cricq", +"Saint-Cricq-Chalosse", +"Saint-Cricq-Villeneuve", +"Saint-Cricq-du-Gave", +"Saint-Créac", +"Saint-Crépin", +"Saint-Crépin-Ibouvillers", +"Saint-Crépin-aux-Bois", +"Saint-Crépin-d'Auberoche", +"Saint-Crépin-de-Richemont", +"Saint-Crépin-et-Carlucet", +"Saint-Cybardeaux", +"Saint-Cybranet", +"Saint-Cyprien", +"Saint-Cyr", +"Saint-Cyr-Montmalin", +"Saint-Cyr-au-Mont-d'Or", +"Saint-Cyr-de-Favières", +"Saint-Cyr-de-Salerne", +"Saint-Cyr-de-Valorges", +"Saint-Cyr-des-Gâts", +"Saint-Cyr-du-Bailleul", +"Saint-Cyr-du-Doret", +"Saint-Cyr-du-Gault", +"Saint-Cyr-en-Arthies", +"Saint-Cyr-en-Bourg", +"Saint-Cyr-en-Pail", +"Saint-Cyr-en-Talmondais", +"Saint-Cyr-en-Val", +"Saint-Cyr-l'École", +"Saint-Cyr-la-Campagne", +"Saint-Cyr-la-Lande", +"Saint-Cyr-la-Rivière", +"Saint-Cyr-la-Roche", +"Saint-Cyr-la-Rosière", +"Saint-Cyr-le-Chatoux", +"Saint-Cyr-le-Gravelais", +"Saint-Cyr-les-Champagnes", +"Saint-Cyr-les-Colons", +"Saint-Cyr-les-Vignes", +"Saint-Cyr-sous-Dourdan", +"Saint-Cyr-sur-Loire", +"Saint-Cyr-sur-Menthon", +"Saint-Cyr-sur-Mer", +"Saint-Cyr-sur-Morin", +"Saint-Cyr-sur-le-Rhône", +"Saint-Cyran-du-Jambot", +"Saint-Célerin", +"Saint-Céneri-le-Gérei", +"Saint-Céneré", +"Saint-Céols", +"Saint-Céré", +"Saint-Césaire", +"Saint-Césaire-de-Gauzignan", +"Saint-Cézaire-sur-Siagne", +"Saint-Cézert", +"Saint-Côme", +"Saint-Côme-d'Olt", +"Saint-Côme-de-Fresné", +"Saint-Côme-et-Maruéjols", +"Saint-Dalmas-le-Selvage", +"Saint-Daunès", +"Saint-Denis", +"Saint-Denis-Catus", +"Saint-Denis-Combarnazat", +"Saint-Denis-d'Aclon", +"Saint-Denis-d'Anjou", +"Saint-Denis-d'Augerons", +"Saint-Denis-d'Authou", +"Saint-Denis-d'Oléron", +"Saint-Denis-d'Orques", +"Saint-Denis-de-Cabanne", +"Saint-Denis-de-Gastines", +"Saint-Denis-de-Jouhet", +"Saint-Denis-de-Mailloc", +"Saint-Denis-de-Méré", +"Saint-Denis-de-Palin", +"Saint-Denis-de-Pile", +"Saint-Denis-de-Vaux", +"Saint-Denis-de-l'Hôtel", +"Saint-Denis-des-Coudrais", +"Saint-Denis-des-Monts", +"Saint-Denis-des-Murs", +"Saint-Denis-des-Puits", +"Saint-Denis-du-Maine", +"Saint-Denis-du-Payré", +"Saint-Denis-en-Bugey", +"Saint-Denis-en-Margeride", +"Saint-Denis-en-Val", +"Saint-Denis-la-Chevasse", +"Saint-Denis-le-Ferment", +"Saint-Denis-le-Gast", +"Saint-Denis-le-Thiboult", +"Saint-Denis-le-Vêtu", +"Saint-Denis-les-Ponts", +"Saint-Denis-lès-Bourg", +"Saint-Denis-lès-Martel", +"Saint-Denis-lès-Rebais", +"Saint-Denis-lès-Sens", +"Saint-Denis-sur-Coise", +"Saint-Denis-sur-Huisne", +"Saint-Denis-sur-Loire", +"Saint-Denis-sur-Sarthon", +"Saint-Denis-sur-Scie", +"Saint-Deniscourt", +"Saint-Denoual", +"Saint-Denœux", +"Saint-Derrien", +"Saint-Didier", +"Saint-Didier-au-Mont-d'Or", +"Saint-Didier-d'Allier", +"Saint-Didier-d'Aussiat", +"Saint-Didier-de-Bizonnes", +"Saint-Didier-de-Formans", +"Saint-Didier-de-la-Tour", +"Saint-Didier-des-Bois", +"Saint-Didier-en-Bresse", +"Saint-Didier-en-Brionnais", +"Saint-Didier-en-Donjon", +"Saint-Didier-en-Velay", +"Saint-Didier-la-Forêt", +"Saint-Didier-sous-Aubenas", +"Saint-Didier-sous-Riverie", +"Saint-Didier-sous-Écouves", +"Saint-Didier-sur-Arroux", +"Saint-Didier-sur-Beaujeu", +"Saint-Didier-sur-Chalaronne", +"Saint-Didier-sur-Doulon", +"Saint-Didier-sur-Rochefort", +"Saint-Dier-d'Auvergne", +"Saint-Dionisy", +"Saint-Divy", +"Saint-Dizant-du-Bois", +"Saint-Dizant-du-Gua", +"Saint-Dizier", +"Saint-Dizier-Leyrenne", +"Saint-Dizier-en-Diois", +"Saint-Dizier-l'Évêque", +"Saint-Dizier-la-Tour", +"Saint-Dizier-les-Domaines", +"Saint-Dié-des-Vosges", +"Saint-Diéry", +"Saint-Dolay", +"Saint-Domet", +"Saint-Domineuc", +"Saint-Donan", +"Saint-Donat", +"Saint-Donat-sur-l'Herbasse", +"Saint-Dos", +"Saint-Doulchard", +"Saint-Drézéry", +"Saint-Dyé-sur-Loire", +"Saint-Désert", +"Saint-Désir", +"Saint-Désirat", +"Saint-Désiré", +"Saint-Dézéry", +"Saint-Edmond", +"Saint-Ellier-du-Maine", +"Saint-Ellier-les-Bois", +"Saint-Eloy", +"Saint-Ennemond", +"Saint-Epvre", +"Saint-Erblon", +"Saint-Erme-Outre-et-Ramecourt", +"Saint-Escobille", +"Saint-Esprit", +"Saint-Esteben", +"Saint-Estèphe", +"Saint-Estève", +"Saint-Estève-Janson", +"Saint-Eugène", +"Saint-Eulien", +"Saint-Euphraise-et-Clairizet", +"Saint-Euphrône", +"Saint-Eustache", +"Saint-Eustache-la-Forêt", +"Saint-Eusèbe", +"Saint-Eusèbe-en-Champsaur", +"Saint-Eutrope", +"Saint-Eutrope-de-Born", +"Saint-Evroult-Notre-Dame-du-Bois", +"Saint-Evroult-de-Montfort", +"Saint-Exupéry", +"Saint-Exupéry-les-Roches", +"Saint-Fargeau", +"Saint-Fargeau-Ponthierry", +"Saint-Fargeol", +"Saint-Faust", +"Saint-Fergeux", +"Saint-Ferjeux", +"Saint-Ferme", +"Saint-Ferriol", +"Saint-Ferréol", +"Saint-Ferréol-Trente-Pas", +"Saint-Ferréol-d'Auroure", +"Saint-Ferréol-de-Comminges", +"Saint-Ferréol-des-Côtes", +"Saint-Fiacre", +"Saint-Fiacre-sur-Maine", +"Saint-Fiel", +"Saint-Firmin", +"Saint-Firmin-des-Bois", +"Saint-Firmin-des-Prés", +"Saint-Firmin-sur-Loire", +"Saint-Flavy", +"Saint-Florent", +"Saint-Florent-sur-Auzonnet", +"Saint-Florent-sur-Cher", +"Saint-Florentin", +"Saint-Floret", +"Saint-Floris", +"Saint-Flour", +"Saint-Flour-de-Mercoire", +"Saint-Flovier", +"Saint-Floxel", +"Saint-Folquin", +"Saint-Fons", +"Saint-Forgeot", +"Saint-Forget", +"Saint-Forgeux", +"Saint-Forgeux-Lespinasse", +"Saint-Fort", +"Saint-Fort-sur-Gironde", +"Saint-Fort-sur-le-Né", +"Saint-Fortunat-sur-Eyrieux", +"Saint-Fraigne", +"Saint-Fraimbault", +"Saint-Fraimbault-de-Prières", +"Saint-Frajou", +"Saint-Franc", +"Saint-Franchy", +"Saint-François", +"Saint-François-Lacroix", +"Saint-François-Longchamp", +"Saint-François-de-Sales", +"Saint-Frichoux", +"Saint-Frion", +"Saint-Fromond", +"Saint-Front", +"Saint-Front-d'Alemps", +"Saint-Front-de-Pradoux", +"Saint-Front-la-Rivière", +"Saint-Front-sur-Lémance", +"Saint-Front-sur-Nizonne", +"Saint-Froult", +"Saint-Frégant", +"Saint-Fréjoux", +"Saint-Frézal-d'Albuges", +"Saint-Fulgent", +"Saint-Fulgent-des-Ormes", +"Saint-Fuscien", +"Saint-Félicien", +"Saint-Féliu-d'Amont", +"Saint-Féliu-d'Avall", +"Saint-Félix", +"Saint-Félix-Lauragais", +"Saint-Félix-de-Bourdeilles", +"Saint-Félix-de-Foncaude", +"Saint-Félix-de-Lodez", +"Saint-Félix-de-Lunel", +"Saint-Félix-de-Pallières", +"Saint-Félix-de-Reillac-et-Mortemart", +"Saint-Félix-de-Rieutord", +"Saint-Félix-de-Sorgues", +"Saint-Félix-de-Tournegat", +"Saint-Félix-de-Villadeix", +"Saint-Félix-de-l'Héras", +"Saint-Gabriel-Brécy", +"Saint-Gal", +"Saint-Gal-sur-Sioule", +"Saint-Galmier", +"Saint-Gand", +"Saint-Ganton", +"Saint-Gatien-des-Bois", +"Saint-Gaudens", +"Saint-Gaudent", +"Saint-Gaudéric", +"Saint-Gaultier", +"Saint-Gauzens", +"Saint-Gein", +"Saint-Gelais", +"Saint-Gelven", +"Saint-Gence", +"Saint-Genest", +"Saint-Genest-Lachamp", +"Saint-Genest-Lerpt", +"Saint-Genest-Malifaux", +"Saint-Genest-d'Ambière", +"Saint-Genest-de-Beauzon", +"Saint-Genest-de-Contest", +"Saint-Genest-sur-Roselle", +"Saint-Geneys-près-Saint-Paulien", +"Saint-Gengoulph", +"Saint-Gengoux-de-Scissé", +"Saint-Gengoux-le-National", +"Saint-Geniez", +"Saint-Geniez-ô-Merle", +"Saint-Genis-Laval", +"Saint-Genis-Pouilly", +"Saint-Genis-d'Hiersac", +"Saint-Genis-de-Saintonge", +"Saint-Genis-du-Bois", +"Saint-Genis-l'Argentière", +"Saint-Genis-les-Ollières", +"Saint-Genis-sur-Menthon", +"Saint-Genix-sur-Guiers", +"Saint-Geniès", +"Saint-Geniès-Bellevue", +"Saint-Geniès-de-Comolas", +"Saint-Geniès-de-Fontedit", +"Saint-Geniès-de-Malgoirès", +"Saint-Geniès-de-Varensal", +"Saint-Geniès-des-Mourgues", +"Saint-Genou", +"Saint-Genouph", +"Saint-Genès-Champanelle", +"Saint-Genès-Champespe", +"Saint-Genès-de-Blaye", +"Saint-Genès-de-Castillon", +"Saint-Genès-de-Fronsac", +"Saint-Genès-de-Lombaud", +"Saint-Genès-du-Retz", +"Saint-Genès-la-Tourette", +"Saint-Geoire-en-Valdaine", +"Saint-Geoirs", +"Saint-Georges", +"Saint-Georges-Antignac", +"Saint-Georges-Armont", +"Saint-Georges-Blancaneix", +"Saint-Georges-Buttavent", +"Saint-Georges-Haute-Ville", +"Saint-Georges-Lagricol", +"Saint-Georges-Montcocq", +"Saint-Georges-Motel", +"Saint-Georges-Nigremont", +"Saint-Georges-d'Annebecq", +"Saint-Georges-d'Aurac", +"Saint-Georges-d'Elle", +"Saint-Georges-d'Espéranche", +"Saint-Georges-d'Hurtières", +"Saint-Georges-d'Oléron", +"Saint-Georges-d'Orques", +"Saint-Georges-de-Baroille", +"Saint-Georges-de-Chesné", +"Saint-Georges-de-Commiers", +"Saint-Georges-de-Didonne", +"Saint-Georges-de-Gréhaigne", +"Saint-Georges-de-Livoye", +"Saint-Georges-de-Longuepierre", +"Saint-Georges-de-Luzençon", +"Saint-Georges-de-Lévéjac", +"Saint-Georges-de-Mons", +"Saint-Georges-de-Montaigu", +"Saint-Georges-de-Montclard", +"Saint-Georges-de-Noisné", +"Saint-Georges-de-Pointindoux", +"Saint-Georges-de-Poisieux", +"Saint-Georges-de-Reintembault", +"Saint-Georges-de-Reneins", +"Saint-Georges-de-Rex", +"Saint-Georges-de-Rouelley", +"Saint-Georges-de-la-Couée", +"Saint-Georges-de-la-Rivière", +"Saint-Georges-des-Agoûts", +"Saint-Georges-des-Coteaux", +"Saint-Georges-des-Groseillers", +"Saint-Georges-du-Bois", +"Saint-Georges-du-Mesnil", +"Saint-Georges-du-Rosay", +"Saint-Georges-du-Vièvre", +"Saint-Georges-en-Auge", +"Saint-Georges-en-Couzan", +"Saint-Georges-la-Pouge", +"Saint-Georges-le-Fléchard", +"Saint-Georges-le-Gaultier", +"Saint-Georges-les-Bains", +"Saint-Georges-les-Landes", +"Saint-Georges-lès-Baillargeaux", +"Saint-Georges-sur-Allier", +"Saint-Georges-sur-Arnon", +"Saint-Georges-sur-Baulche", +"Saint-Georges-sur-Cher", +"Saint-Georges-sur-Erve", +"Saint-Georges-sur-Eure", +"Saint-Georges-sur-Fontaine", +"Saint-Georges-sur-Layon", +"Saint-Georges-sur-Loire", +"Saint-Georges-sur-Moulon", +"Saint-Georges-sur-Renon", +"Saint-Georges-sur-l'Aa", +"Saint-Georges-sur-la-Prée", +"Saint-Geours-d'Auribat", +"Saint-Geours-de-Maremne", +"Saint-Germain", +"Saint-Germain-Beaupré", +"Saint-Germain-Chassenay", +"Saint-Germain-Langot", +"Saint-Germain-Laprade", +"Saint-Germain-Laval", +"Saint-Germain-Lavolps", +"Saint-Germain-Laxis", +"Saint-Germain-Lembron", +"Saint-Germain-Lespinasse", +"Saint-Germain-Nuelles", +"Saint-Germain-Village", +"Saint-Germain-au-Mont-d'Or", +"Saint-Germain-d'Anxure", +"Saint-Germain-d'Arcé", +"Saint-Germain-d'Aunay", +"Saint-Germain-d'Ectot", +"Saint-Germain-d'Elle", +"Saint-Germain-d'Esteuil", +"Saint-Germain-d'Étables", +"Saint-Germain-de-Belvès", +"Saint-Germain-de-Calberte", +"Saint-Germain-de-Clairefeuille", +"Saint-Germain-de-Coulamer", +"Saint-Germain-de-Fresney", +"Saint-Germain-de-Grave", +"Saint-Germain-de-Joux", +"Saint-Germain-de-Livet", +"Saint-Germain-de-Longue-Chaume", +"Saint-Germain-de-Lusignan", +"Saint-Germain-de-Marencennes", +"Saint-Germain-de-Martigny", +"Saint-Germain-de-Modéon", +"Saint-Germain-de-Montbron", +"Saint-Germain-de-Pasquier", +"Saint-Germain-de-Prinçay", +"Saint-Germain-de-Salles", +"Saint-Germain-de-Tournebut", +"Saint-Germain-de-Varreville", +"Saint-Germain-de-Vibrac", +"Saint-Germain-de-la-Coudre", +"Saint-Germain-de-la-Grange", +"Saint-Germain-de-la-Rivière", +"Saint-Germain-des-Angles", +"Saint-Germain-des-Bois", +"Saint-Germain-des-Champs", +"Saint-Germain-des-Essourts", +"Saint-Germain-des-Fossés", +"Saint-Germain-des-Grois", +"Saint-Germain-des-Prés", +"Saint-Germain-des-Vaux", +"Saint-Germain-du-Bel-Air", +"Saint-Germain-du-Bois", +"Saint-Germain-du-Corbéis", +"Saint-Germain-du-Pert", +"Saint-Germain-du-Pinel", +"Saint-Germain-du-Plain", +"Saint-Germain-du-Puch", +"Saint-Germain-du-Puy", +"Saint-Germain-du-Salembre", +"Saint-Germain-du-Seudre", +"Saint-Germain-du-Teil", +"Saint-Germain-en-Brionnais", +"Saint-Germain-en-Coglès", +"Saint-Germain-en-Laye", +"Saint-Germain-en-Montagne", +"Saint-Germain-et-Mons", +"Saint-Germain-l'Herm", +"Saint-Germain-la-Blanche-Herbe", +"Saint-Germain-la-Campagne", +"Saint-Germain-la-Montagne", +"Saint-Germain-la-Poterie", +"Saint-Germain-la-Ville", +"Saint-Germain-le-Châtelet", +"Saint-Germain-le-Fouilloux", +"Saint-Germain-le-Gaillard", +"Saint-Germain-le-Guillaume", +"Saint-Germain-le-Rocheux", +"Saint-Germain-le-Vasson", +"Saint-Germain-le-Vieux", +"Saint-Germain-les-Belles", +"Saint-Germain-les-Paroisses", +"Saint-Germain-les-Vergnes", +"Saint-Germain-lès-Arpajon", +"Saint-Germain-lès-Buxy", +"Saint-Germain-lès-Corbeil", +"Saint-Germain-lès-Senailly", +"Saint-Germain-près-Herment", +"Saint-Germain-sous-Cailly", +"Saint-Germain-sous-Doue", +"Saint-Germain-sur-Avre", +"Saint-Germain-sur-Ay", +"Saint-Germain-sur-Bresle", +"Saint-Germain-sur-Eaulne", +"Saint-Germain-sur-Ille", +"Saint-Germain-sur-Meuse", +"Saint-Germain-sur-Morin", +"Saint-Germain-sur-Renon", +"Saint-Germain-sur-Rhône", +"Saint-Germain-sur-Sarthe", +"Saint-Germain-sur-Sèves", +"Saint-Germain-sur-Vienne", +"Saint-Germain-sur-École", +"Saint-Germainmont", +"Saint-Germer-de-Fly", +"Saint-Germier", +"Saint-Germé", +"Saint-Gervais", +"Saint-Gervais-d'Auvergne", +"Saint-Gervais-de-Vic", +"Saint-Gervais-des-Sablons", +"Saint-Gervais-du-Perron", +"Saint-Gervais-en-Belin", +"Saint-Gervais-en-Vallière", +"Saint-Gervais-la-Forêt", +"Saint-Gervais-les-Bains", +"Saint-Gervais-les-Trois-Clochers", +"Saint-Gervais-sous-Meymont", +"Saint-Gervais-sur-Couches", +"Saint-Gervais-sur-Mare", +"Saint-Gervais-sur-Roubion", +"Saint-Gervasy", +"Saint-Gervazy", +"Saint-Geyrac", +"Saint-Gibrien", +"Saint-Gildas", +"Saint-Gildas-de-Rhuys", +"Saint-Gildas-des-Bois", +"Saint-Gilles", +"Saint-Gilles-Croix-de-Vie", +"Saint-Gilles-Pligeaux", +"Saint-Gilles-Vieux-Marché", +"Saint-Gilles-de-Crétot", +"Saint-Gilles-de-la-Neuville", +"Saint-Gilles-des-Marais", +"Saint-Gilles-les-Bois", +"Saint-Gilles-les-Forêts", +"Saint-Gineis-en-Coiron", +"Saint-Gingolph", +"Saint-Girons", +"Saint-Girons-d'Aiguevives", +"Saint-Girons-en-Béarn", +"Saint-Gladie-Arrive-Munein", +"Saint-Glen", +"Saint-Goazec", +"Saint-Gobain", +"Saint-Gobert", +"Saint-Goin", +"Saint-Gondon", +"Saint-Gondran", +"Saint-Gonlay", +"Saint-Gonnery", +"Saint-Gor", +"Saint-Gorgon", +"Saint-Gorgon-Main", +"Saint-Gourgon", +"Saint-Gourson", +"Saint-Goussaud", +"Saint-Gratien", +"Saint-Gratien-Savigny", +"Saint-Gravé", +"Saint-Griède", +"Saint-Groux", +"Saint-Grégoire", +"Saint-Grégoire-d'Ardennes", +"Saint-Grégoire-du-Vièvre", +"Saint-Guen", +"Saint-Guilhem-le-Désert", +"Saint-Guillaume", +"Saint-Guinoux", +"Saint-Guiraud", +"Saint-Guyomard", +"Saint-Gély-du-Fesc", +"Saint-Génard", +"Saint-Génis-des-Fontaines", +"Saint-Généroux", +"Saint-Gérand", +"Saint-Gérand-de-Vaux", +"Saint-Gérand-le-Puy", +"Saint-Géraud", +"Saint-Géraud-de-Corps", +"Saint-Géron", +"Saint-Gérons", +"Saint-Géry", +"Saint-Géréon", +"Saint-Haon", +"Saint-Haon-le-Châtel", +"Saint-Haon-le-Vieux", +"Saint-Hellier", +"Saint-Herblain", +"Saint-Hernin", +"Saint-Hervé", +"Saint-Hilaire", +"Saint-Hilaire-Bonneval", +"Saint-Hilaire-Cottes", +"Saint-Hilaire-Cusson-la-Valmitte", +"Saint-Hilaire-Foissac", +"Saint-Hilaire-Fontaine", +"Saint-Hilaire-Luc", +"Saint-Hilaire-Petitville", +"Saint-Hilaire-Peyroux", +"Saint-Hilaire-Saint-Mesmin", +"Saint-Hilaire-Taurieux", +"Saint-Hilaire-au-Temple", +"Saint-Hilaire-d'Estissac", +"Saint-Hilaire-d'Ozilhan", +"Saint-Hilaire-de-Beauvoir", +"Saint-Hilaire-de-Brens", +"Saint-Hilaire-de-Brethmas", +"Saint-Hilaire-de-Briouze", +"Saint-Hilaire-de-Chaléons", +"Saint-Hilaire-de-Clisson", +"Saint-Hilaire-de-Court", +"Saint-Hilaire-de-Gondilly", +"Saint-Hilaire-de-Lavit", +"Saint-Hilaire-de-Loulay", +"Saint-Hilaire-de-Lusignan", +"Saint-Hilaire-de-Riez", +"Saint-Hilaire-de-Villefranche", +"Saint-Hilaire-de-Voust", +"Saint-Hilaire-de-la-Côte", +"Saint-Hilaire-de-la-Noaille", +"Saint-Hilaire-des-Landes", +"Saint-Hilaire-des-Loges", +"Saint-Hilaire-du-Bois", +"Saint-Hilaire-du-Harcouët", +"Saint-Hilaire-du-Maine", +"Saint-Hilaire-du-Rosier", +"Saint-Hilaire-en-Lignières", +"Saint-Hilaire-en-Morvan", +"Saint-Hilaire-en-Woëvre", +"Saint-Hilaire-la-Croix", +"Saint-Hilaire-la-Forêt", +"Saint-Hilaire-la-Gravelle", +"Saint-Hilaire-la-Gérard", +"Saint-Hilaire-la-Palud", +"Saint-Hilaire-la-Plaine", +"Saint-Hilaire-la-Treille", +"Saint-Hilaire-le-Château", +"Saint-Hilaire-le-Châtel", +"Saint-Hilaire-le-Grand", +"Saint-Hilaire-le-Petit", +"Saint-Hilaire-le-Vouhis", +"Saint-Hilaire-les-Andrésis", +"Saint-Hilaire-les-Courbes", +"Saint-Hilaire-les-Monges", +"Saint-Hilaire-les-Places", +"Saint-Hilaire-lez-Cambrai", +"Saint-Hilaire-sous-Charlieu", +"Saint-Hilaire-sous-Romilly", +"Saint-Hilaire-sur-Benaize", +"Saint-Hilaire-sur-Erre", +"Saint-Hilaire-sur-Helpe", +"Saint-Hilaire-sur-Puiseaux", +"Saint-Hilaire-sur-Risle", +"Saint-Hilaire-sur-Yerre", +"Saint-Hilarion", +"Saint-Hilliers", +"Saint-Hippolyte", +"Saint-Hippolyte-de-Caton", +"Saint-Hippolyte-de-Montaigu", +"Saint-Hippolyte-du-Fort", +"Saint-Hippolyte-le-Graveyron", +"Saint-Honoré", +"Saint-Honoré-les-Bains", +"Saint-Hostien", +"Saint-Hubert", +"Saint-Huruge", +"Saint-Hymer", +"Saint-Hymetière", +"Saint-Héand", +"Saint-Hélen", +"Saint-Hélier", +"Saint-Hérent", +"Saint-Igeaux", +"Saint-Igest", +"Saint-Ignan", +"Saint-Ignat", +"Saint-Igny-de-Roche", +"Saint-Igny-de-Vers", +"Saint-Illide", +"Saint-Illiers-la-Ville", +"Saint-Illiers-le-Bois", +"Saint-Ilpize", +"Saint-Imoges", +"Saint-Inglevert", +"Saint-Ismier", +"Saint-Izaire", +"Saint-Jacques", +"Saint-Jacques-d'Aliermont", +"Saint-Jacques-d'Ambur", +"Saint-Jacques-d'Atticieux", +"Saint-Jacques-de-Néhou", +"Saint-Jacques-de-Thouars", +"Saint-Jacques-de-la-Lande", +"Saint-Jacques-des-Arrêts", +"Saint-Jacques-des-Blats", +"Saint-Jacques-des-Guérets", +"Saint-Jacques-en-Valgodemard", +"Saint-Jacques-sur-Darnétal", +"Saint-Jacut-de-la-Mer", +"Saint-Jacut-les-Pins", +"Saint-Jal", +"Saint-James", +"Saint-Jammes", +"Saint-Jans-Cappel", +"Saint-Jean", +"Saint-Jean-Bonnefonds", +"Saint-Jean-Brévelay", +"Saint-Jean-Cap-Ferrat", +"Saint-Jean-Chambre", +"Saint-Jean-Delnous", +"Saint-Jean-Froidmentel", +"Saint-Jean-Kerdaniel", +"Saint-Jean-Kourtzerode", +"Saint-Jean-Lachalm", +"Saint-Jean-Lagineste", +"Saint-Jean-Lasseille", +"Saint-Jean-Lespinasse", +"Saint-Jean-Lherm", +"Saint-Jean-Ligoure", +"Saint-Jean-Mirabel", +"Saint-Jean-Pied-de-Port", +"Saint-Jean-Pierre-Fixte", +"Saint-Jean-Pla-de-Corts", +"Saint-Jean-Poudge", +"Saint-Jean-Poutge", +"Saint-Jean-Rohrbach", +"Saint-Jean-Roure", +"Saint-Jean-Saint-Germain", +"Saint-Jean-Saint-Gervais", +"Saint-Jean-Saint-Maurice-sur-Loire", +"Saint-Jean-Saint-Nicolas", +"Saint-Jean-Saverne", +"Saint-Jean-Soleymieux", +"Saint-Jean-Trolimon", +"Saint-Jean-aux-Amognes", +"Saint-Jean-aux-Bois", +"Saint-Jean-d'Aigues-Vives", +"Saint-Jean-d'Alcapiès", +"Saint-Jean-d'Angle", +"Saint-Jean-d'Angély", +"Saint-Jean-d'Ardières", +"Saint-Jean-d'Arves", +"Saint-Jean-d'Arvey", +"Saint-Jean-d'Assé", +"Saint-Jean-d'Ataux", +"Saint-Jean-d'Aubrigoux", +"Saint-Jean-d'Aulps", +"Saint-Jean-d'Avelanne", +"Saint-Jean-d'Elle", +"Saint-Jean-d'Estissac", +"Saint-Jean-d'Eyraud", +"Saint-Jean-d'Heurs", +"Saint-Jean-d'Hérans", +"Saint-Jean-d'Illac", +"Saint-Jean-d'Ormont", +"Saint-Jean-d'Étreux", +"Saint-Jean-de-Barrou", +"Saint-Jean-de-Bassel", +"Saint-Jean-de-Beauregard", +"Saint-Jean-de-Belleville", +"Saint-Jean-de-Beugné", +"Saint-Jean-de-Blaignac", +"Saint-Jean-de-Boiseau", +"Saint-Jean-de-Bonneval", +"Saint-Jean-de-Bournay", +"Saint-Jean-de-Braye", +"Saint-Jean-de-Buèges", +"Saint-Jean-de-Bœuf", +"Saint-Jean-de-Ceyrargues", +"Saint-Jean-de-Chevelu", +"Saint-Jean-de-Cornies", +"Saint-Jean-de-Couz", +"Saint-Jean-de-Crieulon", +"Saint-Jean-de-Cuculles", +"Saint-Jean-de-Côle", +"Saint-Jean-de-Daye", +"Saint-Jean-de-Duras", +"Saint-Jean-de-Folleville", +"Saint-Jean-de-Fos", +"Saint-Jean-de-Gonville", +"Saint-Jean-de-Laur", +"Saint-Jean-de-Lier", +"Saint-Jean-de-Linières", +"Saint-Jean-de-Liversay", +"Saint-Jean-de-Livet", +"Saint-Jean-de-Losne", +"Saint-Jean-de-Luz", +"Saint-Jean-de-Marcel", +"Saint-Jean-de-Marsacq", +"Saint-Jean-de-Maruéjols-et-Avéjan", +"Saint-Jean-de-Maurienne", +"Saint-Jean-de-Minervois", +"Saint-Jean-de-Moirans", +"Saint-Jean-de-Monts", +"Saint-Jean-de-Muzols", +"Saint-Jean-de-Nay", +"Saint-Jean-de-Niost", +"Saint-Jean-de-Paracol", +"Saint-Jean-de-Rebervilliers", +"Saint-Jean-de-Rives", +"Saint-Jean-de-Sauves", +"Saint-Jean-de-Savigny", +"Saint-Jean-de-Serres", +"Saint-Jean-de-Sixt", +"Saint-Jean-de-Soudain", +"Saint-Jean-de-Tholome", +"Saint-Jean-de-Thouars", +"Saint-Jean-de-Thurac", +"Saint-Jean-de-Thurigneux", +"Saint-Jean-de-Touslas", +"Saint-Jean-de-Trézy", +"Saint-Jean-de-Vals", +"Saint-Jean-de-Valériscle", +"Saint-Jean-de-Vaulx", +"Saint-Jean-de-Vaux", +"Saint-Jean-de-Verges", +"Saint-Jean-de-Védas", +"Saint-Jean-de-la-Blaquière", +"Saint-Jean-de-la-Croix", +"Saint-Jean-de-la-Haize", +"Saint-Jean-de-la-Léqueraye", +"Saint-Jean-de-la-Motte", +"Saint-Jean-de-la-Neuville", +"Saint-Jean-de-la-Porte", +"Saint-Jean-de-la-Rivière", +"Saint-Jean-de-la-Ruelle", +"Saint-Jean-des-Champs", +"Saint-Jean-des-Essartiers", +"Saint-Jean-des-Mauvrets", +"Saint-Jean-des-Ollières", +"Saint-Jean-des-Vignes", +"Saint-Jean-des-Échelles", +"Saint-Jean-devant-Possesse", +"Saint-Jean-du-Bois", +"Saint-Jean-du-Bouzet", +"Saint-Jean-du-Bruel", +"Saint-Jean-du-Cardonnay", +"Saint-Jean-du-Castillonnais", +"Saint-Jean-du-Corail-des-Bois", +"Saint-Jean-du-Doigt", +"Saint-Jean-du-Falga", +"Saint-Jean-du-Gard", +"Saint-Jean-du-Pin", +"Saint-Jean-du-Thenney", +"Saint-Jean-en-Royans", +"Saint-Jean-en-Val", +"Saint-Jean-et-Saint-Paul", +"Saint-Jean-la-Bussière", +"Saint-Jean-la-Fouillouse", +"Saint-Jean-la-Poterie", +"Saint-Jean-la-Vêtre", +"Saint-Jean-le-Blanc", +"Saint-Jean-le-Centenier", +"Saint-Jean-le-Comtal", +"Saint-Jean-le-Thomas", +"Saint-Jean-le-Vieux", +"Saint-Jean-les-Deux-Jumeaux", +"Saint-Jean-lès-Buzy", +"Saint-Jean-lès-Longuyon", +"Saint-Jean-sur-Couesnon", +"Saint-Jean-sur-Erve", +"Saint-Jean-sur-Mayenne", +"Saint-Jean-sur-Moivre", +"Saint-Jean-sur-Reyssouze", +"Saint-Jean-sur-Tourbe", +"Saint-Jean-sur-Veyle", +"Saint-Jean-sur-Vilaine", +"Saint-Jeannet", +"Saint-Jeanvrin", +"Saint-Jeoire", +"Saint-Jeoire-Prieuré", +"Saint-Jeure-d'Andaure", +"Saint-Jeure-d'Ay", +"Saint-Jeures", +"Saint-Joachim", +"Saint-Jodard", +"Saint-Joire", +"Saint-Jorioz", +"Saint-Jory", +"Saint-Jory-de-Chalais", +"Saint-Jory-las-Bloux", +"Saint-Joseph", +"Saint-Joseph-de-Rivière", +"Saint-Joseph-des-Bancs", +"Saint-Josse", +"Saint-Jouan-de-l'Isle", +"Saint-Jouan-des-Guérets", +"Saint-Jouin", +"Saint-Jouin-Bruneval", +"Saint-Jouin-de-Blavou", +"Saint-Jouin-de-Marnes", +"Saint-Jouin-de-Milly", +"Saint-Jouvent", +"Saint-Juan", +"Saint-Judoce", +"Saint-Juire-Champgillon", +"Saint-Julia", +"Saint-Julia-de-Bec", +"Saint-Julien", +"Saint-Julien-Beychevelle", +"Saint-Julien-Boutières", +"Saint-Julien-Chapteuil", +"Saint-Julien-Gaulène", +"Saint-Julien-Labrousse", +"Saint-Julien-Maumont", +"Saint-Julien-Molhesabate", +"Saint-Julien-Molin-Molette", +"Saint-Julien-Mont-Denis", +"Saint-Julien-Puy-Lavèze", +"Saint-Julien-Vocance", +"Saint-Julien-aux-Bois", +"Saint-Julien-d'Ance", +"Saint-Julien-d'Armagnac", +"Saint-Julien-d'Asse", +"Saint-Julien-d'Eymet", +"Saint-Julien-d'Oddes", +"Saint-Julien-de-Briola", +"Saint-Julien-de-Cassagnas", +"Saint-Julien-de-Chédon", +"Saint-Julien-de-Civry", +"Saint-Julien-de-Concelles", +"Saint-Julien-de-Coppel", +"Saint-Julien-de-Crempse", +"Saint-Julien-de-Gras-Capou", +"Saint-Julien-de-Jonzy", +"Saint-Julien-de-Lampon", +"Saint-Julien-de-Peyrolas", +"Saint-Julien-de-Raz", +"Saint-Julien-de-Toursac", +"Saint-Julien-de-Vouvantes", +"Saint-Julien-de-l'Escap", +"Saint-Julien-de-l'Herms", +"Saint-Julien-de-la-Liègue", +"Saint-Julien-de-la-Nef", +"Saint-Julien-des-Chazes", +"Saint-Julien-des-Landes", +"Saint-Julien-des-Points", +"Saint-Julien-du-Gua", +"Saint-Julien-du-Pinet", +"Saint-Julien-du-Puy", +"Saint-Julien-du-Sault", +"Saint-Julien-du-Serre", +"Saint-Julien-du-Terroux", +"Saint-Julien-du-Tournel", +"Saint-Julien-du-Verdon", +"Saint-Julien-en-Beauchêne", +"Saint-Julien-en-Born", +"Saint-Julien-en-Champsaur", +"Saint-Julien-en-Genevois", +"Saint-Julien-en-Quint", +"Saint-Julien-en-Saint-Alban", +"Saint-Julien-en-Vercors", +"Saint-Julien-l'Ars", +"Saint-Julien-la-Geneste", +"Saint-Julien-la-Genête", +"Saint-Julien-la-Vêtre", +"Saint-Julien-le-Châtel", +"Saint-Julien-le-Faucon", +"Saint-Julien-le-Petit", +"Saint-Julien-le-Pèlerin", +"Saint-Julien-le-Roux", +"Saint-Julien-le-Vendômois", +"Saint-Julien-les-Rosiers", +"Saint-Julien-les-Villas", +"Saint-Julien-lès-Gorze", +"Saint-Julien-lès-Metz", +"Saint-Julien-lès-Montbéliard", +"Saint-Julien-lès-Russey", +"Saint-Julien-près-Bort", +"Saint-Julien-sous-les-Côtes", +"Saint-Julien-sur-Bibost", +"Saint-Julien-sur-Calonne", +"Saint-Julien-sur-Cher", +"Saint-Julien-sur-Dheune", +"Saint-Julien-sur-Garonne", +"Saint-Julien-sur-Reyssouze", +"Saint-Julien-sur-Sarthe", +"Saint-Julien-sur-Veyle", +"Saint-Junien", +"Saint-Junien-la-Bregère", +"Saint-Junien-les-Combes", +"Saint-Jure", +"Saint-Jurs", +"Saint-Just", +"Saint-Just-Chaleyssin", +"Saint-Just-Ibarre", +"Saint-Just-Luzac", +"Saint-Just-Malmont", +"Saint-Just-Saint-Rambert", +"Saint-Just-Sauvage", +"Saint-Just-d'Ardèche", +"Saint-Just-d'Avray", +"Saint-Just-de-Claix", +"Saint-Just-en-Bas", +"Saint-Just-en-Brie", +"Saint-Just-en-Chaussée", +"Saint-Just-en-Chevalet", +"Saint-Just-et-Vacquières", +"Saint-Just-et-le-Bézu", +"Saint-Just-la-Pendue", +"Saint-Just-le-Martel", +"Saint-Just-près-Brioude", +"Saint-Just-sur-Dive", +"Saint-Just-sur-Viaur", +"Saint-Justin", +"Saint-Juvat", +"Saint-Juvin", +"Saint-Juéry", +"Saint-Lactencin", +"Saint-Lager", +"Saint-Lager-Bressac", +"Saint-Lamain", +"Saint-Lambert", +"Saint-Lambert-et-Mont-de-Jeux", +"Saint-Lambert-la-Potherie", +"Saint-Lambert-sur-Dive", +"Saint-Langis-lès-Mortagne", +"Saint-Lanne", +"Saint-Laon", +"Saint-Lary", +"Saint-Lary-Boujean", +"Saint-Lary-Soulan", +"Saint-Lattier", +"Saint-Launeuc", +"Saint-Laure", +"Saint-Laurent", +"Saint-Laurent-Blangy", +"Saint-Laurent-Bretagne", +"Saint-Laurent-Chabreuges", +"Saint-Laurent-Lolmie", +"Saint-Laurent-Médoc", +"Saint-Laurent-Nouan", +"Saint-Laurent-Rochefort", +"Saint-Laurent-d'Agny", +"Saint-Laurent-d'Aigouze", +"Saint-Laurent-d'Andenay", +"Saint-Laurent-d'Arce", +"Saint-Laurent-d'Oingt", +"Saint-Laurent-d'Olt", +"Saint-Laurent-d'Onay", +"Saint-Laurent-de-Belzagot", +"Saint-Laurent-de-Brèvedent", +"Saint-Laurent-de-Carnols", +"Saint-Laurent-de-Cerdans", +"Saint-Laurent-de-Chamousset", +"Saint-Laurent-de-Cognac", +"Saint-Laurent-de-Condel", +"Saint-Laurent-de-Cuves", +"Saint-Laurent-de-Céris", +"Saint-Laurent-de-Gosse", +"Saint-Laurent-de-Jourdes", +"Saint-Laurent-de-Lin", +"Saint-Laurent-de-Lévézou", +"Saint-Laurent-de-Mure", +"Saint-Laurent-de-Muret", +"Saint-Laurent-de-Neste", +"Saint-Laurent-de-Terregatte", +"Saint-Laurent-de-Veyrès", +"Saint-Laurent-de-la-Barrière", +"Saint-Laurent-de-la-Cabrerisse", +"Saint-Laurent-de-la-Prée", +"Saint-Laurent-de-la-Salanque", +"Saint-Laurent-de-la-Salle", +"Saint-Laurent-des-Arbres", +"Saint-Laurent-des-Bois", +"Saint-Laurent-des-Combes", +"Saint-Laurent-des-Hommes", +"Saint-Laurent-des-Mortiers", +"Saint-Laurent-des-Vignes", +"Saint-Laurent-du-Bois", +"Saint-Laurent-du-Cros", +"Saint-Laurent-du-Maroni", +"Saint-Laurent-du-Mont", +"Saint-Laurent-du-Pape", +"Saint-Laurent-du-Plan", +"Saint-Laurent-du-Pont", +"Saint-Laurent-du-Tencement", +"Saint-Laurent-du-Var", +"Saint-Laurent-du-Verdon", +"Saint-Laurent-en-Beaumont", +"Saint-Laurent-en-Brionnais", +"Saint-Laurent-en-Caux", +"Saint-Laurent-en-Grandvaux", +"Saint-Laurent-en-Gâtines", +"Saint-Laurent-en-Royans", +"Saint-Laurent-l'Abbaye", +"Saint-Laurent-la-Conche", +"Saint-Laurent-la-Gâtine", +"Saint-Laurent-la-Vallée", +"Saint-Laurent-la-Vernède", +"Saint-Laurent-le-Minier", +"Saint-Laurent-les-Bains", +"Saint-Laurent-les-Tours", +"Saint-Laurent-les-Églises", +"Saint-Laurent-sous-Coiron", +"Saint-Laurent-sur-Gorre", +"Saint-Laurent-sur-Mer", +"Saint-Laurent-sur-Othain", +"Saint-Laurent-sur-Oust", +"Saint-Laurent-sur-Saône", +"Saint-Laurent-sur-Sèvre", +"Saint-Laurs", +"Saint-Leu", +"Saint-Leu-d'Esserent", +"Saint-Leu-la-Forêt", +"Saint-Lieux-Lafenasse", +"Saint-Lieux-lès-Lavaur", +"Saint-Lin", +"Saint-Lions", +"Saint-Lizier", +"Saint-Lizier-du-Planté", +"Saint-Lon-les-Mines", +"Saint-Longis", +"Saint-Lormel", +"Saint-Lothain", +"Saint-Loube", +"Saint-Loubert", +"Saint-Loubouer", +"Saint-Loubès", +"Saint-Louet-sur-Seulles", +"Saint-Louet-sur-Vire", +"Saint-Louis", +"Saint-Louis-de-Montferrand", +"Saint-Louis-en-l'Isle", +"Saint-Louis-et-Parahou", +"Saint-Louis-lès-Bitche", +"Saint-Loup", +"Saint-Loup-Cammas", +"Saint-Loup-Géanges", +"Saint-Loup-Hors", +"Saint-Loup-Lamairé", +"Saint-Loup-Nantouard", +"Saint-Loup-Terrier", +"Saint-Loup-d'Ordon", +"Saint-Loup-de-Buffigny", +"Saint-Loup-de-Fribois", +"Saint-Loup-de-Gonois", +"Saint-Loup-de-Naud", +"Saint-Loup-de-Varennes", +"Saint-Loup-des-Chaumes", +"Saint-Loup-des-Vignes", +"Saint-Loup-du-Dorat", +"Saint-Loup-du-Gast", +"Saint-Loup-en-Champagne", +"Saint-Loup-en-Comminges", +"Saint-Loup-sur-Aujon", +"Saint-Loup-sur-Semouse", +"Saint-Lubin-de-Cravant", +"Saint-Lubin-de-la-Haye", +"Saint-Lubin-des-Joncherets", +"Saint-Lubin-en-Vergonnois", +"Saint-Luc", +"Saint-Lucien", +"Saint-Lumier-en-Champagne", +"Saint-Lumier-la-Populeuse", +"Saint-Lumine-de-Clisson", +"Saint-Lumine-de-Coutais", +"Saint-Lunaire", +"Saint-Luperce", +"Saint-Lupicin", +"Saint-Lupien", +"Saint-Lyphard", +"Saint-Lys", +"Saint-Lyé", +"Saint-Lyé-la-Forêt", +"Saint-Léger", +"Saint-Léger-Bridereix", +"Saint-Léger-Dubosq", +"Saint-Léger-Magnazeix", +"Saint-Léger-Triey", +"Saint-Léger-Vauban", +"Saint-Léger-aux-Bois", +"Saint-Léger-de-Balson", +"Saint-Léger-de-Fougeret", +"Saint-Léger-de-Montbrillais", +"Saint-Léger-de-Montbrun", +"Saint-Léger-de-Peyre", +"Saint-Léger-de-Rôtes", +"Saint-Léger-de-la-Martinière", +"Saint-Léger-des-Aubées", +"Saint-Léger-des-Bois", +"Saint-Léger-des-Prés", +"Saint-Léger-des-Vignes", +"Saint-Léger-du-Bois", +"Saint-Léger-du-Bourg-Denis", +"Saint-Léger-du-Gennetey", +"Saint-Léger-du-Malzieu", +"Saint-Léger-du-Ventoux", +"Saint-Léger-en-Bray", +"Saint-Léger-en-Yvelines", +"Saint-Léger-la-Montagne", +"Saint-Léger-le-Guérétois", +"Saint-Léger-le-Petit", +"Saint-Léger-les-Mélèzes", +"Saint-Léger-les-Vignes", +"Saint-Léger-lès-Authie", +"Saint-Léger-lès-Domart", +"Saint-Léger-lès-Paray", +"Saint-Léger-près-Troyes", +"Saint-Léger-sous-Beuvray", +"Saint-Léger-sous-Brienne", +"Saint-Léger-sous-Cholet", +"Saint-Léger-sous-Margerie", +"Saint-Léger-sous-la-Bussière", +"Saint-Léger-sur-Bresle", +"Saint-Léger-sur-Dheune", +"Saint-Léger-sur-Roanne", +"Saint-Léger-sur-Sarthe", +"Saint-Léger-sur-Vouzance", +"Saint-Léomer", +"Saint-Léon", +"Saint-Léon-d'Issigeac", +"Saint-Léon-sur-Vézère", +"Saint-Léon-sur-l'Isle", +"Saint-Léonard", +"Saint-Léonard-de-Noblat", +"Saint-Léonard-des-Bois", +"Saint-Léonard-des-Parcs", +"Saint-Léonard-en-Beauce", +"Saint-Léons", +"Saint-Léopardin-d'Augy", +"Saint-Léry", +"Saint-Lézer", +"Saint-Lô", +"Saint-Lô-d'Ourville", +"Saint-M'Hervon", +"Saint-M'Hervé", +"Saint-Macaire", +"Saint-Macaire-du-Bois", +"Saint-Maclou", +"Saint-Maclou-de-Folleville", +"Saint-Maclou-la-Brière", +"Saint-Macoux", +"Saint-Maden", +"Saint-Magne", +"Saint-Magne-de-Castillon", +"Saint-Maigner", +"Saint-Maigrin", +"Saint-Maime", +"Saint-Maime-de-Péreyrol", +"Saint-Maixant", +"Saint-Maixent", +"Saint-Maixent-de-Beugné", +"Saint-Maixent-l'École", +"Saint-Maixent-sur-Vie", +"Saint-Maixme-Hauterive", +"Saint-Malo", +"Saint-Malo-de-Beignon", +"Saint-Malo-de-Guersac", +"Saint-Malo-de-Phily", +"Saint-Malo-de-la-Lande", +"Saint-Malo-des-Trois-Fontaines", +"Saint-Malo-en-Donziois", +"Saint-Malon-sur-Mel", +"Saint-Malô-du-Bois", +"Saint-Mamert", +"Saint-Mamert-du-Gard", +"Saint-Mamet", +"Saint-Mamet-la-Salvetat", +"Saint-Mammès", +"Saint-Mandrier-sur-Mer", +"Saint-Mandé", +"Saint-Mandé-sur-Brédoire", +"Saint-Manvieu-Bocage", +"Saint-Manvieu-Norrey", +"Saint-Marc-Jaumegarde", +"Saint-Marc-du-Cor", +"Saint-Marc-la-Lande", +"Saint-Marc-le-Blanc", +"Saint-Marc-sur-Couesnon", +"Saint-Marc-sur-Seine", +"Saint-Marc-à-Frongier", +"Saint-Marc-à-Loubaud", +"Saint-Marcan", +"Saint-Marceau", +"Saint-Marcel", +"Saint-Marcel-Bel-Accueil", +"Saint-Marcel-Campes", +"Saint-Marcel-Paulel", +"Saint-Marcel-d'Ardèche", +"Saint-Marcel-d'Urfé", +"Saint-Marcel-de-Careiret", +"Saint-Marcel-de-Félines", +"Saint-Marcel-du-Périgord", +"Saint-Marcel-en-Marcillat", +"Saint-Marcel-en-Murat", +"Saint-Marcel-l'Éclairé", +"Saint-Marcel-lès-Annonay", +"Saint-Marcel-lès-Sauzet", +"Saint-Marcel-lès-Valence", +"Saint-Marcel-sur-Aude", +"Saint-Marcelin-de-Cray", +"Saint-Marcellin", +"Saint-Marcellin-en-Forez", +"Saint-Marcellin-lès-Vaison", +"Saint-Marcet", +"Saint-Marcory", +"Saint-Marcouf", +"Saint-Mard", +"Saint-Mard-de-Réno", +"Saint-Mard-de-Vaux", +"Saint-Mard-lès-Rouffy", +"Saint-Mard-sur-Auve", +"Saint-Mard-sur-le-Mont", +"Saint-Mards", +"Saint-Mards-de-Blacarville", +"Saint-Mards-de-Fresne", +"Saint-Mards-en-Othe", +"Saint-Marien", +"Saint-Mariens", +"Saint-Mars-Vieux-Maisons", +"Saint-Mars-d'Outillé", +"Saint-Mars-d'Égrenne", +"Saint-Mars-de-Coutais", +"Saint-Mars-de-Locquenay", +"Saint-Mars-du-Désert", +"Saint-Mars-la-Brière", +"Saint-Mars-la-Jaille", +"Saint-Mars-la-Réorthe", +"Saint-Mars-sur-Colmont", +"Saint-Mars-sur-la-Futaie", +"Saint-Marsal", +"Saint-Martial", +"Saint-Martial-Entraygues", +"Saint-Martial-Viveyrol", +"Saint-Martial-d'Albarède", +"Saint-Martial-d'Artenset", +"Saint-Martial-de-Gimel", +"Saint-Martial-de-Mirambeau", +"Saint-Martial-de-Nabirat", +"Saint-Martial-de-Valette", +"Saint-Martial-de-Vitaterne", +"Saint-Martial-le-Mont", +"Saint-Martial-le-Vieux", +"Saint-Martial-sur-Isop", +"Saint-Martial-sur-Né", +"Saint-Martin", +"Saint-Martin-Belle-Roche", +"Saint-Martin-Bellevue", +"Saint-Martin-Boulogne", +"Saint-Martin-Cantalès", +"Saint-Martin-Choquel", +"Saint-Martin-Château", +"Saint-Martin-Curton", +"Saint-Martin-Gimois", +"Saint-Martin-Labouval", +"Saint-Martin-Lacaussade", +"Saint-Martin-Laguépie", +"Saint-Martin-Lalande", +"Saint-Martin-Lars-en-Sainte-Hermine", +"Saint-Martin-Lestra", +"Saint-Martin-Longueau", +"Saint-Martin-Lys", +"Saint-Martin-Osmonville", +"Saint-Martin-Petit", +"Saint-Martin-Rivière", +"Saint-Martin-Saint-Firmin", +"Saint-Martin-Sainte-Catherine", +"Saint-Martin-Sepert", +"Saint-Martin-Terressus", +"Saint-Martin-Valmeroux", +"Saint-Martin-Vésubie", +"Saint-Martin-au-Bosc", +"Saint-Martin-aux-Arbres", +"Saint-Martin-aux-Bois", +"Saint-Martin-aux-Buneaux", +"Saint-Martin-aux-Champs", +"Saint-Martin-aux-Chartrains", +"Saint-Martin-d'Abbat", +"Saint-Martin-d'Ablois", +"Saint-Martin-d'Août", +"Saint-Martin-d'Arberoue", +"Saint-Martin-d'Arc", +"Saint-Martin-d'Ardèche", +"Saint-Martin-d'Armagnac", +"Saint-Martin-d'Arrossa", +"Saint-Martin-d'Ary", +"Saint-Martin-d'Aubigny", +"Saint-Martin-d'Audouville", +"Saint-Martin-d'Auxigny", +"Saint-Martin-d'Auxy", +"Saint-Martin-d'Entraunes", +"Saint-Martin-d'Estréaux", +"Saint-Martin-d'Hardinghem", +"Saint-Martin-d'Heuille", +"Saint-Martin-d'Hères", +"Saint-Martin-d'Ollières", +"Saint-Martin-d'Oney", +"Saint-Martin-d'Ordon", +"Saint-Martin-d'Oydes", +"Saint-Martin-d'Uriage", +"Saint-Martin-d'Écublei", +"Saint-Martin-de-Bavel", +"Saint-Martin-de-Beauville", +"Saint-Martin-de-Bernegoue", +"Saint-Martin-de-Bienfaite-la-Cressonnière", +"Saint-Martin-de-Blagny", +"Saint-Martin-de-Bonfossé", +"Saint-Martin-de-Boscherville", +"Saint-Martin-de-Bossenay", +"Saint-Martin-de-Boubaux", +"Saint-Martin-de-Bréthencourt", +"Saint-Martin-de-Brômes", +"Saint-Martin-de-Caralp", +"Saint-Martin-de-Castillon", +"Saint-Martin-de-Cenilly", +"Saint-Martin-de-Clelles", +"Saint-Martin-de-Commune", +"Saint-Martin-de-Connée", +"Saint-Martin-de-Coux", +"Saint-Martin-de-Crau", +"Saint-Martin-de-Fenouillet", +"Saint-Martin-de-Fontenay", +"Saint-Martin-de-Fraigneau", +"Saint-Martin-de-Fressengeas", +"Saint-Martin-de-Fugères", +"Saint-Martin-de-Goyne", +"Saint-Martin-de-Gurson", +"Saint-Martin-de-Hinx", +"Saint-Martin-de-Juillers", +"Saint-Martin-de-Jussac", +"Saint-Martin-de-Lansuscle", +"Saint-Martin-de-Laye", +"Saint-Martin-de-Lenne", +"Saint-Martin-de-Lerm", +"Saint-Martin-de-Lixy", +"Saint-Martin-de-Londres", +"Saint-Martin-de-Mailloc", +"Saint-Martin-de-Mieux", +"Saint-Martin-de-Mâcon", +"Saint-Martin-de-Nigelles", +"Saint-Martin-de-Pallières", +"Saint-Martin-de-Queyrières", +"Saint-Martin-de-Ribérac", +"Saint-Martin-de-Ré", +"Saint-Martin-de-Saint-Maixent", +"Saint-Martin-de-Salencey", +"Saint-Martin-de-Sanzay", +"Saint-Martin-de-Seignanx", +"Saint-Martin-de-Sescas", +"Saint-Martin-de-Valamas", +"Saint-Martin-de-Valgalgues", +"Saint-Martin-de-Varreville", +"Saint-Martin-de-Vaulserre", +"Saint-Martin-de-Villereglan", +"Saint-Martin-de-Villeréal", +"Saint-Martin-de-l'Arçon", +"Saint-Martin-de-la-Brasque", +"Saint-Martin-de-la-Cluze", +"Saint-Martin-de-la-Lieue", +"Saint-Martin-de-la-Mer", +"Saint-Martin-de-la-Place", +"Saint-Martin-de-la-Porte", +"Saint-Martin-des-Bois", +"Saint-Martin-des-Champs", +"Saint-Martin-des-Combes", +"Saint-Martin-des-Entrées", +"Saint-Martin-des-Fontaines", +"Saint-Martin-des-Lais", +"Saint-Martin-des-Landes", +"Saint-Martin-des-Monts", +"Saint-Martin-des-Noyers", +"Saint-Martin-des-Olmes", +"Saint-Martin-des-Plains", +"Saint-Martin-des-Prés", +"Saint-Martin-des-Puits", +"Saint-Martin-des-Pézerits", +"Saint-Martin-des-Tilleuls", +"Saint-Martin-du-Bec", +"Saint-Martin-du-Bois", +"Saint-Martin-du-Boschet", +"Saint-Martin-du-Clocher", +"Saint-Martin-du-Fouilloux", +"Saint-Martin-du-Frêne", +"Saint-Martin-du-Lac", +"Saint-Martin-du-Limet", +"Saint-Martin-du-Manoir", +"Saint-Martin-du-Mont", +"Saint-Martin-du-Puy", +"Saint-Martin-du-Tartre", +"Saint-Martin-du-Tertre", +"Saint-Martin-du-Tilleul", +"Saint-Martin-du-Var", +"Saint-Martin-du-Vieux-Bellême", +"Saint-Martin-du-Vivier", +"Saint-Martin-en-Bière", +"Saint-Martin-en-Bresse", +"Saint-Martin-en-Gâtinois", +"Saint-Martin-en-Haut", +"Saint-Martin-en-Vercors", +"Saint-Martin-l'Aiguillon", +"Saint-Martin-l'Ars", +"Saint-Martin-l'Astier", +"Saint-Martin-l'Heureux", +"Saint-Martin-l'Hortier", +"Saint-Martin-la-Campagne", +"Saint-Martin-la-Garenne", +"Saint-Martin-la-Méanne", +"Saint-Martin-la-Patrouille", +"Saint-Martin-la-Plaine", +"Saint-Martin-la-Sauveté", +"Saint-Martin-le-Beau", +"Saint-Martin-le-Bouillant", +"Saint-Martin-le-Châtel", +"Saint-Martin-le-Colonel", +"Saint-Martin-le-Gaillard", +"Saint-Martin-le-Gréard", +"Saint-Martin-le-Mault", +"Saint-Martin-le-Nœud", +"Saint-Martin-le-Pin", +"Saint-Martin-le-Redon", +"Saint-Martin-le-Vieil", +"Saint-Martin-le-Vieux", +"Saint-Martin-le-Vinoux", +"Saint-Martin-les-Eaux", +"Saint-Martin-lez-Tatinghem", +"Saint-Martin-lès-Langres", +"Saint-Martin-lès-Melle", +"Saint-Martin-lès-Seyne", +"Saint-Martin-sous-Montaigu", +"Saint-Martin-sous-Vigouroux", +"Saint-Martin-sur-Armançon", +"Saint-Martin-sur-Cojeul", +"Saint-Martin-sur-Lavezon", +"Saint-Martin-sur-Nohain", +"Saint-Martin-sur-Ocre", +"Saint-Martin-sur-Oust", +"Saint-Martin-sur-la-Chambre", +"Saint-Martin-sur-le-Pré", +"Saint-Martin-sur-Écaillon", +"Saint-Martinien", +"Saint-Martory", +"Saint-Mary", +"Saint-Mary-le-Plain", +"Saint-Masmes", +"Saint-Mathieu", +"Saint-Mathieu-de-Tréviers", +"Saint-Mathurin", +"Saint-Matré", +"Saint-Maudan", +"Saint-Maudez", +"Saint-Maugan", +"Saint-Maulvis", +"Saint-Maur", +"Saint-Maur-des-Bois", +"Saint-Maur-des-Fossés", +"Saint-Maur-sur-le-Loir", +"Saint-Maurice", +"Saint-Maurice-Colombier", +"Saint-Maurice-Crillat", +"Saint-Maurice-Montcouronne", +"Saint-Maurice-Navacelles", +"Saint-Maurice-Saint-Germain", +"Saint-Maurice-Thizouaille", +"Saint-Maurice-aux-Forges", +"Saint-Maurice-aux-Riches-Hommes", +"Saint-Maurice-d'Ardèche", +"Saint-Maurice-d'Ibie", +"Saint-Maurice-d'Ételan", +"Saint-Maurice-de-Beynost", +"Saint-Maurice-de-Cazevieille", +"Saint-Maurice-de-Gourdans", +"Saint-Maurice-de-Lestapel", +"Saint-Maurice-de-Lignon", +"Saint-Maurice-de-Rotherens", +"Saint-Maurice-de-Rémens", +"Saint-Maurice-de-Satonnay", +"Saint-Maurice-des-Champs", +"Saint-Maurice-des-Lions", +"Saint-Maurice-des-Noues", +"Saint-Maurice-en-Chalencon", +"Saint-Maurice-en-Cotentin", +"Saint-Maurice-en-Gourgois", +"Saint-Maurice-en-Quercy", +"Saint-Maurice-en-Rivière", +"Saint-Maurice-en-Trièves", +"Saint-Maurice-en-Valgodemard", +"Saint-Maurice-l'Exil", +"Saint-Maurice-la-Clouère", +"Saint-Maurice-la-Souterraine", +"Saint-Maurice-le-Girard", +"Saint-Maurice-le-Vieil", +"Saint-Maurice-les-Brousses", +"Saint-Maurice-lès-Charencey", +"Saint-Maurice-lès-Châteauneuf", +"Saint-Maurice-lès-Couches", +"Saint-Maurice-près-Crocq", +"Saint-Maurice-près-Pionsat", +"Saint-Maurice-sous-les-Côtes", +"Saint-Maurice-sur-Adour", +"Saint-Maurice-sur-Aveyron", +"Saint-Maurice-sur-Dargoire", +"Saint-Maurice-sur-Eygues", +"Saint-Maurice-sur-Fessard", +"Saint-Maurice-sur-Mortagne", +"Saint-Maurice-sur-Moselle", +"Saint-Maurice-sur-Vingeanne", +"Saint-Maurin", +"Saint-Max", +"Saint-Maxent", +"Saint-Maximin", +"Saint-Maximin-la-Sainte-Baume", +"Saint-Maxire", +"Saint-May", +"Saint-Mayeux", +"Saint-Melaine-sur-Aubance", +"Saint-Memmie", +"Saint-Menge", +"Saint-Menges", +"Saint-Menoux", +"Saint-Merd-de-Lapleau", +"Saint-Merd-la-Breuille", +"Saint-Merd-les-Oussines", +"Saint-Meslin-du-Bosc", +"Saint-Mesmes", +"Saint-Mesmin", +"Saint-Mexant", +"Saint-Micaud", +"Saint-Michel", +"Saint-Michel-Chef-Chef", +"Saint-Michel-Escalus", +"Saint-Michel-Labadié", +"Saint-Michel-Loubéjou", +"Saint-Michel-Tubœuf", +"Saint-Michel-d'Aurance", +"Saint-Michel-d'Euzet", +"Saint-Michel-d'Halescourt", +"Saint-Michel-de-Bannières", +"Saint-Michel-de-Boulogne", +"Saint-Michel-de-Castelnau", +"Saint-Michel-de-Chabrillanoux", +"Saint-Michel-de-Chaillol", +"Saint-Michel-de-Chavaignes", +"Saint-Michel-de-Double", +"Saint-Michel-de-Dèze", +"Saint-Michel-de-Feins", +"Saint-Michel-de-Fronsac", +"Saint-Michel-de-Lanès", +"Saint-Michel-de-Lapujade", +"Saint-Michel-de-Llotes", +"Saint-Michel-de-Maurienne", +"Saint-Michel-de-Montaigne", +"Saint-Michel-de-Montjoie", +"Saint-Michel-de-Plélan", +"Saint-Michel-de-Rieufret", +"Saint-Michel-de-Saint-Geoirs", +"Saint-Michel-de-Vax", +"Saint-Michel-de-Veisse", +"Saint-Michel-de-Villadeix", +"Saint-Michel-de-Volangis", +"Saint-Michel-de-la-Pierre", +"Saint-Michel-de-la-Roë", +"Saint-Michel-en-Beaumont", +"Saint-Michel-en-Brenne", +"Saint-Michel-en-Grève", +"Saint-Michel-en-l'Herm", +"Saint-Michel-et-Chanveaux", +"Saint-Michel-l'Observatoire", +"Saint-Michel-le-Cloucq", +"Saint-Michel-les-Portes", +"Saint-Michel-sous-Bois", +"Saint-Michel-sur-Loire", +"Saint-Michel-sur-Meurthe", +"Saint-Michel-sur-Orge", +"Saint-Michel-sur-Rhône", +"Saint-Michel-sur-Savasse", +"Saint-Michel-sur-Ternoise", +"Saint-Mihiel", +"Saint-Mitre-les-Remparts", +"Saint-Molf", +"Saint-Momelin", +"Saint-Mont", +"Saint-Montan", +"Saint-Moreil", +"Saint-Morel", +"Saint-Morillon", +"Saint-Moré", +"Saint-Mury-Monteymond", +"Saint-Myon", +"Saint-Méard", +"Saint-Méard-de-Drône", +"Saint-Méard-de-Gurçon", +"Saint-Médard", +"Saint-Médard-Nicourby", +"Saint-Médard-d'Aunis", +"Saint-Médard-d'Excideuil", +"Saint-Médard-d'Eyrans", +"Saint-Médard-de-Guizières", +"Saint-Médard-de-Mussidan", +"Saint-Médard-de-Presque", +"Saint-Médard-en-Forez", +"Saint-Médard-en-Jalles", +"Saint-Médard-la-Rochette", +"Saint-Médard-sur-Ille", +"Saint-Méen", +"Saint-Méen-le-Grand", +"Saint-Mélany", +"Saint-Méloir-des-Bois", +"Saint-Méloir-des-Ondes", +"Saint-Méry", +"Saint-Mézard", +"Saint-Même-les-Carrières", +"Saint-Nabor", +"Saint-Nabord", +"Saint-Nabord-sur-Aube", +"Saint-Nauphary", +"Saint-Nazaire", +"Saint-Nazaire-d'Aude", +"Saint-Nazaire-de-Ladarez", +"Saint-Nazaire-de-Pézan", +"Saint-Nazaire-de-Valentane", +"Saint-Nazaire-des-Gardies", +"Saint-Nazaire-en-Royans", +"Saint-Nazaire-le-Désert", +"Saint-Nazaire-les-Eymes", +"Saint-Nazaire-sur-Charente", +"Saint-Nectaire", +"Saint-Nexans", +"Saint-Nic", +"Saint-Nicodème", +"Saint-Nicolas", +"Saint-Nicolas-aux-Bois", +"Saint-Nicolas-d'Aliermont", +"Saint-Nicolas-de-Bourgueil", +"Saint-Nicolas-de-Macherin", +"Saint-Nicolas-de-Pierrepont", +"Saint-Nicolas-de-Port", +"Saint-Nicolas-de-Redon", +"Saint-Nicolas-de-Sommaire", +"Saint-Nicolas-de-la-Balerme", +"Saint-Nicolas-de-la-Grave", +"Saint-Nicolas-de-la-Haie", +"Saint-Nicolas-de-la-Taille", +"Saint-Nicolas-des-Biefs", +"Saint-Nicolas-des-Bois", +"Saint-Nicolas-des-Motets", +"Saint-Nicolas-du-Pélem", +"Saint-Nicolas-du-Tertre", +"Saint-Nicolas-la-Chapelle", +"Saint-Nicolas-lès-Cîteaux", +"Saint-Nizier-d'Azergues", +"Saint-Nizier-de-Fornas", +"Saint-Nizier-du-Moucherotte", +"Saint-Nizier-le-Bouchoux", +"Saint-Nizier-le-Désert", +"Saint-Nizier-sous-Charlieu", +"Saint-Nizier-sur-Arroux", +"Saint-Nolff", +"Saint-Nom-la-Bretèche", +"Saint-Offenge", +"Saint-Omer", +"Saint-Omer-Capelle", +"Saint-Omer-en-Chaussée", +"Saint-Ondras", +"Saint-Onen-la-Chapelle", +"Saint-Oradoux-de-Chirouze", +"Saint-Oradoux-près-Crocq", +"Saint-Orens", +"Saint-Orens-Pouy-Petit", +"Saint-Orens-de-Gameville", +"Saint-Ost", +"Saint-Ouen", +"Saint-Ouen-Domprot", +"Saint-Ouen-Marchefroy", +"Saint-Ouen-d'Aunis", +"Saint-Ouen-de-Mimbré", +"Saint-Ouen-de-Pontcheuil", +"Saint-Ouen-de-Sécherouvre", +"Saint-Ouen-de-Thouberville", +"Saint-Ouen-de-la-Cour", +"Saint-Ouen-des-Alleux", +"Saint-Ouen-des-Champs", +"Saint-Ouen-du-Breuil", +"Saint-Ouen-du-Mesnil-Oger", +"Saint-Ouen-du-Tilleul", +"Saint-Ouen-en-Belin", +"Saint-Ouen-en-Brie", +"Saint-Ouen-en-Champagne", +"Saint-Ouen-l'Aumône", +"Saint-Ouen-la-Rouërie", +"Saint-Ouen-la-Thène", +"Saint-Ouen-le-Brisoult", +"Saint-Ouen-le-Mauger", +"Saint-Ouen-le-Pin", +"Saint-Ouen-les-Vignes", +"Saint-Ouen-lès-Parey", +"Saint-Ouen-sous-Bailly", +"Saint-Ouen-sur-Gartempe", +"Saint-Ouen-sur-Iton", +"Saint-Ouen-sur-Loire", +"Saint-Ouen-sur-Morin", +"Saint-Oulph", +"Saint-Ours", +"Saint-Outrille", +"Saint-Ouën-des-Toits", +"Saint-Ouën-des-Vallons", +"Saint-Ovin", +"Saint-Oyen", +"Saint-Pabu", +"Saint-Pair", +"Saint-Pair-sur-Mer", +"Saint-Pal-de-Chalencon", +"Saint-Pal-de-Mons", +"Saint-Pal-de-Senouire", +"Saint-Palais", +"Saint-Palais-de-Négrignac", +"Saint-Palais-de-Phiolin", +"Saint-Palais-du-Né", +"Saint-Palais-sur-Mer", +"Saint-Pancrace", +"Saint-Pancrasse", +"Saint-Pancré", +"Saint-Pandelon", +"Saint-Pantaly-d'Ans", +"Saint-Pantaly-d'Excideuil", +"Saint-Pantaléon", +"Saint-Pantaléon-de-Lapleau", +"Saint-Pantaléon-de-Larche", +"Saint-Pantaléon-les-Vignes", +"Saint-Papoul", +"Saint-Pardon-de-Conques", +"Saint-Pardoult", +"Saint-Pardoux", +"Saint-Pardoux-Corbier", +"Saint-Pardoux-Isaac", +"Saint-Pardoux-Morterolles", +"Saint-Pardoux-d'Arnet", +"Saint-Pardoux-de-Drône", +"Saint-Pardoux-du-Breuil", +"Saint-Pardoux-et-Vielvic", +"Saint-Pardoux-l'Ortigier", +"Saint-Pardoux-la-Croisille", +"Saint-Pardoux-la-Rivière", +"Saint-Pardoux-le-Neuf", +"Saint-Pardoux-le-Vieux", +"Saint-Pardoux-les-Cards", +"Saint-Pargoire", +"Saint-Parize-en-Viry", +"Saint-Parize-le-Châtel", +"Saint-Parres-aux-Tertres", +"Saint-Parres-lès-Vaudes", +"Saint-Parthem", +"Saint-Pastour", +"Saint-Pastous", +"Saint-Paterne", +"Saint-Paterne-Racan", +"Saint-Pathus", +"Saint-Patrice", +"Saint-Patrice-de-Claids", +"Saint-Patrice-du-Désert", +"Saint-Paul", +"Saint-Paul - Flaugnac", +"Saint-Paul-Cap-de-Joux", +"Saint-Paul-Lizonne", +"Saint-Paul-Mont-Penit", +"Saint-Paul-Trois-Châteaux", +"Saint-Paul-aux-Bois", +"Saint-Paul-d'Espis", +"Saint-Paul-d'Izeaux", +"Saint-Paul-d'Oueil", +"Saint-Paul-d'Uzore", +"Saint-Paul-de-Baïse", +"Saint-Paul-de-Fenouillet", +"Saint-Paul-de-Fourques", +"Saint-Paul-de-Jarrat", +"Saint-Paul-de-Salers", +"Saint-Paul-de-Serre", +"Saint-Paul-de-Tartas", +"Saint-Paul-de-Varax", +"Saint-Paul-de-Varces", +"Saint-Paul-de-Vence", +"Saint-Paul-de-Vern", +"Saint-Paul-de-Vézelin", +"Saint-Paul-des-Landes", +"Saint-Paul-du-Bois", +"Saint-Paul-du-Vernay", +"Saint-Paul-en-Born", +"Saint-Paul-en-Chablais", +"Saint-Paul-en-Cornillon", +"Saint-Paul-en-Forêt", +"Saint-Paul-en-Gâtine", +"Saint-Paul-en-Jarez", +"Saint-Paul-en-Pareds", +"Saint-Paul-et-Valmalle", +"Saint-Paul-la-Coste", +"Saint-Paul-la-Roche", +"Saint-Paul-le-Froid", +"Saint-Paul-le-Gaultier", +"Saint-Paul-le-Jeune", +"Saint-Paul-les-Fonts", +"Saint-Paul-lès-Dax", +"Saint-Paul-lès-Durance", +"Saint-Paul-lès-Monestier", +"Saint-Paul-lès-Romans", +"Saint-Paul-sur-Isère", +"Saint-Paul-sur-Save", +"Saint-Paul-sur-Ubaye", +"Saint-Paulet", +"Saint-Paulet-de-Caisson", +"Saint-Paulien", +"Saint-Pavace", +"Saint-Paër", +"Saint-Pellerin", +"Saint-Perdon", +"Saint-Perdoux", +"Saint-Pern", +"Saint-Perreux", +"Saint-Pey-d'Armens", +"Saint-Pey-de-Castets", +"Saint-Phal", +"Saint-Philbert-de-Bouaine", +"Saint-Philbert-de-Grand-Lieu", +"Saint-Philbert-des-Champs", +"Saint-Philbert-du-Peuple", +"Saint-Philbert-sur-Boissey", +"Saint-Philbert-sur-Orne", +"Saint-Philbert-sur-Risle", +"Saint-Philibert", +"Saint-Philippe", +"Saint-Philippe-d'Aiguille", +"Saint-Philippe-du-Seignal", +"Saint-Piat", +"Saint-Pierre", +"Saint-Pierre-Aigle", +"Saint-Pierre-Avez", +"Saint-Pierre-Azif", +"Saint-Pierre-Bellevue", +"Saint-Pierre-Bois", +"Saint-Pierre-Brouck", +"Saint-Pierre-Bénouville", +"Saint-Pierre-Canivet", +"Saint-Pierre-Chérignat", +"Saint-Pierre-Colamine", +"Saint-Pierre-Eynac", +"Saint-Pierre-Lafeuille", +"Saint-Pierre-Langers", +"Saint-Pierre-Laval", +"Saint-Pierre-Lavis", +"Saint-Pierre-Quiberon", +"Saint-Pierre-Roche", +"Saint-Pierre-Saint-Jean", +"Saint-Pierre-Toirac", +"Saint-Pierre-d'Albigny", +"Saint-Pierre-d'Alvey", +"Saint-Pierre-d'Amilly", +"Saint-Pierre-d'Argençon", +"Saint-Pierre-d'Arthéglise", +"Saint-Pierre-d'Aubézies", +"Saint-Pierre-d'Aurillac", +"Saint-Pierre-d'Autils", +"Saint-Pierre-d'Entremont", +"Saint-Pierre-d'Exideuil", +"Saint-Pierre-d'Eyraud", +"Saint-Pierre-d'Irube", +"Saint-Pierre-d'Oléron", +"Saint-Pierre-de-Bailleul", +"Saint-Pierre-de-Bat", +"Saint-Pierre-de-Belleville", +"Saint-Pierre-de-Bressieux", +"Saint-Pierre-de-Buzet", +"Saint-Pierre-de-Bœuf", +"Saint-Pierre-de-Cernières", +"Saint-Pierre-de-Chandieu", +"Saint-Pierre-de-Chartreuse", +"Saint-Pierre-de-Chevillé", +"Saint-Pierre-de-Chignac", +"Saint-Pierre-de-Chérennes", +"Saint-Pierre-de-Clairac", +"Saint-Pierre-de-Colombier", +"Saint-Pierre-de-Cormeilles", +"Saint-Pierre-de-Coutances", +"Saint-Pierre-de-Curtille", +"Saint-Pierre-de-Côle", +"Saint-Pierre-de-Frugie", +"Saint-Pierre-de-Fursac", +"Saint-Pierre-de-Genebroz", +"Saint-Pierre-de-Jards", +"Saint-Pierre-de-Juillers", +"Saint-Pierre-de-Lages", +"Saint-Pierre-de-Lamps", +"Saint-Pierre-de-Maillé", +"Saint-Pierre-de-Manneville", +"Saint-Pierre-de-Mons", +"Saint-Pierre-de-Méaroz", +"Saint-Pierre-de-Mésage", +"Saint-Pierre-de-Mézoargues", +"Saint-Pierre-de-Nogaret", +"Saint-Pierre-de-Plesguen", +"Saint-Pierre-de-Rivière", +"Saint-Pierre-de-Salerne", +"Saint-Pierre-de-Semilly", +"Saint-Pierre-de-Soucy", +"Saint-Pierre-de-Trivisy", +"Saint-Pierre-de-Varengeville", +"Saint-Pierre-de-Varennes", +"Saint-Pierre-de-Vassols", +"Saint-Pierre-de-l'Isle", +"Saint-Pierre-de-la-Fage", +"Saint-Pierre-dels-Forcats", +"Saint-Pierre-des-Bois", +"Saint-Pierre-des-Champs", +"Saint-Pierre-des-Corps", +"Saint-Pierre-des-Fleurs", +"Saint-Pierre-des-Ifs", +"Saint-Pierre-des-Jonquières", +"Saint-Pierre-des-Landes", +"Saint-Pierre-des-Loges", +"Saint-Pierre-des-Nids", +"Saint-Pierre-des-Ormes", +"Saint-Pierre-des-Tripiers", +"Saint-Pierre-des-Échaubrognes", +"Saint-Pierre-du-Bosguérard", +"Saint-Pierre-du-Bû", +"Saint-Pierre-du-Champ", +"Saint-Pierre-du-Chemin", +"Saint-Pierre-du-Fresne", +"Saint-Pierre-du-Jonquet", +"Saint-Pierre-du-Lorouër", +"Saint-Pierre-du-Mont", +"Saint-Pierre-du-Palais", +"Saint-Pierre-du-Perray", +"Saint-Pierre-du-Regard", +"Saint-Pierre-du-Val", +"Saint-Pierre-du-Vauvray", +"Saint-Pierre-en-Faucigny", +"Saint-Pierre-en-Port", +"Saint-Pierre-en-Val", +"Saint-Pierre-en-Vaux", +"Saint-Pierre-es-Champs", +"Saint-Pierre-la-Bourlhonne", +"Saint-Pierre-la-Bruyère", +"Saint-Pierre-la-Cour", +"Saint-Pierre-la-Garenne", +"Saint-Pierre-la-Noaille", +"Saint-Pierre-la-Palud", +"Saint-Pierre-la-Rivière", +"Saint-Pierre-la-Roche", +"Saint-Pierre-le-Bost", +"Saint-Pierre-le-Chastel", +"Saint-Pierre-le-Moûtier", +"Saint-Pierre-le-Vieux", +"Saint-Pierre-le-Viger", +"Saint-Pierre-les-Bois", +"Saint-Pierre-les-Étieux", +"Saint-Pierre-lès-Bitry", +"Saint-Pierre-lès-Elbeuf", +"Saint-Pierre-lès-Franqueville", +"Saint-Pierre-lès-Nemours", +"Saint-Pierre-sur-Dives", +"Saint-Pierre-sur-Doux", +"Saint-Pierre-sur-Dropt", +"Saint-Pierre-sur-Erve", +"Saint-Pierre-sur-Orthe", +"Saint-Pierre-sur-Vence", +"Saint-Pierre-Église", +"Saint-Pierre-à-Arnes", +"Saint-Pierremont", +"Saint-Pierreville", +"Saint-Pierrevillers", +"Saint-Plaisir", +"Saint-Plancard", +"Saint-Planchers", +"Saint-Plantaire", +"Saint-Point", +"Saint-Point-Lac", +"Saint-Pois", +"Saint-Poix", +"Saint-Pol-de-Léon", +"Saint-Pol-sur-Ternoise", +"Saint-Polgues", +"Saint-Polycarpe", +"Saint-Pompain", +"Saint-Pompont", +"Saint-Poncy", +"Saint-Pons", +"Saint-Pons-de-Mauchiens", +"Saint-Pons-de-Thomières", +"Saint-Pons-la-Calm", +"Saint-Pont", +"Saint-Porchaire", +"Saint-Porquier", +"Saint-Pouange", +"Saint-Pourçain-sur-Besbre", +"Saint-Pourçain-sur-Sioule", +"Saint-Prancher", +"Saint-Prest", +"Saint-Preuil", +"Saint-Priest", +"Saint-Priest-Bramefant", +"Saint-Priest-Ligoure", +"Saint-Priest-Palus", +"Saint-Priest-Taurion", +"Saint-Priest-d'Andelot", +"Saint-Priest-de-Gimel", +"Saint-Priest-des-Champs", +"Saint-Priest-en-Jarez", +"Saint-Priest-en-Murat", +"Saint-Priest-la-Feuille", +"Saint-Priest-la-Marche", +"Saint-Priest-la-Plaine", +"Saint-Priest-la-Prugne", +"Saint-Priest-la-Roche", +"Saint-Priest-la-Vêtre", +"Saint-Priest-les-Fougères", +"Saint-Priest-sous-Aixe", +"Saint-Prim", +"Saint-Privat", +"Saint-Privat-d'Allier", +"Saint-Privat-de-Champclos", +"Saint-Privat-de-Vallongue", +"Saint-Privat-des-Prés", +"Saint-Privat-des-Vieux", +"Saint-Privat-du-Dragon", +"Saint-Privat-du-Fau", +"Saint-Privat-la-Montagne", +"Saint-Privé", +"Saint-Prix", +"Saint-Prix-lès-Arnay", +"Saint-Projet", +"Saint-Projet-Saint-Constant", +"Saint-Projet-de-Salers", +"Saint-Prouant", +"Saint-Pryvé-Saint-Mesmin", +"Saint-Préjet-Armandon", +"Saint-Préjet-d'Allier", +"Saint-Puy", +"Saint-Python", +"Saint-Père", +"Saint-Père-en-Retz", +"Saint-Père-sur-Loire", +"Saint-Pé-Delbosc", +"Saint-Pé-Saint-Simon", +"Saint-Pé-d'Ardet", +"Saint-Pé-de-Bigorre", +"Saint-Pé-de-Léren", +"Saint-Pée-sur-Nivelle", +"Saint-Péran", +"Saint-Péravy-la-Colombe", +"Saint-Péray", +"Saint-Péreuse", +"Saint-Péver", +"Saint-Pôtan", +"Saint-Quantin-de-Rançanne", +"Saint-Quay-Perros", +"Saint-Quay-Portrieux", +"Saint-Quentin", +"Saint-Quentin-Fallavier", +"Saint-Quentin-de-Baron", +"Saint-Quentin-de-Blavou", +"Saint-Quentin-de-Caplong", +"Saint-Quentin-de-Chalais", +"Saint-Quentin-des-Isles", +"Saint-Quentin-des-Prés", +"Saint-Quentin-du-Dropt", +"Saint-Quentin-en-Tourmont", +"Saint-Quentin-la-Chabanne", +"Saint-Quentin-la-Motte-Croix-au-Bailly", +"Saint-Quentin-la-Poterie", +"Saint-Quentin-la-Tour", +"Saint-Quentin-le-Petit", +"Saint-Quentin-le-Verger", +"Saint-Quentin-les-Anges", +"Saint-Quentin-les-Chardonnets", +"Saint-Quentin-les-Marais", +"Saint-Quentin-sur-Charente", +"Saint-Quentin-sur-Coole", +"Saint-Quentin-sur-Indrois", +"Saint-Quentin-sur-Isère", +"Saint-Quentin-sur-Nohain", +"Saint-Quentin-sur-Sauxillanges", +"Saint-Quentin-sur-le-Homme", +"Saint-Quintin-sur-Sioule", +"Saint-Quirc", +"Saint-Quirin", +"Saint-Rabier", +"Saint-Racho", +"Saint-Rambert-d'Albon", +"Saint-Rambert-en-Bugey", +"Saint-Raphaël", +"Saint-Remimont", +"Saint-Remy", +"Saint-Remy-Chaussée", +"Saint-Remy-du-Nord", +"Saint-Remy-en-Bouzemont-Saint-Genest-et-Isson", +"Saint-Remy-en-l'Eau", +"Saint-Remy-la-Calonne", +"Saint-Remy-le-Petit", +"Saint-Remy-sous-Barbuise", +"Saint-Remy-sous-Broyes", +"Saint-Remy-sur-Bussy", +"Saint-Remèze", +"Saint-Renan", +"Saint-Restitut", +"Saint-Rieul", +"Saint-Rimay", +"Saint-Riquier", +"Saint-Riquier-en-Rivière", +"Saint-Riquier-ès-Plains", +"Saint-Rirand", +"Saint-Rivoal", +"Saint-Robert", +"Saint-Roch", +"Saint-Roch-sur-Égrenne", +"Saint-Rogatien", +"Saint-Romain", +"Saint-Romain-Lachalm", +"Saint-Romain-au-Mont-d'Or", +"Saint-Romain-d'Ay", +"Saint-Romain-d'Urfé", +"Saint-Romain-de-Benet", +"Saint-Romain-de-Colbosc", +"Saint-Romain-de-Jalionas", +"Saint-Romain-de-Lerps", +"Saint-Romain-de-Monpazier", +"Saint-Romain-de-Popey", +"Saint-Romain-de-Surieu", +"Saint-Romain-en-Gal", +"Saint-Romain-en-Gier", +"Saint-Romain-en-Jarez", +"Saint-Romain-en-Viennois", +"Saint-Romain-et-Saint-Clément", +"Saint-Romain-la-Motte", +"Saint-Romain-la-Virvée", +"Saint-Romain-le-Noble", +"Saint-Romain-le-Puy", +"Saint-Romain-les-Atheux", +"Saint-Romain-sous-Gourdon", +"Saint-Romain-sous-Versigny", +"Saint-Romain-sur-Cher", +"Saint-Romain-sur-Gironde", +"Saint-Roman", +"Saint-Roman-de-Codières", +"Saint-Roman-de-Malegarde", +"Saint-Romans", +"Saint-Romans-des-Champs", +"Saint-Romans-lès-Melle", +"Saint-Rome", +"Saint-Rome-de-Cernon", +"Saint-Rome-de-Dolan", +"Saint-Rome-de-Tarn", +"Saint-Rustice", +"Saint-Règle", +"Saint-Régis-du-Coin", +"Saint-Rémy", +"Saint-Rémy-Blanzy", +"Saint-Rémy-Boscrocourt", +"Saint-Rémy-au-Bois", +"Saint-Rémy-aux-Bois", +"Saint-Rémy-de-Blot", +"Saint-Rémy-de-Chargnat", +"Saint-Rémy-de-Chaudes-Aigues", +"Saint-Rémy-de-Maurienne", +"Saint-Rémy-de-Provence", +"Saint-Rémy-de-Sillé", +"Saint-Rémy-des-Monts", +"Saint-Rémy-du-Plain", +"Saint-Rémy-du-Val", +"Saint-Rémy-en-Rollat", +"Saint-Rémy-l'Honoré", +"Saint-Rémy-la-Vanne", +"Saint-Rémy-la-Varenne", +"Saint-Rémy-lès-Chevreuse", +"Saint-Rémy-sur-Avre", +"Saint-Rémy-sur-Creuse", +"Saint-Rémy-sur-Durolle", +"Saint-Révérend", +"Saint-Révérien", +"Saint-Saire", +"Saint-Salvadour", +"Saint-Salvi-de-Carcavès", +"Saint-Salvy", +"Saint-Salvy-de-la-Balme", +"Saint-Samson", +"Saint-Samson-de-la-Roque", +"Saint-Samson-la-Poterie", +"Saint-Samson-sur-Rance", +"Saint-Sandoux", +"Saint-Santin", +"Saint-Santin-Cantalès", +"Saint-Santin-de-Maurs", +"Saint-Sardos", +"Saint-Satur", +"Saint-Saturnin", +"Saint-Saturnin-de-Lenne", +"Saint-Saturnin-de-Lucian", +"Saint-Saturnin-du-Bois", +"Saint-Saturnin-du-Limet", +"Saint-Saturnin-lès-Apt", +"Saint-Saturnin-lès-Avignon", +"Saint-Saturnin-sur-Loire", +"Saint-Saud-Lacoussière", +"Saint-Sauflieu", +"Saint-Saulge", +"Saint-Saulve", +"Saint-Saury", +"Saint-Sauvant", +"Saint-Sauves-d'Auvergne", +"Saint-Sauveur", +"Saint-Sauveur-Camprieu", +"Saint-Sauveur-Gouvernet", +"Saint-Sauveur-Lalande", +"Saint-Sauveur-Lendelin", +"Saint-Sauveur-Marville", +"Saint-Sauveur-d'Aunis", +"Saint-Sauveur-d'Émalleville", +"Saint-Sauveur-de-Carrouges", +"Saint-Sauveur-de-Cruzières", +"Saint-Sauveur-de-Flée", +"Saint-Sauveur-de-Ginestoux", +"Saint-Sauveur-de-Meilhan", +"Saint-Sauveur-de-Montagut", +"Saint-Sauveur-de-Peyre", +"Saint-Sauveur-de-Pierrepont", +"Saint-Sauveur-de-Puynormand", +"Saint-Sauveur-des-Landes", +"Saint-Sauveur-en-Diois", +"Saint-Sauveur-en-Puisaye", +"Saint-Sauveur-en-Rue", +"Saint-Sauveur-la-Pommeraye", +"Saint-Sauveur-la-Sagne", +"Saint-Sauveur-le-Vicomte", +"Saint-Sauveur-lès-Bray", +"Saint-Sauveur-sur-Tinée", +"Saint-Sauveur-sur-École", +"Saint-Sauvier", +"Saint-Sauvy", +"Saint-Savin", +"Saint-Savinien", +"Saint-Saviol", +"Saint-Savournin", +"Saint-Saëns", +"Saint-Secondin", +"Saint-Seine", +"Saint-Seine-en-Bâche", +"Saint-Seine-l'Abbaye", +"Saint-Seine-sur-Vingeanne", +"Saint-Selve", +"Saint-Senier-de-Beuvron", +"Saint-Senier-sous-Avranches", +"Saint-Senoch", +"Saint-Senoux", +"Saint-Sernin", +"Saint-Sernin-du-Bois", +"Saint-Sernin-du-Plain", +"Saint-Sernin-lès-Lavaur", +"Saint-Sernin-sur-Rance", +"Saint-Servais", +"Saint-Servant", +"Saint-Setiers", +"Saint-Seurin-de-Bourg", +"Saint-Seurin-de-Cadourne", +"Saint-Seurin-de-Cursac", +"Saint-Seurin-de-Palenne", +"Saint-Seurin-de-Prats", +"Saint-Seurin-sur-l'Isle", +"Saint-Sever", +"Saint-Sever-Calvados", +"Saint-Sever-de-Rustan", +"Saint-Sever-de-Saintonge", +"Saint-Sever-du-Moustier", +"Saint-Siffret", +"Saint-Sigismond", +"Saint-Sigismond-de-Clermont", +"Saint-Silvain-Bas-le-Roc", +"Saint-Silvain-Bellegarde", +"Saint-Silvain-Montaigut", +"Saint-Silvain-sous-Toulx", +"Saint-Simeux", +"Saint-Simon", +"Saint-Simon-de-Bordes", +"Saint-Simon-de-Pellouaille", +"Saint-Siméon", +"Saint-Siméon-de-Bressieux", +"Saint-Sixt", +"Saint-Sixte", +"Saint-Solve", +"Saint-Sorlin", +"Saint-Sorlin-d'Arves", +"Saint-Sorlin-de-Conac", +"Saint-Sorlin-de-Morestel", +"Saint-Sorlin-de-Vienne", +"Saint-Sorlin-en-Bugey", +"Saint-Sorlin-en-Valloire", +"Saint-Sornin", +"Saint-Sornin-Lavolps", +"Saint-Sornin-Leulac", +"Saint-Sornin-la-Marche", +"Saint-Soulan", +"Saint-Souplet", +"Saint-Souplet-sur-Py", +"Saint-Soupplets", +"Saint-Sozy", +"Saint-Stail", +"Saint-Suliac", +"Saint-Sulpice", +"Saint-Sulpice-Laurière", +"Saint-Sulpice-d'Arnoult", +"Saint-Sulpice-d'Excideuil", +"Saint-Sulpice-de-Cognac", +"Saint-Sulpice-de-Faleyrens", +"Saint-Sulpice-de-Favières", +"Saint-Sulpice-de-Grimbouville", +"Saint-Sulpice-de-Guilleragues", +"Saint-Sulpice-de-Mareuil", +"Saint-Sulpice-de-Pommeray", +"Saint-Sulpice-de-Pommiers", +"Saint-Sulpice-de-Roumagnac", +"Saint-Sulpice-de-Royan", +"Saint-Sulpice-de-Ruffec", +"Saint-Sulpice-des-Landes", +"Saint-Sulpice-des-Rivoires", +"Saint-Sulpice-en-Pareds", +"Saint-Sulpice-et-Cameyrac", +"Saint-Sulpice-la-Forêt", +"Saint-Sulpice-la-Pointe", +"Saint-Sulpice-le-Dunois", +"Saint-Sulpice-le-Guérétois", +"Saint-Sulpice-les-Bois", +"Saint-Sulpice-les-Champs", +"Saint-Sulpice-les-Feuilles", +"Saint-Sulpice-sur-Lèze", +"Saint-Sulpice-sur-Risle", +"Saint-Supplet", +"Saint-Sylvain", +"Saint-Sylvestre", +"Saint-Sylvestre-Cappel", +"Saint-Sylvestre-Pragoulin", +"Saint-Sylvestre-de-Cormeilles", +"Saint-Sylvestre-sur-Lot", +"Saint-Symphorien", +"Saint-Symphorien-d'Ancelles", +"Saint-Symphorien-d'Ozon", +"Saint-Symphorien-de-Lay", +"Saint-Symphorien-de-Mahun", +"Saint-Symphorien-de-Marmagne", +"Saint-Symphorien-de-Thénières", +"Saint-Symphorien-des-Bois", +"Saint-Symphorien-des-Bruyères", +"Saint-Symphorien-sous-Chomérac", +"Saint-Symphorien-sur-Coise", +"Saint-Symphorien-sur-Couze", +"Saint-Symphorien-sur-Saône", +"Saint-Sève", +"Saint-Sébastien", +"Saint-Sébastien-d'Aigrefeuille", +"Saint-Sébastien-de-Morsent", +"Saint-Sébastien-de-Raids", +"Saint-Sébastien-sur-Loire", +"Saint-Ségal", +"Saint-Séglin", +"Saint-Sériès", +"Saint-Sérotin", +"Saint-Séverin", +"Saint-Séverin-d'Estissac", +"Saint-Séverin-sur-Boutonne", +"Saint-Thegonnec Loc-Eguiner", +"Saint-Thibaud-de-Couz", +"Saint-Thibault", +"Saint-Thibault-des-Vignes", +"Saint-Thibaut", +"Saint-Thibéry", +"Saint-Thierry", +"Saint-Thiébaud", +"Saint-Thiébault", +"Saint-Thois", +"Saint-Thomas", +"Saint-Thomas-de-Conac", +"Saint-Thomas-de-Courceriers", +"Saint-Thomas-en-Argonne", +"Saint-Thomas-en-Royans", +"Saint-Thomas-la-Garde", +"Saint-Thomé", +"Saint-Thonan", +"Saint-Thual", +"Saint-Thurial", +"Saint-Thuriau", +"Saint-Thurien", +"Saint-Thurin", +"Saint-Thélo", +"Saint-Théodorit", +"Saint-Théoffrey", +"Saint-Tricat", +"Saint-Trimoël", +"Saint-Trinit", +"Saint-Trivier-de-Courtes", +"Saint-Trivier-sur-Moignans", +"Saint-Trojan", +"Saint-Trojan-les-Bains", +"Saint-Tropez", +"Saint-Tugdual", +"Saint-Ulphace", +"Saint-Ulrich", +"Saint-Uniac", +"Saint-Urbain", +"Saint-Urbain-Maconcourt", +"Saint-Urcisse", +"Saint-Urcize", +"Saint-Usage", +"Saint-Usuge", +"Saint-Utin", +"Saint-Uze", +"Saint-Vaast-Dieppedalle", +"Saint-Vaast-d'Équiqueville", +"Saint-Vaast-de-Longmont", +"Saint-Vaast-du-Val", +"Saint-Vaast-en-Auge", +"Saint-Vaast-en-Cambrésis", +"Saint-Vaast-en-Chaussée", +"Saint-Vaast-la-Hougue", +"Saint-Vaast-lès-Mello", +"Saint-Vaast-sur-Seulles", +"Saint-Vaize", +"Saint-Valbert", +"Saint-Valentin", +"Saint-Valery", +"Saint-Valery-en-Caux", +"Saint-Valery-sur-Somme", +"Saint-Vallerin", +"Saint-Vallier", +"Saint-Vallier-de-Thiey", +"Saint-Vallier-sur-Marne", +"Saint-Valérien", +"Saint-Varent", +"Saint-Vaury", +"Saint-Venant", +"Saint-Vert", +"Saint-Viance", +"Saint-Viaud", +"Saint-Victeur", +"Saint-Victor", +"Saint-Victor-Malescours", +"Saint-Victor-Montvianeix", +"Saint-Victor-Rouzaud", +"Saint-Victor-d'Épine", +"Saint-Victor-de-Buthon", +"Saint-Victor-de-Cessieu", +"Saint-Victor-de-Chrétienville", +"Saint-Victor-de-Malcap", +"Saint-Victor-de-Morestel", +"Saint-Victor-des-Oules", +"Saint-Victor-en-Marche", +"Saint-Victor-et-Melvieu", +"Saint-Victor-l'Abbaye", +"Saint-Victor-la-Coste", +"Saint-Victor-la-Rivière", +"Saint-Victor-sur-Arlanc", +"Saint-Victor-sur-Avre", +"Saint-Victor-sur-Ouche", +"Saint-Victor-sur-Rhins", +"Saint-Victoret", +"Saint-Victour", +"Saint-Victurnien", +"Saint-Vidal", +"Saint-Vigor", +"Saint-Vigor-d'Ymonville", +"Saint-Vigor-des-Monts", +"Saint-Vigor-des-Mézerets", +"Saint-Vigor-le-Grand", +"Saint-Vincent", +"Saint-Vincent-Bragny", +"Saint-Vincent-Cramesnil", +"Saint-Vincent-Jalmoutiers", +"Saint-Vincent-Lespinasse", +"Saint-Vincent-Rive-d'Olt", +"Saint-Vincent-Sterlanges", +"Saint-Vincent-d'Autéjac", +"Saint-Vincent-d'Olargues", +"Saint-Vincent-de-Barbeyrargues", +"Saint-Vincent-de-Barrès", +"Saint-Vincent-de-Boisset", +"Saint-Vincent-de-Connezac", +"Saint-Vincent-de-Cosse", +"Saint-Vincent-de-Durfort", +"Saint-Vincent-de-Lamontjoie", +"Saint-Vincent-de-Mercuze", +"Saint-Vincent-de-Paul", +"Saint-Vincent-de-Pertignas", +"Saint-Vincent-de-Reins", +"Saint-Vincent-de-Salers", +"Saint-Vincent-de-Tyrosse", +"Saint-Vincent-des-Bois", +"Saint-Vincent-des-Landes", +"Saint-Vincent-des-Prés", +"Saint-Vincent-du-Boulay", +"Saint-Vincent-du-Lorouër", +"Saint-Vincent-du-Pendit", +"Saint-Vincent-en-Bresse", +"Saint-Vincent-la-Châtre", +"Saint-Vincent-la-Commanderie", +"Saint-Vincent-le-Paluel", +"Saint-Vincent-les-Forts", +"Saint-Vincent-sur-Graon", +"Saint-Vincent-sur-Jabron", +"Saint-Vincent-sur-Jard", +"Saint-Vincent-sur-Oust", +"Saint-Vincent-sur-l'Isle", +"Saint-Vit", +"Saint-Vital", +"Saint-Vite", +"Saint-Vitte", +"Saint-Vitte-sur-Briance", +"Saint-Vivien", +"Saint-Vivien-de-Blaye", +"Saint-Vivien-de-Monségur", +"Saint-Vivien-de-Médoc", +"Saint-Viâtre", +"Saint-Voir", +"Saint-Vougay", +"Saint-Vrain", +"Saint-Vran", +"Saint-Vulbas", +"Saint-Vénérand", +"Saint-Vérain", +"Saint-Véran", +"Saint-Vérand", +"Saint-Waast", +"Saint-Witz", +"Saint-Xandre", +"Saint-Yaguen", +"Saint-Yan", +"Saint-Ybard", +"Saint-Ybars", +"Saint-Yon", +"Saint-Yorre", +"Saint-Yrieix-la-Montagne", +"Saint-Yrieix-la-Perche", +"Saint-Yrieix-le-Déjalat", +"Saint-Yrieix-les-Bois", +"Saint-Yrieix-sous-Aixe", +"Saint-Yrieix-sur-Charente", +"Saint-Ythaire", +"Saint-Yvi", +"Saint-Yvoine", +"Saint-Yzan-de-Soudiac", +"Saint-Yzans-de-Médoc", +"Saint-Zacharie", +"Saint-Ébremond-de-Bonfossé", +"Saint-Égrève", +"Saint-Élie", +"Saint-Élier", +"Saint-Éliph", +"Saint-Élix", +"Saint-Élix-Séglan", +"Saint-Élix-Theux", +"Saint-Élix-le-Château", +"Saint-Éloi", +"Saint-Éloi-de-Fourques", +"Saint-Éloy-d'Allier", +"Saint-Éloy-de-Gy", +"Saint-Éloy-la-Glacière", +"Saint-Éloy-les-Mines", +"Saint-Éloy-les-Tuileries", +"Saint-Éman", +"Saint-Émiland", +"Saint-Émilion", +"Saint-Épain", +"Saint-Étienne", +"Saint-Étienne-Cantalès", +"Saint-Étienne-Estréchoux", +"Saint-Étienne-Lardeyrol", +"Saint-Étienne-Roilaye", +"Saint-Étienne-Vallée-Française", +"Saint-Étienne-au-Mont", +"Saint-Étienne-au-Temple", +"Saint-Étienne-aux-Clos", +"Saint-Étienne-d'Albagnan", +"Saint-Étienne-d'Orthe", +"Saint-Étienne-de-Baïgorry", +"Saint-Étienne-de-Boulogne", +"Saint-Étienne-de-Brillouet", +"Saint-Étienne-de-Carlat", +"Saint-Étienne-de-Chigny", +"Saint-Étienne-de-Chomeil", +"Saint-Étienne-de-Crossey", +"Saint-Étienne-de-Cuines", +"Saint-Étienne-de-Fontbellon", +"Saint-Étienne-de-Fougères", +"Saint-Étienne-de-Fursac", +"Saint-Étienne-de-Gourgas", +"Saint-Étienne-de-Lisse", +"Saint-Étienne-de-Lugdarès", +"Saint-Étienne-de-Maurs", +"Saint-Étienne-de-Mer-Morte", +"Saint-Étienne-de-Montluc", +"Saint-Étienne-de-Puycorbier", +"Saint-Étienne-de-Saint-Geoirs", +"Saint-Étienne-de-Serre", +"Saint-Étienne-de-Tinée", +"Saint-Étienne-de-Tulmont", +"Saint-Étienne-de-Valoux", +"Saint-Étienne-de-Vicq", +"Saint-Étienne-de-Villeréal", +"Saint-Étienne-de-l'Olm", +"Saint-Étienne-des-Champs", +"Saint-Étienne-des-Guérets", +"Saint-Étienne-des-Oullières", +"Saint-Étienne-des-Sorts", +"Saint-Étienne-du-Bois", +"Saint-Étienne-du-Grès", +"Saint-Étienne-du-Gué-de-l'Isle", +"Saint-Étienne-du-Rouvray", +"Saint-Étienne-du-Valdonnez", +"Saint-Étienne-du-Vauvray", +"Saint-Étienne-du-Vigan", +"Saint-Étienne-en-Bresse", +"Saint-Étienne-en-Coglès", +"Saint-Étienne-l'Allier", +"Saint-Étienne-la-Cigogne", +"Saint-Étienne-la-Geneste", +"Saint-Étienne-la-Thillaye", +"Saint-Étienne-la-Varenne", +"Saint-Étienne-le-Laus", +"Saint-Étienne-le-Molard", +"Saint-Étienne-les-Orgues", +"Saint-Étienne-lès-Remiremont", +"Saint-Étienne-sous-Bailleul", +"Saint-Étienne-sous-Barbuise", +"Saint-Étienne-sur-Blesle", +"Saint-Étienne-sur-Chalaronne", +"Saint-Étienne-sur-Reyssouze", +"Saint-Étienne-sur-Suippe", +"Saint-Étienne-sur-Usson", +"Saint-Étienne-à-Arnes", +"Saint-Évarzec", +"Sainte-Adresse", +"Sainte-Agathe", +"Sainte-Agathe-d'Aliermont", +"Sainte-Agathe-en-Donzy", +"Sainte-Agathe-la-Bouteresse", +"Sainte-Agnès", +"Sainte-Alauzie", +"Sainte-Alvère-Saint-Laurent Les Bâtons", +"Sainte-Anastasie", +"Sainte-Anastasie-sur-Issole", +"Sainte-Anne", +"Sainte-Anne-Saint-Priest", +"Sainte-Anne-d'Auray", +"Sainte-Anne-sur-Brivet", +"Sainte-Anne-sur-Gervonde", +"Sainte-Anne-sur-Vilaine", +"Sainte-Aulde", +"Sainte-Aurence-Cazaux", +"Sainte-Austreberthe", +"Sainte-Barbe", +"Sainte-Bazeille", +"Sainte-Beuve-en-Rivière", +"Sainte-Blandine", +"Sainte-Brigitte", +"Sainte-Camelle", +"Sainte-Catherine", +"Sainte-Catherine-de-Fierbois", +"Sainte-Christie", +"Sainte-Christie-d'Armagnac", +"Sainte-Christine", +"Sainte-Colombe", +"Sainte-Colombe-de-Duras", +"Sainte-Colombe-de-Peyre", +"Sainte-Colombe-de-Villeneuve", +"Sainte-Colombe-de-la-Commanderie", +"Sainte-Colombe-des-Bois", +"Sainte-Colombe-en-Auxois", +"Sainte-Colombe-en-Bruilhois", +"Sainte-Colombe-la-Commanderie", +"Sainte-Colombe-près-Vernon", +"Sainte-Colombe-sur-Gand", +"Sainte-Colombe-sur-Guette", +"Sainte-Colombe-sur-Loing", +"Sainte-Colombe-sur-Seine", +"Sainte-Colombe-sur-l'Hers", +"Sainte-Colome", +"Sainte-Consorce", +"Sainte-Croix", +"Sainte-Croix-Grand-Tonne", +"Sainte-Croix-Hague", +"Sainte-Croix-Vallée-Française", +"Sainte-Croix-Volvestre", +"Sainte-Croix-aux-Mines", +"Sainte-Croix-de-Caderle", +"Sainte-Croix-de-Mareuil", +"Sainte-Croix-de-Quintillargues", +"Sainte-Croix-du-Mont", +"Sainte-Croix-du-Verdon", +"Sainte-Croix-en-Jarez", +"Sainte-Croix-en-Plaine", +"Sainte-Croix-sur-Buchy", +"Sainte-Croix-sur-Mer", +"Sainte-Croix-à-Lauze", +"Sainte-Cécile", +"Sainte-Cécile-d'Andorge", +"Sainte-Cécile-du-Cayrou", +"Sainte-Cécile-les-Vignes", +"Sainte-Céronne-lès-Mortagne", +"Sainte-Cérotte", +"Sainte-Dode", +"Sainte-Eanne", +"Sainte-Engrâce", +"Sainte-Enimie", +"Sainte-Eugénie-de-Villeneuve", +"Sainte-Eulalie", +"Sainte-Eulalie-d'Ans", +"Sainte-Eulalie-d'Eymet", +"Sainte-Eulalie-d'Olt", +"Sainte-Eulalie-de-Cernon", +"Sainte-Eulalie-en-Born", +"Sainte-Eulalie-en-Royans", +"Sainte-Euphémie", +"Sainte-Euphémie-sur-Ouvèze", +"Sainte-Eusoye", +"Sainte-Fauste", +"Sainte-Feyre", +"Sainte-Feyre-la-Montagne", +"Sainte-Flaive-des-Loups", +"Sainte-Florence", +"Sainte-Florine", +"Sainte-Foi", +"Sainte-Fortunade", +"Sainte-Foy", +"Sainte-Foy-Saint-Sulpice", +"Sainte-Foy-Tarentaise", +"Sainte-Foy-d'Aigrefeuille", +"Sainte-Foy-de-Belvès", +"Sainte-Foy-de-Longas", +"Sainte-Foy-de-Peyrolières", +"Sainte-Foy-l'Argentière", +"Sainte-Foy-la-Grande", +"Sainte-Foy-la-Longue", +"Sainte-Foy-lès-Lyon", +"Sainte-Féréole", +"Sainte-Gauburge-Sainte-Colombe", +"Sainte-Gemme", +"Sainte-Gemme-Martaillac", +"Sainte-Gemme-Moronval", +"Sainte-Gemme-en-Sancerrois", +"Sainte-Gemme-la-Plaine", +"Sainte-Gemmes", +"Sainte-Gemmes-d'Andigné", +"Sainte-Gemmes-le-Robert", +"Sainte-Gemmes-sur-Loire", +"Sainte-Geneviève", +"Sainte-Geneviève-des-Bois", +"Sainte-Geneviève-lès-Gasny", +"Sainte-Hermine", +"Sainte-Honorine-de-Ducy", +"Sainte-Honorine-des-Pertes", +"Sainte-Honorine-du-Fay", +"Sainte-Honorine-la-Chardonne", +"Sainte-Honorine-la-Guillaume", +"Sainte-Hélène", +"Sainte-Hélène-Bondeville", +"Sainte-Hélène-du-Lac", +"Sainte-Hélène-sur-Isère", +"Sainte-Innocence", +"Sainte-Jalle", +"Sainte-Jamme-sur-Sarthe", +"Sainte-Julie", +"Sainte-Juliette", +"Sainte-Juliette-sur-Viaur", +"Sainte-Lheurine", +"Sainte-Livrade", +"Sainte-Livrade-sur-Lot", +"Sainte-Lizaigne", +"Sainte-Luce", +"Sainte-Luce-sur-Loire", +"Sainte-Lucie-de-Tallano", +"Sainte-Lunaise", +"Sainte-Léocadie", +"Sainte-Magnance", +"Sainte-Marguerite", +"Sainte-Marguerite-Lafigère", +"Sainte-Marguerite-d'Elle", +"Sainte-Marguerite-de-Carrouges", +"Sainte-Marguerite-de-Viette", +"Sainte-Marguerite-sur-Duclair", +"Sainte-Marguerite-sur-Fauville", +"Sainte-Marguerite-sur-Mer", +"Sainte-Marie", +"Sainte-Marie-Cappel", +"Sainte-Marie-Kerque", +"Sainte-Marie-Lapanouze", +"Sainte-Marie-Outre-l'Eau", +"Sainte-Marie-au-Bosc", +"Sainte-Marie-aux-Chênes", +"Sainte-Marie-aux-Mines", +"Sainte-Marie-d'Alloix", +"Sainte-Marie-d'Alvey", +"Sainte-Marie-d'Attez", +"Sainte-Marie-de-Chignac", +"Sainte-Marie-de-Cuines", +"Sainte-Marie-de-Gosse", +"Sainte-Marie-de-Ré", +"Sainte-Marie-de-Vatimesnil", +"Sainte-Marie-de-Vaux", +"Sainte-Marie-des-Champs", +"Sainte-Marie-du-Bois", +"Sainte-Marie-du-Lac-Nuisement", +"Sainte-Marie-du-Mont", +"Sainte-Marie-en-Chanois", +"Sainte-Marie-en-Chaux", +"Sainte-Marie-la-Blanche", +"Sainte-Marie-la-Robert", +"Sainte-Marie-sur-Ouche", +"Sainte-Marie-à-Py", +"Sainte-Marthe", +"Sainte-Maure", +"Sainte-Maure-de-Peyriac", +"Sainte-Maure-de-Touraine", +"Sainte-Maxime", +"Sainte-Menehould", +"Sainte-Mesme", +"Sainte-Mondane", +"Sainte-Montaine", +"Sainte-Mère", +"Sainte-Mère-Eglise", +"Sainte-Même", +"Sainte-Nathalène", +"Sainte-Néomaye", +"Sainte-Olive", +"Sainte-Opportune", +"Sainte-Opportune-du-Bosc", +"Sainte-Opportune-la-Mare", +"Sainte-Orse", +"Sainte-Osmane", +"Sainte-Ouenne", +"Sainte-Pallaye", +"Sainte-Paule", +"Sainte-Pazanne", +"Sainte-Pexine", +"Sainte-Preuve", +"Sainte-Pôle", +"Sainte-Radegonde", +"Sainte-Radégonde", +"Sainte-Radégonde-des-Noyers", +"Sainte-Ramée", +"Sainte-Reine", +"Sainte-Reine-de-Bretagne", +"Sainte-Rose", +"Sainte-Ruffine", +"Sainte-Sabine", +"Sainte-Sabine-sur-Longève", +"Sainte-Savine", +"Sainte-Scolasse-sur-Sarthe", +"Sainte-Segrée", +"Sainte-Sigolène", +"Sainte-Solange", +"Sainte-Soline", +"Sainte-Souline", +"Sainte-Soulle", +"Sainte-Suzanne", +"Sainte-Suzanne-et-Chammes", +"Sainte-Suzanne-sur-Vire", +"Sainte-Sève", +"Sainte-Sévère", +"Sainte-Sévère-sur-Indre", +"Sainte-Terre", +"Sainte-Thorette", +"Sainte-Thérence", +"Sainte-Trie", +"Sainte-Tréphine", +"Sainte-Tulle", +"Sainte-Valière", +"Sainte-Vaubourg", +"Sainte-Verge", +"Sainte-Vertu", +"Saintes-Maries-de-la-Mer", "Saintry-sur-Seine", +"Saints-Geosmes", +"Saints-en-Puisaye", "Saires-la-Verrerie", -"saisie-arrêt", -"saisie-attribution", -"saisie-brandon", -"saisie-exécution", -"saisie-gagerie", -"saisie-revendication", -"saisies-arrêts", -"saisies-attributions", -"saisies-brandons", -"saisies-exécutions", -"saisies-gageries", -"saisies-revendications", -"saisir-arrêter", -"saisir-brandonner", -"saisir-exécuter", -"saisir-gager", -"saisir-revendiquer", -"salafo-sioniste", -"salaire-coût", -"salaire-coûts", "Salaise-sur-Sanne", -"salamandre-tigre", "Salies-de-Béarn", "Salies-du-Salat", -"Salignac-de-Mirambeau", -"Salignac-de-Pons", "Salignac-Eyvignes", "Salignac-Eyvigues", +"Salignac-de-Mirambeau", +"Salignac-de-Pons", "Salignac-sur-Charente", "Saligny-le-Vif", "Saligny-sur-Roudon", "Salins-Fontaine", "Salins-les-Bains", "Salins-les-Thermes", -"Sallèles-Cabardès", -"Sallèles-d'Aude", -"salle-prunetais", "Salle-Prunetais", -"salle-prunetaise", "Salle-Prunetaise", -"salle-prunetaises", "Salle-Prunetaises", "Salles-Adour", "Salles-Arbuissonnas-en-Beaujolais", "Salles-Courbatiès", "Salles-Curan", +"Salles-Lavalette", +"Salles-Mongiscard", +"Salles-Sourçois", +"Salles-Sourçoise", +"Salles-Sourçoises", "Salles-d'Angles", "Salles-d'Armagnac", "Salles-d'Aude", @@ -21766,352 +15177,233 @@ FR_BASE_EXCEPTIONS = [ "Salles-en-Toulon", "Salles-et-Pratviel", "Salles-la-Source", -"Salles-Lavalette", "Salles-lès-Aulnay", -"Salles-Mongiscard", -"salles-sourçois", -"Salles-Sourçois", -"salles-sourçoise", -"Salles-Sourçoise", -"salles-sourçoises", -"Salles-Sourçoises", "Salles-sous-Bois", "Salles-sur-Garonne", -"Salles-sur-l'Hers", "Salles-sur-Mer", -"Salm-en-Vosges", +"Salles-sur-l'Hers", +"Sallèles-Cabardès", +"Sallèles-d'Aude", "Salm-Salm", +"Salm-en-Vosges", "Salon-de-Provence", "Salon-la-Tour", "Salornay-sur-Guye", -"salpingo-pharyngien", "Salses-le-Château", "Salt-en-Donzy", "Salvagnac-Cajarc", "Salvatierra-Agurain", -"salve-d'honneur", -"salves-d'honneur", "Samois-sur-Seine", -"(S)-amphétamine", "Sampigny-lès-Maranges", "Samsons-Lion", -"sam'suffit", -"sam'suffits", -"Sana'a", -"Sanary-sur-Mer", -"san-benito", -"san-bérinois", "San-Bérinois", -"san-bérinoise", "San-Bérinoise", -"san-bérinoises", "San-Bérinoises", -"Sancey-le-Grand", -"Sancey-le-Long", -"san-claudien", "San-Claudien", "San-Crucien", -"Sancti-Spíritus", -"sancto-bénédictin", -"Sancto-Bénédictin", -"sancto-bénédictine", -"Sancto-Bénédictine", -"sancto-bénédictines", -"Sancto-Bénédictines", -"sancto-bénédictins", -"Sancto-Bénédictins", -"sancto-julianais", -"Sancto-Julianais", -"sancto-julianaise", -"Sancto-Julianaise", -"sancto-julianaises", -"Sancto-Julianaises", -"sancto-prixin", -"Sancto-Prixin", -"sancto-prixine", -"Sancto-Prixine", -"sancto-prixines", -"Sancto-Prixines", -"sancto-prixins", -"Sancto-Prixins", -"Sancy-les-Cheminots", -"Sancy-lès-Provins", -"san-damianais", "San-Damianais", -"san-damianaise", "San-Damianaise", -"san-damianaises", "San-Damianaises", "San-Damiano", -"san-denien", "San-Denien", -"san-denienne", "San-Denienne", -"san-deniennes", "San-Deniennes", -"san-deniens", "San-Deniens", -"Sandersdorf-Brehna", -"san-desiderois", "San-Desiderois", -"san-desideroise", "San-Desideroise", -"san-desideroises", "San-Desideroises", -"san-farcios", "San-Farcios", -"san-farciose", "San-Farciose", -"san-farcioses", "San-Farcioses", -"san-ferrois", "San-Ferrois", -"san-ferroise", "San-Ferroise", -"san-ferroises", "San-Ferroises", "San-Gavino-d'Ampugnani", "San-Gavino-di-Carbini", "San-Gavino-di-Fiumorbo", "San-Gavino-di-Tenda", -"sang-de-bourbe", -"sang-de-dragon", -"san-genestois", "San-Genestois", -"san-genestoise", "San-Genestoise", -"san-genestoises", "San-Genestoises", -"san-germinois", "San-Germinois", -"san-germinoise", "San-Germinoise", -"san-germinoises", "San-Germinoises", -"sang-froid", -"sang-gris", "San-Giovanni-di-Moriani", "San-Giuliano", -"sang-mêlé", -"Sang-mêlé", -"sang-mêlés", -"Sang-mêlés", -"Sanilhac-Sagriès", -"sankaku-jime", -"san-lagiron", "San-Lagiron", -"san-lagirone", "San-Lagirone", -"san-lagirones", "San-Lagirones", -"san-lagirons", "San-Lagirons", "San-Lorenzo", "San-Martino-di-Lota", -"san-martinois", "San-Martinois", -"san-martinoise", "San-Martinoise", -"san-martinoises", "San-Martinoises", -"san-miardère", "San-Miardère", -"san-miardères", "San-Miardères", "San-Nicolao", -"san-palous", "San-Palous", -"san-palouse", "San-Palouse", -"san-palouses", "San-Palouses", -"san-pétri-montin", -"San-Pétri-Montin", -"san-pétri-montine", -"San-Pétri-Montine", -"san-pétri-montines", -"San-Pétri-Montines", -"san-pétri-montins", -"San-Pétri-Montins", -"san-pierran", "San-Pierran", -"san-pierrane", "San-Pierrane", -"san-pierranes", "San-Pierranes", -"san-pierrans", "San-Pierrans", "San-Priode", -"san-priot", "San-Priot", -"san-priote", -"san-priotes", "San-Priotes", -"san-priots", "San-Priots", -"san-rémois", +"San-Pétri-Montin", +"San-Pétri-Montine", +"San-Pétri-Montines", +"San-Pétri-Montins", "San-Rémois", -"san-rémoise", "San-Rémoise", -"san-rémoises", "San-Rémoises", +"San-Salvatorien", +"San-Salvatorienne", +"San-Salvatoriennes", +"San-Salvatoriens", +"San-Vitournaire", +"San-Vitournaires", +"Sana'a", +"Sanary-sur-Mer", +"Sancey-le-Grand", +"Sancey-le-Long", +"Sancti-Spíritus", +"Sancto-Bénédictin", +"Sancto-Bénédictine", +"Sancto-Bénédictines", +"Sancto-Bénédictins", +"Sancto-Julianais", +"Sancto-Julianaise", +"Sancto-Julianaises", +"Sancto-Prixin", +"Sancto-Prixine", +"Sancto-Prixines", +"Sancto-Prixins", +"Sancy-les-Cheminots", +"Sancy-lès-Provins", +"Sandersdorf-Brehna", +"Sang-mêlé", +"Sang-mêlés", +"Sanilhac-Sagriès", "Sanry-lès-Vigy", "Sanry-sur-Nied", -"Sansac-de-Marmiesse", +"Sans-Vallois", "Sansac-Veinazès", -"san-salvatorien", -"San-Salvatorien", -"san-salvatorienne", -"San-Salvatorienne", -"san-salvatoriennes", -"San-Salvatoriennes", -"san-salvatoriens", -"San-Salvatoriens", +"Sansac-de-Marmiesse", "Sanssac-l'Eglise", "Sanssac-l'Église", "Sant'Agapito", "Sant'Agnello", "Sant'Agostino", "Sant'Alfio", -"Santa-Lucia-di-Mercurio", -"Santa-Lucia-di-Moriani", -"Santa-Maria-di-Lota", -"Santa-Maria-Figaniella", -"Santa-Maria-Poggio", -"Santa-Maria-Siché", "Sant'Anastasia", +"Sant'Andréa-d'Orcino", "Sant'Andréa-di-Bozio", "Sant'Andréa-di-Cotone", "Sant'Andréa-di-Tallano", -"Sant'Andréa-d'Orcino", "Sant'Antimo", "Sant'Antioco", "Sant'Antonino", "Sant'Antonio", "Sant'Apollinare", "Sant'Arcangelo", -"Santa-Reparata-di-Balagna", -"Santa-Reparata-di-Moriani", "Sant'Arpino", "Sant'Arsenio", "Sant'Elena", -"Santiago-Pontones", -"santi-johanien", -"Santi-Johanien", -"santi-johanienne", -"Santi-Johanienne", -"santi-johaniennes", -"Santi-Johaniennes", -"santi-johaniens", -"Santi-Johaniens", "Sant'Ippolito", "Sant'Olcese", -"santoline-cyprès", "Sant'Omero", "Sant'Onofrio", +"Sant'Oreste", +"Sant'Urbano", +"Santa-Lucia-di-Mercurio", +"Santa-Lucia-di-Moriani", +"Santa-Maria-Figaniella", +"Santa-Maria-Poggio", +"Santa-Maria-Siché", +"Santa-Maria-di-Lota", +"Santa-Reparata-di-Balagna", +"Santa-Reparata-di-Moriani", +"Santi-Johanien", +"Santi-Johanienne", +"Santi-Johaniennes", +"Santi-Johaniens", +"Santiago-Pontones", "Santo-Pietro-di-Tenda", "Santo-Pietro-di-Venaco", -"Sant'Oreste", "Santpoort-Noord", "Santpoort-Zuid", -"Sant'Urbano", "Sanvignes-les-Mines", -"san-vitournaire", -"San-Vitournaire", -"san-vitournaires", -"San-Vitournaires", -"Saône-et-Loire", "Sap-en-Auge", -"sapeur-pompier", -"sapeurs-pompiers", -"sapeuse-pompière", -"sapeuses-pompières", -"Sapogne-et-Feuchères", "Sapogne-Feuchères", +"Sapogne-et-Feuchères", "Sapogne-sur-Marche", -"sarclo-buttage", -"sarclo-buttages", -"sarco-épiplocèle", -"sarco-épiplomphale", -"sarco-épiplomphales", -"sarco-hydrocèle", -"sarco-hydrocèles", "Sardy-lès-Epiry", "Sardy-lès-Épiry", "Sargé-lès-le-Mans", "Sargé-sur-Braye", -"Sariac-Magnoac", -"Sari-di-Porto-Vecchio", -"Sari-d'Orcino", "Sari-Solenzara", +"Sari-d'Orcino", +"Sari-di-Porto-Vecchio", +"Sariac-Magnoac", "Sarlat-la-Canéda", "Sarliac-sur-l'Isle", "Saron-sur-Aube", "Sarre-Palatinat", "Sarre-Union", -"sarre-unionnais", "Sarre-Unionnais", -"sarre-unionnaise", "Sarre-Unionnaise", -"sarre-unionnaises", "Sarre-Unionnaises", "Sarriac-Bigorre", "Sarrola-Carcopino", "Sarroux-Saint-Julien", +"Sars-Poteries", "Sars-et-Rosières", "Sars-la-Bruyère", "Sars-la-Buissière", "Sars-le-Bois", -"Sars-Poteries", "Sart-Bernard", "Sart-Custinne", "Sart-Dames-Avelines", -"sart-dames-avelinois", "Sart-Dames-Avelinois", "Sart-Dames-Avelinoise", -"Sart-en-Fagne", "Sart-Eustache", -"sart-eustachois", "Sart-Eustachois", "Sart-Eustachoise", -"Sartilly-Baie-Bocage", "Sart-Messire-Guillaume", "Sart-Risbart", -"sart-risbartois", "Sart-Risbartois", "Sart-Risbartoise", "Sart-Saint-Laurent", +"Sart-en-Fagne", +"Sartilly-Baie-Bocage", "Sas-de-Gand", "Sassen-Trantow", "Sassetot-le-Malgardé", "Sassetot-le-Mauconduit", "Sassey-sur-Meuse", "Sassierges-Saint-Germain", -"satellites-espions", "Sathonay-Camp", "Sathonay-Village", -"sati-drap", "Satolas-et-Bonce", "Sauchy-Cauchy", "Sauchy-Lestrée", "Saucourt-sur-Rognon", -"sauf-conduit", -"sauf-conduits", "Saugnac-et-Cambran", -"saugnac-et-muretois", "Saugnac-et-Muretois", -"saugnac-et-muretoise", "Saugnac-et-Muretoise", -"saugnac-et-muretoises", "Saugnac-et-Muretoises", "Saugnacq-et-Muret", "Sauguis-Saint-Etienne", "Sauguis-Saint-Étienne", -"Saulces-aux-Bois", +"Saulce-sur-Rhône", "Saulces-Champenoises", "Saulces-Monclin", -"Saulce-sur-Rhône", "Saulces-Vieille", +"Saulces-aux-Bois", "Saulchoy-sous-Poix", "Saulchoy-sur-Davenescourt", "Saulcy-sur-Meurthe", @@ -22121,20 +15413,17 @@ FR_BASE_EXCEPTIONS = [ "Saulon-la-Chapelle", "Saulon-la-Rue", "Sault-Brénaz", -"Saultchevreuil-du-Tronchet", -"Sault-de-Navailles", -"Sault-lès-Rethel", -"sault-rethelois", "Sault-Rethelois", -"sault-retheloise", "Sault-Retheloise", -"sault-retheloises", "Sault-Retheloises", "Sault-Saint-Remy", -"Saulx-le-Duc", -"Saulx-lès-Champlon", -"Saulx-les-Chartreux", +"Sault-de-Navailles", +"Sault-lès-Rethel", +"Saultchevreuil-du-Tronchet", "Saulx-Marchais", +"Saulx-le-Duc", +"Saulx-les-Chartreux", +"Saulx-lès-Champlon", "Saulxures-lès-Bulgnéville", "Saulxures-lès-Nancy", "Saulxures-lès-Vannes", @@ -22148,33 +15437,14 @@ FR_BASE_EXCEPTIONS = [ "Saussay-la-Campagne", "Sausset-les-Pins", "Sausseuzemare-en-Caux", -"saut-de-lit", -"saut-de-lits", -"saut-de-loup", -"saut-de-mouton", -"saute-au-paf", -"saute-bouchon", -"saute-bouchons", -"saute-en-barque", -"saute-en-bas", -"saute-mouton", -"saute-moutons", -"saute-ruisseau", -"saute-ruisseaux", -"sauts-de-lit", -"sauts-de-mouton", "Sauvage-Magny", "Sauvagnat-Sainte-Marthe", -"sauve-l'honneur", -"sauve-qui-peut", -"sauve-rabans", +"Sauveterre-Saint-Denis", "Sauveterre-de-Béarn", "Sauveterre-de-Comminges", "Sauveterre-de-Guyenne", "Sauveterre-de-Rouergue", "Sauveterre-la-Lémance", -"Sauveterre-Saint-Denis", -"sauve-vie", "Sauviat-sur-Vige", "Sauvigney-lès-Gray", "Sauvigney-lès-Pesmes", @@ -22185,32 +15455,27 @@ FR_BASE_EXCEPTIONS = [ "Saux-et-Pomarède", "Sauzé-Vaussais", "Savas-Mépin", -"savez-vous", +"Savignac-Lédrier", +"Savignac-Mona", "Savignac-de-Duras", -"Savignac-de-l'Isle", "Savignac-de-Miremont", "Savignac-de-Nontron", -"Savignac-Lédrier", +"Savignac-de-l'Isle", "Savignac-les-Eglises", -"Savignac-les-Églises", "Savignac-les-Ormeaux", -"Savignac-Mona", +"Savignac-les-Églises", "Savignac-sur-Leyze", -"Savigné-l'Evêque", -"Savigné-l'Évêque", -"Savigné-sous-le-Lude", -"Savigné-sur-Lathan", +"Savigny-Lévescault", +"Savigny-Poil-Fol", "Savigny-en-Revermont", "Savigny-en-Sancerre", "Savigny-en-Septaine", "Savigny-en-Terre-Plaine", "Savigny-en-Véron", -"Savigny-lès-Beaune", "Savigny-le-Sec", "Savigny-le-Temple", -"Savigny-Lévescault", "Savigny-le-Vieux", -"Savigny-Poil-Fol", +"Savigny-lès-Beaune", "Savigny-sous-Faye", "Savigny-sous-Mâlain", "Savigny-sur-Aisne", @@ -22220,9 +15485,11 @@ FR_BASE_EXCEPTIONS = [ "Savigny-sur-Grosne", "Savigny-sur-Orge", "Savigny-sur-Seille", +"Savigné-l'Evêque", +"Savigné-l'Évêque", +"Savigné-sous-le-Lude", +"Savigné-sur-Lathan", "Savines-le-Lac", -"savoir-faire", -"savoir-vivre", "Savonnières-devant-Bar", "Savonnières-en-Perthois", "Savonnières-en-Woëvre", @@ -22231,35 +15498,25 @@ FR_BASE_EXCEPTIONS = [ "Saxe-du-Nord", "Saxi-Bourdon", "Saxon-Sion", -"scale-out", -"scale-up", -"scaphoïdo-astragalien", -"scaphoïdo-cuboïdien", -"sceau-cylindre", -"sceau-de-Notre-Dame", -"sceau-de-salomon", +"Saâcy-sur-Marne", +"Saâne-Saint-Just", +"Saône-et-Loire", "Sceau-Saint-Angel", -"sceaux-cylindres", "Sceaux-d'Anjou", -"sceaux-de-Notre-Dame", "Sceaux-du-Gâtinais", "Sceaux-sur-Huisne", -"scènes-clés", "Scey-Maisières", "Scey-sur-Saône", "Scey-sur-Saône-et-Saint-Albin", "Schacht-Audorf", "Schaffhouse-près-Seltz", "Schaffhouse-sur-Zorn", -"S-chanf", "Scharrachbergheim-Irmstett", "Scheibe-Alsbach", "Schieder-Schwalenberg", "Schinznach-Bad", "Schiphol-Oost", "Schiphol-Rijk", -"schiste-carton", -"schistes-carton", "Schlatt-Haslen", "Schleswig-Flensburg", "Schleswig-Holstein", @@ -22267,38 +15524,18 @@ FR_BASE_EXCEPTIONS = [ "Schmogrow-Fehrow", "Schmölln-Putzkau", "Schnarup-Thumby", -"Schönau-Berzdorf", -"Schönenberg-Kübelberg", -"Schönwalde-Glien", "Schouwen-Duiveland", "Schwalm-Eder", "Schweigen-Rechtenbach", -"Schweighouse-sur-Moder", "Schweighouse-Thann", -"scie-cloche", -"science-fictif", -"science-fiction", -"science-fictions", -"sciences-fiction", -"sciences-fictions", -"scies-cloches", +"Schweighouse-sur-Moder", +"Schönau-Berzdorf", +"Schönenberg-Kübelberg", +"Schönwalde-Glien", "Scieurac-et-Flourès", -"scirpo-phragmitaie", -"scirpo-phragmitaies", "Scorbé-Clairvaux", -"scottish-terrier", -"scuto-sternal", "Scy-Chazelles", -"S.-E.", "Sealyham-terrier", -"Sébazac-Concourès", -"sèche-cheveu", -"sèche-cheveux", -"sèche-linge", -"séchoir-atomiseur", -"séchoir-atomiseurs", -"seconde-lumière", -"secondes-lumière", "Secondigné-sur-Belle", "Secqueville-en-Bessin", "Sedze-Maubecq", @@ -22306,464 +15543,174 @@ FR_BASE_EXCEPTIONS = [ "Seeheim-Jugenheim", "Seeon-Seebruck", "Seeth-Ekholt", -"Séez-Mesnil", -"Ségrie-Fontaine", -"Ségur-le-Château", -"Ségur-les-Villas", "Seiches-sur-le-Loir", "Seillons-Source-d'Argens", -"seine-et-marnais", -"Seine-et-Marnais", -"seine-et-marnaise", -"Seine-et-Marnaise", -"seine-et-marnaises", -"Seine-et-Marnaises", -"Seine-et-Marne", -"Seine-et-Oise", "Seine-Inférieure", "Seine-Maritime", "Seine-Port", -"seine-portais", "Seine-Portais", -"seine-portaise", "Seine-Portaise", -"seine-portaises", "Seine-Portaises", "Seine-Saint-Denis", +"Seine-et-Marnais", +"Seine-et-Marnaise", +"Seine-et-Marnaises", +"Seine-et-Marne", +"Seine-et-Oise", "Seitingen-Oberflacht", -"self-control", -"self-défense", -"self-government", -"self-governments", -"self-made-man", -"self-made-mans", -"self-made-men", -"self-made-woman", -"self-made-womans", -"self-made-women", -"self-service", -"self-services", -"Selke-Aue", -"selk'nam", "Selk'nam", +"Selke-Aue", "Selles-Saint-Denis", -"selles-sur-cher", "Selles-sur-Cher", "Selles-sur-Nahon", "Selon-Jean", "Selon-Luc", "Selon-Marc", "Selon-Matthieu", -"semaine-lumière", -"semaines-lumière", -"Séméacq-Blachon", -"semen-contra", -"Sémézies-Cachan", "Semoutiers-Montsaon", -"semper-virens", "Semur-en-Auxois", "Semur-en-Brionnais", "Semur-en-Vallon", -"Sénaillac-Latronquière", -"Sénaillac-Lauzès", "Senargent-Mignafans", -"sénateur-maire", -"sénatus-consulte", -"sénatus-consultes", "Sencenac-Puy-de-Fourches", "Senesse-de-Senabugue", "Senillé-Saint-Sauveur", "Senlis-le-Sec", -"Sennecé-lès-Mâcon", "Sennecey-le-Grand", "Sennecey-lès-Dijon", +"Sennecé-lès-Mâcon", "Senneville-sur-Fécamp", "Sennevoy-le-Bas", "Sennevoy-le-Haut", "Senoncourt-les-Maujouy", "Sens-Beaujeu", "Sens-de-Bretagne", -"sensori-moteur", -"sensori-moteurs", -"sensori-motrice", -"sensori-motrices", -"sensori-motricité", "Sens-sur-Seille", -"sent-bon", -"Sentenac-de-Sérou", "Sentenac-d'Oust", +"Sentenac-de-Sérou", "Senven-Léhart", "Seo-yeon", "Seppois-le-Bas", "Seppois-le-Haut", -"septante-cinq", -"septante-deux", -"septante-et-un", -"septante-huit", -"septante-neuf", -"septante-quatre", -"septante-sept", -"septante-six", -"septante-trois", -"Septèmes-les-Vallons", -"sept-en-gueule", -"sept-en-huit", -"septentrio-occidental", -"septentrio-occidentale", -"septentrio-occidentales", -"septentrio-occidentaux", -"sept-et-le-va", "Sept-Forges", "Sept-Frères", -"sept-frèrien", "Sept-Frèrien", -"sept-frèrienne", "Sept-Frèrienne", -"sept-frèriennes", "Sept-Frèriennes", -"sept-frèriens", "Sept-Frèriens", -"Sept-Îles", "Sept-Ilien", -"Sept-Îlien", -"Sept-Îlois", "Sept-Insulaire", "Sept-Insulaires", "Sept-Lacquois", -"sept-mâts", "Sept-Meules", -"sept-meulois", "Sept-Meulois", -"sept-meuloise", "Sept-Meuloise", -"sept-meuloises", "Sept-Meuloises", -"sept-oeil", -"sept-œil", -"sept-oeils", -"sept-œils", "Sept-Saulx", -"sept-sortais", "Sept-Sortais", -"sept-sortaise", "Sept-Sortaise", -"sept-sortaises", "Sept-Sortaises", "Sept-Sorts", -"sept-ventais", "Sept-Ventais", -"sept-ventaise", "Sept-Ventaise", -"sept-ventaises", "Sept-Ventaises", "Sept-Vents", +"Sept-Îles", +"Sept-Îlien", +"Sept-Îlois", +"Septèmes-les-Vallons", "Sepulcro-Hilario", -"Séquano-Dionysien", "Seraing-le-Château", -"Séranvillers-Forenville", "Seraucourt-le-Grand", "Serbie-et-Monténégro", -"serbo-croate", -"Sère-en-Lavedan", -"Sère-Lanso", -"Serémange-Erzange", -"Sère-Rustaing", -"Sérézin-de-la-Tour", -"Sérézin-du-Rhône", -"sergent-chef", -"sergent-major", -"sergents-chefs", -"sergents-majors", -"Sérignac-Péboudou", -"Sérignac-sur-Garonne", -"Sérignan-du-Comtat", "Seringes-et-Nesles", "Sermaize-les-Bains", "Sermoise-sur-Loire", -"séro-sanguin", -"séro-sanguine", -"séro-sanguines", -"séro-sanguins", "Serra-di-Ferro", "Serra-di-Fiumorbo", "Serra-di-Scopamène", -"serre-bauquière", -"serre-bosse", -"serre-bosses", -"serre-bras", -"serre-ciseau", -"serre-ciseaux", -"serre-cou", -"serre-cous", -"serre-feu", -"serre-feux", -"serre-fil", -"serre-file", -"serre-files", -"serre-fils", -"serre-fine", -"serre-frein", -"serre-joint", -"serre-joints", +"Serre-Nerpol", +"Serre-Nerpolain", +"Serre-Nerpolaine", +"Serre-Nerpolaines", +"Serre-Nerpolains", "Serre-les-Moulières", "Serre-les-Sapins", -"serre-livre", -"serre-livres", -"serre-malice", -"Serre-Nerpol", -"serre-nerpolain", -"Serre-Nerpolain", -"serre-nerpolaine", -"Serre-Nerpolaine", -"serre-nerpolaines", -"Serre-Nerpolaines", -"serre-nerpolains", -"Serre-Nerpolains", -"serre-nez", -"serre-noeud", -"serre-nœud", -"serre-nœuds", -"serre-papier", -"serre-papiers", -"serre-pédicule", -"serre-pédicules", -"serre-point", -"serre-points", -"serre-rails", "Serres-Castet", -"Serres-et-Montguyard", -"serres-fines", "Serres-Gaston", -"serres-gastonnais", "Serres-Gastonnais", -"serres-gastonnaise", "Serres-Gastonnaise", -"serres-gastonnaises", "Serres-Gastonnaises", -"Serreslous-et-Arribans", -"Serres-Morlaàs", -"serres-morlanais", "Serres-Morlanais", -"serres-morlanaise", "Serres-Morlanaise", -"serres-morlanaises", "Serres-Morlanaises", +"Serres-Morlaàs", "Serres-Sainte-Marie", +"Serres-et-Montguyard", "Serres-sur-Arget", -"serre-taille", -"serre-tailles", -"serre-tête", -"serre-têtes", -"serre-tube", -"serre-tubes", +"Serreslous-et-Arribans", +"Serri-Sapinois", +"Serri-Sapinoise", +"Serri-Sapinoises", +"Serrigny-en-Bresse", "Serrières-de-Briord", "Serrières-en-Chautagne", "Serrières-sur-Ain", -"Serrigny-en-Bresse", -"serri-sapinois", -"Serri-Sapinois", -"serri-sapinoise", -"Serri-Sapinoise", -"serri-sapinoises", -"Serri-Sapinoises", "Servance-Miellin", "Servaville-Salmonville", "Serves-sur-Rhône", -"services-volées", -"service-volée", -"Servières-le-Château", "Serviers-et-Labaume", -"Serviès-en-Val", -"serviette-éponge", -"serviettes-éponges", "Servigny-lès-Raville", "Servigny-lès-Sainte-Barbe", -"servo-direction", -"servo-directions", -"servo-frein", -"servo-freins", -"servo-moteur", +"Servières-le-Château", +"Serviès-en-Val", "Servon-Melzicourt", "Servon-sur-Vilaine", -"Séry-lès-Mézières", -"Séry-Magneval", "Serzy-et-Prin", +"Serémange-Erzange", "Seuil-d'Argonne", -"seule-en-scène", -"seul-en-scène", -"Sévérac-d'Aveyron", -"Sévérac-le-Château", -"Sévérac-l'Eglise", -"Sévérac-l'Église", -"Sévignacq-Meyracq", -"Sévignacq-Thèze", -"Sévigny-la-Forêt", -"Sévigny-Waleppe", -"Sèvres-Anxaumont", -"sex-appeal", -"sex-digital", -"sex-digitisme", -"sex-digitismes", -"sexe-ratio", "Sexey-aux-Forges", "Sexey-les-Bois", -"sex-ratio", -"sex-ratios", -"sex-shop", -"sex-shops", -"sex-symbol", -"sex-symbols", -"sex-toy", -"sex-toys", "Seysses-Savès", "Seyssinet-Pariset", -"shabu-shabu", "Shai-hulud", "Shang-Haï", -"shar-peï", -"shar-peïs", -"shift-cliqua", -"shift-cliquai", -"shift-cliquaient", -"shift-cliquais", -"shift-cliquait", -"shift-cliquâmes", -"shift-cliquant", -"shift-cliquas", -"shift-cliquasse", -"shift-cliquassent", -"shift-cliquasses", -"shift-cliquassiez", -"shift-cliquassions", -"shift-cliquât", -"shift-cliquâtes", -"shift-clique", -"shift-cliqué", -"shift-cliquée", -"shift-cliquées", -"shift-cliquent", -"shift-cliquer", -"shift-cliquera", -"shift-cliquerai", -"shift-cliqueraient", -"shift-cliquerais", -"shift-cliquerait", -"shift-cliqueras", -"shift-cliquèrent", -"shift-cliquerez", -"shift-cliqueriez", -"shift-cliquerions", -"shift-cliquerons", -"shift-cliqueront", -"shift-cliques", -"shift-cliqués", -"shift-cliquez", -"shift-cliquiez", -"shift-cliquions", -"shift-cliquons", -"shikoku-inu", -"shipibo-conibo", -"shoot-'em-up", "Shoreham-by-Sea", -"short-culotte", -"short-culottes", -"short-track", -"short-tracks", -"show-biz", -"show-business", "Siaugues-Sainte-Marie", "Siccieu-Saint-Julien-et-Carisieu", -"sicilio-sarde", -"side-car", -"side-cariste", -"side-caristes", -"side-cars", -"siècle-lumière", -"siècles-lumière", "Siegen-Wittgenstein", "Sierck-les-Bains", -"sierra-léonais", "Sierra-Léonais", -"sierra-léonaise", "Sierra-Léonaise", -"sierra-léonaises", "Sierra-Léonaises", "Sierra-Léonien", "Sieversdorf-Hohenofen", -"sigma-additif", -"sigma-additivité", -"sigma-additivités", "Signy-Avenex", -"Signy-l'Abbaye", -"Signy-le-Grand", -"Signy-le-Petit", "Signy-Librecy", "Signy-Montlibert", "Signy-Signets", +"Signy-l'Abbaye", +"Signy-le-Grand", +"Signy-le-Petit", "Sigy-en-Bray", "Sigy-le-Châtel", -"silicico-aluminique", -"silicico-aluminiques", -"silicico-cuivreux", "Sillans-la-Cascade", -"Sillé-le-Guillaume", -"Sillé-le-Philippe", "Silley-Amancey", "Silley-Bléfond", +"Silly-Tillard", "Silly-en-Gouffern", "Silly-en-Saulnois", "Silly-la-Poterie", "Silly-le-Long", "Silly-sur-Nied", -"Silly-Tillard", -"silure-spatule", +"Sillé-le-Guillaume", +"Sillé-le-Philippe", "Simandre-sur-Suran", "Simiane-Collongue", "Simiane-la-Rotonde", -"simili-cuir", -"simili-cuirs", "Simon-la-Vineuse", -"Sincey-lès-Rouvray", -"singe-araignée", -"singe-chouette", -"singe-écureuil", -"singe-lion", -"singes-araignées", -"singes-chouettes", -"singes-écureuils", -"singes-lions", "Sin-le-Noble", -"sino-américain", -"sino-américaine", -"sino-américaines", -"sino-américains", -"sino-australien", -"sino-australienne", -"sino-australiennes", -"sino-australiens", -"sino-canadien", -"sino-colombien", -"sino-colombienne", -"sino-colombiennes", -"sino-colombiens", -"sino-congolais", -"sino-continental", -"sino-coréen", -"sino-égyptien", -"sino-égyptienne", -"sino-égyptiennes", -"sino-égyptiens", -"sino-européen", -"sino-japonais", -"sino-japonaise", -"sino-japonaises", -"sino-québécois", -"sino-taïwanais", -"sino-tibétain", -"sino-vietnamien", -"sino-vietnamienne", -"sino-vietnamiennes", -"sino-vietnamiens", +"Sincey-lès-Rouvray", "Sint-Amands", "Sint-Andries", "Sint-Annaland", @@ -22815,107 +15762,32 @@ FR_BASE_EXCEPTIONS = [ "Siorac-de-Ribérac", "Siorac-en-Périgord", "Siouville-Hague", -"sister-ship", -"sister-ships", -"sit-in", -"sit-ins", "Sittard-Geleen", -"sit-up", -"sit-ups", "Sivry-Ante", "Sivry-Courtry", +"Sivry-Rance", "Sivry-la-Perche", "Sivry-lès-Buzancy", -"Sivry-Rance", "Sivry-sur-Meuse", -"six-cents", -"six-cent-soixante-six", -"six-cent-soixante-sixième", -"six-cent-soixante-sixièmes", -"six-clefs", -"six-coups", -"six-doigts", -"six-fournais", "Six-Fournais", -"six-fournaise", "Six-Fournaise", -"six-fournaises", "Six-Fournaises", "Six-Fours-la-Plage", "Six-Fours-les-Plages", -"six-mâts", "Six-Planes", "Sixt-Fer-à-Cheval", "Sixt-sur-Aff", -"six-vingts", "Skelton-in-Cleveland", -"ski-alpinisme", -"ski-alpinismes", -"ski-alpiniste", -"ski-alpinistes", "Skye-terrier", -"sleeping-car", "Slijk-Ewijk", -"sloop-of-war", -"slop-tank", "Sluis-Aardenburg", -"smaragdo-chalcite", -"smaragdo-chalcites", "Smeerebbe-Vloerzegem", -"S-métolachlore", -"snack-bar", -"snack-bars", "Snijders-Chaam", -"snow-boot", -"snow-boots", -"soap-opéra", -"soaps-opéras", -"sociale-démocrate", -"sociales-démocrates", -"sociales-traitres", -"sociales-traîtres", -"sociale-traitre", -"sociale-traître", -"sociaux-démocrates", -"sociaux-traitres", -"sociaux-traîtres", -"société-écran", -"sociétés-écrans", -"socio-cible", -"socio-cibles", -"socio-culturel", -"socio-culturelle", -"socio-culturelles", -"socio-culturels", -"socio-économique", -"socio-économiques", -"socio-éducatif", -"socio-éducatifs", -"socio-éducative", -"socio-éducatives", -"socio-esthéticien", -"socio-esthéticiens", -"socio-historiographe", -"socio-historiographes", -"socio-historique", -"socio-historiques", -"socio-politique", -"socio-politiques", -"socio-professionnel", -"socio-professionnelle", -"socio-professionnelles", -"socio-professionnels", -"soda-spodumenes", -"sodo-calcique", -"sodo-calciques", "Sognolles-en-Montois", "Sogny-aux-Moulins", "Sogny-en-l'Angle", "Soheit-Tinlot", -"soi-disamment", -"soi-disant", "Soignolles-en-Brie", -"soi-même", "Soing-Cubry-Charentenay", "Soings-en-Sologne", "Soirans-Fouffrans", @@ -22923,40 +15795,10 @@ FR_BASE_EXCEPTIONS = [ "Soisy-Bouy", "Soisy-sous-Montmorency", "Soisy-sur-Ecole", -"Soisy-sur-École", "Soisy-sur-Seine", -"soit-communiqué", -"soixante-cinq", -"soixante-deux", -"soixante-dix", -"soixante-dix-huit", -"soixante-dixième", -"soixante-dixièmes", -"soixante-dix-neuf", -"soixante-dix-sept", -"soixante-dizaine", -"soixante-dizaines", -"soixante-douze", -"soixante-et-onze", -"soixante-et-un", -"soixante-et-une", -"soixante-huit", -"soixante-huitard", -"soixante-huitarde", -"soixante-huitardes", -"soixante-huitards", -"soixante-neuf", -"soixante-quatorze", -"soixante-quatre", -"soixante-quinze", -"soixante-seize", -"soixante-sept", -"soixante-six", -"soixante-treize", -"soixante-trois", +"Soisy-sur-École", "Soizy-aux-Bois", "Solaure-en-Diois", -"sole-ruardon", "Solignac-sous-Roche", "Solignac-sur-Loire", "Soligny-la-Trappe", @@ -22964,58 +15806,38 @@ FR_BASE_EXCEPTIONS = [ "Soligny-les-Étangs", "Sollières-Sardières", "Solliès-Pont", -"solliès-pontois", "Solliès-Pontois", -"solliès-pontoise", "Solliès-Pontoise", -"solliès-pontoises", "Solliès-Pontoises", "Solliès-Toucas", -"solliès-villain", "Solliès-Villain", -"solliès-villaine", "Solliès-Villaine", -"solliès-villaines", "Solliès-Villaines", -"solliès-villains", "Solliès-Villains", "Solliès-Ville", -"Solre-le-Château", "Solre-Saint-Géry", +"Solre-le-Château", "Solre-sur-Sambre", "Soltau-Fallingbostel", "Solutré-Pouilly", -"somato-psychique", -"somato-psychiques", "Someren-Eind", "Someren-Heide", "Somme-Bionne", "Somme-Leuze", -"somme-leuzien", "Somme-Leuzien", "Somme-Leuzienne", -"Sommepy-Tahure", -"somme-suippas", "Somme-Suippas", -"somme-suippase", "Somme-Suippase", -"somme-suippases", "Somme-Suippases", "Somme-Suippe", "Somme-Tourbe", -"Sommette-Eaucourt", "Somme-Vesle", "Somme-Yèvre", +"Sommepy-Tahure", +"Sommette-Eaucourt", "Sommières-du-Clain", "Sonceboz-Sombeval", "Soncourt-sur-Marne", -"son-et-lumière", -"soŋay-zarma", -"soŋay-zarmas", -"songe-creux", -"songe-malice", -"songhaï-zarma", -"songhaï-zarmas", "Sonnac-sur-l'Hers", "Sonnenberg-Winnenberg", "Sons-et-Ronchères", @@ -23029,76 +15851,26 @@ FR_BASE_EXCEPTIONS = [ "Sorcy-Bauthémont", "Sorcy-Saint-Martin", "Sorde-l'Abbaye", -"Sorel-en-Vimeu", "Sorel-Moussel", +"Sorel-en-Vimeu", "Sorinne-la-Longue", "Sornzig-Ablaß", "Sort-en-Chalosse", -"sortie-de-bain", -"sortie-de-bal", "Sortosville-en-Beaumont", -"sot-l'y-laisse", "Sotteville-lès-Rouen", "Sotteville-sous-le-Val", "Sotteville-sur-Mer", -"sotto-voce", "Souain-Perthes-lès-Hurlus", "Souancé-au-Perche", -"sou-chong", -"sou-chongs", "Soucieu-en-Jarrest", "Soudaine-Lavinadière", -"soudano-tchado-lybien", "Soudé-Notre-Dame-ou-le-Petit", -"soudo-brasa", -"soudo-brasai", -"soudo-brasaient", -"soudo-brasais", -"soudo-brasait", -"soudo-brasâmes", -"soudo-brasant", -"soudo-brasas", -"soudo-brasasse", -"soudo-brasassent", -"soudo-brasasses", -"soudo-brasassiez", -"soudo-brasassions", -"soudo-brasât", -"soudo-brasâtes", -"soudo-brase", -"soudo-brasé", -"soudo-brasée", -"soudo-brasées", -"soudo-brasent", -"soudo-braser", -"soudo-brasera", -"soudo-braserai", -"soudo-braseraient", -"soudo-braserais", -"soudo-braserait", -"soudo-braseras", -"soudo-brasèrent", -"soudo-braserez", -"soudo-braseriez", -"soudo-braserions", -"soudo-braserons", -"soudo-braseront", -"soudo-brases", -"soudo-brasés", -"soudo-brasez", -"soudo-brasiez", -"soudo-brasions", -"soudo-brasons", "Soueix-Rogalle", -"souffre-douleur", -"souffre-douleurs", -"soufre-sélénifère", -"Sougé-le-Ganelon", -"Sougères-en-Puisaye", -"Sougères-sur-Sinotte", "Sougné-Remouchamps", "Sougy-sur-Loire", -"souï-manga", +"Sougères-en-Puisaye", +"Sougères-sur-Sinotte", +"Sougé-le-Ganelon", "Soulac-sur-Mer", "Soulages-Bonneval", "Soulaines-Dhuys", @@ -23112,491 +15884,176 @@ FR_BASE_EXCEPTIONS = [ "Souligné-sous-Ballon", "Soulosse-sous-Saint-Elophe", "Soulosse-sous-Saint-Élophe", -"Soultzbach-les-Bains", "Soultz-Haut-Rhin", "Soultz-les-Bains", "Soultz-sous-Forêts", +"Soultzbach-les-Bains", "Soumont-Saint-Quentin", -"soum-soum", -"soupe-tout-seul", "Souppes-sur-Loing", "Source-Seine", "Sourcieux-les-Mines", -"sourde-muette", -"sourdes-muettes", +"Sourdeval-Vengeons", "Sourdeval-la-Barre", "Sourdeval-les-Bois", -"Sourdeval-Vengeons", -"sourd-muet", -"sourd-parlant", -"sourds-muets", -"souris-chauve", -"souris-chauves", -"souris-crayon", -"souris-crayons", -"souris-opossums", -"souris-stylo", -"souris-stylos", +"Sous-Parsat", "Sousceyrac-en-Quercy", "Soussey-sur-Brionne", "Southend-on-Sea", -"soutien-gorge", -"soutien-loloches", -"soutiens-gorge", -"souvenez-vous-de-moi", -"souveraineté-association", -"Souvigné-sur-Même", -"Souvigné-sur-Sarthe", "Souvigny-de-Touraine", "Souvigny-en-Sologne", +"Souvigné-sur-Même", +"Souvigné-sur-Sarthe", "Souzay-Champigny", "Souzy-la-Briche", "Soye-en-Septaine", "Spaarndam-Oost", "Spaarndam-West", -"sparring-partner", -"spatio-temporel", -"spatio-temporelle", -"spatio-temporelles", -"spatio-temporels", "Spechbach-le-Bas", "Spechbach-le-Haut", -"speed-dating", -"sphéno-temporal", -"sphinx-bourdon", "Spider-Man", "Spiesen-Elversberg", -"spina-bifida", -"spina-ventosa", -"spin-off", -"spin-offs", -"spiro-bloc", -"spiro-blocs", -"sport-étude", -"sportivo-financier", -"sports-études", "Sprang-Capelle", "Spree-Neisse", -"spruce-beer", -"squale-grogneur", -"sri-lankais", "Sri-Lankais", -"sri-lankaise", "Sri-Lankaise", -"sri-lankaises", "Sri-Lankaises", -"stabilo-bossa", -"stabilo-bossai", -"stabilo-bossaient", -"stabilo-bossais", -"stabilo-bossait", -"stabilo-bossâmes", -"stabilo-bossant", -"stabilo-bossas", -"stabilo-bossasse", -"stabilo-bossassent", -"stabilo-bossasses", -"stabilo-bossassiez", -"stabilo-bossassions", -"stabilo-bossât", -"stabilo-bossâtes", -"stabilo-bosse", -"stabilo-bossé", -"stabilo-bossée", -"stabilo-bossées", -"stabilo-bossent", -"stabilo-bosser", -"stabilo-bossera", -"stabilo-bosserai", -"stabilo-bosseraient", -"stabilo-bosserais", -"stabilo-bosserait", -"stabilo-bosseras", -"stabilo-bossèrent", -"stabilo-bosserez", -"stabilo-bosseriez", -"stabilo-bosserions", -"stabilo-bosserons", -"stabilo-bosseront", -"stabilo-bosses", -"stabilo-bossés", -"stabilo-bossez", -"stabilo-bossiez", -"stabilo-bossions", -"stabilo-bossons", +"St-Jean", "Stadecken-Elsheim", "Stafordshire-bull-terrier", -"stage-coach", -"stage-coachs", "Staines-upon-Thames", -"stand-by", -"stand-up", "Stanford-le-Hope", -"stannoso-potassique", "Starrkirch-Wil", -"star-système", -"star-systèmes", -"starting-block", -"starting-blocks", -"starting-gate", -"start-up", -"start-upeur", -"st'at'imc", -"station-service", -"stations-service", -"stations-services", -"statue-menhir", -"statues-menhirs", "Staudach-Egerndach", -"steam-boat", -"steam-boats", "Stechow-Ferchesar", "Steenhuize-Wijnhuize", -"steeple-chase", "Steg-Hohtenn", -"Steinbach-Hallenberg", "Stein-Bockenheim", -"Steinbrunn-le-Bas", -"Steinbrunn-le-Haut", "Stein-Neukirch", "Stein-Wingert", +"Steinbach-Hallenberg", +"Steinbrunn-le-Bas", +"Steinbrunn-le-Haut", "Stelle-Wittenwurth", -"sténo-dactylographe", -"sténo-dactylographes", -"sténo-méditerranéen", -"sténo-méditerranéenne", -"sténo-méditerranéennes", -"sténo-méditerranéens", -"step-back", -"step-backs", -"stéphano-carladésien", -"Stéphano-Carladésien", -"stéphano-carladésienne", -"Stéphano-Carladésienne", -"stéphano-carladésiennes", -"Stéphano-Carladésiennes", -"stéphano-carladésiens", -"Stéphano-Carladésiens", -"stéréo-isomère", -"stéréo-isomères", -"sterno-claviculaire", -"sterno-claviculaires", -"sterno-cléido-mastoïdien", -"sterno-cléido-mastoïdiens", -"sterno-clido-mastoïdien", -"sterno-clido-mastoïdienne", -"sterno-clido-mastoïdiennes", -"sterno-clido-mastoïdiens", -"sterno-huméral", -"sterno-hyoïdien", -"sterno-pubien", "Stiring-Wendel", -"St-Jean", -"stock-car", -"stock-cars", "Stockhausen-Illfurth", -"stock-option", -"stock-options", -"stocks-tampons", -"stock-tampon", "Stockton-on-Tees", "Stockum-Püschen", "Stoke-on-Trent", -"stomo-gastrique", -"stomo-gastriques", -"stop-ski", -"stop-skis", "Storbeck-Frankendorf", -"story-board", -"story-boards", -"Straßlach-Dingharting", "Stratford-on-Avon", "Straubing-Bogen", -"strauss-kahnien", -"strauss-kahniens", -"street-artiste", -"street-artistes", -"street-gadz", -"Strépy-Bracquegnies", -"strip-teasa", -"strip-teasai", -"strip-teasaient", -"strip-teasais", -"strip-teasait", -"strip-teasâmes", -"strip-teasant", -"strip-teasas", -"strip-teasasse", -"strip-teasassent", -"strip-teasasses", -"strip-teasassiez", -"strip-teasassions", -"strip-teasât", -"strip-teasâtes", -"strip-tease", -"strip-teasé", -"strip-teasée", -"strip-teasées", -"strip-teasent", -"strip-teaser", -"strip-teasera", -"strip-teaserai", -"strip-teaseraient", -"strip-teaserais", -"strip-teaserait", -"strip-teaseras", -"strip-teasèrent", -"strip-teaserez", -"strip-teaseriez", -"strip-teaserions", -"strip-teaserons", -"strip-teaseront", -"strip-teases", -"strip-teasés", -"strip-teaseurs", -"strip-teaseuse", -"strip-teaseuses", -"strip-teasez", -"strip-teasiez", -"strip-teasions", -"strip-teasons", -"stroke-play", -"strom-apparat", +"Straßlach-Dingharting", "Strombeek-Bever", -"struggle-for-life", -"struggle-for-lifes", -"stud-book", -"Stüdenitz-Schönermark", -"stuffing-box", +"Strépy-Bracquegnies", "Stutzheim-Offenheim", -"stylo-bille", -"stylo-billes", -"stylo-feutre", -"stylo-glosse", -"stylo-gomme", -"stylo-pistolet", -"stylo-plume", -"stylos-feutres", -"stylos-gommes", -"stylo-souris", -"stylos-plume", -"stylos-souris", +"Stéphano-Carladésien", +"Stéphano-Carladésienne", +"Stéphano-Carladésiennes", +"Stéphano-Carladésiens", +"Stüdenitz-Schönermark", "Suaucourt-et-Pisseloup", -"subrogés-tuteurs", -"subrogé-tuteur", -"suce-bœuf", -"suce-boules", -"suce-fleur", -"suce-fleurs", -"suce-goulot", -"suce-goulots", -"suce-médailles", -"Sucé-sur-Erdre", "Suc-et-Sentenac", "Sucy-en-Brie", -"sudoro-algique", -"Súdwest-Fryslân", -"suédo-américain", -"suédo-américaine", -"suédo-américaines", -"suédo-américains", +"Sucé-sur-Erdre", "Suilly-la-Tour", "Suisse-Saxonne-Monts-Métallifères-de-l'Est", -"suivez-moi-jeune-homme", "Suizy-le-Franc", "Sukow-Levitzow", -"sulfo-margarique", "Sully-la-Chapelle", "Sully-sur-Loire", "Sulzbach-Laufen", "Sulzbach-Rosenberg", -"suméro-akkadien", -"suméro-akkadienne", -"suméro-akkadiennes", -"suméro-akkadiens", "Sunbury-on-Thames", -"super-8", -"support-chaussettes", -"supports-chaussettes", -"supra-axillaire", -"supra-axillaires", -"supra-caudal", -"supra-caudale", -"supra-caudales", -"supra-caudaux", -"supra-épineux", -"surdi-mutité", -"surdi-mutités", -"suro-pédieuse", -"suro-pédieuses", -"suro-pédieux", -"surprise-partie", -"surprise-parties", -"surprises-parties", -"surveillant-général", "Sury-aux-Bois", "Sury-en-Léré", "Sury-en-Vaux", -"Sury-ès-Bois", "Sury-le-Comtal", "Sury-près-Léré", -"sus-caudal", -"sus-cité", -"sus-coccygien", -"sus-dominante", -"sus-dominantes", -"sus-épineux", -"sus-hépatique", -"sus-hépatiques", -"sus-hyoïdien", -"sus-jacent", -"sus-jacents", -"sus-maxillo-labial", -"sus-maxillo-nasal", -"sus-métatarsien", -"sus-métatarsienne", -"sus-métatarsiennes", -"sus-métatarsiens", -"sus-naseau", -"sus-naso-labial", -"sus-pied", -"sus-pubio-fémoral", +"Sury-ès-Bois", "Sus-Saint-Léger", -"sus-tarsien", -"sus-tarsienne", -"sus-tarsiennes", -"sus-tarsiens", -"sus-tentoriel", -"sus-tentorielle", -"sus-tentorielles", -"sus-tentoriels", -"sus-tonique", -"su-sucre", -"su-sucres", "Sutton-in-Ashfield", "Sutz-Lattrigen", "Suze-la-Rousse", -"S.-W.", -"sweat-shirt", -"sweat-shirts", +"Sylvains-Lès-Moulins", "Sylvains-les-Moulins", -"syndesmo-pharyngien", "Syr-Daria", -"syro-chaldaïque", -"syro-chaldéen", -"syro-chaldéens", -"syro-saoudien", -"systèmes-clés", -"tabagn's", +"Sère-Lanso", +"Sère-Rustaing", +"Sère-en-Lavedan", +"Sèvres-Anxaumont", +"Sébazac-Concourès", +"Séez-Mesnil", +"Ségrie-Fontaine", +"Ségur-le-Château", +"Ségur-les-Villas", +"Séméacq-Blachon", +"Sémézies-Cachan", +"Sénaillac-Latronquière", +"Sénaillac-Lauzès", +"Sépeaux-Saint Romain", +"Séquano-Dionysien", +"Séranvillers-Forenville", +"Sérignac-Péboudou", +"Sérignac-sur-Garonne", +"Sérignan-du-Comtat", +"Séry-Magneval", +"Séry-lès-Mézières", +"Sérézin-de-la-Tour", +"Sérézin-du-Rhône", +"Sévignacq-Meyracq", +"Sévignacq-Thèze", +"Sévigny-Waleppe", +"Sévigny-la-Forêt", +"Sévérac d'Aveyron", +"Sévérac-d'Aveyron", +"Sévérac-l'Eglise", +"Sévérac-l'Église", +"Sévérac-le-Château", +"Súdwest-Fryslân", +"T'ien-ngan-men", +"T-SQL", +"T-calculable", +"T-calculables", +"T-shirt", +"T-shirts", +"Ta-Nehisi", "Tabaille-Usquain", "Taben-Rodt", -"table-bureau", -"tables-bureaux", -"tac-tac", "Tadousse-Ussau", "Taglio-Isolaccio", "Tahiti-Iti", "Tahu-Ata", "Taiarapu-Est", "Taiarapu-Ouest", -"tai-kadai", -"taï-kadaï", -"taï-le", -"taille-crayon", -"taille-crayons", -"taille-douce", -"taille-haie", -"taille-haies", -"taille-mèche", -"taille-mèches", -"taille-mer", -"taille-mers", -"taille-plume", -"taille-plumes", -"taille-pré", -"taille-prés", -"tailles-douces", -"taille-vent", -"taille-vents", "Tain-l'Hermitage", -"taï-nüa", "Taisnières-en-Thiérache", "Taisnières-sur-Hon", "Taizé-Aizie", -"taki-taki", -"talco-micacé", -"talco-quartzeux", -"talkies-walkies", -"talkie-walkie", -"talkie-walkies", -"talk-show", "Talloires-Montmin", "Tallud-Sainte-Gemme", "Talmont-Saint-Hilaire", "Talmont-sur-Gironde", "Talus-Saint-Prix", -"taly-pen", -"taly-pens", "Tambach-Dietharz", -"tambour-major", -"tambours-majors", "Tamnay-en-Bazois", -"tams-tams", -"tam-tam", -"tam-tams", -"Ta-Nehisi", "Tanghin-Dassouri", "Tannerre-en-Puisaye", -"tao-taï", -"tao-taïs", -"tape-à-l'oeil", -"tape-à-l'œil", -"tape-beurre", -"tape-beurres", -"tape-cul", -"tape-culs", -"tape-dur", -"tape-durs", -"tapis-brosse", -"tapis-de-caoutchouté", -"tapis-franc", -"tapis-francs", -"tapis-luge", -"tapis-luges", -"tapis-plain", "Taponnat-Fleurignac", "Tarascon-sur-Ariège", "Tarascon-sur-Rhône", "Tarawa-Sud", "Tardets-Sorholus", -"tard-venus", -"tarn-et-garonnais", "Tarn-et-Garonnais", -"tarn-et-garonnaise", "Tarn-et-Garonnaise", -"tarn-et-garonnaises", "Tarn-et-Garonnaises", "Tarn-et-Garonne", "Taron-Sadirac-Viellenave", -"tarso-métatarse", -"tarso-métatarsien", "Tart-l'Abbaye", "Tart-le-Bas", "Tart-le-Haut", -"tarton-raire", "Tassin-la-Demi-Lune", "Tataouine-les-Bains", -"tâte-au-pot", -"tâte-ferraille", -"tate-mono", -"tate-monos", -"tâte-poule", -"tâte-vin", -"tâte-vins", -"tau-fluvalinate", "Taulhac-près-le-Puy", -"taupe-grillon", -"taupes-grillons", "Tauriac-de-Camarès", "Tauriac-de-Naucelle", "Taurignan-Castet", @@ -23605,595 +16062,252 @@ FR_BASE_EXCEPTIONS = [ "Tauxières-Mutry", "Tavaux-et-Pontséricourt", "Taxat-Senat", -"taxi-auto", -"taxi-automobile", -"taxi-brousse", -"taxi-girl", -"taxi-girls", -"taxis-brousse", -"taxis-vélos", -"taxi-vélo", -"t-bone", -"t-bones", -"T-calculable", -"T-calculables", -"tchado-burkinabé", -"tchado-centrafricain", -"tchado-egyptien", -"tchado-lybien", -"tchado-soudano-lybien", -"tchéco-slovaque", -"Tchéco-slovaque", "Tchéco-Slovaque", -"tchéco-slovaques", -"Tchéco-slovaques", "Tchéco-Slovaques", -"tchin-tchin", -"tchou-tchou", -"teach-in", -"teach-ins", -"teen-ager", -"teen-agers", -"tee-shirt", -"tee-shirts", -"Teillay-le-Gaudin", +"Tchéco-slovaque", +"Tchéco-slovaques", "Teillay-Saint-Benoît", +"Teillay-le-Gaudin", "Teillet-Argenty", -"teinture-mère", -"teint-vin", -"teint-vins", "Teissières-de-Cornet", "Teissières-lès-Bouliès", "Tel-Aviv-Jaffa", "Telgruc-sur-Mer", "Tella-Sin", -"t-elle", "Tellières-le-Plessis", "Teltow-Fläming", "Temmen-Ringenwalde", -"témoins-clés", "Temple-Laguyon", "Templeuve-en-Pévèle", "Templeux-la-Fosse", "Templeux-le-Guérard", -"temporo-conchinien", -"temporo-superficiel", "Tenero-Contra", "Tensbüttel-Röst", -"tensio-actif", -"tente-abri", -"tente-ménagerie", -"tentes-ménageries", -"téra-ampère", -"téra-ampères", -"téra-électron-volt", -"téraélectron-volt", -"téra-électron-volts", -"téraélectron-volts", -"térawatt-heure", -"térawatt-heures", -"térawatts-heures", "Tercis-les-Bains", "Termes-d'Armagnac", "Ternant-les-Eaux", -"terno-annulaire", "Ternuay-Melay-et-Saint-Hilaire", "Terny-Sorny", -"terra-cotta", -"terra-forma", -"terra-formai", -"terra-formaient", -"terra-formais", -"terra-formait", -"terra-formâmes", -"terra-formant", -"terra-formas", -"terra-formasse", -"terra-formassent", -"terra-formasses", -"terra-formassiez", -"terra-formassions", -"terra-formât", -"terra-formâtes", -"terra-forme", -"terra-formé", -"terra-formée", -"terra-formées", -"terra-forment", -"terra-former", -"terra-formera", -"terra-formerai", -"terra-formeraient", -"terra-formerais", -"terra-formerait", -"terra-formeras", -"terra-formèrent", -"terra-formerez", -"terra-formeriez", -"terra-formerions", -"terra-formerons", -"terra-formeront", -"terra-formes", -"terra-formés", -"terra-formez", -"terra-formiez", -"terra-formions", -"terra-formons", -"Terrasson-la-Villedieu", "Terrasson-Lavilledieu", -"terre-à-terre", +"Terrasson-la-Villedieu", "Terre-Clapier", +"Terre-Natale", +"Terre-Neuve", +"Terre-Neuve-et-Labrador", +"Terre-Neuvien", +"Terre-Neuvien-et-Labradorien", +"Terre-Neuvienne", +"Terre-Neuvienne-et-Labradorienne", +"Terre-Neuviennes", +"Terre-Neuviennes-et-Labradoriennes", +"Terre-Neuviens", +"Terre-Neuviens-et-Labradoriens", "Terre-de-Bas", "Terre-de-Haut", "Terre-et-Marais", -"terre-grièpe", -"Terre-Natale", -"terre-neuva", -"terre-neuvas", -"terre-neuve", -"Terre-Neuve", -"Terre-Neuve-et-Labrador", -"terre-neuvien", -"Terre-Neuvien", -"Terre-Neuvien-et-Labradorien", -"terre-neuvienne", -"Terre-Neuvienne", -"Terre-Neuvienne-et-Labradorienne", -"terre-neuviennes", -"Terre-Neuviennes", -"Terre-Neuviennes-et-Labradoriennes", -"terre-neuviens", -"Terre-Neuviens", -"Terre-Neuviens-et-Labradoriens", -"terre-neuvier", -"terre-neuviers", -"terre-noix", -"terre-plein", -"terre-pleins", "Terres-de-Caux", -"terret-bourret", "Territoire-de-Belfort", "Terron-lès-Poix", "Terron-lès-Vendresse", "Terron-sur-Aisne", -"ter-ter", -"terza-rima", "Tessancourt-sur-Aubette", -"Tessé-Froulay", "Tessy-sur-Vire", -"test-match", -"test-matchs", +"Tessé-Froulay", "Test-Milon", -"test-objet", "Testorf-Steinfort", -"tête-à-queue", -"tête-à-tête", -"tête-bêche", -"tête-bleu", -"tête-chèvre", -"tête-de-bécasse", -"tête-de-chat", -"tête-de-chats", -"tête-de-cheval", -"tête-de-clou", -"tête-de-coq", -"tête-de-loup", -"tête-de-maure", -"tête-de-Maure", -"tête-de-méduse", -"Tête-de-Moine", -"tête-de-moineau", -"tête-de-More", -"tête-de-mort", -"tête-de-serpent", -"tête-de-soufre", -"Téteghem-Coudekerque-Village", -"tête-ronde", -"têtes-de-chat", -"têtes-de-clou", -"têtes-de-loup", -"têtes-de-Maure", -"têtes-de-méduse", -"têtes-de-moineau", -"têtes-de-mort", -"têtes-vertes", -"tête-verte", "Teting-sur-Nied", -"tétra-atomique", -"tétrachlorodibenzo-p-dioxine", -"tétrachlorodibenzo-p-dioxines", -"tétrachloro-isophtalonitrile", -"tette-chèvre", -"tette-chèvres", -"teufs-teufs", -"teuf-teuf", -"teuf-teufa", -"teuf-teufai", -"teuf-teufaient", -"teuf-teufais", -"teuf-teufait", -"teuf-teufâmes", -"teuf-teufant", -"teuf-teufas", -"teuf-teufasse", -"teuf-teufassent", -"teuf-teufasses", -"teuf-teufassiez", -"teuf-teufassions", -"teuf-teufât", -"teuf-teufâtes", -"teuf-teufe", -"teuf-teufé", -"teuf-teufent", -"teuf-teufer", -"teuf-teufera", -"teuf-teuferai", -"teuf-teuferaient", -"teuf-teuferais", -"teuf-teuferait", -"teuf-teuferas", -"teuf-teufèrent", -"teuf-teuferez", -"teuf-teuferiez", -"teuf-teuferions", -"teuf-teuferons", -"teuf-teuferont", -"teuf-teufes", -"teuf-teufez", -"teuf-teufiez", -"teuf-teufions", -"teuf-teufons", "Teurthéville-Bocage", "Teurthéville-Hague", "Thal-Drulingen", -"Thaleischweiler-Fröschen", "Thal-Marmoutier", +"Thaleischweiler-Fröschen", "Thaon-les-Vosges", "Theil-Rabier", "Theil-sur-Vanne", "Theix-Noyalo", -"Thélis-la-Combe", -"Théoule-sur-Mer", "Thermes-Magnoac", -"thêta-jointure", -"thêta-jointures", "Theuville-aux-Maillots", "Theuvy-Achères", "Thevet-Saint-Julien", "They-sous-Montfort", "They-sous-Vaudemont", -"Thézan-des-Corbières", -"Thézan-lès-Béziers", -"Thézey-Saint-Martin", -"Thézy-Glimont", -"thézy-glimontois", -"Thézy-Glimontois", -"thézy-glimontoise", -"Thézy-Glimontoise", -"thézy-glimontoises", -"Thézy-Glimontoises", "Thiaucourt-Regniéville", "Thiaville-sur-Meurthe", -"Thiéblemont-Farémont", "Thiel-sur-Acolin", "Thiers-sur-Thève", "Thierville-sur-Meuse", "Thieulloy-l'Abbaye", "Thieulloy-la-Ville", "Thieuloy-Saint-Antoine", -"thifensulfuron-méthyle", "Thil-Manneville", "Thil-sur-Arroux", "Thimert-Gâtelles", "Thimister-Clermont", -"thimistérien-clermontois", "Thimistérien-Clermontois", "Thimistérien-Clermontoise", "Thin-le-Moutier", "Thionville-sur-Opton", -"thiophanate-éthyl", -"thiophanate-méthyl", "Thiron-Gardais", "Thiverval-Grignon", "Thizy-les-Bourgs", +"Thiéblemont-Farémont", +"Thoirette-Coisia", "Thoiré-sous-Contensor", "Thoiré-sur-Dinan", -"Thoirette-Coisia", "Thoisy-la-Berchère", "Thoisy-le-Désert", "Thol-lès-Millières", "Thollon-les-Mémises", "Thomer-la-Sôgne", -"Thonnance-lès-Joinville", -"Thonnance-les-Moulins", -"Thonne-la-Long", -"Thonne-les-Près", -"Thonne-le-Thil", -"Thonon-les-Bains", "Thon-Samson", -"thon-samsonais", "Thon-Samsonais", "Thon-Samsonaise", +"Thonnance-les-Moulins", +"Thonnance-lès-Joinville", +"Thonne-la-Long", +"Thonne-le-Thil", +"Thonne-les-Près", +"Thonon-les-Bains", "Thorame-Basse", "Thorame-Haute", -"Thorée-les-Pins", -"thoré-folléen", -"Thoré-Folléen", -"thoré-folléenne", -"Thoré-Folléenne", -"thoré-folléennes", -"Thoré-Folléennes", -"thoré-folléens", -"Thoré-Folléens", -"Thoré-la-Rochette", -"Thorembais-les-Béguines", "Thorembais-Saint-Trond", +"Thorembais-les-Béguines", "Thorens-Glières", -"Thorey-en-Plaine", "Thorey-Lyautey", +"Thorey-en-Plaine", "Thorey-sous-Charny", "Thorey-sur-Ouche", -"Thorigné-d'Anjou", -"Thorigné-en-Charnie", -"Thorigné-Fouillard", -"Thorigné-sur-Dué", -"Thorigné-sur-Vilaine", -"Thorigny-sur-le-Mignon", "Thorigny-sur-Marne", "Thorigny-sur-Oreuse", +"Thorigny-sur-le-Mignon", +"Thorigné-Fouillard", +"Thorigné-d'Anjou", +"Thorigné-en-Charnie", +"Thorigné-sur-Dué", +"Thorigné-sur-Vilaine", "Thornaby-on-Tees", "Thornton-Cleveleys", -"Thouaré-sur-Loire", -"Thouarsais-Bouildroux", +"Thoré-Folléen", +"Thoré-Folléenne", +"Thoré-Folléennes", +"Thoré-Folléens", +"Thoré-la-Rochette", +"Thorée-les-Pins", "Thouars-sur-Arize", "Thouars-sur-Garonne", -"thoult-tronaisien", +"Thouarsais-Bouildroux", +"Thouaré-sur-Loire", "Thoult-Tronaisien", -"thoult-tronaisienne", "Thoult-Tronaisienne", -"thoult-tronaisiennes", "Thoult-Tronaisiennes", -"thoult-tronaisiens", "Thoult-Tronaisiens", -"Thoury-Férottes", "Thoury-Ferrottes", -"thraco-illyrienne", -"Thuès-Entre-Valls", +"Thoury-Férottes", "Thugny-Trugny", "Thuilley-aux-Groseilles", -"thuit-angevin", "Thuit-Angevin", -"thuit-angevine", "Thuit-Angevine", -"thuit-angevines", "Thuit-Angevines", -"thuit-angevins", "Thuit-Angevins", "Thuit-Hébert", -"thuit-signolais", "Thuit-Signolais", -"thuit-signolaise", "Thuit-Signolaise", -"thuit-signolaises", "Thuit-Signolaises", -"thuit-simérien", "Thuit-Simérien", -"thuit-simérienne", "Thuit-Simérienne", -"thuit-simériennes", "Thuit-Simériennes", -"thuit-simériens", "Thuit-Simériens", -"thun-episcopien", "Thun-Episcopien", -"thun-épiscopien", -"Thun-Épiscopien", "Thun-Episcopienne", -"thun-épiscopienne", -"Thun-Épiscopienne", "Thun-Episcopiennes", -"thun-épiscopiennes", -"Thun-Épiscopiennes", "Thun-Episcopiens", -"thun-épiscopiens", -"Thun-Épiscopiens", -"Thun-l'Evêque", -"Thun-l'Évêque", "Thun-Saint-Amand", "Thun-Saint-Martin", +"Thun-l'Evêque", +"Thun-l'Évêque", +"Thun-Épiscopien", +"Thun-Épiscopienne", +"Thun-Épiscopiennes", +"Thun-Épiscopiens", "Thurey-le-Mont", -"Thury-en-Valois", "Thury-Harcourt", +"Thury-en-Valois", "Thury-sous-Clermont", +"Thuès-Entre-Valls", "Thy-le-Bauduin", "Thy-le-Château", +"Thélis-la-Combe", +"Théoule-sur-Mer", +"Thézan-des-Corbières", +"Thézan-lès-Béziers", +"Thézey-Saint-Martin", +"Thézy-Glimont", +"Thézy-Glimontois", +"Thézy-Glimontoise", +"Thézy-Glimontoises", "Tian'anmen", -"tibéto-birman", -"tibéto-birmane", -"tibéto-birmanes", -"tibéto-birmans", -"tibio-malléolaire", "Tibiran-Jaunac", -"ticket-restaurant", -"ti-coune", -"ti-counes", -"tic-tac", -"tic-tacs", -"tic-tac-toe", -"ti-cul", -"tie-break", -"tie-breaks", "Tielt-Winge", -"T'ien-ngan-men", -"tierce-feuille", -"tierce-rime", -"tierces-rimes", "Tieste-Uragnoux", -"tiger-kidnappeur", -"tiger-kidnapping", -"tiger-kidnappings", "Tignieu-Jameyzieu", "Tigny-Noyelle", -"tigre-garou", -"tigres-garous", -"tiki-taka", -"t-il", "Til-Châtel", "Tillay-le-Péneux", "Tilleul-Dame-Agnès", -"tilleul-othonnais", "Tilleul-Othonnais", -"tilleul-othonnaise", "Tilleul-Othonnaise", -"tilleul-othonnaises", "Tilleul-Othonnaises", "Tillières-sur-Avre", -"Tilloy-et-Bellay", "Tilloy-Floriville", +"Tilloy-et-Bellay", +"Tilloy-lez-Cambrai", +"Tilloy-lez-Marchiennes", "Tilloy-lès-Conty", "Tilloy-lès-Hermaville", "Tilloy-lès-Mofflaines", -"Tilloy-lez-Cambrai", -"Tilloy-lez-Marchiennes", "Tilly-Capelle", "Tilly-la-Campagne", "Tilly-sur-Meuse", "Tilly-sur-Seulles", -"tilt-shift", -"timbre-amende", -"timbre-poste", -"timbre-quittance", -"timbres-amende", -"timbres-poste", -"timbres-quittances", -"timbre-taxe", -"time-lapse", -"time-lapses", -"time-sharing", -"time-sharings", "Tin-Akof", "Tincey-et-Pontrebeau", "Tinchebray-Bocage", "Tincourt-Boucly", "Tinizong-Rona", -"t'inquiète", -"tiou-tiou", -"tiou-tious", -"ti-papoute", -"ti-punch", -"ti-punchs", -"tira-tutto", "Tirent-Pontéjac", -"tireur-au-cul", -"tireurs-au-cul", -"tiroir-caisse", -"tiroirs-caisses", -"tissu-éponge", -"tissus-éponges", -"titan-cotte", -"titanico-ammonique", -"titanico-ammoniques", "Tite-Live", "Titisee-Neustadt", -"titre-service", -"titres-services", "Tizac-de-Curton", "Tizac-de-Lapouyade", -"toba-qom", "Tobel-Tägerschen", "Tocane-Saint-Apre", -"t'occupe", -"toc-feu", "Tocqueville-en-Caux", "Tocqueville-les-Murs", "Tocqueville-sur-Eu", -"toc-toc", -"toc-tocs", +"Togny-aux-Bœufs", "Togny-aux-Bœufs", -"t'oh", -"tohu-bohu", -"tohu-bohus", -"tohus-bohus", -"toi-même", -"toits-terrasses", -"toit-terrasse", -"tolclofos-méthyl", -"tombe-cartouche", -"tom-pouce", -"tom-tom", -"tom-toms", -"t-on", "Tongre-Notre-Dame", "Tongre-Saint-Martin", "Tonnay-Boutonne", "Tonnay-Charente", "Tonnegrande-Montsinery", -"tonne-grenoir", -"tonne-mètre", -"top-down", -"top-model", -"top-modèle", -"top-modèles", -"top-models", -"topo-guide", -"topo-guides", -"top-secret", -"top-secrets", -"toque-feu", -"Torcé-en-Vallée", -"Torcé-Viviers-en-Charnie", -"torche-cul", -"torche-culs", -"torche-fer", -"torche-pertuis", -"torche-pin", -"torche-pinceau", -"torche-pinceaux", -"torche-pins", "Torcy-en-Valois", "Torcy-et-Pouligny", "Torcy-le-Grand", "Torcy-le-Petit", -"tord-boyau", -"tord-boyaux", -"tord-nez", +"Torcé-Viviers-en-Charnie", +"Torcé-en-Vallée", "Torgelow-Holländerei", "Torigni-sur-Vire", "Torigny-les-Villes", -"tori-i", "Torre-Cardela", "Torre-serona", "Torricella-Taverne", -"torse-poil", -"torse-poils", "Torteval-Quesnay", -"tortue-alligator", -"tortue-boite", -"tortue-boîte", -"tortue-duc", -"tortues-alligators", -"tortues-boites", -"tortues-boîtes", -"tortues-ducs", -"tosa-inu", "Toscolano-Maderno", -"tote-bag", -"tote-bags", -"tôt-fait", -"tôt-faits", -"touch-and-go", -"touche-à-tout", -"touche-pipi", -"touche-touche", -"Touët-de-l'Escarène", -"Touët-sur-Var", "Touffreville-la-Cable", "Touffreville-la-Corbeline", "Touffreville-sur-Eu", -"touille-boeuf", -"touille-bœuf", -"touille-boeufs", -"touille-bœufs", "Touillon-et-Loutelet", "Toulis-et-Attencourt", "Toulon-la-Montagne", @@ -24201,70 +16315,34 @@ FR_BASE_EXCEPTIONS = [ "Toulon-sur-Arroux", "Toulouse-le-Château", "Toulx-Sainte-Croix", -"Tourailles-sous-Bois", -"tour-à-tour", -"Tourcelles-Chaumont", -"Tourcelles-Chaumont-Quilly-et-Chardeny", "Tour-de-Faure", "Tour-en-Bessin", "Tour-en-Sologne", +"Tourailles-sous-Bois", +"Tourcelles-Chaumont", +"Tourcelles-Chaumont-Quilly-et-Chardeny", "Tourette-du-Château", -"Tourinnes-la-Grosse", "Tourinnes-Saint-Lambert", -"tour-minute", +"Tourinnes-la-Grosse", "Tournai-sur-Dive", "Tournan-en-Brie", "Tournay-sur-Odon", -"tourne-à-gauche", -"tourne-au-vent", -"tourne-case", -"tourne-cases", -"tourne-disque", -"tourne-disques", "Tournedos-Bois-Hubert", "Tournedos-sur-Seine", -"tourne-feuille", -"tourne-feuilles", -"tourne-feuillet", -"tourne-feuillets", -"tourne-fil", -"tourne-fils", -"tourne-gants", "Tournehem-sur-la-Hem", -"tourne-motte", -"tourne-mottes", -"tourne-oreille", -"tourne-oreilles", -"tourne-pierres", -"tourne-soc", -"tourne-socs", -"tourneur-fraiseur", -"tourneurs-fraiseurs", -"tourne-vent", -"tourne-vents", -"Tournon-d'Agenais", "Tournon-Saint-Martin", "Tournon-Saint-Pierre", +"Tournon-d'Agenais", "Tournon-sur-Rhône", "Tournous-Darré", "Tournous-Devant", -"tour-opérateur", -"tour-opérateurs", -"tour-opératrice", -"tour-opératrices", "Tourouvre-au-Perche", "Tourrette-Levens", "Tourrettes-sur-Loup", "Tours-en-Savoie", "Tours-en-Vimeu", -"tours-minute", -"tours-opérateurs", -"tours-opératrices", -"tours-sur-marnais", "Tours-sur-Marnais", -"tours-sur-marnaise", "Tours-sur-Marnaise", -"tours-sur-marnaises", "Tours-sur-Marnaises", "Tours-sur-Marne", "Tours-sur-Meymont", @@ -24281,295 +16359,90 @@ FR_BASE_EXCEPTIONS = [ "Toury-sur-Jour", "Tourzel-Ronzières", "Toussus-le-Noble", -"tout-à-fait", -"tout-à-la-rue", -"tout-à-l'égout", -"tout-blanc", -"tout-blancs", -"tout-communication", -"tout-connaissant", -"toute-bonne", -"toute-bonté", -"toute-cousue", -"toute-épice", -"tout-ensemble", -"tout-en-un", -"toute-petite", -"toute-présence", -"toute-puissance", -"toute-puissante", -"toute-saine", -"toutes-boîtes", -"toutes-bonnes", -"toute-science", -"toutes-petites", -"toutes-puissantes", -"toutes-saines", -"toutes-tables", -"toutes-venues", -"toute-table", -"toute-venue", -"tout-fait", -"tout-faits", -"tout-fécond", -"tout-Londres", "Tout-Paris", -"tout-parisien", -"tout-parisienne", -"tout-parisiennes", -"tout-parisiens", -"tout-petit", -"tout-petits", -"tout-puissant", "Tout-Puissant", -"tout-puissants", -"tout-terrain", -"tout-venant", -"tout-venu", -"toxi-infectieux", -"toxi-infection", -"toxi-infections", -"toy-terrier", +"Touët-de-l'Escarène", +"Touët-sur-Var", "Toy-Viam", "Traben-Trarbach", -"trace-bouche", -"trace-roulis", -"trace-sautereau", -"trace-vague", -"trachée-artère", -"trachélo-occipital", -"trachéo-bronchite", -"trachéo-bronchites", "Tracy-Bocage", "Tracy-le-Mont", "Tracy-le-Val", "Tracy-sur-Loire", "Tracy-sur-Mer", -"trade-union", -"trade-unionisme", -"trade-unionismes", -"trade-unions", -"tragi-comédie", -"tragi-comédies", -"tragi-comique", -"tragi-comiques", -"traîne-bâton", -"traine-buche", -"traîne-bûche", -"traine-buches", -"traîne-bûches", -"traîne-buisson", -"traîne-charrue", -"traîne-la-patte", -"traîne-lattes", -"traîne-malheur", -"traîne-misère", -"traîne-patins", -"traîne-potence", -"traine-ruisseau", -"traîne-ruisseau", -"traine-savate", -"traîne-savate", -"traine-savates", -"traîne-savates", -"traîne-semelle", -"traîne-semelles", -"trains-trams", -"train-train", -"train-trains", -"train-tram", -"trait-d'union", -"trait-d'unioné", -"trait-track", "Tramont-Emy", -"Tramont-Émy", "Tramont-Lassus", "Tramont-Saint-André", -"trams-trains", -"tram-train", -"tranchées-abris", -"tranche-maçonné", -"tranche-montagne", -"tranche-montagnes", -"tranche-papier", -"tranche-tête", +"Tramont-Émy", "Tranqueville-Graux", -"tran-tran", +"Trans-en-Provence", +"Trans-la-Forêt", +"Trans-sur-Erdre", "Traubach-le-Bas", "Traubach-le-Haut", "Travedona-Monate", -"Trébons-de-Luchon", -"Trébons-sur-la-Grasse", -"Trédrez-Locquémeau", "Treffort-Cuisiat", -"tré-flip", -"tré-flips", "Treilles-en-Gâtinais", "Treis-Karden", "Treize-Septiers", "Treize-Vents", -"Trélou-sur-Marne", "Tremblay-en-France", -"Tremblay-lès-Gonesse", "Tremblay-les-Villages", +"Tremblay-lès-Gonesse", "Tremblois-lès-Carignan", "Tremblois-lès-Rocroi", -"Trémont-sur-Saulx", -"Trémouille-Saint-Loup", -"trench-coat", -"trench-coats", -"trente-cinq", -"trente-deux", -"trente-deuxième", -"trente-deuxièmes", -"trente-deuzain", -"trente-deuzains", -"trente-deuzet", -"trente-deuzets", -"trente-douze", -"trente-et-un", -"trente-et-une", -"trente-et-unième", -"trente-et-unièmes", -"trente-huit", -"trente-neuf", -"trente-neuvième", -"trente-quatre", -"trente-sept", -"trente-six", -"trente-trois", -"trente-troisième", "Trentin-Haut-Adige", "Trentola-Ducenta", -"trépan-benne", -"trépan-bennes", "Treschenu-Creyers", -"très-chrétien", -"tré-sept", -"très-haut", -"Très-Haut", "Trespoux-Rassiels", "Treuzy-Levelay", -"Trèves-Cunault", -"Trèves-Sarrebourg", -"Trévou-Tréguignec", "Triac-Lautrait", -"tribénuron-méthyle", -"tribo-électricité", -"tribo-électricités", -"tribo-électrique", -"tribo-électriques", -"trichloro-nitrométhane", -"trichloro-trinitro-benzène", -"tric-trac", -"tric-tracs", "Trie-Château", "Trie-la-Ville", +"Trie-sur-Baïse", "Triel-sur-Seine", "Triembach-au-Val", -"Trie-sur-Baïse", "Triffouilly-les-Oies", -"triflusulfuron-méthyle", "Trifouillis-les-Oies", "Trifouilly-les-Oies", -"trinexapac-éthyl", "Trinité-et-Tobago", -"trinitro-cellulose", -"trinitro-celluloses", -"tripe-madame", -"triple-croche", -"triples-croches", -"trique-madame", -"tris-mal", -"tris-male", -"tris-males", -"tris-maux", "Trith-Saint-Léger", "Tritteling-Redlach", "Trizay-Coutretot-Saint-Serge", "Trizay-lès-Bonneval", "Trockenborn-Wolfersdorf", "Trocy-en-Multien", -"trois-bassinois", "Trois-Bassinois", -"trois-bassinoise", "Trois-Bassinoise", -"trois-bassinoises", "Trois-Bassinoises", -"trois-crayons", -"trois-épines", "Trois-Fonds", "Trois-Fontaines", "Trois-Fontaines-l'Abbaye", -"Troisfontaines-la-Ville", -"trois-huit", -"trois-mâts", -"trois-mâts-goélettes", "Trois-Monts", "Trois-Palis", -"trois-pierrais", "Trois-Pierrais", -"trois-pierraise", "Trois-Pierraise", -"trois-pierraises", "Trois-Pierraises", "Trois-Pistolet", "Trois-Pistolien", "Trois-Pistolois", -"trois-ponts", "Trois-Ponts", "Trois-Puits", -"trois-quarts", "Trois-Riverain", "Trois-Rives", "Trois-Rivières", -"trois-riviérien", "Trois-Riviérien", -"trois-riviérienne", "Trois-Riviérienne", -"trois-riviériennes", "Trois-Riviériennes", -"trois-riviériens", "Trois-Riviériens", -"trois-roues", -"trois-six", -"trois-trois", -"Trois-Vèvres", "Trois-Villes", -"trompe-cheval", -"trompe-couillon", -"trompe-la-mort", -"trompe-l'oeil", -"trompe-l'œil", -"trompe-oreilles", -"trompe-valet", +"Trois-Vèvres", +"Troisfontaines-la-Ville", "Tronville-en-Barrois", -"trop-bu", -"trop-payé", -"trop-payés", -"trop-perçu", -"trop-perçus", -"trop-plein", -"trop-pleins", "Trosly-Breuil", "Trosly-Loire", -"trotte-chemin", -"trotte-menu", "Trouan-le-Grand", -"trouble-fête", -"trouble-fêtes", "Trouley-Labarthe", -"trousse-barre", -"trousse-barres", -"trousse-pet", -"trousse-pète", -"trousse-pètes", -"trousse-pets", -"trousse-pied", -"trousse-pieds", -"trousse-queue", -"trousse-queues", -"trousse-traits", "Trouville-la-Haule", "Trouville-sur-Mer", "Troye-d'Ariège", @@ -24578,119 +16451,54 @@ FR_BASE_EXCEPTIONS = [ "Trucy-sur-Yonne", "Truttemer-le-Grand", "Truttemer-le-Petit", +"Très-Haut", +"Trèves-Cunault", +"Trèves-Sarrebourg", +"Trébons-de-Luchon", +"Trébons-sur-la-Grasse", +"Trédrez-Locquémeau", +"Trélou-sur-Marne", +"Trémont-sur-Saulx", +"Trémouille-Saint-Loup", +"Trévou-Tréguignec", "Tschiertschen-Praden", -"tsé-tsé", -"tsé-tsés", -"t-shirt", -"T-shirt", -"t-shirts", -"T-shirts", -"tsoin-tsoin", -"tsouin-tsouin", -"T-SQL", -"tss-tss", -"tta-kun", -"tta-kuns", -"ttun-ttun", -"ttun-ttuns", -"tubéro-infundibulaire", -"tubéro-infundibulaires", -"tue-brebis", -"tue-chien", -"tue-chiens", -"tue-diable", -"tue-diables", -"tue-l'amour", -"tue-loup", -"tue-loups", -"tue-mouche", -"tue-mouches", -"tue-poule", -"tue-teignes", "Tue-Vaques", -"tue-vent", -"Tugéras-Saint-Maurice", "Tugny-et-Pont", -"Tümlauer-Koog", -"tuniso-égypto-lybien", -"tupi-guarani", +"Tugéras-Saint-Maurice", "Tupin-et-Semons", -"turbo-alternateur", -"turbo-alternateurs", -"turbo-capitalisme", -"turbo-capitalismes", -"turbo-compresseur", -"turbo-compresseurs", -"turbo-prof", -"turbo-profs", -"turco-coréen", -"turco-mongol", -"turco-persan", -"turco-syrien", "Turing-calculable", "Turing-calculables", -"turn-over", "Turnow-Preilack", "Turquestein-Blancrupt", -"tutti-frutti", -"tu-tu-ban-ban", -"tux-zillertal", -"twin-set", -"twin-sets", -"tz'utujil", +"Téteghem-Coudekerque-Village", +"Tête-de-Moine", +"Tümlauer-Koog", +"U-turn", +"U-turns", +"UTF-8", "Ua-Huka", "Ua-Pou", -"Übach-Palenberg", "Ubaye-Serre-Ponçon", -"über-célèbre", -"über-célèbres", "Ubstadt-Weiher", "Uchacq-et-Parentis", -"u-commerce", "Uebigau-Wahrenbrück", "Uecker-Randow", "Uesslingen-Buch", "Ugao-Miraballes", "Uggiate-Trevano", -"Ugny-le-Gay", "Ugny-l'Equipée", "Ugny-l'Équipée", +"Ugny-le-Gay", "Ugny-sur-Meuse", "Uhart-Cize", -"Uharte-Arakil", "Uhart-Mixe", +"Uharte-Arakil", "Uhldingen-Mühlhofen", -"Ühlingen-Birkendorf", "Uhlstädt-Kirchhasel", -"ukiyo-e", -"ukiyo-es", "Ully-Saint-Georges", "Uncey-le-Franc", -"unda-maris", -"une-deux", -"uni-dimensionnel", -"uni-dimensionnelle", -"uni-dimensionnelles", -"uni-dimensionnels", -"uni-modal", -"uni-sonore", -"uni-sonores", -"unité-souris", -"unités-souris", -"univers-bloc", -"univers-île", -"univers-îles", "Unstrut-Hainich", -"upa-upa", "Upgant-Schott", -"urane-mica", -"uranes-micas", -"urétro-cystotomie", -"urétro-cystotomies", -"uro-génital", -"uro-génitale", -"uro-génitales", -"uro-génitaux", "Urou-et-Crennes", "Urroz-Villa", "Urtenen-Schönbühl", @@ -24703,100 +16511,64 @@ FR_BASE_EXCEPTIONS = [ "Usson-du-Poitou", "Usson-en-Forez", "Ussy-sur-Marne", -"utéro-lombaire", -"utéro-ovarien", -"utéro-ovarienne", -"utéro-ovariennes", -"utéro-ovariens", -"utéro-placentaire", -"utéro-tubaire", -"utéro-vaginal", -"utéro-vaginale", -"utéro-vaginales", -"utéro-vaginaux", -"UTF-8", -"uto-aztèque", -"uto-aztèques", -"U-turn", -"U-turns", -"uva-ursi", -"uva-ursis", "Uvernet-Fours", "Uzay-le-Venon", -"Vabres-l'Abbaye", "Vabre-Tizac", -"vache-biche", -"vache-garou", -"Vachères-en-Quint", +"Vabres-l'Abbaye", "Vacheresses-les-Basses", -"vaches-biches", -"vaches-garous", +"Vachères-en-Quint", "Vacognes-Neuilly", "Vacquerie-le-Boucq", "Vacqueriette-Erquières", -"vade-in-pace", -"va-de-la-gueule", -"vade-mecum", -"va-de-pied", -"vaeakau-taumako", -"vaeakau-taumakos", -"va-et-vient", -"vagino-vésical", "Vahl-Ebersing", "Vahl-lès-Bénestroff", "Vahl-lès-Faulquemont", "Vaihingen-sur-l'Enz", "Vailly-sur-Aisne", "Vailly-sur-Sauldre", -"vaine-pâture", +"Vair-sur-Loire", "Vaire-Arcier", "Vaire-le-Petit", "Vaire-sous-Corbie", "Vaires-sur-Marne", -"Vair-sur-Loire", "Vaison-la-Romaine", "Vaivre-et-Montoille", +"Val Buëch-Méouge", +"Val d'Arcomie", +"Val d'Issoire", +"Val d'Oronaye", +"Val d'Oust", +"Val d'épy", "Val-Alainois", -"Val-au-Perche", -"Val-Bélairien", "Val-Brillantois", +"Val-Bélairien", "Val-Cenis", +"Val-Davidois", +"Val-Fouzon", +"Val-Jolois", +"Val-Maravel", +"Val-Meer", +"Val-Mont", +"Val-Morinois", +"Val-Mésangeois", +"Val-Mésangeoise", +"Val-Mésangeoises", +"Val-Racinois", +"Val-Revermont", +"Val-Saint-Germinois", +"Val-Saint-Germinoise", +"Val-Saint-Germinoises", +"Val-Saint-Pierrais", +"Val-Saint-Pierraise", +"Val-Saint-Pierraises", +"Val-Sennevillois", +"Val-Sonnette", +"Val-Suzon", +"Val-au-Perche", "Val-d'Aoste", "Val-d'Auzon", -"Val-Davidois", -"Val-de-Bride", -"Val-de-Chalvagne", -"Val-de-Fier", -"Valdegovía-Gaubea", -"Val-de-la-Haye", -"val-de-marnais", -"Val-de-Marne", -"Val-de-Mercy", -"Val-de-Meuse", -"Valdemoro-Sierra", -"Valdeolmos-Alalpardo", "Val-d'Epy", -"Val-d'Épy", -"Val-de-Reuil", -"Val-de-Roulans", -"Val-de-Ruz", -"val-de-saânais", -"Val-de-Saânais", -"val-de-saânaise", -"Val-de-Saânaise", -"val-de-saânaises", -"Val-de-Saânaises", -"Val-de-Saâne", -"Val-des-Marais", "Val-d'Espoirien", -"Val-des-Prés", -"Val-de-Travers", -"Valde-Ucieza", -"Val-de-Vesle", -"Val-de-Vie", -"Val-de-Vière", -"Val-de-Virvée", -"Valdieu-Lutran", "Val-d'Illiez", "Val-d'Isère", "Val-d'Izé", @@ -24806,109 +16578,98 @@ FR_BASE_EXCEPTIONS = [ "Val-d'Oisiennes", "Val-d'Oisiens", "Val-d'Orger", -"Vald'orien", "Val-d'Orien", "Val-d'Ornain", "Val-d'Oust", +"Val-d'Épy", +"Val-de-Bride", +"Val-de-Chalvagne", +"Val-de-Fier", +"Val-de-Marne", +"Val-de-Mercy", +"Val-de-Meuse", +"Val-de-Reuil", +"Val-de-Roulans", +"Val-de-Ruz", +"Val-de-Saânais", +"Val-de-Saânaise", +"Val-de-Saânaises", +"Val-de-Saâne", +"Val-de-Travers", +"Val-de-Vesle", +"Val-de-Vie", +"Val-de-Virvée", +"Val-de-Vière", +"Val-de-la-Haye", +"Val-des-Marais", +"Val-des-Prés", "Val-du-Layon", +"Val-et-Châtillon", +"Vald'orien", +"Valde-Ucieza", +"Valdegovía-Gaubea", +"Valdemoro-Sierra", +"Valdeolmos-Alalpardo", +"Valdieu-Lutran", "Valence-d'Albigeois", "Valence-en-Brie", -"valence-gramme", -"valence-grammes", "Valence-sur-Baïse", -"valet-à-patin", -"Val-et-Châtillon", -"valet-de-pied", -"valets-à-patin", -"valets-de-pied", "Valeyres-sous-Montagny", "Valeyres-sous-Rances", "Valeyres-sous-Ursins", "Valfin-lès-Saint-Claude", "Valfin-sur-Valouse", -"Val-Fouzon", -"Val-Jolois", "Valkenburg-Houthem", +"Vall-llobrega", "Vallant-Saint-Georges", "Valle-d'Alesani", +"Valle-d'Orezza", "Valle-di-Campoloro", "Valle-di-Mezzana", "Valle-di-Rostino", -"Valle-d'Orezza", -"Vallerois-le-Bois", "Vallerois-Lorioz", +"Vallerois-le-Bois", "Valleroy-aux-Saules", "Valleroy-le-Sec", "Vallières-les-Grandes", "Vallières-lès-Metz", -"Vall-llobrega", "Valloire-sur-Cisse", -"Vallon-en-Sully", "Vallon-Pont-d'Arc", +"Vallon-en-Sully", "Vallon-sur-Gée", "Vallouise-Pelvoux", -"Val-Maravel", -"Val-Meer", -"val-mésangeois", -"Val-Mésangeois", -"val-mésangeoise", -"Val-Mésangeoise", -"val-mésangeoises", -"Val-Mésangeoises", -"Val-Mont", -"Val-Morinois", -"Val-Racinois", "Valras-Plage", -"Val-Revermont", -"val-saint-germinois", -"Val-Saint-Germinois", -"val-saint-germinoise", -"Val-Saint-Germinoise", -"val-saint-germinoises", -"Val-Saint-Germinoises", -"val-saint-pierrais", -"Val-Saint-Pierrais", -"val-saint-pierraise", -"Val-Saint-Pierraise", -"val-saint-pierraises", -"Val-Saint-Pierraises", "Vals-des-Tilles", -"valse-hésitation", -"Val-Sennevillois", -"valses-hésitations", "Vals-le-Chastel", "Vals-les-Bains", -"Val-Sonnette", "Vals-près-le-Puy", -"Val-Suzon", "Valverde-Enrique", -"Valzin-en-Petite-Montagne", "Valz-sous-Châteauneuf", +"Valzin-en-Petite-Montagne", "Vanault-le-Châtel", "Vanault-les-Dames", "Vandenesse-en-Auxois", +"Vandœuvre-lès-Nancy", "Vandœuvre-lès-Nancy", -"vanity-case", -"vanity-cases", "Vannes-le-Châtel", "Vannes-sur-Cosson", "Vantoux-et-Longevelle", "Vantoux-lès-Dijon", -"va-nu-pieds", -"va-outre", "Varces-Allières-et-Risset", "Varengeville-sur-Mer", -"Varenne-l'Arconce", "Varenne-Saint-Germain", +"Varenne-l'Arconce", +"Varenne-sur-le-Doubs", "Varennes-Changy", -"Varennes-en-Argonne", "Varennes-Jarcy", +"Varennes-Saint-Honorat", +"Varennes-Saint-Sauveur", +"Varennes-Vauzelles", +"Varennes-en-Argonne", "Varennes-le-Grand", "Varennes-lès-Mâcon", "Varennes-lès-Narcy", "Varennes-lès-Nevers", -"Varennes-Saint-Honorat", -"Varennes-Saint-Sauveur", "Varennes-sous-Dun", "Varennes-sur-Allier", "Varennes-sur-Amance", @@ -24918,46 +16679,21 @@ FR_BASE_EXCEPTIONS = [ "Varennes-sur-Seine", "Varennes-sur-Tèche", "Varennes-sur-Usson", -"Varenne-sur-le-Doubs", -"Varennes-Vauzelles", "Varmie-Mazurie", "Varneville-Bretteville", "Varois-et-Chaignot", "Vars-sur-Roseix", -"vasculo-nerveux", -"vaso-constricteur", -"vaso-constricteurs", -"vaso-constriction", -"vaso-constrictions", -"vaso-dilatateur", -"vaso-dilatateurs", -"vaso-dilatation", -"vaso-dilatations", -"vaso-intestinal", -"vaso-intestinale", -"vaso-intestinales", -"vaso-intestinaux", -"vaso-moteur", -"vaso-motrice", "Vassieux-en-Vercors", "Vassimont-et-Chapelaine", "Vassy-lès-Avallon", "Vassy-sous-Pisy", -"vas-y", -"va-te-laver", -"va-t-en", -"va-t'en", -"va-t-en-guerre", -"vaterite-A", -"vaterite-As", -"va-tout", "Vattetot-sous-Beaumont", "Vattetot-sur-Mer", "Vatteville-la-Rue", "Vaucelles-et-Beffecourt", +"Vauchelles-les-Quesnoy", "Vauchelles-lès-Authie", "Vauchelles-lès-Domart", -"Vauchelles-les-Quesnoy", "Vauclerc-et-la-Vallée-Foulon", "Vauconcourt-Nervezain", "Vaudeville-le-Haut", @@ -24966,22 +16702,26 @@ FR_BASE_EXCEPTIONS = [ "Vaulnaveys-le-Bas", "Vaulnaveys-le-Haut", "Vault-de-Lugny", -"Vaulx-en-Velin", "Vaulx-Milieu", "Vaulx-Vraucourt", +"Vaulx-en-Velin", "Vaunaveys-la-Rochette", "Vaux-Andigny", "Vaux-Champagne", -"vaux-champenois", "Vaux-Champenois", -"vaux-champenoise", "Vaux-Champenoise", -"vaux-champenoises", "Vaux-Champenoises", "Vaux-Chavanne", -"vaux-chavannois", "Vaux-Chavannois", "Vaux-Chavannoise", +"Vaux-Lavalette", +"Vaux-Marquenneville", +"Vaux-Montreuil", +"Vaux-Rouillac", +"Vaux-Saules", +"Vaux-Sûrois", +"Vaux-Sûroise", +"Vaux-Villaine", "Vaux-d'Amognes", "Vaux-devant-Damloup", "Vaux-en-Amiénois", @@ -24996,20 +16736,15 @@ FR_BASE_EXCEPTIONS = [ "Vaux-la-Douce", "Vaux-la-Grande", "Vaux-la-Petite", -"Vaux-Lavalette", "Vaux-le-Moncelot", "Vaux-le-Pénil", +"Vaux-les-Prés", +"Vaux-lez-Rosières", "Vaux-lès-Mouron", "Vaux-lès-Mouzon", "Vaux-lès-Palameix", -"Vaux-les-Prés", "Vaux-lès-Rubigny", "Vaux-lès-Saint-Claude", -"Vaux-lez-Rosières", -"Vaux-Marquenneville", -"Vaux-Montreuil", -"Vaux-Rouillac", -"Vaux-Saules", "Vaux-sous-Aubigny", "Vaux-sous-Bourcq", "Vaux-sous-Chèvremont", @@ -25020,9 +16755,6 @@ FR_BASE_EXCEPTIONS = [ "Vaux-sur-Lunain", "Vaux-sur-Mer", "Vaux-sur-Morges", -"vaux-sûrois", -"Vaux-Sûrois", -"Vaux-Sûroise", "Vaux-sur-Poligny", "Vaux-sur-Risle", "Vaux-sur-Saint-Urbain", @@ -25031,54 +16763,39 @@ FR_BASE_EXCEPTIONS = [ "Vaux-sur-Somme", "Vaux-sur-Sûre", "Vaux-sur-Vienne", -"Vaux-Villaine", "Vavray-le-Grand", "Vavray-le-Petit", "Vayres-sur-Essonne", "Vazeilles-Limandre", "Vazeilles-près-Saugues", -"veau-laq", -"veau-marin", "Veauville-lès-Baons", "Veauville-lès-Quelles", -"Védrines-Saint-Loup", -"végéto-sulfurique", "Veigy-Foncenex", "Velaine-en-Haye", "Velaine-sous-Amance", "Velars-sur-Ouche", -"velci-aller", "Velesmes-Echevanne", -"Velesmes-Échevanne", "Velesmes-Essarts", -"Vélez-Blanco", -"Vélez-Málaga", -"Vélez-Rubio", -"Vélizy-Villacoublay", +"Velesmes-Échevanne", +"Velle-le-Châtel", +"Velle-sur-Moselle", "Vellechevreux-et-Courbenans", "Vellefrey-et-Vellefrange", "Velleguindry-et-Levrecey", -"Velle-le-Châtel", -"Vellereille-les-Brayeux", "Vellereille-le-Sec", +"Vellereille-les-Brayeux", "Vellerot-lès-Belvoir", "Vellerot-lès-Vercel", -"Velle-sur-Moselle", "Vellexon-Queutey-et-Vaudey", "Vellexon-Queutrey-et-Vaudey", "Velloreille-lès-Choye", -"vélo-école", -"vélo-écoles", "Velone-Orneto", -"vélo-rail", -"vélo-rails", -"vélos-taxis", -"vélo-taxi", "Velotte-et-Tatignécourt", "Velsen-Noord", "Velsen-Zuid", "Veltem-Beisem", "Velzeke-Ruddershove", +"Ven-Zelderheide", "Venarey-les-Laumes", "Vendays-Montalivet", "Vendegies-au-Bois", @@ -25089,51 +16806,46 @@ FR_BASE_EXCEPTIONS = [ "Vendeuil-Caply", "Vendeuvre-du-Poitou", "Vendeuvre-sur-Barse", -"Vendin-lès-Béthune", "Vendin-le-Vieil", +"Vendin-lès-Béthune", "Vendredi-Saint", "Vendresse-Beaulne", "Vendresse-et-Troyon", "Veneux-les-Sablons", -"venez-y-voir", "Ventenac-Cabardès", "Ventenac-d'Aude", "Ventenac-en-Minervois", "Ventes-Saint-Rémy", -"ventre-madame", -"ventre-saint-gris", -"Ven-Zelderheide", +"Ver-lès-Chartres", +"Ver-sur-Launette", +"Ver-sur-Mer", "Verbano-Cusio-Ossola", "Vercel-Villedieu-le-Camp", "Verchain-Maugré", -"ver-coquin", "Verderel-lès-Sauqueuse", "Verdun-en-Lauragais", "Verdun-sur-Garonne", -"Verdun-sur-le-Doubs", "Verdun-sur-Meuse", -"Verel-de-Montbel", +"Verdun-sur-le-Doubs", "Verel-Pragondran", -"verge-d'or", +"Verel-de-Montbel", "Verger-sur-Dive", -"verges-d'or", "Vergt-de-Biron", -"Vérizet-Fleurville", -"Ver-lès-Chartres", "Verlhac-Tescou", "Vern-d'Anjou", +"Vern-sur-Seiche", "Verneil-le-Chétif", "Vernet-la-Varenne", "Vernet-les-Bains", +"Verneuil-Grand", +"Verneuil-Moustiers", +"Verneuil-Petit", "Verneuil-d'Avre-et-d'Iton", "Verneuil-en-Bourbonnais", "Verneuil-en-Halatte", -"Verneuil-Grand", -"Verneuil-le-Château", "Verneuil-l'Etang", "Verneuil-l'Étang", -"Verneuil-Moustiers", -"Verneuil-Petit", +"Verneuil-le-Château", "Verneuil-sous-Coucy", "Verneuil-sur-Avre", "Verneuil-sur-Igneraie", @@ -25154,106 +16866,40 @@ FR_BASE_EXCEPTIONS = [ "Vernoux-en-Gâtine", "Vernoux-en-Vivarais", "Vernoux-sur-Boutonne", -"Vern-sur-Seiche", -"Véronnes-les-Petites", "Verpillières-sur-Ource", "Verrens-Arvey", "Verreries-de-Moussans", "Verrey-sous-Drée", "Verrey-sous-Salmaise", +"Verrines-sous-Celles", "Verrières-de-Joux", "Verrières-du-Grosbois", "Verrières-en-Anjou", "Verrières-en-Forez", "Verrières-le-Buisson", -"Verrines-sous-Celles", -"Verseilles-le-Bas", -"Verseilles-le-Haut", -"Vers-en-Montagne", -"vers-librisme", -"vers-librismes", -"vers-libriste", -"vers-libristes", -"Versols-et-Lapeyre", "Vers-Pont-du-Gard", +"Vers-en-Montagne", "Vers-sous-Sellières", "Vers-sur-Méouge", "Vers-sur-Selles", -"Ver-sur-Launette", -"Ver-sur-Mer", -"vert-bois", -"vert-de-gris", -"vert-de-grisa", -"vert-de-grisai", -"vert-de-grisaient", -"vert-de-grisais", -"vert-de-grisait", -"vert-de-grisâmes", -"vert-de-grisant", -"vert-de-grisas", -"vert-de-grisasse", -"vert-de-grisassent", -"vert-de-grisasses", -"vert-de-grisassiez", -"vert-de-grisassions", -"vert-de-grisât", -"vert-de-grisâtes", -"vert-de-grise", -"vert-de-grisé", -"vert-de-grisée", -"vert-de-grisées", -"vert-de-grisent", -"vert-de-griser", -"vert-de-grisera", -"vert-de-griserai", -"vert-de-griseraient", -"vert-de-griserais", -"vert-de-griserait", -"vert-de-griseras", -"vert-de-grisèrent", -"vert-de-griserez", -"vert-de-griseriez", -"vert-de-griserions", -"vert-de-griserons", -"vert-de-griseront", -"vert-de-grises", -"vert-de-grisés", -"vert-de-grisez", -"vert-de-grisiez", -"vert-de-grisions", -"vert-de-grisons", -"Vert-en-Drouais", -"Verteuil-d'Agenais", -"Verteuil-sur-Charente", -"vert-jaune", -"Vert-le-Grand", -"Vert-le-Petit", -"vert-monnier", -"vert-monniers", +"Verseilles-le-Bas", +"Verseilles-le-Haut", +"Versols-et-Lapeyre", "Vert-Saint-Denis", "Vert-Toulon", +"Vert-en-Drouais", +"Vert-le-Grand", +"Vert-le-Petit", +"Verteuil-d'Agenais", +"Verteuil-sur-Charente", "Vesaignes-sous-Lafauche", "Vesaignes-sur-Marne", -"Vésenex-Crassy", -"Vésigneul-sur-Coole", -"Vésigneul-sur-Marne", "Vesles-et-Caumont", -"vesse-de-loup", -"vesses-de-loup", -"veston-cravate", -"vestons-cravates", "Vestric-et-Candiac", "Vesvres-sous-Chalancey", -"vétéro-testamentaire", -"vétéro-testamentaires", -"Vétraz-Monthoux", -"vetula-domussien", "Vetula-Domussien", -"vetula-domussienne", "Vetula-Domussienne", -"vetula-domussiennes", "Vetula-Domussiennes", -"vetula-domussiens", "Vetula-Domussiens", "Veuilly-la-Poterie", "Veules-les-Roses", @@ -25269,225 +16915,108 @@ FR_BASE_EXCEPTIONS = [ "Veyrines-de-Vergt", "Veyrins-Thuellin", "Vezels-Roussy", -"Vézeronce-Curtin", "Vezin-le-Coquet", -"Vézins-de-Lévézou", "Viala-du-Pas-de-Jaux", "Viala-du-Tarn", -"Viâpres-le-Grand", -"Viâpres-le-Petit", +"Vic-Fezensac", "Vic-de-Chassenay", "Vic-des-Prés", -"vice-amiral", -"vice-amirale", -"vice-amirales", -"vice-amirauté", -"vice-amiraux", -"vice-bailli", -"vice-baillis", -"vice-camérier", -"vice-cardinal", -"vice-champion", -"vice-championne", -"vice-championnes", -"vice-champions", -"vice-chancelier", -"vice-chanceliers", -"vice-consul", -"vice-consulat", -"vice-consulats", -"vice-consule", -"vice-directeur", -"vice-gérance", -"vice-gérances", -"vice-gérant", -"vice-gérants", -"vice-gérent", -"vice-gérents", -"vice-gouverneur", -"vice-légat", -"vice-légation", -"vice-légations", -"vice-légats", "Vic-en-Bigorre", "Vic-en-Carladais", -"vice-official", -"vice-préfet", -"vice-présida", -"vice-présidai", -"vice-présidaient", -"vice-présidais", -"vice-présidait", -"vice-présidâmes", -"vice-présidant", -"vice-présidas", -"vice-présidasse", -"vice-présidassent", -"vice-présidasses", -"vice-présidassiez", -"vice-présidassions", -"vice-présidât", -"vice-présidâtes", -"vice-préside", -"vice-présidé", -"vice-présidée", -"vice-présidées", -"vice-présidence", -"vice-présidences", -"vice-président", -"vice-présidente", -"vice-présidentes", -"vice-présidents", -"vice-présider", -"vice-présidera", -"vice-présiderai", -"vice-présideraient", -"vice-présiderais", -"vice-présiderait", -"vice-présideras", -"vice-présidèrent", -"vice-présiderez", -"vice-présideriez", -"vice-présiderions", -"vice-présiderons", -"vice-présideront", -"vice-présides", -"vice-présidés", -"vice-présidez", -"vice-présidiez", -"vice-présidions", -"vice-présidons", -"vice-procureur", -"vice-procureurs", -"vice-recteur", -"vice-recteurs", -"vice-rectrice", -"vice-rectrices", -"vice-reine", -"vice-reines", -"vice-roi", -"vice-rois", -"vice-royal", -"vice-royale", -"vice-royales", -"vice-royauté", -"vice-royautés", -"vice-royaux", -"vice-secrétaire", -"vice-sénéchal", -"vices-gouverneurs", -"vice-versa", -"Vic-Fezensac", -"Vichel-Nanteuil", "Vic-la-Gardiole", "Vic-le-Comte", "Vic-le-Fesq", -"Vicq-d'Auribat", -"Vicq-Exemplet", -"Vicq-sur-Breuilh", -"Vicq-sur-Gartempe", -"Vicq-sur-Mer", -"Vicq-sur-Nahon", "Vic-sous-Thil", "Vic-sur-Aisne", "Vic-sur-Cère", "Vic-sur-Seille", -"victim-blaming", +"Vichel-Nanteuil", +"Vicq-Exemplet", +"Vicq-d'Auribat", +"Vicq-sur-Breuilh", +"Vicq-sur-Gartempe", +"Vicq-sur-Mer", +"Vicq-sur-Nahon", "Victot-Pontfol", -"vide-atelier", -"vide-ateliers", -"vide-bouteille", -"vide-bouteilles", -"vide-cave", -"vide-caves", -"vide-citrons", -"vide-couilles", -"vide-dressing", -"vide-dressings", -"vide-gousset", -"vide-goussets", -"vide-grange", -"vide-grenier", -"vide-greniers", -"vide-maison", -"vide-maisons", -"vide-ordure", -"vide-ordures", -"vide-poche", -"vide-poches", -"vide-pomme", -"vide-pommes", -"vide-pommier", -"vide-vite", -"vieil-baugeois", "Vieil-Baugeois", -"vieil-baugeoise", "Vieil-Baugeoise", -"vieil-baugeoises", "Vieil-Baugeoises", "Vieil-Hesdin", -"vieil-hesdinois", "Vieil-Hesdinois", -"vieil-hesdinoise", "Vieil-Hesdinoise", -"vieil-hesdinoises", "Vieil-Hesdinoises", "Vieil-Moutier", +"Vieille-Brioude", +"Vieille-Chapelle", +"Vieille-Toulouse", +"Vieille-Église", +"Vieille-Église-en-Yvelines", +"Vieilles-Maisons-sur-Joudry", "Viel-Arcy", +"Viel-Mauricien", +"Viel-Mauricienne", +"Viel-Mauriciennes", +"Viel-Mauriciens", +"Viel-Saint-Remy", "Vielle-Adour", "Vielle-Aure", "Vielle-Louron", +"Vielle-Saint-Girons", +"Vielle-Soubiran", +"Vielle-Soubiranais", +"Vielle-Soubiranaise", +"Vielle-Soubiranaises", +"Vielle-Tursan", "Viellenave-d'Arthez", "Viellenave-de-Bidache", "Viellenave-de-Navarrenx", "Viellenave-sur-Bidouze", -"Vielle-Saint-Girons", -"Vielle-Soubiran", -"vielle-soubiranais", -"Vielle-Soubiranais", -"vielle-soubiranaise", -"Vielle-Soubiranaise", -"vielle-soubiranaises", -"Vielle-Soubiranaises", -"Vielle-Tursan", -"viel-mauricien", -"Viel-Mauricien", -"viel-mauricienne", -"Viel-Mauricienne", -"viel-mauriciennes", -"Viel-Mauriciennes", -"viel-mauriciens", -"Viel-Mauriciens", "Vielmur-sur-Agout", -"Viel-Saint-Remy", "Viels-Maisons", "Vienne-en-Arthies", "Vienne-en-Bessin", "Vienne-en-Val", "Vienne-la-Ville", "Vienne-le-Château", -"viens-poupoulerie", -"viens-poupouleries", "Vier-Bordes", "Viereth-Trunstadt", "Vierset-Barse", "Vierves-sur-Viroin", "Vierville-sur-Mer", "Viet-Nam", -"Viêt-nam", "Vieu-d'Izenave", -"Viéville-en-Haye", -"Viéville-sous-les-Côtes", +"Vieux-Berquin", +"Vieux-Boucau-les-Bains", +"Vieux-Bourg", +"Vieux-Champagne", +"Vieux-Charmont", +"Vieux-Château", +"Vieux-Condé", +"Vieux-Ferrette", +"Vieux-Fort", +"Vieux-Fumé", +"Vieux-Habitants", +"Vieux-Lixheim", +"Vieux-Manoir", +"Vieux-Mareuil", +"Vieux-Mesnil", +"Vieux-Moulin", +"Vieux-Pont", +"Vieux-Pont-en-Auge", +"Vieux-Port", +"Vieux-Reng", +"Vieux-Rouen-sur-Bresle", +"Vieux-Ruffec", +"Vieux-Thann", +"Vieux-Viel", +"Vieux-Vy-sur-Couesnon", +"Vieux-lès-Asfeld", "Vievy-le-Rayé", -"vif-argent", -"vif-gage", -"vigne-blanche", -"vignes-blanches", "Vignes-la-Côte", -"Vigneulles-lès-Hattonchâtel", "Vigneul-sous-Montmédy", -"Vigneux-de-Bretagne", +"Vigneulles-lès-Hattonchâtel", "Vigneux-Hocquet", +"Vigneux-de-Bretagne", "Vigneux-sur-Seine", "Vignola-Falesina", "Vignoux-sous-les-Aix", @@ -25503,11 +17032,6 @@ FR_BASE_EXCEPTIONS = [ "Vildé-Guingalan", "Villabona-Amasa", "Village-Neuf", -"village-rue", -"villages-rue", -"villages-rues", -"villages-tas", -"village-tas", "Villaines-en-Duesmois", "Villaines-la-Carelle", "Villaines-la-Gonais", @@ -25517,19 +17041,12 @@ FR_BASE_EXCEPTIONS = [ "Villaines-sous-Bois", "Villaines-sous-Lucé", "Villaines-sous-Malicorne", +"Villar-Loubière", +"Villar-Saint-Anselme", +"Villar-Saint-Pancrace", "Villar-d'Arêne", +"Villar-en-Val", "Villard-Bonnot", -"villard-de-lans", -"Villard-de-Lans", -"villard-d'hérien", -"Villard-d'Hérien", -"villard-d'hérienne", -"Villard-d'Hérienne", -"villard-d'hériennes", -"Villard-d'Hériennes", -"villard-d'hériens", -"Villard-d'Hériens", -"Villard-d'Héry", "Villard-Léger", "Villard-Notre-Dame", "Villard-Reculas", @@ -25537,47 +17054,83 @@ FR_BASE_EXCEPTIONS = [ "Villard-Saint-Christophe", "Villard-Saint-Sauveur", "Villard-Sallet", -"Villards-d'Héria", +"Villard-d'Hérien", +"Villard-d'Hérienne", +"Villard-d'Hériennes", +"Villard-d'Hériens", +"Villard-d'Héry", +"Villard-de-Lans", "Villard-sur-Bienne", "Villard-sur-Doron", "Villard-sur-l'Ain", +"Villards-d'Héria", "Villarejo-Periesteban", -"Villar-en-Val", -"Villar-Loubière", "Villarodin-Bourget", -"Villar-Saint-Anselme", -"Villar-Saint-Pancrace", "Villars-Brandis", "Villars-Colmars", -"Villarsel-sur-Marly", -"Villars-en-Azois", -"Villars-en-Pons", -"Villars-Épeney", -"Villars-et-Villenotte", "Villars-Fontaine", -"Villars-le-Comte", -"Villars-le-Pautel", -"Villars-lès-Blamont", -"Villars-les-Bois", -"Villars-les-Dombes", -"Villars-le-Sec", -"Villars-les-Moines", -"Villars-le-Terroir", -"Villars-Sainte-Croix", "Villars-Saint-Georges", "Villars-Saint-Marcellin", +"Villars-Sainte-Croix", "Villars-Santenoge", +"Villars-en-Azois", +"Villars-en-Pons", +"Villars-et-Villenotte", +"Villars-le-Comte", +"Villars-le-Pautel", +"Villars-le-Sec", +"Villars-le-Terroir", +"Villars-les-Bois", +"Villars-les-Dombes", +"Villars-les-Moines", +"Villars-lès-Blamont", "Villars-sous-Dampjoux", "Villars-sous-Ecot", -"Villars-sous-Écot", "Villars-sous-Yens", +"Villars-sous-Écot", "Villars-sur-Glâne", "Villars-sur-Var", +"Villars-Épeney", +"Villarsel-sur-Marly", "Villarta-Quintana", "Villarzel-Cabardès", "Villarzel-du-Razès", "Villaverde-Mogina", "Villaz-Saint-Pierre", +"Ville-Dommange", +"Ville-Houdlémont", +"Ville-Langy", +"Ville-Saint-Jacques", +"Ville-Savoye", +"Ville-au-Montois", +"Ville-au-Val", +"Ville-d'Avray", +"Ville-devant-Belrain", +"Ville-devant-Chaumont", +"Ville-di-Paraso", +"Ville-di-Pietrabugno", +"Ville-du-Pont", +"Ville-en-Blaisois", +"Ville-en-Sallaz", +"Ville-en-Selve", +"Ville-en-Tardenois", +"Ville-en-Vermois", +"Ville-en-Woëvre", +"Ville-la-Grand", +"Ville-le-Marclet", +"Ville-sous-Anjou", +"Ville-sous-la-Ferté", +"Ville-sur-Ancre", +"Ville-sur-Arce", +"Ville-sur-Cousances", +"Ville-sur-Illon", +"Ville-sur-Jarnioux", +"Ville-sur-Lumes", +"Ville-sur-Retourne", +"Ville-sur-Saulx", +"Ville-sur-Terre", +"Ville-sur-Tourbe", +"Ville-sur-Yron", "Villebois-Lavalette", "Villebois-les-Pins", "Villebon-sur-Yvette", @@ -25586,9 +17139,9 @@ FR_BASE_EXCEPTIONS = [ "Villedieu-la-Blouère", "Villedieu-le-Camp", "Villedieu-le-Château", -"Villedieu-lès-Bailleul", "Villedieu-les-Poêles", "Villedieu-les-Poêles-Rouffigny", +"Villedieu-lès-Bailleul", "Villedieu-sur-Indre", "Villefranche-d'Albigeois", "Villefranche-d'Allier", @@ -25617,103 +17170,280 @@ FR_BASE_EXCEPTIONS = [ "Villemur-sur-Tarn", "Villenauxe-la-Grande", "Villenauxe-la-Petite", -"Villenave-de-Rions", "Villenave-d'Ornon", +"Villenave-de-Rions", "Villenave-près-Béarn", "Villenave-près-Marsac", +"Villeneuve-Frouville", +"Villeneuve-Loubet", +"Villeneuve-Lécussan", +"Villeneuve-Minervois", +"Villeneuve-Renneville-Chevigny", +"Villeneuve-Saint-Denis", +"Villeneuve-Saint-Georges", +"Villeneuve-Saint-Germain", +"Villeneuve-Saint-Salves", +"Villeneuve-Saint-Vistre-et-Villevotte", +"Villeneuve-Tolosane", +"Villeneuve-au-Chemin", +"Villeneuve-d'Allier", +"Villeneuve-d'Amont", +"Villeneuve-d'Ascq", +"Villeneuve-d'Aval", +"Villeneuve-d'Entraunes", +"Villeneuve-d'Olmes", +"Villeneuve-de-Berg", +"Villeneuve-de-Duras", +"Villeneuve-de-Marc", +"Villeneuve-de-Marsan", +"Villeneuve-de-Rivière", +"Villeneuve-de-la-Raho", +"Villeneuve-du-Latou", +"Villeneuve-du-Paréage", +"Villeneuve-en-Montagne", +"Villeneuve-en-Perseigne", +"Villeneuve-en-Retz", +"Villeneuve-l'Archevêque", +"Villeneuve-la-Comptal", +"Villeneuve-la-Comtesse", +"Villeneuve-la-Dondagre", +"Villeneuve-la-Garenne", +"Villeneuve-la-Guyard", +"Villeneuve-la-Lionne", +"Villeneuve-la-Rivière", +"Villeneuve-le-Comte", +"Villeneuve-le-Roi", +"Villeneuve-les-Bordes", +"Villeneuve-les-Cerfs", +"Villeneuve-les-Corbières", +"Villeneuve-les-Genêts", +"Villeneuve-les-Sablons", +"Villeneuve-lès-Avignon", +"Villeneuve-lès-Bouloc", +"Villeneuve-lès-Béziers", +"Villeneuve-lès-Charnod", +"Villeneuve-lès-Lavaur", +"Villeneuve-lès-Maguelone", +"Villeneuve-lès-Montréal", +"Villeneuve-sous-Charigny", +"Villeneuve-sous-Dammartin", +"Villeneuve-sous-Pymont", +"Villeneuve-sur-Allier", +"Villeneuve-sur-Auvers", +"Villeneuve-sur-Bellot", +"Villeneuve-sur-Cher", +"Villeneuve-sur-Conie", +"Villeneuve-sur-Fère", +"Villeneuve-sur-Lot", +"Villeneuve-sur-Verberie", +"Villeneuve-sur-Vère", +"Villeneuve-sur-Yonne", "Villennes-sur-Seine", "Villequier-Aumont", "Villerouge-Termenès", "Villeroy-sur-Méholle", -"villes-champignons", -"villes-clés", -"Villesèque-des-Corbières", -"villes-États", -"villes-provinces", +"Villers-Agron-Aiguizy", +"Villers-Allerand", +"Villers-Bocage", +"Villers-Bouton", +"Villers-Bretonneux", +"Villers-Brûlin", +"Villers-Buzon", +"Villers-Campsart", +"Villers-Canivet", +"Villers-Carbonnel", +"Villers-Cernay", +"Villers-Chemin-et-Mont-lès-Étrelles", +"Villers-Chief", +"Villers-Châtel", +"Villers-Cotterêts", +"Villers-Farlay", +"Villers-Faucon", +"Villers-Franqueux", +"Villers-Grélot", +"Villers-Guislain", +"Villers-Hélon", +"Villers-Marmery", +"Villers-Outréaux", +"Villers-Pater", +"Villers-Patras", +"Villers-Plouich", +"Villers-Pol", +"Villers-Robert", +"Villers-Rotin", +"Villers-Saint-Barthélemy", +"Villers-Saint-Christophe", +"Villers-Saint-Frambourg", +"Villers-Saint-Genest", +"Villers-Saint-Martin", +"Villers-Saint-Paul", +"Villers-Saint-Sépulcre", +"Villers-Semeuse", +"Villers-Sir-Simon", +"Villers-Sire-Nicole", +"Villers-Stoncourt", +"Villers-Tournelle", +"Villers-Vaudey", +"Villers-Vermont", +"Villers-Vicomte", +"Villers-au-Bois", +"Villers-au-Flos", +"Villers-au-Tertre", +"Villers-aux-Bois", +"Villers-aux-Nœuds", +"Villers-aux-Vents", +"Villers-aux-Érables", +"Villers-devant-Dun", +"Villers-devant-Mouzon", +"Villers-devant-le-Thour", +"Villers-en-Argonne", +"Villers-en-Arthies", +"Villers-en-Cauchies", +"Villers-en-Haye", +"Villers-en-Vexin", +"Villers-l'Hôpital", +"Villers-la-Chèvre", +"Villers-la-Combe", +"Villers-la-Faye", +"Villers-la-Montagne", +"Villers-la-Ville", +"Villers-le-Château", +"Villers-le-Lac", +"Villers-le-Rond", +"Villers-le-Sec", +"Villers-le-Tilleul", +"Villers-le-Tourneur", +"Villers-les-Bois", +"Villers-les-Pots", +"Villers-lès-Cagnicourt", +"Villers-lès-Guise", +"Villers-lès-Luxeuil", +"Villers-lès-Mangiennes", +"Villers-lès-Moivrons", +"Villers-lès-Nancy", +"Villers-lès-Roye", +"Villers-sous-Ailly", +"Villers-sous-Chalamont", +"Villers-sous-Châtillon", +"Villers-sous-Foucarmont", +"Villers-sous-Montrond", +"Villers-sous-Pareid", +"Villers-sous-Prény", +"Villers-sous-Saint-Leu", +"Villers-sur-Auchy", +"Villers-sur-Authie", +"Villers-sur-Bar", +"Villers-sur-Bonnières", +"Villers-sur-Coudun", +"Villers-sur-Fère", +"Villers-sur-Mer", +"Villers-sur-Meuse", +"Villers-sur-Nied", +"Villers-sur-Port", +"Villers-sur-Saulnot", +"Villers-sur-Trie", +"Villers-sur-le-Mont", +"Villers-sur-le-Roule", +"Villers-Écalles", "Villes-sur-Auzon", -"Villey-le-Sec", +"Villesèque-des-Corbières", +"Villette-d'Anthon", +"Villette-de-Vienne", +"Villette-lès-Arbois", +"Villette-lès-Dole", +"Villette-sur-Ain", +"Villette-sur-Aube", "Villey-Saint-Etienne", "Villey-Saint-Étienne", +"Villey-le-Sec", "Villey-sur-Tille", "Villez-sous-Bailleul", "Villez-sur-le-Neubourg", -"Villié-Morgon", +"Villiers-Adam", +"Villiers-Charlemagne", +"Villiers-Couture", +"Villiers-Fossard", +"Villiers-Herbisse", +"Villiers-Louis", +"Villiers-Saint-Benoît", +"Villiers-Saint-Denis", +"Villiers-Saint-Frédéric", +"Villiers-Saint-Georges", +"Villiers-Saint-Orien", +"Villiers-Vineux", +"Villiers-au-Bouin", +"Villiers-aux-Corneilles", +"Villiers-en-Bière", +"Villiers-en-Bois", +"Villiers-en-Désœuvre", +"Villiers-en-Lieu", +"Villiers-en-Morvan", +"Villiers-en-Plaine", +"Villiers-le-Bel", +"Villiers-le-Bois", +"Villiers-le-Bâcle", +"Villiers-le-Duc", +"Villiers-le-Mahieu", +"Villiers-le-Morhier", +"Villiers-le-Pré", +"Villiers-le-Roux", +"Villiers-le-Sec", +"Villiers-les-Hauts", +"Villiers-lès-Aprey", +"Villiers-sous-Grez", +"Villiers-sous-Mortagne", +"Villiers-sous-Praslin", +"Villiers-sur-Chizé", +"Villiers-sur-Loir", +"Villiers-sur-Marne", +"Villiers-sur-Morin", +"Villiers-sur-Orge", +"Villiers-sur-Seine", +"Villiers-sur-Suize", +"Villiers-sur-Tholon", +"Villiers-sur-Yonne", "Villieu-Loyes-Mollon", "Villingen-Schwenningen", +"Villié-Morgon", "Villons-les-Buissons", -"Villotte-devant-Louppy", "Villotte-Saint-Seine", +"Villotte-devant-Louppy", "Villotte-sur-Aire", "Villotte-sur-Ource", +"Villy-Bocage", +"Villy-en-Auxois", +"Villy-en-Trodes", +"Villy-le-Bois", +"Villy-le-Bouveret", +"Villy-le-Maréchal", +"Villy-le-Moutier", +"Villy-le-Pelloux", +"Villy-lez-Falaise", +"Villy-sur-Yères", "Vilosnes-Haraumont", "Vilters-Wangs", "Vincent-Froideville", +"Vincy-Manœuvre", "Vincy-Manœuvre", "Vincy-Reuil-et-Magny", "Vindrac-Alayrac", "Vineuil-Saint-Firmin", -"vingt-cinq", "Vingt-Cinq", -"vingt-cinquième", -"vingt-cinquièmes", -"vingt-deux", -"vingt-deuxain", -"vingt-deuxains", -"vingt-deuxième", -"vingt-deuxièmes", -"vingt-et-un", -"vingt-et-une", -"vingt-et-unième", -"vingt-et-unièmes", "Vingt-Hanaps", -"vingt-hanapsien", "Vingt-Hanapsien", -"vingt-hanapsienne", "Vingt-Hanapsienne", -"vingt-hanapsiennes", "Vingt-Hanapsiennes", -"vingt-hanapsiens", "Vingt-Hanapsiens", -"vingt-huit", "Vingt-Huit", -"vingt-huitième", -"vingt-huitièmes", -"vingt-neuf", -"vingt-neuvième", -"vingt-neuvièmes", -"vingt-quatrain", -"vingt-quatrains", -"vingt-quatre", -"vingt-quatrième", -"vingt-quatrièmes", -"vingt-sept", "Vingt-Sept", -"vingt-septième", -"vingt-septièmes", -"vingt-six", -"vingt-sixain", -"vingt-sixième", -"vingt-sixièmes", -"vingt-trois", -"vingt-troisième", -"vingt-troisièmes", -"vino-benzoïque", -"vino-benzoïques", "Vinon-sur-Verdon", "Vins-sur-Caramy", "Viodos-Abense-de-Bas", -"violet-évêque", "Viols-en-Laval", "Viols-le-Fort", -"viornes-tin", -"viorne-tin", -"vire-capot", -"vire-capots", -"Viré-en-Champagne", "Vire-sur-Lot", "Vireux-Molhain", "Vireux-Wallerand", -"vire-vire", "Virey-le-Grand", "Virey-sous-Bar", "Virginal-Samme", @@ -25722,25 +17452,16 @@ FR_BASE_EXCEPTIONS = [ "Virieu-le-Petit", "Viry-Châtillon", "Viry-Noureuil", -"visa-bourgien", -"Visa-Bourgien", -"visa-bourgienne", -"Visa-Bourgienne", -"visa-bourgiennes", -"Visa-Bourgiennes", -"visa-bourgiens", -"Visa-Bourgiens", -"vis-à-vis", +"Viré-en-Champagne", "Vis-en-Artois", +"Visa-Bourgien", +"Visa-Bourgienne", +"Visa-Bourgiennes", +"Visa-Bourgiens", "Vissac-Auteyrac", -"visuo-spacial", -"visuo-spaciale", -"visuo-spaciales", -"visuo-spaciaux", -"vit-de-mulet", "Vitoria-Gasteiz", -"Vitrac-en-Viadène", "Vitrac-Saint-Vincent", +"Vitrac-en-Viadène", "Vitrac-sur-Montane", "Vitrai-sous-Laigle", "Vitray-en-Beauce", @@ -25748,12 +17469,12 @@ FR_BASE_EXCEPTIONS = [ "Vitrey-sur-Mance", "Vitrolles-en-Luberon", "Vitrolles-en-Lubéron", +"Vitry-Laché", "Vitry-aux-Loges", "Vitry-en-Artois", "Vitry-en-Charollais", "Vitry-en-Montagne", "Vitry-en-Perthois", -"Vitry-Laché", "Vitry-la-Ville", "Vitry-le-Croisé", "Vitry-le-François", @@ -25766,15 +17487,10 @@ FR_BASE_EXCEPTIONS = [ "Vitz-sur-Authie", "Viuz-en-Sallaz", "Viuz-la-Chiésaz", -"vivaro-alpin", -"vivaro-alpins", -"vive-eau", -"vive-la-joie", "Vive-Saint-Bavon", "Vive-Saint-Éloi", -"vives-eaux", -"Vivier-au-Court", "Vivier-Danger", +"Vivier-au-Court", "Viviers-du-Lac", "Viviers-le-Gras", "Viviers-lès-Lavaur", @@ -25782,58 +17498,24 @@ FR_BASE_EXCEPTIONS = [ "Viviers-lès-Offroicourt", "Viviers-sur-Artaut", "Viviers-sur-Chiers", -"vivre-ensemble", -"v'là", +"Viâpres-le-Grand", +"Viâpres-le-Petit", +"Viéville-en-Haye", +"Viéville-sous-les-Côtes", +"Viêt-nam", "Vlaardinger-Ambacht", "Vlagtwedder-Barlage", "Vlagtwedder-Veldhuis", "Vlodrop-Station", -"v'nir", -"v'nu", -"Vœlfling-lès-Bouzonville", -"Vœuil-et-Giget", "Vogelsang-Warsin", "Void-Vacon", -"voile-manteau", -"voile-manteaux", "Voisins-le-Bretonneux", -"vois-tu", -"voiture-bar", -"voiture-bélier", -"voiture-cage", -"voiture-couchettes", -"voiture-lits", -"voiture-pilote", -"voiture-restaurant", -"voiture-salon", -"voitures-balais", -"voitures-bars", -"voitures-béliers", -"voitures-cages", -"voitures-couchettes", -"voitures-lits", -"voitures-pilotes", -"voitures-restaurants", -"voitures-salons", -"voitures-ventouses", -"voiture-ventouse", "Voivres-lès-le-Mans", -"vol-au-vent", -"vol-bélier", -"vol-béliers", -"volley-ball", -"volley-balls", "Vollore-Montagne", "Vollore-Ville", -"Volmerange-lès-Boulay", "Volmerange-les-Mines", -"volt-ampère", -"volt-ampères", -"volte-face", -"volte-faces", +"Volmerange-lès-Boulay", "Vomécourt-sur-Madon", -"vomito-negro", -"vomito-négro", "Voor-Drempt", "Voray-sur-l'Ognon", "Vorges-les-Pins", @@ -25845,118 +17527,86 @@ FR_BASE_EXCEPTIONS = [ "Voulaines-les-Templiers", "Vouneuil-sous-Biard", "Vouneuil-sur-Vienne", -"vous-même", -"vous-mêmes", "Voutenay-sur-Cure", "Vouthon-Bas", "Vouthon-Haut", "Vouvray-sur-Huisne", "Vouvray-sur-Loir", "Vovray-en-Bornes", -"voyageur-kilomètre", -"voyageurs-kilomètres", -"voyez-vous", "Vraignes-en-Vermandois", "Vraignes-lès-Hornoy", "Vresse-sur-Semois", -"Vrigne-aux-Bois", "Vrigne-Meuse", -"vrigne-meusien", "Vrigne-Meusien", -"vrigne-meusienne", "Vrigne-Meusienne", -"vrigne-meusiennes", "Vrigne-Meusiennes", -"vrigne-meusiens", "Vrigne-Meusiens", +"Vrigne-aux-Bois", "Vrijhoeve-Capelle", "Vroncourt-la-Côte", -"v's", -"vu-arriver", "Vufflens-la-Ville", "Vufflens-le-Château", "Vuisternens-devant-Romont", "Vuisternens-en-Ogoz", "Vulaines-lès-Provins", "Vulaines-sur-Seine", -"Vyans-le-Val", -"Vyle-et-Tharoul", "Vy-le-Ferroux", +"Vy-les-Luron", +"Vy-les-Lurone", +"Vy-les-Lurones", +"Vy-les-Lurons", "Vy-lès-Filain", "Vy-lès-Lure", -"vy-les-luron", -"Vy-les-Luron", -"vy-les-lurone", -"Vy-les-Lurone", -"vy-les-lurones", -"Vy-les-Lurones", -"vy-les-lurons", -"Vy-les-Lurons", "Vy-lès-Rupt", +"Vyans-le-Val", +"Vyle-et-Tharoul", "Vyt-lès-Belvoir", +"Vœlfling-lès-Bouzonville", +"Vœuil-et-Giget", +"Védrines-Saint-Loup", +"Vélez-Blanco", +"Vélez-Málaga", +"Vélez-Rubio", +"Vélizy-Villacoublay", +"Vérizet-Fleurville", +"Véronnes-les-Petites", +"Vésenex-Crassy", +"Vésigneul-sur-Coole", +"Vésigneul-sur-Marne", +"Vétraz-Monthoux", +"Vézeronce-Curtin", +"Vézins-de-Lévézou", +"Vœlfling-lès-Bouzonville", +"Vœuil-et-Giget", "Wadonville-en-Woëvre", "Wageningen-Hoog", -"wagon-bar", -"wagon-citerne", -"wagon-couchette", -"wagon-couchettes", -"wagon-foudre", -"wagon-grue", -"wagon-lit", -"wagon-lits", -"wagon-poche", -"wagon-poste", -"wagon-réservoir", -"wagon-restaurant", -"wagon-salon", -"wagons-bars", -"wagons-citernes", -"wagons-couchettes", -"wagons-foudres", -"wagons-grues", -"wagons-lits", -"wagons-réservoirs", -"wagons-restaurants", -"wagons-salons", -"wagons-tombereaux", -"wagons-trémie", -"wagon-tombereau", -"wagon-trémie", -"wagon-vanne", -"wah-wah", "Wailly-Beaucamp", +"Wald-Michelbach", "Waldeck-Frankenberg", "Waldfischbach-Burgalben", "Waldhof-Falkenstein", -"Wald-Michelbach", "Waldshut-Tiengen", "Walhain-Saint-Paul", "Walincourt-Selvigny", -"walkies-talkies", -"walkie-talkie", "Wallendorf-Pont", -"Wallers-en-Fagne", "Wallers-Trélon", +"Wallers-en-Fagne", "Wallis-et-Futuna", "Wallon-Cappel", -"wallon-cappelois", "Wallon-Cappelois", -"wallon-cappeloise", "Wallon-Cappeloise", -"wallon-cappeloises", "Wallon-Cappeloises", "Waltenheim-sur-Zorn", "Walton-on-Thames", "Wanchy-Capval", "Wandignies-Hamage", "Wanfercée-Baulet", -"Wangenbourg-Engenthal", "Wangen-Brüttisellen", +"Wangenbourg-Engenthal", "Wannegem-Lede", "Wanzleben-Börde", -"waray-waray", -"Waret-la-Chaussée", "Waret-l'Évêque", +"Waret-la-Chaussée", "Warfusée-Abancourt", "Wargemoulin-Hurlus", "Wargnies-le-Grand", @@ -25971,49 +17621,31 @@ FR_BASE_EXCEPTIONS = [ "Wasmes-Audemez-Briffœil", "Wasnes-au-Bac", "Wassy-sur-Blaise", -"water-ballast", -"water-ballasts", -"water-closet", -"water-closets", "Waterland-Oudeman", "Watermael-Boitsfort", -"water-polo", -"water-proof", -"water-proofs", "Wath-on-Dearne", "Wath-upon-Dearne", "Wattignies-la-Victoire", "Wauthier-Braine", -"wauthier-brainois", "Wauthier-Brainois", "Wauthier-Brainoise", -"waux-hall", -"waux-halls", -"Wavrans-sur-l'Aa", "Wavrans-sur-Ternoise", -"Wavrechain-sous-Denain", -"Wavrechain-sous-Faulx", +"Wavrans-sur-l'Aa", "Wavre-Notre-Dame", "Wavre-Saint-Catherine", "Wavre-Sainte-Catherine", -"waza-ari", -"w.-c.", -"web-to-print", -"week-end", -"week-ends", -"Weiler-la-Tour", +"Wavrechain-sous-Denain", +"Wavrechain-sous-Faulx", "Weiler-Simmerberg", +"Weiler-la-Tour", "Weilheim-Schongau", "Weimar-Campagne", "Weißenborn-Lüderode", "Weißenburg-Gunzenhausen", "Welles-Pérennes", "Wemaers-Cappel", -"wemaers-cappelois", "Wemaers-Cappelois", -"wemaers-cappeloise", "Wemaers-Cappeloise", -"wemaers-cappeloises", "Wemaers-Cappeloises", "Wenningstedt-Braderup", "Wenum-Wiesel", @@ -26022,105 +17654,13453 @@ FR_BASE_EXCEPTIONS = [ "Wervicq-Nord", "Wervicq-Sud", "Wesembeek-Ophem", -"wesh-wesh", "West-Barendrecht", "West-Cappel", -"west-cappelois", "West-Cappelois", -"west-cappeloise", "West-Cappeloise", -"west-cappeloises", "West-Cappeloises", -"Westerhaar-Vriezenveensewijk", -"Wester-Koggenland", -"Wester-Ohrstedt", "West-Graftdijk", -"Westhouse-Marmoutier", -"Westkapelle-Binnen", "West-Knollendam", -"Westrem-Saint-Denis", "West-Souburg", "West-Terschelling", +"Wester-Koggenland", +"Wester-Ohrstedt", +"Westerhaar-Vriezenveensewijk", +"Westhouse-Marmoutier", +"Westkapelle-Binnen", +"Westrem-Saint-Denis", "Wettin-Löbejün", -"Wezembeek-Oppem", "Wez-Velvain", -"white-spirit", +"Wezembeek-Oppem", +"Wi-Fi", "Wickersheim-Wilshausen", -"Wiège-Faty", "Wiencourt-l'Equipée", "Wiencourt-l'Équipée", -"Wierre-au-Bois", "Wierre-Effroy", -"Wi-Fi", +"Wierre-au-Bois", "Wihr-au-Val", "Wihr-en-Plaine", "Wilkau-Haßlau", "Willer-sur-Thur", -"willy-willy", "Wilp-Achterhoek", "Wilzenberg-Hußweiler", "Wingen-sur-Moder", "Winghe-Saint-Georges", -"Winkel-Sainte-Croix", "Winkel-Saint-Éloi", +"Winkel-Sainte-Croix", "Wintzenheim-Kochersberg", "Wiry-au-Mont", "Witry-lès-Reims", -"witsuwit'en", -"Wœlfling-lès-Sarreguemines", +"Wiège-Faty", "Wokuhl-Dabelow", "Wolframs-Eschenbach", "Wolfsburg-Unkeroda", -"Woluwe-Saint-Étienne", "Woluwe-Saint-Lambert", "Woluwe-Saint-Pierre", +"Woluwe-Saint-Étienne", "Wormeldange-Haut", "Wortegem-Petegem", -"wuchiaping'ien", "Wuchiaping'ien", -"Wünnewil-Flamatt", "Wust-Fischbeck", "Wutha-Farnroda", "Wy-dit-Joli-Village", -"Xanton-Chassenon", +"Wœlfling-lès-Sarreguemines", +"Wünnewil-Flamatt", +"Wœlfling-lès-Sarreguemines", +"X-SAMPA", "X-arbre", "X-arbres", "X-board", "X-boards", +"Xanton-Chassenon", "Xivray-et-Marvoisin", "Xivry-Circourt", "Xonrupt-Longemer", -"X-SAMPA", -"y'a", -"yacht-club", -"yacht-clubs", "Yaucourt-Bussus", -"Yécora-Iekora", "Yernée-Fraineux", +"Ygos-Saint-Saturnin", +"Yo-kai", +"Yorkshire-et-Humber", +"Ypreville-Biville", +"Yronde-et-Buron", +"Yssac-la-Tourette", +"Yverdon-les-Bains", +"Yves-Gomezée", +"Yvetot-Bocage", +"Yvignac-la-Tour", +"Yville-sur-Seine", +"Yvoy-le-Marron", +"Yvrac-et-Malleyrand", +"Yvré-l'Evêque", +"Yvré-l'Évêque", +"Yvré-le-Pôlin", +"Yzeures-sur-Creuse", "Yèvre-la-Ville", "Yèvre-le-Châtel", "Yèvres-le-Petit", -"yé-yé", -"Ygos-Saint-Saturnin", +"Yécora-Iekora", +"Z-grille", +"Z-grilles", +"Z/E-8-DDA", +"Z9-12:Ac", +"Z9-dodécénylacétate", +"Zahna-Elster", +"Zella-Mehlis", +"Zeltingen-Rachtig", +"Zend-avesta", +"Zernitz-Lohm", +"Zeulenroda-Triebes", +"Zevenhuizen-Moerkapelle", +"Zichen-Zussen-Bolder", +"Ziegra-Knobelsdorf", +"Zihlschlacht-Sitterdorf", +"Zillis-Reischen", +"Ziortza-Bolibar", +"Zoerle-Parwijs", +"Zoeterwoude-Dorp", +"Zoeterwoude-Rijndijk", +"Zschaitz-Ottewig", +"Zuid-Beijerland", +"Zuid-Eierland", +"Zuid-Polsbroek", +"Zuid-Scharwoude", +"Zuid-Spierdijk", +"Zuid-Waddinxveen", +"Zwaagdijk-Oost", +"Zwaagdijk-West", +"Zétrud-Lumay", +"a-sexualisa", +"a-sexualisai", +"a-sexualisaient", +"a-sexualisais", +"a-sexualisait", +"a-sexualisant", +"a-sexualisas", +"a-sexualisasse", +"a-sexualisassent", +"a-sexualisasses", +"a-sexualisassiez", +"a-sexualisassions", +"a-sexualise", +"a-sexualisent", +"a-sexualiser", +"a-sexualisera", +"a-sexualiserai", +"a-sexualiseraient", +"a-sexualiserais", +"a-sexualiserait", +"a-sexualiseras", +"a-sexualiserez", +"a-sexualiseriez", +"a-sexualiserions", +"a-sexualiserons", +"a-sexualiseront", +"a-sexualises", +"a-sexualisez", +"a-sexualisiez", +"a-sexualisions", +"a-sexualisons", +"a-sexualisâmes", +"a-sexualisât", +"a-sexualisâtes", +"a-sexualisèrent", +"a-sexualisé", +"a-sexualisée", +"a-sexualisées", +"a-sexualisés", +"abaisse-langue", +"abaisse-langues", +"abou-hannès", +"abou-mengel", +"abou-mengels", +"abri-sous-roche", +"abri-vent", +"abricot-pêche", +"abricotier-pays", +"abricots-pêches", +"abris-sous-roche", +"abris-vent", +"absorbeur-neutralisateur", +"acajou-amer", +"acajou-bois", +"acajous-amers", +"acajous-bois", +"accord-cadre", +"accords-cadres", +"accroche-coeur", +"accroche-coeurs", +"accroche-cœur", +"accroche-cœurs", +"accroche-pied", +"accroche-pieds", +"accroche-plat", +"accroche-plats", +"achard-bourgeois", +"achard-bourgeoise", +"achard-bourgeoises", +"acibenzolar-S-méthyle", +"acide-N-1-naphtyl-phtalamique", +"acide-phénol", +"acides-phénols", +"acido-alcalimétrie", +"acido-alcoolo-résistance", +"acido-alcoolo-résistances", +"acido-alcoolo-résistant", +"acido-alcoolo-résistante", +"acido-alcoolo-résistantes", +"acido-alcoolo-résistants", +"acido-basique", +"acido-résistant", +"acido-résistants", +"acqua-toffana", +"acqua-toffanas", +"acquae-sextien", +"acquae-sextienne", +"acquae-sextiennes", +"acquae-sextiens", +"acquit-patent", +"acquit-à-caution", +"acquits-patents", +"acquits-à-caution", +"acting-out", +"actino-uranium", +"acétyl-salicylate", +"acétyl-salicylates", +"add-on", +"adieu-mes-couilles", +"adieu-tout", +"adieu-touts", +"adieu-va", +"adieu-vas", +"adieu-vat", +"adieu-vats", +"adiposo-génital", +"adiposo-génitale", +"adiposo-génitales", +"adiposo-génitaux", +"adjudant-chef", +"adjudants-chefs", +"africain-américain", +"africaine-américaine", +"africaines-américaines", +"africains-américains", +"africano-brésilien", +"africano-brésilienne", +"africano-brésiliennes", +"africano-brésiliens", +"africano-taïwanais", +"africano-taïwanaise", +"africano-taïwanaises", +"agace-pissette", +"agar-agar", +"agasse-tambourinette", +"agatha-christien", +"agit-prop", +"agnus-castus", +"agnus-dei", +"agora-phobie", +"agora-phobies", +"ai-cham", +"aide-comptable", +"aide-mémoire", +"aide-mémoires", +"aide-soignant", +"aide-soignante", +"aide-soignantes", +"aide-soignants", +"aide-écuyer", +"aide-écuyers", +"aide-éducateur", +"aides-soignantes", +"aides-soignants", +"aigle-bar", +"aigre-douce", +"aigre-doux", +"aigre-moines", +"aigres-douces", +"aigres-doux", +"aigue-marine", +"aigue-marines", +"aigues-juntais", +"aigues-juntaise", +"aigues-juntaises", +"aigues-marines", +"aigues-mortais", +"aigues-mortaise", +"aigues-mortaises", +"aigues-vivesien", +"aigues-vivesienne", +"aigues-vivesiennes", +"aigues-vivesiens", +"aigues-vivien", +"aigues-vivois", +"aigues-vivoise", +"aigues-vivoises", +"aiguise-crayon", +"aiguise-crayons", +"ainu-ken", +"airelle-myrtille", +"aiseau-preslois", +"aka-bea", +"aka-bo", +"aka-cari", +"aka-jeru", +"aka-kede", +"aka-kora", +"akar-bale", +"akhal-teke", +"akua-ba", +"al-Anbar", +"al-Anbâr", +"al-Anbār", +"al-Kachi", +"al-Qaida", +"al-Qaïda", +"albano-letton", +"alcalino-terreuse", +"alcalino-terreuses", +"alcalino-terreux", +"alcool-phénol", +"alcoolo-dépendance", +"alcoolo-dépendances", +"alcools-phénols", +"algo-carburant", +"algo-carburants", +"algéro-marocain", +"algéro-tuniso-lybien", +"algéro-tuniso-marocain", +"allanto-chorion", +"allanto-chorions", +"aller-retour", +"aller-retours", +"allers-retours", +"allez-vous-en", +"allez-y", +"alloxydime-sodium", +"allume-cigare", +"allume-cigares", +"allume-feu", +"allume-feux", +"allume-gaz", +"allumette-bougie", +"allumettes-bougies", +"alpha-amylase", +"alpha-amylases", +"alpha-conversion", +"alpha-conversions", +"alpha-test", +"alpha-tests", +"alpha-tridymite", +"alpha-tridymites", +"alpha-variscite", +"alpha-variscites", +"alsacien-lorrain", +"alto-basso", +"alto-bassos", +"aluminium-épidote", +"aluminium-épidotes", +"alumu-tesu", +"aléseuse-fraiseuse", +"aléseuses-fraiseuses", +"ambre-gris", +"ambystome-tigre", +"ambystomes-tigres", +"ami-ami", +"amiante-ciment", +"amino-acide", +"amino-acides", +"amino-acétique", +"amour-en-cage", +"amour-propre", +"amours-en-cage", +"amours-propres", +"ampli-syntoniseur", +"ampère-heure", +"ampères-heures", +"amuse-bouche", +"amuse-bouches", +"amuse-gueule", +"amuse-gueules", +"analyste-programmeur", +"analystes-programmeurs", +"ananas-bois", +"anarcho-capitalisme", +"anarcho-capitalismes", +"anarcho-fasciste", +"anarcho-fascistes", +"anarcho-punk", +"anarcho-punks", +"anarcho-syndicalisme", +"anarcho-syndicalismes", +"anarcho-syndicaliste", +"anarcho-syndicalistes", +"anatomo-pathologie", +"anatomo-pathologies", +"anatomo-pathologique", +"anatomo-pathologiques", +"andrézien-bouthéonnais", +"andrézienne-bouthéonnaise", +"andréziennes-bouthéonnaises", +"andréziens-bouthéonnais", +"anguille-spaghetti", +"animal-garou", +"animalier-soigneur", +"animaux-garous", +"année-homme", +"année-lumière", +"années-homme", +"années-hommes", +"années-lumière", +"ano-génital", +"ano-génitale", +"ano-génitales", +"ano-génitaux", +"ansbach-triesdorfer", +"ante-bois", +"ante-meridiem", +"ante-meridiems", +"ante-mortem", +"ante-mortems", +"antenne-relais", +"antennes-radar", +"antennes-relais", +"anthropo-gammamétrie", +"anthropo-gammamétries", +"anthropo-toponyme", +"anthropo-toponymes", +"anthropo-zoomorphe", +"anthropo-zoomorphes", +"antiguais-barbudien", +"antiguais-barbudiens", +"antiguais-et-barbudien", +"antiguaise-barbudienne", +"antiguaises-barbudiennes", +"antilope-chevreuil", +"anté-diluvien", +"anté-hypophyse", +"anté-hypophyses", +"anté-prédécesseur", +"anté-prédécesseurs", +"anté-pénultième", +"anté-pénultièmes", +"apico-alvéolaire", +"apico-dental", +"appartement-témoin", +"appartements-témoins", +"appel-contre-appel", +"appels-contre-appels", +"apprenti-sorcellerie", +"apprenti-sorcelleries", +"apprenti-sorcier", +"apprentie-sorcière", +"apprenties-sorcières", +"apprentis-sorciers", +"appui-bras", +"appui-livres", +"appui-main", +"appui-mains", +"appui-pied", +"appui-pieds", +"appui-pot", +"appui-pots", +"appui-tête", +"appui-têtes", +"appuie-main", +"appuie-mains", +"appuie-tête", +"appuie-têtes", +"appuis-main", +"appuis-pot", +"appuis-tête", +"aqua-tinta", +"aqua-toffana", +"aquae-sextien", +"aquae-sextienne", +"aquae-sextiennes", +"aquae-sextiens", +"aquila-alba", +"araignée-crabe", +"araignée-loup", +"araignées-crabes", +"araignées-loups", +"aralo-caspien", +"aralo-caspienne", +"arbre-de-Moïse", +"arbre-à-la-fièvre", +"arbres-de-Moïse", +"arbres-refuges", +"arcado-chypriote", +"arcado-chypriotes", +"arcado-cypriote", +"arcado-cypriotes", +"ardennite-(As)", +"ardennite-(As)s", +"ardi-gasna", +"argent-métal", +"argentite-β", +"argentite-βs", +"argento-analcime", +"argento-analcimes", +"argento-perrylite", +"argento-perrylites", +"argilo-calcaire", +"argilo-calcaires", +"argilo-gréseuse", +"argilo-gréseuses", +"argilo-gréseux", +"argilo-loessique", +"argilo-loessiques", +"argilo-siliceuse", +"argilo-siliceuses", +"argilo-siliceux", +"arginine-méthyla", +"arginine-méthylai", +"arginine-méthylaient", +"arginine-méthylais", +"arginine-méthylait", +"arginine-méthylant", +"arginine-méthylas", +"arginine-méthylasse", +"arginine-méthylassent", +"arginine-méthylasses", +"arginine-méthylassiez", +"arginine-méthylassions", +"arginine-méthyle", +"arginine-méthylent", +"arginine-méthyler", +"arginine-méthylera", +"arginine-méthylerai", +"arginine-méthyleraient", +"arginine-méthylerais", +"arginine-méthylerait", +"arginine-méthyleras", +"arginine-méthylerez", +"arginine-méthyleriez", +"arginine-méthylerions", +"arginine-méthylerons", +"arginine-méthyleront", +"arginine-méthyles", +"arginine-méthylez", +"arginine-méthyliez", +"arginine-méthylions", +"arginine-méthylons", +"arginine-méthylâmes", +"arginine-méthylât", +"arginine-méthylâtes", +"arginine-méthylèrent", +"arginine-méthylé", +"arginine-méthylée", +"arginine-méthylées", +"arginine-méthylés", +"arginine-vasopressine", +"ariaco-dompierrois", +"ariaco-dompierroise", +"ariaco-dompierroises", +"aristo-bourgeoisie", +"aristo-bourgeoisies", +"aristotélico-thomiste", +"aristotélico-thomistes", +"arivey-lingeois", +"arivey-lingeoise", +"arivey-lingeoises", +"armançon-martinois", +"armançon-martinoise", +"armançon-martinoises", +"armbouts-cappellois", +"armbouts-cappelloise", +"armbouts-cappelloises", +"arnaud-guilhémois", +"arnaud-guilhémoise", +"arnaud-guilhémoises", +"arrache-clou", +"arrache-clous", +"arrache-pied", +"arrache-sonde", +"arrow-root", +"arrêt-buffet", +"arrêt-court", +"arrête-boeuf", +"arrête-bœuf", +"arrête-bœufs", +"arrêts-buffet", +"arrêts-courts", +"ars-laquenexois", +"ars-laquenexoise", +"ars-laquenexoises", +"art-thérapie", +"art-thérapies", +"artisan-créateur", +"artisans-créateurs", +"artério-sclérose", +"artério-scléroses", +"assa-foetida", +"assemble-nuages", +"assiette-à-beurre", +"assis-debout", +"assurance-chômage", +"assurance-chômages", +"assurance-emploi", +"assurance-vie", +"assurances-chômage", +"assurances-vie", +"assyro-chaldéen", +"astronome-astrologue", +"astronomes-astrologues", +"astur-léonais", +"ataxie-télangiectasie", +"attache-bossette", +"attache-bossettes", +"attache-doudou", +"attache-doudous", +"attaché-case", +"attaché-cases", +"attachés-cases", +"attentat-suicide", +"attentats-suicides", +"atto-ohm", +"atto-ohms", +"attrape-couillon", +"attrape-couillons", +"attrape-minette", +"attrape-minettes", +"attrape-minon", +"attrape-minons", +"attrape-mouche", +"attrape-mouches", +"attrape-nigaud", +"attrape-nigauds", +"attrape-rêves", +"attrape-tout", +"attrape-vilain", +"au-dedans", +"au-dehors", +"au-delà", +"au-delàs", +"au-dessous", +"au-dessus", +"au-devant", +"au-deçà", +"au-lof", +"au-tour", +"aube-vigne", +"audio-numérique", +"audio-numériques", +"audio-prothésiste", +"audio-prothésistes", +"audio-visuel", +"audio-visuelle", +"audio-visuelles", +"audio-visuels", +"aujourd'hui", +"aulnaie-frênaie", +"aulnaies-frênaies", +"auloi-jumeaux", +"auriculo-ventriculaire", +"auriculo-ventriculaires", +"aurum-musivum", +"aussi-tost", +"aussi-tôt", +"australo-américain", +"austro-asiatique", +"austro-asiatiques", +"austro-hongrois", +"austro-hongroise", +"austro-hongroises", +"austro-occidental", +"austro-occidentale", +"austro-occidentales", +"austro-occidentaux", +"auteur-compositeur", +"auteure-compositrice", +"auteures-compositrices", +"auteurs-compositeurs", +"autos-caravanes", +"autos-mitrailleuses", +"autos-scooters", +"autos-tamponnantes", +"autos-tamponneuses", +"autre-littérature", +"autre-églisois", +"avale-tout", +"avale-tout-cru", +"avale-touts", +"avants-centres", +"avants-postes", +"ave-et-auffois", +"averno-méditerranéen", +"averno-méditerranéenne", +"averno-méditerranéennes", +"averno-méditerranéens", +"aveugle-né", +"aveugle-née", +"aveugles-nés", +"avion-cargo", +"avions-cargos", +"avoir-du-poids", +"axo-missien", +"axo-missienne", +"axo-missiennes", +"axo-missiens", +"ayant-cause", +"ayant-droit", +"ayants-cause", +"ayants-droit", +"aye-aye", +"ayes-ayes", +"ayur-veda", +"azinphos-méthyl", +"azinphos-éthyl", +"aï-aï", +"b-a-ba", +"b.a.-ba", +"baa'thisa", +"baa'thisai", +"baa'thisaient", +"baa'thisais", +"baa'thisait", +"baa'thisant", +"baa'thisas", +"baa'thisasse", +"baa'thisassent", +"baa'thisasses", +"baa'thisassiez", +"baa'thisassions", +"baa'thise", +"baa'thisent", +"baa'thiser", +"baa'thisera", +"baa'thiserai", +"baa'thiseraient", +"baa'thiserais", +"baa'thiserait", +"baa'thiseras", +"baa'thiserez", +"baa'thiseriez", +"baa'thiserions", +"baa'thiserons", +"baa'thiseront", +"baa'thises", +"baa'thisez", +"baa'thisiez", +"baa'thisions", +"baa'thisons", +"baa'thisâmes", +"baa'thisât", +"baa'thisâtes", +"baa'thisèrent", +"baa'thisé", +"baa'thisée", +"baa'thisées", +"baa'thisés", +"babil's", +"babine-witsuwit'en", +"baby-beef", +"baby-beefs", +"baby-boom", +"baby-boomer", +"baby-boomers", +"baby-boomeur", +"baby-boomeurs", +"baby-boomeuse", +"baby-boomeuses", +"baby-foot", +"baby-foots", +"baby-sitter", +"baby-sitters", +"baby-sitting", +"baby-sittings", +"bachat-long", +"bachat-longs", +"bachi-bouzouck", +"bachi-bouzoucks", +"bachi-bouzouk", +"bachi-bouzouks", +"bahá'í", +"bahá'íe", +"bahá'íes", +"bahá'ís", +"baie-mahaultien", +"baie-mahaultienne", +"baie-mahaultiennes", +"baie-mahaultiens", +"baille-blé", +"bain-douche", +"bain-marie", +"bains-douches", +"bains-marie", +"baise-en-ville", +"baise-main", +"bal-musette", +"balai-brosse", +"balais-brosses", +"baleine-pilote", +"baleines-pilotes", +"ball-trap", +"balle-molle", +"balle-queue", +"ballon-panier", +"ballon-sonde", +"ballon-volant", +"ballons-panier", +"ballons-paniers", +"ballons-sondes", +"bals-musette", +"ban-de-lavelinois", +"ban-de-lavelinoise", +"ban-de-lavelinoises", +"ban-saint-martinois", +"ban-saint-martinoise", +"ban-saint-martinoises", +"bana-bana", +"bana-banas", +"banana-split", +"banana-splits", +"bande-annonce", +"bande-son", +"bandes-annonces", +"bank-note", +"bank-notes", +"bar-tabac", +"bar-tabacs", +"barbe-de-Jupiter", +"barbe-de-bouc", +"barbe-de-capucin", +"barbe-de-chèvre", +"barbe-à-papa", +"barbes-de-Jupiter", +"barbes-de-capucin", +"barium-adulaire", +"barium-adulaires", +"barium-anorthite", +"barium-anorthites", +"barium-phlogopite", +"barium-phlogopites", +"barium-sanidine", +"barium-sanidines", +"barré-bandé", +"barrés-bandés", +"bars-tabacs", +"baryton-basse", +"barytons-basses", +"baryum-orthose", +"baryum-orthoses", +"basco-béarnaise", +"basco-navarrais", +"base-ball", +"base-balls", +"base-jump", +"base-jumpeur", +"base-jumpeurs", +"base-jumpeuse", +"base-jumpeuses", +"basi-sphénoïdal", +"basket-ball", +"basket-balls", +"baso-cellulaire", +"baso-cellulaires", +"basque-uruguayen", +"basset-hound", +"bassi-colica", +"bassi-colicas", +"bassin-versant", +"bassins-versants", +"bat-flanc", +"bat-flancs", +"bat-l'eau", +"bat-à-beurre", +"bat-à-bourre", +"bateau-bus", +"bateau-citerne", +"bateau-dragon", +"bateau-feu", +"bateau-lavoir", +"bateau-logement", +"bateau-mouche", +"bateau-mère", +"bateau-phare", +"bateau-usine", +"bateau-vanne", +"bateau-école", +"bateaux-bus", +"bateaux-citernes", +"bateaux-dragons", +"bateaux-feu", +"bateaux-lavoirs", +"bateaux-logements", +"bateaux-mouches", +"bateaux-mères", +"bateaux-phare", +"bateaux-usines", +"bateaux-vanne", +"bateaux-écoles", +"bats-l'eau", +"bats-à-beurre", +"bats-à-bourre", +"battant-l'oeil", +"battant-l'œil", +"battants-l'oeil", +"battants-l'œil", +"batte-lessive", +"batte-mare", +"batte-plate", +"batte-queue", +"battes-plates", +"baussery-montain", +"baussery-montaine", +"baussery-montaines", +"baussery-montains", +"bay-ice", +"bay-ices", +"beach-volley", +"beach-volleys", +"beagle-harrier", +"beau-chasseur", +"beau-dabe", +"beau-fils", +"beau-frais", +"beau-frère", +"beau-livre", +"beau-papa", +"beau-parent", +"beau-partir", +"beau-petit-fils", +"beau-père", +"beau-revoir", +"beau-semblant", +"beaujolais-villages", +"beaux-arts", +"beaux-dabes", +"beaux-enfants", +"beaux-esprits", +"beaux-fils", +"beaux-frères", +"beaux-oncles", +"beaux-parents", +"beaux-petits-fils", +"beaux-pères", +"becque-cornu", +"becques-cornus", +"becs-cornus", +"becs-courbes", +"becs-d'argent", +"becs-d'oie", +"becs-d'âne", +"becs-de-cane", +"becs-de-canon", +"becs-de-cigogne", +"becs-de-cire", +"becs-de-corbeau", +"becs-de-crosse", +"becs-de-cygne", +"becs-de-faucon", +"becs-de-grue", +"becs-de-hache", +"becs-de-héron", +"becs-de-lièvre", +"becs-de-lézard", +"becs-de-perroquet", +"becs-de-pigeon", +"becs-de-vautour", +"becs-durs", +"becs-en-ciseaux", +"becs-en-fourreau", +"becs-ouverts", +"becs-plats", +"becs-pointus", +"becs-ronds", +"becs-tranchants", +"bedlington-terrier", +"behā'ī", +"bekkō-amé", +"bel-enfant", +"bel-esprit", +"bel-oncle", +"bel-outil", +"bel-étage", +"belgo-hollandais", +"belle-d'onze-heures", +"belle-d'un-jour", +"belle-dabe", +"belle-dame", +"belle-de-jour", +"belle-de-nuit", +"belle-doche", +"belle-famille", +"belle-fille", +"belle-fleur", +"belle-maman", +"belle-mère", +"belle-petite-fille", +"belle-pucelle", +"belle-soeur", +"belle-sœur", +"belle-tante", +"belle-à-voir", +"belle-étoile", +"belles-d'un-jour", +"belles-dabes", +"belles-dames", +"belles-de-jour", +"belles-de-nuit", +"belles-doches", +"belles-familles", +"belles-filles", +"belles-fleurs", +"belles-lettres", +"belles-mères", +"belles-pucelles", +"belles-soeurs", +"belles-sœurs", +"belles-tantes", +"belles-étoiles", +"bels-outils", +"ben-ahinois", +"benne-kangourou", +"bensulfuron-méthyle", +"benzoylprop-éthyl", +"berd'huisien", +"berd'huisienne", +"berd'huisiennes", +"berd'huisiens", +"bernard-l'ermite", +"bernard-l'hermite", +"bernico-montois", +"bernico-montoise", +"bernico-montoises", +"bette-marine", +"bettes-marines", +"beun'aise", +"beurre-frais", +"biche-cochon", +"biens-fonds", +"big-endian", +"bil-ka", +"bil-kas", +"bin's", +"bin-bin", +"bin-bins", +"binge-watcha", +"binge-watchai", +"binge-watchaient", +"binge-watchais", +"binge-watchait", +"binge-watchant", +"binge-watchas", +"binge-watchasse", +"binge-watchassent", +"binge-watchasses", +"binge-watchassiez", +"binge-watchassions", +"binge-watche", +"binge-watchent", +"binge-watcher", +"binge-watchera", +"binge-watcherai", +"binge-watcheraient", +"binge-watcherais", +"binge-watcherait", +"binge-watcheras", +"binge-watcherez", +"binge-watcheriez", +"binge-watcherions", +"binge-watcherons", +"binge-watcheront", +"binge-watches", +"binge-watchez", +"binge-watchiez", +"binge-watchions", +"binge-watchons", +"binge-watchâmes", +"binge-watchât", +"binge-watchâtes", +"binge-watchèrent", +"binge-watché", +"binge-watchée", +"binge-watchées", +"binge-watchés", +"bissau-guinéen", +"bistro-brasserie", +"bistro-brasseries", +"bit-el-mal", +"bitter-pit", +"bière-pong", +"bla-bla", +"bla-bla-bla", +"black-bass", +"black-blanc-beur", +"black-bottom", +"black-bottoms", +"black-out", +"black-outa", +"black-outai", +"black-outaient", +"black-outais", +"black-outait", +"black-outant", +"black-outas", +"black-outasse", +"black-outassent", +"black-outasses", +"black-outassiez", +"black-outassions", +"black-oute", +"black-outent", +"black-outer", +"black-outera", +"black-outerai", +"black-outeraient", +"black-outerais", +"black-outerait", +"black-outeras", +"black-outerez", +"black-outeriez", +"black-outerions", +"black-outerons", +"black-outeront", +"black-outes", +"black-outez", +"black-outiez", +"black-outions", +"black-outons", +"black-outs", +"black-outâmes", +"black-outât", +"black-outâtes", +"black-outèrent", +"black-outé", +"black-outée", +"black-outées", +"black-outés", +"black-rot", +"blanche-coiffe", +"blanche-queue", +"blanche-raie", +"blanches-coiffes", +"blancs-becs", +"blancs-bocs", +"blancs-bois", +"blancs-d'Espagne", +"blancs-de-baleine", +"blancs-en-bourre", +"blancs-estocs", +"blancs-mangers", +"blancs-manteaux", +"blancs-raisins", +"blancs-seings", +"blancs-signés", +"blancs-étocs", +"bleu-bite", +"bleu-manteau", +"bleu-merle", +"bleus-manteaux", +"blies-ebersingeois", +"blies-ebersingeoise", +"blies-ebersingeoises", +"blies-ébersingeois", +"blies-ébersingeoise", +"blies-ébersingeoises", +"bling-bling", +"bling-blings", +"blis-et-bornois", +"blis-et-bornoise", +"blis-et-bornoises", +"bloc-cylindres", +"bloc-eau", +"bloc-film", +"bloc-films", +"bloc-moteur", +"bloc-moteurs", +"bloc-note", +"bloc-notes", +"block-système", +"blocs-eau", +"blocs-films", +"blocs-notes", +"blu-ray", +"blue-jean", +"blue-jeans", +"blue-lias", +"boat-people", +"bobby-soxer", +"bobby-soxers", +"body-building", +"boeuf-carotte", +"boissy-maugien", +"boissy-maugienne", +"boissy-maugiennes", +"boissy-maugiens", +"boit-sans-soif", +"bolivo-paraguayen", +"bombardier-torpilleur", +"bombardiers-torpilleurs", +"bon-air", +"bon-bec", +"bon-chrétien", +"bon-creux", +"bon-encontrais", +"bon-encontraise", +"bon-encontraises", +"bon-fieux", +"bon-fils", +"bon-henri", +"bon-mot", +"bon-ouvrier", +"bon-ouvriers", +"bon-papa", +"bon-plein", +"bon-tour", +"bonheur-du-jour", +"bonne-dame", +"bonne-encontre", +"bonne-ente", +"bonne-ententiste", +"bonne-ententistes", +"bonne-femme", +"bonne-grâce", +"bonne-main", +"bonne-maman", +"bonne-vilaine", +"bonne-voglie", +"bonnes-dames", +"bonnes-entes", +"bonnes-femmes", +"bonnes-grâces", +"bonnes-mamans", +"bonnes-vilaines", +"bonnes-voglies", +"bonnet-chinois", +"bonnet-de-prêtre", +"bonnet-rouge", +"bonnet-vert", +"bonnets-chinois", +"bonnets-de-prêtres", +"bonnets-verts", +"bons-chrétiens", +"bons-mots", +"bons-papas", +"boogie-woogie", +"boogie-woogies", +"bord-opposé", +"borde-plats", +"border-terrier", +"bore-out", +"bore-outs", +"borne-couteau", +"borne-fontaine", +"borne-fusible", +"borne-fusibles", +"bornes-couteaux", +"bornes-fontaines", +"bosc-guérardais", +"bosc-guérardaise", +"bosc-guérardaises", +"bosc-renoulthien", +"bosc-renoulthienne", +"bosc-renoulthiennes", +"bosc-renoulthiens", +"bosno-serbe", +"bosno-serbes", +"botte-chaussettes", +"bottom-up", +"bouche-en-flûte", +"bouche-nez", +"bouche-pora", +"bouche-porai", +"bouche-poraient", +"bouche-porais", +"bouche-porait", +"bouche-porant", +"bouche-poras", +"bouche-porasse", +"bouche-porassent", +"bouche-porasses", +"bouche-porassiez", +"bouche-porassions", +"bouche-pore", +"bouche-porent", +"bouche-porer", +"bouche-porera", +"bouche-porerai", +"bouche-poreraient", +"bouche-porerais", +"bouche-porerait", +"bouche-poreras", +"bouche-porerez", +"bouche-poreriez", +"bouche-porerions", +"bouche-porerons", +"bouche-poreront", +"bouche-pores", +"bouche-porez", +"bouche-poriez", +"bouche-porions", +"bouche-porons", +"bouche-porâmes", +"bouche-porât", +"bouche-porâtes", +"bouche-porèrent", +"bouche-poré", +"bouche-porée", +"bouche-porées", +"bouche-porés", +"bouche-trou", +"bouche-trous", +"bouche-à-bouche", +"bouffe-curé", +"bouffe-curés", +"bouffe-galette", +"boui-boui", +"bouig-bouig", +"bouillon-blanc", +"bouis-bouis", +"boulay-morinois", +"boulay-morinoise", +"boulay-morinoises", +"boule-dogue", +"boules-dogues", +"boum-boum", +"bourgeois-bohème", +"bourgeois-bohèmes", +"bourgeoise-bohème", +"bourgeoises-bohèmes", +"bourgue-épine", +"bourgues-épines", +"bourre-chrétien", +"bourre-de-Marseille", +"bourre-goule", +"bourre-goules", +"bourre-noix", +"bourre-pif", +"bourre-pifs", +"bourres-de-Marseille", +"bourse-à-berger", +"bourse-à-pasteur", +"bourses-à-berger", +"bourses-à-pasteur", +"bout-avant", +"bout-d'aile", +"bout-d'argent", +"bout-de-l'an", +"bout-de-manche", +"bout-de-quièvre", +"bout-dehors", +"bout-du-pont-de-l'arnais", +"bout-du-pont-de-l'arnaise", +"bout-du-pont-de-l'arnaises", +"bout-rimé", +"bout-saigneux", +"boute-charge", +"boute-de-lof", +"boute-dehors", +"boute-en-courroie", +"boute-en-train", +"boute-feu", +"boute-hache", +"boute-hors", +"boute-joie", +"boute-lof", +"boute-selle", +"boute-selles", +"boute-tout-cuire", +"boute-à-port", +"boutes-à-port", +"bouton-d'or", +"bouton-poussoir", +"bouton-pression", +"boutons-d'or", +"boutons-pression", +"bouts-avant", +"bouts-d'aile", +"bouts-d'argent", +"bouts-de-l'an", +"bouts-de-manche", +"bouts-de-quièvre", +"bouts-dehors", +"bouts-rimés", +"bouts-saigneux", +"bow-string", +"bow-strings", +"bow-window", +"bow-windows", +"box-calf", +"box-office", +"box-offices", +"boxer-short", +"boxer-shorts", +"boy-scout", +"boy-scouts", +"boîtes-à-musique", +"boîtes-à-musiques", +"bracelet-montre", +"bracelets-montres", +"brachio-céphalique", +"brachio-céphaliques", +"brachio-radial", +"branc-ursine", +"branc-ursines", +"branche-ursine", +"branches-ursines", +"brancs-ursines", +"branle-bas", +"branle-gai", +"branle-long", +"branle-queue", +"branles-bas", +"branles-gais", +"branles-longs", +"branque-ursine", +"bras-d'assien", +"bras-d'assienne", +"bras-d'assiennes", +"bras-d'assiens", +"brash-ice", +"brash-ices", +"brasse-camarade", +"brasse-camarades", +"bray-dunois", +"bray-dunoise", +"bray-dunoises", +"brazza-congolais", +"bredi-breda", +"brelic-breloque", +"brelique-breloque", +"breuil-bernardin", +"breuil-bernardine", +"breuil-bernardines", +"breuil-bernardins", +"breuil-le-secquois", +"breuil-le-secquoise", +"breuil-le-secquoises", +"bric-à-brac", +"brick-goélette", +"brigadier-chef", +"brigadiers-chefs", +"brillat-savarin", +"brillet-pontin", +"brillet-pontine", +"brillet-pontines", +"brillet-pontins", +"brin-d'amour", +"brin-d'estoc", +"brins-d'amour", +"brins-d'estoc", +"bris-d'huis", +"brise-bise", +"brise-bises", +"brise-burnes", +"brise-cou", +"brise-cous", +"brise-fer", +"brise-fers", +"brise-flots", +"brise-glace", +"brise-glaces", +"brise-image", +"brise-images", +"brise-lame", +"brise-lames", +"brise-lunette", +"brise-mariage", +"brise-motte", +"brise-mottes", +"brise-mur", +"brise-murs", +"brise-os", +"brise-pierre", +"brise-pierres", +"brise-raison", +"brise-raisons", +"brise-roche", +"brise-roches", +"brise-scellé", +"brise-scellés", +"brise-soleil", +"brise-tout", +"brise-vent", +"brise-vents", +"bromophos-éthyl", +"broncho-pneumonie", +"broncho-pneumonies", +"broncho-pulmonaire", +"broncho-pulmonaires", +"brou-brou", +"broue-pub", +"broue-pubs", +"brouille-blanche", +"brouille-blanches", +"broute-minou", +"broute-minous", +"brown-nosers", +"brown-out", +"broût-vernetois", +"broût-vernetoise", +"broût-vernetoises", +"bruesme-d'auffe", +"bruesmes-d'auffe", +"brule-gueule", +"brule-gueules", +"brule-maison", +"brule-maisons", +"brule-parfum", +"brule-parfums", +"brun-suisse", +"brut-ingénu", +"brute-bonne", +"bruts-ingénus", +"brèche-dent", +"brèche-dents", +"brécy-brièrois", +"brécy-brièroise", +"brécy-brièroises", +"brûle-amorce", +"brûle-bout", +"brûle-gueule", +"brûle-gueules", +"brûle-maison", +"brûle-maisons", +"brûle-parfum", +"brûle-parfums", +"brûle-pourpoint", +"brûle-queue", +"brûle-tout", +"brûly-de-peschois", +"buccin-marin", +"buccins-marins", +"bucco-dentaire", +"bucco-dentaires", +"bucco-génital", +"bucco-génitale", +"bucco-génitales", +"bucco-génitaux", +"bucco-labial", +"bucco-pharyngé", +"bucco-pharyngée", +"bucco-pharyngées", +"bucco-pharyngés", +"buck-béan", +"buck-béans", +"buen-retiro", +"buenos-airien", +"buis-prévenchais", +"buis-prévenchaise", +"buis-prévenchaises", +"buisson-ardent", +"buissons-ardents", +"bull-dogs", +"bull-mastiff", +"bull-terrier", +"bull-terriers", +"bungee-jumping", +"bungy-jumping", +"bureau-chef", +"burg-reulandais", +"burn-out", +"burn-outa", +"burn-outai", +"burn-outaient", +"burn-outais", +"burn-outait", +"burn-outant", +"burn-outas", +"burn-outasse", +"burn-outassent", +"burn-outasses", +"burn-outassiez", +"burn-outassions", +"burn-oute", +"burn-outent", +"burn-outer", +"burn-outera", +"burn-outerai", +"burn-outeraient", +"burn-outerais", +"burn-outerait", +"burn-outeras", +"burn-outerez", +"burn-outeriez", +"burn-outerions", +"burn-outerons", +"burn-outeront", +"burn-outes", +"burn-outez", +"burn-outiez", +"burn-outions", +"burn-outons", +"burn-outs", +"burn-outâmes", +"burn-outât", +"burn-outâtes", +"burn-outèrent", +"burn-outé", +"burn-outée", +"burn-outées", +"burn-outés", +"buste-reliquaire", +"bustes-reliquaires", +"but-sur-balles", +"butter-oil", +"by-passa", +"by-passai", +"by-passaient", +"by-passais", +"by-passait", +"by-passant", +"by-passas", +"by-passasse", +"by-passassent", +"by-passasses", +"by-passassiez", +"by-passassions", +"by-passe", +"by-passent", +"by-passer", +"by-passera", +"by-passerai", +"by-passeraient", +"by-passerais", +"by-passerait", +"by-passeras", +"by-passerez", +"by-passeriez", +"by-passerions", +"by-passerons", +"by-passeront", +"by-passes", +"by-passez", +"by-passiez", +"by-passions", +"by-passons", +"by-passâmes", +"by-passât", +"by-passâtes", +"by-passèrent", +"by-passé", +"by-passée", +"by-passées", +"by-passés", +"bye-bye", +"bèque-fleur", +"bèque-fleurs", +"bébé-bulle", +"bébé-bus", +"bébé-médicament", +"bébé-nageur", +"bébé-éprouvette", +"bébés-bulles", +"bébés-médicament", +"bébés-nageurs", +"bébés-éprouvette", +"bégler-beg", +"béglier-beg", +"béni-non-non", +"béni-oui-oui", +"bény-bocain", +"bény-bocaine", +"bény-bocaines", +"bény-bocains", +"béta-cyfluthrine", +"béta-gal", +"bêche-de-mer", +"bêches-de-mer", +"bêque-bois", +"bœuf-carotte", +"bœuf-carottes", +"bœuf-garou", +"c'est-à-dire", +"c'que", +"c'qui", +"c'te", +"c-commanda", +"c-commandai", +"c-commandaient", +"c-commandais", +"c-commandait", +"c-commandant", +"c-commandas", +"c-commandasse", +"c-commandassent", +"c-commandasses", +"c-commandassiez", +"c-commandassions", +"c-commande", +"c-commandent", +"c-commander", +"c-commandera", +"c-commanderai", +"c-commanderaient", +"c-commanderais", +"c-commanderait", +"c-commanderas", +"c-commanderez", +"c-commanderiez", +"c-commanderions", +"c-commanderons", +"c-commanderont", +"c-commandes", +"c-commandez", +"c-commandiez", +"c-commandions", +"c-commandons", +"c-commandâmes", +"c-commandât", +"c-commandâtes", +"c-commandèrent", +"c-commandé", +"c-commandée", +"c-commandées", +"c-commandés", +"c-à-d", +"c.-à-d.", +"cabane-roulotte", +"cabanes-roulottes", +"cacasse-à-cul-nu", +"cacasses-à-cul-nu", +"cadrage-débordement", +"caf'conc", +"café-au-lait", +"café-bar", +"café-bistro", +"café-calva", +"café-comptoir", +"café-concert", +"café-crème", +"café-filtre", +"café-théâtre", +"cafés-bars", +"cafés-concerts", +"cafés-crèmes", +"cafés-filtre", +"cafés-théâtres", +"cage-théâtre", +"cages-théâtres", +"cague-braille", +"cague-brailles", +"cahin-caha", +"cail-cédra", +"cail-cédras", +"cail-cédrin", +"cail-cédrins", +"caille-lait", +"caille-laits", +"cailleu-tassart", +"caillot-rosat", +"caillots-rosats", +"caillé-blanc", +"caillés-blancs", +"caisse-outre", +"caisse-palette", +"caisses-outres", +"caisses-palettes", +"cake-walk", +"cake-walks", +"calcite-rhodochrosite", +"calcites-rhodochrosites", +"calcium-autunite", +"calcium-autunites", +"calcium-pyromorphite", +"calcium-pyromorphites", +"calcium-rhodochrosite", +"calcium-rhodochrosites", +"cale-bas", +"cale-dos", +"cale-hauban", +"cale-haubans", +"cale-pied", +"cale-pieds", +"caleçon-combinaison", +"caleçons-combinaisons", +"call-girl", +"call-girls", +"calo-moulinotin", +"calo-moulinotine", +"calo-moulinotines", +"calo-moulinotins", +"came-cruse", +"camion-bélier", +"camion-citerne", +"camion-cuisine", +"camion-cuisines", +"camion-poubelle", +"camions-bennes", +"camions-béliers", +"camions-citernes", +"camions-poubelles", +"camp-volant", +"campanulo-infundibiliforme", +"campanulo-infundibiliformes", +"camping-car", +"camping-cars", +"camping-gaz", +"campo-haltien", +"campo-haltienne", +"campo-haltiennes", +"campo-haltiens", +"campo-laïcien", +"campo-laïcienne", +"campo-laïciennes", +"campo-laïciens", +"camps-volants", +"caméra-lucida", +"caméra-piéton", +"caméra-piétons", +"canadien-français", +"canapé-lit", +"canapés-lits", +"candau-casteidois", +"candau-casteidoise", +"candau-casteidoises", +"cani-joering", +"cani-rando", +"canne-épée", +"cannes-épées", +"cannib's", +"canon-revolver", +"canons-revolvers", +"canoë-kayak", +"canoë-kayaks", +"capelle-filismontin", +"capelle-filismontine", +"capelle-filismontines", +"capelle-filismontins", +"capi-aga", +"capi-agas", +"capigi-bassi", +"capigi-bassis", +"capital-risque", +"capital-risques", +"capital-risqueur", +"capital-risqueurs", +"capitan-pacha", +"capitan-pachas", +"capitaux-risqueurs", +"caporal-chef", +"caporaux-chefs", +"capsule-congé", +"capsules-congés", +"capuchon-de-moine", +"caput-mortuum", +"capélo-hugonais", +"capélo-hugonaise", +"capélo-hugonaises", +"caque-denier", +"car-ferries", +"car-ferry", +"car-ferrys", +"car-jacking", +"carbo-azotine", +"carbonate-apatite", +"carbonate-apatites", +"carbone-14", +"carbones-14", +"carcere-duro", +"cardio-chirurgien", +"cardio-chirurgienne", +"cardio-chirurgiennes", +"cardio-chirurgiens", +"cardio-kickboxing", +"cardio-kickboxings", +"cardio-thoracique", +"cardio-thoraciques", +"cardio-training", +"cardio-vasculaire", +"cardio-vasculaires", +"carfentrazone-éthyle", +"cargo-dortoir", +"cargos-dortoirs", +"caro-percyais", +"caro-percyaise", +"caro-percyaises", +"carré-bossu", +"carrée-bossue", +"carrées-bossues", +"carrés-bossus", +"carte-cadeau", +"carte-fille", +"carte-index", +"carte-lettre", +"carte-maximum", +"carte-mère", +"carte-soleil", +"carte-vue", +"cartes-cadeaux", +"cartes-filles", +"cartes-lettres", +"cartes-maximum", +"cartes-mères", +"cartes-vues", +"carton-index", +"carton-pierre", +"carton-pâte", +"cartons-pâte", +"carême-prenant", +"cas-limite", +"cas-limites", +"cash-back", +"cash-flow", +"cash-flows", +"casque-de-Jupiter", +"casse-aiguille", +"casse-bonbon", +"casse-bonbons", +"casse-bouteille", +"casse-bras", +"casse-burnes", +"casse-bélier", +"casse-béliers", +"casse-claouis", +"casse-coeur", +"casse-coeurs", +"casse-cou", +"casse-couille", +"casse-couilles", +"casse-cous", +"casse-croute", +"casse-croutes", +"casse-croûte", +"casse-croûtes", +"casse-cul", +"casse-culs", +"casse-cœur", +"casse-cœurs", +"casse-dalle", +"casse-dalles", +"casse-fer", +"casse-fil", +"casse-fils", +"casse-graine", +"casse-graines", +"casse-gueule", +"casse-gueules", +"casse-langue", +"casse-langues", +"casse-lunette", +"casse-lunettes", +"casse-mariages", +"casse-motte", +"casse-museau", +"casse-museaux", +"casse-noisette", +"casse-noisettes", +"casse-noix", +"casse-nole", +"casse-noyaux", +"casse-olives", +"casse-patte", +"casse-pattes", +"casse-pied", +"casse-pieds", +"casse-pierre", +"casse-pierres", +"casse-pipe", +"casse-pipes", +"casse-poitrine", +"casse-pot", +"casse-péter", +"casse-tête", +"casse-têtes", +"casse-vessie", +"cassi-ascher", +"cassi-aschers", +"castel-ambillouçois", +"castel-ambillouçoise", +"castel-ambillouçoises", +"castel-chalonnais", +"castel-chalonnaise", +"castel-chalonnaises", +"castel-lévézien", +"castel-lévézienne", +"castel-lévéziennes", +"castel-lévéziens", +"castel-pontin", +"castel-pontine", +"castel-pontines", +"castel-pontins", +"castel-symphorinois", +"castel-symphorinoise", +"castel-symphorinoises", +"castelnau-durbannais", +"castelnau-durbannaise", +"castelnau-durbannaises", +"castet-arrouyais", +"castet-arrouyaise", +"castet-arrouyaises", +"castillano-aragonais", +"cat-boat", +"catalan-valencien-baléare", +"catalase-positive", +"cato-cathartique", +"cato-cathartiques", +"caïque-bazar", +"caïques-bazars", +"cejourd'hui", +"celle-ci", +"celle-là", +"celles-ci", +"celles-là", +"celto-nordique", +"celto-nordiques", +"celui-ci", +"celui-là", +"cent-cinquante-cinq", +"cent-cinquante-cinquièmes", +"cent-garde", +"cent-gardes", +"cent-lances", +"cent-mille", +"cent-suisse", +"cent-suisses", +"centre-bourg", +"centre-droit", +"centre-gauche", +"centre-tir", +"centre-ville", +"centres-bourgs", +"centres-villes", +"cerf-veau", +"cerf-volant", +"cerf-voliste", +"cerfs-veaux", +"cerfs-volants", +"cerfs-volistes", +"certificat-cadeau", +"cesoird'hui", +"cessez-le-feu", +"cession-bail", +"cesta-punta", +"ceux-ci", +"ceux-là", +"ch'kâra", +"ch'kâras", +"ch'ni", +"ch't'aime", +"ch'ti", +"ch'tiisa", +"ch'tiisai", +"ch'tiisaient", +"ch'tiisais", +"ch'tiisait", +"ch'tiisant", +"ch'tiisas", +"ch'tiisasse", +"ch'tiisassent", +"ch'tiisasses", +"ch'tiisassiez", +"ch'tiisassions", +"ch'tiise", +"ch'tiisent", +"ch'tiiser", +"ch'tiisera", +"ch'tiiserai", +"ch'tiiseraient", +"ch'tiiserais", +"ch'tiiserait", +"ch'tiiseras", +"ch'tiiserez", +"ch'tiiseriez", +"ch'tiiserions", +"ch'tiiserons", +"ch'tiiseront", +"ch'tiises", +"ch'tiisez", +"ch'tiisiez", +"ch'tiisions", +"ch'tiisons", +"ch'tiisâmes", +"ch'tiisât", +"ch'tiisâtes", +"ch'tiisèrent", +"ch'tiisé", +"ch'tiisée", +"ch'tiisées", +"ch'tiisés", +"ch'timi", +"ch'tis", +"ch.-l.", +"cha'ban", +"cha-cha", +"cha-cha-cha", +"cha-chas", +"chabada-bada", +"chabazite-Ca", +"chabazite-Cas", +"chabazite-Na", +"chabazite-Nas", +"chambolle-musigny", +"chamboule-tout", +"chamito-sémitique", +"chamito-sémitiques", +"champs-clos", +"changxing'ien", +"chanos-cursonnais", +"chanos-cursonnaise", +"chanos-cursonnaises", +"chantilly-tiffany", +"chape-chuta", +"chape-chutai", +"chape-chutaient", +"chape-chutais", +"chape-chutait", +"chape-chutant", +"chape-chutas", +"chape-chutasse", +"chape-chutassent", +"chape-chutasses", +"chape-chutassiez", +"chape-chutassions", +"chape-chute", +"chape-chutent", +"chape-chuter", +"chape-chutera", +"chape-chuterai", +"chape-chuteraient", +"chape-chuterais", +"chape-chuterait", +"chape-chuteras", +"chape-chuterez", +"chape-chuteriez", +"chape-chuterions", +"chape-chuterons", +"chape-chuteront", +"chape-chutes", +"chape-chutez", +"chape-chutiez", +"chape-chutions", +"chape-chutons", +"chape-chutâmes", +"chape-chutât", +"chape-chutâtes", +"chape-chutèrent", +"chape-chuté", +"chapellois-fortinien", +"chapellois-fortiniens", +"chapelloise-fortinienne", +"chapelloises-fortiniennes", +"chapon-sérésien", +"char-à-bancs", +"charbon-de-pierre", +"charbon-de-terre", +"charbons-de-pierre", +"charbons-de-terre", +"chardon-Marie", +"chardon-Roland", +"chardons-Marie", +"chargeuse-pelleteuse", +"charme-houblon", +"charmes-houblons", +"chars-à-bancs", +"charte-partie", +"chasse-avant", +"chasse-bondieu", +"chasse-bondieux", +"chasse-carrée", +"chasse-carrées", +"chasse-chien", +"chasse-chiens", +"chasse-clou", +"chasse-clous", +"chasse-coquin", +"chasse-cousin", +"chasse-cousins", +"chasse-crapaud", +"chasse-cœur", +"chasse-derrière", +"chasse-derrières", +"chasse-diable", +"chasse-diables", +"chasse-ennui", +"chasse-fièvre", +"chasse-fleurée", +"chasse-fleurées", +"chasse-goupille", +"chasse-goupilles", +"chasse-gueux", +"chasse-marée", +"chasse-marées", +"chasse-morte", +"chasse-mouche", +"chasse-mouches", +"chasse-mulet", +"chasse-mulets", +"chasse-neige", +"chasse-neiges", +"chasse-noix", +"chasse-partie", +"chasse-parties", +"chasse-pierre", +"chasse-pierres", +"chasse-poignée", +"chasse-pointe", +"chasse-pointes", +"chasse-pommeau", +"chasse-punaise", +"chasse-rivet", +"chasse-rivets", +"chasse-rondelle", +"chasse-roue", +"chasse-roues", +"chasse-taupe", +"chasses-parties", +"chasseur-bombardier", +"chasseur-cueilleur", +"chasseurs-bombardiers", +"chasseurs-cueilleurs", +"chassez-déchassez", +"chassez-huit", +"chassé-croisé", +"chassés-croisés", +"chauche-branche", +"chauche-branches", +"chauche-poule", +"chauffe-assiette", +"chauffe-assiettes", +"chauffe-bain", +"chauffe-bains", +"chauffe-biberon", +"chauffe-biberons", +"chauffe-bloc", +"chauffe-blocs", +"chauffe-chemise", +"chauffe-cire", +"chauffe-double", +"chauffe-eau", +"chauffe-eaux", +"chauffe-la-couche", +"chauffe-linge", +"chauffe-linges", +"chauffe-lit", +"chauffe-lits", +"chauffe-moteur", +"chauffe-pied", +"chauffe-pieds", +"chauffe-plat", +"chauffe-plats", +"chauffes-doubles", +"chausse-pied", +"chausse-pieds", +"chausse-trape", +"chausse-trapes", +"chausse-trappe", +"chausse-trappes", +"chauve-souriceau", +"chauve-souricelle", +"chauve-souricière", +"chauve-souricières", +"chauve-souris", +"chauve-souris-garou", +"chauves-souriceaux", +"chauves-souricelles", +"chauves-souris", +"chauves-souris-garous", +"chaux-azote", +"chaux-azotes", +"check-up", +"check-ups", +"cheese-cake", +"cheese-cakes", +"chef-boutonnais", +"chef-boutonnaise", +"chef-boutonnaises", +"chef-d'oeuvre", +"chef-d'œuvre", +"chef-lieu", +"chef-mets", +"chef-mois", +"chefs-d'oeuvre", +"chefs-d'œuvre", +"chefs-lieux", +"cherche-fiche", +"cherche-merde", +"cherche-midi", +"cherche-pointe", +"cheval-fondu", +"cheval-garou", +"cheval-heure", +"cheval-jupon", +"cheval-vapeur", +"chevau-léger", +"chevau-légers", +"chevaux-léger", +"chevaux-légers", +"chevaux-vapeur", +"cheveu-de-Marie-Madeleine", +"cheveux-de-Marie-Madeleine", +"chewing-gum", +"chewing-gums", +"chez-moi", +"chez-soi", +"chez-sois", +"chiche-face", +"chiche-kebab", +"chiche-kébab", +"chiches-faces", +"chiches-kebabs", +"chie-en-lit", +"chie-en-lits", +"chien-assis", +"chien-cerf", +"chien-chaud", +"chien-chauds", +"chien-de-mer", +"chien-garou", +"chien-loup", +"chien-nid", +"chien-rat", +"chienne-louve", +"chiennes-louves", +"chiens-assis", +"chiens-cerf", +"chiens-de-mer", +"chiens-garous", +"chiens-loups", +"chiens-nids", +"chiens-rats", +"chiffre-taxe", +"chiffres-clés", +"chiffres-taxes", +"china-paya", +"chiotte-kès", +"chiottes-kès", +"chirurgien-dentiste", +"chirurgiens-dentistes", +"chloro-IPC", +"chlorpyriphos-méthyl", +"chlorpyriphos-éthyl", +"choano-organismes", +"choche-pierre", +"choche-poule", +"choux-choux", +"choux-fleurs", +"choux-navets", +"choux-palmistes", +"choux-raves", +"chow-chow", +"chow-chows", +"christe-marine", +"christes-marines", +"chrom-brugnatellite", +"chrom-brugnatellites", +"chrome-clinozoïsite", +"chrome-clinozoïsites", +"chrome-fluorite", +"chrome-fluorites", +"chrome-pistazite", +"chrome-pistazites", +"chrome-trémolite", +"chrome-trémolites", +"chrome-zoïsite", +"chrome-zoïsites", +"chrono-localisation", +"chrono-localisations", +"chrétiens-démocrates", +"chuteur-op", +"chuteurs-ops", +"châssis-support", +"châssis-supports", +"châtaigne-d'eau", +"châtaigne-de-mer", +"châtaignes-d'eau", +"châtaignes-de-mer", +"châteauneuf-du-pape", +"châteaux-forts", +"chèque-cadeau", +"chèque-repas", +"chèque-restaurant", +"chèque-vacances", +"chèques-cadeaux", +"chèques-repas", +"chèques-restaurants", +"chèques-vacances", +"chèvre-choutiste", +"chèvre-choutistes", +"chèvre-feuille", +"chèvre-pied", +"chèvre-pieds", +"chèvres-feuilles", +"chéry-chartreuvois", +"chéry-chartreuvoise", +"chéry-chartreuvoises", +"chêne-gomme", +"chêne-liège", +"chêne-marin", +"chêne-pommier", +"chênes-gommes", +"chênes-lièges", +"chênes-marins", +"ci-après", +"ci-attaché", +"ci-contre", +"ci-delez", +"ci-dessous", +"ci-dessus", +"ci-devant", +"ci-gisent", +"ci-git", +"ci-gît", +"ci-haut", +"ci-hauts", +"ci-incluse", +"ci-incluses", +"ci-joint", +"ci-jointe", +"ci-jointes", +"ci-joints", +"ci-plus-bas", +"ci-plus-haut", +"cia-cia", +"cinq-cents", +"cinq-dix-quinze", +"cinq-huitième", +"cinq-marsien", +"cinq-marsienne", +"cinq-marsiennes", +"cinq-marsiens", +"cinq-mâts", +"cinq-quatre-un", +"cinq-six", +"cinquante-cinq", +"cinquante-cinquante", +"cinquante-deux", +"cinquante-et-un", +"cinquante-et-une", +"cinquante-et-unième", +"cinquante-et-unièmes", +"cinquante-huit", +"cinquante-neuf", +"cinquante-quatre", +"cinquante-sept", +"cinquante-six", +"cinquante-trois", +"ciné-club", +"ciné-clubs", +"ciné-parc", +"cinéma-dinatoire", +"cinéma-dinatoires", +"circolo-mezzo", +"circonscriptions-clés", +"circum-aural", +"circum-continental", +"cire-pompe", +"cire-pompes", +"cirque-ménagerie", +"cirque-théâtre", +"cirques-ménageries", +"cirques-théâtres", +"cis-gangétique", +"cis-gangétiques", +"cis-verbénol", +"citizen-band", +"citron-pays", +"citrons-pays", +"cité-dortoir", +"cité-État", +"cités-dortoirs", +"cités-États", +"clac-clac", +"clac-clacs", +"claque-merde", +"claque-oreille", +"claque-oreilles", +"claque-patin", +"claque-patins", +"clavi-cylindre", +"clavi-harpe", +"clavi-lyre", +"clic-clac", +"client-cible", +"client-cibles", +"client-serveur", +"cligne-musette", +"climato-sceptique", +"climato-sceptiques", +"clin-foc", +"clin-focs", +"cloche-pied", +"cloche-pieds", +"cloche-plaque", +"clodinafop-propargyl", +"clopin-clopant", +"cloquintocet-mexyl", +"clos-fontainois", +"clos-fontainoise", +"clos-fontainoises", +"clos-masure", +"clos-masures", +"clos-vougeot", +"clos-vougeots", +"club-house", +"clubs-houses", +"clématite-viorne", +"clématites-viornes", +"clérico-nationaliste", +"clérico-nationalistes", +"coat-méalien", +"coat-méalienne", +"coat-méaliennes", +"coat-méaliens", +"cobalt-gris", +"cobalt-mica", +"cobalt-ochre", +"cobalto-sphaérosidérite", +"cobalto-sphaérosidérites", +"cobalto-épsomite", +"cobalto-épsomites", +"cobalts-gris", +"cobalts-micas", +"cobalts-ochres", +"cochon-garou", +"cochons-garous", +"coco-de-mer", +"coco-fesses", +"cocotte-minute", +"codes-barres", +"codes-clés", +"coeur-de-pigeon", +"coeurs-de-pigeon", +"coeurs-de-pigeons", +"coffre-fort", +"coffres-forts", +"coin-coin", +"coin-coins", +"col-nu", +"col-vert", +"col-verts", +"colin-maillard", +"colin-tampon", +"colis-route", +"colis-routes", +"collant-pipette", +"collant-pipettes", +"collet-monté", +"colloid-calcite", +"colloid-calcites", +"collé-serré", +"collés-serrés", +"cols-nus", +"cols-verts", +"colville-okanagan", +"com'com", +"combi-short", +"combi-shorts", +"comble-lacune", +"comble-lacunes", +"come-back", +"commis-voyageur", +"commis-voyageurs", +"commissaire-priseur", +"commissaires-priseurs", +"compositeur-typographe", +"compositeur-typographes", +"comptes-rendus", +"compère-loriot", +"compères-loriot", +"comédie-ballet", +"comédies-ballets", +"concavo-concave", +"concavo-convexe", +"conforte-main", +"conférences-débats", +"congo-kinois", +"congolo-kinois", +"congolo-kinoise", +"congolo-kinoises", +"conseil-général", +"contra-latéral", +"contrat-cadre", +"contrats-cadres", +"contrôle-commande", +"convexo-concave", +"copia-colla", +"copiable-collable", +"copiables-collables", +"copiage-collage", +"copiages-collages", +"copiai-collai", +"copiaient-collaient", +"copiais-collais", +"copiait-collait", +"copiant-collant", +"copias-collas", +"copiasse-collasse", +"copiassent-collassent", +"copiasses-collasses", +"copiassiez-collassiez", +"copiassions-collassions", +"copie-colle", +"copie-lettres", +"copient-collent", +"copier-coller", +"copier-collers", +"copiera-collera", +"copierai-collerai", +"copieraient-colleraient", +"copierais-collerais", +"copierait-collerait", +"copieras-colleras", +"copierez-collerez", +"copieriez-colleriez", +"copierions-collerions", +"copierons-collerons", +"copieront-colleront", +"copies-colles", +"copiez-collez", +"copiez-colliez", +"copions-collions", +"copions-collons", +"copiâmes-collâmes", +"copiât-collât", +"copiâtes-collâtes", +"copièrent-collèrent", +"copié-collé", +"copié-collés", +"copiée-collée", +"copiées-collées", +"copiés-collés", +"coq-de-roche", +"coq-héron", +"coq-souris", +"coq-à-l'âne", +"coqs-de-roche", +"coquel'œil", +"coquel'œils", +"coral-rag", +"corbeau-pêcheur", +"corbeaux-pêcheurs", +"corbeil-essonnois", +"corbeil-essonnoise", +"corbeil-essonnoises", +"cordons-bleus", +"corn-flake", +"corn-flakes", +"corned-beef", +"corned-beefs", +"corps-mort", +"corps-morts", +"cortico-cortical", +"cortico-corticale", +"cortico-corticales", +"cortico-corticaux", +"cortil-noirmontois", +"costa-ricien", +"costa-ricienne", +"costa-riciennes", +"costa-riciens", +"costard-cravate", +"costards-cravates", +"costo-claviculaire", +"costo-sternal", +"costo-thoracique", +"costo-vertébral", +"costo-vertébrale", +"costo-vertébrales", +"costo-vertébraux", +"cosy-corner", +"cosy-corners", +"coton-poudre", +"coton-poudres", +"coton-tige", +"cotons-poudres", +"cotons-tiges", +"cotte-hardie", +"cottes-hardies", +"cou-de-jatte", +"cou-de-pied", +"cou-jaune", +"cou-nu", +"couble-soiffière", +"couche-culotte", +"couche-point", +"couche-points", +"couche-tard", +"couche-tôt", +"couches-culottes", +"couci-couci", +"couci-couça", +"coude-pied", +"coude-à-coude", +"coule-sang", +"couper-coller", +"coupon-réponse", +"coupons-réponses", +"coups-de-poing", +"coupé-cabriolet", +"coupé-collé", +"coupé-décalé", +"coupé-lit", +"coupés-cabriolets", +"coupés-collés", +"coupés-décalés", +"coupés-lits", +"cour-masure", +"courant-jet", +"courants-jets", +"coure-vite", +"cours-de-pilois", +"cours-de-piloise", +"cours-de-piloises", +"course-poursuite", +"courses-poursuites", +"courte-botte", +"courte-graisse", +"courte-lettre", +"courte-pointe", +"courte-pointier", +"courte-queue", +"courte-épine", +"courte-épines", +"courte-épée", +"courtes-bottes", +"courtes-lettres", +"courtes-pattes", +"courtes-pointes", +"courtes-queues", +"courtes-épées", +"courts-bandages", +"courts-boutons", +"courts-circuits", +"courts-cureaux", +"courts-côtés", +"courts-jus", +"courts-métrages", +"courts-tours", +"cous-cous", +"cous-de-jatte", +"cous-de-pied", +"cous-jaunes", +"cout'donc", +"couteau-de-chasse", +"couteau-scie", +"couteaux-de-chasse", +"couteaux-scie", +"couvre-casque", +"couvre-casques", +"couvre-chaussure", +"couvre-chaussures", +"couvre-chef", +"couvre-chefs", +"couvre-clef", +"couvre-clefs", +"couvre-face", +"couvre-faces", +"couvre-feu", +"couvre-feux", +"couvre-giberne", +"couvre-gibernes", +"couvre-joint", +"couvre-joints", +"couvre-lit", +"couvre-lits", +"couvre-livre", +"couvre-livres", +"couvre-lumière", +"couvre-lumières", +"couvre-manche", +"couvre-manches", +"couvre-nuque", +"couvre-nuques", +"couvre-objet", +"couvre-objets", +"couvre-orteil", +"couvre-orteils", +"couvre-pied", +"couvre-pieds", +"couvre-plat", +"couvre-plats", +"couvre-shako", +"couvre-shakos", +"couvre-sol", +"couvre-sols", +"couvreur-zingueur", +"cover-girl", +"cover-girls", +"cow-boy", +"cow-boys", +"coxa-retrorsa", +"coxo-fémoral", +"crabe-araignée", +"crabes-araignées", +"crac-crac", +"crachouillot-thérapeute", +"craignant-Dieu", +"cran-gevrien", +"cran-gevrienne", +"cran-gevriennes", +"cran-gevriens", +"cranio-facial", +"cranves-salien", +"cranves-saliens", +"cranves-saliène", +"cranves-saliènes", +"crapaud-buffle", +"crapauds-buffles", +"crapet-soleil", +"crayon-feutre", +"crayon-souris", +"crayons-feutre", +"crayons-feutres", +"crest-volantain", +"crest-volantaine", +"crest-volantaines", +"crest-volantains", +"crevette-mante", +"crevettes-mantes", +"cri-cri", +"cri-cris", +"cric-crac", +"crico-trachéal", +"crico-trachéale", +"crico-trachéales", +"crico-trachéaux", +"cristallo-électrique", +"cristallo-électriques", +"criste-marine", +"croad-langshan", +"croc-en-jambe", +"crocs-en-jambe", +"croiseur-école", +"croiseurs-écoles", +"croix-caluois", +"croix-caluoise", +"croix-caluoises", +"croix-de-Malte", +"croix-de-feu", +"croix-pile", +"croix-roussien", +"croix-roussienne", +"croix-roussiennes", +"croix-roussiens", +"cromlec'h", +"cromlec'hs", +"croque-abeilles", +"croque-au-sel", +"croque-en-bouche", +"croque-lardon", +"croque-lardons", +"croque-madame", +"croque-madames", +"croque-mademoiselle", +"croque-mademoiselles", +"croque-messieurs", +"croque-mitaine", +"croque-mitaines", +"croque-monsieur", +"croque-monsieurs", +"croque-mort", +"croque-morts", +"croque-moutons", +"croque-noisette", +"croque-noisettes", +"croque-noix", +"croque-note", +"crossing-over", +"crotte-du-Diable", +"crotte-du-diable", +"crottes-du-Diable", +"crottes-du-diable", +"crown-glass", +"cruci-capétien", +"cruci-capétienne", +"cruci-capétiennes", +"cruci-capétiens", +"cruci-falgardien", +"cruci-falgardienne", +"cruci-falgardiennes", +"cruci-falgardiens", +"crud-ammoniac", +"crypto-communiste", +"crypto-luthérien", +"crypto-luthérienne", +"crypto-luthériennes", +"crypto-luthériens", +"crypto-monnaie", +"crypto-monnaies", +"crève-chassis", +"crève-chien", +"crève-chiens", +"crève-coeur", +"crève-coeurs", +"crève-cœur", +"crève-cœurs", +"crève-la-dalle", +"crève-la-faim", +"crève-vessie", +"crève-vessies", +"créateur-typographe", +"crédit-bail", +"crédit-temps", +"crédits-bail", +"crédits-bails", +"crédits-baux", +"crédits-temps", +"crête-de-coq", +"crête-marine", +"crêtes-de-coq", +"crêtes-marines", +"cubito-carpien", +"cubito-carpienne", +"cubito-carpiennes", +"cubito-carpiens", +"cubo-prismatique", +"cubo-prismatiques", +"cucu-la-praline", +"cucul-la-praline", +"cueille-essaim", +"cueille-fruits", +"cueilleur-égreneur", +"cueilleurs-égreneurs", +"cueilleuse-égreneuse", +"cueilleuse-épanouilleuse", +"cueilleuses-égreneuses", +"cueilleuses-épanouilleuses", +"cui-cui", +"cuir-laine", +"cuiry-houssien", +"cuiry-houssienne", +"cuiry-houssiennes", +"cuiry-houssiens", +"cuisse-de-nymphe", +"cuisse-madame", +"cuisse-madames", +"cuit-poires", +"cuit-pommes", +"cuit-vapeur", +"cuit-vapeurs", +"cul-bas", +"cul-blanc", +"cul-brun", +"cul-bénit", +"cul-cul", +"cul-culs", +"cul-de-basse-fosse", +"cul-de-bouteille", +"cul-de-chien", +"cul-de-four", +"cul-de-jatte", +"cul-de-lampe", +"cul-de-plomb", +"cul-de-porc", +"cul-de-poule", +"cul-de-sac", +"cul-des-sartois", +"cul-doré", +"cul-levé", +"cul-rouge", +"cul-rousselet", +"cul-terreux", +"culcul-la-praline", +"culit-api", +"culs-blancs", +"culs-bénits", +"culs-de-basse-fosse", +"culs-de-bouteille", +"culs-de-chien", +"culs-de-four", +"culs-de-jatte", +"culs-de-lampe", +"culs-de-plomb", +"culs-de-poule", +"culs-de-sac", +"culs-levés", +"culs-rouges", +"culs-terreux", +"cultivateur-tasseur", +"cultivateurs-tasseurs", +"culturo-scientifique", +"culturo-scientifiques", +"cumulo-nimbus", +"cunéo-scaphoïdien", +"cupro-allophane", +"cupro-allophanes", +"cupro-aluminium", +"cupro-aluminiums", +"cupro-ammoniacal", +"cupro-elbaïte", +"cupro-elbaïtes", +"cupro-fraipontite", +"cupro-fraipontites", +"cupro-nickel", +"cupro-nickels", +"cure-dent", +"cure-dents", +"cure-feu", +"cure-feux", +"cure-langue", +"cure-langues", +"cure-môle", +"cure-ongle", +"cure-ongles", +"cure-oreille", +"cure-oreilles", +"cure-pied", +"cure-pieds", +"cure-pipe", +"cure-pipes", +"curti-marignacais", +"curti-marignacaise", +"curti-marignacaises", +"custodi-nos", +"cycle-car", +"cycle-cars", +"cyclo-bus", +"cyclo-cross", +"cyclo-draisine", +"cyclo-draisines", +"cyclo-nomade", +"cyclo-nomades", +"cyclo-octyl-diméthylurée", +"cyclo-pousse", +"cyclo-pousses", +"cyhalofop-butyl", +"cylindro-conique", +"cyth's", +"cyto-architectonie", +"cyto-architectonies", +"cyto-architectonique", +"cyto-architectoniques", +"câblo-opérateur", +"câblo-opérateurs", +"cèleri-rave", +"cèleri-raves", +"cédez-le-passage", +"céleri-rave", +"céleris-raves", +"céléri-rave", +"céphalo-pharyngien", +"céphalo-pharyngienne", +"céphalo-pharyngiennes", +"céphalo-pharyngiens", +"céphalo-rachidien", +"cérébro-lésion", +"cérébro-lésions", +"cérébro-rachidien", +"cérébro-rachidienne", +"cérébro-rachidiennes", +"cérébro-rachidiens", +"cérébro-spinal", +"cérébro-spinale", +"cérébro-spinales", +"cérébro-spinaux", +"césaro-papisme", +"césaro-papismes", +"césaro-papiste", +"césaro-papistes", +"césium-analcime", +"césium-analcimes", +"côtes-de-toul", +"côtes-du-Rhône", +"côtes-du-rhône", +"côtes-du-rhônes", +"cœur-de-Jeannette", +"cœur-de-pigeon", +"cœurs-de-pigeons", +"d-amphétamine", +"dalai-lama", +"dalai-lamas", +"dalaï-lama", +"dalaï-lamas", +"dame-aubert", +"dame-d'onze-heures", +"dame-jeanne", +"dame-pipi", +"dame-ronde", +"dames-d'onze-heures", +"dames-jeannes", +"dames-pipi", +"dames-rondes", +"danse-poteau", +"dar-et-dar", +"dare-dare", +"datte-de-mer", +"de-ci", +"de-là", +"dead-line", +"dead-lines", +"dena'ina", +"dena'inas", +"dent-de-cheval", +"dent-de-chien", +"dent-de-lion", +"dent-de-loup", +"dent-de-rat", +"dento-facial", +"dents-de-cheval", +"dents-de-chien", +"dents-de-lion", +"dermato-allergologue", +"dermato-allergologues", +"dernier-né", +"dernier-nés", +"derniers-nés", +"dernière-née", +"des-agreable", +"des-agreables", +"dessinateur-typographe", +"dessous-de-bouteille", +"dessous-de-bras", +"dessous-de-plat", +"dessous-de-table", +"dessous-de-tables", +"dessus-de-lit", +"dessus-de-plat", +"dessus-de-porte", +"dessus-de-tête", +"deux-cent-vingt-et-un", +"deux-cents", +"deux-chaisois", +"deux-chaisoise", +"deux-chaisoises", +"deux-chevaux", +"deux-dents", +"deux-mille", +"deux-mâts", +"deux-peccable", +"deux-peccables", +"deux-pièces", +"deux-points", +"deux-ponts", +"deux-quatre", +"deux-roues", +"deux-temps", +"devrai-gondragnier", +"devrai-gondragniers", +"devrai-gondragnière", +"devrai-gondragnières", +"dextro-volubile", +"di-1-p-menthène", +"diam's", +"diastéréo-isomère", +"diastéréo-isomères", +"dichloro-diphényl-dichloroéthane", +"dichlorprop-p", +"diclofop-méthyl", +"diesel-électrique", +"diesels-électriques", +"digue-digue", +"dihydro-oxycodéinone", +"dik-dik", +"dik-diks", +"dikégulac-sodium", +"diméthyl-dixanthogène", +"diméthénamide-P", +"dining-room", +"dining-rooms", +"diola-kasa", +"diony-sapinois", +"diony-sapinoise", +"diony-sapinoises", +"diptéro-sodomie", +"diptéro-sodomies", +"disc-jockey", +"disc-jockeys", +"distance-temps", +"divergi-nervé", +"dix-cors", +"dix-en-dix", +"dix-heura", +"dix-heurai", +"dix-heuraient", +"dix-heurais", +"dix-heurait", +"dix-heurant", +"dix-heuras", +"dix-heurasse", +"dix-heurassent", +"dix-heurasses", +"dix-heurassiez", +"dix-heurassions", +"dix-heure", +"dix-heurent", +"dix-heurer", +"dix-heurera", +"dix-heurerai", +"dix-heureraient", +"dix-heurerais", +"dix-heurerait", +"dix-heureras", +"dix-heurerez", +"dix-heureriez", +"dix-heurerions", +"dix-heurerons", +"dix-heureront", +"dix-heures", +"dix-heurez", +"dix-heuriez", +"dix-heurions", +"dix-heurons", +"dix-heurâmes", +"dix-heurât", +"dix-heurâtes", +"dix-heurèrent", +"dix-heuré", +"dix-huit", +"dix-huitième", +"dix-huitièmement", +"dix-huitièmes", +"dix-huitièmiste", +"dix-huitièmistes", +"dix-huitiémisme", +"dix-huitiémismes", +"dix-huitiémiste", +"dix-huitiémistes", +"dix-mille", +"dix-millionième", +"dix-millionièmes", +"dix-millième", +"dix-millièmes", +"dix-neuf", +"dix-neuvième", +"dix-neuvièmement", +"dix-neuvièmes", +"dix-neuvièmiste", +"dix-neuvièmistes", +"dix-neuviémisme", +"dix-neuviémismes", +"dix-neuviémiste", +"dix-neuviémistes", +"dix-roues", +"dix-sept", +"dix-septième", +"dix-septièmement", +"dix-septièmes", +"dix-septièmiste", +"dix-septièmistes", +"dix-septiémisme", +"dix-septiémismes", +"dix-septiémiste", +"dix-septiémistes", +"diésel-électrique", +"diésels-électriques", +"diéthyl-diphényl-dichloroéthane", +"djoumada-l-oula", +"djoumada-t-tania", +"doati-casteidois", +"doati-casteidoise", +"doati-casteidoises", +"docu-fiction", +"docu-fictions", +"documentaire-choc", +"documentaires-chocs", +"dodémorphe-acétate", +"dog-cart", +"dog-carts", +"doigt-de-gant", +"doigts-de-gant", +"dom-tomien", +"dom-tomienne", +"dom-tomiennes", +"dom-tomiens", +"dommage-intérêt", +"dommages-intérêts", +"dompte-venin", +"dompte-venins", +"don-juanisme", +"don-juanismes", +"don-quichottisme", +"don-quichottismes", +"donation-partage", +"donations-partages", +"donnant-donnant", +"donne-jour", +"doom-death", +"dorso-vélaire", +"dorso-vélaires", +"dos-d'âne", +"dou-l-hidjja", +"dou-l-qa'da", +"doubet-talibautier", +"doubet-talibautiers", +"doubet-talibautière", +"doubet-talibautières", +"doubles-aubiers", +"doubles-bouches", +"doubles-bulbes", +"doubles-bécassines", +"doubles-canons", +"doubles-chaînes", +"doubles-clics", +"doubles-croches", +"doubles-feuilles", +"doubles-fonds", +"doubles-mains", +"doubles-sens", +"douce-amère", +"douces-amères", +"doux-agnel", +"doux-amer", +"doux-amers", +"doux-ballon", +"doux-vert", +"doux-à-l'agneau", +"down-loada", +"down-loadai", +"down-loadaient", +"down-loadais", +"down-loadait", +"down-loadant", +"down-loadas", +"down-loadasse", +"down-loadassent", +"down-loadasses", +"down-loadassiez", +"down-loadassions", +"down-loade", +"down-loadent", +"down-loader", +"down-loadera", +"down-loaderai", +"down-loaderaient", +"down-loaderais", +"down-loaderait", +"down-loaderas", +"down-loaderez", +"down-loaderiez", +"down-loaderions", +"down-loaderons", +"down-loaderont", +"down-loades", +"down-loadez", +"down-loadiez", +"down-loadions", +"down-loadons", +"down-loadâmes", +"down-loadât", +"down-loadâtes", +"down-loadèrent", +"down-loadé", +"down-loadée", +"down-loadées", +"down-loadés", +"dragonnet-lyre", +"drainage-taupe", +"draineuse-trancheuse", +"draineuses-trancheuses", +"drap-housse", +"drap-housses", +"drelin-drelin", +"drift-ice", +"drift-ices", +"dring-dring", +"drive-in", +"drive-ins", +"drive-way", +"drive-ways", +"droit-fil", +"droit-fils", +"drop-goal", +"drop-goals", +"drug-store", +"drug-stores", +"dry-tooleur", +"dry-tooleurs", +"dry-tooling", +"dual-core", +"dual-cores", +"duc-d'Albe", +"duc-d'albe", +"duché-pairie", +"duchés-pairies", +"ducs-d'Albe", +"ducs-d'albe", +"duffel-coat", +"duffel-coats", +"duffle-coat", +"duffle-coats", +"dum-dum", +"duo-tang", +"duo-tangs", +"duplicato-dentelé", +"dur-bec", +"dure-mère", +"dure-peau", +"dures-mères", +"dures-peaux", +"durs-becs", +"duty-free", +"dynamo-électrique", +"dynamo-électriques", +"dès-méshui", +"débat-spectacle", +"débauche-embauche", +"déca-ampère", +"déca-ampères", +"découd-vite", +"découpe-neige", +"découpes-neige", +"décrochez-moi-ça", +"déjà-vu", +"démocrate-chrétien", +"démocrate-chrétienne", +"démocrates-chrétiennes", +"démocrates-chrétiens", +"démonte-pneu", +"démonte-pneus", +"déméton-méthyl", +"dépose-minute", +"député-maire", +"députés-maires", +"dépôt-vente", +"dépôts-ventes", +"déséthyl-terbuméton", +"dîner-spectacle", +"dîners-spectacles", +"e-administration", +"e-administrations", +"e-book", +"e-business", +"e-carte", +"e-cartes", +"e-cig", +"e-cigarette", +"e-cigarettes", +"e-cigs", +"e-cinéma", +"e-cinémas", +"e-client", +"e-clope", +"e-clopes", +"e-commerce", +"e-commerçant", +"e-commerçants", +"e-couponing", +"e-criminalité", +"e-criminalités", +"e-délinquance", +"e-délinquances", +"e-la", +"e-la-fa", +"e-la-mi", +"e-mail", +"e-maila", +"e-mailai", +"e-mailaient", +"e-mailais", +"e-mailait", +"e-mailant", +"e-mailas", +"e-mailasse", +"e-mailassent", +"e-mailasses", +"e-mailassiez", +"e-mailassions", +"e-maile", +"e-mailent", +"e-mailer", +"e-mailera", +"e-mailerai", +"e-maileraient", +"e-mailerais", +"e-mailerait", +"e-maileras", +"e-mailerez", +"e-maileriez", +"e-mailerions", +"e-mailerons", +"e-maileront", +"e-mailes", +"e-maileur", +"e-maileurs", +"e-maileuse", +"e-maileuses", +"e-mailez", +"e-mailiez", +"e-mailing", +"e-mailings", +"e-mailions", +"e-mailons", +"e-mailâmes", +"e-mailât", +"e-mailâtes", +"e-mailèrent", +"e-mailé", +"e-mailée", +"e-mailées", +"e-mailés", +"e-marketeur", +"e-marketeurs", +"e-marketeuse", +"e-marketeuses", +"e-marketing", +"e-marketings", +"e-merchandiser", +"e-procurement", +"e-procurements", +"e-reader", +"e-readers", +"e-réputation", +"e-réputations", +"e-réservation", +"e-réservations", +"e-santé", +"e-sport", +"e-sportif", +"e-sportifs", +"e-sports", +"e-ticket", +"e-tickets", +"e-tourisme", +"eau-bénitier", +"eau-bénitiers", +"eau-de-vie", +"eau-forte", +"eaux-bonnais", +"eaux-bonnaise", +"eaux-bonnaises", +"eaux-de-vie", +"eaux-fortes", +"eaux-vannes", +"edit-a-thon", +"edit-a-thons", +"effet-bulle", +"effets-bulles", +"ego-document", +"ego-documents", +"el-âsker", +"elle-même", +"elles-mêmes", +"ello-rhénan", +"ello-rhénane", +"ello-rhénanes", +"ello-rhénans", +"emballage-bulle", +"emballage-coque", +"emballages-bulles", +"emballages-coques", +"emo-sexualité", +"emo-sexualités", +"emporte-pièce", +"emporte-pièces", +"en-avant", +"en-avants", +"en-but", +"en-buts", +"en-cas", +"en-cours", +"en-dessous", +"en-dessus", +"en-deçà", +"en-garant", +"en-tout-cas", +"en-tête", +"en-têtes", +"enfant-bulle", +"enfant-roi", +"enfant-soldat", +"enfants-bulles", +"enfants-robots", +"enfants-rois", +"enfants-soldats", +"enfile-aiguille", +"enfile-aiguilles", +"enfle-boeuf", +"enfle-boeufs", +"enfle-bœuf", +"enfle-bœufs", +"enquêtes-minute", +"enseignant-chercheur", +"enseignante-chercheuse", +"enseignantes-chercheuses", +"enseignants-chercheurs", +"entr'abat", +"entr'abattaient", +"entr'abattait", +"entr'abattant", +"entr'abatte", +"entr'abattent", +"entr'abattez", +"entr'abattiez", +"entr'abattions", +"entr'abattirent", +"entr'abattissent", +"entr'abattissions", +"entr'abattit", +"entr'abattons", +"entr'abattra", +"entr'abattraient", +"entr'abattrait", +"entr'abattre", +"entr'abattrez", +"entr'abattriez", +"entr'abattrions", +"entr'abattrons", +"entr'abattront", +"entr'abattu", +"entr'abattue", +"entr'abattues", +"entr'abattus", +"entr'abattîmes", +"entr'abattît", +"entr'abattîtes", +"entr'aborda", +"entr'abordaient", +"entr'abordait", +"entr'abordant", +"entr'abordassent", +"entr'abordassiez", +"entr'abordassions", +"entr'aborde", +"entr'abordent", +"entr'aborder", +"entr'abordera", +"entr'aborderaient", +"entr'aborderait", +"entr'aborderez", +"entr'aborderiez", +"entr'aborderions", +"entr'aborderons", +"entr'aborderont", +"entr'abordez", +"entr'abordiez", +"entr'abordions", +"entr'abordons", +"entr'abordâmes", +"entr'abordât", +"entr'abordâtes", +"entr'abordèrent", +"entr'abordé", +"entr'abordées", +"entr'abordés", +"entr'accola", +"entr'accolaient", +"entr'accolait", +"entr'accolant", +"entr'accolassent", +"entr'accolassiez", +"entr'accolassions", +"entr'accole", +"entr'accolent", +"entr'accoler", +"entr'accolera", +"entr'accoleraient", +"entr'accolerait", +"entr'accolerez", +"entr'accoleriez", +"entr'accolerions", +"entr'accolerons", +"entr'accoleront", +"entr'accolez", +"entr'accoliez", +"entr'accolions", +"entr'accolons", +"entr'accolâmes", +"entr'accolât", +"entr'accolâtes", +"entr'accolèrent", +"entr'accolé", +"entr'accolées", +"entr'accolés", +"entr'accorda", +"entr'accordaient", +"entr'accordait", +"entr'accordant", +"entr'accordassent", +"entr'accordassiez", +"entr'accordassions", +"entr'accorde", +"entr'accordent", +"entr'accorder", +"entr'accordera", +"entr'accorderaient", +"entr'accorderait", +"entr'accorderez", +"entr'accorderiez", +"entr'accorderions", +"entr'accorderons", +"entr'accorderont", +"entr'accordez", +"entr'accordiez", +"entr'accordions", +"entr'accordons", +"entr'accordâmes", +"entr'accordât", +"entr'accordâtes", +"entr'accordèrent", +"entr'accordé", +"entr'accordées", +"entr'accordés", +"entr'accrocha", +"entr'accrochaient", +"entr'accrochait", +"entr'accrochant", +"entr'accrochassent", +"entr'accrochassiez", +"entr'accrochassions", +"entr'accroche", +"entr'accrochent", +"entr'accrocher", +"entr'accrochera", +"entr'accrocheraient", +"entr'accrocherait", +"entr'accrocherez", +"entr'accrocheriez", +"entr'accrocherions", +"entr'accrocherons", +"entr'accrocheront", +"entr'accrochez", +"entr'accrochiez", +"entr'accrochions", +"entr'accrochons", +"entr'accrochâmes", +"entr'accrochât", +"entr'accrochâtes", +"entr'accrochèrent", +"entr'accroché", +"entr'accrochées", +"entr'accrochés", +"entr'accusa", +"entr'accusaient", +"entr'accusait", +"entr'accusant", +"entr'accusassent", +"entr'accusassiez", +"entr'accusassions", +"entr'accuse", +"entr'accusent", +"entr'accuser", +"entr'accusera", +"entr'accuseraient", +"entr'accuserait", +"entr'accuserez", +"entr'accuseriez", +"entr'accuserions", +"entr'accuserons", +"entr'accuseront", +"entr'accusez", +"entr'accusiez", +"entr'accusions", +"entr'accusons", +"entr'accusâmes", +"entr'accusât", +"entr'accusâtes", +"entr'accusèrent", +"entr'accusé", +"entr'accusées", +"entr'accusés", +"entr'acte", +"entr'actes", +"entr'adapta", +"entr'adaptaient", +"entr'adaptait", +"entr'adaptant", +"entr'adaptassent", +"entr'adaptassiez", +"entr'adaptassions", +"entr'adapte", +"entr'adaptent", +"entr'adapter", +"entr'adaptera", +"entr'adapteraient", +"entr'adapterait", +"entr'adapterez", +"entr'adapteriez", +"entr'adapterions", +"entr'adapterons", +"entr'adapteront", +"entr'adaptez", +"entr'adaptiez", +"entr'adaptions", +"entr'adaptons", +"entr'adaptâmes", +"entr'adaptât", +"entr'adaptâtes", +"entr'adaptèrent", +"entr'adapté", +"entr'adaptées", +"entr'adaptés", +"entr'admira", +"entr'admirai", +"entr'admiraient", +"entr'admirais", +"entr'admirait", +"entr'admirant", +"entr'admiras", +"entr'admirasse", +"entr'admirassent", +"entr'admirasses", +"entr'admirassiez", +"entr'admirassions", +"entr'admire", +"entr'admirent", +"entr'admirer", +"entr'admirera", +"entr'admirerai", +"entr'admireraient", +"entr'admirerais", +"entr'admirerait", +"entr'admireras", +"entr'admirerez", +"entr'admireriez", +"entr'admirerions", +"entr'admirerons", +"entr'admireront", +"entr'admires", +"entr'admirez", +"entr'admiriez", +"entr'admirions", +"entr'admirons", +"entr'admirâmes", +"entr'admirât", +"entr'admirâtes", +"entr'admirèrent", +"entr'admiré", +"entr'admirée", +"entr'admirées", +"entr'admirés", +"entr'admonesta", +"entr'admonestaient", +"entr'admonestait", +"entr'admonestant", +"entr'admonestassent", +"entr'admonestassiez", +"entr'admonestassions", +"entr'admoneste", +"entr'admonestent", +"entr'admonester", +"entr'admonestera", +"entr'admonesteraient", +"entr'admonesterait", +"entr'admonesterez", +"entr'admonesteriez", +"entr'admonesterions", +"entr'admonesterons", +"entr'admonesteront", +"entr'admonestez", +"entr'admonestiez", +"entr'admonestions", +"entr'admonestons", +"entr'admonestâmes", +"entr'admonestât", +"entr'admonestâtes", +"entr'admonestèrent", +"entr'admonesté", +"entr'admonestées", +"entr'admonestés", +"entr'adressa", +"entr'adressaient", +"entr'adressait", +"entr'adressant", +"entr'adressassent", +"entr'adressassiez", +"entr'adressassions", +"entr'adresse", +"entr'adressent", +"entr'adresser", +"entr'adressera", +"entr'adresseraient", +"entr'adresserait", +"entr'adresserez", +"entr'adresseriez", +"entr'adresserions", +"entr'adresserons", +"entr'adresseront", +"entr'adressez", +"entr'adressiez", +"entr'adressions", +"entr'adressons", +"entr'adressâmes", +"entr'adressât", +"entr'adressâtes", +"entr'adressèrent", +"entr'adressé", +"entr'adressées", +"entr'adressés", +"entr'affronta", +"entr'affrontaient", +"entr'affrontait", +"entr'affrontant", +"entr'affrontassent", +"entr'affrontassiez", +"entr'affrontassions", +"entr'affronte", +"entr'affrontent", +"entr'affronter", +"entr'affrontera", +"entr'affronteraient", +"entr'affronterait", +"entr'affronterez", +"entr'affronteriez", +"entr'affronterions", +"entr'affronterons", +"entr'affronteront", +"entr'affrontez", +"entr'affrontiez", +"entr'affrontions", +"entr'affrontons", +"entr'affrontâmes", +"entr'affrontât", +"entr'affrontâtes", +"entr'affrontèrent", +"entr'affronté", +"entr'affrontées", +"entr'affrontés", +"entr'aida", +"entr'aidaient", +"entr'aidait", +"entr'aidant", +"entr'aidassent", +"entr'aidassiez", +"entr'aidassions", +"entr'aide", +"entr'aident", +"entr'aider", +"entr'aidera", +"entr'aideraient", +"entr'aiderait", +"entr'aiderez", +"entr'aideriez", +"entr'aiderions", +"entr'aiderons", +"entr'aideront", +"entr'aides", +"entr'aidez", +"entr'aidiez", +"entr'aidions", +"entr'aidons", +"entr'aidâmes", +"entr'aidât", +"entr'aidâtes", +"entr'aidèrent", +"entr'aidé", +"entr'aidées", +"entr'aidés", +"entr'aiguisa", +"entr'aiguisaient", +"entr'aiguisait", +"entr'aiguisant", +"entr'aiguisassent", +"entr'aiguisassiez", +"entr'aiguisassions", +"entr'aiguise", +"entr'aiguisent", +"entr'aiguiser", +"entr'aiguisera", +"entr'aiguiseraient", +"entr'aiguiserait", +"entr'aiguiserez", +"entr'aiguiseriez", +"entr'aiguiserions", +"entr'aiguiserons", +"entr'aiguiseront", +"entr'aiguisez", +"entr'aiguisiez", +"entr'aiguisions", +"entr'aiguisons", +"entr'aiguisâmes", +"entr'aiguisât", +"entr'aiguisâtes", +"entr'aiguisèrent", +"entr'aiguisé", +"entr'aiguisées", +"entr'aiguisés", +"entr'aima", +"entr'aimai", +"entr'aimaient", +"entr'aimais", +"entr'aimait", +"entr'aimant", +"entr'aimas", +"entr'aimasse", +"entr'aimassent", +"entr'aimasses", +"entr'aimassiez", +"entr'aimassions", +"entr'aime", +"entr'aiment", +"entr'aimer", +"entr'aimera", +"entr'aimerai", +"entr'aimeraient", +"entr'aimerais", +"entr'aimerait", +"entr'aimeras", +"entr'aimerez", +"entr'aimeriez", +"entr'aimerions", +"entr'aimerons", +"entr'aimeront", +"entr'aimes", +"entr'aimez", +"entr'aimiez", +"entr'aimions", +"entr'aimons", +"entr'aimâmes", +"entr'aimât", +"entr'aimâtes", +"entr'aimèrent", +"entr'aimé", +"entr'aimée", +"entr'aimées", +"entr'aimés", +"entr'anima", +"entr'animaient", +"entr'animait", +"entr'animant", +"entr'animassent", +"entr'animassiez", +"entr'animassions", +"entr'anime", +"entr'animent", +"entr'animer", +"entr'animera", +"entr'animeraient", +"entr'animerait", +"entr'animerez", +"entr'animeriez", +"entr'animerions", +"entr'animerons", +"entr'animeront", +"entr'animez", +"entr'animiez", +"entr'animions", +"entr'animons", +"entr'animâmes", +"entr'animât", +"entr'animâtes", +"entr'animèrent", +"entr'animé", +"entr'animées", +"entr'animés", +"entr'apercevaient", +"entr'apercevais", +"entr'apercevait", +"entr'apercevant", +"entr'apercevez", +"entr'aperceviez", +"entr'apercevions", +"entr'apercevoir", +"entr'apercevons", +"entr'apercevra", +"entr'apercevrai", +"entr'apercevraient", +"entr'apercevrais", +"entr'apercevrait", +"entr'apercevras", +"entr'apercevrez", +"entr'apercevriez", +"entr'apercevrions", +"entr'apercevrons", +"entr'apercevront", +"entr'aperçois", +"entr'aperçoit", +"entr'aperçoive", +"entr'aperçoivent", +"entr'aperçoives", +"entr'aperçu", +"entr'aperçue", +"entr'aperçues", +"entr'aperçurent", +"entr'aperçus", +"entr'aperçusse", +"entr'aperçussent", +"entr'aperçusses", +"entr'aperçussiez", +"entr'aperçussions", +"entr'aperçut", +"entr'aperçûmes", +"entr'aperçût", +"entr'aperçûtes", +"entr'apparais", +"entr'apparaissaient", +"entr'apparaissais", +"entr'apparaissait", +"entr'apparaissant", +"entr'apparaisse", +"entr'apparaissent", +"entr'apparaisses", +"entr'apparaissez", +"entr'apparaissiez", +"entr'apparaissions", +"entr'apparaissons", +"entr'apparait", +"entr'apparaitra", +"entr'apparaitrai", +"entr'apparaitraient", +"entr'apparaitrais", +"entr'apparaitrait", +"entr'apparaitras", +"entr'apparaitre", +"entr'apparaitrez", +"entr'apparaitriez", +"entr'apparaitrions", +"entr'apparaitrons", +"entr'apparaitront", +"entr'apparaît", +"entr'apparaîtra", +"entr'apparaîtrai", +"entr'apparaîtraient", +"entr'apparaîtrais", +"entr'apparaîtrait", +"entr'apparaîtras", +"entr'apparaître", +"entr'apparaîtrez", +"entr'apparaîtriez", +"entr'apparaîtrions", +"entr'apparaîtrons", +"entr'apparaîtront", +"entr'apparu", +"entr'apparue", +"entr'apparues", +"entr'apparurent", +"entr'apparus", +"entr'apparusse", +"entr'apparussent", +"entr'apparusses", +"entr'apparussiez", +"entr'apparussions", +"entr'apparut", +"entr'apparûmes", +"entr'apparût", +"entr'apparûtes", +"entr'appela", +"entr'appelaient", +"entr'appelait", +"entr'appelant", +"entr'appelassent", +"entr'appelassiez", +"entr'appelassions", +"entr'appeler", +"entr'appelez", +"entr'appeliez", +"entr'appelions", +"entr'appelle", +"entr'appellent", +"entr'appellera", +"entr'appelleraient", +"entr'appellerait", +"entr'appellerez", +"entr'appelleriez", +"entr'appellerions", +"entr'appellerons", +"entr'appelleront", +"entr'appelles", +"entr'appelons", +"entr'appelâmes", +"entr'appelât", +"entr'appelâtes", +"entr'appelèrent", +"entr'appelé", +"entr'appelées", +"entr'appelés", +"entr'apprenaient", +"entr'apprenait", +"entr'apprenant", +"entr'apprend", +"entr'apprendra", +"entr'apprendraient", +"entr'apprendrait", +"entr'apprendre", +"entr'apprendriez", +"entr'apprendrions", +"entr'apprendrons", +"entr'apprendront", +"entr'apprenez", +"entr'appreniez", +"entr'apprenions", +"entr'apprenne", +"entr'apprennent", +"entr'apprennes", +"entr'apprenons", +"entr'apprirent", +"entr'appris", +"entr'apprise", +"entr'apprises", +"entr'apprissent", +"entr'apprissiez", +"entr'apprissions", +"entr'apprit", +"entr'approcha", +"entr'approchaient", +"entr'approchait", +"entr'approchant", +"entr'approchassent", +"entr'approchassiez", +"entr'approchassions", +"entr'approche", +"entr'approchent", +"entr'approcher", +"entr'approchera", +"entr'approcheraient", +"entr'approcherait", +"entr'approcherez", +"entr'approcheriez", +"entr'approcherions", +"entr'approcherons", +"entr'approcheront", +"entr'approchez", +"entr'approchiez", +"entr'approchions", +"entr'approchons", +"entr'approchâmes", +"entr'approchât", +"entr'approchâtes", +"entr'approchèrent", +"entr'approché", +"entr'approchées", +"entr'approchés", +"entr'apprîmes", +"entr'apprît", +"entr'apprîtes", +"entr'arquebusa", +"entr'arquebusaient", +"entr'arquebusait", +"entr'arquebusant", +"entr'arquebusassent", +"entr'arquebusassiez", +"entr'arquebusassions", +"entr'arquebuse", +"entr'arquebusent", +"entr'arquebuser", +"entr'arquebusera", +"entr'arquebuseraient", +"entr'arquebuserait", +"entr'arquebuserez", +"entr'arquebuseriez", +"entr'arquebuserions", +"entr'arquebuserons", +"entr'arquebuseront", +"entr'arquebusez", +"entr'arquebusiez", +"entr'arquebusions", +"entr'arquebusons", +"entr'arquebusâmes", +"entr'arquebusât", +"entr'arquebusâtes", +"entr'arquebusèrent", +"entr'arquebusé", +"entr'arquebusées", +"entr'arquebusés", +"entr'assassina", +"entr'assassinaient", +"entr'assassinait", +"entr'assassinant", +"entr'assassinassent", +"entr'assassinassiez", +"entr'assassinassions", +"entr'assassine", +"entr'assassinent", +"entr'assassiner", +"entr'assassinera", +"entr'assassineraient", +"entr'assassinerait", +"entr'assassinerez", +"entr'assassineriez", +"entr'assassinerions", +"entr'assassinerons", +"entr'assassineront", +"entr'assassinez", +"entr'assassiniez", +"entr'assassinions", +"entr'assassinons", +"entr'assassinâmes", +"entr'assassinât", +"entr'assassinâtes", +"entr'assassinèrent", +"entr'assassiné", +"entr'assassinées", +"entr'assassinés", +"entr'assigna", +"entr'assignaient", +"entr'assignait", +"entr'assignant", +"entr'assignassent", +"entr'assignassiez", +"entr'assignassions", +"entr'assigne", +"entr'assignent", +"entr'assigner", +"entr'assignera", +"entr'assigneraient", +"entr'assignerait", +"entr'assignerez", +"entr'assigneriez", +"entr'assignerions", +"entr'assignerons", +"entr'assigneront", +"entr'assignez", +"entr'assigniez", +"entr'assignions", +"entr'assignons", +"entr'assignâmes", +"entr'assignât", +"entr'assignâtes", +"entr'assignèrent", +"entr'assigné", +"entr'assignées", +"entr'assignés", +"entr'assomma", +"entr'assommaient", +"entr'assommait", +"entr'assommant", +"entr'assommassent", +"entr'assommassiez", +"entr'assommassions", +"entr'assomme", +"entr'assomment", +"entr'assommer", +"entr'assommera", +"entr'assommeraient", +"entr'assommerait", +"entr'assommerez", +"entr'assommeriez", +"entr'assommerions", +"entr'assommerons", +"entr'assommeront", +"entr'assommez", +"entr'assommiez", +"entr'assommions", +"entr'assommons", +"entr'assommâmes", +"entr'assommât", +"entr'assommâtes", +"entr'assommèrent", +"entr'assommé", +"entr'assommées", +"entr'assommés", +"entr'attaqua", +"entr'attaquaient", +"entr'attaquait", +"entr'attaquant", +"entr'attaquassent", +"entr'attaquassiez", +"entr'attaquassions", +"entr'attaque", +"entr'attaquent", +"entr'attaquer", +"entr'attaquera", +"entr'attaqueraient", +"entr'attaquerait", +"entr'attaquerez", +"entr'attaqueriez", +"entr'attaquerions", +"entr'attaquerons", +"entr'attaqueront", +"entr'attaquez", +"entr'attaquiez", +"entr'attaquions", +"entr'attaquons", +"entr'attaquâmes", +"entr'attaquât", +"entr'attaquâtes", +"entr'attaquèrent", +"entr'attaqué", +"entr'attaquées", +"entr'attaqués", +"entr'attend", +"entr'attendaient", +"entr'attendait", +"entr'attendant", +"entr'attende", +"entr'attendent", +"entr'attendez", +"entr'attendiez", +"entr'attendions", +"entr'attendirent", +"entr'attendissent", +"entr'attendissiez", +"entr'attendissions", +"entr'attendit", +"entr'attendons", +"entr'attendra", +"entr'attendraient", +"entr'attendrait", +"entr'attendre", +"entr'attendrez", +"entr'attendriez", +"entr'attendrions", +"entr'attendrons", +"entr'attendront", +"entr'attendu", +"entr'attendue", +"entr'attendues", +"entr'attendus", +"entr'attendîmes", +"entr'attendît", +"entr'attendîtes", +"entr'autres", +"entr'averti", +"entr'averties", +"entr'avertir", +"entr'avertira", +"entr'avertiraient", +"entr'avertirait", +"entr'avertirent", +"entr'avertirez", +"entr'avertiriez", +"entr'avertirions", +"entr'avertirons", +"entr'avertiront", +"entr'avertis", +"entr'avertissaient", +"entr'avertissait", +"entr'avertissant", +"entr'avertisse", +"entr'avertissent", +"entr'avertissez", +"entr'avertissiez", +"entr'avertissions", +"entr'avertissons", +"entr'avertit", +"entr'avertîmes", +"entr'avertît", +"entr'avertîtes", +"entr'avoua", +"entr'avouaient", +"entr'avouait", +"entr'avouant", +"entr'avouassent", +"entr'avouassiez", +"entr'avouassions", +"entr'avoue", +"entr'avouent", +"entr'avouer", +"entr'avouera", +"entr'avoueraient", +"entr'avouerait", +"entr'avouerez", +"entr'avoueriez", +"entr'avouerions", +"entr'avouerons", +"entr'avoueront", +"entr'avouez", +"entr'avouiez", +"entr'avouions", +"entr'avouons", +"entr'avouâmes", +"entr'avouât", +"entr'avouâtes", +"entr'avouèrent", +"entr'avoué", +"entr'avouées", +"entr'avoués", +"entr'axe", +"entr'axes", +"entr'embarrassa", +"entr'embarrassaient", +"entr'embarrassait", +"entr'embarrassant", +"entr'embarrassassent", +"entr'embarrassassiez", +"entr'embarrassassions", +"entr'embarrasse", +"entr'embarrassent", +"entr'embarrasser", +"entr'embarrassera", +"entr'embarrasseraient", +"entr'embarrasserait", +"entr'embarrasserez", +"entr'embarrasseriez", +"entr'embarrasserions", +"entr'embarrasserons", +"entr'embarrasseront", +"entr'embarrassez", +"entr'embarrassiez", +"entr'embarrassions", +"entr'embarrassons", +"entr'embarrassâmes", +"entr'embarrassât", +"entr'embarrassâtes", +"entr'embarrassèrent", +"entr'embarrassé", +"entr'embarrassées", +"entr'embarrassés", +"entr'embrassa", +"entr'embrassaient", +"entr'embrassait", +"entr'embrassant", +"entr'embrassassent", +"entr'embrassassiez", +"entr'embrassassions", +"entr'embrasse", +"entr'embrassent", +"entr'embrasser", +"entr'embrassera", +"entr'embrasseraient", +"entr'embrasserait", +"entr'embrasserez", +"entr'embrasseriez", +"entr'embrasserions", +"entr'embrasserons", +"entr'embrasseront", +"entr'embrassez", +"entr'embrassiez", +"entr'embrassions", +"entr'embrassons", +"entr'embrassâmes", +"entr'embrassât", +"entr'embrassâtes", +"entr'embrassèrent", +"entr'embrassé", +"entr'embrassées", +"entr'embrassés", +"entr'empêcha", +"entr'empêchaient", +"entr'empêchait", +"entr'empêchant", +"entr'empêchassent", +"entr'empêchassiez", +"entr'empêchassions", +"entr'empêche", +"entr'empêchent", +"entr'empêcher", +"entr'empêchera", +"entr'empêcheraient", +"entr'empêcherait", +"entr'empêcherez", +"entr'empêcheriez", +"entr'empêcherions", +"entr'empêcherons", +"entr'empêcheront", +"entr'empêchez", +"entr'empêchiez", +"entr'empêchions", +"entr'empêchons", +"entr'empêchâmes", +"entr'empêchât", +"entr'empêchâtes", +"entr'empêchèrent", +"entr'empêché", +"entr'empêchées", +"entr'empêchés", +"entr'encourage", +"entr'encouragea", +"entr'encourageaient", +"entr'encourageait", +"entr'encourageant", +"entr'encourageassent", +"entr'encourageassiez", +"entr'encourageassions", +"entr'encouragent", +"entr'encourageons", +"entr'encourager", +"entr'encouragera", +"entr'encourageraient", +"entr'encouragerait", +"entr'encouragerez", +"entr'encourageriez", +"entr'encouragerions", +"entr'encouragerons", +"entr'encourageront", +"entr'encouragez", +"entr'encourageâmes", +"entr'encourageât", +"entr'encourageâtes", +"entr'encouragiez", +"entr'encouragions", +"entr'encouragèrent", +"entr'encouragé", +"entr'encouragées", +"entr'encouragés", +"entr'enleva", +"entr'enlevaient", +"entr'enlevait", +"entr'enlevant", +"entr'enlevassent", +"entr'enlevassiez", +"entr'enlevassions", +"entr'enlever", +"entr'enlevez", +"entr'enleviez", +"entr'enlevions", +"entr'enlevons", +"entr'enlevâmes", +"entr'enlevât", +"entr'enlevâtes", +"entr'enlevèrent", +"entr'enlevé", +"entr'enlevées", +"entr'enlevés", +"entr'enlève", +"entr'enlèvent", +"entr'enlèvera", +"entr'enlèveraient", +"entr'enlèverait", +"entr'enlèverez", +"entr'enlèveriez", +"entr'enlèverions", +"entr'enlèverons", +"entr'enlèveront", +"entr'entend", +"entr'entendaient", +"entr'entendait", +"entr'entendant", +"entr'entende", +"entr'entendent", +"entr'entendez", +"entr'entendiez", +"entr'entendions", +"entr'entendirent", +"entr'entendissent", +"entr'entendissiez", +"entr'entendissions", +"entr'entendit", +"entr'entendons", +"entr'entendra", +"entr'entendraient", +"entr'entendrait", +"entr'entendre", +"entr'entendrez", +"entr'entendriez", +"entr'entendrions", +"entr'entendrons", +"entr'entendront", +"entr'entendu", +"entr'entendue", +"entr'entendues", +"entr'entendus", +"entr'entendîmes", +"entr'entendît", +"entr'entendîtes", +"entr'enverra", +"entr'enverrai", +"entr'enverraient", +"entr'enverrais", +"entr'enverrait", +"entr'enverras", +"entr'enverrez", +"entr'enverriez", +"entr'enverrions", +"entr'enverrons", +"entr'enverront", +"entr'envoie", +"entr'envoient", +"entr'envoies", +"entr'envoya", +"entr'envoyai", +"entr'envoyaient", +"entr'envoyais", +"entr'envoyait", +"entr'envoyant", +"entr'envoyas", +"entr'envoyasse", +"entr'envoyassent", +"entr'envoyasses", +"entr'envoyassiez", +"entr'envoyassions", +"entr'envoyer", +"entr'envoyez", +"entr'envoyiez", +"entr'envoyions", +"entr'envoyons", +"entr'envoyâmes", +"entr'envoyât", +"entr'envoyâtes", +"entr'envoyèrent", +"entr'envoyé", +"entr'envoyée", +"entr'envoyées", +"entr'envoyés", +"entr'escroqua", +"entr'escroquaient", +"entr'escroquait", +"entr'escroquant", +"entr'escroquassent", +"entr'escroquassiez", +"entr'escroquassions", +"entr'escroque", +"entr'escroquent", +"entr'escroquer", +"entr'escroquera", +"entr'escroqueraient", +"entr'escroquerait", +"entr'escroquerez", +"entr'escroqueriez", +"entr'escroquerions", +"entr'escroquerons", +"entr'escroqueront", +"entr'escroquez", +"entr'escroquiez", +"entr'escroquions", +"entr'escroquons", +"entr'escroquâmes", +"entr'escroquât", +"entr'escroquâtes", +"entr'escroquèrent", +"entr'escroqué", +"entr'escroquées", +"entr'escroqués", +"entr'eux", +"entr'excita", +"entr'excitaient", +"entr'excitait", +"entr'excitant", +"entr'excitassent", +"entr'excitassiez", +"entr'excitassions", +"entr'excite", +"entr'excitent", +"entr'exciter", +"entr'excitera", +"entr'exciteraient", +"entr'exciterait", +"entr'exciterez", +"entr'exciteriez", +"entr'exciterions", +"entr'exciterons", +"entr'exciteront", +"entr'excitez", +"entr'excitiez", +"entr'excitions", +"entr'excitons", +"entr'excitâmes", +"entr'excitât", +"entr'excitâtes", +"entr'excitèrent", +"entr'excité", +"entr'excitées", +"entr'excités", +"entr'exhorta", +"entr'exhortaient", +"entr'exhortait", +"entr'exhortant", +"entr'exhortassent", +"entr'exhortassiez", +"entr'exhortassions", +"entr'exhorte", +"entr'exhortent", +"entr'exhorter", +"entr'exhortera", +"entr'exhorteraient", +"entr'exhorterait", +"entr'exhorterez", +"entr'exhorteriez", +"entr'exhorterions", +"entr'exhorterons", +"entr'exhorteront", +"entr'exhortez", +"entr'exhortiez", +"entr'exhortions", +"entr'exhortons", +"entr'exhortâmes", +"entr'exhortât", +"entr'exhortâtes", +"entr'exhortèrent", +"entr'exhorté", +"entr'exhortées", +"entr'exhortés", +"entr'hiver", +"entr'hiverna", +"entr'hivernai", +"entr'hivernaient", +"entr'hivernais", +"entr'hivernait", +"entr'hivernant", +"entr'hivernas", +"entr'hivernasse", +"entr'hivernassent", +"entr'hivernasses", +"entr'hivernassiez", +"entr'hivernassions", +"entr'hiverne", +"entr'hivernent", +"entr'hiverner", +"entr'hivernera", +"entr'hivernerai", +"entr'hiverneraient", +"entr'hivernerais", +"entr'hivernerait", +"entr'hiverneras", +"entr'hivernerez", +"entr'hiverneriez", +"entr'hivernerions", +"entr'hivernerons", +"entr'hiverneront", +"entr'hivernes", +"entr'hivernez", +"entr'hiverniez", +"entr'hivernions", +"entr'hivernons", +"entr'hivernâmes", +"entr'hivernât", +"entr'hivernâtes", +"entr'hivernèrent", +"entr'hiverné", +"entr'hivernée", +"entr'hivernées", +"entr'hivernés", +"entr'honora", +"entr'honoraient", +"entr'honorait", +"entr'honorant", +"entr'honorassent", +"entr'honorassiez", +"entr'honorassions", +"entr'honore", +"entr'honorent", +"entr'honorer", +"entr'honorera", +"entr'honoreraient", +"entr'honorerait", +"entr'honorerez", +"entr'honoreriez", +"entr'honorerions", +"entr'honorerons", +"entr'honoreront", +"entr'honorez", +"entr'honoriez", +"entr'honorions", +"entr'honorons", +"entr'honorâmes", +"entr'honorât", +"entr'honorâtes", +"entr'honorèrent", +"entr'honoré", +"entr'honorées", +"entr'honorés", +"entr'immola", +"entr'immolaient", +"entr'immolait", +"entr'immolant", +"entr'immolassent", +"entr'immolassiez", +"entr'immolassions", +"entr'immole", +"entr'immolent", +"entr'immoler", +"entr'immolera", +"entr'immoleraient", +"entr'immolerait", +"entr'immolerez", +"entr'immoleriez", +"entr'immolerions", +"entr'immolerons", +"entr'immoleront", +"entr'immolez", +"entr'immoliez", +"entr'immolions", +"entr'immolons", +"entr'immolâmes", +"entr'immolât", +"entr'immolâtes", +"entr'immolèrent", +"entr'immolé", +"entr'immolées", +"entr'immolés", +"entr'incommoda", +"entr'incommodaient", +"entr'incommodait", +"entr'incommodant", +"entr'incommodassent", +"entr'incommodassiez", +"entr'incommodassions", +"entr'incommode", +"entr'incommodent", +"entr'incommoder", +"entr'incommodera", +"entr'incommoderaient", +"entr'incommoderait", +"entr'incommoderez", +"entr'incommoderiez", +"entr'incommoderions", +"entr'incommoderons", +"entr'incommoderont", +"entr'incommodez", +"entr'incommodiez", +"entr'incommodions", +"entr'incommodons", +"entr'incommodâmes", +"entr'incommodât", +"entr'incommodâtes", +"entr'incommodèrent", +"entr'incommodé", +"entr'incommodées", +"entr'incommodés", +"entr'injuria", +"entr'injuriaient", +"entr'injuriait", +"entr'injuriant", +"entr'injuriassent", +"entr'injuriassiez", +"entr'injuriassions", +"entr'injurie", +"entr'injurient", +"entr'injurier", +"entr'injuriera", +"entr'injurieraient", +"entr'injurierait", +"entr'injurierez", +"entr'injurieriez", +"entr'injurierions", +"entr'injurierons", +"entr'injurieront", +"entr'injuriez", +"entr'injuriiez", +"entr'injuriions", +"entr'injurions", +"entr'injuriâmes", +"entr'injuriât", +"entr'injuriâtes", +"entr'injurièrent", +"entr'injurié", +"entr'injuriées", +"entr'injuriés", +"entr'instruira", +"entr'instruiraient", +"entr'instruirait", +"entr'instruire", +"entr'instruirez", +"entr'instruiriez", +"entr'instruirions", +"entr'instruirons", +"entr'instruiront", +"entr'instruisaient", +"entr'instruisait", +"entr'instruisant", +"entr'instruise", +"entr'instruisent", +"entr'instruisez", +"entr'instruisiez", +"entr'instruisions", +"entr'instruisirent", +"entr'instruisissent", +"entr'instruisissions", +"entr'instruisit", +"entr'instruisons", +"entr'instruisîmes", +"entr'instruisît", +"entr'instruisîtes", +"entr'instruit", +"entr'instruite", +"entr'instruites", +"entr'instruits", +"entr'oblige", +"entr'obligea", +"entr'obligeaient", +"entr'obligeait", +"entr'obligeant", +"entr'obligeassent", +"entr'obligeassiez", +"entr'obligeassions", +"entr'obligent", +"entr'obligeons", +"entr'obliger", +"entr'obligera", +"entr'obligeraient", +"entr'obligerait", +"entr'obligerez", +"entr'obligeriez", +"entr'obligerions", +"entr'obligerons", +"entr'obligeront", +"entr'obligez", +"entr'obligeâmes", +"entr'obligeât", +"entr'obligeâtes", +"entr'obligiez", +"entr'obligions", +"entr'obligèrent", +"entr'obligé", +"entr'obligées", +"entr'obligés", +"entr'offensa", +"entr'offensaient", +"entr'offensait", +"entr'offensant", +"entr'offensassent", +"entr'offensassiez", +"entr'offensassions", +"entr'offense", +"entr'offensent", +"entr'offenser", +"entr'offensera", +"entr'offenseraient", +"entr'offenserait", +"entr'offenserez", +"entr'offenseriez", +"entr'offenserions", +"entr'offenserons", +"entr'offenseront", +"entr'offensez", +"entr'offensiez", +"entr'offensions", +"entr'offensons", +"entr'offensâmes", +"entr'offensât", +"entr'offensâtes", +"entr'offensèrent", +"entr'offensé", +"entr'offensées", +"entr'offensés", +"entr'oie", +"entr'oient", +"entr'oies", +"entr'ois", +"entr'oit", +"entr'ombrage", +"entr'ombragea", +"entr'ombrageaient", +"entr'ombrageait", +"entr'ombrageant", +"entr'ombrageassent", +"entr'ombrageassiez", +"entr'ombrageassions", +"entr'ombragent", +"entr'ombrageons", +"entr'ombrager", +"entr'ombragera", +"entr'ombrageraient", +"entr'ombragerait", +"entr'ombragerez", +"entr'ombrageriez", +"entr'ombragerions", +"entr'ombragerons", +"entr'ombrageront", +"entr'ombragez", +"entr'ombrageâmes", +"entr'ombrageât", +"entr'ombrageâtes", +"entr'ombragiez", +"entr'ombragions", +"entr'ombragèrent", +"entr'ombragé", +"entr'ombragées", +"entr'ombragés", +"entr'opercule", +"entr'orraient", +"entr'orrais", +"entr'orrait", +"entr'orriez", +"entr'orrions", +"entr'oublia", +"entr'oubliaient", +"entr'oubliait", +"entr'oubliant", +"entr'oubliassent", +"entr'oubliassiez", +"entr'oubliassions", +"entr'oublie", +"entr'oublient", +"entr'oublier", +"entr'oubliera", +"entr'oublieraient", +"entr'oublierait", +"entr'oublierez", +"entr'oublieriez", +"entr'oublierions", +"entr'oublierons", +"entr'oublieront", +"entr'oubliez", +"entr'oubliiez", +"entr'oubliions", +"entr'oublions", +"entr'oubliâmes", +"entr'oubliât", +"entr'oubliâtes", +"entr'oublièrent", +"entr'oublié", +"entr'oubliées", +"entr'oubliés", +"entr'outrage", +"entr'outragea", +"entr'outrageaient", +"entr'outrageait", +"entr'outrageant", +"entr'outrageassent", +"entr'outrageassiez", +"entr'outrageassions", +"entr'outragent", +"entr'outrageons", +"entr'outrager", +"entr'outragera", +"entr'outrageraient", +"entr'outragerait", +"entr'outragerez", +"entr'outrageriez", +"entr'outragerions", +"entr'outragerons", +"entr'outrageront", +"entr'outragez", +"entr'outrageâmes", +"entr'outrageât", +"entr'outrageâtes", +"entr'outragiez", +"entr'outragions", +"entr'outragèrent", +"entr'outragé", +"entr'outragées", +"entr'outragés", +"entr'ouvert", +"entr'ouverte", +"entr'ouvertes", +"entr'ouverts", +"entr'ouverture", +"entr'ouvraient", +"entr'ouvrais", +"entr'ouvrait", +"entr'ouvrant", +"entr'ouvre", +"entr'ouvrent", +"entr'ouvres", +"entr'ouvrez", +"entr'ouvriez", +"entr'ouvrions", +"entr'ouvrir", +"entr'ouvrira", +"entr'ouvrirai", +"entr'ouvriraient", +"entr'ouvrirais", +"entr'ouvrirait", +"entr'ouvriras", +"entr'ouvrirent", +"entr'ouvrirez", +"entr'ouvririez", +"entr'ouvririons", +"entr'ouvrirons", +"entr'ouvriront", +"entr'ouvris", +"entr'ouvrisse", +"entr'ouvrissent", +"entr'ouvrisses", +"entr'ouvrissiez", +"entr'ouvrissions", +"entr'ouvrit", +"entr'ouvrons", +"entr'ouvrîmes", +"entr'ouvrît", +"entr'ouvrîtes", +"entr'ouï", +"entr'ouïe", +"entr'ouïes", +"entr'ouïmes", +"entr'ouïr", +"entr'ouïra", +"entr'ouïrai", +"entr'ouïraient", +"entr'ouïrais", +"entr'ouïrait", +"entr'ouïras", +"entr'ouïrent", +"entr'ouïrez", +"entr'ouïriez", +"entr'ouïrions", +"entr'ouïrons", +"entr'ouïront", +"entr'ouïs", +"entr'ouïsse", +"entr'ouïssent", +"entr'ouïsses", +"entr'ouïssiez", +"entr'ouïssions", +"entr'ouït", +"entr'ouïtes", +"entr'oyaient", +"entr'oyais", +"entr'oyait", +"entr'oyant", +"entr'oyez", +"entr'oyiez", +"entr'oyions", +"entr'oyons", +"entr'usa", +"entr'usaient", +"entr'usait", +"entr'usant", +"entr'usassent", +"entr'usassiez", +"entr'usassions", +"entr'use", +"entr'usent", +"entr'user", +"entr'usera", +"entr'useraient", +"entr'userait", +"entr'userez", +"entr'useriez", +"entr'userions", +"entr'userons", +"entr'useront", +"entr'usez", +"entr'usiez", +"entr'usions", +"entr'usons", +"entr'usâmes", +"entr'usât", +"entr'usâtes", +"entr'usèrent", +"entr'usé", +"entr'usées", +"entr'usés", +"entr'ébranla", +"entr'ébranlaient", +"entr'ébranlait", +"entr'ébranlant", +"entr'ébranlassent", +"entr'ébranlassiez", +"entr'ébranlassions", +"entr'ébranle", +"entr'ébranlent", +"entr'ébranler", +"entr'ébranlera", +"entr'ébranleraient", +"entr'ébranlerait", +"entr'ébranlerez", +"entr'ébranleriez", +"entr'ébranlerions", +"entr'ébranlerons", +"entr'ébranleront", +"entr'ébranlez", +"entr'ébranliez", +"entr'ébranlions", +"entr'ébranlons", +"entr'ébranlâmes", +"entr'ébranlât", +"entr'ébranlâtes", +"entr'ébranlèrent", +"entr'ébranlé", +"entr'ébranlées", +"entr'ébranlés", +"entr'éclairci", +"entr'éclaircies", +"entr'éclaircir", +"entr'éclaircira", +"entr'éclairciraient", +"entr'éclaircirait", +"entr'éclaircirent", +"entr'éclaircirez", +"entr'éclairciriez", +"entr'éclaircirions", +"entr'éclaircirons", +"entr'éclairciront", +"entr'éclaircis", +"entr'éclaircissaient", +"entr'éclaircissait", +"entr'éclaircissant", +"entr'éclaircisse", +"entr'éclaircissent", +"entr'éclaircissez", +"entr'éclaircissiez", +"entr'éclaircissions", +"entr'éclaircissons", +"entr'éclaircit", +"entr'éclaircîmes", +"entr'éclaircît", +"entr'éclaircîtes", +"entr'éclore", +"entr'éclose", +"entr'écouta", +"entr'écoutaient", +"entr'écoutait", +"entr'écoutant", +"entr'écoutassent", +"entr'écoutassiez", +"entr'écoutassions", +"entr'écoute", +"entr'écoutent", +"entr'écouter", +"entr'écoutera", +"entr'écouteraient", +"entr'écouterait", +"entr'écouterez", +"entr'écouteriez", +"entr'écouterions", +"entr'écouterons", +"entr'écouteront", +"entr'écoutez", +"entr'écoutiez", +"entr'écoutions", +"entr'écoutons", +"entr'écoutâmes", +"entr'écoutât", +"entr'écoutâtes", +"entr'écoutèrent", +"entr'écouté", +"entr'écoutées", +"entr'écoutés", +"entr'écrasa", +"entr'écrasai", +"entr'écrasaient", +"entr'écrasais", +"entr'écrasait", +"entr'écrasant", +"entr'écrasas", +"entr'écrasasse", +"entr'écrasassent", +"entr'écrasasses", +"entr'écrasassiez", +"entr'écrasassions", +"entr'écrase", +"entr'écrasent", +"entr'écraser", +"entr'écrasera", +"entr'écraserai", +"entr'écraseraient", +"entr'écraserais", +"entr'écraserait", +"entr'écraseras", +"entr'écraserez", +"entr'écraseriez", +"entr'écraserions", +"entr'écraserons", +"entr'écraseront", +"entr'écrases", +"entr'écrasez", +"entr'écrasiez", +"entr'écrasions", +"entr'écrasons", +"entr'écrasâmes", +"entr'écrasât", +"entr'écrasâtes", +"entr'écrasèrent", +"entr'écrasé", +"entr'écrasée", +"entr'écrasées", +"entr'écrasés", +"entr'écrira", +"entr'écriraient", +"entr'écrirait", +"entr'écrire", +"entr'écrirez", +"entr'écririez", +"entr'écririons", +"entr'écrirons", +"entr'écriront", +"entr'écrit", +"entr'écrite", +"entr'écrites", +"entr'écrits", +"entr'écrivaient", +"entr'écrivait", +"entr'écrivant", +"entr'écrive", +"entr'écrivent", +"entr'écrivez", +"entr'écriviez", +"entr'écrivions", +"entr'écrivirent", +"entr'écrivissent", +"entr'écrivissions", +"entr'écrivit", +"entr'écrivons", +"entr'écrivîmes", +"entr'écrivît", +"entr'écrivîtes", +"entr'égorge", +"entr'égorgea", +"entr'égorgeai", +"entr'égorgeaient", +"entr'égorgeait", +"entr'égorgeant", +"entr'égorgeassent", +"entr'égorgeassiez", +"entr'égorgeassions", +"entr'égorgemens", +"entr'égorgement", +"entr'égorgements", +"entr'égorgent", +"entr'égorgeons", +"entr'égorger", +"entr'égorgera", +"entr'égorgeraient", +"entr'égorgerait", +"entr'égorgerez", +"entr'égorgeriez", +"entr'égorgerions", +"entr'égorgerons", +"entr'égorgeront", +"entr'égorges", +"entr'égorgez", +"entr'égorgeâmes", +"entr'égorgeât", +"entr'égorgeâtes", +"entr'égorgiez", +"entr'égorgions", +"entr'égorgèrent", +"entr'égorgé", +"entr'égorgée", +"entr'égorgées", +"entr'égorgés", +"entr'égratigna", +"entr'égratignaient", +"entr'égratignait", +"entr'égratignant", +"entr'égratignassent", +"entr'égratignassiez", +"entr'égratignassions", +"entr'égratigne", +"entr'égratignent", +"entr'égratigner", +"entr'égratignera", +"entr'égratigneraient", +"entr'égratignerait", +"entr'égratignerez", +"entr'égratigneriez", +"entr'égratignerions", +"entr'égratignerons", +"entr'égratigneront", +"entr'égratignez", +"entr'égratigniez", +"entr'égratignions", +"entr'égratignons", +"entr'égratignâmes", +"entr'égratignât", +"entr'égratignâtes", +"entr'égratignèrent", +"entr'égratigné", +"entr'égratignées", +"entr'égratignés", +"entr'épia", +"entr'épiaient", +"entr'épiait", +"entr'épiant", +"entr'épiassent", +"entr'épiassiez", +"entr'épiassions", +"entr'épie", +"entr'épient", +"entr'épier", +"entr'épiera", +"entr'épieraient", +"entr'épierait", +"entr'épierez", +"entr'épieriez", +"entr'épierions", +"entr'épierons", +"entr'épieront", +"entr'épiez", +"entr'épiiez", +"entr'épiions", +"entr'épions", +"entr'épiâmes", +"entr'épiât", +"entr'épiâtes", +"entr'épièrent", +"entr'épié", +"entr'épiées", +"entr'épiés", +"entr'éprouva", +"entr'éprouvaient", +"entr'éprouvait", +"entr'éprouvant", +"entr'éprouvassent", +"entr'éprouvassiez", +"entr'éprouvassions", +"entr'éprouve", +"entr'éprouvent", +"entr'éprouver", +"entr'éprouvera", +"entr'éprouveraient", +"entr'éprouverait", +"entr'éprouverez", +"entr'éprouveriez", +"entr'éprouverions", +"entr'éprouverons", +"entr'éprouveront", +"entr'éprouvez", +"entr'éprouviez", +"entr'éprouvions", +"entr'éprouvons", +"entr'éprouvâmes", +"entr'éprouvât", +"entr'éprouvâtes", +"entr'éprouvèrent", +"entr'éprouvé", +"entr'éprouvées", +"entr'éprouvés", +"entr'étouffa", +"entr'étouffaient", +"entr'étouffait", +"entr'étouffant", +"entr'étouffassent", +"entr'étouffassiez", +"entr'étouffassions", +"entr'étouffe", +"entr'étouffent", +"entr'étouffer", +"entr'étouffera", +"entr'étoufferaient", +"entr'étoufferait", +"entr'étoufferez", +"entr'étoufferiez", +"entr'étoufferions", +"entr'étoufferons", +"entr'étoufferont", +"entr'étouffez", +"entr'étouffiez", +"entr'étouffions", +"entr'étouffons", +"entr'étouffâmes", +"entr'étouffât", +"entr'étouffâtes", +"entr'étouffèrent", +"entr'étouffé", +"entr'étouffées", +"entr'étouffés", +"entr'étripa", +"entr'étripaient", +"entr'étripait", +"entr'étripant", +"entr'étripassent", +"entr'étripassiez", +"entr'étripassions", +"entr'étripe", +"entr'étripent", +"entr'étriper", +"entr'étripera", +"entr'étriperaient", +"entr'étriperait", +"entr'étriperez", +"entr'étriperiez", +"entr'étriperions", +"entr'étriperons", +"entr'étriperont", +"entr'étripez", +"entr'étripiez", +"entr'étripions", +"entr'étripons", +"entr'étripâmes", +"entr'étripât", +"entr'étripâtes", +"entr'étripèrent", +"entr'étripé", +"entr'étripées", +"entr'étripés", +"entr'éveilla", +"entr'éveillaient", +"entr'éveillait", +"entr'éveillant", +"entr'éveillassent", +"entr'éveillassiez", +"entr'éveillassions", +"entr'éveille", +"entr'éveillent", +"entr'éveiller", +"entr'éveillera", +"entr'éveilleraient", +"entr'éveillerait", +"entr'éveillerez", +"entr'éveilleriez", +"entr'éveillerions", +"entr'éveillerons", +"entr'éveilleront", +"entr'éveillez", +"entr'éveilliez", +"entr'éveillions", +"entr'éveillons", +"entr'éveillâmes", +"entr'éveillât", +"entr'éveillâtes", +"entr'éveillèrent", +"entr'éveillé", +"entr'éveillées", +"entr'éveillés", +"entrer-coucher", +"entrée-sortie", +"entrées-sorties", +"entéro-colite", +"entéro-colites", +"entéro-cystocèle", +"entéro-hydrocèle", +"entéro-hydromphale", +"entéro-hémorrhagie", +"entéro-mérocèle", +"entéro-mésentérite", +"entéro-pneumatose", +"entéro-rénal", +"entéro-rénale", +"entéro-rénales", +"entéro-rénaux", +"entéro-sarcocèle", +"entéro-sarcocèles", +"entéro-sténose", +"entéro-sténoses", +"entéro-épiplocèle", +"entéro-épiplocèles", +"ep's", +"eskimau-aléoute", +"eskimo-aléoute", +"eskimo-aléoutes", +"espace-boutique", +"espace-temps", +"espace-vente", +"espaces-temps", +"espaces-ventes", +"espadon-voilier", +"esprit-de-bois", +"esprit-de-sel", +"esprit-de-vin", +"esprit-fort", +"esprits-forts", +"esquimau-aléoute", +"esquimo-aléoute", +"essert-romanais", +"essert-romanaise", +"essert-romanaises", +"essuie-glace", +"essuie-glaces", +"essuie-main", +"essuie-mains", +"essuie-meuble", +"essuie-meubles", +"essuie-phare", +"essuie-phares", +"essuie-pied", +"essuie-pieds", +"essuie-plume", +"essuie-plumes", +"essuie-tout", +"essuie-touts", +"essuie-verre", +"essuie-verres", +"estrée-blanchois", +"estrée-blanchoise", +"estrée-blanchoises", +"estrée-cauchois", +"estrée-cauchoise", +"estrée-cauchoises", +"estrée-waminois", +"estrée-waminoise", +"estrée-waminoises", +"ethnico-religieux", +"euro-africain", +"euro-africaines", +"euro-asiatique", +"euro-asiatiques", +"euro-bashing", +"euro-manifestation", +"euro-manifestations", +"euro-obligation", +"euro-obligations", +"eusses-tu-cru", +"eux-mêmes", +"ex-Zaïre", +"ex-aequo", +"ex-ante", +"ex-champions", +"ex-copains", +"ex-député", +"ex-députée", +"ex-députées", +"ex-députés", +"ex-femme", +"ex-femmes", +"ex-fumeur", +"ex-fumeurs", +"ex-libris", +"ex-mari", +"ex-maris", +"ex-petits", +"ex-présidents", +"ex-sacs", +"ex-sergents", +"ex-serviteurs", +"ex-soldats", +"ex-strip-teaseuse", +"ex-voto", +"ex-votos", +"ex-æquo", +"exa-ampère", +"exa-ampères", +"exa-octet", +"exa-octets", +"exa-électron-volt", +"exa-électron-volts", +"exaélectron-volt", +"exaélectron-volts", +"excito-nervin", +"excito-nervine", +"excito-nervines", +"excito-nervins", +"excusez-moi", +"exo-noyau", +"exo-noyaux", +"expert-comptable", +"extracto-chargeur", +"extracto-chargeurs", +"extracto-résine", +"extracto-résineux", +"extro-déterminé", +"extrêmes-droites", +"extrêmes-gauches", +"extrêmes-onctions", +"eye-liner", +"eye-liners", +"f'jer", +"f'jers", +"f'nêtre", +"f'nêtres", +"fac-simila", +"fac-similai", +"fac-similaient", +"fac-similaire", +"fac-similais", +"fac-similait", +"fac-similant", +"fac-similas", +"fac-similasse", +"fac-similassent", +"fac-similasses", +"fac-similassiez", +"fac-similassions", +"fac-simile", +"fac-similent", +"fac-similer", +"fac-similera", +"fac-similerai", +"fac-simileraient", +"fac-similerais", +"fac-similerait", +"fac-simileras", +"fac-similerez", +"fac-simileriez", +"fac-similerions", +"fac-similerons", +"fac-simileront", +"fac-similes", +"fac-similez", +"fac-similiez", +"fac-similions", +"fac-similons", +"fac-similâmes", +"fac-similât", +"fac-similâtes", +"fac-similèrent", +"fac-similé", +"fac-similée", +"fac-similées", +"fac-similés", +"face-B", +"face-kini", +"face-kinis", +"face-sitting", +"face-sittings", +"face-à-face", +"face-à-main", +"faces-B", +"faces-à-main", +"faches-thumesnilois", +"faches-thumesniloise", +"faches-thumesniloises", +"faim-valle", +"fair-play", +"fair-plays", +"faire-part", +"faire-savoir", +"faire-valoir", +"fait-divers", +"fait-diversier", +"fait-diversiers", +"fait-main", +"fait-tout", +"fait-à-fait", +"faits-divers", +"faits-diversier", +"faits-diversiers", +"fan-club", +"fan-clubs", +"fancy-fair", +"fancy-fairs", +"farcy-pontain", +"farcy-pontaine", +"farcy-pontaines", +"farcy-pontains", +"fast-food", +"fast-foods", +"fausse-braie", +"fausse-couche", +"fausse-limande", +"fausse-monnayeuse", +"fausse-porte", +"fausses-braies", +"fausses-couches", +"fausses-monnayeuses", +"faux-acacia", +"faux-acacias", +"faux-ami", +"faux-amis", +"faux-bourdon", +"faux-bourdons", +"faux-bras", +"faux-carré", +"faux-carrés", +"faux-champlevé", +"faux-col", +"faux-cols", +"faux-cul", +"faux-derche", +"faux-derches", +"faux-filet", +"faux-filets", +"faux-frais", +"faux-fruit", +"faux-fruits", +"faux-frère", +"faux-frères", +"faux-fuyans", +"faux-fuyant", +"faux-fuyants", +"faux-garou", +"faux-grenier", +"faux-greniers", +"faux-jeton", +"faux-jetons", +"faux-monnayage", +"faux-monnayages", +"faux-monnayeur", +"faux-monnayeurs", +"faux-nez", +"faux-palais", +"faux-persil", +"faux-poivrier", +"faux-poivriers", +"faux-pont", +"faux-ponts", +"faux-positif", +"faux-positifs", +"faux-saunage", +"faux-saunier", +"faux-sauniers", +"faux-saunière", +"faux-saunières", +"faux-scaphirhynque", +"faux-semblans", +"faux-semblant", +"faux-semblants", +"faux-sens", +"faux-vampire", +"faux-vampires", +"faux-vin", +"fax-tractage", +"fax-tractages", +"fayl-billotin", +"fayl-billotine", +"fayl-billotines", +"fayl-billotins", +"fech-fech", +"feed-back", +"femelle-stérile", +"femelle-stériles", +"femme-enfant", +"femme-objet", +"femme-orchestre", +"femme-renarde", +"femmes-enfants", +"femmes-orchestres", +"femmes-renardes", +"femto-ohm", +"femto-ohms", +"fer-blanc", +"fer-chaud", +"fer-de-lance", +"fer-de-moulin", +"fer-à-cheval", +"ferme-bourse", +"ferme-circuit", +"ferme-circuits", +"ferme-porte", +"ferme-portes", +"fermes-hôtels", +"fermier-général", +"ferrando-forézienne", +"ferre-mule", +"ferro-axinite", +"ferro-axinites", +"ferro-magnésien", +"ferro-magnétisme", +"ferro-magnétismes", +"ferro-phlogopite", +"ferro-phlogopites", +"ferro-prussiate", +"ferro-prussiates", +"ferry-boat", +"ferry-boats", +"fers-blancs", +"fers-de-lance", +"fers-à-cheval", +"fesh-fesh", +"fesse-cahier", +"fesse-mathieu", +"fesse-mathieus", +"fesse-mathieux", +"fesse-tonneau", +"fesse-tonneaux", +"fest-deiz", +"fest-noz", +"fest-nozs", +"feuille-caillou-ciseaux", +"feuille-morte", +"fibre-cellule", +"fibro-cartilage", +"fibro-cellulaire", +"fibro-cystique", +"fibro-cystiques", +"fibro-granulaire", +"fibro-muqueux", +"fibro-soyeux", +"fibro-séreux", +"fiche-échalas", +"fiducie-sûreté", +"fie-vïnnamide", +"fie-vïnnamides", +"fier-à-bras", +"fiers-à-bras", +"fifty-fifty", +"figuier-mûrier", +"filet-poubelle", +"filets-poubelles", +"fille-mère", +"filles-mères", +"film-fleuve", +"films-annonces", +"fils-de-puterie", +"filtre-presse", +"filtres-presses", +"fin-or", +"fine-metal", +"finno-ougrien", +"finno-ougrienne", +"finno-ougriennes", +"finno-ougriens", +"first-fit", +"fisse-larron", +"fisses-larrons", +"fist-fucking", +"fist-fuckings", +"fitz-jamois", +"fitz-jamoise", +"fitz-jamoises", +"fix-up", +"fixe-chaussette", +"fixe-chaussettes", +"fixe-fruit", +"fixe-fruits", +"fixe-longe", +"fixe-moustaches", +"fixe-ruban", +"fixe-rubans", +"fla-fla", +"fla-flas", +"flanc-de-chien", +"flanc-garde", +"flanc-gardes", +"flanc-mou", +"flancs-de-chien", +"flancs-gardes", +"flancs-mous", +"flash-back", +"flash-ball", +"flash-balls", +"flash-mob", +"flash-mobs", +"fleur-bleuisa", +"fleur-bleuisai", +"fleur-bleuisaient", +"fleur-bleuisais", +"fleur-bleuisait", +"fleur-bleuisant", +"fleur-bleuisas", +"fleur-bleuisasse", +"fleur-bleuisassent", +"fleur-bleuisasses", +"fleur-bleuisassiez", +"fleur-bleuisassions", +"fleur-bleuise", +"fleur-bleuisent", +"fleur-bleuiser", +"fleur-bleuisera", +"fleur-bleuiserai", +"fleur-bleuiseraient", +"fleur-bleuiserais", +"fleur-bleuiserait", +"fleur-bleuiseras", +"fleur-bleuiserez", +"fleur-bleuiseriez", +"fleur-bleuiserions", +"fleur-bleuiserons", +"fleur-bleuiseront", +"fleur-bleuises", +"fleur-bleuisez", +"fleur-bleuisiez", +"fleur-bleuisions", +"fleur-bleuisons", +"fleur-bleuisâmes", +"fleur-bleuisât", +"fleur-bleuisâtes", +"fleur-bleuisèrent", +"fleur-bleuisé", +"fleur-bleuisée", +"fleur-bleuisées", +"fleur-bleuisés", +"fleur-de-mai", +"fleur-feuille", +"flic-flac", +"flic-flaqua", +"flic-flaquai", +"flic-flaquaient", +"flic-flaquais", +"flic-flaquait", +"flic-flaquant", +"flic-flaquas", +"flic-flaquasse", +"flic-flaquassent", +"flic-flaquasses", +"flic-flaquassiez", +"flic-flaquassions", +"flic-flaque", +"flic-flaquent", +"flic-flaquer", +"flic-flaquera", +"flic-flaquerai", +"flic-flaqueraient", +"flic-flaquerais", +"flic-flaquerait", +"flic-flaqueras", +"flic-flaquerez", +"flic-flaqueriez", +"flic-flaquerions", +"flic-flaquerons", +"flic-flaqueront", +"flic-flaques", +"flic-flaquez", +"flic-flaquiez", +"flic-flaquions", +"flic-flaquons", +"flic-flaquâmes", +"flic-flaquât", +"flic-flaquâtes", +"flic-flaquèrent", +"flic-flaqué", +"flint-glass", +"flip-flap", +"flirty-fishing", +"float-tube", +"float-tubes", +"flos-ferri", +"flos-ferré", +"flotte-tube", +"flotte-tubes", +"flou-flou", +"fluazifop-P-butyl", +"fluazifop-butyl", +"fluoro-phlogopite", +"fluoro-phlogopites", +"flupyrsulfuron-méthyle", +"fluroxypyr-meptyl", +"fluvio-marin", +"fly-over", +"fly-overs", +"fly-tox", +"foc-en-l'air", +"foi-menti", +"foi-mentie", +"foie-de-boeuf", +"foies-de-boeuf", +"foire-exposition", +"foires-expositions", +"folk-lore", +"folk-lores", +"folle-avoine", +"folle-blanche", +"folle-verte", +"folles-avoines", +"folx-les-cavien", +"fon-gbe", +"fond-de-teinta", +"fond-de-teintai", +"fond-de-teintaient", +"fond-de-teintais", +"fond-de-teintait", +"fond-de-teintant", +"fond-de-teintas", +"fond-de-teintasse", +"fond-de-teintassent", +"fond-de-teintasses", +"fond-de-teintassiez", +"fond-de-teintassions", +"fond-de-teinte", +"fond-de-teintent", +"fond-de-teinter", +"fond-de-teintera", +"fond-de-teinterai", +"fond-de-teinteraient", +"fond-de-teinterais", +"fond-de-teinterait", +"fond-de-teinteras", +"fond-de-teinterez", +"fond-de-teinteriez", +"fond-de-teinterions", +"fond-de-teinterons", +"fond-de-teinteront", +"fond-de-teintes", +"fond-de-teintez", +"fond-de-teintiez", +"fond-de-teintions", +"fond-de-teintons", +"fond-de-teintâmes", +"fond-de-teintât", +"fond-de-teintâtes", +"fond-de-teintèrent", +"fond-de-teinté", +"fond-de-teintée", +"fond-de-teintées", +"fond-de-teintés", +"fontaine-brayen", +"fontaine-brayenne", +"fontaine-brayennes", +"fontaine-brayens", +"food-court", +"food-courts", +"food-truck", +"food-trucks", +"force-vivier", +"forge-mètre", +"formica-leo", +"formule-choc", +"formule-chocs", +"forsétyl-al", +"forte-piano", +"forte-pianos", +"forts-vêtu", +"forêt-clairière", +"forêt-climax", +"forêt-galerie", +"forêt-parc", +"forêts-clairières", +"forêts-climax", +"forêts-galeries", +"forêts-parcs", +"fosétyl-Al", +"fouette-cul", +"fouette-culs", +"fouette-queue", +"fouette-queues", +"fougère-aigle", +"fougères-aigles", +"fouille-au-pot", +"fouille-merde", +"foule-crapaud", +"fourche-fière", +"fourmi-lion", +"fourmis-lions", +"fourre-tout", +"foué-toutrac", +"foué-toutracs", +"fox-hound", +"fox-hounds", +"fox-terrier", +"fox-terriers", +"fox-trot", +"fox-trott", +"fox-trotta", +"fox-trottai", +"fox-trottaient", +"fox-trottais", +"fox-trottait", +"fox-trottant", +"fox-trottas", +"fox-trottasse", +"fox-trottassent", +"fox-trottasses", +"fox-trottassiez", +"fox-trottassions", +"fox-trotte", +"fox-trottent", +"fox-trotter", +"fox-trottera", +"fox-trotterai", +"fox-trotteraient", +"fox-trotterais", +"fox-trotterait", +"fox-trotteras", +"fox-trotterez", +"fox-trotteriez", +"fox-trotterions", +"fox-trotterons", +"fox-trotteront", +"fox-trottes", +"fox-trottez", +"fox-trottiez", +"fox-trottions", +"fox-trottons", +"fox-trotts", +"fox-trottâmes", +"fox-trottât", +"fox-trottâtes", +"fox-trottèrent", +"fox-trotté", +"foy-notre-damien", +"frais-chier", +"frappe-abord", +"frappe-babord", +"frappe-d'abord", +"frappe-devant", +"frappe-main", +"frappe-mains", +"frappe-plaque", +"frappe-plaques", +"frappe-à-bord", +"frappe-à-mort", +"free-lance", +"frein-vapeur", +"freins-vapeur", +"freyming-merlebachois", +"freyming-merlebachoise", +"freyming-merlebachoises", +"fric-frac", +"fric-fracs", +"fronto-iniaque", +"frou-frou", +"frou-frous", +"frous-frous", +"fuel-oil", +"fuel-oils", +"full-contact", +"full-stack", +"fulmi-coton", +"fulmi-cotons", +"fume-cigare", +"fume-cigares", +"fume-cigarette", +"fume-cigarettes", +"fumée-gelée", +"fusil-mitrailleur", +"fusilier-commando", +"fusilier-marin", +"fusiliers-commandos", +"fusiliers-marins", +"fusils-mitrailleurs", +"fusion-acquisition", +"fusée-sonde", +"fut's", +"fute-fute", +"futes-futes", +"futuna-aniwa", +"fémoro-tibial", +"fénoxaprop-P-éthyl", +"fénoxaprop-éthyl", +"féodo-vassalique", +"féodo-vassaliques", +"fétu-en-cul", +"fétus-en-cul", +"fût-et-fare", +"g-strophanthine", +"gabrielino-fernandeño", +"gadz'arts", +"gagnant-gagnant", +"gagnant-gagnant-gagnant", +"gagnante-gagnante", +"gagnante-gagnante-gagnante", +"gagnantes-gagnantes", +"gagnantes-gagnantes-gagnantes", +"gagnants-gagnants", +"gagnants-gagnants-gagnants", +"gagne-pain", +"gagne-pains", +"gagne-petit", +"gaillet-gratteron", +"gaillets-gratterons", +"gaine-culotte", +"gaines-culottes", +"galaïco-portugais", +"galeries-refuges", +"galette-saucisse", +"galette-saucisses", +"galvano-cautère", +"galvano-magnétique", +"galvano-magnétiques", +"galvano-magnétisme", +"galvano-magnétismes", +"galégo-portugais", +"gamma-1,2,3,4,5,6-hexachlorocyclohexane", +"gamma-HCH", +"gamma-hexachlorobenzène", +"gamma-hexachlorocyclohexane", +"garcette-goitre", +"garden-parties", +"garden-party", +"garden-partys", +"gas-oil", +"gas-oils", +"gauche-fer", +"gay-friendly", +"gays-friendly", +"gaz-cab", +"gaz-poivre", +"gazelle-girafe", +"gel-douche", +"gel-douches", +"gentleman-rider", +"gentlemen-riders", +"germanate-analcime", +"germanate-analcimes", +"germano-américain", +"germano-américaine", +"germano-américaines", +"germano-américains", +"germano-anglais", +"germano-anglaises", +"germano-iranien", +"germano-italo-japonais", +"germo-roburien", +"germo-roburienne", +"germo-roburiennes", +"germo-roburiens", +"gestalt-thérapie", +"gestalt-thérapies", +"giga-ampère", +"giga-ampères", +"giga-ohm", +"giga-ohms", +"giga-électron-volt", +"giga-électron-volts", +"gigabit-ethernet", +"gigaélectron-volt", +"gigaélectron-volts", +"gill-box", +"glabello-iniaque", +"glass-cord", +"glauco-ferrugineuse", +"glauco-ferrugineuses", +"glauco-ferrugineux", +"glisser-déposer", +"globe-trotter", +"globe-trotters", +"globe-trotteur", +"globe-trotteurs", +"globe-trotteuse", +"globe-trotteuses", +"glosso-pharyngien", +"glosso-staphylin", +"glosso-staphylins", +"glosso-épiglottique", +"glosso-épiglottiques", +"gloubi-boulga", +"gluco-corticoïde", +"gluco-corticoïdes", +"glufosinate-ammonium", +"glycosyl-phosphatidylinositol", +"glycéraldéhyde-3-phosphate", +"go-slow", +"goal-average", +"goal-averages", +"goal-ball", +"gobe-dieu", +"gobe-goujons", +"gobe-mouche", +"gobe-moucherie", +"gobe-moucherons", +"gobe-mouches", +"gobe-mouton", +"gode-ceinture", +"gode-miché", +"gode-michés", +"godes-ceintures", +"goma-dare", +"gomme-cogne", +"gomme-cognes", +"gomme-gutte", +"gomme-résine", +"gommo-résineux", +"google-isa", +"google-isai", +"google-isaient", +"google-isais", +"google-isait", +"google-isant", +"google-isas", +"google-isasse", +"google-isassent", +"google-isasses", +"google-isassiez", +"google-isassions", +"google-ise", +"google-isent", +"google-iser", +"google-isera", +"google-iserai", +"google-iseraient", +"google-iserais", +"google-iserait", +"google-iseras", +"google-iserez", +"google-iseriez", +"google-iserions", +"google-iserons", +"google-iseront", +"google-ises", +"google-isez", +"google-isiez", +"google-isions", +"google-isons", +"google-isâmes", +"google-isât", +"google-isâtes", +"google-isèrent", +"google-isé", +"google-isée", +"google-isées", +"google-isés", +"gorge-bleue", +"gorge-de-pigeon", +"gorge-fouille", +"gourdan-polignanais", +"gourdan-polignanaise", +"gourdan-polignanaises", +"gouris-taitien", +"gouris-taitienne", +"gouris-taitiennes", +"gouris-taitiens", +"goutte-de-sang", +"goutte-de-suif", +"goutte-rose", +"goutte-à-goutte", +"gouttes-de-sang", +"gouzi-gouzi", +"gouzis-gouzis", +"goyave-ananas", +"goyaves-ananas", +"gracieux-berluron", +"grain-d'orge", +"grand'chose", +"grand'faim", +"grand'garde", +"grand'gardes", +"grand'hamien", +"grand'hamienne", +"grand'hamiennes", +"grand'hamiens", +"grand'honte", +"grand'hontes", +"grand'landais", +"grand'landaise", +"grand'landaises", +"grand'maman", +"grand'mamans", +"grand'maternité", +"grand'maternités", +"grand'messe", +"grand'messes", +"grand'mère", +"grand'mères", +"grand'paternité", +"grand'paternités", +"grand'tante", +"grand'tantes", +"grandgousier-pélican", +"grano-lamellaire", +"grap-fruit", +"grap-fruits", +"grapho-moteur", +"grappe-fruit", +"gras-double", +"gras-doubles", +"gras-fondu", +"grattes-ciels", +"grave-cimens", +"grave-ciment", +"grave-ciments", +"graves-ciment", +"gravi-kora", +"gray-la-villois", +"gray-la-villoise", +"gray-la-villoises", +"grenadier-voltigeur", +"grenadiers-voltigeurs", +"grenouille-taureau", +"grenouilles-taureaux", +"grez-neuvillois", +"grez-neuvilloise", +"grez-neuvilloises", +"gri-gri", +"gri-gris", +"griche-dents", +"gril-au-vent", +"grille-midi", +"grille-pain", +"grille-pains", +"grippe-argent", +"grippe-chair", +"grippe-fromage", +"grippe-fromages", +"grippe-minaud", +"grippe-minauds", +"grippe-sou", +"grippe-sous", +"gris-farinier", +"gris-fariniers", +"gris-gris", +"gris-pendart", +"gris-pendarts", +"grise-bonne", +"grises-bonnes", +"grosse-de-fonte", +"grosse-gorge", +"grosso-modo", +"grâcieux-hollognois", +"guarasu'we", +"guerre-éclair", +"guet-apens", +"guet-appens", +"guet-à-pent", +"guets-apens", +"guette-chemin", +"gueule-bée", +"gueule-de-loup", +"gueules-de-loup", +"guide-fil", +"guide-fils", +"guide-main", +"guide-âne", +"guide-ânes", +"guigne-cul", +"guigne-culs", +"guilherandais-grangeois", +"guilherandaise-grangeoise", +"guilherandaises-grangeoises", +"guili-guili", +"guili-guilis", +"guillemet-apostrophe", +"guillemets-apostrophes", +"guit-guit", +"guitare-harpe", +"guitare-violoncelle", +"guitare-violoncelles", +"gulf-stream", +"gulf-streams", +"gusathion-méthyl", +"gusathion-éthyl", +"gut-komm", +"gutta-percha", +"gutturo-maxillaire", +"gué-d'allérien", +"gué-d'allérienne", +"gué-d'allériennes", +"gué-d'allériens", +"gwich'in", +"gâche-métier", +"gâte-bois", +"gâte-ménage", +"gâte-ménages", +"gâte-métier", +"gâte-métiers", +"gâte-papier", +"gâte-papiers", +"gâte-pâte", +"gâte-sauce", +"gâte-sauces", +"gère-bélestinois", +"gère-bélestinoise", +"gère-bélestinoises", +"gélatino-bromure", +"gélatino-bromures", +"génie-conseil", +"génies-conseils", +"génio-hyoïdien", +"génio-hyoïdienne", +"génio-hyoïdiennes", +"génio-hyoïdiens", +"génito-crural", +"génito-urinaire", +"génito-urinaires", +"gétah-lahoë", +"ha-ha", +"ha-has", +"hache-bâché", +"hache-légume", +"hache-légumes", +"hache-paille", +"hache-pailles", +"hache-écorce", +"hache-écorces", +"hagio-onomastique", +"hagio-onomastiques", +"hakko-ryu", +"hale-avans", +"hale-avant", +"hale-avants", +"hale-bas", +"hale-breu", +"hale-croc", +"hale-dedans", +"hale-dehors", +"hale-à-bord", +"haleine-de-Jupiter", +"haleines-de-Jupiter", +"half-and-half", +"half-pipe", +"half-pipes", +"half-track", +"half-tracks", +"halo-halo", +"halo-lunaire", +"halos-lunaires", +"haloxyfop-R", +"haloxyfop-éthoxyéthyl", +"halte-garderie", +"halte-garderies", +"halte-là", +"haltes-garderies", +"halvadji-bachi", +"ham-nalinnois", +"hames-boucrois", +"hames-boucroise", +"hames-boucroises", +"hamme-millois", +"handi-accessible", +"handi-accessibles", +"happe-chair", +"happe-chat", +"happe-foie", +"hara-kiri", +"hara-kiris", +"hara-kiriser", +"harai-goshi", +"haraï-goshi", +"hard-discount", +"hard-discountisa", +"hard-discountisai", +"hard-discountisaient", +"hard-discountisais", +"hard-discountisait", +"hard-discountisant", +"hard-discountisas", +"hard-discountisasse", +"hard-discountisassent", +"hard-discountisasses", +"hard-discountisassiez", +"hard-discountisassions", +"hard-discountise", +"hard-discountisent", +"hard-discountiser", +"hard-discountisera", +"hard-discountiserai", +"hard-discountiseraient", +"hard-discountiserais", +"hard-discountiserait", +"hard-discountiseras", +"hard-discountiserez", +"hard-discountiseriez", +"hard-discountiserions", +"hard-discountiserons", +"hard-discountiseront", +"hard-discountises", +"hard-discountisez", +"hard-discountisiez", +"hard-discountisions", +"hard-discountisons", +"hard-discountisâmes", +"hard-discountisât", +"hard-discountisâtes", +"hard-discountisèrent", +"hard-discountisé", +"hard-discountisée", +"hard-discountisées", +"hard-discountisés", +"hard-discounts", +"hardi-petit", +"harpe-guitare", +"harpe-luth", +"has-been", +"has-beens", +"hausse-col", +"hausse-cols", +"hausse-pied", +"hausse-pieds", +"hausse-queue", +"haye-le-comtois", +"haye-le-comtoise", +"haye-le-comtoises", +"hecto-ohm", +"hecto-ohms", +"hentai-gana", +"herbe-au-bitume", +"herbe-aux-femmes-battues", +"herbe-aux-plaies", +"herbe-à-cochon", +"herbes-au-bitume", +"herbes-aux-femmes-battues", +"herbes-aux-plaies", +"herbes-aux-taupes", +"herbes-à-cochon", +"herd-book", +"heure-homme", +"heure-lumière", +"heures-hommes", +"heures-lumière", +"heurte-pot", +"hexa-core", +"hexa-cores", +"hexa-rotor", +"hexa-rotors", +"hi-fi", +"hi-han", +"high-life", +"high-tech", +"himène-plume", +"hip-hop", +"hip-hopisa", +"hip-hopisai", +"hip-hopisaient", +"hip-hopisais", +"hip-hopisait", +"hip-hopisant", +"hip-hopisas", +"hip-hopisasse", +"hip-hopisassent", +"hip-hopisasses", +"hip-hopisassiez", +"hip-hopisassions", +"hip-hopise", +"hip-hopisent", +"hip-hopiser", +"hip-hopisera", +"hip-hopiserai", +"hip-hopiseraient", +"hip-hopiserais", +"hip-hopiserait", +"hip-hopiseras", +"hip-hopiserez", +"hip-hopiseriez", +"hip-hopiserions", +"hip-hopiserons", +"hip-hopiseront", +"hip-hopises", +"hip-hopisez", +"hip-hopisiez", +"hip-hopisions", +"hip-hopisons", +"hip-hopisâmes", +"hip-hopisât", +"hip-hopisâtes", +"hip-hopisèrent", +"hip-hopisé", +"hip-hopisée", +"hip-hopisées", +"hip-hopisés", +"hippocampe-feuillu", +"hippocampes-feuillus", +"hispano-américain", +"hispano-américaine", +"hispano-américaines", +"hispano-américains", +"hispano-arabe", +"hispano-arabes", +"hispano-mauresque", +"hispano-moresque", +"hispano-moresques", +"histoire-géo", +"historico-culturelle", +"hit-parade", +"hit-parades", +"hitléro-trotskisme", +"hitléro-trotskiste", +"hoat-chi", +"hoche-cul", +"hoche-culs", +"hoche-queue", +"hokkaïdo-ken", +"hold-up", +"home-jacking", +"home-jackings", +"home-sitter", +"home-sitters", +"home-sitting", +"home-sittings", +"home-trainer", +"home-trainers", +"homme-animal", +"homme-chacal", +"homme-clé", +"homme-femme", +"homme-fourmi", +"homme-grenouille", +"homme-loup", +"homme-léopard", +"homme-mort", +"homme-morts", +"homme-objet", +"homme-orchestre", +"homme-robot", +"homme-sandwich", +"homme-tronc", +"hommes-chacals", +"hommes-clés", +"hommes-femmes", +"hommes-fourmis", +"hommes-grenouilles", +"hommes-loups", +"hommes-léopards", +"hommes-objets", +"hommes-orchestres", +"hommes-robots", +"hommes-sandwiches", +"hommes-sandwichs", +"hommes-troncs", +"homo-épitaxie", +"homo-épitaxies", +"hon-hergeois", +"hon-hergeoise", +"hon-hergeoises", +"honey-dew", +"hong-kongais", +"hong-kongaise", +"hong-kongaises", +"horo-kilométrique", +"horo-kilométriques", +"hors-bord", +"hors-bords", +"hors-champ", +"hors-concours", +"hors-d'oeuvre", +"hors-d'œuvre", +"hors-fonds", +"hors-jeu", +"hors-jeux", +"hors-la-loi", +"hors-ligne", +"hors-lignes", +"hors-norme", +"hors-piste", +"hors-pistes", +"hors-sac", +"hors-service", +"hors-sol", +"hors-sols", +"hors-sujet", +"hors-série", +"hors-séries", +"hors-temps", +"hors-texte", +"hors-textes", +"horse-ball", +"horse-guard", +"horse-guards", +"hostello-flavien", +"hostello-flavienne", +"hostello-flaviennes", +"hostello-flaviens", +"hot-dog", +"hot-dogs", +"hot-melt", +"hot-melts", +"hot-plug", +"houl'eau", +"house-boats", +"houx-frelon", +"houx-frelons", +"huis-clos", +"huit-marsiste", +"huit-marsistes", +"huit-pieds", +"huit-reflets", +"huit-ressorts", +"huitante-neuf", +"huitante-neuvième", +"huitante-neuvièmes", +"hume-vent", +"huppe-col", +"huron-wendat", +"hydrargyro-cyanate", +"hydrargyro-cyanates", +"hydraulico-pneumatique", +"hydro-aviation", +"hydro-aviations", +"hydro-avion", +"hydro-avions", +"hydro-ensemencement", +"hydro-ensemencements", +"hydro-météorologie", +"hydro-électricité", +"hydro-électricités", +"hydro-électrique", +"hydro-électriques", +"hyo-pharyngien", +"hyo-épiglottique", +"hyo-épiglottiques", +"hypo-centre", +"hypo-centres", +"hypo-iodeuse", +"hypo-iodeuses", +"hypo-iodeux", +"hypothético-déductif", +"hystéro-catalepsie", +"hystéro-catalepsies", +"hystéro-épilepsie", +"hystéro-épilepsies", +"hyène-garou", +"hyènes-garous", +"hâ-hâ", +"hâ-hâs", +"hémi-dodécaèdre", +"hémi-octaèdre", +"hémi-épiphyte", +"hémi-épiphytes", +"hépato-biliaire", +"hépato-cystique", +"hépato-cystiques", +"hépato-gastrique", +"hépato-gastrite", +"hépato-gastrites", +"héroï-comique", +"héroï-comiques", +"hétéro-céphalophorie", +"hétéro-céphalophories", +"hétéro-réparation", +"hétéro-réparations", +"hétéro-épitaxie", +"hétéro-évaluation", +"hétéro-évaluations", +"hôtel-Dieu", +"hôtellerie-restauration", +"hôtels-Dieu", +"i-butane", +"i-butanes", +"i.-e.", +"iatro-magique", +"iatro-magiques", +"ibéro-roman", +"ice-belt", +"ice-belts", +"ice-berg", +"ice-bergs", +"ice-blink", +"ice-blinks", +"ice-bloc", +"ice-blocs", +"ice-cream", +"ice-creams", +"ice-foot", +"ice-foots", +"ice-rapt", +"ice-rapts", +"ice-table", +"ice-tables", +"ici-bas", +"idio-électricité", +"idio-électrique", +"idio-électriques", +"idéal-type", +"idée-force", +"idée-maîtresse", +"idées-forces", +"idées-maîtresses", +"ifira-mele", +"ifira-meles", +"igny-marin", +"igny-marine", +"igny-marines", +"igny-marins", +"iliaco-fémoral", +"iliaco-musculaire", +"ilio-pectiné", +"ilio-pubien", +"ilio-scrotal", +"ilo-dionysien", +"ilo-dionysienne", +"ilo-dionysiennes", +"ilo-dionysiens", +"iléo-colique", +"iléo-coliques", +"iléo-cæcal", +"iléo-cæcale", +"iléo-cæcales", +"iléo-cæcaux", +"iléos-meldois", +"iléos-meldoise", +"iléos-meldoises", +"image-gradient", +"imazaméthabenz-méthyl", +"immuno-pharmacologie", +"immuno-pharmacologies", +"impari-nervié", +"impari-nervé", +"impari-penné", +"import-export", +"impératrice-mère", +"impératrices-mères", +"in-12", +"in-12º", +"in-16", +"in-16º", +"in-18", +"in-18º", +"in-32", +"in-4", +"in-4.º", +"in-4to", +"in-4º", +"in-6", +"in-6º", +"in-8", +"in-8.º", +"in-8vo", +"in-8º", +"in-cent-vingt-huit", +"in-dix-huit", +"in-douze", +"in-duodecimo", +"in-folio", +"in-fº", +"in-huit", +"in-manus", +"in-octavo", +"in-plano", +"in-plº", +"in-promptu", +"in-quarto", +"in-sedecimo", +"in-seize", +"in-six", +"in-trente-deux", +"in-vingt-quatre", +"in-vitro", +"inch'Allah", +"inch'allah", +"incito-moteur", +"incito-motricité", +"income-tax", +"indane-1,3-dione", +"inde-plate", +"india-océanisme", +"india-océanismes", +"info-ballon", +"info-ballons", +"info-bulle", +"info-bulles", +"ingénieur-conseil", +"ingénieur-docteur", +"ingénieur-maître", +"ingénieure-conseil", +"ingénieures-conseils", +"ingénieurs-conseils", +"ingénieurs-docteurs", +"ingénieurs-maîtres", +"injonction-bâillon", +"insecto-mortifère", +"insecto-mortifères", +"inspecteur-chef", +"inspecteurs-chefs", +"insulino-dépendant", +"insulino-dépendante", +"insulino-dépendantes", +"insulino-dépendants", +"interno-médial", +"interro-négatif", +"intervertébro-costal", +"inuit-aléoute", +"inuit-aléoutes", +"iodo-borique", +"iodo-chlorure", +"iodosulfuron-méthyl-sodium", +"iowa-oto", +"iowa-otos", +"ischio-anal", +"ischio-clitorien", +"ischio-fémoral", +"ischio-fémorale", +"ischio-fémorales", +"ischio-fémoraux", +"ischio-jambier", +"ischio-jambiers", +"ischio-jambière", +"ischio-jambières", +"ischio-périnéal", +"ischio-tibial", +"ischio-tibiaux", +"isoxadifen-éthyl", +"israélo-syrienne", +"istro-roumain", +"ivre-mort", +"ivre-morte", +"ivres-mortes", +"ivres-morts", +"j't'aime", +"jack-russell", +"jaguar-garou", +"jaguars-garous", +"jam-sessions", +"jambon-beurre", +"jambon-des-jardiniers", +"jambons-des-jardiniers", +"jaunay-clanais", +"jaunay-clanaise", +"jaunay-clanaises", +"jaï-alaï", +"jaï-alaïs", +"je-m'en-fichisme", +"je-m'en-fichismes", +"je-m'en-fichiste", +"je-m'en-fichistes", +"je-m'en-foutisme", +"je-m'en-foutismes", +"je-m'en-foutiste", +"je-m'en-foutistes", +"je-ne-sais-quoi", +"jeans-de-gand", +"jeans-de-janten", +"jet-set", +"jet-sets", +"jet-settisa", +"jet-settisai", +"jet-settisaient", +"jet-settisais", +"jet-settisait", +"jet-settisant", +"jet-settisas", +"jet-settisasse", +"jet-settisassent", +"jet-settisasses", +"jet-settisassiez", +"jet-settisassions", +"jet-settise", +"jet-settisent", +"jet-settiser", +"jet-settisera", +"jet-settiserai", +"jet-settiseraient", +"jet-settiserais", +"jet-settiserait", +"jet-settiseras", +"jet-settiserez", +"jet-settiseriez", +"jet-settiserions", +"jet-settiserons", +"jet-settiseront", +"jet-settises", +"jet-settisez", +"jet-settisiez", +"jet-settisions", +"jet-settisons", +"jet-settisâmes", +"jet-settisât", +"jet-settisâtes", +"jet-settisèrent", +"jet-settisé", +"jet-settisée", +"jet-settisées", +"jet-settisés", +"jet-stream", +"jet-streams", +"jette-bouts", +"jeu-malochois", +"jeu-malochoise", +"jeu-malochoises", +"jeu-parti", +"jiu-jitsu", +"joint-venture", +"joint-ventures", +"joli-bois", +"jour-homme", +"jour-lumière", +"jours-hommes", +"jours-lumière", +"ju-jitsu", +"ju-ju", +"judéo-allemand", +"judéo-alsacien", +"judéo-arabe", +"judéo-arabes", +"judéo-asiatique", +"judéo-bolchévisme", +"judéo-centrisme", +"judéo-christianisme", +"judéo-christiano-islamique", +"judéo-christiano-islamiques", +"judéo-christiano-musulman", +"judéo-chrétien", +"judéo-chrétienne", +"judéo-chrétiennes", +"judéo-chrétiens", +"judéo-espagnol", +"judéo-espagnole", +"judéo-espagnoles", +"judéo-espagnols", +"judéo-iranien", +"judéo-libyen", +"judéo-lybien", +"judéo-maçonnique", +"judéo-maçonniques", +"judéo-musulman", +"judéo-musulmans", +"judéo-nazi", +"judéo-nazis", +"juke-box", +"juke-boxes", +"jully-sarçois", +"jully-sarçoise", +"jully-sarçoises", +"junk-food", +"junk-foods", +"jupe-culotte", +"jupes-culottes", +"juridico-politique", +"juridico-politiques", +"jusque-là", +"juste-au-corps", +"juste-à-temps", +"juxta-position", +"juxta-positions", +"juǀ'hoan", +"jérôme-boschisme", +"jérôme-boschismes", +"k-voisinage", +"k-voisinages", +"k-way", +"k-ways", +"kali'na", +"kan-kan", +"kan-kans", +"kansai-ben", +"kara-gueuz", +"kara-kalpak", +"karachay-balkar", +"karafuto-ken", +"karatchaï-balkar", +"kem's", +"khambo-lama", +"khambo-lamas", +"khatti-chérif", +"khatti-chérifs", +"khi-carré", +"khi-carrés", +"khi-deux", +"kif-kif", +"kilo-ohm", +"kilo-ohms", +"kilo-électron-volt", +"kilo-électron-volts", +"kilo-électrons-volts", +"kilogramme-force", +"kilogramme-poids", +"kilogrammes-force", +"kilogrammes-poids", +"kilomètre-heure", +"kilomètres-heure", +"kiloélectron-volt", +"kiloélectron-volts", +"kiloélectrons-volts", +"kin-ball", +"kino-congolais", +"kip-kap", +"kip-kaps", +"kirsch-wasser", +"kirsch-wassers", +"kiss-in", +"kite-surf", +"kite-surfa", +"kite-surfai", +"kite-surfaient", +"kite-surfais", +"kite-surfait", +"kite-surfant", +"kite-surfas", +"kite-surfasse", +"kite-surfassent", +"kite-surfasses", +"kite-surfassiez", +"kite-surfassions", +"kite-surfe", +"kite-surfent", +"kite-surfer", +"kite-surfera", +"kite-surferai", +"kite-surferaient", +"kite-surferais", +"kite-surferait", +"kite-surferas", +"kite-surferez", +"kite-surferiez", +"kite-surferions", +"kite-surferons", +"kite-surferont", +"kite-surfers", +"kite-surfes", +"kite-surfez", +"kite-surfiez", +"kite-surfions", +"kite-surfons", +"kite-surfâmes", +"kite-surfât", +"kite-surfâtes", +"kite-surfèrent", +"kite-surfé", +"knicker-bocker", +"knicker-bockers", +"knock-out", +"knock-outa", +"knock-outai", +"knock-outaient", +"knock-outais", +"knock-outait", +"knock-outant", +"knock-outas", +"knock-outasse", +"knock-outassent", +"knock-outasses", +"knock-outassiez", +"knock-outassions", +"knock-oute", +"knock-outent", +"knock-outer", +"knock-outera", +"knock-outerai", +"knock-outeraient", +"knock-outerais", +"knock-outerait", +"knock-outeras", +"knock-outerez", +"knock-outeriez", +"knock-outerions", +"knock-outerons", +"knock-outeront", +"knock-outes", +"knock-outez", +"knock-outiez", +"knock-outions", +"knock-outons", +"knock-outs", +"knock-outâmes", +"knock-outât", +"knock-outâtes", +"knock-outèrent", +"knock-outé", +"knock-outée", +"knock-outées", +"knock-outés", +"ko-soto-gake", +"kouan-hoa", +"kouign-aman", +"kouign-amann", +"kouign-amanns", +"kouign-amans", +"krav-naga", +"krésoxim-méthyl", +"kung-fu", +"kwan-li-so", +"kérato-pharyngien", +"kérato-staphylin", +"kérato-staphylins", +"l-amphétamine", +"la-fertois", +"la-fertoise", +"la-fertoises", +"la-la-la", +"lab-ferment", +"lab-ferments", +"lac-laque", +"lac-laques", +"lac-à-l'épaule", +"lache-bras", +"lacrima-Christi", +"lacrima-christi", +"lacryma-Christi", +"lacryma-christi", +"lacs-à-l'épaule", +"lacto-végétarisme", +"lacto-végétarismes", +"laemmer-geier", +"laemmer-geiers", +"laisser-aller", +"laisser-allers", +"laisser-courre", +"laisser-faire", +"laisser-sur-place", +"laissez-faire", +"laissez-passer", +"laissé-pour-compte", +"laissée-pour-compte", +"laissées-pour-compte", +"laissés-pour-compte", +"lambda-cyhalothrine", +"lampe-tempête", +"lampes-tempête", +"lampris-lune", +"lance-amarres", +"lance-balles", +"lance-bombe", +"lance-bombes", +"lance-flamme", +"lance-flammes", +"lance-fusée", +"lance-fusées", +"lance-grenade", +"lance-grenades", +"lance-missile", +"lance-missiles", +"lance-patates", +"lance-pierre", +"lance-pierres", +"lance-roquette", +"lance-roquettes", +"lance-torpille", +"lance-torpilles", +"land-ice", +"land-ices", +"langue-de-boeuf", +"langue-de-chat", +"langue-de-moineau", +"langue-de-serpent", +"langue-de-vache", +"langue-toit", +"langues-de-boeuf", +"langues-de-chat", +"langues-de-vache", +"langues-toit", +"lanne-soubiranais", +"lanne-soubiranaise", +"lanne-soubiranaises", +"lapin-garou", +"lapins-garous", +"lapis-lazuli", +"lapu-lapu", +"larme-de-Job", +"larmes-de-Job", +"lau-balutin", +"lau-balutine", +"lau-balutines", +"lau-balutins", +"launay-villersois", +"launay-villersoise", +"launay-villersoises", +"laurier-cerise", +"laurier-rose", +"laurier-sauce", +"laurier-tarte", +"laurier-thym", +"laurier-tin", +"lauriers-cerises", +"lauriers-roses", +"lauriers-tins", +"laval-de-cérois", +"laval-de-céroise", +"laval-de-céroises", +"lavans-quingeois", +"lavans-quingeoise", +"lavans-quingeoises", +"lave-auto", +"lave-autos", +"lave-glace", +"lave-linge", +"lave-linges", +"lave-main", +"lave-mains", +"lave-pont", +"lave-ponts", +"lave-tête", +"lave-têtes", +"lave-vaisselle", +"lave-vaisselles", +"laveuse-sécheuse", +"lavé-de-vert", +"lavés-de-vert", +"lazur-apatite", +"lazur-apatites", +"lease-back", +"leather-jacket", +"lecteur-graveur", +"lecteurs-graveurs", +"lemmer-geyer", +"lemmer-geyers", +"lepto-kurticité", +"lepto-kurticités", +"lepto-kurtique", +"lepto-kurtiques", +"lever-dieu", +"lgbti-friendly", +"lgbti-phobie", +"lgbti-phobies", +"liane-corail", +"lianes-corail", +"liberum-veto", +"libidino-calotin", +"libre-choix", +"libre-penseur", +"libre-penseuse", +"libre-service", +"libre-échange", +"libre-échangisme", +"libre-échangismes", +"libre-échangiste", +"libre-échangistes", +"libres-choix", +"libres-penseurs", +"libres-penseuses", +"libres-services", +"libyco-berbère", +"libyco-berbères", +"libéral-conservateur", +"libéral-conservatisme", +"lice-po", +"liche-casse", +"licol-drisse", +"licols-drisses", +"lie-de-vin", +"lieu-dit", +"lieu-saint-amandinois", +"lieu-saint-amandinoise", +"lieu-saint-amandinoises", +"lieutenant-colonel", +"lieutenant-gouverneur", +"lieutenant-général", +"lieutenants-colonels", +"lieux-dits", +"ligne-de-foulée", +"lignes-de-foulée", +"limande-sole", +"limande-soles", +"limandes-soles", +"lime-bois", +"lime-uranite", +"lime-uranites", +"linon-batiste", +"linon-batistes", +"lion-garou", +"lions-garous", +"lire-écrire", +"lit-cage", +"lit-clos", +"litho-typographia", +"litho-typographiai", +"litho-typographiaient", +"litho-typographiais", +"litho-typographiait", +"litho-typographiant", +"litho-typographias", +"litho-typographiasse", +"litho-typographiassent", +"litho-typographiasses", +"litho-typographiassiez", +"litho-typographiassions", +"litho-typographie", +"litho-typographient", +"litho-typographier", +"litho-typographiera", +"litho-typographierai", +"litho-typographieraient", +"litho-typographierais", +"litho-typographierait", +"litho-typographieras", +"litho-typographierez", +"litho-typographieriez", +"litho-typographierions", +"litho-typographierons", +"litho-typographieront", +"litho-typographies", +"litho-typographiez", +"litho-typographiiez", +"litho-typographiions", +"litho-typographions", +"litho-typographiâmes", +"litho-typographiât", +"litho-typographiâtes", +"litho-typographièrent", +"litho-typographié", +"litho-typographiée", +"litho-typographiées", +"litho-typographiés", +"lits-cages", +"lits-clos", +"little-endian", +"living-room", +"living-rooms", +"livres-cassettes", +"livret-police", +"localité-type", +"location-financement", +"lock-out", +"lock-outa", +"lock-outai", +"lock-outaient", +"lock-outais", +"lock-outait", +"lock-outant", +"lock-outas", +"lock-outasse", +"lock-outassent", +"lock-outasses", +"lock-outassiez", +"lock-outassions", +"lock-oute", +"lock-outent", +"lock-outer", +"lock-outera", +"lock-outerai", +"lock-outeraient", +"lock-outerais", +"lock-outerait", +"lock-outeras", +"lock-outerez", +"lock-outeriez", +"lock-outerions", +"lock-outerons", +"lock-outeront", +"lock-outes", +"lock-outez", +"lock-outiez", +"lock-outions", +"lock-outons", +"lock-outs", +"lock-outâmes", +"lock-outât", +"lock-outâtes", +"lock-outèrent", +"lock-outé", +"lock-outée", +"lock-outées", +"lock-outés", +"locoalo-mendonnais", +"locoalo-mendonnaise", +"locoalo-mendonnaises", +"locution-phrase", +"locutions-phrases", +"loemmer-geyer", +"loemmer-geyers", +"logan-berry", +"logan-berrys", +"logiciel-socle", +"logo-syllabique", +"logo-syllabiques", +"loi-cadre", +"loi-programme", +"loi-écran", +"lois-cadre", +"lois-programme", +"lois-écrans", +"lombo-costal", +"lombo-costo-trachélien", +"lombo-dorso-trachélien", +"lombo-huméral", +"lombo-sacré", +"lombri-composta", +"lombri-compostai", +"lombri-compostaient", +"lombri-compostais", +"lombri-compostait", +"lombri-compostant", +"lombri-compostas", +"lombri-compostasse", +"lombri-compostassent", +"lombri-compostasses", +"lombri-compostassiez", +"lombri-compostassions", +"lombri-composte", +"lombri-compostent", +"lombri-composter", +"lombri-compostera", +"lombri-composterai", +"lombri-composteraient", +"lombri-composterais", +"lombri-composterait", +"lombri-composteras", +"lombri-composterez", +"lombri-composteriez", +"lombri-composterions", +"lombri-composterons", +"lombri-composteront", +"lombri-compostes", +"lombri-compostez", +"lombri-compostiez", +"lombri-compostions", +"lombri-compostons", +"lombri-compostâmes", +"lombri-compostât", +"lombri-compostâtes", +"lombri-compostèrent", +"lombri-composté", +"lombri-compostée", +"lombri-compostées", +"lombri-compostés", +"lompénie-serpent", +"long-courrier", +"long-courriers", +"long-grain", +"long-jointé", +"long-jointée", +"long-métrage", +"long-temps", +"long-tems", +"longs-courriers", +"longs-métrages", +"longue-langue", +"longue-vue", +"longue-épine", +"longues-langues", +"longues-vues", +"longues-épines", +"loqu'du", +"loqu'due", +"loqu'dues", +"loqu'dus", +"lord-lieutenance", +"lord-lieutenances", +"lord-lieutenant", +"lord-lieutenants", +"lord-maire", +"louise-bonne", +"louises-bonnes", +"loup-cerve", +"loup-cervier", +"loup-garou", +"loups-cerves", +"loups-cerviers", +"loups-garous", +"lourd-léger", +"lourds-légers", +"lourouzien-bourbonnais", +"lourouzienne-bourbonnaise", +"lourouziennes-bourbonnaises", +"lourouziens-bourbonnais", +"louve-garelle", +"louve-garolle", +"louve-garou", +"louves-garelles", +"louves-garolles", +"louves-garous", +"louveteau-garou", +"louveteaux-garous", +"louvie-soubironnais", +"louvie-soubironnaise", +"louvie-soubironnaises", +"love-in", +"low-cost", +"low-costs", +"low-tech", +"ludo-sportif", +"ludo-sportifs", +"ludo-sportive", +"ludo-sportives", +"ludo-éducatif", +"lui-même", +"lumen-seconde", +"lumens-secondes", +"luni-solaire", +"luni-solaires", +"lyro-guitare", +"là-bas", +"là-contre", +"là-dedans", +"là-delez", +"là-dessous", +"là-dessus", +"là-haut", +"là-pour-ça", +"lâcher-tout", +"læmmer-geyer", +"læmmer-geyers", +"lèche-botta", +"lèche-bottai", +"lèche-bottaient", +"lèche-bottais", +"lèche-bottait", +"lèche-bottant", +"lèche-bottas", +"lèche-bottasse", +"lèche-bottassent", +"lèche-bottasses", +"lèche-bottassiez", +"lèche-bottassions", +"lèche-botte", +"lèche-bottent", +"lèche-botter", +"lèche-bottera", +"lèche-botterai", +"lèche-botteraient", +"lèche-botterais", +"lèche-botterait", +"lèche-botteras", +"lèche-botterez", +"lèche-botteriez", +"lèche-botterions", +"lèche-botterons", +"lèche-botteront", +"lèche-bottes", +"lèche-bottez", +"lèche-bottiez", +"lèche-bottions", +"lèche-bottons", +"lèche-bottâmes", +"lèche-bottât", +"lèche-bottâtes", +"lèche-bottèrent", +"lèche-botté", +"lèche-bottée", +"lèche-bottées", +"lèche-bottés", +"lèche-cul", +"lèche-culs", +"lèche-vitrine", +"lèche-vitrines", +"lèse-majesté", +"lèse-majestés", +"lève-cul", +"lève-culs", +"lève-gazon", +"lève-glace", +"lève-glaces", +"lève-tard", +"lève-tôt", +"lève-vitre", +"lève-vitres", +"légume-feuille", +"légume-fleur", +"légume-fruit", +"légume-racine", +"légume-tige", +"légumes-feuilles", +"légumes-fleurs", +"légumes-fruits", +"légumes-racines", +"légumes-tiges", +"léopard-garou", +"léopards-garous", +"lépisostée-alligator", +"lévi-straussien", +"lévi-straussienne", +"lévi-straussiennes", +"lévi-straussiens", +"lœmmer-geyer", +"lœmmer-geyers", +"m'amie", +"m'as", +"m'as-tu-vu", +"m'as-tu-vue", +"m'as-tu-vues", +"m'as-tu-vus", +"m'bororo", +"m'demma", +"m'enfin", +"m'halla", +"m'hallas", +"m'kahla", +"m'kahlas", +"m'sieur", +"m-commerce", +"m-paiement", +"m-paiements", +"ma'di", +"ma-jong", +"ma-jongs", +"mac-adamisa", +"mac-adamisai", +"mac-adamisaient", +"mac-adamisais", +"mac-adamisait", +"mac-adamisant", +"mac-adamisas", +"mac-adamisasse", +"mac-adamisassent", +"mac-adamisasses", +"mac-adamisassiez", +"mac-adamisassions", +"mac-adamise", +"mac-adamisent", +"mac-adamiser", +"mac-adamisera", +"mac-adamiserai", +"mac-adamiseraient", +"mac-adamiserais", +"mac-adamiserait", +"mac-adamiseras", +"mac-adamiserez", +"mac-adamiseriez", +"mac-adamiserions", +"mac-adamiserons", +"mac-adamiseront", +"mac-adamises", +"mac-adamisez", +"mac-adamisiez", +"mac-adamisions", +"mac-adamisons", +"mac-adamisâmes", +"mac-adamisât", +"mac-adamisâtes", +"mac-adamisèrent", +"mac-adamisé", +"mac-adamisée", +"mac-adamisées", +"mac-adamisés", +"mac-ferlane", +"mac-ferlanes", +"mac-kintosh", +"mac-kintoshs", +"machin-chose", +"machin-choses", +"machin-chouette", +"machine-outil", +"machines-outils", +"machins-chouettes", +"machon-gorgeon", +"magasin-pilote", +"magasins-pilotes", +"magnésio-anthophyllite", +"magnésio-anthophyllites", +"magnésio-axinite", +"magnésio-axinites", +"magnésio-calcite", +"magnésio-calcites", +"magnéto-optique", +"magnéto-optiques", +"magnéto-électrique", +"magnéto-électriques", +"mah-jong", +"mah-jongs", +"mahi-mahi", +"mail-coach", +"mailly-castellois", +"mailly-castelloise", +"mailly-castelloises", +"main-brune", +"main-courante", +"main-d'oeuvre", +"main-d'œuvre", +"main-forte", +"main-militaire", +"maine-anjou", +"mains-courantes", +"mains-d'oeuvre", +"mains-d'œuvre", +"maire-adjoint", +"maires-adjoints", +"maison-mère", +"maisons-mères", +"maitre-autel", +"maitre-chanteur", +"maitre-chien", +"maitre-nageur", +"maitre-nageuse", +"maitres-chiens", +"maitres-nageurs", +"maitres-nageuses", +"maitresse-nageuse", +"maitresses-nageuses", +"make-up", +"make-ups", +"making-of", +"makura-e", +"makura-es", +"mal-aimé", +"mal-aimée", +"mal-aimés", +"mal-baisé", +"mal-baisée", +"mal-baisées", +"mal-baisés", +"mal-comprenant", +"mal-comprenants", +"mal-en-point", +"mal-information", +"mal-informations", +"mal-jugé", +"mal-jugés", +"mal-logement", +"mal-logements", +"mal-peigné", +"mal-peignée", +"mal-pensans", +"mal-pensant", +"mal-pensante", +"mal-pensantes", +"mal-pensants", +"mal-venant", +"mal-venants", +"mal-voyant", +"mal-voyants", +"mal-égal", +"mal-être", +"mal-êtres", +"malayo-polynésien", +"malayo-polynésienne", +"malayo-polynésiennes", +"malayo-polynésiens", +"malgré-nous", +"malle-poste", +"mals-peignées", +"mals-peignés", +"malécite-passamaquoddy", +"mam'selle", +"mam'selles", +"mam'zelle", +"mam'zelles", +"mamie-boomeuse", +"mamie-boomeuses", +"mamy-boomeuse", +"mamy-boomeuses", +"man-bun", +"man-buns", +"manche-à-balle", +"manche-à-balles", +"manco-liste", +"manco-listes", +"mandant-dépendant", +"mandat-carte", +"mandat-cash", +"mandat-lettre", +"mandat-poste", +"mandats-cartes", +"mandats-cash", +"mandats-lettres", +"mandats-poste", +"manganico-potassique", +"mangano-ankérite", +"mangano-ankérites", +"mangano-phlogopite", +"mangano-phlogopites", +"manganoso-ammonique", +"mange-Canayen", +"mange-debout", +"mange-disque", +"mange-disques", +"mange-merde", +"mange-piles", +"mange-tout", +"maniaco-dépressif", +"maniaco-dépressifs", +"maniaco-dépressive", +"maniaco-dépressives", +"mappe-monde", +"mappes-mondes", +"marche-palier", +"marché-gare", +"marché-gares", +"marco-lucanien", +"marco-lucanienne", +"marco-lucaniennes", +"marco-lucaniens", +"margarino-sulfurique", +"margis-chef", +"margis-chefs", +"mariage-sacrement", +"marie-chantal", +"marie-chantalerie", +"marie-chantaleries", +"marie-couche-toi-là", +"marie-galante", +"marie-galantes", +"marie-jeanne", +"marie-jeannes", +"marie-louise", +"marie-louises", +"marie-monastérien", +"marie-monastérienne", +"marie-monastériennes", +"marie-monastériens", +"marie-montois", +"marie-montoise", +"marie-montoises", +"marie-salope", +"marie-trintigner", +"maries-salopes", +"marin-pêcheur", +"marins-pêcheurs", +"marka-dafing", +"marno-bitumineux", +"marno-calcaire", +"marno-calcaires", +"marque-ombrelle", +"marque-page", +"marque-pagea", +"marque-pageai", +"marque-pageaient", +"marque-pageais", +"marque-pageait", +"marque-pageant", +"marque-pageas", +"marque-pageasse", +"marque-pageassent", +"marque-pageasses", +"marque-pageassiez", +"marque-pageassions", +"marque-pagent", +"marque-pageons", +"marque-pager", +"marque-pagera", +"marque-pagerai", +"marque-pageraient", +"marque-pagerais", +"marque-pagerait", +"marque-pageras", +"marque-pagerez", +"marque-pageriez", +"marque-pagerions", +"marque-pagerons", +"marque-pageront", +"marque-pages", +"marque-pagez", +"marque-pageâmes", +"marque-pageât", +"marque-pageâtes", +"marque-pagiez", +"marque-pagions", +"marque-pagèrent", +"marque-pagé", +"marque-pagée", +"marque-pagées", +"marque-pagés", +"marque-produit", +"marque-produits", +"marques-ombrelles", +"marte-piquant", +"marte-piquants", +"marteau-de-mer", +"marteau-pilon", +"marteau-piqueur", +"marteaux-pilons", +"marteaux-piqueurs", +"martin-bâton", +"martin-bâtons", +"martin-chasseur", +"martin-pêcheur", +"martin-sec", +"martin-sire", +"martin-sucré", +"martins-chasseurs", +"martins-pêcheurs", +"martins-sires", +"martins-sucrés", +"martre-zibeline", +"martres-zibelines", +"marxisme-léninisme", +"marxiste-léniniste", +"marxistes-léninistes", +"maréchal-ferrant", +"maréchaux-ferrans", +"maréchaux-ferrants", +"mas-chélyen", +"mas-chélyenne", +"mas-chélyennes", +"mas-chélyens", +"mas-tençois", +"mas-tençoise", +"mas-tençoises", +"masa'il", +"masa'ils", +"mass-média", +"mass-médias", +"masseur-kinésithérapeute", +"masseurs-kinésithérapeutes", +"masseuse-kinésithérapeute", +"masseuses-kinésithérapeutes", +"materno-infantile", +"materno-infantiles", +"mathématico-informatique", +"mathématico-informatiques", +"matthéo-lucanien", +"matthéo-lucanienne", +"matthéo-lucaniennes", +"matthéo-lucaniens", +"mauritano-marocain", +"mauritano-sénégalais", +"maxillo-dentaire", +"maxillo-facial", +"maxillo-labial", +"maxillo-musculaire", +"maël-carhaisien", +"maël-carhaisienne", +"maël-carhaisiennes", +"maël-carhaisiens", +"maître-assistant", +"maître-autel", +"maître-bau", +"maître-chanteur", +"maître-chanteuse", +"maître-chien", +"maître-cylindre", +"maître-jacques", +"maître-mot", +"maître-nageur", +"maître-nageuse", +"maîtres-assistants", +"maîtres-autels", +"maîtres-chanteurs", +"maîtres-chanteuses", +"maîtres-chiens", +"maîtres-cylindres", +"maîtres-jacques", +"maîtres-mots", +"maîtres-nageurs", +"maîtres-nageuses", +"maîtresse-femme", +"maîtresse-nageuse", +"maîtresses-femmes", +"maîtresses-nageuses", +"mea-culpa", +"mele-fila", +"membrano-calcaire", +"menthe-coq", +"menuisier-moulurier", +"mercuroso-mercurique", +"merisier-pays", +"merisiers-pays", +"mets-en", +"metz-tesseran", +"metz-tesseranne", +"metz-tesserannes", +"metz-tesserans", +"meurt-de-faim", +"meurt-de-soif", +"meurt-la-faim", +"meuse-rhin-yssel", +"mezzo-soprano", +"mezzo-sopranos", +"mezzo-termine", +"mezzo-tinto", +"meâ-culpâ", +"miam-miam", +"miaou-miaou", +"michel-angélesque", +"michel-angélesques", +"microélectron-volt", +"microélectron-volts", +"midi-chlorien", +"midi-chloriens", +"midi-pelle", +"midi-pelles", +"midi-pyrénéen", +"mieux-disant", +"mieux-disante", +"mieux-disantes", +"mieux-disants", +"mieux-être", +"militaro-bureaucratique", +"militaro-bureaucratiques", +"militaro-industriel", +"militaro-industrielle", +"militaro-industrielles", +"militaro-industriels", +"milk-bar", +"milk-bars", +"milk-shake", +"milk-shakes", +"mille-au-godet", +"mille-canton", +"mille-feuille", +"mille-feuilles", +"mille-fleurs", +"mille-pattes", +"mille-pertuis", +"mille-pieds", +"mille-points", +"milli-ohm", +"milli-ohms", +"milli-électron-volt", +"milli-électron-volts", +"milliampère-heure", +"milliampères-heures", +"milliélectron-volt", +"milliélectron-volts", +"mime-acrobate", +"ministre-présidence", +"ministre-présidences", +"ministre-président", +"ministres-présidents", +"minn'gotain", +"minn'gotaine", +"minn'gotaines", +"minn'gotains", +"minus-habens", +"minute-lumière", +"minutes-lumière", +"mire-oeuf", +"mire-oeufs", +"mire-œuf", +"mire-œufs", +"miro-miro", +"mixed-border", +"mixti-unibinaire", +"mobil-home", +"mobil-homes", +"modern-style", +"modèle-vue-contrôleur", +"mofu-gudur", +"moi-même", +"moins-disant", +"moins-disants", +"moins-que-rien", +"moins-value", +"moins-values", +"mois-homme", +"mois-hommes", +"mois-lumière", +"moissonner-battre", +"moissonneuse-batteuse", +"moissonneuse-lieuse", +"moissonneuses-batteuses", +"moissonneuses-lieuses", +"moite-moite", +"moitié-moitié", +"mojeño-ignaciano", +"mojeño-javierano", +"mojeño-loretano", +"mojeño-trinitario", +"mollo-mollo", +"moment-clé", +"moment-clés", +"moments-clés", +"monnaie-du-pape", +"monsieur-dame", +"monte-au-ciel", +"monte-charge", +"monte-charges", +"monte-courroie", +"monte-courroies", +"monte-en-l'air", +"monte-escalier", +"monte-escaliers", +"monte-jus", +"monte-lait", +"monte-meuble", +"monte-meubles", +"monte-pente", +"monte-pentes", +"monte-plat", +"monte-plats", +"monti-corcellois", +"monti-corcelloise", +"monti-corcelloises", +"montis-fagussin", +"montis-fagussine", +"montis-fagussines", +"montis-fagussins", +"montre-bracelet", +"montre-chronomètre", +"montres-bracelets", +"montres-chronomètres", +"montréalo-centrisme", +"moque-dieu", +"mords-cheval", +"morphine-base", +"mort-aux-rats", +"mort-bois", +"mort-chien", +"mort-de-chien", +"mort-dieu", +"mort-né", +"mort-née", +"mort-nées", +"mort-nés", +"mort-plain", +"mort-plains", +"mort-terrain", +"mort-vivant", +"morte-eau", +"morte-paye", +"morte-payes", +"morte-saison", +"morte-vivante", +"mortes-eaux", +"mortes-payes", +"mortes-saisons", +"mortes-vivantes", +"morts-bois", +"morts-chiens", +"morts-flats", +"morts-terrains", +"morts-vivants", +"moteur-fusée", +"moteurs-fusées", +"moto-cross", +"moto-crotte", +"moto-crottes", +"moto-réducteur", +"moto-réducteurs", +"moto-école", +"moto-écoles", +"mouche-araignée", +"mouche-sans-raison", +"mouche-scorpion", +"mouches-sans-raison", +"mouches-scorpions", +"mouille-bouche", +"moule-bite", +"moule-burnes", +"moule-fesses", +"moules-burnes", +"moulin-mageois", +"moulin-mageoise", +"moulin-mageoises", +"moulin-à-vent", +"moulins-à-vent", +"moustique-tigre", +"moustiques-tigres", +"mouton-noirisa", +"mouton-noirisai", +"mouton-noirisaient", +"mouton-noirisais", +"mouton-noirisait", +"mouton-noirisant", +"mouton-noirisas", +"mouton-noirisasse", +"mouton-noirisassent", +"mouton-noirisasses", +"mouton-noirisassiez", +"mouton-noirisassions", +"mouton-noirise", +"mouton-noirisent", +"mouton-noiriser", +"mouton-noirisera", +"mouton-noiriserai", +"mouton-noiriseraient", +"mouton-noiriserais", +"mouton-noiriserait", +"mouton-noiriseras", +"mouton-noiriserez", +"mouton-noiriseriez", +"mouton-noiriserions", +"mouton-noiriserons", +"mouton-noiriseront", +"mouton-noirises", +"mouton-noirisez", +"mouton-noirisiez", +"mouton-noirisions", +"mouton-noirisons", +"mouton-noirisâmes", +"mouton-noirisât", +"mouton-noirisâtes", +"mouton-noirisèrent", +"mouton-noirisé", +"mouton-noirisée", +"mouton-noirisées", +"mouton-noirisés", +"mouve-chaux", +"moyens-ducs", +"mu'ugalavyáni", +"mu-métal", +"muco-pus", +"mud-minnow", +"mule-jenny", +"mull-jenny", +"multiplate-forme", +"multiplates-formes", +"mur-rideau", +"murnau-werdenfels", +"murs-rideaux", +"musculo-cutané", +"musettes-repas", +"music-hall", +"music-hallesque", +"music-hallesques", +"music-halls", +"mâche-bouchons", +"mâche-dru", +"mâche-laurier", +"mâle-stérile", +"mâle-stériles", +"mâles-stériles", +"mère-grand", +"mères-grand", +"mètre-ruban", +"mètres-ruban", +"mécoprop-P", +"médecine-ball", +"médecine-balls", +"médio-dorsal", +"médio-européen", +"médio-européenne", +"médio-européennes", +"médio-européens", +"médio-jurassique", +"médio-jurassiques", +"médio-latin", +"médio-latine", +"médio-latines", +"médio-latins", +"médio-océanique", +"médio-océaniques", +"médiéval-fantastique", +"médiévale-fantastique", +"médiévales-fantastiques", +"médiévaux-fantastiques", +"méduse-boite", +"méduse-boîte", +"méduses-boites", +"méduses-boîtes", +"méfenpyr-diéthyl", +"méga-ampère", +"méga-ampères", +"méga-herbivore", +"méga-herbivores", +"méga-océan", +"méga-océans", +"méga-ohm", +"méga-ohms", +"méga-église", +"méga-églises", +"méga-électron-volt", +"méga-électron-volts", +"mégalo-martyr", +"mégalo-martyrs", +"mégaélectron-volt", +"mégaélectron-volts", +"mégléno-roumain", +"méli-mélo", +"mélis-mélos", +"ménil-annellois", +"ménil-annelloise", +"ménil-annelloises", +"ménil-gondoyen", +"ménil-gondoyenne", +"ménil-gondoyennes", +"ménil-gondoyens", +"méningo-encéphalite", +"méningo-gastrique", +"méningo-gastriques", +"mépiquat-chlorure", +"mérier-blanc", +"mériers-blancs", +"méso-américain", +"méso-américaine", +"méso-américaines", +"méso-américains", +"méso-diastolique", +"méso-diastoliques", +"méso-hygrophile", +"méso-hygrophiles", +"méso-systolique", +"méso-systoliques", +"mésosulfuron-méthyl-sodium", +"métacarpo-phalangien", +"métalaxyl-M", +"métam-sodium", +"métaphysico-théologo-cosmolo-nigologie", +"métaphysico-théologo-cosmolo-nigologies", +"métatarso-phalangien", +"méthyl-buténol", +"métirame-zinc", +"métro-boulot-dodo", +"météo-dépendant", +"météo-dépendante", +"météo-dépendantes", +"météo-dépendants", +"mêle-tout", +"mêli-mêlo", +"mêlis-mêlos", +"mêlé-cass", +"mêlé-casse", +"mêlé-casses", +"mêlé-cassis", +"n'dama", +"n'damas", +"n'srani", +"n-3", +"n-6", +"n-9", +"n-aire", +"n-aires", +"n-boule", +"n-boules", +"n-butane", +"n-butanes", +"n-butyle", +"n-cube", +"n-cubes", +"n-dimensionnel", +"n-gone", +"n-gones", +"n-gramme", +"n-grammes", +"n-ième", +"n-ièmes", +"n-octaèdre", +"n-octaèdres", +"n-polytope", +"n-polytopes", +"n-simplexe", +"n-simplexes", +"n-sphère", +"n-sphères", +"n-uple", +"n-uples", +"n-uplet", +"n-uplets", +"na-dené", +"na-déné", +"nam-nam", +"nam-nams", +"name-dropping", +"nano-ohm", +"nano-ohms", +"naphtoxy-2-acétamide", +"narco-guérilla", +"narco-guérillas", +"narco-trafiquant", +"narco-trafiquants", +"narco-État", +"narco-États", +"narcotico-âcre", +"naso-génien", +"naso-lobaire", +"naso-lobaires", +"naso-oculaire", +"naso-palatin", +"naso-palpébral", +"naso-sourcilier", +"naso-transversal", +"nat-gadaw", +"nat-gadaws", +"nat-kadaw", +"nat-kadaws", +"national-socialisme", +"national-socialiste", +"nationale-socialiste", +"nationales-socialistes", +"nationaux-socialistes", +"natro-feldspat", +"natro-feldspats", +"natu-majorité", +"nautico-estival", +"navarro-aragonais", +"navarro-labourdin", +"navire-citerne", +"navire-mère", +"navire-usine", +"navire-école", +"navires-citernes", +"navires-mères", +"navires-écoles", +"ne-m'oubliez-pas", +"negro-spiritual", +"negro-spirituals", +"neptuno-plutonien", +"neptuno-plutonienne", +"neptuno-plutoniens", +"nerf-ferrure", +"nerf-férure", +"net-citoyen", +"net-citoyens", +"nettoie-pipe", +"neuf-berquinois", +"neuf-berquinoise", +"neuf-berquinoises", +"neuf-cents", +"neuro-acoustique", +"neuro-acoustiques", +"neuro-anatomie", +"neuro-anatomies", +"neuro-humoral", +"neuro-humorale", +"neuro-humorales", +"neuro-humoraux", +"neuro-imagerie", +"neuro-imageries", +"neuro-linguistique", +"neuro-linguistiques", +"neuro-musculaire", +"neuro-musculaires", +"neuro-stimulation", +"neuro-végétatif", +"neuro-végétatifs", +"neuro-végétative", +"neuro-végétatives", +"neutro-alcalin", +"neuve-chapellois", +"neuve-chapelloise", +"neuve-chapelloises", +"neuve-grangeais", +"neuve-grangeaise", +"neuve-grangeaises", +"neuville-boscien", +"neuville-boscienne", +"neuville-bosciennes", +"neuville-bosciens", +"neuvy-sautourien", +"neuvy-sautourienne", +"neuvy-sautouriennes", +"neuvy-sautouriens", +"new-yorkais", +"new-yorkaise", +"new-yorkaises", +"new-yorkisa", +"new-yorkisai", +"new-yorkisaient", +"new-yorkisais", +"new-yorkisait", +"new-yorkisant", +"new-yorkisas", +"new-yorkisasse", +"new-yorkisassent", +"new-yorkisasses", +"new-yorkisassiez", +"new-yorkisassions", +"new-yorkise", +"new-yorkisent", +"new-yorkiser", +"new-yorkisera", +"new-yorkiserai", +"new-yorkiseraient", +"new-yorkiserais", +"new-yorkiserait", +"new-yorkiseras", +"new-yorkiserez", +"new-yorkiseriez", +"new-yorkiserions", +"new-yorkiserons", +"new-yorkiseront", +"new-yorkises", +"new-yorkisez", +"new-yorkisiez", +"new-yorkisions", +"new-yorkisons", +"new-yorkisâmes", +"new-yorkisât", +"new-yorkisâtes", +"new-yorkisèrent", +"new-yorkisé", +"new-yorkisée", +"new-yorkisées", +"new-yorkisés", +"newton-mètre", +"newtons-mètres", +"nez-en-cœur", +"nez-percé", +"ngaï-ngaï", +"ngaï-ngaïs", +"ni-ni", +"nian-nian", +"niche-crédence", +"nickel-ankérite", +"nickel-ankérites", +"nickel-magnésite", +"nickel-magnésites", +"nickel-skuttérudite", +"nickel-skuttérudites", +"nid-de-poule", +"night-club", +"night-clubbing", +"night-clubs", +"nigéro-congolais", +"nilo-saharien", +"nilo-saharienne", +"nilo-sahariennes", +"nilo-sahariens", +"nin-nin", +"nippo-américain", +"nippo-américaine", +"nippo-américaines", +"nippo-américains", +"nique-douille", +"nique-douilles", +"nitro-cellulose", +"nitro-celluloses", +"nitro-hydrochlorique", +"nitro-hydrochloriques", +"nitrotal-isopropyl", +"niuafo'ou", +"niuafo'ous", +"nivo-glaciaire", +"nivo-glaciaires", +"nivo-pluvial", +"no-kill", +"no-kills", +"no-poo", +"noie-chien", +"noir-pie", +"noir-pioche", +"noir-pioches", +"noir-ployant", +"noisy-rudignonais", +"noisy-rudignonaise", +"noisy-rudignonaises", +"noli-me-tangere", +"nonante-cinq", +"nonante-deux", +"nonante-et-un", +"nonante-huit", +"nonante-neuf", +"nonante-quatre", +"nonante-sept", +"nonante-six", +"nonante-trois", +"nort-leulinghemois", +"nort-leulinghemoise", +"nort-leulinghemoises", +"nous-même", +"nous-mêmes", +"nouveau-gallois", +"nouveau-né", +"nouveau-née", +"nouveau-nées", +"nouveau-nés", +"nouveau-venu", +"nouveaux-nés", +"nouveaux-venus", +"nouvel-âgeuse", +"nouvel-âgeuses", +"nouvel-âgeux", +"nouvelle-née", +"nouvelle-venue", +"nouvelles-nées", +"nouvelles-venues", +"noyé-d'eau", +"nu-pied", +"nu-pieds", +"nu-propriétaire", +"nu-tête", +"nue-propriétaire", +"nue-propriété", +"nuer-dinka", +"nues-propriétaires", +"nues-propriétés", +"nuit-deboutiste", +"nuit-deboutistes", +"nuoc-mam", +"nuoc-mâm", +"nus-propriétaires", +"nègre-soie", +"nègres-soies", +"nègue-chien", +"nègue-fol", +"néfaste-food", +"néfaste-foods", +"néphro-angiosclérose", +"néphro-angioscléroses", +"néphro-gastrique", +"néphro-urétérectomie", +"néphro-urétérectomies", +"névro-mimosie", +"névro-mimosies", +"nœud-nœud", +"nœuds-nœuds", +"o-ring", +"o-rings", +"occipito-atloïdien", +"occipito-atloïdienne", +"occipito-atloïdiennes", +"occipito-atloïdiens", +"occipito-axoïdien", +"occipito-axoïdienne", +"occipito-axoïdiennes", +"occipito-axoïdiens", +"occipito-cotyloïdien", +"occipito-cotyloïdienne", +"occipito-cotyloïdiennes", +"occipito-cotyloïdiens", +"occipito-frontal", +"occipito-méningien", +"occipito-pariétal", +"occipito-pétreuse", +"occipito-pétreuses", +"occipito-pétreux", +"occipito-sacro-iliaque", +"occipito-sacré", +"occitano-roman", +"octante-deux", +"octante-et-un", +"octante-neuf", +"octo-core", +"octo-cores", +"octo-rotor", +"octo-rotors", +"oculo-motricité", +"oculo-motricités", +"oculo-musculaire", +"oculo-musculaires", +"oculo-zygomatique", +"odonto-stomatologie", +"oeil-de-boeuf", +"oeil-de-chat", +"oeil-de-lièvre", +"oeil-de-paon", +"oeil-de-perdrix", +"oeil-de-pie", +"oeil-de-serpent", +"oeil-de-tigre", +"oeil-du-soleil", +"oeils-de-boeuf", +"oeils-de-chat", +"oeils-de-lièvre", +"oeils-de-paon", +"oeils-de-perdrix", +"oeils-de-pie", +"oeils-de-serpent", +"oeils-de-tigre", +"oesophago-gastro-duodénoscopie", +"oesophago-gastro-duodénoscopies", +"off-market", +"off-shore", +"ogivo-cylindrique", +"ohm-mètre", +"ohms-mètres", +"oie-cygne", +"oiseau-chameau", +"oiseau-cloche", +"oiseau-lyre", +"oiseau-mouche", +"oiseau-papillon", +"oiseau-tonnerre", +"oiseau-trompette", +"oiseau-éléphant", +"oiseaux-chameaux", +"oiseaux-cloches", +"oiseaux-lyres", +"oiseaux-mouches", +"oiseaux-papillons", +"oiseaux-tonnerres", +"oiseaux-trompettes", +"old-ice", +"old-ices", +"oligo-élément", +"oligo-éléments", +"olla-podrida", +"olé-olé", +"oléo-calcaire", +"oléo-calcaires", +"omaha-ponca", +"omaha-poncas", +"omble-chevalier", +"ombre-chevalier", +"ombro-thermique", +"ombro-thermiques", +"omphalo-mésentérique", +"omphalo-mésentériques", +"omphalo-phlébite", +"omphalo-phlébites", +"oméga-3", +"oméga-6", +"oméga-9", +"on-dit", +"one-man-show", +"one-shot", +"one-step", +"one-steps", +"one-woman-show", +"oost-cappelois", +"oost-cappeloise", +"oost-cappeloises", +"opal-AN", +"open-source", +"open-space", +"open-spaces", +"opt-in", +"opt-out", +"opto-strié", +"opéra-comique", +"opéras-comiques", +"or-sol", +"orang-outan", +"orang-outang", +"orangs-outangs", +"orangs-outans", +"orbito-nasal", +"orbito-palpébral", +"oreille-d'abbé", +"oreille-d'ours", +"oreille-d'âne", +"oreille-de-lièvre", +"oreille-de-loup", +"oreille-de-mer", +"oreille-de-souris", +"oreilles-d'ours", +"oreilles-d'âne", +"oreilles-de-mer", +"oreilles-de-souris", +"organo-calcaire", +"organo-calcaires", +"organo-chloré", +"organo-chlorée", +"organo-chlorées", +"organo-chlorés", +"organo-halogéné", +"organo-halogénée", +"organo-halogénées", +"organo-halogénés", +"organo-phosphoré", +"organo-phosphorée", +"organo-phosphorées", +"organo-phosphorés", +"orienteur-marqueur", +"orienté-objet", +"orp-jauchois", +"ortho-sympathique", +"ortho-sympathiques", +"ossau-iraty", +"ossau-iratys", +"ostéo-arthrite", +"ostéo-arthrites", +"oto-rhino", +"oto-rhino-laryngologie", +"oto-rhino-laryngologies", +"oto-rhino-laryngologiste", +"oto-rhino-laryngologistes", +"oto-rhinos", +"ouaf-ouaf", +"oui-da", +"oui-non-bof", +"ouralo-altaïque", +"ouralo-altaïques", +"ours-garou", +"ours-garous", +"ouve-wirquinois", +"ouve-wirquinoise", +"ouve-wirquinoises", +"ouèche-ouèche", +"ouèches-ouèches", +"ouï-dire", +"ouïr-dire", +"ovo-lacto-végétarisme", +"ovo-lacto-végétarismes", +"ovo-urinaire", +"ovo-végétarisme", +"ovo-végétarismes", +"oxidéméton-méthyl", +"oxo-biodégradable", +"oxo-biodégradables", +"oxo-dégradable", +"oxo-dégradables", +"oxy-iodure", +"oxy-iodures", +"oxydo-réduction", +"oxydo-réductions", +"oxydéméton-méthyl", +"p'rlotte", +"p't-être", +"p'tain", +"p'tit", +"p'tite", +"p'tites", +"p'tits", +"p-acétylaminophénol", +"p-adique", +"p-adiques", +"p-graphe", +"p-graphes", +"p.-ê.", +"pH-mètre", +"pa'anga", +"pack-ice", +"pack-ices", +"package-deal", +"package-deals", +"pagano-chrétien", +"page-turner", +"pail-mail", +"paille-en-cul", +"paille-en-queue", +"pailles-en-cul", +"pailles-en-queue", +"pain-beurre", +"pain-d'épicier", +"pain-d'épiciers", +"pain-d'épicière", +"pain-d'épicières", +"pain-de-pourceau", +"pains-de-pourceau", +"pair-programma", +"pair-programmai", +"pair-programmaient", +"pair-programmais", +"pair-programmait", +"pair-programmant", +"pair-programmas", +"pair-programmasse", +"pair-programmassent", +"pair-programmasses", +"pair-programmassiez", +"pair-programmassions", +"pair-programme", +"pair-programment", +"pair-programmer", +"pair-programmera", +"pair-programmerai", +"pair-programmeraient", +"pair-programmerais", +"pair-programmerait", +"pair-programmeras", +"pair-programmerez", +"pair-programmeriez", +"pair-programmerions", +"pair-programmerons", +"pair-programmeront", +"pair-programmes", +"pair-programmez", +"pair-programmiez", +"pair-programmions", +"pair-programmons", +"pair-programmâmes", +"pair-programmât", +"pair-programmâtes", +"pair-programmèrent", +"pair-programmé", +"pair-à-pair", +"pal-fer", +"palato-labial", +"palato-labiale", +"palato-pharyngien", +"palato-pharyngite", +"palato-pharyngites", +"palato-salpingien", +"palato-staphylin", +"palato-staphylins", +"palladico-potassique", +"palmier-chanvre", +"palmier-dattier", +"palmiers-chanvre", +"palmiers-dattiers", +"palpe-mâchoire", +"palu'e", +"palu'es", +"paléo-continental", +"paléo-lac", +"paléo-lacs", +"paléo-reconstruction", +"paléo-reconstructions", +"pama-nyungan", +"pan-européen", +"pan-européenne", +"pan-européennes", +"pan-européens", +"pan-lucanisme", +"pan-mandingue", +"pan-mandingues", +"panchen-lama", +"pancréatico-duodénal", +"panier-repas", +"paniers-repas", +"panpan-cucul", +"panthère-garou", +"panthères-garous", +"papa-gâteau", +"papas-gâteaux", +"papier-caillou-ciseaux", +"papier-calque", +"papier-cul", +"papier-filtre", +"papier-monnaie", +"papiers-calque", +"papy-boom", +"papy-boomer", +"papy-boomers", +"papy-boomeur", +"papy-boomeurs", +"paquet-cadeau", +"paquets-cadeaux", +"par-cœur", +"par-dehors", +"par-delà", +"par-derrière", +"par-dessous", +"par-dessus", +"par-devant", +"par-devers", +"para-acétyl-amino-phénol", +"para-continental", +"para-dichlorobenzène", +"para-légal", +"para-légale", +"para-légales", +"para-légaux", +"parachute-frein", +"parachutes-freins", +"parathion-méthyl", +"parathion-éthyl", +"parc-d'anxtotais", +"parc-d'anxtotaise", +"parc-d'anxtotaises", +"parking-relais", +"parler-pour-ne-rien-dire", +"parotido-auriculaire", +"parotido-auriculaires", +"parti-pris", +"participation-pari", +"particule-dieu", +"particules-dieu", +"parva-pétricien", +"parva-pétricienne", +"parva-pétriciennes", +"parva-pétriciens", +"pas-d'âne", +"pas-de-porte", +"pas-à-pas", +"pascal-seconde", +"pascals-secondes", +"paso-doble", +"paso-dobles", +"passif-agressif", +"passifs-agressifs", +"passing-shot", +"passing-shots", +"patronnier-gradeur", +"patronniers-gradeurs", +"patronnière-gradeuse", +"patronnières-gradeuses", +"patte-d'oie", +"patte-de-lièvre", +"patte-pelu", +"patte-pelus", +"pattes-d'oie", +"pattes-de-lièvre", +"pauci-relationnel", +"pauci-relationnelle", +"pauci-relationnelles", +"pauci-relationnels", +"pauci-spécifique", +"pauci-spécifiques", +"pause-café", +"pause-carrière", +"pause-santé", +"pauses-café", +"pauses-carrière", +"pauses-santé", +"pay-per-view", +"pay-to-win", +"pays-bas", +"payé-emporté", +"pc-banking", +"peau-bleue", +"peau-de-chienna", +"peau-de-chiennai", +"peau-de-chiennaient", +"peau-de-chiennais", +"peau-de-chiennait", +"peau-de-chiennant", +"peau-de-chiennas", +"peau-de-chiennasse", +"peau-de-chiennassent", +"peau-de-chiennasses", +"peau-de-chiennassiez", +"peau-de-chiennassions", +"peau-de-chienne", +"peau-de-chiennent", +"peau-de-chienner", +"peau-de-chiennera", +"peau-de-chiennerai", +"peau-de-chienneraient", +"peau-de-chiennerais", +"peau-de-chiennerait", +"peau-de-chienneras", +"peau-de-chiennerez", +"peau-de-chienneriez", +"peau-de-chiennerions", +"peau-de-chiennerons", +"peau-de-chienneront", +"peau-de-chiennes", +"peau-de-chiennez", +"peau-de-chienniez", +"peau-de-chiennions", +"peau-de-chiennons", +"peau-de-chiennâmes", +"peau-de-chiennât", +"peau-de-chiennâtes", +"peau-de-chiennèrent", +"peau-de-chienné", +"peau-de-chiennée", +"peau-de-chiennées", +"peau-de-chiennés", +"peau-rouge", +"peaux-rouges", +"peer-to-peer", +"peigne-cul", +"peigne-culs", +"peigne-zizi", +"peine-à-jouir", +"peis-coua", +"pele-ata", +"pelle-pioche", +"pelle-à-cul", +"pelles-bêches", +"pelles-pioches", +"pelles-à-cul", +"pelure-d'oignon", +"pelvi-crural", +"pelvi-trochantérien", +"pelvi-trochantérienne", +"pelvi-trochantériennes", +"pelvi-trochantériens", +"pen-testeur", +"pen-testeurs", +"pen-testeuse", +"pen-testeuses", +"pen-ty", +"pencak-silat", +"penn-ty", +"pense-bête", +"pense-bêtes", +"penta-continental", +"penta-core", +"penta-cores", +"penta-cœur", +"penta-cœurs", +"people-isa", +"people-isai", +"people-isaient", +"people-isais", +"people-isait", +"people-isant", +"people-isas", +"people-isasse", +"people-isassent", +"people-isasses", +"people-isassiez", +"people-isassions", +"people-ise", +"people-isent", +"people-iser", +"people-isera", +"people-iserai", +"people-iseraient", +"people-iserais", +"people-iserait", +"people-iseras", +"people-iserez", +"people-iseriez", +"people-iserions", +"people-iserons", +"people-iseront", +"people-ises", +"people-isez", +"people-isiez", +"people-isions", +"people-isons", +"people-isâmes", +"people-isât", +"people-isâtes", +"people-isèrent", +"people-isé", +"people-isée", +"people-isées", +"people-isés", +"perche-brochet", +"perche-soleil", +"perd-sa-queue", +"perd-tout", +"perdant-perdant", +"perdante-perdante", +"perdantes-perdantes", +"perdants-perdants", +"perfo-vérif", +"perroquet-hibou", +"perroquets-hiboux", +"perruche-moineau", +"perruches-moineaux", +"pesco-végétarien", +"pet'che", +"pet-d'âne", +"pet-de-loup", +"pet-de-nonne", +"pet-de-soeur", +"pet-de-sœur", +"pet-en-l'air", +"petites-bourgeoises", +"petites-bourgeoisies", +"petites-filles", +"petites-mains", +"petites-maîtresses", +"petites-nièces", +"petites-russes", +"petits-beurre", +"petits-bourgeois", +"petits-chênes", +"petits-ducs", +"petits-déjeuners", +"petits-enfants", +"petits-fils", +"petits-fours", +"petits-gris", +"petits-laits", +"petits-maîtres", +"petits-neveux", +"petits-russes", +"petits-suisses", +"petits-trains", +"pets-de-loup", +"pets-de-nonne", +"peul-peul", +"peut-être", +"pharyngo-laryngite", +"pharyngo-laryngites", +"pharyngo-staphylin", +"philosopho-théologique", +"philosopho-théologiques", +"phonético-symbolique", +"phoque-garou", +"phoque-léopard", +"phoques-garous", +"phosphate-allophane", +"phosphate-allophanes", +"phoséthyl-Al", +"phosétyl-Al", +"photos-finish", +"phragmito-scirpaie", +"phragmito-scirpaies", +"phrase-clé", +"phrases-clés", +"phréno-glottisme", +"phréno-glottismes", +"physico-chimie", +"physico-chimies", +"physico-chimique", +"physico-chimiques", +"physico-mathématique", +"physico-mathématiques", +"physio-pathologie", +"physio-pathologies", +"phénico-punique", +"phénico-puniques", +"pian's", +"piane-piane", +"piano-bar", +"piano-bars", +"piano-forte", +"piano-fortes", +"piano-manivelle", +"pic-vert", +"pic-verts", +"pichot-chêne", +"pichots-chênes", +"pick-up", +"pick-ups", +"pico-condensateur", +"pico-condensateurs", +"pico-ohm", +"pico-ohms", +"pics-verts", +"pidgin-english", +"pie-grièche", +"pie-mère", +"pie-noir", +"pie-noire", +"pie-noires", +"pie-noirs", +"pie-rouge", +"pied-bot", +"pied-d'alouette", +"pied-d'oiseau", +"pied-d'étape", +"pied-de-banc", +"pied-de-biche", +"pied-de-boeuf", +"pied-de-bœuf", +"pied-de-chat", +"pied-de-cheval", +"pied-de-chèvre", +"pied-de-coq", +"pied-de-corbeau", +"pied-de-griffon", +"pied-de-lion", +"pied-de-loup", +"pied-de-mouche", +"pied-de-mouton", +"pied-de-pigeon", +"pied-de-poule", +"pied-de-pélican", +"pied-de-veau", +"pied-droit", +"pied-fort", +"pied-noir", +"pied-noire", +"pied-noirisa", +"pied-noirisai", +"pied-noirisaient", +"pied-noirisais", +"pied-noirisait", +"pied-noirisant", +"pied-noirisas", +"pied-noirisasse", +"pied-noirisassent", +"pied-noirisasses", +"pied-noirisassiez", +"pied-noirisassions", +"pied-noirise", +"pied-noirisent", +"pied-noiriser", +"pied-noirisera", +"pied-noiriserai", +"pied-noiriseraient", +"pied-noiriserais", +"pied-noiriserait", +"pied-noiriseras", +"pied-noiriserez", +"pied-noiriseriez", +"pied-noiriserions", +"pied-noiriserons", +"pied-noiriseront", +"pied-noirises", +"pied-noirisez", +"pied-noirisiez", +"pied-noirisions", +"pied-noirisons", +"pied-noirisâmes", +"pied-noirisât", +"pied-noirisâtes", +"pied-noirisèrent", +"pied-noirisé", +"pied-noirisée", +"pied-noirisées", +"pied-noirisés", +"pied-plat", +"pied-rouge", +"pied-tendre", +"pied-vert", +"pied-à-terre", +"pieds-bots", +"pieds-d'alouette", +"pieds-d'oiseau", +"pieds-de-biche", +"pieds-de-boeuf", +"pieds-de-bœuf", +"pieds-de-chat", +"pieds-de-chèvre", +"pieds-de-coq", +"pieds-de-corbeau", +"pieds-de-griffon", +"pieds-de-lion", +"pieds-de-mouche", +"pieds-de-mouton", +"pieds-de-veau", +"pieds-droits", +"pieds-forts", +"pieds-noires", +"pieds-noirs", +"pieds-paquets", +"pieds-plats", +"pieds-tendres", +"pierre-buffiérois", +"pierre-buffiéroise", +"pierre-buffiéroises", +"pierre-bénitain", +"pierre-bénitaine", +"pierre-bénitaines", +"pierre-bénitains", +"pierre-châtelois", +"pierre-châteloise", +"pierre-châteloises", +"pierre-feuille-ciseaux", +"pierre-levéen", +"pierre-levéenne", +"pierre-levéennes", +"pierre-levéens", +"pierre-montois", +"pierre-montoise", +"pierre-montoises", +"pierre-papier-ciseaux", +"pierre-qui-vire", +"pierres-qui-virent", +"pies-grièches", +"pies-mères", +"pile-poil", +"pilo-sébacé", +"pin's", +"pin-pon", +"pin-up", +"pince-balle", +"pince-balles", +"pince-fesse", +"pince-fesses", +"pince-lisière", +"pince-maille", +"pince-mailles", +"pince-monseigneur", +"pince-nez", +"pince-notes", +"pince-oreille", +"pince-oreilles", +"pince-sans-rire", +"pince-érigne", +"pince-érignes", +"pinces-monseigneur", +"ping-pong", +"ping-pongs", +"pino-balméen", +"pino-balméenne", +"pino-balméennes", +"pino-balméens", +"pins-justarétois", +"pins-justarétoise", +"pins-justarétoises", +"piou-piou", +"piou-pious", +"pipe-line", +"pipe-lines", +"piqueur-suceur", +"pirimiphos-méthyl", +"pirimiphos-éthyl", +"pis-aller", +"pis-allers", +"pisse-au-lit", +"pisse-chien", +"pisse-chiens", +"pisse-copie", +"pisse-copies", +"pisse-debout", +"pisse-froid", +"pisse-mémère", +"pisse-mémé", +"pisse-sang", +"pisse-trois-gouttes", +"pisse-vinaigre", +"pisse-vinaigres", +"pisse-z-yeux", +"pissy-pôvillais", +"pissy-pôvillaise", +"pissy-pôvillaises", +"pistillo-staminé", +"pistolet-mitrailleur", +"pistolets-mitrailleurs", +"pit-bulls", +"pixie-bob", +"pièces-au-cul", +"piège-à-cons", +"pièges-à-cons", +"pié-de-lion", +"piés-de-lion", +"piétin-verse", +"piétin-échaudage", +"piézo-électricité", +"piézo-électricités", +"piézo-électrique", +"piézo-électriques", +"plachy-buyonnais", +"plachy-buyonnaise", +"plachy-buyonnaises", +"plain-chant", +"plain-pied", +"plains-chants", +"plains-pieds", +"plan-masse", +"plan-plan", +"plan-planisme", +"plan-planismes", +"plan-socialisa", +"plan-socialisai", +"plan-socialisaient", +"plan-socialisais", +"plan-socialisait", +"plan-socialisant", +"plan-socialisas", +"plan-socialisasse", +"plan-socialisassent", +"plan-socialisasses", +"plan-socialisassiez", +"plan-socialisassions", +"plan-socialise", +"plan-socialisent", +"plan-socialiser", +"plan-socialisera", +"plan-socialiserai", +"plan-socialiseraient", +"plan-socialiserais", +"plan-socialiserait", +"plan-socialiseras", +"plan-socialiserez", +"plan-socialiseriez", +"plan-socialiserions", +"plan-socialiserons", +"plan-socialiseront", +"plan-socialises", +"plan-socialisez", +"plan-socialisiez", +"plan-socialisions", +"plan-socialisons", +"plan-socialisâmes", +"plan-socialisât", +"plan-socialisâtes", +"plan-socialisèrent", +"plan-socialisé", +"plan-socialisée", +"plan-socialisées", +"plan-socialisés", +"plan-séquence", +"plan-séquences", +"planches-contacts", +"plans-masses", +"plans-séquences", +"plante-crayon", +"plante-éponge", +"plantes-crayons", +"plaque-bière", +"plaque-tonnerre", +"plat-bord", +"plat-cul", +"plat-culs", +"plat-de-bierre", +"plate-bande", +"plate-bière", +"plate-face", +"plate-forme", +"plate-longe", +"plateau-repas", +"plateaux-repas", +"plates-bandes", +"plates-formes", +"plates-longes", +"platinico-ammonique", +"plats-bords", +"play-back", +"play-backs", +"play-boy", +"play-boys", +"play-off", +"play-offs", +"plaît-il", +"plein-cintre", +"plein-emploi", +"pleine-fougerais", +"pleine-fougeraise", +"pleine-fougeraises", +"pleins-cintres", +"plessis-ansoldien", +"plessis-ansoldienne", +"plessis-ansoldiennes", +"plessis-ansoldiens", +"plessis-brionnais", +"plessis-brionnaise", +"plessis-brionnaises", +"plessis-bucardésien", +"plessis-bucardésienne", +"plessis-bucardésiennes", +"plessis-bucardésiens", +"plessis-episcopien", +"plessis-episcopienne", +"plessis-episcopiennes", +"plessis-episcopiens", +"plessis-grammoirien", +"plessis-grammoirienne", +"plessis-grammoiriennes", +"plessis-grammoiriens", +"plessis-luzarchois", +"plessis-luzarchoise", +"plessis-luzarchoises", +"plessis-macéen", +"plessis-macéenne", +"plessis-macéennes", +"plessis-macéens", +"plessis-épiscopien", +"plessis-épiscopienne", +"plessis-épiscopiennes", +"plessis-épiscopiens", +"pleu-pleu", +"pleure-misère", +"pleure-misères", +"pleuro-péricardite", +"pleuronecte-guitare", +"plieuse-inséreuse", +"plieuses-inséreuses", +"plongée-spéléo", +"plongées-spéléo", +"plouezoc'hois", +"plouezoc'hoise", +"plouezoc'hoises", +"ploulec'hois", +"ploulec'hoise", +"ploulec'hoises", +"plounéour-trezien", +"plounéour-trezienne", +"plounéour-treziennes", +"plounéour-treziens", +"ploye-ressort", +"plui-plui", +"plum-cake", +"plum-cakes", +"plum-pudding", +"plumbo-aragonite", +"plumbo-aragonites", +"plume-couteau", +"plumes-couteaux", +"pluri-continental", +"pluri-interprétable", +"pluri-interprétables", +"pluri-journalier", +"pluri-modal", +"pluri-national", +"pluri-nationale", +"pluri-nationales", +"pluri-nationaux", +"plus-d'atouts", +"plus-disant", +"plus-part", +"plus-payé", +"plus-produit", +"plus-produits", +"plus-pétition", +"plus-que-parfait", +"plus-que-parfaits", +"plus-value", +"plus-values", +"pluto-neptunien", +"pluvier-hirondelle", +"plû-part", +"poche-cuiller", +"poche-revolver", +"poches-revolver", +"pochette-surprise", +"pochettes-surprise", +"pochettes-surprises", +"podio-régalien", +"podio-régalienne", +"podio-régaliennes", +"podio-régaliens", +"podo-orthésiste", +"podo-orthésistes", +"poggio-mezzanais", +"poggio-mezzanaise", +"poggio-mezzanaises", +"pogne-cul", +"pogne-culs", +"poids-lourd", +"poids-lourds", +"point-arrière", +"point-col", +"point-milieu", +"point-selle", +"point-virgule", +"point-voyelle", +"pointe-de-coeur", +"pointe-de-cœur", +"pointe-de-diamant", +"pointe-noirais", +"pointe-noiraise", +"pointe-noiraises", +"pointer-et-cliquer", +"pointes-de-coeur", +"pointes-de-cœur", +"pointes-de-diamant", +"points-virgules", +"points-voyelles", +"poissonnier-écailler", +"poitevin-saintongeais", +"poivre-sel", +"poix-résine", +"poka-yoké", +"politico-idéologique", +"politico-idéologiques", +"politico-médiatique", +"politico-religieuse", +"politico-religieuses", +"politico-religieux", +"politico-économique", +"politico-économiques", +"pollueur-payeur", +"pollueurs-payeurs", +"poly-articulaire", +"poly-articulaires", +"poly-insaturé", +"poly-insaturée", +"poly-insaturées", +"poly-insaturés", +"poly-sexuel", +"poly-sexuelle", +"polychlorodibenzo-p-dioxine", +"polychlorodibenzo-p-dioxines", +"pomme-de-pin", +"pomme-grenade", +"pommes-de-pin", +"pompage-turbinage", +"pompages-turbinages", +"ponts-bascules", +"ponts-canaux", +"ponts-de-céais", +"ponts-de-céaise", +"ponts-de-céaises", +"ponts-levis", +"ponts-neufs", +"pop-corn", +"pop-in", +"pop-ins", +"pop-punk", +"pop-up", +"pop-ups", +"popa'a", +"porc-épic", +"porcs-épics", +"portes-fenêtres", +"portes-tambour", +"porteur-de-peau", +"porto-vecchiais", +"porto-vecchiaise", +"porto-vecchiaises", +"portrait-charge", +"portrait-robot", +"portraits-charges", +"portraits-robots", +"pose-tubes", +"post-11-Septembre", +"posé-décollé", +"posé-décollés", +"pot-au-feu", +"pot-au-noir", +"pot-beurrier", +"pot-bouille", +"pot-de-vin", +"pot-en-tête", +"pot-pourri", +"potassico-ammonique", +"potassico-mercureux", +"poto-poto", +"potron-jacquet", +"potron-minet", +"pots-de-vin", +"pots-pourris", +"pou-de-soie", +"pouce-pied", +"pouces-pieds", +"poudre-éclair", +"poudres-éclair", +"poudres-éclairs", +"pouligny-saint-pierre", +"poult-de-soie", +"poults-de-soie", +"pour-boire", +"pour-cent", +"pourri-gâté", +"poursuite-bâillon", +"pousse-au-crime", +"pousse-au-jouir", +"pousse-au-vice", +"pousse-broche", +"pousse-broches", +"pousse-café", +"pousse-cafés", +"pousse-caillou", +"pousse-cailloux", +"pousse-cambrure", +"pousse-cambrures", +"pousse-cul", +"pousse-culs", +"pousse-fiche", +"pousse-goupille", +"pousse-mégot", +"pousse-mégots", +"pousse-navette", +"pousse-pied", +"pousse-pieds", +"pousse-pointe", +"pousse-pointes", +"pousse-pousse", +"pout-de-soie", +"pouts-de-soie", +"poux-de-soie", +"pouy-roquelain", +"pouy-roquelaine", +"pouy-roquelaines", +"pouy-roquelains", +"pouët-pouët", +"pow-wow", +"pow-wows", +"poët-lavalien", +"poët-lavalienne", +"poët-lavaliennes", +"poët-lavaliens", +"premier-ministra", +"premier-ministrai", +"premier-ministraient", +"premier-ministrais", +"premier-ministrait", +"premier-ministrant", +"premier-ministras", +"premier-ministrasse", +"premier-ministrassent", +"premier-ministrasses", +"premier-ministrassiez", +"premier-ministrassions", +"premier-ministre", +"premier-ministrent", +"premier-ministrer", +"premier-ministrera", +"premier-ministrerai", +"premier-ministreraient", +"premier-ministrerais", +"premier-ministrerait", +"premier-ministreras", +"premier-ministrerez", +"premier-ministreriez", +"premier-ministrerions", +"premier-ministrerons", +"premier-ministreront", +"premier-ministres", +"premier-ministrez", +"premier-ministriez", +"premier-ministrions", +"premier-ministrons", +"premier-ministrâmes", +"premier-ministrât", +"premier-ministrâtes", +"premier-ministrèrent", +"premier-ministré", +"premier-ministrée", +"premier-ministrées", +"premier-ministrés", +"premier-né", +"premiers-nés", +"presqu'accident", +"presqu'accidents", +"presqu'ile", +"presqu'iles", +"presqu'île", +"presqu'îles", +"press-book", +"press-books", +"presse-agrume", +"presse-agrumes", +"presse-ail", +"presse-artère", +"presse-artères", +"presse-citron", +"presse-citrons", +"presse-fruits", +"presse-légumes", +"presse-papier", +"presse-papiers", +"presse-purée", +"presse-purées", +"presse-urètre", +"presse-urètres", +"presse-étoffe", +"presse-étoffes", +"presse-étoupe", +"presse-étoupes", +"pressignaco-vicois", +"pressignaco-vicoise", +"pressignaco-vicoises", +"preux-romanien", +"preux-romanienne", +"preux-romaniennes", +"preux-romaniens", +"prie-Dieu", +"prim'holstein", +"prima-mensis", +"prime-sautier", +"prince-président", +"prince-sans-rire", +"prince-édouardien", +"prince-édouardienne", +"prince-édouardiennes", +"prince-édouardiens", +"prince-électeur", +"princes-présidents", +"princes-électeurs", +"prisons-écoles", +"privat-docent", +"privat-docentisme", +"privat-docentismes", +"prix-choc", +"prix-chocs", +"programme-cadre", +"programmes-cadres", +"prohexadione-calcium", +"promis-juré", +"promis-jurée", +"promis-jurées", +"promis-jurés", +"promène-couillon", +"promène-couillons", +"pronom-adjectif", +"pronoms-adjectifs", +"propre-à-rien", +"propres-à-rien", +"prostato-péritonéal", +"prostato-péritonéale", +"prostato-péritonéales", +"prostato-péritonéaux", +"protège-cahier", +"protège-cahiers", +"protège-dent", +"protège-dents", +"protège-mamelon", +"protège-mamelons", +"protège-oreille", +"protège-oreilles", +"protège-slip", +"protège-slips", +"protège-tibia", +"protège-tibias", +"prout-prout", +"prout-proute", +"prout-proutes", +"prout-prouts", +"prud'homal", +"prud'homale", +"prud'homales", +"prud'homaux", +"prud'homie", +"prud'homies", +"prunet-puigois", +"prunet-puigoise", +"prunet-puigoises", +"prunier-cerise", +"pruniers-cerises", +"prés-bois", +"prés-salés", +"prés-vergers", +"président-candidat", +"présidente-candidate", +"présidentes-candidates", +"présidents-candidats", +"présidents-directeurs", +"prêt-à-monter", +"prêt-à-penser", +"prêt-à-porter", +"prêt-à-poster", +"prête-nom", +"prête-noms", +"prêtres-ouvriers", +"prêts-à-penser", +"prêts-à-porter", +"prône-misère", +"pschitt-pschitt", +"psycho-physiologique", +"psycho-physiologiques", +"psycho-physique", +"psycho-physiques", +"psycho-pop", +"ptérygo-pharyngien", +"pub-restaurant", +"pub-restaurants", +"puce-chique", +"puces-chiques", +"pue-la-sueur", +"puis-je", +"puiset-doréen", +"puiset-doréenne", +"puiset-doréennes", +"puiset-doréens", +"pull-buoy", +"pull-buoys", +"pull-over", +"pull-overs", +"pull-up", +"pulmo-aortique", +"pulso-réacteurs", +"pulvérisateur-mélangeur", +"punaise-mouche", +"punaises-mouches", +"punching-ball", +"punching-balls", +"punkah-wallah", +"pur-sang", +"pur-sangs", +"pure-laine", +"purge-mariage", +"purge-mariages", +"purs-sangs", +"push-back", +"push-up", +"putot-bessinois", +"putot-bessinoise", +"putot-bessinoises", +"pyraflufen-éthyl", +"pyrimiphos-méthyl", +"pyrimiphos-éthyl", +"pyro-électricité", +"pyro-électricités", +"pyro-électrique", +"pyro-électriques", +"pâtissier-chocolatier", +"père-la-pudeur", +"pères-la-pudeur", +"pèse-acide", +"pèse-acides", +"pèse-alcool", +"pèse-alcools", +"pèse-bébé", +"pèse-bébés", +"pèse-esprit", +"pèse-esprits", +"pèse-lait", +"pèse-laits", +"pèse-lettre", +"pèse-lettres", +"pèse-liqueur", +"pèse-liqueurs", +"pèse-mout", +"pèse-mouts", +"pèse-moût", +"pèse-moûts", +"pèse-nitre", +"pèse-nitres", +"pèse-personne", +"pèse-personnes", +"pèse-sel", +"pèse-sels", +"pèse-sirop", +"pèse-sirops", +"pèse-vernis", +"pète-sec", +"pète-secs", +"pète-sèche", +"pète-sèches", +"pédal'eau", +"pédicure-podologue", +"pédicures-podologues", +"pénicillino-résistance", +"pénicillino-résistances", +"pénicillino-sensibilité", +"pénicillino-sensibilités", +"péronéo-calcanéen", +"péronéo-malléolaire", +"péronéo-malléolaires", +"péronéo-phalangien", +"péronéo-tibial", +"péta-ampère", +"péta-ampères", +"péta-électron-volt", +"péta-électron-volts", +"pétaélectron-volt", +"pétaélectron-volts", +"pétro-monarchie", +"pétro-monarchies", +"pétro-occipital", +"pétro-salpingo-staphylin", +"pétro-salpingo-staphylins", +"pétro-staphylin", +"pétrolier-minéralier", +"pétrus-colien", +"pétrus-colienne", +"pétrus-coliennes", +"pétrus-coliens", +"pêche-bernard", +"pêche-bernards", +"q'anjob'al", +"qu-in-situ", +"quad-core", +"quad-cores", +"quadri-accélération", +"quadri-accélérationnellement", +"quadri-ailé", +"quadri-couche", +"quadri-couches", +"quadri-courant", +"quadri-dimensionnel", +"quadri-dimensionnelle", +"quadri-dimensionnelles", +"quadri-dimensionnels", +"quadri-rotor", +"quadri-rotors", +"quadruple-croche", +"quadruples-croches", +"quant-à-moi", +"quant-à-soi", +"quarante-cinq", +"quarante-deux", +"quarante-douze", +"quarante-et-un", +"quarante-et-une", +"quarante-huit", +"quarante-huitard", +"quarante-huitarde", +"quarante-huitardes", +"quarante-huitards", +"quarante-huitième", +"quarante-huitièmes", +"quarante-langues", +"quarante-neuf", +"quarante-neuvième", +"quarante-neuvièmes", +"quarante-quatre", +"quarante-sept", +"quarante-six", +"quarante-trois", +"quarante-vingt", +"quart-arrière", +"quart-biscuité", +"quart-d'heure", +"quart-de-cercle", +"quart-de-finaliste", +"quart-de-finalistes", +"quart-de-pouce", +"quart-monde", +"quart-temps", +"quarte-fagot", +"quartier-général", +"quartier-maitre", +"quartier-maitres", +"quartier-maître", +"quartier-mestre", +"quartiers-maîtres", +"quarts-arrières", +"quarts-de-cercle", +"quat'z'arts", +"quatorze-marsiste", +"quatorze-marsistes", +"quatre-cent-vingt-et-un", +"quatre-chevaux", +"quatre-cinq-un", +"quatre-cornes", +"quatre-de-chiffre", +"quatre-feuilles", +"quatre-heura", +"quatre-heurai", +"quatre-heuraient", +"quatre-heurais", +"quatre-heurait", +"quatre-heurant", +"quatre-heuras", +"quatre-heurasse", +"quatre-heurassent", +"quatre-heurasses", +"quatre-heurassiez", +"quatre-heurassions", +"quatre-heure", +"quatre-heurent", +"quatre-heurer", +"quatre-heurera", +"quatre-heurerai", +"quatre-heureraient", +"quatre-heurerais", +"quatre-heurerait", +"quatre-heureras", +"quatre-heurerez", +"quatre-heureriez", +"quatre-heurerions", +"quatre-heurerons", +"quatre-heureront", +"quatre-heures", +"quatre-heurez", +"quatre-heuriez", +"quatre-heurions", +"quatre-heurons", +"quatre-heurâmes", +"quatre-heurât", +"quatre-heurâtes", +"quatre-heurèrent", +"quatre-heuré", +"quatre-huit", +"quatre-mâts", +"quatre-pieds", +"quatre-quart", +"quatre-quarts", +"quatre-quatre", +"quatre-quatre-deux", +"quatre-quint", +"quatre-quints", +"quatre-quinze", +"quatre-quinzes", +"quatre-routois", +"quatre-routoise", +"quatre-routoises", +"quatre-saisons", +"quatre-temps", +"quatre-trois-trois", +"quatre-vingt", +"quatre-vingt-cinq", +"quatre-vingt-deux", +"quatre-vingt-dix", +"quatre-vingt-dix-huit", +"quatre-vingt-dix-neuf", +"quatre-vingt-dix-neuvième", +"quatre-vingt-dix-neuvièmes", +"quatre-vingt-dix-sept", +"quatre-vingt-dixième", +"quatre-vingt-dixièmes", +"quatre-vingt-dizaine", +"quatre-vingt-dizaines", +"quatre-vingt-douze", +"quatre-vingt-huit", +"quatre-vingt-neuf", +"quatre-vingt-onze", +"quatre-vingt-quatorze", +"quatre-vingt-quatre", +"quatre-vingt-quinze", +"quatre-vingt-seize", +"quatre-vingt-sept", +"quatre-vingt-six", +"quatre-vingt-treize", +"quatre-vingt-trois", +"quatre-vingt-un", +"quatre-vingt-une", +"quatre-vingtaine", +"quatre-vingtaines", +"quatre-vingtième", +"quatre-vingtièmes", +"quatre-vingts", +"quatre-épices", +"quatre-épées", +"quatre-œil", +"quatres-de-chiffre", +"que'ques", +"quelqu'un", +"quelqu'une", +"quelques-unes", +"quelques-uns", +"questche-wasser", +"question-piège", +"question-tag", +"questions-pièges", +"questions-réponses", +"questions-tags", +"queue-d'aronde", +"queue-d'hironde", +"queue-d'oison", +"queue-d'or", +"queue-de-carpe", +"queue-de-chat", +"queue-de-cheval", +"queue-de-cochon", +"queue-de-lion", +"queue-de-loup", +"queue-de-morue", +"queue-de-paon", +"queue-de-pie", +"queue-de-poireau", +"queue-de-porc", +"queue-de-pourceau", +"queue-de-poêle", +"queue-de-rat", +"queue-de-renard", +"queue-de-scorpion", +"queue-de-souris", +"queue-de-vache", +"queue-du-chat", +"queue-fourchue", +"queue-rouge", +"queues-d'aronde", +"queues-d'hironde", +"queues-d'or", +"queues-de-chat", +"queues-de-cheval", +"queues-de-cochon", +"queues-de-morue", +"queues-de-pie", +"queues-de-pourceau", +"queues-de-poêle", +"queues-de-rat", +"queues-de-renard", +"queues-de-vache", +"qui-va-là", +"qui-vive", +"quick-and-dirty", +"quintuple-croche", +"quintuples-croches", +"quinze-vingt", +"quinze-vingts", +"quizalofop-P-éthyl", +"quizalofop-p-éthyl", +"quizalofop-éthyl", +"quote-part", +"quotes-parts", +"r'endormaient", +"r'endormais", +"r'endormait", +"r'endormant", +"r'endorme", +"r'endorment", +"r'endormes", +"r'endormez", +"r'endormi", +"r'endormie", +"r'endormies", +"r'endormiez", +"r'endormions", +"r'endormir", +"r'endormira", +"r'endormirai", +"r'endormiraient", +"r'endormirais", +"r'endormirait", +"r'endormiras", +"r'endormirent", +"r'endormirez", +"r'endormiriez", +"r'endormirions", +"r'endormirons", +"r'endormiront", +"r'endormis", +"r'endormisse", +"r'endormissent", +"r'endormisses", +"r'endormissiez", +"r'endormissions", +"r'endormit", +"r'endormons", +"r'endormîmes", +"r'endormît", +"r'endormîtes", +"r'endors", +"r'endort", +"r'es", +"r'est", +"r'ouvert", +"r'ouverte", +"r'ouvertes", +"r'ouverts", +"r'ouvraient", +"r'ouvrais", +"r'ouvrait", +"r'ouvrant", +"r'ouvre", +"r'ouvrent", +"r'ouvres", +"r'ouvrez", +"r'ouvriez", +"r'ouvrions", +"r'ouvrir", +"r'ouvrira", +"r'ouvrirai", +"r'ouvriraient", +"r'ouvrirais", +"r'ouvrirait", +"r'ouvriras", +"r'ouvrirent", +"r'ouvrirez", +"r'ouvririez", +"r'ouvririons", +"r'ouvrirons", +"r'ouvriront", +"r'ouvris", +"r'ouvrisse", +"r'ouvrissent", +"r'ouvrisses", +"r'ouvrissiez", +"r'ouvrissions", +"r'ouvrit", +"r'ouvrons", +"r'ouvrîmes", +"r'ouvrît", +"r'ouvrîtes", +"r'étaient", +"r'étais", +"r'était", +"r'étant", +"r'étiez", +"r'étions", +"r'été", +"r'êtes", +"r'être", +"rabat-eau", +"rabat-eaux", +"rabat-joie", +"rabat-joies", +"rabi'-oul-aououal", +"rabi'-out-tani", +"racine-blanche", +"racines-blanches", +"rad'soc", +"rad'socs", +"rad-soc", +"rad-socs", +"radar-tronçon", +"radars-tronçons", +"radical-socialisme", +"radical-socialismes", +"radical-socialiste", +"radicale-socialiste", +"radicales-socialistes", +"radicaux-socialistes", +"radio-actinium", +"radio-activité", +"radio-activités", +"radio-amateur", +"radio-amateurs", +"radio-canadien", +"radio-carpien", +"radio-carpienne", +"radio-carpiennes", +"radio-carpiens", +"radio-crochet", +"radio-crochets", +"radio-cubital", +"radio-diffusion", +"radio-gramophone", +"radio-gramophones", +"radio-identification", +"radio-identifications", +"radio-interféromètre", +"radio-interféromètres", +"radio-isotope", +"radio-isotopes", +"radio-opacité", +"radio-opacités", +"radio-palmaire", +"radio-phonographe", +"radio-phonographes", +"radio-réalité", +"radio-réalités", +"radio-réveil", +"radio-taxi", +"radio-thorium", +"radio-télévision", +"radio-télévisions", +"radio-télévisé", +"radio-télévisée", +"radio-télévisées", +"radio-télévisés", +"radio-étiquette", +"radio-étiquettes", +"rag-time", +"rag-times", +"rahat-lokoum", +"rahat-lokoums", +"rahat-loukoum", +"rahat-loukoums", +"rai-de-coeur", +"rai-de-cœur", +"raid-aventure", +"raie-aigle", +"raie-guitare", +"raie-papillon", +"raies-aigles", +"raies-papillons", +"rail-road", +"rail-route", +"rais-de-coeur", +"rais-de-cœur", +"raisin-de-chien", +"raisins-de-chien", +"rallie-papier", +"rallonge-bouton", +"rallonge-boutons", +"ralé-poussé", +"ramasse-bourrier", +"ramasse-bourriers", +"ramasse-couvert", +"ramasse-couverts", +"ramasse-miette", +"ramasse-miettes", +"ramasse-monnaie", +"ramasse-poussière", +"ramasse-poussières", +"ramasse-ton-bras", +"ramasseuse-presse", +"ramasseuses-presses", +"ras-de-cou", +"ras-la-moule", +"ras-le-bol", +"ras-le-bonbon", +"ras-le-cresson", +"ras-les-fesses", +"rase-motte", +"rase-mottes", +"rase-pet", +"rase-pets", +"rat-baillet", +"rat-bayard", +"rat-de-cave", +"rat-garou", +"rat-taupe", +"rat-trompette", +"ratisse-caisse", +"rats-de-cave", +"rats-garous", +"ray-grass", +"raz-de-marée", +"re'em", +"re'ems", +"ready-made", +"reality-show", +"reality-shows", +"rebrousse-poil", +"recourbe-cils", +"recto-vaginal", +"recto-verso", +"redouble-cliqua", +"redouble-cliquai", +"redouble-cliquaient", +"redouble-cliquais", +"redouble-cliquait", +"redouble-cliquant", +"redouble-cliquas", +"redouble-cliquasse", +"redouble-cliquassent", +"redouble-cliquasses", +"redouble-cliquassiez", +"redouble-cliquassions", +"redouble-clique", +"redouble-cliquent", +"redouble-cliquer", +"redouble-cliquera", +"redouble-cliquerai", +"redouble-cliqueraient", +"redouble-cliquerais", +"redouble-cliquerait", +"redouble-cliqueras", +"redouble-cliquerez", +"redouble-cliqueriez", +"redouble-cliquerions", +"redouble-cliquerons", +"redouble-cliqueront", +"redouble-cliques", +"redouble-cliquez", +"redouble-cliquiez", +"redouble-cliquions", +"redouble-cliquons", +"redouble-cliquâmes", +"redouble-cliquât", +"redouble-cliquâtes", +"redouble-cliquèrent", +"redouble-cliqué", +"redresse-seins", +"refox-trotta", +"refox-trottai", +"refox-trottaient", +"refox-trottais", +"refox-trottait", +"refox-trottant", +"refox-trottas", +"refox-trottasse", +"refox-trottassent", +"refox-trottasses", +"refox-trottassiez", +"refox-trottassions", +"refox-trotte", +"refox-trottent", +"refox-trotter", +"refox-trottera", +"refox-trotterai", +"refox-trotteraient", +"refox-trotterais", +"refox-trotterait", +"refox-trotteras", +"refox-trotterez", +"refox-trotteriez", +"refox-trotterions", +"refox-trotterons", +"refox-trotteront", +"refox-trottes", +"refox-trottez", +"refox-trottiez", +"refox-trottions", +"refox-trottons", +"refox-trottâmes", +"refox-trottât", +"refox-trottâtes", +"refox-trottèrent", +"refox-trotté", +"regardez-moi", +"reine-claude", +"reine-des-bois", +"reine-des-prés", +"reine-marguerite", +"reines-claudes", +"reines-des-bois", +"reines-des-prés", +"reines-marguerites", +"relève-gravure", +"relève-gravures", +"relève-moustache", +"relève-moustaches", +"relève-quartier", +"relève-quartiers", +"relève-selle", +"relève-selles", +"remettez-vous", +"remicro-onda", +"remicro-ondai", +"remicro-ondaient", +"remicro-ondais", +"remicro-ondait", +"remicro-ondant", +"remicro-ondas", +"remicro-ondasse", +"remicro-ondassent", +"remicro-ondasses", +"remicro-ondassiez", +"remicro-ondassions", +"remicro-onde", +"remicro-ondent", +"remicro-onder", +"remicro-ondera", +"remicro-onderai", +"remicro-onderaient", +"remicro-onderais", +"remicro-onderait", +"remicro-onderas", +"remicro-onderez", +"remicro-onderiez", +"remicro-onderions", +"remicro-onderons", +"remicro-onderont", +"remicro-ondes", +"remicro-ondez", +"remicro-ondiez", +"remicro-ondions", +"remicro-ondons", +"remicro-ondâmes", +"remicro-ondât", +"remicro-ondâtes", +"remicro-ondèrent", +"remicro-ondé", +"remicro-ondée", +"remicro-ondées", +"remicro-ondés", +"remilly-wirquinois", +"remilly-wirquinoise", +"remilly-wirquinoises", +"remonte-pente", +"remonte-pentes", +"remue-ménage", +"remue-ménages", +"remue-méninge", +"remue-méninges", +"remue-queue", +"remue-queues", +"renard-garou", +"renarde-garou", +"rendez-vous", +"rennes-robots", +"renouée-bambou", +"rentr'ouvert", +"rentr'ouverte", +"rentr'ouvertes", +"rentr'ouverts", +"rentr'ouvraient", +"rentr'ouvrais", +"rentr'ouvrait", +"rentr'ouvrant", +"rentr'ouvre", +"rentr'ouvrent", +"rentr'ouvres", +"rentr'ouvrez", +"rentr'ouvriez", +"rentr'ouvrions", +"rentr'ouvrir", +"rentr'ouvrira", +"rentr'ouvrirai", +"rentr'ouvriraient", +"rentr'ouvrirais", +"rentr'ouvrirait", +"rentr'ouvriras", +"rentr'ouvrirent", +"rentr'ouvrirez", +"rentr'ouvririez", +"rentr'ouvririons", +"rentr'ouvrirons", +"rentr'ouvriront", +"rentr'ouvris", +"rentr'ouvrisse", +"rentr'ouvrissent", +"rentr'ouvrisses", +"rentr'ouvrissiez", +"rentr'ouvrissions", +"rentr'ouvrit", +"rentr'ouvrons", +"rentr'ouvrîmes", +"rentr'ouvrît", +"rentr'ouvrîtes", +"rentre-dedans", +"renvoi-instruire", +"repetit-déjeuna", +"repetit-déjeunai", +"repetit-déjeunaient", +"repetit-déjeunais", +"repetit-déjeunait", +"repetit-déjeunant", +"repetit-déjeunas", +"repetit-déjeunasse", +"repetit-déjeunassent", +"repetit-déjeunasses", +"repetit-déjeunassiez", +"repetit-déjeunassions", +"repetit-déjeune", +"repetit-déjeunent", +"repetit-déjeuner", +"repetit-déjeunera", +"repetit-déjeunerai", +"repetit-déjeuneraient", +"repetit-déjeunerais", +"repetit-déjeunerait", +"repetit-déjeuneras", +"repetit-déjeunerez", +"repetit-déjeuneriez", +"repetit-déjeunerions", +"repetit-déjeunerons", +"repetit-déjeuneront", +"repetit-déjeunes", +"repetit-déjeunez", +"repetit-déjeuniez", +"repetit-déjeunions", +"repetit-déjeunons", +"repetit-déjeunâmes", +"repetit-déjeunât", +"repetit-déjeunâtes", +"repetit-déjeunèrent", +"repetit-déjeuné", +"repique-niqua", +"repique-niquai", +"repique-niquaient", +"repique-niquais", +"repique-niquait", +"repique-niquant", +"repique-niquas", +"repique-niquasse", +"repique-niquassent", +"repique-niquasses", +"repique-niquassiez", +"repique-niquassions", +"repique-nique", +"repique-niquent", +"repique-niquer", +"repique-niquera", +"repique-niquerai", +"repique-niqueraient", +"repique-niquerais", +"repique-niquerait", +"repique-niqueras", +"repique-niquerez", +"repique-niqueriez", +"repique-niquerions", +"repique-niquerons", +"repique-niqueront", +"repique-niques", +"repique-niquez", +"repique-niquiez", +"repique-niquions", +"repique-niquons", +"repique-niquâmes", +"repique-niquât", +"repique-niquâtes", +"repique-niquèrent", +"repique-niqué", +"repose-pied", +"repose-pieds", +"repose-poignet", +"repose-poignets", +"repose-tête", +"repose-têtes", +"requin-baleine", +"requin-chabot", +"requin-chat", +"requin-chats", +"requin-citron", +"requin-corail", +"requin-crocodile", +"requin-garou", +"requin-griset", +"requin-hâ", +"requin-maquereau", +"requin-marteau", +"requin-nourrice", +"requin-renard", +"requin-taupe", +"requin-taureau", +"requin-tigre", +"requin-vache", +"requin-zèbre", +"requins-baleines", +"requins-citrons", +"requins-crocodiles", +"requins-garous", +"requins-hâ", +"requins-marteaux", +"requins-taupes", +"requins-tigres", +"rest-o-pack", +"restaurant-bar", +"restaurant-bistro", +"restaurant-brasserie", +"restaurant-pub", +"restaurants-bistros", +"reste-avec", +"resto-bar", +"resto-bistro", +"resto-brasserie", +"resto-pub", +"retraite-chapeau", +"retraites-chapeaux", +"retroussons-nos-manches", +"revenant-bon", +"revenants-bons", +"revenez-y", +"rex-castor", +"rex-castors", +"rez-de-chaussée", +"rez-de-cour", +"rez-de-jardin", +"rez-mur", +"rhodesian-ridgeback", +"rhéo-fluidifiant", +"rhéo-fluidifiante", +"rhéo-fluidifiantes", +"rhéo-fluidifiants", +"rhéo-épaississant", +"rhéo-épaississante", +"rhéo-épaississantes", +"rhéo-épaississants", +"rhéto-roman", +"rhéto-romane", +"rhéto-romanes", +"rhéto-romans", +"ria-sirachois", +"ria-sirachoise", +"ria-sirachoises", +"ric-rac", +"ric-à-rac", +"rick-rolla", +"rick-rollai", +"rick-rollaient", +"rick-rollais", +"rick-rollait", +"rick-rollant", +"rick-rollas", +"rick-rollasse", +"rick-rollassent", +"rick-rollasses", +"rick-rollassiez", +"rick-rollassions", +"rick-rolle", +"rick-rollent", +"rick-roller", +"rick-rollera", +"rick-rollerai", +"rick-rolleraient", +"rick-rollerais", +"rick-rollerait", +"rick-rolleras", +"rick-rollerez", +"rick-rolleriez", +"rick-rollerions", +"rick-rollerons", +"rick-rolleront", +"rick-rolles", +"rick-rollez", +"rick-rolliez", +"rick-rollions", +"rick-rollons", +"rick-rollâmes", +"rick-rollât", +"rick-rollâtes", +"rick-rollèrent", +"rick-rollé", +"rick-rollée", +"rick-rollées", +"rick-rollés", +"rieux-en-valois", +"rieux-en-valoise", +"rieux-en-valoises", +"rigaud-montain", +"rigaud-montaine", +"rigaud-montaines", +"rigaud-montains", +"rigny-usséen", +"rigny-usséenne", +"rigny-usséennes", +"rigny-usséens", +"rince-bouche", +"rince-bouches", +"rince-bouteille", +"rince-bouteilles", +"rince-doigt", +"rince-doigts", +"risque-tout", +"riz-pain-sel", +"road-book", +"road-books", +"roast-beef", +"roast-beefs", +"robe-chandail", +"robe-housse", +"robert-le-diable", +"robert-messin", +"robert-messine", +"robert-messines", +"robert-messins", +"robes-chandails", +"robes-housses", +"robot-chien", +"robots-chiens", +"roche-blanchais", +"roche-blanchaise", +"roche-blanchaises", +"roche-mère", +"roche-papier-ciseaux", +"roches-mères", +"rock'n'roll", +"rock-a-billy", +"rocking-chair", +"rocking-chairs", +"roge-bougeron", +"roge-bougeronne", +"roge-bougeronnes", +"roge-bougerons", +"roger-bontemps", +"rogne-cul", +"rogne-pied", +"rogne-pieds", +"rogne-salaires", +"roi-de-rats", +"rois-de-rats", +"roll-out", +"roll-outs", +"roller-derby", +"roller-derbys", +"roman-feuilleton", +"roman-fleuve", +"roman-photo", +"roman-photos", +"romans-feuilletons", +"romans-fleuves", +"romans-photos", +"rompt-pierre", +"rompt-pierres", +"ron-ron", +"rond-de-cuir", +"rond-point", +"rond-ponna", +"rond-ponnai", +"rond-ponnaient", +"rond-ponnais", +"rond-ponnait", +"rond-ponnant", +"rond-ponnas", +"rond-ponnasse", +"rond-ponnassent", +"rond-ponnasses", +"rond-ponnassiez", +"rond-ponnassions", +"rond-ponne", +"rond-ponnent", +"rond-ponner", +"rond-ponnera", +"rond-ponnerai", +"rond-ponneraient", +"rond-ponnerais", +"rond-ponnerait", +"rond-ponneras", +"rond-ponnerez", +"rond-ponneriez", +"rond-ponnerions", +"rond-ponnerons", +"rond-ponneront", +"rond-ponnes", +"rond-ponnez", +"rond-ponniez", +"rond-ponnions", +"rond-ponnons", +"rond-ponnâmes", +"rond-ponnât", +"rond-ponnâtes", +"rond-ponnèrent", +"rond-ponné", +"ronde-bosse", +"ronde-bosses", +"rondes-bosses", +"ronds-de-cuir", +"ronds-points", +"ronge-bois", +"ronge-maille", +"rongo-rongo", +"roost-warendinois", +"roost-warendinoise", +"roost-warendinoises", +"rose-croix", +"rose-de-mer", +"rose-marine", +"roses-marines", +"rosti-montois", +"rosti-montoise", +"rosti-montoises", +"rouge-aile", +"rouge-bord", +"rouge-brun", +"rouge-flasher", +"rouge-gorge", +"rouge-herbe", +"rouge-herbes", +"rouge-noir", +"rouge-pie", +"rouge-queue", +"rouges-ailes", +"rouges-gorges", +"rouges-queues", +"rouget-barbet", +"rouget-grondin", +"roul-sa-bosse", +"roulage-décollage", +"roule-goupille", +"roule-goupilles", +"roule-ta-bosse", +"rouler-bouler", +"roullet-stéphanois", +"roullet-stéphanoise", +"roullet-stéphanoises", +"roulé-boulé", +"roulé-saucisse", +"roulés-boulés", +"rousse-tête", +"rousses-têtes", +"roux-mirien", +"rufino-sulfurique", +"rufino-sulfuriques", +"ruine-babine", +"ruine-babines", +"russo-allemand", +"russo-allemande", +"russo-allemandes", +"russo-allemands", +"russo-américain", +"russo-japonaise", +"russo-polonaise", +"râlé-poussé", +"réal-politique", +"réal-politiques", +"réarc-bouta", +"réarc-boutai", +"réarc-boutaient", +"réarc-boutais", +"réarc-boutait", +"réarc-boutant", +"réarc-boutas", +"réarc-boutasse", +"réarc-boutassent", +"réarc-boutasses", +"réarc-boutassiez", +"réarc-boutassions", +"réarc-boute", +"réarc-boutent", +"réarc-bouter", +"réarc-boutera", +"réarc-bouterai", +"réarc-bouteraient", +"réarc-bouterais", +"réarc-bouterait", +"réarc-bouteras", +"réarc-bouterez", +"réarc-bouteriez", +"réarc-bouterions", +"réarc-bouterons", +"réarc-bouteront", +"réarc-boutes", +"réarc-boutez", +"réarc-boutiez", +"réarc-boutions", +"réarc-boutons", +"réarc-boutâmes", +"réarc-boutât", +"réarc-boutâtes", +"réarc-boutèrent", +"réarc-bouté", +"réarc-boutée", +"réarc-boutées", +"réarc-boutés", +"réception-cadeaux", +"récipient-mesure", +"récipient-mesures", +"réentr'apercevaient", +"réentr'apercevais", +"réentr'apercevait", +"réentr'apercevant", +"réentr'apercevez", +"réentr'aperceviez", +"réentr'apercevions", +"réentr'apercevoir", +"réentr'apercevons", +"réentr'apercevra", +"réentr'apercevrai", +"réentr'apercevraient", +"réentr'apercevrais", +"réentr'apercevrait", +"réentr'apercevras", +"réentr'apercevrez", +"réentr'apercevriez", +"réentr'apercevrions", +"réentr'apercevrons", +"réentr'apercevront", +"réentr'aperçois", +"réentr'aperçoit", +"réentr'aperçoive", +"réentr'aperçoivent", +"réentr'aperçoives", +"réentr'aperçu", +"réentr'aperçue", +"réentr'aperçues", +"réentr'aperçurent", +"réentr'aperçus", +"réentr'aperçusse", +"réentr'aperçussent", +"réentr'aperçusses", +"réentr'aperçussiez", +"réentr'aperçussions", +"réentr'aperçut", +"réentr'aperçûmes", +"réentr'aperçût", +"réentr'aperçûtes", +"réentr'ouvert", +"réentr'ouverte", +"réentr'ouvertes", +"réentr'ouverts", +"réentr'ouvraient", +"réentr'ouvrais", +"réentr'ouvrait", +"réentr'ouvrant", +"réentr'ouvre", +"réentr'ouvrent", +"réentr'ouvres", +"réentr'ouvrez", +"réentr'ouvriez", +"réentr'ouvrions", +"réentr'ouvrir", +"réentr'ouvrira", +"réentr'ouvrirai", +"réentr'ouvriraient", +"réentr'ouvrirais", +"réentr'ouvrirait", +"réentr'ouvriras", +"réentr'ouvrirent", +"réentr'ouvrirez", +"réentr'ouvririez", +"réentr'ouvririons", +"réentr'ouvrirons", +"réentr'ouvriront", +"réentr'ouvris", +"réentr'ouvrisse", +"réentr'ouvrissent", +"réentr'ouvrisses", +"réentr'ouvrissiez", +"réentr'ouvrissions", +"réentr'ouvrit", +"réentr'ouvrons", +"réentr'ouvrîmes", +"réentr'ouvrît", +"réentr'ouvrîtes", +"régis-borgien", +"régis-borgienne", +"régis-borgiennes", +"régis-borgiens", +"rémy-montais", +"rémy-montaise", +"rémy-montaises", +"répondeur-enregistreur", +"répondeur-enregistreurs", +"résino-gommeux", +"réunion-bilan", +"réunions-bilan", +"réveil-matin", +"réveille-matin", +"réveille-matins", +"rêve-creux", +"rü'üsá", +"sa'ban", +"sabre-peuple", +"sac-jacking", +"sac-poubelle", +"saccharo-glycose", +"sacro-iliaques", +"sacro-lombaire", +"sacro-saint", +"sacro-sainte", +"sacro-saintement", +"sacro-saintes", +"sacro-saints", +"sacro-vertébral", +"sacré-coeur", +"sacré-cœur", +"sacs-poubelle", +"sacs-poubelles", +"sado-maso", +"sado-masochisme", +"sado-masochiste", +"sado-masochistes", +"safari-parc", +"safari-parcs", +"sage-femme", +"sage-homme", +"sages-femmes", +"sahélo-saharien", +"sahélo-saharienne", +"sahélo-sahariennes", +"sahélo-sahariens", +"saigne-nez", +"sain-belois", +"sain-beloise", +"sain-beloises", +"sain-bois", +"sain-foin", +"saisie-arrêt", +"saisie-attribution", +"saisie-brandon", +"saisie-exécution", +"saisie-gagerie", +"saisie-revendication", +"saisies-arrêts", +"saisies-attributions", +"saisies-brandons", +"saisies-exécutions", +"saisies-gageries", +"saisies-revendications", +"saisir-arrêter", +"saisir-brandonner", +"saisir-exécuter", +"saisir-gager", +"saisir-revendiquer", +"salafo-sioniste", +"salaire-coût", +"salaire-coûts", +"salamandre-tigre", +"salle-prunetais", +"salle-prunetaise", +"salle-prunetaises", +"salles-sourçois", +"salles-sourçoise", +"salles-sourçoises", +"salpingo-pharyngien", +"salve-d'honneur", +"salves-d'honneur", +"sam'suffit", +"sam'suffits", +"san-benito", +"san-bérinois", +"san-bérinoise", +"san-bérinoises", +"san-claudien", +"san-damianais", +"san-damianaise", +"san-damianaises", +"san-denien", +"san-denienne", +"san-deniennes", +"san-deniens", +"san-desiderois", +"san-desideroise", +"san-desideroises", +"san-farcios", +"san-farciose", +"san-farcioses", +"san-ferrois", +"san-ferroise", +"san-ferroises", +"san-genestois", +"san-genestoise", +"san-genestoises", +"san-germinois", +"san-germinoise", +"san-germinoises", +"san-lagiron", +"san-lagirone", +"san-lagirones", +"san-lagirons", +"san-martinois", +"san-martinoise", +"san-martinoises", +"san-miardère", +"san-miardères", +"san-palous", +"san-palouse", +"san-palouses", +"san-pierran", +"san-pierrane", +"san-pierranes", +"san-pierrans", +"san-priot", +"san-priote", +"san-priotes", +"san-priots", +"san-pétri-montin", +"san-pétri-montine", +"san-pétri-montines", +"san-pétri-montins", +"san-rémois", +"san-rémoise", +"san-rémoises", +"san-salvatorien", +"san-salvatorienne", +"san-salvatoriennes", +"san-salvatoriens", +"san-vitournaire", +"san-vitournaires", +"sancto-bénédictin", +"sancto-bénédictine", +"sancto-bénédictines", +"sancto-bénédictins", +"sancto-julianais", +"sancto-julianaise", +"sancto-julianaises", +"sancto-prixin", +"sancto-prixine", +"sancto-prixines", +"sancto-prixins", +"sang-de-bourbe", +"sang-de-dragon", +"sang-froid", +"sang-gris", +"sang-mêlé", +"sang-mêlés", +"sankaku-jime", +"santi-johanien", +"santi-johanienne", +"santi-johaniennes", +"santi-johaniens", +"santoline-cyprès", +"sapeur-pompier", +"sapeurs-pompiers", +"sapeuse-pompière", +"sapeuses-pompières", +"sarclo-buttage", +"sarclo-buttages", +"sarco-hydrocèle", +"sarco-hydrocèles", +"sarco-épiplocèle", +"sarco-épiplomphale", +"sarco-épiplomphales", +"sarre-unionnais", +"sarre-unionnaise", +"sarre-unionnaises", +"sart-dames-avelinois", +"sart-eustachois", +"sart-risbartois", +"satellites-espions", +"sati-drap", +"sauf-conduit", +"sauf-conduits", +"saugnac-et-muretois", +"saugnac-et-muretoise", +"saugnac-et-muretoises", +"sault-rethelois", +"sault-retheloise", +"sault-retheloises", +"saut-de-lit", +"saut-de-lits", +"saut-de-loup", +"saut-de-mouton", +"saute-au-paf", +"saute-bouchon", +"saute-bouchons", +"saute-en-barque", +"saute-en-bas", +"saute-mouton", +"saute-moutons", +"saute-ruisseau", +"saute-ruisseaux", +"sauts-de-lit", +"sauts-de-mouton", +"sauve-l'honneur", +"sauve-qui-peut", +"sauve-rabans", +"sauve-vie", +"savez-vous", +"savoir-faire", +"savoir-vivre", +"scale-out", +"scale-up", +"scaphoïdo-astragalien", +"scaphoïdo-cuboïdien", +"sceau-cylindre", +"sceau-de-Notre-Dame", +"sceau-de-salomon", +"sceaux-cylindres", +"sceaux-de-Notre-Dame", +"schiste-carton", +"schistes-carton", +"scie-cloche", +"science-fictif", +"science-fiction", +"science-fictions", +"sciences-fiction", +"sciences-fictions", +"scies-cloches", +"scirpo-phragmitaie", +"scirpo-phragmitaies", +"scottish-terrier", +"scuto-sternal", +"scènes-clés", +"seconde-lumière", +"secondes-lumière", +"seine-et-marnais", +"seine-et-marnaise", +"seine-et-marnaises", +"seine-portais", +"seine-portaise", +"seine-portaises", +"self-control", +"self-défense", +"self-government", +"self-governments", +"self-made-man", +"self-made-mans", +"self-made-men", +"self-made-woman", +"self-made-womans", +"self-made-women", +"self-service", +"self-services", +"selk'nam", +"selles-sur-cher", +"semaine-lumière", +"semaines-lumière", +"semen-contra", +"semper-virens", +"sensori-moteur", +"sensori-moteurs", +"sensori-motrice", +"sensori-motrices", +"sensori-motricité", +"sent-bon", +"sept-en-gueule", +"sept-en-huit", +"sept-et-le-va", +"sept-frèrien", +"sept-frèrienne", +"sept-frèriennes", +"sept-frèriens", +"sept-meulois", +"sept-meuloise", +"sept-meuloises", +"sept-mâts", +"sept-oeil", +"sept-oeils", +"sept-sortais", +"sept-sortaise", +"sept-sortaises", +"sept-ventais", +"sept-ventaise", +"sept-ventaises", +"sept-œil", +"sept-œils", +"septante-cinq", +"septante-deux", +"septante-et-un", +"septante-huit", +"septante-neuf", +"septante-quatre", +"septante-sept", +"septante-six", +"septante-trois", +"septentrio-occidental", +"septentrio-occidentale", +"septentrio-occidentales", +"septentrio-occidentaux", +"serbo-croate", +"sergent-chef", +"sergent-major", +"sergents-chefs", +"sergents-majors", +"serre-bauquière", +"serre-bosse", +"serre-bosses", +"serre-bras", +"serre-ciseau", +"serre-ciseaux", +"serre-cou", +"serre-cous", +"serre-feu", +"serre-feux", +"serre-fil", +"serre-file", +"serre-files", +"serre-fils", +"serre-fine", +"serre-frein", +"serre-joint", +"serre-joints", +"serre-livre", +"serre-livres", +"serre-malice", +"serre-nerpolain", +"serre-nerpolaine", +"serre-nerpolaines", +"serre-nerpolains", +"serre-nez", +"serre-noeud", +"serre-nœud", +"serre-nœuds", +"serre-papier", +"serre-papiers", +"serre-point", +"serre-points", +"serre-pédicule", +"serre-pédicules", +"serre-rails", +"serre-taille", +"serre-tailles", +"serre-tube", +"serre-tubes", +"serre-tête", +"serre-têtes", +"serres-fines", +"serres-gastonnais", +"serres-gastonnaise", +"serres-gastonnaises", +"serres-morlanais", +"serres-morlanaise", +"serres-morlanaises", +"serri-sapinois", +"serri-sapinoise", +"serri-sapinoises", +"service-volée", +"services-volées", +"serviette-éponge", +"serviettes-éponges", +"servo-direction", +"servo-directions", +"servo-frein", +"servo-freins", +"servo-moteur", +"seul-en-scène", +"seule-en-scène", +"sex-appeal", +"sex-digital", +"sex-digitisme", +"sex-digitismes", +"sex-ratio", +"sex-ratios", +"sex-shop", +"sex-shops", +"sex-symbol", +"sex-symbols", +"sex-toy", +"sex-toys", +"sexe-ratio", +"shabu-shabu", +"shar-peï", +"shar-peïs", +"shift-cliqua", +"shift-cliquai", +"shift-cliquaient", +"shift-cliquais", +"shift-cliquait", +"shift-cliquant", +"shift-cliquas", +"shift-cliquasse", +"shift-cliquassent", +"shift-cliquasses", +"shift-cliquassiez", +"shift-cliquassions", +"shift-clique", +"shift-cliquent", +"shift-cliquer", +"shift-cliquera", +"shift-cliquerai", +"shift-cliqueraient", +"shift-cliquerais", +"shift-cliquerait", +"shift-cliqueras", +"shift-cliquerez", +"shift-cliqueriez", +"shift-cliquerions", +"shift-cliquerons", +"shift-cliqueront", +"shift-cliques", +"shift-cliquez", +"shift-cliquiez", +"shift-cliquions", +"shift-cliquons", +"shift-cliquâmes", +"shift-cliquât", +"shift-cliquâtes", +"shift-cliquèrent", +"shift-cliqué", +"shift-cliquée", +"shift-cliquées", +"shift-cliqués", +"shikoku-inu", +"shipibo-conibo", +"shoot-'em-up", +"short-culotte", +"short-culottes", +"short-track", +"short-tracks", +"show-biz", +"show-business", +"sicilio-sarde", +"side-car", +"side-cariste", +"side-caristes", +"side-cars", +"sierra-léonais", +"sierra-léonaise", +"sierra-léonaises", +"sigma-additif", +"sigma-additivité", +"sigma-additivités", +"silicico-aluminique", +"silicico-aluminiques", +"silicico-cuivreux", +"silure-spatule", +"simili-cuir", +"simili-cuirs", +"singe-araignée", +"singe-chouette", +"singe-lion", +"singe-écureuil", +"singes-araignées", +"singes-chouettes", +"singes-lions", +"singes-écureuils", +"sino-américain", +"sino-américaine", +"sino-américaines", +"sino-américains", +"sino-australien", +"sino-australienne", +"sino-australiennes", +"sino-australiens", +"sino-canadien", +"sino-colombien", +"sino-colombienne", +"sino-colombiennes", +"sino-colombiens", +"sino-congolais", +"sino-continental", +"sino-coréen", +"sino-européen", +"sino-japonais", +"sino-japonaise", +"sino-japonaises", +"sino-québécois", +"sino-taïwanais", +"sino-tibétain", +"sino-vietnamien", +"sino-vietnamienne", +"sino-vietnamiennes", +"sino-vietnamiens", +"sino-égyptien", +"sino-égyptienne", +"sino-égyptiennes", +"sino-égyptiens", +"sister-ship", +"sister-ships", +"sit-in", +"sit-ins", +"sit-up", +"sit-ups", +"six-cent-soixante-six", +"six-cent-soixante-sixième", +"six-cent-soixante-sixièmes", +"six-cents", +"six-clefs", +"six-coups", +"six-doigts", +"six-fournais", +"six-fournaise", +"six-fournaises", +"six-mâts", +"six-vingts", +"siècle-lumière", +"siècles-lumière", +"ski-alpinisme", +"ski-alpinismes", +"ski-alpiniste", +"ski-alpinistes", +"sleeping-car", +"sloop-of-war", +"slop-tank", +"smaragdo-chalcite", +"smaragdo-chalcites", +"snack-bar", +"snack-bars", +"snow-boot", +"snow-boots", +"soap-opéra", +"soaps-opéras", +"sociale-démocrate", +"sociale-traitre", +"sociale-traître", +"sociales-démocrates", +"sociales-traitres", +"sociales-traîtres", +"sociaux-démocrates", +"sociaux-traitres", +"sociaux-traîtres", +"socio-cible", +"socio-cibles", +"socio-culturel", +"socio-culturelle", +"socio-culturelles", +"socio-culturels", +"socio-esthéticien", +"socio-esthéticiens", +"socio-historiographe", +"socio-historiographes", +"socio-historique", +"socio-historiques", +"socio-politique", +"socio-politiques", +"socio-professionnel", +"socio-professionnelle", +"socio-professionnelles", +"socio-professionnels", +"socio-économique", +"socio-économiques", +"socio-éducatif", +"socio-éducatifs", +"socio-éducative", +"socio-éducatives", +"société-écran", +"sociétés-écrans", +"soda-spodumenes", +"sodo-calcique", +"sodo-calciques", +"soi-disamment", +"soi-disant", +"soi-même", +"soit-communiqué", +"soixante-cinq", +"soixante-deux", +"soixante-dix", +"soixante-dix-huit", +"soixante-dix-neuf", +"soixante-dix-sept", +"soixante-dixième", +"soixante-dixièmes", +"soixante-dizaine", +"soixante-dizaines", +"soixante-douze", +"soixante-et-onze", +"soixante-et-un", +"soixante-et-une", +"soixante-huit", +"soixante-huitard", +"soixante-huitarde", +"soixante-huitardes", +"soixante-huitards", +"soixante-neuf", +"soixante-quatorze", +"soixante-quatre", +"soixante-quinze", +"soixante-seize", +"soixante-sept", +"soixante-six", +"soixante-treize", +"soixante-trois", +"sole-ruardon", +"solliès-pontois", +"solliès-pontoise", +"solliès-pontoises", +"solliès-villain", +"solliès-villaine", +"solliès-villaines", +"solliès-villains", +"somato-psychique", +"somato-psychiques", +"somme-leuzien", +"somme-suippas", +"somme-suippase", +"somme-suippases", +"son-et-lumière", +"songe-creux", +"songe-malice", +"songhaï-zarma", +"songhaï-zarmas", +"sortie-de-bain", +"sortie-de-bal", +"sot-l'y-laisse", +"sotto-voce", +"sou-chong", +"sou-chongs", +"soudano-tchado-lybien", +"soudo-brasa", +"soudo-brasai", +"soudo-brasaient", +"soudo-brasais", +"soudo-brasait", +"soudo-brasant", +"soudo-brasas", +"soudo-brasasse", +"soudo-brasassent", +"soudo-brasasses", +"soudo-brasassiez", +"soudo-brasassions", +"soudo-brase", +"soudo-brasent", +"soudo-braser", +"soudo-brasera", +"soudo-braserai", +"soudo-braseraient", +"soudo-braserais", +"soudo-braserait", +"soudo-braseras", +"soudo-braserez", +"soudo-braseriez", +"soudo-braserions", +"soudo-braserons", +"soudo-braseront", +"soudo-brases", +"soudo-brasez", +"soudo-brasiez", +"soudo-brasions", +"soudo-brasons", +"soudo-brasâmes", +"soudo-brasât", +"soudo-brasâtes", +"soudo-brasèrent", +"soudo-brasé", +"soudo-brasée", +"soudo-brasées", +"soudo-brasés", +"souffre-douleur", +"souffre-douleurs", +"soufre-sélénifère", +"soum-soum", +"soupe-tout-seul", +"sourd-muet", +"sourd-parlant", +"sourde-muette", +"sourdes-muettes", +"sourds-muets", +"souris-chauve", +"souris-chauves", +"souris-crayon", +"souris-crayons", +"souris-opossums", +"souris-stylo", +"souris-stylos", +"soutien-gorge", +"soutien-loloches", +"soutiens-gorge", +"souvenez-vous-de-moi", +"souveraineté-association", +"souï-manga", +"soŋay-zarma", +"soŋay-zarmas", +"sparring-partner", +"spatio-temporel", +"spatio-temporelle", +"spatio-temporelles", +"spatio-temporels", +"speed-dating", +"sphinx-bourdon", +"sphéno-temporal", +"spin-off", +"spin-offs", +"spina-bifida", +"spina-ventosa", +"spiro-bloc", +"spiro-blocs", +"sport-étude", +"sportivo-financier", +"sports-études", +"spruce-beer", +"squale-grogneur", +"sri-lankais", +"sri-lankaise", +"sri-lankaises", +"st'at'imc", +"stabilo-bossa", +"stabilo-bossai", +"stabilo-bossaient", +"stabilo-bossais", +"stabilo-bossait", +"stabilo-bossant", +"stabilo-bossas", +"stabilo-bossasse", +"stabilo-bossassent", +"stabilo-bossasses", +"stabilo-bossassiez", +"stabilo-bossassions", +"stabilo-bosse", +"stabilo-bossent", +"stabilo-bosser", +"stabilo-bossera", +"stabilo-bosserai", +"stabilo-bosseraient", +"stabilo-bosserais", +"stabilo-bosserait", +"stabilo-bosseras", +"stabilo-bosserez", +"stabilo-bosseriez", +"stabilo-bosserions", +"stabilo-bosserons", +"stabilo-bosseront", +"stabilo-bosses", +"stabilo-bossez", +"stabilo-bossiez", +"stabilo-bossions", +"stabilo-bossons", +"stabilo-bossâmes", +"stabilo-bossât", +"stabilo-bossâtes", +"stabilo-bossèrent", +"stabilo-bossé", +"stabilo-bossée", +"stabilo-bossées", +"stabilo-bossés", +"stage-coach", +"stage-coachs", +"stand-by", +"stand-up", +"stannoso-potassique", +"star-système", +"star-systèmes", +"start-up", +"start-upeur", +"starting-block", +"starting-blocks", +"starting-gate", +"station-service", +"stations-service", +"stations-services", +"statue-menhir", +"statues-menhirs", +"steam-boat", +"steam-boats", +"steeple-chase", +"step-back", +"step-backs", +"sterno-claviculaire", +"sterno-claviculaires", +"sterno-clido-mastoïdien", +"sterno-clido-mastoïdienne", +"sterno-clido-mastoïdiennes", +"sterno-clido-mastoïdiens", +"sterno-cléido-mastoïdien", +"sterno-cléido-mastoïdiens", +"sterno-huméral", +"sterno-hyoïdien", +"sterno-pubien", +"stock-car", +"stock-cars", +"stock-option", +"stock-options", +"stock-tampon", +"stocks-tampons", +"stomo-gastrique", +"stomo-gastriques", +"stop-ski", +"stop-skis", +"story-board", +"story-boards", +"strauss-kahnien", +"strauss-kahniens", +"street-artiste", +"street-artistes", +"street-gadz", +"strip-teasa", +"strip-teasai", +"strip-teasaient", +"strip-teasais", +"strip-teasait", +"strip-teasant", +"strip-teasas", +"strip-teasasse", +"strip-teasassent", +"strip-teasasses", +"strip-teasassiez", +"strip-teasassions", +"strip-tease", +"strip-teasent", +"strip-teaser", +"strip-teasera", +"strip-teaserai", +"strip-teaseraient", +"strip-teaserais", +"strip-teaserait", +"strip-teaseras", +"strip-teaserez", +"strip-teaseriez", +"strip-teaserions", +"strip-teaserons", +"strip-teaseront", +"strip-teases", +"strip-teaseurs", +"strip-teaseuse", +"strip-teaseuses", +"strip-teasez", +"strip-teasiez", +"strip-teasions", +"strip-teasons", +"strip-teasâmes", +"strip-teasât", +"strip-teasâtes", +"strip-teasèrent", +"strip-teasé", +"strip-teasée", +"strip-teasées", +"strip-teasés", +"stroke-play", +"strom-apparat", +"struggle-for-life", +"struggle-for-lifes", +"stud-book", +"stuffing-box", +"stylo-bille", +"stylo-billes", +"stylo-feutre", +"stylo-glosse", +"stylo-gomme", +"stylo-pistolet", +"stylo-plume", +"stylo-souris", +"stylos-feutres", +"stylos-gommes", +"stylos-plume", +"stylos-souris", +"sténo-dactylographe", +"sténo-dactylographes", +"sténo-méditerranéen", +"sténo-méditerranéenne", +"sténo-méditerranéennes", +"sténo-méditerranéens", +"stéphano-carladésien", +"stéphano-carladésienne", +"stéphano-carladésiennes", +"stéphano-carladésiens", +"stéréo-isomère", +"stéréo-isomères", +"su-sucre", +"su-sucres", +"subrogé-tuteur", +"subrogés-tuteurs", +"suce-boules", +"suce-bœuf", +"suce-fleur", +"suce-fleurs", +"suce-goulot", +"suce-goulots", +"suce-médailles", +"sudoro-algique", +"suivez-moi-jeune-homme", +"sulfo-margarique", +"suméro-akkadien", +"suméro-akkadienne", +"suméro-akkadiennes", +"suméro-akkadiens", +"super-8", +"support-chaussettes", +"supports-chaussettes", +"supra-axillaire", +"supra-axillaires", +"supra-caudal", +"supra-caudale", +"supra-caudales", +"supra-caudaux", +"supra-épineux", +"surdi-mutité", +"surdi-mutités", +"suro-pédieuse", +"suro-pédieuses", +"suro-pédieux", +"surprise-partie", +"surprise-parties", +"surprises-parties", +"surveillant-général", +"sus-caudal", +"sus-cité", +"sus-coccygien", +"sus-dominante", +"sus-dominantes", +"sus-hyoïdien", +"sus-hépatique", +"sus-hépatiques", +"sus-jacent", +"sus-jacents", +"sus-maxillo-labial", +"sus-maxillo-nasal", +"sus-métatarsien", +"sus-métatarsienne", +"sus-métatarsiennes", +"sus-métatarsiens", +"sus-naseau", +"sus-naso-labial", +"sus-pied", +"sus-pubio-fémoral", +"sus-tarsien", +"sus-tarsienne", +"sus-tarsiennes", +"sus-tarsiens", +"sus-tentoriel", +"sus-tentorielle", +"sus-tentorielles", +"sus-tentoriels", +"sus-tonique", +"sus-épineux", +"suédo-américain", +"suédo-américaine", +"suédo-américaines", +"suédo-américains", +"sweat-shirt", +"sweat-shirts", +"syndesmo-pharyngien", +"syro-chaldaïque", +"syro-chaldéen", +"syro-chaldéens", +"syro-saoudien", +"systèmes-clés", +"sèche-cheveu", +"sèche-cheveux", +"sèche-linge", +"séchoir-atomiseur", +"séchoir-atomiseurs", +"sénateur-maire", +"sénatus-consulte", +"sénatus-consultes", +"séro-sanguin", +"séro-sanguine", +"séro-sanguines", +"séro-sanguins", +"t'inquiète", +"t'occupe", +"t'oh", +"t-bone", +"t-bones", +"t-elle", +"t-il", +"t-on", +"t-shirt", +"t-shirts", +"tabagn's", +"table-bureau", +"tables-bureaux", +"tac-tac", +"tai-kadai", +"taille-crayon", +"taille-crayons", +"taille-douce", +"taille-haie", +"taille-haies", +"taille-mer", +"taille-mers", +"taille-mèche", +"taille-mèches", +"taille-plume", +"taille-plumes", +"taille-pré", +"taille-prés", +"taille-vent", +"taille-vents", +"tailles-douces", +"taki-taki", +"talco-micacé", +"talco-quartzeux", +"talk-show", +"talkie-walkie", +"talkie-walkies", +"talkies-walkies", +"taly-pen", +"taly-pens", +"tam-tam", +"tam-tams", +"tambour-major", +"tambours-majors", +"tams-tams", +"tao-taï", +"tao-taïs", +"tape-beurre", +"tape-beurres", +"tape-cul", +"tape-culs", +"tape-dur", +"tape-durs", +"tape-à-l'oeil", +"tape-à-l'œil", +"tapis-brosse", +"tapis-de-caoutchouté", +"tapis-franc", +"tapis-francs", +"tapis-luge", +"tapis-luges", +"tapis-plain", +"tard-venus", +"tarn-et-garonnais", +"tarn-et-garonnaise", +"tarn-et-garonnaises", +"tarso-métatarse", +"tarso-métatarsien", +"tarton-raire", +"tate-mono", +"tate-monos", +"tau-fluvalinate", +"taupe-grillon", +"taupes-grillons", +"taxi-auto", +"taxi-automobile", +"taxi-brousse", +"taxi-girl", +"taxi-girls", +"taxi-vélo", +"taxis-brousse", +"taxis-vélos", +"taï-kadaï", +"taï-le", +"taï-nüa", +"tchado-burkinabé", +"tchado-centrafricain", +"tchado-egyptien", +"tchado-lybien", +"tchado-soudano-lybien", +"tchin-tchin", +"tchou-tchou", +"tchéco-slovaque", +"tchéco-slovaques", +"teach-in", +"teach-ins", +"tee-shirt", +"tee-shirts", +"teen-ager", +"teen-agers", +"teint-vin", +"teint-vins", +"teinture-mère", +"temporo-conchinien", +"temporo-superficiel", +"tensio-actif", +"tente-abri", +"tente-ménagerie", +"tentes-ménageries", +"ter-ter", +"terno-annulaire", +"terra-cotta", +"terra-forma", +"terra-formai", +"terra-formaient", +"terra-formais", +"terra-formait", +"terra-formant", +"terra-formas", +"terra-formasse", +"terra-formassent", +"terra-formasses", +"terra-formassiez", +"terra-formassions", +"terra-forme", +"terra-forment", +"terra-former", +"terra-formera", +"terra-formerai", +"terra-formeraient", +"terra-formerais", +"terra-formerait", +"terra-formeras", +"terra-formerez", +"terra-formeriez", +"terra-formerions", +"terra-formerons", +"terra-formeront", +"terra-formes", +"terra-formez", +"terra-formiez", +"terra-formions", +"terra-formons", +"terra-formâmes", +"terra-formât", +"terra-formâtes", +"terra-formèrent", +"terra-formé", +"terra-formée", +"terra-formées", +"terra-formés", +"terre-grièpe", +"terre-neuva", +"terre-neuvas", +"terre-neuve", +"terre-neuvien", +"terre-neuvienne", +"terre-neuviennes", +"terre-neuviens", +"terre-neuvier", +"terre-neuviers", +"terre-noix", +"terre-plein", +"terre-pleins", +"terre-à-terre", +"terret-bourret", +"terza-rima", +"test-match", +"test-matchs", +"test-objet", +"tette-chèvre", +"tette-chèvres", +"teuf-teuf", +"teuf-teufa", +"teuf-teufai", +"teuf-teufaient", +"teuf-teufais", +"teuf-teufait", +"teuf-teufant", +"teuf-teufas", +"teuf-teufasse", +"teuf-teufassent", +"teuf-teufasses", +"teuf-teufassiez", +"teuf-teufassions", +"teuf-teufe", +"teuf-teufent", +"teuf-teufer", +"teuf-teufera", +"teuf-teuferai", +"teuf-teuferaient", +"teuf-teuferais", +"teuf-teuferait", +"teuf-teuferas", +"teuf-teuferez", +"teuf-teuferiez", +"teuf-teuferions", +"teuf-teuferons", +"teuf-teuferont", +"teuf-teufes", +"teuf-teufez", +"teuf-teufiez", +"teuf-teufions", +"teuf-teufons", +"teuf-teufâmes", +"teuf-teufât", +"teuf-teufâtes", +"teuf-teufèrent", +"teuf-teufé", +"teufs-teufs", +"thifensulfuron-méthyle", +"thimistérien-clermontois", +"thiophanate-méthyl", +"thiophanate-éthyl", +"thon-samsonais", +"thoré-folléen", +"thoré-folléenne", +"thoré-folléennes", +"thoré-folléens", +"thoult-tronaisien", +"thoult-tronaisienne", +"thoult-tronaisiennes", +"thoult-tronaisiens", +"thraco-illyrienne", +"thuit-angevin", +"thuit-angevine", +"thuit-angevines", +"thuit-angevins", +"thuit-signolais", +"thuit-signolaise", +"thuit-signolaises", +"thuit-simérien", +"thuit-simérienne", +"thuit-simériennes", +"thuit-simériens", +"thun-episcopien", +"thun-épiscopien", +"thun-épiscopienne", +"thun-épiscopiennes", +"thun-épiscopiens", +"thézy-glimontois", +"thézy-glimontoise", +"thézy-glimontoises", +"thêta-jointure", +"thêta-jointures", +"ti-coune", +"ti-counes", +"ti-cul", +"ti-papoute", +"ti-punch", +"ti-punchs", +"tibio-malléolaire", +"tibéto-birman", +"tibéto-birmane", +"tibéto-birmanes", +"tibéto-birmans", +"tic-tac", +"tic-tac-toe", +"tic-tacs", +"ticket-restaurant", +"tie-break", +"tie-breaks", +"tierce-feuille", +"tierce-rime", +"tierces-rimes", +"tiger-kidnappeur", +"tiger-kidnapping", +"tiger-kidnappings", +"tigre-garou", +"tigres-garous", +"tiki-taka", +"tilleul-othonnais", +"tilleul-othonnaise", +"tilleul-othonnaises", +"tilt-shift", +"timbre-amende", +"timbre-poste", +"timbre-quittance", +"timbre-taxe", +"timbres-amende", +"timbres-poste", +"timbres-quittances", +"time-lapse", +"time-lapses", +"time-sharing", +"time-sharings", +"tiou-tiou", +"tiou-tious", +"tira-tutto", +"tireur-au-cul", +"tireurs-au-cul", +"tiroir-caisse", +"tiroirs-caisses", +"tissu-éponge", +"tissus-éponges", +"titan-cotte", +"titanico-ammonique", +"titanico-ammoniques", +"titre-service", +"titres-services", +"toba-qom", +"toc-feu", +"toc-toc", +"toc-tocs", +"tohu-bohu", +"tohu-bohus", +"tohus-bohus", +"toi-même", +"toit-terrasse", +"toits-terrasses", +"tolclofos-méthyl", +"tom-pouce", +"tom-tom", +"tom-toms", +"tombe-cartouche", +"tonne-grenoir", +"tonne-mètre", +"top-down", +"top-model", +"top-models", +"top-modèle", +"top-modèles", +"top-secret", +"top-secrets", +"topo-guide", +"topo-guides", +"toque-feu", +"torche-cul", +"torche-culs", +"torche-fer", +"torche-pertuis", +"torche-pin", +"torche-pinceau", +"torche-pinceaux", +"torche-pins", +"tord-boyau", +"tord-boyaux", +"tord-nez", +"tori-i", +"torse-poil", +"torse-poils", +"tortue-alligator", +"tortue-boite", +"tortue-boîte", +"tortue-duc", +"tortues-alligators", +"tortues-boites", +"tortues-boîtes", +"tortues-ducs", +"tosa-inu", +"tote-bag", +"tote-bags", +"touch-and-go", +"touche-pipi", +"touche-touche", +"touche-à-tout", +"touille-boeuf", +"touille-boeufs", +"touille-bœuf", +"touille-bœufs", +"tour-minute", +"tour-opérateur", +"tour-opérateurs", +"tour-opératrice", +"tour-opératrices", +"tour-à-tour", +"tourne-au-vent", +"tourne-case", +"tourne-cases", +"tourne-disque", +"tourne-disques", +"tourne-feuille", +"tourne-feuilles", +"tourne-feuillet", +"tourne-feuillets", +"tourne-fil", +"tourne-fils", +"tourne-gants", +"tourne-motte", +"tourne-mottes", +"tourne-oreille", +"tourne-oreilles", +"tourne-pierres", +"tourne-soc", +"tourne-socs", +"tourne-vent", +"tourne-vents", +"tourne-à-gauche", +"tourneur-fraiseur", +"tourneurs-fraiseurs", +"tours-minute", +"tours-opérateurs", +"tours-opératrices", +"tours-sur-marnais", +"tours-sur-marnaise", +"tours-sur-marnaises", +"tout-Londres", +"tout-blanc", +"tout-blancs", +"tout-communication", +"tout-connaissant", +"tout-en-un", +"tout-ensemble", +"tout-fait", +"tout-faits", +"tout-fécond", +"tout-parisien", +"tout-parisienne", +"tout-parisiennes", +"tout-parisiens", +"tout-petit", +"tout-petits", +"tout-puissant", +"tout-puissants", +"tout-terrain", +"tout-venant", +"tout-venu", +"tout-à-fait", +"tout-à-l'égout", +"tout-à-la-rue", +"toute-bonne", +"toute-bonté", +"toute-cousue", +"toute-petite", +"toute-présence", +"toute-puissance", +"toute-puissante", +"toute-saine", +"toute-science", +"toute-table", +"toute-venue", +"toute-épice", +"toutes-bonnes", +"toutes-boîtes", +"toutes-petites", +"toutes-puissantes", +"toutes-saines", +"toutes-tables", +"toutes-venues", +"toxi-infectieux", +"toxi-infection", +"toxi-infections", +"toy-terrier", +"trace-bouche", +"trace-roulis", +"trace-sautereau", +"trace-vague", +"trachée-artère", +"trachélo-occipital", +"trachéo-bronchite", +"trachéo-bronchites", +"trade-union", +"trade-unionisme", +"trade-unionismes", +"trade-unions", +"tragi-comique", +"tragi-comiques", +"tragi-comédie", +"tragi-comédies", +"train-train", +"train-trains", +"train-tram", +"traine-buche", +"traine-buches", +"traine-ruisseau", +"traine-savate", +"traine-savates", +"trains-trams", +"trait-d'union", +"trait-d'unioné", +"trait-track", +"tram-train", +"trams-trains", +"tran-tran", +"tranche-maçonné", +"tranche-montagne", +"tranche-montagnes", +"tranche-papier", +"tranche-tête", +"tranchées-abris", +"traîne-buisson", +"traîne-bâton", +"traîne-bûche", +"traîne-bûches", +"traîne-charrue", +"traîne-la-patte", +"traîne-lattes", +"traîne-malheur", +"traîne-misère", +"traîne-patins", +"traîne-potence", +"traîne-ruisseau", +"traîne-savate", +"traîne-savates", +"traîne-semelle", +"traîne-semelles", +"trench-coat", +"trench-coats", +"trente-cinq", +"trente-deux", +"trente-deuxième", +"trente-deuxièmes", +"trente-deuzain", +"trente-deuzains", +"trente-deuzet", +"trente-deuzets", +"trente-douze", +"trente-et-un", +"trente-et-une", +"trente-et-unième", +"trente-et-unièmes", +"trente-huit", +"trente-neuf", +"trente-neuvième", +"trente-quatre", +"trente-sept", +"trente-six", +"trente-trois", +"trente-troisième", +"tribo-électricité", +"tribo-électricités", +"tribo-électrique", +"tribo-électriques", +"tribénuron-méthyle", +"tric-trac", +"tric-tracs", +"trichloro-nitrométhane", +"trichloro-trinitro-benzène", +"triflusulfuron-méthyle", +"trinexapac-éthyl", +"trinitro-cellulose", +"trinitro-celluloses", +"tripe-madame", +"triple-croche", +"triples-croches", +"trique-madame", +"tris-mal", +"tris-male", +"tris-males", +"tris-maux", +"trois-bassinois", +"trois-bassinoise", +"trois-bassinoises", +"trois-crayons", +"trois-huit", +"trois-mâts", +"trois-mâts-goélettes", +"trois-pierrais", +"trois-pierraise", +"trois-pierraises", +"trois-ponts", +"trois-quarts", +"trois-riviérien", +"trois-riviérienne", +"trois-riviériennes", +"trois-riviériens", +"trois-roues", +"trois-six", +"trois-trois", +"trois-épines", +"trompe-cheval", +"trompe-couillon", +"trompe-l'oeil", +"trompe-l'œil", +"trompe-la-mort", +"trompe-oreilles", +"trompe-valet", +"trop-bu", +"trop-payé", +"trop-payés", +"trop-perçu", +"trop-perçus", +"trop-plein", +"trop-pleins", +"trotte-chemin", +"trotte-menu", +"trouble-fête", +"trouble-fêtes", +"trousse-barre", +"trousse-barres", +"trousse-pet", +"trousse-pets", +"trousse-pied", +"trousse-pieds", +"trousse-pète", +"trousse-pètes", +"trousse-queue", +"trousse-queues", +"trousse-traits", +"très-chrétien", +"très-haut", +"tré-flip", +"tré-flips", +"tré-sept", +"trépan-benne", +"trépan-bennes", +"tsoin-tsoin", +"tsouin-tsouin", +"tss-tss", +"tsé-tsé", +"tsé-tsés", +"tta-kun", +"tta-kuns", +"ttun-ttun", +"ttun-ttuns", +"tu-tu-ban-ban", +"tubéro-infundibulaire", +"tubéro-infundibulaires", +"tue-brebis", +"tue-chien", +"tue-chiens", +"tue-diable", +"tue-diables", +"tue-l'amour", +"tue-loup", +"tue-loups", +"tue-mouche", +"tue-mouches", +"tue-poule", +"tue-teignes", +"tue-vent", +"tuniso-égypto-lybien", +"tupi-guarani", +"turbo-alternateur", +"turbo-alternateurs", +"turbo-capitalisme", +"turbo-capitalismes", +"turbo-compresseur", +"turbo-compresseurs", +"turbo-prof", +"turbo-profs", +"turco-coréen", +"turco-mongol", +"turco-persan", +"turco-syrien", +"turn-over", +"tutti-frutti", +"tux-zillertal", +"twin-set", +"twin-sets", +"tz'utujil", +"tâte-au-pot", +"tâte-ferraille", +"tâte-poule", +"tâte-vin", +"tâte-vins", +"témoins-clés", +"téra-ampère", +"téra-ampères", +"téra-électron-volt", +"téra-électron-volts", +"térawatt-heure", +"térawatt-heures", +"térawatts-heures", +"téraélectron-volt", +"téraélectron-volts", +"tétra-atomique", +"tétrachloro-isophtalonitrile", +"tétrachlorodibenzo-p-dioxine", +"tétrachlorodibenzo-p-dioxines", +"tête-bleu", +"tête-bêche", +"tête-chèvre", +"tête-de-Maure", +"tête-de-More", +"tête-de-bécasse", +"tête-de-chat", +"tête-de-chats", +"tête-de-cheval", +"tête-de-clou", +"tête-de-coq", +"tête-de-loup", +"tête-de-maure", +"tête-de-moineau", +"tête-de-mort", +"tête-de-méduse", +"tête-de-serpent", +"tête-de-soufre", +"tête-ronde", +"tête-verte", +"tête-à-queue", +"tête-à-tête", +"têtes-de-Maure", +"têtes-de-chat", +"têtes-de-clou", +"têtes-de-loup", +"têtes-de-moineau", +"têtes-de-mort", +"têtes-de-méduse", +"têtes-vertes", +"tôt-fait", +"tôt-faits", +"u-commerce", +"ukiyo-e", +"ukiyo-es", +"unda-maris", +"une-deux", +"uni-dimensionnel", +"uni-dimensionnelle", +"uni-dimensionnelles", +"uni-dimensionnels", +"uni-modal", +"uni-sonore", +"uni-sonores", +"unité-souris", +"unités-souris", +"univers-bloc", +"univers-île", +"univers-îles", +"upa-upa", +"urane-mica", +"uranes-micas", +"uro-génital", +"uro-génitale", +"uro-génitales", +"uro-génitaux", +"urétro-cystotomie", +"urétro-cystotomies", +"uto-aztèque", +"uto-aztèques", +"utéro-lombaire", +"utéro-ovarien", +"utéro-ovarienne", +"utéro-ovariennes", +"utéro-ovariens", +"utéro-placentaire", +"utéro-tubaire", +"utéro-vaginal", +"utéro-vaginale", +"utéro-vaginales", +"utéro-vaginaux", +"uva-ursi", +"uva-ursis", +"v'là", +"v'nir", +"v'nu", +"v's", +"va-de-la-gueule", +"va-de-pied", +"va-et-vient", +"va-nu-pieds", +"va-outre", +"va-t'en", +"va-t-en", +"va-t-en-guerre", +"va-te-laver", +"va-tout", +"vache-biche", +"vache-garou", +"vaches-biches", +"vaches-garous", +"vade-in-pace", +"vade-mecum", +"vaeakau-taumako", +"vaeakau-taumakos", +"vagino-vésical", +"vaine-pâture", +"val-de-marnais", +"val-de-saânais", +"val-de-saânaise", +"val-de-saânaises", +"val-mésangeois", +"val-mésangeoise", +"val-mésangeoises", +"val-saint-germinois", +"val-saint-germinoise", +"val-saint-germinoises", +"val-saint-pierrais", +"val-saint-pierraise", +"val-saint-pierraises", +"valence-gramme", +"valence-grammes", +"valet-de-pied", +"valet-à-patin", +"valets-de-pied", +"valets-à-patin", +"valse-hésitation", +"valses-hésitations", +"vanity-case", +"vanity-cases", +"vas-y", +"vasculo-nerveux", +"vaso-constricteur", +"vaso-constricteurs", +"vaso-constriction", +"vaso-constrictions", +"vaso-dilatateur", +"vaso-dilatateurs", +"vaso-dilatation", +"vaso-dilatations", +"vaso-intestinal", +"vaso-intestinale", +"vaso-intestinales", +"vaso-intestinaux", +"vaso-moteur", +"vaso-motrice", +"vaterite-A", +"vaterite-As", +"vaux-champenois", +"vaux-champenoise", +"vaux-champenoises", +"vaux-chavannois", +"vaux-sûrois", +"veau-laq", +"veau-marin", +"velci-aller", +"venez-y-voir", +"ventre-madame", +"ventre-saint-gris", +"ver-coquin", +"verge-d'or", +"verges-d'or", +"vers-librisme", +"vers-librismes", +"vers-libriste", +"vers-libristes", +"vert-bois", +"vert-de-gris", +"vert-de-grisa", +"vert-de-grisai", +"vert-de-grisaient", +"vert-de-grisais", +"vert-de-grisait", +"vert-de-grisant", +"vert-de-grisas", +"vert-de-grisasse", +"vert-de-grisassent", +"vert-de-grisasses", +"vert-de-grisassiez", +"vert-de-grisassions", +"vert-de-grise", +"vert-de-grisent", +"vert-de-griser", +"vert-de-grisera", +"vert-de-griserai", +"vert-de-griseraient", +"vert-de-griserais", +"vert-de-griserait", +"vert-de-griseras", +"vert-de-griserez", +"vert-de-griseriez", +"vert-de-griserions", +"vert-de-griserons", +"vert-de-griseront", +"vert-de-grises", +"vert-de-grisez", +"vert-de-grisiez", +"vert-de-grisions", +"vert-de-grisons", +"vert-de-grisâmes", +"vert-de-grisât", +"vert-de-grisâtes", +"vert-de-grisèrent", +"vert-de-grisé", +"vert-de-grisée", +"vert-de-grisées", +"vert-de-grisés", +"vert-jaune", +"vert-monnier", +"vert-monniers", +"vesse-de-loup", +"vesses-de-loup", +"veston-cravate", +"vestons-cravates", +"vetula-domussien", +"vetula-domussienne", +"vetula-domussiennes", +"vetula-domussiens", +"vice-amiral", +"vice-amirale", +"vice-amirales", +"vice-amirauté", +"vice-amiraux", +"vice-bailli", +"vice-baillis", +"vice-camérier", +"vice-cardinal", +"vice-champion", +"vice-championne", +"vice-championnes", +"vice-champions", +"vice-chancelier", +"vice-chanceliers", +"vice-consul", +"vice-consulat", +"vice-consulats", +"vice-consule", +"vice-directeur", +"vice-gouverneur", +"vice-gérance", +"vice-gérances", +"vice-gérant", +"vice-gérants", +"vice-gérent", +"vice-gérents", +"vice-légat", +"vice-légation", +"vice-légations", +"vice-légats", +"vice-official", +"vice-procureur", +"vice-procureurs", +"vice-préfet", +"vice-présida", +"vice-présidai", +"vice-présidaient", +"vice-présidais", +"vice-présidait", +"vice-présidant", +"vice-présidas", +"vice-présidasse", +"vice-présidassent", +"vice-présidasses", +"vice-présidassiez", +"vice-présidassions", +"vice-préside", +"vice-présidence", +"vice-présidences", +"vice-président", +"vice-présidente", +"vice-présidentes", +"vice-présidents", +"vice-présider", +"vice-présidera", +"vice-présiderai", +"vice-présideraient", +"vice-présiderais", +"vice-présiderait", +"vice-présideras", +"vice-présiderez", +"vice-présideriez", +"vice-présiderions", +"vice-présiderons", +"vice-présideront", +"vice-présides", +"vice-présidez", +"vice-présidiez", +"vice-présidions", +"vice-présidons", +"vice-présidâmes", +"vice-présidât", +"vice-présidâtes", +"vice-présidèrent", +"vice-présidé", +"vice-présidée", +"vice-présidées", +"vice-présidés", +"vice-recteur", +"vice-recteurs", +"vice-rectrice", +"vice-rectrices", +"vice-reine", +"vice-reines", +"vice-roi", +"vice-rois", +"vice-royal", +"vice-royale", +"vice-royales", +"vice-royauté", +"vice-royautés", +"vice-royaux", +"vice-secrétaire", +"vice-sénéchal", +"vice-versa", +"vices-gouverneurs", +"victim-blaming", +"vide-atelier", +"vide-ateliers", +"vide-bouteille", +"vide-bouteilles", +"vide-cave", +"vide-caves", +"vide-citrons", +"vide-couilles", +"vide-dressing", +"vide-dressings", +"vide-gousset", +"vide-goussets", +"vide-grange", +"vide-grenier", +"vide-greniers", +"vide-maison", +"vide-maisons", +"vide-ordure", +"vide-ordures", +"vide-poche", +"vide-poches", +"vide-pomme", +"vide-pommes", +"vide-pommier", +"vide-vite", +"vieil-baugeois", +"vieil-baugeoise", +"vieil-baugeoises", +"vieil-hesdinois", +"vieil-hesdinoise", +"vieil-hesdinoises", +"viel-mauricien", +"viel-mauricienne", +"viel-mauriciennes", +"viel-mauriciens", +"vielle-soubiranais", +"vielle-soubiranaise", +"vielle-soubiranaises", +"viens-poupoulerie", +"viens-poupouleries", +"vif-argent", +"vif-gage", +"vigne-blanche", +"vignes-blanches", +"village-rue", +"village-tas", +"villages-rue", +"villages-rues", +"villages-tas", +"villard-d'hérien", +"villard-d'hérienne", +"villard-d'hériennes", +"villard-d'hériens", +"villard-de-lans", +"villes-champignons", +"villes-clés", +"villes-provinces", +"villes-États", +"vingt-cinq", +"vingt-cinquième", +"vingt-cinquièmes", +"vingt-deux", +"vingt-deuxain", +"vingt-deuxains", +"vingt-deuxième", +"vingt-deuxièmes", +"vingt-et-un", +"vingt-et-une", +"vingt-et-unième", +"vingt-et-unièmes", +"vingt-hanapsien", +"vingt-hanapsienne", +"vingt-hanapsiennes", +"vingt-hanapsiens", +"vingt-huit", +"vingt-huitième", +"vingt-huitièmes", +"vingt-neuf", +"vingt-neuvième", +"vingt-neuvièmes", +"vingt-quatrain", +"vingt-quatrains", +"vingt-quatre", +"vingt-quatrième", +"vingt-quatrièmes", +"vingt-sept", +"vingt-septième", +"vingt-septièmes", +"vingt-six", +"vingt-sixain", +"vingt-sixième", +"vingt-sixièmes", +"vingt-trois", +"vingt-troisième", +"vingt-troisièmes", +"vino-benzoïque", +"vino-benzoïques", +"violet-évêque", +"viorne-tin", +"viornes-tin", +"vire-capot", +"vire-capots", +"vire-vire", +"vis-à-vis", +"visa-bourgien", +"visa-bourgienne", +"visa-bourgiennes", +"visa-bourgiens", +"visuo-spacial", +"visuo-spaciale", +"visuo-spaciales", +"visuo-spaciaux", +"vit-de-mulet", +"vivaro-alpin", +"vivaro-alpins", +"vive-eau", +"vive-la-joie", +"vives-eaux", +"vivre-ensemble", +"voile-manteau", +"voile-manteaux", +"vois-tu", +"voiture-bar", +"voiture-bélier", +"voiture-cage", +"voiture-couchettes", +"voiture-lits", +"voiture-pilote", +"voiture-restaurant", +"voiture-salon", +"voiture-ventouse", +"voitures-balais", +"voitures-bars", +"voitures-béliers", +"voitures-cages", +"voitures-couchettes", +"voitures-lits", +"voitures-pilotes", +"voitures-restaurants", +"voitures-salons", +"voitures-ventouses", +"vol-au-vent", +"vol-bélier", +"vol-béliers", +"volley-ball", +"volley-balls", +"volt-ampère", +"volt-ampères", +"volte-face", +"volte-faces", +"vomito-negro", +"vomito-négro", +"vous-même", +"vous-mêmes", +"voyageur-kilomètre", +"voyageurs-kilomètres", +"voyez-vous", +"vrigne-meusien", +"vrigne-meusienne", +"vrigne-meusiennes", +"vrigne-meusiens", +"vu-arriver", +"vy-les-luron", +"vy-les-lurone", +"vy-les-lurones", +"vy-les-lurons", +"végéto-sulfurique", +"vélo-rail", +"vélo-rails", +"vélo-taxi", +"vélo-école", +"vélo-écoles", +"vélos-taxis", +"vétéro-testamentaire", +"vétéro-testamentaires", +"w.-c.", +"wagon-bar", +"wagon-citerne", +"wagon-couchette", +"wagon-couchettes", +"wagon-foudre", +"wagon-grue", +"wagon-lit", +"wagon-lits", +"wagon-poche", +"wagon-poste", +"wagon-restaurant", +"wagon-réservoir", +"wagon-salon", +"wagon-tombereau", +"wagon-trémie", +"wagon-vanne", +"wagons-bars", +"wagons-citernes", +"wagons-couchettes", +"wagons-foudres", +"wagons-grues", +"wagons-lits", +"wagons-restaurants", +"wagons-réservoirs", +"wagons-salons", +"wagons-tombereaux", +"wagons-trémie", +"wah-wah", +"walkie-talkie", +"walkies-talkies", +"wallon-cappelois", +"wallon-cappeloise", +"wallon-cappeloises", +"waray-waray", +"water-ballast", +"water-ballasts", +"water-closet", +"water-closets", +"water-polo", +"water-proof", +"water-proofs", +"wauthier-brainois", +"waux-hall", +"waux-halls", +"waza-ari", +"web-to-print", +"week-end", +"week-ends", +"wemaers-cappelois", +"wemaers-cappeloise", +"wemaers-cappeloises", +"wesh-wesh", +"west-cappelois", +"west-cappeloise", +"west-cappeloises", +"white-spirit", +"willy-willy", +"witsuwit'en", +"wuchiaping'ien", +"y'a", +"yacht-club", +"yacht-clubs", "yin-yang", "ylang-ylang", -"yocto-ohm", -"yocto-ohms", -"Yo-kai", -"Yorkshire-et-Humber", -"yotta-ampère", -"yotta-ampères", -"young-ice", -"young-ices", -"you-you", -"you-yous", "yo-yo", "yo-yota", "yo-yotai", "yo-yotaient", "yo-yotais", "yo-yotait", -"yo-yotâmes", "yo-yotant", "yo-yotas", "yo-yotasse", @@ -26128,12 +31108,7 @@ FR_BASE_EXCEPTIONS = [ "yo-yotasses", "yo-yotassiez", "yo-yotassions", -"yo-yotât", -"yo-yotâtes", "yo-yote", -"yo-yoté", -"yo-yotée", -"yo-yotées", "yo-yotent", "yo-yoter", "yo-yotera", @@ -26142,97 +31117,42 @@ FR_BASE_EXCEPTIONS = [ "yo-yoterais", "yo-yoterait", "yo-yoteras", -"yo-yotèrent", "yo-yoterez", "yo-yoteriez", "yo-yoterions", "yo-yoterons", "yo-yoteront", "yo-yotes", -"yo-yotés", "yo-yotez", "yo-yotiez", "yo-yotions", "yo-yotons", -"Ypreville-Biville", -"Yronde-et-Buron", -"Yssac-la-Tourette", +"yo-yotâmes", +"yo-yotât", +"yo-yotâtes", +"yo-yotèrent", +"yo-yoté", +"yo-yotée", +"yo-yotées", +"yo-yotés", +"yocto-ohm", +"yocto-ohms", +"yotta-ampère", +"yotta-ampères", +"you-you", +"you-yous", +"young-ice", +"young-ices", "yuki-onna", "yuki-onnas", -"Yverdon-les-Bains", -"Yves-Gomezée", -"Yvetot-Bocage", -"Yvignac-la-Tour", -"Yville-sur-Seine", -"Yvoy-le-Marron", -"Yvrac-et-Malleyrand", -"Yvré-le-Pôlin", -"Yvré-l'Evêque", -"Yvré-l'Évêque", -"Yzeures-sur-Creuse", -"Z9-12:Ac", -"Z9-dodécénylacétate", -"Zahna-Elster", -"zapil's", -"zapil'ser", -"zayse-zergulla", -"Z/E-8-DDA", -"zébré-de-vert", -"Zella-Mehlis", -"Zeltingen-Rachtig", +"yé-yé", "z'en", -"Zend-avesta", -"zénith-secteur", -"zénith-secteurs", -"zepto-ohm", -"zepto-ohms", -"Zernitz-Lohm", -"zéro-dimensionnel", -"Zétrud-Lumay", -"zetta-ampère", -"zetta-ampères", -"Zeulenroda-Triebes", -"Zevenhuizen-Moerkapelle", -"Z-grille", -"Z-grilles", -"Zichen-Zussen-Bolder", -"Ziegra-Knobelsdorf", -"Zihlschlacht-Sitterdorf", -"Zillis-Reischen", -"zinc-blende", -"zinc-blendes", -"Ziortza-Bolibar", -"zizi-panpan", -"Zoerle-Parwijs", -"Zoeterwoude-Dorp", -"Zoeterwoude-Rijndijk", -"zones-clés", -"zoo-cinéma", -"zoo-cinémas", -"zoo-gymnaste", -"zoo-gymnastes", -"Zschaitz-Ottewig", -"Zuid-Beijerland", -"Zuid-Eierland", -"Zuid-Polsbroek", -"Zuid-Scharwoude", -"Zuid-Spierdijk", -"Zuid-Waddinxveen", -"zulgo-gemzek", -"zuricho-montpelliérain", -"zuricho-montpelliéraine", -"zuricho-montpelliéraines", -"zuricho-montpelliérains", -"zut-au-berger", -"Zwaagdijk-Oost", -"Zwaagdijk-West", "z'y", "z'yeuta", "z'yeutai", "z'yeutaient", "z'yeutais", "z'yeutait", -"z'yeutâmes", "z'yeutant", "z'yeutas", "z'yeutasse", @@ -26240,12 +31160,7 @@ FR_BASE_EXCEPTIONS = [ "z'yeutasses", "z'yeutassiez", "z'yeutassions", -"z'yeutât", -"z'yeutâtes", "z'yeute", -"z'yeuté", -"z'yeutée", -"z'yeutées", "z'yeutent", "z'yeuter", "z'yeutera", @@ -26254,42 +31169,427 @@ FR_BASE_EXCEPTIONS = [ "z'yeuterais", "z'yeuterait", "z'yeuteras", -"z'yeutèrent", "z'yeuterez", "z'yeuteriez", "z'yeuterions", "z'yeuterons", "z'yeuteront", "z'yeutes", -"z'yeutés", "z'yeutez", "z'yeutiez", "z'yeutions", "z'yeutons", +"z'yeutâmes", +"z'yeutât", +"z'yeutâtes", +"z'yeutèrent", +"z'yeuté", +"z'yeutée", +"z'yeutées", +"z'yeutés", "z'yeux", +"zapil's", +"zapil'ser", +"zayse-zergulla", +"zepto-ohm", +"zepto-ohms", +"zetta-ampère", +"zetta-ampères", +"zinc-blende", +"zinc-blendes", +"zizi-panpan", +"zones-clés", +"zoo-cinéma", +"zoo-cinémas", +"zoo-gymnaste", +"zoo-gymnastes", +"zulgo-gemzek", +"zuricho-montpelliérain", +"zuricho-montpelliéraine", +"zuricho-montpelliéraines", +"zuricho-montpelliérains", +"zut-au-berger", +"zy-va", +"zy-vas", "zygomato-auriculaire", "zygomato-labial", "zygomato-maxillaire", -"zy-va", -"zy-vas", -"α-Dahllite", -"α-Dahllites", +"zébré-de-vert", +"zénith-secteur", +"zénith-secteurs", +"zéro-dimensionnel", +"Œuf-en-Ternois", +"Ében-Émael", +"Écalles-Alix", +"Écardenville-la-Campagne", +"Écardenville-sur-Eure", +"Écaussinnes-Lalaing", +"Écaussinnes-d'Enghien", +"Échelle-Saint-Aurin", +"Échenans-sous-Mont-Vaudois", +"Échenoz-la-Méline", +"Échenoz-le-Sec", +"Éclans-Nenon", +"Éclaron-Braucourt-Sainte-Livière", +"Éclusier-Vaux", +"École-Valentin", +"Écot-la-Combe", +"Écotay-l'Olme", +"Écouché-les-Vallées", +"Écourt-Saint-Quentin", +"Écoust-Saint-Mein", +"Écoute-s'il-pleut", +"Écretteville-lès-Baons", +"Écretteville-sur-Mer", +"Écry-le-Franc", +"Écurey-en-Verdunois", +"Écury-le-Repos", +"Écury-sur-Coole", +"Édouard-Josse", +"Église-Neuve-d'Issac", +"Église-Neuve-de-Vergt", +"Église-aux-Bois", +"Égliseneuve-d'Entraigues", +"Égliseneuve-des-Liards", +"Égliseneuve-près-Billom", +"Égriselles-le-Bocage", +"Éguille-sur-Seudre", +"Éguilly-sous-Bois", +"Éguzon-Chantôme", +"Égée-Méridionale", +"Égée-Septentrionale", +"Éhein-bas", +"Éleu-dit-Leauwette", +"Élincourt-Sainte-Marguerite", +"Élise-Daucourt", +"Émilie-Romagne", +"Émilien-Romagnol", +"Émilienne-Romagnole", +"Émiliennes-Romagnoles", +"Émiliens-Romagnols", +"Énencourt-Léage", +"Énencourt-le-Sec", +"Éole-en-Beauce", +"Épagne-Épagnette", +"Épaux-Bézu", +"Épeigné-les-Bois", +"Épeigné-sur-Dême", +"Épercieux-Saint-Paul", +"Épernay-sous-Gevrey", +"Épi-Contois", +"Épi-Contoise", +"Épi-Contoises", +"Épiais-Rhus", +"Épiais-lès-Louvres", +"Épieds-en-Beauce", +"Épiez-sur-Chiers", +"Épiez-sur-Meuse", +"Épinac-les-Mines", +"Épinay-Champlâtreux", +"Épinay-le-Comte", +"Épinay-sous-Sénart", +"Épinay-sur-Duclair", +"Épinay-sur-Odon", +"Épinay-sur-Orge", +"Épinay-sur-Seine", +"Épine-aux-Bois", +"Épineau-les-Voves", +"Épineu-le-Chevreuil", +"Épineuil-le-Fleuriel", +"Épineux-le-Seguin", +"Épreville-en-Lieuvin", +"Épreville-en-Roumois", +"Épreville-près-le-Neubourg", +"Équatoria-Central", +"Équatoria-Occidental", +"Équatoria-Oriental", +"Équennes-Éramecourt", +"Équeurdreville-Hainneville", +"Équihen-Plage", +"Éragny-sur-Epte", +"Éragny-sur-Oise", +"Érize-Saint-Dizier", +"Érize-la-Brûlée", +"Érize-la-Grande", +"Érize-la-Petite", +"Étables-sur-Mer", +"Étais-la-Sauvin", +"Étampes-sur-Marne", +"Étang-Bertrand", +"Étang-Salé", +"Étang-Saléen", +"Étang-Saléenne", +"Étang-Saléennes", +"Étang-Saléens", +"Étang-Vergy", +"Étang-la-Ville", +"Étang-sur-Arroux", +"État-Major", +"État-major", +"État-nation", +"État-nounou", +"État-providence", +"États-Généraux", +"États-Majors", +"États-Unien", +"États-Unienne", +"États-Uniennes", +"États-Uniens", +"États-Unis", +"États-majors", +"États-nations", +"États-nounous", +"États-providence", +"Étaves-et-Bocquiaux", +"Étinehem-Méricourt", +"Étival-Clairefontaine", +"Étival-lès-le-Mans", +"Étoile-Saint-Cyrice", +"Étoile-sur-Rhône", +"Étrelles-et-la-Montbleuse", +"Étrelles-sur-Aube", +"Étricourt-Manancourt", +"Étricourt-Manancourtois", +"Étricourt-Manancourtoise", +"Étricourt-Manancourtoises", +"Étueffont-Bas", +"Évaux-et-Ménil", +"Évaux-les-Bains", +"Évette-Salbert", +"Évian-les-Bains", +"Évin-Malmaison", +"Évry-Grégy-sur-Yerre", +"Évry-Petit-Bourg", +"Ézy-sur-Eure", +"Î.-P.-É.", +"Île-Bouchard", +"Île-Molène", +"Île-Rousse", +"Île-Saint-Denis", +"Île-Tudiste", +"Île-Tudistes", +"Île-Tudy", +"Île-aux-Moines", +"Île-d'Aix", +"Île-d'Anticosti", +"Île-d'Arz", +"Île-d'Elle", +"Île-d'Houat", +"Île-d'Olonne", +"Île-d'Yeu", +"Île-de-Batz", +"Île-de-Bréhat", +"Île-de-France", +"Île-de-Sein", +"Île-du-Prince-Édouard", +"Îles-de-la-Madeleine", +"Îlo-Dionysien", +"Îlo-Dionysienne", +"Ölbronn-Dürrn", +"Übach-Palenberg", +"Ühlingen-Birkendorf", +"âme-sœur", +"âmes-sœurs", +"âne-zèbre", +"ânes-zèbres", +"ça-va-ça-vient", +"ça-voir", +"ça-voirs", +"çui-là", +"écart-type", +"écarts-types", +"écho-location", +"écho-locations", +"échos-radars", +"écorche-œil", +"écoute-s'il-pleut", +"écrase-merde", +"écrase-merdes", +"écurie-ménagerie", +"écuries-ménageries", +"égal-à-tous", +"église-halle", +"égypto-lybien", +"égypto-tchado-soudanais", +"éka-actinide", +"éka-actinides", +"éka-aluminium", +"éka-astate", +"éka-bismuth", +"éka-bore", +"éka-borium", +"éka-francium", +"éka-mercure", +"éka-plomb", +"éka-polonium", +"éka-prométhium", +"éka-silicium", +"électron-volt", +"électron-volts", +"élément-clé", +"éléments-clés", +"émetteur-récepteur", +"émetteur-récepteurs", +"émilien-romagnol", +"émilienne-romagnole", +"émiliennes-romagnoles", +"émiliens-romagnols", +"émirato-algérien", +"émirato-allemand", +"émirato-allemands", +"émirato-britannique", +"émirato-britanniques", +"émirato-helvétique", +"émirato-helvétiques", +"émirato-indien", +"émirato-iranien", +"émirato-japonais", +"émission-débat", +"énargite-beta", +"énargite-betas", +"éoli-harpe", +"épargne-logement", +"épaulé-jeté", +"épaulés-jetés", +"épi-contois", +"épi-contoise", +"épi-contoises", +"épidote-gris", +"épinard-fraise", +"épine-du-Christ", +"épine-fleurie", +"épine-vinette", +"épines-vinettes", +"épiplo-entérocèle", +"épiplo-ischiocèle", +"épiplo-mérocèle", +"épluche-légume", +"épluche-légumes", +"épuise-volante", +"épuises-volantes", +"équato-guinéen", +"équato-guinéenne", +"équato-guinéennes", +"équato-guinéens", +"éso-narthex", +"étalon-or", +"étang-saléen", +"étang-saléenne", +"étang-saléennes", +"étang-saléens", +"état-limite", +"état-major", +"états-civils", +"états-généraux", +"états-limites", +"états-majors", +"états-nations", +"états-unianisa", +"états-unianisai", +"états-unianisaient", +"états-unianisais", +"états-unianisait", +"états-unianisant", +"états-unianisas", +"états-unianisasse", +"états-unianisassent", +"états-unianisasses", +"états-unianisassiez", +"états-unianisassions", +"états-unianise", +"états-unianisent", +"états-unianiser", +"états-unianisera", +"états-unianiserai", +"états-unianiseraient", +"états-unianiserais", +"états-unianiserait", +"états-unianiseras", +"états-unianiserez", +"états-unianiseriez", +"états-unianiserions", +"états-unianiserons", +"états-unianiseront", +"états-unianises", +"états-unianisez", +"états-unianisiez", +"états-unianisions", +"états-unianisons", +"états-unianisâmes", +"états-unianisât", +"états-unianisâtes", +"états-unianisèrent", +"états-unianisé", +"états-unianisée", +"états-unianisées", +"états-unianisés", +"états-unien", +"états-unienne", +"états-uniennes", +"états-uniens", +"étau-limeur", +"étaux-limeurs", +"éthane-1,2-diol", +"éthyl-benzène", +"éthéro-chloroforme", +"étouffe-chrétien", +"étouffe-chrétiens", +"étrangle-chat", +"étrangle-chien", +"étrangle-loup", +"étrangle-loups", +"étricourt-manancourtois", +"étricourt-manancourtoise", +"étricourt-manancourtoises", +"être-en-soi", +"être-là", +"êtres-en-soi", +"île-de-France", +"île-prison", +"île-tudiste", +"île-tudistes", +"île-État", +"îles-prisons", +"îles-États", +"îlo-dionysien", +"ôte-agrafes", +"über-célèbre", +"über-célèbres", +"Łutselk'e", +"Œuf-en-Ternois", +"œil-de-bœuf", +"œil-de-chat", +"œil-de-perdrix", +"œil-de-pie", +"œil-de-serpent", +"œil-de-tigre", +"œil-du-soleil", +"œils-de-bœuf", +"œils-de-pie", +"œils-de-serpent", +"œils-de-tigre", +"œsophago-gastro-duodénoscopie", +"œsophago-gastro-duodénoscopies", +"œuf-coque", +"œufs-coque", "α-D-glucofuranose", "α-D-glucopyranose", "α-D-ribofuranose", "α-D-ribopyranose", +"α-Dahllite", +"α-Dahllites", "α-L-ribofuranose", "α-L-ribopyranose", -"β-Dahllite", -"β-Dahllites", "β-D-glucofuranose", "β-D-glucopyranose", "β-D-ribofuranose", "β-D-ribopyranose", -"β-galactosidase", -"β-lactamine", +"β-Dahllite", +"β-Dahllites", "β-L-ribofuranose", "β-L-ribopyranose", +"β-galactosidase", +"β-lactamine", "β-sitostérol", "β-sitostérols", "γ-Dahllite", @@ -26299,4 +31599,5 @@ FR_BASE_EXCEPTIONS = [ "σ-additivités", "σ-compacité", "σ-compact", -"σ-compacts"] +"σ-compacts" +] diff --git a/spacy/lang/fr/examples.py b/spacy/lang/fr/examples.py new file mode 100644 index 000000000..08409ea61 --- /dev/null +++ b/spacy/lang/fr/examples.py @@ -0,0 +1,26 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.fr.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple cherche a acheter une startup anglaise pour 1 milliard de dollard", + "Les voitures autonomes voient leur assurances décalées vers les constructeurs", + "San Francisco envisage d'interdire les robots coursiers", + "Londres est une grande ville du Royaume-Uni", + "L’Italie choisit ArcelorMittal pour reprendre la plus grande aciérie d’Europe", + "Apple lance HomePod parce qu'il se sent menacé par l'Echo d'Amazon", + "La France ne devrait pas manquer d'électricité cet été, même en cas de canicule", + "Nouvelles attaques de Trump contre le maire de Londres", + "Où es-tu ?", + "Qui est le président de la France ?", + "Où est la capitale des Etats-Unis ?", + "Quand est né Barack Obama ?" +] diff --git a/spacy/lang/fr/lex_attrs.py b/spacy/lang/fr/lex_attrs.py new file mode 100644 index 000000000..41c509dff --- /dev/null +++ b/spacy/lang/fr/lex_attrs.py @@ -0,0 +1,41 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...attrs import LIKE_NUM + + +_num_words = set(""" +zero un deux trois quatre cinq six sept huit neuf dix +onze douze treize quatorze quinze seize dix-sept dix-huit dix-neuf +vingt trente quanrante cinquante soixante septante quatre-vingt huitante nonante +cent mille mil million milliard billion quadrillion quintillion +sextillion septillion octillion nonillion decillion +""".split()) + +_ordinal_words = set(""" +premier deuxième second troisième quatrième cinquième sixième septième huitième neuvième dixième +onzième douzième treizième quatorzième quinzième seizième dix-septième dix-huitième dix-neufième +vingtième trentième quanrantième cinquantième soixantième septantième quatre-vingtième huitantième nonantième +centième millième millionnième milliardième billionnième quadrillionnième quintillionnième +sextillionnième septillionnième octillionnième nonillionnième decillionnième +""".split()) + + +def like_num(text): + # Might require more work? + # See this discussion: https://github.com/explosion/spaCy/pull/1161 + text = text.replace(',', '').replace('.', '') + if text.isdigit(): + return True + if text.count('/') == 1: + num, denom = text.split('/') + if num.isdigit() and denom.isdigit(): + return True + if text in _num_words: + return True + return False + + +LEX_ATTRS = { + LIKE_NUM: like_num +} diff --git a/spacy/lang/he/__init__.py b/spacy/lang/he/__init__.py index a15dc9a05..807794fee 100644 --- a/spacy/lang/he/__init__.py +++ b/spacy/lang/he/__init__.py @@ -12,9 +12,8 @@ from ...util import update_exc class HebrewDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'he' - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS) - stop_words = set(STOP_WORDS) + stop_words = STOP_WORDS class Hebrew(Language): diff --git a/spacy/lang/he/examples.py b/spacy/lang/he/examples.py new file mode 100644 index 000000000..f99f4814b --- /dev/null +++ b/spacy/lang/he/examples.py @@ -0,0 +1,28 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.he.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + 'סין מקימה קרן של 440 מיליון דולר להשקעה בהייטק בישראל', + 'רה"מ הודיע כי יחרים טקס בחסותו', + 'הכנסת צפויה לאשר איכון אוטומטי של שיחות למוקד 100', + 'תוכנית לאומית תהפוך את ישראל למעצמה דיגיטלית', + 'סע לשלום, המפתחות בפנים.', + 'מלצר, פעמיים טורקי!', + 'ואהבת לרעך כמוך.', + 'היום נעשה משהו בלתי נשכח.', + 'איפה הילד?', + 'מיהו נשיא צרפת?', + 'מהי בירת ארצות הברית?', + "איך קוראים בעברית לצ'ופצ'יק של הקומקום?", + 'מה הייתה הדקה?', + 'מי אומר שלום ראשון, זה שעולה או זה שיורד?' +] diff --git a/spacy/lang/hu/__init__.py b/spacy/lang/hu/__init__.py index 0fe6a9f5c..35b047900 100644 --- a/spacy/lang/hu/__init__.py +++ b/spacy/lang/hu/__init__.py @@ -9,7 +9,6 @@ from .lemmatizer import LOOKUP from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups @@ -18,17 +17,13 @@ class HungarianDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'hu' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) - prefixes = tuple(TOKENIZER_PREFIXES) - suffixes = tuple(TOKENIZER_SUFFIXES) - infixes = tuple(TOKENIZER_INFIXES) + stop_words = STOP_WORDS + prefixes = TOKENIZER_PREFIXES + suffixes = TOKENIZER_SUFFIXES + infixes = TOKENIZER_INFIXES token_match = TOKEN_MATCH - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + lemma_lookup = LOOKUP class Hungarian(Language): diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py new file mode 100644 index 000000000..2f21e73cf --- /dev/null +++ b/spacy/lang/id/__init__.py @@ -0,0 +1,36 @@ +# coding: utf8 +from __future__ import unicode_literals + +from .stop_words import STOP_WORDS +from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_PREFIXES, TOKENIZER_INFIXES +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .norm_exceptions import NORM_EXCEPTIONS +from .lemmatizer import LOOKUP +from .lex_attrs import LEX_ATTRS +from .syntax_iterators import SYNTAX_ITERATORS + +from ..tokenizer_exceptions import BASE_EXCEPTIONS +from ...language import Language +from ...attrs import LANG +from ...util import update_exc + + +class IndonesianDefaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters[LANG] = lambda text: 'id' + lex_attr_getters.update(LEX_ATTRS) + tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + stop_words = STOP_WORDS + prefixes = TOKENIZER_PREFIXES + suffixes = TOKENIZER_SUFFIXES + infixes = TOKENIZER_INFIXES + syntax_iterators = SYNTAX_ITERATORS + lemma_lookup = LOOKUP + + +class Indonesian(Language): + lang = 'id' + Defaults = IndonesianDefaults + + +__all__ = ['Indonesian'] diff --git a/spacy/lang/id/_tokenizer_exceptions_list.py b/spacy/lang/id/_tokenizer_exceptions_list.py new file mode 100644 index 000000000..7ccf0b7b0 --- /dev/null +++ b/spacy/lang/id/_tokenizer_exceptions_list.py @@ -0,0 +1,3833 @@ +# coding: utf8 +from __future__ import unicode_literals + +ID_BASE_EXCEPTIONS = set(""" +aba-aba +abah-abah +abal-abal +abang-abang +abar-abar +abong-abong +abrit-abrit +abrit-abritan +abu-abu +abuh-abuhan +abuk-abuk +abun-abun +acak-acak +acak-acakan +acang-acang +acap-acap +aci-aci +aci-acian +aci-acinya +aco-acoan +ad-blocker +ad-interim +ada-ada saja +ada-adanya +ada-adanyakah +adang-adang +adap-adapan +add-on +add-ons +adik-adik +adik-beradik +aduk-adukan +after-sales +agak-agak +agak-agih +agama-agama +agar-agar +age-related +agut-agut +air-air +air-cooled +air-to-air +ajak-ajak +ajar-ajar +aji-aji +akal-akal +akal-akalan +akan-akan +akar-akar +akar-akaran +akhir-akhir +akhir-akhirnya +aki-aki +aksi-aksi +alah-mengalahi +alai-belai +alan-alan +alang-alang +alang-alangan +alap-alap +alat-alat +ali-ali +alif-alifan +alih-alih +aling-aling +aling-alingan +alip-alipan +all-electric +all-in-one +all-out +all-time +alon-alon +alt-right +alt-text +alu-alu +alu-aluan +alun-alun +alur-alur +alur-aluran +always-on +amai-amai +amatir-amatiran +ambah-ambah +ambai-ambai +ambil-mengambil +ambreng-ambrengan +ambring-ambringan +ambu-ambu +ambung-ambung +amin-amin +amit-amit +ampai-ampai +amprung-amprungan +amung-amung +anai-anai +anak-anak +anak-anakan +anak-beranak +anak-cucu +anak-istri +ancak-ancak +ancang-ancang +ancar-ancar +andang-andang +andeng-andeng +aneh-aneh +angan-angan +anggar-anggar +anggaran-red +anggota-anggota +anggung-anggip +angin-angin +angin-anginan +angkal-angkal +angkul-angkul +angkup-angkup +angkut-angkut +ani-ani +aning-aning +anjang-anjang +anjing-anjing +anjung-anjung +anjung-anjungan +antah-berantah +antar-antar +antar-mengantar +ante-mortem +antek-antek +anter-anter +antihuru-hara +anting-anting +antung-antung +anyam-menganyam +anyang-anyang +apa-apa +apa-apaan +apel-apel +api-api +apit-apit +aplikasi-aplikasi +apotek-apotek +aprit-apritan +apu-apu +apung-apung +arah-arah +arak-arak +arak-arakan +aram-aram +arek-arek +arem-arem +ari-ari +artis-artis +aru-aru +arung-arungan +asa-asaan +asal-asalan +asal-muasal +asal-usul +asam-asaman +asas-asas +aset-aset +asmaul-husna +asosiasi-asosiasi +asuh-asuh +asyik-asyiknya +atas-mengatasi +ati-ati +atung-atung +aturan-aturan +audio-video +audio-visual +auto-brightness +auto-complete +auto-focus +auto-play +auto-update +avant-garde +awan-awan +awan-berawan +awang-awang +awang-gemawang +awar-awar +awat-awat +awik-awik +awut-awutan +ayah-anak +ayak-ayak +ayam-ayam +ayam-ayaman +ayang-ayang +ayat-ayat +ayeng-ayengan +ayun-temayun +ayut-ayutan +ba-bi-bu +back-to-back +back-up +badan-badan +bade-bade +badut-badut +bagi-bagi +bahan-bahan +bahu-membahu +baik-baik +bail-out +bajang-bajang +baji-baji +balai-balai +balam-balam +balas-berbalas +balas-membalas +bale-bale +baling-baling +ball-playing +balon-balon +balut-balut +band-band +bandara-bandara +bangsa-bangsa +bangun-bangun +bangunan-bangunan +bank-bank +bantah-bantah +bantahan-bantahan +bantal-bantal +banyak-banyak +bapak-anak +bapak-bapak +bapak-ibu +bapak-ibunya +barang-barang +barat-barat +barat-daya +barat-laut +barau-barau +bare-bare +bareng-bareng +bari-bari +barik-barik +baris-berbaris +baru-baru +baru-baru ini +baru-batu +barung-barung +basa-basi +bata-bata +batalyon-batalyon +batang-batang +batas-batas +batir-batir +batu-batu +batuk-batuk +batung-batung +bau-bauan +bawa-bawa +bayan-bayan +bayang-bayang +bayi-bayi +bea-cukai +bedeng-bedeng +bedil-bedal +bedil-bedilan +begana-begini +bek-bek +bekal-bekalan +bekerdom-kerdom +bekertak-kertak +belang-belang +belat-belit +beliau-beliau +belu-belai +belum-belum +benar-benar +benda-benda +bengang-bengut +benggal-benggil +bengkal-bengkil +bengkang-bengkok +bengkang-bengkong +bengkang-bengkung +benteng-benteng +bentuk-bentuk +benua-benua +ber-selfie +berabad-abad +berabun-rabun +beracah-acah +berada-ada +beradik-berkakak +beragah-agah +beragak-agak +beragam-ragam +beraja-raja +berakit-rakit +beraku-akuan +beralu-aluan +beralun-alun +beramah-ramah +beramah-ramahan +beramah-tamah +beramai-ramai +berambai-ambai +berambal-ambalan +berambil-ambil +beramuk-amuk +beramuk-amukan +berandai-andai +berandai-randai +beraneh-aneh +berang-berang +berangan-angan +beranggap-anggapan +berangguk-angguk +berangin-angin +berangka-angka +berangka-angkaan +berangkai-rangkai +berangkap-rangkapan +berani-berani +beranja-anja +berantai-rantai +berapi-api +berapung-apung +berarak-arakan +beras-beras +berasak-asak +berasak-asakan +berasap-asap +berasing-asingan +beratus-ratus +berawa-rawa +berawas-awas +berayal-ayalan +berayun-ayun +berbagai-bagai +berbahas-bahasan +berbahasa-bahasa +berbaik-baikan +berbait-bait +berbala-bala +berbalas-balasan +berbalik-balik +berbalun-balun +berbanjar-banjar +berbantah-bantah +berbanyak-banyak +berbarik-barik +berbasa-basi +berbasah-basah +berbatu-batu +berbayang-bayang +berbecak-becak +berbeda-beda +berbedil-bedilan +berbega-bega +berbeka-beka +berbelah-belah +berbelakang-belakangan +berbelang-belang +berbelau-belauan +berbeli-beli +berbeli-belian +berbelit-belit +berbelok-belok +berbenang-benang +berbenar-benar +berbencah-bencah +berbencol-bencol +berbenggil-benggil +berbentol-bentol +berbentong-bentong +berberani-berani +berbesar-besar +berbidai-bidai +berbiduk-biduk +berbiku-biku +berbilik-bilik +berbinar-binar +berbincang-bincang +berbingkah-bingkah +berbintang-bintang +berbintik-bintik +berbintil-bintil +berbisik-bisik +berbolak-balik +berbolong-bolong +berbondong-bondong +berbongkah-bongkah +berbuai-buai +berbual-bual +berbudak-budak +berbukit-bukit +berbulan-bulan +berbunga-bunga +berbuntut-buntut +berbunuh-bunuhan +berburu-buru +berburuk-buruk +berbutir-butir +bercabang-cabang +bercaci-cacian +bercakap-cakap +bercakar-cakaran +bercamping-camping +bercantik-cantik +bercari-cari +bercari-carian +bercarik-carik +bercarut-carut +bercebar-cebur +bercepat-cepat +bercerai-berai +bercerai-cerai +bercetai-cetai +berciap-ciap +bercikun-cikun +bercinta-cintaan +bercita-cita +berciut-ciut +bercompang-camping +berconteng-conteng +bercoreng-coreng +bercoreng-moreng +bercuang-caing +bercuit-cuit +bercumbu-cumbu +bercumbu-cumbuan +bercura-bura +bercura-cura +berdada-dadaan +berdahulu-dahuluan +berdalam-dalam +berdalih-dalih +berdampung-dampung +berdebar-debar +berdecak-decak +berdecap-decap +berdecup-decup +berdecut-decut +berdedai-dedai +berdegap-degap +berdegar-degar +berdeham-deham +berdekah-dekah +berdekak-dekak +berdekap-dekapan +berdekat-dekat +berdelat-delat +berdembai-dembai +berdembun-dembun +berdempang-dempang +berdempet-dempet +berdencing-dencing +berdendam-dendaman +berdengkang-dengkang +berdengut-dengut +berdentang-dentang +berdentum-dentum +berdentung-dentung +berdenyar-denyar +berdenyut-denyut +berdepak-depak +berdepan-depan +berderai-derai +berderak-derak +berderam-deram +berderau-derau +berderik-derik +berdering-dering +berderung-derung +berderus-derus +berdesak-desakan +berdesik-desik +berdesing-desing +berdesus-desus +berdikit-dikit +berdingkit-dingkit +berdua-dua +berduri-duri +berduru-duru +berduyun-duyun +berebut-rebut +berebut-rebutan +beregang-regang +berek-berek +berembut-rembut +berempat-empat +berenak-enak +berencel-encel +bereng-bereng +berenggan-enggan +berenteng-renteng +beresa-esaan +beresah-resah +berfoya-foya +bergagah-gagahan +bergagap-gagap +bergagau-gagau +bergalur-galur +berganda-ganda +berganjur-ganjur +berganti-ganti +bergarah-garah +bergaruk-garuk +bergaya-gaya +bergegas-gegas +bergelang-gelang +bergelap-gelap +bergelas-gelasan +bergeleng-geleng +bergemal-gemal +bergembar-gembor +bergembut-gembut +bergepok-gepok +bergerek-gerek +bergesa-gesa +bergilir-gilir +bergolak-golak +bergolek-golek +bergolong-golong +bergores-gores +bergotong-royong +bergoyang-goyang +bergugus-gugus +bergulung-gulung +bergulut-gulut +bergumpal-gumpal +bergunduk-gunduk +bergunung-gunung +berhadap-hadapan +berhamun-hamun +berhandai-handai +berhanyut-hanyut +berhari-hari +berhati-hati +berhati-hatilah +berhektare-hektare +berhilau-hilau +berhormat-hormat +berhujan-hujan +berhura-hura +beri-beri +beri-memberi +beria-ia +beria-ria +beriak-riak +beriba-iba +beribu-ribu +berigi-rigi +berimpit-impit +berindap-indap +bering-bering +beringat-ingat +beringgit-ringgit +berintik-rintik +beriring-iring +beriring-iringan +berita-berita +berjabir-jabir +berjaga-jaga +berjagung-jagung +berjalan-jalan +berjalar-jalar +berjalin-jalin +berjalur-jalur +berjam-jam +berjari-jari +berjauh-jauhan +berjegal-jegalan +berjejal-jejal +berjela-jela +berjengkek-jengkek +berjenis-jenis +berjenjang-jenjang +berjilid-jilid +berjinak-jinak +berjingkat-jingkat +berjingkik-jingkik +berjingkrak-jingkrak +berjongkok-jongkok +berjubel-jubel +berjujut-jujutan +berjulai-julai +berjumbai-jumbai +berjumbul-jumbul +berjuntai-juntai +berjurai-jurai +berjurus-jurus +berjuta-juta +berka-li-kali +berkabu-kabu +berkaca-kaca +berkaing-kaing +berkait-kaitan +berkala-kala +berkali-kali +berkamit-kamit +berkanjar-kanjar +berkaok-kaok +berkarung-karung +berkasak-kusuk +berkasih-kasihan +berkata-kata +berkatak-katak +berkecai-kecai +berkecek-kecek +berkecil-kecil +berkecil-kecilan +berkedip-kedip +berkejang-kejang +berkejap-kejap +berkejar-kejaran +berkelar-kelar +berkelepai-kelepai +berkelip-kelip +berkelit-kelit +berkelok-kelok +berkelompok-kelompok +berkelun-kelun +berkembur-kembur +berkempul-kempul +berkena-kenaan +berkenal-kenalan +berkendur-kendur +berkeok-keok +berkepak-kepak +berkepal-kepal +berkeping-keping +berkepul-kepul +berkeras-kerasan +berkering-kering +berkeritik-keritik +berkeruit-keruit +berkerut-kerut +berketai-ketai +berketak-ketak +berketak-ketik +berketap-ketap +berketap-ketip +berketar-ketar +berketi-keti +berketil-ketil +berketuk-ketak +berketul-ketul +berkial-kial +berkian-kian +berkias-kias +berkias-kiasan +berkibar-kibar +berkilah-kilah +berkilap-kilap +berkilat-kilat +berkilau-kilauan +berkilo-kilo +berkimbang-kimbang +berkinja-kinja +berkipas-kipas +berkira-kira +berkirim-kiriman +berkisar-kisar +berkoak-koak +berkoar-koar +berkobar-kobar +berkobok-kobok +berkocak-kocak +berkodi-kodi +berkolek-kolek +berkomat-kamit +berkopah-kopah +berkoper-koper +berkotak-kotak +berkuat-kuat +berkuat-kuatan +berkumur-kumur +berkunang-kunang +berkunar-kunar +berkunjung-kunjungan +berkurik-kurik +berkurun-kurun +berkusau-kusau +berkusu-kusu +berkusut-kusut +berkuting-kuting +berkutu-kutuan +berlabun-labun +berlain-lainan +berlaju-laju +berlalai-lalai +berlama-lama +berlambai-lambai +berlambak-lambak +berlampang-lampang +berlanggar-langgar +berlapang-lapang +berlapis-lapis +berlapuk-lapuk +berlarah-larah +berlarat-larat +berlari-lari +berlari-larian +berlarih-larih +berlarik-larik +berlarut-larut +berlawak-lawak +berlayap-layapan +berlebih-lebih +berlebih-lebihan +berleha-leha +berlekas-lekas +berlekas-lekasan +berlekat-lekat +berlekuk-lekuk +berlempar-lemparan +berlena-lena +berlengah-lengah +berlenggak-lenggok +berlenggek-lenggek +berlenggok-lenggok +berleret-leret +berletih-letih +berliang-liuk +berlibat-libat +berligar-ligar +berliku-liku +berlikur-likur +berlimbak-limbak +berlimpah-limpah +berlimpap-limpap +berlimpit-limpit +berlinang-linang +berlindak-lindak +berlipat-lipat +berlomba-lomba +berlompok-lompok +berloncat-loncatan +berlopak-lopak +berlubang-lubang +berlusin-lusin +bermaaf-maafan +bermabuk-mabukan +bermacam-macam +bermain-main +bermalam-malam +bermalas-malas +bermalas-malasan +bermanik-manik +bermanis-manis +bermanja-manja +bermasak-masak +bermati-mati +bermegah-megah +bermemek-memek +bermenung-menung +bermesra-mesraan +bermewah-mewah +bermewah-mewahan +berminggu-minggu +berminta-minta +berminyak-minyak +bermuda-muda +bermudah-mudah +bermuka-muka +bermula-mula +bermuluk-muluk +bermulut-mulut +bernafsi-nafsi +bernaka-naka +bernala-nala +bernanti-nanti +berniat-niat +bernyala-nyala +berogak-ogak +beroleng-oleng +berolok-olok +beromong-omong +beroncet-roncet +beronggok-onggok +berorang-orang +beroyal-royal +berpada-pada +berpadu-padu +berpahit-pahit +berpair-pair +berpal-pal +berpalu-palu +berpalu-paluan +berpalun-palun +berpanas-panas +berpandai-pandai +berpandang-pandangan +berpangkat-pangkat +berpanjang-panjang +berpantun-pantun +berpasang-pasang +berpasang-pasangan +berpasuk-pasuk +berpayah-payah +berpeluh-peluh +berpeluk-pelukan +berpenat-penat +berpencar-pencar +berpendar-pendar +berpenggal-penggal +berperai-perai +berperang-perangan +berpesai-pesai +berpesta-pesta +berpesuk-pesuk +berpetak-petak +berpeti-peti +berpihak-pihak +berpijar-pijar +berpikir-pikir +berpikul-pikul +berpilih-pilih +berpilin-pilin +berpindah-pindah +berpintal-pintal +berpirau-pirau +berpisah-pisah +berpolah-polah +berpolok-polok +berpongah-pongah +berpontang-panting +berporah-porah +berpotong-potong +berpotong-potongan +berpuak-puak +berpual-pual +berpugak-pugak +berpuing-puing +berpukas-pukas +berpuluh-puluh +berpulun-pulun +berpuntal-puntal +berpura-pura +berpusar-pusar +berpusing-pusing +berpusu-pusu +berputar-putar +berrumpun-rumpun +bersaf-saf +bersahut-sahutan +bersakit-sakit +bersalah-salahan +bersalam-salaman +bersalin-salin +bersalip-salipan +bersama-sama +bersambar-sambaran +bersambut-sambutan +bersampan-sampan +bersantai-santai +bersapa-sapaan +bersarang-sarang +bersedan-sedan +bersedia-sedia +bersedu-sedu +bersejuk-sejuk +bersekat-sekat +berselang-selang +berselang-seli +berselang-seling +berselang-tenggang +berselit-selit +berseluk-beluk +bersembunyi-sembunyi +bersembunyi-sembunyian +bersembur-semburan +bersempit-sempit +bersenang-senang +bersenang-senangkan +bersenda-senda +bersendi-sendi +bersenggang-senggang +bersenggau-senggau +bersepah-sepah +bersepak-sepakan +bersepi-sepi +berserak-serak +berseri-seri +berseru-seru +bersesak-sesak +bersetai-setai +bersia-sia +bersiap-siap +bersiar-siar +bersih-bersih +bersikut-sikutan +bersilir-silir +bersimbur-simburan +bersinau-sinau +bersopan-sopan +bersorak-sorai +bersuap-suapan +bersudah-sudah +bersuka-suka +bersuka-sukaan +bersuku-suku +bersulang-sulang +bersumpah-sumpahan +bersungguh-sungguh +bersungut-sungut +bersunyi-sunyi +bersuruk-surukan +bersusah-susah +bersusuk-susuk +bersusuk-susukan +bersutan-sutan +bertabur-tabur +bertahan-tahan +bertahu-tahu +bertahun-tahun +bertajuk-tajuk +bertakik-takik +bertala-tala +bertalah-talah +bertali-tali +bertalu-talu +bertalun-talun +bertambah-tambah +bertanda-tandaan +bertangis-tangisan +bertangkil-tangkil +bertanya-tanya +bertarik-tarikan +bertatai-tatai +bertatap-tatapan +bertatih-tatih +bertawan-tawan +bertawar-tawaran +bertebu-tebu +bertebu-tebukan +berteguh-teguh +berteguh-teguhan +berteka-teki +bertelang-telang +bertelau-telau +bertele-tele +bertembuk-tembuk +bertempat-tempat +bertempuh-tempuh +bertenang-tenang +bertenggang-tenggangan +bertentu-tentu +bertepek-tepek +berterang-terang +berterang-terangan +berteriak-teriak +bertikam-tikaman +bertimbal-timbalan +bertimbun-timbun +bertimpa-timpa +bertimpas-timpas +bertingkah-tingkah +bertingkat-tingkat +bertinjau-tinjauan +bertiras-tiras +bertitar-titar +bertitik-titik +bertoboh-toboh +bertolak-tolak +bertolak-tolakan +bertolong-tolongan +bertonjol-tonjol +bertruk-truk +bertua-tua +bertua-tuaan +bertual-tual +bertubi-tubi +bertukar-tukar +bertukar-tukaran +bertukas-tukas +bertumpak-tumpak +bertumpang-tindih +bertumpuk-tumpuk +bertunda-tunda +bertunjuk-tunjukan +bertura-tura +berturut-turut +bertutur-tutur +beruas-ruas +berubah-ubah +berulang-alik +berulang-ulang +berumbai-rumbai +berundak-undak +berundan-undan +berundung-undung +berunggas-runggas +berunggun-unggun +berunggut-unggut +berungkur-ungkuran +beruntai-untai +beruntun-runtun +beruntung-untung +berunyai-unyai +berupa-rupa +berura-ura +beruris-uris +berurut-urutan +berwarna-warna +berwarna-warni +berwindu-windu +berwiru-wiru +beryang-yang +besar-besar +besar-besaran +betak-betak +beti-beti +betik-betik +betul-betul +biang-biang +biar-biar +biaya-biaya +bicu-bicu +bidadari-bidadari +bidang-bidang +bijak-bijaklah +biji-bijian +bila-bila +bilang-bilang +bincang-bincang +bincang-bincut +bingkah-bingkah +bini-binian +bintang-bintang +bintik-bintik +bio-oil +biri-biri +biru-biru +biru-hitam +biru-kuning +bisik-bisik +biti-biti +blak-blakan +blok-blok +bocah-bocah +bohong-bohong +bohong-bohongan +bola-bola +bolak-balik +bolang-baling +boleh-boleh +bom-bom +bomber-bomber +bonek-bonek +bongkar-bangkir +bongkar-membongkar +bongkar-pasang +boro-boro +bos-bos +bottom-up +box-to-box +boyo-boyo +buah-buahan +buang-buang +buang-buang air +buat-buatan +buaya-buaya +bubun-bubun +bugi-bugi +build-up +built-in +built-up +buka-buka +buka-bukaan +buka-tutup +bukan-bukan +bukti-bukti +buku-buku +bulan-bulan +bulan-bulanan +bulang-baling +bulang-bulang +bulat-bulat +buli-buli +bulu-bulu +buluh-buluh +bulus-bulus +bunga-bunga +bunga-bungaan +bunuh-membunuh +bunyi-bunyian +bupati-bupati +bupati-wakil +buru-buru +burung-burung +burung-burungan +bus-bus +business-to-business +busur-busur +butir-butir +by-pass +bye-bye +cabang-cabang +cabik-cabik +cabik-mencabik +cabup-cawabup +caci-maki +cagub-cawagub +caing-caing +cakar-mencakar +cakup-mencakup +calak-calak +calar-balar +caleg-caleg +calo-calo +calon-calon +campang-camping +campur-campur +capres-cawapres +cara-cara +cari-cari +cari-carian +carut-marut +catch-up +cawali-cawawali +cawe-cawe +cawi-cawi +cebar-cebur +celah-celah +celam-celum +celangak-celinguk +celas-celus +celedang-celedok +celengkak-celengkok +celingak-celinguk +celung-celung +cemas-cemas +cenal-cenil +cengar-cengir +cengir-cengir +cengis-cengis +cengking-mengking +centang-perenang +cepat-cepat +ceplas-ceplos +cerai-berai +cerita-cerita +ceruk-menceruk +ceruk-meruk +cetak-biru +cetak-mencetak +cetar-ceter +check-in +check-ins +check-up +chit-chat +choki-choki +cingak-cinguk +cipika-cipiki +ciri-ciri +ciri-cirinya +cirit-birit +cita-cita +cita-citaku +close-up +closed-circuit +coba-coba +cobak-cabik +cobar-cabir +cola-cala +colang-caling +comat-comot +comot-comot +compang-camping +computer-aided +computer-generated +condong-mondong +congak-cangit +conggah-canggih +congkah-cangkih +congkah-mangkih +copak-capik +copy-paste +corak-carik +corat-coret +coreng-moreng +coret-coret +crat-crit +cross-border +cross-dressing +crypto-ransomware +cuang-caing +cublak-cublak +cubung-cubung +culik-culik +cuma-cuma +cumi-cumi +cungap-cangip +cupu-cupu +dabu-dabu +daerah-daerah +dag-dag +dag-dig-dug +daging-dagingan +dahulu-mendahului +dalam-dalam +dali-dali +dam-dam +danau-danau +dansa-dansi +dapil-dapil +dapur-dapur +dari-dari +daru-daru +dasar-dasar +datang-datang +datang-mendatangi +daun-daun +daun-daunan +dawai-dawai +dayang-dayang +dayung-mayung +debak-debuk +debu-debu +deca-core +decision-making +deep-lying +deg-degan +degap-degap +dekak-dekak +dekat-dekat +dengan - +dengar-dengaran +dengking-mendengking +departemen-departemen +depo-depo +deputi-deputi +desa-desa +desa-kota +desas-desus +detik-detik +dewa-dewa +dewa-dewi +dewan-dewan +dewi-dewi +dial-up +diam-diam +dibayang-bayangi +dibuat-buat +diiming-imingi +dilebih-lebihkan +dimata-matai +dinas-dinas +dinul-Islam +diobok-obok +diolok-olok +direksi-direksi +direktorat-direktorat +dirjen-dirjen +dirut-dirut +ditunggu-tunggu +divisi-divisi +do-it-yourself +doa-doa +dog-dog +doggy-style +dokok-dokok +dolak-dalik +dor-doran +dorong-mendorong +dosa-dosa +dress-up +drive-in +dua-dua +dua-duaan +dua-duanya +dubes-dubes +duduk-duduk +dugaan-dugaan +dulang-dulang +duri-duri +duta-duta +dwi-kewarganegaraan +ecek-ecek +eco-friendly +eco-park +edan-edanan +editor-editor +editor-in-chief +efek-efek +ekonomi-ekonomi +eksekutif-legislatif +ekspor-impor +elang-elang +elemen-elemen +emak-emak +embuh-embuhan +empat-empat +empek-empek +empet-empetan +empok-empok +empot-empotan +enak-enak +encal-encal +end-to-end +end-user +endap-endap +endut-endut +endut-endutan +engah-engah +engap-engap +enggan-enggan +engkah-engkah +engket-engket +entah-berentah +enten-enten +entry-level +equity-linked +erang-erot +erat-erat +erek-erek +ereng-ereng +erong-erong +esek-esek +ex-officio +exchange-traded +exercise-induced +extra-time +face-down +face-to-face +fair-play +fakta-fakta +faktor-faktor +fakultas-fakultas +fase-fase +fast-food +feed-in +fifty-fifty +file-file +first-leg +first-team +fitur-fitur +fitur-fiturnya +fixed-income +flip-flop +flip-plop +fly-in +follow-up +foto-foto +foya-foya +fraksi-fraksi +free-to-play +front-end +fungsi-fungsi +gaba-gaba +gabai-gabai +gada-gada +gading-gading +gadis-gadis +gado-gado +gail-gail +gajah-gajah +gajah-gajahan +gala-gala +galeri-galeri +gali-gali +gali-galian +galing-galing +galu-galu +gamak-gamak +gambar-gambar +gambar-menggambar +gamit-gamitan +gampang-gampangan +gana-gini +ganal-ganal +ganda-berganda +ganjal-mengganjal +ganjil-genap +ganteng-ganteng +gantung-gantung +gapah-gopoh +gara-gara +garah-garah +garis-garis +gasak-gasakan +gatal-gatal +gaun-gaun +gawar-gawar +gaya-gayanya +gayang-gayang +ge-er +gebyah-uyah +gebyar-gebyar +gedana-gedini +gedebak-gedebuk +gedebar-gedebur +gedung-gedung +gelang-gelang +gelap-gelapan +gelar-gelar +gelas-gelas +gelembung-gelembungan +geleng-geleng +geli-geli +geliang-geliut +geliat-geliut +gembar-gembor +gembrang-gembreng +gempul-gempul +gempur-menggempur +gendang-gendang +gengsi-gengsian +genjang-genjot +genjot-genjotan +genjrang-genjreng +genome-wide +geo-politik +gerabak-gerubuk +gerak-gerik +gerak-geriknya +gerakan-gerakan +gerbas-gerbus +gereja-gereja +gereng-gereng +geriak-geriuk +gerit-gerit +gerot-gerot +geruh-gerah +getak-getuk +getem-getem +geti-geti +gial-gial +gial-giul +gila-gila +gila-gilaan +gilang-gemilang +gilap-gemilap +gili-gili +giling-giling +gilir-bergilir +ginang-ginang +girap-girap +girik-girik +giring-giring +go-kart +go-to-market +goak-goak +goal-line +gol-gol +golak-galik +gondas-gandes +gonjang-ganjing +gonjlang-ganjling +gonta-ganti +gontok-gontokan +gorap-gorap +gorong-gorong +gotong-royong +gresek-gresek +gua-gua +gual-gail +gubernur-gubernur +gudu-gudu +gula-gula +gulang-gulang +gulung-menggulung +guna-ganah +guna-guna +gundala-gundala +guntang-guntang +gunung-ganang +gunung-gemunung +gunung-gunungan +guru-guru +habis-habis +habis-habisan +hak-hak +hak-hal +hakim-hakim +hal-hal +halai-balai +half-time +hama-hama +hampir-hampir +hancur-hancuran +hancur-menghancurkan +hands-free +hands-on +hang-out +hantu-hantu +happy-happy +harap-harap +harap-harap cemas +harap-harapan +hard-disk +harga-harga +hari-hari +harimau-harimau +harum-haruman +hasil-hasil +hasta-wara +hat-trick +hati-hati +hati-hatilah +head-mounted +head-to-head +head-up +heads-up +heavy-duty +hebat-hebatan +hewan-hewan +hexa-core +hidup-hidup +hidup-mati +hila-hila +hilang-hilang +hina-menghinakan +hip-hop +hiru-biru +hiru-hara +hiruk-pikuk +hitam-putih +hitung-hitung +hitung-hitungan +hormat-menghormati +hot-swappable +hotel-hotel +how-to +hubar-habir +hubaya-hubaya +hukum-red +hukuman-hukuman +hula-hoop +hula-hula +hulu-hilir +humas-humas +hura-hura +huru-hara +ibar-ibar +ibu-anak +ibu-ibu +icak-icak +icip-icip +idam-idam +ide-ide +igau-igauan +ikan-ikan +ikut-ikut +ikut-ikutan +ilam-ilam +ilat-ilatan +ilmu-ilmu +imbang-imbangan +iming-iming +imut-imut +inang-inang +inca-binca +incang-incut +industri-industri +ingar-bingar +ingar-ingar +ingat-ingat +ingat-ingatan +ingau-ingauan +inggang-inggung +injak-injak +input-output +instansi-instansi +instant-on +instrumen-instrumen +inter-governmental +ira-ira +irah-irahan +iras-iras +iring-iringan +iris-irisan +isak-isak +isat-bb +iseng-iseng +istana-istana +istri-istri +isu-isu +iya-iya +jabatan-jabatan +jadi-jadian +jagoan-jagoan +jaja-jajaan +jaksa-jaksa +jala-jala +jalan-jalan +jali-jali +jalin-berjalin +jalin-menjalin +jam-jam +jamah-jamahan +jambak-jambakan +jambu-jambu +jampi-jampi +janda-janda +jangan-jangan +janji-janji +jarang-jarang +jari-jari +jaring-jaring +jarum-jarum +jasa-jasa +jatuh-bangun +jauh-dekat +jauh-jauh +jawi-jawi +jebar-jebur +jebat-jebatan +jegal-jegalan +jejak-jejak +jelang-menjelang +jelas-jelas +jelur-jelir +jembatan-jembatan +jenazah-jenazah +jendal-jendul +jenderal-jenderal +jenggar-jenggur +jenis-jenis +jenis-jenisnya +jentik-jentik +jerah-jerih +jinak-jinak +jiwa-jiwa +joli-joli +jolong-jolong +jongkang-jangking +jongkar-jangkir +jongkat-jangkit +jor-joran +jotos-jotosan +juak-juak +jual-beli +juang-juang !!? lenjuang +julo-julo +julung-julung +julur-julur +jumbai-jumbai +jungkang-jungkit +jungkat-jungkit +jurai-jurai +kabang-kabang +kabar-kabari +kabir-kabiran +kabruk-kabrukan +kabu-kabu +kabupaten-kabupaten +kabupaten-kota +kaca-kaca +kacang-kacang +kacang-kacangan +kacau-balau +kadang-kadang +kader-kader +kades-kades +kadis-kadis +kail-kail +kain-kain +kait-kait +kakak-adik +kakak-beradik +kakak-kakak +kakek-kakek +kakek-nenek +kaki-kaki +kala-kala +kalau-kalau +kaleng-kalengan +kali-kalian +kalimat-kalimat +kalung-kalung +kalut-malut +kambing-kambing +kamit-kamit +kampung-kampung +kampus-kampus +kanak-kanak +kanak-kanan +kanan-kanak +kanan-kiri +kangen-kangenan +kanwil-kanwil +kapa-kapa +kapal-kapal +kapan-kapan +kapolda-kapolda +kapolres-kapolres +kapolsek-kapolsek +kapu-kapu +karang-karangan +karang-mengarang +kareseh-peseh +karut-marut +karya-karya +kasak-kusuk +kasus-kasus +kata-kata +katang-katang +kava-kava +kawa-kawa +kawan-kawan +kawin-cerai +kawin-mawin +kayu-kayu +kayu-kayuan +ke-Allah-an +keabu-abuan +kearab-araban +keasyik-asyikan +kebarat-baratan +kebasah-basahan +kebat-kebit +kebata-bataan +kebayi-bayian +kebelanda-belandaan +keberlarut-larutan +kebesar-hatian +kebiasaan-kebiasaan +kebijakan-kebijakan +kebiru-biruan +kebudak-budakan +kebun-kebun +kebut-kebutan +kecamatan-kecamatan +kecentang-perenangan +kecil-kecil +kecil-kecilan +kecil-mengecil +kecokelat-cokelatan +kecomak-kecimik +kecuh-kecah +kedek-kedek +kedekak-kedekik +kedesa-desaan +kedubes-kedubes +kedutaan-kedutaan +keempat-empatnya +kegadis-gadisan +kegelap-gelapan +kegiatan-kegiatan +kegila-gilaan +kegirang-girangan +kehati-hatian +keheran-heranan +kehijau-hijauan +kehitam-hitaman +keinggris-inggrisan +kejaga-jagaan +kejahatan-kejahatan +kejang-kejang +kejar-kejar +kejar-kejaran +kejar-mengejar +kejingga-jinggaan +kejut-kejut +kejutan-kejutan +kekabur-kaburan +kekanak-kanakan +kekoboi-koboian +kekota-kotaan +kekuasaan-kekuasaan +kekuning-kuningan +kelak-kelik +kelak-keluk +kelaki-lakian +kelang-kelok +kelap-kelip +kelasah-kelusuh +kelek-kelek +kelek-kelekan +kelemak-kelemek +kelik-kelik +kelip-kelip +kelompok-kelompok +kelontang-kelantung +keluar-masuk +kelurahan-kelurahan +kelusuh-kelasah +kelut-melut +kemak-kemik +kemalu-maluan +kemana-mana +kemanja-manjaan +kemarah-marahan +kemasam-masaman +kemati-matian +kembang-kembang +kementerian-kementerian +kemerah-merahan +kempang-kempis +kempas-kempis +kemuda-mudaan +kena-mengena +kenal-mengenal +kenang-kenangan +kencang-kencung +kencing-mengencingi +kencrang-kencring +kendang-kendang +kendang-kendangan +keningrat-ningratan +kentung-kentung +kenyat-kenyit +kepala-kepala +kepala-kepalaan +kepandir-pandiran +kepang-kepot +keperak-perakan +kepetah-lidahan +kepilu-piluan +keping-keping +kepucat-pucatan +kepuh-kepuh +kepura-puraan +keputih-putihan +kerah-kerahan +kerancak-rancakan +kerang-kerangan +kerang-keroh +kerang-kerot +kerang-keruk +kerang-kerung +kerap-kerap +keras-mengerasi +kercap-kercip +kercap-kercup +keriang-keriut +kering-kering air +kerja-kerja +kernyat-kernyut +kerobak-kerabit +kerobak-kerobek +kerobak-kerobik +kerobat-kerabit +kerong-kerong +keropas-kerapis +kertak-kertuk +kertap-kertap +keruntang-pungkang +kesalahan-kesalahan +kesap-kesip +kesemena-menaan +kesenak-senakan +kesewenang-wenangan +kesia-siaan +kesik-kesik +kesipu-sipuan +kesu-kesi +kesuh-kesih +kesuk-kesik +ketakar-keteker +ketakutan-ketakutan +ketap-ketap +ketap-ketip +ketar-ketir +ketentuan-ketentuan +ketergesa-gesaan +keti-keti +ketidur-tiduran +ketiga-tiganya +ketir-ketir +ketua-ketua +ketua-tuaan +ketuan-tuanan +keungu-unguan +kewangi-wangian +ki-ka +kia-kia +kiai-kiai +kiak-kiak +kial-kial +kiang-kiut +kiat-kiat +kibang-kibut +kicang-kecoh +kicang-kicu +kick-off +kida-kida +kijang-kijang +kilau-mengilau +kili-kili +kilik-kilik +kincir-kincir +kios-kios +kira-kira +kira-kiraan +kiri-kanan +kirim-berkirim +kisah-kisah +kisi-kisi +kitab-kitab +kitang-kitang +kiu-kiu +klaim-klaim +klik-klikan +klip-klip +klub-klub +kluntang-klantung +knock-knock +knock-on +knock-out +ko-as +ko-pilot +koak-koak +koboi-koboian +kocah-kacih +kocar-kacir +kodam-kodam +kode-kode +kodim-kodim +kodok-kodok +kolang-kaling +kole-kole +koleh-koleh +kolong-kolong +koma-koma +komat-kamit +komisaris-komisaris +komisi-komisi +komite-komite +komoditas-komoditas +kongko-kongko +konsulat-konsulat +konsultan-konsultan +kontal-kantil +kontang-kanting +kontra-terorisme +kontrak-kontrak +konvensi-konvensi +kopat-kapit +koperasi-koperasi +kopi-kopi +koran-koran +koreng-koreng +kos-kosan +kosak-kasik +kota-kota +kota-wakil +kotak-katik +kotak-kotak +koyak-koyak +kuas-kuas +kuat-kuat +kubu-kubuan +kucar-kacir +kucing-kucing +kucing-kucingan +kuda-kuda +kuda-kudaan +kudap-kudap +kue-kue +kulah-kulah +kulak-kulak tangan +kulik-kulik +kulum-kulum +kumat-kamit +kumpul-kumpul +kunang-kunang +kunar-kunar +kung-fu +kuning-hitam +kupat-kapit +kupu-kupu +kura-kura +kurang-kurang +kusat-mesat +kutat-kutet +kuti-kuti +kuwung-kuwung +kyai-kyai +laba-laba +labi-labi +labu-labu +laga-laga +lagi-lagi +lagu-lagu +laguh-lagah +lain-lain +laki-laki +lalu-lalang +lalu-lintas +lama-kelamaan +lama-lama +lamat-lamat +lambat-lambat +lampion-lampion +lampu-lampu +lancang-lancang +lancar-lancar +langak-longok +langgar-melanggar +langit-langit +langkah-langka +langkah-langkah +lanja-lanjaan +lapas-lapas +lapat-lapat +laporan-laporan +laptop-tablet +large-scale +lari-lari +lari-larian +laskar-laskar +lauk-pauk +laun-laun +laut-timur +lawah-lawah +lawak-lawak +lawan-lawan +lawi-lawi +layang-layang +layu-layuan +lebih-lebih +lecet-lecet +legak-legok +legum-legum +legup-legup +leha-leha +lekak-lekuk +lekap-lekup +lekas-lekas +lekat-lekat +lekuh-lekih +lekum-lekum +lekup-lekap +lembaga-lembaga +lempar-lemparan +lenggak-lenggok +lenggok-lenggok +lenggut-lenggut +lengket-lengket +lentam-lentum +lentang-lentok +lentang-lentung +lepa-lepa +lerang-lerang +lereng-lereng +lese-majeste +letah-letai +lete-lete +letuk-letuk +letum-letum +letup-letup +leyeh-leyeh +liang-liuk +liang-liut +liar-liar +liat-liut +lidah-lidah +life-toxins +liga-liga +light-emitting +lika-liku +lil-alamin +lilin-lilin +line-up +lintas-selat +lipat-melipat +liquid-cooled +lithium-ion +lithium-polymer +liuk-liuk +liung-liung +lobi-lobi +lock-up +locked-in +lokasi-lokasi +long-term +longak-longok +lontang-lanting +lontang-lantung +lopak-lapik +lopak-lopak +low-cost +low-density +low-end +low-light +low-multi +low-pass +lucu-lucu +luka-luka +lukisan-lukisan +lumba-lumba +lumi-lumi +luntang-lantung +lupa-lupa +lupa-lupa ingat +lupa-lupaan +lurah-camat +maaf-memaafkan +mabuk-mabukan +mabul-mabul +macam-macam +macan-macanan +machine-to-machine +mafia-mafia +mahasiswa-mahasiswi +mahi-mahi +main-main +main-mainan +main-mainlah +majelis-majelis +maju-mundur +makam-makam +makan-makan +makan-makanan +makanan-red +make-up +maki-maki +maki-makian +mal-mal +malai-malai +malam-malam +malar-malar +malas-malasan +mali-mali +malu-malu +mama-mama +man-in-the-middle +mana-mana +manajer-manajer +manik-manik +manis-manis +manis-manisan +marah-marah +mark-up +mas-mas +masa-masa +masak-masak +masalah-masalah +mash-up +masing-masing +masjid-masjid +masuk-keluar +mat-matan +mata-mata +match-fixing +mati-mati +mati-matian +maya-maya +mayat-mayat +mayday-mayday +media-media +mega-bintang +mega-tsunami +megal-megol +megap-megap +meger-meger +megrek-megrek +melak-melak +melambai-lambai +melambai-lambaikan +melambat-lambatkan +melaun-laun +melawak-lawak +melayang-layang +melayap-layap +melayap-layapkan +melebih-lebihi +melebih-lebihkan +melejang-lejangkan +melek-melekan +meleleh-leleh +melengah-lengah +melihat-lihat +melimpah-limpah +melincah-lincah +meliuk-liuk +melolong-lolong +melompat-lompat +meloncat-loncat +melonco-lonco +melongak-longok +melonjak-lonjak +memacak-macak +memada-madai +memadan-madan +memaki-maki +memaksa-maksa +memanas-manasi +memancit-mancitkan +memandai-mandai +memanggil-manggil +memanis-manis +memanjut-manjut +memantas-mantas diri +memasak-masak +memata-matai +mematah-matah +mematuk-matuk +mematut-matut +memau-mau +memayah-mayahkan (diri) +membaca-baca +membacah-bacah +membagi-bagikan +membalik-balik +membangkit-bangkit +membarut-barut +membawa-bawa +membayang-bayangi +membayang-bayangkan +membeda-bedakan +membelai-belai +membeli-beli +membelit-belitkan +membelu-belai +membenar-benar +membenar-benari +memberai-beraikan +membesar-besar +membesar-besarkan +membikin-bikin +membilah-bilah +membolak-balikkan +membongkar-bangkir +membongkar-bongkar +membuang-buang +membuat-buat +membulan-bulani +membunga-bungai +membungkuk-bungkuk +memburu-buru +memburu-burukan +memburuk-burukkan +memelintir-melintir +memencak-mencak +memencar-mencar +memercik-mercik +memetak-metak +memetang-metangkan +memetir-metir +memijar-mijar +memikir-mikir +memikir-mikirkan +memilih-milih +memilin-milin +meminang-minang +meminta-minta +memisah-misahkan +memontang-mantingkan +memorak-perandakan +memorak-porandakan +memotong-motong +memperamat-amat +memperamat-amatkan +memperbagai-bagaikan +memperganda-gandakan +memperganduh-ganduhkan +memperimpit-impitkan +memperkuda-kudakan +memperlengah-lengah +memperlengah-lengahkan +mempermacam-macamkan +memperolok-olok +memperolok-olokkan +mempersama-samakan +mempertubi-tubi +mempertubi-tubikan +memperturut-turutkan +memuja-muja +memukang-mukang +memulun-mulun +memundi-mundi +memundi-mundikan +memutar-mutar +memuyu-muyu +men-tweet +menagak-nagak +menakut-nakuti +menang-kalah +menanjur-nanjur +menanti-nanti +menari-nari +mencabik-cabik +mencabik-cabikkan +mencacah-cacah +mencaing-caing +mencak-mencak +mencakup-cakup +mencapak-capak +mencari-cari +mencarik-carik +mencarik-carikkan +mencarut-carut +mencengis-cengis +mencepak-cepak +mencepuk-cepuk +mencerai-beraikan +mencetai-cetai +menciak-ciak +menciap-ciap +menciar-ciar +mencita-citakan +mencium-cium +menciut-ciut +mencla-mencle +mencoang-coang +mencoba-coba +mencocok-cocok +mencolek-colek +menconteng-conteng +mencubit-cubit +mencucuh-cucuh +mencucuh-cucuhkan +mencuri-curi +mendecap-decap +mendegam-degam +mendengar-dengar +mendengking-dengking +mendengus-dengus +mendengut-dengut +menderai-deraikan +menderak-derakkan +menderau-derau +menderu-deru +mendesas-desuskan +mendesus-desus +mendetap-detap +mendewa-dewakan +mendudu-dudu +menduga-duga +menebu-nebu +menegur-neguri +menepak-nepak +menepak-nepakkan +mengabung-ngabung +mengaci-acikan +mengacu-acu +mengada-ada +mengada-ngada +mengadang-adangi +mengaduk-aduk +mengagak-agak +mengagak-agihkan +mengagut-agut +mengais-ngais +mengalang-alangi +mengali-ali +mengalur-alur +mengamang-amang +mengamat-amati +mengambai-ambaikan +mengambang-ambang +mengambung-ambung +mengambung-ambungkan +mengamit-ngamitkan +mengancai-ancaikan +mengancak-ancak +mengancar-ancar +mengangan-angan +mengangan-angankan +mengangguk-angguk +menganggut-anggut +mengangin-anginkan +mengangkat-angkat +menganjung-anjung +menganjung-anjungkan +mengap-mengap +mengapa-apai +mengapi-apikan +mengarah-arahi +mengarang-ngarang +mengata-ngatai +mengatup-ngatupkan +mengaum-aum +mengaum-aumkan +mengejan-ejan +mengejar-ngejar +mengejut-ngejuti +mengelai-ngelai +mengelepik-ngelepik +mengelip-ngelip +mengelu-elukan +mengelus-elus +mengembut-embut +mengempas-empaskan +mengenap-enapkan +mengendap-endap +mengenjak-enjak +mengentak-entak +mengentak-entakkan +mengepak-ngepak +mengepak-ngepakkan +mengepal-ngepalkan +mengerjap-ngerjap +mengerling-ngerling +mengertak-ngertakkan +mengesot-esot +menggaba-gabai +menggali-gali +menggalur-galur +menggamak-gamak +menggamit-gamitkan +menggapai-gapai +menggapai-gapaikan +menggaruk-garuk +menggebu-gebu +menggebyah-uyah +menggeleng-gelengkan +menggelepar-gelepar +menggelepar-geleparkan +menggeliang-geliutkan +menggelinding-gelinding +menggemak-gemak +menggembar-gemborkan +menggerak-gerakkan +menggerecak-gerecak +menggesa-gesakan +menggili-gili +menggodot-godot +menggolak-galikkan +menggorek-gorek +menggoreng-goreng +menggosok-gosok +menggoyang-goyangkan +mengguit-guit +menghalai-balaikan +menghalang-halangi +menghambur-hamburkan +menghinap-hinap +menghitam-memutihkan +menghitung-hitung +menghubung-hubungkan +menghujan-hujankan +mengiang-ngiang +mengibar-ngibarkan +mengibas-ngibas +mengibas-ngibaskan +mengidam-idamkan +mengilah-ngilahkan +mengilai-ilai +mengilat-ngilatkan +mengilik-ngilik +mengimak-imak +mengimbak-imbak +mengiming-iming +mengincrit-incrit +mengingat-ingat +menginjak-injak +mengipas-ngipas +mengira-ngira +mengira-ngirakan +mengiras-iras +mengiras-irasi +mengiris-iris +mengitar-ngitar +mengitik-ngitik +mengodol-odol +mengogok-ogok +mengolak-alik +mengolak-alikkan +mengolang-aling +mengolang-alingkan +mengoleng-oleng +mengolok-olok +mengombang-ambing +mengombang-ambingkan +mengongkang-ongkang +mengongkok-ongkok +mengonyah-anyih +mengopak-apik +mengorak-arik +mengorat-oret +mengorek-ngorek +mengoret-oret +mengorok-orok +mengotak-atik +mengotak-ngatikkan +mengotak-ngotakkan +mengoyak-ngoyak +mengoyak-ngoyakkan +mengoyak-oyak +menguar-nguarkan +menguar-uarkan +mengubah-ubah +mengubek-ubek +menguber-uber +mengubit-ubit +mengubrak-abrik +mengucar-ngacirkan +mengucek-ngucek +mengucek-ucek +menguik-uik +menguis-uis +mengulang-ulang +mengulas-ulas +mengulit-ulit +mengulum-ngulum +mengulur-ulur +menguman-uman +mengumbang-ambingkan +mengumpak-umpak +mengungkat-ungkat +mengungkit-ungkit +mengupa-upa +mengurik-urik +mengusil-usil +mengusil-usilkan +mengutak-atik +mengutak-ngatikkan +mengutik-ngutik +mengutik-utik +menika-nika +menimang-nimang +menimbang-nimbang +menimbun-nimbun +menimpang-nimpangkan +meningkat-ningkat +meniru-niru +menit-menit +menitar-nitarkan +meniup-niup +menjadi-jadi +menjadi-jadikan +menjedot-jedotkan +menjelek-jelekkan +menjengek-jengek +menjengit-jengit +menjerit-jerit +menjilat-jilat +menjungkat-jungkit +menko-menko +menlu-menlu +menonjol-nonjolkan +mentah-mentah +mentang-mentang +menteri-menteri +mentul-mentul +menuding-nuding +menumpah-numpahkan +menunda-nunda +menunduk-nunduk +menusuk-nusuk +menyala-nyala +menyama-nyama +menyama-nyamai +menyambar-nyambar +menyangkut-nyangkutkan +menyanjung-nyanjung +menyanjung-nyanjungkan +menyapu-nyapu +menyarat-nyarat +menyayat-nyayat +menyedang-nyedang +menyedang-nyedangkan +menyelang-nyelangkan +menyelang-nyeling +menyelang-nyelingkan +menyenak-nyenak +menyendi-nyendi +menyentak-nyentak +menyentuh-nyentuh +menyepak-nyepakkan +menyerak-nyerakkan +menyeret-nyeret +menyeru-nyerukan +menyetel-nyetel +menyia-nyiakan +menyibak-nyibak +menyobek-nyobek +menyorong-nyorongkan +menyungguh-nyungguhi +menyuruk-nyuruk +meraba-raba +merah-hitam +merah-merah +merambang-rambang +merangkak-rangkak +merasa-rasai +merata-ratakan +meraung-raung +meraung-raungkan +merayau-rayau +merayu-rayu +mercak-mercik +merek-merek +mereka-mereka +mereka-reka +merelap-relap +merem-merem +meremah-remah +meremas-remas +meremeh-temehkan +merempah-rempah +merempah-rempahi +merengek-rengek +merengeng-rengeng +merenik-renik +merenta-renta +merenyai-renyai +meresek-resek +merintang-rintang +merintik-rintik +merobek-robek +meronta-ronta +meruap-ruap +merubu-rubu +merungus-rungus +merungut-rungut +meta-analysis +metode-metode +mewanti-wanti +mewarna-warnikan +meyakin-yakini +mid-range +mid-size +miju-miju +mikro-kecil +mimpi-mimpi +minggu-minggu +minta-minta +minuman-minuman +mixed-use +mobil-mobil +mobile-first +mobile-friendly +moga-moga +mola-mola +momen-momen +mondar-mandir +monyet-monyet +morak-marik +morat-marit +move-on +muda-muda +muda-mudi +mudah-mudahan +muka-muka +muka-muka (dengan -) +mula-mula +multiple-output +muluk-muluk +mulut-mulutan +mumi-mumi +mundur-mundur +muntah-muntah +murid-muridnya +musda-musda +museum-museum +muslim-muslimah +musuh-musuh +musuh-musuhnya +nabi-nabi +nada-nadanya +naga-naga +naga-naganya +naik-naik +naik-turun +nakal-nakalan +nama-nama +nanti-nantian +nanya-nanya +nasi-nasi +nasib-nasiban +near-field +negara-negara +negera-negara +negeri-negeri +negeri-red +neka-neka +nekat-nekat +neko-neko +nenek-nenek +neo-liberalisme +next-gen +next-generation +ngeang-ngeang +ngeri-ngeri +nggak-nggak +ngobrol-ngobrol +ngumpul-ngumpul +nilai-nilai +nine-dash +nipa-nipa +nong-nong +norma-norma +novel-novel +nyai-nyai +nyolong-nyolong +nyut-nyutan +ob-gyn +obat-obat +obat-obatan +objek-objek +obok-obok +obrak-abrik +octa-core +odong-odong +oedipus-kompleks +off-road +ogah-agih +ogah-ogah +ogah-ogahan +ogak-agik +ogak-ogak +ogoh-ogoh +olak-alik +olak-olak +olang-aling +olang-alingan +ole-ole +oleh-oleh +olok-olok +olok-olokan +olong-olong +om-om +ombang-ambing +omni-channel +on-board +on-demand +on-fire +on-line +on-off +on-premises +on-roll +on-screen +on-the-go +onde-onde +ondel-ondel +ondos-ondos +one-click +one-to-one +one-touch +one-two +oneng-oneng +ongkang-ongkang +ongol-ongol +online-to-offline +ontran-ontran +onyah-anyih +onyak-anyik +opak-apik +opsi-opsi +opt-in +orak-arik +orang-aring +orang-orang +orang-orangan +orat-oret +organisasi-organisasi +ormas-ormas +orok-orok +orong-orong +oseng-oseng +otak-atik +otak-otak +otak-otakan +over-heating +over-the-air +over-the-top +pa-pa +pabrik-pabrik +padi-padian +pagi-pagi +pagi-sore +pajak-pajak +paket-paket +palas-palas +palato-alveolar +paling-paling +palu-arit +palu-memalu +panas-dingin +panas-panas +pandai-pandai +pandang-memandang +panel-panel +pangeran-pangeran +panggung-panggung +pangkalan-pangkalan +panja-panja +panji-panji +pansus-pansus +pantai-pantai +pao-pao +para-para +parang-parang +parpol-parpol +partai-partai +paru-paru +pas-pasan +pasal-pasal +pasang-memasang +pasang-surut +pasar-pasar +pasu-pasu +paus-paus +paut-memaut +pay-per-click +paya-paya +pecah-pecah +pecat-pecatan +peer-to-peer +pejabat-pejabat +pekak-pekak +pekik-pekuk +pelabuhan-pelabuhan +pelacur-pelacur +pelajar-pelajar +pelan-pelan +pelangi-pelangi +pem-bully +pemain-pemain +pemata-mataan +pemda-pemda +pemeluk-pemeluknya +pemerintah-pemerintah +pemerintah-red +pemerintah-swasta +pemetang-metangan +pemilu-pemilu +pemimpin-pemimpin +peminta-minta +pemuda-pemuda +pemuda-pemudi +penanggung-jawab +pengali-ali +pengaturan-pengaturan +penggembar-gemboran +pengorak-arik +pengotak-ngotakan +pengundang-undang +pengusaha-pengusaha +pentung-pentungan +penyakit-penyakit +perak-perak +perang-perangan +peras-perus +peraturan-peraturan +perda-perda +perempat-final +perempuan-perempuan +pergi-pergi +pergi-pulang +perintang-rintang +perkereta-apian +perlahan-lahan +perlip-perlipan +permen-permen +pernak-pernik +pernik-pernik +pertama-tama +pertandingan-pertandingan +pertimbangan-pertimbangan +perudang-undangan +perundang-undangan +perundangan-undangan +perusahaan-perusahaan +perusahaan-perusahan +perwakilan-perwakilan +pesan-pesan +pesawat-pesawat +peta-jalan +petang-petang +petantang-petenteng +petatang-peteteng +pete-pete +piala-piala +piat-piut +pick-up +picture-in-picture +pihak-pihak +pijak-pijak +pijar-pijar +pijat-pijat +pikir-pikir +pil-pil +pilah-pilih +pilih-pilih +pilihan-pilihan +pilin-memilin +pilkada-pilkada +pina-pina +pindah-pindah +ping-pong +pinjam-meminjam +pintar-pintarlah +pisang-pisang +pistol-pistolan +piting-memiting +planet-planet +play-off +plin-plan +plintat-plintut +plonga-plongo +plug-in +plus-minus +plus-plus +poco-poco +pohon-pohonan +poin-poin +point-of-sale +point-of-sales +pokemon-pokemon +pokja-pokja +pokok-pokok +pokrol-pokrolan +polang-paling +polda-polda +poleng-poleng +polong-polongan +polres-polres +polsek-polsek +polwan-polwan +poma-poma +pondok-pondok +ponpes-ponpes +pontang-panting +pop-up +porak-parik +porak-peranda +porak-poranda +pos-pos +posko-posko +potong-memotong +praktek-praktek +praktik-praktik +produk-produk +program-program +promosi-degradasi +provinsi-provinsi +proyek-proyek +puing-puing +puisi-puisi +puji-pujian +pukang-pukang +pukul-memukul +pulang-pergi +pulau-pulai +pulau-pulau +pull-up +pulut-pulut +pundi-pundi +pungak-pinguk +punggung-memunggung +pura-pura +puruk-parak +pusar-pusar +pusat-pusat +push-to-talk +push-up +push-ups +pusing-pusing +puskesmas-puskesmas +putar-putar +putera-puteri +putih-hitam +putih-putih +putra-putra +putra-putri +putri-putri +putus-putus +putusan-putusan +puvi-puvi +quad-core +raba-rabaan +raba-rubu +rada-rada +radio-frequency +ragu-ragu +rahasia-rahasiaan +raja-raja +rama-rama +ramai-ramai +ramalan-ramalan +rambeh-rambeh +rambu-rambu +rame-rame +ramu-ramuan +randa-rondo +rangkul-merangkul +rango-rango +rap-rap +rasa-rasanya +rata-rata +raun-raun +read-only +real-life +real-time +rebah-rebah +rebah-rebahan +rebas-rebas +red-eye +redam-redam +redep-redup +rehab-rekon +reja-reja +reka-reka +reka-rekaan +rekan-rekan +rekan-rekannya +rekor-rekor +relief-relief +remah-remah +remang-remang +rembah-rembah +rembah-rembih +remeh-cemeh +remeh-temeh +rempah-rempah +rencana-rencana +renyai-renyai +rep-repan +repot-repot +repuh-repuh +restoran-restoran +retak-retak +riang-riang +ribu-ribu +ribut-ribut +rica-rica +ride-sharing +rigi-rigi +rinai-rinai +rintik-rintik +ritual-ritual +robak-rabik +robat-rabit +robot-robot +role-play +role-playing +roll-on +rombang-rambing +romol-romol +rompang-romping +rondah-rondih +ropak-rapik +royal-royalan +royo-royo +ruak-ruak +ruba-ruba +rudal-rudal +ruji-ruji +ruku-ruku +rumah-rumah +rumah-rumahan +rumbai-rumbai +rumput-rumputan +runding-merunding +rundu-rundu +runggu-rangga +runner-up +runtang-runtung +rupa-rupa +rupa-rupanya +rusun-rusun +rute-rute +saat-saat +saban-saban +sabu-sabu +sabung-menyabung +sah-sah +sahabat-sahabat +saham-saham +sahut-menyahut +saing-menyaing +saji-sajian +sakit-sakitan +saksi-saksi +saku-saku +salah-salah +sama-sama +samar-samar +sambar-menyambar +sambung-bersambung +sambung-menyambung +sambut-menyambut +samo-samo +sampai-sampai +samping-menyamping +sana-sini +sandar-menyandar +sandi-sandi +sangat-sangat +sangkut-menyangkut +sapa-menyapa +sapai-sapai +sapi-sapi +sapu-sapu +saran-saran +sarana-prasarana +sari-sari +sarit-sarit +satu-dua +satu-satu +satu-satunya +satuan-satuan +saudara-saudara +sauk-menyauk +sauk-sauk +sayang-sayang +sayap-sayap +sayup-menyayup +sayup-sayup +sayur-mayur +sayur-sayuran +sci-fi +seagak-agak +seakal-akal +seakan-akan +sealak-alak +seari-arian +sebaik-baiknya +sebelah-menyebelah +sebentar-sebentar +seberang-menyeberang +seberuntung-beruntungnya +sebesar-besarnya +seboleh-bolehnya +sedalam-dalamnya +sedam-sedam +sedang-menyedang +sedang-sedang +sedap-sedapan +sedapat-dapatnya +sedikit-dikitnya +sedikit-sedikit +sedikit-sedikitnya +sedini-dininya +seelok-eloknya +segala-galanya +segan-menyegan +segan-menyegani +segan-segan +sehabis-habisnya +sehari-hari +sehari-harian +sehari-harinya +sejadi-jadinya +sekali-kali +sekali-sekali +sekenyang-kenyangnya +sekira-kira +sekolah-sekolah +sekonyong-konyong +sekosong-kosongnya +sektor-sektor +sekuasa-kuasanya +sekuat-kuatnya +sekurang-kurangnya +sel-sel +sela-menyela +sela-sela +selak-seluk +selama-lamanya +selambat-lambatnya +selang-seli +selang-seling +selar-belar +selat-latnya +selatan-tenggara +selekas-lekasnya +selentang-selenting +selepas-lepas +self-driving +self-esteem +self-healing +self-help +selir-menyelir +seloyong-seloyong +seluk-beluk +seluk-semeluk +sema-sema +semah-semah +semak-semak +semaksimal-maksimalnya +semalam-malaman +semang-semang +semanis-manisnya +semasa-masa +semata-mata +semau-maunya +sembunyi-sembunyi +sembunyi-sembunyian +sembur-sembur +semena-mena +semenda-menyemenda +semengga-mengga +semenggah-menggah +sementang-mentang +semerdeka-merdekanya +semi-final +semi-permanen +sempat-sempatnya +semu-semu +semua-muanya +semujur-mujurnya +semut-semutan +sen-senan +sendiri-sendiri +sengal-sengal +sengar-sengir +sengau-sengauan +senggak-sengguk +senggang-tenggang +senggol-menyenggol +senior-junior +senjata-senjata +senyum-senyum +seolah-olah +sepala-pala +sepandai-pandai +sepetang-petangan +sepoi-sepoi (basa) +sepraktis-praktisnya +sepuas-puasnya +serak-serak +serak-serik +serang-menyerang +serang-serangan +serangan-serangan +seraya-menyeraya +serba-serbi +serbah-serbih +serembah-serembih +serigala-serigala +sering-sering +serobot-serobotan +serong-menyerong +serta-menyertai +serta-merta +serta-serta +seru-seruan +service-oriented +sesak-menyesak +sesal-menyesali +sesayup-sayup +sesi-sesi +sesuang-suang +sesudah-sudah +sesudah-sudahnya +sesuka-suka +sesuka-sukanya +set-piece +setempat-setempat +setengah-setengah +setidak-tidaknya +setinggi-tingginya +seupaya-upaya +seupaya-upayanya +sewa-menyewa +sewaktu-waktu +sewenang-wenang +sewot-sewotan +shabu-shabu +short-term +short-throw +sia-sia +siang-siang +siap-siap +siapa-siapa +sibar-sibar +sibur-sibur +sida-sida +side-by-side +sign-in +siku-siku +sikut-sikutan +silah-silah +silang-menyilang +silir-semilir +simbol-simbol +simpan-pinjam +sinar-menyinar +sinar-seminar +sinar-suminar +sindir-menyindir +singa-singa +singgah-menyinggah +single-core +sipil-militer +sir-siran +sirat-sirat +sisa-sisa +sisi-sisi +siswa-siswa +siswa-siswi +siswi-siswi +situ-situ +situs-situs +six-core +six-speed +slintat-slintut +slo-mo +slow-motion +snap-on +sobek-sobekan +sodok-sodokan +sok-sokan +solek-menyolek +solid-state +sorak-sorai +sorak-sorak +sore-sore +sosio-ekonomi +soya-soya +spill-resistant +split-screen +sponsor-sponsor +sponsor-sponsoran +srikandi-srikandi +staf-staf +stand-by +stand-up +start-up +stasiun-stasiun +state-owned +striker-striker +studi-studi +suam-suam +suami-isteri +suami-istri +suami-suami +suang-suang +suara-suara +sudin-sudin +sudu-sudu +sudung-sudung +sugi-sugi +suka-suka +suku-suku +sulang-menyulang +sulat-sulit +sulur-suluran +sum-sum +sumber-sumber +sumpah-sumpah +sumpit-sumpit +sundut-bersundut +sungai-sungai +sungguh-sungguh +sungut-sungut +sunting-menyunting +super-damai +super-rahasia +super-sub +supply-demand +supply-side +suram-suram +surat-menyurat +surat-surat +suruh-suruhan +suruk-surukan +susul-menyusul +suwir-suwir +syarat-syarat +system-on-chip +t-shirt +t-shirts +tabar-tabar +tabir-mabir +tabrak-tubruk +tabuh-tabuhan +tabun-menabun +tahu-menahu +tahu-tahu +tahun-tahun +takah-takahnya +takang-takik +take-off +takut-takut +takut-takutan +tali-bertali +tali-tali +talun-temalun +taman-taman +tampak-tampak +tanak-tanakan +tanam-menanam +tanam-tanaman +tanda-tanda +tangan-menangan +tangan-tangan +tangga-tangga +tanggal-tanggal +tanggul-tanggul +tanggung-menanggung +tanggung-tanggung +tank-tank +tanya-jawab +tapa-tapa +tapak-tapak +tari-menari +tari-tarian +tarik-menarik +tarik-ulur +tata-tertib +tatah-tatah +tau-tau +tawa-tawa +tawak-tawak +tawang-tawang +tawar-menawar +tawar-tawar +tayum-temayum +tebak-tebakan +tebu-tebu +tedong-tedong +tegak-tegak +tegerbang-gerbang +teh-tehan +tek-tek +teka-teki +teknik-teknik +teman-teman +teman-temanku +temas-temas +tembak-menembak +temeh-temeh +tempa-menempa +tempat-tempat +tempo-tempo +temut-temut +tenang-tenang +tengah-tengah +tenggang-menenggang +tengok-menengok +teori-teori +teraba-raba +teralang-alang +terambang-ambang +terambung-ambung +terang-terang +terang-terang laras +terang-terangan +teranggar-anggar +terangguk-angguk +teranggul-anggul +terangin-angin +terangkup-angkup +teranja-anja +terapung-apung +terayan-rayan +terayap-rayap +terbada-bada +terbahak-bahak +terbang-terbang +terbang-terbang hinggap +terbata-bata +terbatuk-batuk +terbayang-bayang +terbeda-bedakan +terbengkil-bengkil +terbengong-bengong +terbirit-birit +terbuai-buai +terbuang-buang +terbungkuk-bungkuk +terburu-buru +tercangak-cangak +tercengang-cengang +tercilap-cilap +tercongget-congget +tercoreng-moreng +tercungap-cungap +terdangka-dangka +terdengih-dengih +terduga-duga +terekeh-ekeh +terembut-embut +terembut-rembut +terempas-empas +terengah-engah +teresak-esak +tergagap-gagap +tergagau-gagau +tergaguk-gaguk +tergapai-gapai +tergegap-gegap +tergegas-gegas +tergelak-gelak +tergelang-gelang +tergeleng-geleng +tergelung-gelung +tergerai-gerai +tergerenyeng-gerenyeng +tergesa-gesa +tergila-gila +tergolek-golek +tergontai-gontai +tergudik-gudik +tergugu-gugu +terguling-guling +tergulut-gulut +terhambat-hambat +terharak-harak +terharap-harap +terhengit-hengit +terheran-heran +terhinggut-hinggut +terigau-igau +terimpi-impi +terincut-incut +teringa-inga +teringat-ingat +terinjak-injak +terisak-isak +terjembak-jembak +terjerit-jerit +terkadang-kadang +terkagum-kagum +terkaing-kaing +terkakah-kakah +terkakak-kakak +terkampul-kampul +terkanjar-kanjar +terkantuk-kantuk +terkapah-kapah +terkapai-kapai +terkapung-kapung +terkatah-katah +terkatung-katung +terkecap-kecap +terkedek-kedek +terkedip-kedip +terkejar-kejar +terkekau-kekau +terkekeh-kekeh +terkekek-kekek +terkelinjat-kelinjat +terkelip-kelip +terkempul-kempul +terkemut-kemut +terkencar-kencar +terkencing-kencing +terkentut-kentut +terkepak-kepak +terkesot-kesot +terkesut-kesut +terkial-kial +terkijai-kijai +terkikih-kikih +terkikik-kikik +terkincak-kincak +terkindap-kindap +terkinja-kinja +terkirai-kirai +terkitar-kitar +terkocoh-kocoh +terkojol-kojol +terkokol-kokol +terkosel-kosel +terkotak-kotak +terkoteng-koteng +terkuai-kuai +terkumpal-kumpal +terlara-lara +terlayang-layang +terlebih-lebih +terlincah-lincah +terliuk-liuk +terlolong-lolong +terlongong-longong +terlunta-lunta +termangu-mangu +termanja-manja +termata-mata +termengah-mengah +termenung-menung +termimpi-mimpi +termonyong-monyong +ternanti-nanti +terngiang-ngiang +teroleng-oleng +terombang-ambing +terpalit-palit +terpandang-pandang +terpecah-pecah +terpekik-pekik +terpencar-pencar +terpereh-pereh +terpijak-pijak +terpikau-pikau +terpilah-pilah +terpinga-pinga +terpingkal-pingkal +terpingkau-pingkau +terpontang-panting +terpusing-pusing +terputus-putus +tersanga-sanga +tersaruk-saruk +tersedan-sedan +tersedih-sedih +tersedu-sedu +terseduh-seduh +tersendat-sendat +tersendeng-sendeng +tersengal-sengal +tersengguk-sengguk +tersengut-sengut +terseok-seok +tersera-sera +terserak-serak +tersetai-setai +tersia-sia +tersipu-sipu +tersoja-soja +tersungkuk-sungkuk +tersuruk-suruk +tertagak-tagak +tertahan-tahan +tertatih-tatih +tertegun-tegun +tertekan-tekan +terteleng-teleng +tertendang-tendang +tertimpang-timpang +tertitar-titar +terumbang-ambing +terumbang-umbang +terungkap-ungkap +terus-menerus +terus-terusan +tete-a-tete +text-to-speech +think-tank +think-thank +third-party +third-person +three-axis +three-point +tiap-tiap +tiba-tiba +tidak-tidak +tidur-tidur +tidur-tiduran +tie-dye +tie-in +tiga-tiganya +tikam-menikam +tiki-taka +tikus-tikus +tilik-menilik +tim-tim +timah-timah +timang-timangan +timbang-menimbang +time-lapse +timpa-menimpa +timu-timu +timun-timunan +timur-barat +timur-laut +timur-tenggara +tindih-bertindih +tindih-menindih +tinjau-meninjau +tinju-meninju +tip-off +tipu-tipu +tiru-tiruan +titik-titik +titik-titiknya +tiup-tiup +to-do +tokak-takik +toko-toko +tokoh-tokoh +tokok-menokok +tolak-menolak +tolong-menolong +tong-tong +top-level +top-up +totol-totol +touch-screen +trade-in +training-camp +trans-nasional +treble-winner +tri-band +trik-trik +triple-core +truk-truk +tua-tua +tuan-tuan +tuang-tuang +tuban-tuban +tubuh-tubuh +tujuan-tujuan +tuk-tuk +tukang-menukang +tukar-menukar +tulang-belulang +tulang-tulangan +tuli-tuli +tulis-menulis +tumbuh-tumbuhan +tumpang-tindih +tune-up +tunggang-tunggik +tunggang-tungging +tunggang-tunggit +tunggul-tunggul +tunjuk-menunjuk +tupai-tupai +tupai-tupaian +turi-turian +turn-based +turnamen-turnamen +turun-temurun +turut-menurut +turut-turutan +tuyuk-tuyuk +twin-cam +twin-turbocharged +two-state +two-step +two-tone +u-shape +uang-uangan +uar-uar +ubek-ubekan +ubel-ubel +ubrak-abrik +ubun-ubun +ubur-ubur +uci-uci +udang-undang +udap-udapan +ugal-ugalan +uget-uget +uir-uir +ujar-ujar +uji-coba +ujung-ujung +ujung-ujungnya +uka-uka +ukir-mengukir +ukir-ukiran +ula-ula +ulak-ulak +ulam-ulam +ulang-alik +ulang-aling +ulang-ulang +ulap-ulap +ular-ular +ular-ularan +ulek-ulek +ulu-ulu +ulung-ulung +umang-umang +umbang-ambing +umbi-umbian +umbul-umbul +umbut-umbut +uncang-uncit +undak-undakan +undang-undang +undang-undangnya +unduk-unduk +undung-undung +undur-undur +unek-unek +ungah-angih +unggang-anggit +unggat-unggit +unggul-mengungguli +ungkit-ungkit +unit-unit +universitas-universitas +unsur-unsur +untang-anting +unting-unting +untung-untung +untung-untungan +upah-mengupah +upih-upih +upside-down +ura-ura +uran-uran +urat-urat +uring-uringan +urup-urup +urup-urupan +urus-urus +usaha-usaha +user-user +user-useran +utak-atik +utang-piutang +utang-utang +utar-utar +utara-jauh +utara-selatan +uter-uter +utusan-utusan +v-belt +v-neck +value-added +very-very +video-video +visi-misi +visi-misinya +voa-islam +voice-over +volt-ampere +wajah-wajah +wajar-wajar +wake-up +wakil-wakil +walk-in +walk-out +wangi-wangian +wanita-wanita +wanti-wanti +wara-wara +wara-wiri +warna-warna +warna-warni +was-was +water-cooled +web-based +wide-angle +wilayah-wilayah +win-win +wira-wiri +wora-wari +work-life +world-class +yang-yang +yayasan-yayasan +year-on-year +yel-yel +yo-yo +zam-zam +zig-zag +""".split()) diff --git a/spacy/lang/id/examples.py b/spacy/lang/id/examples.py new file mode 100644 index 000000000..c3616a2c1 --- /dev/null +++ b/spacy/lang/id/examples.py @@ -0,0 +1,22 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.en.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Al Qaidah mengklaim bom mobil yang menewaskan 60 Orang di Mali", + "Abu Sayyaf mengeksekusi sandera warga Filipina", + "Penyaluran pupuk berasal dari lima lokasi yakni Bontang, Kalimantan Timur, Surabaya, Banyuwangi, Semarang, dan Makassar.", + "PT Pupuk Kaltim telah menyalurkan 274.707 ton pupuk bersubsidi ke wilayah penyaluran di 14 provinsi.", + "Jakarta adalah kota besar yang nyaris tidak pernah tidur." + "Kamu ada di mana semalam?", + "Siapa yang membeli makanan ringan tersebut?", + "Siapa presiden pertama Republik Indonesia?" +] diff --git a/spacy/lang/id/lemmatizer.py b/spacy/lang/id/lemmatizer.py new file mode 100644 index 000000000..387037e48 --- /dev/null +++ b/spacy/lang/id/lemmatizer.py @@ -0,0 +1,36883 @@ +# coding: utf8 +from __future__ import unicode_literals + +LOOKUP = { + 'berabad-abad': 'abad', + 'keabadian': 'abadi', + 'keabadiannya': 'abadi', + 'mengabadi': 'abadi', + 'mengabadikan': 'abadi', + 'mengabadikannya': 'abadi', + 'mengabadian': 'abadi', + 'pengabadian': 'abadi', + 'pengabadiannya': 'abadi', + 'mengabahkan': 'abah', + 'abaian': 'abai', + 'terabai': 'abai', + 'terabaikan': 'abai', + 'terabaikannya': 'abai', + 'pengabai': 'abai', + 'pengabaikan': 'abai', + 'pengabaian': 'abai', + 'mengabaikan': 'abai', + 'mengabaikannya': 'abai', + 'mengabaikanku': 'abai', + 'mengabaikanmu': 'abai', + 'penabalan': 'tabal', + 'menabalkan': 'tabal', + 'berabang': 'abang', + 'abaran': 'abar', + 'terabar': 'abar', + 'mengabar': 'abar', + 'mengabarkan': 'abar', + 'mengabarkannya': 'abar', + 'mengabari': 'abar', + 'mengabaran': 'abar', + 'abar-abar': 'abar', + 'berabarkan': 'abar', + 'berabdas': 'abdas', + 'pengabdi': 'abdi', + 'pengabdinya': 'abdi', + 'pengabdikan': 'abdi', + 'pengabdian': 'abdi', + 'mengabdi': 'abdi', + 'mengabdinya': 'abdi', + 'mengabdilah': 'abdi', + 'mengabdikan': 'abdi', + 'mengabdian': 'abdi', + 'pengabdiannya': 'abdi', + 'pengabdianlah': 'abdi', + 'pengabdianku': 'abdi', + 'pengabdianmu': 'abdi', + 'mengaben': 'aben', + 'mengabenkan': 'aben', + 'pengabenan': 'aben', + 'pengabenannya': 'aben', + 'mengabet': 'abet', + 'berabjad': 'abjad', + 'mengabjad': 'abjad', + 'mengabjadkan': 'abjad', + 'pengabjadan': 'abjad', + 'keabnormalan': 'abnormal', + 'mengabolisikan': 'abolisi', + 'berabonemen': 'abonemen', + 'seabrek': 'abrek', + 'abrit-abritan': 'abrit-abrit', + 'keabsahan': 'absah', + 'keabsahannya': 'absah', + 'pengabsahan': 'absah', + 'pengabsahannya': 'absah', + 'mengabsahkan': 'absah', + 'mengabsahkannya': 'absah', + 'mengabsen': 'absen', + 'mengabsenkan': 'absen', + 'mengabsenkannya': 'absen', + 'mengabsorb': 'absorb', + 'mengabsorpsi': 'absorpsi', + 'keabstainan': 'abstain', + 'mengabstrakkan': 'abstrak', + 'mengabu': 'abu', + 'mengabukan': 'abuk', + 'mengabukannya': 'abu', + 'perabuan': 'abu', + 'mengabui': 'abu', + 'pengabuan': 'abu', + 'memperabukan': 'abu', + 'keabu-abuan': 'abu-abu', + 'abuhan': 'abuh', + 'abuh-abuhan': 'abuh', + 'mengabuk': 'abuk', + 'mengabukkan': 'abuk', + 'mengabur': 'kabur', + 'mengaburkan': 'kabur', + 'mengaburkannya': 'kabur', + 'pengabur': 'abur', + 'pengaburkan': 'abur', + 'pengaburan': 'abur', + 'mengacah': 'acah', + 'pengacah': 'acah', + 'beracah-acah': 'acah', + 'mengacak': 'kacak', + 'mengacaknya': 'kacak', + 'acak-acak': 'acak', + 'acak-acakkan': 'acak', + 'acak-acakan': 'acak', + 'acak-acakannya': 'acak', + 'mengacan': 'acan', + 'mengacapi': 'acap', + 'acap-acap': 'acap', + 'mengacapkan': 'acap', + 'beracara': 'acara', + 'beracaranya': 'acara', + 'mengacara': 'acara', + 'mengacarakan': 'acara', + 'pengacara': 'acara', + 'pengacaranya': 'acara', + 'pengacaralah': 'acara', + 'pengacaraku': 'acara', + 'kepengacaraan': 'acara', + 'acatan': 'acat', + 'mengacau': 'kacau', + 'mengacaukan': 'kacau', + 'mengacaukannya': 'kacau', + 'mengaci': 'aci', + 'mengacikan': 'aci', + 'aci-acian': 'aci-aci', + 'aci-acinya': 'aci-aci', + 'mengaci-acikan': 'aci-aci', + 'acoan': 'aco', + 'mengaco': 'aco', + 'aco-acoan': 'aco', + 'acuan': 'acu', + 'acuannya': 'acu', + 'acuanku': 'acu', + 'acuanmu': 'acu', + 'mengacu': 'acu', + 'mengacunya': 'acu', + 'mengacukan': 'acu', + 'pengacuan': 'acu', + 'mengacu-acu': 'acu', + 'acuhan': 'acuh', + 'mengacuhkan': 'acuh', + 'mengacuhkannya': 'acuh', + 'mengacuhkanku': 'acuh', + 'acuman': 'acum', + 'pengacum': 'acum', + 'mengacum': 'acum', + 'mengacung': 'acung', + 'mengacungkan': 'acung', + 'mengacungkannya': 'acung', + 'mengacungi': 'acung', + 'adanya': 'ada', + 'adanyanya': 'ada', + 'adanyalah': 'ada', + 'berada': 'ada', + 'beradanya': 'ada', + 'beradalah': 'ada', + 'beradai': 'ada', + 'beradaan': 'ada', + 'pengada': 'ada', + 'pengadakan': 'ada', + 'pengadaan': 'ada', + 'keadaan': 'ada', + 'keadaannya': 'ada', + 'keadaanlah': 'ada', + 'keadaanku': 'ada', + 'keadaanmu': 'ada', + 'seadanya': 'ada', + 'seadanyalah': 'ada', + 'pengadaannya': 'ada', + 'berada-ada': 'ada', + 'ada-adanya': 'ada', + 'keberadaan': 'ada', + 'keberadaannya': 'ada', + 'keberadaanku': 'ada', + 'keberadaanmu': 'ada', + 'mengadakan': 'ada', + 'mengadakannya': 'ada', + 'mengada-ada': 'ada', + 'mengada-adalah': 'ada', + 'mengada-adakan': 'ada', + 'ada-ada saja': 'ada', + 'ada-adanyakah': 'ada', + 'beradab': 'adab', + 'beradabnya': 'adab', + 'beradaban': 'adab', + 'keadaban': 'adab', + 'keadabannya': 'adab', + 'mengadabi': 'adab', + 'peradaban': 'adab', + 'peradabannya': 'adab', + 'memperadabkan': 'adab', + 'adakalanya': 'adakala', + 'diadang': 'adang', + 'diadangnya': 'adang', + 'mengadang': 'kadang', + 'mengadangnya': 'kadang', + 'mengadangkan': 'kadang', + 'pengadang': 'adang', + 'pengadangnya': 'adang', + 'pengadangan': 'adang', + 'mengadangi': 'adang', + 'adang-adang': 'adang', + 'mengadang-adangi': 'adang', + 'adap-adapan': 'adap', + 'beradaptasi': 'adaptasi', + 'beradaptasinya': 'adaptasi', + 'beradaptasilah': 'adaptasi', + 'pengadaptasian': 'adaptasi', + 'mengadaptasikan': 'adaptasi', + 'mengadaptasikannya': 'adaptasi', + 'mengadar': 'kadar', + 'mengadari': 'kadar', + 'beradat': 'adat', + 'teradat': 'adat', + 'mengadat': 'adat', + 'mengadatkan': 'adat', + 'beradegan': 'adegan', + 'pengadeganan': 'adegan', + 'beradeh': 'adeh', + 'mengadem': 'adem', + 'mengademkan': 'adem', + 'beradik': 'adik', + 'beradiknya': 'adik', + 'beradiki': 'adik', + 'memperadik': 'adik', + 'adik-beradik': 'adik', + 'beradik-berkakak': 'adik', + 'keadikuasaan': 'adikuasa', + 'teradil': 'adil', + 'keadilan': 'adil', + 'keadilannya': 'adil', + 'keadilanlah': 'adil', + 'keadilan-mu': 'adil', + 'pengadil': 'adil', + 'pengadilnya': 'adil', + 'pengadilkan': 'adil', + 'pengadili': 'adil', + 'pengadilan': 'adil', + 'teradili': 'adil', + 'mengadili': 'adil', + 'mengadilinya': 'adil', + 'mengadilikan': 'adil', + 'peradilan': 'adil', + 'peradilannya': 'adil', + 'peradilanlah': 'adil', + 'peradilankan': 'adil', + 'pengadilannya': 'adil', + 'pengadilanlah': 'adil', + 'pengadilani': 'adil', + 'pengadilanan': 'adil', + 'berkeadilan': 'adil', + 'berkeadilannya': 'adil', + 'berkeadilanlah': 'adil', + 'mengadon': 'adon', + 'adonan': 'adon', + 'adonannya': 'adon', + 'pengadopsi': 'adopsi', + 'pengadopsinya': 'adopsi', + 'pengadopsian': 'adopsi', + 'mengadopsi': 'adopsi', + 'mengadopsinya': 'adopsi', + 'mengadopsikan': 'adopsi', + 'pengadopsiannya': 'adopsi', + 'mengadreskan': 'adres', + 'teradu domba': 'adu domba', + 'mengadu domba': 'adu domba', + 'pengadu domba': 'adu domba', + 'pengadudombaan': 'adu domba', + 'mengadudombakan': 'adu domba', + 'memperadudombakan': 'adu domba', + 'aduan': 'adu', + 'aduannya': 'adu', + 'aduanlah': 'adu', + 'beradu': 'radu', + 'beradunya': 'radu', + 'beradulah': 'radu', + 'beradukan': 'radu', + 'pengadu': 'adu', + 'pengadunya': 'adu', + 'pengadukan': 'aduk', + 'pengadukannya': 'aduk', + 'pengaduan': 'adu', + 'mengadu': 'adu', + 'mengadunya': 'adu', + 'mengadulah': 'adu', + 'mengadukan': 'aduk', + 'mengadukannya': 'adu', + 'mengaduan': 'adu', + 'peraduan': 'radu', + 'peraduannya': 'radu', + 'peraduanmu': 'radu', + 'pengaduannya': 'adu', + 'mengadukankan': 'adu', + 'memperadukan': 'adu', + 'pengadu untung': 'adu untung', + 'mengadu untung': 'adu untung', + 'teraduh': 'aduh', + 'mengaduh': 'aduh', + 'adukan': 'aduk', + 'adukannya': 'aduk', + 'teraduk': 'aduk', + 'mengaduk': 'aduk', + 'mengaduknya': 'aduk', + 'mengadukkan': 'aduk', + 'pengaduk': 'aduk', + 'pengaduknya': 'aduk', + 'aduk-adukan': 'aduk', + 'mengaduk-aduk': 'aduk', + 'mengaduk-aduknya': 'aduk', + 'adunan': 'adun', + 'beradun': 'adun', + 'pengadun': 'adun', + 'pengadunan': 'adun', + 'mengadunkan': 'adun', + 'beraerobatik': 'aerobatik', + 'mengafiatkan': 'afiat', + 'berafiliasi': 'afiliasi', + 'berafiliasinya': 'afiliasi', + 'beraga': 'raga', + 'beragai': 'raga', + 'keagaan': 'aga', + 'mengagakan': 'aga', + 'beragah': 'agah', + 'mengagah': 'agah', + 'mengagahi': 'agah', + 'beragah-agah': 'agah', + 'seagak': 'agak', + 'diagak': 'agak', + 'diagakan': 'agak', + 'teragak': 'agak', + 'agaknya': 'agak', + 'agak-agak': 'agak', + 'seagak-agak': 'agak', + 'mengagakkan': 'agak', + 'beragak-agak': 'agak', + 'mengagak-agak': 'agak', + 'mengagak-agihkan': 'agak-agih', + 'beragam': 'ragam', + 'beragamnya': 'ragam', + 'beragamlah': 'ragam', + 'beragaman': 'ragam', + 'beragama': 'agama', + 'beragamanya': 'agama', + 'beragamalah': 'agama', + 'beragamakan': 'agama', + 'beragamai': 'agama', + 'beragamaan': 'agama', + 'keagamaan': 'agama', + 'keagamaannya': 'agama', + 'keagamaannyalah': 'agama', + 'keberagamaan': 'agama', + 'keberagamaannya': 'agama', + 'mengagamakan': 'agama', + 'beragan': 'agan', + 'mengagan': 'agan', + 'mengagani': 'agan', + 'mengagas': 'agas', + 'mengagaskan': 'agas', + 'keagenan': 'agen', + 'keagenannya': 'agen', + 'mengageni': 'agen', + 'mengagendakan': 'agenda', + 'mengagendakannya': 'agenda', + 'beragih': 'agih', + 'peragih': 'agih', + 'mengagih': 'agih', + 'pengagihan': 'agih', + 'mengagihkan': 'agih', + 'beragitasi': 'agitasi', + 'mengagitasi': 'agitasi', + 'beragogo': 'agogo', + 'mengagresi': 'agresi', + 'keagresifan': 'agresif', + 'keagresifannya': 'agresif', + 'keagresifanku': 'agresif', + 'mengagulkan': 'agul', + 'agunan': 'agun', + 'agunannya': 'agun', + 'agunanmu': 'agun', + 'mengagunkan': 'agun', + 'keagungan': 'agung', + 'keagungannya': 'agung', + 'mengagungkan': 'agung', + 'mengagungkannya': 'agung', + 'beragustusan': 'agustus', + 'mengagut-agut': 'agut', + 'mengahadkan': 'ahad', + 'keahlian': 'ahli', + 'keahliannya': 'ahli', + 'keahlianku': 'ahli', + 'keahlianmu': 'ahli', + 'mengahlikan': 'ahli', + 'berkeahlian': 'ahli', + 'keahlinegaraan': 'ahli negara', + 'keaiban': 'aib', + 'mengaibkan': 'aib', + 'berair': 'air', + 'berairan': 'air', + 'keairan': 'air', + 'perairan': 'air', + 'perairannya': 'air', + 'perairani': 'air', + 'perairanan': 'air', + 'mengairi': 'air', + 'mengairinya': 'air', + 'pengairan': 'air', + 'pengairannya': 'air', + 'berpengairan': 'air', + 'keajaiban': 'ajaib', + 'keajaibannya': 'ajaib', + 'keajaibanlah': 'ajaib', + 'keajaibanku': 'ajaib', + 'keajaiban-mu': 'ajaib', + 'mengajaibkan': 'ajaib', + 'ajakan': 'ajak', + 'ajakannya': 'ajak', + 'ajakanlah': 'ajak', + 'ajakanku': 'ajak', + 'ajakanmu': 'ajak', + 'mengajak': 'ajak', + 'mengajaknya': 'ajak', + 'mengajakkan': 'ajak', + 'mengajakan': 'ajak', + 'mengajakku': 'ajak', + 'mengajakmu': 'ajak', + 'ajaran': 'ajar', + 'ajarannya': 'ajar', + 'ajaranku': 'ajar', + 'ajaran-ku': 'ajar', + 'belajar': 'ajar', + 'belajarnya': 'ajar', + 'belajarlah': 'ajar', + 'belajarkan': 'ajar', + 'belajari': 'ajar', + 'belajarmu': 'ajar', + 'pelajar': 'ajar', + 'pelajarnya': 'ajar', + 'pelajari': 'ajar', + 'pelajaran': 'ajar', + 'mengajar': 'ajar', + 'mengajarnya': 'ajar', + 'mengajarkan': 'ajar', + 'mengajarkannya': 'ajar', + 'mengajari': 'ajar', + 'mengajaran': 'ajar', + 'mengajarku': 'ajar', + 'mengajarmu': 'ajar', + 'pengajar': 'ajar', + 'pengajarnya': 'ajar', + 'pengajaran': 'ajar', + 'pelajarannya': 'ajar', + 'pelajaranlah': 'ajar', + 'pelajaranmu': 'ajar', + 'mengajarinya': 'ajar', + 'mengajariku': 'ajar', + 'mengajarimu': 'ajar', + 'pembelajar': 'ajar', + 'pembelajarnya': 'ajar', + 'pembelajaran': 'ajar', + 'pengajarannya': 'ajar', + 'terpelajar': 'ajar', + 'mempelajari': 'ajar', + 'mempelajarinya': 'ajar', + 'pemelajaran': 'ajar', + 'mengajarkankan': 'ajar', + 'mengajarkanku': 'ajar', + 'mengajarkanmu': 'ajar', + 'pembelajarannya': 'ajar', + 'pembelajaranku': 'ajar', + 'berpelajaran': 'ajar', + 'membelajarkan': 'ajar', + 'keterpelajaran': 'ajar', + 'keterpelajarannya': 'ajar', + 'berajojing': 'ajojing', + 'ajuan': 'aju', + 'ajuannya': 'aju', + 'pengajuan': 'aju', + 'pengajuannya': 'aju', + 'pengajuanmu': 'aju', + 'mengajukan': 'aju', + 'mengajukannya': 'aju', + 'diajuk': 'ajuk', + 'diajukkan': 'ajuk', + 'diajukkannya': 'ajuk', + 'diajukan': 'ajuk', + 'keajukan': 'ajuk', + 'mengajuk': 'ajuk', + 'mengajukkan': 'ajuk', + 'mengajukkannya': 'ajuk', + 'diajun': 'ajun', + 'terajun': 'ajun', + 'mengajun': 'ajun', + 'mengajunkan': 'ajun', + 'berakad': 'akad', + 'berakal': 'akal', + 'berakali': 'akal', + 'mengakali': 'akal', + 'mengakalinya': 'akal', + 'akal-akal': 'akal', + 'akal-akalnya': 'akal', + 'akal-akalan': 'akal', + 'seakal-akal': 'akal', + 'seakal budi': 'akal', + 'mengakalkan': 'akal', + 'akanan': 'akan', + 'berakan': 'akan', + 'keakanan': 'akan', + 'mengakan': 'akan', + 'berseakan': 'akan', + 'akan-akan': 'akan', + 'keseakanan': 'akan', + 'seakan-akan': 'akan', + 'mengakankan': 'akan', + 'berakar': 'akar', + 'berakarnya': 'akar', + 'berakarkan': 'akar', + 'mengakar': 'akar', + 'mengakarnya': 'akar', + 'mengakarkan': 'akar', + 'mengakari': 'akar', + 'perakaran': 'akar', + 'perakarannya': 'akar', + 'akar-akaran': 'akar', + 'keakasan': 'akas', + 'akhiran': 'akhir', + 'akhirannya': 'akhir', + 'berakhir': 'akhir', + 'berakhirnya': 'akhir', + 'berakhirlah': 'akhir', + 'berakhirkan': 'akhir', + 'berakhiri': 'akhir', + 'berakhiran': 'akhir', + 'terakhir': 'akhir', + 'terakhirnya': 'akhir', + 'terakhirlah': 'akhir', + 'terakhirkan': 'akhir', + 'terakhiri': 'akhir', + 'terakhirnyalah': 'akhir', + 'terakhirku': 'akhir', + 'terakhirmu': 'akhir', + 'akhirnya': 'akhir', + 'akhirnyanya': 'akhir', + 'akhirnyalah': 'akhir', + 'mengakhiri': 'akhir', + 'mengakhirinya': 'akhir', + 'mengakhirii': 'akhir', + 'pengakhiran': 'akhir', + 'mengakhirkan': 'akhir', + 'akhir-akhirnya': 'akhir', + 'aki-aki': 'aki', + 'berakibat': 'akibat', + 'berakibatnya': 'akibat', + 'berakibatkan': 'akibat', + 'berakibatan': 'akibat', + 'akibatnya': 'akibat', + 'akibatnyanya': 'akibat', + 'mengakibatkan': 'akibat', + 'mengakibatkannya': 'akibat', + 'mengakibatkani': 'akibat', + 'berakikah': 'akikah', + 'mengakikahkan': 'akikah', + 'mengakomodasi': 'akomodasi', + 'mengakomodasinya': 'akomodasi', + 'mengakomodasikan': 'akomodasi', + 'mengakomodasikannya': 'akomodasi', + 'keakraban': 'akrab', + 'keakrabannya': 'akrab', + 'keakrabanlah': 'akrab', + 'mengakrabi': 'akrab', + 'mengakrabinya': 'akrab', + 'mengakrabkan': 'akrab', + 'mengakrabkankan': 'akrab', + 'berakrobat': 'akrobat', + 'pengakroniman': 'akronim', + 'mengakronimkan': 'akronim', + 'beraksara': 'aksara', + 'keberaksaraan': 'aksara', + 'mengaksentuasi': 'aksentuasi', + 'mengaksentuasikan': 'aksentuasi', + 'mengaksep': 'aksep', + 'mengakses': 'akses', + 'mengaksesnya': 'akses', + 'mengakseskan': 'akses', + 'mengaksesi': 'akses', + 'beraksi': 'aksi', + 'beraksinya': 'aksi', + 'beraksilah': 'aksi', + 'pengaktif': 'aktif', + 'pengaktifkan': 'aktif', + 'pengaktifkannya': 'aktif', + 'pengaktifan': 'aktif', + 'keaktifan': 'aktif', + 'keaktifannya': 'aktif', + 'keaktifanku': 'aktif', + 'keaktifanmu': 'aktif', + 'pengaktifannya': 'aktif', + 'mengaktifkan': 'aktif', + 'mengaktifkannya': 'aktif', + 'aktinisme': 'aktinik', + 'pengaktualan': 'aktual', + 'mengaktualkan': 'aktual', + 'mengaktualkannya': 'aktual', + 'mengaktualisasi': 'aktualisasi', + 'mengaktualisasikan': 'aktualisasi', + 'mengaktualisasikannya': 'aktualisasi', + 'akuan': 'aku', + 'beraku': 'aku', + 'berakunya': 'aku', + 'keakuan': 'aku', + 'keakuannya': 'aku', + 'mengaku': 'aku', + 'mengakunya': 'aku', + 'mengakulah': 'aku', + 'mengakukan': 'aku', + 'mengakui': 'aku', + 'mengakuan': 'aku', + 'mengakuku': 'aku', + 'pengaku': 'aku', + 'pengakukan': 'aku', + 'pengakui': 'aku', + 'pengakuan': 'aku', + 'mengakuinya': 'aku', + 'mengakuii': 'aku', + 'mengakuiku': 'aku', + 'pengakuannya': 'aku', + 'pengakuanku': 'aku', + 'beraku-akuan': 'aku', + 'pengakuisisi': 'akuisisi', + 'pengakuisisian': 'akuisisi', + 'mengakuisisi': 'akuisisi', + 'mengakuisisinya': 'akuisisi', + 'terakuk': 'akuk', + 'berakumulasi': 'akumulasi', + 'terakumulasi': 'akumulasi', + 'terakumulasinya': 'akumulasi', + 'mengakumulasi': 'akumulasi', + 'mengakumulasinya': 'akumulasi', + 'mengakumulasikan': 'akumulasi', + 'mengakumulasikannya': 'akumulasi', + 'perakunan': 'akun', + 'perakuntanan': 'akuntan', + 'keakuran': 'akur', + 'mengakuri': 'akur', + 'mengakurkan': 'akur', + 'keakuratan': 'akurat', + 'keakuratannya': 'akurat', + 'terala': 'ala', + 'teralai': 'ala', + 'alahan': 'alah', + 'beralah': 'alah', + 'kealahan': 'alah', + 'mengalah': 'kalah', + 'mengalahnya': 'kalah', + 'mengalahlah': 'kalah', + 'mengalahkan': 'kalah', + 'mengalahkannya': 'kalah', + 'mengalahi': 'kalah', + 'mengalahan': 'kalah', + 'peralahan': 'alah', + 'teralahkan': 'alah', + 'pengalahan': 'alah', + 'mengalahkankan': 'kalah', + 'mengalahkanku': 'kalah', + 'mengalahkanmu': 'kalah', + 'alah-mengalahi': 'alah', + 'sealak-alak': 'alak', + 'beralam': 'alam', + 'beralaman': 'alam', + 'kealaman': 'alam', + 'mengalami': 'alam', + 'mengalaminya': 'alam', + 'mengalamilah': 'alam', + 'mengalamii': 'alam', + 'pengalaman': 'alam', + 'pengalamannya': 'alam', + 'pengalamanlah': 'alam', + 'pengalamankan': 'alam', + 'pengalamanan': 'alam', + 'pengalamanku': 'alam', + 'pengalamanmu': 'alam', + 'berpengalaman': 'alam', + 'berpengalamannya': 'alam', + 'berpengalamanlah': 'alam', + 'berpengalamanan': 'alam', + 'beralamat': 'alamat', + 'beralamatkan': 'alamat', + 'mengalamati': 'alamat', + 'mengalamatkan': 'alamat', + 'mengalamatkannya': 'alamat', + 'alangan': 'alang', + 'teralang': 'alang', + 'beralang': 'alang', + 'pengalang': 'alang', + 'pengalangan': 'alang', + 'mengalang': 'alang', + 'mengalangi': 'alang', + 'beralangan': 'alang', + 'mengalanginya': 'alang', + 'mengalangkan': 'alang', + 'alang-alangan': 'alang', + 'teralang-alang': 'alang', + 'mengalang-alangi': 'alang', + 'mengalap': 'alap', + 'dialas': 'alas', + 'dialaskan': 'alas', + 'dialasi': 'alas', + 'dialasan': 'alas', + 'alasan': 'alas', + 'alasannya': 'alas', + 'alasanlah': 'alas', + 'alasanku': 'alas', + 'alasanmu': 'alas', + 'beralas': 'alas', + 'beralaskan': 'alas', + 'beralasan': 'alas', + 'mengalas': 'alas', + 'mengalasi': 'alas', + 'beralasannya': 'alas', + 'beralasanlah': 'alas', + 'beralasankan': 'alas', + 'pengalasan': 'alas', + 'mengalaskan': 'alas', + 'beralat': 'alat', + 'beralatan': 'alat', + 'mengalati': 'alat', + 'peralatan': 'alat', + 'peralatannya': 'alat', + 'peralatanlah': 'alat', + 'peralatanan': 'alat', + 'memperalat': 'alat', + 'memperalatnya': 'alat', + 'memperalati': 'alat', + 'mengalatkan': 'alat', + 'memperalatkan': 'alat', + 'aleman': 'alem', + 'mengali': 'ali', + 'mengalikan': 'kali', + 'mengalikannya': 'kali', + 'pengali-ali': 'ali-ali', + 'mengali-ali': 'ali-ali', + 'beraliansi': 'aliansi', + 'teralienasi': 'alienasi', + 'teralienasinya': 'alienasi', + 'alif-alifan': 'alif', + 'pengalihaksara': 'alih aksara', + 'pengalihaksaraan': 'alih aksara', + 'mengalihaksarakan': 'alih aksara', + 'pengalih bahasa': 'alih bahasa', + 'pengalihbahasaan': 'alih bahasa', + 'mengalihbahasakan': 'alih bahasa', + 'beralih fungsi': 'alih fungsi', + 'teralih': 'alih', + 'teralihnya': 'alih', + 'teralihkan': 'alih', + 'teralihkannya': 'alih', + 'beralih': 'alih', + 'beralihnya': 'alih', + 'beralihlah': 'alih', + 'beralihkan': 'alih', + 'beralihan': 'alih', + 'mengalih': 'alih', + 'mengalihkan': 'alih', + 'mengalihkannya': 'alih', + 'mengalihan': 'alih', + 'peralihan': 'alih', + 'peralihannya': 'alih', + 'alih-alih': 'alih', + 'pengalihan': 'alih', + 'pengalihannya': 'alih', + 'pengalihanlah': 'alih', + 'mengalihkanmu': 'alih', + 'beralih tugas': 'alih tugas', + 'pengalihtugasan': 'alih tugas', + 'mengalihtugaskan': 'alih tugas', + 'kealiman': 'alim', + 'kealimannya': 'alim', + 'mengalin': 'alin', + 'mengalinkan': 'alin', + 'alingan': 'aling', + 'mengalingi': 'aling', + 'aling-aling': 'aling', + 'aling-alingan': 'aling', + 'alip-alipan': 'alip', + 'aliran': 'alir', + 'alirannya': 'alir', + 'alirani': 'alir', + 'mengalir': 'alir', + 'mengalirnya': 'alir', + 'mengalirlah': 'alir', + 'mengalirkan': 'alir', + 'mengalirkannya': 'alir', + 'mengaliri': 'alir', + 'mengaliran': 'alir', + 'mengalirinya': 'alir', + 'pengaliran': 'alir', + 'pengalirannya': 'alir', + 'mengalit': 'alit', + 'kealkalian': 'alkali', + 'pengalkoholan': 'alkohol', + 'alkoholometer': 'alkoholisme', + 'ke-allah-an': 'allah', + 'pengalokasian': 'alokasi', + 'pengalokasiannya': 'alokasi', + 'mengalokasikan': 'alokasi', + 'mengalokasikannya': 'alokasi', + 'alon-alon': 'alon', + 'teralpa': 'alpa', + 'kealpaan': 'alpa', + 'kealpaannya': 'alpa', + 'mengalpakan': 'alpa', + 'beralu-aluan': 'alu', + 'mengalum': 'alum', + 'alunan': 'alun', + 'alunannya': 'alun', + 'beralun': 'alun', + 'beralunkan': 'alun', + 'beralunan': 'alun', + 'teralun': 'alun', + 'mengalun': 'alun', + 'mengalunlah': 'alun', + 'mengalunkan': 'alun', + 'beralun-alun': 'alun', + 'mengalup': 'alup', + 'aluran': 'alur', + 'beralur': 'alur', + 'alur-aluran': 'alur', + 'mengalur-alur': 'alur', + 'mengamkan': 'am', + 'mengamkankan': 'am', + 'amai-amai': 'amai', + 'amalan': 'amal', + 'amalannya': 'amal', + 'amalanmu': 'amal', + 'beramal': 'amal', + 'pengamal': 'amal', + 'pengamalan': 'amal', + 'pengamalannya': 'amal', + 'mengamalkan': 'amal', + 'mengamalkannya': 'amal', + 'pengamalgam': 'amalgam', + 'pengamalgaman': 'amalgam', + 'keamanan': 'aman', + 'keamanannya': 'aman', + 'keamananlah': 'aman', + 'keamananan': 'aman', + 'keamananku': 'aman', + 'keamananmu': 'aman', + 'pengaman': 'aman', + 'pengamannya': 'aman', + 'pengamankan': 'aman', + 'pengamanan': 'aman', + 'pengamanku': 'aman', + 'pengamanmu': 'aman', + 'pengamanannya': 'aman', + 'pengamananan': 'aman', + 'memperaman': 'aman', + 'mengamankan': 'aman', + 'mengamankannya': 'aman', + 'mengamankankan': 'aman', + 'pengamanah': 'amanah', + 'mengamanahkan': 'amanah', + 'mengamanahkannya': 'amanah', + 'beramanat': 'amanat', + 'mengamanati': 'amanat', + 'pengamanatan': 'amanat', + 'mengamanatkan': 'amanat', + 'mengamanatkannya': 'amanat', + 'mengamang': 'amang', + 'mengamangkan': 'amang', + 'mengamangi': 'amang', + 'mengamang-amang': 'amang', + 'amaran': 'amar', + 'amarannya': 'amar', + 'mengamarkan': 'amar', + 'amatan': 'amat', + 'amatannya': 'amat', + 'teramat': 'amat', + 'teramati': 'amat', + 'pengamat': 'amat', + 'pengamatnya': 'amat', + 'pengamatan': 'amat', + 'mengamati': 'amat', + 'mengamatinya': 'amat', + 'mengamatiku': 'amat', + 'memperamat': 'amat', + 'pengamatannya': 'amat', + 'memperamatkan': 'amat', + 'mengamat-amati': 'amat', + 'memperamat-amat': 'amat', + 'memperamat-amatkan': 'amat', + 'amatir-amatiran': 'amatir', + 'ambaian': 'ambai', + 'mengambai': 'ambai', + 'mengambaikan': 'ambai', + 'berambai-ambai': 'ambai', + 'mengambai-ambaikan': 'ambai', + 'diambak': 'ambak', + 'mengambak': 'ambak', + 'ambalan': 'ambal', + 'ambalannya': 'ambal', + 'mengambal': 'ambal', + 'mengambali': 'ambal', + 'berambal-ambalan': 'ambal', + 'terambang': 'ambang', + 'mengambang': 'kambang', + 'mengambangnya': 'kambang', + 'mengambangkan': 'kambang', + 'mengambangkannya': 'kambang', + 'mengambangi': 'kambang', + 'mengambangan': 'kambang', + 'terambang-ambang': 'ambang', + 'mengambang-ambang': 'ambang', + 'terambau': 'ambau', + 'berambau': 'ambau', + 'mengambau': 'ambau', + 'ambekan': 'ambek', + 'mengambek': 'ambek', + 'pengambekparamaartaan': 'ambek paramaarta', + 'mengambekparamaartakan': 'ambek paramaarta', + 'mengambil alih': 'ambil alih', + 'pengambilalihan': 'ambil alih', + 'pengambilalihannya': 'ambil alih', + 'ambilan': 'ambil', + 'terambil': 'ambil', + 'mengambil': 'ambil', + 'mengambilnya': 'ambil', + 'mengambilkan': 'ambil', + 'mengambilkannya': 'ambil', + 'mengambili': 'ambil', + 'mengambilan': 'ambil', + 'mengambilku': 'ambil', + 'mengambilmu': 'ambil', + 'pengambil': 'ambil', + 'pengambilnya': 'ambil', + 'pengambilkan': 'ambil', + 'pengambilan': 'ambil', + 'pengambilannya': 'ambil', + 'berambil-ambil': 'ambil', + 'ambil-mengambil': 'ambil', + 'ambinan': 'ambin', + 'mengambin': 'ambin', + 'berambin': 'ambin', + 'berambisi': 'ambisi', + 'berambisinya': 'ambisi', + 'ambring-ambringan': 'ambring', + 'keambrukan': 'ambruk', + 'keambrukannya': 'ambruk', + 'pengambrukan': 'ambruk', + 'mengambrukkan': 'ambruk', + 'mengambul': 'ambul', + 'mengambulkan': 'ambul', + 'mengambung': 'ambung', + 'mengambungkan': 'ambung', + 'terambung-ambung': 'ambung', + 'mengambung-ambung': 'ambung', + 'mengambung-ambungkan': 'ambung', + 'mengambur': 'ambur', + 'mengamburkan': 'ambur', + 'pengamen': 'amen', + 'pengamennya': 'amen', + 'mengamen': 'amen', + 'mengamennya': 'amen', + 'mengamenku': 'amen', + 'mengamenmu': 'amen', + 'mengamini': 'amin', + 'mengamininya': 'amin', + 'mengaminkan': 'amin', + 'pengamitan': 'amit', + 'pengamorfan': 'amorf', + 'mengamortisasi': 'amortisasi', + 'ampaian': 'ampai', + 'berampai': 'ampai', + 'terampai': 'ampai', + 'mengampai': 'ampai', + 'mengampaikan': 'ampai', + 'mengampelas': 'ampelas', + 'pengampelas': 'ampelas', + 'pengampelasan': 'ampelas', + 'mengampelasi': 'ampelas', + 'mengamplopi': 'amplop', + 'mengamplopkan': 'amplop', + 'amprung-amprungan': 'amprung', + 'pengampu': 'ampu', + 'pengampunya': 'ampu', + 'pengampuan': 'ampu', + 'mengampu': 'ampu', + 'mengampunya': 'ampu', + 'mengampukan': 'ampu', + 'keampuhan': 'ampuh', + 'keampuhannya': 'ampuh', + 'mengampuh': 'ampuh', + 'pengampuh': 'ampuh', + 'mengampuhkan': 'ampuh', + 'mengampul': 'ampul', + 'mengampulkan': 'ampul', + 'ampuni': 'ampun', + 'ampunilah': 'ampun', + 'ampunan': 'ampun', + 'ampunannya': 'ampun', + 'ampunan-mu': 'ampun', + 'keampunan': 'ampun', + 'terampuni': 'ampun', + 'pengampun': 'ampun', + 'pengampunan': 'ampun', + 'mengampuni': 'ampun', + 'mengampuninya': 'ampun', + 'mengampuniku': 'ampun', + 'mengampunimu': 'ampun', + 'pengampunannya': 'ampun', + 'pengampunanlah': 'ampun', + 'pengampunanmu': 'ampun', + 'mengampunkan': 'ampun', + 'amputan': 'amput', + 'mengamput': 'amput', + 'teramputasi': 'amputasi', + 'mengamputasi': 'amputasi', + 'mengamputasinya': 'amputasi', + 'pengamputasian': 'amputasi', + 'amukan': 'amuk', + 'amukannya': 'amuk', + 'beramuk': 'amuk', + 'mengamuk': 'amuk', + 'mengamuknya': 'amuk', + 'mengamuklah': 'amuk', + 'mengamuki': 'amuk', + 'pengamuk': 'amuk', + 'pengamukan': 'amuk', + 'mengamukkan': 'amuk', + 'beramuk-amuk': 'amuk', + 'beramuk-amukan': 'amuk', + 'teramung': 'amung', + 'amung-amung': 'amung', + 'penganakemasan': 'anak emas', + 'menganakemaskan': 'anak emas', + 'menganakemaskannya': 'anak emas', + 'anakan': 'anak', + 'anakannya': 'anak', + 'beranak': 'anak', + 'beranaknya': 'anak', + 'anak-anak': 'anak', + 'anak-anaknya': 'anak', + 'anak-anaklah': 'anak', + 'anak-anaki': 'anak', + 'anak-anaknyalah': 'anak', + 'anak-anakku': 'anak', + 'anak-anakmu': 'anak', + 'peranakan': 'anak', + 'peranakannya': 'anak', + 'anak-anakan': 'anak', + 'anak-beranak': 'anak', + 'memperanakkan': 'anak', + 'menganak semang': 'anak semang', + 'menganak sungai': 'anak sungai', + 'penganaktirian': 'anak tiri', + 'menganaktirikan': 'anak tiri', + 'menganaktirikannya': 'anak tiri', + 'penganalisis': 'analisis', + 'menganalisis': 'analisis', + 'menganalisisnya': 'analisis', + 'menganalisisi': 'analisis', + 'penganalisisan': 'analisis', + 'menganalogikan': 'analogi', + 'menganalogikannya': 'analogi', + 'mengancaikan': 'ancai', + 'mengancai-ancaikan': 'ancai', + 'mengancak-ancak': 'ancak-ancak', + 'ancaman': 'ancam', + 'ancamannya': 'ancam', + 'ancamanlah': 'ancam', + 'ancamanan': 'ancam', + 'ancamanmu': 'ancam', + 'terancam': 'ancam', + 'terancamnya': 'ancam', + 'terancamkan': 'ancam', + 'terancaman': 'ancam', + 'mengancam': 'ancam', + 'mengancamnya': 'ancam', + 'mengancamkan': 'ancam', + 'mengancaman': 'ancam', + 'mengancamku': 'ancam', + 'pengancam': 'ancam', + 'pengancamnya': 'ancam', + 'pengancaman': 'ancam', + 'pengancamannya': 'ancam', + 'ancang ekstrinsik': 'ancang', + 'mengancar-ancar': 'ancar-ancar', + 'mengancuk': 'ancuk', + 'andaikan': 'andai', + 'seandainya': 'andai', + 'pengandaian': 'andai', + 'pengandaiannya': 'andai', + 'mengandaikan': 'andai', + 'berandai-andai': 'andai', + 'berandai-andailah': 'andai', + 'pengandak': 'andak', + 'mengandak': 'andak', + 'mengandakan': 'andak', + 'mengandakkan': 'andak', + 'andalan': 'andal', + 'andalannya': 'andal', + 'andalanan': 'andal', + 'andalanku': 'andal', + 'terandal': 'andal', + 'terandalkan': 'andal', + 'keandalan': 'andal', + 'keandalannya': 'andal', + 'mengandalkan': 'andal', + 'mengandalkannya': 'andal', + 'mengandalkanku': 'andal', + 'mengandalkanmu': 'andal', + 'keterandalan': 'andal', + 'keterandalannya': 'andal', + 'andaman': 'andam', + 'berandam': 'andam', + 'terandam': 'andam', + 'terandamnya': 'andam', + 'mengandam': 'andam', + 'pengandam': 'andam', + 'mengandamkan': 'andam', + 'mengandarkan': 'kandar', + 'anduhan': 'anduh', + 'teranduh': 'anduh', + 'menganduh': 'anduh', + 'penganduh': 'anduh', + 'menganduhkan': 'anduh', + 'keanehan': 'aneh', + 'keanehannya': 'aneh', + 'aneh-aneh': 'aneh', + 'aneh-anehnya': 'aneh', + 'aneh-anehlah': 'aneh', + 'menganehkan': 'aneh', + 'beraneh-aneh': 'aneh', + 'menganekajeniskan': 'aneka jenis', + 'beraneka': 'aneka', + 'keanekaan': 'aneka', + 'penganekaan': 'aneka', + 'menganekakan': 'aneka', + 'beraneka ragam': 'aneka ragam', + 'keanekaragaman': 'aneka ragam', + 'keanekaragamannya': 'aneka ragam', + 'penganekaragaman': 'aneka ragam', + 'menganekaragamkan': 'aneka ragam', + 'menganeksasi': 'aneksasi', + 'menganeksasinya': 'aneksasi', + 'menganeksasikan': 'aneksasi', + 'terangah': 'angah', + 'mengangan': 'angan', + 'mengangankan': 'angan', + 'mengangani': 'angan', + 'angan-angan': 'angan', + 'angan-angannya': 'angan', + 'angan-angankan': 'angan', + 'angan-anganmu': 'angan', + 'berangan-angan': 'angan', + 'mengangan-angan': 'angan', + 'mengangan-angankan': 'angan', + 'berangga': 'rangga', + 'beranggakan': 'rangga', + 'beranggaan': 'rangga', + 'menganggali': 'anggal', + 'menganggalkan': 'anggal', + 'anggapan': 'anggap', + 'anggapannya': 'anggap', + 'anggapanku': 'anggap', + 'menganggap': 'anggap', + 'menganggapnya': 'anggap', + 'menganggapkan': 'anggap', + 'menganggapi': 'anggap', + 'menganggapan': 'anggap', + 'menganggapku': 'anggap', + 'menganggapmu': 'anggap', + 'beranggapan': 'anggap', + 'beranggap-anggapan': 'anggap', + 'anggaran': 'anggar', + 'anggarannya': 'anggar', + 'anggaranlah': 'anggar', + 'anggarankan': 'anggar', + 'anggarani': 'anggar', + 'anggaranku': 'anggar', + 'peanggar': 'anggar', + 'peanggaran': 'anggar', + 'beranggar': 'anggar', + 'beranggarkan': 'anggar', + 'beranggaran': 'anggar', + 'menganggar': 'anggar', + 'menganggarkan': 'anggar', + 'menganggarkannya': 'anggar', + 'menganggaran': 'anggar', + 'penganggaran': 'anggar', + 'penganggarannya': 'anggar', + 'anggar-anggar': 'anggar', + 'teranggar-anggar': 'anggar', + 'anggitan': 'anggit', + 'anggitannya': 'anggit', + 'menganggit': 'anggit', + 'mengangglap': 'angglap', + 'pengangglapan': 'angglap', + 'beranggota': 'anggota', + 'beranggotakan': 'anggota', + 'beranggotaan': 'anggota', + 'keanggotaan': 'anggota', + 'keanggotaannya': 'anggota', + 'penganggrekan': 'anggrek', + 'menganggrekkan': 'anggrek', + 'anggukan': 'angguk', + 'anggukannya': 'angguk', + 'berangguk': 'angguk', + 'pengangguk': 'angguk', + 'mengangguk': 'angguk', + 'mengangguklah': 'angguk', + 'menganggukkan': 'angguk', + 'menganggukan': 'angguk', + 'berangguk-angguk': 'angguk', + 'terangguk-angguk': 'angguk', + 'mengangguk-angguk': 'angguk', + 'mengangguk-anggukkan': 'angguk', + 'mengangguk-anggukan': 'angguk', + 'beranggul': 'anggul', + 'menganggul': 'anggul', + 'teranggul-anggul': 'anggul', + 'keanggunan': 'anggun', + 'keanggunannya': 'anggun', + 'menganggung': 'anggung', + 'menganggungkan': 'anggung', + 'anggung gaya': 'anggung', + 'angguran': 'anggur', + 'penganggur': 'anggur', + 'pengangguran': 'anggur', + 'menganggur': 'anggur', + 'menganggurnya': 'anggur', + 'menganggurkan': 'anggur', + 'penganggurannya': 'anggur', + 'pengangguranlah': 'anggur', + 'beranggut': 'anggut', + 'menganggut': 'anggut', + 'menganggut-anggut': 'anggut', + 'seangin': 'angin', + 'terangin': 'angin', + 'berangin': 'angin', + 'mengangin': 'angin', + 'keanginan': 'angin', + 'mengangini': 'angin', + 'peranginan': 'angin', + 'angin-angin': 'angin', + 'angin-anginnya': 'angin', + 'angin-anginkan': 'angin', + 'angin-anginan': 'angin', + 'menganginkan': 'angin', + 'angin-anginannya': 'angin', + 'memperanginkan': 'angin', + 'terangin-angin': 'angin', + 'berangin-angin': 'angin', + 'mengangin-anginkan': 'angin', + 'mengangin-anginkannya': 'angin', + 'mengangka': 'angka', + 'mengangkai': 'angka', + 'perangkaan': 'angka', + 'pengangkaan': 'angka', + 'mengangkakan': 'angka', + 'berangka-angka': 'angka', + 'berangka-angkaan': 'angka', + 'keangkaraan': 'angkara', + 'mengangkasa': 'angkasa', + 'mengangkasanya': 'angkasa', + 'angkatan': 'angkat', + 'angkatannya': 'angkat', + 'perangkat': 'angkat', + 'perangkatnya': 'angkat', + 'perangkatkan': 'angkat', + 'perangkatan': 'angkat', + 'perangkatmu': 'angkat', + 'terangkat': 'angkat', + 'terangkatnya': 'angkat', + 'terangkatlah': 'angkat', + 'seangkatan': 'angkat', + 'seangkatannya': 'angkat', + 'seangkatanmu': 'angkat', + 'mengangkat': 'angkat', + 'mengangkatnya': 'angkat', + 'mengangkatkan': 'angkat', + 'mengangkati': 'angkat', + 'mengangkatan': 'angkat', + 'mengangkatku': 'angkat', + 'mengangkatmu': 'angkat', + 'pengangkat': 'angkat', + 'pengangkatnya': 'angkat', + 'pengangkatan': 'angkat', + 'seperangkat': 'perangkat', + 'pengangkatannya': 'angkat', + 'pengangkatanku': 'angkat', + 'seperangkatan': 'angkat', + 'mengangkat-angkat': 'angkat', + 'mengangkat-angkatnya': 'angkat', + 'mengangkit': 'angkit', + 'angkringan': 'angkring', + 'angkringannya': 'angkring', + 'keangkuhan': 'angkuh', + 'keangkuhannya': 'angkuh', + 'mengangkup': 'angkup', + 'angkup-angkup': 'angkup', + 'terangkup-angkup': 'angkup', + 'angkutan': 'angkut', + 'angkutannya': 'angkut', + 'angkutanlah': 'angkut', + 'angkutanku': 'angkut', + 'mengangkut': 'angkut', + 'mengangkutnya': 'angkut', + 'mengangkutkan': 'angkut', + 'mengangkuti': 'angkut', + 'pengangkut': 'angkut', + 'pengangkutnya': 'angkut', + 'pengangkutan': 'angkut', + 'mengangkutinya': 'angkut', + 'pengangkutannya': 'angkut', + 'menganglap': 'anglap', + 'menganglong': 'anglong', + 'angonan': 'angon', + 'mengangon': 'angon', + 'pengangon': 'angon', + 'pengangonan': 'angon', + 'mengangop': 'angop', + 'mengangsu': 'angsu', + 'angsuran': 'angsur', + 'angsurannya': 'angsur', + 'angsuranku': 'angsur', + 'berangsur': 'angsur', + 'mengangsur': 'angsur', + 'mengangsurnya': 'angsur', + 'mengangsurkan': 'angsur', + 'pengangsuran': 'angsur', + 'mengangut': 'angut', + 'anian': 'ani', + 'mengani': 'ani', + 'teraniaya': 'aniaya', + 'teraniayanya': 'aniaya', + 'menganiaya': 'aniaya', + 'menganiayanya': 'aniaya', + 'menganiayai': 'aniaya', + 'menganiayaan': 'aniaya', + 'menganiayaku': 'aniaya', + 'penganiaya': 'aniaya', + 'penganiayanya': 'aniaya', + 'penganiayaan': 'aniaya', + 'penganiayaannya': 'aniaya', + 'teranja-anja': 'anja', + 'beranja-anja': 'anja', + 'dianjak': 'anjak', + 'beranjak': 'anjak', + 'beranjaknya': 'anjak', + 'beranjaklah': 'anjak', + 'menganjak': 'anjak', + 'keberanjakan': 'anjak', + 'keanjalan': 'anjal', + 'menganjal': 'anjal', + 'beranjang': 'anjang', + 'beranjangkarya': 'anjangkarya', + 'beranjangsana': 'anjangsana', + 'peranjingan': 'anjing', + 'menganju': 'anju', + 'menganjukan': 'anju', + 'anjungan': 'anjung', + 'anjungannya': 'anjung', + 'beranjung': 'anjung', + 'menganjung': 'anjung', + 'anjung-anjung': 'anjung', + 'menganjungkan': 'anjung', + 'anjung-anjungan': 'anjung', + 'menganjung-anjung': 'anjung', + 'menganjung-anjungkan': 'anjung', + 'anjuran': 'anjur', + 'anjurannya': 'anjur', + 'beranjur': 'anjur', + 'teranjur': 'anjur', + 'penganjur': 'anjur', + 'penganjurnya': 'anjur', + 'penganjuran': 'anjur', + 'menganjur': 'anjur', + 'menganjurkan': 'anjur', + 'menganjurkannya': 'anjur', + 'menganjuran': 'anjur', + 'menganjuri': 'anjur', + 'menganjurian': 'anjur', + 'menganjurkanmu': 'anjur', + 'mengantamir': 'antamir', + 'mengantapkan': 'antap', + 'antaran': 'antar', + 'antarannya': 'antar', + 'antarani': 'antar', + 'terantar': 'antar', + 'berantar': 'antar', + 'mengantar': 'antar', + 'mengantarnya': 'antar', + 'mengantarkan': 'antar', + 'mengantarkannya': 'antar', + 'mengantari': 'antar', + 'mengantaran': 'antar', + 'mengantarku': 'antar', + 'mengantarmu': 'antar', + 'pengantar': 'antar', + 'pengantarnya': 'antar', + 'pengantarkan': 'antar', + 'pengantaran': 'antar', + 'pengantarannya': 'antar', + 'mengantarkankan': 'antar', + 'mengantarkanku': 'antar', + 'mengantarkanmu': 'antar', + 'antar-mengantar': 'antar', + 'perantara': 'antara', + 'perantaranya': 'antara', + 'perantaraan': 'antara', + 'berantara': 'antara', + 'berantarakan': 'antara', + 'berantarakannya': 'antara', + 'mengantara': 'antara', + 'mengantaranya': 'antara', + 'mengantarakan': 'antara', + 'mengantarai': 'antara', + 'pengantara': 'antara', + 'pengantaranya': 'antara', + 'pengantaraan': 'antara', + 'memperantarai': 'antara', + 'berantem': 'antem', + 'berantemnya': 'antem', + 'berantemlah': 'antem', + 'beranteman': 'antem', + 'mengantepi': 'antep', + 'seantero': 'antero', + 'mengantih': 'antih', + 'pengantihan': 'antih', + 'keantikan': 'antik', + 'keantikannya': 'antik', + 'mengantikkan': 'antik', + 'menganting': 'anting', + 'mengantingi': 'anting', + 'anting-anting': 'anting', + 'anting-antingnya': 'anting', + 'anting-antingan': 'anting', + 'berantisipasi': 'antisipasi', + 'mengantisipasi': 'antisipasi', + 'mengantisipasinya': 'antisipasi', + 'mengantisipasikan': 'antisipasi', + 'antrean': 'antre', + 'antreannya': 'antre', + 'antreanku': 'antre', + 'pengantre': 'antre', + 'pengantrean': 'antre', + 'mengantre': 'antre', + 'mengantrenya': 'antre', + 'mengantrekan': 'antre', + 'mengantrei': 'antre', + 'berantuk': 'antuk', + 'terantuk': 'antuk', + 'mengantuk': 'kantuk', + 'mengantuknya': 'kantuk', + 'mengantukkan': 'kantuk', + 'berantukan': 'antuk', + 'mengantul': 'antul', + 'berantun': 'antun', + 'menganugerahi': 'anugerah', + 'menganugerahinya': 'anugerah', + 'penganugerahan': 'anugerah', + 'penganugerahannya': 'anugerah', + 'menganugerahkan': 'anugerah', + 'menganugerahkannya': 'anugerah', + 'menganulir': 'anulir', + 'menganulirnya': 'anulir', + 'menganulirkan': 'anulir', + 'anutan': 'anut', + 'anutannya': 'anut', + 'penganut': 'anut', + 'penganutnya': 'anut', + 'penganutan': 'anut', + 'menganut': 'anut', + 'menganutnya': 'anut', + 'menganuti': 'anut', + 'anyaman': 'anyam', + 'anyamannya': 'anyam', + 'anyamanan': 'anyam', + 'menganyam': 'anyam', + 'menganyamnya': 'anyam', + 'anyam-menganyam': 'anyam', + 'menganyang': 'anyang', + 'menganyang hati': 'anyang', + 'teranyar': 'anyar', + 'teranyarnya': 'anyar', + 'teranyarmu': 'anyar', + 'apaan': 'apa', + 'mengapa': 'apa', + 'mengapanya': 'apa', + 'mengapalah': 'apa', + 'mengapakan': 'apa', + 'mengapakannya': 'apa', + 'mengapai': 'apa', + 'apa-apa': 'apa', + 'apa-apanya': 'apa', + 'apa-apalah': 'apa', + 'apa-apakan': 'apa', + 'apa-apaan': 'apa', + 'apa-apanyalah': 'apa', + 'mengapainya': 'apa', + 'mengapaikan': 'apa', + 'mengapa-apai': 'apa', + 'dipengapakan': 'apa', + 'mengapam': 'apam', + 'pengapartemenan': 'apartemen', + 'berapi': 'api', + 'berapinya': 'api', + 'mengapi': 'api', + 'perapian': 'api', + 'perapiannya': 'api', + 'perapianku': 'api', + 'berapi-api': 'api', + 'berapi-apinya': 'api', + 'memperapikan': 'api', + 'mengapi-apikan': 'api', + 'mengapikkan': 'apik', + 'apitan': 'apit', + 'berapit': 'apit', + 'pengapit': 'kapit', + 'pengapitnya': 'kapit', + 'mengapit': 'apit', + 'mengapitnya': 'apit', + 'mengapitkan': 'apit', + 'mengapiti': 'apit', + 'pengapitan': 'apit', + 'memperapitkan': 'apit', + 'apkiran': 'apkir', + 'apkirannya': 'apkir', + 'mengapkir': 'apkir', + 'mengaplikasikan': 'aplikasi', + 'mengaplikasikannya': 'aplikasi', + 'aplusan': 'aplus', + 'aplusannya': 'aplus', + 'mengaplus': 'aplus', + 'perapotekan': 'apotek', + 'berapresiasi': 'apresiasi', + 'mengapresiasi': 'apresiasi', + 'mengapresiasinya': 'apresiasi', + 'mengapresiasikan': 'apresiasi', + 'mengapresiasikannya': 'apresiasi', + 'mengaprit': 'aprit', + 'aprit-apritan': 'aprit', + 'terapung': 'apung', + 'terapungnya': 'apung', + 'mengapung': 'apung', + 'mengapungnya': 'apung', + 'mengapunglah': 'apung', + 'mengapungkan': 'apung', + 'berapungan': 'apung', + 'apung-apung': 'apung', + 'terapung-apung': 'apung', + 'berapung-apung': 'apung', + 'mengarabkan': 'arab', + 'kearab-araban': 'arab', + 'searah': 'arah', + 'searahnya': 'arah', + 'arahan': 'arah', + 'arahannya': 'arah', + 'berarah': 'arah', + 'terarah': 'arah', + 'terarahnya': 'arah', + 'terarahkan': 'arah', + 'pengarah': 'arah', + 'pengarahnya': 'arah', + 'pengarahlah': 'arah', + 'pengarahkan': 'arah', + 'pengarahan': 'arah', + 'mengarah': 'arah', + 'mengarahnya': 'arah', + 'mengarahlah': 'arah', + 'mengarahkan': 'arah', + 'mengarahkannya': 'arah', + 'mengarahi': 'arah', + 'mengarahan': 'arah', + 'arah-arah': 'arah', + 'arah-arahnya': 'arah', + 'arah-arahan': 'arah', + 'penyearah': 'arah', + 'pengarahannya': 'arah', + 'pengarahanan': 'arah', + 'keterarahan': 'arah', + 'mengarahkankan': 'arah', + 'mengarahkanku': 'arah', + 'mengarahkanmu': 'arah', + 'menyearahkan': 'arah', + 'mengarah-arahi': 'arah', + 'arakan': 'arak', + 'berarak': 'arak', + 'berarakan': 'rarak', + 'pengarak': 'arak', + 'pengaraknya': 'arak', + 'pengarakan': 'arak', + 'mengarak': 'arak', + 'mengaraknya': 'arak', + 'mengarakan': 'arak', + 'perarakan': 'arak', + 'arak-arakan': 'arak', + 'arak-arakannya': 'arak', + 'berarak-arakan': 'arak', + 'pengaram': 'aram', + 'aram-aram': 'aram', + 'mengarang': 'karang', + 'mengarangnya': 'karang', + 'perarangan': 'arang', + 'pengarangan': 'karang', + 'mengarangkan': 'arang', + 'pengaransemen': 'aransemen', + 'pengaransemenan': 'aransemen', + 'mengaransemen': 'aransemen', + 'mengaras': 'aras', + 'mengarasi': 'aras', + 'mengares': 'ares', + 'berargumen': 'argumen', + 'berargumentasi': 'argumentasi', + 'berargumentasinya': 'argumentasi', + 'mengari': 'ari', + 'seari-arian': 'ari', + 'kearifan': 'arif', + 'kearifannya': 'arif', + 'kearifanlah': 'arif', + 'mengarifi': 'arif', + 'mengarifkan': 'arif', + 'mengarih': 'karih', + 'mengarik': 'arik', + 'mengariknya': 'arik', + 'pengarip': 'arip', + 'beraris': 'aris', + 'berariskan': 'aris', + 'berarisan': 'arisan', + 'mengarit': 'arit', + 'mengaritnya': 'arit', + 'pengarit': 'arit', + 'aronan': 'aron', + 'mengaron': 'aron', + 'kearsipan': 'arsip', + 'kearsipannya': 'arsip', + 'pengarsip': 'arsip', + 'pengarsipan': 'arsip', + 'mengarsipkan': 'arsip', + 'mengarsipkannya': 'arsip', + 'arsiran': 'arsir', + 'mengarsir': 'arsir', + 'artian': 'arti', + 'artiannya': 'arti', + 'artiani': 'arti', + 'searti': 'arti', + 'berarti': 'arti', + 'berartinya': 'arti', + 'berartikan': 'arti', + 'berartii': 'arti', + 'pengartian': 'arti', + 'mengartikan': 'arti', + 'mengartikannya': 'arti', + 'keberartian': 'arti', + 'mengartikelkan': 'artikel', + 'berartikulasi': 'artikulasi', + 'keartisan': 'artis', + 'keartisannya': 'artis', + 'keartistikan': 'artistik', + 'aru-aru': 'aru', + 'mengaruk': 'aruk', + 'mengarukkan': 'aruk', + 'mengarukan': 'karu', + 'mengarun': 'arun', + 'mengaruni': 'arun', + 'arungan': 'arung', + 'mengarung': 'arung', + 'mengarungnya': 'arung', + 'mengarungkan': 'arung', + 'mengarungi': 'karung', + 'mengarunginya': 'karung', + 'pengarungan': 'arung', + 'arung-arungan': 'arung', + 'mengarus': 'arus', + 'mengarusnya': 'arus', + 'mengaruskan': 'arus', + 'mengarwahkan': 'arwah', + 'mengasa': 'asa', + 'mengasalah': 'asa', + 'mengasakan': 'asak', + 'mengasai': 'asa', + 'asa-asaan': 'asa', + 'asahan': 'asah', + 'asahannya': 'asah', + 'berasah': 'asah', + 'mengasah': 'asah', + 'mengasahnya': 'asah', + 'mengasahkan': 'asah', + 'pengasah': 'asah', + 'pengasahan': 'asah', + 'diasak': 'asak', + 'diasakan': 'asak', + 'terasak': 'asak', + 'terasaki': 'asak', + 'terasakan': 'rasa', + 'berasak': 'asak', + 'berasakan': 'rasa', + 'mengasak': 'asak', + 'mengasakkan': 'asak', + 'berasak-asak': 'asak', + 'berasak-asakan': 'asak', + 'berasal': 'asal', + 'berasalnya': 'asal', + 'berasalkan': 'asal', + 'berasalan': 'asal', + 'asalkan': 'asal', + 'asal-asalan': 'asal', + 'asal-asalannya': 'asal', + 'mengasalkan': 'asal', + 'asaman': 'asam', + 'mengasam': 'kasam', + 'mengasamkan': 'kasam', + 'keasaman': 'asam', + 'keasamannya': 'asam', + 'mengasami': 'asam', + 'pengasaman': 'asam', + 'asam-asaman': 'asam', + 'berasap': 'asap', + 'berasapnya': 'asap', + 'mengasap': 'asap', + 'mengasapkan': 'asap', + 'mengasapi': 'asap', + 'perasapan': 'asap', + 'mengasapinya': 'asap', + 'pengasapan': 'asap', + 'berasap-asap': 'asap', + 'berasas': 'asas', + 'berasaskan': 'asas', + 'pengasas': 'asas', + 'mengasaskan': 'asas', + 'beraset': 'aset', + 'asian': 'asi', + 'asiani': 'asi', + 'mengasi': 'asi', + 'mengasinya': 'asi', + 'mengasikan': 'asi', + 'berasimilasi': 'asimilasi', + 'asinan': 'asin', + 'asinannya': 'asin', + 'keasinan': 'asin', + 'mengasini': 'asin', + 'pengasinan': 'asin', + 'mengasinkan': 'asin', + 'terasing': 'asing', + 'terasingnya': 'asing', + 'terasingkan': 'asing', + 'terasingi': 'asing', + 'berasing': 'asing', + 'berasingan': 'asing', + 'mengasing': 'asing', + 'mengasingkan': 'asing', + 'mengasingkannya': 'asing', + 'keasingan': 'asing', + 'perasingan': 'asing', + 'perasingannya': 'asing', + 'pengasingan': 'asing', + 'pengasingannya': 'asing', + 'mengasingkanku': 'asing', + 'berasing-asingan': 'asing', + 'mengasisteni': 'asisten', + 'keaslian': 'asli', + 'keasliannya': 'asli', + 'berasmara': 'asmara', + 'mengaso': 'aso', + 'berasonansi': 'asonansi', + 'pengasong': 'asong', + 'pengasongan': 'asong', + 'mengasong': 'asong', + 'mengasongkan': 'asong', + 'berasosiasi': 'asosiasi', + 'pengasosiasian': 'asosiasi', + 'mengasosiasikan': 'asosiasi', + 'mengasosiasikannya': 'asosiasi', + 'teraspal': 'aspal', + 'teraspalkan': 'aspal', + 'beraspal': 'aspal', + 'pengaspalan': 'aspal', + 'pengaspalannya': 'aspal', + 'beraspirasi': 'aspirasi', + 'berasrama': 'asrama', + 'pengasramaan': 'asrama', + 'mengasramakan': 'asrama', + 'keasrian': 'asri', + 'keasriannya': 'asri', + 'berastakona': 'astakona', + 'asuhan': 'asuh', + 'asuhannya': 'asuh', + 'asuhannyalah': 'asuh', + 'asuhanku': 'asuh', + 'pengasuh': 'asuh', + 'pengasuhnya': 'asuh', + 'pengasuhan': 'asuh', + 'mengasuh': 'asuh', + 'mengasuhnya': 'asuh', + 'mengasuhan': 'asuh', + 'mengasuhku': 'asuh', + 'pengasuhannya': 'asuh', + 'mengasumsikan': 'asumsi', + 'mengasumsikannya': 'asumsi', + 'asungan': 'asung', + 'pengasung': 'asung', + 'mengasung': 'asung', + 'berasuransi': 'asuransi', + 'perasuransian': 'asuransi', + 'perasuransiannya': 'asuransi', + 'pengasuransian': 'asuransi', + 'mengasuransikan': 'asuransi', + 'mengasuransikannya': 'asuransi', + 'keasyikan': 'asyik', + 'keasyikannya': 'asyik', + 'mengasyiki': 'asyik', + 'mengasyikkan': 'asyik', + 'mengasyikkannya': 'asyik', + 'asyik-asyiknya': 'asyik', + 'keasyik-asyikan': 'asyik', + 'mengatak': 'atak', + 'mengatakkan': 'atak', + 'mengatakan': 'kata', + 'pengatakan': 'atak', + 'beratap': 'atap', + 'beratapkan': 'atap', + 'mengatap': 'atap', + 'mengatapkan': 'atap', + 'mengatapi': 'atap', + 'mengatapan': 'atap', + 'pengatapan': 'atap', + 'mengatari': 'atar', + 'atasan': 'atas', + 'atasannya': 'atas', + 'atasanlah': 'atas', + 'atasannyalah': 'atas', + 'atasanku': 'atas', + 'atasanmu': 'atas', + 'teratasi': 'atas', + 'teratasinya': 'atas', + 'teratasilah': 'atas', + 'mengatas': 'atas', + 'mengatasnya': 'atas', + 'mengataskan': 'atas', + 'mengatasi': 'atas', + 'mengatasinya': 'atas', + 'mengatasikan': 'atas', + 'atas-mengatasi': 'atas', + 'mengatasnamakan': 'atas nama', + 'mengatasnamakannya': 'atas nama', + 'ati-ati': 'ati', + 'pengatoman': 'atom', + 'atung-atung': 'atung', + 'aturan': 'atur', + 'aturannya': 'atur', + 'aturanlah': 'atur', + 'beratur': 'atur', + 'beraturan': 'atur', + 'teratur': 'atur', + 'teraturnya': 'atur', + 'teraturlah': 'atur', + 'teraturan': 'atur', + 'pengatur': 'atur', + 'pengaturnya': 'atur', + 'pengaturan': 'atur', + 'mengatur': 'atur', + 'mengaturnya': 'atur', + 'mengaturkan': 'atur', + 'mengaturan': 'atur', + 'peraturan': 'atur', + 'peraturannya': 'atur', + 'peraturanlah': 'atur', + 'beraturannya': 'atur', + 'pengaturannya': 'atur', + 'keteraturan': 'atur', + 'keteraturannya': 'atur', + 'mengatus': 'atus', + 'mengatuskan': 'atus', + 'pengatusan': 'atus', + 'beraudiensi': 'audiensi', + 'pengaudit': 'audit', + 'pengauditan': 'audit', + 'mengaudit': 'audit', + 'mengauditnya': 'audit', + 'mengauditkan': 'audit', + 'mengaum': 'aum', + 'mengaumlah': 'aum', + 'mengaumkan': 'aum', + 'mengaum-aum': 'aum', + 'mengaum-aumkan': 'aum', + 'mengaung': 'aung', + 'mengaungkan': 'aung', + 'mengaur': 'aur', + 'keausan': 'aus', + 'mengaus': 'aus', + 'mengausi': 'kaus', + 'mengauskan': 'aus', + 'mengautopsi': 'autopsi', + 'mengautopsinya': 'autopsi', + 'pengawaair': 'awaair', + 'pengawabau': 'awabau', + 'mengawabekukan': 'awabeku', + 'pengawabusa': 'awabusa', + 'mengawahamakan': 'awahama', + 'berawai': 'awai', + 'terawai': 'awai', + 'mengawai': 'awai', + 'berawak': 'awak', + 'berawaknya': 'awak', + 'berawakkan': 'awak', + 'berawakan': 'rawa', + 'mengawaki': 'awak', + 'mengawakinya': 'awak', + 'perawakan': 'awak', + 'perawakannya': 'awak', + 'perawakanku': 'awak', + 'memperawak': 'awak', + 'pengawakan': 'awak', + 'berperawakan': 'awak', + 'awalan': 'awal', + 'awalannya': 'awal', + 'berawal': 'awal', + 'berawalnya': 'awal', + 'berawalan': 'awal', + 'mengawali': 'kawal', + 'mengawalinya': 'kawal', + 'mengawalilah': 'kawal', + 'mengawalengaskan': 'awalengas', + 'keawaman': 'awam', + 'keawamannya': 'awam', + 'pengawam': 'awam', + 'mengawamkan': 'awam', + 'berawan': 'rawan', + 'berawannya': 'rawan', + 'berawanan': 'rawan', + 'mengawan': 'awan', + 'mengawankan': 'awan', + 'mengawani': 'kawan', + 'perawanan': 'awan', + 'perawanannya': 'awan', + 'awan-berawan': 'awan', + 'awangan': 'awang', + 'berawang': 'awang', + 'mengawang': 'kawang', + 'mengawangi': 'kawang', + 'perawangan': 'awang', + 'awang-awang': 'awang', + 'awang-gemawang': 'awang', + 'awasan': 'awas', + 'awasannya': 'awas', + 'berawas': 'awas', + 'berawasan': 'awas', + 'terawasi': 'awas', + 'terawasinya': 'awas', + 'pengawas': 'awas', + 'pengawasnya': 'awas', + 'pengawaslah': 'awas', + 'pengawasi': 'awas', + 'pengawasan': 'awas', + 'mengawasi': 'awas', + 'mengawasinya': 'awas', + 'mengawasiku': 'awas', + 'mengawasimu': 'awas', + 'pengawasannya': 'awas', + 'pengawasani': 'awas', + 'pengawasanmu': 'awas', + 'mengawaskan': 'awas', + 'berawas-awas': 'awas', + 'mengawat': 'awat', + 'mengawatkan': 'kawat', + 'mengawati': 'awat', + 'pengawawarna': 'awawarna', + 'pengawet': 'awet', + 'pengawetnya': 'awet', + 'pengawetan': 'awet', + 'keawetan': 'awet', + 'keawetannya': 'awet', + 'pengawetannya': 'awet', + 'mengawetkan': 'awet', + 'mengawetkannya': 'awet', + 'pengawinan': 'kawin', + 'mengawur': 'awur', + 'awut-awutan': 'awut', + 'berayah': 'ayah', + 'berayahkan': 'ayah', + 'keayahan': 'ayah', + 'keayahannya': 'ayah', + 'ayakan': 'ayak', + 'ayakannya': 'ayak', + 'mengayak': 'ayak', + 'mengayakan': 'ayak', + 'pengayak': 'ayak', + 'pengayakan': 'ayak', + 'berayal-ayalan': 'ayal', + 'ayam-ayam': 'ayam', + 'ayam-ayamnya': 'ayam', + 'ayam-ayaman': 'ayam', + 'ayapan': 'ayap', + 'mengayap': 'ayap', + 'seayapan': 'ayap', + 'keayapan': 'ayap', + 'ayeng-ayengan': 'ayeng', + 'terayomi': 'ayom', + 'pengayom': 'ayom', + 'pengayoman': 'ayom', + 'mengayomi': 'ayom', + 'mengayominya': 'ayom', + 'pengayomannya': 'ayom', + 'mengayum': 'ayum', + 'ayunan': 'ayun', + 'ayunannya': 'ayun', + 'ayunanan': 'ayun', + 'ayunanmu': 'ayun', + 'berayun': 'ayun', + 'berayunan': 'ayun', + 'mengayun': 'ayun', + 'mengayunnya': 'ayun', + 'mengayunkan': 'ayun', + 'mengayunkannya': 'ayun', + 'ayun-temayun': 'ayun', + 'berayun-ayun': 'ayun', + 'mengayut': 'ayut', + 'ayut-ayutan': 'ayut', + 'mengazab': 'azab', + 'mengazabkan': 'azab', + 'berazam': 'azam', + 'keazaman': 'azam', + 'mengazamkan': 'azam', + 'mengazankan': 'azan', + 'babakan': 'babak', + 'babakannya': 'babak', + 'membabak': 'babak', + 'pembabakan': 'babak', + 'membaban': 'baban', + 'membabani': 'baban', + 'terbabang': 'babang', + 'babaran': 'babar', + 'terbabar': 'babar', + 'membabar': 'babar', + 'kebabaran': 'babar', + 'pembabaran': 'babar', + 'membabarkan': 'babar', + 'membabas': 'babas', + 'membabaskan': 'babas', + 'terbabas': 'babas', + 'sebabat': 'babat', + 'membabat': 'babat', + 'membabatnya': 'babat', + 'membabatkan': 'babat', + 'membabatkannya': 'babat', + 'membabati': 'babat', + 'pembabat': 'babat', + 'pembabatan': 'babat', + 'membabi': 'babi', + 'berbabil': 'babil', + 'pembabil': 'babil', + 'perbabilan': 'babil', + 'terbabit': 'babit', + 'membabitkan': 'babit', + 'kebablasan': 'bablas', + 'kebablasannya': 'bablas', + 'memperbabu': 'babu', + 'bacaan': 'baca', + 'bacaannya': 'baca', + 'bacaanlah': 'baca', + 'pembaca': 'baca', + 'pembacanya': 'baca', + 'pembacalah': 'baca', + 'pembacakan': 'baca', + 'pembacaan': 'baca', + 'pembacaku': 'baca', + 'terbaca': 'baca', + 'terbacanya': 'baca', + 'terbacalah': 'baca', + 'terbacakan': 'baca', + 'terbacaan': 'baca', + 'membaca': 'baca', + 'membacanya': 'baca', + 'membacalah': 'baca', + 'membacakan': 'baca', + 'membacakannya': 'baca', + 'membacaan': 'baca', + 'membacai': 'baca', + 'pembacaannya': 'baca', + 'keterbacaan': 'baca', + 'keterbacaannya': 'baca', + 'membaca-baca': 'baca', + 'membacah': 'bacah', + 'membacah-bacah': 'bacah', + 'baceman': 'bacem', + 'membacem': 'bacem', + 'bacokan': 'bacok', + 'bacokannya': 'bacok', + 'membacok': 'bacok', + 'membacoknya': 'bacok', + 'membacokkan': 'bacok', + 'membacokkannya': 'bacok', + 'membacoki': 'bacok', + 'membacokan': 'bacok', + 'membacokku': 'bacok', + 'pembacok': 'bacok', + 'pembacokkan': 'bacok', + 'pembacokan': 'bacok', + 'kebacut': 'bacut', + 'terbada-bada': 'bada', + 'membadai': 'badai', + 'berbadai': 'badai', + 'terbadai': 'badai', + 'sebadan': 'badan', + 'berbadan': 'badan', + 'berbadankan': 'badan', + 'bersebadan': 'badan', + 'menyebadani': 'badan', + 'bade-bade': 'bade', + 'membadi': 'badi', + 'berbadi': 'badi', + 'membadik': 'badik', + 'kebadungan': 'badung', + 'membadut': 'badut', + 'sebagai': 'bagai', + 'sebagainya': 'bagai', + 'sebagaikan': 'bagai', + 'sebagaii': 'bagai', + 'sebagaian': 'bagai', + 'bagaikan': 'bagai', + 'berbagai': 'bagai', + 'berbagaii': 'bagai', + 'membagaikan': 'bagai', + 'keberbagaian': 'bagai', + 'keberbagaiannya': 'bagai', + 'berbagai-bagai': 'bagai', + 'memperbagai-bagaikan': 'bagai', + 'sebagaimana': 'bagaimana', + 'sebagaimananya': 'bagaimana', + 'membagar': 'bagar', + 'berbagat': 'bagat', + 'berbagati': 'bagat', + 'bagian': 'bagi', + 'bagiannya': 'bagi', + 'bagianku': 'bagi', + 'bagianmu': 'bagi', + 'membagi': 'bagi', + 'membaginya': 'bagi', + 'membagikan': 'bagi', + 'membagikannya': 'bagi', + 'membagian': 'bagi', + 'membagimu': 'bagi', + 'terbagi': 'bagi', + 'terbaginya': 'bagi', + 'terbagilah': 'bagi', + 'terbagikan': 'bagi', + 'berbagi': 'bagi', + 'berbaginya': 'bagi', + 'berbagilah': 'bagi', + 'berbagian': 'bagi', + 'pembagi': 'bagi', + 'pembaginya': 'bagi', + 'pembagikan': 'bagi', + 'pembagian': 'bagi', + 'sebagian': 'bagi', + 'sebagiannya': 'bagi', + 'sebagiani': 'bagi', + 'kebagian': 'bagi', + 'kebagiannya': 'bagi', + 'pembagiannya': 'bagi', + 'membagi-bagikan': 'bagi', + 'membagi-bagikannya': 'bagi', + 'bagongan': 'bagong', + 'membagul': 'bagul', + 'bagusan': 'bagus', + 'terbagus': 'bagus', + 'terbagusnya': 'bagus', + 'kebagusan': 'bagus', + 'membaguskan': 'bagus', + 'memperbagus': 'bagus', + 'berbahagia': 'bahagia', + 'berbahagianya': 'bahagia', + 'berbahagialah': 'bahagia', + 'kebahagiaan': 'bahagia', + 'kebahagiaannya': 'bahagia', + 'kebahagiaanlah': 'bahagia', + 'kebahagiaanku': 'bahagia', + 'kebahagiaanmu': 'bahagia', + 'membahagiakan': 'bahagia', + 'membahagiakannya': 'bahagia', + 'membahagiakanku': 'bahagia', + 'membahagiakanmu': 'bahagia', + 'terbahak-bahak': 'bahak', + 'terbahak-bahaknya': 'bahak', + 'membaham': 'baham', + 'membahami': 'baham', + 'membahan': 'bahan', + 'pembahan': 'bahan', + 'pembahanan': 'bahan', + 'perbahanan': 'bahan', + 'berbahana': 'bahana', + 'membahana': 'bahana', + 'membahananya': 'bahana', + 'membahanakan': 'bahana', + 'terbahana': 'bahana', + 'kebaharian': 'bahari', + 'baharu baru': 'baharu', + 'bahasan': 'bahas', + 'bahasannya': 'bahas', + 'membahas': 'bahas', + 'membahasnya': 'bahas', + 'membahaskan': 'bahas', + 'membahasi': 'bahas', + 'membahasan': 'bahas', + 'pembahas': 'bahas', + 'pembahasnya': 'bahas', + 'pembahasan': 'bahas', + 'pembahasannya': 'bahas', + 'pembahasanan': 'bahas', + 'berbahasan': 'bahas', + 'perbahasan': 'bahas', + 'berbahas-bahasan': 'bahas', + 'berbahasa': 'bahasa', + 'berbahasanya': 'bahasa', + 'berbahasalah': 'bahasa', + 'berbahasamu': 'bahasa', + 'perbahasa': 'bahasa', + 'kebahasaan': 'bahasa', + 'perbahasaan': 'bahasa', + 'membahasakan': 'bahasa', + 'membahasakannya': 'bahasa', + 'memperbahasakan': 'bahasa', + 'berbahasa-bahasa': 'bahasa', + 'berbahaya': 'bahaya', + 'berbahayanya': 'bahaya', + 'berbahayalah': 'bahaya', + 'berbahayakan': 'bahaya', + 'membahayakan': 'bahaya', + 'membahayakannya': 'bahaya', + 'membahu': 'bahu', + 'bahu-membahu': 'bahu', + 'bahu-membahulah': 'bahu', + 'membaiat': 'baiat', + 'membaiatnya': 'baiat', + 'membaiatkan': 'baiat', + 'sebaik': 'baik', + 'sebaiknya': 'baik', + 'sebaiklah': 'baik', + 'sebaikan': 'baik', + 'sebaiknyalah': 'baik', + 'terbaik': 'baik', + 'terbaiknya': 'baik', + 'terbaiklah': 'baik', + 'terbaiki': 'baik', + 'terbaikan': 'baik', + 'terbaiknyalah': 'baik', + 'terbaikku': 'baik', + 'terbaikmu': 'baik', + 'membaik': 'baik', + 'membaiknya': 'baik', + 'membaiklah': 'baik', + 'membaikkan': 'baik', + 'membaiki': 'baik', + 'membaikan': 'baik', + 'berbaik': 'baik', + 'berbaikkan': 'baik', + 'berbaiki': 'baik', + 'berbaikan': 'baik', + 'kebaikan': 'baik', + 'kebaikannya': 'baik', + 'kebaikanku': 'baik', + 'kebaikanmu': 'baik', + 'kebaikan-mu': 'baik', + 'membaikinya': 'baik', + 'baik-baik': 'baik', + 'baik-baiknya': 'baik', + 'baik-baiklah': 'baik', + 'baik-baiki': 'baik', + 'baik-baikan': 'baik', + 'pembaikan': 'baik', + 'perbaikan': 'baik', + 'perbaikannya': 'baik', + 'perbaikanlah': 'baik', + 'memperbaiki': 'baik', + 'memperbaikinya': 'baik', + 'memperbaikii': 'baik', + 'memperbaikian': 'baik', + 'sebaik-baiknya': 'baik', + 'sebaik-baiknyanya': 'baik', + 'berbaik-baikan': 'baik', + 'berbait': 'bait', + 'pembaitan': 'bait', + 'berbait-bait': 'bait', + 'berbaja': 'baja', + 'membaja': 'baja', + 'membajakan': 'bajak', + 'membajai': 'baja', + 'bajakan': 'bajak', + 'bajakannya': 'bajak', + 'pembajak': 'bajak', + 'pembajaknya': 'bajak', + 'pembajaklah': 'bajak', + 'pembajakkan': 'bajak', + 'pembajakkannya': 'bajak', + 'pembajakan': 'bajak', + 'membajak': 'bajak', + 'membajaknya': 'bajak', + 'pembajakannya': 'bajak', + 'membajau': 'bajau', + 'membaji': 'baji', + 'pembajian': 'baji', + 'kebajikan': 'bajik', + 'kebajikannya': 'bajik', + 'bajingan': 'bajing', + 'bajingannya': 'bajing', + 'berbaju': 'baju', + 'berbajukan': 'baju', + 'membajui': 'baju', + 'membajul': 'bajul', + 'berbakak': 'bakak', + 'bakalan': 'bakal', + 'bakalannya': 'bakal', + 'bakalanlah': 'bakal', + 'bakalanan': 'bakal', + 'membakal': 'bakal', + 'membakali': 'bakal', + 'pembakalan': 'bakal', + 'membakalkan': 'bakal', + 'dibakar': 'bakar', + 'dibakarnya': 'bakar', + 'dibakarlah': 'bakar', + 'dibakarkan': 'bakar', + 'dibakari': 'bakar', + 'membakar': 'bakar', + 'membakarnya': 'bakar', + 'membakarkan': 'bakar', + 'membakari': 'bakar', + 'membakaran': 'bakar', + 'membakarku': 'bakar', + 'membakarmu': 'bakar', + 'pembakar': 'bakar', + 'pembakarnya': 'bakar', + 'pembakaran': 'bakar', + 'terbakar': 'bakar', + 'terbakarnya': 'bakar', + 'terbakarlah': 'bakar', + 'kebakaran': 'bakar', + 'kebakarannya': 'bakar', + 'kebakaranlah': 'bakar', + 'kebakaranan': 'bakar', + 'pembakarannya': 'bakar', + 'membakat': 'bakat', + 'berbakat': 'bakat', + 'berbakatnya': 'bakat', + 'membaksi': 'baksi', + 'berbakti': 'bakti', + 'berbaktilah': 'bakti', + 'kebaktian': 'bakti', + 'kebaktiannya': 'bakti', + 'pembaktian': 'bakti', + 'membaktikan': 'bakti', + 'kebakuan': 'baku', + 'pembakuan': 'baku', + 'membakukan': 'baku', + 'berbala-bala': 'bala', + 'membalah': 'balah', + 'berbalah': 'balah', + 'perbalahan': 'balah', + 'pembalakan': 'balak', + 'pembalakannya': 'balak', + 'berbalam': 'balam', + 'membalam': 'balam', + 'balam-balam': 'balam', + 'balapan': 'balap', + 'balapannya': 'balap', + 'balapanan': 'balap', + 'balapanku': 'balap', + 'pembalap': 'balap', + 'pembalapnya': 'balap', + 'pembalaplah': 'balap', + 'pembalapan': 'balap', + 'membalap': 'balap', + 'membalapnya': 'balap', + 'membalaplah': 'balap', + 'membalapku': 'balap', + 'berbalapan': 'balap', + 'membalapkan': 'balap', + 'membalas dendam': 'balas dendam', + 'balasan': 'balas', + 'balasannya': 'balas', + 'balasanan': 'balas', + 'balasanku': 'balas', + 'balasan-mu': 'balas', + 'berbalas': 'balas', + 'berbalasnya': 'balas', + 'berbalasan': 'balas', + 'membalas': 'balas', + 'membalasnya': 'balas', + 'membalaskan': 'balas', + 'membalaskannya': 'balas', + 'membalasi': 'balas', + 'membalasan': 'balas', + 'membalasku': 'balas', + 'pembalas': 'balas', + 'pembalasnya': 'balas', + 'pembalasan': 'balas', + 'pembalasannya': 'balas', + 'pembalasanmu': 'balas', + 'balas-membalas': 'balas', + 'balas-membalasnya': 'balas', + 'balas-berbalas': 'balas', + 'berbalas-balasan': 'balas', + 'balikan': 'balik', + 'balikannya': 'balik', + 'membalik': 'balik', + 'membaliknya': 'balik', + 'membalikkan': 'balik', + 'membalikkannya': 'balik', + 'membalikan': 'balik', + 'berbalik': 'balik', + 'berbaliknya': 'balik', + 'berbaliklah': 'balik', + 'berbalikkan': 'balik', + 'berbalikan': 'balik', + 'terbalik': 'balik', + 'terbaliknya': 'balik', + 'terbalikkan': 'balik', + 'kebalikan': 'balik', + 'kebalikannya': 'balik', + 'membaliki': 'balik', + 'sebaliknya': 'balik', + 'sebaliknyalah': 'balik', + 'pembalikan': 'balik', + 'membalikkanku': 'balik', + 'keterbalikan': 'balik', + 'berbalik-balik': 'balik', + 'membalik-balik': 'balik', + 'membalik-balikkan': 'balik', + 'membalik-balikan': 'balik', + 'berbaling': 'baling', + 'baling-baling': 'baling', + 'baling-balingnya': 'baling', + 'bolang-baling': 'baling', + 'pembalokan': 'balok', + 'baluhan': 'baluh', + 'baluian': 'balui', + 'membalun': 'balun', + 'berbalun-balun': 'balun', + 'berbalung': 'balung', + 'baluran': 'balur', + 'membalur': 'balur', + 'membalurnya': 'balur', + 'membalurkan': 'balur', + 'membalurkannya': 'balur', + 'membaluri': 'balur', + 'balutan': 'balut', + 'balutannya': 'balut', + 'pembalut': 'balut', + 'pembalutnya': 'balut', + 'pembalutan': 'balut', + 'membalut': 'balut', + 'membalutnya': 'balut', + 'membalutkan': 'balut', + 'membaluti': 'balut', + 'balut-balut': 'balut', + 'sebambang': 'bambang', + 'sebambangan': 'bambang', + 'terbambang': 'bambang', + 'bersebambangan': 'bambang', + 'bambungan': 'bambung', + 'membanat': 'banat', + 'bancakan': 'bancak', + 'bancakannya': 'bancak', + 'membancang': 'bancang', + 'membancarkan': 'bancar', + 'kebancian': 'banci', + 'kebanciannya': 'banci', + 'bancuhan': 'bancuh', + 'membancuh': 'bancuh', + 'membancuhkan': 'bancuh', + 'terbancut': 'bancut', + 'bandaran': 'bandar', + 'berbandar': 'bandar', + 'membandar': 'bandar', + 'membandari': 'bandar', + 'perbandaran': 'bandar', + 'membandarkan': 'bandar', + 'kebandaraan': 'bandara', + 'membandel': 'bandel', + 'membandelnya': 'bandel', + 'membandering': 'bandering', + 'bandingan': 'banding', + 'bandingannya': 'banding', + 'bandinganlah': 'banding', + 'bandingankan': 'banding', + 'membanding': 'banding', + 'membandingkan': 'banding', + 'membandingkannya': 'banding', + 'membandingi': 'banding', + 'membandingan': 'banding', + 'pembanding': 'banding', + 'pembandingnya': 'banding', + 'pembandingkan': 'banding', + 'pembandingan': 'banding', + 'berbanding': 'banding', + 'berbandingkan': 'banding', + 'berbandingan': 'banding', + 'pembandingannya': 'banding', + 'perbandingan': 'banding', + 'perbandingannya': 'banding', + 'membandingkankan': 'banding', + 'membandingkanku': 'banding', + 'memperbandingkan': 'banding', + 'memperbandingkannya': 'banding', + 'sebanding': 'banding', + 'membandit': 'bandit', + 'kebanditan': 'bandit', + 'bandulan': 'bandul', + 'membandul': 'bandul', + 'sebandung': 'bandung', + 'membandungi': 'bandung', + 'membandut': 'bandut', + 'pembandut': 'bandut', + 'terbangai': 'bangai', + 'membangatkan': 'bangat', + 'kebangetan': 'banget', + 'kebangetanlah': 'banget', + 'berbangga': 'bangga', + 'berbanggalah': 'bangga', + 'membangga': 'bangga', + 'membanggakan': 'bangga', + 'membanggakannya': 'bangga', + 'kebanggaan': 'bangga', + 'kebanggaannya': 'bangga', + 'kebanggaanlah': 'bangga', + 'kebanggaanku': 'bangga', + 'kebanggaanmu': 'bangga', + 'membangirkan': 'bangir', + 'pembangkang': 'bangkang', + 'pembangkangnya': 'bangkang', + 'pembangkangan': 'bangkang', + 'terbangkang': 'bangkang', + 'membangkang': 'bangkang', + 'membangkangnya': 'bangkang', + 'membangkangi': 'bangkang', + 'pembangkangannya': 'bangkang', + 'membangkar': 'bangkar', + 'bangkitan': 'bangkit', + 'bangkitannya': 'bangkit', + 'berbangkit': 'bangkit', + 'terbangkit': 'bangkit', + 'terbangkitnya': 'bangkit', + 'terbangkitkan': 'bangkit', + 'pembangkit': 'bangkit', + 'pembangkitnya': 'bangkit', + 'pembangkitkan': 'bangkit', + 'pembangkiti': 'bangkit', + 'pembangkitan': 'bangkit', + 'membangkit': 'bangkit', + 'membangkitnya': 'bangkit', + 'membangkitkan': 'bangkit', + 'membangkitkannya': 'bangkit', + 'membangkitan': 'bangkit', + 'kebangkitan': 'bangkit', + 'kebangkitannya': 'bangkit', + 'kebangkitanan': 'bangkit', + 'membangkit-bangkit': 'bangkit', + 'membangkit-bangkitkan': 'bangkit', + 'bangkotan': 'bangkot', + 'kebangkrutan': 'bangkrut', + 'kebangkrutannya': 'bangkrut', + 'membangkrutkan': 'bangkrut', + 'sebangsa': 'bangsa', + 'sebangsanya': 'bangsa', + 'sebangsaku': 'bangsa', + 'membangsa': 'bangsa', + 'membangsakan': 'bangsa', + 'berbangsa': 'bangsa', + 'kebangsaan': 'bangsa', + 'kebangsaannya': 'bangsa', + 'kebangsaanlah': 'bangsa', + 'kebangsaanku': 'bangsa', + 'kebangsawanan': 'bangsawan', + 'kebangsawanannya': 'bangsawan', + 'kebangsawananan': 'bangsawan', + 'bangunan': 'bangun', + 'bangunannya': 'bangun', + 'bangunanlah': 'bangun', + 'bangunanan': 'bangun', + 'bangunanku': 'bangun', + 'membangun': 'bangun', + 'membangunnya': 'bangun', + 'membangunkan': 'bangun', + 'membangunkannya': 'bangun', + 'membanguni': 'bangun', + 'membangunan': 'bangun', + 'pembangun': 'bangun', + 'pembangunnya': 'bangun', + 'pembangunan': 'bangun', + 'kebangunan': 'bangun', + 'pembangunannya': 'bangun', + 'pembangunanlah': 'bangun', + 'pembangunankan': 'bangun', + 'pembangunanan': 'bangun', + 'membangunkanku': 'bangun', + 'membangunkanmu': 'bangun', + 'bangun-bangun': 'bangun', + 'bangun-bangunan': 'bangun', + 'membaning': 'baning', + 'berbanir': 'banir', + 'sebanjar': 'banjar', + 'banjaran': 'banjar', + 'banjarani': 'banjar', + 'berbanjar': 'banjar', + 'berbanjaran': 'banjar', + 'membanjarkan': 'banjar', + 'berbanjar-banjar': 'banjar', + 'membanjir': 'banjir', + 'membanjirnya': 'banjir', + 'membanjirlah': 'banjir', + 'membanjirkan': 'banjir', + 'membanjiri': 'banjir', + 'membanjirinya': 'banjir', + 'membanjirimu': 'banjir', + 'kebanjiran': 'banjir', + 'membanjur': 'banjur', + 'perbankan': 'bank', + 'perbankannya': 'bank', + 'perbankanlah': 'bank', + 'perbankankan': 'bank', + 'perbankanan': 'bank', + 'perbankanmu': 'bank', + 'bantahan': 'bantah', + 'bantahannya': 'bantah', + 'membantah': 'bantah', + 'membantahnya': 'bantah', + 'membantahkan': 'bantah', + 'membantahan': 'bantah', + 'membantahmu': 'bantah', + 'berbantah': 'bantah', + 'berbantahan': 'bantah', + 'pembantah': 'bantah', + 'pembantahnya': 'bantah', + 'pembantahan': 'bantah', + 'membantahi': 'bantah', + 'perbantahan': 'bantah', + 'terbantahkan': 'bantah', + 'terbantahkannya': 'bantah', + 'bantah-bantah': 'bantah', + 'bantah-bantahan': 'bantah', + 'memperbantahkan': 'bantah', + 'berbantah-bantah': 'bantah', + 'berbantah-bantahan': 'bantah', + 'bantaian': 'bantai', + 'membantai': 'bantai', + 'membantainya': 'bantai', + 'membantaimu': 'bantai', + 'pembantai': 'bantai', + 'pembantaian': 'bantai', + 'pembantaiannya': 'bantai', + 'bantalan': 'bantal', + 'bantalannya': 'bantal', + 'berbantal': 'bantal', + 'berbantalkan': 'bantal', + 'berbantalan': 'bantal', + 'membantalkan': 'bantal', + 'memperbantal': 'bantal', + 'bantal-bantal': 'bantal', + 'pembantar': 'bantar', + 'pembantaran': 'bantar', + 'membantar': 'bantar', + 'membantarkan': 'bantar', + 'membanter': 'banter', + 'bantingan': 'banting', + 'bantingannya': 'banting', + 'membanting': 'banting', + 'membantingnya': 'banting', + 'membantingkan': 'banting', + 'membantingkannya': 'banting', + 'pembantingan': 'banting', + 'bantuan': 'bantu', + 'bantuannya': 'bantu', + 'bantuanlah': 'bantu', + 'bantuanku': 'bantu', + 'bantuanmu': 'bantu', + 'pembantu': 'bantu', + 'pembantunya': 'bantu', + 'pembantukan': 'bantu', + 'pembantuan': 'bantu', + 'pembantuku': 'bantu', + 'pembantumu': 'bantu', + 'membantu': 'bantu', + 'membantunya': 'bantu', + 'membantulah': 'bantu', + 'membantukan': 'bantu', + 'membantui': 'bantu', + 'membantuan': 'bantu', + 'membantuku': 'bantu', + 'membantumu': 'bantu', + 'memperbantukan': 'bantu', + 'sebantun': 'bantun', + 'membantun': 'bantun', + 'membantunnya': 'bantun', + 'terbantun': 'bantun', + 'membantuni': 'bantun', + 'membantut': 'bantut', + 'terbantut': 'bantut', + 'sebanyak': 'banyak', + 'sebanyaknya': 'banyak', + 'sebanyaki': 'banyak', + 'sebanyakan': 'banyak', + 'banyakan': 'banyak', + 'banyakannya': 'banyak', + 'membanyak': 'banyak', + 'terbanyak': 'banyak', + 'terbanyaknya': 'banyak', + 'terbanyaklah': 'banyak', + 'terbanyaki': 'banyak', + 'berbanyak': 'banyak', + 'membanyaki': 'banyak', + 'kebanyakan': 'banyak', + 'kebanyakannya': 'banyak', + 'perbanyakan': 'banyak', + 'perbanyakannya': 'banyak', + 'membanyakkan': 'banyak', + 'memperbanyak': 'banyak', + 'memperbanyaknya': 'banyak', + 'memperbanyakan': 'banyak', + 'banyak-banyak': 'banyak', + 'banyak-banyaknya': 'banyak', + 'banyak-banyaklah': 'banyak', + 'banyak-banyakkan': 'banyak', + 'banyak-banyakan': 'banyak', + 'memperbanyakkan': 'banyak', + 'berbanyak-banyak': 'banyak', + 'banyolan': 'banyol', + 'banyolannya': 'banyol', + 'membanyol': 'banyol', + 'berbapak': 'bapak', + 'kebapakan': 'bapak', + 'kebapakannya': 'bapak', + 'pembaptis': 'baptis', + 'pembaptisan': 'baptis', + 'membaptis': 'baptis', + 'membaptisnya': 'baptis', + 'membaptiskan': 'baptis', + 'pembaptisannya': 'baptis', + 'membara': 'bara', + 'membaranya': 'bara', + 'membarakan': 'bara', + 'perbaraan': 'bara', + 'membarah': 'barah', + 'membarak': 'barak', + 'pembarap': 'barap', + 'baratan': 'barat', + 'pembarat': 'barat', + 'pembaratan': 'barat', + 'membaratkan': 'barat', + 'kebarat-baratan': 'barat', + 'berbareng': 'bareng', + 'berbarengan': 'bareng', + 'membarengi': 'bareng', + 'membarenginya': 'bareng', + 'berbarengannya': 'bareng', + 'membarengkan': 'bareng', + 'barik-barik': 'barik', + 'berbarik-barik': 'barik', + 'terbaring': 'baring', + 'terbaringnya': 'baring', + 'berbaring': 'baring', + 'berbaringnya': 'baring', + 'berbaringlah': 'baring', + 'berbaringan': 'baring', + 'pembaringan': 'baring', + 'pembaringannya': 'baring', + 'membaringkan': 'baring', + 'membaringkannya': 'baring', + 'barisan': 'baris', + 'barisannya': 'baris', + 'barisanan': 'baris', + 'sebaris': 'baris', + 'sebarisan': 'baris', + 'berbaris': 'baris', + 'berbarisnya': 'baris', + 'membaris': 'baris', + 'membariskan': 'baris', + 'membariskannya': 'baris', + 'baris-berbaris': 'baris', + 'barongan': 'barong', + 'barong tagalog': 'barong', + 'terbaru': 'baru', + 'terbarunya': 'baru', + 'terbarulah': 'baru', + 'terbarukan': 'baru', + 'terbarukannya': 'baru', + 'terbarui': 'baru', + 'terbaruku': 'baru', + 'pembaru': 'baru', + 'pembarunya': 'baru', + 'pembaruan': 'baru', + 'membaru': 'baru', + 'membarui': 'baru', + 'kebaruan': 'baru', + 'kebaruannya': 'baru', + 'membaruinya': 'baru', + 'pembaruannya': 'baru', + 'membarukan': 'baru', + 'memperbarui': 'baru', + 'memperbaruinya': 'baru', + 'baru-baru ini': 'baru', + 'pembarut': 'barut', + 'berbarut': 'barut', + 'membarut': 'barut', + 'pembarutan': 'barut', + 'membarutkan': 'barut', + 'membarut-barut': 'barut', + 'berbasa-basi': 'basa-basi', + 'basahan': 'basah', + 'basahannya': 'basah', + 'membasahi': 'basah', + 'membasahinya': 'basah', + 'pembasahan': 'basah', + 'pembasahannya': 'basah', + 'membasahkan': 'basah', + 'berbasah-basah': 'basah', + 'berbasah-basahan': 'basah', + 'kebasah-basahan': 'basah', + 'membasi': 'basi', + 'kebasian': 'basi', + 'membasikan': 'basi', + 'berbasiskan': 'basis', + 'albasit': 'basit', + 'pembasmi': 'basmi', + 'pembasmian': 'basmi', + 'terbasmi': 'basmi', + 'membasmi': 'basmi', + 'membasminya': 'basmi', + 'pembasmiannya': 'basmi', + 'basuhan': 'basuh', + 'pembasuh': 'basuh', + 'pembasuhan': 'basuh', + 'membasuh': 'basuh', + 'membasuhnya': 'basuh', + 'membasuhkan': 'basuh', + 'membasuhkannya': 'basuh', + 'membasuhi': 'basuh', + 'basungan': 'basung', + 'membasung': 'basung', + 'berbasut': 'basut', + 'membasut': 'basut', + 'terbata-bata': 'bata-bata', + 'kebata-bataan': 'bata-bata', + 'membatak': 'batak', + 'membatakkan': 'batak', + 'membatakkannya': 'batak', + 'membatakan': 'batak', + 'pembatak': 'batak', + 'pembatakan': 'batak', + 'pembatalan': 'batal', + 'pembatalannya': 'batal', + 'membatalkan': 'batal', + 'membatalkannya': 'batal', + 'membatalkankan': 'batal', + 'batangan': 'batang', + 'batangannya': 'batang', + 'batanganmu': 'batang', + 'sebatang': 'batang', + 'sebatangnya': 'batang', + 'membatang': 'batang', + 'batasan': 'batas', + 'batasannya': 'batas', + 'pembatas': 'batas', + 'pembatasnya': 'batas', + 'pembatasi': 'batas', + 'pembatasan': 'batas', + 'berbatas': 'batas', + 'berbataskan': 'batas', + 'berbatasan': 'batas', + 'membatas': 'batas', + 'membataskan': 'batas', + 'membatasi': 'batas', + 'membatasan': 'batas', + 'terbatas': 'batas', + 'terbatasnya': 'batas', + 'terbataslah': 'batas', + 'terbataskan': 'batas', + 'terbatasi': 'batas', + 'terbatasan': 'batas', + 'membatasinya': 'batas', + 'pembatasannya': 'batas', + 'pembatasanlah': 'batas', + 'perbatasan': 'batas', + 'perbatasannya': 'batas', + 'perbatasanlah': 'batas', + 'perbatasanan': 'batas', + 'keterbatasan': 'batas', + 'keterbatasannya': 'batas', + 'keterbatasanku': 'batas', + 'sebati': 'bati', + 'sebatian': 'bati', + 'batikan': 'batik', + 'batikannya': 'batik', + 'pembatik': 'batik', + 'pembatiknya': 'batik', + 'pembatikan': 'batik', + 'membatik': 'batik', + 'membatiknya': 'batik', + 'membatikkan': 'batik', + 'membatiki': 'batik', + 'pembatikannya': 'batik', + 'membatin': 'batin', + 'membatinkan': 'batin', + 'berbatin': 'batin', + 'kebatinan': 'batin', + 'kebatinannya': 'batin', + 'pembatubaraan': 'batu bara', + 'batuan': 'batu', + 'batuannya': 'batu', + 'membatu': 'batu', + 'membatunya': 'batu', + 'membatumu': 'batu', + 'berbatu': 'batu', + 'berbatuan': 'batu', + 'membatui': 'batu', + 'pembatuan': 'batu', + 'berbatu-batu': 'batu', + 'berbatu-batuan': 'batu', + 'berbatuk': 'batuk', + 'batuk-batuk': 'batuk', + 'batuk-batuknya': 'batuk', + 'membatukkan': 'batuk', + 'membatukkannya': 'batuk', + 'terbatuk-batuk': 'batuk', + 'batung-batung': 'batung', + 'sebau': 'bau', + 'berbau': 'bau', + 'berbaunya': 'bau', + 'terbau': 'bau', + 'terbaunya': 'bau', + 'terbaukan': 'bau', + 'membaui': 'bau', + 'membauinya': 'bau', + 'bau-bauan': 'bau', + 'bauksit': 'bauk', + 'bauksitnya': 'bauk', + 'membauni': 'baun', + 'bauran': 'baur', + 'baurannya': 'baur', + 'membaur': 'baur', + 'membaurnya': 'baur', + 'membaurlah': 'baur', + 'membaurkan': 'baur', + 'membaurkannya': 'baur', + 'terbaur': 'baur', + 'terbaurnya': 'baur', + 'berbaur': 'baur', + 'berbaurnya': 'baur', + 'berbaurlah': 'baur', + 'perbauran': 'baur', + 'pembauran': 'baur', + 'pembaurannya': 'baur', + 'memperbaurkan': 'baur', + 'bawaan': 'bawa', + 'bawaannya': 'bawa', + 'bawaanku': 'bawa', + 'bawaanmu': 'bawa', + 'terbawa': 'bawa', + 'terbawanya': 'bawa', + 'terbawalah': 'bawa', + 'pembawa': 'bawa', + 'pembawanya': 'bawa', + 'pembawaan': 'bawa', + 'membawa': 'bawa', + 'membawanya': 'bawa', + 'membawakan': 'bawa', + 'membawakannya': 'bawa', + 'membawai': 'bawa', + 'membawaku': 'bawa', + 'membawamu': 'bawa', + 'berbawaan': 'bawa', + 'pembawaannya': 'bawa', + 'sepembawa': 'bawa', + 'membawakanku': 'bawa', + 'membawa-bawa': 'bawa', + 'membawa-bawanya': 'bawa', + 'berpembawaan': 'bawa', + 'bawahan': 'bawah', + 'bawahannya': 'bawah', + 'bawahanlah': 'bawah', + 'bawahanku': 'bawah', + 'bawahanmu': 'bawah', + 'sebawah': 'bawah', + 'di bawah': 'bawah', + 'terbawah': 'bawah', + 'terbawahnya': 'bawah', + 'terbawahlah': 'bawah', + 'sebawahan': 'bawah', + 'membawahi': 'bawah', + 'membawahinya': 'bawah', + 'membawahkan': 'bawah', + 'membawang': 'bawang', + 'berbawang': 'bawang', + 'pembawang': 'bawang', + 'membawangi': 'bawang', + 'sebaya': 'baya', + 'sebayanya': 'baya', + 'sebayaku': 'baya', + 'terbayan': 'bayan', + 'membayankan': 'bayan', + 'bayangan': 'bayang', + 'bayangannya': 'bayang', + 'bayangankan': 'bayang', + 'bayanganku': 'bayang', + 'bayanganmu': 'bayang', + 'terbayang': 'bayangan', + 'terbayangnya': 'bayangan', + 'terbayanglah': 'bayangan', + 'terbayangkan': 'bayangan', + 'terbayangi': 'bayangan', + 'membayang': 'bayangan', + 'membayangnya': 'bayangan', + 'membayangkan': 'bayangan', + 'membayangkannya': 'bayangan', + 'membayangi': 'bayangan', + 'membayangan': 'bayangan', + 'berbayang': 'bayang', + 'membayanginya': 'bayang', + 'membayangii': 'bayang', + 'pembayangan': 'bayangan', + 'bayang-bayang': 'bayangan', + 'bayang-bayangnya': 'bayangan', + 'bayang-bayangi': 'bayangan', + 'bayang-bayangku': 'bayangan', + 'bayang-bayangmu': 'bayangan', + 'berbayang-bayang': 'bayang', + 'terbayang-bayang': 'bayangan', + 'terbayang-bayangi': 'bayangan', + 'membayang-bayangi': 'bayangan', + 'membayang-bayanginya': 'bayangan', + 'membayang-bayangkan': 'bayang', + 'bayaran': 'bayar', + 'bayarannya': 'bayar', + 'berbayar': 'bayar', + 'berbayarnya': 'bayar', + 'berbayarkan': 'bayar', + 'berbayaran': 'bayar', + 'membayar': 'bayar', + 'membayarnya': 'bayar', + 'membayarkan': 'bayar', + 'membayarkannya': 'bayar', + 'membayari': 'bayar', + 'membayaran': 'bayar', + 'membayarnyalah': 'bayar', + 'membayarku': 'bayar', + 'membayarmu': 'bayar', + 'pembayar': 'bayar', + 'pembayarnya': 'bayar', + 'pembayarkan': 'bayar', + 'pembayaran': 'bayar', + 'membayarinya': 'bayar', + 'pembayarannya': 'bayar', + 'pembayaranan': 'bayar', + 'kebayi-bayian': 'bayi', + 'membayonet': 'bayonet', + 'membayong': 'bayong', + 'bayuan': 'bayu', + 'kebayuan': 'bayu', + 'pembayun': 'bayun', + 'membea': 'bea', + 'kebebalan': 'bebal', + 'kebebalannya': 'bebal', + 'membebani': 'beban', + 'membebaninya': 'beban', + 'membebaniku': 'beban', + 'membebanimu': 'beban', + 'pembebanan': 'beban', + 'pembebanannya': 'beban', + 'membebankan': 'beban', + 'membebankannya': 'beban', + 'terbebang': 'bebang', + 'kebebangan': 'bebang', + 'berbebar': 'bebar', + 'terbebar': 'bebar', + 'pembebas': 'bebas', + 'pembebaskan': 'bebas', + 'pembebasan': 'bebas', + 'terbebas': 'bebas', + 'terbebasnya': 'bebas', + 'terbebaskan': 'bebas', + 'kebebasan': 'bebas', + 'kebebasannya': 'bebas', + 'kebebasanku': 'bebas', + 'kebebasanmu': 'bebas', + 'pembebasannya': 'bebas', + 'membebaskan': 'bebas', + 'membebaskannya': 'bebas', + 'membebaskanku': 'bebas', + 'membebaskanmu': 'bebas', + 'membebasmurnikan': 'bebas murni', + 'membebastugaskan': 'bebas tugas', + 'membebastugaskannya': 'bebas tugas', + 'membebat': 'bebat', + 'membebatnya': 'bebat', + 'membebatkan': 'bebat', + 'pembebat': 'bebat', + 'pembebatan': 'bebat', + 'pembebek': 'bebek', + 'membebek': 'bebek', + 'membebekan': 'bebek', + 'beberan': 'beber', + 'membeber': 'beber', + 'membebernya': 'beber', + 'membeberkan': 'beber', + 'membeberkannya': 'beber', + 'membeberan': 'beber', + 'pembeberan': 'beber', + 'pembeberannya': 'beber', + 'seberapa': 'beberapa', + 'seberapanya': 'beberapa', + 'buyutan': 'buyut', + 'buyutannya': 'buyut', + 'bebuyutan': 'buyut', + 'bebuyutannya': 'buyut', + 'kebuyutan': 'buyut', + 'berbecak-becak': 'becak', + 'berbeda': 'beda', + 'berbedanya': 'beda', + 'berbedalah': 'beda', + 'berbedai': 'beda', + 'berbedaan': 'beda', + 'pembeda': 'beda', + 'pembedanya': 'beda', + 'pembedakan': 'beda', + 'pembedaan': 'beda', + 'pembedaannya': 'beda', + 'berbedaannya': 'beda', + 'perbedaan': 'beda', + 'perbedaannya': 'beda', + 'perbedaanlah': 'beda', + 'membedakan': 'beda', + 'membedakannya': 'beda', + 'membedakanlah': 'beda', + 'membedakanmu': 'beda', + 'berbeda-beda': 'beda', + 'berbeda-bedanya': 'beda', + 'memperbedakan': 'beda', + 'terbeda-bedakan': 'beda', + 'membeda-bedakan': 'beda', + 'membeda-bedakannya': 'beda', + 'membeda-bedakanmu': 'beda', + 'membedah': 'bedah', + 'membedahnya': 'bedah', + 'membedahkan': 'bedah', + 'pembedah': 'bedah', + 'pembedahan': 'bedah', + 'pembedahannya': 'bedah', + 'berbedak': 'bedak', + 'membedaki': 'bedak', + 'membedakkan': 'bedak', + 'membedal': 'bedal', + 'membedel': 'bedel', + 'membedil': 'bedil', + 'membedilnya': 'bedil', + 'berbedil': 'bedil', + 'membedili': 'bedil', + 'sepembedil': 'bedil', + 'bedil-bedal': 'bedil', + 'bedil-bedilan': 'bedil', + 'berbedil-bedilan': 'bedil', + 'bedolan': 'bedol', + 'terbedol': 'bedol', + 'membedol': 'bedol', + 'pembedolan': 'bedol', + 'bedungan': 'bedung', + 'membedung': 'bedung', + 'berbega': 'bega', + 'berbegai': 'bega', + 'membega': 'bega', + 'berbega-bega': 'bega', + 'membegal': 'begal', + 'membegalnya': 'begal', + 'pembegalan': 'begal', + 'pembegalannya': 'begal', + 'membegar': 'begar', + 'kebegaran': 'begar', + 'sebegini': 'begini', + 'sebegininya': 'begini', + 'beginian': 'begini', + 'membeginikan': 'begini', + 'begituan': 'begitu', + 'begituanlah': 'begitu', + 'sebegitu': 'begitu', + 'sebegitunya': 'begitu', + 'sebegitunyalah': 'begitu', + 'membegitukan': 'begitu', + 'membehandel': 'behandel', + 'kebejatan': 'bejat', + 'kebejatannya': 'bejat', + 'membejatkan': 'bejat', + 'membeka': 'beka', + 'berbeka': 'beka', + 'terbeka': 'beka', + 'berbeka-beka': 'beka', + 'berbekal': 'bekal', + 'berbekalkan': 'bekal', + 'pembekal': 'bekal', + 'pembekalan': 'bekal', + 'membekali': 'bekal', + 'membekalinya': 'bekal', + 'membekalimu': 'bekal', + 'perbekalan': 'bekal', + 'perbekalannya': 'bekal', + 'pembekalannya': 'bekal', + 'membekalkan': 'bekal', + 'bekal-bekalan': 'bekal', + 'pembekam': 'bekam', + 'pembekaman': 'bekam', + 'membekam': 'bekam', + 'membekap': 'bekap', + 'membekapnya': 'bekap', + 'membekapkan': 'bekap', + 'berbekas': 'bekas', + 'membekas': 'bekas', + 'membekasnya': 'bekas', + 'membekaskan': 'bekas', + 'kebekenan': 'beken', + 'bekerja': 'kerja', + 'bekerjanya': 'kerja', + 'bekerjalah': 'kerja', + 'bekerjakan': 'kerja', + 'bekerjai': 'kerja', + 'bekerjaan': 'kerja', + 'bekerjamu': 'kerja', + 'pekerja': 'kerja', + 'pekerjanya': 'kerja', + 'pekerjalah': 'kerja', + 'pekerjakan': 'kerja', + 'pekerjaan': 'kerja', + 'pekerjaku': 'kerja', + 'pekerjamu': 'kerja', + 'sekerja': 'kerja', + 'sekerjanya': 'kerja', + 'pekerjaannya': 'kerja', + 'pekerjaanlah': 'kerja', + 'pekerjaanku': 'kerja', + 'pekerjaanmu': 'kerja', + 'pengerjaan': 'kerja', + 'pengerjaannya': 'kerja', + 'tekerjakan': 'kerja', + 'mengerjakan': 'kerja', + 'mengerjakannya': 'kerja', + 'mengerjakankan': 'kerja', + 'sepekerjaan': 'kerja', + 'sepekerjaannya': 'kerja', + 'mempekerjakan': 'kerja', + 'mempekerjakannya': 'kerja', + 'mempekerjakanku': 'kerja', + 'mempekerjakanmu': 'kerja', + 'bekuan': 'beku', + 'bekuannya': 'beku', + 'membeku': 'beku', + 'membekunya': 'beku', + 'membekukan': 'beku', + 'membekukannya': 'beku', + 'membekuan': 'beku', + 'pembeku': 'beku', + 'pembekukan': 'beku', + 'pembekuan': 'beku', + 'kebekuan': 'beku', + 'kebekuannya': 'beku', + 'pembekuannya': 'beku', + 'membekuk': 'bekuk', + 'membekuknya': 'bekuk', + 'membekukkan': 'bekuk', + 'mengebel': 'bel', + 'membela': 'bela', + 'membelanya': 'bela', + 'membelai': 'bela', + 'membelaku': 'bela', + 'membelamu': 'bela', + 'pembela': 'bela', + 'pembelanya': 'bela', + 'pembelakan': 'bela', + 'pembelaan': 'bela', + 'pembelamu': 'bela', + 'pembelaannya': 'bela', + 'pembelaanku': 'bela', + 'belahan': 'belah', + 'belahannya': 'belah', + 'sebelah': 'belah', + 'sebelahnya': 'belah', + 'sebelahan': 'belah', + 'sebelahku': 'belah', + 'sebelahmu': 'belah', + 'pembelah': 'belah', + 'pembelahan': 'belah', + 'membelah': 'belah', + 'membelahnya': 'belah', + 'berbelah': 'belah', + 'berbelahan': 'belah', + 'menyebelah': 'belah', + 'pembelahannya': 'belah', + 'menyebelahi': 'belah', + 'bersebelahan': 'belah', + 'bersebelahanlah': 'belah', + 'menyebelahkan': 'belah', + 'berbelah-belah': 'belah', + 'sebelah-menyebelah': 'belah', + 'terbelahak': 'belahak', + 'membelahak': 'belahak', + 'belaian': 'belai', + 'belaiannya': 'belai', + 'membelainya': 'belai', + 'membelai-belai': 'belai', + 'membelai-belainya': 'belai', + 'belakangan': 'belakang', + 'belakangannya': 'belakang', + 'belakanganlah': 'belakang', + 'belakanganan': 'belakang', + 'membelakang': 'belakang', + 'membelakangkan': 'belakang', + 'membelakangi': 'belakang', + 'terbelakang': 'belakang', + 'terbelakangnya': 'belakang', + 'terbelakangan': 'belakang', + 'ke belakang': 'belakang', + 'membelakanginya': 'belakang', + 'terkebelakang': 'belakang', + 'pembelakangan': 'belakang', + 'keterbelakangan': 'belakang', + 'keterbelakangannya': 'belakang', + 'mengebelakangkan': 'belakang', + 'memperbelakangkan': 'belakang', + 'berbelakang-belakangan': 'belakang', + 'belalakan': 'belalak', + 'membelalak': 'belalak', + 'membelalakkan': 'belalak', + 'membelalakan': 'belalak', + 'terbelalak': 'belalak', + 'membelalang': 'belalang', + 'membelalangkan': 'belalang', + 'terbelam': 'belam', + 'membelam': 'belam', + 'membelandakan': 'belanda', + 'kebelanda-belandaan': 'belanda', + 'membelandang': 'belandang', + 'membelandangkan': 'belandang', + 'belandongan': 'belandong', + 'pembelandongan': 'belandong', + 'berbelang-belang': 'belang', + 'sebelanga': 'belanga', + 'terbelangah': 'langah', + 'belangiran': 'belangir', + 'belanjaan': 'belanja', + 'belanjaannya': 'belanja', + 'belanjaanku': 'belanja', + 'belanjaanmu': 'belanja', + 'berbelanja': 'belanja', + 'berbelanjanya': 'belanja', + 'berbelanjalah': 'belanja', + 'berbelanjaan': 'belanja', + 'berbelanjaku': 'belanja', + 'membelanjai': 'belanja', + 'pembelanjaan': 'belanja', + 'pembelanjaannya': 'belanja', + 'perbelanjaan': 'belanja', + 'perbelanjaannya': 'belanja', + 'perbelanjaanlah': 'belanja', + 'perbelanjaanmu': 'belanja', + 'membelanjakan': 'belanja', + 'membelanjakannya': 'belanja', + 'membelar': 'belar', + 'selar-belar': 'belar', + 'belasan': 'belas', + 'belasannya': 'belas', + 'belasanlah': 'belas', + 'sebelas': 'belas', + 'sebelasnya': 'belas', + 'sebelasan': 'belas', + 'pembelas': 'belas', + 'pembelasan': 'belas', + 'membelaskan': 'belas', + 'kesebelasan': 'belas', + 'kesebelasannya': 'belas', + 'berbelaskasihan': 'belas', + 'membelasah': 'belasah', + 'berbelasungkawa': 'belasungkawa', + 'membelasut': 'belasut', + 'membelat': 'belat', + 'membelau': 'belau', + 'kebelauan': 'belau', + 'berbelau-belauan': 'belau', + 'membelek': 'belek', + 'terbelelang': 'belelang', + 'membelendung': 'belendung', + 'terbelenggu': 'belenggu', + 'terbelenggunya': 'belenggu', + 'membelenggu': 'belenggu', + 'membelenggunya': 'belenggu', + 'membelengketkan': 'belengket', + 'membelenting': 'belenting', + 'membelentingkan': 'belenting', + 'belian': 'beli', + 'beliannya': 'beli', + 'beliani': 'beli', + 'terbeli': 'beli', + 'terbelinya': 'beli', + 'membeli': 'beli', + 'membelinya': 'beli', + 'membelikan': 'beli', + 'membelikannya': 'beli', + 'membelian': 'beli', + 'membeliku': 'beli', + 'membelimu': 'beli', + 'pembeli': 'beli', + 'pembelinya': 'beli', + 'pembelilah': 'beli', + 'pembelikan': 'beli', + 'pembelii': 'beli', + 'pembelian': 'beli', + 'pembeliannya': 'beli', + 'pembelianku': 'beli', + 'pembelianmu': 'beli', + 'membelikanku': 'beli', + 'membelikanmu': 'beli', + 'membeli-beli': 'beli', + 'berbeli-beli': 'beli', + 'berbeli-belian': 'beli', + 'kebeliaan': 'belia', + 'terbeliak': 'beliak', + 'membeliak': 'beliak', + 'membeliakkan': 'beliak', + 'berbelian': 'belian', + 'beliau-beliau': 'beliau', + 'beliau-beliaulah': 'beliau', + 'belimbingan': 'belimbing', + 'berbelimbing': 'belimbing', + 'terbelingkang': 'belingkang', + 'belingsatan': 'belingsat', + 'terbelingut': 'belingut', + 'terbelintang': 'belintang', + 'berbelintang': 'belintang', + 'berbelintangan': 'belintang', + 'membelintangkan': 'belintang', + 'terbelit': 'belit', + 'terbelitnya': 'belit', + 'berbelit': 'belit', + 'berbelitnya': 'belit', + 'membelit': 'belit', + 'membelitnya': 'belit', + 'membelitkan': 'belit', + 'berbelit-belit': 'belit', + 'berbelit-belitnya': 'belit', + 'berbelit-belitlah': 'belit', + 'membelit-belitkan': 'belit', + 'belokan': 'belok', + 'belokannya': 'belok', + 'belokanku': 'belok', + 'membelok': 'belok', + 'membeloknya': 'belok', + 'membelokkan': 'belok', + 'membelokkannya': 'belok', + 'membelokan': 'belok', + 'berbelok': 'belok', + 'berbeloknya': 'belok', + 'berbeloklah': 'belok', + 'berbelokkan': 'belok', + 'pembelokan': 'belok', + 'berbelok-belok': 'belok', + 'berbelon': 'belon', + 'belongkotan': 'belongkot', + 'berbelongsong': 'belongsong', + 'membelongsongi': 'belongsong', + 'membelontang': 'belontang', + 'pembelot': 'belot', + 'pembelotnya': 'belot', + 'pembelotan': 'belot', + 'membelot': 'belot', + 'membelotnya': 'belot', + 'membelotkan': 'belot', + 'pembelotannya': 'belot', + 'membelu': 'belu', + 'membelu-belai': 'belu-belai', + 'membeludak': 'beludak', + 'membeludaknya': 'beludak', + 'membelukar': 'belukar', + 'berbelulang': 'belulang', + 'sebelum': 'belum', + 'sebelumnya': 'belum', + 'sebelumi': 'belum', + 'sebelumnyalah': 'belum', + 'sebelumku': 'belum', + 'sebelummu': 'belum', + 'belum-belum': 'belum', + 'membelungsing': 'belungsing', + 'berbelut': 'belut', + 'membembam': 'bembam', + 'berbenah': 'benah', + 'berbenahlah': 'benah', + 'membenahi': 'benah', + 'membenahinya': 'benah', + 'pembenahan': 'benah', + 'pembenahannya': 'benah', + 'pembenahanan': 'benah', + 'berbenak': 'benak', + 'membenalu': 'benalu', + 'benaman': 'benam', + 'berbenam': 'benam', + 'terbenam': 'benam', + 'terbenamnya': 'benam', + 'terbenamlah': 'benam', + 'terbenamkan': 'benam', + 'membenam': 'benam', + 'membenamnya': 'benam', + 'membenamkan': 'benam', + 'membenamkannya': 'benam', + 'membenami': 'benam', + 'membenaman': 'benam', + 'membenang': 'benang', + 'membenangkan': 'benang', + 'berbenang-benang': 'benang', + 'benaran': 'benar', + 'membenar': 'benar', + 'membenarnya': 'benar', + 'membenarkan': 'benar', + 'membenarkannya': 'benar', + 'membenari': 'benar', + 'membenaran': 'benar', + 'berbenar': 'benar', + 'terbenar': 'benar', + 'kebenaran': 'benar', + 'kebenarannya': 'benar', + 'kebenaranlah': 'benar', + 'kebenarankan': 'benar', + 'kebenaranan': 'benar', + 'kebenaranmu': 'benar', + 'sebenarnya': 'benar', + 'sebenarnyanya': 'benar', + 'sebenarnyalah': 'benar', + 'sebenarnyai': 'benar', + 'pembenaran': 'benar', + 'pembenarannya': 'benar', + 'benar-benar': 'benar', + 'benar-benarlah': 'benar', + 'benar-benaran': 'benar', + 'memperbenar': 'benar', + 'membenar-benar': 'benar', + 'berbenar-benar': 'benar', + 'membenar-benari': 'benar', + 'membenara': 'benara', + 'membenarakan': 'benara', + 'berbencah': 'bencah', + 'membencah': 'bencah', + 'berbencah-bencah': 'bencah', + 'membencanai': 'bencana', + 'membencanakan': 'bencana', + 'pembenci': 'benci', + 'pembencinya': 'benci', + 'pembencian': 'benci', + 'pembenciku': 'benci', + 'pembencimu': 'benci', + 'membenci': 'benci', + 'membencinya': 'benci', + 'membenciku': 'benci', + 'membencimu': 'benci', + 'kebencian': 'benci', + 'kebenciannya': 'benci', + 'kebencianlah': 'benci', + 'kebencianku': 'benci', + 'kebencianmu': 'benci', + 'kebencian-mu': 'benci', + 'membencikan': 'benci', + 'berbencol-bencol': 'bencol', + 'berbenda': 'benda', + 'kebendaan': 'benda', + 'pembendaan': 'benda', + 'perbendaan': 'benda', + 'perbendaannya': 'benda', + 'membendakan': 'benda', + 'perbendaharaan': 'bendahara', + 'membenderai': 'bendera', + 'kebenderangan': 'benderang', + 'membendi': 'bendi', + 'berbendi': 'bendi', + 'bendungan': 'bendung', + 'bendungannya': 'bendung', + 'bendunganan': 'bendung', + 'terbendung': 'bendung', + 'terbendungnya': 'bendung', + 'terbendungkan': 'bendung', + 'pembendung': 'bendung', + 'pembendungnya': 'bendung', + 'pembendungan': 'bendung', + 'membendung': 'bendung', + 'membendungnya': 'bendung', + 'terbengang': 'bengang', + 'membengang': 'bengang', + 'berbenggil-benggil': 'benggil', + 'benggolan': 'benggol', + 'benggolannya': 'benggol', + 'membengis': 'bengis', + 'kebengisan': 'bengis', + 'kebengisannya': 'bengis', + 'membengisi': 'bengis', + 'bengkahan': 'bengkah', + 'membengkak': 'bengkak', + 'membengkaknya': 'bengkak', + 'membengkakkan': 'bengkak', + 'membengkakan': 'bengkak', + 'pembengkakan': 'bengkak', + 'pembengkakannya': 'bengkak', + 'kebengkalan': 'bengkal', + 'terbengkalai': 'bengkalai', + 'terbengkalainya': 'bengkalai', + 'terbengkalaikan': 'bengkalai', + 'membengkalaikan': 'bengkalai', + 'membengkar': 'bengkar', + 'membengkel': 'bengkel', + 'membengkelkan': 'bengkel', + 'membengkeli': 'bengkel', + 'perbengkelan': 'bengkel', + 'terbengkil-bengkil': 'bengkil', + 'membengkos': 'bengkos', + 'berbengkung': 'bengkung', + 'membengkung': 'bengkung', + 'terbengong-bengong': 'bengong', + 'berbenguk': 'benguk', + 'berbenih': 'benih', + 'pembenih': 'benih', + 'pembenihan': 'benih', + 'pembenihannya': 'benih', + 'perbenihan': 'benih', + 'membenihkan': 'benih', + 'pembening': 'bening', + 'membening': 'bening', + 'membeningkan': 'bening', + 'kebeningan': 'bening', + 'kebeningannya': 'bening', + 'pembeningan': 'bening', + 'benjolan': 'benjol', + 'benjolannya': 'benjol', + 'berbenjol': 'benjol', + 'bentakan': 'bentak', + 'bentakannya': 'bentak', + 'membentak': 'bentak', + 'membentaknya': 'bentak', + 'bentangan': 'bentang', + 'bentangannya': 'bentang', + 'terbentang': 'bentang', + 'terbentangnya': 'bentang', + 'terbentanglah': 'bentang', + 'terbentangkan': 'bentang', + 'membentang': 'bentang', + 'membentangnya': 'bentang', + 'membentanglah': 'bentang', + 'membentangkan': 'bentang', + 'membentangkannya': 'bentang', + 'membentangi': 'bentang', + 'membentangan': 'bentang', + 'sebentar': 'bentar', + 'sebentarnya': 'bentar', + 'sebentarlah': 'bentar', + 'berbentar': 'bentar', + 'sesebentar': 'bentar', + 'membentari': 'bentar', + 'perbentaran': 'bentar', + 'membentarkan': 'bentar', + 'sebentar-sebentar': 'sebentar', + 'berbenteh': 'benteh', + 'membenteh': 'benteh', + 'berbenteng': 'benteng', + 'membentengi': 'benteng', + 'membentenginya': 'benteng', + 'kebentok': 'bentok', + 'berbentol-bentol': 'bentol', + 'berbentong-bentong': 'bentong', + 'bentrokan': 'bentrok', + 'bentrokannya': 'bentrok', + 'berbentrok': 'bentrok', + 'berbentrokan': 'bentrok', + 'perbentrokan': 'bentrok', + 'membentrokkan': 'bentrok', + 'bentukan': 'bentuk', + 'bentukannya': 'bentuk', + 'membentuk': 'bentuk', + 'membentuknya': 'bentuk', + 'membentukkan': 'bentuk', + 'membentukan': 'bentuk', + 'membentukku': 'bentuk', + 'terbentuk': 'bentuk', + 'terbentuknya': 'bentuk', + 'terbentuklah': 'bentuk', + 'terbentukkan': 'bentuk', + 'terbentukan': 'bentuk', + 'pembentuk': 'bentuk', + 'pembentuknya': 'bentuk', + 'pembentukkan': 'bentuk', + 'pembentukkannya': 'bentuk', + 'pembentukan': 'bentuk', + 'berbentuk': 'bentuk', + 'berbentukan': 'bentuk', + 'pembentukannya': 'bentuk', + 'benturan': 'bentur', + 'benturannya': 'bentur', + 'kebentur': 'bentur', + 'terbentur': 'bentur', + 'terbenturnya': 'bentur', + 'membentur': 'bentur', + 'membenturnya': 'bentur', + 'membenturkan': 'bentur', + 'membenturkannya': 'bentur', + 'berbenturan': 'bentur', + 'berbenturannya': 'bentur', + 'perbenturan': 'bentur', + 'terbentus': 'bentus', + 'benuman': 'benum', + 'membenum': 'benum', + 'membeo': 'beo', + 'pembeo': 'beo', + 'memberakan': 'bera', + 'meracun': 'racun', + 'meracunnya': 'racun', + 'meracunkan': 'racun', + 'meracuni': 'racun', + 'meracunan': 'racun', + 'beracun': 'racun', + 'beracunnya': 'racun', + 'peracun': 'racun', + 'peracunnya': 'racun', + 'peracunan': 'racun', + 'meracuninya': 'racun', + 'keracunan': 'racun', + 'keracunannya': 'racun', + 'keracunanan': 'racun', + 'meragi': 'ragi', + 'beragi': 'ragi', + 'beraginya': 'ragi', + 'peragian': 'ragi', + 'meragikan': 'ragi', + 'keberahian': 'berahi', + 'memberahikan': 'berahi', + 'berberaian': 'berai', + 'memberai-beraikan': 'berai', + 'terberak': 'berak', + 'berambu': 'rambu', + 'perambuan': 'rambu', + 'rambu-rambu': 'rambu', + 'rambu-rambunya': 'rambu', + 'serambut': 'rambut', + 'serambutan': 'rambut', + 'merambut': 'rambut', + 'perambut': 'rambut', + 'berambut': 'rambut', + 'memberandal': 'berandal', + 'memberang': 'berang', + 'memberangkan': 'berang', + 'memberangi': 'berang', + 'pemberang': 'berang', + 'pemberangkan': 'berang', + 'berangasan': 'berangas', + 'kerangka': 'rangka', + 'kerangkanya': 'rangka', + 'kerangkai': 'rangka', + 'berangka': 'rangka', + 'berangkai': 'rangkai', + 'merangkakan': 'rangka', + 'keberangkatan': 'berangkat', + 'keberangkatannya': 'berangkat', + 'keberangkatanku': 'berangkat', + 'keberangkatanmu': 'berangkat', + 'pemberangkatan': 'berangkat', + 'pemberangkatannya': 'berangkat', + 'pemberangkatanku': 'berangkat', + 'memberangkatkan': 'berangkat', + 'memberangkatkannya': 'berangkat', + 'merangsang': 'rangsang', + 'merangsangnya': 'rangsang', + 'merangsangan': 'rangsang', + 'berangsang': 'rangsang', + 'terangsang': 'rangsang', + 'terangsangnya': 'rangsang', + 'rangsangan': 'rangsang', + 'rangsangannya': 'rangsang', + 'rangsanganlah': 'rangsang', + 'perangsang': 'rangsang', + 'perangsangan': 'rangsang', + 'perangsangannya': 'rangsang', + 'merangsangkan': 'rangsang', + 'memberangus': 'berangus', + 'memberangusnya': 'berangus', + 'memberanguskan': 'berangus', + 'pemberangus': 'berangus', + 'pemberangusan': 'berangus', + 'pemberani': 'berani', + 'pemberaninya': 'berani', + 'keberanian': 'berani', + 'keberaniannya': 'berani', + 'keberanianlah': 'berani', + 'keberanianmu': 'berani', + 'memberanikan': 'berani', + 'memberanikannya': 'berani', + 'terberanikan': 'berani', + 'berani-berani': 'berani', + 'berani-beraninya': 'berani', + 'berani-beranian': 'berani', + 'berberani-berani': 'berani', + 'berantakan': 'berantak', + 'berantakannya': 'berantak', + 'berantakanlah': 'berantak', + 'memberantakkan': 'berantak', + 'memberantas': 'berantas', + 'memberantasnya': 'berantas', + 'memberantaskan': 'berantas', + 'memberantasi': 'berantas', + 'memberantasan': 'berantas', + 'pemberantas': 'berantas', + 'pemberantasi': 'berantas', + 'pemberantasan': 'berantas', + 'pemberantasannya': 'berantas', + 'pemberantasanan': 'berantas', + 'berasa': 'rasa', + 'berasanya': 'rasa', + 'berasalah': 'rasa', + 'berasai': 'rasa', + 'berasaan': 'rasa', + 'perasa': 'rasa', + 'perasanya': 'rasa', + 'perasaan': 'rasa', + 'terasa': 'rasa', + 'terasanya': 'rasa', + 'terasalah': 'rasa', + 'merasa': 'rasa', + 'merasanya': 'rasa', + 'merasalah': 'rasa', + 'merasakan': 'rasa', + 'merasakannya': 'rasa', + 'merasai': 'rasa', + 'merasaan': 'rasa', + 'serasa': 'rasa', + 'merasainya': 'rasa', + 'rasanya': 'rasa', + 'rasanyanya': 'rasa', + 'perasaannya': 'rasa', + 'perasaanlah': 'rasa', + 'perasaanku': 'rasa', + 'perasaanmu': 'rasa', + 'merasakankan': 'rasa', + 'merasakani': 'rasa', + 'memperasakan': 'rasa', + 'merasa-rasai': 'rasa', + 'rasa-rasanya': 'rasa', + 'rasa-rasanyanya': 'rasa', + 'pemberat': 'berat', + 'pemberatnya': 'berat', + 'pemberatan': 'berat', + 'berberat': 'berat', + 'berberati': 'berat', + 'berberatan': 'berat', + 'memberati': 'berat', + 'keberatan': 'berat', + 'keberatannya': 'berat', + 'keberatanlah': 'berat', + 'pemberatannya': 'berat', + 'memperberat': 'berat', + 'memperberatnya': 'berat', + 'memperberatkan': 'berat', + 'memperberatan': 'berat', + 'memberatkan': 'berat', + 'memberatkannya': 'berat', + 'memberatkankannya': 'berat', + 'berkeberatan': 'berat', + 'pembicara': 'bicara', + 'pembicaranya': 'bicara', + 'pembicarakan': 'bicara', + 'pembicaraan': 'bicara', + 'berbicara': 'bicara', + 'berbicaranya': 'bicara', + 'berbicaralah': 'bicara', + 'berbicarakan': 'bicara', + 'pembicaraannya': 'bicara', + 'pembicaraanku': 'bicara', + 'pembicaraanmu': 'bicara', + 'membicarakan': 'bicara', + 'membicarakannya': 'bicara', + 'membicarakankan': 'bicara', + 'membicarakanku': 'bicara', + 'membicarakanmu': 'bicara', + 'bilangan': 'bilang', + 'bilangannya': 'bilang', + 'bilanganan': 'bilang', + 'sebilang': 'bilang', + 'membilang': 'bilang', + 'terbilang': 'bilang', + 'pembilang': 'bilang', + 'pembilangan': 'bilang', + 'berbilang': 'bilang', + 'membilangi': 'bilang', + 'kebilangan': 'bilang', + 'sebilangan': 'bilang', + 'membilangkan': 'bilang', + 'berbingkai': 'bingkai', + 'membingkai': 'bingkai', + 'membingkainya': 'bingkai', + 'membingkaikan': 'bingkai', + 'berbini': 'bini', + 'berbinikan': 'bini', + 'bini-binian': 'bini', + 'memperbinikan': 'bini', + 'bintangan': 'bintang', + 'sebintang': 'bintang', + 'berbintang': 'bintang', + 'berbintangnya': 'bintang', + 'membintangi': 'bintang', + 'membintanginya': 'bintang', + 'perbintangan': 'bintang', + 'perbintangannya': 'bintang', + 'berbintang-bintang': 'bintang', + 'berbintik': 'bintik', + 'berbintik-bintik': 'bintik', + 'berbisa': 'bisa', + 'berbisanya': 'bisa', + 'kebisaan': 'bisa', + 'kebisaannya': 'bisa', + 'sebisanya': 'bisa', + 'sebisanyalah': 'bisa', + 'bisikan': 'bisik', + 'bisikannya': 'bisik', + 'berbisik': 'bisik', + 'berbisiklah': 'bisik', + 'pembisik': 'bisik', + 'pembisiknya': 'bisik', + 'membisiki': 'bisik', + 'membisikinya': 'bisik', + 'pembisikan': 'bisik', + 'membisikkan': 'bisik', + 'membisikkannya': 'bisik', + 'berbisik-bisik': 'bisik', + 'pembohong': 'bohong', + 'pembohongnya': 'bohong', + 'pembohongan': 'bohong', + 'berbohong': 'bohong', + 'berbohonglah': 'bohong', + 'berbohongan': 'bohong', + 'membohong': 'bohong', + 'membohongi': 'bohong', + 'membohonginya': 'bohong', + 'membohongiku': 'bohong', + 'kebohongan': 'bohong', + 'kebohongannya': 'bohong', + 'membohongkan': 'bohong', + 'bohong-bohongan': 'bohong', + 'bohong-bohongannya': 'bohong', + 'bualan': 'bual', + 'bualannya': 'bual', + 'membual': 'bual', + 'pembual': 'bual', + 'pembualan': 'bual', + 'berbual': 'bual', + 'perbualan': 'bual', + 'membualkan': 'bual', + 'berbual-bual': 'bual', + 'buatan': 'buat', + 'buatannya': 'buat', + 'buatanku': 'buat', + 'buatanmu': 'buat', + 'berbuat': 'buat', + 'berbuatnya': 'buat', + 'berbuatlah': 'buat', + 'berbuatan': 'buat', + 'pembuat': 'buat', + 'pembuatnya': 'buat', + 'pembuatan': 'buat', + 'terbuat': 'buat', + 'terbuatnya': 'buat', + 'terbuatlah': 'buat', + 'membuat': 'buat', + 'membuatnya': 'buat', + 'membuatkan': 'buat', + 'membuatkannya': 'buat', + 'membuati': 'buat', + 'membuatan': 'buat', + 'membuatku': 'buat', + 'membuatmu': 'buat', + 'perbuatan': 'buat', + 'perbuatannya': 'buat', + 'perbuatanku': 'buat', + 'perbuatanmu': 'buat', + 'teperbuat': 'buat', + 'pembuatannya': 'buat', + 'pembuatanan': 'buat', + 'membuatkanmu': 'buat', + 'memperbuat': 'buat', + 'buat-buatan': 'buat', + 'membuat-buat': 'buat', + 'membuat-buatnya': 'buat', + 'berbucu': 'bucu', + 'sebudi': 'budi', + 'berbudi': 'budi', + 'memperbudikan': 'budi', + 'berbuih': 'buih', + 'membuih': 'buih', + 'pembuih': 'buih', + 'berbukit': 'bukit', + 'berbukitan': 'bukit', + 'membukit': 'bukit', + 'membukitkan': 'bukit', + 'perbukitan': 'bukit', + 'perbukitannya': 'bukit', + 'berbukit-bukit': 'bukit', + 'berbukti': 'bukti', + 'berbuktian': 'bukti', + 'terbukti': 'bukti', + 'terbuktinya': 'bukti', + 'terbuktilah': 'bukti', + 'terbuktikan': 'bukti', + 'terbuktii': 'bukti', + 'pembuktian': 'bukti', + 'pembuktiannya': 'bukti', + 'pembuktiani': 'bukti', + 'membuktikan': 'bukti', + 'membuktikannya': 'bukti', + 'bulanan': 'bulan', + 'bulanannya': 'bulan', + 'bulananlah': 'bulan', + 'bulananan': 'bulan', + 'bulananmu': 'bulan', + 'bulanan-mu': 'bulan', + 'berbulan': 'bulan', + 'membulan': 'bulan', + 'bulan-bulanan': 'bulan', + 'bulan-bulanannya': 'bulan', + 'bulan-bulananan': 'bulan', + 'berbulan-bulan': 'bulan', + 'berbulan-bulanlah': 'bulan', + 'membulan-bulani': 'bulan', + 'berbulu': 'bulu', + 'berbulunya': 'bulu', + 'membului': 'bulu', + 'berbunga': 'bunga', + 'membunga': 'bunga', + 'membungakan': 'bunga', + 'membungai': 'bunga', + 'perbungaan': 'bunga', + 'bunga-bungaan': 'bunga', + 'berbunga-bunga': 'bunga', + 'berbunga-bunganya': 'bunga', + 'memperbungakan': 'bunga', + 'membunga-bungai': 'bunga', + 'sebunyi': 'bunyi', + 'berbunyi': 'bunyi', + 'berbunyinya': 'bunyi', + 'berbunyilah': 'bunyi', + 'berbunyikan': 'bunyi', + 'pembunyian': 'bunyi', + 'pembunyiannya': 'bunyi', + 'membunyikan': 'bunyi', + 'membunyikannya': 'bunyi', + 'bunyi-bunyian': 'bunyi', + 'buruan': 'buru', + 'buruannya': 'buru', + 'keburu': 'buru', + 'keburukan': 'buru', + 'keburukannya': 'buru', + 'terburu': 'buru', + 'terburuku': 'buru', + 'memburu': 'buru', + 'memburunya': 'buru', + 'memburukan': 'buru', + 'memburuku': 'buru', + 'memburumu': 'buru', + 'pemburu': 'buru', + 'pemburunya': 'buru', + 'pemburulah': 'buru', + 'pemburukan': 'buru', + 'pemburuan': 'buru', + 'berburu': 'buru', + 'berburunya': 'buru', + 'berburuan': 'buru', + 'perburuan': 'buru', + 'perburuannya': 'buru', + 'berburu-buru': 'buru', + 'terburu-buru': 'buru', + 'terburu-burunya': 'buru', + 'terburu-burulah': 'buru', + 'memburu-buru': 'buru', + 'memburu-burukan': 'buru', + 'pembusa': 'busa', + 'pembusaan': 'busa', + 'membusa': 'busa', + 'berbusa': 'busa', + 'berbusanya': 'busa', + 'membusakan': 'busa', + 'membutir': 'butir', + 'berbutir': 'butir', + 'berbutir-butir': 'butir', + 'mencabang': 'cabang', + 'bercabang': 'cabang', + 'bercabangnya': 'cabang', + 'bercabanglah': 'cabang', + 'pencabangan': 'cabang', + 'percabangan': 'cabang', + 'percabangannya': 'cabang', + 'mencabangkan': 'cabang', + 'mempercabangkan': 'cabang', + 'bercabang-cabang': 'cabang', + 'cacahan': 'cacah', + 'cacahannya': 'cacah', + 'bercacah': 'cacah', + 'pencacah': 'cacah', + 'pencacahnya': 'cacah', + 'pencacahan': 'cacah', + 'mencacah': 'cacah', + 'mencacah-cacah': 'cacah', + 'bebercak': 'bercak', + 'cakapan': 'cakap', + 'bercakap': 'cakap', + 'bercakapan': 'cakap', + 'kecakapan': 'cakap', + 'kecakapannya': 'cakap', + 'mencakapi': 'cakap', + 'percakapan': 'cakap', + 'percakapannya': 'cakap', + 'percakapanlah': 'cakap', + 'percakapanmu': 'cakap', + 'mempercakap': 'cakap', + 'mempercakapkan': 'cakap', + 'bercakap-cakap': 'cakap', + 'bercakap-cakaplah': 'cakap', + 'tercalar': 'calar', + 'bercalar': 'calar', + 'calar-balar': 'calar', + 'mencalarkan': 'calar', + 'bercanggah': 'canggah', + 'bercangkuk': 'cangkuk', + 'mencangkuk': 'cangkuk', + 'tercantum': 'cantum', + 'tercantumnya': 'cantum', + 'tercantumkan': 'cantum', + 'tercantuman': 'cantum', + 'mencantum': 'cantum', + 'mencantumkan': 'cantum', + 'mencantumkannya': 'cantum', + 'mencantuman': 'cantum', + 'bercantum': 'cantum', + 'bercantumkan': 'cantum', + 'pencantuman': 'cantum', + 'pencantumannya': 'cantum', + 'catan': 'cat', + 'catani': 'cat', + 'catanan': 'cat', + 'bercat': 'cat', + 'bercatkan': 'cat', + 'mengecat': 'cat', + 'mengecatnya': 'cat', + 'pengecatan': 'cat', + 'pengecatannya': 'cat', + 'berceloteh': 'celoteh', + 'bercendawan': 'cendawan', + 'bercengkerama': 'cengkerama', + 'bercengkeramalah': 'cengkerama', + 'berceracak': 'ceracak', + 'mencerai': 'cerai', + 'menceraikan': 'cerai', + 'menceraikannya': 'cerai', + 'menceraiku': 'cerai', + 'tercerai': 'cerai', + 'bercerai': 'cerai', + 'bercerainya': 'cerai', + 'berceraian': 'cerai', + 'perceraian': 'cerai', + 'perceraiannya': 'cerai', + 'perceraianmu': 'cerai', + 'penceraian': 'cerai', + 'penceraiannya': 'cerai', + 'bercerai-cerai': 'cerai', + 'berceramah': 'ceramah', + 'penceramah': 'ceramah', + 'penceramahnya': 'ceramah', + 'penceramahan': 'ceramah', + 'menceramahkan': 'ceramah', + 'berceranggah': 'ceranggah', + 'ceritaan': 'cerita', + 'bercerita': 'cerita', + 'berceritalah': 'cerita', + 'berceritakan': 'cerita', + 'pencerita': 'cerita', + 'penceritanya': 'cerita', + 'penceritaan': 'cerita', + 'menceritai': 'cerita', + 'penceritaannya': 'cerita', + 'menceritakan': 'cerita', + 'menceritakannya': 'cerita', + 'menceritakankan': 'cerita', + 'bercinta': 'cinta', + 'bercintanya': 'cinta', + 'bercintalah': 'cinta', + 'bercintaku': 'cinta', + 'mencinta': 'cinta', + 'mencintanya': 'cinta', + 'mencintai': 'cinta', + 'mencintaku': 'cinta', + 'mencintamu': 'cinta', + 'tercinta': 'cinta', + 'tercintanya': 'cinta', + 'tercintaku': 'cinta', + 'tercintamu': 'cinta', + 'pencinta': 'cinta', + 'pencintanya': 'cinta', + 'kecintaan': 'cinta', + 'kecintaannya': 'cinta', + 'kecintaanku': 'cinta', + 'kecintaanmu': 'cinta', + 'mencintainya': 'cinta', + 'mencintaiku': 'cinta', + 'mencintaimu': 'cinta', + 'mencintai-mu': 'cinta', + 'percintaan': 'cinta', + 'percintaannya': 'cinta', + 'bercintakan': 'cinta', + 'mencintakan': 'cinta', + 'bercinta-cintaan': 'cinta', + 'bercorak': 'corak', + 'bercorakkan': 'corak', + 'bercorakan': 'corak', + 'corak-carik': 'corak', + 'tercoreng': 'coreng', + 'tercorengnya': 'coreng', + 'tercorengkan': 'coreng', + 'tercorengi': 'coreng', + 'bercoreng': 'coreng', + 'mencoreng': 'coreng', + 'mencorengnya': 'coreng', + 'mencorengkan': 'coreng', + 'coreng-moreng': 'coreng', + 'coreng-morengnya': 'coreng', + 'bercoreng-moreng': 'coreng', + 'bercoreng-coreng': 'coreng', + 'tercoreng-moreng': 'coreng', + 'cucuran': 'cucur', + 'mencucuri': 'cucur', + 'bercucuran': 'cucur', + 'mencucurkan': 'cucur', + 'mencukur': 'cukur', + 'mencukurnya': 'cukur', + 'pencukur': 'cukur', + 'pencukurnya': 'cukur', + 'pencukuran': 'cukur', + 'bercukur': 'cukur', + 'bercukurlah': 'cukur', + 'bercuti': 'cuti', + 'berdada': 'dada', + 'mendada': 'dada', + 'mendadakan': 'dadak', + 'berdada-dadaan': 'dada', + 'sedaging': 'daging', + 'pedaging': 'daging', + 'pedagingnya': 'daging', + 'pedagingan': 'daging', + 'pendaging': 'daging', + 'mendaging': 'daging', + 'mendagingku': 'daging', + 'terdaging': 'daging', + 'berdaging': 'daging', + 'daging-dagingan': 'daging', + 'mendahak': 'dahak', + 'berdahak': 'dahak', + 'berdakwah': 'dakwah', + 'berdakwahnya': 'dakwah', + 'berdakwahlah': 'dakwah', + 'pendakwah': 'dakwah', + 'mendakwah': 'dakwah', + 'mendakwahkan': 'dakwah', + 'mendakwahkannya': 'dakwah', + 'mendakwahi': 'dakwah', + 'mendalih': 'dalih', + 'mendalihkan': 'dalih', + 'berdalih': 'dalih', + 'berdalihnya': 'dalih', + 'berdalihkan': 'dalih', + 'berdalih-dalih': 'dalih', + 'pendamai': 'damai', + 'pendamaian': 'damai', + 'berdamai': 'damai', + 'berdamainya': 'damai', + 'berdamailah': 'damai', + 'berdamaian': 'damai', + 'kedamaian': 'damai', + 'kedamaiannya': 'damai', + 'kedamaianan': 'damai', + 'perdamaian': 'damai', + 'perdamaiannya': 'damai', + 'perdamaianan': 'damai', + 'mendamaikan': 'damai', + 'mendamaikannya': 'damai', + 'terdamaikan': 'damai', + 'memperdamaikan': 'damai', + 'berdamping': 'damping', + 'berdampingi': 'damping', + 'berdampingan': 'damping', + 'pendamping': 'damping', + 'pendampingnya': 'damping', + 'pendampingi': 'damping', + 'pendampingan': 'damping', + 'pendampingku': 'damping', + 'pendampingmu': 'damping', + 'kedampingan': 'damping', + 'mendampingi': 'damping', + 'mendampinginya': 'damping', + 'mendampingii': 'damping', + 'mendampingiku': 'damping', + 'mendampingimu': 'damping', + 'pendampingannya': 'damping', + 'pendampinganan': 'damping', + 'berdampingannya': 'damping', + 'mendampingkan': 'damping', + 'dandanan': 'dandan', + 'dandanannya': 'dandan', + 'berdandan': 'dandan', + 'berdandannya': 'dandan', + 'berdandanlah': 'dandan', + 'berdandanan': 'dandan', + 'mendandani': 'dandan', + 'mendandaninya': 'dandan', + 'mendandaniku': 'dandan', + 'pedansa': 'dansa', + 'berdansa': 'dansa', + 'berdansanya': 'dansa', + 'berdansalah': 'dansa', + 'dansa-dansi': 'dansa', + 'berdasar': 'dasar', + 'berdasarnya': 'dasar', + 'berdasarkan': 'dasar', + 'berdasarkannya': 'dasar', + 'berdasari': 'dasar', + 'berdasaran': 'dasar', + 'mendasar': 'dasar', + 'mendasarnya': 'dasar', + 'mendasarkan': 'dasar', + 'mendasarkannya': 'dasar', + 'mendasari': 'dasar', + 'mendasarinya': 'dasar', + 'berdasarkankan': 'dasar', + 'mendaulat': 'daulat', + 'mendaulatnya': 'daulat', + 'mendaulatkan': 'daulat', + 'berdaulat': 'daulat', + 'berdaulatnya': 'daulat', + 'berdaulatan': 'daulat', + 'pendaulat': 'daulat', + 'pendaulatan': 'daulat', + 'kedaulatan': 'daulat', + 'kedaulatannya': 'daulat', + 'kedaulatanlah': 'daulat', + 'pendaulatannya': 'daulat', + 'berdaun': 'daun', + 'berdaunkan': 'daun', + 'mendaun': 'daun', + 'dedaunan': 'daun', + 'dedaunannya': 'daun', + 'daun-daunan': 'daun', + 'berdaya': 'daya', + 'berdayanya': 'daya', + 'berdayakan': 'daya', + 'berdayaan': 'daya', + 'teperdaya': 'daya', + 'perdayaan': 'daya', + 'memperdaya': 'daya', + 'memperdayanya': 'daya', + 'memperdayakan': 'daya', + 'memperdayai': 'daya', + 'pemberdayaan': 'daya', + 'pemberdayaannya': 'daya', + 'memberdayakan': 'daya', + 'memberdayakannya': 'daya', + 'pedayung': 'dayung', + 'berdayung': 'dayung', + 'mendayung': 'dayung', + 'mendayungnya': 'dayung', + 'pendayung': 'dayung', + 'mendayungkan': 'dayung', + 'dayung-mayung': 'dayung', + 'debaran': 'debar', + 'berdebar': 'debar', + 'berdebarnya': 'debar', + 'mendebarkan': 'debar', + 'mendebarkannya': 'debar', + 'berdebar-debar': 'debar', + 'berdebu': 'debu', + 'mendebu': 'debu', + 'berdebuk': 'debuk', + 'berdebur': 'debur', + 'mendebur': 'debur', + 'mendecit': 'decit', + 'mendecitkan': 'decit', + 'berdecit': 'decit', + 'berdecitnya': 'decit', + 'berdedikasi': 'dedikasi', + 'berdedikasinya': 'dedikasi', + 'berdedikasilah': 'dedikasi', + 'deklamasian': 'deklamasi', + 'berdeklamasi': 'deklamasi', + 'pendeklamasian': 'deklamasi', + 'mendeklamasikan': 'deklamasi', + 'mendemonstrasi': 'demonstrasi', + 'mendemonstrasikan': 'demonstrasi', + 'mendemonstrasikannya': 'demonstrasi', + 'berdemonstrasi': 'demonstrasi', + 'mendengking': 'dengking', + 'berdengking': 'dengking', + 'mendengking-dengking': 'dengking', + 'dengking-mendengking': 'dengking', + 'dengkuran': 'dengkur', + 'dengkurannya': 'dengkur', + 'mendengkur': 'dengkur', + 'mendengkurnya': 'dengkur', + 'berdengkur': 'dengkur', + 'dengungan': 'dengung', + 'mendengung': 'dengung', + 'mendengungnya': 'dengung', + 'mendengungkan': 'dengung', + 'mendengungkannya': 'dengung', + 'berdengung': 'dengung', + 'berdengungnya': 'dengung', + 'dengusan': 'dengus', + 'dengusannya': 'dengus', + 'berdengus': 'dengus', + 'mendengus': 'dengus', + 'mendengus-dengus': 'dengus', + 'dentingan': 'denting', + 'mendenting': 'denting', + 'mendentingkan': 'denting', + 'berdenting': 'denting', + 'berdentingan': 'denting', + 'dentuman': 'dentum', + 'dentumannya': 'dentum', + 'berdentum': 'dentum', + 'berdentuman': 'dentum', + 'berdentumanlah': 'dentum', + 'berdentum-dentum': 'dentum', + 'denyaran': 'denyar', + 'berdenyar': 'denyar', + 'berdenyar-denyar': 'denyar', + 'menderam': 'deram', + 'berderam': 'deram', + 'berderam-deram': 'deram', + 'deretan': 'deret', + 'deretannya': 'deret', + 'berderet': 'deret', + 'berderetan': 'deret', + 'menderetkan': 'deret', + 'mendering': 'dering', + 'menderingkan': 'dering', + 'berdering': 'dering', + 'berdering-dering': 'dering', + 'menderum': 'derum', + 'berderum': 'derum', + 'menderumkan': 'derum', + 'mendesing': 'desing', + 'berdesing': 'desing', + 'berdesingan': 'desing', + 'berdesing-desing': 'desing', + 'desiran': 'desir', + 'berdesir': 'desir', + 'mendesir': 'desir', + 'detikan': 'detik', + 'mendetik': 'detik', + 'berdetik': 'detik', + 'detik-detik': 'detik', + 'detik-detiknya': 'detik', + 'pendiam': 'diam', + 'pendiamnya': 'diam', + 'pendiamlah': 'diam', + 'pendiaman': 'diam', + 'berdiam': 'diam', + 'berdiamnya': 'diam', + 'berdiamlah': 'diam', + 'terdiam': 'diam', + 'terdiamnya': 'diam', + 'terdiamlah': 'diam', + 'mendiami': 'diam', + 'mendiaminya': 'diam', + 'mendiamimu': 'diam', + 'kediaman': 'diam', + 'kediamannya': 'diam', + 'kediamanan': 'diam', + 'kediamanku': 'diam', + 'diam-diam': 'diam', + 'diam-diamnya': 'diam', + 'diam-diamkan': 'diam', + 'diam-diaman': 'diam', + 'mendiamkan': 'diam', + 'mendiamkannya': 'diam', + 'kependiaman': 'diam', + 'didiang': 'diang', + 'mendiang': 'diang', + 'berdiang': 'diang', + 'pendiangan': 'diang', + 'pendiet': 'diet', + 'berdiet': 'diet', + 'berdietnya': 'diet', + 'pendiri': 'diri', + 'pendirinya': 'diri', + 'pendirikan': 'diri', + 'pendirii': 'diri', + 'pendirian': 'diri', + 'terdiri': 'diri', + 'terdirii': 'diri', + 'berdiri': 'diri', + 'berdirinya': 'diri', + 'berdirilah': 'diri', + 'berdirikan': 'diri', + 'berdiriku': 'diri', + 'pendiriannya': 'diri', + 'pendirianku': 'diri', + 'pendirianmu': 'diri', + 'mendirikan': 'diri', + 'mendirikannya': 'diri', + 'mendirikankan': 'diri', + 'berpendirian': 'diri', + 'berpendiriannya': 'diri', + 'berdisiplin': 'disiplin', + 'berdisiplinlah': 'disiplin', + 'mendisiplinkan': 'disiplin', + 'mendisiplinkannya': 'disiplin', + 'mendoa': 'doa', + 'mendoakan': 'doa', + 'mendoakannya': 'doa', + 'mendoaan': 'doa', + 'berdoa': 'doa', + 'berdoanya': 'doa', + 'berdoalah': 'doa', + 'mendoakanlah': 'doa', + 'mendoakanku': 'doa', + 'mendoakanmu': 'doa', + 'berdosa': 'dosa', + 'berdosanya': 'dosa', + 'berdosalah': 'dosa', + 'pendosa': 'dosa', + 'seduit': 'duit', + 'berduit': 'duit', + 'berduitnya': 'duit', + 'berduitlah': 'duit', + 'berdukacita': 'dukacita', + 'berdukacitanya': 'dukacita', + 'berdukacitalah': 'dukacita', + 'mendukacitakan': 'dukacita', + 'berduri': 'duri', + 'berdurinya': 'duri', + 'menduri': 'duri', + 'berduri-duri': 'duri', + 'berdusta': 'dusta', + 'pendusta': 'dusta', + 'pendustaan': 'dusta', + 'mendusta': 'dusta', + 'mendustakan': 'dusta', + 'mendustakannya': 'dusta', + 'mendustai': 'dusta', + 'mendustainya': 'dusta', + 'mereaksi': 'reaksi', + 'mereaksinya': 'reaksi', + 'mereaksikan': 'reaksi', + 'bereaksi': 'reaksi', + 'bereaksinya': 'reaksi', + 'bereaksilah': 'reaksi', + 'pereaksi': 'reaksi', + 'memberedel': 'beredel', + 'memberedelnya': 'beredel', + 'beregu': 'regu', + 'embunan': 'embun', + 'berembun': 'embun', + 'mengembun': 'embun', + 'mengembunkan': 'embun', + 'pengembun': 'embun', + 'pengembunan': 'embun', + 'mengembuni': 'embun', + 'pengembunannya': 'embun', + 'memperembunkan': 'embun', + 'perenang': 'renang', + 'perenangnya': 'renang', + 'perenangan': 'renang', + 'berenang': 'renang', + 'berenangnya': 'renang', + 'berenanglah': 'renang', + 'merenangi': 'renang', + 'berenangan': 'renang', + 'merenangkan': 'renang', + 'merenda': 'renda', + 'merendakan': 'renda', + 'berenda': 'renda', + 'merendai': 'renda', + 'keberengsekan': 'berengsek', + 'berengsel': 'engsel', + 'memberengut': 'berengut', + 'memberentang': 'berentang', + 'memberentangkan': 'berentang', + 'memberesi': 'beres', + 'memberesinya': 'beres', + 'keberesan': 'beres', + 'pemberesan': 'beres', + 'pemberesannya': 'beres', + 'membereskan': 'beres', + 'membereskannya': 'beres', + 'berevolusi': 'revolusi', + 'berevolusinya': 'revolusi', + 'berfalsafah': 'falsafah', + 'berfalsafahkan': 'falsafah', + 'berfungsi': 'fungsi', + 'berfungsinya': 'fungsi', + 'berfungsilah': 'fungsi', + 'berfungsikan': 'fungsi', + 'berfungsii': 'fungsi', + 'memfungsikan': 'fungsi', + 'memfungsikannya': 'fungsi', + 'pegadai': 'gadai', + 'pegadainya': 'gadai', + 'pegadaian': 'gadai', + 'gadaian': 'gadai', + 'gadaiannya': 'gadai', + 'tergadai': 'gadai', + 'tergadailah': 'gadai', + 'tergadaikan': 'gadai', + 'bergadai': 'gadai', + 'menggadai': 'gadai', + 'menggadainya': 'gadai', + 'menggadaikan': 'gadai', + 'menggadaikannya': 'gadai', + 'pegadaiannya': 'gadai', + 'penggadai': 'gadai', + 'penggadaian': 'gadai', + 'bergaduh': 'gaduh', + 'penggaduh': 'gaduh', + 'menggaduh': 'gaduh', + 'menggaduhkan': 'gaduh', + 'kegaduhan': 'gaduh', + 'kegaduhannya': 'gaduh', + 'pergaduhan': 'gaduh', + 'penggaduhan': 'gaduh', + 'gambaran': 'gambar', + 'gambarannya': 'gambar', + 'gambaranku': 'gambar', + 'tergambar': 'gambar', + 'tergambarnya': 'gambar', + 'tergambarlah': 'gambar', + 'tergambarkan': 'gambar', + 'bergambar': 'gambar', + 'bergambarnya': 'gambar', + 'bergambarkan': 'gambar', + 'menggambar': 'gambar', + 'menggambarnya': 'gambar', + 'menggambarkan': 'gambar', + 'menggambarkannya': 'gambar', + 'menggambari': 'gambar', + 'menggambaran': 'gambar', + 'penggambar': 'gambar', + 'penggambarnya': 'gambar', + 'penggambarkan': 'gambar', + 'penggambaran': 'gambar', + 'menggambarinya': 'gambar', + 'penggambarannya': 'gambar', + 'menggambarkankan': 'gambar', + 'menggambarkanmu': 'gambar', + 'gambar-menggambar': 'gambar', + 'berganda': 'ganda', + 'bergandanya': 'ganda', + 'mengganda': 'ganda', + 'menggandakan': 'ganda', + 'menggandakannya': 'ganda', + 'menggandaan': 'ganda', + 'pergandaan': 'ganda', + 'penggandaan': 'ganda', + 'penggandaannya': 'ganda', + 'mempergandakan': 'ganda', + 'berganda-ganda': 'ganda', + 'ganda-berganda': 'ganda', + 'memperganda-gandakan': 'ganda', + 'berganding': 'ganding', + 'bergandingan': 'ganding', + 'mempergandingkan': 'ganding', + 'terganjak': 'ganjak', + 'berganjak': 'ganjak', + 'mengganjak': 'ganjak', + 'mengganjakkan': 'ganjak', + 'berganti': 'ganti', + 'bergantinya': 'ganti', + 'bergantilah': 'ganti', + 'bergantikan': 'ganti', + 'bergantian': 'ganti', + 'mengganti': 'ganti', + 'menggantinya': 'ganti', + 'menggantikan': 'ganti', + 'menggantikannya': 'ganti', + 'menggantii': 'ganti', + 'menggantian': 'ganti', + 'menggantiku': 'ganti', + 'menggantimu': 'ganti', + 'pengganti': 'ganti', + 'penggantinya': 'ganti', + 'penggantikan': 'ganti', + 'penggantian': 'ganti', + 'penggantinyalah': 'ganti', + 'penggantiku': 'ganti', + 'penggantimu': 'ganti', + 'pergantian': 'ganti', + 'pergantiannya': 'ganti', + 'penggantiannya': 'ganti', + 'menggantikanku': 'ganti', + 'berganti-ganti': 'ganti', + 'berganti-gantinya': 'ganti', + 'berganti-gantian': 'ganti', + 'gantungan': 'gantung', + 'gantungannya': 'gantung', + 'bergantung': 'gantung', + 'bergantungnya': 'gantung', + 'bergantunglah': 'gantung', + 'bergantungkan': 'gantung', + 'bergantungan': 'gantung', + 'tergantung': 'gantung', + 'tergantungnya': 'gantung', + 'tergantunglah': 'gantung', + 'tergantungan': 'gantung', + 'menggantung': 'gantung', + 'menggantungnya': 'gantung', + 'menggantunglah': 'gantung', + 'menggantungkan': 'gantung', + 'menggantungkannya': 'gantung', + 'menggantungi': 'gantung', + 'menggantungan': 'gantung', + 'menggantungmu': 'gantung', + 'pergantungan': 'gantung', + 'penggantungan': 'gantung', + 'ketergantungan': 'gantung', + 'ketergantungannya': 'gantung', + 'mempergantungi': 'gantung', + 'bergaul': 'gaul', + 'bergaulnya': 'gaul', + 'bergaullah': 'gaul', + 'bergaulan': 'gaul', + 'menggaul': 'gaul', + 'menggauli': 'gaul', + 'menggaulinya': 'gaul', + 'pergaulan': 'gaul', + 'pergaulannya': 'gaul', + 'pergaulanmu': 'gaul', + 'mempergauli': 'gaul', + 'menggaulkan': 'gaul', + 'mempergaulkan': 'gaul', + 'bergaung': 'gaung', + 'bergaungnya': 'gaung', + 'bergaunglah': 'gaung', + 'menggaung': 'gaung', + 'menggaungnya': 'gaung', + 'menggaungkan': 'gaung', + 'menggaungkannya': 'gaung', + 'bergaya': 'gaya', + 'bergayanya': 'gaya', + 'bergayalah': 'gaya', + 'menggaya': 'gaya', + 'menggayakan': 'gaya', + 'gaya-gayanya': 'gaya', + 'bergaya-gaya': 'gaya', + 'bergaya-gayaan': 'gaya', + 'gayutan': 'gayut', + 'bergayut': 'gayut', + 'penggayut': 'gayut', + 'menggayuti': 'gayut', + 'bergayutan': 'gayut', + 'menggayutkan': 'gayut', + 'tergegar': 'gegar', + 'bergegar': 'gegar', + 'menggegar': 'gegar', + 'menggegarkan': 'gegar', + 'tergegas': 'gegas', + 'bergegas': 'gegas', + 'bergegasnya': 'gegas', + 'bergegaslah': 'gegas', + 'menggegas': 'gegas', + 'menggegaskan': 'gegas', + 'penggegasan': 'gegas', + 'mempergegas': 'gegas', + 'tergegas-gegas': 'gegas', + 'bergegas-gegas': 'gegas', + 'bergejolak': 'gejolak', + 'bergejolaknya': 'gejolak', + 'menggejolak': 'gejolak', + 'bergelar': 'gelar', + 'bergelarnya': 'gelar', + 'menggelar': 'gelar', + 'menggelarnya': 'gelar', + 'menggelarkan': 'gelar', + 'menggelari': 'gelar', + 'menggelaran': 'gelar', + 'pegelaran': 'gelar', + 'pergelaran': 'gelar', + 'pergelarannya': 'gelar', + 'menggelarinya': 'gelar', + 'mempergelarkan': 'gelar', + 'bergelimpang': 'gelimpang', + 'bergelimpangnya': 'gelimpang', + 'bergelimpangan': 'gelimpang', + 'tergelimpang': 'gelimpang', + 'bergelombang': 'gelombang', + 'bergelombangnya': 'gelombang', + 'menggelombang': 'gelombang', + 'menggelombangkan': 'gelombang', + 'bergelora': 'gelora', + 'bergeloranya': 'gelora', + 'menggelora': 'gelora', + 'menggeloranya': 'gelora', + 'menggelorakan': 'gelora', + 'menggelorakannya': 'gelora', + 'gelungan': 'gelung', + 'bergelung': 'gelung', + 'menggelung': 'gelung', + 'menggelungnya': 'gelung', + 'menggelungkan': 'gelung', + 'tergelung-gelung': 'gelung', + 'gelutan': 'gelut', + 'bergelut': 'gelut', + 'menggelut': 'gelut', + 'menggeluti': 'gelut', + 'menggelutinya': 'gelut', + 'bergema': 'gema', + 'bergemanya': 'gema', + 'bergemalah': 'gema', + 'menggema': 'gema', + 'menggemanya': 'gema', + 'menggemalah': 'gema', + 'menggemakan': 'gema', + 'menggemakannya': 'gema', + 'menggemai': 'gema', + 'bergembira': 'gembira', + 'bergembiranya': 'gembira', + 'bergembiralah': 'gembira', + 'kegembiraan': 'gembira', + 'kegembiraannya': 'gembira', + 'kegembiraanku': 'gembira', + 'penggembira': 'gembira', + 'penggembiranya': 'gembira', + 'menggembirakan': 'gembira', + 'menggembirakannya': 'gembira', + 'menggembirakanlah': 'gembira', + 'mempergembirakan': 'gembira', + 'bergemuruh': 'gemuruh', + 'bergemuruhnya': 'gemuruh', + 'bergemuruhlah': 'gemuruh', + 'kegemuruhan': 'gemuruh', + 'menggemuruh': 'gemuruh', + 'menggemuruhkan': 'gemuruh', + 'tergenang': 'genang', + 'tergenangnya': 'genang', + 'tergenangi': 'genang', + 'tergenangan': 'genang', + 'bergenang': 'genang', + 'kegenangan': 'genang', + 'menggenang': 'genang', + 'menggenangnya': 'genang', + 'menggenangkan': 'genang', + 'menggenangi': 'genang', + 'menggenangan': 'genang', + 'menggenanginya': 'genang', + 'menggenangii': 'genang', + 'penggenangan': 'genang', + 'penggenangannya': 'genang', + 'segendang': 'gendang', + 'gendangan': 'gendang', + 'bergendang': 'gendang', + 'gendang-gendang': 'gendang', + 'gerakan': 'gerak', + 'gerakannya': 'gerak', + 'gerakanlah': 'gerak', + 'gerakani': 'gerak', + 'gerakanan': 'gerak', + 'gerakanku': 'gerak', + 'gerakanmu': 'gerak', + 'bergerak': 'gerak', + 'bergeraknya': 'gerak', + 'bergeraklah': 'gerak', + 'bergeraki': 'gerak', + 'bergerakan': 'gerak', + 'tergerak': 'gerak', + 'tergeraknya': 'gerak', + 'tergeraklah': 'gerak', + 'tergerakkan': 'gerak', + 'tergerakan': 'gerak', + 'penggerak': 'gerak', + 'penggeraknya': 'gerak', + 'penggerakkan': 'gerak', + 'penggerakan': 'gerak', + 'pergerakan': 'gerak', + 'pergerakannya': 'gerak', + 'pergerakanan': 'gerak', + 'pergerakanku': 'gerak', + 'pergerakanmu': 'gerak', + 'penggerakannya': 'gerak', + 'menggerakkan': 'gerak', + 'menggerakkannya': 'gerak', + 'menggerakkanku': 'gerak', + 'menggerak-gerakkan': 'gerak', + 'menggerak-gerakkanku': 'gerak', + 'bergerigi': 'gerigi', + 'bergerincing': 'gerincing', + 'gesekan': 'gesek', + 'gesekannya': 'gesek', + 'bergesek': 'gesek', + 'bergesekkan': 'gesek', + 'bergesekan': 'gesek', + 'menggesek': 'gesek', + 'menggeseknya': 'gesek', + 'menggesekkan': 'gesek', + 'menggesekkannya': 'gesek', + 'menggesekan': 'gesek', + 'penggesek': 'gesek', + 'penggeseknya': 'gesek', + 'penggesekan': 'gesek', + 'pergesekan': 'gesek', + 'pergesekannya': 'gesek', + 'mempergesekkan': 'gesek', + 'bergesel': 'gesel', + 'menggesel': 'gesel', + 'geseran': 'geser', + 'bergeser': 'geser', + 'bergesernya': 'geser', + 'bergeserlah': 'geser', + 'bergeseran': 'geser', + 'menggeser': 'geser', + 'menggesernya': 'geser', + 'menggeserkan': 'geser', + 'pergeseran': 'geser', + 'pergeserannya': 'geser', + 'penggeseran': 'geser', + 'penggeserannya': 'geser', + 'tergetah': 'getah', + 'bergetah': 'getah', + 'menggetah': 'getah', + 'pergetahan': 'getah', + 'penggetahan': 'getah', + 'getaran': 'getar', + 'getarannya': 'getar', + 'bergetar': 'getar', + 'bergetarnya': 'getar', + 'bergetarlah': 'getar', + 'penggetar': 'getar', + 'penggetarnya': 'getar', + 'penggetaran': 'getar', + 'menggetar': 'getar', + 'menggetarkan': 'getar', + 'menggetarkannya': 'getar', + 'bergigi': 'gigi', + 'bergiginya': 'gigi', + 'pergigian': 'gigi', + 'golakan': 'golak', + 'bergolak': 'golak', + 'bergolaknya': 'golak', + 'pergolakan': 'golak', + 'pergolakannya': 'golak', + 'bergolak-golak': 'golak', + 'bergolek': 'golek', + 'tergolek': 'golek', + 'tergoleknya': 'golek', + 'menggolek': 'golek', + 'bergolekan': 'golek', + 'menggolekkan': 'golek', + 'bergolek-golek': 'golek', + 'tergolek-golek': 'golek', + 'goresan': 'gores', + 'goresannya': 'gores', + 'bergores': 'gores', + 'bergoreskan': 'gores', + 'tergores': 'gores', + 'tergoresnya': 'gores', + 'menggores': 'gores', + 'menggoresnya': 'gores', + 'menggoreskan': 'gores', + 'menggoreskannya': 'gores', + 'penggores': 'gores', + 'penggoresan': 'gores', + 'bergores-gores': 'gores', + 'tergoyang': 'goyang', + 'tergoyangnya': 'goyang', + 'tergoyangkan': 'goyang', + 'bergoyang': 'goyang', + 'bergoyangnya': 'goyang', + 'bergoyanglah': 'goyang', + 'kegoyangan': 'goyang', + 'menggoyang': 'goyang', + 'menggoyangnya': 'goyang', + 'menggoyangkan': 'goyang', + 'menggoyangkannya': 'goyang', + 'bergoyang-goyang': 'goyang', + 'menggoyang-goyangkan': 'goyang', + 'menggoyang-goyangkannya': 'goyang', + 'berguling': 'guling', + 'bergulingnya': 'guling', + 'bergulinglah': 'guling', + 'bergulingan': 'guling', + 'terguling': 'guling', + 'tergulingnya': 'guling', + 'tergulingkan': 'guling', + 'mengguling': 'guling', + 'menggulingkan': 'guling', + 'menggulingkannya': 'guling', + 'menggulingan': 'guling', + 'terguling-guling': 'guling', + 'bergumam': 'gumam', + 'menggumam': 'gumam', + 'menggumamkan': 'gumam', + 'gumpalan': 'gumpal', + 'gumpalannya': 'gumpal', + 'bergumpal': 'gumpal', + 'bergumpalan': 'gumpal', + 'menggumpal': 'gumpal', + 'menggumpalnya': 'gumpal', + 'menggumpalkan': 'gumpal', + 'penggumpalan': 'gumpal', + 'penggumpalannya': 'gumpal', + 'bergumpal-gumpal': 'gumpal', + 'bergumpal-gumpalan': 'gumpal', + 'seguna': 'guna', + 'berguna': 'guna', + 'bergunanya': 'guna', + 'pengguna': 'guna', + 'penggunanya': 'guna', + 'penggunalah': 'guna', + 'penggunakan': 'guna', + 'penggunakannya': 'guna', + 'penggunai': 'guna', + 'penggunaan': 'guna', + 'kegunaan': 'guna', + 'kegunaannya': 'guna', + 'guna-guna': 'guna', + 'guna-gunalah': 'guna', + 'penggunaannya': 'guna', + 'penggunaanan': 'guna', + 'guna-ganah': 'guna', + 'menggunakan': 'guna', + 'menggunakannya': 'guna', + 'menggunakankan': 'guna', + 'menggunakanan': 'guna', + 'menggunakanku': 'guna', + 'mempergunakan': 'guna', + 'mempergunakannya': 'guna', + 'gurauan': 'gurau', + 'gurauannya': 'gurau', + 'bergurau': 'gurau', + 'pergurauan': 'gurau', + 'mengguraukan': 'gurau', + 'memperguraukan': 'gurau', + 'bergusti': 'gusti', + 'hajatan': 'hajat', + 'hajatannya': 'hajat', + 'berhajat': 'hajat', + 'menghajati': 'hajat', + 'menghajatkan': 'hajat', + 'berhala': 'hala', + 'berhalakan': 'hala', + 'menghalakan': 'hala', + 'hamburan': 'hambur', + 'terhambur': 'hambur', + 'terhamburnya': 'hambur', + 'terhamburkan': 'hambur', + 'terhamburan': 'hambur', + 'menghambur': 'hambur', + 'menghamburkan': 'hambur', + 'menghamburkannya': 'hambur', + 'menghamburan': 'hambur', + 'menghamburi': 'hambur', + 'berhamburan': 'hambur', + 'berhamburannya': 'hambur', + 'penghamburan': 'hambur', + 'menghambur-hamburkan': 'hambur', + 'menghambur-hamburkannya': 'hambur', + 'berhantu': 'hantu', + 'menghantu': 'hantu', + 'menghantui': 'hantu', + 'menghantuinya': 'hantu', + 'menghantuiku': 'hantu', + 'menghantuimu': 'hantu', + 'berharga': 'harga', + 'berharganya': 'harga', + 'berhargaan': 'harga', + 'berhargaku': 'harga', + 'menghargai': 'harga', + 'menghargainya': 'harga', + 'menghargailah': 'harga', + 'menghargaii': 'harga', + 'menghargaiku': 'harga', + 'menghargaimu': 'harga', + 'penghargaan': 'harga', + 'penghargaannya': 'harga', + 'penghargaanku': 'harga', + 'menghargakan': 'harga', + 'menghargakannya': 'harga', + 'berhasil': 'hasil', + 'berhasilnya': 'hasil', + 'berhasillah': 'hasil', + 'berhasilkan': 'hasil', + 'berhasilan': 'hasil', + 'penghasil': 'hasil', + 'penghasilnya': 'hasil', + 'penghasilkan': 'hasil', + 'penghasilan': 'hasil', + 'penghasilannya': 'hasil', + 'penghasilanku': 'hasil', + 'penghasilanmu': 'hasil', + 'pemberhasil': 'hasil', + 'menghasilkan': 'hasil', + 'menghasilkannya': 'hasil', + 'keberhasilan': 'hasil', + 'keberhasilannya': 'hasil', + 'keberhasilanlah': 'hasil', + 'keberhasilanan': 'hasil', + 'keberhasilanku': 'hasil', + 'keberhasilanmu': 'hasil', + 'terhasrat': 'hasrat', + 'berhasrat': 'hasrat', + 'berhasratnya': 'hasrat', + 'kehasratan': 'hasrat', + 'menghasratkan': 'hasrat', + 'berhemat': 'hemat', + 'berhematlah': 'hemat', + 'berhematan': 'hemat', + 'menghemat': 'hemat', + 'menghematnya': 'hemat', + 'menghematlah': 'hemat', + 'menghematkan': 'hemat', + 'kehematan': 'hemat', + 'kehematannya': 'hemat', + 'penghematan': 'hemat', + 'penghematannya': 'hemat', + 'hentian': 'henti', + 'terhenti': 'henti', + 'terhentinya': 'henti', + 'terhentilah': 'henti', + 'terhentikan': 'henti', + 'berhenti': 'henti', + 'berhentinya': 'henti', + 'berhentilah': 'henti', + 'berhentikan': 'henti', + 'berhentikannya': 'henti', + 'berhentii': 'henti', + 'penghenti': 'henti', + 'penghentikan': 'henti', + 'penghentikannya': 'henti', + 'penghentian': 'henti', + 'perhentian': 'henti', + 'perhentiannya': 'henti', + 'penghentiannya': 'henti', + 'menghentikan': 'henti', + 'menghentikannya': 'henti', + 'menghentikanku': 'henti', + 'menghentikanmu': 'henti', + 'pemberhentian': 'henti', + 'pemberhentiannya': 'henti', + 'memberhentikan': 'henti', + 'memberhentikannya': 'henti', + 'memperhentikan': 'henti', + 'hiasan': 'hias', + 'hiasannya': 'hias', + 'berhias': 'hias', + 'berhiaskan': 'hias', + 'berhiasi': 'hias', + 'berhiasan': 'hias', + 'terhias': 'hias', + 'menghias': 'hias', + 'menghiasnya': 'hias', + 'menghiaskan': 'hias', + 'menghiasi': 'hias', + 'penghias': 'hias', + 'penghiasnya': 'hias', + 'perhiasan': 'hias', + 'perhiasannya': 'hias', + 'perhiasanku': 'hias', + 'menghiasinya': 'hias', + 'memperhiasi': 'hias', + 'berhidung': 'hidung', + 'menghidung': 'hidung', + 'berhipotesis': 'hipotesis', + 'menghipotesiskan': 'hipotesis', + 'berhormat': 'hormat', + 'terhormat': 'hormat', + 'terhormatnya': 'hormat', + 'terhormatlah': 'hormat', + 'menghormat': 'hormat', + 'menghormati': 'hormat', + 'menghormatan': 'hormat', + 'penghormat': 'hormat', + 'penghormatan': 'hormat', + 'kehormatan': 'hormat', + 'kehormatannya': 'hormat', + 'kehormatanku': 'hormat', + 'kehormatanmu': 'hormat', + 'menghormatinya': 'hormat', + 'menghormatilah': 'hormat', + 'menghormatii': 'hormat', + 'menghormatiku': 'hormat', + 'menghormatimu': 'hormat', + 'penghormatannya': 'hormat', + 'berhormat-hormat': 'hormat', + 'hormat-menghormati': 'hormat', + 'hubungan': 'hubung', + 'hubungannya': 'hubung', + 'hubunganlah': 'hubung', + 'hubungankan': 'hubung', + 'hubungannyalah': 'hubung', + 'hubunganku': 'hubung', + 'hubunganmu': 'hubung', + 'berhubung': 'hubung', + 'berhubungnya': 'hubung', + 'berhubungkan': 'hubung', + 'berhubungan': 'hubung', + 'penghubung': 'hubung', + 'penghubungnya': 'hubung', + 'penghubungkan': 'hubung', + 'penghubungi': 'hubung', + 'penghubungan': 'hubung', + 'berhubungannya': 'hubung', + 'berhubunganlah': 'hubung', + 'berhubunganan': 'hubung', + 'perhubungan': 'hubung', + 'perhubungannya': 'hubung', + 'menghubungi': 'hubung', + 'menghubunginya': 'hubung', + 'menghubungiku': 'hubung', + 'menghubungimu': 'hubung', + 'menghubungkan': 'hubung', + 'menghubungkannya': 'hubung', + 'menghubungkanku': 'hubung', + 'memperhubungkan': 'hubung', + 'menghubung-hubungkan': 'hubung', + 'menghubung-hubungkannya': 'hubung', + 'menghubung-hubungkankan': 'hubung', + 'hunian': 'huni', + 'huniannya': 'huni', + 'hunianmu': 'huni', + 'berhuni': 'huni', + 'berhunikan': 'huni', + 'berhunian': 'huni', + 'terhuni': 'huni', + 'menghuni': 'huni', + 'menghuninya': 'huni', + 'penghuni': 'huni', + 'penghuninya': 'huni', + 'penghunian': 'huni', + 'penghuniannya': 'huni', + 'berpenghuni': 'huni', + 'berpenghuninya': 'huni', + 'berpenghunikan': 'huni', + 'menghunikan': 'huni', + 'tahu': 'beri', + 'tahunya': 'beri', + 'tahulah': 'beri', + 'tahukan': 'beri', + 'tahukannya': 'beri', + 'tahui': 'beri', + 'tahuan': 'beri', + 'tahuku': 'beri', + 'tahumu': 'beri', + 'berian': 'beri', + 'beriani': 'beri', + 'memberi': 'beri', + 'memberinya': 'beri', + 'memberikan': 'beri', + 'memberikannya': 'beri', + 'memberian': 'beri', + 'memberiku': 'beri', + 'memberimu': 'beri', + 'pemberi': 'beri', + 'pemberinya': 'beri', + 'pemberikan': 'beri', + 'pemberii': 'beri', + 'pemberian': 'beri', + 'pemberiannya': 'beri', + 'pemberianmu': 'beri', + 'memberikankan': 'beri', + 'memberikanan': 'beri', + 'memberikanku': 'beri', + 'memberikanmu': 'beri', + 'beri-memberi': 'beri', + 'memberi tahu': 'beri', + 'pemberitahuan': 'beri', + 'pemberitahuannya': 'beri', + 'pemberitahuanlah': 'beri', + 'memberitahukan': 'beri', + 'memberitahukannya': 'beri', + 'memberitahukanku': 'beri', + 'memberitahukanmu': 'beri', + 'ribuan': 'ribu', + 'ribuannya': 'ribu', + 'ribuanlah': 'ribu', + 'ribuanan': 'ribu', + 'seribu': 'ribu', + 'seribunya': 'ribu', + 'seribuan': 'ribu', + 'beribu-ribu': 'ribu', + 'menyeribu': 'ribu', + 'berikhtiar': 'ikhtiar', + 'berikhtiarlah': 'ikhtiar', + 'mengikhtiarkan': 'ikhtiar', + 'mengikhtiarkannya': 'ikhtiar', + 'berikrar': 'ikrar', + 'berikrarkan': 'ikrar', + 'pengikraran': 'ikrar', + 'mengikrarkan': 'ikrar', + 'ikutan': 'ikut', + 'ikutannya': 'ikut', + 'ikutanlah': 'ikut', + 'berikut': 'ikut', + 'berikutnya': 'ikut', + 'berikutlah': 'ikut', + 'berikutkan': 'ikut', + 'berikutkannya': 'ikut', + 'berikuti': 'ikut', + 'berikutan': 'ikut', + 'berikutku': 'ikut', + 'terikut': 'ikut', + 'terikutkan': 'ikut', + 'terikuti': 'ikut', + 'pengikut': 'ikut', + 'pengikutnya': 'ikut', + 'pengikuti': 'ikut', + 'pengikutan': 'ikut', + 'pengikutku': 'ikut', + 'pengikutmu': 'ikut', + 'mengikut': 'ikut', + 'mengikutnya': 'ikut', + 'mengikutkan': 'ikut', + 'mengikutkannya': 'ikut', + 'mengikuti': 'ikut', + 'ikut-ikut': 'ikut', + 'ikut-ikutlah': 'ikut', + 'ikut-ikutkan': 'ikut', + 'ikut-ikutan': 'ikut', + 'mengikutinya': 'ikut', + 'mengikutikan': 'ikut', + 'mengikutii': 'ikut', + 'mengikutian': 'ikut', + 'mengikutiku': 'ikut', + 'mengikutimu': 'ikut', + 'memperikut': 'ikut', + 'ikut-ikutanlah': 'ikut', + 'ikut-ikutanan': 'ikut', + 'memperikutkan': 'ikut', + 'beriman': 'iman', + 'keimanan': 'iman', + 'keimanannya': 'iman', + 'keimananan': 'iman', + 'keimananmu': 'iman', + 'mengimani': 'iman', + 'mengimaninya': 'iman', + 'berimankan': 'iman', + 'berimigrasi': 'imigrasi', + 'keimigrasian': 'imigrasi', + 'keimigrasiannya': 'imigrasi', + 'seberinda': 'berinda', + 'pemberingas': 'beringas', + 'keberingasan': 'beringas', + 'keberingasannya': 'beringas', + 'berintegrasi': 'integrasi', + 'berintegrasinya': 'integrasi', + 'berintegrasii': 'integrasi', + 'berintegrasian': 'integrasi', + 'mengintegrasikan': 'integrasi', + 'mengintegrasikannya': 'integrasi', + 'berinteraksi': 'interaksi', + 'berinteraksinya': 'interaksi', + 'berinteraksilah': 'interaksi', + 'seirama': 'irama', + 'seiramanya': 'irama', + 'berirama': 'irama', + 'mengiramakan': 'irama', + 'seisi': 'isi', + 'seisinya': 'isi', + 'isian': 'isi', + 'isiannya': 'isi', + 'isianlah': 'isi', + 'terisi': 'isi', + 'terisinya': 'isi', + 'terisikan': 'isi', + 'berisi': 'isi', + 'berisinya': 'isi', + 'berisikan': 'isi', + 'pengisi': 'isi', + 'pengisinya': 'isi', + 'pengisikan': 'isi', + 'pengisian': 'isi', + 'mengisi': 'isi', + 'mengisinya': 'isi', + 'mengisikan': 'isi', + 'mengisikannya': 'isi', + 'mengisii': 'isi', + 'mengisian': 'isi', + 'pengisiannya': 'isi', + 'berberita': 'berita', + 'pemberita': 'berita', + 'pemberitakan': 'berita', + 'pemberitaan': 'berita', + 'pemberitaannya': 'berita', + 'memberitakan': 'berita', + 'memberitakannya': 'berita', + 'penjaja': 'jaja', + 'penjajakan': 'jaja', + 'penjajakannya': 'jaja', + 'penjajaan': 'jaja', + 'menjaja': 'jaja', + 'menjajakan': 'jaja', + 'menjajakannya': 'jaja', + 'berjaja': 'jaja', + 'jaja-jajaan': 'jaja', + 'jajaran': 'jajar', + 'jajarannya': 'jajar', + 'sejajar': 'jajar', + 'sejajarnya': 'jajar', + 'sejajarlah': 'jajar', + 'sejajarkan': 'jajar', + 'sejajaran': 'jajar', + 'menjajar': 'jajar', + 'menjajarkan': 'jajar', + 'menjajarkannya': 'jajar', + 'menjajari': 'jajar', + 'menjajaran': 'jajar', + 'terjajar': 'jajar', + 'berjajar': 'jajar', + 'berjajarnya': 'jajar', + 'berjajaran': 'jajar', + 'pejajaran': 'jajar', + 'penjajaran': 'jajar', + 'persejajaran': 'jajar', + 'menyejajarkan': 'jajar', + 'menyejajarkannya': 'jajar', + 'sejalan': 'jalan', + 'sejalannya': 'jalan', + 'sejalankan': 'jalan', + 'jalanan': 'jalan', + 'jalanannya': 'jalan', + 'jalananlah': 'jalan', + 'jalananan': 'jalan', + 'jalananmu': 'jalan', + 'pejalan': 'jalan', + 'pejalanan': 'jalan', + 'berjalan': 'jalan', + 'berjalannya': 'jalan', + 'berjalanlah': 'jalan', + 'berjalankan': 'jalan', + 'berjalanan': 'jalan', + 'berjalanku': 'jalan', + 'menjalani': 'jalan', + 'menjalaninya': 'jalan', + 'menjalanikan': 'jalan', + 'menjalanii': 'jalan', + 'perjalanan': 'jalan', + 'perjalanannya': 'jalan', + 'perjalananlah': 'jalan', + 'perjalananan': 'jalan', + 'perjalananku': 'jalan', + 'perjalananmu': 'jalan', + 'kesejalanan': 'jalan', + 'menjalankan': 'jalan', + 'menjalankannya': 'jalan', + 'menjalankankan': 'jalan', + 'menjalankanan': 'jalan', + 'berjalan-jalan': 'jalan', + 'berjalan-jalannya': 'jalan', + 'berjalan-jalanlah': 'jalan', + 'jalinan': 'jalin', + 'jalinannya': 'jalin', + 'berjalin': 'jalin', + 'berjalinan': 'jalin', + 'menjalin': 'jalin', + 'menjalinnya': 'jalin', + 'menjalinkan': 'jalin', + 'menjalinkannya': 'jalin', + 'menjalini': 'jalin', + 'menjalinan': 'jalin', + 'terjalin': 'jalin', + 'terjalinnya': 'jalin', + 'terjalinlah': 'jalin', + 'terjalinkan': 'jalin', + 'terjalinan': 'jalin', + 'penjalinan': 'jalin', + 'jalin-berjalin': 'jalin', + 'berjalin-jalin': 'jalin', + 'jalin-menjalin': 'jalin', + 'jamuan': 'jamu', + 'jamuannya': 'jamu', + 'berjamu': 'jamu', + 'menjamu': 'jamu', + 'menjamunya': 'jamu', + 'menjamui': 'jamu', + 'perjamuan': 'jamu', + 'perjamuannya': 'jamu', + 'penjamuan': 'jamu', + 'memperjamu': 'jamu', + 'menjamukan': 'jamu', + 'jangkitan': 'jangkit', + 'menjangkit': 'jangkit', + 'menjangkitnya': 'jangkit', + 'menjangkiti': 'jangkit', + 'berjangkit': 'jangkit', + 'berjangkitnya': 'jangkit', + 'kejangkitan': 'jangkit', + 'terjangkiti': 'jangkit', + 'terjangkitinya': 'jangkit', + 'berjangkitan': 'jangkit', + 'penjangkitan': 'jangkit', + 'menjangkitkan': 'jangkit', + 'jongkat-jangkit': 'jangkit', + 'berjanji': 'janji', + 'berjanjinya': 'janji', + 'berjanjilah': 'janji', + 'berjanjii': 'janji', + 'berjanjian': 'janji', + 'perjanjian': 'janji', + 'perjanjiannya': 'janji', + 'perjanjianan': 'janji', + 'menjanjikan': 'janji', + 'menjanjikannya': 'janji', + 'menjanjikanlah': 'janji', + 'menjanjikanku': 'janji', + 'menjanjikanmu': 'janji', + 'menjarak': 'jarak', + 'menjarakkan': 'jarak', + 'menjarakan': 'jarak', + 'berjarak': 'jarak', + 'berjarakan': 'jarak', + 'terjarak': 'jarak', + 'menjaraki': 'jarak', + 'berjaya': 'jaya', + 'berjayanya': 'jaya', + 'berjayalah': 'jaya', + 'kejayaan': 'jaya', + 'kejayaannya': 'jaya', + 'menjayakan': 'jaya', + 'keberjayaan': 'jaya', + 'berjeda': 'jeda', + 'terjela': 'jela', + 'berjela': 'jela', + 'berjela-jela': 'jela', + 'jemuran': 'jemur', + 'jemurannya': 'jemur', + 'menjemur': 'jemur', + 'menjemurnya': 'jemur', + 'menjemurkan': 'jemur', + 'berjemur': 'jemur', + 'berjemurnya': 'jemur', + 'berjemurlah': 'jemur', + 'terjemur': 'jemur', + 'penjemuran': 'jemur', + 'penjemurannya': 'jemur', + 'berjenaka': 'jenaka', + 'kejenakaan': 'jenaka', + 'kejenakaannya': 'jenaka', + 'menjengket': 'jengket', + 'berjengket': 'jengket', + 'bersijengket': 'jengket', + 'bersejengket': 'jengket', + 'jerawatan': 'jerawat', + 'berjerawat': 'jerawat', + 'berjimat': 'jimat', + 'berjiran': 'jiran', + 'jualan': 'jual', + 'jualannya': 'jual', + 'jualanlah': 'jual', + 'jualanan': 'jual', + 'jualanku': 'jual', + 'dijual': 'jual', + 'dijualnya': 'jual', + 'dijuallah': 'jual', + 'dijualkan': 'jual', + 'dijualkannya': 'jual', + 'dijuali': 'jual', + 'dijualan': 'jual', + 'menjual': 'jual', + 'menjualnya': 'jual', + 'menjualkan': 'jual', + 'menjualkannya': 'jual', + 'menjuali': 'jual', + 'menjualan': 'jual', + 'menjualku': 'jual', + 'menjualmu': 'jual', + 'terjual': 'jual', + 'terjualnya': 'jual', + 'terjuallah': 'jual', + 'terjualan': 'jual', + 'penjual': 'jual', + 'penjualnya': 'jual', + 'penjualkan': 'jual', + 'penjualan': 'jual', + 'berjual': 'jual', + 'berjualan': 'jual', + 'penjualannya': 'jual', + 'penjualankan': 'jual', + 'penjualanan': 'jual', + 'penjualanku': 'jual', + 'penjualanmu': 'jual', + 'berjualannya': 'jual', + 'berjualanan': 'jual', + 'dijuang': 'juang', + 'dijuangkan': 'juang', + 'pejuang': 'juang', + 'pejuangnya': 'juang', + 'pejuangan': 'juang', + 'berjuang': 'juang', + 'berjuangnya': 'juang', + 'berjuanglah': 'juang', + 'berjuangkan': 'juang', + 'berjuangan': 'juang', + 'kejuangan': 'juang', + 'kejuangannya': 'juang', + 'perjuangan': 'juang', + 'perjuangannya': 'juang', + 'perjuanganlah': 'juang', + 'perjuangankan': 'juang', + 'perjuanganan': 'juang', + 'perjuanganku': 'juang', + 'perjuanganmu': 'juang', + 'kepejuangan': 'juang', + 'memperjuangkan': 'juang', + 'memperjuangkannya': 'juang', + 'pejudi': 'judi', + 'berjudi': 'judi', + 'berjudinya': 'judi', + 'perjudian': 'judi', + 'perjudiannya': 'judi', + 'penjudian': 'judi', + 'menjudikan': 'judi', + 'memperjudikan': 'judi', + 'berjujuh': 'jujuh', + 'menjujuh': 'jujuh', + 'berjumbai': 'jumbai', + 'menjumbai': 'jumbai', + 'terjumbai': 'jumbai', + 'berjumbaian': 'jumbai', + 'jumbai-jumbai': 'jumbai', + 'berjumbai-jumbai': 'jumbai', + 'terjuntai': 'juntai', + 'menjuntai': 'juntai', + 'menjuntainya': 'juntai', + 'menjuntaikan': 'juntai', + 'berjuntai': 'juntai', + 'berjuntaian': 'juntai', + 'penjuntaian': 'juntai', + 'berjuntai-juntai': 'juntai', + 'terjurai': 'jurai', + 'berjurai': 'jurai', + 'berjuraian': 'jurai', + 'jurai-jurai': 'jurai', + 'berjurai-jurai': 'jurai', + 'mengabung': 'kabung', + 'mengabungkan': 'kabung', + 'mengabungkannya': 'kabung', + 'berkabung': 'kabung', + 'berkabungnya': 'kabung', + 'berkabungmu': 'kabung', + 'perkabungan': 'kabung', + 'perkabungannya': 'kabung', + 'mengabung-ngabung': 'kabung', + 'pengabut': 'kabut', + 'pengabutan': 'kabut', + 'berkabut': 'kabut', + 'mengabutkan': 'kabut', + 'mengaki': 'kaki', + 'mengakikan': 'kaki', + 'berkaki': 'kaki', + 'berkala': 'kala', + 'berkalanya': 'kala', + 'berkala-kala': 'kala', + 'berkaliber': 'kaliber', + 'berkanji': 'kanji', + 'kaparan': 'kapar', + 'berkapar': 'kapar', + 'terkapar': 'kapar', + 'terkaparnya': 'kapar', + 'berkaparan': 'kapar', + 'mengaparkan': 'kapar', + 'karatan': 'karat', + 'berkarat': 'karat', + 'berkaratnya': 'karat', + 'berkasan': 'berkas', + 'memberkas': 'berkas', + 'memberkaskan': 'berkas', + 'terberkas': 'berkas', + 'pemberkas': 'berkas', + 'pemberkasan': 'berkas', + 'pemberkasannya': 'berkas', + 'memberkati': 'berkat', + 'memberkatinya': 'berkat', + 'memberkatiku': 'berkat', + 'memberkatimu': 'berkat', + 'keberkatan': 'berkat', + 'pemberkatan': 'berkat', + 'pemberkatannya': 'berkat', + 'mengata': 'kata', + 'mengatakannya': 'kata', + 'mengatai': 'kata', + 'mengataan': 'kata', + 'mengataku': 'kata', + 'berkata': 'kata', + 'berkatalah': 'kata', + 'mengatainya': 'kata', + 'mengataikan': 'kata', + 'mengataian': 'kata', + 'perkataan': 'kata', + 'perkataannya': 'kata', + 'perkataanku': 'kata', + 'perkataanmu': 'kata', + 'terkatakan': 'kata', + 'mengatakankan': 'kata', + 'mengatakani': 'kata', + 'mengatakanan': 'kata', + 'mengatakanku': 'kata', + 'berkata-kata': 'kata', + 'memperkatakan': 'kata', + 'mengata-ngatai': 'kata', + 'mengata-ngatainya': 'kata', + 'kawanan': 'kawan', + 'kawanannya': 'kawan', + 'kawananan': 'kawan', + 'berkawan': 'kawan', + 'berkawanan': 'kawan', + 'perkawanan': 'kawan', + 'perkawanannya': 'kawan', + 'berkayuh': 'kayuh', + 'mengayuh': 'kayuh', + 'mengayuhnya': 'kayuh', + 'mengayuhlah': 'kayuh', + 'mengayuhkan': 'kayuh', + 'pengayuh': 'kayuh', + 'pengayuhnya': 'kayuh', + 'terkayuhkan': 'kayuh', + 'pekebun': 'kebun', + 'pekebunan': 'kebun', + 'berkebun': 'kebun', + 'berkebunnya': 'kebun', + 'berkebunan': 'kebun', + 'perkebunan': 'kebun', + 'perkebunannya': 'kebun', + 'perkebunanlah': 'kebun', + 'perkebunanan': 'kebun', + 'memperkebuni': 'kebun', + 'memperkebunkan': 'kebun', + 'berkecai': 'kecai', + 'terkecai': 'kecai', + 'berkecai-kecai': 'kecai', + 'pengecambah': 'kecambah', + 'pengecambahan': 'kecambah', + 'berkecambah': 'kecambah', + 'berkecambahnya': 'kecambah', + 'perkecambahan': 'kecambah', + 'mengecambahkan': 'kecambah', + 'berkecamuk': 'kecamuk', + 'berkecamuknya': 'kecamuk', + 'berkecimpung': 'kecimpung', + 'berkecimpungnya': 'kecimpung', + 'kedaian': 'kedai', + 'pekedai': 'kedai', + 'berkedai': 'kedai', + 'terkedai': 'kedai', + 'perkedaian': 'kedai', + 'mengedaikan': 'kedai', + 'memperkedaikan': 'kedai', + 'kedutan': 'kedut', + 'kedutannya': 'kedut', + 'kedutanan': 'kedut', + 'berkedut': 'kedut', + 'berkedutan': 'kedut', + 'mengedut': 'kedut', + 'mengedutkan': 'kedut', + 'kekekalan': 'kekal', + 'berkekalan': 'kekal', + 'mengekalkan': 'kekal', + 'mengekalkannya': 'kekal', + 'berkeladak': 'keladak', + 'berkelahi': 'kelahi', + 'berkelahinya': 'kelahi', + 'berkelahian': 'kelahi', + 'perkelahian': 'kelahi', + 'perkelahiannya': 'kelahi', + 'memperkelahikan': 'kelahi', + 'berkelakar': 'kelakar', + 'berkelana': 'kelana', + 'berkelananya': 'kelana', + 'pengelana': 'kelana', + 'pengelanaan': 'kelana', + 'mengelana': 'kelana', + 'sekeliling': 'keliling', + 'sekelilingnya': 'keliling', + 'sekelilingku': 'keliling', + 'sekelilingmu': 'keliling', + 'berkeliling': 'keliling', + 'berkelilingnya': 'keliling', + 'berkelilinglah': 'keliling', + 'berkelilingi': 'keliling', + 'pengeliling': 'keliling', + 'pengelilingan': 'keliling', + 'mengelilingi': 'keliling', + 'mengelilinginya': 'keliling', + 'mengelilingiku': 'keliling', + 'mengelilingimu': 'keliling', + 'mengelilingkan': 'keliling', + 'berkelok': 'kelok', + 'mengelok': 'kelok', + 'mengelokkan': 'kelok', + 'berkelok-kelok': 'kelok', + 'berkelok-keloknya': 'kelok', + 'berkelopak': 'kelopak', + 'terkelopak': 'kelopak', + 'mengelopak': 'kelopak', + 'berkeluarga': 'keluarga', + 'kekeluargaan': 'keluarga', + 'kekeluargaannya': 'keluarga', + 'kekeluargaanlah': 'keluarga', + 'perkeluargaan': 'keluarga', + 'kemasan': 'kemas', + 'kemasannya': 'kemas', + 'kemasanlah': 'kemas', + 'kemasani': 'kemas', + 'kemasanan': 'kemas', + 'berkemas': 'kemas', + 'berkemasan': 'kemas', + 'pengemas': 'kemas', + 'pengemasnya': 'kemas', + 'pengemasan': 'kemas', + 'mengemas': 'kemas', + 'mengemasnya': 'kemas', + 'mengemaskan': 'kemas', + 'mengemaskannya': 'kemas', + 'mengemasi': 'kemas', + 'mengemasinya': 'kemas', + 'perkemasan': 'kemas', + 'pengemasannya': 'kemas', + 'kembangan': 'kembang', + 'kembangannya': 'kembang', + 'kembangankan': 'kembang', + 'berkembang': 'kembang', + 'berkembangnya': 'kembang', + 'berkembanglah': 'kembang', + 'berkembangkan': 'kembang', + 'berkembangan': 'kembang', + 'pengembang': 'kembang', + 'pengembangnya': 'kembang', + 'pengembanglah': 'kembang', + 'pengembangkan': 'kembang', + 'pengembangkannya': 'kembang', + 'pengembangan': 'kembang', + 'mengembang': 'kembang', + 'mengembangnya': 'kembang', + 'mengembangkan': 'kembang', + 'mengembangkannya': 'kembang', + 'mengembangi': 'kembang', + 'mengembangan': 'kembang', + 'pengembangannya': 'kembang', + 'pengembangankan': 'kembang', + 'pengembanganan': 'kembang', + 'perkembangan': 'kembang', + 'perkembangannya': 'kembang', + 'perkembanganlah': 'kembang', + 'perkembanganan': 'kembang', + 'perkembangannyalah': 'kembang', + 'perkembanganku': 'kembang', + 'mengembangkankan': 'kembang', + 'memperkembangkan': 'kembang', + 'kembaran': 'kembar', + 'kembarannya': 'kembar', + 'kembaranku': 'kembar', + 'berkembar': 'kembar', + 'mengembari': 'kembar', + 'mengembarkan': 'kembar', + 'pengemudi': 'kemudi', + 'pengemudinya': 'kemudi', + 'pengemudilah': 'kemudi', + 'pengemudikan': 'kemudi', + 'pengemudian': 'kemudi', + 'berkemudi': 'kemudi', + 'mengemudikan': 'kemudi', + 'mengemudikannya': 'kemudi', + 'berkenan': 'kenan', + 'berkenannya': 'kenan', + 'berkenanan': 'kenan', + 'perkenan': 'kenan', + 'perkenannya': 'kenan', + 'perkenankan': 'kenan', + 'perkenanan': 'kenan', + 'memperkenankan': 'kenan', + 'memperkenankannya': 'kenan', + 'terkepak': 'kepak', + 'berkepak': 'kepak', + 'mengepak': 'pak', + 'mengepaknya': 'pak', + 'mengepakkan': 'pak', + 'mengepakkannya': 'pak', + 'mengepaki': 'pak', + 'mengepakan': 'pak', + 'terkepak-kepak': 'kepak', + 'berkepak-kepak': 'kepak', + 'mengepak-ngepak': 'kepak', + 'mengepak-ngepakkan': 'kepak', + 'kepungan': 'kepung', + 'kepungannya': 'kepung', + 'terkepung': 'kepung', + 'terkepungnya': 'kepung', + 'pengepung': 'kepung', + 'pengepungnya': 'kepung', + 'pengepungkan': 'kepung', + 'pengepungan': 'kepung', + 'berkepung': 'kepung', + 'mengepung': 'kepung', + 'mengepungnya': 'kepung', + 'pengepungannya': 'kepung', + 'terkerak': 'kerak', + 'terkeraknya': 'kerak', + 'berkerak': 'kerak', + 'pengeras': 'keras', + 'pengerasnya': 'keras', + 'pengerasan': 'keras', + 'mengeras': 'keras', + 'mengerasnya': 'keras', + 'mengeraskan': 'keras', + 'mengeraskannya': 'keras', + 'mengerasi': 'keras', + 'mengerasan': 'keras', + 'berkeras': 'keras', + 'berkerasnya': 'keras', + 'berkerasi': 'keras', + 'mengerasikannya': 'keras', + 'kekerasan': 'keras', + 'kekerasannya': 'keras', + 'kekerasanlah': 'keras', + 'kekerasanan': 'keras', + 'bersikeras': 'sikeras', + 'bersikerasnya': 'sikeras', + 'bersikerasi': 'sikeras', + 'memperkeras': 'keras', + 'keras-mengerasi': 'keras', + 'berkeras-kerasan': 'keras', + 'berkeringat': 'keringat', + 'berkeringatlah': 'keringat', + 'berkeringatan': 'keringat', + 'mengeringatkan': 'keringat', + 'berkeriut': 'keriut', + 'berkeriutan': 'keriut', + 'kerumunan': 'kerumun', + 'kerumunannya': 'kerumun', + 'kerumunanan': 'kerumun', + 'sekerumun': 'kerumun', + 'sekerumunan': 'kerumun', + 'berkerumun': 'kerumun', + 'berkerumunnya': 'kerumun', + 'berkerumunan': 'kerumun', + 'mengerumuni': 'kerumun', + 'mengerumuninya': 'kerumun', + 'mengerumuniku': 'kerumun', + 'mengerut': 'kerut', + 'mengerutnya': 'kerut', + 'mengerutkan': 'kerut', + 'mengerutkannya': 'kerut', + 'terkerut': 'kerut', + 'berkerut': 'kerut', + 'pengerut': 'kerut', + 'pengerutan': 'kerut', + 'berkerut-kerut': 'kerut', + 'bersinambung': 'sinambung', + 'bersinambungan': 'sinambung', + 'kesinambungan': 'sinambung', + 'kesinambungannya': 'sinambung', + 'menyinambungkan': 'sinambung', + 'berkesinambungan': 'sinambung', + 'berkesinambungannya': 'sinambung', + 'berkesot': 'kesot', + 'mengesot': 'kesot', + 'terkesot-kesot': 'kesot', + 'berketak': 'ketak', + 'berketuk-ketak': 'ketak', + 'berketak-ketik': 'ketak', + 'berketak-ketak': 'ketak', + 'ketukan': 'ketuk', + 'ketukannya': 'ketuk', + 'pengetuk': 'ketuk', + 'pengetukan': 'ketuk', + 'terketuk': 'ketuk', + 'mengetuk': 'ketuk', + 'mengetuknya': 'ketuk', + 'mengetukkan': 'ketuk', + 'mengetuki': 'ketuk', + 'mengetukan': 'ketuk', + 'berketuk': 'ketuk', + 'berkhasiat': 'khasiat', + 'berkhasiatnya': 'khasiat', + 'mengkhasiati': 'khasiat', + 'berkhidmat': 'khidmat', + 'kekhidmatan': 'khidmat', + 'kekhidmatannya': 'khidmat', + 'kibaran': 'kibar', + 'pengibar': 'kibar', + 'pengibarnya': 'kibar', + 'pengibaran': 'kibar', + 'berkibar': 'kibar', + 'berkibarnya': 'kibar', + 'berkibarlah': 'kibar', + 'berkibaran': 'kibar', + 'pengibarannya': 'kibar', + 'mengibarkan': 'kibar', + 'mengibarkannya': 'kibar', + 'berkibar-kibar': 'kibar', + 'mengibar-ngibarkan': 'kibar', + 'mengibar-ngibarkannya': 'kibar', + 'kicauan': 'kicau', + 'kicauannya': 'kicau', + 'kicauanmu': 'kicau', + 'berkicau': 'kicau', + 'berkicaunya': 'kicau', + 'berkicaulah': 'kicau', + 'berkicauan': 'kicau', + 'kilatan': 'kilat', + 'kilatannya': 'kilat', + 'mengilat': 'kilat', + 'berkilat': 'kilat', + 'berkilatan': 'kilat', + 'terkilat': 'kilat', + 'mengilatkan': 'kilat', + 'berkilat-kilat': 'kilat', + 'mengilat-ngilatkan': 'kilat', + 'kilauan': 'kilau', + 'kilauannya': 'kilau', + 'mengilau': 'kilau', + 'mengilaukan': 'kilau', + 'berkilau': 'kilau', + 'berkilaunya': 'kilau', + 'berkilaulah': 'kilau', + 'berkilauan': 'kilau', + 'berkilauannya': 'kilau', + 'kilau-mengilau': 'kilau', + 'berkilau-kilauan': 'kilau', + 'kiriman': 'kirim', + 'kirimannya': 'kirim', + 'kirimanmu': 'kirim', + 'terkirim': 'kirim', + 'terkirimnya': 'kirim', + 'terkirimlah': 'kirim', + 'terkirimkan': 'kirim', + 'pengirim': 'kirim', + 'pengirimnya': 'kirim', + 'pengirimkan': 'kirim', + 'pengiriman': 'kirim', + 'mengirim': 'kirim', + 'mengirimnya': 'kirim', + 'mengirimkan': 'kirim', + 'mengirimkannya': 'kirim', + 'mengirimi': 'kirim', + 'mengiriman': 'kirim', + 'mengirimku': 'kirim', + 'mengirimmu': 'kirim', + 'berkirim': 'kirim', + 'mengiriminya': 'kirim', + 'mengirimikan': 'kirim', + 'mengirimiku': 'kirim', + 'mengirimimu': 'kirim', + 'berkiriman': 'kirim', + 'perkiriman': 'kirim', + 'pengirimannya': 'kirim', + 'pengirimanan': 'kirim', + 'mengirimkankan': 'kirim', + 'mengirimkankannya': 'kirim', + 'mengirimkanku': 'kirim', + 'mengirimkanmu': 'kirim', + 'kirim-berkirim': 'kirim', + 'berkirim-kiriman': 'kirim', + 'kisaran': 'kisar', + 'kisarannya': 'kisar', + 'berkisar': 'kisar', + 'berkisaran': 'kisar', + 'mengisar': 'kisar', + 'pengisar': 'kisar', + 'pengisaran': 'kisar', + 'perkisaran': 'kisar', + 'mengisarkan': 'kisar', + 'berkisar-kisar': 'kisar', + 'sekitar': 'kitar', + 'sekitarnya': 'kitar', + 'sekitarlah': 'kitar', + 'sekitari': 'kitar', + 'sekitaran': 'kitar', + 'sekitarnyalah': 'kitar', + 'sekitarku': 'kitar', + 'sekitarmu': 'kitar', + 'berkitar': 'kitar', + 'mengitar': 'kitar', + 'mengitarkan': 'kitar', + 'mengitari': 'kitar', + 'mengitarinya': 'kitar', + 'pengitaran': 'kitar', + 'memperkitarkan': 'kitar', + 'terkitar-kitar': 'kitar', + 'mengitar-ngitar': 'kitar', + 'kobaran': 'kobar', + 'kobarannya': 'kobar', + 'terkobar': 'kobar', + 'berkobar': 'kobar', + 'berkobarnya': 'kobar', + 'berkobarlah': 'kobar', + 'berkobaran': 'kobar', + 'pengobaran': 'kobar', + 'mengobarkan': 'kobar', + 'terkobarkan': 'kobar', + 'berkobar-kobar': 'kobar', + 'berkobar-kobarnya': 'kobar', + 'berkocak': 'kocak', + 'terkocak': 'kocak', + 'mengocak': 'kocak', + 'mengocakkan': 'kocak', + 'berkocak-kocak': 'kocak', + 'berkokok': 'kokok', + 'berkokoknya': 'kokok', + 'komplotan': 'komplot', + 'komplotannya': 'komplot', + 'berkomplot': 'komplot', + 'berkomplotan': 'komplot', + 'berkompromi': 'kompromi', + 'berkompromilah': 'kompromi', + 'kongsian': 'kongsi', + 'berkongsi': 'kongsi', + 'perkongsian': 'kongsi', + 'perkongsiannya': 'kongsi', + 'berkotek': 'kotek', + 'berkuasa': 'kuasa', + 'berkuasanya': 'kuasa', + 'berkuasalah': 'kuasa', + 'berkuasai': 'kuasa', + 'penguasa': 'kuasa', + 'penguasanya': 'kuasa', + 'penguasai': 'kuasa', + 'penguasaan': 'kuasa', + 'kekuasaan': 'kuasa', + 'kekuasaannya': 'kuasa', + 'kekuasaanlah': 'kuasa', + 'kekuasaanku': 'kuasa', + 'kekuasaanmu': 'kuasa', + 'kekuasaan-ku': 'kuasa', + 'kekuasaan-mu': 'kuasa', + 'terkuasai': 'kuasa', + 'terkuasainya': 'kuasa', + 'menguasai': 'kuasa', + 'menguasainya': 'kuasa', + 'menguasaii': 'kuasa', + 'menguasaimu': 'kuasa', + 'penguasaannya': 'kuasa', + 'sekuasanya': 'kuasa', + 'menguasakan': 'kuasa', + 'sekuasa-kuasanya': 'kuasa', + 'sekuat': 'kuat', + 'sekuatnya': 'kuat', + 'menguat': 'kuat', + 'menguatnya': 'kuat', + 'menguatlah': 'kuat', + 'menguatkan': 'kuat', + 'menguatkannya': 'kuat', + 'menguati': 'kuat', + 'menguatan': 'kuat', + 'berkuat': 'kuat', + 'berkuatan': 'kuat', + 'penguat': 'kuat', + 'penguatnya': 'kuat', + 'penguatkan': 'kuat', + 'penguatan': 'kuat', + 'kekuatan': 'kuat', + 'kekuatannya': 'kuat', + 'kekuatanan': 'kuat', + 'kekuatanku': 'kuat', + 'kekuatanmu': 'kuat', + 'kekuatan-mu': 'kuat', + 'penguatannya': 'kuat', + 'penguatanan': 'kuat', + 'kuat-kuat': 'kuat', + 'kuat-kuatnya': 'kuat', + 'kuat-kuatan': 'kuat', + 'memperkuat': 'kuat', + 'memperkuatnya': 'kuat', + 'memperkuatkan': 'kuat', + 'memperkuatan': 'kuat', + 'berkuat-kuat': 'kuat', + 'berkuat-kuatan': 'kuat', + 'sekuat-kuatnya': 'kuat', + 'berkubah': 'kubah', + 'kubangan': 'kubang', + 'kubangannya': 'kubang', + 'berkubang': 'kubang', + 'berkubangnya': 'kubang', + 'mengubangkan': 'ubang', + 'terkubu': 'kubu', + 'berkubu': 'kubu', + 'mengubui': 'kubu', + 'perkubuan': 'kubu', + 'berkuda': 'kuda', + 'berkudanya': 'kuda', + 'perkudaan': 'kuda', + 'memperkuda': 'kuda', + 'kuda-kudaan': 'kuda', + 'memperkuda-kudakan': 'kuda', + 'sekuku': 'kuku', + 'berkuku': 'kuku', + 'berkulat': 'kulat', + 'kulian': 'kuli', + 'berkuli': 'kuli', + 'menguli': 'uli', + 'berkuliah': 'kuliah', + 'menguliahi': 'kuliah', + 'kumpulan': 'kumpul', + 'kumpulannya': 'kumpul', + 'terkumpul': 'kumpul', + 'terkumpulnya': 'kumpul', + 'terkumpullah': 'kumpul', + 'terkumpulkan': 'kumpul', + 'pengumpul': 'kumpul', + 'pengumpulnya': 'kumpul', + 'pengumpulkan': 'kumpul', + 'pengumpulan': 'kumpul', + 'berkumpul': 'kumpul', + 'berkumpulnya': 'kumpul', + 'berkumpullah': 'kumpul', + 'berkumpulkan': 'kumpul', + 'berkumpulan': 'kumpul', + 'pengumpulannya': 'kumpul', + 'pengumpulanan': 'kumpul', + 'perkumpulan': 'kumpul', + 'perkumpulannya': 'kumpul', + 'perkumpulanlah': 'kumpul', + 'mengumpulkan': 'kumpul', + 'mengumpulkannya': 'kumpul', + 'berkumur': 'kumur', + 'berkumurlah': 'kumur', + 'berkumuran': 'kumur', + 'berkumur-kumur': 'kumur', + 'kunjungan': 'kunjung', + 'kunjungannya': 'kunjung', + 'kunjunganku': 'kunjung', + 'kunjunganmu': 'kunjung', + 'pengunjung': 'kunjung', + 'pengunjungnya': 'kunjung', + 'pengunjunglah': 'kunjung', + 'pengunjungi': 'kunjung', + 'pengunjungan': 'kunjung', + 'berkunjung': 'kunjung', + 'berkunjungnya': 'kunjung', + 'berkunjunglah': 'kunjung', + 'berkunjungi': 'kunjung', + 'berkunjungan': 'kunjung', + 'mengunjungi': 'kunjung', + 'mengunjunginya': 'kunjung', + 'mengunjungii': 'kunjung', + 'mengunjungiku': 'kunjung', + 'mengunjungimu': 'kunjung', + 'berkunjung-kunjungan': 'kunjung', + 'pengurang': 'kurang', + 'pengurangnya': 'kurang', + 'pengurangkan': 'kurang', + 'pengurangi': 'kurang', + 'pengurangan': 'kurang', + 'berkurang': 'kurang', + 'berkurangnya': 'kurang', + 'berkuranglah': 'kurang', + 'berkurangkan': 'kurang', + 'berkurangi': 'kurang', + 'berkurangan': 'kurang', + 'mengurang': 'kurang', + 'mengurangnya': 'kurang', + 'mengurangkan': 'kurang', + 'mengurangkannya': 'kurang', + 'mengurangi': 'kurang', + 'mengurangan': 'kurang', + 'kekurangan': 'kurang', + 'kekurangannya': 'kurang', + 'kekuranganan': 'kurang', + 'kekuranganku': 'kurang', + 'kekuranganmu': 'kurang', + 'menguranginya': 'kurang', + 'mengurangii': 'kurang', + 'pengurangannya': 'kurang', + 'kurang-kurang': 'kurang', + 'kurang-kurangnya': 'kurang', + 'kurang-kurangi': 'kurang', + 'kurang-kurangan': 'kurang', + 'berkekurangan': 'kurang', + 'sekurang-kurangnya': 'kurang', + 'sekurang-kurangnyanya': 'kurang', + 'melabuh': 'labuh', + 'melabuhkan': 'labuh', + 'melabuhkannya': 'labuh', + 'labuhan': 'labuh', + 'labuhannya': 'labuh', + 'berlabuh': 'labuh', + 'berlabuhnya': 'labuh', + 'berlabuhan': 'labuh', + 'pelabuhan': 'labuh', + 'pelabuhannya': 'labuh', + 'pelabuhanlah': 'labuh', + 'pelabuhanan': 'labuh', + 'peladang': 'ladang', + 'peladangan': 'ladang', + 'berladang': 'ladang', + 'berladangnya': 'ladang', + 'perladangan': 'ladang', + 'perladangannya': 'ladang', + 'memperladang': 'ladang', + 'memperladangi': 'ladang', + 'memperladangkan': 'ladang', + 'melaga': 'laga', + 'melagakan': 'lagak', + 'belaga': 'laga', + 'pelaga': 'laga', + 'pelagai': 'laga', + 'berlaga': 'laga', + 'berlaganya': 'laga', + 'berlagalah': 'laga', + 'berlagai': 'laga', + 'perlagaan': 'laga', + 'memperlagakan': 'laga', + 'melaini': 'lain', + 'kelainan': 'lain', + 'kelainannya': 'lain', + 'kelainanan': 'lain', + 'berlainan': 'lain', + 'berlainannya': 'lain', + 'perlainan': 'lain', + 'melainkan': 'lain', + 'melainkanan': 'lain', + 'memperlain': 'lain', + 'berkelainan': 'lain', + 'memperlainkan': 'lain', + 'berlain-lainan': 'lain', + 'lakuan': 'laku', + 'selaku': 'laku', + 'selakunya': 'laku', + 'selakukan': 'laku', + 'selakui': 'laku', + 'pelaku': 'laku', + 'pelakunya': 'laku', + 'pelakulah': 'laku', + 'pelakukan': 'laku', + 'pelakukannya': 'laku', + 'pelakui': 'laku', + 'pelakuan': 'laku', + 'berlaku': 'laku', + 'berlakunya': 'laku', + 'berlakulah': 'laku', + 'berlakukan': 'laku', + 'berlakukannya': 'laku', + 'berlakui': 'laku', + 'berlakuan': 'laku', + 'kelakuan': 'laku', + 'kelakuannya': 'laku', + 'kelakuanku': 'laku', + 'kelakuanmu': 'laku', + 'perlakuan': 'laku', + 'perlakuannya': 'laku', + 'perlakuanmu': 'laku', + 'melakukan': 'laku', + 'melakukannya': 'laku', + 'melakukankan': 'laku', + 'melakukankannya': 'laku', + 'melakukani': 'laku', + 'melakukanan': 'laku', + 'keberlakuan': 'laku', + 'keberlakuannya': 'laku', + 'pemberlakuan': 'laku', + 'pemberlakuannya': 'laku', + 'memberlakukan': 'laku', + 'memberlakukannya': 'laku', + 'memperlakukan': 'laku', + 'memperlakukannya': 'laku', + 'memperlakukanku': 'laku', + 'memperlakukanmu': 'laku', + 'laluan': 'lalu', + 'melalui': 'lalu', + 'melaluinya': 'lalu', + 'melaluii': 'lalu', + 'berlalu': 'lalu', + 'berlalunya': 'lalu', + 'berlalulah': 'lalu', + 'berlalukan': 'lalu', + 'berlaluan': 'lalu', + 'terlalu': 'lalu', + 'terlalulah': 'lalu', + 'terlalui': 'lalu', + 'kelaluan': 'lalu', + 'melalukan': 'lalu', + 'melalukannya': 'lalu', + 'keterlaluan': 'terlalu', + 'keterlaluannya': 'terlalu', + 'keterlaluanlah': 'terlalu', + 'berkelaluan': 'lalu', + 'melambak': 'lambak', + 'terlambak': 'lambak', + 'berlambak': 'lambak', + 'berlambak-lambak': 'lambak', + 'melanjut': 'lanjut', + 'melanjutnya': 'lanjut', + 'melanjutkan': 'lanjut', + 'melanjutkannya': 'lanjut', + 'melanjuti': 'lanjut', + 'melanjutan': 'lanjut', + 'lanjutan': 'lanjut', + 'lanjutannya': 'lanjut', + 'lanjutanlah': 'lanjut', + 'pelanjut': 'lanjut', + 'pelanjutnya': 'lanjut', + 'pelanjutkan': 'lanjut', + 'pelanjutan': 'lanjut', + 'berlanjut': 'lanjut', + 'berlanjutnya': 'lanjut', + 'berlanjutlah': 'lanjut', + 'berlanjutkan': 'lanjut', + 'berlanjutan': 'lanjut', + 'pelanjutannya': 'lanjut', + 'kelanjutan': 'lanjut', + 'kelanjutannya': 'lanjut', + 'kelanjutanku': 'lanjut', + 'selanjutnya': 'lanjut', + 'selanjutnyalah': 'lanjut', + 'selanjutnyai': 'lanjut', + 'melanjutkankan': 'lanjut', + 'melanjutkani': 'lanjut', + 'perlanjutan': 'lanjut', + 'berkelanjutan': 'lanjut', + 'berkelanjutannya': 'lanjut', + 'melapuk': 'lapuk', + 'melapuknya': 'lapuk', + 'melapukkan': 'lapuk', + 'berlapuk': 'lapuk', + 'pelapukan': 'lapuk', + 'pelapukannya': 'lapuk', + 'kelapukan': 'lapuk', + 'berlapuk-lapuk': 'lapuk', + 'larian': 'lari', + 'lariannya': 'lari', + 'pelari': 'lari', + 'pelarinya': 'lari', + 'pelarilah': 'lari', + 'pelarikan': 'lari', + 'pelarian': 'lari', + 'selari': 'lari', + 'berlari': 'lari', + 'berlarinya': 'lari', + 'berlarilah': 'lari', + 'berlarikan': 'lari', + 'berlarii': 'lari', + 'berlarian': 'lari', + 'pelariannya': 'lari', + 'pelarianku': 'lari', + 'berlariani': 'lari', + 'melarikan': 'lari', + 'melarikannya': 'lari', + 'lari-lari': 'lari', + 'lari-larinya': 'lari', + 'lari-larian': 'lari', + 'sepelarian': 'lari', + 'berlari-lari': 'lari', + 'berlari-larian': 'lari', + 'pelatih': 'latih', + 'pelatihnya': 'latih', + 'pelatihlah': 'latih', + 'pelatihi': 'latih', + 'pelatihan': 'latih', + 'pelatihnyalah': 'latih', + 'pelatihku': 'latih', + 'pelatihmu': 'latih', + 'latihan': 'latih', + 'latihannya': 'latih', + 'latihanlah': 'latih', + 'latihani': 'latih', + 'latihanan': 'latih', + 'latihanku': 'latih', + 'latihanmu': 'latih', + 'melatih': 'latih', + 'melatihnya': 'latih', + 'melatihkan': 'latih', + 'melatihi': 'latih', + 'melatihan': 'latih', + 'melatihku': 'latih', + 'melatihmu': 'latih', + 'terlatih': 'latih', + 'terlatihnya': 'latih', + 'terlatihlah': 'latih', + 'berlatih': 'latih', + 'berlatihnya': 'latih', + 'berlatihlah': 'latih', + 'berlatihkan': 'latih', + 'berlatihi': 'latih', + 'berlatihan': 'latih', + 'pelatihannya': 'latih', + 'pelatihanan': 'latih', + 'pelatihanku': 'latih', + 'melawan': 'lawan', + 'melawannya': 'lawan', + 'melawanlah': 'lawan', + 'melawankan': 'lawan', + 'melawani': 'lawan', + 'melawanan': 'lawan', + 'melawanku': 'lawan', + 'melawanmu': 'lawan', + 'pelawan': 'lawan', + 'pelawanan': 'lawan', + 'terlawan': 'lawan', + 'terlawankan': 'lawan', + 'terlawanan': 'lawan', + 'berlawan': 'lawan', + 'berlawanan': 'lawan', + 'kelawanan': 'lawan', + 'perlawanan': 'lawan', + 'perlawanannya': 'lawan', + 'perlawananlah': 'lawan', + 'perlawananan': 'lawan', + 'perlawananmu': 'lawan', + 'berlawanannya': 'lawan', + 'berlawananan': 'lawan', + 'memperlawankan': 'lawan', + 'berlemak': 'lemak', + 'melepas': 'lepas', + 'melepasnya': 'lepas', + 'melepaskan': 'lepas', + 'melepaskannya': 'lepas', + 'melepasi': 'lepas', + 'melepasan': 'lepas', + 'melepasku': 'lepas', + 'melepasmu': 'lepas', + 'pelepas': 'lepas', + 'pelepasnya': 'lepas', + 'pelepaskan': 'lepas', + 'pelepasan': 'lepas', + 'selepas': 'lepas', + 'selepasnya': 'lepas', + 'lepasan': 'lepas', + 'berlepas': 'lepas', + 'terlepas': 'lepas', + 'terlepasnya': 'lepas', + 'terlepaslah': 'lepas', + 'terlepaskan': 'lepas', + 'kelepasan': 'lepas', + 'pelepasannya': 'lepas', + 'melepaskankan': 'lepas', + 'melepaskanku': 'lepas', + 'melepaskanmu': 'lepas', + 'memperlepas': 'lepas', + 'selepas-lepas': 'lepas', + 'selepas-lepasnya': 'lepas', + 'liburan': 'libur', + 'liburannya': 'libur', + 'liburanlah': 'libur', + 'liburanku': 'libur', + 'liburanmu': 'libur', + 'berlibur': 'libur', + 'berliburnya': 'libur', + 'berliburlah': 'libur', + 'berliburan': 'libur', + 'meliburkan': 'libur', + 'meliburkannya': 'libur', + 'lindungan': 'lindung', + 'lindungannya': 'lindung', + 'lindunganmu': 'lindung', + 'pelindung': 'lindung', + 'pelindungnya': 'lindung', + 'pelindungi': 'lindung', + 'pelindungan': 'lindung', + 'pelindungku': 'lindung', + 'pelindungmu': 'lindung', + 'terlindung': 'lindung', + 'terlindungnya': 'lindung', + 'terlindungi': 'lindung', + 'terlindungan': 'lindung', + 'berlindung': 'lindung', + 'berlindungnya': 'lindung', + 'berlindunglah': 'lindung', + 'berlindungi': 'lindung', + 'berlindungan': 'lindung', + 'melindungi': 'lindung', + 'melindunginya': 'lindung', + 'melindungiku': 'lindung', + 'melindungimu': 'lindung', + 'kelindungan': 'lindung', + 'pelindungannya': 'lindung', + 'melindungkan': 'lindung', + 'perlindungan': 'lindung', + 'perlindungannya': 'lindung', + 'perlindungani': 'lindung', + 'perlindunganan': 'lindung', + 'memperlindungi': 'lindung', + 'longgokan': 'longgok', + 'berlonggok': 'longgok', + 'terlonggok': 'longgok', + 'melonggokkan': 'longgok', + 'berlonggoklonggok': 'longgok', + 'berlorong': 'lorong', + 'melorongkan': 'lorong', + 'pelubang': 'lubang', + 'pelubangan': 'lubang', + 'melubangi': 'lubang', + 'melubanginya': 'lubang', + 'berlubang': 'lubang', + 'berlubangnya': 'lubang', + 'berlubangi': 'lubang', + 'berlubang-lubang': 'lubang', + 'meludah': 'ludah', + 'meludahlah': 'ludah', + 'meludahkan': 'ludah', + 'meludahkannya': 'ludah', + 'meludahi': 'ludah', + 'berludah': 'ludah', + 'meludahinya': 'ludah', + 'meludahiku': 'ludah', + 'peludahan': 'ludah', + 'berlumpur': 'lumpur', + 'berlumpuran': 'lumpur', + 'pelumpuran': 'lumpur', + 'lumuran': 'lumur', + 'melumur': 'lumur', + 'melumurkan': 'lumur', + 'melumurkannya': 'lumur', + 'melumuri': 'lumur', + 'berlumur': 'lumur', + 'berlumurkan': 'lumur', + 'berlumuran': 'lumur', + 'melumurinya': 'lumur', + 'berlumut': 'lumut', + 'berlumutan': 'lumut', + 'melutut': 'lutut', + 'berlutut': 'lutut', + 'berlututlah': 'lutut', + 'bermakna': 'makna', + 'bermaknanya': 'makna', + 'memaknakan': 'makna', + 'membermaknakan': 'makna', + 'dimaksud': 'maksud', + 'dimaksudnya': 'maksud', + 'dimaksudkan': 'maksud', + 'dimaksudkannya': 'maksud', + 'dimaksudan': 'maksud', + 'termaksud': 'maksud', + 'bermaksud': 'maksud', + 'bermaksudkan': 'maksud', + 'semalam': 'malam', + 'semalamnya': 'malam', + 'semalaman': 'malam', + 'memalami': 'malam', + 'bermalam': 'malam', + 'bermalamnya': 'malam', + 'bermalamlah': 'malam', + 'kemalaman': 'malam', + 'pemalaman': 'palam', + 'permalaman': 'malam', + 'memalamkan': 'malam', + 'malam-malam': 'malam', + 'malam-malamnya': 'malam', + 'malam-malamlah': 'malam', + 'malam-malamku': 'malam', + 'bermalam-malam': 'malam', + 'mempermalamkan': 'malam', + 'semalam-malaman': 'malam', + 'bermanfaat': 'manfaat', + 'bermanfaatnya': 'manfaat', + 'bermanfaatlah': 'manfaat', + 'bermanfaatkan': 'manfaat', + 'kemanfaatan': 'manfaat', + 'kemanfaatannya': 'manfaat', + 'pemanfaatan': 'manfaat', + 'pemanfaatannya': 'manfaat', + 'pemanfaatanan': 'manfaat', + 'memanfaatkan': 'manfaat', + 'memanfaatkannya': 'manfaat', + 'memanfaatkankan': 'manfaat', + 'memanfaatkanmu': 'manfaat', + 'bermastautin': 'mastautin', + 'semata': 'mata', + 'sematanya': 'mata', + 'sematai': 'mata', + 'bermata': 'mata', + 'bermatakan': 'mata', + 'semata-mata': 'semata', + 'termata-mata': 'mata', + 'pemenung': 'menung', + 'bermenung': 'menung', + 'termenung': 'menung', + 'kemenungan': 'menung', + 'memenungkan': 'menung', + 'bermenung-menung': 'menung', + 'termenung-menung': 'menung', + 'mimpian': 'mimpi', + 'pemimpi': 'mimpi', + 'pemimpinya': 'mimpi', + 'pemimpilah': 'mimpi', + 'pemimpian': 'mimpi', + 'bermimpi': 'mimpi', + 'bermimpinya': 'mimpi', + 'bermimpilah': 'mimpi', + 'bermimpikan': 'mimpi', + 'memimpikan': 'mimpi', + 'memimpikannya': 'mimpi', + 'termimpi-mimpi': 'mimpi', + 'peminat': 'minat', + 'peminatnya': 'minat', + 'peminatan': 'minat', + 'meminati': 'minat', + 'meminatinya': 'minat', + 'meminatiku': 'minat', + 'berminat': 'minat', + 'berminatnya': 'minat', + 'berminatkan': 'minat', + 'meminyaki': 'minyak', + 'meminyakinya': 'minyak', + 'berminyak': 'minyak', + 'perminyakan': 'minyak', + 'perminyakannya': 'minyak', + 'berminyak-minyak': 'minyak', + 'bermoral': 'moral', + 'bermoralnya': 'moral', + 'memotori': 'motor', + 'memotorinya': 'motor', + 'bermotor': 'motor', + 'bermotornya': 'motor', + 'pemuka': 'muka', + 'pemukanya': 'muka', + 'pemukaan': 'muka', + 'semuka': 'muka', + 'ke muka': 'muka', + 'di muka': 'muka', + 'bermuka': 'muka', + 'mengemuka': 'muka', + 'mengemukanya': 'muka', + 'mengemukakan': 'muka', + 'mengemukakannya': 'muka', + 'mengemukaan': 'muka', + 'bersemuka': 'muka', + 'terkemuka': 'muka', + 'terkemukanya': 'muka', + 'permukaan': 'muka', + 'permukaannya': 'muka', + 'pengemukaan': 'muka', + 'bermuka-muka': 'muka', + 'menyemukakan': 'muka', + 'muka-muka': 'muka', + 'bermukah': 'mukah', + 'bermuram': 'muram', + 'kemuraman': 'muram', + 'kemuramannya': 'muram', + 'memuramkan': 'muram', + 'bermusuh': 'musuh', + 'bermusuhkan': 'musuh', + 'bermusuhan': 'musuh', + 'memusuhi': 'musuh', + 'memusuhinya': 'musuh', + 'memusuhimu': 'musuh', + 'bermusuhannya': 'musuh', + 'permusuhan': 'musuh', + 'permusuhannya': 'musuh', + 'semutu': 'mutu', + 'bermutu': 'mutu', + 'bermutunya': 'mutu', + 'bermutulah': 'mutu', + 'bernafsu': 'nafsu', + 'bernafsunya': 'nafsu', + 'bernama': 'nama', + 'bernamanya': 'nama', + 'bernamakan': 'nama', + 'bernamai': 'nama', + 'menamai': 'nama', + 'menamainya': 'nama', + 'menamaiku': 'nama', + 'menamaimu': 'nama', + 'ternama': 'nama', + 'ternamanya': 'nama', + 'kenamaan': 'nama', + 'kenamaannya': 'nama', + 'penamaan': 'nama', + 'penamaannya': 'nama', + 'menamakan': 'nama', + 'menamakannya': 'nama', + 'menanah': 'nanah', + 'menanahan': 'nanah', + 'bernanah': 'nanah', + 'bernanahnya': 'nanah', + 'senasib': 'nasib', + 'senasibnya': 'nasib', + 'senasiblah': 'nasib', + 'bernasib': 'nasib', + 'nasib-nasiban': 'nasib', + 'penaung': 'naung', + 'penaungan': 'naung', + 'naungan': 'naung', + 'naungannya': 'naung', + 'bernaung': 'naung', + 'bernaungnya': 'naung', + 'menaungi': 'taung', + 'menaunginya': 'taung', + 'bernazar': 'nazar', + 'menazarkan': 'nazar', + 'berniat': 'niat', + 'berniatnya': 'niat', + 'berniatlah': 'niat', + 'berniatan': 'niat', + 'terniat': 'niat', + 'meniatkan': 'niat', + 'meniatkannya': 'niat', + 'berniat-niat': 'niat', + 'bernitrogen': 'nitrogen', + 'menyala': 'nyala', + 'menyalanya': 'nyala', + 'menyalakan': 'salak', + 'menyalakannya': 'nyala', + 'menyalai': 'salai', + 'bernyala': 'nyala', + 'menyala-nyala': 'nyala', + 'bernyala-nyala': 'nyala', + 'nyanyian': 'nyanyi', + 'nyanyiannya': 'nyanyi', + 'nyanyianku': 'nyanyi', + 'nyanyianmu': 'nyanyi', + 'menyanyi': 'nyanyi', + 'menyanyinya': 'nyanyi', + 'menyanyilah': 'nyanyi', + 'menyanyikan': 'nyanyi', + 'menyanyikannya': 'nyanyi', + 'menyanyian': 'nyanyi', + 'penyanyi': 'nyanyi', + 'penyanyinya': 'nyanyi', + 'penyanyikan': 'nyanyi', + 'penyanyian': 'nyanyi', + 'bernyanyi': 'nyanyi', + 'bernyanyinya': 'nyanyi', + 'bernyanyilah': 'nyanyi', + 'pemberokan': 'berok', + 'berolahraga': 'olahraga', + 'berolahraganya': 'olahraga', + 'berolahragalah': 'olahraga', + 'keolahragaan': 'olahraga', + 'keolahragaannya': 'olahraga', + 'mengolahragakan': 'olahraga', + 'memberolahragakan': 'olahraga', + 'olakan': 'olak', + 'berolak': 'olak', + 'mengolak': 'olak', + 'perolakan': 'olak', + 'memberon': 'beron', + 'berondongan': 'berondong', + 'memberondong': 'berondong', + 'memberondongnya': 'berondong', + 'memberondongkan': 'berondong', + 'memberondongkannya': 'berondong', + 'memberondongan': 'berondong', + 'pemberondongan': 'berondong', + 'memberongsang': 'berongsang', + 'memberongsong': 'berongsong', + 'pemberontak': 'berontak', + 'pemberontaknya': 'berontak', + 'pemberontaklah': 'berontak', + 'pemberontakkan': 'berontak', + 'pemberontakan': 'berontak', + 'memberontak': 'berontak', + 'pemberontakannya': 'berontak', + 'memberosot': 'berosot', + 'memadu': 'padu', + 'memadunya': 'padu', + 'memadukan': 'padu', + 'memadukannya': 'padu', + 'paduan': 'padu', + 'paduannya': 'padu', + 'pemadu': 'padu', + 'pemaduan': 'padu', + 'berpadu': 'padu', + 'berpadunya': 'padu', + 'berpadukan': 'padu', + 'berpaduan': 'padu', + 'terpadu': 'padu', + 'terpadunya': 'padu', + 'terpadukan': 'padu', + 'kepaduan': 'padu', + 'perpaduan': 'padu', + 'perpaduannya': 'padu', + 'keterpaduan': 'padu', + 'keterpaduanlah': 'padu', + 'berpadu-padu': 'padu', + 'memperpadukan': 'padu', + 'pemahat': 'pahat', + 'pemahatnya': 'pahat', + 'pemahatan': 'pahat', + 'pahatan': 'pahat', + 'pahatannya': 'pahat', + 'memahat': 'pahat', + 'memahatnya': 'pahat', + 'memahatkan': 'pahat', + 'berpahat': 'pahat', + 'berpahatkan': 'pahat', + 'berpakat': 'pakat', + 'memakati': 'pakat', + 'memalit': 'palit', + 'terpalit': 'palit', + 'berpalit': 'palit', + 'terpalit-palit': 'palit', + 'pemandang': 'pandang', + 'pemandangan': 'pandang', + 'memandang': 'pandang', + 'memandangnya': 'pandang', + 'memandanglah': 'pandang', + 'memandangi': 'pandang', + 'memandangan': 'pandang', + 'memandangku': 'pandang', + 'memandangmu': 'pandang', + 'pandangan': 'pandang', + 'pandangannya': 'pandang', + 'pandanganlah': 'pandang', + 'pandanganan': 'pandang', + 'pandanganku': 'pandang', + 'pandanganmu': 'pandang', + 'terpandang': 'pandang', + 'terpandanglah': 'pandang', + 'memandanginya': 'pandang', + 'memandangiku': 'pandang', + 'pemandangannya': 'pandang', + 'pemandanganku': 'pandang', + 'berpandangan': 'pandang', + 'berpandangannya': 'pandang', + 'berpandanganlah': 'pandang', + 'sepemandangan': 'pandang', + 'pandang-memandang': 'pandang', + 'terpandang-pandang': 'pandang', + 'berpandang-pandangan': 'pandang', + 'sepangkat': 'pangkat', + 'berpangkat': 'pangkat', + 'pemangkatan': 'pangkat', + 'kepangkatan': 'pangkat', + 'kepangkatannya': 'pangkat', + 'memangkatkan': 'pangkat', + 'berpangkat-pangkat': 'pangkat', + 'memapas': 'papas', + 'papasan': 'papas', + 'pemapasan': 'papas', + 'berpapasan': 'papas', + 'memarut': 'parut', + 'memarutnya': 'parut', + 'parutan': 'parut', + 'parutannya': 'parut', + 'pemarut': 'parut', + 'pemarutnya': 'parut', + 'berparut': 'parut', + 'pautan': 'paut', + 'memaut': 'paut', + 'memautkan': 'paut', + 'berpaut': 'paut', + 'berpautan': 'paut', + 'terpaut': 'paut', + 'terpautnya': 'paut', + 'perpautan': 'paut', + 'paut-memaut': 'paut', + 'berpautan': 'paut', + 'berpaya': 'paya', + 'berpeluh': 'peluh', + 'berpeluh-peluh': 'peluh', + 'pemeluk': 'peluk', + 'pemeluknya': 'peluk', + 'pemelukan': 'peluk', + 'memeluk': 'peluk', + 'memeluknya': 'peluk', + 'memeluki': 'peluk', + 'memelukan': 'peluk', + 'memelukku': 'peluk', + 'memelukmu': 'peluk', + 'pelukan': 'peluk', + 'pelukannya': 'peluk', + 'pelukanku': 'peluk', + 'pelukanmu': 'peluk', + 'berpeluk': 'peluk', + 'berpelukkan': 'peluk', + 'berpelukan': 'peluk', + 'terpeluk': 'peluk', + 'sepemeluk': 'peluk', + 'berpelukanlah': 'peluk', + 'sepemelukan': 'peluk', + 'berpeluk-pelukan': 'peluk', + 'berpengaruh': 'pengaruh', + 'berpengaruhnya': 'pengaruh', + 'berpengaruhlah': 'pengaruh', + 'berpengaruhkan': 'pengaruh', + 'berpengaruhi': 'pengaruh', + 'terpengaruh': 'pengaruh', + 'terpengaruhnya': 'pengaruh', + 'terpengaruhi': 'pengaruh', + 'memengaruhi': 'pengaruh', + 'memengaruhinya': 'pengaruh', + 'memengaruhii': 'pengaruh', + 'memengaruhiku': 'pengaruh', + 'memengaruhimu': 'pengaruh', + 'setahu': 'tahu', + 'setahunya': 'tahu', + 'setahui': 'tahu', + 'setahuan': 'tahu', + 'setahuku': 'tahu', + 'ketahuan': 'tahu', + 'ketahuannya': 'tahu', + 'ketahuanlah': 'tahu', + 'tahu-tahu': 'tahu', + 'tahu-tahunya': 'tahu', + 'bertahuan': 'tahu', + 'bertahukan': 'tahu', + 'mengetahui': 'tahu', + 'mengetahuinya': 'tahu', + 'mengetahuilah': 'tahu', + 'mengetahuii': 'tahu', + 'mengetahuiku': 'tahu', + 'mengetahuimu': 'tahu', + 'tahu-menahu': 'tahu', + 'pengetahuan': 'tahu', + 'pengetahuannya': 'tahu', + 'pengetahuanlah': 'tahu', + 'pengetahuanku': 'tahu', + 'pengetahuanmu': 'tahu', + 'bertahu-tahu': 'tahu', + 'berpengetahuan': 'tahu', + 'berpengetahuanlah': 'tahu', + 'berperangai': 'perangai', + 'berperikemanusiaan': 'perikemanusiaan', + 'berperikemanusiaannya': 'perikemanusiaan', + 'memesan': 'pesan', + 'memesannya': 'pesan', + 'memesankan': 'pesan', + 'memesankannya': 'pesan', + 'memesanan': 'pesan', + 'pesanan': 'pesan', + 'pesanannya': 'pesan', + 'pesananan': 'pesan', + 'pesananku': 'pesan', + 'pesananmu': 'pesan', + 'sipesan': 'pesan', + 'pemesan': 'pesan', + 'pemesannya': 'pesan', + 'pemesanan': 'pesan', + 'sepesan': 'pesan', + 'memesani': 'pesan', + 'berpesan': 'pesan', + 'pemesanannya': 'pesan', + 'pemesananan': 'pesan', + 'pesan-pesan': 'pesan', + 'pesan-pesannya': 'pesan', + 'pesan-pesanan': 'pesan', + 'berpesta': 'pesta', + 'berpestanya': 'pesta', + 'berpestalah': 'pesta', + 'memestakan': 'pesta', + 'berpesta-pesta': 'pesta', + 'berpidato': 'pidato', + 'berpidatonya': 'pidato', + 'memidatokan': 'pidato', + 'memijak': 'pijak', + 'memijakkan': 'pijak', + 'memijaki': 'pijak', + 'memijakan': 'pijak', + 'pemijak': 'pijak', + 'pijakan': 'pijak', + 'pijakannya': 'pijak', + 'berpijak': 'pijak', + 'berpijaknya': 'pijak', + 'berpijaklah': 'pijak', + 'pemijakan': 'pijak', + 'pijak-pijak': 'pijak', + 'terpijak-pijak': 'pijak', + 'memijar': 'pijar', + 'memijarkan': 'pijar', + 'berpijar': 'pijar', + 'berpijaran': 'pijar', + 'pijar-pijar': 'pijar', + 'memijar-mijar': 'pijar', + 'berpijar-pijar': 'pijar', + 'memikir': 'pikir', + 'memikirnya': 'pikir', + 'memikirkan': 'pikir', + 'memikirkannya': 'pikir', + 'memikiran': 'pikir', + 'pemikir': 'pikir', + 'pemikirnya': 'pikir', + 'pemikiran': 'pikir', + 'pikiran': 'pikir', + 'pikirannya': 'pikir', + 'pikiranlah': 'pikir', + 'pikirankan': 'pikir', + 'pikiranku': 'pikir', + 'pikiranmu': 'pikir', + 'berpikir': 'pikir', + 'berpikirnya': 'pikir', + 'berpikirlah': 'pikir', + 'berpikirkan': 'pikir', + 'berpikiri': 'pikir', + 'berpikiran': 'pikir', + 'berpikirku': 'pikir', + 'berpikirmu': 'pikir', + 'terpikir': 'pikir', + 'terpikirkan': 'pikir', + 'terpikirkannya': 'pikir', + 'terpikiran': 'pikir', + 'memikiri': 'pikir', + 'memikirikan': 'pikir', + 'memikirikannya': 'pikir', + 'pemikirannya': 'pikir', + 'pemikiranku': 'pikir', + 'pemikiranmu': 'pikir', + 'sepikiran': 'pikir', + 'memikirkankan': 'pikir', + 'memikirkanku': 'pikir', + 'memikirkanmu': 'pikir', + 'berpikirannya': 'pikir', + 'berpikiranlah': 'pikir', + 'memikir-mikir': 'pikir', + 'berpikir-pikir': 'pikir', + 'berpikir-pikiran': 'pikir', + 'memikir-mikirkan': 'pikir', + 'memindah': 'pindah', + 'memindahnya': 'pindah', + 'memindahkan': 'pindah', + 'memindahkannya': 'pindah', + 'memindahan': 'pindah', + 'pindahan': 'pindah', + 'pindahannya': 'pindah', + 'memindahi': 'pindah', + 'berpindah': 'pindah', + 'berpindahnya': 'pindah', + 'berpindahlah': 'pindah', + 'berpindahan': 'pindah', + 'pemindahan': 'pindah', + 'pemindahannya': 'pindah', + 'pemindahanan': 'pindah', + 'kepindahan': 'pindah', + 'kepindahannya': 'pindah', + 'kepindahanku': 'pindah', + 'memindahkanan': 'pindah', + 'perpindahan': 'pindah', + 'perpindahannya': 'pindah', + 'perpindahanku': 'pindah', + 'berpindah-pindah': 'pindah', + 'berpindah-pindahnya': 'pindah', + 'memintal': 'pintal', + 'memintalnya': 'pintal', + 'pemintal': 'pintal', + 'pemintalan': 'pintal', + 'terpintal': 'pintal', + 'berpintal': 'pintal', + 'berpintal-pintal': 'pintal', + 'pisahan': 'pisah', + 'memisah': 'pisah', + 'memisahnya': 'pisah', + 'memisahkan': 'pisah', + 'memisahkannya': 'pisah', + 'memisahan': 'pisah', + 'pemisah': 'pisah', + 'pemisahnya': 'pisah', + 'pemisahkan': 'pisah', + 'pemisahan': 'pisah', + 'terpisah': 'pisah', + 'terpisahnya': 'pisah', + 'terpisahkan': 'pisah', + 'terpisahkannya': 'pisah', + 'berpisah': 'pisah', + 'berpisahnya': 'pisah', + 'berpisahlah': 'pisah', + 'berpisahan': 'pisah', + 'pemisahannya': 'pisah', + 'perpisahan': 'pisah', + 'perpisahannya': 'pisah', + 'memisahkanlah': 'pisah', + 'memisahkankan': 'pisah', + 'memisahkanku': 'pisah', + 'berpisah-pisah': 'pisah', + 'memisah-misahkan': 'pisah', + 'memisah-misahkannya': 'pisah', + 'berpolitik': 'politik', + 'berpolitiknya': 'politik', + 'berpolitiklah': 'politik', + 'pemolitikan': 'politik', + 'memolitikkan': 'politik', + 'memperpolitikkan': 'politik', + 'berpotensi': 'potensi', + 'berpotensinya': 'potensi', + 'berprinsip': 'prinsip', + 'berprinsiplah': 'prinsip', + 'berprinsipkan': 'prinsip', + 'berpuasa': 'puasa', + 'berpuasanya': 'puasa', + 'berpuasalah': 'puasa', + 'pusingan': 'pusing', + 'pemusing': 'pusing', + 'memusing': 'pusing', + 'memusingkan': 'pusing', + 'memusingkannya': 'pusing', + 'berpusing': 'pusing', + 'berpusingnya': 'pusing', + 'berpusingan': 'pusing', + 'pemusingan': 'pusing', + 'perpusingan': 'pusing', + 'pusing-pusing': 'pusing', + 'pusing-pusingnya': 'pusing', + 'terpusing-pusing': 'pusing', + 'berpusing-pusing': 'pusing', + 'pemutar': 'putar', + 'pemutarnya': 'putar', + 'pemutaran': 'putar', + 'putaran': 'putar', + 'putarannya': 'putar', + 'seputar': 'putar', + 'seputarnya': 'putar', + 'seputaran': 'putar', + 'memutar': 'putar', + 'memutarnya': 'putar', + 'memutarkan': 'putar', + 'memutarkannya': 'putar', + 'memutari': 'putar', + 'memutaran': 'putar', + 'berputar': 'putar', + 'berputarnya': 'putar', + 'berputarlah': 'putar', + 'terputar': 'putar', + 'terputarnya': 'putar', + 'pemutarannya': 'putar', + 'pemutaranan': 'putar', + 'perputaran': 'putar', + 'perputarannya': 'putar', + 'putar-putar': 'putar', + 'putar-putaran': 'putar', + 'memutar-mutar': 'putar', + 'memutar-mutarkan': 'putar', + 'memperputarkan': 'putar', + 'berputar-putar': 'putar', + 'menyalam': 'salam', + 'menyalami': 'salam', + 'bersalam': 'salam', + 'bersalaman': 'salam', + 'menyalaminya': 'salam', + 'persalaman': 'salam', + 'bersalamannya': 'salam', + 'bersalamanlah': 'salam', + 'bersalamanan': 'salam', + 'bersalam-salaman': 'salam', + 'salinan': 'salin', + 'salinannya': 'salin', + 'pesalin': 'salin', + 'pesalinan': 'salin', + 'sesalin': 'salin', + 'persalin': 'salin', + 'persalinan': 'salin', + 'menyalin': 'salin', + 'menyalinnya': 'salin', + 'menyalinkan': 'salin', + 'menyalinan': 'salin', + 'bersalin': 'salin', + 'bersalinnya': 'salin', + 'bersalinan': 'salin', + 'penyalin': 'salin', + 'penyalinan': 'salin', + 'menyalini': 'salin', + 'penyalinanan': 'salin', + 'persalinannya': 'salin', + 'persalinanku': 'salin', + 'persalinanmu': 'salin', + 'mempersalin': 'salin', + 'mempersalini': 'salin', + 'bersalin-salin': 'salin', + 'mempersalinkan': 'salin', + 'sesama': 'sama', + 'sesamanya': 'sama', + 'sesamalah': 'sama', + 'sesamamu': 'sama', + 'bersama': 'sama', + 'bersamanya': 'sama', + 'bersamalah': 'sama', + 'bersamai': 'sama', + 'bersamaan': 'sama', + 'bersamaku': 'sama', + 'bersamamu': 'sama', + 'menyamai': 'sama', + 'menyamainya': 'sama', + 'menyamaikan': 'sama', + 'menyamaikannya': 'sama', + 'tersamai': 'sama', + 'kesamaan': 'sama', + 'kesamaannya': 'sama', + 'persamaan': 'sama', + 'persamaannya': 'sama', + 'persamaanlah': 'sama', + 'bersamaannya': 'sama', + 'sama-sama': 'sama', + 'sama-samalah': 'sama', + 'penyamaan': 'sama', + 'menyamakan': 'samak', + 'menyamakannya': 'sama', + 'kebersamaan': 'sama', + 'kebersamaannya': 'sama', + 'kebersamaanlah': 'sama', + 'kebersamaanku': 'sama', + 'kebersamaanmu': 'sama', + 'bersama-sama': 'sama', + 'bersama-samanya': 'sama', + 'bersama-samalah': 'sama', + 'bersama-samakan': 'sama', + 'bersama-samaan': 'sama', + 'bersama-samamu': 'sama', + 'membersamakan': 'sama', + 'mempersamakan': 'sama', + 'menyama-nyama': 'sama', + 'menyama-nyamakan': 'sama', + 'menyama-nyamakannya': 'sama', + 'menyama-nyamai': 'sama', + 'mempersama-samakan': 'sama', + 'sandaran': 'sandar', + 'sandarannya': 'sandar', + 'bersandar': 'sandar', + 'bersandarnya': 'sandar', + 'bersandarlah': 'sandar', + 'bersandarkan': 'sandar', + 'bersandaran': 'sandar', + 'tersandar': 'sandar', + 'menyandar': 'sandar', + 'menyandarkan': 'sandar', + 'menyandarkannya': 'sandar', + 'menyandari': 'sandar', + 'penyandar': 'sandar', + 'penyandaran': 'sandar', + 'pesandaran': 'sandar', + 'penyandarannya': 'sandar', + 'persandaran': 'sandar', + 'sandar-menyandar': 'sandar', + 'bersarang': 'sarang', + 'bersarangnya': 'sarang', + 'menyarangkan': 'sarang', + 'menyarangkannya': 'sarang', + 'bersarang-sarang': 'sarang', + 'menyarung': 'sarung', + 'menyarungkan': 'sarung', + 'menyarungi': 'sarung', + 'tersarung': 'sarung', + 'bersarung': 'sarung', + 'bersarungkan': 'sarung', + 'bersarungan': 'sarung', + 'kesatu': 'satu', + 'kesatuan': 'satu', + 'satuan': 'satu', + 'satuannya': 'satu', + 'satuanlah': 'satu', + 'satuanmu': 'satu', + 'bersatu': 'satu', + 'bersatunya': 'satu', + 'bersatulah': 'satu', + 'bersatukan': 'satu', + 'bersatuan': 'satu', + 'penyatu': 'satu', + 'penyatukan': 'satu', + 'penyatuan': 'satu', + 'menyatu': 'satu', + 'menyatunya': 'satu', + 'menyatulah': 'satu', + 'menyatukan': 'satu', + 'menyatukannya': 'satu', + 'menyatui': 'satu', + 'menyatuan': 'satu', + 'kesatuannya': 'satu', + 'kesatuanlah': 'satu', + 'kesatuanmu': 'satu', + 'persatuan': 'satu', + 'persatuannya': 'satu', + 'persatuanlah': 'satu', + 'persatuani': 'satu', + 'penyatuannya': 'satu', + 'satu-satu': 'satu', + 'satu-satunya': 'satu', + 'satu-satulah': 'satu', + 'satu-satuan': 'satu', + 'pemersatu': 'satu', + 'pemersatunya': 'satu', + 'pemersatuan': 'satu', + 'menyatukanlah': 'satu', + 'satu-satunyanya': 'satu', + 'mempersatukan': 'satu', + 'mempersatukannya': 'satu', + 'bersaudara': 'saudara', + 'bersaudaranya': 'saudara', + 'bersaudaralah': 'saudara', + 'bersaudaraan': 'saudara', + 'bersaudaraku': 'saudara', + 'persaudaraan': 'saudara', + 'persaudaraannya': 'saudara', + 'mempersaudarakan': 'saudara', + 'sediaan': 'sedia', + 'sediaannya': 'sedia', + 'sedianya': 'sedia', + 'tersedia': 'sedia', + 'tersedianya': 'sedia', + 'tersediakan': 'sedia', + 'tersediaan': 'sedia', + 'penyedia': 'sedia', + 'penyedianya': 'sedia', + 'penyediakan': 'sedia', + 'penyediaan': 'sedia', + 'bersedia': 'sedia', + 'bersedianya': 'sedia', + 'bersedialah': 'sedia', + 'bersediaan': 'sedia', + 'kesediaan': 'sedia', + 'kesediaannya': 'sedia', + 'penyediaannya': 'sedia', + 'persediaan': 'sedia', + 'persediaannya': 'sedia', + 'menyediakan': 'sedia', + 'menyediakannya': 'sedia', + 'ketersediaan': 'sedia', + 'ketersediaannya': 'sedia', + 'mempersediakan': 'sedia', + 'bersedia-sedia': 'sedia', + 'bersejarah': 'sejarah', + 'bersejarahnya': 'sejarah', + 'menyejarah': 'sejarah', + 'kesejarahan': 'sejarah', + 'kesejarahannya': 'sejarah', + 'kesejarahanan': 'sejarah', + 'menyejarahkan': 'sejarah', + 'sekolahan': 'sekolah', + 'sekolahannya': 'sekolah', + 'bersekolah': 'sekolah', + 'bersekolahnya': 'sekolah', + 'persekolahan': 'sekolah', + 'menyekolahkan': 'sekolah', + 'menyekolahkannya': 'sekolah', + 'menyekolahkanku': 'sekolah', + 'sekongkolan': 'sekongkol', + 'bersekongkol': 'sekongkol', + 'bersekongkolnya': 'sekongkol', + 'persekongkolan': 'sekongkol', + 'persekongkolannya': 'sekongkol', + 'peselancar': 'selancar', + 'peselancarnya': 'selancar', + 'peselancaran': 'selancar', + 'berselancar': 'selancar', + 'berselancarnya': 'selancar', + 'berselancarlah': 'selancar', + 'menyelaput': 'selaput', + 'berselaput': 'selaput', + 'berselera': 'selera', + 'berselerak': 'selerak', + 'berselindung': 'selindung', + 'berselirat': 'selirat', + 'berselisih': 'selisih', + 'berselisihlah': 'selisih', + 'berselisihkan': 'selisih', + 'berselisihan': 'selisih', + 'perselisihan': 'selisih', + 'perselisihannya': 'selisih', + 'menyelisihkan': 'selisih', + 'memperselisihkan': 'selisih', + 'memperselisihkannya': 'selisih', + 'berseloroh': 'seloroh', + 'berselumu': 'selumu', + 'bersemadi': 'semadi', + 'persemadian': 'semadi', + 'menyemarak': 'semarak', + 'menyemarakkan': 'semarak', + 'menyemarakkannya': 'semarak', + 'menyemaraki': 'semarak', + 'menyemarakan': 'semarak', + 'bersemarak': 'semarak', + 'kesemarakan': 'semarak', + 'kesemarakannya': 'semarak', + 'sembahyangan': 'sembahyang', + 'bersembahyang': 'sembahyang', + 'bersembahyangan': 'sembahyang', + 'menyembahyangi': 'sembahyang', + 'persembahyangan': 'sembahyang', + 'menyembahyangkan': 'sembahyang', + 'bersembunyi': 'sembunyi', + 'bersembunyinya': 'sembunyi', + 'bersembunyilah': 'sembunyi', + 'tersembunyi': 'sembunyi', + 'tersembunyinya': 'sembunyi', + 'tersembunyikan': 'sembunyi', + 'penyembunyian': 'sembunyi', + 'penyembunyiannya': 'sembunyi', + 'persembunyian': 'sembunyi', + 'persembunyiannya': 'sembunyi', + 'persembunyianku': 'sembunyi', + 'menyembunyikan': 'sembunyi', + 'menyembunyikannya': 'sembunyi', + 'sembunyi-sembunyi': 'sembunyi', + 'sembunyi-sembunyikan': 'sembunyi', + 'sembunyi-sembunyian': 'sembunyi', + 'bersembunyi-sembunyi': 'sembunyi', + 'bersembunyi-sembunyian': 'sembunyi', + 'senandungan': 'senandung', + 'bersenandung': 'senandung', + 'bersenandunglah': 'senandung', + 'bersenandungkan': 'senandung', + 'menyenandungkan': 'senandung', + 'menyendi': 'sendi', + 'bersendi': 'sendi', + 'bersendikan': 'sendi', + 'persendian': 'sendi', + 'persendiannya': 'sendi', + 'persendianku': 'sendi', + 'menyendikan': 'sendi', + 'bersendi-sendi': 'sendi', + 'mempersendikan': 'sendi', + 'menyendi-nyendi': 'sendi', + 'senggatan': 'senggat', + 'menyenggat': 'senggat', + 'bersenggat': 'senggat', + 'bersenggayut': 'senggayut', + 'bersenggayutan': 'senggayut', + 'bersengketa': 'sengketa', + 'bersengketanya': 'sengketa', + 'persengketaan': 'sengketa', + 'persengketaannya': 'sengketa', + 'mempersengketakan': 'sengketa', + 'mempersengketakannya': 'sengketa', + 'sentuhan': 'sentuh', + 'sentuhannya': 'sentuh', + 'sentuhanku': 'sentuh', + 'menyentuh': 'sentuh', + 'menyentuhnya': 'sentuh', + 'menyentuhlah': 'sentuh', + 'menyentuhkan': 'sentuh', + 'menyentuhkannya': 'sentuh', + 'menyentuhku': 'sentuh', + 'menyentuhmu': 'sentuh', + 'bersentuh': 'sentuh', + 'bersentuhkan': 'sentuh', + 'bersentuhan': 'sentuh', + 'tersentuh': 'sentuh', + 'tersentuhnya': 'sentuh', + 'tersentuhlah': 'sentuh', + 'penyentuh': 'sentuh', + 'penyentuhan': 'sentuh', + 'kesentuhan': 'sentuh', + 'persentuhan': 'sentuh', + 'persentuhannya': 'sentuh', + 'menyentuh-nyentuh': 'sentuh', + 'tersepai': 'sepai', + 'bersepai': 'sepai', + 'bersepaian': 'sepai', + 'bersepakat': 'sepakat', + 'bersepakatan': 'sepakat', + 'kesepakatan': 'sepakat', + 'kesepakatannya': 'sepakat', + 'kesepakatanlah': 'sepakat', + 'kesepakatani': 'sepakat', + 'kesepakatanan': 'sepakat', + 'menyepakati': 'sepakat', + 'menyepakatinya': 'sepakat', + 'menyepakatii': 'sepakat', + 'persepakatan': 'sepakat', + 'bersepatu': 'sepatu', + 'menyepatui': 'sepatu', + 'persepatuan': 'sepatu', + 'bersepeda': 'sepeda', + 'bersepedanya': 'sepeda', + 'bersepedalah': 'sepeda', + 'sesepuh': 'sepuh', + 'sesepuhnya': 'sepuh', + 'sepuhan': 'sepuh', + 'penyepuh': 'sepuh', + 'penyepuhan': 'sepuh', + 'menyepuh': 'sepuh', + 'menyepuhnya': 'sepuh', + 'menyepuhkan': 'sepuh', + 'tersepuh': 'sepuh', + 'bersepuh': 'sepuh', + 'kesepuhan': 'sepuh', + 'berserabut': 'serabut', + 'berserabutan': 'serabut', + 'berserat': 'serat', + 'terserat': 'serat', + 'menyeratkan': 'serat', + 'bersiang': 'siang', + 'menyiang': 'siang', + 'menyiangi': 'siang', + 'menyiangan': 'siang', + 'menyianginya': 'siang', + 'kesiangan': 'siang', + 'kesianganlah': 'siang', + 'penyiangan': 'siang', + 'siang-siang': 'siang', + 'siang-siangan': 'siang', + 'mempersiang': 'siang', + 'mempersiangi': 'siang', + 'bersidang': 'sidang', + 'bersidangnya': 'sidang', + 'bersidangan': 'sidang', + 'persidangan': 'sidang', + 'persidangannya': 'sidang', + 'persidanganlah': 'sidang', + 'persidanganan': 'sidang', + 'penyidangan': 'sidang', + 'penyidangannya': 'sidang', + 'menyidangkan': 'sidang', + 'menyidangkannya': 'sidang', + 'bersifat': 'sifat', + 'bersifatnya': 'sifat', + 'bersifatlah': 'sifat', + 'penyifatan': 'sifat', + 'menyifatkan': 'sifat', + 'tersifatkan': 'sifat', + 'pembersih': 'bersih', + 'pembersihnya': 'bersih', + 'pembersihkan': 'bersih', + 'pembersihan': 'bersih', + 'kebersihan': 'bersih', + 'kebersihannya': 'bersih', + 'kebersihanlah': 'bersih', + 'kebersihanan': 'bersih', + 'kebersihanku': 'bersih', + 'pembersihannya': 'bersih', + 'membersihkan': 'bersih', + 'membersihkannya': 'bersih', + 'membersihkanlah': 'bersih', + 'membersihkankan': 'bersih', + 'membersil': 'bersil', + 'silangan': 'silang', + 'bersilang': 'silang', + 'bersilangan': 'silang', + 'tersilang': 'silang', + 'menyilang': 'silang', + 'menyilangnya': 'silang', + 'menyilangkan': 'silang', + 'menyilangkannya': 'silang', + 'menyilangi': 'silang', + 'penyilangan': 'silang', + 'persilangan': 'silang', + 'persilangannya': 'silang', + 'mempersilangkan': 'silang', + 'silang-menyilang': 'silang', + 'bersimbol': 'simbol', + 'bersimbolkan': 'simbol', + 'menyimbolkan': 'simbol', + 'sinaran': 'sinar', + 'sinarannya': 'sinar', + 'bersinar': 'sinar', + 'bersinarnya': 'sinar', + 'bersinarlah': 'sinar', + 'bersinari': 'sinar', + 'menyinar': 'sinar', + 'menyinarkan': 'sinar', + 'menyinarkannya': 'sinar', + 'menyinari': 'sinar', + 'menyinarinya': 'sinar', + 'penyinaran': 'sinar', + 'penyinarannya': 'sinar', + 'sinar-seminar': 'sinar', + 'sinar-suminar': 'sinar', + 'sinar-menyinar': 'sinar', + 'bersirip': 'sirip', + 'menyirip': 'sirip', + 'tebersit': 'bersit', + 'tebersitlah': 'bersit', + 'bersitan': 'bersit', + 'membersit': 'bersit', + 'membersitkan': 'bersit', + 'bersiut': 'siut', + 'pesolek': 'solek', + 'bersolek': 'solek', + 'bersoleknya': 'solek', + 'mempersolek': 'solek', + 'solek-menyolek': 'solek', + 'penyorak': 'sorak', + 'bersorak': 'sorak', + 'menyoraki': 'sorak', + 'menyorakinya': 'sorak', + 'menyorakkan': 'sorak', + 'penyuci': 'suci', + 'penyucian': 'suci', + 'bersuci': 'suci', + 'kesucian': 'suci', + 'kesuciannya': 'suci', + 'persucian': 'suci', + 'menyucikan': 'suci', + 'menyumpah': 'sumpah', + 'menyumpahnya': 'sumpah', + 'menyumpahi': 'sumpah', + 'bersumpah': 'sumpah', + 'bersumpahlah': 'sumpah', + 'penyumpah': 'sumpah', + 'penyumpahan': 'sumpah', + 'menyumpahinya': 'sumpah', + 'menyumpahimu': 'sumpah', + 'persumpahan': 'sumpah', + 'mempersumpahkan': 'sumpah', + 'bersumpah-sumpahan': 'sumpah', + 'bersungut': 'sungut', + 'sungut-sungut': 'sungut', + 'bersungut-sungut': 'sungut', + 'menyurai': 'surai', + 'bersurai': 'surai', + 'suratan': 'surat', + 'suratannya': 'surat', + 'bersurat': 'surat', + 'tersurat': 'surat', + 'menyurat': 'surat', + 'menyuratnya': 'surat', + 'menyuratkan': 'surat', + 'menyurati': 'surat', + 'menyuratinya': 'surat', + 'persuratan': 'surat', + 'persuratannya': 'surat', + 'surat-menyurat': 'surat', + 'surat-menyuratnya': 'surat', + 'bersusah payah': 'susah payah', + 'membersut': 'bersut', + 'syarahan': 'syarah', + 'pensyarah': 'syarah', + 'bersyarah': 'syarah', + 'mensyarahkan': 'syarah', + 'bersyarat': 'syarat', + 'bersyaratnya': 'syarat', + 'bersyaratkan': 'syarat', + 'bersyaratan': 'syarat', + 'persyaratan': 'syarat', + 'persyaratannya': 'syarat', + 'mensyaratkan': 'syarat', + 'mensyaratkannya': 'syarat', + 'menabur': 'tabur', + 'menaburnya': 'tabur', + 'menaburkan': 'tabur', + 'menaburkannya': 'tabur', + 'menaburi': 'tabur', + 'penabur': 'tabur', + 'penaburan': 'tabur', + 'taburan': 'tabur', + 'taburannya': 'tabur', + 'tertabur': 'tabur', + 'bertabur': 'tabur', + 'bertaburnya': 'tabur', + 'bertaburkan': 'tabur', + 'bertaburan': 'tabur', + 'menaburinya': 'tabur', + 'bertaburannya': 'tabur', + 'bertabur-tabur': 'tabur', + 'tafakuran': 'tafakur', + 'bertafakur': 'tafakur', + 'menafakurkan': 'tafakur', + 'tahanan': 'tahan', + 'tahanannya': 'tahan', + 'tahananlah': 'tahan', + 'tahananan': 'tahan', + 'tahananku': 'tahan', + 'tahananmu': 'tahan', + 'penahan': 'tahan', + 'penahannya': 'tahan', + 'penahanan': 'tahan', + 'menahan': 'tahan', + 'menahannya': 'tahan', + 'menahankan': 'tahan', + 'menahankannya': 'tahan', + 'menahanan': 'tahan', + 'menahanku': 'tahan', + 'menahanmu': 'tahan', + 'menahani': 'tahan', + 'bertahan': 'tahan', + 'bertahannya': 'tahan', + 'bertahanlah': 'tahan', + 'bertahankan': 'tahan', + 'bertahani': 'tahan', + 'bertahanan': 'tahan', + 'tertahan': 'tahan', + 'tertahannya': 'tahan', + 'tertahankan': 'tahan', + 'tertahanan': 'tahan', + 'penahanannya': 'tahan', + 'penahananan': 'tahan', + 'penahananku': 'tahan', + 'ketahanan': 'tahan', + 'ketahanannya': 'tahan', + 'ketahananan': 'tahan', + 'pertahanan': 'tahan', + 'pertahanannya': 'tahan', + 'pertahananlah': 'tahan', + 'pertahanankan': 'tahan', + 'pertahananan': 'tahan', + 'pertahananku': 'tahan', + 'mempertahankan': 'tahan', + 'mempertahankannya': 'tahan', + 'mempertahankankan': 'tahan', + 'mempertahankanku': 'tahan', + 'bertahan-tahan': 'tahan', + 'tertahan-tahan': 'tahan', + 'bertakwa': 'takwa', + 'bertakwalah': 'takwa', + 'ketakwaan': 'takwa', + 'ketakwaannya': 'takwa', + 'bertanah': 'tanah', + 'pertanahan': 'tanah', + 'pertanahannya': 'tanah', + 'pertanahanan': 'tanah', + 'mengetanahkan': 'tanah', + 'menanduk': 'tanduk', + 'menanduknya': 'tanduk', + 'menandukkan': 'tanduk', + 'menandukkannya': 'tanduk', + 'menandukan': 'tanduk', + 'menandukku': 'tanduk', + 'tandukan': 'tanduk', + 'tandukannya': 'tanduk', + 'tandukanku': 'tanduk', + 'bertanduk': 'tanduk', + 'tanganan': 'tangan', + 'tanganannya': 'tangan', + 'menangani': 'tangan', + 'menanganinya': 'tangan', + 'menanganiku': 'tangan', + 'bertangan': 'tangan', + 'tertangani': 'tangan', + 'tertanganinya': 'tangan', + 'penanganan': 'tangan', + 'penanganannya': 'tangan', + 'penangananlah': 'tangan', + 'penangananan': 'tangan', + 'tangan-tangan': 'tangan', + 'tangan-tangannya': 'tangan', + 'tangan-tanganku': 'tangan', + 'tangan-tanganmu': 'tangan', + 'tangan-menangan': 'tangan', + 'tertanggal': 'tanggal', + 'menanggali': 'tanggal', + 'bertanggal': 'tanggal', + 'bertanggalkan': 'tanggal', + 'bertanggalan': 'tanggal', + 'penanggalan': 'tanggal', + 'penanggalannya': 'tanggal', + 'menanggalkan': 'tanggal', + 'menanggalkannya': 'tanggal', + 'menanggam': 'tanggam', + 'menanggami': 'tanggam', + 'bertanggam': 'tanggam', + 'bertangguh': 'tangguh', + 'tertangguh': 'tangguh', + 'tertangguhnya': 'tangguh', + 'tertangguhkan': 'tangguh', + 'ketangguhan': 'tangguh', + 'ketangguhannya': 'tangguh', + 'penangguhan': 'tangguh', + 'penangguhannya': 'tangguh', + 'penangguhanan': 'tangguh', + 'pertangguhan': 'tangguh', + 'menangguhkan': 'tangguh', + 'menangguhkannya': 'tangguh', + 'mempertangguhkan': 'tangguh', + 'menanya': 'tanya', + 'menanyanya': 'tanya', + 'menanyakan': 'tanya', + 'menanyakannya': 'tanya', + 'menanyai': 'tanya', + 'menanyaan': 'tanya', + 'penanya': 'tanya', + 'penanyanya': 'tanya', + 'bertanya': 'tanya', + 'bertanyanya': 'tanya', + 'bertanyalah': 'tanya', + 'bertanyaan': 'tanya', + 'menanyainya': 'tanya', + 'menanyaiku': 'tanya', + 'penanyaan': 'tanya', + 'pertanyaan': 'tanya', + 'pertanyaannya': 'tanya', + 'pertanyaanlah': 'tanya', + 'pertanyaanan': 'tanya', + 'pertanyaanku': 'tanya', + 'pertanyaanmu': 'tanya', + 'menanyakanan': 'tanya', + 'menanyakanku': 'tanya', + 'menanyakanmu': 'tanya', + 'mempertanyakan': 'tanya', + 'mempertanyakannya': 'tanya', + 'bertanya-tanya': 'tanya', + 'petapa': 'tapa', + 'petapaan': 'tapa', + 'pertapa': 'tapa', + 'pertapakan': 'tapa', + 'pertapaan': 'tapa', + 'bertapa': 'tapa', + 'bertapanya': 'tapa', + 'tapa-tapa': 'tapa', + 'pertapaannya': 'tapa', + 'mempertapakan': 'tapa', + 'menapak': 'tapak', + 'menapakkan': 'tapak', + 'menapaki': 'tapak', + 'menapakan': 'tapak', + 'setapak': 'tapak', + 'setapaknya': 'tapak', + 'bertapak': 'tapak', + 'menapakinya': 'tapak', + 'ketapakan': 'tapak', + 'bertapakkan': 'tapak', + 'tapak-tapak': 'tapak', + 'menaruh': 'taruh', + 'menaruhnya': 'taruh', + 'menaruhkan': 'taruh', + 'menaruhku': 'taruh', + 'petaruh': 'taruh', + 'petaruhnya': 'taruh', + 'petaruhan': 'taruh', + 'taruhan': 'taruh', + 'taruhannya': 'taruh', + 'bertaruh': 'taruh', + 'bertaruhlah': 'taruh', + 'bertaruhan': 'taruh', + 'menaruhi': 'taruh', + 'pertaruhan': 'taruh', + 'pertaruhannya': 'taruh', + 'pertaruhanlah': 'taruh', + 'berpetaruh': 'taruh', + 'berpenaruhan': 'taruh', + 'mempertaruhkan': 'taruh', + 'mempertaruhkannya': 'taruh', + 'penarung': 'tarung', + 'penarungan': 'tarung', + 'menarung': 'tarung', + 'menarungkan': 'tarung', + 'menarungi': 'tarung', + 'bertarung': 'tarung', + 'bertarungnya': 'tarung', + 'bertarunglah': 'tarung', + 'bertarungi': 'tarung', + 'bertarungan': 'tarung', + 'tertarung': 'tarung', + 'tertarungan': 'tarung', + 'pertarungan': 'tarung', + 'pertarungannya': 'tarung', + 'pertarunganku': 'tarung', + 'mempertarungkan': 'tarung', + 'mempertarungkannya': 'tarung', + 'menatah': 'tatah', + 'tatahan': 'tatah', + 'bertatah': 'tatah', + 'bertatahnya': 'tatah', + 'bertatahkan': 'tatah', + 'tatah-tatah': 'tatah', + 'tautan': 'taut', + 'tautannya': 'taut', + 'bertaut': 'taut', + 'bertautnya': 'taut', + 'bertautkan': 'taut', + 'bertautan': 'taut', + 'menautkan': 'taut', + 'menautkannya': 'taut', + 'pertautan': 'taut', + 'mempertautkan': 'taut', + 'bertekad': 'tekad', + 'bertekadlah': 'tekad', + 'menekuni': 'tekun', + 'menekuninya': 'tekun', + 'tertekun': 'tekun', + 'bertekun': 'tekun', + 'ketekunan': 'tekun', + 'ketekunannya': 'tekun', + 'ketekunanan': 'tekun', + 'menekunkan': 'tekun', + 'bertelanjang': 'telanjang', + 'bertelanjanglah': 'telanjang', + 'menelanjangi': 'telanjang', + 'menelanjanginya': 'telanjang', + 'penelanjangan': 'telanjang', + 'ketelanjangan': 'telanjang', + 'ketelanjangannya': 'telanjang', + 'menelanjangkan': 'telanjang', + 'petelur': 'telur', + 'petelurnya': 'telur', + 'menelur': 'telur', + 'menelurkan': 'telur', + 'menelurkannya': 'telur', + 'bertelur': 'telur', + 'bertelurnya': 'telur', + 'peneluran': 'telur', + 'perteluran': 'telur', + 'menelut': 'telut', + 'menelutkan': 'telut', + 'bertelut': 'telut', + 'peneman': 'teman', + 'menemani': 'teman', + 'menemaninya': 'teman', + 'menemaniku': 'teman', + 'menemanimu': 'teman', + 'berteman': 'teman', + 'bertemannya': 'teman', + 'bertemanlah': 'teman', + 'bertemankan': 'teman', + 'bertemanan': 'teman', + 'pertemanan': 'teman', + 'pertemanannya': 'teman', + 'pertemananlah': 'teman', + 'pertemananmu': 'teman', + 'menembung': 'tembung', + 'bertembung': 'tembung', + 'pertembungan': 'tembung', + 'menempel': 'tempel', + 'menempelnya': 'tempel', + 'menempelkan': 'tempel', + 'menempelkannya': 'tempel', + 'menempeli': 'tempel', + 'tempelan': 'tempel', + 'tempelannya': 'tempel', + 'penempel': 'tempel', + 'penempelkan': 'tempel', + 'penempelan': 'tempel', + 'menempelinya': 'tempel', + 'bertempel': 'tempel', + 'bertempelan': 'tempel', + 'penempelannya': 'tempel', + 'menempur': 'tempur', + 'tempuran': 'tempur', + 'penempur': 'tempur', + 'bertempur': 'tempur', + 'bertempurnya': 'tempur', + 'bertempurlah': 'tempur', + 'bertempuran': 'tempur', + 'pertempuran': 'tempur', + 'pertempurannya': 'tempur', + 'mempertempurkan': 'tempur', + 'temuan': 'temu', + 'temuannya': 'temu', + 'temuanlah': 'temu', + 'temuanku': 'temu', + 'menemu': 'temu', + 'menemunya': 'temu', + 'menemukan': 'temu', + 'menemukannya': 'temu', + 'menemui': 'temu', + 'menemuan': 'temu', + 'penemu': 'temu', + 'penemunya': 'temu', + 'penemukan': 'temu', + 'penemui': 'temu', + 'penemuan': 'temu', + 'menemuinya': 'temu', + 'menemuikan': 'temu', + 'menemuii': 'temu', + 'menemuiku': 'temu', + 'menemuimu': 'temu', + 'bertemu': 'temu', + 'bertemunya': 'temu', + 'bertemulah': 'temu', + 'bertemui': 'temu', + 'bertemuan': 'temu', + 'penemuannya': 'temu', + 'penemuanlah': 'temu', + 'pertemuan': 'temu', + 'pertemuannya': 'temu', + 'pertemuanan': 'temu', + 'pertemuanku': 'temu', + 'pertemuanmu': 'temu', + 'menemukanlah': 'temu', + 'menemukani': 'temu', + 'menemukanan': 'temu', + 'menemukanku': 'temu', + 'menemukanmu': 'temu', + 'tertemukan': 'temu', + 'mempertemukan': 'temu', + 'mempertemukannya': 'temu', + 'mempertemukanmu': 'temu', + 'menenagai': 'tenaga', + 'bertenaga': 'tenaga', + 'bertenaganya': 'tenaga', + 'bertenagakan': 'tenaga', + 'ketenagaan': 'tenaga', + 'penenggek': 'tenggek', + 'menenggek': 'tenggek', + 'tenggekan': 'tenggek', + 'bertenggek': 'tenggek', + 'tertenggek': 'tenggek', + 'menenggekkan': 'tenggek', + 'tenggeran': 'tengger', + 'bertengger': 'tengger', + 'bertenggernya': 'tengger', + 'bertenggerlah': 'tengger', + 'bertenggeri': 'tengger', + 'penengkar': 'tengkar', + 'menengkar': 'tengkar', + 'menengkari': 'tengkar', + 'bertengkar': 'tengkar', + 'bertengkarnya': 'tengkar', + 'bertengkaran': 'tengkar', + 'menengkarkan': 'tengkar', + 'pertengkaran': 'tengkar', + 'pertengkarannya': 'tengkar', + 'mempertengkarkan': 'tengkar', + 'tentangan': 'tentang', + 'tentangannya': 'tentang', + 'setentang': 'tentang', + 'penentang': 'tentang', + 'penentangnya': 'tentang', + 'penentangan': 'tentang', + 'menentang': 'tentang', + 'menentangnya': 'tentang', + 'menentangku': 'tentang', + 'menentangmu': 'tentang', + 'menentangi': 'tentang', + 'bertentang': 'tentang', + 'bertentangan': 'tentang', + 'tertentang': 'tentang', + 'tertentangan': 'tentang', + 'penentangannya': 'tentang', + 'penentanganan': 'tentang', + 'menentangkan': 'tentang', + 'bertentangannya': 'tentang', + 'bertentanganlah': 'tentang', + 'pertentangan': 'tentang', + 'pertentangannya': 'tentang', + 'mempertentangkan': 'tentang', + 'mempertentangkannya': 'tentang', + 'menepung': 'tepung', + 'bertepung': 'tepung', + 'teriakan': 'teriak', + 'teriakannya': 'teriak', + 'teriakanlah': 'teriak', + 'teriakanku': 'teriak', + 'teriakanmu': 'teriak', + 'meneriaki': 'teriak', + 'meneriakinya': 'teriak', + 'meneriakiku': 'teriak', + 'meneriakimu': 'teriak', + 'berteriak': 'teriak', + 'berteriaknya': 'teriak', + 'berteriaklah': 'teriak', + 'berteriakan': 'teriak', + 'meneriakkan': 'teriak', + 'meneriakkannya': 'teriak', + 'berteriak-teriak': 'teriak', + 'berterus terang': 'terus terang', + 'bertetangga': 'tetangga', + 'bertetanggaan': 'tetangga', + 'bertiang': 'tiang', + 'menikai': 'tikai', + 'tikaian': 'tikai', + 'bertikai': 'tikai', + 'bertikainya': 'tikai', + 'bertikaii': 'tikai', + 'bertikaian': 'tikai', + 'pertikaian': 'tikai', + 'pertikaiannya': 'tikai', + 'mempertikaikan': 'tikai', + 'menindak': 'tindak', + 'menindaknya': 'tindak', + 'menindakkan': 'tindak', + 'menindaki': 'tindak', + 'menindakan': 'tindak', + 'tindakan': 'tindak', + 'tindakannya': 'tindak', + 'tindakanlah': 'tindak', + 'tindakankannya': 'tindak', + 'tindakanan': 'tindak', + 'tindakanku': 'tindak', + 'tindakanmu': 'tindak', + 'tindakan-ku': 'tindak', + 'bertindak': 'tindak', + 'bertindaknya': 'tindak', + 'bertindaklah': 'tindak', + 'bertindakan': 'tindak', + 'penindakan': 'tindak', + 'penindakannya': 'tindak', + 'penindakanlah': 'tindak', + 'meningkah': 'tingkah', + 'meningkahi': 'tingkah', + 'peningkah': 'tingkah', + 'bertingkah': 'tingkah', + 'bertingkah-tingkah': 'tingkah', + 'setingkat': 'tingkat', + 'setingkatnya': 'tingkat', + 'tingkatan': 'tingkat', + 'tingkatannya': 'tingkat', + 'meningkat': 'tingkat', + 'meningkatnya': 'tingkat', + 'meningkatlah': 'tingkat', + 'meningkatkan': 'tingkat', + 'meningkatkannya': 'tingkat', + 'meningkatan': 'tingkat', + 'bertingkat': 'tingkat', + 'bertingkatnya': 'tingkat', + 'bertingkatlah': 'tingkat', + 'bertingkatkan': 'tingkat', + 'peningkatan': 'tingkat', + 'peningkatannya': 'tingkat', + 'peningkatanlah': 'tingkat', + 'peningkatankan': 'tingkat', + 'peningkatanan': 'tingkat', + 'meningkatkankan': 'tingkat', + 'meningkat-ningkat': 'tingkat', + 'bertingkat-tingkat': 'tingkat', + 'menokoh': 'tokoh', + 'menokohkan': 'tokoh', + 'penokoh': 'tokoh', + 'penokohan': 'tokoh', + 'menokohi': 'tokoh', + 'bertokoh': 'tokoh', + 'bertokohkan': 'tokoh', + 'penokohannya': 'tokoh', + 'ketokohan': 'tokoh', + 'ketokohannya': 'tokoh', + 'pertokohan': 'tokoh', + 'menolak': 'tolak', + 'menolaknya': 'tolak', + 'menolaklah': 'tolak', + 'menolakkan': 'tolak', + 'menolaki': 'tolak', + 'menolakan': 'tolak', + 'menolakku': 'tolak', + 'menolakmu': 'tolak', + 'tolakan': 'tolak', + 'tolakannya': 'tolak', + 'penolak': 'tolak', + 'penolaknya': 'tolak', + 'penolakkan': 'tolak', + 'penolakkannya': 'tolak', + 'penolakan': 'tolak', + 'tertolak': 'tolak', + 'tertolaknya': 'tolak', + 'bertolak': 'tolak', + 'bertolaknya': 'tolak', + 'bertolaklah': 'tolak', + 'penolakannya': 'tolak', + 'penolakanlah': 'tolak', + 'tolak-menolak': 'tolak', + 'bertolak-tolak': 'tolak', + 'bertolak-tolakan': 'tolak', + 'menoleransi': 'toleransi', + 'menoleransinya': 'toleransi', + 'bertoleransi': 'toleransi', + 'menopengi': 'topeng', + 'bertopeng': 'topeng', + 'bertopengnya': 'topeng', + 'bertopengkan': 'topeng', + 'mempertopeng': 'topeng', + 'menuahi': 'tuah', + 'bertuah': 'tuah', + 'bertuahnya': 'tuah', + 'ketuahan': 'tuah', + 'ketuahanan': 'tuah', + 'menuahkan': 'tuah', + 'bertuhan': 'tuhan', + 'ketuhanan': 'tuhan', + 'ketuhanannya': 'tuhan', + 'ketuhananan': 'tuhan', + 'menuhankan': 'tuhan', + 'mempertuhan': 'tuhan', + 'mempertuhankan': 'tuhan', + 'bertuhankan': 'tuhan', + 'menukangi': 'tukang', + 'menukanginya': 'tukang', + 'bertukang': 'tukang', + 'ketukangan': 'tukang', + 'pertukangan': 'tukang', + 'tukang-menukang': 'tukang', + 'menukar': 'tukar', + 'menukarnya': 'tukar', + 'menukarkan': 'tukar', + 'menukarkannya': 'tukar', + 'menukaran': 'tukar', + 'penukar': 'tukar', + 'penukarnya': 'tukar', + 'penukarkan': 'tukar', + 'penukaran': 'tukar', + 'bertukar': 'tukar', + 'bertukarnya': 'tukar', + 'bertukarlah': 'tukar', + 'bertukaran': 'tukar', + 'tertukar': 'tukar', + 'tertukarnya': 'tukar', + 'menukari': 'tukar', + 'penukarannya': 'tukar', + 'pertukaran': 'tukar', + 'pertukarannya': 'tukar', + 'tukar-menukar': 'tukar', + 'mempertukarkan': 'tukar', + 'mempertukarkannya': 'tukar', + 'bertukar-tukar': 'tukar', + 'bertukar-tukaran': 'tukar', + 'penulis': 'tulis', + 'penulisnya': 'tulis', + 'penulislah': 'tulis', + 'penulisan': 'tulis', + 'tulisan': 'tulis', + 'tulisannya': 'tulis', + 'tulisanlah': 'tulis', + 'tulisanku': 'tulis', + 'tulisanmu': 'tulis', + 'menulis': 'tulis', + 'menulisnya': 'tulis', + 'menulislah': 'tulis', + 'menuliskan': 'tulis', + 'menuliskannya': 'tulis', + 'menulisi': 'tulis', + 'menulisan': 'tulis', + 'menulismu': 'tulis', + 'bertulis': 'tulis', + 'bertuliskan': 'tulis', + 'bertulisan': 'tulis', + 'menulisinya': 'tulis', + 'menulisikan': 'tulis', + 'menulisiku': 'tulis', + 'tertulis': 'tulis', + 'tertulisnya': 'tulis', + 'tertulislah': 'tulis', + 'tertuliskan': 'tulis', + 'tertulisan': 'tulis', + 'penulisannya': 'tulis', + 'penulisanmu': 'tulis', + 'menuliskankan': 'tulis', + 'tulis-menulis': 'tulis', + 'menumbuk': 'tumbuk', + 'menumbuknya': 'tumbuk', + 'menumbukkan': 'tumbuk', + 'menumbukan': 'tumbuk', + 'penumbuk': 'tumbuk', + 'penumbukan': 'tumbuk', + 'tumbukan': 'tumbuk', + 'tumbukannya': 'tumbuk', + 'tertumbuk': 'tumbuk', + 'bertumbuk': 'tumbuk', + 'bertumbuknya': 'tumbuk', + 'bertumbukkan': 'tumbuk', + 'bertumbukan': 'tumbuk', + 'ketumbukan': 'tumbuk', + 'penumpu': 'tumpu', + 'penumpukan': 'tumpuk', + 'penumpukannya': 'tumpuk', + 'setumpu': 'tumpu', + 'setumpukan': 'tumpuk', + 'menumpu': 'tumpu', + 'menumpukan': 'tumpuk', + 'tumpuan': 'tumpu', + 'tumpuannya': 'tumpu', + 'bertumpu': 'tumpu', + 'bertumpunya': 'tumpu', + 'bertumpulah': 'tumpu', + 'bertumpukan': 'tumpu', + 'tertumpu': 'tumpu', + 'bersetumpu': 'tumpu', + 'menurap': 'turap', + 'menurapnya': 'turap', + 'berturap': 'turap', + 'tuturan': 'tutur', + 'tuturannya': 'tutur', + 'penutur': 'tutur', + 'penuturnya': 'tutur', + 'penuturkan': 'tutur', + 'penuturan': 'tutur', + 'bertutur': 'tutur', + 'bertuturnya': 'tutur', + 'bertuturkan': 'tutur', + 'tertutur': 'tutur', + 'petuturan': 'tutur', + 'penuturannya': 'tutur', + 'penuturanmu': 'tutur', + 'pertuturan': 'tutur', + 'menuturkan': 'tutur', + 'menuturkannya': 'tutur', + 'menuturkankan': 'tutur', + 'bertutur-tutur': 'tutur', + 'mempertuturkan': 'tutur', + 'beruang': 'uang', + 'beruangnya': 'uang', + 'beruanglah': 'uang', + 'beruangan': 'uang', + 'keuangan': 'uang', + 'keuangannya': 'uang', + 'keuanganlah': 'uang', + 'keuanganan': 'uang', + 'keuanganku': 'uang', + 'keuanganmu': 'uang', + 'menguangi': 'uang', + 'peruangan': 'uang', + 'penguangan': 'uang', + 'penguangannya': 'uang', + 'uang-uangan': 'uang', + 'menguangkan': 'uang', + 'menguangkannya': 'uang', + 'peubah': 'ubah', + 'peubahnya': 'ubah', + 'peubahan': 'ubah', + 'ubahan': 'ubah', + 'ubahannya': 'ubah', + 'terubah': 'ubah', + 'perubah': 'ubah', + 'perubahkan': 'ubah', + 'perubahan': 'ubah', + 'berubah': 'ubah', + 'berubahnya': 'ubah', + 'berubahlah': 'ubah', + 'berubahan': 'ubah', + 'pengubah': 'ubah', + 'pengubahnya': 'ubah', + 'pengubahan': 'ubah', + 'mengubah': 'ubah', + 'mengubahnya': 'ubah', + 'mengubahkan': 'ubah', + 'mengubahan': 'ubah', + 'mengubahku': 'ubah', + 'mengubahmu': 'ubah', + 'perubahannya': 'ubah', + 'perubahanlah': 'ubah', + 'perubahanan': 'ubah', + 'perubahanku': 'ubah', + 'pengubahannya': 'ubah', + 'berubah-ubah': 'ubah', + 'berubah-ubahnya': 'ubah', + 'memperubahkan': 'ubah', + 'ubanan': 'uban', + 'beruban': 'uban', + 'berubannya': 'uban', + 'menguban': 'uban', + 'mengubani': 'uban', + 'berudu': 'udu', + 'berudunya': 'udu', + 'ukiran': 'ukir', + 'ukirannya': 'ukir', + 'terukir': 'ukir', + 'terukirnya': 'ukir', + 'terukirlah': 'ukir', + 'terukirkan': 'ukir', + 'berukir': 'ukir', + 'berukirkan': 'ukir', + 'berukiran': 'ukir', + 'mengukir': 'ukir', + 'mengukirnya': 'ukir', + 'mengukirkan': 'ukir', + 'mengukirkannya': 'ukir', + 'pengukir': 'ukir', + 'pengukiran': 'ukir', + 'mengukiri': 'ukir', + 'pengukirannya': 'ukir', + 'ukir-ukiran': 'ukir', + 'ukir-mengukir': 'ukir', + 'seukur': 'ukur', + 'seukuran': 'ukur', + 'ukuran': 'ukur', + 'ukurannya': 'ukur', + 'ukuranlah': 'ukur', + 'ukuranku': 'ukur', + 'ukuranmu': 'ukur', + 'mengukur': 'ukur', + 'mengukurnya': 'ukur', + 'mengukurlah': 'ukur', + 'mengukurkan': 'ukur', + 'mengukurkannya': 'ukur', + 'pengukur': 'ukur', + 'pengukurnya': 'ukur', + 'pengukuran': 'ukur', + 'berukuran': 'ukur', + 'berukurannya': 'ukur', + 'pengukurannya': 'ukur', + 'ulangan': 'ulang', + 'ulangannya': 'ulang', + 'ulangani': 'ulang', + 'seulang': 'ulang', + 'berulang': 'ulang', + 'berulangnya': 'ulang', + 'berulanglah': 'ulang', + 'berulangkan': 'ulang', + 'terulang': 'ulang', + 'terulangnya': 'ulang', + 'terulangkan': 'ulang', + 'terulangi': 'ulang', + 'pengulang': 'ulang', + 'pengulangan': 'ulang', + 'mengulang': 'ulang', + 'mengulangnya': 'ulang', + 'mengulangi': 'ulang', + 'mengulanginya': 'ulang', + 'perulangan': 'ulang', + 'perulangannya': 'ulang', + 'pengulangannya': 'ulang', + 'ulang-ulang': 'ulang', + 'ulang-ulangi': 'ulang', + 'berulang-ulang': 'ulang', + 'berulang-ulangnya': 'ulang', + 'mengulang-ulang': 'ulang', + 'mengulang-ulangnya': 'ulang', + 'mengulang-ulangi': 'ulang', + 'berulat': 'ulat', + 'terberumbun': 'berumbun', + 'berumput': 'umput', + 'seumur': 'umur', + 'seumurnya': 'umur', + 'seumuran': 'umur', + 'seumurmu': 'umur', + 'berumur': 'umur', + 'berumurnya': 'umur', + 'berumuran': 'umur', + 'rundingan': 'runding', + 'rundingannya': 'runding', + 'berunding': 'runding', + 'berundingnya': 'runding', + 'berundinglah': 'runding', + 'berundingan': 'runding', + 'merunding': 'runding', + 'merundingkan': 'runding', + 'merundingkannya': 'runding', + 'merundingan': 'runding', + 'perunding': 'berunding', + 'perundingnya': 'berunding', + 'perundingkan': 'berunding', + 'perundingan': 'berunding', + 'perundingannya': 'berunding', + 'perundinganlah': 'berunding', + 'perundinganan': 'berunding', + 'memperundingkan': 'runding', + 'rungutan': 'rungut', + 'merungut': 'rungut', + 'berungut': 'rungut', + 'berungutan': 'rungut', + 'merungutkan': 'rungut', + 'merungut-rungut': 'rungut', + 'berunsur': 'unsur', + 'berunsurkan': 'unsur', + 'beruntung': 'untung', + 'beruntungnya': 'untung', + 'beruntunglah': 'untung', + 'beruntungan': 'untung', + 'keuntungan': 'untung', + 'keuntungannya': 'untung', + 'keuntunganlah': 'untung', + 'keuntunganku': 'untung', + 'peruntungan': 'untung', + 'peruntungannya': 'untung', + 'peruntunganlah': 'untung', + 'peruntunganku': 'untung', + 'peruntunganmu': 'untung', + 'untung-untung': 'untung', + 'untung-untungan': 'untung', + 'menguntungkan': 'untung', + 'menguntungkannya': 'untung', + 'menguntungkanlah': 'untung', + 'menguntungkankan': 'untung', + 'menguntungkanku': 'untung', + 'menguntungkanmu': 'untung', + 'keberuntungan': 'untung', + 'keberuntungannya': 'untung', + 'keberuntunganlah': 'untung', + 'keberuntunganku': 'untung', + 'keberuntunganmu': 'untung', + 'beruntung-untung': 'untung', + 'seberuntung-beruntungnya': 'untung', + 'beruntusan': 'beruntus', + 'perupa': 'rupa', + 'perupakan': 'rupa', + 'perupaan': 'rupa', + 'serupa': 'rupa', + 'serupanya': 'rupa', + 'serupalah': 'rupa', + 'berupa': 'rupa', + 'berupanya': 'rupa', + 'berupakan': 'rupa', + 'berupai': 'rupa', + 'terupa': 'rupa', + 'terupakan': 'rupa', + 'merupa': 'rupa', + 'merupakan': 'rupa', + 'merupai': 'rupa', + 'merupaan': 'rupa', + 'rupanya': 'rupa', + 'rupanyanya': 'rupa', + 'merupakani': 'rupa', + 'merupakanan': 'rupa', + 'berserupa': 'rupa', + 'rupa-rupa': 'rupa', + 'rupa-rupanya': 'rupa', + 'menyerupa': 'rupa', + 'menyerupakan': 'rupa', + 'menyerupai': 'rupa', + 'keserupaan': 'rupa', + 'menyerupainya': 'rupa', + 'menyerupaian': 'rupa', + 'berupa-rupa': 'rupa', + 'perserupaan': 'rupa', + 'urutan': 'urut', + 'urutannya': 'urut', + 'berurut': 'urut', + 'berurutlah': 'urut', + 'berurutan': 'urut', + 'mengurut': 'urut', + 'mengurutnya': 'urut', + 'mengurutkan': 'urut', + 'mengurutkannya': 'urut', + 'menguruti': 'urut', + 'pengurutan': 'urut', + 'memperurutkan': 'urut', + 'berurut-urutan': 'urut', + 'memberus': 'berus', + 'berusaha': 'usaha', + 'berusahanya': 'usaha', + 'berusahalah': 'usaha', + 'berusahakan': 'usaha', + 'berusahaan': 'usaha', + 'pengusaha': 'usaha', + 'pengusahanya': 'usaha', + 'pengusahalah': 'usaha', + 'pengusahaan': 'usaha', + 'perusahaan': 'usaha', + 'perusahaannya': 'usaha', + 'perusahaanlah': 'usaha', + 'perusahaankan': 'usaha', + 'perusahaanku': 'usaha', + 'perusahaanmu': 'usaha', + 'pengusahaannya': 'usaha', + 'mengusahakan': 'usaha', + 'mengusahakannya': 'usaha', + 'kepengusahaan': 'usaha', + 'berusia': 'usia', + 'berusianya': 'usia', + 'berusiai': 'usia', + 'sewarna': 'warna', + 'pewarna': 'warna', + 'pewarnanya': 'warna', + 'pewarnaan': 'warna', + 'mewarnai': 'warna', + 'mewarnainya': 'warna', + 'berwarna': 'warna', + 'berwarnanya': 'warna', + 'berwarnakan': 'warna', + 'berwarnai': 'warna', + 'pewarnaannya': 'warna', + 'mewarnakan': 'warna', + 'berwarna-warna': 'warna', + 'berwarna-warnai': 'warna', + 'berwasiat': 'wasiat', + 'mewasiatkan': 'wasiat', + 'berwibawa': 'wibawa', + 'berwibawanya': 'wibawa', + 'kewibawaan': 'wibawa', + 'kewibawaannya': 'wibawa', + 'peziarah': 'ziarah', + 'peziarahnya': 'ziarah', + 'peziarahan': 'ziarah', + 'penziarah': 'ziarah', + 'penziarahnya': 'ziarah', + 'penziarahan': 'ziarah', + 'berziarah': 'ziarah', + 'berziarahlah': 'ziarah', + 'menziarahi': 'ziarah', + 'menziarahinya': 'ziarah', + 'menziarahiku': 'ziarah', + 'berzina': 'zina', + 'menzinai': 'zina', + 'perzinaan': 'zina', + 'perzinaannya': 'zina', + 'berbesan': 'besan', + 'berbesanan': 'besan', + 'berbesar hati': 'besar hati', + 'kebesar-hatian': 'besar hati', + 'terbesar': 'besar', + 'terbesarnya': 'besar', + 'terbesarlah': 'besar', + 'terbesarkan': 'besar', + 'terbesari': 'besar', + 'terbesarku': 'besar', + 'terbesarmu': 'besar', + 'pembesar': 'besar', + 'pembesarnya': 'besar', + 'pembesaran': 'besar', + 'membesar': 'besar', + 'membesarnya': 'besar', + 'membesarkan': 'besar', + 'membesarkannya': 'besar', + 'membesaran': 'besar', + 'kebesaran': 'besar', + 'kebesarannya': 'besar', + 'kebesaranmu': 'besar', + 'kebesaran-mu': 'besar', + 'pembesarannya': 'besar', + 'membesarkanku': 'besar', + 'membesarkanmu': 'besar', + 'memperbesar': 'besar', + 'memperbesarnya': 'besar', + 'memperbesarkan': 'besar', + 'besar-besaran': 'besar', + 'besar-besarannya': 'besar', + 'besar-besaranlah': 'besar', + 'besar-besaranan': 'besar', + 'membesar-besar': 'besar', + 'membesar-besarnya': 'besar', + 'membesar-besarkan': 'besar', + 'membesar-besarkannya': 'besar', + 'membesar-besaran': 'besar', + 'berbesar-besar': 'besar', + 'beselan': 'besel', + 'membeset': 'beset', + 'membesi': 'besi', + 'membesi tua': 'besi tua', + 'membesituakan': 'besi tua', + 'terbesit': 'besit', + 'terbesitlah': 'besit', + 'membesit': 'besit', + 'membesitkan': 'besit', + 'beslahan': 'beslah', + 'membeslah': 'beslah', + 'pembeslahan': 'beslah', + 'bestelan': 'bestel', + 'membestel': 'bestel', + 'pembestralan': 'bestral', + 'membesut': 'besut', + 'membesutnya': 'besut', + 'membesutkan': 'besut', + 'berbeta': 'beta', + 'membetahkan': 'betah', + 'membetas': 'betas', + 'penernak': 'ternak', + 'peternak': 'ternak', + 'peternaknya': 'ternak', + 'peternakkan': 'ternak', + 'peternakan': 'ternak', + 'beternak': 'ternak', + 'beternaknya': 'ternak', + 'peternakannya': 'ternak', + 'menernakkan': 'ternak', + 'menernakkannya': 'ternak', + 'terbeti': 'beti', + 'terbetik': 'betik', + 'terbetiknya': 'betik', + 'betik-betik': 'betik', + 'membeting': 'beting', + 'berbeting': 'beting', + 'terbeting': 'beting', + 'membeton': 'beton', + 'membetonnya': 'beton', + 'membetoni': 'beton', + 'membetot': 'betot', + 'betulan': 'betul', + 'betulannya': 'betul', + 'berbetul': 'betul', + 'kebetulan': 'betul', + 'kebetulannya': 'betul', + 'kebetulankan': 'betul', + 'membetuli': 'betul', + 'sebetulnya': 'betul', + 'berbetulan': 'betul', + 'pembetulan': 'betul', + 'pembetulannya': 'betul', + 'membetulkan': 'betul', + 'membetulkannya': 'betul', + 'betul-betul': 'betul', + 'berkebetulan': 'betul', + 'kebiadaban': 'biadab', + 'kebiadabannya': 'biadab', + 'membiadabi': 'biadab', + 'biakan': 'biak', + 'biakannya': 'biak', + 'membiak': 'biak', + 'membiaknya': 'biak', + 'membiakkan': 'biak', + 'membiakkannya': 'biak', + 'membiakan': 'biak', + 'berbiak': 'biak', + 'berbiaknya': 'biak', + 'membiaki': 'biak', + 'pembiakan': 'biak', + 'pembiakannya': 'biak', + 'biang biut': 'biang', + 'biang-biang': 'biang', + 'memperbiar': 'biar', + 'membiarkan': 'biar', + 'membiarkannya': 'biar', + 'membiarkankan': 'biar', + 'membiarkanku': 'biar', + 'membiarkanmu': 'biar', + 'membias': 'bias', + 'membiaskan': 'bias', + 'pembiasan': 'bias', + 'pembiasannya': 'bias', + 'biasanya': 'biasa', + 'biasanyanya': 'biasa', + 'biasanyalah': 'biasa', + 'biasanyakan': 'biasa', + 'terbiasa': 'biasa', + 'terbiasanya': 'biasa', + 'terbiasalah': 'biasa', + 'terbiasai': 'biasa', + 'kebiasaan': 'biasa', + 'kebiasaannya': 'biasa', + 'kebiasaanku': 'biasa', + 'kebiasaanmu': 'biasa', + 'membiasakan': 'biasa', + 'membiasakannya': 'biasa', + 'membiasakanmu': 'biasa', + 'berbiau': 'biau', + 'membiawak': 'biawak', + 'membiayai': 'biaya', + 'membiayainya': 'biaya', + 'pembiayaan': 'biaya', + 'pembiayaannya': 'biaya', + 'membiayakan': 'biaya', + 'pembibit': 'bibit', + 'pembibitan': 'bibit', + 'membibit': 'bibit', + 'membibitkan': 'bibit', + 'pembibitannya': 'bibit', + 'membicu': 'bicu', + 'bicu-bicu': 'bicu', + 'membidai': 'bidai', + 'berbidai-bidai': 'bidai', + 'berbidan': 'bidan', + 'kebidanan': 'bidan', + 'kebidananan': 'bidan', + 'membidani': 'bidan', + 'bidangan': 'bidang', + 'pembidang': 'bidang', + 'pembidangan': 'bidang', + 'membidangi': 'bidang', + 'membidanginya': 'bidang', + 'pembidangannya': 'bidang', + 'membidangkan': 'bidang', + 'bidasan': 'bidas', + 'pembidas': 'bidas', + 'membidas': 'bidas', + 'bidikan': 'bidik', + 'bidikannya': 'bidik', + 'membidik': 'bidik', + 'membidiknya': 'bidik', + 'membidiklah': 'bidik', + 'membidikkan': 'bidik', + 'membidiki': 'bidik', + 'membidikan': 'bidik', + 'membidikku': 'bidik', + 'pembidik': 'bidik', + 'pembidiknya': 'bidik', + 'pembidikan': 'bidik', + 'berbiduk': 'biduk', + 'berbiduk-biduk': 'biduk', + 'kebijakan': 'bijak', + 'kebijakannya': 'bijak', + 'kebijakanlah': 'bijak', + 'kebijakankan': 'bijak', + 'kebijakanan': 'bijak', + 'kebijakanku': 'bijak', + 'kebijakanmu': 'bijak', + 'kebijaksanaan': 'bijaksana', + 'kebijaksanaannya': 'bijaksana', + 'kebijaksanaanlah': 'bijaksana', + 'berbiji': 'biji', + 'membiji': 'biji', + 'biji-bijian': 'biji', + 'biji-bijiannya': 'biji', + 'pembikangan': 'bikang', + 'bikinan': 'bikin', + 'bikinannya': 'bikin', + 'terbikin': 'bikin', + 'membikin': 'bikin', + 'membikinnya': 'bikin', + 'membikinkan': 'bikin', + 'pembikinan': 'bikin', + 'membikin-bikin': 'bikin', + 'berbiku-biku': 'biku', + 'bila-bila': 'bila', + 'membilah-bilah': 'bilah', + 'membilai': 'bilai', + 'pembilas': 'bilas', + 'pembilasan': 'bilas', + 'membilas': 'bilas', + 'membilasnya': 'bilas', + 'berbilas': 'bilas', + 'berbilik-bilik': 'bilik', + 'kebimbangan': 'bimbang', + 'kebimbangannya': 'bimbang', + 'membimbangkan': 'bimbang', + 'bimbingan': 'bimbing', + 'bimbingannya': 'bimbing', + 'pembimbing': 'bimbing', + 'pembimbingnya': 'bimbing', + 'pembimbingan': 'bimbing', + 'pembimbingku': 'bimbing', + 'pembimbingmu': 'bimbing', + 'membimbing': 'bimbing', + 'membimbingnya': 'bimbing', + 'membimbinglah': 'bimbing', + 'membimbingku': 'bimbing', + 'membimbingmu': 'bimbing', + 'berbimbing': 'bimbing', + 'berbimbingan': 'bimbing', + 'bimbitan': 'bimbit', + 'membimbit': 'bimbit', + 'membina': 'bina', + 'membinanya': 'bina', + 'membinakan': 'bina', + 'membinaan': 'bina', + 'pembina': 'bina', + 'pembinanya': 'bina', + 'pembinaan': 'bina', + 'pembinamu': 'bina', + 'pembinaannya': 'bina', + 'pembinaanlah': 'bina', + 'berbinar-binar': 'binar', + 'kebinasaan': 'binasa', + 'kebinasaannya': 'binasa', + 'pembinasaan': 'binasa', + 'membinasakan': 'binasa', + 'membinasakannya': 'binasa', + 'kebinatangan': 'binatang', + 'kebinatangannya': 'binatang', + 'berbincang': 'bincang', + 'berbincangnya': 'bincang', + 'berbincanglah': 'bincang', + 'berbincangan': 'bincang', + 'perbincangan': 'bincang', + 'perbincangannya': 'bincang', + 'perbincanganan': 'bincang', + 'membincangkan': 'bincang', + 'membincangkannya': 'bincang', + 'berbincang-bincang': 'bincang', + 'berbincang-bincanglah': 'bincang', + 'membindu': 'bindu', + 'kebinekaan': 'bineka', + 'kebinekaannya': 'bineka', + 'membingas': 'bingas', + 'bingkahan': 'bingkah', + 'membingkah': 'bingkah', + 'membingkahi': 'bingkah', + 'bingkah-bingkah': 'bingkah', + 'berbingkah-bingkah': 'bingkah', + 'membingkas': 'bingkas', + 'bingkisan': 'bingkis', + 'bingkisannya': 'bingkis', + 'membingkis': 'bingkis', + 'membingkisnya': 'bingkis', + 'kebingungan': 'bingung', + 'kebingungannya': 'bingung', + 'membingungkan': 'bingung', + 'membingungkannya': 'bingung', + 'membinjat': 'binjat', + 'berbintil-bintil': 'bintil', + 'berbiola': 'biola', + 'perbioskopan': 'bioskop', + 'kebirahan': 'birah', + 'berbiras': 'biras', + 'terbirit': 'birit', + 'terbirit-birit': 'birit', + 'pembirokrasian': 'birokrasi', + 'membiru': 'biru', + 'membirunya': 'biru', + 'membirukan': 'biru', + 'kebiru-biruan': 'biru', + 'kebiru-biruanan': 'biru', + 'mengebiskan': 'bis', + 'kebisingan': 'bising', + 'kebisingannya': 'bising', + 'membisingkan': 'bising', + 'pebisnis': 'bisnis', + 'pebisnisnya': 'bisnis', + 'pebisnislah': 'bisnis', + 'berbisnis': 'bisnis', + 'berbisnisnya': 'bisnis', + 'berbisnislah': 'bisnis', + 'berbisniskan': 'bisnis', + 'membisu': 'bisu', + 'membisunya': 'bisu', + 'membisukan': 'bisu', + 'berbisu': 'bisu', + 'membisul': 'bisul', + 'berbisul': 'bisul', + 'biti-biti': 'biti', + 'terbius': 'bius', + 'membius': 'bius', + 'membiusnya': 'bius', + 'membiuskan': 'bius', + 'pembius': 'bius', + 'pembiusnya': 'bius', + 'pembiusan': 'bius', + 'pembiusannya': 'bius', + 'blasteran': 'blaster', + 'blasterannya': 'blaster', + 'memblaster': 'blaster', + 'berblirik': 'blirik', + 'memblokade': 'blokade', + 'memblokadenya': 'blokade', + 'pemblokadean': 'blokade', + 'memblokir': 'blokir', + 'memblokirnya': 'blokir', + 'memblokiran': 'blokir', + 'memblokirmu': 'blokir', + 'membobok': 'bobok', + 'memboboknya': 'bobok', + 'membobol': 'bobol', + 'membobolnya': 'bobol', + 'membobolkan': 'bobol', + 'pembobol': 'bobol', + 'pembobolnya': 'bobol', + 'pembobolan': 'bobol', + 'kebobolan': 'bobol', + 'kebobolannya': 'bobol', + 'pembobolannya': 'bobol', + 'membobos': 'bobos', + 'berbobot': 'bobot', + 'berbobotlah': 'bobot', + 'kebobrokan': 'bobrok', + 'kebobrokannya': 'bobrok', + 'kebocahan': 'bocah', + 'bocoran': 'bocor', + 'bocorannya': 'bocor', + 'kebocoran': 'bocor', + 'kebocorannya': 'bocor', + 'kebocoranlah': 'bocor', + 'pembocoran': 'bocor', + 'pembocorannya': 'bocor', + 'membocorkan': 'bocor', + 'membocorkannya': 'bocor', + 'kebodohan': 'bodoh', + 'kebodohannya': 'bodoh', + 'kebodohanku': 'bodoh', + 'kebodohanmu': 'bodoh', + 'pembodohan': 'bodoh', + 'pembodohanlah': 'bodoh', + 'membodohkan': 'bodoh', + 'memperbodoh': 'bodoh', + 'bodoran': 'bodor', + 'membodor': 'bodor', + 'berboga': 'boga', + 'memboikot': 'boikot', + 'memboikotnya': 'boikot', + 'pemboikot': 'boikot', + 'pemboikotkan': 'boikot', + 'pemboikotan': 'boikot', + 'pemboikotannya': 'boikot', + 'pembokong': 'bokong', + 'membokong': 'bokong', + 'pembokongan': 'bokong', + 'membola': 'bola', + 'berbolak-balik': 'bolak-balik', + 'membolak-balikkan': 'bolak-balik', + 'membolak-balikkannya': 'bolak-balik', + 'bolehan': 'boleh', + 'kebolehan': 'boleh', + 'kebolehannya': 'boleh', + 'membolehkan': 'boleh', + 'membolehkannya': 'boleh', + 'membolehkanku': 'boleh', + 'membolehkanmu': 'boleh', + 'memperbolehkan': 'boleh', + 'memperbolehkannya': 'boleh', + 'memperbolehkanku': 'boleh', + 'seboleh-bolehnya': 'boleh', + 'peboling': 'boling', + 'berbolong-bolong': 'bolong', + 'membolos': 'bolos', + 'membolosnya': 'bolos', + 'membolot': 'bolot', + 'pengebom': 'bom', + 'pengebomnya': 'bom', + 'pengeboman': 'bom', + 'mengebom': 'bom', + 'mengebomnya': 'bom', + 'mengebomi': 'bom', + 'mengeboman': 'bom', + 'pengebomannya': 'bom', + 'pengebomanan': 'bom', + 'membombardir': 'bombardir', + 'membombardirnya': 'bombardir', + 'mengebon': 'bon', + 'boncengan': 'bonceng', + 'boncengannya': 'bonceng', + 'pembonceng': 'bonceng', + 'pemboncengnya': 'bonceng', + 'pemboncengan': 'bonceng', + 'membonceng': 'bonceng', + 'memboncengnya': 'bonceng', + 'memboncengkan': 'bonceng', + 'memboncengkannya': 'bonceng', + 'memboncengi': 'bonceng', + 'memboncengan': 'bonceng', + 'berboncengan': 'bonceng', + 'berbondong-bondong': 'bondong', + 'berbondong-bondongnya': 'bondong', + 'berbondong-bondonglah': 'bondong', + 'membondot': 'bondot', + 'membonekakan': 'boneka', + 'memperboneka': 'boneka', + 'memperbonekakan': 'boneka', + 'membongak': 'bongak', + 'membonggol': 'bonggol', + 'membonggoli': 'bonggol', + 'berbongkah': 'bongkah', + 'membongkahi': 'bongkah', + 'berbongkah-bongkah': 'bongkah', + 'bongkaran': 'bongkar', + 'bongkarannya': 'bongkar', + 'terbongkar': 'bongkar', + 'terbongkarnya': 'bongkar', + 'terbongkarlah': 'bongkar', + 'terbongkarkan': 'bongkar', + 'membongkar': 'bongkar', + 'membongkarnya': 'bongkar', + 'membongkaran': 'bongkar', + 'kebongkaran': 'bongkar', + 'pembongkaran': 'bongkar', + 'pembongkarannya': 'bongkar', + 'membongkar-bongkar': 'bongkar', + 'bongkar-membongkar': 'bongkar', + 'membongkar-bangkir': 'bongkar-bangkir', + 'membongmeh': 'bongmeh', + 'membonsai': 'bonsai', + 'membonsainya': 'bonsai', + 'membonsaikan': 'bonsai', + 'pembonsaian': 'bonsai', + 'membopong': 'bopong', + 'membopongnya': 'bopong', + 'pengebor': 'bor', + 'pengebornya': 'bor', + 'pengeboran': 'bor', + 'mengebor': 'bor', + 'mengebornya': 'bor', + 'mengeboran': 'bor', + 'pengeborannya': 'bor', + 'bordiran': 'bordir', + 'bordirannya': 'bordir', + 'membordir': 'bordir', + 'membordirkan': 'bordir', + 'memborgol': 'borgol', + 'memborgolnya': 'borgol', + 'memborgolkan': 'borgol', + 'memborgolku': 'borgol', + 'pemborgolan': 'borgol', + 'borokan': 'borok', + 'berborok': 'borok', + 'memborok': 'borok', + 'memborokan': 'borok', + 'borongan': 'borong', + 'borongannya': 'borong', + 'memborong': 'borong', + 'memborongnya': 'borong', + 'memborongkan': 'borong', + 'pemborong': 'borong', + 'pemborongnya': 'borong', + 'pemborongan': 'borong', + 'pemboros': 'boros', + 'pemborosan': 'boros', + 'keborosan': 'boros', + 'pemborosannya': 'boros', + 'memboroskan': 'boros', + 'memboroskannya': 'boros', + 'pembosan': 'bosan', + 'kebosanan': 'bosan', + 'kebosanannya': 'bosan', + 'kebosananku': 'bosan', + 'membosankan': 'bosan', + 'membosankannya': 'bosan', + 'membotak': 'botak', + 'membotakkan': 'botak', + 'membotaki': 'botak', + 'membotakinya': 'botak', + 'kebotakan': 'botak', + 'kebotakannya': 'botak', + 'pembotolan': 'botol', + 'pembotolannya': 'botol', + 'memboya': 'boya', + 'keboyakan': 'boyak', + 'boyongan': 'boyong', + 'boyongannya': 'boyong', + 'berboyong': 'boyong', + 'memboyong': 'boyong', + 'memboyongnya': 'boyong', + 'memboyongkan': 'boyong', + 'memboyongan': 'boyong', + 'memboyongku': 'boyong', + 'pemboyongan': 'boyong', + 'pembriketan': 'briket', + 'kebrutalan': 'brutal', + 'kebrutalannya': 'brutal', + 'kebrutalanmu': 'brutal', + 'berbuah': 'buah', + 'berbuahnya': 'buah', + 'berbuahlah': 'buah', + 'berbuahkan': 'buah', + 'bebuahan': 'buah', + 'membuahi': 'buah', + 'membuahinya': 'buah', + 'perbuahan': 'buah', + 'pembuahan': 'buah', + 'pembuahannya': 'buah', + 'membuahkan': 'buah', + 'membuahkannya': 'buah', + 'buah-buahan': 'buah', + 'buah-buahannya': 'buah', + 'buaian': 'buai', + 'buaiannya': 'buai', + 'terbuai': 'buai', + 'terbuailah': 'buai', + 'membuai': 'buai', + 'membuainya': 'buai', + 'membuaiku': 'buai', + 'membuaimu': 'buai', + 'berbuai': 'buai', + 'berbuai-buai': 'buai', + 'terbuai-buai': 'buai', + 'membuak': 'buak', + 'membuakan': 'buak', + 'membuana': 'buana', + 'buangan': 'buang', + 'buangannya': 'buang', + 'terbuang': 'buang', + 'terbuangnya': 'buang', + 'terbuanglah': 'buang', + 'membuang': 'buang', + 'membuangnya': 'buang', + 'membuangkan': 'buang', + 'membuangan': 'buang', + 'membuangmu': 'buang', + 'pembuangan': 'buang', + 'pembuangannya': 'buang', + 'terbuang-buang': 'buang', + 'membuang-buang': 'buang', + 'membuang-buangnya': 'buang', + 'buang-buang air': 'buang', + 'membuas': 'buas', + 'membuaskan': 'buas', + 'kebuasan': 'buas', + 'kebuasannya': 'buas', + 'membuaya': 'buaya', + 'membuayai': 'buaya', + 'pembubaran': 'bubar', + 'pembubarannya': 'bubar', + 'membubarkan': 'bubar', + 'membubarkannya': 'bubar', + 'membubu': 'bubu', + 'membubukan': 'bubuk', + 'membubui': 'bubu', + 'bubuhan': 'bubuh', + 'membubuh': 'bubuh', + 'membubuhkan': 'bubuh', + 'membubuhkannya': 'bubuh', + 'membubuhi': 'bubuh', + 'membubuhan': 'bubuh', + 'membubuhinya': 'bubuh', + 'pembubuhan': 'bubuh', + 'bubukan': 'bubuk', + 'membubuk': 'bubuk', + 'pembubukan': 'bubuk', + 'membubul': 'bubul', + 'bubun-bubun': 'bubun', + 'bubungan': 'bubung', + 'membubung': 'bubung', + 'membubungnya': 'bubung', + 'membubungkan': 'bubung', + 'memperbubungkan': 'bubung', + 'membubur': 'bubur', + 'membubus': 'bubus', + 'bubutan': 'bubut', + 'membubut': 'bubut', + 'membubuti': 'bubut', + 'pembubut': 'bubut', + 'pembubutan': 'bubut', + 'membudak': 'budak', + 'membudaknya': 'budak', + 'perbudakan': 'budak', + 'perbudakannya': 'budak', + 'pembudakan': 'budak', + 'membudakkan': 'budak', + 'memperbudak': 'budak', + 'memperbudaknya': 'budak', + 'memperbudakan': 'budak', + 'berbudak-budak': 'budak', + 'kebudak-budakan': 'budak', + 'berbudaya': 'budaya', + 'berbudayalah': 'budaya', + 'membudaya': 'budaya', + 'membudayanya': 'budaya', + 'membudayakan': 'budaya', + 'membudayakannya': 'budaya', + 'kebudayaan': 'budaya', + 'kebudayaannya': 'budaya', + 'kebudayaanan': 'budaya', + 'pembudayaan': 'budaya', + 'pembudidaya': 'budi daya', + 'pembudidayanya': 'budi daya', + 'pembudidayaan': 'budi daya', + 'pembudidayaannya': 'budi daya', + 'membudidayakan': 'budi daya', + 'membudidayakannya': 'budi daya', + 'terbudur': 'budur', + 'kebugaran': 'bugar', + 'kebugarannya': 'bugar', + 'kebugaranku': 'bugar', + 'pembugaran': 'bugar', + 'membugarkan': 'bugar', + 'berbugil': 'bugil', + 'membugil': 'bugil', + 'buhulan': 'buhul', + 'membuhul': 'buhul', + 'bujangan': 'bujang', + 'bujangannya': 'bujang', + 'membujang': 'bujang', + 'membujangnya': 'bujang', + 'kebujangan': 'bujang', + 'pembujangan': 'bujang', + 'perbujangan': 'bujang', + 'kebujanggaan': 'bujangga', + 'bujukan': 'bujuk', + 'bujukannya': 'bujuk', + 'pembujuk': 'bujuk', + 'pembujukan': 'bujuk', + 'membujuk': 'bujuk', + 'membujuknya': 'bujuk', + 'membujukkan': 'bujuk', + 'membujukku': 'bujuk', + 'membujukmu': 'bujuk', + 'membujuki': 'bujuk', + 'membujur': 'bujur', + 'membujurnya': 'bujur', + 'terbujur': 'bujur', + 'dibujurkan': 'bujur', + 'membujurkan': 'bujur', + 'mengebuk': 'buk', + 'pembuka': 'buka', + 'pembukanya': 'buka', + 'pembukaan': 'buka', + 'terbuka': 'buka', + 'terbukanya': 'buka', + 'terbukalah': 'buka', + 'terbukai': 'buka', + 'terbukaan': 'buka', + 'terbukamu': 'buka', + 'berbuka': 'buka', + 'berbukanya': 'buka', + 'berbukalah': 'buka', + 'berbukaan': 'buka', + 'membuka': 'buka', + 'membukanya': 'buka', + 'membukakan': 'buka', + 'membukakannya': 'buka', + 'membukaan': 'buka', + 'membukai': 'buka', + 'pembukaannya': 'buka', + 'pembukaanku': 'buka', + 'pembukaanmu': 'buka', + 'keterbukaan': 'buka', + 'keterbukaannya': 'buka', + 'keterbukaanlah': 'buka', + 'sebukan': 'bukan', + 'bukankah': 'bukan', + 'bukantah': 'bukan', + 'berbukan': 'bukan', + 'bukan-bukan': 'bukan', + 'membukankan': 'bukan', + 'terbuku': 'buku', + 'terbukukan': 'buku', + 'membuku': 'buku', + 'membukukan': 'buku', + 'membukukannya': 'buku', + 'membukuan': 'buku', + 'berbuku': 'buku', + 'pembukuan': 'buku', + 'pembukuannya': 'buku', + 'perbukuan': 'buku', + 'membukut': 'bukut', + 'pembukut': 'bukut', + 'bulakan': 'bulak', + 'membulang': 'bulang', + 'terbulang': 'bulang', + 'berbulang': 'bulang', + 'pembulang': 'bulang', + 'bulang-bulang': 'bulang', + 'bulatan': 'bulat', + 'bulatannya': 'bulat', + 'membulat': 'bulat', + 'membulatnya': 'bulat', + 'membulatkan': 'bulat', + 'membulatkannya': 'bulat', + 'membulati': 'bulat', + 'kebulatan': 'bulat', + 'kebulatannya': 'bulat', + 'pembulatan': 'bulat', + 'pembulatannya': 'bulat', + 'memperbulat': 'bulat', + 'membuldoser': 'buldoser', + 'pembuldoseran': 'buldoser', + 'pebulu tangkis': 'bulu tangkis', + 'perbulutangkisan': 'bulu tangkis', + 'pembuluh': 'buluh', + 'pembuluhnya': 'buluh', + 'pembuluhan': 'buluh', + 'berpembuluh': 'buluh', + 'buluh-buluh': 'buluh', + 'bulukan': 'buluk', + 'kebuluran': 'bulur', + 'berbumbu': 'bumbu', + 'membumbui': 'bumbu', + 'membumbuinya': 'bumbu', + 'membumbun': 'bumbun', + 'membumihanguskan': 'bumi hangus', + 'membumihanguskannya': 'bumi hangus', + 'membumi': 'bumi', + 'membuminya': 'bumi', + 'membumilah': 'bumi', + 'membumikan': 'bumi', + 'membumikannya': 'bumi', + 'mengebumikan': 'bumi', + 'mengebumikannya': 'bumi', + 'membumiratakan': 'bumi rata', + 'membuncah': 'buncah', + 'membuncahnya': 'buncah', + 'membuncahkan': 'buncah', + 'terbuncang': 'buncang', + 'buncitan': 'buncit', + 'membuncit': 'buncit', + 'membuncitnya': 'buncit', + 'membuncitkan': 'buncit', + 'membundak': 'bundak', + 'bundaran': 'bundar', + 'membundar': 'bundar', + 'membundarkan': 'bundar', + 'bundelan': 'bundel', + 'membundel': 'bundel', + 'membundelnya': 'bundel', + 'bungaran': 'bungar', + 'bungkalan': 'bungkal', + 'membungkam': 'bungkam', + 'membungkamnya': 'bungkam', + 'membungkamkan': 'bungkam', + 'membungkamkannya': 'bungkam', + 'membungkaman': 'bungkam', + 'membungkamku': 'bungkam', + 'pembungkam': 'bungkam', + 'pembungkamnya': 'bungkam', + 'pembungkaman': 'bungkam', + 'membungkuk': 'bungkuk', + 'membungkuknya': 'bungkuk', + 'membungkuklah': 'bungkuk', + 'membungkukkan': 'bungkuk', + 'membungkukan': 'bungkuk', + 'membungkuk-bungkuk': 'bungkuk', + 'membungkuk-bungkuklah': 'bungkuk', + 'terbungkuk-bungkuk': 'bungkuk', + 'membungkus': 'bungkus', + 'membungkusnya': 'bungkus', + 'membungkuskan': 'bungkus', + 'membungkusi': 'bungkus', + 'pembungkus': 'bungkus', + 'pembungkusnya': 'bungkus', + 'pembungkusan': 'bungkus', + 'terbuni': 'buni', + 'membunikan': 'buni', + 'berbuntang': 'buntang', + 'terbuntang': 'buntang', + 'membuntang': 'buntang', + 'membuntangkan': 'buntang', + 'buntilan': 'buntil', + 'buntingan': 'bunting', + 'membunting': 'bunting', + 'membuntingkan': 'bunting', + 'kebuntingan': 'bunting', + 'membuntingi': 'bunting', + 'kebuntuan': 'buntu', + 'kebuntuannya': 'buntu', + 'membuntukan': 'buntu', + 'kebuntungan': 'buntung', + 'membuntungkan': 'buntung', + 'berbuntut': 'buntut', + 'pembuntut': 'buntut', + 'pembuntutan': 'buntut', + 'membuntut': 'buntut', + 'membuntuti': 'buntut', + 'membuntutinya': 'buntut', + 'membuntutiku': 'buntut', + 'berbuntut-buntut': 'buntut', + 'membunuh': 'bunuh', + 'membunuhnya': 'bunuh', + 'membunuhkan': 'bunuh', + 'membunuhi': 'bunuh', + 'membunuhan': 'bunuh', + 'membunuhku': 'bunuh', + 'membunuhmu': 'bunuh', + 'pembunuh': 'bunuh', + 'pembunuhnya': 'bunuh', + 'pembunuhan': 'bunuh', + 'pembunuhku': 'bunuh', + 'pembunuhannya': 'bunuh', + 'pembunuhani': 'bunuh', + 'pembunuhanan': 'bunuh', + 'pembunuhanku': 'bunuh', + 'bersibunuh': 'bunuh', + 'bunuh-membunuh': 'bunuh', + 'berbunuh-bunuhan': 'bunuh', + 'membura': 'bura', + 'memburai': 'burai', + 'memburakan': 'bura', + 'terburai': 'burai', + 'berburai': 'burai', + 'memburaikan': 'burai', + 'pemburas': 'buras', + 'memburas': 'buras', + 'memburaskan': 'buras', + 'buritan': 'burit', + 'buritannya': 'burit', + 'memburit': 'burit', + 'buronan': 'buron', + 'buronannya': 'buron', + 'buronanan': 'buron', + 'buruhan': 'buruh', + 'memburuh': 'buruh', + 'memburuhkan': 'buruh', + 'perburuhan': 'buruh', + 'perburuhannya': 'buruh', + 'burukan': 'buruk', + 'memburuk': 'buruk', + 'memburuknya': 'buruk', + 'memburukkan': 'buruk', + 'perburuk': 'buruk', + 'perburukan': 'buruk', + 'berburuk': 'buruk', + 'keburukanku': 'buruk', + 'berburuk-buruk': 'buruk', + 'memburuk-burukkan': 'buruk', + 'burung-burungan': 'burung', + 'berbusana': 'busana', + 'berbusananya': 'busana', + 'berbusanalah': 'busana', + 'berbusanaku': 'busana', + 'membusuk': 'busuk', + 'membusuknya': 'busuk', + 'membusukkan': 'busuk', + 'membusukkannya': 'busuk', + 'membusuki': 'busuk', + 'membusukan': 'busuk', + 'pembusuk': 'busuk', + 'pembusukkan': 'busuk', + 'pembusukan': 'busuk', + 'kebusukan': 'busuk', + 'kebusukannya': 'busuk', + 'pembusukannya': 'busuk', + 'membusung': 'busung', + 'membusungkan': 'busung', + 'terbusung': 'busung', + 'dibusur': 'busur', + 'dibusurkan': 'busur', + 'membusur': 'busur', + 'busur-busur': 'busur', + 'membusut': 'busut', + 'membuta': 'buta', + 'membutanya': 'buta', + 'membutakan': 'buta', + 'membutakannya': 'buta', + 'kebutaan': 'buta', + 'kebutaannya': 'buta', + 'membutakanku': 'buta', + 'kebutuhan': 'butuh', + 'kebutuhannya': 'butuh', + 'kebutuhanlah': 'butuh', + 'kebutuhanan': 'butuh', + 'kebutuhanku': 'butuh', + 'kebutuhanmu': 'butuh', + 'membutuhi': 'butuh', + 'membutuhkan': 'butuh', + 'membutuhkannya': 'butuh', + 'membutuhkanlah': 'butuh', + 'membutuhkanku': 'butuh', + 'membutuhkanmu': 'butuh', + 'membutuhkan-mu': 'butuh', + 'butulan': 'butul', + 'membuyarkan': 'buyar', + 'membuyarkannya': 'buyar', + 'membuyur': 'buyur', + 'kecabaian': 'cabai', + 'kecabaran': 'cabar', + 'mencabarkan': 'cabar', + 'mencabau': 'cabau', + 'cabikan': 'cabik', + 'tercabik': 'cabik', + 'tercabiknya': 'cabik', + 'mencabik': 'cabik', + 'mencabiknya': 'cabik', + 'pencabikan': 'cabik', + 'mencabikkan': 'cabik', + 'cabik-cabik': 'cabik', + 'mencabik-cabik': 'cabik', + 'cabik-mencabik': 'cabik', + 'mencabik-cabikkan': 'cabik', + 'bercabiran': 'cabir', + 'cobar-cabir': 'cabir', + 'kecabuhan': 'cabuh', + 'mencabul': 'cabul', + 'mencabuli': 'cabul', + 'bercabul': 'cabul', + 'kecabulan': 'cabul', + 'kecabulannya': 'cabul', + 'mencabulinya': 'cabul', + 'pencabulan': 'cabul', + 'pencabulannya': 'cabul', + 'percabulan': 'cabul', + 'kecaburan': 'cabur', + 'cabutan': 'cabut', + 'cabutannya': 'cabut', + 'tercabut': 'cabut', + 'tercabutnya': 'cabut', + 'mencabut': 'cabut', + 'mencabutnya': 'cabut', + 'mencabutlah': 'cabut', + 'mencabutkan': 'cabut', + 'mencabutkannya': 'cabut', + 'mencabuti': 'cabut', + 'mencabutan': 'cabut', + 'bercabut': 'cabut', + 'pencabut': 'cabut', + 'pencabutnya': 'cabut', + 'pencabutan': 'cabut', + 'pencabutannya': 'cabut', + 'pencacah jiwa': 'cacah jiwa', + 'mencacah jiwa': 'cacah jiwa', + 'bercacah jiwa': 'cacah jiwa', + 'pencacahjiwaan': 'cacah jiwa', + 'pencacak': 'cacak', + 'mencacak': 'cacak', + 'tercacak': 'cacak', + 'mencacakkan': 'cacak', + 'mencacap': 'cacap', + 'mencacapi': 'cacap', + 'bercacar': 'cacar', + 'pencacar': 'cacar', + 'mencacar': 'cacar', + 'pencacaran': 'cacar', + 'cacatan': 'cacat', + 'cacatannya': 'cacat', + 'bercacat': 'cacat', + 'pencacat': 'cacat', + 'pencacatan': 'cacat', + 'tercacat': 'cacat', + 'tercacatkan': 'cacat', + 'mencacat': 'cacat', + 'mencacatkan': 'cacat', + 'mencacatkannya': 'cacat', + 'mencacati': 'cacat', + 'kecacatan': 'cacat', + 'kecacatannya': 'cacat', + 'pencacatannya': 'cacat', + 'mencacau': 'cacau', + 'pencacau': 'cacau', + 'cacian': 'caci', + 'caciannya': 'caci', + 'cacianlah': 'caci', + 'pencaci': 'caci', + 'pencacinya': 'caci', + 'mencaci': 'caci', + 'mencacinya': 'caci', + 'mencaciku': 'caci', + 'bercaci-cacian': 'caci', + 'mencaci maki': 'caci maki', + 'cacingan': 'cacing', + 'mencadai': 'cadai', + 'cadangan': 'cadang', + 'cadangannya': 'cadang', + 'cadanganlah': 'cadang', + 'cadangankan': 'cadang', + 'cadanganku': 'cadang', + 'pencadang': 'cadang', + 'pencadangan': 'cadang', + 'bercadang': 'cadang', + 'bercadangan': 'cadang', + 'pencadangannya': 'cadang', + 'pencadanganan': 'cadang', + 'mencadangkan': 'cadang', + 'mencadangkannya': 'cadang', + 'mencadangkanku': 'cadang', + 'bercadar': 'cadar', + 'bercadik': 'cadik', + 'mencaduk': 'caduk', + 'bercadung': 'cadung', + 'mencadung': 'cadung', + 'tercagak': 'cagak', + 'mencagak': 'cagak', + 'bercagak': 'cagak', + 'cagaran': 'cagar', + 'pencagaran': 'cagar', + 'mencagarkan': 'cagar', + 'mencagil': 'cagil', + 'mencagun': 'cagun', + 'mencagut': 'cagut', + 'pencahar': 'cahar', + 'pencaharnya': 'cahar', + 'mencahar': 'cahar', + 'mencahari': 'cahar', + 'pencaharian': 'cahari', + 'pencahariannya': 'cahari', + 'pencaharianku': 'cahari', + 'bercahaya': 'cahaya', + 'bercahayanya': 'cahaya', + 'bercahayakan': 'cahaya', + 'mencahayai': 'cahaya', + 'pencahayaan': 'cahaya', + 'pencahayaannya': 'cahaya', + 'mencahayakan': 'cahaya', + 'caing-caing': 'caing', + 'mencaing-caing': 'caing', + 'cairan': 'cair', + 'cairannya': 'cair', + 'cairanlah': 'cair', + 'mencair': 'cair', + 'mencairnya': 'cair', + 'mencairlah': 'cair', + 'mencairkan': 'cair', + 'mencairkannya': 'cair', + 'mencairan': 'cair', + 'cecairan': 'cair', + 'pencairan': 'cair', + 'pencairannya': 'cair', + 'mencakah': 'cakah', + 'pecakak': 'cakak', + 'bercakak': 'cakak', + 'mencakar': 'cakar', + 'mencakarnya': 'cakar', + 'mencakari': 'cakar', + 'mencakarku': 'cakar', + 'pencakar': 'cakar', + 'pencakarnya': 'cakar', + 'pencakaran': 'cakar', + 'bersicakar': 'cakar', + 'cakar-mencakar': 'cakar', + 'bercakar-cakaran': 'cakar', + 'bercakrawala': 'cakrawala', + 'cakupan': 'cakup', + 'cakupannya': 'cakup', + 'cakupanan': 'cakup', + 'pencakup': 'cakup', + 'pencakupan': 'cakup', + 'tercakup': 'cakup', + 'tercakupnya': 'cakup', + 'tercakupi': 'cakup', + 'mencakup': 'cakup', + 'mencakupnya': 'cakup', + 'mencakupkan': 'cakup', + 'mencakupi': 'cakup', + 'mencakupan': 'cakup', + 'cakup-mencakup': 'cakup', + 'mencakup-cakup': 'cakup', + 'mencakus': 'cakus', + 'mencalak': 'calak', + 'calak-calak': 'calak', + 'mencalang': 'calang', + 'pencalang': 'calang', + 'mencalit': 'calit', + 'bercalit': 'calit', + 'mencalitkan': 'calit', + 'percaloan': 'calo', + 'percaloannya': 'calo', + 'pencalonan': 'calon', + 'pencalonannya': 'calon', + 'pencalonanan': 'calon', + 'pencalonanku': 'calon', + 'mencalonkan': 'calon', + 'mencalonkannya': 'calon', + 'mencalonkanlah': 'calon', + 'mencamkan': 'cam', + 'kecamatan': 'camat', + 'kecamatannya': 'camat', + 'kecamatanan': 'camat', + 'bercambang': 'cambang', + 'mencambuk': 'cambuk', + 'mencambuknya': 'cambuk', + 'mencambukkan': 'cambuk', + 'mencambuki': 'cambuk', + 'mencambukku': 'cambuk', + 'mencambukmu': 'cambuk', + 'mencambukinya': 'cambuk', + 'pencambukan': 'cambuk', + 'camilan': 'camil', + 'camilannya': 'camil', + 'camilanmu': 'camil', + 'mencampak': 'campak', + 'mencampakkan': 'campak', + 'mencampakkannya': 'campak', + 'mencampakan': 'campak', + 'tercampak': 'campak', + 'tercampakkan': 'campak', + 'tercampakan': 'campak', + 'mencampakkanku': 'campak', + 'mencampakkanmu': 'campak', + 'mencampang': 'campang', + 'secampin': 'campin', + 'campang-camping': 'camping', + 'bercamping-camping': 'camping', + 'mencampung': 'campung', + 'tercampung': 'campung', + 'kecampuradukan': 'campur aduk', + 'bercampur aduk': 'campur aduk', + 'pencampuradukan': 'campur aduk', + 'mencampuradukkan': 'campur aduk', + 'mencampuradukkannya': 'campur aduk', + 'bercampur baur': 'campur baur', + 'pencampurbauran': 'campur baur', + 'mencampurbaurkan': 'campur baur', + 'campuran': 'campur', + 'campurannya': 'campur', + 'bercampur': 'campur', + 'bercampurnya': 'campur', + 'bercampuran': 'campur', + 'tercampur': 'campur', + 'tercampurnya': 'campur', + 'tercampurlah': 'campur', + 'tercampurkan': 'campur', + 'tercampuri': 'campur', + 'mencampur': 'campur', + 'mencampurnya': 'campur', + 'mencampurkan': 'campur', + 'mencampurkannya': 'campur', + 'mencampuri': 'campur', + 'mencampurinya': 'campur', + 'percampuran': 'campur', + 'percampurannya': 'campur', + 'pencampuran': 'campur', + 'pencampurannya': 'campur', + 'bercamuk': 'camuk', + 'mencamuk': 'camuk', + 'mencamurkan': 'camur', + 'canaian': 'canai', + 'mencanai': 'canai', + 'pencanai': 'canai', + 'pencanaian': 'canai', + 'mencanak': 'canak', + 'pencanang': 'canang', + 'pencanangkan': 'canang', + 'pencanangan': 'canang', + 'tercanang': 'canang', + 'pencanangannya': 'canang', + 'pencananganan': 'canang', + 'mencanangkan': 'canang', + 'mencanangkannya': 'canang', + 'mencancang': 'cancang', + 'tercancang': 'cancang', + 'bercancut': 'cancut', + 'mencancutkan': 'cancut', + 'bercanda': 'canda', + 'bercandanya': 'canda', + 'bercandalah': 'canda', + 'bercandai': 'canda', + 'bercandaan': 'canda', + 'percandian': 'candi', + 'pencandraan': 'candra', + 'mencandrakan': 'candra', + 'pecandu': 'candu', + 'pecandunya': 'candu', + 'mencandu': 'candu', + 'pencandu': 'candu', + 'pencandunya': 'candu', + 'mencandui': 'candu', + 'kecanduan': 'candu', + 'kecanduannya': 'candu', + 'kecanduanku': 'candu', + 'percanduan': 'candu', + 'mencandukan': 'candu', + 'tercangah': 'cangah', + 'mencangah': 'cangah', + 'mencangak': 'cangak', + 'mencangakan': 'cangak', + 'tercangak-cangak': 'cangak', + 'mencangam': 'cangam', + 'bercangap': 'cangap', + 'mencangar': 'cangar', + 'mencangcang': 'cangcang', + 'kecanggihan': 'canggih', + 'kecanggihannya': 'canggih', + 'tercanggung': 'canggung', + 'kecanggungan': 'canggung', + 'kecanggungannya': 'canggung', + 'mencanggungkan': 'canggung', + 'mencangkel': 'cangkel', + 'tercangkel': 'cangkel', + 'mencangkelkan': 'cangkel', + 'cangkingan': 'cangking', + 'mencangking': 'cangking', + 'mencangklong': 'cangklong', + 'cangkolan': 'cangkol', + 'cangkulan': 'cangkul', + 'cangkulannya': 'cangkul', + 'mencangkul': 'cangkul', + 'mencangkuli': 'cangkul', + 'mencangkum': 'cangkum', + 'bercangkung': 'cangkung', + 'mencangkung': 'cangkung', + 'mencangkup': 'cangkup', + 'mencangkupi': 'cangkup', + 'mencanguk': 'canguk', + 'kecantasan': 'cantas', + 'cantelan': 'cantel', + 'cantelannya': 'cantel', + 'mencantelkan': 'cantel', + 'cantengan': 'canteng', + 'tercantik': 'cantik', + 'tercantiknya': 'cantik', + 'tercantiklah': 'cantik', + 'tercantikku': 'cantik', + 'kecantikan': 'cantik', + 'kecantikannya': 'cantik', + 'kecantikanku': 'cantik', + 'kecantikanmu': 'cantik', + 'pemercantik': 'cantik', + 'mencantikkan': 'cantik', + 'mempercantik': 'cantik', + 'mempercantiknya': 'cantik', + 'mempercantikan': 'cantik', + 'bercantik-cantik': 'cantik', + 'cantolan': 'cantol', + 'cantolannya': 'cantol', + 'kecantol': 'cantol', + 'tercantol': 'cantol', + 'mencantolkan': 'cantol', + 'bercap': 'cap', + 'bercapkan': 'cap', + 'mengecap': 'kecap', + 'mengecapnya': 'kecap', + 'mengecapkan': 'kecap', + 'mengecapi': 'kecap', + 'pengecapan': 'kecap', + 'pengecapannya': 'kecap', + 'capaian': 'capai', + 'capaiannya': 'capai', + 'tercapai': 'capai', + 'tercapainya': 'capai', + 'tercapailah': 'capai', + 'tercapaikan': 'capai', + 'tercapaian': 'capai', + 'pencapai': 'capai', + 'pencapainya': 'capai', + 'pencapaikan': 'capai', + 'pencapaian': 'capai', + 'mencapai': 'capai', + 'mencapainya': 'capai', + 'mencapaikan': 'capai', + 'mencapaii': 'capai', + 'mencapaian': 'capai', + 'kecapaian': 'capai', + 'pencapaiannya': 'capai', + 'pencapaianku': 'capai', + 'pencapaianmu': 'capai', + 'sepencapai': 'capai', + 'mencapak': 'capak', + 'mencapakkan': 'capak', + 'mencapaki': 'capak', + 'tercapak': 'capak', + 'mempercapak': 'capak', + 'mencapak-capak': 'capak', + 'pencaplok': 'caplok', + 'pencaplokan': 'caplok', + 'tercaplok': 'caplok', + 'tercaploknya': 'caplok', + 'mencaplok': 'caplok', + 'mencaploknya': 'caplok', + 'pencaplokannya': 'caplok', + 'secara': 'cara', + 'secaranya': 'cara', + 'secarai': 'cara', + 'mencarah': 'carah', + 'bercarah': 'carah', + 'mencarahkan': 'carah', + 'mencarak': 'carak', + 'pencarak': 'carak', + 'bercaran': 'caran', + 'mencarang': 'carang', + 'bercarang': 'carang', + 'carian': 'cari', + 'cariannya': 'cari', + 'mencari': 'cari', + 'mencarinya': 'cari', + 'mencarikan': 'cari', + 'mencarikannya': 'cari', + 'mencarii': 'cari', + 'mencarian': 'cari', + 'mencariku': 'cari', + 'mencarimu': 'cari', + 'tercari': 'cari', + 'pencari': 'cari', + 'pencarinya': 'cari', + 'pencarian': 'cari', + 'pencari-mu': 'cari', + 'bercari': 'cari', + 'pencariannya': 'cari', + 'pencarianlah': 'cari', + 'pencarianmu': 'cari', + 'mencarikanku': 'cari', + 'cari-carian': 'cari', + 'mencari-cari': 'cari', + 'mencari-carinya': 'cari', + 'mencari-carilah': 'cari', + 'bercari-cari': 'cari', + 'bercari-carian': 'cari', + 'carikan': 'carik', + 'carikanlah': 'carik', + 'secarik': 'carik', + 'mencarik': 'carik', + 'mencarik-carik': 'carik', + 'bercarik-carik': 'carik', + 'mencarik-carikkan': 'carik', + 'mencaring': 'caring', + 'carteran': 'carter', + 'pencarter': 'carter', + 'pencarteran': 'carter', + 'mencarter': 'carter', + 'mencaruk': 'caruk', + 'bercarut': 'carut', + 'pencarut': 'carut', + 'carut-marut': 'carut', + 'carut-marutnya': 'carut', + 'mempercaruti': 'carut', + 'mencarut-carut': 'carut', + 'bercarut-carut': 'carut', + 'mengecas': 'cas', + 'mengecasnya': 'cas', + 'mengecaskan': 'cas', + 'catatan': 'catat', + 'catatannya': 'catat', + 'catatanku': 'catat', + 'catatanmu': 'catat', + 'tercatat': 'catat', + 'tercatatnya': 'catat', + 'tercatatlah': 'catat', + 'tercatatkan': 'catat', + 'tercatatan': 'catat', + 'pencatat': 'catat', + 'pencatatnya': 'catat', + 'pencatatkan': 'catat', + 'pencatatan': 'catat', + 'mencatat': 'catat', + 'mencatatnya': 'catat', + 'mencatatkan': 'catat', + 'mencatatkannya': 'catat', + 'mencatati': 'catat', + 'mencatatan': 'catat', + 'mencatatmu': 'catat', + 'pencatatannya': 'catat', + 'mencatek': 'catek', + 'catuan': 'catu', + 'mencatu': 'catu', + 'pencatu': 'catu', + 'pencatuan': 'catu', + 'mencatuk': 'catuk', + 'tercatuk': 'catuk', + 'pecatur': 'catur', + 'pecaturnya': 'catur', + 'pecaturan': 'catur', + 'caturan': 'catur', + 'caturani': 'catur', + 'bercatur': 'catur', + 'percaturan': 'catur', + 'percaturannya': 'catur', + 'catutan': 'catut', + 'bercatut': 'catut', + 'mencatut': 'catut', + 'mencatutnya': 'catut', + 'mencatutkan': 'catut', + 'pencatut': 'catut', + 'pencatutnya': 'catut', + 'pencatutan': 'catut', + 'percatutan': 'catut', + 'bercawak': 'cawak', + 'bercawat': 'cawat', + 'mencawatkan': 'cawat', + 'cawi-cawi': 'cawi', + 'cebakan': 'cebak', + 'mencebak': 'cebak', + 'pencebak': 'cebak', + 'bercebak': 'cebak', + 'percebakan': 'cebak', + 'pencebakan': 'cebak', + 'mencebik': 'cebik', + 'mencebikkan': 'cebik', + 'mencebil': 'cebil', + 'mencebilkan': 'cebil', + 'secebir': 'cebir', + 'mencebir': 'cebir', + 'secebis': 'cebis', + 'bercebok': 'cebok', + 'menceboki': 'cebok', + 'mencebur': 'cebur', + 'menceburkan': 'cebur', + 'menceburkannya': 'cebur', + 'tercebur': 'cebur', + 'terceburnya': 'cebur', + 'cebar-cebur': 'cebur', + 'bercebar-cebur': 'cebur', + 'sececah': 'cecah', + 'tercecah': 'cecah', + 'bercecah': 'cecah', + 'mencecah': 'cecah', + 'mencecahkan': 'cecah', + 'mencecak': 'cecak', + 'pencecak': 'cecak', + 'mencecap': 'cecap', + 'mencecapnya': 'cecap', + 'mencecar': 'cecar', + 'mencecarnya': 'cecar', + 'mencecari': 'cecar', + 'mencecarmu': 'cecar', + 'tercedera': 'cedera', + 'tercederai': 'cedera', + 'mencedera': 'cedera', + 'mencederakan': 'cedera', + 'mencederai': 'cedera', + 'bercedera': 'cedera', + 'kecederaan': 'cedera', + 'kecederaannya': 'cedera', + 'mencederainya': 'cedera', + 'mencederaiku': 'cedera', + 'percederaan': 'cedera', + 'pencederaan': 'cedera', + 'mencedok': 'cedok', + 'pencedok': 'cedok', + 'tercegah': 'cegah', + 'tercegahnya': 'cegah', + 'mencegah': 'cegah', + 'mencegahnya': 'cegah', + 'mencegahlah': 'cegah', + 'mencegahkan': 'cegah', + 'mencegahan': 'cegah', + 'mencegahku': 'cegah', + 'mencegahmu': 'cegah', + 'pencegah': 'cegah', + 'pencegahnya': 'cegah', + 'pencegahan': 'cegah', + 'pencegahannya': 'cegah', + 'pencegahanlah': 'cegah', + 'pencegahanan': 'cegah', + 'mencegat': 'cegat', + 'mencegatnya': 'cegat', + 'mencegatku': 'cegat', + 'mencegatmu': 'cegat', + 'pencegatan': 'cegat', + 'pencegatannya': 'cegat', + 'cegukan': 'ceguk', + 'cegukannya': 'ceguk', + 'pengecek': 'kecek', + 'pengeceknya': 'kecek', + 'pengecekkan': 'kecek', + 'pengecekan': 'kecek', + 'mengecek': 'kecek', + 'mengeceknya': 'kecek', + 'mengecekkan': 'kecek', + 'mengeceki': 'kecek', + 'mengecekan': 'kecek', + 'pengecekannya': 'cek', + 'bercekah': 'cekah', + 'mencekah': 'cekah', + 'bercekak': 'cekak', + 'mencekak': 'cekak', + 'mencekakkan': 'cekak', + 'mempercekakkan': 'cekak', + 'bercekakakan': 'cekakak', + 'cekakak cekikik': 'cekakak', + 'bercekakak cekikik': 'cekakak', + 'cekalan': 'cekal', + 'mencekal': 'cekal', + 'mencekalnya': 'cekal', + 'pencekalan': 'cekal', + 'pencekalannya': 'cekal', + 'mencekalkan': 'cekal', + 'cekaman': 'cekam', + 'tercekam': 'cekam', + 'mencekam': 'cekam', + 'mencekamnya': 'cekam', + 'mencekamkan': 'cekam', + 'mencekamku': 'cekam', + 'cekatan': 'cekat', + 'cekatannya': 'cekat', + 'kecekatan': 'cekat', + 'kecekatannya': 'cekat', + 'mencekau': 'cekau', + 'bercekcok': 'cekcok', + 'mencekcoki': 'cekcok', + 'percekcokan': 'cekcok', + 'percekcokannya': 'cekcok', + 'mempercekcokkan': 'cekcok', + 'menceker': 'ceker', + 'mencekih': 'cekih', + 'tercekih': 'cekih', + 'cekikan': 'cekik', + 'cekikannya': 'cekik', + 'pencekik': 'cekik', + 'pencekikan': 'cekik', + 'tercekik': 'cekik', + 'tercekiklah': 'cekik', + 'bercekik': 'cekik', + 'mencekik': 'cekik', + 'mencekiknya': 'cekik', + 'mencekikku': 'cekik', + 'mencekikmu': 'cekik', + 'mempercekikkan': 'cekik', + 'cekikikan': 'cekikik', + 'bercekikikan': 'cekikik', + 'bercekit': 'cekit', + 'mencekit': 'cekit', + 'tercekluk': 'cekluk', + 'cekokan': 'cekok', + 'mencekok': 'cekok', + 'mencekokkan': 'cekok', + 'mencekoki': 'cekok', + 'mencekokinya': 'cekok', + 'menceku': 'ceku', + 'mencekukan': 'ceku', + 'mencekuh': 'cekuh', + 'kecekungan': 'cekung', + 'mencekup': 'cekup', + 'mencekut': 'cekut', + 'celaan': 'cela', + 'celaannya': 'cela', + 'bercela': 'cela', + 'tercela': 'cela', + 'tercelanya': 'cela', + 'tercelalah': 'cela', + 'pencela': 'cela', + 'pencelanya': 'cela', + 'pencelaan': 'cela', + 'mencela': 'cela', + 'mencelanya': 'cela', + 'mencelakan': 'celak', + 'kecelaan': 'cela', + 'bercelah': 'celah', + 'mencelak': 'celak', + 'bercelak': 'celak', + 'mencelaki': 'celak', + 'mencelakai': 'celaka', + 'mencelakainya': 'celaka', + 'mencelakaimu': 'celaka', + 'kecelakaan': 'celaka', + 'kecelakaannya': 'celaka', + 'kecelakaankan': 'celaka', + 'mencelakakan': 'celaka', + 'mencelakakannya': 'celaka', + 'tercelampak': 'celampak', + 'mencelampakkan': 'celampak', + 'bercelana': 'celana', + 'mencelang': 'celang', + 'mencelangakkan': 'celangak', + 'tercelapak': 'celapak', + 'mencelapaki': 'celapak', + 'mencelat': 'celat', + 'mencelatnya': 'celat', + 'mencelatlah': 'celat', + 'bercelatuk': 'celatuk', + 'celengan': 'celeng', + 'celengannya': 'celeng', + 'celenganku': 'celeng', + 'celenganmu': 'celeng', + 'mencelengi': 'celeng', + 'tercelentang': 'celentang', + 'mencelep': 'celep', + 'menceletuk': 'celetuk', + 'menceletukkan': 'celetuk', + 'mencelikkan': 'celik', + 'celingukan': 'celinguk', + 'celingak-celinguk': 'celinguk', + 'mencelis': 'celis', + 'tercelomok': 'celomok', + 'menceluk': 'celuk', + 'mencelung': 'celung', + 'mencelungkan': 'celung', + 'celung-celung': 'celung', + 'mencelup': 'celup', + 'mencelupnya': 'celup', + 'mencelupkan': 'celup', + 'mencelupkannya': 'celup', + 'pencelup': 'celup', + 'pencelupan': 'celup', + 'celuran': 'celur', + 'bercelur': 'celur', + 'mencelur': 'celur', + 'penceluran': 'celur', + 'mencelus': 'celus', + 'tercelus': 'celus', + 'celas-celus': 'celus', + 'mencema': 'cema', + 'mencemakan': 'cema', + 'tercema': 'cema', + 'cemaran': 'cemar', + 'cemarannya': 'cemar', + 'pencemar': 'cemar', + 'pencemarnya': 'cemar', + 'pencemari': 'cemar', + 'pencemaran': 'cemar', + 'tercemar': 'cemar', + 'tercemarnya': 'cemar', + 'tercemarkan': 'cemar', + 'tercemari': 'cemar', + 'bercemar': 'cemar', + 'kecemaran': 'cemar', + 'mencemari': 'cemar', + 'mencemarinya': 'cemar', + 'pencemarannya': 'cemar', + 'pencemaranan': 'cemar', + 'mencemarkan': 'cemar', + 'mencemarkannya': 'cemar', + 'pencemas': 'cemas', + 'tercemas': 'cemas', + 'bercemas': 'cemas', + 'kecemasan': 'cemas', + 'kecemasannya': 'cemas', + 'kecemasanku': 'cemas', + 'kecemasanmu': 'cemas', + 'mencemaskan': 'cemas', + 'mencemaskannya': 'cemas', + 'mencemaskanku': 'cemas', + 'cemas-cemas': 'cemas', + 'mencemat': 'cemat', + 'mencemati': 'cemat', + 'cemburuan': 'cemburu', + 'cemburuannya': 'cemburu', + 'bercemburu': 'cemburu', + 'kecemburuan': 'cemburu', + 'kecemburuannya': 'cemburu', + 'kecemburuanku': 'cemburu', + 'mencemburui': 'cemburu', + 'mencemburuinya': 'cemburu', + 'bercemburuan': 'cemburu', + 'mencemburukan': 'cemburu', + 'pencemeeh': 'cemeeh', + 'mencemeehkan': 'cemeeh', + 'kecemerlangan': 'cemerlang', + 'kecemerlangannya': 'cemerlang', + 'kecemerlanganmu': 'cemerlang', + 'mencemerlangkan': 'cemerlang', + 'mencemeti': 'cemeti', + 'bercemetuk': 'cemetuk', + 'cemoohan': 'cemooh', + 'cemoohannya': 'cemooh', + 'mencemooh': 'cemooh', + 'mencemoohnya': 'cemooh', + 'mencemoohkan': 'cemooh', + 'mencemoohkannya': 'cemooh', + 'mencemoohan': 'cemooh', + 'mencemoohku': 'cemooh', + 'bercempera': 'cempera', + 'tercemplung': 'cemplung', + 'mencemplung': 'cemplung', + 'mencemplungkan': 'cemplung', + 'mencemplungkannya': 'cemplung', + 'pencemplungan': 'cemplung', + 'mencempung': 'cempung', + 'mencempungi': 'cempung', + 'mencempungkan': 'cempung', + 'mencemuk': 'cemuk', + 'kecenaan': 'cena', + 'cencangan': 'cencang', + 'bercencang': 'cencang', + 'mencencang': 'cencang', + 'cencang latih': 'cencang', + 'kecendekiaan': 'cendekia', + 'pencendekiaan': 'cendekia', + 'mencendekiakan': 'cendekia', + 'kecendekiawanan': 'cendekiawan', + 'kecendekiawanannya': 'cendekiawan', + 'kecenderungan': 'cenderung', + 'kecenderungannya': 'cenderung', + 'kecenderunganlah': 'cenderung', + 'kecenderunganku': 'cenderung', + 'berkecenderungan': 'cenderung', + 'bercenduai': 'cenduai', + 'mencengam': 'cengam', + 'tercengang': 'cengang', + 'tercengangnya': 'cengang', + 'bersicengang': 'cengang', + 'bercengangan': 'cengang', + 'mencengangkan': 'cengang', + 'mencengangkannya': 'cengang', + 'tercengang-cengang': 'cengang', + 'mencengap': 'cengap', + 'mencengis-cengis': 'cengis-cengis', + 'cengkaman': 'cengkam', + 'mencengkam': 'cengkam', + 'mencengkamkan': 'cengkam', + 'mencengkelong': 'cengkelong', + 'cengkeraman': 'cengkeram', + 'cengkeramannya': 'cengkeram', + 'mencengkeram': 'cengkeram', + 'mencengkeramnya': 'cengkeram', + 'mencengkeramkan': 'cengkeram', + 'bercengkih': 'cengkih', + 'percengkihan': 'cengkih', + 'bercengkung': 'cengkung', + 'tercengung': 'cengung', + 'mencengut': 'cengut', + 'tercengut': 'cengut', + 'mencentang': 'centang', + 'centang-perenang': 'centang', + 'kecentang-perenangan': 'centang', + 'kecentilan': 'centil', + 'mencentong': 'centong', + 'tercenung': 'cenung', + 'mencepak-cepak': 'cepak', + 'cepalan': 'cepal', + 'secepat': 'cepat', + 'secepatnya': 'cepat', + 'secepatlah': 'cepat', + 'secepatkan': 'cepat', + 'secepatnyalah': 'cepat', + 'mencepat': 'cepat', + 'kecepatan': 'cepat', + 'kecepatannya': 'cepat', + 'kecepatanlah': 'cepat', + 'kecepatanan': 'cepat', + 'kecepatanku': 'cepat', + 'bersecepat': 'cepat', + 'percepatan': 'cepat', + 'percepatannya': 'cepat', + 'percepatanlah': 'cepat', + 'bersicepat': 'cepat', + 'pencepatan': 'cepat', + 'pemercepat': 'cepat', + 'pemercepatan': 'cepat', + 'mencepatkan': 'cepat', + 'mempercepat': 'cepat', + 'mempercepatnya': 'cepat', + 'mempercepatlah': 'cepat', + 'mempercepatan': 'cepat', + 'cepat-cepat': 'cepat', + 'cepat-cepatlah': 'cepat', + 'cepat-cepatkan': 'cepat', + 'cepat-cepatan': 'cepat', + 'berkecepatan': 'cepat', + 'berkecepatanan': 'cepat', + 'bercepat-cepat': 'cepat', + 'keceplosan': 'ceplos', + 'keceplosannya': 'ceplos', + 'menceploskan': 'ceplos', + 'menceploskannya': 'ceplos', + 'mencepol': 'cepol', + 'mencepuk': 'cepuk', + 'mencepuk-cepuk': 'cepuk', + 'mencerabih': 'cerabih', + 'tercerabut': 'cerabut', + 'tercerabutnya': 'cerabut', + 'menceracam': 'ceracam', + 'penceracau': 'ceracau', + 'menceracau': 'ceracau', + 'kecerahan': 'cerah', + 'kecerahannya': 'cerah', + 'pencerahan': 'cerah', + 'pencerahannya': 'cerah', + 'pencerahanlah': 'cerah', + 'pencerahanan': 'cerah', + 'mencerahkan': 'cerah', + 'mencerahkannya': 'cerah', + 'bercerai-berai': 'cerai-berai', + 'mencerai-beraikan': 'cerai-berai', + 'bercerak': 'cerak', + 'bercerancangan': 'cerancang', + 'cerapan': 'cerap', + 'mencerap': 'cerap', + 'tercerap': 'cerap', + 'pencerapan': 'cerap', + 'ceratan': 'cerat', + 'mencerat': 'cerat', + 'mencerati': 'cerat', + 'mencerataikan': 'ceratai', + 'berceratuk': 'ceratuk', + 'menceratuk': 'ceratuk', + 'berceratukan': 'ceratuk', + 'cercaan': 'cerca', + 'cercaannya': 'cerca', + 'mencerca': 'cerca', + 'mencercanya': 'cerca', + 'mencercaku': 'cerca', + 'mencercai': 'cerca', + 'cercahan': 'cercah', + 'secercah': 'cercah', + 'mencercah': 'cercah', + 'mencercap': 'cercap', + 'kecerdasan': 'cerdas', + 'kecerdasannya': 'cerdas', + 'kecerdasanlah': 'cerdas', + 'kecerdasanan': 'cerdas', + 'kecerdasanmu': 'cerdas', + 'pencerdasan': 'cerdas', + 'mencerdaskan': 'cerdas', + 'mencerdaskannya': 'cerdas', + 'kecerdikan': 'cerdik', + 'kecerdikannya': 'cerdik', + 'kecerewetan': 'cerewet', + 'kecerewetannya': 'cerewet', + 'mencereweti': 'cerewet', + 'mencerewetinya': 'cerewet', + 'kecergasan': 'cergas', + 'keceriaan': 'ceria', + 'keceriaannya': 'ceria', + 'keceriaanmu': 'ceria', + 'penceriaan': 'ceria', + 'menceriakan': 'ceria', + 'bercericau': 'cericau', + 'mencerkau': 'cerkau', + 'mencerlang': 'cerlang', + 'kecerlangan': 'cerlang', + 'kecerlangannya': 'cerlang', + 'mencerling': 'cerling', + 'kecermatan': 'cermat', + 'kecermatannya': 'cermat', + 'mencermati': 'cermat', + 'mencermatinya': 'cermat', + 'mencermatkan': 'cermat', + 'cerminan': 'cermin', + 'cerminannya': 'cermin', + 'cerminanan': 'cermin', + 'cerminanku': 'cermin', + 'becermin': 'cermin', + 'tercermin': 'cermin', + 'tercerminnya': 'cermin', + 'tercerminkan': 'cermin', + 'bercermin': 'cermin', + 'bercerminlah': 'cermin', + 'mencermini': 'cermin', + 'mencerminkan': 'cermin', + 'mencerminkannya': 'cermin', + 'mempercermin': 'cermin', + 'tecerna': 'cerna', + 'mencerna': 'cerna', + 'mencernanya': 'cerna', + 'mencernakan': 'cerna', + 'mencernaan': 'cerna', + 'pencernaan': 'cerna', + 'pencernaannya': 'cerna', + 'pencernaanku': 'cerna', + 'menceroboh': 'ceroboh', + 'mencerobohi': 'ceroboh', + 'kecerobohan': 'ceroboh', + 'kecerobohannya': 'ceroboh', + 'kecerobohanlah': 'ceroboh', + 'mencerocos': 'cerocos', + 'berceroteh': 'ceroteh', + 'mencerowok': 'cerowok', + 'mencerucup': 'cerucup', + 'menceruh': 'ceruh', + 'menceruk': 'ceruk', + 'ceruk-meruk': 'ceruk', + 'ceruk-menceruk': 'ceruk', + 'mencerup': 'cerup', + 'mencerut': 'cerut', + 'mencetai-cetai': 'cetai', + 'bercetai-cetai': 'cetai', + 'cetakan': 'cetak', + 'cetakannya': 'cetak', + 'bercetak': 'cetak', + 'bercetakan': 'cetak', + 'mencetak': 'cetak', + 'mencetaknya': 'cetak', + 'mencetakkan': 'cetak', + 'mencetakkannya': 'cetak', + 'mencetaki': 'cetak', + 'mencetakan': 'cetak', + 'pencetak': 'cetak', + 'pencetaknya': 'cetak', + 'pencetakkan': 'cetak', + 'pencetakkannya': 'cetak', + 'pencetakan': 'cetak', + 'pencetakannya': 'cetak', + 'percetakan': 'cetak', + 'percetakannya': 'cetak', + 'percetakanmu': 'cetak', + 'cetak-mencetak': 'cetak', + 'cetar-ceter': 'cetar', + 'menceteng': 'ceteng', + 'menceti': 'ceti', + 'mencetikan': 'ceti', + 'cetusan': 'cetus', + 'cetusannya': 'cetus', + 'mencetus': 'cetus', + 'mencetusnya': 'cetus', + 'mencetuskan': 'cetus', + 'mencetuskannya': 'cetus', + 'tercetus': 'cetus', + 'tercetusnya': 'cetus', + 'tercetuslah': 'cetus', + 'tercetuskan': 'cetus', + 'pencetus': 'cetus', + 'pencetusnya': 'cetus', + 'pencetusan': 'cetus', + 'menciak': 'ciak', + 'menciak-ciak': 'ciak', + 'seciap': 'ciap', + 'menciap-ciap': 'ciap', + 'berciap-ciap': 'ciap', + 'menciar-ciar': 'ciar', + 'mencibir': 'cibir', + 'mencibirnya': 'cibir', + 'mencibirkan': 'cibir', + 'mencibirku': 'cibir', + 'mencibit': 'cibit', + 'mencicik': 'cicik', + 'cicilan': 'cicil', + 'cicilannya': 'cicil', + 'cicilanlah': 'cicil', + 'cicilanmu': 'cicil', + 'mencicil': 'cicil', + 'mencicilnya': 'cicil', + 'pencicilan': 'cicil', + 'pencicilannya': 'cicil', + 'mencicip': 'cicip', + 'mencicipnya': 'cicip', + 'mencicipi': 'cicip', + 'mencicipinya': 'cicip', + 'mencicit': 'cicit', + 'mencicitkan': 'cicit', + 'cidukan': 'ciduk', + 'menciduk': 'ciduk', + 'menciduknya': 'ciduk', + 'menciduki': 'ciduk', + 'mencidukku': 'ciduk', + 'terciduk': 'ciduk', + 'bercikun-cikun': 'cikun', + 'cikutan': 'cikut', + 'tercilap-cilap': 'cilap', + 'mencilok': 'cilok', + 'pencilok': 'cilok', + 'mencina': 'cina', + 'mencinai': 'cina', + 'mencincang': 'cincang', + 'mencincangnya': 'cincang', + 'cingak-cinguk': 'cingak', + 'tercingangah': 'cingangah', + 'menciplak': 'ciplak', + 'cipratan': 'ciprat', + 'cipratannya': 'ciprat', + 'menciprat': 'ciprat', + 'mencipratkan': 'ciprat', + 'menciprati': 'ciprat', + 'terciprat': 'ciprat', + 'kecipratan': 'ciprat', + 'kecipratannya': 'ciprat', + 'ciptaan': 'cipta', + 'ciptaannya': 'cipta', + 'ciptaanku': 'cipta', + 'ciptaanmu': 'cipta', + 'ciptaan-ku': 'cipta', + 'ciptaan-mu': 'cipta', + 'tercipta': 'cipta', + 'terciptanya': 'cipta', + 'terciptalah': 'cipta', + 'terciptakan': 'cipta', + 'mencipta': 'cipta', + 'menciptanya': 'cipta', + 'menciptakan': 'cipta', + 'menciptakannya': 'cipta', + 'menciptai': 'cipta', + 'menciptaan': 'cipta', + 'pencipta': 'cipta', + 'penciptanya': 'cipta', + 'penciptakan': 'cipta', + 'penciptaan': 'cipta', + 'penciptaku': 'cipta', + 'penciptamu': 'cipta', + 'penciptaannya': 'cipta', + 'menciptakanku': 'cipta', + 'berciri': 'ciri', + 'bercirikan': 'ciri', + 'pencirian': 'ciri', + 'mencirikan': 'ciri', + 'mencirikannya': 'ciri', + 'mencirit': 'cirit', + 'tercirit': 'cirit', + 'menciritkan': 'cirit', + 'cirit-birit': 'cirit', + 'mencita': 'cita', + 'mencitakan': 'cita', + 'mencitakannya': 'cita', + 'mencitai': 'cita', + 'cita-cita': 'cita', + 'cita-citanya': 'cita', + 'cita-citalah': 'cita', + 'cita-citakan': 'cita', + 'cita-citaku': 'cita', + 'cita-citamu': 'cita', + 'cita-cita-mu': 'cita', + 'bercita-cita': 'cita', + 'bercita-citanya': 'cita', + 'bercita-citalah': 'cita', + 'mencita-citakan': 'cita', + 'mencita-citakannya': 'cita', + 'citraan': 'citra', + 'mencitrakan': 'citra', + 'mencitrakannya': 'citra', + 'ciuman': 'cium', + 'ciumannya': 'cium', + 'ciumanku': 'cium', + 'ciumanmu': 'cium', + 'pencium': 'cium', + 'penciumnya': 'cium', + 'penciuman': 'cium', + 'mencium': 'cium', + 'menciumnya': 'cium', + 'menciumkan': 'cium', + 'menciumi': 'cium', + 'menciumku': 'cium', + 'menciummu': 'cium', + 'tercium': 'cium', + 'terciumnya': 'cium', + 'terciumlah': 'cium', + 'menciuminya': 'cium', + 'menciumimu': 'cium', + 'berciuman': 'cium', + 'berciumannya': 'cium', + 'berciumanlah': 'cium', + 'penciumannya': 'cium', + 'penciumanan': 'cium', + 'penciumanku': 'cium', + 'mencium-cium': 'cium', + 'mencium-ciumi': 'cium', + 'menciut': 'ciut', + 'menciutnya': 'ciut', + 'menciutkan': 'ciut', + 'menciutkannya': 'ciut', + 'penciutan': 'ciut', + 'berciut-ciut': 'ciut', + 'menciut-ciut': 'ciut', + 'mencoaki': 'coak', + 'mencoang': 'coang', + 'tercoang': 'coang', + 'bercoang': 'coang', + 'bercoangan': 'coang', + 'mencoangkan': 'coang', + 'mencoang-coang': 'coang', + 'cobaan': 'coba', + 'cobaannya': 'coba', + 'cobaan-mu': 'coba', + 'mencoba': 'coba', + 'mencobanya': 'coba', + 'mencobalah': 'coba', + 'mencobakan': 'coba', + 'mencobai': 'coba', + 'percobaan': 'coba', + 'percobaannya': 'coba', + 'percobaanlah': 'coba', + 'pencobaan': 'coba', + 'pencobaannya': 'coba', + 'mencoba-coba': 'coba', + 'mencoba-cobanya': 'coba', + 'pencoblos': 'coblos', + 'pencoblosnya': 'coblos', + 'pencoblosan': 'coblos', + 'mencoblos': 'coblos', + 'mencoblosnya': 'coblos', + 'mencobloskan': 'coblos', + 'mencoblosi': 'coblos', + 'mencoblosan': 'coblos', + 'pencoblosannya': 'coblos', + 'mencocok': 'cocok', + 'mencocokkan': 'cocok', + 'mencocokkannya': 'cocok', + 'mencocoki': 'cocok', + 'mencocokan': 'cocok', + 'tercocok': 'cocok', + 'kecocokan': 'cocok', + 'kecocokannya': 'cocok', + 'pencocokan': 'cocok', + 'pencocokannya': 'cocok', + 'mencocok-cocok': 'cocok', + 'mencocok-cocokkan': 'cocok', + 'mencocok-cocokan': 'cocok', + 'bercocok tanam': 'cocok tanam', + 'mencocol': 'cocol', + 'mencocolnya': 'cocol', + 'mencocolkan': 'cocol', + 'mencocor': 'cocor', + 'mencocornya': 'cocor', + 'mencocorkan': 'cocor', + 'mencocorkannya': 'cocor', + 'mencodak': 'codak', + 'mencodakkan': 'codak', + 'tercogok': 'cogok', + 'mencogok': 'cogok', + 'cokekan': 'cokek', + 'mencokek': 'cokek', + 'kecokelatan': 'cokelat', + 'kecokelatannya': 'cokelat', + 'kecokelat-cokelatan': 'cokelat', + 'mencoket': 'coket', + 'mencokok': 'cokok', + 'mencokoknya': 'cokok', + 'mencokoki': 'cokok', + 'bercokol': 'cokol', + 'bercokolnya': 'cokol', + 'mencokolkan': 'cokol', + 'colak caling': 'colak', + 'secolek': 'colek', + 'colekan': 'colek', + 'mencolek': 'colek', + 'mencoleknya': 'colek', + 'mencolekkan': 'colek', + 'pencolek': 'colek', + 'pencolekan': 'colek', + 'mencolek-colek': 'colek', + 'mencoleng': 'coleng', + 'pencoleng': 'coleng', + 'pencolengnya': 'coleng', + 'pencolengan': 'coleng', + 'mencolok': 'colok', + 'mencoloknya': 'colok', + 'mencolokkan': 'colok', + 'mencolokkannya': 'colok', + 'mencolokan': 'colok', + 'tercolok': 'colok', + 'mencoloki': 'colok', + 'mencolong': 'colong', + 'kecolongan': 'colong', + 'kecolongannya': 'colong', + 'kecolonganlah': 'colong', + 'mencolot': 'colot', + 'comelan': 'comel', + 'mencomel': 'comel', + 'pencomel': 'comel', + 'mencomeli': 'comel', + 'pencomelan': 'comel', + 'comotan': 'comot', + 'mencomot': 'comot', + 'mencomotnya': 'comot', + 'mencomoti': 'comot', + 'comot-comot': 'comot', + 'bercompang-camping': 'compang-camping', + 'menconcong': 'concong', + 'tercondong': 'condong', + 'kecondongan': 'condong', + 'kecondongannya': 'condong', + 'mencondongkan': 'condong', + 'berkecondongan': 'condong', + 'condong-mondong': 'condong', + 'menconet': 'conet', + 'mencongak': 'congak', + 'mencongakkan': 'congak', + 'congak-cangit': 'congak', + 'tercongget-congget': 'congget', + 'terconggok': 'conggok', + 'menconggokkan': 'conggok', + 'kecongkakan': 'congkak', + 'mencongklang': 'congklang', + 'mencongkong': 'congkong', + 'mencongok': 'congok', + 'mencongol': 'congol', + 'menconteng': 'conteng', + 'terconteng': 'conteng', + 'mencontengkan': 'conteng', + 'berconteng-conteng': 'conteng', + 'menconteng-conteng': 'conteng', + 'percontoh': 'contoh', + 'percontohan': 'contoh', + 'mencontoh': 'contoh', + 'mencontohnya': 'contoh', + 'mencontohkan': 'contoh', + 'mencontohkannya': 'contoh', + 'mencontohi': 'contoh', + 'mencontohan': 'contoh', + 'pemercontoh': 'contoh', + 'percontohannya': 'contoh', + 'pemercontohan': 'contoh', + 'mempercontohkan': 'contoh', + 'mencopet': 'copet', + 'pencopet': 'copet', + 'pencopetnya': 'copet', + 'pencopetan': 'copet', + 'kecopetan': 'copet', + 'kecopetannya': 'copet', + 'pencopetannya': 'copet', + 'mencopot': 'copot', + 'mencopotnya': 'copot', + 'mencopotkan': 'copot', + 'mencopoti': 'copot', + 'mencopotinya': 'copot', + 'pencopotan': 'copot', + 'pencopotannya': 'copot', + 'pencopotanlah': 'copot', + 'coran': 'cor', + 'corannya': 'cor', + 'mengecor': 'cor', + 'mengecornya': 'cor', + 'pengecoran': 'cor', + 'pengecorannya': 'cor', + 'mencorek': 'corek', + 'mencorekan': 'corek', + 'coretan': 'coret', + 'coretannya': 'coret', + 'mencoret': 'coret', + 'mencoretnya': 'coret', + 'mencoretkan': 'coret', + 'mencoreti': 'coret', + 'mencoretinya': 'coret', + 'pencoretan': 'coret', + 'pencoretannya': 'coret', + 'coret-coret': 'coret', + 'coret-coretnya': 'coret', + 'coret-coretan': 'coret', + 'mencorong': 'corong', + 'mencorongkan': 'corong', + 'mencorotkan': 'corot', + 'mencotok': 'cotok', + 'mencuaikan': 'cuai', + 'cuang-caing': 'cuang', + 'bercuang-caing': 'cuang', + 'tercuar': 'cuar', + 'mencuar': 'cuar', + 'mencuarkan': 'cuar', + 'cuatan': 'cuat', + 'mencuat': 'cuat', + 'mencuatnya': 'cuat', + 'mencuatlah': 'cuat', + 'mencuatkan': 'cuat', + 'bercuatan': 'cuat', + 'cubitan': 'cubit', + 'cubitannya': 'cubit', + 'secubit': 'cubit', + 'mencubit': 'cubit', + 'mencubitnya': 'cubit', + 'mencubiti': 'cubit', + 'mencubitku': 'cubit', + 'mencubit-cubit': 'cubit', + 'cubung-cubung': 'cubung', + 'mencuca': 'cuca', + 'tercuci': 'cuci', + 'mencuci': 'cuci', + 'mencucinya': 'cuci', + 'mencucilah': 'cuci', + 'mencucikan': 'cuci', + 'mencucikannya': 'cuci', + 'mencucian': 'cuci', + 'pencuci': 'cuci', + 'pencucinya': 'cuci', + 'pencucian': 'cuci', + 'pencuciannya': 'cuci', + 'bercucu': 'cucu', + 'mencucuh': 'cucuh', + 'mencucuh-cucuh': 'cucuh', + 'mencucuh-cucuhkan': 'cucuh', + 'mencucup': 'cucup', + 'mencucut': 'cucut', + 'mencugatkan': 'cugat', + 'mencuik': 'cuik', + 'secuil': 'cuil', + 'secuilnya': 'cuil', + 'mencuil': 'cuil', + 'mencuili': 'cuil', + 'mencuit': 'cuit', + 'mencuitnya': 'cuit', + 'mencuitkan': 'cuit', + 'mencuitkannya': 'cuit', + 'bercuit-cuit': 'cuit', + 'bercukai': 'cukai', + 'mencukai': 'cukai', + 'bercuki': 'cuki', + 'cukilan': 'cukil', + 'cukilannya': 'cukil', + 'mencukil': 'cukil', + 'mencukilnya': 'cukil', + 'mencukongi': 'cukong', + 'percukongan': 'cukong', + 'secukup': 'cukup', + 'secukupnya': 'cukup', + 'cukupan': 'cukup', + 'kecukupan': 'cukup', + 'kecukupannya': 'cukup', + 'mencukupi': 'cukup', + 'mencukupinya': 'cukup', + 'mencukupimu': 'cukup', + 'mencukupkan': 'cukup', + 'mencukupkannya': 'cukup', + 'berkecukupan': 'cukup', + 'menculak': 'culak', + 'keculasan': 'culas', + 'penculik': 'culik', + 'penculiknya': 'culik', + 'penculikkan': 'culik', + 'penculikan': 'culik', + 'penculikku': 'culik', + 'menculik': 'culik', + 'menculiknya': 'culik', + 'menculiki': 'culik', + 'menculikan': 'culik', + 'menculikmu': 'culik', + 'penculikannya': 'culik', + 'culik-culik': 'culik', + 'percuma': 'cuma', + 'percumanya': 'cuma', + 'percumalah': 'cuma', + 'bercuma': 'cuma', + 'cuma-cuma': 'cuma', + 'mempercumakan': 'cuma', + 'cumbuan': 'cumbu', + 'cumbuannya': 'cumbu', + 'mencumbu': 'cumbu', + 'mencumbunya': 'cumbu', + 'mencumbui': 'cumbu', + 'mencumbuku': 'cumbu', + 'mencumbumu': 'cumbu', + 'bercumbu': 'cumbu', + 'bercumbulah': 'cumbu', + 'mencumbuinya': 'cumbu', + 'percumbuan': 'cumbu', + 'percumbuannya': 'cumbu', + 'bercumbu-cumbu': 'cumbu', + 'bercumbu-cumbuan': 'cumbu', + 'mencunam': 'cunam', + 'pecundang': 'cundang', + 'pecundangnya': 'cundang', + 'pecundangi': 'cundang', + 'kecundang': 'cundang', + 'kecundangi': 'cundang', + 'tercundang': 'cundang', + 'mencundang': 'cundang', + 'mencundangi': 'cundang', + 'terkecundang': 'cundang', + 'mengecundang': 'cundang', + 'mengecundangi': 'cundang', + 'mempecundang': 'cundang', + 'mempecundangi': 'cundang', + 'mempecundanginya': 'cundang', + 'mengecundanginya': 'cundang', + 'bercunduk': 'cunduk', + 'tercungap': 'cungap', + 'mencungap': 'cungap', + 'cungap-cangip': 'cungap', + 'tercungap-cungap': 'cungap', + 'cungkilan': 'cungkil', + 'cungkilannya': 'cungkil', + 'mencungkil': 'cungkil', + 'mencungkilnya': 'cungkil', + 'pencungkil': 'cungkil', + 'pencungkilan': 'cungkil', + 'mencungul': 'cungul', + 'tercupai': 'cupai', + 'mencupaikan': 'cupai', + 'mencupak': 'cupak', + 'mencupang': 'cupang', + 'mencupar': 'cupar', + 'kecupetan': 'cupet', + 'bercuping': 'cuping', + 'cuplikan': 'cuplik', + 'cuplikannya': 'cuplik', + 'mencuplik': 'cuplik', + 'mencuplikan': 'cuplik', + 'cupu-cupu': 'cupu', + 'bercura': 'cura', + 'bercura-cura': 'cura', + 'bercura-bura': 'cura', + 'curahan': 'curah', + 'tercurah': 'curah', + 'tercurahnya': 'curah', + 'tercurahkan': 'curah', + 'mencurah': 'curah', + 'mencurahkan': 'curah', + 'mencurahkannya': 'curah', + 'mencurahi': 'curah', + 'pencurahan': 'curah', + 'curaian': 'curai', + 'mencuraikan': 'curai', + 'mencuram': 'curam', + 'mencurangi': 'curang', + 'mencuranginya': 'curang', + 'kecurangan': 'curang', + 'kecurangannya': 'curang', + 'kecuranganlah': 'curang', + 'mencurat': 'curat', + 'mencureng': 'cureng', + 'curian': 'curi', + 'curiannya': 'curi', + 'mencuri': 'curi', + 'mencurinya': 'curi', + 'mencurilah': 'curi', + 'mencurikan': 'curi', + 'mencurian': 'curi', + 'pencuri': 'curi', + 'pencurinya': 'curi', + 'pencurian': 'curi', + 'kecurian': 'curi', + 'pencuriannya': 'curi', + 'mencuri-curi': 'curi', + 'bercuriga': 'curiga', + 'mencurigai': 'curiga', + 'mencurigainya': 'curiga', + 'mencurigaiku': 'curiga', + 'kecurigaan': 'curiga', + 'kecurigaannya': 'curiga', + 'mencurigakan': 'curiga', + 'mencurigakannya': 'curiga', + 'mencurigakanlah': 'curiga', + 'mencuru': 'curu', + 'mengedab': 'dab', + 'mendabak': 'dabak', + 'mendabakan': 'dabak', + 'mendabih': 'dabih', + 'pendabihan': 'dabih', + 'mendabik': 'dabik', + 'berdabung': 'dabung', + 'mendabung': 'dabung', + 'berdabus': 'dabus', + 'mendacin': 'dacin', + 'berdada ruah': 'dada ruah', + 'pendadah': 'dadah', + 'pendadahan': 'dadah', + 'dadakan': 'dadak', + 'dadakannya': 'dadak', + 'mendadak': 'dadak', + 'mendadaknya': 'dadak', + 'pendadakan': 'dadak', + 'pendadaran': 'dadar', + 'terdadek': 'dadek', + 'berdadu': 'dadu', + 'mendaduh': 'daduh', + 'mendaduhkan': 'daduh', + 'pendaduk': 'daduk', + 'mendaduk': 'daduk', + 'berdadung': 'dadung', + 'mendadung': 'dadung', + 'mendadungkan': 'dadung', + 'kedaerahan': 'daerah', + 'kedaerahannya': 'daerah', + 'mendaftarhitamkan': 'daftar hitam', + 'mendaftar': 'daftar', + 'mendaftarnya': 'daftar', + 'mendaftarlah': 'daftar', + 'mendaftarkan': 'daftar', + 'mendaftarkannya': 'daftar', + 'mendaftaran': 'daftar', + 'pendaftar': 'daftar', + 'pendaftarnya': 'daftar', + 'pendaftarkan': 'daftar', + 'pendaftaran': 'daftar', + 'terdaftar': 'daftar', + 'terdaftarnya': 'daftar', + 'terdaftarlah': 'daftar', + 'terdaftarkan': 'daftar', + 'pendaftarannya': 'daftar', + 'mendaga': 'daga', + 'mendagakan': 'daga', + 'pendaga': 'daga', + 'pendagaan': 'daga', + 'dagangan': 'dagang', + 'dagangannya': 'dagang', + 'daganganku': 'dagang', + 'pedagang': 'dagang', + 'pedagangnya': 'dagang', + 'pedaganglah': 'dagang', + 'pedagangan': 'dagang', + 'berdagang': 'dagang', + 'berdagangnya': 'dagang', + 'berdaganglah': 'dagang', + 'berdagangan': 'dagang', + 'mendagang': 'dagang', + 'mendagangkan': 'dagang', + 'pendagang': 'dagang', + 'pendagangan': 'dagang', + 'perdagangan': 'dagang', + 'perdagangannya': 'dagang', + 'perdaganganlah': 'dagang', + 'perdagangankan': 'dagang', + 'perdaganganan': 'dagang', + 'memperdagangkan': 'dagang', + 'memperdagangkannya': 'dagang', + 'berdagang': 'dagang', + 'dagelan': 'dagel', + 'mendagel': 'dagel', + 'mendagi': 'dagi', + 'pendagi': 'dagi', + 'pendagian': 'dagi', + 'mendahaga': 'dahaga', + 'berdahan': 'dahan', + 'mendahan': 'dahan', + 'berdahanam': 'dahanam', + 'mendahsyat': 'dahsyat', + 'kedahsyatan': 'dahsyat', + 'kedahsyatannya': 'dahsyat', + 'memperdahsyat': 'dahsyat', + 'mendahsyatkan': 'dahsyat', + 'pendahulu': 'dahulu', + 'pendahulunya': 'dahulu', + 'pendahuluan': 'dahulu', + 'pendahuluku': 'dahulu', + 'pendahulumu': 'dahulu', + 'terdahulu': 'dahulu', + 'terdahulunya': 'dahulu', + 'terdahului': 'dahulu', + 'mendahului': 'dahulu', + 'mendahuluinya': 'dahulu', + 'mendahuluilah': 'dahulu', + 'mendahuluiku': 'dahulu', + 'mendahuluimu': 'dahulu', + 'kedahuluan': 'dahulu', + 'bersidahulu': 'dahulu', + 'pendahuluannya': 'dahulu', + 'mendahulukan': 'dahulu', + 'mendahulukannya': 'dahulu', + 'dahulu-mendahului': 'dahulu', + 'berdahulu-dahuluan': 'dahulu', + 'kedaifan': 'daif', + 'mendaifkan': 'daif', + 'dakian': 'daki', + 'berdaki': 'daki', + 'pendaki': 'daki', + 'pendakinya': 'daki', + 'pendakian': 'daki', + 'mendaki': 'daki', + 'mendakinya': 'daki', + 'mendakian': 'daki', + 'mendakimu': 'daki', + 'terdaki': 'daki', + 'pendakiannya': 'daki', + 'pendakianku': 'daki', + 'pendakianmu': 'daki', + 'mendakikan': 'daki', + 'dakwaan': 'dakwa', + 'dakwaannya': 'dakwa', + 'terdakwa': 'dakwa', + 'terdakwanya': 'dakwa', + 'terdakwalah': 'dakwa', + 'terdakwai': 'dakwa', + 'berdakwa': 'dakwa', + 'mendakwa': 'dakwa', + 'mendakwanya': 'dakwa', + 'mendakwakan': 'dakwa', + 'pendakwa': 'dakwa', + 'pendakwaan': 'dakwa', + 'mendakwai': 'dakwa', + 'pendakwaannya': 'dakwa', + 'memperdakwakan': 'dakwa', + 'dalaman': 'dalam', + 'dalamannya': 'dalam', + 'mendalam': 'dalam', + 'mendalamnya': 'dalam', + 'mendalamkan': 'dalam', + 'mendalami': 'dalam', + 'mendalaman': 'dalam', + 'pedalaman': 'dalam', + 'pedalamannya': 'dalam', + 'kedalaman': 'dalam', + 'kedalamannya': 'dalam', + 'kedalamanan': 'dalam', + 'mendalaminya': 'dalam', + 'pendalaman': 'dalam', + 'pendalamannya': 'dalam', + 'pendalamanan': 'dalam', + 'memperdalam': 'dalam', + 'memperdalamnya': 'dalam', + 'memperdalami': 'dalam', + 'dalam-dalam': 'dalam', + 'dalam-dalamnya': 'dalam', + 'berdalam-dalam': 'dalam', + 'sedalam-dalamnya': 'dalam', + 'sedalam-dalamnyanya': 'dalam', + 'pedalang': 'dalang', + 'pedalangan': 'dalang', + 'mendalang': 'dalang', + 'mendalangnya': 'dalang', + 'mendalangi': 'dalang', + 'pedalangannya': 'dalang', + 'mendalanginya': 'dalang', + 'mendalangkan': 'dalang', + 'berdalil': 'dalil', + 'mendalilkan': 'dalil', + 'dam-dam': 'dam', + 'dam-daman': 'dam', + 'mendamak': 'damak', + 'pendamar': 'damar', + 'pendamaran': 'damar', + 'berdamar': 'damar', + 'mendamar': 'damar', + 'pedamaran': 'damar', + 'dambaan': 'damba', + 'dambaannya': 'damba', + 'mendamba': 'damba', + 'mendambakan': 'damba', + 'mendambakannya': 'damba', + 'pendamba': 'damba', + 'pendambaan': 'damba', + 'berdambin': 'dambin', + 'mendamik': 'damik', + 'mendampak': 'dampak', + 'mendampakkan': 'dampak', + 'mendampakan': 'dampak', + 'berdampak': 'dampak', + 'berdampaknya': 'dampak', + 'berdampakan': 'dampak', + 'mendampar': 'dampar', + 'mendamparkan': 'dampar', + 'mendamparkannya': 'dampar', + 'terdampar': 'dampar', + 'terdamparnya': 'dampar', + 'keterdamparan': 'dampar', + 'berdampil': 'dampil', + 'mendampilkan': 'dampil', + 'dampratan': 'damprat', + 'dampratannya': 'damprat', + 'mendamprat': 'damprat', + 'mendampratnya': 'damprat', + 'berdampung-dampung': 'dampung', + 'pendana': 'dana', + 'pendananya': 'dana', + 'pendanaan': 'dana', + 'mendanai': 'dana', + 'mendanainya': 'dana', + 'pendanaannya': 'dana', + 'mendanau': 'danau', + 'pendangdut': 'dangdut', + 'berdangdut': 'dangdut', + 'mendangir': 'dangir', + 'berdangka': 'dangka', + 'terdangka-dangka': 'dangka', + 'dangkalan': 'dangkal', + 'kedangkalan': 'dangkal', + 'kedangkalannya': 'dangkal', + 'pendangkalan': 'dangkal', + 'pendangkalannya': 'dangkal', + 'pendangkalanan': 'dangkal', + 'mendangkalkan': 'dangkal', + 'mendangkar': 'dangkar', + 'berdangkung': 'dangkung', + 'mendangkung': 'dangkung', + 'mendanguk': 'danguk', + 'berdanguk': 'danguk', + 'terdanguk': 'danguk', + 'berdansanak': 'dansanak', + 'sedapat': 'dapat', + 'sedapatnya': 'dapat', + 'dapatan': 'dapat', + 'terdapat': 'dapat', + 'terdapatnya': 'dapat', + 'terdapatlah': 'dapat', + 'terdapati': 'dapat', + 'berdapat': 'dapat', + 'berdapatan': 'dapat', + 'mendapat': 'dapat', + 'mendapatnya': 'dapat', + 'mendapatkan': 'dapat', + 'mendapatkannya': 'dapat', + 'mendapati': 'dapat', + 'mendapatan': 'dapat', + 'pendapat': 'dapat', + 'pendapatnya': 'dapat', + 'pendapatlah': 'dapat', + 'pendapatkan': 'dapat', + 'pendapatkannya': 'dapat', + 'pendapatan': 'dapat', + 'pendapatku': 'dapat', + 'pendapatmu': 'dapat', + 'mendapatinya': 'dapat', + 'mendapatikan': 'dapat', + 'mendapatiku': 'dapat', + 'kedapatan': 'dapat', + 'kedapatannya': 'dapat', + 'kedapatanlah': 'dapat', + 'kedapatanan': 'dapat', + 'pendapatannya': 'dapat', + 'pendapatanan': 'dapat', + 'pendapatanmu': 'dapat', + 'mendapatkankan': 'dapat', + 'mendapatkanan': 'dapat', + 'mendapatkanku': 'dapat', + 'memperdapat': 'dapat', + 'sedapat-dapatnya': 'dapat', + 'perdaraan': 'dara', + 'mendarab': 'darab', + 'berdarah': 'darah', + 'berdarahnya': 'darah', + 'pendarah': 'darah', + 'pendarahan': 'darah', + 'mendarah': 'darah', + 'mendarahi': 'darah', + 'mendarahan': 'darah', + 'perdarahan': 'darah', + 'perdarahannya': 'darah', + 'pendarahannya': 'darah', + 'mendaras': 'daras', + 'mendaraskan': 'daras', + 'pendarasan': 'daras', + 'daratan': 'darat', + 'daratannya': 'darat', + 'pendarat': 'darat', + 'pendaratnya': 'darat', + 'pendaratan': 'darat', + 'mendarat': 'darat', + 'mendaratnya': 'darat', + 'mendaratlah': 'darat', + 'mendaratkan': 'darat', + 'mendaratkannya': 'darat', + 'mendarati': 'darat', + 'mendaratan': 'darat', + 'pendaratannya': 'darat', + 'pendaratanmu': 'darat', + 'sedari': 'dari', + 'mendarmabaktikan': 'darmabakti', + 'berdarmawisata': 'darmawisata', + 'sedarun': 'darun', + 'mendaruratkan': 'darurat', + 'berdasi': 'dasi', + 'mendasun': 'dasun', + 'mendata': 'data', + 'mendatanya': 'data', + 'mendatakan': 'data', + 'mendatakannya': 'data', + 'mendataan': 'data', + 'pendataan': 'data', + 'pendataannya': 'data', + 'pendatang': 'datang', + 'pendatangnya': 'datang', + 'pendatangan': 'datang', + 'berdatang': 'datang', + 'berdatangnya': 'datang', + 'berdatangkan': 'datang', + 'berdatangan': 'datang', + 'mendatang': 'datang', + 'mendatangnya': 'datang', + 'mendatanglah': 'datang', + 'mendatangkan': 'datang', + 'mendatangkannya': 'datang', + 'mendatangi': 'datang', + 'mendatangan': 'datang', + 'mendatanginya': 'datang', + 'mendatangiku': 'datang', + 'mendatangimu': 'datang', + 'kedatangan': 'datang', + 'kedatangannya': 'datang', + 'kedatangani': 'datang', + 'kedatanganan': 'datang', + 'kedatanganku': 'datang', + 'kedatanganmu': 'datang', + 'pendatangannya': 'datang', + 'pendatanganan': 'datang', + 'berdatangannya': 'datang', + 'berdatanganlah': 'datang', + 'berdatanganan': 'datang', + 'mendatangkankan': 'datang', + 'mendatangkanku': 'datang', + 'mendatangkanmu': 'datang', + 'datang-datang': 'datang', + 'berdatang sembah': 'datang', + 'datang-mendatangi': 'datang', + 'sedatar': 'datar', + 'dataran': 'datar', + 'datarannya': 'datar', + 'mendatar': 'datar', + 'mendatarnya': 'datar', + 'mendatarkan': 'datar', + 'pendataran': 'datar', + 'pendatarannya': 'datar', + 'kedatuan': 'datu', + 'berdatuk': 'datuk', + 'mendaur ulang': 'daur ulang', + 'pendaurulangan': 'daur ulang', + 'berdawai': 'dawai', + 'berdawat': 'dawat', + 'berdaya guna': 'daya guna', + 'kedayagunaan': 'daya guna', + 'pendayagunaan': 'daya guna', + 'pendayagunaannya': 'daya guna', + 'mendayagunakan': 'daya guna', + 'mendayagunakannya': 'daya guna', + 'berdaya upaya': 'daya upaya', + 'pendayaupayaan': 'daya upaya', + 'pendayang': 'dayang', + 'pendayangan': 'dayang', + 'perdayangan': 'dayang', + 'dayang-dayang': 'dayang', + 'dayang-dayangnya': 'dayang', + 'mendayu': 'dayu', + 'terdayuh': 'dayuh', + 'terdayuk': 'dayuk', + 'mendayus': 'dayus', + 'mendebah': 'debah', + 'debak-debuk': 'debak', + 'berdebat': 'debat', + 'berdebatnya': 'debat', + 'berdebatlah': 'debat', + 'berdebatan': 'debat', + 'pendebat': 'debat', + 'mendebat': 'debat', + 'mendebatnya': 'debat', + 'mendebatkan': 'debat', + 'mendebatkannya': 'debat', + 'mendebatmu': 'debat', + 'perdebatan': 'debat', + 'perdebatannya': 'debat', + 'perdebatankan': 'debat', + 'memperdebatkan': 'debat', + 'memperdebatkannya': 'debat', + 'mendebik': 'debik', + 'pendebitan': 'debit', + 'mendebitkan': 'debit', + 'berdebum': 'debum', + 'berdebus': 'debus', + 'berdebut': 'debut', + 'berdecak-decak': 'decak', + 'mendecap-decap': 'decap', + 'berdecap-decap': 'decap', + 'berdecup': 'decup', + 'berdecup-decup': 'decup', + 'mendecur': 'decur', + 'berdecut': 'decut', + 'berdecut-decut': 'decut', + 'terdedah': 'dedah', + 'pendedahan': 'dedah', + 'mendedahkan': 'dedah', + 'keterdedahan': 'dedah', + 'berdedai-dedai': 'dedai', + 'berdedak': 'dedak', + 'mendedas': 'dedas', + 'mendedau': 'dedau', + 'mendedel': 'dedel', + 'mendeder': 'deder', + 'mendederkan': 'deder', + 'pendederan': 'deder', + 'mendedes': 'dedes', + 'berdefile': 'defile', + 'pendefinisian': 'definisi', + 'mendefinisikan': 'definisi', + 'mendefinisikannya': 'definisi', + 'mendefinisikanku': 'definisi', + 'deg-degan': 'deg', + 'deg-degannya': 'deg', + 'deg-deganku': 'deg', + 'mendegam': 'degam', + 'berdegam': 'degam', + 'mendegam-degam': 'degam', + 'berdegap': 'degap', + 'degap-degap': 'degap', + 'berdegap-degap': 'degap', + 'berdegar-degar': 'degar', + 'mendegil': 'degil', + 'mendegilkan': 'degil', + 'kedegilan': 'degil', + 'kedegilannya': 'degil', + 'berdeging': 'deging', + 'berdegum': 'degum', + 'mendeham': 'deham', + 'berdeham': 'deham', + 'berdeham-deham': 'deham', + 'berdekah-dekah': 'dekah', + 'berdekak-dekak': 'dekak', + 'berdekam': 'dekam', + 'mendekam': 'dekam', + 'mendekamnya': 'dekam', + 'mendekamkan': 'dekam', + 'dekapan': 'dekap', + 'dekapannya': 'dekap', + 'dekapanku': 'dekap', + 'mendekap': 'dekap', + 'mendekapnya': 'dekap', + 'mendekapkan': 'dekap', + 'mendekapku': 'dekap', + 'berdekap': 'dekap', + 'berdekapan': 'dekap', + 'sedekapan': 'dekap', + 'sependekap': 'dekap', + 'memperdekap': 'dekap', + 'berdekap-dekapan': 'dekap', + 'pendekar': 'dekar', + 'pendekarnya': 'dekar', + 'pendekaran': 'dekar', + 'mendekar': 'dekar', + 'mendekari': 'dekar', + 'mendekat': 'dekat', + 'mendekatnya': 'dekat', + 'mendekatlah': 'dekat', + 'mendekatkan': 'dekat', + 'mendekatkannya': 'dekat', + 'mendekati': 'dekat', + 'mendekatan': 'dekat', + 'berdekat': 'dekat', + 'berdekati': 'dekat', + 'berdekatan': 'dekat', + 'terdekat': 'dekat', + 'terdekatnya': 'dekat', + 'terdekatlah': 'dekat', + 'terdekatan': 'dekat', + 'terdekatku': 'dekat', + 'terdekatmu': 'dekat', + 'kedekatan': 'dekat', + 'kedekatannya': 'dekat', + 'kedekatanku': 'dekat', + 'mendekatinya': 'dekat', + 'mendekatilah': 'dekat', + 'mendekatian': 'dekat', + 'mendekatiku': 'dekat', + 'mendekatimu': 'dekat', + 'berdekatannya': 'dekat', + 'pendekatan': 'dekat', + 'pendekatannya': 'dekat', + 'pendekatanan': 'dekat', + 'pendekatanku': 'dekat', + 'pendekatanmu': 'dekat', + 'dekat-dekat': 'dekat', + 'dekat-dekatlah': 'dekat', + 'dekat-dekatan': 'dekat', + 'memperdekat': 'dekat', + 'memperdekatkan': 'dekat', + 'berdekat-dekat': 'dekat', + 'berdekat-dekatan': 'dekat', + 'mendeklarasikan': 'deklarasi', + 'mendeklarasikannya': 'deklarasi', + 'mendekolonisasi': 'dekolonisasi', + 'pendekorasian': 'dekorasi', + 'mendekretkan': 'dekret', + 'berdeku': 'deku', + 'berdekus': 'dekus', + 'mendekus': 'dekus', + 'berdekut': 'dekut', + 'mendekut': 'dekut', + 'berdelan': 'delan', + 'berdelat-delat': 'delat', + 'pendelegasian': 'delegasi', + 'pendelegasiannya': 'delegasi', + 'mendelegasikan': 'delegasi', + 'mendelegasikannya': 'delegasi', + 'mendelik': 'delik', + 'mendelong': 'delong', + 'mendemah': 'demah', + 'berdembai-dembai': 'dembai', + 'berdembam': 'dembam', + 'berdembun': 'dembun', + 'berdembun-dembun': 'dembun', + 'mendemik': 'demik', + 'sedemikian': 'demikian', + 'sedemikianlah': 'demikian', + 'mendemiliterisasi': 'demiliterisasi', + 'pedemo': 'demo', + 'mendemo': 'demo', + 'mendemonya': 'demo', + 'mendemokan': 'demo', + 'mendemokannya': 'demo', + 'mendemobilisasi': 'demobilisasi', + 'pendemokrasian': 'demokrasi', + 'mendemokrasikan': 'demokrasi', + 'berdempak': 'dempak', + 'berdempang-dempang': 'dempang', + 'berdempet': 'dempet', + 'berdempetan': 'dempet', + 'mendempetkan': 'dempet', + 'berdempet-dempet': 'dempet', + 'berdempet-dempetan': 'dempet', + 'berdempok': 'dempok', + 'terdempok': 'dempok', + 'dempulan': 'dempul', + 'mendempul': 'dempul', + 'berdencing-dencing': 'dencing', + 'dendaan': 'denda', + 'mendenda': 'denda', + 'mendendanya': 'denda', + 'pendendaan': 'denda', + 'pendendam': 'dendam', + 'mendendam': 'dendam', + 'berdendam': 'dendam', + 'mendendami': 'dendam', + 'kedendaman': 'dendam', + 'mendendamkan': 'dendam', + 'berdendam-dendaman': 'dendam', + 'pendendang': 'dendang', + 'berdendang': 'dendang', + 'mendendangkan': 'dendang', + 'mendendangkannya': 'dendang', + 'mendendeng': 'dendeng', + 'berdengap': 'dengap', + 'berdengar': 'dengar', + 'terdengar': 'dengar', + 'terdengarnya': 'dengar', + 'terdengarlah': 'dengar', + 'mendengar': 'dengar', + 'mendengarnya': 'dengar', + 'mendengarkan': 'dengar', + 'mendengarkannya': 'dengar', + 'mendengari': 'dengar', + 'mendengaran': 'dengar', + 'mendengarku': 'dengar', + 'mendengarmu': 'dengar', + 'pendengar': 'dengar', + 'pendengarnya': 'dengar', + 'pendengaran': 'dengar', + 'pendengarku': 'dengar', + 'kedengaran': 'dengar', + 'kedengarannya': 'dengar', + 'pendengarannya': 'dengar', + 'pendengaranlah': 'dengar', + 'pendengaranan': 'dengar', + 'pendengaranku': 'dengar', + 'pendengaranmu': 'dengar', + 'mendengarkankan': 'dengar', + 'mendengarkanku': 'dengar', + 'mendengarkanmu': 'dengar', + 'dengar-dengaran': 'dengar', + 'memperdengarkan': 'dengar', + 'memperdengarkannya': 'dengar', + 'mendengar-dengar': 'dengar', + 'terdengih-dengih': 'dengih', + 'mendenging': 'denging', + 'berdenging': 'denging', + 'berdengkang-dengkang': 'dengkang', + 'mendengki': 'dengki', + 'berdengki': 'dengki', + 'pendengki': 'dengki', + 'pendengkinya': 'dengki', + 'kedengkian': 'dengki', + 'kedengkiannya': 'dengki', + 'kedengkik': 'dengkik', + 'mendengkul': 'dengkul', + 'berdengkung': 'dengkung', + 'mendengkung': 'dengkung', + 'mendengkus': 'dengkus', + 'berdengkus': 'dengkus', + 'mendengu': 'dengu', + 'berdengu': 'dengu', + 'terdenguk': 'denguk', + 'mendenguk': 'denguk', + 'berdengut': 'dengut', + 'mendengut': 'dengut', + 'berdengut-dengut': 'dengut', + 'mendengut-dengut': 'dengut', + 'dentaman': 'dentam', + 'berdentam': 'dentam', + 'berdentang': 'dentang', + 'berdentang-dentang': 'dentang', + 'berdentung': 'dentung', + 'berdentung-dentung': 'dentung', + 'denyitan': 'denyit', + 'berdenyit': 'denyit', + 'denyutan': 'denyut', + 'denyutannya': 'denyut', + 'mendenyut': 'denyut', + 'mendenyutkan': 'denyut', + 'berdenyut': 'denyut', + 'berdenyutnya': 'denyut', + 'berdenyut-denyut': 'denyut', + 'mengedep': 'dep', + 'mengedepkan': 'dep', + 'mengedepan': 'dep', + 'mendepa': 'depa', + 'mendepakan': 'depa', + 'berdepak-depak': 'depak', + 'mendepakkan': 'depak', + 'terdepan': 'depan', + 'terdepannya': 'depan', + 'pengedepanan': 'depan', + 'mengedepankan': 'depan', + 'mengedepankannya': 'depan', + 'mengedepankankan': 'depan', + 'berdepan-depan': 'depan', + 'mendepang': 'depang', + 'mendepangkan': 'depang', + 'mendepolitisasi': 'depolitisasi', + 'mendeponir': 'deponir', + 'mendeponirnya': 'deponir', + 'mendeponirkannya': 'deponir', + 'mendeponiran': 'deponir', + 'mendeportasi': 'deportasi', + 'mendeportasinya': 'deportasi', + 'mendeportasikan': 'deportasi', + 'pendepositoan': 'deposito', + 'mendepositokan': 'deposito', + 'mendepositokannya': 'deposito', + 'mendeprok': 'deprok', + 'mendepun': 'depun', + 'mendera': 'dera', + 'menderanya': 'dera', + 'menderai': 'dera', + 'menderaku': 'dera', + 'deraian': 'derai', + 'berderai': 'derai', + 'menderaikan': 'derai', + 'berderai-derai': 'derai', + 'menderai-deraikan': 'derai', + 'sederajat': 'derajat', + 'sederajatnya': 'derajat', + 'menyederajatkan': 'derajat', + 'derakan': 'derak', + 'berderak': 'derak', + 'berderaknya': 'derak', + 'berderak-derak': 'derak', + 'menderak-derakkan': 'derak', + 'menderang': 'derang', + 'berderang': 'derang', + 'sederap': 'derap', + 'berderap': 'derap', + 'berderaplah': 'derap', + 'menderap': 'derap', + 'menderapkan': 'derap', + 'menderas': 'deras', + 'menderasnya': 'deras', + 'penderas': 'deras', + 'penderasan': 'deras', + 'berderau': 'derau', + 'menderau': 'derau', + 'menderau-derau': 'derau', + 'berderau-derau': 'derau', + 'menderek': 'derek', + 'mendereknya': 'derek', + 'penderekan': 'derek', + 'menderes': 'deres', + 'penderes': 'deres', + 'penderesan': 'deres', + 'berderik': 'derik', + 'berderik-derik': 'derik', + 'berderis': 'deris', + 'menderis': 'deris', + 'menderit': 'derit', + 'berderit': 'derit', + 'deritaan': 'derita', + 'penderita': 'derita', + 'penderitanya': 'derita', + 'penderitaan': 'derita', + 'terderita': 'derita', + 'menderita': 'derita', + 'menderitanya': 'derita', + 'menderitalah': 'derita', + 'menderitakan': 'derita', + 'penderitaannya': 'derita', + 'penderitaanku': 'derita', + 'penderitaanmu': 'derita', + 'bederma': 'derma', + 'penderma': 'derma', + 'pendermanya': 'derma', + 'pendermaan': 'derma', + 'mendermakan': 'derma', + 'mendermakannya': 'derma', + 'kedermawanan': 'dermawan', + 'kedermawanannya': 'dermawan', + 'menderu': 'deru', + 'menderu-deru': 'deru', + 'menderu-derukan': 'deru', + 'berderuk': 'deruk', + 'berderung-derung': 'derung', + 'berderus-derus': 'derus', + 'pedesaan': 'desa', + 'pedesaannya': 'desa', + 'kedesaan': 'desa', + 'perdesaan': 'desa', + 'perdesaannya': 'desa', + 'kedesa-desaan': 'desa', + 'mendesah': 'desah', + 'berdesah': 'desah', + 'mendesain': 'desain', + 'mendesainnya': 'desain', + 'mendesainkan': 'desain', + 'berdesain': 'desain', + 'pendesain': 'desain', + 'pendesainnya': 'desain', + 'pendesainan': 'desain', + 'desakan': 'desak', + 'desakannya': 'desak', + 'desakanan': 'desak', + 'terdesak': 'desak', + 'terdesaknya': 'desak', + 'berdesak': 'desak', + 'berdesakkan': 'desak', + 'berdesakkannya': 'desak', + 'berdesakan': 'desak', + 'mendesak': 'desak', + 'mendesaknya': 'desak', + 'mendesaklah': 'desak', + 'mendesakkan': 'desak', + 'mendesakkannya': 'desak', + 'mendesakan': 'desak', + 'mendesakku': 'desak', + 'pendesakan': 'desak', + 'berdesak-desakan': 'desak', + 'berdesak-desakannya': 'desak', + 'mendesar': 'desar', + 'berdesar': 'desar', + 'berdesarkan': 'desar', + 'mendesas-desuskan': 'desas-desus', + 'mendesau': 'desau', + 'berdesau': 'desau', + 'berdesik-desik': 'desik', + 'mendesis': 'desis', + 'mendesiskan': 'desis', + 'mendeskripsikan': 'deskripsi', + 'mendeskripsikannya': 'deskripsi', + 'mendestabilisasi': 'destabilisasi', + 'mendestabilisasikan': 'destabilisasi', + 'berdesus': 'desus', + 'mendesuskan': 'desus', + 'berdesus-desus': 'desus', + 'mendesus-desus': 'desus', + 'mendesut': 'desut', + 'mendetail': 'detail', + 'mendetailnya': 'detail', + 'mendetailkan': 'detail', + 'mendetailkannya': 'detail', + 'mendetailan': 'detail', + 'mendetak': 'detak', + 'mendetakkan': 'detak', + 'berdetak': 'detak', + 'berdetaknya': 'detak', + 'mendetap-detap': 'detap', + 'mendetar': 'detar', + 'berdetar': 'detar', + 'berdetas': 'detas', + 'mendetasir': 'detasir', + 'mendeteksi': 'deteksi', + 'mendeteksinya': 'deteksi', + 'terdeteksi': 'deteksi', + 'terdeteksinya': 'deteksi', + 'terdeteksilah': 'deteksi', + 'pendeteksian': 'deteksi', + 'pendeteksiannya': 'deteksi', + 'berdetus': 'detus', + 'mendevaluasi': 'devaluasi', + 'mendevaluasikan': 'devaluasi', + 'pendevaluasian': 'devaluasi', + 'kedewaan': 'dewa', + 'pendewaan': 'dewa', + 'memperdewa': 'dewa', + 'mendewakan': 'dewa', + 'mendewakannya': 'dewa', + 'memperdewakan': 'dewa', + 'mendewa-dewakan': 'dewa', + 'kedewasaan': 'dewasa', + 'kedewasaannya': 'dewasa', + 'kedewasaanku': 'dewasa', + 'pendewasaan': 'dewasa', + 'pendewasaannya': 'dewasa', + 'mendewasakan': 'dewasa', + 'mendewasakannya': 'dewasa', + 'mendewasakanku': 'dewasa', + 'kedewataan': 'dewata', + 'mendewatakan': 'dewata', + 'mendiakan': 'dia', + 'mendiagnosis': 'diagnosis', + 'mendiagnosisnya': 'diagnosis', + 'mendiagnosisi': 'diagnosis', + 'berdialog': 'dialog', + 'berdialognya': 'dialog', + 'berdialoglah': 'dialog', + 'mendiani': 'dian', + 'memperdiarkan': 'diar', + 'mendiatkan': 'diat', + 'mendidih': 'didih', + 'mendidihnya': 'didih', + 'mendidihlah': 'didih', + 'mendidihkan': 'didih', + 'mendidihkannya': 'didih', + 'didikan': 'didik', + 'didikannya': 'didik', + 'mendidik': 'didik', + 'mendidiknya': 'didik', + 'mendidiki': 'didik', + 'mendidikan': 'didik', + 'mendidikmu': 'didik', + 'pendidik': 'didik', + 'pendidiknya': 'didik', + 'pendidiklah': 'didik', + 'pendidikkan': 'didik', + 'pendidikan': 'didik', + 'pendidikmu': 'didik', + 'mendidis': 'didis', + 'kedigdayaan': 'digdaya', + 'kedigdayaannya': 'digdaya', + 'pendigulan': 'digul', + 'mendigulkan': 'digul', + 'berdikit-dikit': 'dikit', + 'sedikit-dikitnya': 'sedikit', + 'berdiksa': 'diksa', + 'kediktatoran': 'diktator', + 'kediktatorannya': 'diktator', + 'mendikte': 'dikte', + 'mendiktenya': 'dikte', + 'mendiktekan': 'dikte', + 'mendiktekannya': 'dikte', + 'mendilak': 'dilak', + 'makanan': 'makan', + 'makanannya': 'makan', + 'makananlah': 'makan', + 'makananan': 'makan', + 'makananku': 'makan', + 'makananmu': 'makan', + 'memakan': 'makan', + 'memakannya': 'makan', + 'memakankan': 'makan', + 'memakani': 'makan', + 'memakanan': 'makan', + 'memakanmu': 'makan', + 'dimakan': 'makan', + 'dimakannya': 'makan', + 'dimakanlah': 'makan', + 'dimakankan': 'makan', + 'dimakani': 'makan', + 'dimakanan': 'makan', + 'pemakan': 'makan', + 'pemakannya': 'makan', + 'pemakanan': 'makan', + 'termakan': 'makan', + 'termakannya': 'makan', + 'sepemakan': 'makan', + 'makan-makan': 'makan', + 'makan-makannya': 'makan', + 'makan-makanlah': 'makan', + 'makan-makanan': 'makan', + 'makan-makanannya': 'makan', + 'pendinamis': 'dinamis', + 'kedinamisan': 'dinamis', + 'mendinamiskan': 'dinamis', + 'mendinamit': 'dinamit', + 'mendinamitnya': 'dinamit', + 'pendinamitan': 'dinamit', + 'berdinas': 'dinas', + 'kedinasan': 'dinas', + 'kedinasannya': 'dinas', + 'mendinaskan': 'dinas', + 'berdinding': 'dinding', + 'berdindingkan': 'dinding', + 'pendinding': 'dinding', + 'terdinding': 'dinding', + 'mendinding': 'dinding', + 'mendindingi': 'dinding', + 'pendindingan': 'dinding', + 'mendingin': 'dingin', + 'mendinginnya': 'dingin', + 'mendinginkan': 'dingin', + 'mendinginkannya': 'dingin', + 'pendingin': 'dingin', + 'pendinginnya': 'dingin', + 'pendinginan': 'dingin', + 'kedinginan': 'dingin', + 'kedinginannya': 'dingin', + 'pendinginannya': 'dingin', + 'berdingkit-dingkit': 'dingkit', + 'sedini-dininya': 'dini', + 'pemanggang': 'panggang', + 'pemanggangnya': 'panggang', + 'pemanggangan': 'panggang', + 'panggangan': 'panggang', + 'panggangannya': 'panggang', + 'memanggang': 'panggang', + 'memanggangnya': 'panggang', + 'dipanggang': 'panggang', + 'dipanggangnya': 'panggang', + 'pemanggangannya': 'panggang', + 'berdiplomasi': 'diplomasi', + 'berdiplomasinya': 'diplomasi', + 'kedirgantaraan': 'dirgantara', + 'kedirgantaraannya': 'dirgantara', + 'mendiris': 'diris', + 'pendiris': 'diris', + 'mendirus': 'dirus', + 'pendirusan': 'dirus', + 'mendiruskan': 'dirus', + 'pendisko': 'disko', + 'mendiskreditkan': 'diskredit', + 'mendiskreditkannya': 'diskredit', + 'mendiskriminasi': 'diskriminasi', + 'mendiskriminasinya': 'diskriminasi', + 'mendiskriminasikan': 'diskriminasi', + 'mendiskriminasikannya': 'diskriminasi', + 'mendiskualifikasikan': 'diskualifikasi', + 'berdiskusi': 'diskusi', + 'berdiskusinya': 'diskusi', + 'berdiskusilah': 'diskusi', + 'berdiskusikan': 'diskusi', + 'mendiskusikan': 'diskusi', + 'mendiskusikannya': 'diskusi', + 'mendistribusi': 'distribusi', + 'mendistribusinya': 'distribusi', + 'mendistribusikan': 'distribusi', + 'mendistribusikannya': 'distribusi', + 'mendistribusian': 'distribusi', + 'terdistribusi': 'distribusi', + 'terdistribusinya': 'distribusi', + 'terdistribusilah': 'distribusi', + 'terdistribusikan': 'distribusi', + 'terdistribusikannya': 'distribusi', + 'pendistribusian': 'distribusi', + 'pendistribusiannya': 'distribusi', + 'penanam': 'tanam', + 'penanamnya': 'tanam', + 'penanamkan': 'tanam', + 'penanaman': 'tanam', + 'menanam': 'tanam', + 'menanamnya': 'tanam', + 'menanamlah': 'tanam', + 'menanamkan': 'tanam', + 'menanamkannya': 'tanam', + 'menanami': 'tanam', + 'menanaman': 'tanam', + 'tanaman': 'tanam', + 'tanamannya': 'tanam', + 'tanamanan': 'tanam', + 'tanamanku': 'tanam', + 'ditanam': 'tanam', + 'ditanamnya': 'tanam', + 'ditanamlah': 'tanam', + 'ditanamkan': 'tanam', + 'ditanamkannya': 'tanam', + 'ditanami': 'tanam', + 'ditanaman': 'tanam', + 'tertanam': 'tanam', + 'tertanamnya': 'tanam', + 'tertanamlah': 'tanam', + 'tertanamkan': 'tanam', + 'tertanami': 'tanam', + 'menanaminya': 'tanam', + 'bertanam': 'tanam', + 'bertanamnya': 'tanam', + 'bertanaman': 'tanam', + 'penanamannya': 'tanam', + 'penanamanan': 'tanam', + 'menanamkankan': 'tanam', + 'pertanaman': 'tanam', + 'tanam-menanam': 'tanam', + 'tanam-menanamnya': 'tanam', + 'tanam-tanaman': 'tanam', + 'mendiversifikasi': 'diversifikasi', + 'mendiversifikasinya': 'diversifikasi', + 'mendiversifikasikan': 'diversifikasi', + 'mendiversifikasikannya': 'diversifikasi', + 'pendiversifikasian': 'diversifikasi', + 'mendobrak': 'dobrak', + 'mendobraknya': 'dobrak', + 'mendobrakkan': 'dobrak', + 'pendobrak': 'dobrak', + 'pendobraknya': 'dobrak', + 'pendobrakkan': 'dobrak', + 'pendobrakan': 'dobrak', + 'mendodet': 'dodet', + 'terdodong': 'dodong', + 'kedodoran': 'dodor', + 'kedodorannya': 'dodor', + 'mendodos': 'dodos', + 'berdogol': 'dogol', + 'kedogolan': 'dogol', + 'terdohok': 'dohok', + 'berdokar': 'dokar', + 'kedokteran': 'dokter', + 'kedokterannya': 'dokter', + 'kedokteranlah': 'dokter', + 'kedokteranan': 'dokter', + 'pendokumentasian': 'dokumentasi', + 'pendokumentasiannya': 'dokumentasi', + 'mendokumentasikan': 'dokumentasi', + 'mendokumentasikannya': 'dokumentasi', + 'dolanan': 'dolan', + 'pendolaran': 'dolar', + 'mendolarkan': 'dolar', + 'mendominasi': 'dominasi', + 'mendominasinya': 'dominasi', + 'mendominasikan': 'dominasi', + 'berdomisili': 'domisili', + 'berdomisilinya': 'domisili', + 'mendompak': 'dompak', + 'berdompak': 'dompak', + 'domplangan': 'domplang', + 'domplengan': 'dompleng', + 'pendompleng': 'dompleng', + 'pendomplengan': 'dompleng', + 'mendompleng': 'dompleng', + 'mendomplengnya': 'dompleng', + 'mendomplengkan': 'dompleng', + 'mendomplengi': 'dompleng', + 'pendomplengannya': 'dompleng', + 'sedompol': 'dompol', + 'dompolan': 'dompol', + 'berdompol': 'dompol', + 'mendoncang': 'doncang', + 'dondangan': 'dondang', + 'mendondangkan': 'dondang', + 'mendonder': 'donder', + 'sedondon': 'dondon', + 'mendondon': 'dondon', + 'mendongak': 'dongak', + 'mendongakkan': 'dongak', + 'mendongakkannya': 'dongak', + 'dongengan': 'dongeng', + 'mendongeng': 'dongeng', + 'mendongengnya': 'dongeng', + 'mendongengkan': 'dongeng', + 'mendongengi': 'dongeng', + 'pendongeng': 'dongeng', + 'pendongengnya': 'dongeng', + 'mendongkak': 'dongkak', + 'mendongkakkan': 'dongkak', + 'dongkelan': 'dongkel', + 'mendongkel': 'dongkel', + 'mendongkelnya': 'dongkel', + 'pendongkok': 'dongkok', + 'pendongkol': 'dongkol', + 'mendongkol': 'dongkol', + 'mendongkolkan': 'dongkol', + 'mendongkrak': 'dongkrak', + 'mendongkraknya': 'dongkrak', + 'mendongkrakkan': 'dongkrak', + 'mendongkrakan': 'dongkrak', + 'pendongkrak': 'dongkrak', + 'pendongkraknya': 'dongkrak', + 'pendongkrakan': 'dongkrak', + 'terdongkrak': 'dongkrak', + 'terdongkraknya': 'dongkrak', + 'mendongsok': 'dongsok', + 'mengedor': 'dor', + 'dor-doran': 'dor', + 'mendornai': 'dorna', + 'dorongan': 'dorong', + 'dorongannya': 'dorong', + 'terdorong': 'dorong', + 'terdorongnya': 'dorong', + 'mendorong': 'dorong', + 'mendorongnya': 'dorong', + 'mendoronglah': 'dorong', + 'mendorongkan': 'dorong', + 'mendorongan': 'dorong', + 'mendorongku': 'dorong', + 'mendorongmu': 'dorong', + 'pendorong': 'dorong', + 'pendorongnya': 'dorong', + 'pendorongan': 'dorong', + 'pendorongmu': 'dorong', + 'mendosir': 'dosir', + 'berdosis': 'dosis', + 'berdosisi': 'dosis', + 'mengedot': 'dot', + 'kedoyanan': 'doyan', + 'pendramaan': 'drama', + 'mengedrel': 'drel', + 'pengedrelan': 'drel', + 'mendribel': 'dribel', + 'mendribelnya': 'dribel', + 'mengedril': 'dril', + 'mengedrop': 'drop', + 'pengedropan': 'drop', + 'sedua': 'dua', + 'seduanya': 'dua', + 'seduai': 'dua', + 'kedua': 'dua', + 'keduanya': 'dua', + 'kedualah': 'dua', + 'keduaan': 'dua', + 'keduanyalah': 'dua', + 'keduaku': 'dua', + 'keduamu': 'dua', + 'kedua-ku': 'dua', + 'mendua': 'dua', + 'menduanya': 'dua', + 'menduakan': 'dua', + 'menduakannya': 'dua', + 'pendua': 'dua', + 'perdua': 'dua', + 'perduaan': 'dua', + 'berdua': 'dua', + 'berduanya': 'dua', + 'berdualah': 'dua', + 'berduakan': 'dua', + 'berduaan': 'dua', + 'dua-dua': 'dua', + 'dua-duanya': 'dua', + 'dua-duaan': 'dua', + 'dua-duanyalah': 'dua', + 'menduai': 'dua', + 'seperdua': 'dua', + 'penduaan': 'dua', + 'berduaannya': 'dua', + 'menyedua': 'dua', + 'menyeduakan': 'dua', + 'memperdua': 'dua', + 'menyeduai': 'dua', + 'berdua-dua': 'dua', + 'berdua-duanya': 'dua', + 'berdua-duaan': 'dua', + 'memperduai': 'dua', + 'dua-duanyanya': 'dua', + 'memperduakan': 'dua', + 'mengedub': 'dub', + 'pengeduban': 'dub', + 'mendubeskan': 'dubes', + 'dubilah': 'dubila', + 'mendublir': 'dublir', + 'mendudu': 'dudu', + 'mendudukan': 'dudu', + 'mendudukannya': 'dudu', + 'mendudui': 'dudu', + 'menduduku': 'dudu', + 'mendudu-dudu': 'dudu', + 'penduduk': 'duduk', + 'penduduknya': 'duduk', + 'pendudukkan': 'duduk', + 'penduduki': 'duduk', + 'pendudukan': 'duduk', + 'pendudukmu': 'duduk', + 'terduduk': 'duduk', + 'terduduki': 'duduk', + 'kedudukan': 'duduk', + 'kedudukannya': 'duduk', + 'kedudukanku': 'duduk', + 'kedudukanmu': 'duduk', + 'menduduki': 'duduk', + 'mendudukinya': 'duduk', + 'pendudukannya': 'duduk', + 'duduk-duduk': 'duduk', + 'duduk-duduknya': 'duduk', + 'duduk-dudukan': 'duduk', + 'mendudukkan': 'duduk', + 'mendudukkannya': 'duduk', + 'sekedudukan': 'duduk', + 'berkedudukan': 'duduk', + 'mendudur': 'dudur', + 'berduel': 'duel', + 'berduet': 'duet', + 'berduetnya': 'duet', + 'dugaan': 'duga', + 'dugaannya': 'duga', + 'dugaanku': 'duga', + 'penduga': 'duga', + 'pendugaan': 'duga', + 'menduga': 'duga', + 'menduganya': 'duga', + 'mendugalah': 'duga', + 'mendugakan': 'duga', + 'mendugaan': 'duga', + 'terduga': 'duga', + 'terduganya': 'duga', + 'terduga-duga': 'duga', + 'menduga-duga': 'duga', + 'menduga-duganya': 'duga', + 'mendugalkan': 'dugal', + 'mendugang': 'dugang', + 'mendugas': 'dugas', + 'berduka': 'duka', + 'berdukanya': 'duka', + 'kedukaan': 'duka', + 'kedukaannya': 'duka', + 'mendukai': 'duka', + 'mendukakan': 'duka', + 'pedukuhan': 'dukuh', + 'berdukun': 'dukun', + 'perdukunan': 'dukun', + 'perdukunannya': 'dukun', + 'pendukunan': 'dukun', + 'mendukunkan': 'dukun', + 'dukungan': 'dukung', + 'dukungannya': 'dukung', + 'dukunganlah': 'dukung', + 'dukunganan': 'dukung', + 'dukunganku': 'dukung', + 'dukunganmu': 'dukung', + 'mendukung': 'dukung', + 'mendukungnya': 'dukung', + 'mendukunglah': 'dukung', + 'mendukungi': 'dukung', + 'mendukungan': 'dukung', + 'mendukungku': 'dukung', + 'mendukungmu': 'dukung', + 'berdukung': 'dukung', + 'pendukung': 'dukung', + 'pendukungnya': 'dukung', + 'pendukungkan': 'dukung', + 'pendukungan': 'dukung', + 'pendukungku': 'dukung', + 'pendukungmu': 'dukung', + 'pendukungannya': 'dukung', + 'mendulag': 'dulag', + 'pendulang': 'dulang', + 'pendulangan': 'dulang', + 'mendulang': 'dulang', + 'dulang-dulang': 'dulang', + 'dulang-dulangan': 'dulang', + 'berduli': 'duli', + 'mengedumkan': 'dum', + 'mendungas': 'dungas', + 'kedunguan': 'dungu', + 'kedunguannya': 'dungu', + 'kedunguanku': 'dungu', + 'sedunia': 'dunia', + 'mendunia': 'dunia', + 'mendunianya': 'dunia', + 'menduniakan': 'dunia', + 'keduniaan': 'dunia', + 'keduniaannya': 'dunia', + 'keduniawian': 'duniawi', + 'keduniawiannya': 'duniawi', + 'mengedup': 'dup', + 'pedupaan': 'dupa', + 'mendupai': 'dupa', + 'mendupak': 'dupak', + 'berdurasi': 'durasi', + 'berdurasikan': 'durasi', + 'pendurhaka': 'durhaka', + 'pendurhakaan': 'durhaka', + 'berdurhaka': 'durhaka', + 'mendurhaka': 'durhaka', + 'mendurhakakan': 'durhaka', + 'mendurhakai': 'durhaka', + 'kedurjanaan': 'durjana', + 'berduru': 'duru', + 'berduru-duru': 'duru', + 'mendusin': 'dusin', + 'pedusunan': 'dusun', + 'kedutaan': 'duta', + 'kedutaannya': 'duta', + 'berduyun-duyun': 'duyun', + 'berduyun-duyunnya': 'duyun', + 'kedwiartian': 'dwiarti', + 'kedwibahasaan': 'dwibahasa', + 'berdwifungsi': 'dwifungsi', + 'mendwigandakan': 'dwiganda', + 'dwimingguan': 'dwiminggu', + 'kedwimukaan': 'dwimuka', + 'dwiperanan': 'dwiperan', + 'dieban': 'eban', + 'mengeban': 'eban', + 'ecek-ecek': 'ecek', + 'ecek-eceknya': 'ecek', + 'eceran': 'ecer', + 'ecerannya': 'ecer', + 'mengecer': 'ecer', + 'mengecernya': 'ecer', + 'mengecerkan': 'ecer', + 'pengecer': 'ecer', + 'pengecernya': 'ecer', + 'pengeceran': 'ecer', + 'keedanan': 'edan', + 'edan-edanan': 'edan', + 'edaran': 'edar', + 'edarannya': 'edar', + 'beredar': 'edar', + 'beredarnya': 'edar', + 'beredarlah': 'edar', + 'beredarkan': 'edar', + 'beredari': 'edar', + 'beredaran': 'edar', + 'mengedar': 'edar', + 'mengedarnya': 'edar', + 'mengedarkan': 'edar', + 'mengedarkannya': 'edar', + 'mengedari': 'edar', + 'pengedar': 'edar', + 'pengedarnya': 'edar', + 'pengedaran': 'edar', + 'peredaran': 'edar', + 'peredarannya': 'edar', + 'peredaranan': 'edar', + 'mengedarinya': 'edar', + 'mengedarian': 'edar', + 'memperedarkan': 'edar', + 'pengedit': 'edit', + 'pengeditan': 'edit', + 'mengedit': 'edit', + 'mengeditnya': 'edit', + 'mengeditkan': 'edit', + 'pengeditannya': 'edit', + 'keefektifan': 'efektif', + 'keefektifannya': 'efektif', + 'mengefektifkan': 'efektif', + 'mengefisienkan': 'efisien', + 'mengegah': 'egah', + 'mengegatkan': 'egat', + 'mengegol': 'egol', + 'mengegolkan': 'gol', + 'mengegos': 'egos', + 'mengegosi': 'egos', + 'mengegoskan': 'egos', + 'keegosentrisan': 'egosentris', + 'ejaan': 'eja', + 'ejaannya': 'eja', + 'mengeja': 'eja', + 'mengejanya': 'eja', + 'mengejakan': 'eja', + 'mengejakannya': 'eja', + 'pengejaan': 'eja', + 'pengejaannya': 'eja', + 'mengejan': 'kejan', + 'mengejan-ejan': 'ejan', + 'mengejawantah': 'ejawantah', + 'mengejawantahkan': 'ejawantah', + 'mengejawantahkannya': 'ejawantah', + 'pengejawantahan': 'ejawantah', + 'pengejawantahannya': 'ejawantah', + 'ejekan': 'ejek', + 'ejekannya': 'ejek', + 'mengejek': 'ejek', + 'mengejeknya': 'ejek', + 'mengejeklah': 'ejek', + 'mengejekku': 'ejek', + 'mengejekmu': 'ejek', + 'keekabahasaan': 'ekabahasa', + 'terekeh-ekeh': 'ekeh', + 'berekonomi': 'ekonomi', + 'berekonomian': 'ekonomi', + 'keekonomian': 'ekonomi', + 'keekonomiannya': 'ekonomi', + 'perekonomian': 'ekonomi', + 'perekonomiannya': 'ekonomi', + 'keekonomisan': 'ekonomis', + 'keekonomisannya': 'ekonomis', + 'berekor': 'ekor', + 'mengekor': 'ekor', + 'mengekornya': 'ekor', + 'mengekori': 'ekor', + 'pengekor': 'ekor', + 'pengekornya': 'ekor', + 'mengeksamen': 'eksamen', + 'keeksentrikan': 'eksentrik', + 'keeksentrikannya': 'eksentrik', + 'mengeksklusifkan': 'eksklusif', + 'mengeksklusifkannya': 'eksklusif', + 'berekskursi': 'ekskursi', + 'keeksotisan': 'eksotis', + 'keeksotisannya': 'eksotis', + 'berekspansi': 'ekspansi', + 'mengeksploitasi': 'eksploitasi', + 'mengeksploitasinya': 'eksploitasi', + 'mengeksploitasikan': 'eksploitasi', + 'pengeksploitasi': 'eksploitasi', + 'pengeksploitasian': 'eksploitasi', + 'mengeksplorasi': 'eksplorasi', + 'mengeksplorasinya': 'eksplorasi', + 'mengeksplorasikan': 'eksplorasi', + 'mengeksplorasikannya': 'eksplorasi', + 'pengekspor': 'ekspor', + 'pengekspornya': 'ekspor', + 'pengeksporan': 'ekspor', + 'mengekspor': 'ekspor', + 'mengekspornya': 'ekspor', + 'mengeksporkan': 'ekspor', + 'terekspos': 'ekspos', + 'tereksposnya': 'ekspos', + 'mengekspos': 'ekspos', + 'mengeksposnya': 'ekspos', + 'mengeksposmu': 'ekspos', + 'pengeksposan': 'ekspos', + 'mengekspresikan': 'ekspresi', + 'mengekspresikannya': 'ekspresi', + 'mengekstrak': 'ekstrak', + 'mengekstraknya': 'ekstrak', + 'mengekstraksi': 'ekstraksi', + 'mengekstraksinya': 'ekstraksi', + 'pengekstraksi': 'ekstraksi', + 'keekstreman': 'ekstrem', + 'mengelaborasi': 'elaborasi', + 'mengelaborasinya': 'elaborasi', + 'mengelaborasikan': 'elaborasi', + 'mengelaborasikannya': 'elaborasi', + 'mengelak': 'lak', + 'mengelaknya': 'lak', + 'mengelakkan': 'lak', + 'mengelakkannya': 'lak', + 'mengelaki': 'lak', + 'mengelakan': 'lak', + 'pengelakan': 'elak', + 'terelakkan': 'elak', + 'terelakkannya': 'elak', + 'keelastikan': 'elastik', + 'keelastisan': 'elastis', + 'keelastisannya': 'elastis', + 'keeleganan': 'elegan', + 'keeleganannya': 'elegan', + 'mengelektrifikasi': 'elektrifikasi', + 'mengeliminasi': 'eliminasi', + 'mengeliminasinya': 'eliminasi', + 'mengelite': 'elite', + 'seelok': 'elok', + 'keelokan': 'elok', + 'keelokannya': 'elok', + 'memperelok': 'elok', + 'mempereloknya': 'elok', + 'seelok-eloknya': 'elok', + 'mengelon': 'elon', + 'mengeloni': 'kelon', + 'mengelukan': 'elu', + 'mengelukannya': 'elu', + 'mengelu-elukan': 'elu', + 'mengelu-elukannya': 'elu', + 'elusan': 'elus', + 'mengelus': 'elus', + 'mengelusnya': 'elus', + 'mengeluskan': 'elus', + 'mengelus-elus': 'elus', + 'mengelus-elusnya': 'elus', + 'beremas': 'emas', + 'keemasan': 'emas', + 'keemasannya': 'emas', + 'peremasan': 'emas', + 'mengemat': 'emat', + 'mengemban': 'emban', + 'mengembannya': 'emban', + 'mengembankan': 'emban', + 'embaran': 'embar', + 'pengembara': 'embara', + 'pengembaraan': 'embara', + 'mengembara': 'embara', + 'mengembaranya': 'embara', + 'mengembarai': 'embara', + 'pengembaraannya': 'embara', + 'pengembaraanku': 'embara', + 'mengembargo': 'embargo', + 'mengembat': 'embat', + 'mengembatkan': 'embat', + 'mengembik': 'embik', + 'mengembol': 'kembol', + 'embuh-embuhan': 'embuh', + 'embusan': 'embus', + 'embusannya': 'embus', + 'berembus': 'embus', + 'berembusnya': 'embus', + 'pengembus': 'embus', + 'mengembus': 'embus', + 'mengembuskan': 'embus', + 'mengembuskannya': 'embus', + 'mengembut': 'embut', + 'terembut-embut': 'embut', + 'mengembut-embut': 'embut', + 'beremigrasi': 'emigrasi', + 'keemiratan': 'emirat', + 'pengemis': 'emis', + 'pengemisnya': 'emis', + 'pengemisi': 'emis', + 'pengemisan': 'emis', + 'mengemis': 'emis', + 'mengemisnya': 'emis', + 'mengemislah': 'emis', + 'mengemisi': 'emis', + 'mengemohi': 'emoh', + 'mengemol': 'emol', + 'paemong': 'emong', + 'mengemong': 'emong', + 'keemosian': 'emosi', + 'empangan': 'empang', + 'terempang': 'empang', + 'pengempang': 'empang', + 'pengempangan': 'empang', + 'mengempang': 'empang', + 'terempap': 'empap', + 'berempap': 'empap', + 'mengempap': 'empap', + 'mengempapkan': 'empap', + 'mengempar': 'empar', + 'mengemparkan': 'empar', + 'empasan': 'empas', + 'terempas': 'empas', + 'mengempas': 'empas', + 'mengempasnya': 'empas', + 'mengempaskan': 'empas', + 'mengempaskannya': 'empas', + 'terempas-empas': 'empas', + 'mengempas-empaskan': 'empas', + 'perempat': 'empat', + 'perempatnya': 'empat', + 'perempatlah': 'empat', + 'perempati': 'empat', + 'perempatan': 'empat', + 'berempat': 'empat', + 'berempati': 'empat', + 'perempatanan': 'empat', + 'seperempat': 'empat', + 'seperempatnya': 'empat', + 'seperempatan': 'empat', + 'memperempat': 'empat', + 'empat-empat': 'empat', + 'empat-empatnya': 'empat', + 'berempat-empat': 'empat', + 'keempat-empatnya': 'empat', + 'mengempat puluh hari': 'empat', + 'berempatilah': 'empati', + 'empek-empek': 'empek', + 'mengempenak': 'empenak', + 'emperan': 'emper', + 'empet-empetan': 'empet', + 'mengempik': 'empik', + 'mengemping': 'emping', + 'memperemping': 'emping', + 'mengempo': 'empo', + 'mengempoh': 'empoh', + 'keempohan': 'empoh', + 'mengempohi': 'empoh', + 'pengempohan': 'empoh', + 'empok-empok': 'empok', + 'emposan': 'empos', + 'mengempos': 'empos', + 'empot-empotan': 'empot', + 'mengempu': 'empu', + 'mengempukkan': 'empuk', + 'mengempul': 'empul', + 'mengempulkan': 'empul', + 'mengemut': 'kemut', + 'mengemutnya': 'kemut', + 'mengemuti': 'kemut', + 'terenak': 'enak', + 'keenakan': 'enak', + 'keenakannya': 'enak', + 'keenakanlah': 'enak', + 'enak-enak': 'enak', + 'enak-enaknya': 'enak', + 'enak-enakkan': 'enak', + 'enak-enakan': 'enak', + 'seenaknya': 'enak', + 'memperenak': 'enak', + 'mengenakkan': 'enak', + 'mengenakkannya': 'enak', + 'berenak-enak': 'enak', + 'berenam': 'enam', + 'mengenap': 'enap', + 'mengenapkan': 'enap', + 'mengenapi': 'enap', + 'mengenap-enapkan': 'enap', + 'mengenaskan': 'ngenas', + 'mengenaskannya': 'ngenas', + 'encal-encal': 'encal', + 'mengencang': 'encang', + 'mengencangnya': 'encang', + 'mengencangkan': 'kencang', + 'mengencangkannya': 'kencang', + 'berencel-encel': 'encel', + 'enceran': 'encer', + 'pengencer': 'encer', + 'pengenceran': 'encer', + 'pengencerannya': 'encer', + 'mengencerkan': 'encer', + 'mengencerkannya': 'encer', + 'mengendal': 'endal', + 'mengendalkan': 'endal', + 'mengendali': 'endal', + 'endapan': 'endap', + 'endapannya': 'endap', + 'mengendap': 'endap', + 'mengendapnya': 'endap', + 'mengendapkan': 'endap', + 'mengendapkannya': 'endap', + 'terendapkan': 'endap', + 'endap-endap': 'endap', + 'pengendapan': 'endap', + 'pengendapannya': 'endap', + 'mengendap-endap': 'endap', + 'endonan': 'endon', + 'mengendon': 'endon', + 'mengendonkan': 'endon', + 'mengendong': 'kendong', + 'mengendongnya': 'kendong', + 'mengendus': 'endus', + 'mengendusnya': 'endus', + 'mengenduskan': 'endus', + 'mengendusku': 'endus', + 'endut-endut': 'endut', + 'endut-endutan': 'endut', + 'mengenes': 'enes', + 'mengeneskan': 'enes', + 'engah-engah': 'engah', + 'terperengah': 'engah', + 'terengah-engah': 'engah', + 'keengganan': 'enggan', + 'keengganannya': 'enggan', + 'mengenggankan': 'enggan', + 'enggan-enggan': 'enggan', + 'berenggan-enggan': 'enggan', + 'mengengget': 'engget', + 'berenggil': 'enggil', + 'enggokan': 'enggok', + 'engkah-engkah': 'engkah', + 'mengengkang': 'engkang', + 'berengkau': 'engkau', + 'mengenjak': 'enjak', + 'mengenjak-enjak': 'enjak', + 'mengenjal': 'enjal', + 'mengenjut': 'enjut', + 'mengenjutkan': 'enjut', + 'mengenkripsi': 'enkripsi', + 'mengenkripsinya': 'enkripsi', + 'entah-berentah': 'entah', + 'pengentak': 'entak', + 'mengentak': 'entak', + 'mengentakkan': 'entak', + 'mengentak-entak': 'entak', + 'mengentak-entakkan': 'entak', + 'terentas': 'entas', + 'terentaskan': 'entas', + 'terentaskannya': 'entas', + 'mengentas': 'entas', + 'mengentaskan': 'entas', + 'mengentaskannya': 'entas', + 'mengentasi': 'entas', + 'mengentasan': 'entas', + 'pengentasan': 'entas', + 'pengentasannya': 'entas', + 'mengenten': 'enten', + 'enten-enten': 'enten', + 'mengentengkan': 'enteng', + 'mengentit': 'entit', + 'mengentot': 'entot', + 'mengenyahkan': 'enyah', + 'mengenyahkannya': 'enyah', + 'mengenyak': 'enyak', + 'terperenyak': 'perenyak', + 'mengenyakkan': 'enyak', + 'pengepak': 'pak', + 'pengepakkan': 'pak', + 'pengepakan': 'pak', + 'pengepakannya': 'pak', + 'mengeram': 'eram', + 'mengeramkan': 'eram', + 'mengerami': 'eram', + 'pengeram': 'eram', + 'pengeraman': 'eram', + 'mengeraminya': 'eram', + 'pengeramannya': 'eram', + 'erangan': 'erang', + 'erangannya': 'erang', + 'mengerang': 'erang', + 'mengeranglah': 'erang', + 'erang-erot': 'erang', + 'erat-erat': 'erat', + 'mempererat': 'erat', + 'mempereratnya': 'erat', + 'mengeratkan': 'erat', + 'mengeratkannya': 'erat', + 'pengereh': 'ereh', + 'mengereh': 'ereh', + 'berereksi': 'ereksi', + 'terereng': 'ereng', + 'mengereng': 'ereng', + 'ereng-ereng': 'ereng', + 'eretan': 'eret', + 'mengeret': 'eret', + 'pengeret': 'eret', + 'pengeretan': 'eret', + 'mengerik': 'kerik', + 'mengeriknya': 'kerik', + 'mengerikan': 'ngeri', + 'erong-erong': 'erong', + 'erotan': 'erot', + 'bererot': 'rerot', + 'bererotan': 'erot', + 'mengerotkan': 'erot', + 'mengerti': 'erti', + 'mengertinya': 'erti', + 'mengertilah': 'erti', + 'mengertikan': 'erti', + 'mengertii': 'erti', + 'mengertian': 'erti', + 'pengertian': 'erti', + 'pengertiannya': 'erti', + 'pengertianku': 'erti', + 'keesaan': 'esa', + 'mengesakan': 'kesak', + 'beresa-esaan': 'esa', + 'teresak': 'esak', + 'mengesak': 'kesak', + 'teresak-esak': 'esak', + 'beresok': 'esok', + 'keesokan': 'esok', + 'keesokannya': 'esok', + 'mengesokkan': 'esok', + 'mengesot-esot': 'esot', + 'mengetsa': 'etsa', + 'pengetsaan': 'etsa', + 'berevakuasi': 'evakuasi', + 'mengevakuasi': 'evakuasi', + 'mengevakuasinya': 'evakuasi', + 'mengevakuasikan': 'evakuasi', + 'mengevaluasi': 'evaluasi', + 'mengevaluasinya': 'evaluasi', + 'mengevaluasikan': 'evaluasi', + 'keevolusian': 'evolusi', + 'mengeyel': 'eyel', + 'memfaalkan': 'faal', + 'memfadihatkan': 'fadihat', + 'berfaedah': 'faedah', + 'berfaedahnya': 'faedah', + 'kefakiran': 'fakir', + 'kefanaan': 'fana', + 'memfanakan': 'fana', + 'kefanatikan': 'fanatik', + 'kefanatikannya': 'fanatik', + 'memfanatiki': 'fanatik', + 'berfantasi': 'fantasi', + 'berfantasinya': 'fantasi', + 'berfantasilah': 'fantasi', + 'memfantasikan': 'fantasi', + 'kefarmasian': 'farmasi', + 'memfasakh': 'fasakh', + 'kefasihan': 'fasih', + 'kefasihannya': 'fasih', + 'memperfasih': 'fasih', + 'memfasihkan': 'fasih', + 'kefasikan': 'fasik', + 'memfasilitasi': 'fasilitas', + 'memfasilitasinya': 'fasilitas', + 'memfasilitasikan': 'fasilitas', + 'memfasilitasiku': 'fasilitas', + 'berfatwa': 'fatwa', + 'memfatwakan': 'fatwa', + 'kefemininan': 'feminin', + 'kefemininannya': 'feminin', + 'memfestivalkan': 'festival', + 'memfiat': 'fiat', + 'perfilman': 'film', + 'perfilmannya': 'film', + 'memfilmkan': 'film', + 'memfilmkannya': 'film', + 'memfilter': 'filter', + 'memfilternya': 'filter', + 'berfirman': 'firman', + 'difirmankan': 'firman', + 'memfitnah': 'fitnah', + 'memfitnahnya': 'fitnah', + 'memfitnahkan': 'fitnah', + 'berfitrah': 'fitrah', + 'memfitrahkan': 'fitrah', + 'berfluktuasi': 'fluktuasi', + 'berfluktuasinya': 'fluktuasi', + 'terfokus': 'fokus', + 'terfokusnya': 'fokus', + 'terfokuskan': 'fokus', + 'memfokus': 'fokus', + 'memfokuskan': 'fokus', + 'memfokuskannya': 'fokus', + 'berfokus': 'fokus', + 'berfokuslah': 'fokus', + 'berfokuskan': 'fokus', + 'pemfokusan': 'fokus', + 'memformulasikan': 'formulasi', + 'memformulasikannya': 'formulasi', + 'memforsir': 'forsir', + 'memforsirnya': 'forsir', + 'memfosil': 'fosil', + 'pemfosilan': 'fosil', + 'berfoto': 'foto', + 'berfotonya': 'foto', + 'berfotolah': 'foto', + 'berfotokan': 'foto', + 'memfotokopi': 'fotokopi', + 'memfotokopinya': 'fotokopi', + 'berfoya-foya': 'foya', + 'kefrustrasian': 'frustrasi', + 'berfusi': 'fusi', + 'memfusikan': 'fusi', + 'menggaba-gabai': 'gaba-gaba', + 'menggabai': 'gabai', + 'menggabaikan': 'gabai', + 'gabai-gabai': 'gabai', + 'menggabak': 'gabak', + 'tergabas': 'gabas', + 'menggabas': 'gabas', + 'menggabrukkan': 'gabruk', + 'gabungan': 'gabung', + 'gabungannya': 'gabung', + 'segabung': 'gabung', + 'bergabung': 'gabung', + 'bergabungnya': 'gabung', + 'bergabunglah': 'gabung', + 'bergabungkan': 'gabung', + 'bergabungan': 'gabung', + 'tergabung': 'gabung', + 'tergabungnya': 'gabung', + 'tergabungan': 'gabung', + 'menggabung': 'gabung', + 'menggabungnya': 'gabung', + 'menggabungkan': 'gabung', + 'menggabungkannya': 'gabung', + 'menggabungan': 'gabung', + 'pergabungan': 'gabung', + 'penggabungan': 'gabung', + 'penggabungannya': 'gabung', + 'ketergabungan': 'gabung', + 'ketergabungannya': 'gabung', + 'menggabungkankan': 'gabung', + 'penggabus': 'gabus', + 'menggabus': 'gabus', + 'gacoan': 'gaco', + 'gacoannya': 'gaco', + 'menggacok': 'gacok', + 'penggada': 'gada', + 'penggadaan': 'gada', + 'menggada': 'gada', + 'menggadakan': 'gada', + 'menggadakannya': 'gada', + 'bergadang': 'gadang', + 'menggadang': 'gadang', + 'menggadangkan': 'gadang', + 'bergading': 'gading', + 'menggading': 'gading', + 'menggadis': 'gadis', + 'kegadisan': 'gadis', + 'kegadisannya': 'gadis', + 'kegadis-gadisan': 'gadis', + 'menggado': 'gado', + 'bergaduk': 'gaduk', + 'menggaduk': 'gaduk', + 'menggaduki': 'gaduk', + 'menggaet': 'gaet', + 'menggaetnya': 'gaet', + 'menggaetkan': 'gaet', + 'menggaetku': 'gaet', + 'kegagahan': 'gagah', + 'kegagahannya': 'gagah', + 'menggagah': 'gagah', + 'menggagahi': 'gagah', + 'menggagahinya': 'gagah', + 'menggagahkan': 'gagah', + 'bergagah-gagahan': 'gagah', + 'menggagai': 'gagai', + 'penggagal': 'gagal', + 'penggagalan': 'gagal', + 'kegagalan': 'gagal', + 'kegagalannya': 'gagal', + 'kegagalanlah': 'gagal', + 'kegagalanan': 'gagal', + 'kegagalanku': 'gagal', + 'kegagalanmu': 'gagal', + 'menggagalkan': 'gagal', + 'menggagalkannya': 'gagal', + 'menggagap': 'gagap', + 'menggagapnya': 'gagap', + 'tergagap-gagap': 'gagap', + 'bergagap-gagap': 'gagap', + 'gagasan': 'gagas', + 'gagasannya': 'gagas', + 'gagasanmu': 'gagas', + 'menggagas': 'gagas', + 'menggagasnya': 'gagas', + 'menggagaskan': 'gagas', + 'penggagas': 'gagas', + 'penggagasnya': 'gagas', + 'penggagasan': 'gagas', + 'tergagau': 'gagau', + 'menggagau': 'gagau', + 'bergagau-gagau': 'gagau', + 'tergagau-gagau': 'gagau', + 'tergaguk-gaguk': 'gaguk', + 'menggaham': 'gaham', + 'menggahar': 'gahar', + 'menggaib': 'gaib', + 'kegaiban': 'gaib', + 'gail-gail': 'gail', + 'bergairah': 'gairah', + 'bergairahnya': 'gairah', + 'bergairahlah': 'gairah', + 'kegairahan': 'gairah', + 'kegairahannya': 'gairah', + 'menggairahkan': 'gairah', + 'menggairahkannya': 'gairah', + 'gaitan': 'gait', + 'menggait': 'gait', + 'penggait': 'gait', + 'menggajah': 'gajah', + 'gajah-gajahan': 'gajah', + 'gajian': 'gaji', + 'gajiannya': 'gaji', + 'menggaji': 'gaji', + 'menggajinya': 'gaji', + 'menggajiku': 'gaji', + 'penggajian': 'gaji', + 'penggajiannya': 'gaji', + 'bergajul': 'gajul', + 'bergala': 'gala', + 'gala-gala': 'gala', + 'bergalah': 'galah', + 'sepenggalah': 'galah', + 'menggalahkan': 'galah', + 'penggalak': 'galak', + 'penggalakkan': 'galak', + 'penggalakan': 'galak', + 'kegalakan': 'galak', + 'kegalakannya': 'galak', + 'menggalak': 'galak', + 'menggalakkan': 'galak', + 'menggalakkannya': 'galak', + 'menggalakan': 'galak', + 'galangan': 'galang', + 'galangannya': 'galang', + 'tergalang': 'galang', + 'bergalang': 'galang', + 'bergalangan': 'galang', + 'menggalang': 'galang', + 'menggalangnya': 'galang', + 'menggalangkan': 'galang', + 'menggalangi': 'galang', + 'menggalangan': 'galang', + 'penggalang': 'galang', + 'penggalangan': 'galang', + 'penggalangannya': 'galang', + 'penggalas': 'galas', + 'menggalas': 'galas', + 'penggalasan': 'galas', + 'bergalat': 'galat', + 'bergalau': 'galau', + 'kegalauan': 'galau', + 'kegalauannya': 'galau', + 'galengan': 'galeng', + 'galian': 'gali', + 'galiannya': 'gali', + 'galiani': 'gali', + 'penggali': 'gali', + 'penggalinya': 'gali', + 'penggalian': 'gali', + 'menggali': 'gali', + 'menggalinya': 'gali', + 'menggalikan': 'gali', + 'penggaliannya': 'gali', + 'gali-galian': 'gali', + 'menggali-gali': 'gali', + 'kegaliban': 'galib', + 'menggalibkan': 'galib', + 'menggalurkan': 'galur', + 'bergalur-galur': 'galur', + 'menggalur-galur': 'galur', + 'tergamak': 'gamak', + 'gamak-gamak': 'gamak', + 'menggamak-gamak': 'gamak', + 'tergamang': 'gamang', + 'penggamang': 'gamang', + 'bergamat': 'gamat', + 'menggamat': 'gamat', + 'kegamblangan': 'gamblang', + 'bergambuh': 'gambuh', + 'menggamik': 'gamik', + 'gamitan': 'gamit', + 'bergamit': 'gamit', + 'menggamit': 'gamit', + 'bergamitan': 'gamit', + 'gamit-gamitan': 'gamit', + 'menggamit-gamitkan': 'gamit', + 'gampangan': 'gampang', + 'gampangannya': 'gampang', + 'menggampangkan': 'gampang', + 'gampang-gampangan': 'gampang', + 'tergampar': 'gampar', + 'menggampar': 'gampar', + 'menggamparku': 'gampar', + 'ganal-ganal': 'ganal', + 'keganasan': 'ganas', + 'keganasannya': 'ganas', + 'mengganas': 'ganas', + 'mengganasnya': 'ganas', + 'pengganas': 'ganas', + 'gancaran': 'gancar', + 'menggancu': 'gancu', + 'gandalan': 'gandal', + 'penggandal': 'gandal', + 'gandaran': 'gandar', + 'penggandar': 'gandar', + 'menggandar': 'gandar', + 'gandengan': 'gandeng', + 'gandengannya': 'gandeng', + 'bergandeng': 'gandeng', + 'bergandengnya': 'gandeng', + 'bergandengan': 'gandeng', + 'menggandeng': 'gandeng', + 'menggandengnya': 'gandeng', + 'menggandengkan': 'gandeng', + 'menggandengkannya': 'gandeng', + 'menggandengan': 'gandeng', + 'pergandengan': 'gandeng', + 'penggandengan': 'gandeng', + 'mempergandengkan': 'gandeng', + 'kegandrungan': 'gandrung', + 'kegandrungannya': 'gandrung', + 'menggandrungi': 'gandrung', + 'menggandrunginya': 'gandrung', + 'menggandrungiku': 'gandrung', + 'menggandrungkan': 'gandrung', + 'berganduh': 'ganduh', + 'memperganduhkan': 'ganduh', + 'memperganduh-ganduhkan': 'ganduh', + 'gandulan': 'gandul', + 'menggandul': 'gandul', + 'mengganduli': 'gandul', + 'bergandung': 'gandung', + 'menggandung': 'gandung', + 'berganggang': 'ganggang', + 'mengganggang': 'ganggang', + 'mengganggangkan': 'ganggang', + 'mengganggu gugat': 'ganggu gugat', + 'gangguan': 'ganggu', + 'gangguannya': 'ganggu', + 'gangguanlah': 'ganggu', + 'terganggu': 'ganggu', + 'terganggunya': 'ganggu', + 'terganggulah': 'ganggu', + 'terganggukan': 'ganggu', + 'terganggui': 'ganggu', + 'mengganggu': 'ganggu', + 'mengganggunya': 'ganggu', + 'mengganggulah': 'ganggu', + 'mengganggui': 'ganggu', + 'menggangguan': 'ganggu', + 'menggangguku': 'ganggu', + 'mengganggumu': 'ganggu', + 'pengganggu': 'ganggu', + 'pengganggunya': 'ganggu', + 'penggangguan': 'ganggu', + 'mengganggut': 'ganggut', + 'pegangsaan': 'gangsa', + 'menggangsi': 'gangsi', + 'gangsiran': 'gangsir', + 'menggangsir': 'gangsir', + 'penggangsir': 'gangsir', + 'penggangsiran': 'gangsir', + 'ganjalan': 'ganjal', + 'ganjalannya': 'ganjal', + 'berganjal': 'ganjal', + 'terganjal': 'ganjal', + 'terganjalnya': 'ganjal', + 'pengganjal': 'ganjal', + 'pengganjalnya': 'ganjal', + 'pengganjalan': 'ganjal', + 'mengganjal': 'ganjal', + 'mengganjalnya': 'ganjal', + 'mengganjali': 'ganjal', + 'ganjal-mengganjal': 'ganjal', + 'ganjaran': 'ganjar', + 'ganjarannya': 'ganjar', + 'ganjaranmu': 'ganjar', + 'ganjaran-mu': 'ganjar', + 'mengganjar': 'ganjar', + 'mengganjarnya': 'ganjar', + 'mengganjari': 'ganjar', + 'mengganjarkan': 'ganjar', + 'mengganjil': 'ganjil', + 'mengganjilkan': 'ganjil', + 'keganjilan': 'ganjil', + 'keganjilannya': 'ganjil', + 'berganjur': 'ganjur', + 'mengganjur': 'ganjur', + 'mengganjuri': 'ganjur', + 'berganjur-ganjur': 'ganjur', + 'segantang': 'gantang', + 'menggantang': 'gantang', + 'gantelan': 'gantel', + 'menggantelkan': 'gantel', + 'menggantih': 'gantih', + 'menggantol': 'gantol', + 'mengganyah': 'ganyah', + 'mengganyang': 'ganyang', + 'mengganyangnya': 'ganyang', + 'menggaok': 'gaok', + 'kegapahan': 'gapah', + 'tergapai': 'gapai', + 'menggapai': 'gapai', + 'menggapainya': 'gapai', + 'menggapaikan': 'gapai', + 'bergapaian': 'gapai', + 'tergapai-gapai': 'gapai', + 'menggapai-gapai': 'gapai', + 'menggapai-gapaikan': 'gapai', + 'menggapil': 'gapil', + 'menggapit': 'gapit', + 'gaplokan': 'gaplok', + 'menggaplok': 'gaplok', + 'menggaploki': 'gaplok', + 'bergarah': 'garah', + 'menggarah': 'garah', + 'menggarahkan': 'garah', + 'garah-garah': 'garah', + 'bergarah-garah': 'garah', + 'mempergarahkan': 'garah', + 'bergaram': 'garam', + 'menggaram': 'garam', + 'menggarami': 'garam', + 'pegaraman': 'garam', + 'menggaraminya': 'garam', + 'penggaraman': 'garam', + 'menggaramkan': 'garam', + 'garangan': 'garang', + 'menggarang': 'garang', + 'menggarangi': 'garang', + 'penggarang': 'garang', + 'kegarangan': 'garang', + 'kegarangannya': 'garang', + 'menggarangkan': 'garang', + 'bergaransi': 'garansi', + 'bergaransinya': 'garansi', + 'garapan': 'garap', + 'garapannya': 'garap', + 'tergarap': 'garap', + 'tergarapnya': 'garap', + 'menggarap': 'garap', + 'menggarapnya': 'garap', + 'menggarapkan': 'garap', + 'penggarap': 'garap', + 'penggarapnya': 'garap', + 'penggarapan': 'garap', + 'penggarapannya': 'garap', + 'bergarau': 'garau', + 'menggari': 'gari', + 'menggarisbawahi': 'garis bawah', + 'menggarisbawahinya': 'garis bawah', + 'segaris': 'garis', + 'bergaris': 'garis', + 'menggaris': 'garis', + 'menggariskan': 'garis', + 'menggarisi': 'garis', + 'penggaris': 'garis', + 'penggarisan': 'garis', + 'garitan': 'garit', + 'menggarit': 'garit', + 'menggaritkan': 'garit', + 'penggarong': 'garong', + 'penggarongan': 'garong', + 'menggarong': 'garong', + 'penggaru': 'garu', + 'penggarukan': 'garu', + 'penggaruan': 'garu', + 'menggaru': 'garu', + 'garukan': 'garuk', + 'garukannya': 'garuk', + 'tergaruk': 'garuk', + 'menggaruk': 'garuk', + 'menggaruknya': 'garuk', + 'menggarukkan': 'garuk', + 'menggaruki': 'garuk', + 'penggaruk': 'garuk', + 'bergaruk-garuk': 'garuk', + 'menggaruk-garuk': 'garuk', + 'menggaruk-garukkan': 'garuk', + 'menggaruk-garukan': 'garuk', + 'menggarung': 'garung', + 'menggarut': 'garut', + 'menggasab': 'gasab', + 'gasakan': 'gasak', + 'menggasak': 'gasak', + 'menggasaknya': 'gasak', + 'menggasakan': 'gasak', + 'menggasakkan': 'gasak', + 'gasak-gasakan': 'gasak', + 'bergasing': 'gasing', + 'kegatalan': 'gatal', + 'menggatalkan': 'gatal', + 'menggatra': 'gatra', + 'bergaun': 'gaun', + 'pegawai': 'gawai', + 'pegawainya': 'gawai', + 'pegawaian': 'gawai', + 'pegawaiku': 'gawai', + 'pegawaimu': 'gawai', + 'gawangan': 'gawang', + 'gawar-gawar': 'gawar', + 'gawatan': 'gawat', + 'kegawatan': 'gawat', + 'kegawatannya': 'gawat', + 'menggawat': 'gawat', + 'menggawatkan': 'gawat', + 'bergayuh': 'gayuh', + 'menggayuh': 'gayuh', + 'menggayuk': 'gayuk', + 'menggayun': 'gayun', + 'bergayung': 'gayung', + 'menggayung': 'gayung', + 'menggebah': 'gebah', + 'gebaran': 'gebar', + 'menggeblak': 'geblak', + 'geblokan': 'geblok', + 'segeblok': 'geblok', + 'menggebok': 'gebok', + 'menggebos': 'gebos', + 'menggebosi': 'gebos', + 'menggebot': 'gebot', + 'gebrakan': 'gebrak', + 'gebrakannya': 'gebrak', + 'menggebrak': 'gebrak', + 'menggebu': 'gebu', + 'menggebunya': 'gebu', + 'menggebu-gebu': 'gebu', + 'menggebu-gebunya': 'gebu', + 'gebukan': 'gebuk', + 'menggebuk': 'gebuk', + 'menggebuki': 'gebuk', + 'menggebukinya': 'gebuk', + 'menggebyah-uyah': 'gebyah-uyah', + 'gebyar-gebyar': 'gebyar', + 'gebyuran': 'gebyur', + 'menggebyur': 'gebyur', + 'menggecarkan': 'gecar', + 'menggecek': 'gecek', + 'gedean': 'gede', + 'penggede': 'gede', + 'gedokan': 'gedok', + 'gedongan': 'gedong', + 'gedoran': 'gedor', + 'tergedor': 'gedor', + 'penggedor': 'gedor', + 'penggedornya': 'gedor', + 'penggedoran': 'gedor', + 'menggedor': 'gedor', + 'menggedornya': 'gedor', + 'bergeduyut': 'geduyut', + 'tergegap-gegap': 'gegap', + 'tergegau': 'gegau', + 'kegegeran': 'geger', + 'menggeger': 'geger', + 'menggegerkan': 'geger', + 'menggejala': 'gejala', + 'menggejalanya': 'gejala', + 'menggejos': 'gejos', + 'menggejoskan': 'gejos', + 'menggejuju': 'gejuju', + 'menggelabur': 'gelabur', + 'menggeladrah': 'geladrah', + 'gelagapan': 'gelagap', + 'bergelagar': 'gelagar', + 'bergelagaran': 'gelagar', + 'tergelak': 'gelak', + 'menggelakkan': 'gelak', + 'tergelak-gelak': 'gelak', + 'menggelalar': 'gelalar', + 'menggelamai': 'gelamai', + 'bergelambir': 'gelambir', + 'bergelambirku': 'gelambir', + 'gelandangan': 'gelandang', + 'menggelandang': 'gelandang', + 'menggelandangnya': 'gelandang', + 'menggelandangan': 'gelandang', + 'bergelandangan': 'gelandang', + 'menggelandoti': 'gelandot', + 'pergelangan': 'gelang', + 'pergelangannya': 'gelang', + 'pergelanganan': 'gelang', + 'gelang-gelang': 'gelang', + 'tergelang-gelang': 'gelang', + 'bergelang-gelang': 'gelang', + 'bergelanggang': 'gelanggang', + 'menggelanggang': 'gelanggang', + 'tergelangsar': 'gelangsar', + 'menggelangsar': 'gelangsar', + 'menggelantang': 'gelantang', + 'menggelanting': 'gelanting', + 'bergelantung': 'gelantung', + 'bergelantungan': 'gelantung', + 'menggelantung': 'gelantung', + 'menggelantungkan': 'gelantung', + 'menggelap': 'gelap', + 'menggelapnya': 'gelap', + 'menggelapkan': 'gelap', + 'menggelapkannya': 'gelap', + 'menggelapan': 'gelap', + 'kegelapan': 'gelap', + 'kegelapannya': 'gelap', + 'penggelapan': 'gelap', + 'penggelapannya': 'gelap', + 'penggelapanlah': 'gelap', + 'penggelapanan': 'gelap', + 'gelap-gelapan': 'gelap', + 'bergelap-gelap': 'gelap', + 'bergelap-gelapan': 'gelap', + 'kegelap-gelapan': 'gelap', + 'gelasan': 'gelas', + 'menggelas': 'gelas', + 'bergelas-gelasan': 'gelas', + 'menggelasir': 'gelasir', + 'menggelatak': 'gelatak', + 'menggelatuk': 'gelatuk', + 'bergelayangan': 'gelayangan', + 'gelayaran': 'gelayar', + 'bergelayut': 'gelayut', + 'bergelayutan': 'gelayut', + 'tergelebar': 'gelebar', + 'menggeleber': 'geleber', + 'bergeleberan': 'geleber', + 'tergelecik': 'gelecik', + 'menggelecik': 'gelecik', + 'menggeledah': 'geledah', + 'menggeledahnya': 'geledah', + 'menggeledahkan': 'geledah', + 'menggeledahi': 'geledah', + 'menggeledahan': 'geledah', + 'menggeledahku': 'geledah', + 'penggeledahan': 'geledah', + 'penggeledahannya': 'geledah', + 'menggeledang': 'geledang', + 'menggeledek': 'geledek', + 'menggeleding': 'geleding', + 'menggeledur': 'geledur', + 'bergelegak': 'gelegak', + 'menggelegak': 'gelegak', + 'menggelegakkan': 'gelegak', + 'bergelegar': 'gelegar', + 'menggelegar': 'gelegar', + 'menggelegarnya': 'gelegar', + 'menggelegarkan': 'gelegar', + 'menggelek': 'gelek', + 'menggelekkan': 'gelek', + 'menggelekak': 'gelekak', + 'menggelekek': 'gelekek', + 'bergelembung': 'gelembung', + 'menggelembung': 'gelembung', + 'menggelembungnya': 'gelembung', + 'menggelembungkan': 'gelembung', + 'menggelembungan': 'gelembung', + 'gelembung-gelembungan': 'gelembung', + 'menggelembur': 'gelembur', + 'bergelemprang': 'gelemprang', + 'tergelenang': 'gelenang', + 'menggelendong': 'gelendong', + 'bergelendot': 'gelendot', + 'menggelendot': 'gelendot', + 'bergelendotan': 'gelendot', + 'bergeleng': 'geleng', + 'menggeleng': 'geleng', + 'menggelengkan': 'geleng', + 'bergeleng-geleng': 'geleng', + 'tergeleng-geleng': 'geleng', + 'menggeleng-gelengkan': 'geleng', + 'menggelenting': 'gelenting', + 'menggelenyar': 'gelenyar', + 'menggelepai': 'gelepai', + 'menggelepar': 'gelepar', + 'bergeleparan': 'gelepar', + 'menggelepar-gelepar': 'gelepar', + 'menggelepar-geleparkan': 'gelepar', + 'menggelepek': 'gelepek', + 'menggelepur': 'gelepur', + 'menggeleser': 'geleser', + 'menggeleserkan': 'geleser', + 'menggelesot': 'gelesot', + 'tergeletak': 'geletak', + 'tergeletaknya': 'geletak', + 'menggeletak': 'geletak', + 'menggeletakkan': 'geletak', + 'menggeletakkannya': 'geletak', + 'menggeletakan': 'geletak', + 'menggeletar': 'geletar', + 'menggeletarkan': 'geletar', + 'menggeletik': 'geletik', + 'menggeletis': 'geletis', + 'gemeletuk': 'geletuk', + 'menggeletuk': 'geletuk', + 'kegelian': 'geli', + 'kegeliannya': 'geli', + 'penggeli': 'geli', + 'menggeli': 'geli', + 'menggelikan': 'geli', + 'menggelikannya': 'geli', + 'geli-geli': 'geli', + 'menggeliang': 'geliang', + 'geliang-geliut': 'geliang', + 'menggeliang-geliutkan': 'geliang', + 'tergeliat': 'geliat', + 'menggeliat': 'geliat', + 'menggeliatnya': 'geliat', + 'menggeliatkan': 'geliat', + 'geliat-geliut': 'geliat', + 'menggelibir': 'gelibir', + 'tergelicik': 'gelicik', + 'menggelicikkan': 'gelicik', + 'menggeligi': 'geligi', + 'menggeligis': 'geligis', + 'menggeligit': 'geligit', + 'bergelimang': 'gelimang', + 'bergelimangnya': 'gelimang', + 'bergelimangan': 'gelimang', + 'menggelimangi': 'gelimang', + 'menggelimantang': 'gelimantang', + 'gelimbiran': 'gelimbir', + 'bergelimun': 'gelimun', + 'menggelimuni': 'gelimun', + 'tergelincir': 'gelincir', + 'tergelincirnya': 'gelincir', + 'tergelinciri': 'gelincir', + 'menggelincir': 'gelincir', + 'menggelincirkan': 'gelincir', + 'tergelincuh': 'gelincuh', + 'gelindingan': 'gelinding', + 'menggelinding': 'gelinding', + 'menggelindingnya': 'gelinding', + 'menggelindingkan': 'gelinding', + 'menggelindingkannya': 'gelinding', + 'bergelindingan': 'gelinding', + 'menggelinding-gelinding': 'gelinding', + 'bergelingsir': 'gelingsir', + 'tergelingsir': 'gelingsir', + 'menggelingsir': 'gelingsir', + 'menggelinjang': 'gelinjang', + 'tergelintang': 'gelintang', + 'menggelintar': 'gelintar', + 'bergelintin': 'gelintin', + 'menggelinting': 'gelinting', + 'gelintiran': 'gelintir', + 'segelintir': 'gelintir', + 'segelintirnya': 'gelintir', + 'segelintiran': 'gelintir', + 'kegelisahan': 'gelisah', + 'kegelisahannya': 'gelisah', + 'kegelisahanku': 'gelisah', + 'menggelisahi': 'gelisah', + 'menggelisahkan': 'gelisah', + 'kegelitaan': 'gelita', + 'menggelitar': 'gelitar', + 'gelitikan': 'gelitik', + 'tergelitik': 'gelitik', + 'tergelitiklah': 'gelitik', + 'menggelitik': 'gelitik', + 'menggelitiknya': 'gelitik', + 'menggelitikkan': 'gelitik', + 'menggelitiki': 'gelitik', + 'menggelitikku': 'gelitik', + 'menggelobok': 'gelobok', + 'menggelodar': 'gelodar', + 'menggelogok': 'gelogok', + 'tergelohok': 'gelohok', + 'menggelompar': 'gelompar', + 'gelondongan': 'gelondong', + 'gelondongannya': 'gelondong', + 'bergelonggong': 'gelonggong', + 'menggelongsor': 'gelongsor', + 'menggelontor': 'gelontor', + 'menggelontornya': 'gelontor', + 'menggelontorkan': 'gelontor', + 'menggelontorkannya': 'gelontor', + 'menggelontori': 'gelontor', + 'menggelontoran': 'gelontor', + 'penggelontoran': 'gelontor', + 'penggelontorannya': 'gelontor', + 'menggelopak': 'gelopak', + 'menggelosang': 'gelosang', + 'menggeloso': 'geloso', + 'menggelosok': 'gelosok', + 'menggelotak': 'gelotak', + 'bergelugut': 'gelugut', + 'menggelugut': 'gelugut', + 'menggelulur': 'gelulur', + 'tergeluncur': 'geluncur', + 'menggelundung': 'gelundung', + 'bergelundungan': 'gelundung', + 'menggelundungkan': 'gelundung', + 'menggelup': 'gelup', + 'menggelupur': 'gelupur', + 'menggemak': 'gemak', + 'menggemak-gemak': 'gemak', + 'segemal': 'gemal', + 'menggemal': 'gemal', + 'bergemal-gemal': 'gemal', + 'penggemang': 'gemang', + 'tergemap': 'gemap', + 'bergemar': 'gemar', + 'penggemar': 'gemar', + 'penggemarnya': 'gemar', + 'penggemarlah': 'gemar', + 'penggemarku': 'gemar', + 'penggemarmu': 'gemar', + 'kegemaran': 'gemar', + 'kegemarannya': 'gemar', + 'kegemaranku': 'gemar', + 'menggemari': 'gemar', + 'menggemarinya': 'gemar', + 'menggemarii': 'gemar', + 'menggemarkan': 'gemar', + 'kegemasan': 'gemas', + 'menggemaskan': 'gemas', + 'menggemaskannya': 'gemas', + 'penggembala': 'gembala', + 'penggembalanya': 'gembala', + 'penggembalaan': 'gembala', + 'penggembalaannya': 'gembala', + 'menggembalakan': 'gembala', + 'menggembalakannya': 'gembala', + 'bergembar-gembor': 'gembar-gembor', + 'penggembar-gemboran': 'gembar-gembor', + 'menggembar-gemborkan': 'gembar-gembor', + 'menggembar-gemborkannya': 'gembar-gembor', + 'tergembleng': 'gembleng', + 'bergembleng': 'gembleng', + 'penggemblengan': 'gembleng', + 'bergembok': 'gembok', + 'tergembok': 'gembok', + 'menggembok': 'gembok', + 'menggemboknya': 'gembok', + 'menggembokkannya': 'gembok', + 'menggembokan': 'gembok', + 'penggembok': 'gembok', + 'penggembokan': 'gembok', + 'menggembol': 'gembol', + 'menggembos': 'gembos', + 'menggemboskan': 'gembos', + 'menggembosi': 'gembos', + 'penggembosan': 'gembos', + 'bergembung': 'gembung', + 'penggembungan': 'gembung', + 'menggembungkan': 'gembung', + 'menggemburkan': 'gembur', + 'gembusan': 'gembus', + 'menggembut': 'gembut', + 'bergembut-gembut': 'gembut', + 'menggemeretakkan': 'gemeretak', + 'menggemeretakkannya': 'gemeretak', + 'gemerlapan': 'gemerlap', + 'gemerlapannya': 'gemerlap', + 'menggemik': 'gemik', + 'kegemilangan': 'gemilang', + 'kegemilangannya': 'gemilang', + 'tergeming': 'geming', + 'bergeming': 'geming', + 'bergemingnya': 'geming', + 'bergempa': 'gempa', + 'menggempakan': 'gempa', + 'kegemparan': 'gempar', + 'kegemparannya': 'gempar', + 'menggemparkan': 'gempar', + 'menggempita': 'gempita', + 'penggempur': 'gempur', + 'penggempurnya': 'gempur', + 'penggempuran': 'gempur', + 'menggempur': 'gempur', + 'menggempurnya': 'gempur', + 'menggempurkan': 'gempur', + 'menggempuri': 'gempur', + 'penggempurannya': 'gempur', + 'gempur-menggempur': 'gempur', + 'penggemuk': 'gemuk', + 'penggemukkan': 'gemuk', + 'penggemukan': 'gemuk', + 'kegemukan': 'gemuk', + 'kegemukannya': 'gemuk', + 'kegemukanku': 'gemuk', + 'penggemukannya': 'gemuk', + 'menggemukkan': 'gemuk', + 'menggemukkannya': 'gemuk', + 'menggemulai': 'gemulai', + 'segenap': 'genap', + 'penggenap': 'genap', + 'penggenapan': 'genap', + 'kegenapan': 'genap', + 'menggenapi': 'genap', + 'menggenapinya': 'genap', + 'menggenapkan': 'genap', + 'menggenapkannya': 'genap', + 'menggencar': 'gencar', + 'menggencarkan': 'gencar', + 'menggencarkannya': 'gencar', + 'gencatan': 'gencat', + 'menggencat': 'gencat', + 'gencetan': 'gencet', + 'tergencet': 'gencet', + 'tergencetnya': 'gencet', + 'menggencet': 'gencet', + 'menggencetnya': 'gencet', + 'bergendak': 'gendak', + 'bergendakan': 'gendak', + 'menggendaki': 'gendak', + 'menggendalakan': 'gendala', + 'gendaman': 'gendam', + 'gendongan': 'gendong', + 'gendongannya': 'gendong', + 'gendonganku': 'gendong', + 'menggendong': 'gendong', + 'menggendongnya': 'gendong', + 'menggendongkan': 'gendong', + 'menggendongku': 'gendong', + 'kegendutan': 'gendut', + 'menggendut': 'gendut', + 'menggendutkan': 'gendut', + 'menggenduti': 'gendut', + 'menggeneralisasi': 'generalisasi', + 'menggeneralisasinya': 'generalisasi', + 'menggeneralisasikan': 'generalisasi', + 'menggeneralisasikannya': 'generalisasi', + 'genggaman': 'genggam', + 'genggamannya': 'genggam', + 'genggamanku': 'genggam', + 'genggamanmu': 'genggam', + 'segenggam': 'genggam', + 'segenggaman': 'genggam', + 'tergenggam': 'genggam', + 'bergenggam': 'genggam', + 'bergenggaman': 'genggam', + 'menggenggam': 'genggam', + 'menggenggamnya': 'genggam', + 'menggenggamkan': 'genggam', + 'bergengsi': 'gengsi', + 'bergengsinya': 'gengsi', + 'bergengsii': 'gengsi', + 'bergengsimu': 'gengsi', + 'gengsi-gengsian': 'gengsi', + 'kegenialan': 'genial', + 'genjotan': 'genjot', + 'penggenjot': 'genjot', + 'penggenjotan': 'genjot', + 'menggenjot': 'genjot', + 'menggenjotnya': 'genjot', + 'genjot-genjotan': 'genjot', + 'genjrang-genjreng': 'genjrang', + 'bergenre': 'genre', + 'menggenta': 'genta', + 'bergentar': 'gentar', + 'menggentar': 'gentar', + 'menggentarkan': 'gentar', + 'menggentarkannya': 'gentar', + 'kegentaran': 'gentar', + 'penggentar': 'gentar', + 'penggentaran': 'gentar', + 'menggentari': 'gentar', + 'menggentas': 'gentas', + 'gentayangan': 'gentayang', + 'gentayangannya': 'gentayang', + 'bergentayangan': 'gentayangan', + 'bergentayangannya': 'gentayangan', + 'menggentel': 'gentel', + 'menggenteli': 'gentel', + 'kegentingan': 'genting', + 'kegentingannya': 'genting', + 'menggenting': 'genting', + 'penggentingan': 'genting', + 'menggentingkan': 'genting', + 'gentusan': 'gentus', + 'menggepit': 'gepit', + 'segepok': 'gepok', + 'gepokan': 'gepok', + 'bergepok-gepok': 'gepok', + 'menggeprak': 'geprak', + 'menggera': 'gera', + 'menggerakan': 'gera', + 'menggerakannya': 'gera', + 'menggerai': 'gera', + 'penggera': 'gera', + 'menggerabak': 'gerabak', + 'menggerabakkan': 'gerabak', + 'gerabak-gerubuk': 'gerabak', + 'menggeragai': 'geragai', + 'geragapan': 'geragap', + 'menggeragap': 'geragap', + 'menggeragas': 'geragas', + 'menggeragau': 'geragau', + 'kegerahan': 'gerah', + 'kegerahannya': 'gerah', + 'kegerahanku': 'gerah', + 'tergerai': 'gerai', + 'menggerainya': 'gerai', + 'menggeraikan': 'gerai', + 'tergerai-gerai': 'gerai', + 'geraman': 'geram', + 'kegeraman': 'geram', + 'kegeramannya': 'geram', + 'menggeram': 'geram', + 'menggeramkan': 'geram', + 'menggeramus': 'geramus', + 'menggerang': 'gerang', + 'menggerantak': 'gerantak', + 'menggerantang': 'gerantang', + 'menggeranyam': 'geranyam', + 'menggerapai': 'gerapai', + 'bergerapu': 'gerapu', + 'menggerat': 'gerat', + 'menggerawat': 'gerawat', + 'menggerawatkan': 'gerawat', + 'menggerayah': 'gerayah', + 'gerayangan': 'gerayang', + 'gerayangannya': 'gerayang', + 'menggerayang': 'gerayang', + 'menggerayangi': 'gerayang', + 'bergerayangan': 'gerayang', + 'menggerayanginya': 'gerayang', + 'penggerayangan': 'gerayang', + 'menggerbak': 'gerbak', + 'menggerbang': 'gerbang', + 'menggerbangkan': 'gerbang', + 'tegerbang-gerbang': 'gerbang', + 'menggerbus': 'gerbus', + 'menggerebek': 'gerebek', + 'menggerebeknya': 'gerebek', + 'penggerebekan': 'gerebek', + 'penggerebekannya': 'gerebek', + 'menggerecak-gerecak': 'gerecak', + 'menggerecok': 'gerecok', + 'menggerecoki': 'gerecok', + 'geregetan': 'gereget', + 'geregetannya': 'gereget', + 'kegerejaan': 'gereja', + 'kegerejaannya': 'gereja', + 'menggerek': 'gerek', + 'menggerekkan': 'gerek', + 'menggerekan': 'gerek', + 'penggerek': 'gerek', + 'penggereknya': 'gerek', + 'penggerekkan': 'gerek', + 'penggerekan': 'gerek', + 'bergerek-gerek': 'gerek', + 'menggeremet': 'geremet', + 'menggerendel': 'gerendel', + 'gerenengan': 'gereneng', + 'menggerenik': 'gerenik', + 'tergerenyeng-gerenyeng': 'gerenyeng', + 'menggerenyet': 'gerenyet', + 'menggerepe': 'gerepe', + 'menggerepek': 'gerepek', + 'bergerepes': 'gerepes', + 'menggerepes': 'gerepes', + 'menggeresek': 'geresek', + 'geretan': 'geret', + 'menggeret': 'geret', + 'menggeretnya': 'geret', + 'bergeretak': 'geretak', + 'menggeretang': 'geretang', + 'gergajian': 'gergaji', + 'gergajiannya': 'gergaji', + 'menggergaji': 'gergaji', + 'menggergajinya': 'gergaji', + 'menggergajikan': 'gergaji', + 'penggergaji': 'gergaji', + 'penggergajian': 'gergaji', + 'penggergajiannya': 'gergaji', + 'menggeriak': 'geriak', + 'geriak-geriuk': 'geriak', + 'menggeriap': 'geriap', + 'menggericau': 'gericau', + 'menggeridip': 'geridip', + 'bergerilya': 'gerilya', + 'bergerilyanya': 'gerilya', + 'bergerilyalah': 'gerilya', + 'menggerinda': 'gerinda', + 'penggering': 'gering', + 'geringgingan': 'geringging', + 'menggerinjam': 'gerinjam', + 'menggerinyau': 'gerinyau', + 'menggerisik': 'gerisik', + 'gerit-gerit': 'gerit', + 'menggerlap': 'gerlap', + 'menggerlip': 'gerlip', + 'menggermang': 'germang', + 'menggermut': 'germut', + 'menggermuti': 'germut', + 'menggero': 'gero', + 'bergerobok': 'gerobok', + 'menggerobok': 'gerobok', + 'gerobyakan': 'gerobyak', + 'bergerocok': 'gerocok', + 'menggerodak': 'gerodak', + 'menggerogoti': 'gerogot', + 'menggerogotinya': 'gerogot', + 'penggerogotan': 'gerogot', + 'menggerojok': 'gerojok', + 'menggerojokkan': 'gerojok', + 'gerombolan': 'gerombol', + 'gerombolannya': 'gerombol', + 'bergerombol': 'gerombol', + 'bergerombolan': 'gerombol', + 'gerombongan': 'gerombong', + 'menggerompok': 'gerompok', + 'menggeronggang': 'geronggang', + 'menggeropyok': 'geropyok', + 'penggeropyokan': 'geropyok', + 'menggeros': 'geros', + 'menggerowot': 'gerowot', + 'menggerpol': 'gerpol', + 'kegersangan': 'gersang', + 'gertakan': 'gertak', + 'gertakannya': 'gertak', + 'menggertak': 'gertak', + 'menggertaknya': 'gertak', + 'menggertakkan': 'gertak', + 'menggertakan': 'gertak', + 'menggertakku': 'gertak', + 'penggertak': 'gertak', + 'penggertakan': 'gertak', + 'menggeru': 'geru', + 'menggerugut': 'gerugut', + 'menggeruh': 'geruh', + 'kegeruhan': 'geruh', + 'geruh-gerah': 'geruh', + 'menggeruit': 'geruit', + 'menggerumit': 'gerumit', + 'menggerumuk': 'gerumuk', + 'menggerumuti': 'gerumut', + 'menggerumutinya': 'gerumut', + 'menggerunkan': 'gerun', + 'menggerundel': 'gerundel', + 'tergerung': 'gerung', + 'menggerung': 'gerung', + 'menggerunyam': 'gerunyam', + 'menggerupis': 'gerupis', + 'menggerupuk': 'gerupuk', + 'menggerupukkan': 'gerupuk', + 'gerusan': 'gerus', + 'gerusannya': 'gerus', + 'tergerus': 'gerus', + 'tergerusnya': 'gerus', + 'menggerus': 'gerus', + 'menggerusnya': 'gerus', + 'menggerutu': 'gerutu', + 'penggerutu': 'gerutu', + 'menggesa': 'gesa', + 'tergesa-gesa': 'gesa', + 'tergesa-gesanya': 'gesa', + 'bergesa-gesa': 'gesa', + 'ketergesa-gesaan': 'gesa', + 'menggesa-gesakan': 'gesa', + 'penggetang': 'getang', + 'menggetang': 'getang', + 'getapan': 'getap', + 'menggetap': 'getap', + 'menggetik': 'getik', + 'segetil': 'getil', + 'menggetil': 'getil', + 'kegetiran': 'getir', + 'kegetirannya': 'getir', + 'menggetok': 'getok', + 'menggetoknya': 'getok', + 'kegetolan': 'getol', + 'kegetolannya': 'getol', + 'menggetu': 'getu', + 'getak-getuk': 'getuk', + 'tergial': 'gial', + 'gial-giul': 'gial', + 'gial-gial': 'gial', + 'pegiat': 'giat', + 'pegiatnya': 'giat', + 'pegiatan': 'giat', + 'bergiat': 'giat', + 'kegiatan': 'giat', + 'kegiatannya': 'giat', + 'kegiatanlah': 'giat', + 'kegiatankan': 'giat', + 'kegiatanan': 'giat', + 'kegiatanku': 'giat', + 'kegiatanmu': 'giat', + 'penggiat': 'giat', + 'penggiatnya': 'giat', + 'penggiatan': 'giat', + 'mempergiat': 'giat', + 'penggiatannya': 'giat', + 'menggiatkan': 'giat', + 'menggiatkannya': 'giat', + 'berkegiatan': 'giat', + 'berkegiatanlah': 'giat', + 'mempergiatkan': 'giat', + 'menggibang': 'gibang', + 'bergidik': 'gidik', + 'menggidikkan': 'gidik', + 'kegigihan': 'gigih', + 'kegigihannya': 'gigih', + 'kegigihannyalah': 'gigih', + 'kegigihanku': 'gigih', + 'kegigihanmu': 'gigih', + 'menggigih': 'gigih', + 'menggigil': 'gigil', + 'menggigilnya': 'gigil', + 'menggigilkan': 'gigil', + 'menggigis': 'gigis', + 'gigitan': 'gigit', + 'gigitannya': 'gigit', + 'gigitanku': 'gigit', + 'tergigit': 'gigit', + 'tergigitnya': 'gigit', + 'menggigit': 'gigit', + 'menggigitnya': 'gigit', + 'menggigiti': 'gigit', + 'menggigitku': 'gigit', + 'menggigitmu': 'gigit', + 'menggigitinya': 'gigit', + 'kegilaan': 'gila', + 'kegilaannya': 'gila', + 'kegilaanmu': 'gila', + 'menggila': 'gila', + 'menggilanya': 'gila', + 'menggilalah': 'gila', + 'menggilakan': 'gila', + 'menggilai': 'gila', + 'penggila': 'gila', + 'penggilanya': 'gila', + 'gila-gila': 'gila', + 'gila-gilanya': 'gila', + 'gila-gilai': 'gila', + 'gila-gilaan': 'gila', + 'gila-gilaannya': 'gila', + 'tergila-gila': 'gila', + 'tergila-gilanya': 'gila', + 'kegila-gilaan': 'gila', + 'gilang-gemilang': 'gilang', + 'gilang-gemilangnya': 'gilang', + 'penggilap': 'gilap', + 'menggilapkan': 'gilap', + 'gilap-gemilap': 'gilap', + 'gilasan': 'gilas', + 'tergilas': 'gilas', + 'tergilasnya': 'gilas', + 'menggilas': 'gilas', + 'menggilasnya': 'gilas', + 'penggilas': 'gilas', + 'penggilasan': 'gilas', + 'gilian': 'gili', + 'giliani': 'gili', + 'menggili': 'gili', + 'menggili-gili': 'gili', + 'gilingan': 'giling', + 'gilingannya': 'giling', + 'tergiling': 'giling', + 'penggiling': 'giling', + 'penggilingnya': 'giling', + 'penggilingan': 'giling', + 'menggiling': 'giling', + 'menggilingnya': 'giling', + 'menggilingkan': 'giling', + 'penggilingannya': 'giling', + 'giling-giling': 'giling', + 'giliran': 'gilir', + 'gilirannya': 'gilir', + 'giliranku': 'gilir', + 'giliranmu': 'gilir', + 'bergilir': 'gilir', + 'bergilirnya': 'gilir', + 'bergiliran': 'gilir', + 'mempergilirkan': 'gilir', + 'gilir-bergilir': 'gilir', + 'bergilir-gilir': 'gilir', + 'ginang-ginang': 'ginang', + 'bergincu': 'gincu', + 'menggincu': 'gincu', + 'penggirang': 'girang', + 'kegirangan': 'girang', + 'kegirangannya': 'girang', + 'menggirangkan': 'girang', + 'kegirang-girangan': 'girang', + 'girik-girik': 'girik', + 'menggiring': 'giring', + 'menggiringnya': 'giring', + 'menggiringi': 'giring', + 'menggisar': 'gisar', + 'menggisil': 'gisil', + 'menggites': 'gites', + 'menggitik': 'gitik', + 'tergiur': 'giur', + 'tergiurnya': 'giur', + 'menggiurkan': 'giur', + 'menggiurkannya': 'giur', + 'bergiwang': 'giwang', + 'bergizi': 'gizi', + 'bergizinya': 'gizi', + 'keglamoran': 'glamor', + 'keglamorannya': 'glamor', + 'mengglasir': 'glasir', + 'mengglobal': 'global', + 'mengglobalnya': 'global', + 'mengglobalkan': 'global', + 'mengglobalkannya': 'global', + 'gegoakan': 'goak', + 'goak-goak': 'goak', + 'menggobek': 'gobek', + 'kegoblokan': 'goblok', + 'gocekan': 'gocek', + 'gocekannya': 'gocek', + 'menggocek': 'gocek', + 'menggoceknya': 'gocek', + 'bergocoh': 'gocoh', + 'menggocoh': 'gocoh', + 'pergocohan': 'gocoh', + 'godaan': 'goda', + 'godaannya': 'goda', + 'tergoda': 'goda', + 'tergodanya': 'goda', + 'menggoda': 'goda', + 'menggodanya': 'goda', + 'menggodaku': 'goda', + 'menggodamu': 'goda', + 'penggoda': 'goda', + 'penggodanya': 'goda', + 'penggodakan': 'goda', + 'menggodai': 'goda', + 'menggodainya': 'goda', + 'penggodaan': 'goda', + 'menggodak': 'godak', + 'menggodam': 'godam', + 'penggodam': 'godam', + 'godokan': 'godok', + 'menggodok': 'godok', + 'menggodoknya': 'godok', + 'penggodokan': 'godok', + 'penggodokannya': 'godok', + 'menggodot': 'godot', + 'menggodot-godot': 'godot', + 'menggoel': 'goel', + 'menggogoh': 'gogoh', + 'menggogok': 'gogok', + 'bergojek': 'gojek', + 'gojlokan': 'gojlok', + 'gojlokannya': 'gojlok', + 'menggojlok': 'gojlok', + 'menggojloki': 'gojlok', + 'penggojlokan': 'gojlok', + 'menggolak-galikkan': 'golak-galik', + 'menggoleng': 'goleng', + 'bergoler': 'goler', + 'pegolf': 'golf', + 'pegolfnya': 'golf', + 'bergolok': 'golok', + 'tergolok': 'golok', + 'menggolok': 'golok', + 'golongan': 'golong', + 'golongannya': 'golong', + 'golonganku': 'golong', + 'golonganmu': 'golong', + 'tergolong': 'golong', + 'tergolongkan': 'golong', + 'tergolongan': 'golong', + 'penggolong': 'golong', + 'penggolongkan': 'golong', + 'penggolongan': 'golong', + 'menggolong': 'golong', + 'menggolongkan': 'golong', + 'menggolongkannya': 'golong', + 'menggolongan': 'golong', + 'penggolongannya': 'golong', + 'bergolong-golong': 'golong', + 'gombalan': 'gombal', + 'gombalannya': 'gombal', + 'menggombeng': 'gombeng', + 'menggondokkan': 'gondok', + 'menggondol': 'gondol', + 'menggondolnya': 'gondol', + 'menggondolkan': 'gondol', + 'kegondrongan': 'gondrong', + 'gonggongan': 'gonggong', + 'gonggongannya': 'gonggong', + 'menggonggong': 'gonggong', + 'menggonggongi': 'gonggong', + 'pergonglian': 'gongli', + 'menggongseng': 'gongseng', + 'penggongsengan': 'gongseng', + 'menggonjakkan': 'gonjak', + 'gonjang-ganjing': 'gonjang', + 'gonjang-ganjingnya': 'gonjang', + 'gonjlang-ganjling': 'gonjlang', + 'menggonjokkan': 'gonjok', + 'bergonjong': 'gonjong', + 'bergontai': 'gontai', + 'menggontai': 'gontai', + 'mempergontai': 'gontai', + 'tergontai-gontai': 'gontai', + 'bergontok': 'gontok', + 'bergontokan': 'gontok', + 'gontok-gontokan': 'gontok', + 'menggonyakkan': 'gonyak', + 'menggonyeh': 'gonyeh', + 'menggonyel': 'gonyel', + 'menggonyoh': 'gonyoh', + 'tergopoh': 'gopoh', + 'gorap-gorap': 'gorap', + 'menggorek-gorek': 'gorek', + 'gorengan': 'goreng', + 'gorengannya': 'goreng', + 'menggoreng': 'goreng', + 'menggorengnya': 'goreng', + 'penggorengan': 'goreng', + 'penggorengannya': 'goreng', + 'menggoreng-goreng': 'goreng', + 'menggoroh': 'goroh', + 'menggorok': 'gorok', + 'menggoroknya': 'gorok', + 'menggorokkan': 'gorok', + 'menggorokan': 'gorok', + 'menggorokmu': 'gorok', + 'penggorokan': 'gorok', + 'penggorokannya': 'gorok', + 'bergosip': 'gosip', + 'bergosiplah': 'gosip', + 'penggosip': 'gosip', + 'pergosipan': 'gosip', + 'menggosipkan': 'gosip', + 'menggosipkannya': 'gosip', + 'gosokan': 'gosok', + 'gosokannya': 'gosok', + 'bergosok': 'gosok', + 'menggosok': 'gosok', + 'menggosoknya': 'gosok', + 'menggosokkan': 'gosok', + 'menggosokkannya': 'gosok', + 'menggosoki': 'gosok', + 'menggosokan': 'gosok', + 'penggosok': 'gosok', + 'penggosoknya': 'gosok', + 'penggosokan': 'gosok', + 'bergosokan': 'gosok', + 'penggosokannya': 'gosok', + 'mempergosokkan': 'gosok', + 'menggosok-gosok': 'gosok', + 'menggosok-gosoknya': 'gosok', + 'menggosok-gosokkan': 'gosok', + 'menggosok-gosokkannya': 'gosok', + 'menggosok-gosokan': 'gosok', + 'bergosong': 'gosong', + 'menggotes': 'gotes', + 'menggotong': 'gotong', + 'menggotongnya': 'gotong', + 'bergotong royong': 'gotong royong', + 'kegotongroyongan': 'gotong royong', + 'kegotongroyongannya': 'gotong royong', + 'bergoyah': 'goyah', + 'kegoyahan': 'goyah', + 'tergoyahkan': 'goyah', + 'tergoyahkannya': 'goyah', + 'menggoyahkan': 'goyah', + 'menggoyahkannya': 'goyah', + 'menggoyak': 'goyak', + 'menggoyakan': 'goyak', + 'kegramatikalan': 'gramatikal', + 'menggranat': 'granat', + 'penggranatan': 'granat', + 'bergranula': 'granula', + 'menggrataki': 'gratak', + 'menggratiskan': 'gratis', + 'menggratiskannya': 'gratis', + 'menggraver': 'graver', + 'grempelan': 'grempel', + 'menggual': 'gual', + 'gual-gail': 'gual', + 'peguam': 'guam', + 'berguam': 'guam', + 'perguaman': 'guam', + 'mengguar': 'guar', + 'gubahan': 'gubah', + 'gubahannya': 'gubah', + 'penggubah': 'gubah', + 'penggubahnya': 'gubah', + 'penggubahan': 'gubah', + 'menggubah': 'gubah', + 'menggubahnya': 'gubah', + 'penggubahannya': 'gubah', + 'menggubal': 'gubal', + 'menggubel': 'gubel', + 'kegubernuran': 'gubernur', + 'kegubernurannya': 'gubernur', + 'menggubit': 'gubit', + 'gubrisan': 'gubris', + 'menggubris': 'gubris', + 'menggubrisnya': 'gubris', + 'menggubrislah': 'gubris', + 'menggubriskan': 'gubris', + 'pergudangan': 'gudang', + 'pergudangannya': 'gudang', + 'penggudangan': 'gudang', + 'menggudangkan': 'gudang', + 'menggudangkannya': 'gudang', + 'tergudik-gudik': 'gudik', + 'gugahan': 'gugah', + 'tergugah': 'gugah', + 'tergugahnya': 'gugah', + 'tergugahkan': 'gugah', + 'menggugah': 'gugah', + 'menggugahnya': 'gugah', + 'menggugahkan': 'gugah', + 'penggugah': 'gugah', + 'penggugahan': 'gugah', + 'gugatan': 'gugat', + 'gugatannya': 'gugat', + 'tergugat': 'gugat', + 'tergugatnya': 'gugat', + 'penggugat': 'gugat', + 'penggugatnya': 'gugat', + 'penggugatan': 'gugat', + 'menggugat': 'gugat', + 'menggugatnya': 'gugat', + 'menggugatkan': 'gugat', + 'menggugatan': 'gugat', + 'penggugatannya': 'gugat', + 'menggugu': 'gugu', + 'menggugukan': 'guguk', + 'tergugu-gugu': 'gugu', + 'mengguguh': 'guguh', + 'terguguk': 'guguk', + 'mengguguk': 'guguk', + 'penggugup': 'gugup', + 'kegugupan': 'gugup', + 'kegugupannya': 'gugup', + 'kegugupanmu': 'gugup', + 'menggugupkan': 'gugup', + 'guguran': 'gugur', + 'gugurannya': 'gugur', + 'keguguran': 'gugur', + 'kegugurannya': 'gugur', + 'berguguran': 'gugur', + 'bergugurannya': 'gugur', + 'pengguguran': 'gugur', + 'menggugurkan': 'gugur', + 'menggugurkannya': 'gugur', + 'menggugurkanmu': 'gugur', + 'gugusan': 'gugus', + 'gugusannya': 'gugus', + 'bergugus-gugus': 'gugus', + 'mengguit': 'guit', + 'mengguit-guit': 'guit', + 'bergula': 'gula', + 'menggula': 'gula', + 'menggulai': 'gulai', + 'pergulaan': 'gula', + 'gula-gula': 'gula', + 'gula-gulanya': 'gula', + 'kegulanaan': 'gulana', + 'pegulat': 'gulat', + 'pegulatnya': 'gulat', + 'pegulatku': 'gulat', + 'bergulat': 'gulat', + 'pergulatan': 'gulat', + 'pergulatannya': 'gulat', + 'bergulir': 'gulir', + 'bergulirnya': 'gulir', + 'bergulirlah': 'gulir', + 'bergulirkan': 'gulir', + 'berguliran': 'gulir', + 'tergulir': 'gulir', + 'menggulir': 'gulir', + 'menggulirnya': 'gulir', + 'menggulirkan': 'gulir', + 'menggulirkannya': 'gulir', + 'mengguliran': 'gulir', + 'pengguliran': 'gulir', + 'guludan': 'gulud', + 'gulungan': 'gulung', + 'gulungannya': 'gulung', + 'tergulung': 'gulung', + 'bergulung': 'gulung', + 'menggulung': 'gulung', + 'menggulungnya': 'gulung', + 'menggulungkan': 'gulung', + 'menggulungku': 'gulung', + 'penggulungan': 'gulung', + 'bergulung-gulung': 'gulung', + 'gulung-menggulung': 'gulung', + 'tergulut': 'gulut', + 'bergulut': 'gulut', + 'menggulut': 'gulut', + 'tergulut-gulut': 'gulut', + 'bergulut-gulut': 'gulut', + 'menggumalkan': 'gumal', + 'menggumbuk': 'gumbuk', + 'segumpal': 'gumpa', + 'segumpalan': 'gumpa', + 'bergumul': 'gumul', + 'bergumulnya': 'gumul', + 'bergumulan': 'gumul', + 'menggumuli': 'gumul', + 'pergumulan': 'gumul', + 'pergumulannya': 'gumul', + 'guncangan': 'guncang', + 'guncangannya': 'guncang', + 'terguncang': 'guncang', + 'terguncangnya': 'guncang', + 'terguncanglah': 'guncang', + 'terguncangkan': 'guncang', + 'berguncang': 'guncang', + 'berguncangan': 'guncang', + 'keguncangan': 'guncang', + 'mengguncangkan': 'guncang', + 'mengguncangkannya': 'guncang', + 'kegundahan': 'gundah', + 'kegundahannya': 'gundah', + 'mempergundah': 'gundah', + 'menggundahkan': 'gundah', + 'gundalan': 'gundal', + 'pergundalan': 'gundal', + 'gundala-gundala': 'gundala', + 'pergundikan': 'gundik', + 'mempergundik': 'gundik', + 'mempergundikkan': 'gundik', + 'bergundu': 'gundu', + 'gundukan': 'gunduk', + 'gundukannya': 'gunduk', + 'bergunduk-gunduk': 'gunduk', + 'bergundul': 'gundul', + 'menggundul': 'gundul', + 'menggundulkan': 'gundul', + 'menggunduli': 'gundul', + 'menggundulinya': 'gundul', + 'penggundulan': 'gundul', + 'penggundulannya': 'gundul', + 'mengegungkan': 'gung', + 'menggunggung': 'gunggung', + 'gunjingan': 'gunjing', + 'gunjingannya': 'gunjing', + 'bergunjing': 'gunjing', + 'menggunjing': 'gunjing', + 'menggunjingnya': 'gunjing', + 'menggunjingkan': 'gunjing', + 'menggunjingkannya': 'gunjing', + 'pergunjingan': 'gunjing', + 'pergunjingannya': 'gunjing', + 'mempergunjingkan': 'gunjing', + 'mempergunjingkannya': 'gunjing', + 'guntang-guntang': 'guntang', + 'guntingan': 'gunting', + 'guntingannya': 'gunting', + 'penggunting': 'gunting', + 'pengguntingan': 'gunting', + 'menggunting': 'gunting', + 'mengguntingnya': 'gunting', + 'mengguntingkan': 'gunting', + 'mengguntung': 'guntung', + 'mengguntungkan': 'guntung', + 'mengguntur': 'guntur', + 'menggunturkan': 'guntur', + 'gunungan': 'gunung', + 'gunungannya': 'gunung', + 'pegunungan': 'gunung', + 'pegunungannya': 'gunung', + 'menggunung': 'gunung', + 'menggunungnya': 'gunung', + 'menggununglah': 'gunung', + 'gunung-ganang': 'gunung', + 'gunung-gemunung': 'gunung', + 'gunung-gunungan': 'gunung', + 'bergunung-gunung': 'gunung', + 'menggunyam': 'gunyam', + 'bergurah': 'gurah', + 'menggurah': 'gurah', + 'mengguram': 'guram', + 'keguraman': 'guram', + 'guratan': 'gurat', + 'guratannya': 'gurat', + 'tergurat': 'gurat', + 'menggurat': 'gurat', + 'mengguratnya': 'gurat', + 'mengguratkan': 'gurat', + 'menggurdi': 'gurdi', + 'menggurik': 'gurik', + 'bergurindam': 'gurindam', + 'guritan': 'gurit', + 'menggurit': 'gurit', + 'menggurita': 'gurita', + 'mengguritanya': 'gurita', + 'berguru': 'guru', + 'bergurunya': 'guru', + 'bergurulah': 'guru', + 'keguruan': 'guru', + 'menggurui': 'guru', + 'mengguruinya': 'guru', + 'perguruan': 'guru', + 'perguruannya': 'guru', + 'mengguruh': 'guruh', + 'menggusah': 'gusah', + 'kegusaran': 'gusar', + 'kegusarannya': 'gusar', + 'menggusari': 'gusar', + 'menggusarkan': 'gusar', + 'menggusel': 'gusel', + 'menggusrek': 'gusrek', + 'gusuran': 'gusur', + 'gusurannya': 'gusur', + 'tergusur': 'gusur', + 'tergusurnya': 'gusur', + 'menggusur': 'gusur', + 'menggusurnya': 'gusur', + 'pergusuran': 'gusur', + 'penggusuran': 'gusur', + 'penggusurannya': 'gusur', + 'menggutik': 'gutik', + 'guyonan': 'guyon', + 'guyonannya': 'guyon', + 'guyonannyalah': 'guyon', + 'guyonanmu': 'guyon', + 'berguyub': 'guyub', + 'peguyuban': 'guyub', + 'terguyur': 'guyur', + 'mengguyur': 'guyur', + 'mengguyurnya': 'guyur', + 'mengguyurkan': 'guyur', + 'mengguyurkannya': 'guyur', + 'mengguyuri': 'guyur', + 'sehabis': 'habis', + 'sehabisnya': 'habis', + 'berhabis': 'habis', + 'kehabisan': 'habis', + 'kehabisanlah': 'habis', + 'menghabisi': 'habis', + 'menghabisinya': 'habis', + 'menghabisikan': 'habis', + 'menghabisiku': 'habis', + 'menghabisimu': 'habis', + 'habis-habis': 'habis', + 'habis-habisnya': 'habis', + 'habis-habiskan': 'habis', + 'habis-habisan': 'habis', + 'terhabiskan': 'habis', + 'penghabisan': 'habis', + 'penghabisannya': 'habis', + 'menghabiskan': 'habis', + 'menghabiskannya': 'habis', + 'menghabiskankan': 'habis', + 'sehabis-habisnya': 'habis', + 'menghablur': 'hablur', + 'penghabluran': 'hablur', + 'menghablurkan': 'hablur', + 'berhad': 'had', + 'berhadan': 'had', + 'terhad': 'had', + 'terhadi': 'had', + 'terhadan': 'had', + 'menghadkan': 'had', + 'hadapan': 'hadap', + 'hadapannya': 'hadap', + 'hadapanku': 'hadap', + 'hadapanmu': 'hadap', + 'terhadap': 'hadap', + 'terhadapnya': 'hadap', + 'terhadapi': 'hadap', + 'terhadapan': 'hadap', + 'terhadapku': 'hadap', + 'terhadapmu': 'hadap', + 'terhadap-mu': 'hadap', + 'menghadap': 'hadap', + 'menghadapnya': 'hadap', + 'menghadaplah': 'hadap', + 'menghadapkan': 'hadap', + 'menghadapkannya': 'hadap', + 'menghadapi': 'hadap', + 'menghadapan': 'hadap', + 'menghadapku': 'hadap', + 'menghadapmu': 'hadap', + 'bersehadap': 'hadap', + 'menghadapinya': 'hadap', + 'menghadapii': 'hadap', + 'menghadapiku': 'hadap', + 'menghadapimu': 'hadap', + 'penghadapan': 'hadap', + 'memperhadapkan': 'hadap', + 'berhadap-hadapan': 'hadap', + 'berhadapan': 'hadap', + 'berhadiah': 'hadiah', + 'berhadiahkan': 'hadiah', + 'menghadiahkan': 'hadiah', + 'menghadiahkannya': 'hadiah', + 'berhadir': 'hadir', + 'berhadirkan': 'hadir', + 'kehadiran': 'hadir', + 'kehadirannya': 'hadir', + 'kehadiranan': 'hadir', + 'kehadiranku': 'hadir', + 'kehadiranmu': 'hadir', + 'menghadiri': 'hadir', + 'menghadirinya': 'hadir', + 'menghadirikan': 'hadir', + 'menghadirkan': 'hadir', + 'menghadirkannya': 'hadir', + 'menghadirkanku': 'hadir', + 'hafalan': 'hafal', + 'hafalannya': 'hafal', + 'menghafal': 'hafal', + 'menghafalnya': 'hafal', + 'menghafalkan': 'hafal', + 'menghafalkannya': 'hafal', + 'menghafalan': 'hafal', + 'menghajar': 'hajar', + 'menghajarnya': 'hajar', + 'menghajarkan': 'hajar', + 'menghajari': 'hajar', + 'menghajarmu': 'hajar', + 'berhaji': 'haji', + 'berhajinya': 'haji', + 'kehajian': 'haji', + 'perhajian': 'haji', + 'menghajikan': 'haji', + 'berhak': 'hak', + 'berhaknya': 'hak', + 'berhaklah': 'hak', + 'menghaki': 'hak', + 'menghakikan': 'hak', + 'menghakkan': 'hak', + 'berhakim': 'hakim', + 'kehakiman': 'hakim', + 'kehakimannya': 'hakim', + 'menghakimi': 'hakim', + 'menghakiminya': 'hakim', + 'menghakimilah': 'hakim', + 'menghakimiku': 'hakim', + 'menghakimimu': 'hakim', + 'penghakiman': 'hakim', + 'penghakimannya': 'hakim', + 'berhal': 'hal', + 'berhalan': 'hal', + 'terhal': 'hal', + 'terhalan': 'hal', + 'menghalai-balaikan': 'halai-balai', + 'penghalal': 'halal', + 'penghalalan': 'halal', + 'kehalalan': 'halal', + 'kehalalannya': 'halal', + 'menghalalkan': 'halal', + 'berhalalbihalal': 'halalbihalal', + 'halangan': 'halang', + 'halangannya': 'halang', + 'terhalang': 'halang', + 'terhalangnya': 'halang', + 'terhalangi': 'halang', + 'penghalang': 'halang', + 'penghalangnya': 'halang', + 'penghalangan': 'halang', + 'menghalang': 'halang', + 'menghalangnya': 'halang', + 'menghalangkan': 'halang', + 'menghalangi': 'halang', + 'menghalangan': 'halang', + 'berhalangan': 'halang', + 'berhalangannya': 'halang', + 'menghalanginya': 'halang', + 'menghalangiku': 'halang', + 'menghalangimu': 'halang', + 'menghalang-halangi': 'halang', + 'menghalang-halanginya': 'halang', + 'menghalau': 'halau', + 'menghalaunya': 'halau', + 'menghalaukan': 'halau', + 'penghalau': 'halau', + 'penghalauan': 'halau', + 'sehaluan': 'haluan', + 'berhaluan': 'haluan', + 'kehalusan': 'halus', + 'kehalusannya': 'halus', + 'menghalusi': 'halus', + 'memperhalus': 'halus', + 'memperhalusnya': 'halus', + 'menghaluskan': 'halus', + 'menghaluskannya': 'halus', + 'berhamba': 'hamba', + 'menghamba': 'hamba', + 'menghambakan': 'hamba', + 'menghambai': 'hamba', + 'perhambaan': 'hamba', + 'penghambaan': 'hamba', + 'penghambaannya': 'hamba', + 'memperhamba': 'hamba', + 'memperhambakan': 'hamba', + 'kehambaran': 'hambar', + 'hambatan': 'hambat', + 'hambatannya': 'hambat', + 'hambatanmu': 'hambat', + 'terhambat': 'hambat', + 'terhambatnya': 'hambat', + 'terhambatlah': 'hambat', + 'terhambatan': 'hambat', + 'menghambat': 'hambat', + 'menghambatnya': 'hambat', + 'menghambatkan': 'hambat', + 'menghambatku': 'hambat', + 'menghambatmu': 'hambat', + 'penghambat': 'hambat', + 'penghambatnya': 'hambat', + 'penghambatan': 'hambat', + 'penghambatannya': 'hambat', + 'memperhambat': 'hambat', + 'terhambat-hambat': 'hambat', + 'kehamilan': 'hamil', + 'kehamilannya': 'hamil', + 'kehamilanlah': 'hamil', + 'kehamilanan': 'hamil', + 'kehamilanku': 'hamil', + 'menghamili': 'hamil', + 'menghamilinya': 'hamil', + 'menghamiliku': 'hamil', + 'penghamilan': 'hamil', + 'menghamilkan': 'hamil', + 'kehampaan': 'hampa', + 'kehampaannya': 'hampa', + 'menghampakan': 'hampa', + 'hamparan': 'hampar', + 'hamparannya': 'hampar', + 'terhampar': 'hampar', + 'sehamparan': 'hampar', + 'menghampar': 'hampar', + 'menghamparkan': 'hampar', + 'menghampari': 'hampar', + 'hampirkan': 'hampir', + 'menghampiri': 'hampir', + 'menghampirinya': 'hampir', + 'menghampiriku': 'hampir', + 'menghampirimu': 'hampir', + 'hampir-hampir': 'hampir', + 'hampir-hampiran': 'hampir', + 'menghampirkan': 'hampir', + 'berhampiran': 'hampir', + 'menghamuni': 'hamun', + 'berhamun-hamun': 'hamun', + 'kehancuran': 'hancur', + 'kehancurannya': 'hancur', + 'penghancuran': 'hancur', + 'penghancurannya': 'hancur', + 'menghancurkan': 'hancur', + 'menghancurkannya': 'hancur', + 'menghancurkanku': 'hancur', + 'menghancurkanmu': 'hancur', + 'hancur-hancuran': 'hancur', + 'hancur-menghancurkan': 'hancur', + 'penghancurleburan': 'hancur lebur', + 'menghancurleburkan': 'hancur lebur', + 'menghancurluluhkan': 'hancur luluh', + 'berhandai-handai': 'handai', + 'menghangat': 'hangat', + 'menghangatnya': 'hangat', + 'menghangatkan': 'hangat', + 'menghangatkannya': 'hangat', + 'menghangati': 'hangat', + 'penghangat': 'hangat', + 'penghangatan': 'hangat', + 'kehangatan': 'hangat', + 'kehangatannya': 'hangat', + 'menghangatinya': 'hangat', + 'menghangatkanku': 'hangat', + 'kehangusan': 'hangus', + 'menghangus': 'hangus', + 'menghangusnya': 'hangus', + 'menghanguskan': 'hangus', + 'menghanguskannya': 'hangus', + 'menghangusan': 'hangus', + 'hantaman': 'hantam', + 'hantamannya': 'hantam', + 'berhantam': 'hantam', + 'berhantaman': 'hantam', + 'menghantam': 'hantam', + 'menghantamnya': 'hantam', + 'menghantamkan': 'hantam', + 'menghantamkannya': 'hantam', + 'menghantami': 'hantam', + 'menghantamku': 'hantam', + 'menghantammu': 'hantam', + 'hantaran': 'hantar', + 'hantarannya': 'hantar', + 'terhantar': 'hantar', + 'terhantarkan': 'hantar', + 'berhantar': 'hantar', + 'menghantar': 'hantar', + 'menghantarnya': 'hantar', + 'menghantarkan': 'hantar', + 'menghantarkannya': 'hantar', + 'penghantar': 'hantar', + 'penghantarnya': 'hantar', + 'penghantaran': 'hantar', + 'berhantaran': 'hantar', + 'menghantarkankan': 'hantar', + 'menghantarkanku': 'hantar', + 'menghantarkanmu': 'hantar', + 'berhanyut': 'hanyut', + 'berhanyutan': 'hanyut', + 'terhanyut': 'hanyut', + 'penghanyutan': 'hanyut', + 'menghanyutkan': 'hanyut', + 'menghanyutkannya': 'hanyut', + 'menghanyutkankan': 'hanyut', + 'berhanyut-hanyut': 'hanyut', + 'terhapus': 'hapus', + 'terhapusnya': 'hapus', + 'terhapuskan': 'hapus', + 'penghapus': 'hapus', + 'penghapusnya': 'hapus', + 'penghapuskan': 'hapus', + 'penghapusan': 'hapus', + 'menghapus': 'hapus', + 'menghapusnya': 'hapus', + 'menghapuskan': 'hapus', + 'menghapuskannya': 'hapus', + 'menghapusan': 'hapus', + 'menghapusmu': 'hapus', + 'penghapusannya': 'hapus', + 'terharak-harak': 'harak', + 'pengharaman': 'haram', + 'mengharamkan': 'haram', + 'mengharamkannya': 'haram', + 'harapan': 'harap', + 'harapannya': 'harap', + 'harapanlah': 'harap', + 'harapankan': 'harap', + 'harapanku': 'harap', + 'harapanmu': 'harap', + 'berharap': 'harap', + 'berharapnya': 'harap', + 'berharaplah': 'harap', + 'berharapkan': 'harap', + 'berharapan': 'harap', + 'mengharap': 'harap', + 'mengharapnya': 'harap', + 'mengharaplah': 'harap', + 'mengharapkan': 'harap', + 'mengharapkannya': 'harap', + 'mengharapi': 'harap', + 'mengharapan': 'harap', + 'harap-harap': 'harap', + 'pengharapan': 'harap', + 'pengharapannya': 'harap', + 'mengharapkanku': 'harap', + 'harap-harapan': 'harap', + 'berpengharapan': 'harap', + 'terharap-harap': 'harap', + 'harap-harap cemas': 'harap', + 'hardikan': 'hardik', + 'hardikannya': 'hardik', + 'menghardik': 'hardik', + 'menghardiknya': 'hardik', + 'harian': 'hari', + 'hariannya': 'hari', + 'harianlah': 'hari', + 'hariani': 'hari', + 'harianku': 'hari', + 'harianmu': 'hari', + 'sehari': 'hari', + 'seharinya': 'hari', + 'seharian': 'hari', + 'berhari': 'hari', + 'sehariannya': 'hari', + 'keseharian': 'hari', + 'kesehariannya': 'hari', + 'keseharianku': 'hari', + 'keseharianmu': 'hari', + 'sehari-hari': 'hari', + 'sehari-harinya': 'hari', + 'sehari-harilah': 'hari', + 'sehari-hariku': 'hari', + 'sehari-harimu': 'hari', + 'berhari-hari': 'hari', + 'sehari-harian': 'hari', + 'mengharimau': 'harimau', + 'pengharit': 'harit', + 'pengharkatan': 'harkat', + 'mengharmonikan': 'harmoni', + 'keharmonisan': 'harmonis', + 'keharmonisannya': 'harmonis', + 'pengharmonisan': 'harmonis', + 'mengharmoniskan': 'harmonis', + 'mengharmoniskannya': 'harmonis', + 'berharta': 'harta', + 'terharu biru': 'haru biru', + 'mengharu biru': 'haru biru', + 'mengharubirukan': 'haru biru', + 'terharu': 'haru', + 'terharunya': 'haru', + 'terharulah': 'haru', + 'pengharu': 'haru', + 'keharuan': 'haru', + 'keharuannya': 'haru', + 'mengharu': 'haru', + 'mengharukan': 'haru', + 'mengharukannya': 'haru', + 'mengharukanku': 'haru', + 'keterharuan': 'haru', + 'keterharuannya': 'haru', + 'mengharum': 'harum', + 'mengharumkan': 'harum', + 'mengharumi': 'harum', + 'keharuman': 'harum', + 'keharumannya': 'harum', + 'harum-haruman': 'harum', + 'keharusan': 'harus', + 'keharusannya': 'harus', + 'seharusnya': 'harus', + 'seharusnyanya': 'harus', + 'seharusnyalah': 'harus', + 'seharusnyakan': 'harus', + 'mengharuskan': 'harus', + 'mengharuskannya': 'harus', + 'mengharuskanku': 'harus', + 'mengharuskanmu': 'harus', + 'sehasta': 'hasta', + 'menghasta': 'hasta', + 'menghasud': 'hasud', + 'terhasut': 'hasut', + 'penghasut': 'hasut', + 'penghasutnya': 'hasut', + 'penghasutan': 'hasut', + 'menghasut': 'hasut', + 'menghasutnya': 'hasut', + 'penghasutannya': 'hasut', + 'penghasutani': 'hasut', + 'sehati': 'hati', + 'sehatinya': 'hati', + 'berhati': 'hati', + 'berhatian': 'hati', + 'hati-hati': 'hati', + 'hati-hatinya': 'hati', + 'hati-hatilah': 'hati', + 'hati-hatian': 'hati', + 'berhati-hati': 'hati', + 'berhati-hatinya': 'hati', + 'berhati-hatilah': 'hati', + 'berhati-hatii': 'hati', + 'berhati-hatian': 'hati', + 'kehati-hatian': 'hati', + 'kehati-hatiannya': 'hati', + 'kehausan': 'haus', + 'kehausannya': 'haus', + 'menghauskan': 'haus', + 'berhawa': 'hawa', + 'menghawa': 'hawa', + 'penghawaan': 'hawa', + 'menghawakan': 'hawa', + 'penghayat': 'hayat', + 'penghayatnya': 'hayat', + 'penghayatan': 'hayat', + 'menghayati': 'hayat', + 'menghayatinya': 'hayat', + 'penghayatannya': 'hayat', + 'mengheban': 'heban', + 'kehebatan': 'hebat', + 'kehebatannya': 'hebat', + 'kehebatanku': 'hebat', + 'kehebatanmu': 'hebat', + 'menghebat': 'hebat', + 'menghebatnya': 'hebat', + 'menghebatkan': 'hebat', + 'memperhebat': 'hebat', + 'hebat-hebatan': 'hebat', + 'kehebohan': 'heboh', + 'kehebohannya': 'heboh', + 'menghebohkan': 'heboh', + 'menghebohkannya': 'heboh', + 'berhektare-hektare': 'hektare', + 'helaan': 'hela', + 'menghela': 'hela', + 'menghelanya': 'hela', + 'menghelakan': 'hela', + 'penghela': 'hela', + 'penghelanya': 'hela', + 'sehelai': 'helai', + 'sehelainya': 'helai', + 'berhelai': 'helai', + 'berhelat': 'helat', + 'berhelatan': 'helat', + 'menghelat': 'helat', + 'menghelatnya': 'helat', + 'perhelatan': 'helat', + 'perhelatannya': 'helat', + 'perhelatanan': 'helat', + 'terhembalang': 'hembalang', + 'berhembalang': 'hembalang', + 'menghembalang': 'hembalang', + 'menghembalangkan': 'hembalang', + 'terhempap': 'hempap', + 'menghempap': 'hempap', + 'menghempapkan': 'hempap', + 'hempasan': 'hempas', + 'hempasannya': 'hempas', + 'terhempas': 'hempas', + 'terhempasnya': 'hempas', + 'menghempas': 'hempas', + 'menghempasnya': 'hempas', + 'menghempaskan': 'hempas', + 'menghempaskannya': 'hempas', + 'penghempasan': 'hempas', + 'kehendak': 'hendak', + 'kehendaknya': 'hendak', + 'kehendakkan': 'hendak', + 'kehendaki': 'hendak', + 'kehendakku': 'hendak', + 'kehendakmu': 'hendak', + 'kehendak-mu': 'hendak', + 'hendaklah': 'hendak', + 'sekehendak': 'hendak', + 'sekehendaknya': 'hendak', + 'menghendaki': 'hendak', + 'menghendakinya': 'hendak', + 'berkehendak': 'hendak', + 'terhengit-hengit': 'hengit', + 'keheningan': 'hening', + 'keheningannya': 'hening', + 'pengheningan': 'hening', + 'mengheningkan': 'hening', + 'penghentar': 'hentar', + 'keheranan': 'heran', + 'keheranannya': 'heran', + 'keherananan': 'heran', + 'keherananku': 'heran', + 'mengherani': 'heran', + 'mengherankan': 'heran', + 'mengherankannya': 'heran', + 'mengherankankan': 'heran', + 'mengherankanku': 'heran', + 'terheran-heran': 'heran', + 'keheran-heranan': 'heran', + 'keheroikan': 'heroik', + 'keheterogenan': 'heterogen', + 'kehewanan': 'hewan', + 'kehewanannya': 'hewan', + 'hibahan': 'hibah', + 'penghibahan': 'hibah', + 'menghibahkan': 'hibah', + 'menghibahkannya': 'hibah', + 'kehibukan': 'hibuk', + 'hiburan': 'hibur', + 'hiburannya': 'hibur', + 'hiburanmu': 'hibur', + 'terhibur': 'hibur', + 'terhiburnya': 'hibur', + 'terhiburlah': 'hibur', + 'penghibur': 'hibur', + 'penghiburnya': 'hibur', + 'penghiburan': 'hibur', + 'penghiburku': 'hibur', + 'menghibur': 'hibur', + 'menghiburnya': 'hibur', + 'menghiburlah': 'hibur', + 'menghiburkan': 'hibur', + 'menghiburan': 'hibur', + 'menghiburku': 'hibur', + 'menghiburmu': 'hibur', + 'penghiburannya': 'hibur', + 'hidangan': 'hidang', + 'hidangannya': 'hidang', + 'hidanganmu': 'hidang', + 'terhidang': 'hidang', + 'sehidangan': 'hidang', + 'berhidangan': 'hidang', + 'penghidangan': 'hidang', + 'menghidangkan': 'hidang', + 'menghidangkannya': 'hidang', + 'menghidrogenasi': 'hidrogenasi', + 'menghidrolisis': 'hidrolisis', + 'menghidroponikkan': 'hidroponik', + 'penghidu': 'hidu', + 'menghidu': 'hidu', + 'menghidukan': 'hidu', + 'penghiduan': 'hidu', + 'kehidupan': 'hidup', + 'kehidupannya': 'hidup', + 'kehidupanan': 'hidup', + 'kehidupanku': 'hidup', + 'kehidupanmu': 'hidup', + 'menghidupi': 'hidup', + 'menghidupinya': 'hidup', + 'menghidupimu': 'hidup', + 'memperhidup': 'hidup', + 'penghidupan': 'hidup', + 'penghidupannya': 'hidup', + 'menghidupkan': 'hidup', + 'menghidupkannya': 'hidup', + 'menghierarkikan': 'hierarki', + 'berhijau daun': 'hijau daun', + 'hijauan': 'hijau', + 'hijauannya': 'hijau', + 'penghijau': 'hijau', + 'penghijauan': 'hijau', + 'menghijau': 'hijau', + 'menghijaunya': 'hijau', + 'menghijaukan': 'hijau', + 'penghijauannya': 'hijau', + 'kehijau-hijauan': 'hijau', + 'penghijrahan': 'hijrah', + 'menghijrahkan': 'hijrah', + 'menghijrahkannya': 'hijrah', + 'berhikayat': 'hikayat', + 'menghikayatkan': 'hikayat', + 'berhikmah': 'hikmah', + 'menghilang': 'hilang', + 'menghilangnya': 'hilang', + 'menghilanglah': 'hilang', + 'menghilangkan': 'hilang', + 'menghilangkannya': 'hilang', + 'menghilangi': 'hilang', + 'menghilangan': 'hilang', + 'kehilangan': 'hilang', + 'kehilangannya': 'hilang', + 'kehilanganlah': 'hilang', + 'kehilanganan': 'hilang', + 'kehilanganku': 'hilang', + 'kehilanganmu': 'hilang', + 'penghilangan': 'hilang', + 'penghilangannya': 'hilang', + 'hilang-hilang': 'hilang', + 'hilang-hilangan': 'hilang', + 'menghilangkani': 'hilang', + 'berhilau': 'hilau', + 'berhilau-hilau': 'hilau', + 'sehilir': 'hilir', + 'menghilir': 'hilir', + 'menghilirkan': 'hilir', + 'berhiliran': 'hilir', + 'menghiliri': 'hilir', + 'himpunan': 'himpun', + 'himpunanan': 'himpun', + 'berhimpun': 'himpun', + 'berhimpunnya': 'himpun', + 'berhimpunan': 'himpun', + 'terhimpun': 'himpun', + 'terhimpunnya': 'himpun', + 'terhimpunlah': 'himpun', + 'menghimpun': 'himpun', + 'menghimpunnya': 'himpun', + 'menghimpunan': 'himpun', + 'perhimpunan': 'himpun', + 'perhimpunannya': 'himpun', + 'penghimpunan': 'himpun', + 'penghimpunannya': 'himpun', + 'menghimpunkan': 'himpun', + 'menghinadinakan': 'hina dina', + 'hinaan': 'hina', + 'hinaannya': 'hina', + 'sehina': 'hina', + 'terhina': 'hina', + 'terhinanya': 'hina', + 'terhinakan': 'hina', + 'berhina': 'hina', + 'menghina': 'hina', + 'menghinanya': 'hina', + 'menghinalah': 'hina', + 'menghinakan': 'hina', + 'menghinakannya': 'hina', + 'menghinaku': 'hina', + 'menghinamu': 'hina', + 'kehinaan': 'hina', + 'penghinaan': 'hina', + 'penghinaannya': 'hina', + 'penghinaanlah': 'hina', + 'hina-menghinakan': 'hina', + 'menghinap-hinap': 'hinap', + 'terhindar': 'hindar', + 'terhindarnya': 'hindar', + 'terhindarlah': 'hindar', + 'terhindarkan': 'hindar', + 'terhindarkannya': 'hindar', + 'terhindari': 'hindar', + 'menghindar': 'hindar', + 'menghindarnya': 'hindar', + 'menghindarlah': 'hindar', + 'menghindarkan': 'hindar', + 'menghindarkannya': 'hindar', + 'menghindari': 'hindar', + 'menghindarinya': 'hindar', + 'menghindarikan': 'hindar', + 'menghindariku': 'hindar', + 'menghindarimu': 'hindar', + 'penghindaran': 'hindar', + 'penghindarannya': 'hindar', + 'berhindu': 'hindu', + 'berhingga': 'hingga', + 'terhingga': 'hingga', + 'perhinggaan': 'hingga', + 'menghinggakan': 'hingga', + 'menghinggakannya': 'hingga', + 'memperhinggakan': 'hingga', + 'menghinggapi': 'hinggap', + 'menghinggapinya': 'hinggap', + 'menghinggapiku': 'hinggap', + 'menghinggut': 'hinggut', + 'terhinggut-hinggut': 'hinggut', + 'menghipnosis': 'hipnosis', + 'menghipnosisnya': 'hipnosis', + 'kehiponiman': 'hiponim', + 'menghirap': 'hirap', + 'menghiraukan': 'hirau', + 'menghiraukannya': 'hirau', + 'menghiraukanku': 'hirau', + 'menghiruk': 'hiruk', + 'penghiruk': 'hiruk', + 'menghirukkan': 'hiruk', + 'menghirup': 'hirup', + 'menghirupnya': 'hirup', + 'penghirupan': 'hirup', + 'terhisab': 'hisab', + 'menghisab': 'hisab', + 'menghisabkan': 'hisab', + 'menghitam': 'hitam', + 'menghitamnya': 'hitam', + 'menghitamkan': 'hitam', + 'menghitamkannya': 'hitam', + 'penghitam': 'hitam', + 'penghitaman': 'hitam', + 'kehitaman': 'hitam', + 'menghitami': 'hitam', + 'kehitam-hitaman': 'hitam', + 'kehitam-hitamanan': 'hitam', + 'menghitamputihkan': 'hitam putih', + 'menghitam-memutihkan': 'hitam putih', + 'hitungan': 'hitung', + 'hitungannya': 'hitung', + 'hitungannyalah': 'hitung', + 'hitunganku': 'hitung', + 'terhitung': 'hitung', + 'terhitungnya': 'hitung', + 'terhitunglah': 'hitung', + 'terhitungkan': 'hitung', + 'terhitungan': 'hitung', + 'berhitung': 'hitung', + 'berhitungnya': 'hitung', + 'menghitung': 'hitung', + 'menghitungnya': 'hitung', + 'menghitungkan': 'hitung', + 'menghitungi': 'hitung', + 'menghitungan': 'hitung', + 'perhitungan': 'hitung', + 'perhitungannya': 'hitung', + 'perhitunganku': 'hitung', + 'perhitunganmu': 'hitung', + 'penghitungan': 'hitung', + 'penghitungannya': 'hitung', + 'hitung-hitung': 'hitung', + 'hitung-hitungnya': 'hitung', + 'hitung-hitungan': 'hitung', + 'hitung-hitungannya': 'hitung', + 'hitung-hitunganan': 'hitung', + 'memperhitungkan': 'hitung', + 'memperhitungkannya': 'hitung', + 'memperhitungkanku': 'hitung', + 'menghitung-hitung': 'hitung', + 'menghitung-hitungnya': 'hitung', + 'penghobi': 'hobi', + 'penghobinya': 'hobi', + 'berhoki': 'hoki', + 'menghomoi': 'homo', + 'kehomofonan': 'homofon', + 'kehomogenan': 'homogen', + 'kehomografan': 'homograf', + 'kehomoniman': 'homonim', + 'menghonori': 'honor', + 'perhotelan': 'hotel', + 'perhotelannya': 'hotel', + 'berhujah': 'hujah', + 'menghujananginkan': 'hujan angin', + 'berhujan': 'hujan', + 'kehujanan': 'hujan', + 'kehujananan': 'hujan', + 'menghujan': 'hujan', + 'menghujankan': 'hujan', + 'menghujani': 'hujan', + 'menghujaninya': 'hujan', + 'menghujaniku': 'hujan', + 'memperhujankan': 'hujan', + 'berhujan-hujan': 'hujan', + 'berhujan-hujanan': 'hujan', + 'menghujan-hujankan': 'hujan', + 'menghujanpanaskan': 'hujan panas', + 'hujatan': 'hujat', + 'hujatannya': 'hujat', + 'hujatanmu': 'hujat', + 'menghujat': 'hujat', + 'menghujatnya': 'hujat', + 'penghujat': 'hujat', + 'penghujatnya': 'hujat', + 'penghujatan': 'hujat', + 'penghujung': 'hujung', + 'penghujungnya': 'hujung', + 'kehujungan': 'hujung', + 'hukuman': 'hukum', + 'hukumannya': 'hukum', + 'hukumanan': 'hukum', + 'hukumanku': 'hukum', + 'hukumanmu': 'hukum', + 'hukuman-mu': 'hukum', + 'berhukum': 'hukum', + 'terhukum': 'hukum', + 'terhukumnya': 'hukum', + 'menghukum': 'hukum', + 'menghukumnya': 'hukum', + 'menghukumi': 'hukum', + 'menghukuman': 'hukum', + 'menghukumku': 'hukum', + 'menghukummu': 'hukum', + 'kehukuman': 'hukum', + 'menghukumkan': 'hukum', + 'berhulu': 'hulu', + 'menghulu': 'hulu', + 'penghuluan': 'hulu', + 'berhulukan': 'hulu', + 'menghulukan': 'hulu', + 'berhuma': 'huma', + 'perhumaan': 'huma', + 'memperhuma': 'huma', + 'dihumasi': 'humas', + 'kehumasan': 'humas', + 'kehumasannya': 'humas', + 'perhumasan': 'humas', + 'terhunjam': 'hunjam', + 'menghunjam': 'hunjam', + 'menghunjamnya': 'hunjam', + 'menghunjamkan': 'hunjam', + 'menghunjamkannya': 'hunjam', + 'menghunjami': 'hunjam', + 'terhunus': 'hunus', + 'terhunusnya': 'hunus', + 'menghunus': 'hunus', + 'menghunuskan': 'hunus', + 'menghunuskannya': 'hunus', + 'berhura-hura': 'hura-hura', + 'berhuruf': 'huruf', + 'menghutan': 'hutan', + 'menghutankan': 'hutan', + 'menghutani': 'hutan', + 'kehutanan': 'hutan', + 'kehutanannya': 'hutan', + 'kehutananlah': 'hutan', + 'kehutananan': 'hutan', + 'perhutanan': 'hutan', + 'penghutanan': 'hutan', + 'terhuyung': 'huyung', + 'seia': 'ia', + 'seiaku': 'ia', + 'beria': 'ria', + 'beriakan': 'riak', + 'beriaku': 'ria', + 'beria-ia': 'ia', + 'mengiakan': 'ia', + 'mengiakannya': 'ia', + 'pengiba': 'iba', + 'keibaan': 'iba', + 'keibaannya': 'iba', + 'mengibai': 'iba', + 'mengibakan': 'iba', + 'beriba-iba': 'iba', + 'beribadah': 'ibadah', + 'beribadahnya': 'ibadah', + 'peribadahan': 'ibadah', + 'peribadahannya': 'ibadah', + 'beribadat': 'ibadat', + 'beribadatan': 'ibadat', + 'peribadatan': 'ibadat', + 'peribadatannya': 'ibadat', + 'beribarat': 'ibarat', + 'pengibaratan': 'ibarat', + 'mengibaratkan': 'ibarat', + 'mengibaratkannya': 'ibarat', + 'mengibing': 'ibing', + 'mengibrit': 'ibrit', + 'beribu': 'ibu', + 'beribukan': 'ibu', + 'keibuan': 'ibu', + 'keibuannya': 'ibu', + 'mengicip': 'icip', + 'mengicipi': 'icip', + 'mengidah': 'idah', + 'mengidahkan': 'idah', + 'idaman': 'idam', + 'idamannya': 'idam', + 'idamanku': 'idam', + 'idamanmu': 'idam', + 'mengidam': 'idam', + 'mengidamnya': 'idam', + 'mengidamkan': 'idam', + 'mengidamkannya': 'idam', + 'idam-idam': 'idam', + 'idam-idamkan': 'idam', + 'idam-idamkannya': 'idam', + 'idam-idaman': 'idam', + 'mengidam-idamkan': 'idam', + 'mengidam-idamkannya': 'idam', + 'idapan': 'idap', + 'pengidap': 'idap', + 'pengidapnya': 'idap', + 'pengidapan': 'idap', + 'mengidap': 'idap', + 'mengidapnya': 'idap', + 'mengidapkan': 'idap', + 'seidas': 'idas', + 'mengidas': 'idas', + 'mengidealkan': 'ideal', + 'mengidealisasikan': 'idealisasi', + 'mengidentifikasi': 'identifikasi', + 'mengidentifikasinya': 'identifikasi', + 'mengidentifikasikan': 'identifikasi', + 'mengidentifikasikannya': 'identifikasi', + 'mengidentifikasii': 'identifikasi', + 'mengidentikkan': 'identik', + 'mengidentikkannya': 'identik', + 'beridentitas': 'identitas', + 'beridentitaskan': 'identitas', + 'berideologi': 'ideologi', + 'berideologikan': 'ideologi', + 'pengidolaan': 'idola', + 'mengidolakan': 'idola', + 'mengidolakannya': 'idola', + 'mengidolakanmu': 'idola', + 'periduan': 'ridu', + 'mengigal': 'igal', + 'igauan': 'igau', + 'igauannya': 'igau', + 'terigau': 'igau', + 'mengigau': 'igau', + 'mengigaunya': 'igau', + 'pengigau': 'igau', + 'mengigaukan': 'igau', + 'igau-igauan': 'igau', + 'terigau-igau': 'igau', + 'berihram': 'ihram', + 'mengihtimalkan': 'ihtimal', + 'berijab': 'ijab', + 'mengijabkan': 'ijab', + 'berijazah': 'ijazah', + 'berijazahkan': 'ijazah', + 'berijmak': 'ijmak', + 'mengijmalkan': 'ijmal', + 'pengijon': 'ijon', + 'pengijonan': 'ijon', + 'berijtihad': 'ijtihad', + 'terijuk': 'ijuk', + 'mengijuk': 'ijuk', + 'ikalan': 'ikal', + 'mengikal': 'ikal', + 'ikanan': 'ikan', + 'berikan': 'ikan', + 'berikannya': 'ikan', + 'berikanlah': 'ikan', + 'berikanan': 'ikan', + 'berikanku': 'ikan', + 'pengikan': 'ikan', + 'perikanan': 'ikan', + 'perikanannya': 'ikan', + 'perikananan': 'ikan', + 'ikatan': 'ikat', + 'ikatannya': 'ikat', + 'ikatanmu': 'ikat', + 'terikat': 'ikat', + 'terikatnya': 'ikat', + 'terikati': 'ikat', + 'terikatan': 'ikat', + 'berikat': 'ikat', + 'berikatnya': 'ikat', + 'berikatan': 'ikat', + 'pengikat': 'ikat', + 'pengikatnya': 'ikat', + 'pengikatan': 'ikat', + 'pengikatmu': 'ikat', + 'mengikat': 'ikat', + 'mengikatnya': 'ikat', + 'mengikatkan': 'ikat', + 'mengikatkannya': 'ikat', + 'mengikatku': 'ikat', + 'mengikatmu': 'ikat', + 'perikatan': 'ikat', + 'perikatannya': 'ikat', + 'keterikatan': 'ikat', + 'keterikatannya': 'ikat', + 'keikhlasan': 'ikhlas', + 'keikhlasannya': 'ikhlas', + 'keikhlasanmu': 'ikhlas', + 'mengikhlaskan': 'ikhlas', + 'mengikhlaskannya': 'ikhlas', + 'mengikhtisarkan': 'ikhtisar', + 'seikhwan': 'ikhwan', + 'pengiklan': 'iklan', + 'pengiklannya': 'iklan', + 'pengiklanan': 'iklan', + 'periklanan': 'iklan', + 'periklanannya': 'iklan', + 'pengiklanannya': 'iklan', + 'mengiklankan': 'iklan', + 'mengiklankannya': 'iklan', + 'beriklim': 'iklim', + 'keikliman': 'iklim', + 'beriktikad': 'iktikad', + 'mengiktikadkan': 'iktikad', + 'keikutsertaan': 'ikut serta', + 'keikutsertaannya': 'ikut serta', + 'keikutsertaanku': 'ikut serta', + 'pengikutsertaan': 'ikut serta', + 'mengikutsertakan': 'ikut serta', + 'mengikutsertakannya': 'ikut serta', + 'berilah': 'ilah', + 'keilahan': 'ilah', + 'keilahian': 'ilahi', + 'mengilai': 'ilai', + 'mengilai-ilai': 'ilai', + 'mengilar': 'ilar', + 'mengilas': 'kilas', + 'mengiler': 'iler', + 'mengiles': 'iles', + 'mengilhami': 'ilham', + 'mengilhaminya': 'ilham', + 'mengilhamiku': 'ilham', + 'pengilhaman': 'ilham', + 'mengilhamkan': 'ilham', + 'mengili': 'kili', + 'ilingan': 'iling', + 'mengiling': 'iling', + 'mengilingi': 'iling', + 'pengilingan': 'iling', + 'mengilmiahkan': 'ilmiah', + 'berilmu': 'ilmu', + 'keilmuan': 'ilmu', + 'keilmuannya': 'ilmu', + 'keilmuanan': 'ilmu', + 'mengilmukan': 'ilmu', + 'mengilustrasikan': 'ilustrasi', + 'mengilustrasikannya': 'ilustrasi', + 'mengimak': 'imak', + 'mengimak-imak': 'imak', + 'keimaman': 'imam', + 'keimamannya': 'imam', + 'mengimami': 'imam', + 'mengimbak-imbak': 'imbak', + 'imbalan': 'imbal', + 'imbalannya': 'imbal', + 'imbalani': 'imbal', + 'pengimbal': 'imbal', + 'mengimbal': 'imbal', + 'mengimbali': 'imbal', + 'pengimbalan': 'imbal', + 'mengimbalkan': 'imbal', + 'imbangan': 'imbang', + 'imbangannya': 'imbang', + 'seimbang': 'imbang', + 'seimbangnya': 'imbang', + 'seimbanglah': 'imbang', + 'seimbangkan': 'imbang', + 'seimbangi': 'imbang', + 'seimbangan': 'imbang', + 'berimbang': 'imbang', + 'berimbangnya': 'imbang', + 'berimbanglah': 'imbang', + 'berimbangan': 'imbang', + 'mengimbang': 'imbang', + 'mengimbangkan': 'imbang', + 'mengimbangi': 'imbang', + 'keimbangan': 'imbang', + 'pengimbang': 'imbang', + 'pengimbangnya': 'imbang', + 'pengimbangi': 'imbang', + 'pengimbangan': 'imbang', + 'perimbangan': 'imbang', + 'perimbangannya': 'imbang', + 'mengimbanginya': 'imbang', + 'mengimbangiku': 'imbang', + 'keseimbangan': 'imbang', + 'keseimbangannya': 'imbang', + 'keseimbanganlah': 'imbang', + 'keseimbanganmu': 'imbang', + 'memperimbang': 'imbang', + 'memperimbangkan': 'imbang', + 'memperimbangan': 'imbang', + 'menyeimbangkan': 'imbang', + 'menyeimbangkannya': 'imbang', + 'imbang-imbangan': 'imbang', + 'memperseimbangkan': 'imbang', + 'terimbas': 'imbas', + 'terimbasnya': 'imbas', + 'terimbasi': 'imbas', + 'berimbas': 'imbas', + 'berimbasnya': 'imbas', + 'mengimbas': 'imbas', + 'mengimbasi': 'imbas', + 'imbauan': 'imbau', + 'imbauannya': 'imbau', + 'imbauanlah': 'imbau', + 'terimbau': 'imbau', + 'mengimbau': 'imbau', + 'mengimbaunya': 'imbau', + 'mengimbaukan': 'imbau', + 'mengimbaui': 'imbau', + 'mengimbauan': 'imbau', + 'pengimbauan': 'imbau', + 'mengimbit': 'imbit', + 'imbuhan': 'imbuh', + 'mengimbuh': 'imbuh', + 'mengimbuhkan': 'imbuh', + 'mengimbuhi': 'imbuh', + 'mengimbuhinya': 'imbuh', + 'mengiming-iming': 'iming-iming', + 'mengiming-imingnya': 'iming-iming', + 'mengiming-imingkan': 'iming-iming', + 'mengiming-imingi': 'iming-iming', + 'mengiming-imingan': 'iming-iming', + 'mengimitasi': 'imitasi', + 'mengimitasinya': 'imitasi', + 'mengimkan': 'imkan', + 'mengimlakan': 'imla', + 'mengimpas': 'impas', + 'mengimpaskan': 'impas', + 'impian': 'impi', + 'impiannya': 'impi', + 'impianku': 'impi', + 'impianmu': 'impi', + 'mengimpikan': 'impi', + 'mengimpikannya': 'impi', + 'terimpi-impi': 'impi', + 'impitan': 'impit', + 'berimpit': 'impit', + 'berimpitan': 'impit', + 'terimpit': 'impit', + 'mengimpit': 'impit', + 'mengimpitnya': 'impit', + 'memperimpit': 'impit', + 'mengimpitkan': 'impit', + 'berimpit-impit': 'impit', + 'berimpit-impitan': 'impit', + 'memperimpit-impitkan': 'impit', + 'mengimplementasikan': 'implementasi', + 'mengimplementasikannya': 'implementasi', + 'berimplikasi': 'implikasi', + 'terimplikasi': 'implikasi', + 'mengimplikasikan': 'implikasi', + 'mengimplisitkan': 'implisit', + 'mengimpor': 'impor', + 'mengimpornya': 'impor', + 'pengimpor': 'impor', + 'pengimpornya': 'impor', + 'pengimporan': 'impor', + 'berimprovisasi': 'improvisasi', + 'berimprovisasinya': 'improvisasi', + 'mengimprovisasikan': 'improvisasi', + 'keimunan': 'imun', + 'pengimunan': 'imun', + 'berinai': 'inai', + 'menginai': 'inai', + 'menginang': 'kinang', + 'inang-inang': 'inang', + 'menginap': 'inap', + 'menginapnya': 'inap', + 'menginaplah': 'inap', + 'menginapkan': 'inap', + 'menginapkannya': 'inap', + 'menginapan': 'inap', + 'penginapan': 'inap', + 'penginapannya': 'inap', + 'penginapanan': 'inap', + 'inca-binca': 'inca', + 'incaran': 'incar', + 'incarannya': 'incar', + 'incaranku': 'incar', + 'incaranmu': 'incar', + 'mengincar': 'incar', + 'mengincarnya': 'incar', + 'mengincarkan': 'incar', + 'mengincarkannya': 'incar', + 'mengincari': 'incar', + 'mengincarku': 'incar', + 'mengincarmu': 'incar', + 'terincit': 'incit', + 'mengincitkan': 'incit', + 'mengincrit-incrit': 'incrit', + 'terincut-incut': 'incut', + 'terindah': 'indah', + 'terindahnya': 'indah', + 'terindahku': 'indah', + 'keindahan': 'indah', + 'keindahannya': 'indah', + 'keindahanmu': 'indah', + 'pengindah': 'indah', + 'pengindahan': 'indah', + 'memperindah': 'indah', + 'memperindahnya': 'indah', + 'mengindahkan': 'indah', + 'mengindahkannya': 'indah', + 'terindang': 'indang', + 'mengindang': 'indang', + 'berindap-indap': 'indap', + 'mengindekoskan': 'indekos', + 'mengindik': 'indik', + 'berindikasi': 'indikasi', + 'berindikasikan': 'indikasi', + 'mengindikasikan': 'indikasi', + 'mengindikasikannya': 'indikasi', + 'menginding': 'inding', + 'mengindoktrinasi': 'indoktrinasi', + 'keindonesiaan': 'indonesia', + 'keindonesiaannya': 'indonesia', + 'pengindonesiaan': 'indonesia', + 'mengindonesiakan': 'indonesia', + 'pengindra': 'indra', + 'pengindranya': 'indra', + 'pengindraan': 'indra', + 'mengindra': 'indra', + 'keindraan': 'indra', + 'perinduan': 'indu', + 'seperinduan': 'indu', + 'berinduk': 'induk', + 'berindukkan': 'induk', + 'berinduki': 'induk', + 'menginduk': 'induk', + 'menginduki': 'induk', + 'keindukan': 'induk', + 'seperinduk': 'induk', + 'menginduksi': 'induksi', + 'menginduksikan': 'induksi', + 'perindustrian': 'industri', + 'perindustriannya': 'industri', + 'mengindustrikan': 'industri', + 'inefisiensi': 'inefisien', + 'inefisiensinya': 'inefisien', + 'menginfakkan': 'infak', + 'menginfakkannya': 'infak', + 'terinfeksi': 'infeksi', + 'terinfeksinya': 'infeksi', + 'menginfeksi': 'infeksi', + 'menginfeksinya': 'infeksi', + 'menginfeksikan': 'infeksi', + 'berinfiltrasi': 'infiltrasi', + 'menginfiltrasi': 'infiltrasi', + 'menginfiltrasikan': 'infiltrasi', + 'berinfleksi': 'infleksi', + 'menginformasikan': 'informasi', + 'menginformasikannya': 'informasi', + 'menginformasikankan': 'informasi', + 'menginformasikanku': 'informasi', + 'menginfus': 'infus', + 'teringa-inga': 'inga', + 'mengingari': 'ingar', + 'ingar-ingar': 'ingar', + 'mengingarkan': 'ingar', + 'ingar-bingar': 'ingar', + 'ingar-bingarnya': 'ingar', + 'ingatan': 'ingat', + 'ingatannya': 'ingat', + 'ingatanku': 'ingat', + 'seingat': 'ingat', + 'seingatnya': 'ingat', + 'seingatku': 'ingat', + 'beringat': 'ingat', + 'teringat': 'ingat', + 'teringatlah': 'ingat', + 'mengingat': 'ingat', + 'mengingatnya': 'ingat', + 'mengingatkan': 'ingat', + 'mengingatkannya': 'ingat', + 'mengingati': 'ingat', + 'mengingatan': 'ingat', + 'mengingatku': 'ingat', + 'mengingatmu': 'ingat', + 'mengingat-ku': 'ingat', + 'peringatan': 'ingat', + 'peringatannya': 'ingat', + 'peringatani': 'ingat', + 'peringatanan': 'ingat', + 'mengingatinya': 'ingat', + 'ingat-ingat': 'ingat', + 'ingat-ingatlah': 'ingat', + 'memperingati': 'ingat', + 'memperingatinya': 'ingat', + 'memperingatikan': 'ingat', + 'memperingatian': 'ingat', + 'mengingatkanlah': 'ingat', + 'mengingatkankan': 'ingat', + 'mengingatkanku': 'ingat', + 'mengingatkanmu': 'ingat', + 'ingat-ingatan': 'ingat', + 'memperingatkan': 'ingat', + 'memperingatkannya': 'ingat', + 'memperingatkankan': 'ingat', + 'memperingatkanku': 'ingat', + 'memperingatkanmu': 'ingat', + 'beringat-ingat': 'ingat', + 'teringat-ingat': 'ingat', + 'mengingat-ingat': 'ingatan', + 'mengingat-ingatnya': 'ingatan', + 'mengingat-ingatkan': 'ingatan', + 'mengingau': 'ingau', + 'mengingaukan': 'ingau', + 'ingau-ingauan': 'ingau', + 'menginggriskan': 'inggris', + 'keinggris-inggrisan': 'inggris', + 'keinginan': 'ingin', + 'keinginannya': 'ingin', + 'keinginanan': 'ingin', + 'keinginanku': 'ingin', + 'keinginanmu': 'ingin', + 'mengingini': 'ingin', + 'memperingin': 'ingin', + 'berkeinginan': 'ingin', + 'berkeinginannya': 'ingin', + 'menginginkan': 'ingin', + 'menginginkannya': 'ingin', + 'menginginkankan': 'ingin', + 'menginginkanku': 'ingin', + 'menginginkanmu': 'ingin', + 'keingintahuan': 'ingin tahu', + 'keingintahuannya': 'ingin tahu', + 'keingintahuanku': 'ingin tahu', + 'keingkaran': 'ingkar', + 'keingkarannya': 'ingkar', + 'mengingkari': 'ingkar', + 'mengingkarinya': 'ingkar', + 'pengingkaran': 'ingkar', + 'mengingsar': 'ingsar', + 'ingsutan': 'ingsut', + 'beringsut': 'ingsut', + 'beringsutnya': 'ingsut', + 'mengingsut': 'ingsut', + 'mengingsutkan': 'ingsut', + 'ingusan': 'ingus', + 'mengingusi': 'ingus', + 'berinisial': 'inisial', + 'berinisialnya': 'inisial', + 'berinisialkan': 'inisial', + 'menginisiasikan': 'inisiasi', + 'menginisiasikannya': 'inisiasi', + 'berinisiatif': 'inisiatif', + 'berinisiatiflah': 'inisiatif', + 'injakan': 'injak', + 'injakannya': 'injak', + 'terinjak': 'injak', + 'terinjaknya': 'injak', + 'menginjak': 'injak', + 'menginjaknya': 'injak', + 'menginjakkan': 'injak', + 'menginjaki': 'injak', + 'menginjakan': 'injak', + 'injak-injak': 'injak', + 'injak-injaklah': 'injak', + 'injak-injakan': 'injak', + 'terinjak-injak': 'injak', + 'terinjak-injaknya': 'injak', + 'menginjak-injak': 'injak', + 'menginjak-injaknya': 'injak', + 'menginjak-injakkan': 'injak', + 'menginjap': 'injap', + 'menginjeksi': 'injeksi', + 'menginjeksinya': 'injeksi', + 'menginjeksikan': 'injeksi', + 'menginjil': 'injil', + 'menginjili': 'injil', + 'penginjil': 'injil', + 'penginjilan': 'injil', + 'penginjilannya': 'injil', + 'berinkarnasi': 'inkarnasi', + 'menginkorporasikan': 'inkorporasi', + 'menginovasikan': 'inovasi', + 'keinsafan': 'insaf', + 'menginsafi': 'insaf', + 'menginsafkan': 'insaf', + 'berinsang': 'insang', + 'menginsinuasi': 'insinuasi', + 'menginspeksi': 'inspeksi', + 'menginspeksinya': 'inspeksi', + 'menginspeksiku': 'inspeksi', + 'terinspirasi': 'inspirasi', + 'terinspirasinya': 'inspirasi', + 'menginspirasi': 'inspirasi', + 'menginspirasinya': 'inspirasi', + 'menginspirasikan': 'inspirasi', + 'menginspirasiku': 'inspirasi', + 'menginspirasimu': 'inspirasi', + 'menginstruksikan': 'instruksi', + 'menginstruksikannya': 'instruksi', + 'mengintai': 'intai', + 'mengintainya': 'intai', + 'mengintaian': 'intai', + 'pengintai': 'intai', + 'pengintainya': 'intai', + 'pengintaian': 'intai', + 'pengintaiannya': 'intai', + 'mengintaikan': 'intai', + 'pengintensifan': 'intensif', + 'pengintensifannya': 'intensif', + 'mengintensifkan': 'intensif', + 'mengintensifkannya': 'intensif', + 'pengintensifikasian': 'intensifikasi', + 'menginterlokal': 'interlokal', + 'menginternasional': 'internasional', + 'menginternasionalkan': 'internasional', + 'penginternasionalan': 'internasional', + 'interniran': 'internir', + 'menginternir': 'internir', + 'menginternirnya': 'internir', + 'menginterogasi': 'interogasi', + 'menginterogasinya': 'interogasi', + 'menginterogasiku': 'interogasi', + 'penginterpretasi': 'interpretasi', + 'penginterpretasian': 'interpretasi', + 'menginterpretasikan': 'interpretasi', + 'menginterpretasikannya': 'interpretasi', + 'menginterupsi': 'interupsi', + 'menginterupsinya': 'interupsi', + 'terintervensi': 'intervensi', + 'mengintervensi': 'intervensi', + 'mengintervensinya': 'intervensi', + 'menginterviu': 'interviu', + 'penginti': 'inti', + 'pengintian': 'inti', + 'perintian': 'inti', + 'keintiman': 'intim', + 'keintimannya': 'intim', + 'mengintimi': 'intim', + 'mengintiminya': 'intim', + 'mengintimidasi': 'intimidasi', + 'mengintimidasinya': 'intimidasi', + 'mengintimidasimu': 'intimidasi', + 'mengintip': 'intip', + 'mengintipnya': 'intip', + 'mengintipkan': 'intip', + 'mengintroduksi': 'introduksi', + 'mengintroduksikan': 'introduksi', + 'berintrospeksi': 'introspeksi', + 'mengintrospeksi': 'introspeksi', + 'mengintrospeksikan': 'introspeksi', + 'terintrusi': 'intrusi', + 'berinvasi': 'invasi', + 'menginvasi': 'invasi', + 'menginvasinya': 'invasi', + 'menginventarisasi': 'inventarisasi', + 'menginventarisasinya': 'inventarisasi', + 'menginventarisasikan': 'inventarisasi', + 'berinvestasi': 'investasi', + 'berinvestasinya': 'investasi', + 'berinvestasilah': 'investasi', + 'berinvestasikan': 'investasi', + 'menginvestasikan': 'investasi', + 'menginvestasikannya': 'investasi', + 'terion': 'ion', + 'terionkan': 'ion', + 'pengionan': 'ion', + 'mengionkan': 'ion', + 'terionisasi': 'ionisasi', + 'beripar': 'ipar', + 'mengiprit': 'iprit', + 'beripuh': 'ipuh', + 'ipukan': 'ipuk', + 'mengipuk': 'ipuk', + 'pengipukan': 'ipuk', + 'seiras': 'iras', + 'irasan': 'iras', + 'mengiras': 'iras', + 'iras-iras': 'iras', + 'mengiras-iras': 'iras', + 'mengiras-irasi': 'iras', + 'keirihatian': 'iri hati', + 'mengiri': 'kiri', + 'mengirinya': 'kiri', + 'mengirikan': 'kirik', + 'mengirikannya': 'kiri', + 'mengirimu': 'kiri', + 'keirian': 'iri', + 'keiriannya': 'iri', + 'pengiri': 'iri', + 'pengirinya': 'iri', + 'pengirian': 'iri', + 'pengirik': 'irik', + 'mengirik': 'kirik', + 'seiring': 'iring', + 'seiringnya': 'iring', + 'seiringi': 'iring', + 'seiringan': 'iring', + 'iringan': 'iring', + 'iringannya': 'iring', + 'beriring': 'iring', + 'beriringnya': 'iring', + 'beriringan': 'iring', + 'mengiring': 'iring', + 'mengiringnya': 'iring', + 'mengiringkan': 'iring', + 'mengiringi': 'iring', + 'mengiringan': 'iring', + 'pengiring': 'iring', + 'pengiringnya': 'iring', + 'pengiringi': 'iring', + 'pengiringan': 'iring', + 'mengiringinya': 'iring', + 'mengiringinyalah': 'iring', + 'mengiringimu': 'iring', + 'diiringkan': 'iring', + 'iring-iringan': 'iring', + 'iring-iringannya': 'iring', + 'beriring-iring': 'iring', + 'beriring-iringan': 'iring', + 'irisan': 'iris', + 'irisannya': 'iris', + 'mengiris': 'iris', + 'mengirisnya': 'iris', + 'iris-irisan': 'iris', + 'mengiriskan': 'iris', + 'mengiris-iris': 'iris', + 'mengiris-irisnya': 'iris', + 'mengiris-iriskan': 'iris', + 'mengirit': 'irit', + 'mengiritnya': 'irit', + 'mengiritkan': 'irit', + 'pengiritan': 'irit', + 'pengiritannya': 'irit', + 'terisak-isak': 'isak', + 'isapan': 'isap', + 'isapannya': 'isap', + 'mengisap': 'isap', + 'mengisapnya': 'isap', + 'pengisap': 'isap', + 'pengisapnya': 'isap', + 'pengisapan': 'isap', + 'mengisapkan': 'isap', + 'mengisbatkan': 'isbat', + 'mengisengi': 'iseng', + 'mengisenginya': 'iseng', + 'iseng-iseng': 'iseng', + 'iseng-isengnya': 'iseng', + 'iseng-isengan': 'iseng', + 'mengislahkan': 'islah', + 'keislaman': 'islam', + 'keislamannya': 'islam', + 'keislamanan': 'islam', + 'keislamanku': 'islam', + 'pengislaman': 'islam', + 'mengislamkan': 'islam', + 'terisolasi': 'isolasi', + 'terisolasinya': 'isolasi', + 'pengisolasi': 'isolasi', + 'pengisolasian': 'isolasi', + 'mengisolasi': 'isolasi', + 'mengisolasinya': 'isolasi', + 'mengisolasikan': 'isolasi', + 'pengisolasiannya': 'isolasi', + 'mengistiadatkan': 'istiadat', + 'beristibdad': 'istibdad', + 'beristigfar': 'istigfar', + 'beristikharah': 'istikharah', + 'mengistikmalkan': 'istikmal', + 'peristilahan': 'istilah', + 'pengistilahan': 'istilah', + 'mengistilahkan': 'istilah', + 'mengistilahkannya': 'istilah', + 'teristimewa': 'istimewa', + 'teristimewanya': 'istimewa', + 'teristimewaku': 'istimewa', + 'keistimewaan': 'istimewa', + 'keistimewaannya': 'istimewa', + 'mengistimewakan': 'istimewa', + 'mengistimewakannya': 'istimewa', + 'beristinja': 'istinja', + 'beristirahat': 'istirahat', + 'beristirahatnya': 'istirahat', + 'beristirahatlah': 'istirahat', + 'peristirahatan': 'istirahat', + 'peristirahatannya': 'istirahat', + 'peristirahatanmu': 'istirahat', + 'mengistirahatkan': 'istirahat', + 'mengistirahatkannya': 'istirahat', + 'beristri': 'istri', + 'beristrikan': 'istri', + 'memperistri': 'istri', + 'memperistrinya': 'istri', + 'memperistrikan': 'istri', + 'mengisukan': 'isu', + 'mengisyaratkan': 'isyarat', + 'mengisyaratkannya': 'isyarat', + 'itulah': 'itu', + 'itulahnya': 'itu', + 'itulahlah': 'itu', + 'iuran': 'iur', + 'iurannya': 'iur', + 'iuranmu': 'iur', + 'beriuran': 'iur', + 'seizin': 'izin', + 'seizinnya': 'izin', + 'seizinkan': 'izin', + 'seizini': 'izin', + 'seizinmu': 'izin', + 'keizinan': 'izin', + 'perizinan': 'izin', + 'perizinannya': 'izin', + 'perizinanan': 'izin', + 'perizinanku': 'izin', + 'terizinkan': 'izin', + 'mengizinkan': 'izin', + 'mengizinkannya': 'izin', + 'mengizinkankan': 'izin', + 'mengizinkanku': 'izin', + 'mengizinkanmu': 'izin', + 'menjabal': 'jabal', + 'penjabalan': 'jabal', + 'jabaran': 'jabar', + 'jabarannya': 'jabar', + 'penjabaran': 'jabar', + 'penjabarannya': 'jabar', + 'menjabarkan': 'jabar', + 'menjabarkannya': 'jabar', + 'terjabarkan': 'jabar', + 'sejabat': 'jabat', + 'sejabatnya': 'jabat', + 'pejabat': 'jabat', + 'pejabatnya': 'jabat', + 'pejabatlah': 'jabat', + 'pejabati': 'jabat', + 'pejabatan': 'jabat', + 'pejabatku': 'jabat', + 'jabatan': 'jabat', + 'jabatannya': 'jabat', + 'jabatani': 'jabat', + 'jabatanku': 'jabat', + 'jabatanmu': 'jabat', + 'penjabat': 'jabat', + 'penjabatnya': 'jabat', + 'penjabatan': 'jabat', + 'menjabat': 'jabat', + 'menjabatnya': 'jabat', + 'menjabatkan': 'jabat', + 'menjabati': 'jabat', + 'menjabatan': 'jabat', + 'berjabat tangan': 'jabat tangan', + 'berjabir-jabir': 'jabir', + 'menjadi': 'jadi', + 'menjadinya': 'jadi', + 'menjadilah': 'jadi', + 'menjadikan': 'jadi', + 'menjadikannya': 'jadi', + 'menjadii': 'jadi', + 'menjadian': 'jadi', + 'terjadi': 'jadi', + 'terjadinya': 'jadi', + 'terjadilah': 'jadi', + 'terjadikan': 'jadi', + 'terjadii': 'jadi', + 'terjadian': 'jadi', + 'penjadi': 'jadi', + 'kejadian': 'jadi', + 'kejadiannya': 'jadi', + 'kejadianlah': 'jadi', + 'kejadiani': 'jadi', + 'kejadianan': 'jadi', + 'penjadian': 'jadi', + 'menjadikankan': 'jadi', + 'menjadikanku': 'jadi', + 'menjadikanmu': 'jadi', + 'jadi-jadian': 'jadi', + 'jadi-jadiannya': 'jadi', + 'menjadi-jadi': 'jadi', + 'menjadi-jadinya': 'jadi', + 'sejadi-jadinya': 'jadi', + 'menjadi-jadikan': 'jadi', + 'terjadwal': 'jadwal', + 'terjadwalnya': 'jadwal', + 'terjadwalkan': 'jadwal', + 'penjadwalan': 'jadwal', + 'penjadwalannya': 'jadwal', + 'menjadwalkan': 'jadwal', + 'menjadwalkannya': 'jadwal', + 'terjaga': 'jaga', + 'terjaganya': 'jaga', + 'terjagalah': 'jaga', + 'penjaga': 'jaga', + 'penjaganya': 'jaga', + 'penjagaan': 'jaga', + 'penjagaku': 'jaga', + 'penjagamu': 'jaga', + 'berjaga': 'jaga', + 'berjaganya': 'jaga', + 'berjagalah': 'jaga', + 'berjagai': 'jaga', + 'menjaga': 'jaga', + 'menjaganya': 'jaga', + 'menjagalah': 'jaga', + 'menjagakan': 'jaga', + 'menjagai': 'jaga', + 'menjagaan': 'jaga', + 'menjagaku': 'jaga', + 'menjagamu': 'jaga', + 'penjagaannya': 'jaga', + 'berjaga-jaga': 'jaga', + 'berjaga-jagalah': 'jaga', + 'kejaga-jagaan': 'jaga', + 'jagalan': 'jagal', + 'berjagal': 'jagal', + 'menjagal': 'jagal', + 'menjagalnya': 'jagal', + 'pejagalan': 'jagal', + 'penjagalan': 'jagal', + 'penjagalannya': 'jagal', + 'sejagat': 'jagat', + 'jagoan': 'jago', + 'jagoannya': 'jago', + 'jagoanku': 'jago', + 'jagoanmu': 'jago', + 'menjagoi': 'jago', + 'menjagokan': 'jago', + 'menjagokannya': 'jago', + 'menjagung': 'jagung', + 'berjagung-jagung': 'jagung', + 'menjahanamkan': 'jahanam', + 'menjahar': 'jahar', + 'berjahat': 'jahat', + 'penjahat': 'jahat', + 'penjahatnya': 'jahat', + 'menjahati': 'jahat', + 'menjahatinya': 'jahat', + 'kejahatan': 'jahat', + 'kejahatannya': 'jahat', + 'kejahatanlah': 'jahat', + 'kejahatanan': 'jahat', + 'kejahatanku': 'jahat', + 'menjahatkan': 'jahat', + 'menjahili': 'jahil', + 'menjahilinya': 'jahil', + 'kejahilan': 'jahil', + 'kejahilannya': 'jahil', + 'jahitan': 'jahit', + 'jahitannya': 'jahit', + 'menjahit': 'jahit', + 'menjahitnya': 'jahit', + 'menjahitkan': 'jahit', + 'menjahitkannya': 'jahit', + 'menjahiti': 'jahit', + 'penjahit': 'jahit', + 'penjahitnya': 'jahit', + 'penjahitan': 'jahit', + 'menjaili': 'jail', + 'kejailan': 'jail', + 'jaipongan': 'jaipong', + 'berjaipong': 'jaipong', + 'jajahan': 'jajah', + 'jajahannya': 'jajah', + 'menjajah': 'jajah', + 'menjajahnya': 'jajah', + 'menjajahkan': 'jajah', + 'penjajah': 'jajah', + 'penjajahnya': 'jajah', + 'penjajahan': 'jajah', + 'terjajah': 'jajah', + 'terjajahnya': 'jajah', + 'menjajahi': 'jajah', + 'penjajahannya': 'jajah', + 'penjajahanlah': 'jajah', + 'menjajaki': 'jajak', + 'menjajakinya': 'jajak', + 'menjajal': 'jajal', + 'menjajalnya': 'jajal', + 'menjajalkan': 'jajal', + 'menjajali': 'jajal', + 'jajanan': 'jajan', + 'jajanannya': 'jajan', + 'jajananlah': 'jajan', + 'jajananan': 'jajan', + 'berjajan': 'jajan', + 'kejaksaan': 'jaksa', + 'kejaksaannya': 'jaksa', + 'kejaksaanlah': 'jaksa', + 'kejaksaannyalah': 'jaksa', + 'penjala': 'jala', + 'penjalaan': 'jala', + 'menjala': 'jala', + 'menjalakan': 'jala', + 'menjalakannya': 'jala', + 'menjalai': 'jala', + 'terjala': 'jala', + 'jala-jala': 'jala', + 'jala-jalanya': 'jala', + 'menjalakankan': 'jala', + 'menjalang': 'jalang', + 'menjalangi': 'jalang', + 'kejalangan': 'jalang', + 'menjalar': 'jalar', + 'menjalarnya': 'jalar', + 'menjalarkan': 'jalar', + 'menjalari': 'jalar', + 'berjalaran': 'jalar', + 'penjalaran': 'jalar', + 'penjalarannya': 'jalar', + 'berjalar-jalar': 'jalar', + 'terjali': 'jali', + 'terjalinya': 'jali', + 'menjalu': 'jalu', + 'berjalur': 'jalur', + 'berjalur-jalur': 'jalur', + 'berjam-jam': 'jam', + 'jamahan': 'jamah', + 'menjamah': 'jamah', + 'menjamahnya': 'jamah', + 'menjamahi': 'jamah', + 'menjamahku': 'jamah', + 'terjamah': 'jamah', + 'terjamahnya': 'jamah', + 'terjamahkan': 'jamah', + 'penjamah': 'jamah', + 'penjamahan': 'jamah', + 'jamah-jamahan': 'jamah', + 'menjamak': 'jamak', + 'kejamakan': 'jamak', + 'sejamaknya': 'jamak', + 'penjamakan': 'jamak', + 'menjamakkan': 'jamak', + 'sejambak': 'jambak', + 'penjambak': 'jambak', + 'penjambakan': 'jambak', + 'menjambak': 'jambak', + 'menjambaknya': 'jambak', + 'menjambaki': 'jambak', + 'jambak-jambakan': 'jambak', + 'jambangan': 'jambang', + 'sejambar': 'jambar', + 'berjambar': 'jambar', + 'jambatan': 'jambat', + 'jambatannya': 'jambat', + 'jambretan': 'jambret', + 'jambretannya': 'jambret', + 'menjambret': 'jambret', + 'menjambretnya': 'jambret', + 'penjambret': 'jambret', + 'penjambretnya': 'jambret', + 'penjambretan': 'jambret', + 'penjambretannya': 'jambret', + 'jambu-jambu': 'jambu', + 'berjambul': 'jambul', + 'jaminan': 'jamin', + 'jaminannya': 'jamin', + 'jaminanlah': 'jamin', + 'jaminanan': 'jamin', + 'penjamin': 'jamin', + 'penjaminnya': 'jamin', + 'penjaminan': 'jamin', + 'terjamin': 'jamin', + 'terjaminnya': 'jamin', + 'terjaminan': 'jamin', + 'menjamin': 'jamin', + 'menjaminnya': 'jamin', + 'menjaminlah': 'jamin', + 'menjaminkan': 'jamin', + 'menjaminkannya': 'jamin', + 'menjaminan': 'jamin', + 'menjaminku': 'jamin', + 'penjaminannya': 'jamin', + 'penjaminanan': 'jamin', + 'keterjaminan': 'jaminan', + 'jampian': 'jampi', + 'berjampi': 'jampi', + 'menjampi': 'jampi', + 'jampi-jampi': 'jampi', + 'jampi-jampinya': 'jampi', + 'menjampikan': 'jampi', + 'menjampuk': 'jampuk', + 'berjamrah': 'jamrah', + 'menjamur': 'jamur', + 'menjamurnya': 'jamur', + 'menjamurlah': 'jamur', + 'menjamurkan': 'jamur', + 'menjamuri': 'jamur', + 'berjamur': 'jamur', + 'berjamurnya': 'jamur', + 'berjamurlah': 'jamur', + 'berjamuran': 'jamur', + 'menjanda': 'janda', + 'penjangak': 'jangak', + 'menjangak': 'jangak', + 'jangankan': 'jangan', + 'jangankankan': 'jangan', + 'menjangankan': 'jangan', + 'jangan-jangan': 'jangan', + 'penjangat': 'jangat', + 'menjangat': 'jangat', + 'menjangati': 'jangat', + 'kejanggalan': 'janggal', + 'kejanggalannya': 'janggal', + 'kejanggalanan': 'janggal', + 'menjanggalkan': 'janggal', + 'berjangka': 'jangka', + 'berjangkanya': 'jangka', + 'menjangka': 'jangka', + 'menjangkakan': 'jangka', + 'menjangkai': 'jangka', + 'menjangkah': 'jangkah', + 'menjangkang': 'jangkang', + 'terjangkang': 'jangkang', + 'menjangkar': 'jangkar', + 'menjangkarkan': 'jangkar', + 'jangkauan': 'jangkau', + 'jangkauannya': 'jangkau', + 'jangkauanku': 'jangkau', + 'jangkauanmu': 'jangkau', + 'menjangkau': 'jangkau', + 'menjangkaunya': 'jangkau', + 'menjangkauan': 'jangkau', + 'terjangkau': 'jangkau', + 'terjangkaunya': 'jangkau', + 'terjangkaulah': 'jangkau', + 'terjangkaui': 'jangkau', + 'terjangkauan': 'jangkau', + 'sejangkauan': 'jangkau', + 'sepenjangkauan': 'jangkau', + 'menjangki': 'jangki', + 'jangkih mangkih': 'jangkih', + 'jongkar-jangkir': 'jangkir', + 'jangkungan': 'jangkung', + 'menjangol': 'jangol', + 'berjanguk': 'janguk', + 'berjanjang': 'janjang', + 'pejantan': 'jantan', + 'pejantannya': 'jantan', + 'pejantanan': 'jantan', + 'berjantan': 'jantan', + 'kejantanan': 'jantan', + 'kejantanannya': 'jantan', + 'kejantananmu': 'jantan', + 'menjantani': 'jantan', + 'perjantanan': 'jantan', + 'terjantang': 'jantang', + 'menjantang': 'jantang', + 'berjantang': 'jantang', + 'jantungan': 'jantung', + 'berjantung': 'jantung', + 'menjantung': 'jantung', + 'terjantur': 'jantur', + 'menjantur': 'jantur', + 'menjara': 'jara', + 'menjarai': 'jara', + 'jarahan': 'jarah', + 'jarahannya': 'jarah', + 'penjarah': 'jarah', + 'penjarahnya': 'jarah', + 'penjarahan': 'jarah', + 'menjarah': 'jarah', + 'menjarahnya': 'jarah', + 'menjarahi': 'jarah', + 'menjarahan': 'jarah', + 'penjarahannya': 'jarah', + 'penjaram': 'jaram', + 'berjaram': 'jaram', + 'menjaram': 'jaram', + 'menjarang': 'jarang', + 'menjarangkan': 'jarang', + 'penjarangan': 'jarang', + 'memperjarang': 'jarang', + 'jarang-jarang': 'jarang', + 'jarang-jarangnya': 'jarang', + 'jarang-jarangkan': 'jarang', + 'sejaras': 'jaras', + 'menjaras': 'jaras', + 'menjari': 'jari', + 'menjarikan': 'jari', + 'penjarian': 'jari', + 'jari-jari': 'jari', + 'jari-jarinya': 'jari', + 'jari-jariku': 'jari', + 'berjari-jari': 'jari', + 'jaringan': 'jaring', + 'jaringannya': 'jaring', + 'jaringanlah': 'jaring', + 'jaringani': 'jaring', + 'jaringanan': 'jaring', + 'jaringanmu': 'jaring', + 'menjaring': 'jaring', + 'menjaringnya': 'jaring', + 'menjaringkan': 'jaring', + 'menjaringkannya': 'jaring', + 'menjaringan': 'jaring', + 'terjaring': 'jaring', + 'terjaringnya': 'jaring', + 'terjaringlah': 'jaring', + 'terjaringan': 'jaring', + 'jaring-jaring': 'jaring', + 'jaring-jaringnya': 'jaring', + 'jaring-jaringan': 'jaring', + 'jaruman': 'jarum', + 'menjarum': 'jarum', + 'berjarum': 'jarum', + 'jarum-jarum': 'jarum', + 'pejasaboga': 'jasa boga', + 'berjasa': 'jasa', + 'berjasanya': 'jasa', + 'berjasad': 'jasad', + 'kejasmanian': 'jasmani', + 'menjatah': 'jatah', + 'menjatahnya': 'jatah', + 'menjatahkan': 'jatah', + 'menjatahi': 'jatah', + 'penjatahan': 'jatah', + 'penjatahannya': 'jatah', + 'sejati': 'jati', + 'sejatinya': 'jati', + 'sejatilah': 'jati', + 'sejatii': 'jati', + 'sejatinyalah': 'jati', + 'sejatiku': 'jati', + 'sejatimu': 'jati', + 'sejati-ku': 'jati', + 'kesejatian': 'jati', + 'kesejatiannya': 'jati', + 'kejatmikaan': 'jatmika', + 'jatuhan': 'jatuh', + 'berjatuh': 'jatuh', + 'berjatuhnya': 'jatuh', + 'berjatuhkan': 'jatuh', + 'berjatuhan': 'jatuh', + 'terjatuh': 'jatuh', + 'terjatuhnya': 'jatuh', + 'terjatuhi': 'jatuh', + 'kejatuhan': 'jatuh', + 'kejatuhannya': 'jatuh', + 'menjatuhi': 'jatuh', + 'menjatuhinya': 'jatuh', + 'berjatuhannya': 'jatuh', + 'penjatuhan': 'jatuh', + 'penjatuhannya': 'jatuh', + 'menjatuhkan': 'jatuh', + 'menjatuhkannya': 'jatuh', + 'menjatuhkankan': 'jatuh', + 'menjatuhkani': 'jatuh', + 'menjatuhkanku': 'jatuh', + 'menjatuhkanmu': 'jatuh', + 'sejauh': 'jauh', + 'sejauhnya': 'jauh', + 'sejauhi': 'jauh', + 'berjauh': 'jauh', + 'berjauhan': 'jauh', + 'menjauh': 'jauh', + 'menjauhnya': 'jauh', + 'menjauhlah': 'jauh', + 'menjauhkan': 'jauh', + 'menjauhkannya': 'jauh', + 'menjauhi': 'jauh', + 'kejauhan': 'jauh', + 'menjauhinya': 'jauh', + 'menjauhiku': 'jauh', + 'menjauhkankan': 'jauh', + 'menjauhkanmu': 'jauh', + 'berjauh-jauhan': 'jauh', + 'jawaban': 'jawab', + 'jawabannya': 'jawab', + 'jawabanlah': 'jawab', + 'jawabankan': 'jawab', + 'jawabanku': 'jawab', + 'jawabanmu': 'jawab', + 'menjawab': 'jawab', + 'menjawabnya': 'jawab', + 'menjawabi': 'jawab', + 'menjawaban': 'jawab', + 'berjawab': 'jawab', + 'jawatan': 'jawat', + 'sejawat': 'jawat', + 'sejawatnya': 'jawat', + 'menjawat': 'jawat', + 'penjawat': 'jawat', + 'berjawat': 'jawat', + 'jawi-jawi': 'jawi', + 'menjawikan': 'jawi', + 'menjawil': 'jawil', + 'berjebah': 'jebah', + 'berjebai': 'jebai', + 'jebakan': 'jebak', + 'jebakannya': 'jebak', + 'jebakanmu': 'jebak', + 'penjebak': 'jebak', + 'penjebaknya': 'jebak', + 'penjebakkan': 'jebak', + 'penjebakan': 'jebak', + 'menjebak': 'jebak', + 'menjebaknya': 'jebak', + 'terjebak': 'jebak', + 'terjebaknya': 'jebak', + 'terjebaklah': 'jebak', + 'terjebakan': 'jebak', + 'penjebakannya': 'jebak', + 'jebar-jebur': 'jebar', + 'jebat-jebatan': 'jebat', + 'terjeblok': 'jeblok', + 'kejeblos': 'jeblos', + 'terjeblos': 'jeblos', + 'menjebloskan': 'jeblos', + 'menjebloskannya': 'jeblos', + 'menjebluk': 'jebluk', + 'jebolan': 'jebol', + 'jebolannya': 'jebol', + 'menjebol': 'jebol', + 'menjebolnya': 'jebol', + 'menjebolkan': 'jebol', + 'menjeboli': 'jebol', + 'menjebrolkan': 'jebrol', + 'menjebur': 'jebur', + 'menjeburkan': 'jebur', + 'menjedotkan': 'jedot', + 'menjedotkannya': 'jedot', + 'menjedot-jedotkan': 'jedot', + 'menjegal': 'jegal', + 'menjegalnya': 'jegal', + 'jegal-jegalan': 'penjegalan', + 'berjegal-jegalan': 'penjegalan', + 'menjegil': 'jegil', + 'terjegil': 'jegil', + 'menjejak': 'jejak', + 'menjejaknya': 'jejak', + 'menjejakkan': 'jejak', + 'menjejaki': 'jejak', + 'menjejakan': 'jejak', + 'berjejak': 'jejak', + 'penjejak': 'jejak', + 'penjejakkan': 'jejak', + 'penjejakan': 'jejak', + 'menjejakinya': 'jejak', + 'menjejal': 'jejal', + 'menjejalnya': 'jejal', + 'menjejalkan': 'jejal', + 'menjejalkannya': 'jejal', + 'menjejali': 'jejal', + 'berjejal': 'jejal', + 'berjejalnya': 'jejal', + 'berjejalan': 'jejal', + 'menjejalinya': 'jejal', + 'penjejalan': 'jejal', + 'berjejal-jejal': 'jejal', + 'berjejal-jejalan': 'jejal', + 'jejeran': 'jejer', + 'jejerannya': 'jejer', + 'terjelabak': 'jelabak', + 'berjelaga': 'jelaga', + 'menjelajah': 'jelajah', + 'menjelajahnya': 'jelajah', + 'menjelajahkan': 'jelajah', + 'menjelajahi': 'jelajah', + 'penjelajah': 'jelajah', + 'penjelajahnya': 'jelajah', + 'penjelajahan': 'jelajah', + 'menjelajahinya': 'jelajah', + 'penjelajahannya': 'jelajah', + 'terjelak': 'jelak', + 'jelalatan': 'jelalat', + 'menjelanak': 'jelanak', + 'menjelang': 'jelang', + 'menjelangnya': 'jelang', + 'menjelangi': 'jelang', + 'jelang-menjelang': 'jelang', + 'menjelangak': 'jelangak', + 'berjelapak': 'jelapak', + 'terjelapak': 'jelapak', + 'berjelapakan': 'jelapak', + 'menjelar': 'jelar', + 'penjelas': 'jelas', + 'penjelasnya': 'jelas', + 'penjelaskan': 'jelas', + 'penjelasan': 'jelas', + 'kejelasan': 'jelas', + 'kejelasannya': 'jelas', + 'kejelasanan': 'jelas', + 'penjelasannya': 'jelas', + 'penjelasanlah': 'jelas', + 'penjelasanan': 'jelas', + 'penjelasanku': 'jelas', + 'memperjelas': 'jelas', + 'memperjelasnya': 'jelas', + 'memperjelaskan': 'jelas', + 'terjelaskan': 'jelas', + 'menjelaskan': 'jelas', + 'menjelaskannya': 'jelas', + 'menjelaskankan': 'jelas', + 'menjelaskanan': 'jelas', + 'menjelau': 'jelau', + 'menjelejeh': 'jelejeh', + 'berjelejehan': 'jelejeh', + 'kejelekan': 'jelek', + 'kejelekannya': 'jelek', + 'menjelekkan': 'jelek', + 'menjelekkannya': 'jelek', + 'menjelek-jelekkan': 'jelek', + 'menjelek-jelekkannya': 'jelek', + 'menjelempah': 'jelempah', + 'menjelengar': 'jelengar', + 'terjelengar': 'jelengar', + 'menjelepak': 'jelepak', + 'menjelepok': 'jelepok', + 'terjelepok': 'jelepok', + 'kejelian': 'jeli', + 'kejeliannya': 'jeli', + 'menjelihkan': 'jelih', + 'menjelijih': 'jelijih', + 'menjelimet': 'jelimet', + 'menjelimpat': 'jelimpat', + 'menjeling': 'jeling', + 'menjelirkan': 'jelir', + 'menjelitkan': 'jelit', + 'terjelma': 'jelma', + 'menjelma': 'jelma', + 'menjelmanya': 'jelma', + 'menjelmakan': 'jelma', + 'menjelmakannya': 'jelma', + 'penjelmaan': 'jelma', + 'penjelmaannya': 'jelma', + 'menjeluak': 'jeluak', + 'jelujuran': 'jelujur', + 'menjelujur': 'jelujur', + 'menjelujuri': 'jelujur', + 'berjeluk': 'jeluk', + 'berjelum': 'jelum', + 'menjelum': 'jelum', + 'menjelungkap': 'jelungkap', + 'menjelunut': 'jelunut', + 'kejelusan': 'jelus', + 'menjeluskan': 'jelus', + 'menjelut': 'jelut', + 'berjemaah': 'jemaah', + 'berjemaahnya': 'jemaah', + 'menjemaahkan': 'jemaah', + 'sejemang': 'jemang', + 'kejemawaan': 'jemawa', + 'jembaan': 'jemba', + 'menjemba': 'jemba', + 'menjembak': 'jembak', + 'terjembak-jembak': 'jembak', + 'terjembatani': 'jembatan', + 'menjembatani': 'jembatan', + 'menjembataninya': 'jembatan', + 'penjembatanan': 'jembatan', + 'jempalitan': 'jempalit', + 'menjempalit': 'jempalit', + 'berjempalitan': 'jempalit', + 'jempolan': 'jempol', + 'jempolannya': 'jempol', + 'kejempolan': 'jempol', + 'jemputan': 'jemput', + 'jemputannya': 'jemput', + 'sejemput': 'jemput', + 'berjemput': 'jemput', + 'menjemput': 'jemput', + 'menjemputnya': 'jemput', + 'menjemputku': 'jemput', + 'menjemputmu': 'jemput', + 'penjemput': 'jemput', + 'penjemputnya': 'jemput', + 'penjemputan': 'jemput', + 'penjemputannya': 'jemput', + 'jemuan': 'jemu', + 'kejemuan': 'jemu', + 'kejemuanmu': 'jemu', + 'menjemukan': 'jemu', + 'menjemukannya': 'jemu', + 'sejenak': 'jenak', + 'sejenaknya': 'jenak', + 'menjenaki': 'jenak', + 'jenangan': 'jenang', + 'jejenang': 'jenang', + 'sejenang': 'jenang', + 'penjenang': 'jenang', + 'penjenangan': 'jenang', + 'menjenangi': 'jenang', + 'jendal-jendul': 'jendal', + 'jendelan': 'jendel', + 'berjendul': 'jendul', + 'menjenengkan': 'jeneng', + 'jengekan': 'jengek', + 'menjengek': 'jengek', + 'menjengeki': 'jengek', + 'menjengek-jengek': 'jengek', + 'jenggar-jenggur': 'jenggar', + 'jenggotan': 'jenggot', + 'menjengguk': 'jengguk', + 'menjenggut': 'jenggut', + 'menjengit': 'jengit', + 'menjengit-jengit': 'jengit', + 'menjengkal': 'jengkal', + 'menjengkalkan': 'jengkal', + 'menjengkali': 'jengkal', + 'menjengkang': 'jengkang', + 'terjengkang': 'jengkang', + 'terjengkangnya': 'jengkang', + 'penjengkekan': 'jengkek', + 'berjengkek-jengkek': 'jengkek', + 'menjengkeli': 'jengkel', + 'kejengkelan': 'jengkel', + 'kejengkelannya': 'jengkel', + 'menjengkelkan': 'jengkel', + 'menjengkelkannya': 'jengkel', + 'menjengkelit': 'jengkelit', + 'berjengkeng': 'jengkeng', + 'menjengkeng': 'jengkeng', + 'berjengkengan': 'jengkeng', + 'menjengking': 'jengking', + 'menjengkit': 'jengkit', + 'kejengkolan': 'jengkol', + 'jengkoletan': 'jengkolet', + 'menjengkolet': 'jengkolet', + 'berjengkot': 'jengkot', + 'menjengkot': 'jengkot', + 'menjenguk': 'jenguk', + 'menjenguknya': 'jenguk', + 'menjengukku': 'jenguk', + 'menjengukmu': 'jenguk', + 'menjengukkan': 'jenguk', + 'menjengul': 'jengul', + 'sejenis': 'jenis', + 'sejenisnya': 'jenis', + 'sejenisnyalah': 'jenis', + 'menjenis': 'jenis', + 'penjenisan': 'jenis', + 'berjenis-jenis': 'jenis', + 'berjenjang': 'jenjang', + 'berjenjang-jenjang': 'jenjang', + 'berjentera': 'jentera', + 'jentikan': 'jentik', + 'menjentik': 'jentik', + 'menjentikkan': 'jentik', + 'menjentikkannya': 'jentik', + 'menjentikan': 'jentik', + 'kejenuhan': 'jenuh', + 'kejenuhannya': 'jenuh', + 'kejenuhanmu': 'jenuh', + 'penjenuhan': 'jenuh', + 'menjenuhkan': 'jenuh', + 'menjenuhkannya': 'jenuh', + 'menjepit': 'jepit', + 'menjepitnya': 'jepit', + 'menjepitkan': 'jepit', + 'menjepitku': 'jepit', + 'penjepit': 'jepit', + 'penjepitnya': 'jepit', + 'penjepitan': 'jepit', + 'menjeprat': 'jeprat', + 'jepretan': 'jepret', + 'jepretannya': 'jepret', + 'jepretanku': 'jepret', + 'jepretanmu': 'jepret', + 'menjepret': 'jepret', + 'menjepretnya': 'jepret', + 'menjepretkan': 'jepret', + 'terjepret': 'jepret', + 'penjepretan': 'jepret', + 'penjepretannya': 'jepret', + 'sejeput': 'jeput', + 'menjeput': 'jeput', + 'menjeputnya': 'jeput', + 'menjerakan': 'jera', + 'berjerabai': 'jerabai', + 'jerah-jerih': 'jerah', + 'terjerahak': 'jerahak', + 'menjerahap': 'jerahap', + 'terjerahap': 'jerahap', + 'berjerait': 'jerait', + 'berjeramah': 'jeramah', + 'menjeramah': 'jeramah', + 'menjerambah': 'jerambah', + 'berjerambai': 'jerambai', + 'terjerang': 'jerang', + 'menjerang': 'jerang', + 'menjerangkak': 'jerangkak', + 'menjerangkang': 'jerangkang', + 'terjerangkang': 'jerangkang', + 'berjerangkang': 'jerangkang', + 'menjerap': 'jerap', + 'penjerapan': 'jerap', + 'sejerat': 'jerat', + 'terjerat': 'jerat', + 'terjeratnya': 'jerat', + 'menjerat': 'jerat', + 'menjeratnya': 'jerat', + 'menjeratkan': 'jerat', + 'menjerauskan': 'jeraus', + 'menjerba': 'jerba', + 'menjerbak': 'jerbak', + 'menjeremba': 'jeremba', + 'terjerembap': 'jerembap', + 'menjerembapkan': 'jerembap', + 'terjerembat': 'jerembat', + 'terjerembun': 'jerembun', + 'menjerempak': 'jerempak', + 'terjerempak': 'jerempak', + 'berjerempak': 'jerempak', + 'menjereng': 'jereng', + 'menjeriau': 'jeriau', + 'berjerih': 'jerih', + 'kejerihan': 'jerih', + 'menjerihkan': 'jerih', + 'memperjerihkan': 'jerih', + 'jeritan': 'jerit', + 'jeritannya': 'jerit', + 'menjerit': 'jerit', + 'menjeritlah': 'jerit', + 'menjeritkan': 'jerit', + 'terjerit-jerit': 'jerit', + 'menjerit-jerit': 'jerit', + 'menjerkah': 'jerkah', + 'berjermang': 'jermang', + 'penjernih': 'jernih', + 'penjernihnya': 'jernih', + 'penjernihan': 'jernih', + 'kejernihan': 'jernih', + 'kejernihannya': 'jernih', + 'penjernihannya': 'jernih', + 'menjernihkan': 'jernih', + 'menjernihkannya': 'jernih', + 'terjerohok': 'jerohok', + 'terjerojol': 'jerojol', + 'menjerojol': 'jerojol', + 'menjerongkok': 'jerongkok', + 'menjerongkong': 'jerongkong', + 'terjerongkong': 'jerongkong', + 'menjeruki': 'jeruk', + 'menjerukun': 'jerukun', + 'menjerukup': 'jerukup', + 'menjerum': 'jerum', + 'berjerumat': 'jerumat', + 'penjerumat': 'jerumat', + 'menjerumat': 'jerumat', + 'terjerumus': 'jerumus', + 'terjerumusnya': 'jerumus', + 'menjerumuskan': 'jerumus', + 'menjerumuskannya': 'jerumus', + 'menjerumuskanku': 'jerumus', + 'menjerumuskanmu': 'jerumus', + 'menjerungkau': 'jerungkau', + 'menjerungkis': 'jerungkis', + 'menjerungkung': 'jerungkung', + 'terjerunuk': 'jerunuk', + 'menjetis': 'jetis', + 'jeweran': 'jewer', + 'jewerannya': 'jewer', + 'menjewer': 'jewer', + 'menjewernya': 'jewer', + 'berjibaku': 'jibaku', + 'sejibun': 'jibun', + 'berjibun': 'jibun', + 'berjibunnya': 'jibun', + 'menjidari': 'jidar', + 'berjihad': 'jihad', + 'berjihadlah': 'jihad', + 'kejijikan': 'jijik', + 'menjijikkan': 'jijik', + 'menjijikkannya': 'jijik', + 'menjijit': 'jijit', + 'terjila': 'jila', + 'menjilami': 'jilam', + 'jilatan': 'jilat', + 'jilatannya': 'jilat', + 'menjilat': 'jilat', + 'menjilatnya': 'jilat', + 'menjilatkan': 'jilat', + 'menjilatkannya': 'jilat', + 'menjilati': 'jilat', + 'penjilat': 'jilat', + 'penjilatnya': 'jilat', + 'penjilatan': 'jilat', + 'menjilat-jilat': 'jilat', + 'menjilat-jilati': 'jilat', + 'penjilid': 'jilid', + 'penjilidan': 'jilid', + 'berjilid': 'jilid', + 'menjilid': 'jilid', + 'penjilidannya': 'jilid', + 'berjilid-jilid': 'jilid', + 'menjimak': 'jimak', + 'berjimak': 'jimak', + 'menjimbit': 'jimbit', + 'jimpitan': 'jimpit', + 'sejimpit': 'jimpit', + 'menjimpit': 'jimpit', + 'penjinak': 'jinak', + 'penjinakkan': 'jinak', + 'penjinakan': 'jinak', + 'menjinaki': 'jinak', + 'jinak-jinak': 'jinak', + 'menjinakkan': 'jinak', + 'menjinakkannya': 'jinak', + 'berjinak-jinak': 'jinak', + 'penjinayah': 'jinayah', + 'menjingap': 'jingap', + 'menjingau': 'jingau', + 'kejingga-jinggaan': 'jingga', + 'berjingkat': 'jingkat', + 'berjingkat-jingkat': 'jingkat', + 'berjingkik': 'jingkik', + 'berjingkik-jingkik': 'jingkik', + 'berjingkrak': 'jingkrak', + 'berjingkraknya': 'jingkrak', + 'berjingkrakkan': 'jingkrak', + 'berjingkrakan': 'jingkrak', + 'berjingkrak-jingkrak': 'jingkrak', + 'menjingu': 'jingu', + 'jinjangan': 'jinjang', + 'berjinjang': 'jinjang', + 'jinjingan': 'jinjing', + 'terjinjing': 'jinjing', + 'menjinjing': 'jinjing', + 'menjinjingnya': 'jinjing', + 'menjinjingkan': 'jinjing', + 'berjinjit': 'jinjit', + 'menjinjit': 'jinjit', + 'menjinjitkan': 'jinjit', + 'jiplakan': 'jiplak', + 'jiplakannya': 'jiplak', + 'menjiplak': 'jiplak', + 'menjiplaknya': 'jiplak', + 'penjiplakan': 'jiplak', + 'dijiplakkan': 'jiplak', + 'menjirus': 'jirus', + 'menjitak': 'jitak', + 'menjitaki': 'jitak', + 'kejituan': 'jitu', + 'kejituannya': 'jitu', + 'menjitukan': 'jitu', + 'berjiwa': 'jiwa', + 'berjiwalah': 'jiwa', + 'kejiwaan': 'jiwa', + 'kejiwaannya': 'jiwa', + 'menjiwai': 'jiwa', + 'menjiwainya': 'jiwa', + 'menjiwit': 'jiwit', + 'berjobak': 'jobak', + 'sejodoh': 'jodoh', + 'penjodoh': 'jodoh', + 'penjodohan': 'jodoh', + 'berjodoh': 'jodoh', + 'berjodohnya': 'jodoh', + 'perjodohan': 'jodoh', + 'perjodohannya': 'jodoh', + 'menjodohkan': 'jodoh', + 'menjodohkannya': 'jodoh', + 'menjodohkanku': 'jodoh', + 'menjodohkanmu': 'jodoh', + 'memperjodohkan': 'jodoh', + 'menjodongkan': 'jodong', + 'berjogar': 'jogar', + 'menjoget': 'joget', + 'berjoget': 'joget', + 'berjogetnya': 'joget', + 'kejohanan': 'johan', + 'menjojol': 'jojol', + 'jolakan': 'jolak', + 'menjolak': 'jolak', + 'berjolak': 'jolak', + 'menjolek': 'jolek', + 'sejoli': 'joli', + 'sejolinya': 'joli', + 'joli-joli': 'joli', + 'penjolok': 'jolok', + 'menjolok': 'jolok', + 'menjolong': 'jolong', + 'jolong-jolong': 'jolong', + 'menjolor': 'jolor', + 'kejombangan': 'jombang', + 'menjompak': 'jompak', + 'berjompak': 'jompak', + 'berjompakan': 'jompak', + 'menjonget': 'jonget', + 'jonggolan': 'jonggol', + 'jonggol karang': 'jonggol', + 'menjongkang': 'jongkang', + 'jongkang-jangking': 'jongkang', + 'berjongkok': 'jongkok', + 'berjongkoklah': 'jongkok', + 'berjongkok-jongkok': 'jongkok', + 'selonjot': 'jonjot', + 'menjonjot': 'jonjot', + 'berjoran': 'joran', + 'sejoreng': 'joreng', + 'menjoreng': 'joreng', + 'penjorok': 'jorok', + 'menjorok': 'jorok', + 'menjorokkan': 'jorok', + 'kejorokan': 'jorok', + 'kejorokannya': 'jorok', + 'jotosan': 'jotos', + 'jotosannya': 'jotos', + 'menjotos': 'jotos', + 'terjotos': 'jotos', + 'berjotos': 'jotos', + 'jotos-jotosan': 'jotos', + 'berjuak': 'juak', + 'berjuakan': 'juak', + 'penjuak': 'juak', + 'penjuaknya': 'juak', + 'penjuakan': 'juak', + 'menjuak': 'juak', + 'juak-juak': 'juak', + 'menjuakkan': 'juak', + 'berjual beli': 'jual beli', + 'menjualbelikan': 'jual beli', + 'menjualbelikannya': 'jual beli', + 'memperjualbelikan': 'jual beli', + 'memperjualbelikannya': 'jual beli', + 'menjuarai': 'juara', + 'menjuarainya': 'juara', + 'kejuaraan': 'juara', + 'kejuaraannya': 'juara', + 'kejuaraanlah': 'juara', + 'berjubel': 'jubel', + 'berjubelnya': 'jubel', + 'berjubelan': 'jubel', + 'menjubeli': 'jubel', + 'berjubel-jubel': 'jubel', + 'berjubel-jubelan': 'jubel', + 'menjublek': 'jublek', + 'pejudo': 'judo', + 'berjudul': 'judul', + 'berjudulkan': 'judul', + 'menjujah': 'jujah', + 'berjujai': 'jujai', + 'menjuju': 'juju', + 'kejujuran': 'jujur', + 'kejujurannya': 'jujur', + 'kejujuranlah': 'jujur', + 'kejujuranmu': 'jujur', + 'menjujuri': 'jujur', + 'menjujut': 'jujut', + 'berjujut-jujutan': 'jujut', + 'berjulai': 'julai', + 'terjulai': 'julai', + 'menjulai': 'julai', + 'berjulai-julai': 'julai', + 'menjulang': 'julang', + 'menjulangnya': 'julang', + 'menjulangkan': 'julang', + 'berjulat': 'julat', + 'menjulat': 'julat', + 'sepenjulat': 'julat', + 'menjuling': 'juling', + 'menjulingkan': 'juling', + 'julo-julo': 'julo', + 'julukan': 'juluk', + 'julukannya': 'juluk', + 'menjuluk': 'juluk', + 'menjuluki': 'juluk', + 'menjulukinya': 'juluk', + 'penjulukan': 'juluk', + 'julung asar': 'julung', + 'julung-julung': 'julung', + 'menjulur': 'julur', + 'menjulurnya': 'julur', + 'menjulurkan': 'julur', + 'terjulur': 'julur', + 'penjuluran': 'julur', + 'julur-julur': 'julur', + 'jumatan': 'jumat', + 'berjumat': 'jumat', + 'berjumatan': 'jumat', + 'kejumbuhan': 'jumbuh', + 'berjumbul-jumbul': 'jumbul', + 'jumenengan': 'jumeneng', + 'sejumlah': 'jumlah', + 'sejumlahnya': 'jumlah', + 'sejumlahkan': 'jumlah', + 'sejumlahan': 'jumlah', + 'menjumlah': 'jumlah', + 'menjumlahkan': 'jumlah', + 'menjumlahkannya': 'jumlah', + 'terjumlah': 'jumlah', + 'berjumlah': 'jumlah', + 'berjumlahnya': 'jumlah', + 'berjumlahkan': 'jumlah', + 'penjumlahan': 'jumlah', + 'berjumpa': 'jumpa', + 'berjumpanya': 'jumpa', + 'terjumpa': 'jumpa', + 'menjumpai': 'jumpa', + 'menjumpainya': 'jumpa', + 'perjumpaan': 'jumpa', + 'perjumpaannya': 'jumpa', + 'jumpalitan': 'jumpalit', + 'berjumpalit': 'jumpalit', + 'berjumpalitan': 'jumpalit', + 'jumputan': 'jumput', + 'sejumput': 'jumput', + 'menjumput': 'jumput', + 'menjumputnya': 'jumput', + 'menjumputi': 'jumput', + 'kejumudan': 'jumud', + 'menjunam': 'junam', + 'terjunam': 'junam', + 'sijundai': 'jundai', + 'bersijundai': 'jundai', + 'menjungat': 'jungat', + 'terjungkal': 'jungkal', + 'terjungkalnya': 'jungkal', + 'menjungkalkan': 'jungkal', + 'menjungkalkannya': 'jungkal', + 'jungkang-jungkit': 'jungkang', + 'menjungkar': 'jungkar', + 'terjungkat': 'jungkat', + 'jungkat-jungkit': 'jungkat', + 'jungkat-jungkitnya': 'jungkat', + 'menjungkat-jungkit': 'jungkat', + 'berjungkir balik': 'jungkir balik', + 'penjungkirbalikan': 'jungkir balik', + 'menjungkirbalikkan': 'jungkir balik', + 'menjungkirbalikkannya': 'jungkir balik', + 'terjungkir': 'jungkir', + 'terjungkirnya': 'jungkir', + 'menjungkir': 'jungkir', + 'menjungkirkan': 'jungkir', + 'berjungkir': 'jungkir', + 'menjungkit': 'jungkit', + 'terjungkit': 'jungkit', + 'menjungur': 'jungur', + 'junjungan': 'junjung', + 'junjungannya': 'junjung', + 'junjunganku': 'junjung', + 'menjunjung': 'junjung', + 'menjunjungi': 'junjung', + 'berjunjungan': 'junjung', + 'menjunjungkan': 'junjung', + 'juntrungan': 'juntrung', + 'juntrungannya': 'juntrung', + 'berjupang': 'jupang', + 'menjura': 'jura', + 'menjurai': 'jura', + 'penjurian': 'juri', + 'penjuriannya': 'juri', + 'juringan': 'juring', + 'menjurubicarai': 'juru bicara', + 'menjuru': 'juru', + 'penjuru': 'juru', + 'penjurunya': 'juru', + 'kejuruan': 'juru', + 'kejuruannya': 'juru', + 'jurusan': 'jurus', + 'jurusannya': 'jurus', + 'jurusanku': 'jurus', + 'jurusanmu': 'jurus', + 'sejurus': 'jurus', + 'sejurusan': 'jurus', + 'menjurus': 'jurus', + 'menjurusnya': 'jurus', + 'menjuruskan': 'jurus', + 'penjurus': 'jurus', + 'penjurusan': 'jurus', + 'berjurus-jurus': 'jurus', + 'menjustifikasikan': 'justifikasi', + 'sejuta': 'juta', + 'sejutanya': 'juta', + 'sejutalah': 'juta', + 'sejutaan': 'juta', + 'jutaan': 'juta', + 'jutaannya': 'juta', + 'jutaanlah': 'juta', + 'berjuta-juta': 'juta', + 'berjuta-jutaan': 'juta', + 'pengabar': 'kabar', + 'pengabaran': 'kabar', + 'berkabar': 'kabar', + 'terkabar': 'kabar', + 'terkabarnya': 'kabar', + 'mengabarinya': 'kabar', + 'mengabariku': 'kabar', + 'perkabaran': 'kabar', + 'mengabat': 'kabat', + 'berkabilan': 'kabil', + 'mengabir': 'kabir', + 'kabir-kabiran': 'kabir', + 'mengabit': 'kabit', + 'kabruk-kabrukan': 'kabruk', + 'berkabu-kabu': 'kabu-kabu', + 'terkabul': 'kabul', + 'terkabulnya': 'kabul', + 'terkabulkan': 'kabul', + 'terkabulkannya': 'kabul', + 'pengabulan': 'kabul', + 'pengabulannya': 'kabul', + 'mengabulkan': 'kabul', + 'mengabulkannya': 'kabul', + 'mengabulkanmu': 'kabul', + 'kekaburan': 'kabur', + 'kekabur-kaburan': 'kabur', + 'mengaca': 'kaca', + 'mengacanya': 'kaca', + 'berkaca': 'kaca', + 'berkacalah': 'kaca', + 'kekacaan': 'kaca', + 'memperkaca': 'kaca', + 'berkaca-kaca': 'kaca', + 'pengacak': 'kacak', + 'pengacakan': 'kacak', + 'berkacak': 'kacak', + 'berkacamata': 'kacamata', + 'kacangan': 'kacang', + 'mengacang': 'kacang', + 'memperkacang': 'kacang', + 'kacang-kacangan': 'kacang', + 'kacang-kacangannya': 'kacang', + 'mengacar': 'kacar', + 'kacar lakum': 'kacar', + 'kacauan': 'kacau', + 'berkacau': 'kacau', + 'terkacau': 'kacau', + 'pengacau': 'kacau', + 'pengacaunya': 'kacau', + 'pengacauan': 'kacau', + 'kekacauan': 'kacau', + 'kekacauannya': 'kacau', + 'mengacaukankannya': 'kacau', + 'memperkacaukan': 'kacau', + 'mengacaubalaukan': 'kacau-balau', + 'mengacip': 'kacip', + 'mengacir': 'kacir', + 'mengada': 'kada', + 'mengadaan': 'kada', + 'dikadang': 'kadang', + 'dikadangnya': 'kadang', + 'dikadangkan': 'kadang', + 'terkadang': 'kadang', + 'terkadangkan': 'kadang', + 'terkadangan': 'kadang', + 'kadang-kadang': 'kadang', + 'kadang-kadangnya': 'kadang', + 'kadang-kadangkan': 'kadang', + 'kadang-kadangan': 'kadang', + 'terkadang-kadang': 'kadang', + 'sekadar': 'kadar', + 'sekadarnya': 'kadar', + 'sekadari': 'kadar', + 'mengadas': 'kadas', + 'mengadaskan': 'kadas', + 'mengadasi': 'kadas', + 'pengaderan': 'kader', + 'sekadim': 'kadim', + 'mengadimkan': 'kadim', + 'kadok api': 'kadok', + 'berkafan': 'kafan', + 'mengafani': 'kafan', + 'kekafiran': 'kafir', + 'kekafirannya': 'kafir', + 'mengafirkan': 'kafir', + 'mengafirkannya': 'kafir', + 'kekagetan': 'kaget', + 'kekagetannya': 'kaget', + 'mengagetkan': 'kaget', + 'mengagetkannya': 'kaget', + 'mengagetkanku': 'kaget', + 'pengagum': 'kagum', + 'pengagumnya': 'kagum', + 'mengagumi': 'kagum', + 'mengaguminya': 'kagum', + 'mengagumiku': 'kagum', + 'mengagumimu': 'kagum', + 'kekaguman': 'kagum', + 'kekagumannya': 'kagum', + 'kekagumanku': 'kagum', + 'mengagumkan': 'kagum', + 'mengagumkannya': 'kagum', + 'terkagum-kagum': 'kagum', + 'kekahatan': 'kahat', + 'terkail': 'kail', + 'mengail': 'kail', + 'pengail': 'kail', + 'pengailan': 'kail', + 'kail-kail': 'kail', + 'berkain': 'kain', + 'berkaing-kaing': 'kaing', + 'terkaing-kaing': 'kaing', + 'mengais': 'kais', + 'mengaisnya': 'kais', + 'mengaiskan': 'kais', + 'mengais-ngais': 'kais', + 'kekaisaran': 'kaisar', + 'kekaisarannya': 'kaisar', + 'sekait': 'kait', + 'sekaitan': 'kait', + 'kaitan': 'kait', + 'kaitannya': 'kait', + 'pengait': 'kait', + 'pengaitnya': 'kait', + 'pengaitan': 'kait', + 'mengait': 'kait', + 'mengaitnya': 'kait', + 'mengaitkan': 'kait', + 'mengaitkannya': 'kait', + 'mengaitan': 'kait', + 'berkait': 'kait', + 'berkaitkan': 'kait', + 'berkaitan': 'kait', + 'terkait': 'kait', + 'terkaitnya': 'kait', + 'terkaitlah': 'kait', + 'terkaitkan': 'kait', + 'terkaitan': 'kait', + 'kait-kait': 'kait', + 'kait-kaitkan': 'kait', + 'kait-kaitan': 'kait', + 'berkaitannya': 'kait', + 'keterkaitan': 'kait', + 'keterkaitannya': 'kait', + 'berkait-kaitan': 'kait', + 'berkajang': 'kajang', + 'dikajangi': 'kajang', + 'pekajangan': 'kajang', + 'mengajangi': 'kajang', + 'kajian': 'kaji', + 'kajiannya': 'kaji', + 'kajiani': 'kaji', + 'terkaji': 'kaji', + 'mengaji': 'kaji', + 'mengajinya': 'kaji', + 'mengajikan': 'kaji', + 'mengkaji': 'kaji', + 'mengkajinya': 'kaji', + 'mengkajii': 'kaji', + 'mengkajian': 'kaji', + 'pengajian': 'kaji', + 'pengajiannya': 'kaji', + 'pengajiannyalah': 'kaji', + 'pengkajian': 'kaji', + 'pengkajiannya': 'kaji', + 'terkakah-kakah': 'kakah', + 'mengakak': 'kakak', + 'mengakakan': 'kakak', + 'berkakak': 'kakak', + 'berkakakan': 'kakak', + 'terkakak-kakak': 'kakak', + 'mengakap': 'kakap', + 'mengakapi': 'kakap', + 'pengakap': 'kakap', + 'pengakapan': 'kakap', + 'mengakas': 'kakas', + 'kakek-kakek': 'kakek', + 'kakek-kakeknya': 'kakek', + 'mengakok': 'kakok', + 'kekakuan': 'kaku', + 'kekakuannya': 'kaku', + 'kekalahan': 'kalah', + 'kekalahannya': 'kalah', + 'kekalahanan': 'kalah', + 'kekalahanku': 'kalah', + 'kekalahanmu': 'kalah', + 'terkalahkan': 'kalah', + 'terkalahkannya': 'kalah', + 'mengalai': 'kalai', + 'mengalaikan': 'kalai', + 'kalangan': 'kalang', + 'kalangannya': 'kalang', + 'kalangani': 'kalang', + 'kalanganmu': 'kalang', + 'terkalang': 'kalang', + 'berkalang': 'kalang', + 'berkalangan': 'kalang', + 'kalang kabut': 'kalang', + 'kekalapan': 'kalap', + 'kalengan': 'kaleng', + 'pengalengan': 'kaleng', + 'mengalengkan': 'kaleng', + 'kaleng-kalengan': 'kaleng', + 'sekali': 'kali', + 'sekalinya': 'kali', + 'sekalilah': 'kali', + 'sekalikan': 'kali', + 'sekalii': 'kali', + 'sekalian': 'kali', + 'pengali': 'kali', + 'pengalinya': 'kali', + 'pengalilah': 'kali', + 'pengalian': 'kali', + 'sekalianlah': 'kali', + 'sesekali': 'sekali', + 'sesekalinya': 'sekali', + 'perkalian': 'kali', + 'perkaliannya': 'kali', + 'kali-kalian': 'kali', + 'kali-kaliannya': 'kali', + 'sekali-kali': 'kali', + 'sekali-kalinya': 'kali', + 'sekali-sekali': 'kali', + 'sekali-sekalinya': 'kali', + 'berka-li-kali': 'kali', + 'memperkalikan': 'kali', + 'mengalicau': 'kalicau', + 'mengalicaukan': 'kalicau', + 'berkalih': 'kalih', + 'mengalimantang': 'kalimantang', + 'mengalkulasi': 'kalkulasi', + 'mengalkulasinya': 'kalkulasi', + 'mengalkulasikan': 'kalkulasi', + 'mengalkulasikannya': 'kalkulasi', + 'sekalung': 'kalung', + 'berkalung': 'kalung', + 'berkalungkan': 'kalung', + 'mengalungkan': 'kalung', + 'mengalungkannya': 'kalung', + 'kekalutan': 'kalut', + 'kekalutannya': 'kalut', + 'mengalutkan': 'kalut', + 'mengalutmalutkan': 'kalut-malut', + 'berkamar': 'kamar', + 'mengamban': 'kamban', + 'mengambi': 'kambi', + 'mengambilah': 'kambi', + 'berkambi': 'kambi', + 'mengambinghitamkan': 'kambing hitam', + 'mengambinghitamkankan': 'kambing hitam', + 'kambuhan': 'kambuh', + 'kambuhannya': 'kambuh', + 'terkambus': 'kambus', + 'mengamitkan': 'kamit', + 'kamit-kamit': 'kamit', + 'berkamit-kamit': 'kamit', + 'mengamit-ngamitkan': 'kamit', + 'berkampai': 'kampai', + 'terkampai': 'kampai', + 'berkampaian': 'kampai', + 'berkampanye': 'kampanye', + 'berkampanyenya': 'kampanye', + 'berkampanyelah': 'kampanye', + 'mengampanyekan': 'kampanye', + 'mengampanyekannya': 'kampanye', + 'mengampas': 'kampas', + 'berkampuh': 'kampuh', + 'terkampul-kampul': 'kampul', + 'kampungan': 'kampung', + 'berkampung': 'kampung', + 'mengampung': 'kampung', + 'mengampungi': 'kampung', + 'perkampungan': 'kampung', + 'perkampungannya': 'kampung', + 'berkamu': 'kamu', + 'mengamuflase': 'kamuflase', + 'mengamuflasekan': 'kamuflase', + 'berkamuflase': 'kamuflase', + 'pekamus': 'kamus', + 'mengamus': 'kamus', + 'pengamusan': 'kamus', + 'perkamusan': 'kamus', + 'mengamuskan': 'kamus', + 'kekanak-kanakan': 'kanak-kanak', + 'kekanak-kanakannya': 'kanak-kanak', + 'kekanak-kanakanan': 'kanak-kanak', + 'penganalan': 'kanal', + 'menganan': 'kanan', + 'menganankan': 'kanan', + 'menganani': 'kanan', + 'terkanan': 'kanan', + 'terkanannya': 'kanan', + 'sekancah': 'kancah', + 'terkancah': 'kancah', + 'terkanceh': 'kanceh', + 'pengancing': 'kancing', + 'pengancingan': 'kancing', + 'terkancing': 'kancing', + 'mengancing': 'kancing', + 'mengancingkan': 'kancing', + 'mengancingkannya': 'kancing', + 'mengancingi': 'kancing', + 'sekandang': 'kandang', + 'sekandangnya': 'kandang', + 'perkandangan': 'kandang', + 'mengandangkan': 'kandang', + 'mengandangkannya': 'kandang', + 'kandaran': 'kandar', + 'kandarani': 'kandar', + 'mengandar': 'kandar', + 'pengandar': 'kandar', + 'pengandaran': 'kandar', + 'terkandas': 'kandas', + 'mengandaskan': 'kandas', + 'mengandaskannya': 'kandas', + 'mengandidatkan': 'kandidat', + 'mengandul': 'kandul', + 'berkandul': 'kandul', + 'dikandung': 'kandung', + 'dikandungnya': 'kandung', + 'dikandungan': 'kandung', + 'kandungan': 'kandung', + 'kandungannya': 'kandung', + 'kandunganku': 'kandung', + 'kandunganmu': 'kandung', + 'mengandung': 'kandung', + 'mengandungnya': 'kandung', + 'mengandungi': 'kandung', + 'mengandungan': 'kandung', + 'mengandungmu': 'kandung', + 'pengandung': 'kandung', + 'terkandung': 'kandung', + 'terkandungnya': 'kandung', + 'terkandungan': 'kandung', + 'berkandung': 'kandung', + 'berkandungan': 'kandung', + 'berkandungankan': 'kandung', + 'kandutan': 'kandut', + 'mengandut': 'kandut', + 'berkang': 'kang', + 'mengangeni': 'kangen', + 'kangen-kangenan': 'kangen', + 'mengangkang': 'kangkang', + 'mengangkangkan': 'kangkang', + 'mengangkangi': 'kangkang', + 'terkangkang': 'kangkang', + 'mengangkanginya': 'kangkang', + 'penganibalan': 'kanibal', + 'berkanjang': 'kanjang', + 'berkanjar': 'kanjar', + 'terkanjar-kanjar': 'kanjar', + 'berkanjar-kanjar': 'kanjar', + 'mengansel': 'kansel', + 'kekanseliran': 'kanselir', + 'mengantang': 'kantang', + 'berkantaran': 'kantar', + 'penganti': 'kanti', + 'pengantinya': 'kanti', + 'pengantian': 'kanti', + 'berkantong': 'kantong', + 'mengantongi': 'kantong', + 'mengantonginya': 'kantong', + 'pengantongan': 'kantong', + 'berkantor': 'kantor', + 'berkantornya': 'kantor', + 'perkantoran': 'kantor', + 'perkantorannya': 'kantor', + 'terkantuk': 'kantuk', + 'terkantuk-kantuk': 'kantuk', + 'menganvaskan': 'kanvas', + 'menganvaskannya': 'kanvas', + 'mengaoki': 'kaok', + 'berkaok-kaok': 'kaok', + 'kapa-kapa': 'kapa', + 'terkapah-kapah': 'kapah', + 'terkapai-kapai': 'kapai', + 'berkapak': 'kapak', + 'kapalan': 'kapal', + 'berkapal': 'kapal', + 'perkapalan': 'kapal', + 'perkapalannya': 'kapal', + 'pengapalan': 'kapal', + 'pengapalannya': 'kapal', + 'mengapalkan': 'kapal', + 'mengapalkannya': 'kapal', + 'kapan-kapan': 'kapan', + 'kapan-kapannya': 'kapan', + 'kapangan': 'kapang', + 'berkapang': 'kapang', + 'berkapas': 'kapas', + 'berkapasitas': 'kapasitas', + 'berkapitulasi': 'kapitulasi', + 'mengapokkan': 'kapok', + 'mengapteni': 'kapten', + 'kapu-kapu': 'kapu', + 'terkapung-kapung': 'kapung', + 'mengapur': 'kapur', + 'mengapurkan': 'kapur', + 'pekapuran': 'kapur', + 'pengapuran': 'kapur', + 'perkapuran': 'kapur', + 'sekapur sirih': 'kapur sirih', + 'berkarakter': 'karakter', + 'berkarakternya': 'karakter', + 'berkarakterlah': 'karakter', + 'mengaram': 'karam', + 'mengaramkan': 'karam', + 'mengarami': 'karam', + 'karangan': 'karang', + 'karangannya': 'karang', + 'karanganan': 'karang', + 'karanganku': 'karang', + 'pengarang': 'karang', + 'pengarangnya': 'karang', + 'berkarang': 'karang', + 'pekarangan': 'karang', + 'pekarangannya': 'karang', + 'pekaranganku': 'karang', + 'pekaranganmu': 'karang', + 'kepengarangan': 'karang', + 'karang-karangan': 'karang', + 'karang-karangannya': 'karang', + 'karang-mengarang': 'karang', + 'mengarang-ngarang': 'karang', + 'mengarantinakan': 'karantina', + 'berkaraoke': 'karaoke', + 'karas hati': 'karatan', + 'berkarau': 'karau', + 'mengarau': 'karau', + 'pengarauan': 'karau', + 'karbidan': 'karbida', + 'mengarbida': 'karbida', + 'mengarbol': 'karbol', + 'dikarenakan': 'karena', + 'dikarenakannya': 'karena', + 'mengaret': 'karet', + 'mengareti': 'karet', + 'perkaretan': 'karet', + 'mengarib': 'karib', + 'berkarib': 'karib', + 'mengaribi': 'karib', + 'kekariban': 'karib', + 'perkariban': 'karib', + 'mengaribkan': 'karib', + 'berkarier': 'karier', + 'berkariernya': 'karier', + 'berkarierlah': 'karier', + 'pengarih': 'karih', + 'berkarpet': 'karpet', + 'pengartuan': 'kartu', + 'perkartuan': 'kartu', + 'mengartukan': 'kartu', + 'mengartumerahkan': 'kartu merah', + 'berkaru': 'karu', + 'mengaru': 'karu', + 'berkarung': 'karung', + 'berkarung-karung': 'karung', + 'mengaruniai': 'karunia', + 'mengaruniainya': 'karunia', + 'mengaruniakan': 'karunia', + 'mengarut': 'karut', + 'berkarut': 'karut', + 'karut-marut': 'karut', + 'karut-marutnya': 'karut', + 'berkarya': 'karya', + 'berkaryanya': 'karya', + 'berkaryalah': 'karya', + 'kekaryaan': 'karya', + 'kekaryaannya': 'karya', + 'pengaryaan': 'karya', + 'mengaryakan': 'karya', + 'mengasadkan': 'kasad', + 'berkasak-kusuk': 'kasak-kusuk', + 'kasap jantan': 'kasap', + 'kekasaran': 'kasar', + 'kekasarannya': 'kasar', + 'mengasari': 'kasar', + 'mengasarinya': 'kasar', + 'mengasariku': 'kasar', + 'memperkasar': 'kasar', + 'mengasarkan': 'kasar', + 'perkasetan': 'kaset', + 'mengasetkan': 'kaset', + 'berkasidah': 'kasidah', + 'mengasidahkan': 'kasidah', + 'pekasih': 'kasih', + 'kekasih': 'kasih', + 'kekasihnya': 'kasih', + 'kekasihkan': 'kasih', + 'kekasihku': 'kasih', + 'kekasihmu': 'kasih', + 'kekasih-ku': 'kasih', + 'berkasih': 'kasih', + 'mengasih': 'kasih', + 'mengasihnya': 'kasih', + 'mengasihkan': 'kasih', + 'mengasihkannya': 'kasih', + 'mengasihi': 'kasih', + 'pengasih': 'kasih', + 'pengasihan': 'kasih', + 'mengasihinya': 'kasih', + 'mengasihiku': 'kasih', + 'mengasihimu': 'kasih', + 'berkasih-kasihan': 'kasih', + 'mengasihani': 'kasihan', + 'mengasihaninya': 'kasihan', + 'mengasim': 'kasim', + 'mengastrasi': 'kastrasi', + 'terkatah-katah': 'katah', + 'berkatak-katak': 'katak', + 'mengatalisasi': 'katalisasi', + 'mengatalisis': 'katalisis', + 'mengatalisit': 'katalisit', + 'pengatalog': 'katalog', + 'perkatalogan': 'katalog', + 'pengatalogan': 'katalog', + 'mengatalogkan': 'katalog', + 'berkategori': 'kategori', + 'terkategori': 'kategori', + 'terkategorikan': 'kategori', + 'mengategorikan': 'kategori', + 'mengategorikannya': 'kategori', + 'sekati': 'kati', + 'sekatinya': 'kati', + 'katian': 'kati', + 'katiannya': 'kati', + 'dikati': 'kati', + 'dikatikan': 'kati', + 'mengati': 'kati', + 'mengatikan': 'kati', + 'mengatikannya': 'kati', + 'mengatrol': 'katrol', + 'mengatrolnya': 'katrol', + 'terkatung-katung': 'katung', + 'terkatung-katungnya': 'katung', + 'terkatup': 'katup', + 'terkatupnya': 'katup', + 'mengatup': 'katup', + 'mengatupnya': 'katup', + 'mengatupkan': 'katup', + 'mengatupkannya': 'katup', + 'memperkatupkan': 'katup', + 'mengatup-ngatupkan': 'katup', + 'kaulan': 'kaul', + 'berkaul': 'kaul', + 'mengaulkan': 'kaul', + 'kauman': 'kaum', + 'berkaum': 'kaum', + 'perkauman': 'kaum', + 'berkaus': 'kaus', + 'mengaut': 'kaut', + 'mengautkan': 'kaut', + 'mengaveling': 'kaveling', + 'berkaveling': 'kaveling', + 'pengavelingan': 'kaveling', + 'mengkaver': 'kaver', + 'kawakan': 'kawak', + 'kawakannya': 'kawak', + 'kawalan': 'kawal', + 'kawalannya': 'kawal', + 'kawalanan': 'kawal', + 'berkawal': 'kawal', + 'pengawal': 'kawal', + 'pengawalnya': 'kawal', + 'pengawali': 'kawal', + 'pengawalan': 'kawal', + 'mengawal': 'kawal', + 'mengawalnya': 'kawal', + 'mengawallah': 'kawal', + 'mengawalkan': 'kawal', + 'mengawalan': 'kawal', + 'mengawalku': 'kawal', + 'mengawalmu': 'kawal', + 'pengawalannya': 'kawal', + 'pengawalanlah': 'kawal', + 'pengawalanan': 'kawal', + 'mengawih': 'kawih', + 'berkawin': 'kawin', + 'pengawin': 'kawin', + 'mengawin': 'kawin', + 'mengawinkan': 'kawin', + 'mengawinkannya': 'kawin', + 'mengawini': 'kawin', + 'mengawininya': 'kawin', + 'mengawinimu': 'kawin', + 'perkawinan': 'kawin', + 'perkawinannya': 'kawin', + 'perkawinanan': 'kawin', + 'perkawinanku': 'kawin', + 'mengawinkankan': 'kawin', + 'kawin-mawin': 'kawin', + 'terkaya': 'kaya', + 'terkayanya': 'kaya', + 'terkayakan': 'kaya', + 'kekayaan': 'kaya', + 'kekayaannya': 'kaya', + 'kekayaanan': 'kaya', + 'kekayaanmu': 'kaya', + 'pengayaan': 'kaya', + 'pengayaannya': 'kaya', + 'memperkaya': 'kaya', + 'memperkayanya': 'kaya', + 'terkayai': 'kayai', + 'mengayaikan': 'kayai', + 'pengayau': 'kayau', + 'pengayauan': 'kayau', + 'mengayau': 'kayau', + 'berkayau': 'kayau', + 'berkayu': 'kayu', + 'berkayunya': 'kayu', + 'kekayuan': 'kayu', + 'perkayuan': 'kayu', + 'kayu-kayu': 'kayu', + 'kayu-kayunya': 'kayu', + 'kayu-kayuan': 'kayu', + 'mengebal': 'kebal', + 'mengebalkan': 'kebal', + 'kekebalan': 'kebal', + 'kekebalannya': 'kebal', + 'pengebalan': 'kebal', + 'mengebas': 'kebas', + 'mengebaskan': 'kebas', + 'sekebat': 'kebat', + 'pengebat': 'kebat', + 'mengebat': 'kebat', + 'terkebat': 'kebat', + 'mengebatkan': 'kebat', + 'kebat-kebit': 'kebat', + 'terkebiri': 'kebiri', + 'terkebirinya': 'kebiri', + 'mengebiri': 'kebiri', + 'mengebirinya': 'kebiri', + 'pengebirian': 'kebiri', + 'pengebiriannya': 'kebiri', + 'mengebur': 'kebur', + 'pengebut': 'kebut', + 'pengebutan': 'kebut', + 'mengebut': 'kebut', + 'mengebutkan': 'kebut', + 'mengebuti': 'kebut', + 'kebut-kebutan': 'kebut', + 'kebut-kebutannya': 'kebut', + 'kebut-kebutanan': 'kebut', + 'berkebyaran': 'kebyar', + 'berkecak pinggang': 'kecak pinggang', + 'kecaman': 'kecam', + 'kecamannya': 'kecam', + 'kecamanan': 'kecam', + 'mengecam': 'kecam', + 'mengecamnya': 'kecam', + 'mengecamkan': 'kecam', + 'mengecaman': 'kecam', + 'mengecamku': 'kecam', + 'pengecam': 'kecam', + 'pengecamnya': 'kecam', + 'pengecaman': 'kecam', + 'berkecandan': 'kecandan', + 'kecapan': 'kecap', + 'pengecap': 'kecap', + 'pengecapnya': 'kecap', + 'terkecap-kecap': 'kecap', + 'dikecek': 'kecek', + 'berkecek-kecek': 'kecek', + 'sekeceng': 'keceng', + 'mengeceng': 'keceng', + 'mengecengkan': 'keceng', + 'terkecewa': 'kecewa', + 'kekecewaan': 'kecewa', + 'kekecewaannya': 'kecewa', + 'kekecewaanlah': 'kecewa', + 'mengecewakan': 'kecewa', + 'mengecewakannya': 'kecewa', + 'mengecewakanku': 'kecewa', + 'mengecewakanmu': 'kecewa', + 'berkeciak': 'keciak', + 'berkecibakan': 'kecibak', + 'berkecil hati': 'kecil hati', + 'sekecil': 'kecil', + 'sekecilnya': 'kecil', + 'kecilan': 'kecil', + 'mengecil': 'kecil', + 'mengecilnya': 'kecil', + 'mengecilkan': 'kecil', + 'mengecilkannya': 'kecil', + 'kekecilan': 'kecil', + 'kekecilannya': 'kecil', + 'kekecilanlah': 'kecil', + 'pengecilan': 'kecil', + 'memperkecil': 'kecil', + 'memperkecilnya': 'kecil', + 'memperkecilkan': 'kecil', + 'kecil-kecilan': 'kecil', + 'kecil-kecilannya': 'kecil', + 'kecil-mengecil': 'kecil', + 'berkecil-kecil': 'kecil', + 'berkecil-kecilan': 'kecil', + 'kecomak-kecimik': 'kecimik', + 'mengecimus': 'kecimus', + 'berkecipak': 'kecipak', + 'pengecoh': 'kecoh', + 'pengecohan': 'kecoh', + 'terkecoh': 'kecoh', + 'terkecohnya': 'kecoh', + 'mengecoh': 'kecoh', + 'mengecohnya': 'kecoh', + 'mengecohkan': 'kecoh', + 'mengecohku': 'kecoh', + 'mengecu': 'kecu', + 'berkecuali': 'kecuali', + 'mengecuali': 'kecuali', + 'mengecualikan': 'kecuali', + 'mengecualikannya': 'kecuali', + 'mengecualian': 'kecuali', + 'terkecuali': 'kecuali', + 'terkecualikan': 'kecuali', + 'kekecualian': 'kecuali', + 'perkecualian': 'kecuali', + 'perkecualiannya': 'kecuali', + 'pengecualian': 'kecuali', + 'pengecualiannya': 'kecuali', + 'memperkecualikan': 'kecuali', + 'berkecumik': 'kecumik', + 'kecupan': 'kecup', + 'kecupannya': 'kecup', + 'mengecup': 'kecup', + 'mengecupnya': 'kecup', + 'mengecupkan': 'kecup', + 'pengecut': 'kecut', + 'pengecutnya': 'kecut', + 'mengecut': 'kecut', + 'mengecutkan': 'kecut', + 'kekecutan': 'kecut', + 'kepengecutan': 'kecut', + 'berkedal': 'kedal', + 'pengedang': 'kedang', + 'mengedang': 'kedang', + 'mengedangkan': 'kedang', + 'mengedau': 'kedau', + 'kedek-kedek': 'kedek', + 'terkedek-kedek': 'kedek', + 'kedekak-kedekik': 'kedekik', + 'kedewaga': 'kedewas', + 'mengedik': 'kedik', + 'mengedikkan': 'kedik', + 'terkedik': 'kedik', + 'berkedip': 'kedip', + 'berkediplah': 'kedip', + 'terkedip': 'kedip', + 'mengedipkan': 'kedip', + 'mengedipkannya': 'kedip', + 'terkedip-kedip': 'kedip', + 'berkedip-kedip': 'kedip', + 'berkedok': 'kedok', + 'berkedokkan': 'kedok', + 'memperkedok': 'kedok', + 'kekedotan': 'kedot', + 'mengeduk': 'keduk', + 'terkehel': 'kehel', + 'mengejai': 'kejai', + 'berkejai': 'kejai', + 'terkejam': 'kejam', + 'mengejam': 'kejam', + 'kekejaman': 'kejam', + 'kekejamannya': 'kejam', + 'kekejamanan': 'kejam', + 'mengejami': 'kejam', + 'mengejamkan': 'kejam', + 'berkejang': 'kejang', + 'mengejang': 'kejang', + 'mengejangnya': 'kejang', + 'mengejangkan': 'kejang', + 'kekejangan': 'kejang', + 'berkejang-kejang': 'kejang', + 'kejang-kejang': 'mengejang', + 'kejang-kejangnya': 'mengejang', + 'kejapan': 'kejap', + 'kejapanan': 'kejap', + 'sekejap': 'kejap', + 'berkejap': 'kejap', + 'mengejap': 'kejap', + 'mengejapkan': 'kejap', + 'berkejap-kejap': 'kejap', + 'dikejar': 'kejar', + 'dikejarnya': 'kejar', + 'dikejarkan': 'kejar', + 'kejaran': 'kejar', + 'kejarannya': 'kejar', + 'mengejar': 'kejar', + 'mengejarnya': 'kejar', + 'mengejarkan': 'kejar', + 'mengejari': 'kejar', + 'mengejaran': 'kejar', + 'mengejarku': 'kejar', + 'mengejarmu': 'kejar', + 'terkejar': 'kejar', + 'berkejaran': 'kejar', + 'bersikejar': 'kejar', + 'pengejaran': 'kejar', + 'pengejarannya': 'kejar', + 'kejar-mengejar': 'kejar', + 'terkejar-kejar': 'kejar', + 'mengejar-ngejar': 'kejar', + 'mengejar-ngejarnya': 'kejar', + 'berkejar-kejaran': 'kejar', + 'berkeji': 'keji', + 'kekejian': 'keji', + 'kekejiannya': 'keji', + 'mengejikan': 'keji', + 'mengejuju': 'kejuju', + 'kejutan': 'kejut', + 'kejutannya': 'kejut', + 'terkejut': 'kejut', + 'terkejutnya': 'kejut', + 'terkejutlah': 'kejut', + 'terkejutkan': 'kejut', + 'terkejutan': 'kejut', + 'berkejut': 'kejut', + 'mengejut': 'kejut', + 'mengejutnya': 'kejut', + 'mengejutkan': 'kejut', + 'mengejutkannya': 'kejut', + 'mengejutan': 'kejut', + 'pengejut': 'kejut', + 'pengejutkan': 'kejut', + 'mengejuti': 'kejut', + 'kekejutan': 'kejut', + 'kekejutannya': 'kejut', + 'berkejutan': 'kejut', + 'mengejutkanlah': 'kejut', + 'mengejutkankan': 'kejut', + 'mengejutkanku': 'kejut', + 'kejut-kejut': 'kejut', + 'kejut-kejutan': 'kejut', + 'keterkejutan': 'kejut', + 'keterkejutannya': 'kejut', + 'berkejut telinga': 'kejut', + 'mengejut-ngejuti': 'kejut', + 'mengekah': 'kekah', + 'kekangan': 'kekang', + 'terkekang': 'kekang', + 'terkekangnya': 'kekang', + 'mengekang': 'kekang', + 'mengekangnya': 'kekang', + 'mengekangi': 'kekang', + 'mengekangan': 'kekang', + 'pengekangan': 'kekang', + 'mengekar': 'kekar', + 'mengekarkan': 'kekar', + 'mengekas': 'kekas', + 'terkekau-kekau': 'kekau', + 'terkekeh-kekeh': 'kekeh', + 'mengekek': 'kekek', + 'terkekek-kekek': 'kekek', + 'mengelam': 'kelam', + 'mengelamkan': 'kelam', + 'mengelami': 'kelam', + 'berkelam': 'kelam', + 'kekelaman': 'kelam', + 'pengelaman': 'kelam', + 'pengelamannya': 'kelam', + 'mengenyal': 'kenyal', + 'mengenyalkan': 'kenyal', + 'kekenyalan': 'kenyal', + 'kekenyalannya': 'kenyal', + 'kekenyangan': 'kenyang', + 'kekenyangannya': 'kenyang', + 'sekenyangnya': 'kenyang', + 'mengenyangkan': 'kenyang', + 'sekenyang-kenyangnya': 'kenyang', + 'mengeker': 'keker', + 'kikiran': 'kikir', + 'kikirannya': 'kikir', + 'mengikir': 'kikir', + 'berkikir': 'kikir', + 'kekikiran': 'kikir', + 'mengekol': 'kol', + 'berkukuh': 'kukuh', + 'berkukuhnya': 'kukuh', + 'mengukuhi': 'kukuh', + 'kekukuhan': 'kukuh', + 'kekukuhannya': 'kukuh', + 'pengukuhan': 'kukuh', + 'pengukuhannya': 'kukuh', + 'memperkukuh': 'kukuh', + 'memperkukuhkan': 'kukuh', + 'mengukuhkan': 'kukuh', + 'mengukuhkannya': 'kukuh', + 'menguning': 'kuning', + 'menguningnya': 'kuning', + 'menguningkan': 'kuning', + 'kekuningan': 'kuning', + 'kekuning-kuningan': 'kuning', + 'kekunoan': 'kuno', + 'kekunoannya': 'kuno', + 'kurusan': 'kurus', + 'mengurus': 'urus', + 'mengurusnya': 'urus', + 'menguruskan': 'urus', + 'menguruskannya': 'urus', + 'mengurusi': 'urus', + 'mengurusan': 'urus', + 'mengurusmu': 'urus', + 'kekurusan': 'kurus', + 'pengurusan': 'urus', + 'pengurusannya': 'urus', + 'mengusut': 'usut', + 'mengusutnya': 'usut', + 'mengusutkan': 'usut', + 'mengusuti': 'usut', + 'mengusutan': 'usut', + 'kekusutan': 'kusut', + 'kekusutannya': 'kusut', + 'berkusut-kusut': 'kusut', + 'kelabakan': 'kelabak', + 'kelabangan': 'kelabang', + 'berkelabang': 'kelabang', + 'mengelabang': 'kelabang', + 'mengelabui': 'kelabu', + 'mengelabuinya': 'kelabu', + 'pengelabuan': 'kelabu', + 'pengelabuannya': 'kelabu', + 'mengeladau': 'keladau', + 'mengelah': 'kelah', + 'mengelahkan': 'kelah', + 'mengelai': 'kelai', + 'mengelai-ngelai': 'kelai', + 'pelalai': 'lalai', + 'pelalaian': 'lalai', + 'terlalai': 'lalai', + 'terlalaikan': 'lalai', + 'kelalaian': 'lalai', + 'kelalaiannya': 'lalai', + 'melalaikan': 'lalai', + 'melalaikannya': 'lalai', + 'memperlalaikan': 'lalai', + 'berlalai-lalai': 'lalai', + 'berkelambu': 'kelambu', + 'sekelamin': 'kelamin', + 'berkelamin': 'kelamin', + 'mengelamini': 'kelamin', + 'berlancang': 'lancang', + 'kelancangan': 'lancang', + 'kelancangannya': 'lancang', + 'lancang-lancang': 'lancang', + 'lancaran': 'lancar', + 'pelancar': 'lancar', + 'pelancarkan': 'lancar', + 'pelancaran': 'lancar', + 'melancar': 'lancar', + 'melancarkan': 'lancar', + 'melancarkannya': 'lancar', + 'melancaran': 'lancar', + 'kelancaran': 'lancar', + 'kelancarannya': 'lancar', + 'kelancaranan': 'lancar', + 'kelancaranmu': 'lancar', + 'memperlancar': 'lancar', + 'memperlancarnya': 'lancar', + 'memperlancarkan': 'lancar', + 'memperlancaran': 'lancar', + 'mengelanjar': 'kelanjar', + 'berkelanjaran': 'kelanjar', + 'mengelantang': 'kelantang', + 'sekelap': 'kelap', + 'kelap-kelip': 'terkelap', + 'mengelapkan': 'lap', + 'sekelap': 'terkelap', + 'berlapar': 'lapar', + 'kelaparan': 'lapar', + 'kelaparannya': 'lapar', + 'kelaparanlah': 'lapar', + 'melaparkan': 'lapar', + 'berkelar': 'kelar', + 'mengelar': 'kelar', + 'mengelarkan': 'kelar', + 'berkelar-kelar': 'kelar', + 'mengelarai': 'kelarai', + 'melarut': 'larut', + 'melarutnya': 'larut', + 'melarutkan': 'larut', + 'melarutkannya': 'larut', + 'pelarut': 'larut', + 'pelarutnya': 'larut', + 'pelarutan': 'larut', + 'larutan': 'larut', + 'larutannya': 'larut', + 'terlarut': 'larut', + 'terlarutnya': 'larut', + 'terlarutkan': 'larut', + 'kelarutan': 'larut', + 'kelarutannya': 'larut', + 'pelarutannya': 'larut', + 'berlarut-larut': 'larut', + 'berlarut-larutnya': 'larut', + 'keberlarut-larutan': 'larut', + 'mengelas': 'las', + 'mengelasnya': 'las', + 'berkelas': 'kelas', + 'berkelasnya': 'kelas', + 'mengelaskan': 'kelas', + 'kelasah-kelusuh': 'kelasah', + 'pengelat': 'kelat', + 'pelaut': 'laut', + 'pelautnya': 'laut', + 'lautan': 'laut', + 'lautannya': 'laut', + 'melaut': 'laut', + 'melautnya': 'laut', + 'melauti': 'laut', + 'pelautan': 'laut', + 'kelautan': 'laut', + 'kelautannya': 'laut', + 'kelautanlah': 'laut', + 'kelautanan': 'laut', + 'melautkan': 'laut', + 'melayak': 'layak', + 'melayakkan': 'layak', + 'melayakan': 'layak', + 'layaknya': 'layak', + 'terlayak': 'layak', + 'kelayakan': 'layak', + 'kelayakannya': 'layak', + 'kelayakanan': 'layak', + 'kelayakanku': 'layak', + 'kelayakanmu': 'layak', + 'selayaknya': 'layak', + 'selayaknyalah': 'layak', + 'melayu': 'layu', + 'melayunya': 'layu', + 'pelayuan': 'layu', + 'pelayuanan': 'layu', + 'kelayuan': 'layu', + 'layu-layuan': 'layu', + 'kelebatan': 'kelebat', + 'sekelebat': 'kelebat', + 'sekelebatan': 'kelebat', + 'berkelebat': 'kelebat', + 'berkelebatnya': 'kelebat', + 'berkelebatan': 'kelebat', + 'mengelebatkan': 'kelebat', + 'mengelebekkan': 'kelebek', + 'mengelebukan': 'kelebu', + 'berkeledar': 'keledar', + 'berkelejat': 'kelejat', + 'kelek-kelek': 'kelek', + 'kelek-kelekan': 'kelek', + 'berkelelot': 'kelelot', + 'mengelelotkan': 'kelelot', + 'kelembaman': 'lembam', + 'berkelemban': 'kelemban', + 'pelembap': 'lembap', + 'pelembapnya': 'lembap', + 'pelembapan': 'lembap', + 'kelembapan': 'lembap', + 'kelembapannya': 'lembap', + 'melembapkan': 'lembap', + 'melembapkannya': 'lembap', + 'berkelembapan': 'lembap', + 'pelembut': 'lembut', + 'pelembutnya': 'lembut', + 'pelembutan': 'lembut', + 'terlembut': 'lembut', + 'kelembutan': 'lembut', + 'kelembutannya': 'lembut', + 'melembutkan': 'lembut', + 'melembutkannya': 'lembut', + 'terkelempai': 'kelempai', + 'kelengangan': 'lengang', + 'melengangkan': 'lengang', + 'mengelenggarakan': 'kelenggara', + 'kelenyapan': 'lenyap', + 'melenyapkan': 'lenyap', + 'melenyapkannya': 'lenyap', + 'melenyapkanku': 'lenyap', + 'terkelepai': 'kelepai', + 'mengelepai': 'kelepai', + 'berkelepai': 'kelepai', + 'berkelepai-kelepai': 'kelepai', + 'mengelepat': 'kelepat', + 'terkelepek': 'kelepek', + 'terkelepet': 'kelepet', + 'mengelepik-ngelepik': 'kelepik', + 'mengelepur': 'kelepur', + 'mengelesot': 'kelesot', + 'kelesuan': 'lesu', + 'kelesuannya': 'lesu', + 'berkeletah': 'keletah', + 'berletih': 'letih', + 'keletihan': 'letih', + 'keletihannya': 'letih', + 'meletihkan': 'letih', + 'berletih-letih': 'letih', + 'melewah': 'lewah', + 'kelewahan': 'lewah', + 'kelewat': 'lewat', + 'kelewatan': 'lewat', + 'selewat': 'lewat', + 'selewatnya': 'lewat', + 'selewatan': 'lewat', + 'terlewat': 'lewat', + 'terlewatnya': 'lewat', + 'terlewatkan': 'lewat', + 'terlewatkannya': 'lewat', + 'terlewati': 'lewat', + 'melewati': 'lewat', + 'melewatinya': 'lewat', + 'melewatiku': 'lewat', + 'melewatimu': 'lewat', + 'terlewatinya': 'lewat', + 'terlewatikan': 'lewat', + 'berlewatan': 'lewat', + 'melewatkan': 'lewat', + 'melewatkannya': 'lewat', + 'melewatkanmu': 'lewat', + 'berkeliaran': 'keliar', + 'berkeliarannya': 'keliar', + 'berkelibang': 'kelibang', + 'berkelibangan': 'kelibang', + 'mengelibat': 'kelibat', + 'kelicikan': 'licik', + 'kelicikannya': 'licik', + 'mengelih': 'kelih', + 'pelihat': 'lihat', + 'pelihatan': 'lihat', + 'melihat': 'lihat', + 'melihatnya': 'lihat', + 'melihatlah': 'lihat', + 'melihatkan': 'lihat', + 'melihati': 'lihat', + 'melihatan': 'lihat', + 'melihatku': 'lihat', + 'melihatmu': 'lihat', + 'terlihat': 'lihat', + 'terlihatnya': 'lihat', + 'terlihatlah': 'lihat', + 'terlihatan': 'lihat', + 'kelihatan': 'lihat', + 'kelihatannya': 'lihat', + 'kelihatanlah': 'lihat', + 'penglihat': 'lihat', + 'penglihatnya': 'lihat', + 'penglihatan': 'lihat', + 'penglihatannya': 'lihat', + 'penglihatani': 'lihat', + 'penglihatanku': 'lihat', + 'penglihatanmu': 'lihat', + 'melihat-lihat': 'lihat', + 'melihat-lihatnya': 'lihat', + 'memperlihatkan': 'lihat', + 'memperlihatkannya': 'lihat', + 'memperlihatkanlah': 'lihat', + 'berkelijak': 'kelijak', + 'terkelik': 'kelik', + 'mengelik': 'kelik', + 'mengelikan': 'kelik', + 'mengelikkan': 'lik', + 'mengelikik': 'kelikik', + 'kelilipan': 'kelilip', + 'berkelim': 'kelim', + 'mengelim': 'kelim', + 'pengelim': 'kelim', + 'kelincahan': 'lincah', + 'kelincahannya': 'lincah', + 'melincah-lincah': 'lincah', + 'terlincah-lincah': 'lincah', + 'berkelindan': 'kelindan', + 'berkelindannya': 'kelindan', + 'mengeling': 'keling', + 'mengelingi': 'keling', + 'terkelinjat-kelinjat': 'kelinjat', + 'kelintaran': 'kelintar', + 'berkelintaran': 'kelintar', + 'kelintingan': 'kelinting', + 'berkelip': 'kelip', + 'kelip-kelip': 'kelip', + 'berkelip-kelip': 'kelip', + 'terkelip-kelip': 'kelip', + 'mengelip-ngelip': 'kelip', + 'kekeliruan': 'keliru', + 'kekeliruannya': 'keliru', + 'pengeliruan': 'keliru', + 'mengelirukan': 'keliru', + 'mengelis': 'kelis', + 'berkelit': 'kelit', + 'berkelitnya': 'kelit', + 'berkelitlah': 'kelit', + 'mengelit': 'kelit', + 'mengelitkan': 'kelit', + 'mengeliti': 'kelit', + 'berkelit-kelit': 'kelit', + 'kelobaan': 'loba', + 'berkelocak': 'kelocak', + 'mengelocak': 'kelocak', + 'mengelodan': 'kelodan', + 'terkelola': 'kelola', + 'terkelolanya': 'kelola', + 'pengelola': 'kelola', + 'pengelolanya': 'kelola', + 'pengelolaan': 'kelola', + 'mengelola': 'kelola', + 'mengelolanya': 'kelola', + 'mengelolakan': 'kelola', + 'mengelolaan': 'kelola', + 'pengelolaannya': 'kelola', + 'terkelolong': 'kelolong', + 'kelompokan': 'kelompok', + 'mengelompok': 'kelompok', + 'mengelompokkan': 'kelompok', + 'mengelompokkannya': 'kelompok', + 'mengelompokan': 'kelompok', + 'berkelompok': 'kelompok', + 'berkelompoknya': 'kelompok', + 'pengelompokan': 'kelompok', + 'pengelompokannya': 'kelompok', + 'berkelompok-kelompok': 'kelompok', + 'sekelonet': 'kelonet', + 'berkelong': 'kelong', + 'melonggari': 'longgar', + 'kelonggaran': 'longgar', + 'kelonggarannya': 'longgar', + 'melonggarkan': 'longgar', + 'melonggarkannya': 'longgar', + 'memperlonggar': 'longgar', + 'memperlonggari': 'longgar', + 'mengelosok': 'kelosok', + 'mengelotok': 'kelotok', + 'berkeloyak': 'keloyak', + 'terkeloyak': 'keloyak', + 'mengeloyor': 'keloyor', + 'terkelu': 'kelu', + 'mengeluani': 'keluan', + 'keluaran': 'keluar', + 'keluarannya': 'keluar', + 'mengeluari': 'keluar', + 'pengeluaran': 'keluar', + 'pengeluarannya': 'keluar', + 'pengeluaranku': 'keluar', + 'pengeluaranmu': 'keluar', + 'mengeluarkan': 'keluar', + 'mengeluarkannya': 'keluar', + 'mengeluarkankan': 'keluar', + 'mengeluarkanku': 'keluar', + 'mengeluarkanmu': 'keluar', + 'keluarbiasaan': 'luar biasa', + 'keluarbiasaannya': 'luar biasa', + 'meluas': 'luas', + 'meluasnya': 'luas', + 'meluaslah': 'luas', + 'meluaskan': 'luas', + 'meluaskannya': 'luas', + 'meluasi': 'luas', + 'luasan': 'luas', + 'luasannya': 'luas', + 'keluasan': 'luas', + 'peluasan': 'luas', + 'peluasannya': 'luas', + 'peluasanan': 'luas', + 'perluasan': 'luas', + 'perluasannya': 'luas', + 'memperluas': 'luas', + 'memperluasnya': 'luas', + 'memperluaskan': 'luas', + 'memperluaskannya': 'luas', + 'terkelubak': 'kelubak', + 'kelucahan': 'lucah', + 'keluhan': 'keluh', + 'keluhannya': 'keluh', + 'keluhanlah': 'keluh', + 'keluhanan': 'keluh', + 'keluhanku': 'keluh', + 'keluhanmu': 'keluh', + 'terkeluh': 'keluh', + 'berkeluh': 'keluh', + 'mengeluh': 'keluh', + 'mengeluhnya': 'keluh', + 'mengeluhlah': 'keluh', + 'mengeluhkan': 'keluh', + 'mengeluhkannya': 'keluh', + 'mengeluhan': 'keluh', + 'pengeluh': 'keluh', + 'pengeluhan': 'keluh', + 'terkeluk': 'keluk', + 'berkeluk': 'keluk', + 'berkelukur': 'kelukur', + 'berkelukuran': 'kelukur', + 'sekelumit': 'kelumit', + 'kelumpuhan': 'lumpuh', + 'kelumpuhannya': 'lumpuh', + 'melumpuhkan': 'lumpuh', + 'melumpuhkannya': 'lumpuh', + 'berkelumun': 'kelumun', + 'mengelumuni': 'kelumun', + 'berkelun-kelun': 'kelun', + 'mengelupas': 'kelupas', + 'mengelupasnya': 'kelupas', + 'mengelupaskan': 'kelupas', + 'mengelupasi': 'kelupas', + 'terkelupas': 'kelupas', + 'terkelupasnya': 'kelupas', + 'mengelupur': 'kelupur', + 'melurus': 'lurus', + 'meluruskan': 'lurus', + 'meluruskannya': 'lurus', + 'melurusan': 'lurus', + 'kelurusan': 'lurus', + 'selurusan': 'lurus', + 'berselurus': 'lurus', + 'meluruskanlah': 'lurus', + 'selurusnya': 'lurus', + 'kelut-melut': 'kelut', + 'berkeluyuran': 'keluyur', + 'kemagnetan': 'magnet', + 'berkemah': 'kemah', + 'berkemahnya': 'kemah', + 'berkemahlah': 'kemah', + 'perkemahan': 'kemah', + 'perkemahannya': 'kemah', + 'perkemahanan': 'kemah', + 'memahiri': 'mahir', + 'kemahiran': 'mahir', + 'kemahirannya': 'mahir', + 'memahirkan': 'mahir', + 'mempermahir': 'mahir', + 'memaju': 'maju', + 'memajukan': 'maju', + 'memajukannya': 'maju', + 'kemajuan': 'maju', + 'kemajuannya': 'maju', + 'kemajuanlah': 'maju', + 'kemajuanmu': 'maju', + 'pemajuan': 'maju', + 'kemakmuran': 'makmur', + 'kemakmurannya': 'makmur', + 'memakmurkan': 'makmur', + 'memakmurkannya': 'makmur', + 'persemakmuran': 'makmur', + 'persemakmurannya': 'makmur', + 'berkemal': 'kemal', + 'pemalas': 'malas', + 'pemalasnya': 'malas', + 'pemalasan': 'malas', + 'kemalasan': 'malas', + 'kemalasannya': 'malas', + 'memalaskan': 'malas', + 'malas-malasan': 'malas', + 'bermalas-malas': 'malas', + 'bermalas-malasan': 'malas', + 'mengemam': 'kemam', + 'kemangkatan': 'mangkat', + 'kemangkatannya': 'mangkat', + 'kemanjuran': 'manjur', + 'kemanjurannya': 'manjur', + 'kemanusiaan': 'manusia', + 'kemanusiaannya': 'manusia', + 'kemanusiaanlah': 'manusia', + 'kemanusiaanmu': 'manusia', + 'pemanusiaan': 'manusia', + 'memanusiakan': 'manusia', + 'dikemarikan': 'kemari', + 'masukan': 'masuk', + 'masukannya': 'masuk', + 'masukanlah': 'masuk', + 'memasuki': 'masuk', + 'memasukinya': 'masuk', + 'memasukii': 'masuk', + 'termasuk': 'masuk', + 'termasuknya': 'masuk', + 'termasuklah': 'masuk', + 'termasuki': 'masuk', + 'termasukan': 'masuk', + 'pemasukan': 'masuk', + 'pemasukannya': 'masuk', + 'pemasukanan': 'masuk', + 'pemasukanku': 'masuk', + 'pemasukanmu': 'masuk', + 'kemasukan': 'masuk', + 'kemasukannya': 'masuk', + 'memasukkan': 'masuk', + 'memasukkannya': 'masuk', + 'memasukkanku': 'masuk', + 'termasyhur': 'masyhur', + 'kemasyhuran': 'masyhur', + 'kemasyhurannya': 'masyhur', + 'pemasyhuran': 'masyhur', + 'memasyhurkan': 'masyhur', + 'kematangan': 'matang', + 'kematangannya': 'matang', + 'kematanganlah': 'matang', + 'pematangan': 'matang', + 'pematangannya': 'matang', + 'mematangkan': 'matang', + 'mematangkannya': 'matang', + 'kembalian': 'kembali', + 'kembaliannya': 'kembali', + 'pengembalian': 'kembali', + 'pengembaliannya': 'kembali', + 'mengembalikan': 'kembali', + 'mengembalikannya': 'kembali', + 'mengembalikankan': 'kembali', + 'mengembalikanku': 'kembali', + 'mengembalikanmu': 'kembali', + 'berkemban': 'kemban', + 'berkembannya': 'kemban', + 'berkembang biak': 'kembang biak', + 'pengembangbiakan': 'kembang biak', + 'pengembangbiakannya': 'kembang biak', + 'perkembangbiakan': 'kembang biak', + 'perkembangbiakannya': 'kembang biak', + 'mengembangbiakkan': 'kembang biak', + 'mengembangbiakkannya': 'kembang biak', + 'mengembeng': 'kembeng', + 'mengembengkan': 'kembeng', + 'mengembungkan': 'kembung', + 'mengembur': 'kembur', + 'mengemburkan': 'kembur', + 'berkembur': 'kembur', + 'berkembur-kembur': 'kembur', + 'bermegah': 'megah', + 'kemegahan': 'megah', + 'kemegahannya': 'megah', + 'memegahkan': 'megah', + 'bermegah-megah': 'megah', + 'bermegah-megahan': 'megah', + 'berkemeja': 'kemeja', + 'kemelaratan': 'melarat', + 'kemelaratannya': 'melarat', + 'memeleset': 'peleset', + 'memelesetkan': 'peleset', + 'memelesetkannya': 'peleset', + 'memelesetan': 'peleset', + 'pelesetan': 'peleset', + 'pelesetannya': 'peleset', + 'terpeleset': 'peleset', + 'terpelesetnya': 'peleset', + 'kemelesetan': 'peleset', + 'pemelesetan': 'peleset', + 'berkemendang': 'kemendang', + 'mengemendang': 'kemendang', + 'berkementam': 'kementam', + 'kementerian': 'menteri', + 'kementeriannya': 'menteri', + 'kementeriani': 'menteri', + 'pemerdeka': 'merdeka', + 'pemerdekaan': 'merdeka', + 'kemerdekaan': 'merdeka', + 'kemerdekaannya': 'merdeka', + 'kemerdekaanlah': 'merdeka', + 'kemerdekaanku': 'merdeka', + 'memerdekakan': 'merdeka', + 'memerdekakannya': 'merdeka', + 'semerdeka-merdekanya': 'merdeka', + 'kemerduan': 'merdu', + 'termesra': 'mesra', + 'kemesraan': 'mesra', + 'kemesraannya': 'mesra', + 'bermesraan': 'mesra', + 'bermesraanlah': 'mesra', + 'memesrakan': 'mesra', + 'bermesra-mesraan': 'mesra', + 'berkemih': 'kemih', + 'berkemihnya': 'kemih', + 'berkemihlah': 'kemih', + 'kemak-kemik': 'kemik', + 'kemiringan': 'miring', + 'kemiringannya': 'miring', + 'memiringkan': 'miring', + 'kemiripan': 'mirip', + 'kemiripannya': 'mirip', + 'kemiripanku': 'mirip', + 'bermiripan': 'mirip', + 'pemiskinan': 'miskin', + 'kemiskinan': 'miskin', + 'kemiskinannya': 'miskin', + 'kemiskinanlah': 'miskin', + 'kemiskinanan': 'miskin', + 'kemiskinanku': 'miskin', + 'memiskinkan': 'miskin', + 'memiskinkannya': 'miskin', + 'kemontokan': 'montok', + 'kempaan': 'kempa', + 'mengempa': 'kempa', + 'terkempa': 'kempa', + 'pengempaan': 'kempa', + 'kempang-kempis': 'kempang', + 'mengempis': 'kempis', + 'mengempisnya': 'kempis', + 'mengempiskan': 'kempis', + 'mengempiskannya': 'kempis', + 'pengempisan': 'kempis', + 'kempas-kempis': 'kempis', + 'mengempit': 'kempit', + 'kemplangan': 'kemplang', + 'mengemplang': 'kemplang', + 'mengemplangan': 'kemplang', + 'berkempul-kempul': 'kempul', + 'terkempul-kempul': 'kempul', + 'mengemu': 'kemu', + 'mengemukan': 'kemu', + 'mengemui': 'kemu', + 'berkemu': 'kemu', + 'bermudarat': 'mudarat', + 'kemudaratan': 'mudarat', + 'kemudaratannya': 'mudarat', + 'terkemudian': 'kemudian', + 'mengemudiankan': 'kemudian', + 'kemujaraban': 'mujarab', + 'kemujarabannya': 'mujarab', + 'mengemuli': 'kemul', + 'pemulia': 'mulia', + 'pemuliaan': 'mulia', + 'termulia': 'mulia', + 'kemuliaan': 'mulia', + 'kemuliaannya': 'mulia', + 'kemuliaanan': 'mulia', + 'kemuliaanku': 'mulia', + 'pemuliaannya': 'mulia', + 'memuliakan': 'mulia', + 'memuliakannya': 'mulia', + 'mempermulia': 'mulia', + 'kemunafikan': 'munafik', + 'kemunafikannya': 'munafik', + 'kemunafikanlah': 'munafik', + 'kemungkinan': 'mungkin', + 'kemungkinannya': 'mungkin', + 'kemungkinanlah': 'mungkin', + 'kemungkinankan': 'mungkin', + 'kemungkinanan': 'mungkin', + 'kemungkinanku': 'mungkin', + 'memungkinkan': 'mungkin', + 'memungkinkannya': 'mungkin', + 'memungkinkanlah': 'mungkin', + 'memungkinkankan': 'mungkin', + 'memungkinkanku': 'mungkin', + 'memungkinkanmu': 'mungkin', + 'memurkai': 'murka', + 'kemurkaan': 'murka', + 'kemurkaannya': 'murka', + 'kemurkaan-mu': 'murka', + 'kemurnian': 'murni', + 'kemurniannya': 'murni', + 'pemurnian': 'murni', + 'pemurniannya': 'murni', + 'memurnikan': 'murni', + 'memurnikannya': 'murni', + 'kemurtadan': 'murtad', + 'kemurtadannya': 'murtad', + 'pemurtadan': 'murtad', + 'memurtadkan': 'murtad', + 'kemurungan': 'murung', + 'kemurungannya': 'murung', + 'kemustajaban': 'mustajab', + 'terkemut-kemut': 'kemut', + 'mengena': 'kena', + 'mengenakan': 'kena', + 'mengenakannya': 'kena', + 'mengenai': 'kena', + 'mengenaan': 'kena', + 'terkena': 'kena', + 'terkenanya': 'kena', + 'terkenakan': 'kena', + 'terkenai': 'kena', + 'mengenainya': 'kena', + 'mengenaikan': 'kena', + 'mengenaii': 'kena', + 'mengenaiku': 'kena', + 'mengenaimu': 'kena', + 'pengenaan': 'kena', + 'pengenaannya': 'kena', + 'berkenaan': 'kena', + 'berkenaannya': 'kena', + 'perkenaan': 'kena', + 'perkenaannya': 'kena', + 'kena-mengena': 'kena', + 'berkena-kenaan': 'kena', + 'kenaifan': 'naif', + 'kenaifanku': 'naif', + 'kenalan': 'kenal', + 'kenalannya': 'kenal', + 'kenalanan': 'kenal', + 'kenalanmu': 'kenal', + 'terkenal': 'kenal', + 'terkenalnya': 'kenal', + 'terkenallah': 'kenal', + 'terkenali': 'kenal', + 'terkenalan': 'kenal', + 'pengenal': 'kenal', + 'pengenalnya': 'kenal', + 'pengenalan': 'kenal', + 'pengenalku': 'kenal', + 'mengenal': 'kenal', + 'mengenalnya': 'kenal', + 'mengenalkan': 'kenal', + 'mengenalkannya': 'kenal', + 'mengenali': 'kenal', + 'mengenalan': 'kenal', + 'mengenalku': 'kenal', + 'mengenalmu': 'kenal', + 'mengenalinya': 'kenal', + 'mengenalikan': 'kenal', + 'mengenaliku': 'kenal', + 'mengenalimu': 'kenal', + 'pengenalannya': 'kenal', + 'pengenalanan': 'kenal', + 'berkenalan': 'kenal', + 'berkenalannya': 'kenal', + 'berkenalanlah': 'kenal', + 'perkenalan': 'kenal', + 'perkenalannya': 'kenal', + 'perkenalanan': 'kenal', + 'perkenalanku': 'kenal', + 'perkenalanmu': 'kenal', + 'kenal-mengenal': 'kenal', + 'memperkenalkan': 'kenal', + 'memperkenalkannya': 'kenal', + 'memperkenalkankan': 'kenal', + 'memperkenalkanku': 'kenal', + 'memperkenalkanmu': 'kenal', + 'berkenal-kenalan': 'kenal', + 'kenangan': 'kenang', + 'kenangannya': 'kenang', + 'kenangani': 'kenang', + 'kenanganan': 'kenang', + 'kenanganku': 'kenang', + 'kenanganmu': 'kenang', + 'mengenang': 'kenang', + 'mengenangnya': 'kenang', + 'mengenangkan': 'kenang', + 'mengenangkannya': 'kenang', + 'mengenangi': 'kenang', + 'mengenangan': 'kenang', + 'mengenangmu': 'kenang', + 'terkenang': 'kenang', + 'terkenangnya': 'kenang', + 'kenang-kenangan': 'kenang', + 'kenang-kenangannya': 'kenang', + 'kenang-kenanganan': 'kenang', + 'menasional': 'nasional', + 'menasionalkan': 'nasional', + 'penasionalan': 'nasional', + 'kenasionalan': 'nasional', + 'berkencan': 'kencan', + 'berkencannya': 'kencan', + 'berkencanlah': 'kencan', + 'mengencani': 'kencan', + 'mengencaninya': 'kencan', + 'mengencaniku': 'kencan', + 'kekencangan': 'kencang', + 'kekencangannya': 'kencang', + 'pengencangan': 'kencang', + 'memperkencang': 'kencang', + 'kencang-kencung': 'kencang', + 'terkencar-kencar': 'kencar', + 'terkencing': 'kencing', + 'mengencingi': 'kencing', + 'mengencinginya': 'kencing', + 'perkencingan': 'kencing', + 'pengencingan': 'kencing', + 'terkencing-kencing': 'kencing', + 'kencing-mengencingi': 'kencing', + 'mengencongkan': 'kencong', + 'mengencreng': 'kencreng', + 'mengendalakan': 'kendala', + 'kendalian': 'kendali', + 'terkendali': 'kendali', + 'terkendalinya': 'kendali', + 'terkendalilah': 'kendali', + 'terkendalikan': 'kendali', + 'pengendali': 'kendali', + 'pengendalinya': 'kendali', + 'pengendalikan': 'kendali', + 'pengendalian': 'kendali', + 'pengendaliannya': 'kendali', + 'pengendalianlah': 'kendali', + 'mengendalikan': 'kendali', + 'mengendalikannya': 'kendali', + 'mengendalikanku': 'kendali', + 'mengendalikanmu': 'kendali', + 'mengendanai': 'kendana', + 'sekendang': 'kendang', + 'kendangan': 'kendang', + 'kendang-kendang': 'kendang', + 'kendang-kendangmu': 'kendang', + 'kendang-kendangan': 'kendang', + 'kendaraan': 'kendara', + 'kendaraannya': 'kendara', + 'kendaraanlah': 'kendara', + 'kendaraanku': 'kendara', + 'kendaraanmu': 'kendara', + 'pengendara': 'kendara', + 'pengendaranya': 'kendara', + 'pengendaralah': 'kendara', + 'pengendarai': 'kendara', + 'pengendaraan': 'kendara', + 'berkendara': 'kendara', + 'berkendaranya': 'kendara', + 'berkendaralah': 'kendara', + 'berkendarakan': 'kendara', + 'berkendarai': 'kendara', + 'berkendaraan': 'kendara', + 'mengendarai': 'kendara', + 'mengendarainya': 'kendara', + 'berkendaraannya': 'kendara', + 'kendatipun': 'kendati', + 'kendungan': 'kendung', + 'mengendur': 'kendur', + 'mengendurnya': 'kendur', + 'mengendurkan': 'kendur', + 'mengendurkannya': 'kendur', + 'kekenduran': 'kendur', + 'kekendurannya': 'kendur', + 'pengenduran': 'kendur', + 'berkendur-kendur': 'kendur', + 'berkenduri': 'kenduri', + 'mengendurikan': 'kenduri', + 'penekat': 'nekat', + 'penekatan': 'nekat', + 'kenekatan': 'nekat', + 'kenekatannya': 'nekat', + 'nekat-nekat': 'nekat', + 'nekat-nekatan': 'nekat', + 'kekenesan': 'kenes', + 'kengerian': 'ngeri', + 'kengeriannya': 'ngeri', + 'kengerianku': 'ngeri', + 'mengerikannya': 'ngeri', + 'mengengkeng': 'kengkeng', + 'mengensel': 'kensel', + 'mengental': 'kental', + 'mengentalnya': 'kental', + 'mengentalkan': 'kental', + 'mengentalkannya': 'kental', + 'pengental': 'kental', + 'pengentalan': 'kental', + 'kekentalan': 'kental', + 'kekentalannya': 'kental', + 'mengentarakan': 'kentara', + 'kentungan': 'kentung', + 'kentung-kentung': 'kentung', + 'kentutan': 'kentut', + 'terkentut': 'kentut', + 'berkentut': 'kentut', + 'mengentuti': 'kentut', + 'terkentut-kentut': 'kentut', + 'mengenyam': 'kenyam', + 'kenyaringan': 'nyaring', + 'kenyaringannya': 'nyaring', + 'menyaringkan': 'saring', + 'kenyat-kenyit': 'kenyat', + 'ternyata': 'nyata', + 'ternyatanya': 'nyata', + 'ternyataan': 'nyata', + 'kenyataan': 'nyata', + 'kenyataannya': 'nyata', + 'kenyataanlah': 'nyata', + 'pernyataan': 'nyata', + 'pernyataannya': 'nyata', + 'pernyataanku': 'nyata', + 'pernyataanmu': 'nyata', + 'menyatakan': 'nyata', + 'menyatakannya': 'nyata', + 'menyatakankan': 'nyata', + 'menyatakani': 'nyata', + 'menyatakanan': 'nyata', + 'ternyatakan': 'nyata', + 'kenyitan': 'kenyit', + 'mengenyit': 'kenyit', + 'mengenyitkan': 'kenyit', + 'kenyutan': 'kenyut', + 'mengenyut': 'kenyut', + 'berkeokan': 'keok', + 'berkeok-keok': 'keok', + 'pemadat': 'padat', + 'pemadati': 'padat', + 'pemadatan': 'padat', + 'padatan': 'padat', + 'padatannya': 'padat', + 'memadat': 'padat', + 'memadatnya': 'padat', + 'memadatkan': 'padat', + 'memadatkannya': 'padat', + 'memadati': 'padat', + 'memadatinya': 'padat', + 'memadatii': 'padat', + 'pemadatannya': 'padat', + 'kepadatan': 'padat', + 'kepadatannya': 'padat', + 'mengepah': 'kepah', + 'kepahlawanan': 'pahlawan', + 'kepahlawanannya': 'pahlawan', + 'kepahlawananan': 'pahlawan', + 'kepahlawananmu': 'pahlawan', + 'kepakaran': 'pakar', + 'kepakarannya': 'pakar', + 'kepalan': 'kepal', + 'kepalannya': 'kepal', + 'sekepal': 'kepal', + 'sekepalan': 'kepal', + 'terkepal': 'kepal', + 'mengepal': 'kepal', + 'mengepalkan': 'kepal', + 'berkepal-kepal': 'kepal', + 'mengepal-ngepalkan': 'kepal', + 'berkepala': 'kepala', + 'berkepalanya': 'kepala', + 'mengepalai': 'kepala', + 'mengepalainya': 'kepala', + 'mengepalakan': 'kepala', + 'kepala-kepalaan': 'kepala', + 'pemalsu': 'palsu', + 'pemalsunya': 'palsu', + 'pemalsukan': 'palsu', + 'pemalsuan': 'palsu', + 'memalsu': 'palsu', + 'memalsukan': 'palsu', + 'memalsukannya': 'palsu', + 'memalsuan': 'palsu', + 'kepalsuan': 'palsu', + 'kepalsuannya': 'palsu', + 'pemalsuannya': 'palsu', + 'pemanas': 'panas', + 'pemanasnya': 'panas', + 'pemanasan': 'panas', + 'memanas': 'panas', + 'memanasnya': 'panas', + 'memanaskan': 'panas', + 'memanaskannya': 'panas', + 'memanasi': 'panas', + 'memanasan': 'panas', + 'berpanas': 'panas', + 'berpanasan': 'panas', + 'kepanasan': 'panas', + 'kepanasannya': 'panas', + 'kepanasankan': 'panas', + 'terpanasi': 'panas', + 'pemanasannya': 'panas', + 'pemanasanan': 'panas', + 'panas-panas': 'panas', + 'panas-panasnya': 'panas', + 'panas-panaskan': 'panas', + 'panas-panasi': 'panas', + 'panas-panasan': 'panas', + 'memanas-manasi': 'panas', + 'memanas-manasinya': 'panas', + 'berpanas-panas': 'panas', + 'berpanas-panasan': 'panas', + 'memandai': 'pandai', + 'memandainya': 'pandai', + 'kepandaian': 'pandai', + 'kepandaiannya': 'pandai', + 'memandaikan': 'pandai', + 'sepandai-pandai': 'pandai', + 'sepandai-pandainya': 'pandai', + 'memandai-mandai': 'pandai', + 'berpandai-pandai': 'pandai', + 'kepangan': 'kepang', + 'kepanganan': 'kepang', + 'berkepang': 'kepang', + 'mengepang': 'kepang', + 'mengepangnya': 'kepang', + 'kepang-kepot': 'kepang', + 'kepapaan': 'papa', + 'kepayahan': 'payah', + 'kepayahannya': 'payah', + 'memayahkan': 'payah', + 'berpayah-payah': 'payah', + 'memayah-mayahkan': 'payah', + 'kepedaran': 'pedar', + 'kepedasan': 'pedas', + 'kepedasannya': 'pedas', + 'memedaskan': 'pedas', + 'kepejalan': 'pejal', + 'memejalkan': 'pejal', + 'memeka': 'peka', + 'memekakan': 'peka', + 'memekai': 'peka', + 'kepekaan': 'peka', + 'kepekaannya': 'peka', + 'kepekaanku': 'peka', + 'pelikan': 'pelik', + 'kepelikan': 'pelik', + 'pimpinan': 'pimpin', + 'pimpinannya': 'pimpin', + 'pimpinanlah': 'pimpin', + 'pimpinanan': 'pimpin', + 'pimpinannyalah': 'pimpin', + 'pimpinanku': 'pimpin', + 'pimpinanmu': 'pimpin', + 'pemimpin': 'pimpin', + 'pemimpinnya': 'pimpin', + 'pemimpinlah': 'pimpin', + 'pemimpinan': 'pimpin', + 'pemimpinku': 'pimpin', + 'pemimpinmu': 'pimpin', + 'memimpin': 'pimpin', + 'memimpinnya': 'pimpin', + 'memimpinlah': 'pimpin', + 'memimpinkan': 'pimpin', + 'memimpinan': 'pimpin', + 'berpimpin': 'pimpin', + 'terpimpin': 'pimpin', + 'terpimpinnya': 'pimpin', + 'kepemimpinan': 'pimpin', + 'kepemimpinannya': 'pimpin', + 'kepemimpinanlah': 'pimpin', + 'kepemimpinanan': 'pimpin', + 'kepemimpinanku': 'pimpin', + 'kepemimpinanmu': 'pimpin', + 'kepenatan': 'penat', + 'kepenatannya': 'penat', + 'memenatkan': 'penat', + 'berpenat-penat': 'penat', + 'mementing': 'penting', + 'mementingnya': 'penting', + 'mementingkan': 'penting', + 'mementingkannya': 'penting', + 'mementingan': 'penting', + 'terpenting': 'penting', + 'terpentingnya': 'penting', + 'terpentingkan': 'penting', + 'terpentingan': 'penting', + 'terpentingku': 'penting', + 'kepentingan': 'penting', + 'kepentingannya': 'penting', + 'kepentinganlah': 'penting', + 'kepentinganku': 'penting', + 'kepentinganmu': 'penting', + 'berpentingan': 'penting', + 'berkepentingan': 'penting', + 'berkepentinganlah': 'penting', + 'tepercaya': 'percaya', + 'memercayai': 'percaya', + 'memercayainya': 'percaya', + 'memercayaiku': 'percaya', + 'memercayaimu': 'percaya', + 'kepercayaan': 'percaya', + 'kepercayaannya': 'percaya', + 'kepercayaanlah': 'percaya', + 'kepercayaanan': 'percaya', + 'kepercayaanku': 'percaya', + 'kepercayaanmu': 'percaya', + 'memercayakan': 'percaya', + 'memercayakannya': 'percaya', + 'bepergian': 'pergi', + 'bepergiannya': 'pergi', + 'bepergianlah': 'pergi', + 'kepergian': 'pergi', + 'kepergiannya': 'pergi', + 'kepergianku': 'pergi', + 'kepergianmu': 'pergi', + 'keperkasaan': 'perkasa', + 'keperkasaannya': 'perkasa', + 'keperluan': 'perlu', + 'keperluannya': 'perlu', + 'keperluanku': 'perlu', + 'keperluanmu': 'perlu', + 'seperlunya': 'perlu', + 'memerlukan': 'perlu', + 'memerlukannya': 'perlu', + 'memerlukankan': 'perlu', + 'memerlukanan': 'perlu', + 'memerlukanku': 'perlu', + 'memerlukanmu': 'perlu', + 'keperwiraan': 'perwira', + 'keperwiraannya': 'perwira', + 'kepetahan': 'petah', + 'memetahkan': 'petah', + 'mengepil': 'kepil', + 'terkepil': 'kepil', + 'mengepilkan': 'kepil', + 'berpilu': 'pilu', + 'kepiluan': 'pilu', + 'kepiluannya': 'pilu', + 'memilukan': 'pilu', + 'memilukannya': 'pilu', + 'kepilu-piluan': 'pilu', + 'sepincang': 'pincang', + 'pemincangan': 'pincang', + 'kepincangan': 'pincang', + 'kepincangannya': 'pincang', + 'sekeping': 'keping', + 'kepingan': 'keping', + 'kepingannya': 'keping', + 'mengeping': 'keping', + 'pengepingan': 'keping', + 'berkeping-keping': 'keping', + 'kepitan': 'kepit', + 'berkepit': 'kepit', + 'mengepit': 'kepit', + 'mengeplak': 'keplak', + 'keplokan': 'keplok', + 'terkepoh': 'kepoh', + 'mengepohkan': 'kepoh', + 'memompong': 'pompong', + 'kepompong': 'pompong', + 'kepompongan': 'pompong', + 'memongahi': 'pongah', + 'kepongahan': 'pongah', + 'kepongahannya': 'pongah', + 'memongahkan': 'pongah', + 'berpongah-pongah': 'pongah', + 'mengepot': 'kepot', + 'mengeprek': 'keprek', + 'kepribadian': 'pribadi', + 'kepribadiannya': 'pribadi', + 'kepribadianku': 'pribadi', + 'kepribadianmu': 'pribadi', + 'mempribadikan': 'pribadi', + 'mengepris': 'kepris', + 'mengepruk': 'kepruk', + 'memucat': 'pucat', + 'kepucatan': 'pucat', + 'pemucatan': 'pucat', + 'kepucat-pucatan': 'pucat', + 'pengepuh': 'kepuh', + 'mengepuh': 'kepuh', + 'kepuh-kepuh': 'kepuh', + 'memuji': 'puji', + 'memujinya': 'puji', + 'memujilah': 'puji', + 'memujikan': 'puji', + 'memujiku': 'puji', + 'memujimu': 'puji', + 'memuji-mu': 'puji', + 'pujian': 'puji', + 'pujiannya': 'puji', + 'pujiani': 'puji', + 'pujianku': 'puji', + 'pujianmu': 'puji', + 'pemuji': 'puji', + 'terpuji': 'puji', + 'terpujinya': 'puji', + 'terpujilah': 'puji', + 'kepujian': 'puji', + 'pemujian': 'puji', + 'puji-pujian': 'puji', + 'berkepuk': 'kepuk', + 'mengepukkan': 'kepuk', + 'kepulan': 'kepul', + 'kepulannya': 'kepul', + 'kepulanan': 'kepul', + 'berkepul': 'kepul', + 'mengepul': 'pul', + 'mengepulnya': 'pul', + 'mengepulkan': 'pul', + 'pengepulan': 'pul', + 'berkepul-kepul': 'kepul', + 'pulangan': 'pulang', + 'sepulang': 'pulang', + 'sepulangnya': 'pulang', + 'berpulang': 'pulang', + 'berpulangnya': 'pulang', + 'berpulangan': 'pulang', + 'memulangi': 'pulang', + 'terpulang': 'pulang', + 'pemulangan': 'pulang', + 'pemulangannya': 'pulang', + 'kepulangan': 'pulang', + 'kepulangannya': 'pulang', + 'kepulanganmu': 'pulang', + 'memulangkan': 'pulang', + 'memulangkannya': 'pulang', + 'memulangkanku': 'pulang', + 'kepulauan': 'pulau', + 'kepulauannya': 'pulau', + 'pemulauan': 'pulau', + 'memulaukan': 'pulau', + 'pemutih': 'putih', + 'pemutihnya': 'putih', + 'pemutihkan': 'putih', + 'pemutihan': 'putih', + 'memutih': 'putih', + 'memutihnya': 'putih', + 'memutihkan': 'putih', + 'memutihkannya': 'putih', + 'memutihan': 'putih', + 'keputihan': 'putih', + 'keputihannya': 'putih', + 'pemutihannya': 'putih', + 'keputih-putihan': 'putih', + 'pemutus': 'putus', + 'pemutusnya': 'putus', + 'pemutuskan': 'putus', + 'pemutusan': 'putus', + 'putusan': 'putus', + 'putusannya': 'putus', + 'putusanku': 'putus', + 'putusanmu': 'putus', + 'memutus': 'putus', + 'memutusnya': 'putus', + 'memutuskan': 'putus', + 'memutuskannya': 'putus', + 'memutusan': 'putus', + 'terputus': 'putus', + 'terputusnya': 'putus', + 'terputuslah': 'putus', + 'terputuskan': 'putus', + 'keputusan': 'putus', + 'keputusannya': 'putus', + 'keputusanku': 'putus', + 'keputusanmu': 'putus', + 'pemutusannya': 'putus', + 'memutuskankan': 'putus', + 'memutuskanku': 'putus', + 'memutuskanmu': 'putus', + 'berputusan': 'putus', + 'putus-putus': 'putus', + 'putus-putusnya': 'putus', + 'berkeputusan': 'putus', + 'terputus-putus': 'putus', + 'berkerabat': 'kerabat', + 'berkerabatan': 'kerabat', + 'kekerabatan': 'kerabat', + 'kekerabatannya': 'kerabat', + 'mengerabik': 'kerabik', + 'mengerabikkan': 'kerabik', + 'mengerabit': 'kerabit', + 'mengerabu': 'kerabu', + 'berkerabu': 'kerabu', + 'meragu': 'ragu', + 'meragunya': 'ragu', + 'meragukan': 'raguk', + 'meragukannya': 'ragu', + 'meraguan': 'ragu', + 'keraguan': 'ragu', + 'keraguannya': 'ragu', + 'keraguanku': 'ragu', + 'keraguanmu': 'ragu', + 'meragukanlah': 'ragu', + 'meragukanku': 'ragu', + 'ragu-ragu': 'ragu', + 'ragu-ragunya': 'ragu', + 'ragu-ragulah': 'ragu', + 'kerahan': 'kerah', + 'kerahanan': 'kerah', + 'pengerah': 'kerah', + 'pengerahnya': 'kerah', + 'pengerahkan': 'kerah', + 'pengerahan': 'kerah', + 'berkerah': 'kerah', + 'berkerahnya': 'kerah', + 'pengerahannya': 'kerah', + 'pengerahanan': 'kerah', + 'mengerahkan': 'kerah', + 'mengerahkannya': 'kerah', + 'mengerahkankan': 'kerah', + 'kerah-kerahan': 'kerah', + 'mengeraikan': 'kerai', + 'beraja': 'raja', + 'meraja': 'raja', + 'merajanya': 'raja', + 'merajakan': 'raja', + 'merajai': 'raja', + 'merajainya': 'raja', + 'kerajaan': 'raja', + 'kerajaannya': 'raja', + 'kerajaanlah': 'raja', + 'kerajaanku': 'raja', + 'beraja-raja': 'raja', + 'perajin': 'rajin', + 'perajinnya': 'rajin', + 'perajinan': 'rajin', + 'kerajinan': 'rajin', + 'kerajinannya': 'rajin', + 'kerajinanan': 'rajin', + 'kerajinanmu': 'rajin', + 'pengrajin': 'rajin', + 'pengrajinnya': 'rajin', + 'pengrajinan': 'rajin', + 'merajinkan': 'rajin', + 'mengerakah': 'kerakah', + 'mengerakahi': 'kerakah', + 'mengerakali': 'kerakal', + 'kerakusan': 'rakus', + 'kerakusannya': 'rakus', + 'keraman': 'keram', + 'peramah': 'ramah', + 'peramahan': 'ramah', + 'meramahi': 'ramah', + 'keramahan': 'ramah', + 'keramahannya': 'ramah', + 'keramahanmu': 'ramah', + 'beramah-ramah': 'ramah', + 'beramah-ramahan': 'ramah', + 'berkeramas': 'keramas', + 'mengeramasi': 'keramas', + 'kekeramatan': 'keramat', + 'mengeramatkan': 'keramat', + 'mengeramatkannya': 'keramat', + 'pekeramik': 'keramik', + 'berkerang': 'kerang', + 'perkerangan': 'kerang', + 'kerang-keruk': 'kerang', + 'kerang-kerung': 'kerang', + 'kerang-kerangan': 'kerang', + 'terkeranjat': 'keranjat', + 'kekerapan': 'kerap', + 'kekerapannya': 'kerap', + 'mengerapkan': 'kerap', + 'kerap-kerap': 'kerap', + 'kerapian': 'rapi', + 'kerapiannya': 'rapi', + 'merapikan': 'rapik', + 'merapikannya': 'rapi', + 'keratan': 'kerat', + 'mengerat': 'kerat', + 'mengeratnya': 'kerat', + 'terkerat': 'kerat', + 'pengerat': 'kerat', + 'pengeratan': 'kerat', + 'kerawangan': 'kerawang', + 'mengerawang': 'kerawang', + 'mengerbat': 'kerbat', + 'mengerbuk': 'kerbuk', + 'mengercingkan': 'kercing', + 'mengercitkan': 'kercit', + 'kekerdilan': 'kerdil', + 'kekerdilannya': 'kerdil', + 'mengerdomkan': 'kerdom', + 'bekerdom-kerdom': 'kerdom', + 'mengerebok': 'kerebok', + 'mengerecengkan': 'kereceng', + 'berkeredong': 'keredong', + 'sekerek': 'kerek', + 'mengerek': 'kerek', + 'mengereknya': 'kerek', + 'berkereket': 'kereket', + 'seremeh': 'remeh', + 'keremehan': 'remeh', + 'meremehkan': 'remeh', + 'meremehkannya': 'remeh', + 'meremehkankan': 'remeh', + 'meremehkanku': 'remeh', + 'meremehkanmu': 'remeh', + 'remeh-temeh': 'remeh', + 'remeh-cemeh': 'remeh', + 'meremeh-temehkan': 'remeh', + 'mengeremus': 'keremus', + 'rendahan': 'rendah', + 'rendahannya': 'rendah', + 'rendahanan': 'rendah', + 'merendah': 'rendah', + 'merendahnya': 'rendah', + 'merendahkan': 'rendah', + 'merendahkannya': 'rendah', + 'merendahan': 'rendah', + 'kerendahan': 'rendah', + 'kerendahannya': 'rendah', + 'kerendahanmu': 'rendah', + 'merendahkankan': 'rendah', + 'merendahkanku': 'rendah', + 'merendahkanmu': 'rendah', + 'merenggang': 'renggang', + 'merenggangnya': 'renggang', + 'merenggangkan': 'renggang', + 'perenggang': 'renggang', + 'perenggangkan': 'renggang', + 'perenggangan': 'renggang', + 'renggangan': 'renggang', + 'merenggangi': 'renggang', + 'kerenggangan': 'renggang', + 'kerenggangannya': 'renggang', + 'memperenggang': 'renggang', + 'merenggang gawai': 'renggang', + 'mengerenyot': 'kerenyot', + 'mengerepas': 'kerepas', + 'mengerepes': 'kerepes', + 'meresah': 'resah', + 'meresahkan': 'resah', + 'meresahkannya': 'resah', + 'meresahan': 'resah', + 'keresahan': 'resah', + 'keresahannya': 'resah', + 'keresahanan': 'resah', + 'keresahanmu': 'resah', + 'meresahkani': 'resah', + 'meresahkanku': 'resah', + 'beresah-resah': 'resah', + 'terkereseng': 'kereseng', + 'berkereta api': 'kereta api', + 'perkeretaapian': 'kereta api', + 'perkeretaapiannya': 'kereta api', + 'berkereta': 'kereta', + 'mengeri': 'keri', + 'periang': 'riang', + 'periangnya': 'riang', + 'periangan': 'riang', + 'keriangan': 'riang', + 'keriangannya': 'riang', + 'meriangkan': 'riang', + 'mengeriap': 'keriap', + 'berkeriapan': 'keriap', + 'berkeriau': 'keriau', + 'meribut': 'ribut', + 'meributkan': 'ribut', + 'meributkannya': 'ribut', + 'meributi': 'ribut', + 'keributan': 'ribut', + 'keributannya': 'ribut', + 'mengericau': 'kericau', + 'berkericau': 'kericau', + 'berkericauan': 'kericau', + 'mengerih': 'kerih', + 'mengerihkan': 'kerih', + 'kerikan': 'kerik', + 'kerik api': 'kerik', + 'mengerikil': 'kerikil', + 'mengerikili': 'kerikil', + 'pengerikilan': 'kerikil', + 'mengerikiti': 'kerikit', + 'berkering': 'kering', + 'berkeringan': 'kering', + 'pengering': 'kering', + 'pengeringnya': 'kering', + 'pengeringan': 'kering', + 'mengering': 'kering', + 'mengeringnya': 'kering', + 'mengeringkan': 'kering', + 'mengeringkannya': 'kering', + 'mengeringan': 'kering', + 'mengeringi': 'kering', + 'mengeringinya': 'kering', + 'kekeringan': 'kering', + 'kekeringannya': 'kering', + 'pengeringannya': 'kering', + 'pengeringanan': 'kering', + 'berkering-kering': 'kering', + 'kering-kering air': 'kering', + 'peringanan': 'ringan', + 'keringanan': 'ringan', + 'keringanannya': 'ringan', + 'keringananlah': 'ringan', + 'meringankan': 'ringan', + 'meringankannya': 'ringan', + 'meringankanlah': 'ringan', + 'memperingankan': 'ringan', + 'mengerinjang': 'kerinjang', + 'mengerip': 'kerip', + 'berkeriput': 'keriput', + 'berkeris': 'keris', + 'mengeris': 'keris', + 'perkerisan': 'keris', + 'perisau': 'risau', + 'merisau': 'risau', + 'merisaukan': 'risau', + 'merisaukannya': 'risau', + 'kerisauan': 'risau', + 'kerisauannya': 'risau', + 'kerisikan': 'kerisik', + 'berkerisik': 'kerisik', + 'mengerisik': 'kerisik', + 'mengerising': 'kerising', + 'mengerit': 'kerit', + 'mengeritkan': 'kerit', + 'berkeritik-keritik': 'keritik', + 'mengeriting': 'keriting', + 'mengeritingnya': 'keriting', + 'mengeritingkannya': 'keriting', + 'mengeritingi': 'keriting', + 'pengeritingan': 'keriting', + 'mengeritingkan': 'keriting', + 'berkeriuk': 'keriuk', + 'mengerjang': 'kerjang', + 'mengerjap': 'kerjap', + 'mengerjapkan': 'kerjap', + 'mengerjap-ngerjap': 'kerjap', + 'dikerkah': 'kerkah', + 'mengerkah': 'kerkah', + 'mengerkau': 'kerkau', + 'tekerlap': 'kerlap', + 'mengerlap': 'kerlap', + 'bekerlapan': 'kerlap', + 'kerlingan': 'kerling', + 'mengerling': 'kerling', + 'mengerlingkan': 'kerling', + 'mengerlingku': 'kerling', + 'mengerling-ngerling': 'kerling', + 'sekerlip': 'kerlip', + 'bekerlip': 'kerlip', + 'bekerlipan': 'kerlip', + 'mengerlip': 'kerlip', + 'kermian': 'kermi', + 'mengernai': 'kernai', + 'mengerneti': 'kernet', + 'mengernyih': 'kernyih', + 'mengernying': 'kernying', + 'mengernyit': 'kernyit', + 'mengernyitkan': 'kernyit', + 'bekernyut': 'kernyut', + 'mengernyut': 'kernyut', + 'mengernyutkan': 'kernyut', + 'bekernyutan': 'kernyut', + 'kerobak-kerobik': 'kerobak', + 'kerobak-kerabit': 'kerobak', + 'kerobak-kerobek': 'kerobak', + 'kerobat-kerabit': 'kerobat', + 'mengerobek': 'kerobek', + 'kerokan': 'kerok', + 'mengerok': 'kerok', + 'mengeroki': 'kerok', + 'mengerokoti': 'kerokot', + 'pengerokotan': 'kerokot', + 'keroncongan': 'keroncong', + 'berkeroncongan': 'keroncong', + 'mengeroncongkan': 'keroncong', + 'kerong-kerong': 'kerong', + 'rongkongan': 'rongos', + 'kerongkongan': 'rongkong', + 'kerongkongannya': 'rongkong', + 'kerongkonganku': 'rongkong', + 'mengeropeng': 'keropeng', + 'sekeropok': 'keropok', + 'mengerosi': 'kerosi', + 'mengerosong': 'kerosong', + 'kerang-kerot': 'kerot', + 'berkerotak': 'kerotak', + 'keroyokan': 'keroyok', + 'keroyokanlah': 'keroyok', + 'pengeroyok': 'keroyok', + 'pengeroyoknya': 'keroyok', + 'pengeroyokkan': 'keroyok', + 'pengeroyokan': 'keroyok', + 'mengeroyok': 'keroyok', + 'mengeroyoknya': 'keroyok', + 'mengeroyokan': 'keroyok', + 'pengeroyokannya': 'keroyok', + 'mengerpus': 'kerpus', + 'bekersik': 'kersik', + 'tekersik': 'kersik', + 'mengersik': 'kersik', + 'bekertak': 'kertak', + 'kertak-kertuk': 'kertak', + 'bekertak-kertak': 'kertak', + 'mengertak-ngertakkan': 'kertak', + 'mengertangkan': 'kertang', + 'kertap-kertap': 'kertap', + 'kerubinan': 'kerubin', + 'kerubungan': 'kerubung', + 'berkerubung': 'kerubung', + 'mengerubungi': 'kerubung', + 'mengerubunginya': 'kerubung', + 'mengerubungiku': 'kerubung', + 'mengerubuti': 'kerubut', + 'mengerubutinya': 'kerubut', + 'mengerucut': 'kerucut', + 'mengerucutnya': 'kerucut', + 'mengerucutlah': 'kerucut', + 'mengerucutkan': 'kerucut', + 'mengerucutkannya': 'kerucut', + 'berkerudung': 'kerudung', + 'mengerudungi': 'kerudung', + 'merugi': 'rugi', + 'meruginya': 'rugi', + 'merugilah': 'rugi', + 'merugikan': 'rugi', + 'merugikannya': 'rugi', + 'merugian': 'rugi', + 'berugi': 'rugi', + 'berugikan': 'rugi', + 'kerugian': 'rugi', + 'kerugiannya': 'rugi', + 'kerugianku': 'rugi', + 'kerugianmu': 'rugi', + 'merugikanku': 'rugi', + 'merugikanmu': 'rugi', + 'mengeruh': 'keruh', + 'mengeruhkan': 'keruh', + 'berkeruh': 'keruh', + 'kekeruhan': 'keruh', + 'kekeruhannya': 'keruh', + 'berkeruit-keruit': 'keruit', + 'mengeruk': 'keruk', + 'mengeruknya': 'keruk', + 'mengeruki': 'keruk', + 'mengerukan': 'keruk', + 'pengerukan': 'keruk', + 'pengerukannya': 'keruk', + 'mengerukkan': 'keruk', + 'mengerukut': 'kerukut', + 'mengerukutkan': 'kerukut', + 'mengerul': 'kerul', + 'mengerumit': 'kerumit', + 'berkerumuk': 'kerumuk', + 'mengerumukkan': 'kerumuk', + 'mengerumus': 'kerumus', + 'meruncing': 'runcing', + 'meruncingnya': 'runcing', + 'meruncingkan': 'runcing', + 'keruncingan': 'runcing', + 'memperuncing': 'runcing', + 'meruntuh': 'runtuh', + 'meruntuhnya': 'runtuh', + 'meruntuhkan': 'runtuh', + 'meruntuhkannya': 'runtuh', + 'meruntuhan': 'runtuh', + 'runtuhan': 'runtuh', + 'runtuhannya': 'runtuh', + 'reruntuhan': 'runtuh', + 'reruntuhannya': 'runtuh', + 'keruntuhan': 'runtuh', + 'keruntuhannya': 'runtuh', + 'mengeruntungkan': 'keruntung', + 'berkerunyut': 'kerunyut', + 'terkerunyut': 'kerunyut', + 'kerupukan': 'kerupuk', + 'mengerutak': 'kerutak', + 'berkeruyuk': 'keruyuk', + 'mengesah': 'kesah', + 'mengesahkan': 'sah', + 'mengesahkannya': 'sah', + 'mengesahan': 'kesah', + 'mengesakkan': 'kesak', + 'penyakit': 'sakit', + 'penyakitnya': 'sakit', + 'penyakitlah': 'sakit', + 'penyakitkan': 'sakit', + 'penyakiti': 'sakit', + 'penyakitan': 'sakit', + 'penyakitku': 'sakit', + 'penyakitmu': 'sakit', + 'menyakiti': 'sakit', + 'menyakitinya': 'sakit', + 'menyakitii': 'sakit', + 'menyakitiku': 'sakit', + 'menyakitimu': 'sakit', + 'kesakitan': 'sakit', + 'kesakitannya': 'sakit', + 'kesakitanku': 'sakit', + 'pesakitan': 'sakit', + 'pesakitannya': 'sakit', + 'menyakitkan': 'sakit', + 'menyakitkannya': 'sakit', + 'menyakitkanku': 'sakit', + 'mempersakiti': 'sakit', + 'berpenyakitan': 'sakit', + 'sakit-sakitan': 'sakit', + 'bersakit-sakit': 'sakit', + 'bersakit-sakitan': 'sakit', + 'kesaksamaan': 'saksama', + 'kesaktian': 'sakti', + 'kesaktiannya': 'sakti', + 'menyaktikan': 'sakti', + 'kekesalan': 'kesal', + 'kekesalannya': 'kesal', + 'mengesalkan': 'kesal', + 'mengesalkannya': 'kesal', + 'menyalah': 'salah', + 'menyalahkan': 'salah', + 'menyalahkannya': 'salah', + 'menyalahi': 'salah', + 'menyalahan': 'salah', + 'bersalah': 'salah', + 'bersalahnya': 'salah', + 'bersalahlah': 'salah', + 'bersalahan': 'salah', + 'tersalah': 'salah', + 'kesalahan': 'salah', + 'kesalahannya': 'salah', + 'kesalahanan': 'salah', + 'kesalahanku': 'salah', + 'kesalahanmu': 'salah', + 'salah-salah': 'salah', + 'salah-salahnya': 'salah', + 'salah-salahan': 'salah', + 'salah-salahku': 'salah', + 'menyalahkankan': 'salah', + 'menyalahkanku': 'salah', + 'menyalahkanmu': 'salah', + 'mempersalahkan': 'salah', + 'mempersalahkannya': 'salah', + 'bersalah-salahan': 'salah', + 'berkesam': 'kesam', + 'samaran': 'samar', + 'samarannya': 'samar', + 'penyamar': 'samar', + 'penyamarlah': 'samar', + 'penyamaran': 'samar', + 'menyamar': 'samar', + 'menyamarnya': 'samar', + 'menyamarkan': 'samar', + 'menyamarkannya': 'samar', + 'kesamaran': 'samar', + 'penyamarannya': 'samar', + 'samar-samar': 'samar', + 'terkesan': 'kesan', + 'terkesannya': 'kesan', + 'berkesan': 'kesan', + 'berkesannya': 'kesan', + 'mengesan': 'kesan', + 'mengesankan': 'kesan', + 'mengesankannya': 'kesan', + 'mengesani': 'kesan', + 'mengesang': 'kesang', + 'penyangsi': 'sangsi', + 'kesangsian': 'sangsi', + 'kesangsiannya': 'sangsi', + 'menyangsikan': 'sangsi', + 'menyangsikannya': 'sangsi', + 'kesasar': 'sasar', + 'kesasaran': 'sasar', + 'sasaran': 'sasar', + 'sasarannya': 'sasar', + 'sasaranan': 'sasar', + 'sasaranku': 'sasar', + 'menyasar': 'sasar', + 'menyasarnya': 'sasar', + 'menyasarkan': 'sasar', + 'menyasarkannya': 'sasar', + 'tersasar': 'sasar', + 'tersasarnya': 'sasar', + 'tersasarkan': 'sasar', + 'sasarannyakan': 'sasar', + 'bersasaran': 'sasar', + 'pengesat': 'kesat', + 'mengesat': 'kesat', + 'sayangkan': 'sayang', + 'penyayang': 'sayang', + 'penyayangnya': 'sayang', + 'penyayanglah': 'sayang', + 'menyayang': 'sayang', + 'menyayangkan': 'sayang', + 'menyayangkannya': 'sayang', + 'menyayangi': 'sayang', + 'menyayangan': 'sayang', + 'menyayanginya': 'sayang', + 'menyayangiku': 'sayang', + 'menyayangimu': 'sayang', + 'kesayangan': 'sayang', + 'kesayangannya': 'sayang', + 'kesayanganku': 'sayang', + 'kesayanganmu': 'sayang', + 'menyayangkankan': 'sayang', + 'tersayang': 'sayang', + 'sedapan': 'sedap', + 'penyedap': 'sedap', + 'penyedapnya': 'sedap', + 'penyedapan': 'sedap', + 'kesedapan': 'sedap', + 'menyedapkan': 'sedap', + 'sedap-sedapan': 'sedap', + 'penyegar': 'segar', + 'penyegaran': 'segar', + 'kesegaran': 'segar', + 'kesegarannya': 'segar', + 'penyegarannya': 'segar', + 'menyegarkan': 'segar', + 'menyegarkannya': 'segar', + 'menyegarkankan': 'segar', + 'mempersegar': 'segar', + 'penyehat': 'sehat', + 'penyehatan': 'sehat', + 'kesehatan': 'sehat', + 'kesehatannya': 'sehat', + 'kesehatanlah': 'sehat', + 'kesehatani': 'sehat', + 'kesehatanan': 'sehat', + 'kesehatanku': 'sehat', + 'kesehatanmu': 'sehat', + 'penyehatannya': 'sehat', + 'menyehatkan': 'sehat', + 'menyehatkannya': 'sehat', + 'mengesek': 'kesek', + 'mengesekkan': 'kesek', + 'mengesekan': 'kesek', + 'mengesel': 'kesel', + 'selamatan': 'selamat', + 'selamatannya': 'selamat', + 'penyelamat': 'selamat', + 'penyelamatnya': 'selamat', + 'penyelamatkan': 'selamat', + 'penyelamatan': 'selamat', + 'penyelamatku': 'selamat', + 'keselamatan': 'selamat', + 'keselamatannya': 'selamat', + 'keselamatanlah': 'selamat', + 'keselamatanan': 'selamat', + 'keselamatanku': 'selamat', + 'keselamatanmu': 'selamat', + 'menyelamati': 'selamat', + 'menyelamatinya': 'selamat', + 'menyelamatikan': 'selamat', + 'menyelamatiku': 'selamat', + 'berselamatan': 'selamat', + 'penyelamatannya': 'selamat', + 'penyelamatanan': 'selamat', + 'penyelamatanku': 'selamat', + 'penyelamatanmu': 'selamat', + 'penyelamatan-mu': 'selamat', + 'menyelamatkan': 'selamat', + 'menyelamatkannya': 'selamat', + 'menyelamatkanku': 'selamat', + 'menyelamatkanmu': 'selamat', + 'menyempat': 'sempat', + 'menyempatkan': 'sempat', + 'menyempati': 'sempat', + 'menyempatan': 'sempat', + 'kesempatan': 'sempat', + 'kesempatannya': 'sempat', + 'kesempatanlah': 'sempat', + 'kesempatanan': 'sempat', + 'kesempatanku': 'sempat', + 'kesempatanmu': 'sempat', + 'berkesempatan': 'sempat', + 'sempat-sempatnya': 'sempat', + 'sempitan': 'sempit', + 'menyempit': 'sempit', + 'menyempitnya': 'sempit', + 'menyempitkan': 'sempit', + 'menyempitkannya': 'sempit', + 'kesempitan': 'sempit', + 'penyempitan': 'sempit', + 'penyempitannya': 'sempit', + 'persempitan': 'sempit', + 'mempersempit': 'sempit', + 'mempersempitnya': 'sempit', + 'bersempit-sempit': 'sempit', + 'kesempurnaan': 'sempurna', + 'kesempurnaannya': 'sempurna', + 'penyempurnaan': 'sempurna', + 'penyempurnaannya': 'sempurna', + 'menyempurnakan': 'sempurna', + 'menyempurnakannya': 'sempurna', + 'menyempurnakanlah': 'sempurna', + 'kesengsaraan': 'sengsara', + 'kesengsaraannya': 'sengsara', + 'menyengsarakan': 'sengsara', + 'menyengsarakannya': 'sengsara', + 'kesenyapan': 'senyap', + 'menyepi': 'sepi', + 'menyepikan': 'sepi', + 'penyepi': 'sepi', + 'penyepian': 'sepi', + 'kesepian': 'sepi', + 'kesepiannya': 'sepi', + 'kesepianmu': 'sepi', + 'bersepi-sepi': 'sepi', + 'berseragam': 'seragam', + 'berseragamnya': 'seragam', + 'berseragamkan': 'seragam', + 'berseragaman': 'seragam', + 'keseragaman': 'seragam', + 'keseragamannya': 'seragam', + 'penyeragaman': 'seragam', + 'penyeragamannya': 'seragam', + 'menyeragamkan': 'seragam', + 'menyeragamkannya': 'seragam', + 'keserakahan': 'serakah', + 'keserakahannya': 'serakah', + 'keserakahanku': 'serakah', + 'keserakahanmu': 'serakah', + 'keserasian': 'serasi', + 'keserasiannya': 'serasi', + 'penyerasian': 'serasi', + 'menyerasikan': 'serasi', + 'menyerasikannya': 'serasi', + 'keseriusan': 'serius', + 'keseriusannya': 'serius', + 'keseriusanmu': 'serius', + 'menyeriusi': 'serius', + 'menyeriusinya': 'serius', + 'menyerong': 'serong', + 'menyerongkan': 'serong', + 'keserongan': 'serong', + 'serong-menyerong': 'serong', + 'mengeset': 'set', + 'berkeset': 'keset', + 'terkesiap': 'kesiap', + 'kesik-kesik': 'kesik', + 'terkesima': 'kesima', + 'terkesimanya': 'kesima', + 'simpulan': 'simpul', + 'simpulannya': 'simpul', + 'menyimpul': 'simpul', + 'menyimpulkan': 'simpul', + 'menyimpulkannya': 'simpul', + 'menyimpulan': 'simpul', + 'tersimpul': 'simpul', + 'tersimpulkan': 'simpul', + 'kesimpulan': 'simpul', + 'kesimpulannya': 'simpul', + 'kesimpulanku': 'simpul', + 'berkesimpulan': 'simpul', + 'kesinisan': 'sinis', + 'kesinisannya': 'sinis', + 'mengesip': 'kesip', + 'berkesiur': 'kesiur', + 'menyombong': 'sombong', + 'menyombongkan': 'sombong', + 'menyombongkannya': 'sombong', + 'penyombong': 'sombong', + 'bersombong': 'sombong', + 'menyombongi': 'sombong', + 'kesombongan': 'sombong', + 'kesombongannya': 'sombong', + 'menyopani': 'sopan', + 'kesopanan': 'sopan', + 'kesopanannya': 'sopan', + 'menyopankan': 'sopan', + 'bersopan-sopan': 'sopan', + 'penyubur': 'subur', + 'penyuburan': 'subur', + 'kesuburan': 'subur', + 'kesuburannya': 'subur', + 'menyuburkan': 'subur', + 'menyuburkannya': 'subur', + 'sesuka': 'suka', + 'sesukanya': 'suka', + 'sesukaku': 'suka', + 'sesukamu': 'suka', + 'sukaan': 'suka', + 'sukaannya': 'suka', + 'kesukaan': 'suka', + 'kesukaannya': 'suka', + 'kesukaanku': 'suka', + 'kesukaanmu': 'suka', + 'menyukai': 'suka', + 'menyukainya': 'suka', + 'menyukaiku': 'suka', + 'menyukaimu': 'suka', + 'suka-suka': 'suka', + 'suka-sukanya': 'suka', + 'suka-sukaan': 'suka', + 'menyukakan': 'suka', + 'sesuka-suka': 'suka', + 'sesuka-sukanya': 'suka', + 'bersuka-suka': 'suka', + 'bersuka-sukaan': 'suka', + 'kesukaran': 'sukar', + 'kesukarannya': 'sukar', + 'menyukarkan': 'sukar', + 'menyukarkannya': 'sukar', + 'mempersukar': 'sukar', + 'sesuku': 'suku', + 'sesukunya': 'suku', + 'bersuku': 'suku', + 'pesukuan': 'suku', + 'kesukuan': 'suku', + 'kesukuannya': 'suku', + 'persukuan': 'suku', + 'sepersukuan': 'suku', + 'bersuku-suku': 'suku', + 'penyulit': 'sulit', + 'penyulitnya': 'sulit', + 'penyulitan': 'sulit', + 'kesulitan': 'sulit', + 'kesulitannya': 'sulit', + 'kesulitanlah': 'sulit', + 'kesulitanan': 'sulit', + 'kesulitanku': 'sulit', + 'kesulitanmu': 'sulit', + 'mempersulit': 'sulit', + 'mempersulitnya': 'sulit', + 'mempersulitkan': 'sulit', + 'menyulitkan': 'sulit', + 'menyulitkannya': 'sulit', + 'menyulitkanku': 'sulit', + 'menyulitkanmu': 'sulit', + 'mengesumba': 'kesumba', + 'menyunyi': 'sunyi', + 'bersunyi': 'sunyi', + 'kesunyian': 'sunyi', + 'kesunyiannya': 'sunyi', + 'bersunyi-sunyi': 'sunyi', + 'mengesup': 'kesup', + 'menyuram': 'suram', + 'menyuramkan': 'suram', + 'kesuraman': 'suram', + 'kesuramannya': 'suram', + 'suram-suram': 'suram', + 'bersusila': 'susila', + 'kesusilaan': 'susila', + 'kesusilaannya': 'susila', + 'terkesut-kesut': 'kesut', + 'ketabahan': 'tabah', + 'ketabahannya': 'tabah', + 'menabahkan': 'tabah', + 'penagih': 'tagih', + 'penagihnya': 'tagih', + 'penagihan': 'tagih', + 'tagihan': 'tagih', + 'tagihannya': 'tagih', + 'tagihanmu': 'tagih', + 'menagih': 'tagih', + 'menagihnya': 'tagih', + 'menagihkan': 'tagih', + 'menagihkannya': 'tagih', + 'tertagih': 'tagih', + 'tertagihnya': 'tagih', + 'tertagihkan': 'tagih', + 'penagihannya': 'tagih', + 'ketagihan': 'tagih', + 'ketagihannya': 'tagih', + 'berketai-ketai': 'ketai', + 'menakut': 'takut', + 'menakutnya': 'takut', + 'menakutkan': 'takut', + 'menakutkannya': 'takut', + 'menakuti': 'takut', + 'menakutan': 'takut', + 'penakut': 'takut', + 'penakutkan': 'takut', + 'menakutinya': 'takut', + 'ketakutan': 'takut', + 'ketakutannya': 'takut', + 'ketakutanlah': 'takut', + 'ketakutannyalah': 'takut', + 'ketakutanku': 'takut', + 'ketakutanmu': 'takut', + 'menakutkanlah': 'takut', + 'menakutkanku': 'takut', + 'takut-takut': 'takut', + 'takut-takutnya': 'takut', + 'takut-takuti': 'takut', + 'mempertakut': 'takut', + 'berketakutan': 'takut', + 'takut-takutan': 'takut', + 'menakut-nakuti': 'takut', + 'menakut-nakutinya': 'takut', + 'menakut-nakutii': 'takut', + 'menakut-nakutimu': 'takut', + 'mengetam': 'ketam', + 'pengetam': 'ketam', + 'pengetaman': 'ketam', + 'berketam': 'ketam', + 'mengetamkan': 'ketam', + 'ketamakan': 'tamak', + 'ketamakannya': 'tamak', + 'ketangkasan': 'tangkas', + 'ketangkasannya': 'tangkas', + 'ketangkasanlah': 'tangkas', + 'ketangkasanan': 'tangkas', + 'menangkaskan': 'tangkas', + 'mengetap': 'tap', + 'berketap-ketap': 'ketap-ketap', + 'berketar-ketar': 'ketar', + 'pengetatan': 'ketat', + 'pengetatannya': 'ketat', + 'memperketat': 'ketat', + 'memperketatnya': 'ketat', + 'mengetatkan': 'ketat', + 'mengetatkannya': 'ketat', + 'ketawa': 'tawa', + 'ketawanya': 'tawa', + 'ketawalah': 'tawa', + 'ketawai': 'tawa', + 'ketawaan': 'tawa', + 'ketawamu': 'tawa', + 'tertawa': 'tawa', + 'tertawanya': 'tawa', + 'tertawalah': 'tawa', + 'tertawakan': 'tawa', + 'tertawai': 'tawa', + 'tertawaan': 'tawa', + 'tertawamu': 'tawa', + 'menertawai': 'tawa', + 'menertawainya': 'tawa', + 'menertawaiku': 'tawa', + 'penertawaan': 'tawa', + 'menertawakan': 'tawa', + 'menertawakannya': 'tawa', + 'menertawakanku': 'tawa', + 'menebal': 'tebal', + 'menebalnya': 'tebal', + 'menebalkan': 'tebal', + 'menebalkannya': 'tebal', + 'setebal': 'tebal', + 'ketebalan': 'tebal', + 'ketebalannya': 'tebal', + 'tebal bibir': 'tebal', + 'mempertebal': 'tebal', + 'mempertebalnya': 'tebal', + 'mempertebalkan': 'tebal', + 'penegang': 'tegang', + 'penegangan': 'tegang', + 'menegang': 'tegang', + 'menegangnya': 'tegang', + 'menegangkan': 'tegang', + 'menegangkannya': 'tegang', + 'tegangan': 'tegang', + 'tegangannya': 'tegang', + 'menegangi': 'tegang', + 'ketegangan': 'tegang', + 'ketegangannya': 'tegang', + 'bersitegang': 'tegang', + 'bersitegangnya': 'tegang', + 'bersitegangan': 'tegang', + 'ketegaran': 'tegar', + 'ketegarannya': 'tegar', + 'menegarkan': 'tegar', + 'berteguh': 'teguh', + 'peneguhan': 'teguh', + 'keteguhan': 'teguh', + 'keteguhannya': 'teguh', + 'bersiteguh': 'teguh', + 'meneguhkan': 'teguh', + 'meneguhkannya': 'teguh', + 'memperteguh': 'teguh', + 'memperteguhkan': 'teguh', + 'berteguh-teguh': 'teguh', + 'berteguh-teguhan': 'teguh', + 'seketek': 'ketek', + 'mengeteki': 'ketek', + 'mengetemui': 'ketemu', + 'mengetemukan': 'ketemu', + 'penenang': 'tenang', + 'penenangnya': 'tenang', + 'penenangkan': 'tenang', + 'penenangan': 'tenang', + 'menenang': 'tenang', + 'menenangnya': 'tenang', + 'menenangkan': 'tenang', + 'menenangkannya': 'tenang', + 'menenangi': 'tenang', + 'menenangan': 'tenang', + 'ketenangan': 'tenang', + 'ketenangannya': 'tenang', + 'ketenanganku': 'tenang', + 'menenangkanku': 'tenang', + 'menenangkanmu': 'tenang', + 'bertenang-tenang': 'tenang', + 'ketengan': 'keteng', + 'ketengannya': 'keteng', + 'ketenganan': 'keteng', + 'seketeng': 'keteng', + 'mengeteng': 'keteng', + 'mengetengi': 'keteng', + 'mengetengkan': 'keteng', + 'terlanjur': 'lanjur', + 'melanjurkan': 'lanjur', + 'keterlanjuran': 'lanjur', + 'bertertib': 'tertib', + 'ketertiban': 'tertib', + 'ketertibannya': 'tertib', + 'penertiban': 'tertib', + 'penertibannya': 'tertib', + 'penertibankan': 'tertib', + 'menertibkan': 'tertib', + 'menertibkannya': 'tertib', + 'mengetesi': 'ketes', + 'keteteran': 'keteter', + 'mengeti': 'keti', + 'mengetikan': 'tik', + 'keti-keti': 'keti', + 'berketi-keti': 'keti', + 'ketiga': 'tiga', + 'ketiganya': 'tiga', + 'ketigalah': 'tiga', + 'ketigakan': 'tiga', + 'ketigaku': 'tiga', + 'meniga': 'tiga', + 'bertiga': 'tiga', + 'bertigalah': 'tiga', + 'bertigaan': 'tiga', + 'pertiga': 'tiga', + 'pertiganya': 'tiga', + 'pertigaan': 'tiga', + 'pertigaanan': 'tiga', + 'sepertiga': 'tiga', + 'sepertiganya': 'tiga', + 'ketiganyanya': 'tiga', + 'mempertiga': 'tiga', + 'tiga-tiganya': 'tiga', + 'tiga-tiganyanya': 'tiga', + 'ketiga-tiganya': 'tiga', + 'seketika': 'ketika', + 'seketikanya': 'ketika', + 'seketil': 'ketil', + 'mengetil': 'ketil', + 'berketil-ketil': 'ketil', + 'mengeting': 'keting', + 'petinggi': 'tinggi', + 'petingginya': 'tinggi', + 'meninggi': 'tinggi', + 'meningginya': 'tinggi', + 'meninggikan': 'tinggi', + 'meninggikannya': 'tinggi', + 'tertinggi': 'tinggi', + 'tertingginya': 'tinggi', + 'tertinggilah': 'tinggi', + 'tertinggimu': 'tinggi', + 'peninggian': 'tinggi', + 'ketinggian': 'tinggi', + 'ketinggiannya': 'tinggi', + 'mempertinggi': 'tinggi', + 'seketip': 'ketip', + 'pengetip': 'ketip', + 'mengetip': 'tip', + 'mengetipnya': 'tip', + 'ketap-ketip': 'ketip', + 'berketap-ketip': 'ketip', + 'mengetis': 'ketis', + 'ketitiran': 'ketitir', + 'ketokan': 'ketok', + 'mengetok': 'ketok', + 'mengetoknya': 'ketok', + 'mengetokkan': 'ketok', + 'mengetokan': 'ketok', + 'pengetok': 'ketok', + 'pengetokan': 'ketok', + 'ketololan': 'tolol', + 'ketololannya': 'tolol', + 'ketololanmu': 'tolol', + 'mengetrek': 'trek', + 'berketua': 'ketua', + 'mengetuai': 'ketua', + 'mengetuainya': 'ketua', + 'pengetul': 'ketul', + 'mengetulkan': 'ketul', + 'berketul-ketul': 'ketul', + 'ketulenan': 'tulen', + 'ketulian': 'tuli', + 'ketuliannya': 'tuli', + 'menulikan': 'tuli', + 'tuli-tuli': 'tuli', + 'tumbuhan': 'tumbuh', + 'tumbuhannya': 'tumbuh', + 'tumbuhanan': 'tumbuh', + 'penumbuh': 'tumbuh', + 'penumbuhkan': 'tumbuh', + 'penumbuhan': 'tumbuh', + 'menumbuh': 'tumbuh', + 'menumbuhkan': 'tumbuh', + 'menumbuhkannya': 'tumbuh', + 'menumbuhan': 'tumbuh', + 'bertumbuh': 'tumbuh', + 'bertumbuhnya': 'tumbuh', + 'bertumbuhan': 'tumbuh', + 'menumbuhi': 'tumbuh', + 'ketumbuhan': 'tumbuh', + 'tetumbuhan': 'tumbuh', + 'pertumbuhan': 'tumbuh', + 'pertumbuhannya': 'tumbuh', + 'bertumbuhannya': 'tumbuh', + 'mempertumbuhkan': 'tumbuh', + 'tumbuh-tumbuhan': 'tumbuh', + 'tumbuh-tumbuhannya': 'tumbuh', + 'tumbuh-tumbuhanan': 'tumbuh', + 'berketur': 'ketur', + 'penurun': 'turun', + 'penurunnya': 'turun', + 'penurunkan': 'turun', + 'penurunan': 'turun', + 'turunan': 'turun', + 'turunannya': 'turun', + 'turunanan': 'turun', + 'turunannyalah': 'turun', + 'menurun': 'turun', + 'menurunnya': 'turun', + 'menurunlah': 'turun', + 'menurunkan': 'turun', + 'menurunkannya': 'turun', + 'menuruni': 'turun', + 'menurunan': 'turun', + 'menuruninya': 'turun', + 'berturun': 'turun', + 'berturunan': 'turun', + 'keturunan': 'turun', + 'keturunannya': 'turun', + 'keturunanan': 'turun', + 'keturunannyalah': 'turun', + 'keturunanku': 'turun', + 'penurunannya': 'turun', + 'penurunanan': 'turun', + 'menurunkanlah': 'turun', + 'menurunkankan': 'turun', + 'menurunkanku': 'turun', + 'menurunkanmu': 'turun', + 'turun-temurun': 'turun', + 'turun-temurunnya': 'turun', + 'memperturunkan': 'turun', + 'unggulan': 'unggul', + 'unggulannya': 'unggul', + 'keunggulan': 'unggul', + 'keunggulannya': 'unggul', + 'keunggulani': 'unggul', + 'keunggulanmu': 'unggul', + 'mengungguli': 'unggul', + 'mengunggulinya': 'unggul', + 'unggul-mengungguli': 'unggul', + 'keunikan': 'unik', + 'keunikannya': 'unik', + 'keusahawanan': 'usahawan', + 'mengusang': 'usang', + 'keusangan': 'usang', + 'keusangannya': 'usang', + 'keuskupan': 'uskup', + 'keuskupannya': 'uskup', + 'seutuh': 'utuh', + 'seutuhnya': 'utuh', + 'seutuhkan': 'utuh', + 'keutuhan': 'utuh', + 'keutuhannya': 'utuh', + 'keseutuhan': 'utuh', + 'pengutuhan': 'utuh', + 'mengutuhkan': 'utuh', + 'sewajar': 'wajar', + 'sewajarnya': 'wajar', + 'sewajarnyalah': 'wajar', + 'kewajaran': 'wajar', + 'kewajarannya': 'wajar', + 'berwajib': 'wajib', + 'berwajibnya': 'wajib', + 'berwajiblah': 'wajib', + 'berwajiban': 'wajib', + 'kewajiban': 'wajib', + 'kewajibannya': 'wajib', + 'kewajibanku': 'wajib', + 'kewajibanmu': 'wajib', + 'sewajibnya': 'wajib', + 'mewajibkan': 'wajib', + 'mewajibkannya': 'wajib', + 'berkewajiban': 'wajib', + 'kewalahan': 'walah', + 'kewalahannya': 'walah', + 'kewalahanan': 'walah', + 'mewangi': 'wangi', + 'mewangikan': 'wangi', + 'mewangian': 'wangi', + 'pewangi': 'wangi', + 'pewanginya': 'wangi', + 'kewangian': 'wangi', + 'wewangian': 'wangi', + 'wewangiannya': 'wangi', + 'wangi-wangian': 'wangi', + 'wangi-wangiannya': 'wangi', + 'kewangi-wangian': 'wangi', + 'kewanitaan': 'wanita', + 'kewanitaannya': 'wanita', + 'kewanitaanku': 'wanita', + 'kewarasan': 'waras', + 'kewarasannya': 'waras', + 'kewarasanku': 'waras', + 'kewartawanan': 'wartawan', + 'kewartawanannya': 'wartawan', + 'mengewuhkan': 'kewuh', + 'menzalimi': 'zalim', + 'menzaliminya': 'zalim', + 'kezaliman': 'zalim', + 'kezalimannya': 'zalim', + 'menzalimkan': 'zalim', + 'mengkhalayak': 'khalayak', + 'berkhalwat': 'khalwat', + 'berkhamir': 'khamir', + 'kekhasan': 'khas', + 'kekhasannya': 'khas', + 'kekhasanmu': 'khas', + 'mengkhaskan': 'khas', + 'khataman': 'khatam', + 'khatamannya': 'khatam', + 'mengkhatamkan': 'khatam', + 'kekhawatiran': 'khawatir', + 'kekhawatirannya': 'khawatir', + 'kekhawatiranku': 'khawatir', + 'mengkhawatirkan': 'khawatir', + 'mengkhawatirkannya': 'khawatir', + 'mengkhawatirkanku': 'khawatir', + 'mengkhawatirkanmu': 'khawatir', + 'khayalan': 'khayal', + 'khayalannya': 'khayal', + 'khayalanku': 'khayal', + 'berkhayal': 'khayal', + 'berkhayalnya': 'khayal', + 'mengkhayal': 'khayal', + 'mengkhayalkan': 'khayal', + 'pengkhayal': 'khayal', + 'pengkhayalan': 'khayal', + 'berkhianat': 'khianat', + 'berkhianatnya': 'khianat', + 'mengkhianat': 'khianat', + 'mengkhianati': 'khianat', + 'pengkhianat': 'khianat', + 'pengkhianatnya': 'khianat', + 'pengkhianatlah': 'khianat', + 'pengkhianatan': 'khianat', + 'mengkhianatinya': 'khianat', + 'mengkhianatiku': 'khianat', + 'mengkhianatimu': 'khianat', + 'pengkhianatannya': 'khianat', + 'kekhilafan': 'khilaf', + 'kekhilafannya': 'khilaf', + 'khitanan': 'khitan', + 'berkhitan': 'khitan', + 'mengkhitan': 'khitan', + 'mengkhitankan': 'khitan', + 'berkhotbah': 'khotbah', + 'berkhotbahnya': 'khotbah', + 'pengkhotbah': 'khotbah', + 'pengkhotbahnya': 'khotbah', + 'pengkhotbahan': 'khotbah', + 'mengkhotbahkan': 'khotbah', + 'terkhusus': 'khusus', + 'terkhususnya': 'khusus', + 'kekhususan': 'khusus', + 'kekhususannya': 'khusus', + 'mengkhusus': 'khusus', + 'mengkhususnya': 'khusus', + 'mengkhususkan': 'khusus', + 'mengkhususkannya': 'khusus', + 'pengkhususan': 'khusus', + 'kia-kia': 'kia', + 'kia-kiai': 'kia', + 'kia bunga sambu': 'kia', + 'mengiah': 'kiah', + 'pengiah': 'kiah', + 'mengiahkan': 'kiah', + 'pengiah sepatu': 'kiah', + 'kiak-kiak': 'kiak', + 'kialan': 'kial', + 'pengial': 'kial', + 'berkial': 'kial', + 'perkialan': 'kial', + 'kial-kial': 'kial', + 'mengialkan': 'kial', + 'terkial-kial': 'kial', + 'berkial-kial': 'kial', + 'sekian': 'kian', + 'sekianlah': 'kian', + 'sekiankan': 'kian', + 'berkian-kian': 'kian', + 'kiasan': 'kias', + 'kiasannya': 'kias', + 'kiasanlah': 'kias', + 'berkias': 'kias', + 'mengias': 'kias', + 'mengiaskan': 'kias', + 'mengiasi': 'kias', + 'pengias': 'kias', + 'pengiasan': 'kias', + 'berkias-kias': 'kias', + 'berkias-kiasan': 'kias', + 'mengiat': 'kiat', + 'mengiatkan': 'kiat', + 'berkiat': 'kiat', + 'berkiatan': 'kiat', + 'kibasan': 'kibas', + 'mengibas': 'kibas', + 'mengibasnya': 'kibas', + 'mengibaskan': 'kibas', + 'mengibaskannya': 'kibas', + 'mengibas-ngibas': 'kibas', + 'mengibas-ngibaskan': 'kibas', + 'berkiblat': 'kiblat', + 'berkiblatnya': 'kiblat', + 'mengiblatkan': 'kiblat', + 'pengibul': 'kibul', + 'pengibulan': 'kibul', + 'terkibuli': 'kibul', + 'mengibuli': 'kibul', + 'mengibulinya': 'kibul', + 'terkicu': 'kicu', + 'pengicu': 'kicu', + 'mengicu': 'kicu', + 'pengicuan': 'kicu', + 'berkicuh': 'kicuh', + 'berkicut': 'kicut', + 'kidungan': 'kidung', + 'mengidung': 'kidung', + 'mengidungkan': 'kidung', + 'terkijai-kijai': 'kijai', + 'mengijing': 'kijing', + 'terkikih-kikih': 'kikih', + 'mengikik': 'kikik', + 'berkikikan': 'kikik', + 'terkikik-kikik': 'kikik', + 'kikisan': 'kikis', + 'terkikis': 'kikis', + 'terkikisnya': 'kikis', + 'pengikis': 'kikis', + 'pengikisan': 'kikis', + 'mengikis': 'kikis', + 'mengikisnya': 'kikis', + 'mengikiskan': 'kikis', + 'mengikisi': 'kikis', + 'mengikisan': 'kikis', + 'pengikisannya': 'kikis', + 'kekikukan': 'kikuk', + 'kekikukannya': 'kikuk', + 'mengilah': 'kilah', + 'berkilah': 'kilah', + 'berkilah-kilah': 'kilah', + 'mengilah-ngilahkan': 'kilah', + 'mengilan': 'kilan', + 'terkilan': 'kilan', + 'kilangan': 'kilang', + 'mengilang': 'kilang', + 'mengilangnya': 'kilang', + 'mengilangkan': 'kilang', + 'pengilang': 'kilang', + 'pengilangan': 'kilang', + 'perkilangan': 'kilang', + 'pengilangannya': 'kilang', + 'sekilap': 'kilap', + 'mengilap': 'kilap', + 'mengilapnya': 'kilap', + 'mengilapkan': 'kilap', + 'berkilap': 'kilap', + 'berkilapnya': 'kilap', + 'pengilapan': 'kilap', + 'berkilap-kilap': 'kilap', + 'sekilas': 'kilas', + 'sekilasnya': 'kilas', + 'sekilasi': 'kilas', + 'terkilas': 'kilas', + 'kili-kili': 'kili', + 'kilik-kilik': 'kilikan', + 'mengilik-ngilik': 'kilikan', + 'kiliran': 'kilir', + 'mengilir': 'kilir', + 'terkilir': 'kilir', + 'terkilirnya': 'kilir', + 'kiloan': 'kilo', + 'kiloannya': 'kilo', + 'mengilo': 'kilo', + 'mengilokan': 'kilo', + 'berkilo-kilo': 'kilo', + 'terkimah': 'kimah', + 'mengimbah': 'kimbah', + 'berkimbang-kimbang': 'kimbang', + 'mengimpal': 'kimpal', + 'terkimpus': 'kimpus', + 'kinangan': 'kinang', + 'penginangan': 'kinang', + 'mengincah': 'kincah', + 'terkincak-kincak': 'kincak', + 'mengincau': 'kincau', + 'kinciran': 'kincir', + 'berkincir': 'kincir', + 'mengincup': 'kincup', + 'terkindap-kindap': 'kindap', + 'berkinerja': 'kinerja', + 'berkinerjanya': 'kinerja', + 'kekinian': 'kini', + 'kekiniannya': 'kini', + 'kekinianlah': 'kini', + 'berkinja-kinja': 'kinja', + 'terkinja-kinja': 'kinja', + 'terkinjat': 'kinjat', + 'perkintakaan': 'kintaka', + 'berkinte': 'kinte', + 'mengintil': 'kintil', + 'mengintili': 'kintil', + 'mengipaikan': 'kipai', + 'kipasan': 'kipas', + 'berkipas': 'kipas', + 'mengipas': 'kipas', + 'mengipasnya': 'kipas', + 'mengipaskan': 'kipas', + 'mengipasi': 'kipas', + 'pengipas': 'kipas', + 'mengipasinya': 'kipas', + 'pengipasan': 'kipas', + 'berkipas-kipas': 'kipas', + 'mengipas-ngipas': 'kipas', + 'mengipas-ngipaskan': 'kipas', + 'mengipas-ngipasi': 'kipas', + 'berkiprah': 'kiprah', + 'berkiprahnya': 'kiprah', + 'berkiprahlah': 'kiprah', + 'mengipratkan': 'kiprat', + 'mengekir': 'kir', + 'mengekirkan': 'kir', + 'kiraan': 'kira', + 'kiraannya': 'kira', + 'terkira': 'kira', + 'terkirakan': 'kira', + 'kiranya': 'kira', + 'mengira': 'kira', + 'mengiranya': 'kira', + 'mengirakan': 'kira', + 'mengiraku': 'kira', + 'perkiraan': 'kira', + 'perkiraannya': 'kira', + 'perkiraankan': 'kira', + 'perkiraanku': 'kira', + 'perkiraanmu': 'kira', + 'kira-kira': 'kira', + 'kira-kiranya': 'kira', + 'kira-kiralah': 'kira', + 'pengiraan': 'kira', + 'sekiranya': 'sekira', + 'sekira-kira': 'kira', + 'sekira-kiranya': 'kira', + 'kira-kiraan': 'kira', + 'berkira-kira': 'kira', + 'mengira-ngira': 'kira', + 'memperkirakan': 'kira', + 'memperkirakannya': 'kira', + 'mengira-ngirakan': 'kira', + 'mengirabkan': 'kirab', + 'berkirai': 'kirai', + 'mengirai': 'kirai', + 'mengiraikan': 'kirai', + 'terkirai-kirai': 'kirai', + 'mengirap': 'kirap', + 'mengirapkan': 'kirap', + 'memperkirapkan': 'kirap', + 'berkirung': 'kirung', + 'mengisa': 'kisa', + 'mengisakan': 'kisa', + 'mengisai': 'kisai', + 'kisahan': 'kisah', + 'terkisah': 'kisah', + 'terkisahkan': 'kisah', + 'berkisah': 'kisah', + 'berkisahlah': 'kisah', + 'berkisahkan': 'kisah', + 'pengisahan': 'kisah', + 'pengisahannya': 'kisah', + 'mengisahkan': 'kisah', + 'mengisahkannya': 'kisah', + 'kisaian': 'kisai', + 'mengisas': 'kisas', + 'pengisat': 'kisat', + 'pengisatan': 'kisat', + 'mengisatkan': 'kisat', + 'berkisi': 'kisi', + 'kisi-kisi': 'kisi', + 'kisi-kisinya': 'kisi', + 'kisi-kisilah': 'kisi', + 'kisikan': 'kisik', + 'mengisik': 'kisik', + 'kekisruhan': 'kisruh', + 'kekisruhannya': 'kisruh', + 'mengisruhkan': 'kisruh', + 'pengisut': 'kisut', + 'mengisut': 'kisut', + 'mengisutkan': 'kisut', + 'kekitaan': 'kita', + 'berkitab': 'kitab', + 'pengitaban': 'kitab', + 'kitang-kitang': 'kitang', + 'mengitik': 'kitik', + 'mengitik-ngitik': 'kitik', + 'kitiran': 'kitir', + 'terkiuk': 'kiuk', + 'pengklaim': 'klaim', + 'pengklaiman': 'klaim', + 'mengklaim': 'klaim', + 'mengklaimnya': 'klaim', + 'mengklaimlah': 'klaim', + 'mengklaimkan': 'klaim', + 'mengklaimi': 'klaim', + 'pengklaimannya': 'klaim', + 'mengklakson': 'klakson', + 'mengklaksonnya': 'klakson', + 'mengklaksonkan': 'klakson', + 'mengklarifikasi': 'klarifikasi', + 'mengklarifikasinya': 'klarifikasi', + 'mengklarifikasikan': 'klarifikasi', + 'mengklarifikasikannya': 'klarifikasi', + 'mengklasifikasi': 'klasifikasi', + 'mengklasifikasinya': 'klasifikasi', + 'mengklasifikasikan': 'klasifikasi', + 'mengklasifikasikannya': 'klasifikasi', + 'pengklasifikasi': 'klasifikasi', + 'pengklasifikasian': 'klasifikasi', + 'pengklasifikasiannya': 'klasifikasi', + 'klik-klikan': 'klik', + 'mengeklirkan': 'klir', + 'mengkliring': 'kliring', + 'mengkliringkan': 'kliring', + 'mengklise': 'klise', + 'keklisean': 'klise', + 'pengklonaan': 'klona', + 'mengklonakan': 'klona', + 'keklorinan': 'klorin', + 'pengklorinan': 'klorin', + 'koak-koak': 'koak', + 'berkoak-koak': 'koak', + 'berkoalisi': 'koalisi', + 'berkoalisinya': 'koalisi', + 'berkoalisilah': 'koalisi', + 'berkoalisii': 'koalisi', + 'berkoar': 'koar', + 'berkoar-koar': 'koar', + 'berkoar-koarnya': 'koar', + 'kobakan': 'kobak', + 'koboi-koboian': 'koboi', + 'kekoboi-koboian': 'koboi', + 'kobokan': 'kobok', + 'berkobok': 'kobok', + 'mengobok': 'kobok', + 'berkobok-kobok': 'kobok', + 'terkocoh-kocoh': 'kocoh', + 'mengocok': 'kocok', + 'mengocoknya': 'kocok', + 'pengocok': 'kocok', + 'pengocokkan': 'kocok', + 'pengocokan': 'kocok', + 'mengocong': 'kocong', + 'mengocongkan': 'kocong', + 'kocoran': 'kocor', + 'mengocor': 'kocor', + 'mengocorkan': 'kocor', + 'mengodekan': 'kode', + 'mengodekannya': 'kode', + 'sekodi': 'kodi', + 'kodian': 'kodi', + 'berkodi-kodi': 'kodi', + 'pengodifikasian': 'kodifikasi', + 'mengodifikasikan': 'kodifikasi', + 'mengodok': 'kodok', + 'kekohesifan': 'kohesif', + 'terkojol-kojol': 'kojol', + 'mengokang': 'kokang', + 'mengokangnya': 'kokang', + 'mengokol': 'kokol', + 'terkokol': 'kokol', + 'terkokol-kokol': 'kokol', + 'terkokot': 'kokot', + 'mengokot': 'kokot', + 'berkolaborasi': 'kolaborasi', + 'berkolek-kolek': 'kolek', + 'mengoleksi': 'koleksi', + 'mengoleksinya': 'koleksi', + 'kekolektifan': 'kolektif', + 'kolokan': 'kolok', + 'berkolokasi': 'kolokasi', + 'kolongan': 'kolong', + 'kolong-kolong': 'kolong', + 'kekolotan': 'kolot', + 'berkolusi': 'kolusi', + 'koma-koma': 'koma', + 'mengomando': 'komando', + 'mengomandokan': 'komando', + 'mengomandoi': 'komando', + 'pengomandoan': 'komando', + 'berkomat-kamit': 'komat-kamit', + 'berkombinasi': 'kombinasi', + 'mengombinasikan': 'kombinasi', + 'mengombinasikannya': 'kombinasi', + 'sekomeng': 'komeng', + 'berkomentar': 'komentar', + 'berkomentarlah': 'komentar', + 'mengomentari': 'komentar', + 'mengomentarinya': 'komentar', + 'mengomersialkan': 'komersial', + 'mengomersialkannya': 'komersial', + 'mengomidikan': 'komidi', + 'mengomisi': 'komisi', + 'mengomisikan': 'komisi', + 'mengomit': 'komit', + 'berkompanyon': 'kompanyon', + 'mengompas': 'kompas', + 'kompenian': 'kompeni', + 'mengompes': 'kompes', + 'mengompori': 'kompor', + 'mengomporinya': 'kompor', + 'pengomporan': 'kompor', + 'mengompos': 'kompos', + 'mengomposkan': 'kompos', + 'mengompres': 'kompres', + 'mengompresnya': 'kompres', + 'mengompresi': 'kompres', + 'mengomputerkan': 'komputer', + 'berkomunikasi': 'komunikasi', + 'berkomunikasinya': 'komunikasi', + 'berkomunikasilah': 'komunikasi', + 'berkomunikasikan': 'komunikasi', + 'mengomunikasikan': 'komunikasi', + 'mengomunikasikannya': 'komunikasi', + 'mengomuniskan': 'komunis', + 'mengonan': 'konan', + 'mengonani': 'konan', + 'perkoncoan': 'konco', + 'mengonde': 'konde', + 'mengondensasikan': 'kondensasi', + 'mengondisikan': 'kondisi', + 'mengondisikannya': 'kondisi', + 'mengonferensikan': 'konferensi', + 'mengonfirmasikan': 'konfirmasi', + 'mengonfirmasikannya': 'konfirmasi', + 'berkongkalikong': 'kongkalikong', + 'kongko-kongko': 'kongko', + 'kongkongan': 'kongkong', + 'mengongkong': 'kongkong', + 'terkongkong': 'kongkong', + 'memperkonon': 'konon', + 'mengononkan': 'konon', + 'mengonsentrasikan': 'konsentrasi', + 'mengonsep': 'konsep', + 'mengonsepkan': 'konsep', + 'pengonsep': 'konsep', + 'pengonsepan': 'konsep', + 'mengonsolidasikan': 'konsolidasi', + 'mengonsolidasikannya': 'konsolidasi', + 'mengonstatir': 'konstatir', + 'berkonsultasi': 'konsultasi', + 'berkonsultasilah': 'konsultasi', + 'berkonsultasikan': 'konsultasi', + 'mengonsumsi': 'konsumsi', + 'mengonsumsinya': 'konsumsi', + 'mengonsumsikan': 'konsumsi', + 'pengonsumsian': 'konsumsi', + 'pengonsumsiannya': 'konsumsi', + 'berkontak': 'kontak', + 'mengontak': 'kontak', + 'mengontaknya': 'kontak', + 'mengontakku': 'kontak', + 'terkontaminasi': 'kontaminasi', + 'terkontaminasinya': 'kontaminasi', + 'mengontaminasi': 'kontaminasi', + 'mengontaminasinya': 'kontaminasi', + 'mengontaminasikan': 'kontaminasi', + 'mengontan': 'kontan', + 'berkontemplasi': 'kontemplasi', + 'mengonter': 'konter', + 'kontrakan': 'kontrak', + 'kontrakannya': 'kontrak', + 'kontrakanku': 'kontrak', + 'mengontrak': 'kontrak', + 'mengontraknya': 'kontrak', + 'mengontrakkan': 'kontrak', + 'mengontrakkannya': 'kontrak', + 'mengontrakan': 'kontrak', + 'mengontrakku': 'kontrak', + 'pengontrak': 'kontrak', + 'pengontraknya': 'kontrak', + 'pengontrakan': 'kontrak', + 'berkontraksi': 'kontraksi', + 'berkontraksinya': 'kontraksi', + 'kekontrasan': 'kontras', + 'kekontrasannya': 'kontras', + 'pengontrasan': 'kontras', + 'mengontraskan': 'kontras', + 'mengontrol': 'kontrol', + 'mengontrolnya': 'kontrol', + 'mengontrolkan': 'kontrol', + 'mengontrolan': 'kontrol', + 'pengontrol': 'kontrol', + 'pengontrolnya': 'kontrol', + 'pengontrolan': 'kontrol', + 'terkontrol': 'kontrol', + 'terkontrolnya': 'kontrol', + 'terkontrollah': 'kontrol', + 'pengontrolannya': 'kontrol', + 'mengonvergensikan': 'konvergensi', + 'mengonversikan': 'konversi', + 'mengonversikannya': 'konversi', + 'kekonyolan': 'konyol', + 'kekonyolannya': 'konyol', + 'berkooperasi': 'kooperasi', + 'terkooptasi': 'kooptasi', + 'terkooptasinya': 'kooptasi', + 'mengooptasi': 'kooptasi', + 'pengooptasian': 'kooptasi', + 'mengoordinasi': 'koordinasi', + 'mengoordinasinya': 'koordinasi', + 'mengoordinasikan': 'koordinasi', + 'mengoordinasikannya': 'koordinasi', + 'terkoordinasi': 'koordinasi', + 'terkoordinasinya': 'koordinasi', + 'terkoordinasikan': 'koordinasi', + 'terkoordinasikannya': 'koordinasi', + 'berkoordinasi': 'koordinasi', + 'berkoordinasilah': 'koordinasi', + 'berkoordinasikan': 'koordinasi', + 'pengoordinasian': 'koordinasi', + 'berkop': 'kop', + 'mengekop': 'kop', + 'berkopah-kopah': 'kopah', + 'mengopak': 'opak', + 'mengopek': 'kopek', + 'berkoper-koper': 'koper', + 'berkoperasi': 'koperasi', + 'perkoperasian': 'koperasi', + 'perkoperasiannya': 'koperasi', + 'mengopi': 'kopi', + 'mengopinya': 'kopi', + 'pengopi': 'kopi', + 'pengopian': 'kopi', + 'perkopian': 'kopi', + 'kopokan': 'kopok', + 'perkopraan': 'kopra', + 'koprakan': 'koprak', + 'mengopyok': 'kopyok', + 'berkoran': 'koran', + 'mengorankan': 'koran', + 'berkorban': 'korban', + 'berkorbannya': 'korban', + 'berkorbanlah': 'korban', + 'berkorbanan': 'korban', + 'pengorbanan': 'korban', + 'pengorbanannya': 'korban', + 'pengorbananlah': 'korban', + 'pengorbananan': 'korban', + 'pengorbananku': 'korban', + 'pengorbananmu': 'korban', + 'mengorbankan': 'korban', + 'mengorbankannya': 'korban', + 'mengorbankanku': 'korban', + 'mengored': 'kored', + 'korekan': 'korek', + 'mengorek': 'korek', + 'mengoreknya': 'korek', + 'pengorek': 'korek', + 'pengorekan': 'korek', + 'mengorek-ngorek': 'korek', + 'mengorek-ngoreknya': 'korek', + 'koreksian': 'koreksi', + 'koreksiannya': 'koreksi', + 'mengoreksi': 'koreksi', + 'mengoreksinya': 'koreksi', + 'mengoreksimu': 'koreksi', + 'pengoreksi': 'koreksi', + 'pengoreksian': 'koreksi', + 'berkorelasi': 'korelasi', + 'mengorelasikan': 'korelasi', + 'korengan': 'koreng', + 'berkoreng': 'koreng', + 'koreng-koreng': 'koreng', + 'berkorespondensi': 'korespondensi', + 'koretan': 'koret', + 'mengorok': 'orok', + 'berkorong': 'korong', + 'mengorting': 'korting', + 'mengorup': 'korup', + 'mengorupsi': 'korupsi', + 'mengosek': 'kosek', + 'terkosel-kosel': 'kosel', + 'kekosenan': 'kosen', + 'kekosongan': 'kosong', + 'kekosongannya': 'kosong', + 'pengosongan': 'kosong', + 'pengosongannya': 'kosong', + 'mengosongkan': 'kosong', + 'mengosongkannya': 'kosong', + 'sekosong-kosongnya': 'kosong', + 'berkostum': 'kostum', + 'berkostumkan': 'kostum', + 'berkota': 'kota', + 'mengota': 'kota', + 'mengotakan': 'kotak', + 'mengotai': 'kota', + 'kekotaan': 'kota', + 'perkotaan': 'kota', + 'perkotaannya': 'kota', + 'pengotaan': 'kota', + 'kekota-kotaan': 'kota', + 'sekotah': 'kotah', + 'mengotak-ngatikkan': 'kotak katik', + 'terkotak': 'kotak', + 'terkotakan': 'kotak', + 'mengotak': 'kotak', + 'mengotakkan': 'kotak', + 'mengotaki': 'otak', + 'pengotakan': 'kotak', + 'berkotak-kotak': 'kotak', + 'berkotak-kotakkan': 'kotak', + 'berkotak-kotakan': 'kotak', + 'terkotak-kotak': 'kotak', + 'terkotak-kotaknya': 'kotak', + 'terkotak-kotakkan': 'kotak', + 'terkotak-kotakan': 'kotak', + 'pengotak-ngotakan': 'kotak', + 'mengotak-ngotakkan': 'kotak', + 'terkoteng-koteng': 'koteng', + 'sekotes': 'kotes', + 'mengotes': 'kotes', + 'kotoran': 'kotor', + 'kotorannya': 'kotor', + 'pengotor': 'kotor', + 'pengotornya': 'kotor', + 'pengotoran': 'kotor', + 'mengotori': 'kotor', + 'mengotorinya': 'kotor', + 'kekotoran': 'kotor', + 'kekotorannya': 'kotor', + 'mengotorkan': 'kotor', + 'mengover': 'kover', + 'kowekan': 'kowek', + 'mengoyak': 'oyak', + 'mengoyaknya': 'oyak', + 'mengoyakkan': 'oyak', + 'mengoyaki': 'oyak', + 'mengoyakan': 'oyak', + 'koyak-koyak': 'koyak', + 'mengoyak-ngoyak': 'koyak', + 'mengoyak-ngoyaknya': 'koyak', + 'mengoyak-ngoyakkan': 'koyak', + 'berkreasi': 'kreasi', + 'berkreasinya': 'kreasi', + 'berkreasilah': 'kreasi', + 'kekreatifan': 'kreatif', + 'kekreatifannya': 'kreatif', + 'kreditan': 'kredit', + 'kreditannya': 'kredit', + 'mengkredit': 'kredit', + 'mengkreditnya': 'kredit', + 'mengkreditkan': 'kredit', + 'pengkredit': 'kredit', + 'pengkreditan': 'kredit', + 'perkreditan': 'kredit', + 'mengkrisis': 'krisis', + 'mengkristal': 'kristal', + 'mengkristalnya': 'kristal', + 'mengkristalkan': 'kristal', + 'pengkristalan': 'kristal', + 'kekristenan': 'kristen', + 'kekristenannya': 'kristen', + 'mengkristenkan': 'kristen', + 'pengkritik': 'kritik', + 'pengkritiknya': 'kritik', + 'mengkritik': 'kritik', + 'mengkritiknya': 'kritik', + 'mengkritiklah': 'kritik', + 'mengkritiki': 'kritik', + 'mengkritikan': 'kritik', + 'mengkritikku': 'kritik', + 'mengkritikmu': 'kritik', + 'mengkritis': 'kritis', + 'mengkritisnya': 'kritis', + 'mengkritisi': 'kritis', + 'kekritisan': 'kritis', + 'kekritisannya': 'kritis', + 'berkuah': 'kuah', + 'berkuahkan': 'kuah', + 'menguahi': 'kuah', + 'menguahkan': 'kuah', + 'terkuai-kuai': 'kuai', + 'terkuak': 'kuak', + 'terkuaknya': 'kuak', + 'terkuaklah': 'kuak', + 'menguak': 'uak', + 'menguaknya': 'uak', + 'menguakkan': 'uak', + 'menguakan': 'uak', + 'berkuala': 'kuala', + 'berkualifikasi': 'kualifikasi', + 'mengualifikasikan': 'kualifikasi', + 'berkualitas': 'kualitas', + 'berkualitasnya': 'kualitas', + 'berkualitaslah': 'kualitas', + 'berkualitasi': 'kualitas', + 'menguap': 'uap', + 'menguapnya': 'uap', + 'menguaplah': 'uap', + 'menguapkan': 'uap', + 'menguapkannya': 'uap', + 'menguapi': 'uap', + 'kuaran': 'kuar', + 'menguarkan': 'uar', + 'menguar-nguarkan': 'kuar', + 'kuas-kuas': 'kuas', + 'berkubak': 'kubak', + 'mengubak': 'kubak', + 'terkubak': 'kubak', + 'mengubik': 'kubik', + 'sekubit': 'kubit', + 'mengubit': 'kubit', + 'mengubrakan': 'kubra', + 'kuburan': 'kubur', + 'kuburannya': 'kubur', + 'kuburanlah': 'kubur', + 'kuburanku': 'kubur', + 'kuburanmu': 'kubur', + 'terkubur': 'kubur', + 'terkuburnya': 'kubur', + 'terkuburlah': 'kubur', + 'mengubur': 'kubur', + 'menguburnya': 'kubur', + 'menguburkan': 'kubur', + 'menguburkannya': 'kubur', + 'menguburi': 'kubur', + 'menguburku': 'kubur', + 'menguburmu': 'kubur', + 'berkubur': 'kubur', + 'pekuburan': 'kubur', + 'penguburan': 'kubur', + 'penguburannya': 'kubur', + 'penguburanku': 'kubur', + 'menguburkanmu': 'kubur', + 'terkucai': 'kucai', + 'mengucai': 'kucai', + 'berkucak': 'kucak', + 'mengucak': 'kucak', + 'mengucakan': 'kucak', + 'terkucak': 'kucak', + 'mengucar-ngacirkan': 'kucar-kacir', + 'mengucek-ngucek': 'kucek', + 'terkucil': 'kucil', + 'terkucilnya': 'kucil', + 'terkucilkan': 'kucil', + 'mengucil': 'kucil', + 'mengucilkan': 'kucil', + 'mengucilkannya': 'kucil', + 'kucing-kucing': 'kucing', + 'kucing-kucingnya': 'kucing', + 'kucing-kucingan': 'kucing', + 'kucing-kucingku': 'kucing', + 'kucing-kucingannya': 'kucing', + 'kucing-kucinganlah': 'kucing', + 'mengucup': 'kucup', + 'mengucupkan': 'kucup', + 'kucuran': 'kucur', + 'kucurannya': 'kucur', + 'mengucur': 'kucur', + 'mengucurnya': 'kucur', + 'mengucurlah': 'kucur', + 'mengucurkan': 'kucur', + 'mengucurkannya': 'kucur', + 'mengucuri': 'kucur', + 'berkucur': 'kucur', + 'berkucuran': 'kucur', + 'kudangan': 'kudang', + 'kudapan': 'kudap', + 'kudapannya': 'kudap', + 'mengudap': 'kudap', + 'mengudapnya': 'kudap', + 'pengudap': 'kudap', + 'kudap-kudap': 'kudap', + 'mengudeta': 'kudeta', + 'mengudian': 'kudian', + 'terkudian': 'kudian', + 'mengudiankan': 'kudian', + 'kudisan': 'kudis', + 'berkudis': 'kudis', + 'sekudung': 'kudung', + 'berkudung': 'kudung', + 'pengudung': 'kudung', + 'mengudung': 'kudung', + 'pengudungan': 'kudung', + 'mengudungkan': 'kudung', + 'kekudusan': 'kudus', + 'kekudusannya': 'kudus', + 'pengudusan': 'kudus', + 'menguduskan': 'kudus', + 'kue-kue': 'kue', + 'kue-kuenya': 'kue', + 'sekufu': 'kufu', + 'kekufuran': 'kufur', + 'kekufurannya': 'kufur', + 'mengufurkan': 'kufur', + 'menguis': 'kuis', + 'menguit': 'uit', + 'sekujur': 'kujur', + 'sekujurnya': 'kujur', + 'pengujut': 'kujut', + 'terkujut': 'kujut', + 'mengujut': 'kujut', + 'mengujutkan': 'kujut', + 'berkujut': 'kujut', + 'kukuran': 'kukur', + 'kukusan': 'kukus', + 'mengukus': 'kukus', + 'mengukusnya': 'kukus', + 'berkukus': 'kukus', + 'kulah-kulah': 'kulah', + 'terkulai': 'kulai', + 'terkulainya': 'kulai', + 'berkulai': 'kulai', + 'berkulaian': 'kulai', + 'perkulakan': 'kulak', + 'kulak-kulak tangan': 'kulak', + 'berkulimat': 'kulimat', + 'mengulit': 'ulit', + 'menguliti': 'ulit', + 'pengulit': 'kulit', + 'pengulitan': 'kulit', + 'berkulit': 'kulit', + 'mengulitinya': 'kulit', + 'perkulitan': 'kulit', + 'pengultusan': 'kultus', + 'pengultusannya': 'kultus', + 'mengultuskan': 'kultus', + 'mengulub': 'kulub', + 'mengulum': 'kulum', + 'mengulumnya': 'kulum', + 'kulum-kulum': 'kulum', + 'mengulum-ngulum': 'kulum', + 'berkulup': 'kulup', + 'kumaian': 'kumai', + 'berkumai': 'kumai', + 'mengumai': 'kumai', + 'mengumaikan': 'kumai', + 'mengumalkan': 'kumal', + 'mengumandang': 'kumandang', + 'mengumandangkan': 'kumandang', + 'mengumandangkannya': 'kumandang', + 'berkumandang': 'kumandang', + 'berkumandangnya': 'kumandang', + 'berkumandangkan': 'kumandang', + 'kumat-kamit': 'kumat', + 'mengumbah': 'kumbah', + 'mengumbang': 'umbang', + 'mengumbangkan': 'umbang', + 'mengumbangi': 'umbang', + 'berkumis': 'kumis', + 'berkumisan': 'kumis', + 'berkumpai': 'kumpai', + 'terkumpal-kumpal': 'kumpal', + 'kumparan': 'kumpar', + 'kumparannya': 'kumpar', + 'mengumpar': 'kumpar', + 'kekumuhan': 'kumuh', + 'kekumuhannya': 'kumuh', + 'mengumuhkan': 'kumuh', + 'berkumut': 'kumut', + 'berkunang-kunang': 'kunang-kunang', + 'berkunar-kunar': 'kunar-kunar', + 'mengunci': 'kunci', + 'menguncinya': 'kunci', + 'menguncikan': 'kunci', + 'terkunci': 'kunci', + 'terkuncinya': 'kunci', + 'pengunci': 'kunci', + 'penguncinya': 'kunci', + 'penguncian': 'kunci', + 'menguncup': 'kuncup', + 'penguncupan': 'kuncup', + 'menguncupkan': 'kuncup', + 'mengundai': 'kundai', + 'kundangan': 'kundang', + 'mengundang': 'undang', + 'mengundangnya': 'undang', + 'mengundangkan': 'undang', + 'mengundangkannya': 'undang', + 'mengundangan': 'undang', + 'mengundangku': 'undang', + 'mengundangmu': 'undang', + 'berkundang': 'kundang', + 'mengungkang': 'kungkang', + 'kungkungan': 'kungkung', + 'kungkungannya': 'kungkung', + 'terkungkung': 'kungkung', + 'mengungkung': 'kungkung', + 'mengungkungnya': 'kungkung', + 'menguntit': 'kuntit', + 'menguntitnya': 'kuntit', + 'menguntiti': 'kuntit', + 'terkuntum': 'kuntum', + 'menguntum': 'kuntum', + 'kunyahan': 'kunyah', + 'kunyahannya': 'kunyah', + 'mengunyah': 'kunyah', + 'mengunyahnya': 'kunyah', + 'mengunyahlah': 'kunyah', + 'mengunyahkan': 'kunyah', + 'mengunyahkannya': 'kunyah', + 'terkunyah': 'kunyah', + 'kupakan': 'kupak', + 'berkupak': 'kupak', + 'mengupak': 'upak', + 'mengupakan': 'upak', + 'kupasan': 'kupas', + 'kupasannya': 'kupas', + 'terkupas': 'kupas', + 'mengupas': 'kupas', + 'mengupasnya': 'kupas', + 'mengupaskan': 'kupas', + 'pengupas': 'kupas', + 'pengupasan': 'kupas', + 'pengupasannya': 'kupas', + 'mengupil': 'upil', + 'menguping': 'kuping', + 'berkuping': 'kuping', + 'mengupingi': 'kuping', + 'berkurai': 'kurai', + 'berkurap': 'kurap', + 'terkuras': 'kuras', + 'terkurasnya': 'kuras', + 'terkurasi': 'kuras', + 'menguras': 'uras', + 'mengurasnya': 'uras', + 'mengurasi': 'uras', + 'pengurasan': 'kuras', + 'pengurasannya': 'kuras', + 'kekuratoran': 'kurator', + 'berkurban': 'kurban', + 'berkurbannya': 'kurban', + 'mengurbankan': 'kurban', + 'mengurbankannya': 'kurban', + 'menguret': 'kuret', + 'penguretan': 'kuret', + 'kuricakan': 'kuricak', + 'berkurik-kurik': 'kurik', + 'mengursus': 'kursus', + 'mengursuskan': 'kursus', + 'berkurun-kurun': 'kurun', + 'kurungan': 'kurung', + 'kurungannya': 'kurung', + 'mengurung': 'kurung', + 'mengurungnya': 'kurung', + 'mengurungkan': 'urung', + 'mengurungkannya': 'urung', + 'mengurungi': 'kurung', + 'mengurungmu': 'kurung', + 'terkurung': 'kurung', + 'terkurungnya': 'kurung', + 'berkurung': 'kurung', + 'pengurungan': 'kurung', + 'pengurungannya': 'kurung', + 'mengusa': 'kusa', + 'mengusakannya': 'kusa', + 'mengusai': 'usai', + 'mengusal': 'kusal', + 'mengusalkan': 'kusal', + 'berkusau-kusau': 'kusau', + 'berkusik': 'kusik', + 'mengusruk': 'kusruk', + 'mengusrukkan': 'kusruk', + 'berkusu-kusu': 'kusu', + 'mengusuk': 'kusuk', + 'mengusukkan': 'kusuk', + 'mengusukan': 'kusuk', + 'berkusuk': 'kusuk', + 'berkuta': 'kuta', + 'mengutak-ngatikkan': 'kutak', + 'berkutat': 'kutat', + 'berkutatnya': 'kutat', + 'berkuteks': 'kuteks', + 'menguti': 'kuti', + 'kuti-kuti': 'kuti', + 'kutikan': 'kutik', + 'mengutik': 'kutik', + 'berkutik': 'kutik', + 'berkutiknya': 'kutik', + 'mengutik-ngutik': 'kutik', + 'sekutil': 'kutil', + 'mengutil': 'kutil', + 'pengutil': 'kutil', + 'pengutilan': 'kutil', + 'berkuting-kuting': 'kuting', + 'kutipan': 'kutip', + 'kutipannya': 'kutip', + 'mengutip': 'kutip', + 'mengutipnya': 'kutip', + 'mengutipkan': 'kutip', + 'pengutip': 'kutip', + 'pengutipan': 'kutip', + 'berkutu': 'kutu', + 'berkutuan': 'kutu', + 'mengutui': 'kutu', + 'berkutu-kutuan': 'kutu', + 'berkutub': 'kutub', + 'kutukan': 'kutuk', + 'kutukannya': 'kutuk', + 'sekutuk': 'kutuk', + 'terkutuk': 'kutuk', + 'terkutuknya': 'kutuk', + 'terkutuklah': 'kutuk', + 'mengutuk': 'kutuk', + 'mengutuknya': 'kutuk', + 'mengutuki': 'kutuk', + 'mengutukan': 'kutuk', + 'mengutukku': 'kutuk', + 'mengutukmu': 'kutuk', + 'mengutukinya': 'kutuk', + 'keterkutukan': 'kutuk', + 'keterkutukannya': 'kutuk', + 'sekutuk tipe unggul': 'kutuk', + 'menguyup': 'kuyup', + 'menguyupkan': 'kuyup', + 'berlaba': 'laba', + 'melabai': 'laba', + 'melabaikan': 'laba', + 'melabakan': 'laba', + 'melabang': 'labang', + 'berlabel': 'label', + 'berlabelkan': 'label', + 'pelabelan': 'label', + 'pelabelannya': 'label', + 'melabelkan': 'label', + 'melabelkannya': 'label', + 'labilitas': 'labi-labi', + 'kelabilan': 'labil', + 'melabrak': 'labrak', + 'melabraknya': 'labrak', + 'melabrakku': 'labrak', + 'melabu': 'labu', + 'melabukan': 'labu', + 'melabui': 'labu', + 'labu-labu': 'labu', + 'labu-labuan': 'labu', + 'berlabun-labun': 'labun', + 'melabur': 'labur', + 'melaburnya': 'labur', + 'pelabur': 'labur', + 'pelaburan': 'labur', + 'kelaburan': 'labur', + 'melacak': 'lacak', + 'melacaknya': 'lacak', + 'melacakan': 'lacak', + 'pelacak': 'lacak', + 'pelacaknya': 'lacak', + 'pelacakkan': 'lacak', + 'pelacakan': 'lacak', + 'belacak': 'lacak', + 'terlacak': 'lacak', + 'terlacaknya': 'lacak', + 'terlacaklah': 'lacak', + 'pelacakannya': 'lacak', + 'melacur': 'lacur', + 'melacurkan': 'lacur', + 'melacurkannya': 'lacur', + 'pelacur': 'lacur', + 'pelacurnya': 'lacur', + 'pelacuran': 'lacur', + 'pelacurmu': 'lacur', + 'pelacurannya': 'lacur', + 'melacut': 'lacut', + 'meladai': 'lada', + 'peladen': 'laden', + 'ladenan': 'laden', + 'meladeni': 'laden', + 'meladeninya': 'laden', + 'peladenan': 'laden', + 'berladung': 'ladung', + 'meladungkan': 'ladung', + 'melafalkan': 'lafal', + 'melafalkannya': 'lafal', + 'pelagak': 'lagak', + 'melagak': 'lagak', + 'berlagak': 'lagak', + 'melagakkan': 'lagak', + 'melagang': 'lagang', + 'melagangkan': 'lagang', + 'lagian': 'lagi', + 'selagi': 'lagi', + 'lagi-lagi': 'lagi', + 'laguan': 'lagu', + 'pelagu': 'lagu', + 'belagu': 'lagu', + 'belagunya': 'lagu', + 'belagulah': 'lagu', + 'melagu': 'lagu', + 'melagukan': 'lagu', + 'melagukannya': 'lagu', + 'berlagu': 'lagu', + 'melagui': 'lagu', + 'pelahap': 'lahap', + 'melahap': 'lahap', + 'melahapnya': 'lahap', + 'berlahar': 'lahar', + 'terlahir': 'lahir', + 'terlahirnya': 'lahir', + 'terlahirlah': 'lahir', + 'terlahirkan': 'lahir', + 'kelahiran': 'lahir', + 'kelahirannya': 'lahir', + 'kelahiranku': 'lahir', + 'kelahiranmu': 'lahir', + 'melahirkan': 'lahir', + 'melahirkannya': 'lahir', + 'melahirkankan': 'lahir', + 'melahirkanku': 'lahir', + 'melahirkanmu': 'lahir', + 'kelaikan': 'laik', + 'kelaikannya': 'laik', + 'melais': 'lais', + 'melajang': 'lajang', + 'melaju': 'laju', + 'melajunya': 'laju', + 'melajulah': 'laju', + 'melajukan': 'laju', + 'melajukannya': 'laju', + 'kelajuan': 'laju', + 'perlajuan': 'laju', + 'bersilaju': 'laju', + 'berlaju-laju': 'laju', + 'berlajur': 'lajur', + 'melakabkan': 'lakab', + 'melakak': 'lakak', + 'melakakan': 'lakak', + 'berlaki': 'laki', + 'laki-laki': 'laki', + 'laki-lakinya': 'laki', + 'laki-lakilah': 'laki', + 'laki-lakinyalah': 'laki', + 'laki-lakiku': 'laki', + 'laki-lakimu': 'laki', + 'memperlaki': 'laki', + 'kelaki-lakian': 'laki', + 'kelaki-lakiannya': 'laki', + 'memperlakikan': 'laki', + 'melaknat': 'laknat', + 'melaknatnya': 'laknat', + 'melaknati': 'laknat', + 'melaknatkan': 'laknat', + 'lelakon': 'lakon', + 'pelakon': 'lakon', + 'pelakonnya': 'lakon', + 'melakoni': 'lakon', + 'melakoninya': 'lakon', + 'melakonii': 'lakon', + 'berlakon': 'lakon', + 'melakonkan': 'lakon', + 'melakonkannya': 'lakon', + 'pelaksana': 'laksana', + 'pelaksananya': 'laksana', + 'pelaksanakan': 'laksana', + 'pelaksanakannya': 'laksana', + 'pelaksanaan': 'laksana', + 'terlaksana': 'laksana', + 'terlaksananya': 'laksana', + 'terlaksanalah': 'laksana', + 'terlaksanakan': 'laksana', + 'pelaksanaannya': 'laksana', + 'pelaksanaanan': 'laksana', + 'melaksanakan': 'laksana', + 'melaksanakannya': 'laksana', + 'melaksanakanan': 'laksana', + 'berlaku lajak': 'laku lajak', + 'melakurkan': 'lakur', + 'melala': 'lala', + 'melalai': 'lala', + 'pelalah': 'lalah', + 'pelalahan': 'lalah', + 'melalah': 'lalah', + 'terlalah': 'lalah', + 'melalak': 'lalak', + 'melalap': 'lalap', + 'melalapnya': 'lalap', + 'melalapkan': 'lalap', + 'melalau': 'lalau', + 'melalaui': 'lalau', + 'pelalau': 'lalau', + 'pelalauan': 'lalau', + 'melali': 'lali', + 'melalikan': 'lali', + 'melalii': 'lali', + 'berlalu lintas': 'lalu lintas', + 'perlalulintasan': 'lalu lintas', + 'selama': 'lama', + 'selamanya': 'lama', + 'selamai': 'lama', + 'kelamaan': 'lama', + 'lama-lama': 'lama', + 'lama-lamalah': 'lama', + 'lama-lamaan': 'lama', + 'memperlama': 'lama', + 'berlama-lama': 'lama', + 'berlama-lamanya': 'lama', + 'berlama-lamalah': 'lama', + 'berlama-lamaan': 'lama', + 'lama-kelamaan': 'lama', + 'memperlamakan': 'lama', + 'selama-lamanya': 'lama', + 'selama-lamanyanya': 'lama', + 'pelamar': 'lamar', + 'pelamarnya': 'lamar', + 'pelamaran': 'lamar', + 'melamar': 'lamar', + 'melamarnya': 'lamar', + 'melamarkan': 'lamar', + 'melamarku': 'lamar', + 'melamarmu': 'lamar', + 'lamaran': 'lamar', + 'lamarannya': 'lamar', + 'lamaranku': 'lamar', + 'lamaranmu': 'lamar', + 'lambaian': 'lambai', + 'melambai': 'lambai', + 'melambailah': 'lambai', + 'melambaikan': 'lambai', + 'melambaikannya': 'lambai', + 'melambai-lambai': 'lambai', + 'melambai-lambaikan': 'lambai', + 'melambai-lambaikannya': 'lambai', + 'berlambai-lambai': 'lambai', + 'kelambanan': 'lamban', + 'kelambanannya': 'lamban', + 'kelambananan': 'lamban', + 'melambankan': 'lamban', + 'berlambang': 'lambang', + 'berlambangkan': 'lambang', + 'berlambangan': 'lambang', + 'pelambangan': 'lambang', + 'melambangkan': 'lambang', + 'melambangkannya': 'lambang', + 'melambari': 'lambar', + 'terlambat': 'lambat', + 'terlambatnya': 'lambat', + 'terlambatan': 'lambat', + 'berlambat': 'lambat', + 'kelambatan': 'lambat', + 'kelambatannya': 'lambat', + 'melambatkan': 'lambat', + 'melambatkannya': 'lambat', + 'memperlambat': 'lambat', + 'memperlambatnya': 'lambat', + 'memperlambatkan': 'lambat', + 'lambat-lambat': 'lambat', + 'lambat-lambatkan': 'lambat', + 'keterlambatan': 'lambat', + 'keterlambatannya': 'lambat', + 'keterlambatanku': 'lambat', + 'melambat-lambatkan': 'lambat', + 'pelambuk': 'lambuk', + 'melambuk': 'lambuk', + 'melambung': 'lambung', + 'melambungnya': 'lambung', + 'melambungkan': 'lambung', + 'melambungkannya': 'lambung', + 'melambungan': 'lambung', + 'melambungi': 'lambung', + 'pelamin': 'lamin', + 'pelaminan': 'lamin', + 'melamin': 'lamin', + 'pelaminannya': 'lamin', + 'melampai': 'lampai', + 'melampaikan': 'lampai', + 'terlampai': 'lampai', + 'melampam': 'lampam', + 'melampan': 'lampan', + 'melampang': 'lampang', + 'melampangkan': 'lampang', + 'berlampang': 'lampang', + 'berlampang-lampang': 'lampang', + 'berlampar': 'lampar', + 'berlamparan': 'lampar', + 'melampas': 'lampas', + 'melampau': 'lampau', + 'melampaui': 'lampau', + 'melampauinya': 'lampau', + 'melampauiku': 'lampau', + 'melampauimu': 'lampau', + 'terlampau': 'lampau', + 'terlampaunya': 'lampau', + 'terlampaui': 'lampau', + 'terlampauinya': 'lampau', + 'kelampauan': 'lampau', + 'pelampiasan': 'lampias', + 'pelampiasannya': 'lampias', + 'melampiaskan': 'lampias', + 'melampiaskannya': 'lampias', + 'melampini': 'lampin', + 'lampiran': 'lampir', + 'lampirannya': 'lampir', + 'terlampir': 'lampir', + 'terlampirnya': 'lampir', + 'melampiri': 'lampir', + 'melampirinya': 'lampir', + 'melampirkan': 'lampir', + 'melampirkannya': 'lampir', + 'berlampu': 'lampu', + 'berlampukan': 'lampu', + 'perlampuan': 'lampu', + 'pelampung': 'lampung', + 'pelampungnya': 'lampung', + 'pelampungku': 'lampung', + 'melampung': 'lampung', + 'melamun': 'lamun', + 'melamunkan': 'lamun', + 'lamunan': 'lamun', + 'lamunannya': 'lamun', + 'lamunanku': 'lamun', + 'dilamun': 'lamun', + 'melanang': 'lanang', + 'terlancap': 'lancap', + 'lancingan': 'lancing', + 'berlancing': 'lancing', + 'melancip': 'lancip', + 'melancipkan': 'lancip', + 'melancong': 'lancong', + 'melancongnya': 'lancong', + 'melancongi': 'lancong', + 'pelancong': 'lancong', + 'pelancongnya': 'lancong', + 'pelancongan': 'lancong', + 'perpelancongan': 'lancong', + 'lancungan': 'lancung', + 'melancung': 'lancung', + 'kelancungan': 'lancung', + 'melancungkan': 'lancung', + 'melancur': 'lancur', + 'melancut': 'lancut', + 'pelanda': 'landa', + 'pelandakan': 'landa', + 'melanda': 'landa', + 'melandanya': 'landa', + 'melandai': 'landai', + 'melandaku': 'landa', + 'melandamu': 'landa', + 'terlanda': 'landa', + 'terlandai': 'landa', + 'melandakan': 'landa', + 'landaian': 'landai', + 'melandainya': 'landai', + 'melandaikan': 'landai', + 'landasan': 'landas', + 'landasannya': 'landas', + 'landasanan': 'landas', + 'melandas': 'landas', + 'melandaskan': 'landas', + 'melandaskannya': 'landas', + 'melandasi': 'landas', + 'melandasinya': 'landas', + 'berlandasan': 'landas', + 'berlandaskan': 'landas', + 'melandau': 'landau', + 'melandung': 'landung', + 'melangah': 'langah', + 'terlangah': 'langah', + 'melangahkan': 'langah', + 'berlangau': 'langau', + 'langganan': 'langgan', + 'langganannya': 'langgan', + 'langgananan': 'langgan', + 'pelanggan': 'langgan', + 'pelanggannya': 'langgan', + 'pelangganlah': 'langgan', + 'pelangganan': 'langgan', + 'pelangganku': 'langgan', + 'pelangganmu': 'langgan', + 'melanggani': 'langgan', + 'berlanggan': 'langgan', + 'berlanggannya': 'langgan', + 'berlangganan': 'langgan', + 'berlangganannya': 'langgan', + 'berlanggananan': 'langgan', + 'pelanggar': 'langgar', + 'pelanggarnya': 'langgar', + 'pelanggaran': 'langgar', + 'melanggar': 'langgar', + 'melanggarnya': 'langgar', + 'melanggarlah': 'langgar', + 'melanggarkan': 'langgar', + 'melanggaran': 'langgar', + 'terlanggar': 'langgar', + 'terlanggarnya': 'langgar', + 'terlanggarkan': 'langgar', + 'pelanggarannya': 'langgar', + 'pelanggaranmu': 'langgar', + 'berlanggaran': 'langgar', + 'perlanggaran': 'langgar', + 'langgar-melanggar': 'langgar', + 'berlanggar-langgar': 'langgar', + 'kelanggengan': 'langgeng', + 'kelanggengannya': 'langgeng', + 'melanggungkan': 'langgung', + 'melangir': 'langir', + 'berlangir': 'langir', + 'selangit': 'langit', + 'selangitnya': 'langit', + 'melangit': 'langit', + 'melangitnya': 'langit', + 'melangitkan': 'langit', + 'kelangkaan': 'langka', + 'kelangkaannya': 'langka', + 'melangkah': 'langkah', + 'melangkahnya': 'langkah', + 'melangkahlah': 'langkah', + 'melangkahkan': 'langkah', + 'melangkahi': 'langkah', + 'selangkah': 'langkah', + 'pelangkah': 'langkah', + 'pelangkahi': 'langkah', + 'pelangkahan': 'langkah', + 'berlangkah': 'langkah', + 'berlangkahlah': 'langkah', + 'melangkahinya': 'langkah', + 'kelangkahan': 'langkah', + 'perlangkahan': 'langkah', + 'terlangkahkan': 'langkah', + 'memperlangkangkan': 'langkang', + 'melangkapkan': 'langkap', + 'selangkas': 'langkas', + 'melangkaui': 'langkau', + 'terlangkaui': 'langkau', + 'langkupan': 'langkup', + 'terlangkup': 'langkup', + 'melanglang': 'langlang', + 'berlanglang': 'langlang', + 'melangsamkan': 'langsam', + 'melangsar': 'langsar', + 'melangsi': 'langsi', + 'berlangsi': 'langsi', + 'pelangsing': 'langsing', + 'pelangsingnya': 'langsing', + 'pelangsingan': 'langsing', + 'kelangsingan': 'langsing', + 'kelangsingannya': 'langsing', + 'melangsingkan': 'langsing', + 'melangsingkannya': 'langsing', + 'melangsir': 'langsir', + 'melangsirnya': 'langsir', + 'melangsirkan': 'langsir', + 'berlangsung': 'langsung', + 'berlangsungnya': 'langsung', + 'berlangsunglah': 'langsung', + 'berlangsungkan': 'langsung', + 'berlangsungi': 'langsung', + 'berlangsungan': 'langsung', + 'terlangsung': 'langsung', + 'terlangsungnya': 'langsung', + 'kelangsungan': 'langsung', + 'kelangsungannya': 'langsung', + 'melangsungkan': 'langsung', + 'melangsungkannya': 'langsung', + 'perlangsungan': 'langsung', + 'keberlangsungan': 'langsung', + 'keberlangsungannya': 'langsung', + 'melangut': 'langut', + 'melanja': 'lanja', + 'lanja-lanjaan': 'lanja', + 'melanjai': 'lanjai', + 'lanjaran': 'lanjar', + 'melanjar': 'lanjar', + 'terlanjau': 'lanjau', + 'telanjuk': 'lanjuk', + 'melansir': 'lansir', + 'melansirnya': 'lansir', + 'melansirkan': 'lansir', + 'melansiri': 'lansir', + 'melantah': 'lantah', + 'melantai': 'lantai', + 'melantainya': 'lantai', + 'melantaikan': 'lantai', + 'berlantai': 'lantai', + 'berlantaikan': 'lantai', + 'pelantak': 'lantak', + 'melantak': 'lantak', + 'melantakkan': 'lantak', + 'lantakan': 'lantak', + 'kelantaman': 'lantam', + 'melantamkan': 'lantam', + 'melantan': 'lantan', + 'terlantan': 'lantan', + 'melantang': 'lantang', + 'melantangkan': 'lantang', + 'kelantangan': 'lantang', + 'lantaran': 'lantar', + 'lantarannya': 'lantar', + 'lantaranan': 'lantar', + 'pelantar': 'lantar', + 'pelantarnya': 'lantar', + 'pelantaran': 'pelantar', + 'melantarkan': 'lantar', + 'melantarkannya': 'lantar', + 'melantas': 'lantas', + 'berlantas': 'lantas', + 'terlantas': 'lantas', + 'berlantasan': 'lantas', + 'melantaskan': 'lantas', + 'melantik': 'lantik', + 'melantiknya': 'lantik', + 'melantikan': 'lantik', + 'pelantik': 'lantik', + 'pelantiknya': 'lantik', + 'pelantikkan': 'lantik', + 'pelantikkannya': 'lantik', + 'pelantikan': 'lantik', + 'pelantikannya': 'lantik', + 'melanting': 'lanting', + 'terlanting': 'lanting', + 'berlanting': 'lanting', + 'melantingkan': 'lanting', + 'lantunan': 'lantun', + 'lantunannya': 'lantun', + 'melantun': 'lantun', + 'melantunkan': 'lantun', + 'melantunkannya': 'lantun', + 'melantunan': 'lantun', + 'luntang': 'lantung', + 'peluntang': 'lantung', + 'meluntang': 'lantung', + 'lanturan': 'lantur', + 'melantur': 'lantur', + 'melanturkan': 'lantur', + 'pelanturan': 'lantur', + 'melanus': 'lanus', + 'melanyah': 'lanyah', + 'melanyak': 'lanyak', + 'melanyau': 'lanyau', + 'mengelap': 'lap', + 'mengelapnya': 'lap', + 'mengelapi': 'lap', + 'dilapah': 'lapah', + 'melapah': 'lapah', + '2 lapak': 'lapak', + 'berlapak': 'lapak', + 'lapangan': 'lapang', + 'lapangannya': 'lapang', + 'lapanganlah': 'lapang', + 'lapanganan': 'lapang', + 'melapangi': 'lapang', + 'melapangkan': 'lapang', + 'memperlapang': 'lapang', + 'memperlapangkan': 'lapang', + 'berlapang-lapang': 'lapang', + 'dilapih': 'lapih', + 'melapih': 'lapih', + 'berlapih': 'lapih', + 'melapik': 'lapik', + 'selapik': 'lapik', + 'melapiki': 'lapik', + 'berlapik': 'lapik', + 'melapikkan': 'lapik', + 'melapis': 'lapis', + 'melapisnya': 'lapis', + 'melapiskan': 'lapis', + 'melapisi': 'lapis', + 'lapisan': 'lapis', + 'lapisannya': 'lapis', + 'pelapis': 'lapis', + 'pelapisnya': 'lapis', + 'pelapisan': 'lapis', + 'melapisinya': 'lapis', + 'berlapis': 'lapis', + 'berlapisnya': 'lapis', + 'berlapiskan': 'lapis', + 'berlapisan': 'lapis', + 'berlapis-lapis': 'lapis', + 'laporan': 'lapor', + 'laporannya': 'lapor', + 'laporankan': 'lapor', + 'laporanan': 'lapor', + 'laporanku': 'lapor', + 'laporanmu': 'lapor', + 'pelapor': 'lapor', + 'pelapornya': 'lapor', + 'pelaporlah': 'lapor', + 'pelaporkan': 'lapor', + 'pelaporan': 'lapor', + 'melapor': 'lapor', + 'melapornya': 'lapor', + 'melaporlah': 'lapor', + 'melaporkan': 'lapor', + 'melaporkannya': 'lapor', + 'melapori': 'lapor', + 'melaporan': 'lapor', + 'pelaporannya': 'lapor', + 'melaporkankan': 'lapor', + 'melapun': 'lapun', + 'melapur': 'lapur', + 'berlapur': 'lapur', + 'terlara-lara': 'lara', + 'melarah': 'larah', + 'berlarah-larah': 'larah', + 'pelarai': 'larai', + 'melarai': 'larai', + 'melaraikan': 'larai', + 'melaram': 'laram', + 'larangan': 'larang', + 'larangannya': 'larang', + 'laranganku': 'larang', + 'melarang': 'larang', + 'melarangnya': 'larang', + 'melarangan': 'larang', + 'melarangku': 'larang', + 'melarangmu': 'larang', + 'terlarang': 'larang', + 'terlarangnya': 'larang', + 'terlarangan': 'larang', + 'pelarangan': 'larang', + 'pelarangannya': 'larang', + 'melarangkan': 'larang', + 'selarap': 'larap', + 'melarapkan': 'larap', + 'selaras': 'laras', + 'selarasnya': 'laras', + 'selaraskan': 'laras', + 'selarasan': 'laras', + 'melarasi': 'laras', + 'pelarasan': 'laras', + 'kelarasan': 'laras', + 'berlarasan': 'laras', + 'melaraskan': 'laras', + 'melaraskannya': 'laras', + 'keselarasan': 'laras', + 'keselarasannya': 'laras', + 'penyelarasan': 'laras', + 'menyelaraskan': 'laras', + 'menyelaraskannya': 'laras', + 'melarat': 'larat', + 'melaratnya': 'larat', + 'melaratkan': 'larat', + 'memperlarat': 'larat', + 'berlarat-larat': 'larat', + 'berlarat-laratnya': 'larat', + 'melarau': 'larau', + 'melarih': 'larih', + 'melarihi': 'larih', + 'berlarih-larih': 'larih', + 'selarik': 'larik', + 'pelarik': 'larik', + 'melarik': 'larik', + 'larikan': 'larik', + 'berlarik': 'larik', + 'melarikkan': 'larik', + 'berlarik-larik': 'larik', + 'pelaris': 'laris', + 'pelarisan': 'laris', + 'terlaris': 'laris', + 'terlarisnya': 'laris', + 'melariskan': 'laris', + 'melaru': 'laru', + 'melarui': 'laru', + 'melarungkan': 'larung', + 'pengelasan': 'las', + 'melasah': 'lasah', + 'pelasah': 'lasah', + 'melasahkan': 'lasah', + 'memperlasah': 'lasah', + 'pelasak': 'lasak', + 'pelasakan': 'lasak', + 'pelasi': 'lasi', + 'lasian': 'lasi', + 'melasikan': 'lasi', + 'kelaskaran': 'laskar', + 'selat-latnya': 'lat', + 'melata': 'lata', + 'pelatah': 'latah', + 'pelatahan': 'latah', + 'kelatahan': 'latah', + 'melatahkan': 'latah', + 'melatam': 'latam', + 'melatamkan': 'latam', + 'melatarbelakangi': 'latar belakang', + 'melatarbelakanginya': 'latar belakang', + 'melatari': 'latar', + 'melatarinya': 'latar', + 'pelataran': 'latar', + 'pelatarannya': 'latar', + 'melatas': 'latas', + 'melating': 'lating', + 'latisan': 'latis', + 'melatis': 'latis', + 'melatur': 'latur', + 'berlauk': 'lauk', + 'lauk-pauk': 'lauk', + 'lauk-pauknya': 'lauk', + 'laun-laun': 'laun', + 'melaun-laun': 'laun', + 'melaung': 'laung', + 'pelaung': 'laung', + 'sepelaung': 'laung', + 'melaungkan': 'laung', + 'selaur': 'laur', + 'melaur': 'laur', + 'melawa': 'lawa', + 'melawanya': 'lawa', + 'melawai': 'lawa', + 'melawaan': 'lawa', + 'pelawa': 'lawa', + 'lawah': 'lawai', + 'lawahan': 'lawai', + 'lawah-lawah': 'lawai', + 'melawak': 'lawak', + 'melawaknya': 'lawak', + 'pelawak': 'lawak', + 'pelawaknya': 'lawak', + 'lawakan': 'lawak', + 'lawakannya': 'lawak', + 'lawak-lawak': 'lawak', + 'melawak-lawak': 'lawak', + 'berlawak-lawak': 'lawak', + 'berlawalata': 'lawalata', + 'pelawang': 'lawang', + 'pelawangan': 'lawang', + 'melawar': 'lawar', + 'melawas': 'lawas', + 'lawatan': 'lawat', + 'lawatannya': 'lawat', + 'melawat': 'lawat', + 'melawatnya': 'lawat', + 'melawatkan': 'lawat', + 'melawati': 'lawat', + 'pelawat': 'lawat', + 'pelawati': 'lawat', + 'pelawatan': 'lawat', + 'perlawatan': 'lawat', + 'perlawatannya': 'lawat', + 'selawe': 'lawe', + 'penglawe': 'lawe', + 'lawi-lawi': 'lawi', + 'melayah': 'layah', + 'terlayah': 'layah', + 'melayahkan': 'layah', + 'melayam': 'layam', + 'layanan': 'layan', + 'layanannya': 'layan', + 'layanani': 'layan', + 'layananan': 'layan', + 'pelayan': 'layan', + 'pelayannya': 'layan', + 'pelayani': 'layan', + 'pelayanan': 'layan', + 'melayani': 'layan', + 'melayaninya': 'layan', + 'melayanilah': 'layan', + 'melayanii': 'layan', + 'melayanimu': 'layan', + 'pelayanannya': 'layan', + 'pelayananan': 'layan', + 'pelayananmu': 'layan', + 'melayankan': 'layan', + 'dilayang': 'layang', + 'dilayangkan': 'layang', + 'dilayangkannya': 'layang', + 'dilayangi': 'layang', + 'dilayangan': 'layang', + 'melayang': 'layang', + 'melayangnya': 'layang', + 'melayanglah': 'layang', + 'melayangkan': 'layang', + 'melayangkannya': 'layang', + 'melayangan': 'layang', + 'selayang': 'layang', + 'layangan': 'layang', + 'layangannya': 'layang', + 'terlayang': 'layang', + 'pelayangan': 'layang', + 'pelayangannya': 'layang', + 'layang-layang': 'layang', + 'layang-layangnya': 'layang', + 'layang-layangan': 'layang', + 'layang-layangku': 'layang', + 'melayang-layang': 'layang', + 'terlayang-layang': 'layang', + 'melayap': 'layap', + 'melayapi': 'layap', + 'terlayap': 'layap', + 'kelayapan': 'layap', + 'melayapkan': 'layap', + 'berlayapan': 'layap', + 'melayap-layap': 'layap', + 'berlayap-layapan': 'layap', + 'melayap-layapkan': 'layap', + 'pelayar': 'layar', + 'pelayaran': 'layar', + 'melayari': 'layar', + 'melayarinya': 'layar', + 'berlayar': 'layar', + 'berlayarnya': 'layar', + 'pelayarannya': 'layar', + 'pelayaranan': 'layar', + 'melayarkan': 'layar', + 'berpelayaran': 'layar', + 'melayas': 'layas', + 'melayaskan': 'layas', + 'pelayat': 'layat', + 'pelayatnya': 'layat', + 'pelayatan': 'layat', + 'melayat': 'layat', + 'melayatlah': 'layat', + 'melayuk': 'layuk', + 'melayur': 'layur', + 'melayut': 'layut', + 'kelaziman': 'lazim', + 'kelazimannya': 'lazim', + 'melazimkan': 'lazim', + 'melebar': 'lebar', + 'melebarnya': 'lebar', + 'melebarkan': 'lebar', + 'melebarkannya': 'lebar', + 'melebari': 'lebar', + 'selebar': 'lebar', + 'selebarnya': 'lebar', + 'selebari': 'lebar', + 'selebaran': 'lebar', + 'pelebaran': 'lebar', + 'pelebarannya': 'lebar', + 'memperlebar': 'lebar', + 'memperlebarnya': 'lebar', + 'berlebaran': 'lebaran', + 'berlebaranlah': 'lebaran', + 'melebas': 'lebas', + 'melebat': 'lebat', + 'melebatnya': 'lebat', + 'melebatkan': 'lebat', + 'melebih': 'lebih', + 'melebihkan': 'lebih', + 'melebihkannya': 'lebih', + 'melebihi': 'lebih', + 'terlebih': 'lebih', + 'terlebihi': 'lebih', + 'terlebihan': 'lebih', + 'melebihinya': 'lebih', + 'melebihiku': 'lebih', + 'berlebih': 'lebih', + 'berlebihnya': 'lebih', + 'berlebihkan': 'lebih', + 'berlebihi': 'lebih', + 'berlebihan': 'lebih', + 'kelebihan': 'lebih', + 'kelebihannya': 'lebih', + 'kelebihanku': 'lebih', + 'kelebihanmu': 'lebih', + 'berlebihannya': 'lebih', + 'berlebihanlah': 'lebih', + 'berlebihanan': 'lebih', + 'selebihnya': 'lebih', + 'lebih-lebih': 'lebih', + 'lebih-lebihkan': 'lebih', + 'berkelebihan': 'lebih', + 'melebih-lebihi': 'lebih', + 'berlebih-lebih': 'lebih', + 'berlebih-lebihkan': 'lebih', + 'berlebih-lebihan': 'lebih', + 'terlebih-lebih': 'lebih', + 'berlebih-lebihannya': 'lebih', + 'melebih-lebihkan': 'lebih', + 'melebih-lebihkannya': 'lebih', + 'melebuhkan': 'lebuh', + 'melebuk': 'lebuk', + 'melebun': 'lebun', + 'leburan': 'lebur', + 'melebur': 'lebur', + 'meleburnya': 'lebur', + 'meleburkan': 'lebur', + 'meleburkannya': 'lebur', + 'terlebur': 'lebur', + 'peleburan': 'lebur', + 'peleburannya': 'lebur', + 'keleburan': 'lebur', + 'berlecah': 'lecah', + 'terlecah': 'lecah', + 'meleceh': 'leceh', + 'melecehkan': 'leceh', + 'melecehkannya': 'leceh', + 'melecehan': 'leceh', + 'peleceh': 'leceh', + 'pelecehan': 'leceh', + 'pelecehannya': 'leceh', + 'melecek': 'lecek', + 'melecekkan': 'lecek', + 'melecekan': 'lecek', + 'melecit': 'lecit', + 'melecun': 'lecun', + 'melecur': 'lecur', + 'melecurkan': 'lecur', + 'pelecut': 'lecut', + 'pelecutnya': 'lecut', + 'pelecutan': 'lecut', + 'melecut': 'lecut', + 'melecutnya': 'lecut', + 'melecutkan': 'lecut', + 'melecuti': 'lecut', + 'peledak': 'ledak', + 'peledaknya': 'ledak', + 'peledakkan': 'ledak', + 'peledakan': 'ledak', + 'ledakan': 'ledak', + 'ledakannya': 'ledak', + 'meledak': 'ledak', + 'meledaknya': 'ledak', + 'meledaklah': 'ledak', + 'meledakkan': 'ledak', + 'meledakkannya': 'ledak', + 'meledakan': 'ledak', + 'peledakannya': 'ledak', + 'meledakkanku': 'ledak', + 'terledakkan': 'ledak', + 'meledang': 'ledang', + 'meledek': 'ledek', + 'meledeknya': 'ledek', + 'meledekkan': 'ledek', + 'meledekku': 'ledek', + 'meledeki': 'ledek', + 'meledekiku': 'ledek', + 'meleding': 'leding', + 'meledos': 'ledos', + 'meleduk': 'leduk', + 'meledung': 'ledung', + 'meledungkan': 'ledung', + 'kelegaan': 'lega', + 'kelegaannya': 'lega', + 'melegakan': 'lega', + 'melegakannya': 'lega', + 'melegalkan': 'legal', + 'melegalkannya': 'legal', + 'melegalisasi': 'legalisasi', + 'melegalisasinya': 'legalisasi', + 'melegalisasikan': 'legalisasi', + 'melegalisasikannya': 'legalisasi', + 'melegenda': 'legenda', + 'melegendanya': 'legenda', + 'melegendakan': 'legenda', + 'melegendaris': 'legendaris', + 'melegitimasikan': 'legitimasi', + 'melego': 'lego', + 'melegonya': 'lego', + 'melegu': 'legu', + 'legum-legum': 'legum', + 'berlegung': 'legung', + 'berleha-leha': 'leha-leha', + 'meleja': 'leja', + 'pelejang': 'lejang', + 'melejang': 'lejang', + 'selejang': 'lejang', + 'melejangkan': 'lejang', + 'melejang-lejangkan': 'lejang', + 'melejit': 'lejit', + 'melejitnya': 'lejit', + 'melejitkan': 'lejit', + 'terleka': 'leka', + 'melekam': 'lekam', + 'melekang': 'lekang', + 'melekangkan': 'lekang', + 'melekap': 'lekap', + 'melekapkan': 'lekap', + 'melekari': 'lekar', + 'melekaskan': 'lekas', + 'selekasnya': 'lekas', + 'selekasnyalah': 'lekas', + 'lekas-lekas': 'lekas', + 'memperlekas': 'lekas', + 'berlekas-lekas': 'lekas', + 'selekas-lekasnya': 'lekas', + 'berlekas-lekasan': 'lekas', + 'lekatan': 'lekat', + 'lekatannya': 'lekat', + 'melekat': 'lekat', + 'melekatnya': 'lekat', + 'melekatlah': 'lekat', + 'melekatkan': 'lekat', + 'melekatkannya': 'lekat', + 'melekati': 'lekat', + 'terlekat': 'lekat', + 'melekatinya': 'lekat', + 'berlekat': 'lekat', + 'berlekatan': 'lekat', + 'pelekatan': 'lekat', + 'pelekatannya': 'lekat', + 'lekat-lekat': 'lekat', + 'berlekat-lekat': 'lekat', + 'melekokkan': 'lekok', + 'meleku': 'leku', + 'melekukan': 'lekuk', + 'melekuk': 'lekuk', + 'melekukkan': 'lekuk', + 'berlekuk': 'lekuk', + 'berlekuk-lekuk': 'lekuk', + 'melela': 'lela', + 'melelakan': 'lela', + 'berlela': 'lela', + 'melelah': 'lelah', + 'melelahkan': 'lelah', + 'melelahkannya': 'lelah', + 'kelelahan': 'lelah', + 'kelelahannya': 'lelah', + 'kelelahankan': 'lelah', + 'memperlelah': 'lelah', + 'melelai': 'lelai', + 'melelaikan': 'lelai', + 'melelang': 'lelang', + 'melelangnya': 'lelang', + 'melelangkan': 'lelang', + 'pelelangan': 'lelang', + 'pelelangannya': 'lelang', + 'perlelangan': 'lelang', + 'memperlelangkan': 'lelang', + 'terlelap': 'lelap', + 'terlelapnya': 'lelap', + 'melelapkan': 'lelap', + 'memperlelar': 'lelar', + 'diperlelarkan': 'lelar', + 'memperlelarkan': 'lelar', + 'melelas': 'lelas', + 'meleleh': 'leleh', + 'melelehnya': 'leleh', + 'melelehkan': 'leleh', + 'melelehkannya': 'leleh', + 'berlelehan': 'leleh', + 'meleleh-leleh': 'leleh', + 'melelepkan': 'lelep', + 'meleler': 'leler', + 'keleleran': 'leler', + 'berleleran': 'leler', + 'berlelewa': 'lelewa', + 'berleluasa': 'leluasa', + 'keleluasaan': 'leluasa', + 'keleluasaannya': 'leluasa', + 'meleluasakan': 'leluasa', + 'berlelucon': 'lelucon', + 'mengelem': 'lem', + 'mengelemnya': 'lem', + 'kelemahan': 'lemah', + 'kelemahannya': 'lemah', + 'kelemahanan': 'lemah', + 'kelemahanku': 'lemah', + 'kelemahanmu': 'lemah', + 'melemahkan': 'lemah', + 'melemahkannya': 'lemah', + 'melemahkankan': 'lemah', + 'melemahkan-mu': 'lemah', + 'memperlemahkan': 'lemah', + 'melemang': 'lemang', + 'melemaskan': 'lemas', + 'melemaskannya': 'lemas', + 'melembaga': 'lembaga', + 'melembaganya': 'lembaga', + 'melembagakan': 'lembaga', + 'melembagakannya': 'lembaga', + 'berlembaga': 'lembaga', + 'pelembagaan': 'lembaga', + 'pelembagaannya': 'lembaga', + 'kelembagaan': 'lembaga', + 'kelembagaannya': 'lembaga', + 'perlembagaan': 'lembaga', + 'melembai': 'lembai', + 'melembak': 'lembak', + 'melembakan': 'lembak', + 'melembang': 'lembang', + 'lembaran': 'lembar', + 'lembarannya': 'lembar', + 'melembarkan': 'lembar', + 'melembek': 'lembek', + 'melembekkan': 'lembek', + 'kelembekan': 'lembek', + 'melembing': 'lembing', + 'melembung': 'lembung', + 'melembungnya': 'lembung', + 'pelembungan': 'lembung', + 'melembungkan': 'lembung', + 'melembur': 'lembur', + 'melemburkan': 'lembur', + 'melempai': 'lempai', + 'terlempai': 'lempai', + 'berlempaian': 'lempai', + 'melempang': 'lempang', + 'melempangkan': 'lempang', + 'melempap': 'lempap', + 'lemparan': 'lempar', + 'lemparannya': 'lempar', + 'melempar': 'lempar', + 'melemparnya': 'lempar', + 'melemparlah': 'lempar', + 'melemparkan': 'lempar', + 'melemparkannya': 'lempar', + 'melempari': 'lempar', + 'melemparan': 'lempar', + 'melemparku': 'lempar', + 'melemparmu': 'lempar', + 'pelempar': 'lempar', + 'pelemparnya': 'lempar', + 'pelemparan': 'lempar', + 'sepelempar': 'lempar', + 'sepelemparan': 'lempar', + 'melemparkanku': 'lempar', + 'melemparkanmu': 'lempar', + 'lempar-lemparan': 'lempar', + 'berlempar-lemparan': 'lempar', + 'melempem': 'lempem', + 'melempemnya': 'lempem', + 'melempengkan': 'lempeng', + 'lemping': 'lempit', + 'melempit': 'lempit', + 'melemping': 'lempit', + 'melempuh': 'lempuh', + 'berlempuk': 'lempuk', + 'berlena': 'lena', + 'terlena': 'lena', + 'terlenanya': 'lena', + 'terlenakan': 'lena', + 'kelenaan': 'lena', + 'berlena-lena': 'lena', + 'melencangkan': 'lencang', + 'melencit': 'lencit', + 'melenda': 'lenda', + 'melendeh': 'lendeh', + 'melendot': 'lendot', + 'lendotan': 'lendot', + 'melendoti': 'lendot', + 'lendungan': 'lendung', + 'melendung': 'lendung', + 'lendutan': 'lendut', + 'melendut': 'lendut', + 'pelengah': 'lengah', + 'melengah': 'lengah', + 'melengahkan': 'lengah', + 'terlengah': 'lengah', + 'kelengahan': 'lengah', + 'kelengahannya': 'lengah', + 'memperlengah': 'lengah', + 'melengah-lengah': 'lengah', + 'berlengah-lengah': 'lengah', + 'memperlengah-lengah': 'lengah', + 'memperlengah-lengahkan': 'lengah', + 'melengak': 'lengak', + 'terlengar': 'lengar', + 'melengas': 'lengas', + 'melengaskan': 'lengas', + 'melengat': 'lengat', + 'melenge': 'lenge', + 'melenggak': 'lenggak', + 'melenggakan': 'lenggak', + 'melenggakkan': 'lenggak', + 'berlenggek': 'lenggek', + 'memperlenggekkan': 'lenggek', + 'berlenggek-lenggek': 'lenggek', + 'lenggak-lenggok': 'lenggok', + 'lenggak-lenggoknya': 'lenggok', + 'lenggok-lenggok': 'lenggok', + 'berlenggok-lenggok': 'lenggok', + 'berlenggak-lenggok': 'lenggok', + 'melenggong': 'lenggong', + 'melenggor': 'lenggor', + 'melenggut': 'lenggut', + 'lenggut-lenggut': 'lenggut', + 'pelengkap': 'lengkap', + 'pelengkapnya': 'lengkap', + 'pelengkapan': 'lengkap', + 'selengkap': 'lengkap', + 'selengkapnya': 'lengkap', + 'selengkapkan': 'lengkap', + 'melengkapi': 'lengkap', + 'melengkapinya': 'lengkap', + 'melengkapiku': 'lengkap', + 'melengkapimu': 'lengkap', + 'berlengkap': 'lengkap', + 'kelengkapan': 'lengkap', + 'kelengkapannya': 'lengkap', + 'kelengkapanan': 'lengkap', + 'pelengkapannya': 'lengkap', + 'perlengkapan': 'lengkap', + 'perlengkapannya': 'lengkap', + 'perlengkapanmu': 'lengkap', + 'berlengkapan': 'lengkap', + 'melengkapkan': 'lengkap', + 'memperlengkapi': 'lengkap', + 'memperlengkapinya': 'lengkap', + 'berlengkesa': 'lengkesa', + 'melengket': 'lengket', + 'melengketkan': 'lengket', + 'berlengket': 'lengket', + 'terlengket': 'lengket', + 'lengket-lengket': 'lengket', + 'melengking': 'lengking', + 'belengkok': 'lengkok', + 'berlengkok': 'lengkok', + 'belengkokan': 'lengkok', + 'berlengkokan': 'lengkok', + 'lengkungan': 'lengkung', + 'lengkungannya': 'lengkung', + 'melengkung': 'lengkung', + 'melengkungnya': 'lengkung', + 'melengkungkan': 'lengkung', + 'pelengkung': 'lengkung', + 'pelengkungan': 'lengkung', + 'melengkungi': 'lengkung', + 'terlengkung': 'lengkung', + 'kelengkungan': 'lengkung', + 'kelengkungannya': 'lengkung', + 'melengkur': 'lengkur', + 'melengos': 'lengos', + 'melengser': 'lengser', + 'melengserkan': 'lengser', + 'melengserkannya': 'lengser', + 'belengset': 'lengset', + 'melenguh': 'lenguh', + 'melengung': 'lengung', + 'melenja': 'lenja', + 'melenjan': 'lenjan', + 'berlenso': 'lenso', + 'melentang': 'lentang', + 'terlentang': 'lentang', + 'terlentangnya': 'lentang', + 'lentang-lentung': 'lentang', + 'melentik': 'lentik', + 'melentikkan': 'lentik', + 'melentikkannya': 'lentik', + 'melentikan': 'lentik', + 'melenting': 'lenting', + 'melentingnya': 'lenting', + 'melentingkan': 'lenting', + 'berlenting': 'lenting', + 'kelentingan': 'lenting', + 'lentang-lentok': 'lentok', + 'melentuk': 'lentuk', + 'terlentuk': 'lentuk', + 'melentukkan': 'lentuk', + 'melentung': 'lentung', + 'telentung': 'lentung', + 'melentur': 'lentur', + 'melenturnya': 'lentur', + 'melenturkan': 'lentur', + 'melenturkannya': 'lentur', + 'pelenturan': 'lentur', + 'pelenturannya': 'lentur', + 'kelenturan': 'lentur', + 'kelenturannya': 'lentur', + 'melenyeh': 'lenyeh', + 'melenyut': 'lenyut', + 'meleot': 'leot', + 'melepa': 'lepa', + 'melepakan': 'lepa', + 'terlepa': 'lepa', + 'lepa-lepa': 'lepa', + 'melepak': 'lepak', + 'terlepap': 'lepap', + 'melepek': 'lepek', + 'melepes': 'lepes', + 'melepih': 'lepih', + 'melepit': 'lepit', + 'melepoh': 'lepoh', + 'terlepoh': 'lepoh', + 'melepoti': 'lepot', + 'berlepotan': 'lepot', + 'melepuh': 'lepuh', + 'melepuhnya': 'lepuh', + 'melepuhkan': 'lepuh', + 'pelepuhan': 'lepuh', + 'melepur': 'lepur', + 'pelerai': 'lerai', + 'peleraian': 'lerai', + 'leraian': 'lerai', + 'meleraikan': 'lerai', + 'meleraikannya': 'lerai', + 'terleraikan': 'lerai', + 'melerak': 'lerak', + 'melerakan': 'lerak', + 'melerakkan': 'lerak', + 'lerang-lerang': 'lerang', + 'melereng': 'lereng', + 'lerengan': 'lereng', + 'berlereng': 'lereng', + 'lereng-lereng': 'lereng', + 'lereng-lerengnya': 'lereng', + 'leret': 'leri', + 'leretan': 'leri', + 'seleret': 'leri', + 'meleret': 'leri', + 'berleret': 'leri', + 'meleretkan': 'leri', + 'berleret-leret': 'leri', + 'melerok': 'lerok', + 'berlerot': 'lerot', + 'melesak': 'lesak', + 'melesakkan': 'lesak', + 'melesakkannya': 'lesak', + 'melesakan': 'lesak', + 'melesang': 'lesang', + 'pelesapan': 'lesap', + 'pelesapannya': 'lesap', + 'melesapkan': 'lesap', + 'lesehan': 'leseh', + 'lesehannya': 'leseh', + 'berlesehan': 'leseh', + 'melesing': 'lesing', + 'belesir': 'lesir', + 'berlesir': 'lesir', + 'melesit': 'lesit', + 'pelesit': 'lesit', + 'melesot': 'lesot', + 'pelestari': 'lestari', + 'pelestarikan': 'lestari', + 'pelestarian': 'lestari', + 'kelestarian': 'lestari', + 'kelestariannya': 'lestari', + 'pelestariannya': 'lestari', + 'melestarikan': 'lestari', + 'melestarikannya': 'lestari', + 'meletakan': 'letak', + 'meletakannya': 'leta', + 'letah-letai': 'letai', + 'meletak': 'letak', + 'meletakkan': 'letak', + 'meletakkannya': 'letak', + 'terletak': 'letak', + 'terletaknya': 'letak', + 'terletaklah': 'letak', + 'terletakan': 'letak', + 'peletakan': 'letak', + 'peletakannya': 'letak', + 'meletakkanku': 'letak', + 'meletakkanmu': 'letak', + 'beleter': 'leter', + 'peleter': 'leter', + 'meleter': 'leter', + 'meleterkan': 'leter', + 'meletik': 'letik', + 'meleting': 'leting', + 'berleting': 'leting', + 'meletis': 'letis', + 'meletos': 'letos', + 'letuk-letuk': 'letuk', + 'letum-letum': 'letum', + 'letupan': 'letup', + 'letupannya': 'letup', + 'meletup': 'letup', + 'meletupnya': 'letup', + 'meletuplah': 'letup', + 'meletupkan': 'letup', + 'meletupkannya': 'letup', + 'peletup': 'letup', + 'peletupan': 'letup', + 'letup-letup': 'letup', + 'letusan': 'letus', + 'letusannya': 'letus', + 'meletus': 'letus', + 'meletusnya': 'letus', + 'meletuslah': 'letus', + 'meletuskan': 'letus', + 'meletuskannya': 'letus', + 'meletusi': 'letus', + 'meletusan': 'letus', + 'peletusan': 'letus', + 'melever': 'lever', + 'melewa': 'lewa', + 'melewakan': 'lewa', + 'melewai': 'lewa', + 'melewar': 'lewar', + 'melewari': 'lewar', + 'melewarkan': 'lewar', + 'lewat waktu': 'terlewat', + 'leyeh-leyeh': 'leyeh', + 'meleyot': 'leyot', + 'berlezat': 'lezat', + 'kelezatan': 'lezat', + 'kelezatannya': 'lezat', + 'melezatkan': 'lezat', + 'liang-liut': 'liang', + 'liang-liuk': 'liang', + 'berliang-liuk': 'liang', + 'liaran': 'liar', + 'liarannya': 'liar', + 'meliat': 'liat', + 'meliatkan': 'liat', + 'meliau': 'liau', + 'melibas': 'libas', + 'melibasnya': 'libas', + 'pelibasan': 'libas', + 'melibat': 'libat', + 'melibatnya': 'libat', + 'melibatkan': 'libat', + 'melibatkannya': 'libat', + 'melibati': 'libat', + 'melibatan': 'libat', + 'berlibat': 'libat', + 'terlibat': 'libat', + 'terlibatnya': 'libat', + 'terlibatlah': 'libat', + 'terlibatkan': 'libat', + 'terlibatan': 'libat', + 'pelibatan': 'libat', + 'pelibatannya': 'libat', + 'melibatkankan': 'libat', + 'melibatkanku': 'libat', + 'keterlibatan': 'libat', + 'keterlibatannya': 'libat', + 'keterlibatanan': 'libat', + 'keterlibatanku': 'libat', + 'keterlibatanmu': 'libat', + 'berlibat-libat': 'libat', + 'peliberalan': 'liberal', + 'meliberalisasi': 'liberalisasi', + 'meliberalisasikan': 'liberalisasi', + 'pelicin': 'licin', + 'pelicinnya': 'licin', + 'kelicinan': 'licin', + 'kelicinannya': 'licin', + 'melicinkan': 'licin', + 'melicinkannya': 'licin', + 'berlidah': 'lidah', + 'melidahkan': 'lidah', + 'berligar-ligar': 'ligar', + 'meligas': 'ligas', + 'meligat': 'ligat', + 'meligih': 'ligih', + 'kelihaian': 'lihai', + 'kelihaiannya': 'lihai', + 'berlik': 'lik', + 'melikas': 'likas', + 'berliku-liku': 'liku', + 'berliku-likunya': 'liku', + 'melikuidasi': 'likuidasi', + 'melikuidasinya': 'likuidasi', + 'melikuidasikan': 'likuidasi', + 'likuran': 'likur', + 'berlikur-likur': 'likur', + 'melikut': 'likut', + 'melikuti': 'likut', + 'berlikut': 'likut', + 'melilah': 'lilah', + 'melilau': 'lilau', + 'melilin': 'lilin', + 'lilitan': 'lilit', + 'lilitannya': 'lilit', + 'melilit': 'lilit', + 'melilitnya': 'lilit', + 'melilitkan': 'lilit', + 'melilitkannya': 'lilit', + 'meliliti': 'lilit', + 'melilitku': 'lilit', + 'selilit': 'lilit', + 'selilitan': 'lilit', + 'berlilit': 'lilit', + 'berlilitkan': 'lilit', + 'berlima': 'lima', + 'seperlima': 'lima', + 'seperlimanya': 'lima', + 'limasan': 'limas', + 'pelimau': 'limau', + 'berlimau': 'limau', + 'melimaui': 'limau', + 'pelimbahan': 'limbah', + 'melimbai': 'limbai', + 'melimbaikan': 'limbai', + 'berlimbak-limbak': 'limbak', + 'melimbang': 'limbang', + 'pelimbang': 'limbang', + 'limbukan': 'limbuk', + 'limbungan': 'limbung', + 'melimbur': 'limbur', + 'dilimbur': 'limbur', + 'berlimpa': 'limpa', + 'limpahan': 'limpah', + 'limpahannya': 'limpah', + 'melimpah': 'limpah', + 'melimpahnya': 'limpah', + 'melimpahlah': 'limpah', + 'melimpahkan': 'limpah', + 'melimpahkannya': 'limpah', + 'melimpahi': 'limpah', + 'melimpahan': 'limpah', + 'melimpahinya': 'limpah', + 'kelimpahan': 'limpah', + 'kelimpahannya': 'limpah', + 'pelimpahan': 'limpah', + 'pelimpahannya': 'limpah', + 'melimpah-limpah': 'limpah', + 'berlimpah-limpah': 'limpah', + 'berlimpap': 'limpap', + 'berlimpap-limpap': 'limpap', + 'terlimpas': 'limpas', + 'melimpaui': 'limpau', + 'memperlimpitkan': 'limpit', + 'berlimpit-limpit': 'limpit', + 'limunan': 'limun', + 'melimut': 'limut', + 'berlinang': 'linang', + 'berlinangnya': 'linang', + 'berlinangkan': 'linang', + 'berlinangan': 'linang', + 'berlinang-linang': 'linang', + 'selincam': 'lincam', + 'melincam': 'lincam', + 'terlincir': 'lincir', + 'melincirkan': 'lincir', + 'berlindak-lindak': 'lindak', + 'melindang': 'lindang', + 'melindangkan': 'lindang', + 'melindap': 'lindap', + 'lindas': 'lindi', + 'lindasan': 'lindi', + 'pelindas': 'lindi', + 'pelindasan': 'lindi', + 'melindas': 'lindi', + 'melindasnya': 'lindi', + 'melindaskan': 'lindi', + 'melindasi': 'lindi', + 'melindasku': 'lindi', + 'melindik': 'lindik', + 'melindis': 'lindis', + 'pelindis': 'lindis', + 'melindur': 'lindur', + 'melingar': 'lingar', + 'melingarkan': 'lingar', + 'melingari': 'lingar', + 'linggisan': 'linggis', + 'melinggis': 'linggis', + 'lingkaran': 'lingkar', + 'lingkarannya': 'lingkar', + 'melingkar': 'lingkar', + 'melingkarnya': 'lingkar', + 'melingkarkan': 'lingkar', + 'melingkarkannya': 'lingkar', + 'melingkari': 'lingkar', + 'melingkarinya': 'lingkar', + 'terlingkar': 'lingkar', + 'berlingkar': 'lingkar', + 'melingkis': 'lingkis', + 'selingkung': 'lingkung', + 'selingkungan': 'lingkung', + 'melingkung': 'lingkung', + 'melingkungi': 'lingkung', + 'lingkungan': 'lingkung', + 'lingkungannya': 'lingkung', + 'lingkunganlah': 'lingkung', + 'lingkunganan': 'lingkung', + 'lingkunganku': 'lingkung', + 'lingkunganmu': 'lingkung', + 'terlingkung': 'lingkung', + 'melingkunginya': 'lingkung', + 'melingkup': 'lingkup', + 'melingkupi': 'lingkup', + 'melingkupinya': 'lingkup', + 'melingkupiku': 'lingkup', + 'terlingkup': 'lingkup', + 'terlingkupi': 'lingkup', + 'kelinglungan': 'linglung', + 'melinglungkan': 'linglung', + 'melingsirkan': 'lingsir', + 'kelinieran': 'linier', + 'melinjak': 'linjak', + 'melinjaknya': 'linjak', + 'melintah': 'lintah', + 'lintangan': 'lintang', + 'melintang': 'lintang', + 'melintangnya': 'lintang', + 'melintangkan': 'lintang', + 'melintangkannya': 'lintang', + 'melintangi': 'lintang', + 'terlintang': 'lintang', + 'lintang pukang': 'lintangan', + 'selintas': 'lintas', + 'selintasan': 'lintas', + 'lintasan': 'lintas', + 'lintasannya': 'lintas', + 'pelintas': 'lintas', + 'pelintasan': 'lintas', + 'melintas': 'lintas', + 'melintasnya': 'lintas', + 'melintaslah': 'lintas', + 'melintaskan': 'lintas', + 'melintasi': 'lintas', + 'melintasinya': 'lintas', + 'terlintas': 'lintas', + 'terlintasnya': 'lintas', + 'terlintaslah': 'lintas', + 'terlintasi': 'lintas', + 'pelintasannya': 'lintas', + 'kelintasan': 'lintas', + 'perlintasan': 'lintas', + 'perlintasannya': 'lintas', + 'melinting': 'linting', + 'lintingan': 'linting', + 'lintingannya': 'linting', + 'pelintingan': 'linting', + 'melintir': 'lintir', + 'melintirnya': 'lintir', + 'pelintuh': 'lintuh', + 'melintup': 'lintup', + 'melinyak': 'linyak', + 'berlinyak': 'linyak', + 'melinyar': 'linyar', + 'berlipat ganda': 'lipat ganda', + 'melipatgandakan': 'lipat ganda', + 'melipatgandakannya': 'lipat ganda', + 'lipatan': 'lipat', + 'lipatannya': 'lipat', + 'melipat': 'lipat', + 'melipatnya': 'lipat', + 'melipatkan': 'lipat', + 'melipati': 'lipat', + 'melipatan': 'lipat', + 'pelipat': 'lipat', + 'pelipatnya': 'lipat', + 'pelipatan': 'lipat', + 'berlipat': 'lipat', + 'berlipatnya': 'lipat', + 'berlipatlah': 'lipat', + 'kelipatan': 'lipat', + 'kelipatannya': 'lipat', + 'peliputan': 'lipat', + 'peliputannya': 'lipat', + 'perlipatan': 'lipat', + 'lipat-melipat': 'lipat', + 'berlipat-lipat': 'lipat', + 'pelipit': 'lipit', + 'pelipitan': 'lipit', + 'melipit': 'lipit', + 'melipitnya': 'lipit', + 'melipiti': 'lipit', + 'melipur': 'lipur', + 'pelipur': 'lipur', + 'melipurkan': 'lipur', + 'meliput': 'liput', + 'meliputnya': 'liput', + 'meliputi': 'liput', + 'meliputan': 'liput', + 'liputan': 'liput', + 'liputannya': 'liput', + 'meliputinya': 'liput', + 'meliputii': 'liput', + 'terliput': 'liput', + 'terliputi': 'liput', + 'lirikan': 'lirik', + 'lirikannya': 'lirik', + 'melirik': 'lirik', + 'meliriknya': 'lirik', + 'melirikkan': 'lirik', + 'melirikan': 'lirik', + 'melirikmu': 'lirik', + 'selirik': 'lirik', + 'melisankan': 'lisan', + 'berlistrik': 'listrik', + 'kelistrikan': 'listrik', + 'kelistrikannya': 'listrik', + 'perlistrikan': 'listrik', + 'perlistrikannya': 'listrik', + 'melisutkan': 'lisut', + 'literan': 'liter', + 'literannya': 'liter', + 'literanlah': 'liter', + 'melitsus': 'litsus', + 'meliuk': 'liuk', + 'meliuknya': 'liuk', + 'meliuklah': 'liuk', + 'meliukkan': 'liuk', + 'meliukan': 'liuk', + 'terliuk': 'liuk', + 'meliuki': 'liuk', + 'sepeliuk': 'liuk', + 'meliuk-liuk': 'liuk', + 'meliuk-liukkan': 'liuk', + 'meliuk-liukkannya': 'liuk', + 'meliuk-liukan': 'liuk', + 'terliuk-liuk': 'liuk', + 'meliuri': 'liur', + 'berliur': 'liur', + 'liat-liut': 'liut', + 'meloak': 'loak', + 'meloakkannya': 'loak', + 'loakan': 'loak', + 'meloakkan': 'loak', + 'pelobi': 'lobi', + 'pelobinya': 'lobi', + 'pelobian': 'lobi', + 'melobi': 'lobi', + 'melobinya': 'lobi', + 'melocok': 'locok', + 'pelocok': 'locok', + 'melocot': 'locot', + 'loh jinawi': 'loh', + 'meloka': 'loka', + 'berlokakarya': 'lokakarya', + 'melokalkan': 'lokal', + 'melokalisasi': 'lokalisasi', + 'melokalisasikan': 'lokalisasi', + 'terlokalisasi': 'lokalisasi', + 'terlokalisasikan': 'lokalisasi', + 'melokap': 'lokap', + 'berlokasi': 'lokasi', + 'berlokasinya': 'lokasi', + 'berlokasikan': 'lokasi', + 'meloloh': 'loloh', + 'melolong': 'lolong', + 'terlolong': 'lolong', + 'melolong-lolong': 'lolong', + 'terlolong-lolong': 'lolong', + 'meloloskan': 'lolos', + 'meloloskannya': 'lolos', + 'berlomba': 'lomba', + 'berlombanya': 'lomba', + 'berlombalah': 'lomba', + 'perlombaan': 'lomba', + 'perlombaannya': 'lomba', + 'berlomba-lomba': 'lomba', + 'berlomba-lombalah': 'lomba', + 'memperlombakan': 'lomba', + 'melombar': 'lombar', + 'melombong': 'lombong', + 'pelombongan': 'lombong', + 'melomot': 'lomot', + 'melompat': 'lompat', + 'melompatnya': 'lompat', + 'melompatlah': 'lompat', + 'melompatkan': 'lompat', + 'melompati': 'lompat', + 'pelompat': 'lompat', + 'pelompatan': 'lompat', + 'lompatan': 'lompat', + 'lompatannya': 'lompat', + 'lompatanku': 'lompat', + 'lompatanmu': 'lompat', + 'melompatinya': 'lompat', + 'terlompat': 'lompat', + 'terlompati': 'lompat', + 'sepelompat': 'lompat', + 'berlompatan': 'lompat', + 'sepelompatan': 'lompat', + 'melompat-lompat': 'lompat', + 'melompat-lompatlah': 'lompat', + 'berlompok-lompok': 'lompok', + 'melompong': 'lompong', + 'melompongnya': 'lompong', + 'meloncat': 'loncat', + 'meloncatnya': 'loncat', + 'meloncatlah': 'loncat', + 'meloncati': 'loncat', + 'loncatan': 'loncat', + 'loncatannya': 'loncat', + 'loncatanku': 'loncat', + 'meloncatkan': 'loncat', + 'berloncatan': 'loncat', + 'meloncat-loncat': 'loncat', + 'berloncat-loncatan': 'loncat', + 'melonceng': 'lonceng', + 'meloncer': 'loncer', + 'melonco-lonco': 'lonco', + 'melondong': 'londong', + 'melondongkan': 'londong', + 'meloneng': 'loneng', + 'melongak-longok': 'longak-longok', + 'longitudinal': 'longmars', + 'melongo': 'longo', + 'melongokan': 'longo', + 'melongok': 'longok', + 'melongoknya': 'longok', + 'melongokkan': 'longok', + 'terlongong-longong': 'longong', + 'melonjak': 'lonjak', + 'melonjaknya': 'lonjak', + 'melonjaklah': 'lonjak', + 'melonjakkan': 'lonjak', + 'melonjakan': 'lonjak', + 'terlonjak': 'lonjak', + 'pelonjakan': 'lonjak', + 'melonjak-lonjak': 'lonjak', + 'melonjak-lonjakkan': 'lonjak', + 'lonjoran': 'lonjor', + 'terlonsong': 'lonsong', + 'melontai': 'lontai', + 'melontar': 'lontar', + 'melontarnya': 'lontar', + 'melontarkan': 'lontar', + 'melontarkannya': 'lontar', + 'melontari': 'lontar', + 'lontaran': 'lontar', + 'lontarannya': 'lontar', + 'pelontar': 'lontar', + 'pelontarnya': 'lontar', + 'pelontaran': 'lontar', + 'sepelontar': 'lontar', + 'berlontaran': 'lontar', + 'melontarkankan': 'lontar', + 'berlopak': 'lopak', + 'lopak-lopak': 'lopak', + 'lopak-lapik': 'lopak', + 'berlopak-lopak': 'lopak', + 'melorot': 'lorot', + 'melorotnya': 'lorot', + 'melorotkan': 'lorot', + 'meloroti': 'lorot', + 'mengeloskan': 'los', + 'meloso': 'loso', + 'melotrekan': 'lotre', + 'melotrekannya': 'lotre', + 'lowongan': 'lowong', + 'lowongannya': 'lowong', + 'melowongkan': 'lowong', + 'meloya': 'loya', + 'keloyoan': 'loyo', + 'meloyong': 'loyong', + 'meluah': 'luah', + 'meluahkan': 'luah', + 'meluaki': 'luak', + 'meluang': 'luang', + 'meluangkan': 'luang', + 'meluangkannya': 'luang', + 'meluangan': 'luang', + 'peluang': 'luang', + 'peluangnya': 'luang', + 'peluanglah': 'luang', + 'peluangan': 'luang', + 'peluangku': 'luang', + 'peluangmu': 'luang', + 'terluang': 'luang', + 'keluangan': 'luang', + 'meluangkankan': 'luang', + 'meluap': 'luap', + 'meluapnya': 'luap', + 'meluaplah': 'luap', + 'meluapkan': 'luap', + 'meluapkannya': 'luap', + 'meluapi': 'luap', + 'luapan': 'luap', + 'luapannya': 'luap', + 'luaran': 'luar', + 'luarannya': 'luar', + 'meluar': 'luar', + 'meluarkan': 'luar', + 'meluarkannya': 'luar', + 'meluat': 'luat', + 'meluber': 'luber', + 'melubernya': 'luber', + 'meluberkan': 'luber', + 'meluberi': 'luber', + 'melucu': 'lucu', + 'melucunya': 'lucu', + 'berlucu': 'lucu', + 'kelucuan': 'lucu', + 'kelucuannya': 'lucu', + 'melucup': 'lucup', + 'melucut': 'lucut', + 'melucuti': 'lucut', + 'lucutan': 'lucut', + 'terlucut': 'lucut', + 'terlucuti': 'lucut', + 'melucutinya': 'lucut', + 'melucutkan': 'lucut', + 'perlucutan': 'lucut', + 'kelugasan': 'lugas', + 'kelugasannya': 'lugas', + 'keluguan': 'lugu', + 'keluguannya': 'lugu', + 'keluhuran': 'luhur', + 'keluhurannya': 'luhur', + 'meluhurkan': 'luhur', + 'meluik': 'luik', + 'berluk': 'luk', + 'melukai': 'luka', + 'melukainya': 'luka', + 'melukaiku': 'luka', + 'melukaimu': 'luka', + 'terluka': 'luka', + 'terlukanya': 'luka', + 'terlukai': 'luka', + 'pelukaan': 'luka', + 'perlukaan': 'luka', + 'melukah': 'lukah', + 'melukat': 'lukat', + 'lukisan': 'lukis', + 'lukisannya': 'lukis', + 'lukisanku': 'lukis', + 'lukisanmu': 'lukis', + 'pelukis': 'lukis', + 'pelukisnya': 'lukis', + 'pelukisan': 'lukis', + 'pelukismu': 'lukis', + 'melukis': 'lukis', + 'melukisnya': 'lukis', + 'melukiskan': 'lukis', + 'melukiskannya': 'lukis', + 'melukisi': 'lukis', + 'melukisan': 'lukis', + 'terlukis': 'lukis', + 'terlukiskan': 'lukis', + 'meluku': 'luku', + 'melukukan': 'luku', + 'meluli': 'luli', + 'luluhan': 'luluh', + 'meluluhkan': 'luluh', + 'meluluhkannya': 'luluh', + 'meluluhlantakkan': 'luluh lantak', + 'meluluhlantakkannya': 'luluh lantak', + 'meluluk': 'luluk', + 'melulukan': 'luluk', + 'peluluk': 'luluk', + 'pelulukan': 'luluk', + 'terluluk': 'luluk', + 'berluluk': 'luluk', + 'melulum': 'lulum', + 'melulur': 'lulur', + 'melulurkan': 'lulur', + 'meluluri': 'lulur', + 'selulus': 'lulus', + 'selulusnya': 'lulus', + 'lulusan': 'lulus', + 'lulusannya': 'lulus', + 'melulusi': 'lulus', + 'kelulusan': 'lulus', + 'kelulusannya': 'lulus', + 'kelulusanmu': 'lulus', + 'selulusan': 'lulus', + 'meluluskan': 'lulus', + 'meluluskannya': 'lulus', + 'melulut': 'lulut', + 'pelulut': 'lulut', + 'berlulut': 'lulut', + 'berlumang': 'lumang', + 'melumangkan': 'lumang', + 'melumari': 'lumar', + 'berlumar': 'lumar', + 'pelumas': 'lumas', + 'pelumasnya': 'lumas', + 'pelumaslah': 'lumas', + 'pelumasan': 'lumas', + 'melumas': 'lumas', + 'melumaskan': 'lumas', + 'melumasi': 'lumas', + 'lumatan': 'lumat', + 'pelumat': 'lumat', + 'melumatkan': 'lumat', + 'melumatkannya': 'lumat', + 'lumayan': 'lumbago', + 'lumayanlah': 'lumbago', + 'melumer': 'lumer', + 'melumerkan': 'lumer', + 'melumeri': 'lumer', + 'pelumer': 'lumer', + 'pelumeran': 'lumer', + 'melumpukkan': 'lumpuk', + 'kelumrahan': 'lumrah', + 'berlumus': 'lumus', + 'pelunak': 'lunak', + 'pelunakan': 'lunak', + 'melunak': 'lunak', + 'melunaknya': 'lunak', + 'melunakkan': 'lunak', + 'melunakkannya': 'lunak', + 'melunakan': 'lunak', + 'melunaki': 'lunak', + 'kelunakan': 'lunak', + 'memperlunak': 'lunak', + 'lunasan': 'lunas', + 'melunasi': 'lunas', + 'melunasinya': 'lunas', + 'melunaskan': 'lunas', + 'melunaskannya': 'lunas', + 'pelunauan': 'lunau', + 'meluncungkan': 'luncung', + 'peluncur': 'luncur', + 'peluncurnya': 'luncur', + 'peluncurkan': 'luncur', + 'peluncurkannya': 'luncur', + 'peluncuran': 'luncur', + 'meluncur': 'luncur', + 'meluncurnya': 'luncur', + 'meluncurlah': 'luncur', + 'meluncurkan': 'luncur', + 'meluncurkannya': 'luncur', + 'meluncuran': 'luncur', + 'meluncuri': 'luncur', + 'terluncur': 'luncur', + 'peluncurannya': 'luncur', + 'berseluncur': 'luncur', + 'meluncurkankan': 'luncur', + 'pelungguh': 'lungguh', + 'melungguh': 'lungguh', + 'terlungsar': 'lungsar', + 'lungsungan': 'lungsung', + 'melungsung': 'lungsung', + 'lungsuran': 'lungsur', + 'melungsur': 'lungsur', + 'melungsurkan': 'lungsur', + 'terlunjur': 'lunjur', + 'berlunjur': 'lunjur', + 'melunjurkan': 'lunjur', + 'terlunta': 'lunta', + 'terluntanya': 'lunta', + 'terlunta-lunta': 'lunta', + 'terlunta-luntanya': 'lunta', + 'peluntur': 'luntur', + 'pelunturan': 'luntur', + 'meluntur': 'luntur', + 'melunturnya': 'luntur', + 'melunturkan': 'luntur', + 'melunturi': 'luntur', + 'kelunturan': 'luntur', + 'melunyah': 'lunyah', + 'pelupa': 'lupa', + 'pelupanya': 'lupa', + 'terlupa': 'lupa', + 'terlupakan': 'lupa', + 'terlupakannya': 'lupa', + 'melupai': 'lupa', + 'kelupaan': 'lupa', + 'melupakan': 'lupa', + 'melupakannya': 'lupa', + 'melupakanku': 'lupa', + 'melupakanmu': 'lupa', + 'lupa-lupaan': 'lupa', + 'lupa-lupa ingat': 'lupa', + 'pelupuh': 'lupuh', + 'melupuh': 'lupuh', + 'melupuhkan': 'lupuh', + 'terluput': 'luput', + 'terluputkan': 'luput', + 'meluputkan': 'luput', + 'berlurah': 'lurah', + 'kelurahan': 'lurah', + 'kelurahannya': 'lurah', + 'kelurahani': 'lurah', + 'kelurahanan': 'lurah', + 'meluru': 'luru', + 'melurukan': 'luru', + 'luruban': 'lurub', + 'melurubi': 'lurub', + 'meluruh': 'luruh', + 'meluruhnya': 'luruh', + 'meluruhkan': 'luruh', + 'meluruhkannya': 'luruh', + 'peluruh': 'luruh', + 'peluruhnya': 'luruh', + 'peluruhan': 'luruh', + 'peluruhannya': 'luruh', + 'melurut': 'lurut', + 'berlusin': 'lusin', + 'berlusin-lusin': 'lusin', + 'melusuh': 'lusuh', + 'kelusuhan': 'lusuh', + 'kelusuhannya': 'lusuh', + 'melusuhkan': 'lusuh', + 'meluti': 'luti', + 'melutu': 'lutu', + 'berlutu': 'lutu', + 'bersilutu': 'lutu', + 'meluwengkan': 'luweng', + 'keluwesan': 'luwes', + 'keluwesannya': 'luwes', + 'meluweskan': 'luwes', + 'meluyut': 'luyut', + 'berluyutan': 'luyut', + 'pemaaf': 'maaf', + 'pemaafnya': 'maaf', + 'pemaafan': 'maaf', + 'memaafi': 'maaf', + 'pemaafannya': 'maaf', + 'permaafan': 'maaf', + 'memaafkan': 'maaf', + 'memaafkannya': 'maaf', + 'memaafkanlah': 'maaf', + 'memaafkanku': 'maaf', + 'memaafkanmu': 'maaf', + 'maaf-memaafkan': 'maaf', + 'bermaaf-maafan': 'maaf', + 'dimabuk': 'mabuk', + 'dimabukkan': 'mabuk', + 'pemabuk': 'mabuk', + 'memabukkan': 'mabuk', + 'mabuk-mabukan': 'mabuk', + 'mabuk-mabukannya': 'mabuk', + 'bermabuk-mabukan': 'mabuk', + 'mabul-mabul': 'mabul', + 'semacam': 'macam', + 'semacamnya': 'macam', + 'semacaman': 'macam', + 'semacamnyalah': 'macam', + 'bermacam': 'macam', + 'macam-macam': 'macam', + 'macam-macamnya': 'macam', + 'macam-macamlah': 'macam', + 'bermacam-macam': 'macam', + 'bermacam-macamlah': 'macam', + 'mempermacam-macamkan': 'macam', + 'memacani': 'macan', + 'macan-macanan': 'macan', + 'pemacet': 'macet', + 'kemacetan': 'macet', + 'kemacetannya': 'macet', + 'kemacetanlah': 'macet', + 'kemacetankan': 'macet', + 'kemacetanan': 'macet', + 'memacetkan': 'macet', + 'pemadah': 'madah', + 'bermadah': 'madah', + 'memadahkan': 'madah', + 'bermadat': 'madat', + 'bermadu': 'madu', + 'memadui': 'madu', + 'permaduan': 'madu', + 'mempermadukan': 'madu', + 'memafhumi': 'mafhum', + 'pemafiaan': 'mafia', + 'bermagang': 'magang', + 'permahadutaan': 'mahaduta', + 'kemahalan': 'mahal', + 'kemahalannya': 'mahal', + 'memahalkan': 'mahal', + 'kemaharajaan': 'maharaja', + 'bersimaharajalela': 'maharajalela', + 'kemahasiswaan': 'mahasiswa', + 'kemahasiswaannya': 'mahasiswa', + 'memahfuzkan': 'mahfuz', + 'memahkotai': 'mahkota', + 'memahkotainya': 'mahkota', + 'bermahkota': 'mahkota', + 'bermahkotakan': 'mahkota', + 'pemahkotaan': 'mahkota', + 'mainan': 'main', + 'mainannya': 'main', + 'mainanlah': 'main', + 'mainani': 'main', + 'mainanan': 'main', + 'mainanku': 'main', + 'mainanmu': 'main', + 'pemain': 'main', + 'pemainnya': 'main', + 'pemainlah': 'main', + 'pemaini': 'main', + 'pemainan': 'main', + 'pemainku': 'main', + 'pemainmu': 'main', + 'bermain': 'main', + 'bermainnya': 'main', + 'bermainlah': 'main', + 'bermainkan': 'main', + 'bermaini': 'main', + 'bermainan': 'main', + 'bermainku': 'main', + 'bermainmu': 'main', + 'memainkan': 'main', + 'memainkannya': 'main', + 'memainkankan': 'main', + 'memainkannyalah': 'main', + 'memainkanku': 'main', + 'memainkanmu': 'main', + 'main-main': 'main', + 'main-mainnya': 'main', + 'main-mainlah': 'main', + 'main-mainkan': 'main', + 'main-mainan': 'main', + 'permainan': 'main', + 'permainannya': 'main', + 'permainanlah': 'main', + 'permainani': 'main', + 'permainanan': 'main', + 'permainannyalah': 'main', + 'permainanku': 'main', + 'permainanmu': 'main', + 'sepermainan': 'main', + 'sepermainannya': 'main', + 'bermain-main': 'main', + 'bermain-mainlah': 'main', + 'mempermainkan': 'main', + 'mempermainkannya': 'main', + 'mempermainkanku': 'main', + 'memajalkan': 'majal', + 'kemajemukan': 'majemuk', + 'kemajemukannya': 'majemuk', + 'kemajiran': 'majir', + 'memajuh': 'pajuh', + 'pemakalah': 'makalah', + 'bermakam': 'makam', + 'pemakaman': 'makam', + 'pemakamannya': 'makam', + 'pemakamanlah': 'makam', + 'pemakamanan': 'makam', + 'pemakamanku': 'makam', + 'permakaman': 'makam', + 'permakamannya': 'makam', + 'memakamkan': 'makam', + 'memakamkannya': 'makam', + 'memakbulkan': 'makbul', + 'memaki': 'maki', + 'memakinya': 'maki', + 'memakilah': 'maki', + 'memakian': 'maki', + 'memakiku': 'maki', + 'memakimu': 'maki', + 'makian': 'maki', + 'makiannya': 'maki', + 'memaki-maki': 'maki', + 'memaki-makinya': 'maki', + 'maki-makian': 'maki', + 'semakin': 'makin', + 'semakini': 'makin', + 'memaklumi': 'maklum', + 'memakluminya': 'maklum', + 'pemakluman': 'maklum', + 'pemaklumannya': 'maklum', + 'memaklumkan': 'maklum', + 'mempermaklumkan': 'maklum', + 'memaklumatkan': 'maklumat', + 'bermakmum': 'makmum', + 'memakmumi': 'makmum', + 'bermakrifat': 'makrifat', + 'kemaksiatan': 'maksiat', + 'kemaksiatannya': 'maksiat', + 'kemaksimalan': 'maksimal', + 'semaksimalnya': 'maksimal', + 'memaksimalkan': 'maksimal', + 'memaksimalkannya': 'maksimal', + 'semaksimal mungkin': 'maksimal', + 'semaksimal-maksimalnya': 'maksimal', + 'termaktub': 'maktub', + 'termaktubkan': 'maktub', + 'pemakzulan': 'makzul', + 'pemakzulannya': 'makzul', + 'memakzulkan': 'makzul', + 'memakzulkannya': 'makzul', + 'termala': 'mala', + 'malahan': 'malah', + 'memalai': 'palai', + 'malai-malai': 'malai', + 'bermalaikan': 'malai', + 'memalangi': 'palang', + 'kemalangan': 'malang', + 'kemalangannya': 'malang', + 'malaran': 'malar', + 'malar-malar': 'malar', + 'pemaling': 'maling', + 'memaling': 'maling', + 'memalingkan': 'paling', + 'memalingkannya': 'paling', + 'kemalingan': 'maling', + 'pemalu': 'malu', + 'pemalunya': 'malu', + 'pemaluan': 'malu', + 'pemalumu': 'malu', + 'memalui': 'palu', + 'bermalu': 'malu', + 'kemaluan': 'malu', + 'kemaluannya': 'malu', + 'kemaluanku': 'malu', + 'kemaluanmu': 'malu', + 'memalukan': 'palu', + 'memalukannya': 'palu', + 'malu-malu': 'malu', + 'malu-malunya': 'malu', + 'malu-malui': 'malu', + 'kemalu-maluan': 'malu', + 'mempermalukan': 'malu', + 'mempermalukannya': 'malu', + 'mamahan': 'mamah', + 'mamahani': 'mamah', + 'memamah': 'mamah', + 'memamahi': 'mamah', + 'pemamah': 'mamah', + 'pemamahan': 'mamah', + 'memamahkan': 'mamah', + 'bermamai': 'mamai', + 'semampu': 'mampu', + 'semampunya': 'mampu', + 'semampuku': 'mampu', + 'semampumu': 'mampu', + 'kemampuan': 'mampu', + 'kemampuannya': 'mampu', + 'kemampuanlah': 'mampu', + 'kemampuanku': 'mampu', + 'kemampuanmu': 'mampu', + 'berkemampuan': 'mampu', + 'mana-mana': 'mana', + 'mana-mananya': 'mana', + 'bermanah': 'manah', + 'memanajemeni': 'manajemen', + 'memanau': 'manau', + 'termandam': 'mandam', + 'kemandekan': 'mandek', + 'kemandekannya': 'mandek', + 'memandekkan': 'mandek', + 'bermandi': 'mandi', + 'bermandikan': 'mandi', + 'bermandian': 'mandi', + 'pemandian': 'mandi', + 'pemandiannya': 'mandi', + 'memandikan': 'mandi', + 'memandikannya': 'mandi', + 'memandikanku': 'mandi', + 'permandian': 'mandi', + 'mempermandikan': 'mandi', + 'kemandirian': 'mandiri', + 'kemandiriannya': 'mandiri', + 'kemandirianmu': 'mandiri', + 'memandori': 'mandor', + 'kemandulan': 'mandul', + 'kemandulannya': 'mandul', + 'pemandulan': 'mandul', + 'pemandulannya': 'mandul', + 'memandulkan': 'mandul', + 'memandulkannya': 'mandul', + 'termangau': 'mangau', + 'pemangkir': 'mangkir', + 'pemangkiran': 'mangkir', + 'semangkuk': 'mangkuk', + 'memangsa': 'mangsa', + 'memangsanya': 'mangsa', + 'pemangsa': 'mangsa', + 'pemangsanya': 'mangsa', + 'pemangsaan': 'mangsa', + 'termangu': 'mangu', + 'termangu-mangu': 'mangu', + 'termanifestasi': 'manifestasi', + 'termanifestasikan': 'manifestasi', + 'memanifestasikan': 'manifestasi', + 'memanifestasikannya': 'manifestasi', + 'manik-manik': 'manik', + 'manik-maniknya': 'manik', + 'bermanik-manik': 'manik', + 'memanipulasi': 'manipulasi', + 'memanipulasinya': 'manipulasi', + 'memanipulasikan': 'manipulasi', + 'memanipulasiku': 'manipulasi', + 'pemanipulasian': 'manipulasi', + 'memanis': 'manis', + 'memaniskan': 'manis', + 'semanis': 'manis', + 'manisan': 'manis', + 'manisannya': 'manis', + 'pemanis': 'manis', + 'pemanisnya': 'manis', + 'bermanis': 'manis', + 'memanisi': 'manis', + 'kemanisan': 'manis', + 'kemanisannya': 'manis', + 'mempermanis': 'manis', + 'mempermanisnya': 'manis', + 'manis-manisan': 'manis', + 'memanis-manis': 'manis', + 'memanis-maniskan': 'manis', + 'bermanis-manis': 'manis', + 'semanis-manisnya': 'manis', + 'kemanjaan': 'manja', + 'kemanjaannya': 'manja', + 'memanjakan': 'manja', + 'memanjakannya': 'manja', + 'memanjakanan': 'manja', + 'memanjakanku': 'manja', + 'memanjakanmu': 'manja', + 'bermanja-manja': 'manja', + 'bermanja-manjaan': 'manja', + 'termanja-manja': 'manja', + 'mempermanjakan': 'manja', + 'kemanja-manjaan': 'manja', + 'bermanjau': 'manjau', + 'manjungan': 'manjung', + 'permanjungan': 'manjung', + 'memansukhkan': 'mansukh', + 'pemantapan': 'mantap', + 'pemantapannya': 'mantap', + 'kemantapan': 'mantap', + 'kemantapannya': 'mantap', + 'memantapkan': 'mantap', + 'memantapkannya': 'mantap', + 'bermantel': 'mantel', + 'memantrai': 'mantra', + 'memantrakan': 'mantra', + 'kemanunggalan': 'manunggal', + 'memanusiawikan': 'manusiawi', + 'manutan': 'manut', + 'bermanuver': 'manuver', + 'bermanuvernya': 'manuver', + 'bermanuverlah': 'manuver', + 'kemapanan': 'mapan', + 'kemapanannya': 'mapan', + 'bermara': 'mara', + 'kemaraan': 'mara', + 'memarakan': 'marak', + 'pemarah': 'marah', + 'pemarahnya': 'marah', + 'pemarahku': 'marah', + 'marahan': 'marah', + 'memarahi': 'marah', + 'memarahinya': 'marah', + 'memarahiku': 'marah', + 'kemarahan': 'marah', + 'kemarahannya': 'marah', + 'kemarahanan': 'marah', + 'kemarahanku': 'marah', + 'kemarahanmu': 'marah', + 'memarahkan': 'marah', + 'marah-marah': 'marah', + 'marah-marahnya': 'marah', + 'marah-marahlah': 'marah', + 'marah-marahi': 'marah', + 'marah-marahan': 'marah', + 'kemarah-marahan': 'marah', + 'memarak': 'marak', + 'memarakkan': 'parak', + 'semarak': 'marak', + 'semaraknya': 'marak', + 'semarakkan': 'marak', + 'semarakan': 'marak', + 'memarginalkan': 'marginal', + 'memarinade': 'marinade', + 'kemaritiman': 'maritim', + 'kemaritimannya': 'maritim', + 'kemaritimanan': 'maritim', + 'pemarkah': 'markah', + 'memarkahi': 'markah', + 'pemarkahan': 'markah', + 'bermarkas': 'markas', + 'bermarkasnya': 'markas', + 'bermarkaskan': 'markas', + 'bermarkasi': 'markas', + 'bermartabat': 'martabat', + 'bermartabatnya': 'martabat', + 'bermartabatlah': 'martabat', + 'kemasabodohan': 'masa bodoh', + 'memasabodohkan': 'masa bodoh', + 'semasa': 'masa', + 'semasanya': 'masa', + 'termasa': 'masa', + 'semasa-masa': 'masa', + 'memasak': 'pasak', + 'memasaknya': 'pasak', + 'memasaklah': 'pasak', + 'memasakkan': 'pasak', + 'memasakkannya': 'pasak', + 'memasaki': 'pasak', + 'memasakan': 'pasak', + 'memasakku': 'pasak', + 'memasakmu': 'pasak', + 'masakan': 'masak', + 'masakannya': 'masak', + 'masakanan': 'masak', + 'masakanku': 'masak', + 'masakanmu': 'masak', + 'pemasak': 'masak', + 'pemasaknya': 'masak', + 'pemasakan': 'masak', + 'pemasakannya': 'masak', + 'kemasakan': 'masak', + 'kemasakannya': 'masak', + 'masak-masak': 'masak', + 'masak-masaknya': 'masak', + 'masak-masakan': 'masak', + 'memasak-masak': 'masak', + 'bermasak-masak': 'masak', + 'memasalahkan': 'masalah', + 'memasalahkannya': 'masalah', + 'permasalahan': 'masalah', + 'permasalahannya': 'masalah', + 'permasalahanku': 'masalah', + 'mempermasalahkan': 'masalah', + 'mempermasalahkannya': 'masalah', + 'memasam': 'masam', + 'memasamkan': 'masam', + 'kemasam-masaman': 'masam', + 'bermasam muka': 'masam muka', + 'memasap': 'masap', + 'memaserasi': 'maserasi', + 'semasih': 'masih', + 'kemasinan': 'masin', + 'permasjidan': 'masjid', + 'memaskotkan': 'maskot', + 'kemaslahatan': 'maslahat', + 'kemaslahatannya': 'maslahat', + 'memasyarakat': 'masyarakat', + 'memasyarakatnya': 'masyarakat', + 'memasyarakatkan': 'masyarakat', + 'memasyarakatkannya': 'masyarakat', + 'memasyarakatan': 'masyarakat', + 'bermasyarakat': 'masyarakat', + 'bermasyarakatnya': 'masyarakat', + 'pemasyarakatan': 'masyarakat', + 'pemasyarakatannya': 'masyarakat', + 'kemasyarakatan': 'masyarakat', + 'kemasyarakatannya': 'masyarakat', + 'kemasyarakatanlah': 'masyarakat', + 'permasyarakatan': 'masyarakat', + 'permasyarakatannya': 'masyarakat', + 'kemasygulan': 'masygul', + 'memasygulkan': 'masygul', + 'mat-matan': 'mat', + 'memata-matai': 'mata-mata', + 'memata-matainya': 'mata-mata', + 'pemata-mataan': 'mata-mata', + 'termateri': 'materi', + 'semati': 'mati', + 'kematian': 'mati', + 'kematiannya': 'mati', + 'kematianku': 'mati', + 'kematianmu': 'mati', + 'bermatian': 'mati', + 'mematikan': 'patik', + 'mematikannya': 'mati', + 'mati-mati': 'mati', + 'mati-matian': 'mati', + 'bermatikan': 'mati', + 'mati-matianlah': 'mati', + 'bermati-mati': 'mati', + 'kemati-matian': 'mati', + 'kematraan': 'matra', + 'mematukan': 'matu', + 'semau': 'mau', + 'semaunya': 'mau', + 'semaumu': 'mau', + 'memaui': 'mau', + 'maupun': 'mau', + 'maupunnya': 'mau', + 'kemauan': 'mau', + 'kemauannya': 'mau', + 'kemauanlah': 'mau', + 'kemauanan': 'mau', + 'kemauanku': 'mau', + 'kemauanmu': 'mau', + 'memaukan': 'mau', + 'memau-mau': 'mau', + 'semau-maunya': 'mau', + 'maupun': 'mau', + 'bermaulid': 'maulid', + 'bermaulidurasul': 'maulidurasul', + 'mauludan': 'maulud', + 'permautan': 'maut', + 'kemayaan': 'maya', + 'maya-maya': 'maya', + 'pemayang': 'mayang', + 'semayang': 'mayang', + 'bermayang': 'mayang', + 'bermazhab': 'mazhab', + 'termazkur': 'mazkur', + 'bermazmur': 'mazmur', + 'bermeditasi': 'meditasi', + 'bermeditasilah': 'meditasi', + 'meger-meger': 'meger', + 'dimejahijaukan': 'meja hijau', + 'dimejahijaukannya': 'meja hijau', + 'pemekaran': 'mekar', + 'pemekarannya': 'mekar', + 'bermekaran': 'mekar', + 'bermekarannya': 'mekar', + 'memekarkan': 'mekar', + 'memelas': 'pelas', + 'memelasnya': 'pelas', + 'melek-melekan': 'melek', + 'kemelikan': 'melik', + 'memacak': 'pacak', + 'terpacak': 'pacak', + 'memacakkan': 'pacak', + 'memacak-macak': 'pacak', + 'memagar': 'pagar', + 'memagarnya': 'pagar', + 'memagarkan': 'pagar', + 'memagari': 'pagar', + 'berpagar': 'pagar', + 'berpagarkan': 'pagar', + 'memagarinya': 'pagar', + 'pagutan': 'pagut', + 'pagutannya': 'pagut', + 'memagut': 'pagut', + 'berpagut': 'pagut', + 'berpagutan': 'pagut', + 'sepemagutan': 'pagut', + 'pakaian': 'pakai', + 'pakaiannya': 'pakai', + 'pakaianlah': 'pakai', + 'pakaianku': 'pakai', + 'pakaianmu': 'pakai', + 'memakai': 'pakai', + 'memakainya': 'pakai', + 'memakaikan': 'pakai', + 'memakaikannya': 'pakai', + 'memakaian': 'pakai', + 'pemakai': 'pakai', + 'pemakainya': 'pakai', + 'pemakaikan': 'pakai', + 'pemakaian': 'pakai', + 'terpakai': 'pakai', + 'terpakainya': 'pakai', + 'sepemakai': 'pakai', + 'pemakaiannya': 'pakai', + 'memakaikanku': 'pakai', + 'berpakaian': 'pakai', + 'berpakaiannya': 'pakai', + 'berpakaianlah': 'pakai', + 'berpakaianan': 'pakai', + 'berpakaianmu': 'pakai', + 'pemakal': 'pakal', + 'memakal': 'pakal', + 'memaku': 'paku', + 'memakunya': 'paku', + 'memakukan': 'paku', + 'berpaku': 'paku', + 'terpaku': 'paku', + 'terpakunya': 'paku', + 'keterpakuan': 'paku', + 'memampang': 'pampang', + 'memampangnya': 'pampang', + 'memampangkan': 'pampang', + 'memampangkannya': 'pampang', + 'terpampang': 'pampang', + 'terpampangnya': 'pampang', + 'terpampanglah': 'pampang', + 'pemanah': 'panah', + 'pemanahnya': 'panah', + 'pemanahan': 'panah', + 'memanah': 'panah', + 'memanahnya': 'panah', + 'memanahkan': 'panah', + 'panahan': 'panah', + 'panahannya': 'panah', + 'panahanan': 'panah', + 'memanahi': 'panah', + 'sepemanah': 'panah', + 'pancangan': 'pancang', + 'memancang': 'pancang', + 'memancangnya': 'pancang', + 'memancangkan': 'pancang', + 'terpancang': 'pancang', + 'pemancar': 'pancar', + 'pemancarnya': 'pancar', + 'pemancaran': 'pancar', + 'sepancar': 'pancar', + 'pancaran': 'pancar', + 'pancarannya': 'pancar', + 'memancar': 'pancar', + 'memancarnya': 'pancar', + 'memancarkan': 'pancar', + 'memancarkannya': 'pancar', + 'memancaran': 'pancar', + 'terpancar': 'pancar', + 'terpancarnya': 'pancar', + 'terpancarkan': 'pancar', + 'berpancaran': 'pancar', + 'pancingan': 'pancing', + 'pancingannya': 'pancing', + 'memancing': 'pancing', + 'memancingnya': 'pancing', + 'memancinglah': 'pancing', + 'memancingan': 'pancing', + 'pemancing': 'pancing', + 'pemancingan': 'pancing', + 'terpancing': 'pancing', + 'terpancinglah': 'pancing', + 'kepancingan': 'pancing', + 'pemancingannya': 'pancing', + 'memancung': 'pancung', + 'memancungnya': 'pancung', + 'memancungkan': 'pancung', + 'pemancung': 'pancung', + 'pemancungan': 'pancung', + 'memancur': 'pancur', + 'memancurkan': 'pancur', + 'pancuran': 'pancur', + 'pancurannya': 'pancur', + 'berpancuran': 'pancur', + 'memancut': 'pancut', + 'sememangnya': 'memang', + 'pemanggil': 'panggil', + 'pemanggilan': 'panggil', + 'panggilan': 'panggil', + 'panggilannya': 'panggil', + 'panggilanku': 'panggil', + 'panggilanmu': 'panggil', + 'memanggil': 'panggil', + 'memanggilnya': 'panggil', + 'memanggilkan': 'panggil', + 'memanggilkannya': 'panggil', + 'memanggili': 'panggil', + 'memanggilan': 'panggil', + 'memanggilku': 'panggil', + 'memanggilmu': 'panggil', + 'terpanggil': 'panggil', + 'terpanggilnya': 'panggil', + 'pemanggilannya': 'panggil', + 'sepemanggil': 'panggil', + 'memanggil-manggil': 'panggil', + 'memanggil-manggilnya': 'panggil', + 'memanggil-manggilku': 'panggil', + 'memangkas': 'pangkas', + 'memangkasnya': 'pangkas', + 'memangkaskan': 'pangkas', + 'memangkasi': 'pangkas', + 'memangkasan': 'pangkas', + 'pemangkas': 'pangkas', + 'pemangkasan': 'pangkas', + 'pangkasan': 'pangkas', + 'berpangkas': 'pangkas', + 'pemangkasannya': 'pangkas', + 'memantak': 'pantak', + 'memantakkan': 'pantak', + 'pantangan': 'pantang', + 'pantangannya': 'pantang', + 'pantanganku': 'pantang', + 'pantanganmu': 'pantang', + 'memantang': 'pantang', + 'memantangkan': 'pantang', + 'memantangi': 'pantang', + 'berpantang': 'pantang', + 'berpantangan': 'pantang', + 'pantulan': 'pantul', + 'pantulannya': 'pantul', + 'memantul': 'pantul', + 'memantulnya': 'pantul', + 'memantulkan': 'pantul', + 'memantulkannya': 'pantul', + 'pemantulan': 'pantul', + 'memantulkanku': 'pantul', + 'memapar': 'papar', + 'memaparkan': 'papar', + 'memaparkannya': 'papar', + 'memaparan': 'papar', + 'paparan': 'papar', + 'paparannya': 'papar', + 'pemaparan': 'papar', + 'pemaparannya': 'papar', + 'pemaparankan': 'papar', + 'berparak': 'parak', + 'terpasak': 'pasak', + 'pasangan': 'pasang', + 'pasangannya': 'pasang', + 'pasanganlah': 'pasang', + 'pasanganan': 'pasang', + 'pasangannyalah': 'pasang', + 'pasanganku': 'pasang', + 'pasanganmu': 'pasang', + 'pemasang': 'pasang', + 'pemasangnya': 'pasang', + 'pemasangan': 'pasang', + 'memasang': 'pasang', + 'memasangnya': 'pasang', + 'memasangkan': 'pasang', + 'memasangkannya': 'pasang', + 'memasangi': 'pasang', + 'memasangan': 'pasang', + 'sepasang': 'pasang', + 'sepasangnya': 'pasang', + 'sepasangan': 'pasang', + 'berpasang': 'pasang', + 'berpasangkan': 'pasang', + 'berpasangan': 'pasang', + 'terpasang': 'pasang', + 'terpasangnya': 'pasang', + 'terpasanglah': 'pasang', + 'terpasangkan': 'pasang', + 'terpasangi': 'pasang', + 'terpasangan': 'pasang', + 'pemasangannya': 'pasang', + 'pasang-memasang': 'pasang', + 'berpasang-pasang': 'pasang', + 'berpasang-pasangan': 'pasang', + 'pemasar': 'pasar', + 'pemasarnya': 'pasar', + 'pemasarkan': 'pasar', + 'pemasaran': 'pasar', + 'pasaran': 'pasar', + 'pasarannya': 'pasar', + 'pasaranan': 'pasar', + 'pemasarannya': 'pasar', + 'memasarkan': 'pasar', + 'memasarkannya': 'pasar', + 'pematah': 'patah', + 'pematahan': 'patah', + 'patahan': 'patah', + 'patahannya': 'patah', + 'mematahkan': 'patah', + 'mematahkannya': 'patah', + 'mematahkankan': 'patah', + 'mematahkanmu': 'patah', + 'mematah-matah': 'patah', + 'mematuk': 'patuk', + 'mematuknya': 'patuk', + 'mematukkan': 'patuk', + 'mematuki': 'patuk', + 'mematukku': 'patuk', + 'mematuk-matuk': 'patuk', + 'berangsangan': 'berangsang', + 'pemberangsang': 'berangsang', + 'memberangsang': 'berangsang', + 'memberangsangkan': 'berangsang', + 'memecah belah': 'pecah belah', + 'pemecah belah': 'pecah belah', + 'berpecah belah': 'pecah belah', + 'memecahbelahkan': 'pecah belah', + 'memecah': 'pecah', + 'memecahnya': 'pecah', + 'memecahkan': 'pecah', + 'memecahkannya': 'pecah', + 'memecahi': 'pecah', + 'memecahan': 'pecah', + 'pemecah': 'pecah', + 'pemecahan': 'pecah', + 'pecahan': 'pecah', + 'pecahannya': 'pecah', + 'pecahanan': 'pecah', + 'berpecah': 'pecah', + 'berpecahan': 'pecah', + 'terpecah': 'pecah', + 'terpecahnya': 'pecah', + 'terpecahlah': 'pecah', + 'terpecahkan': 'pecah', + 'terpecahkannya': 'pecah', + 'pemecahannya': 'pecah', + 'pemecahanan': 'pecah', + 'pemecahanku': 'pecah', + 'kepecahan': 'pecah', + 'kepecahannya': 'pecah', + 'memecahkankan': 'pecah', + 'perpecahan': 'pecah', + 'perpecahannya': 'pecah', + 'perpecahanan': 'pecah', + 'terpecah-pecah': 'pecah', + 'terpecah-pecahnya': 'pecah', + 'memecat': 'pecat', + 'memecatnya': 'pecat', + 'memecati': 'pecat', + 'memecatku': 'pecat', + 'memecatmu': 'pecat', + 'pemecatan': 'pecat', + 'pemecatannya': 'pecat', + 'pemecatanku': 'pecat', + 'pemecatanmu': 'pecat', + 'memecatkan': 'pecat', + 'memecut': 'pecut', + 'memecutnya': 'pecut', + 'memecutkan': 'pecut', + 'pemegang': 'pegang', + 'pemegangnya': 'pegang', + 'pemegangan': 'pegang', + 'pegangan': 'pegang', + 'pegangannya': 'pegang', + 'peganganan': 'pegang', + 'peganganku': 'pegang', + 'memegang': 'pegang', + 'memegangnya': 'pegang', + 'memegangkan': 'pegang', + 'memegangi': 'pegang', + 'memegangan': 'pegang', + 'memegangmu': 'pegang', + 'perpegangan': 'pegang', + 'berpegangan': 'pegang', + 'berpegang': 'pegang', + 'bermemek-memek': 'memek', + 'terpekak': 'pekak', + 'memekakkan': 'pekak', + 'pekak-pekak': 'pekak', + 'memekik': 'pekik', + 'memekiknya': 'pekik', + 'memekikkan': 'pekik', + 'memekikan': 'pekik', + 'pekikan': 'pekik', + 'pekikannya': 'pekik', + 'terpekik': 'pekik', + 'pekik-pekuk': 'pekik', + 'terpekik-pekik': 'pekik', + 'memencar': 'pencar', + 'memencarkan': 'pencar', + 'memencari': 'pencar', + 'berpencar': 'pencar', + 'berpencarnya': 'pencar', + 'berpencaran': 'pencar', + 'terpencar': 'pencar', + 'terpencarnya': 'pencar', + 'terpencarkan': 'pencar', + 'pemencaran': 'pencar', + 'memencar-mencar': 'pencar', + 'terpencar-pencar': 'pencar', + 'terpencar-pencari': 'pencar', + 'berpencar-pencar': 'pencar', + 'memencil': 'pencil', + 'memencilkan': 'pencil', + 'terpencil': 'pencil', + 'terpencilnya': 'pencil', + 'pemencilan': 'pencil', + 'keterpencilan': 'pencil', + 'keterpencilannya': 'pencil', + 'memendam': 'pendam', + 'memendamnya': 'pendam', + 'terpendam': 'pendam', + 'terpendamnya': 'pendam', + 'terpendamkan': 'pendam', + 'memendamkan': 'pendam', + 'sepenggal': 'penggal', + 'sepenggalan': 'penggal', + 'penggalan': 'penggal', + 'penggalannya': 'penggal', + 'penggalanan': 'penggal', + 'memenggal': 'penggal', + 'memenggalnya': 'penggal', + 'memenggalku': 'penggal', + 'pemenggal': 'penggal', + 'pemenggalan': 'penggal', + 'terpenggal': 'penggal', + 'terpenggalnya': 'penggal', + 'pemenggalannya': 'penggal', + 'berpenggalan': 'penggal', + 'berpenggal-penggal': 'penggal', + 'kepeningan': 'pening', + 'memeningkan': 'pening', + 'memenjara': 'penjara', + 'memenjarakan': 'penjara', + 'memenjarakannya': 'penjara', + 'terpenjara': 'penjara', + 'terpenjarakan': 'penjara', + 'kepenjaraan': 'penjara', + 'memenjarakanku': 'penjara', + 'sepenuh': 'penuh', + 'sepenuhnya': 'penuh', + 'sepenuhkan': 'penuh', + 'sepenuhi': 'penuh', + 'sepenuhnyalah': 'penuh', + 'memenuhi': 'penuh', + 'memenuhinya': 'penuh', + 'memenuhii': 'penuh', + 'pemenuhan': 'penuh', + 'pemenuhannya': 'penuh', + 'pemenuhanan': 'penuh', + 'terpenuhi': 'penuh', + 'terpenuhinya': 'penuh', + 'terpenuhilah': 'penuh', + 'terpenuhikan': 'penuh', + 'perahan': 'perah', + 'perahannya': 'perah', + 'perahanan': 'perah', + 'pemerah': 'perah', + 'pemerahan': 'perah', + 'memerah': 'perah', + 'memerahnya': 'perah', + 'memerahkan': 'perah', + 'memerahi': 'perah', + 'pemerahannya': 'perah', + 'kemerahan': 'merah', + 'kemerahannya': 'merah', + 'kemerah-merahan': 'merah', + 'pemeram': 'peram', + 'pemeraman': 'peram', + 'peraman': 'peram', + 'memeram': 'peram', + 'memerami': 'peram', + 'berperam': 'peram', + 'memerangkap': 'perangkap', + 'memerangkapnya': 'perangkap', + 'memerangkapkan': 'perangkap', + 'terperangkap': 'perangkap', + 'terperangkapnya': 'perangkap', + 'terperanjat': 'peranjat', + 'memeranjatkan': 'peranjat', + 'memeras': 'peras', + 'memerasnya': 'peras', + 'memeraskannya': 'peras', + 'memerasan': 'peras', + 'memerasku': 'peras', + 'pemeras': 'peras', + 'pemerasnya': 'peras', + 'pemerasan': 'peras', + 'perasan': 'peras', + 'perasannya': 'peras', + 'perasanku': 'peras', + 'pemerasannya': 'peras', + 'tepercik': 'percik', + 'percikan': 'percik', + 'percikannya': 'percik', + 'memercik': 'percik', + 'memercikkan': 'percik', + 'memercikkannya': 'percik', + 'memerciki': 'percik', + 'memercikan': 'percik', + 'bepercikan': 'percik', + 'memercik-mercik': 'percik', + 'memercik-mercikkan': 'percik', + 'pemerhati': 'perhati', + 'pemerhatian': 'perhati', + 'perhatian': 'perhati', + 'perhatiannya': 'perhati', + 'perhatianlah': 'perhati', + 'perhatianku': 'perhati', + 'perhatianmu': 'perhati', + 'memerhatikan': 'perhati', + 'memerhatikannya': 'perhati', + 'memerhatikanku': 'perhati', + 'berperhatian': 'perhati', + 'keperihan': 'perih', + 'memerihkan': 'perih', + 'periksaan': 'periksa', + 'memeriksa': 'periksa', + 'memeriksanya': 'periksa', + 'memeriksakan': 'periksa', + 'memeriksakannya': 'periksa', + 'memeriksai': 'periksa', + 'memeriksaan': 'periksa', + 'memeriksaku': 'periksa', + 'pemeriksa': 'periksa', + 'pemeriksanya': 'periksa', + 'pemeriksakan': 'periksa', + 'pemeriksaan': 'periksa', + 'terperiksa': 'periksa', + 'terperiksanya': 'periksa', + 'pemeriksaannya': 'periksa', + 'pemeriksaanlah': 'periksa', + 'pemeriksaani': 'periksa', + 'pemeriksaanan': 'periksa', + 'memesat': 'pesat', + 'memesatkan': 'pesat', + 'kepesatan': 'pesat', + 'memesong': 'pesong', + 'pemesong': 'pesong', + 'terpesong': 'pesong', + 'memesongkan': 'pesong', + 'memesukkan': 'pesuk', + 'berpesuk-pesuk': 'pesuk', + 'memetik': 'petik', + 'memetiknya': 'petik', + 'memetikkan': 'petik', + 'memetiki': 'petik', + 'memetikan': 'petik', + 'petikan': 'petik', + 'petikannya': 'petik', + 'petikanan': 'petik', + 'pemetik': 'petik', + 'pemetiknya': 'petik', + 'pemetikan': 'petik', + 'terpetik': 'petik', + 'terpetiklah': 'petik', + 'pemetikannya': 'petik', + 'picitan': 'picit', + 'memicit': 'picit', + 'terpicit': 'picit', + 'memihak': 'pihak', + 'memihaknya': 'pihak', + 'memihakmu': 'pihak', + 'sepihak': 'pihak', + 'sepihaknya': 'pihak', + 'memihaki': 'pihak', + 'berpihak': 'pihak', + 'berpihaknya': 'pihak', + 'berpihaklah': 'pihak', + 'berpihakan': 'pihak', + 'pemihakan': 'pihak', + 'pemihakannya': 'pihak', + 'memihakkan': 'pihak', + 'keberpihakan': 'pihak', + 'keberpihakannya': 'pihak', + 'keberpihakanlah': 'pihak', + 'keberpihakanmu': 'pihak', + 'berpihak-pihak': 'pihak', + 'pemikat': 'pikat', + 'pemikatnya': 'pikat', + 'pemikatan': 'pikat', + 'memikat': 'pikat', + 'memikatnya': 'pikat', + 'memikatku': 'pikat', + 'pikatan': 'pikat', + 'terpikat': 'pikat', + 'terpikatnya': 'pikat', + 'keterpikatan': 'pikat', + 'memilih': 'pilih', + 'memilihnya': 'pilih', + 'memilihlah': 'pilih', + 'memilihkan': 'pilih', + 'memilihkannya': 'pilih', + 'memilihi': 'pilih', + 'memilihan': 'pilih', + 'memilihku': 'pilih', + 'memilihmu': 'pilih', + 'pilihan': 'pilih', + 'pilihannya': 'pilih', + 'pilihanlah': 'pilih', + 'pilihanan': 'pilih', + 'pilihanku': 'pilih', + 'pilihanmu': 'pilih', + 'pemilih': 'pilih', + 'pemilihnya': 'pilih', + 'pemilihlah': 'pilih', + 'pemilihkan': 'pilih', + 'pemilihan': 'pilih', + 'pemilihmu': 'pilih', + 'terpilih': 'pilih', + 'terpilihnya': 'pilih', + 'terpilihlah': 'pilih', + 'terpilihkan': 'pilih', + 'terpilihan': 'pilih', + 'pemilihannya': 'pilih', + 'pemilihanan': 'pilih', + 'pemilihanku': 'pilih', + 'pilih-pilih': 'pilih', + 'pilih-pilihnya': 'pilih', + 'pilih-pilihlah': 'pilih', + 'pilih-pilihan': 'pilih', + 'memilih-milih': 'pilih', + 'berpilih-pilih': 'pilih', + 'pemilik': 'milik', + 'pemiliknya': 'milik', + 'pemiliklah': 'milik', + 'pemiliki': 'milik', + 'pemilikan': 'milik', + 'pemiliknyalah': 'milik', + 'pemilikku': 'milik', + 'termilik': 'milik', + 'termiliki': 'milik', + 'memiliki': 'milik', + 'memilikinya': 'milik', + 'memilikii': 'milik', + 'memilikiku': 'milik', + 'memilikimu': 'milik', + 'memiliki-mu': 'milik', + 'pemilikannya': 'milik', + 'kemilikan': 'milik', + 'kepemilikan': 'milik', + 'kepemilikannya': 'milik', + 'kepemilikanku': 'milik', + 'memilin': 'pilin', + 'memilinnya': 'pilin', + 'pilinan': 'pilin', + 'pilinannya': 'pilin', + 'berpilin': 'pilin', + 'pemilinan': 'pilin', + 'pilin-memilin': 'pilin', + 'memilin-milin': 'pilin', + 'berpilin-pilin': 'pilin', + 'meminang': 'pinang', + 'meminangnya': 'pinang', + 'meminangkan': 'pinang', + 'meminangku': 'pinang', + 'peminang': 'pinang', + 'peminangnya': 'pinang', + 'peminangan': 'pinang', + 'pinangan': 'pinang', + 'pinangannya': 'pinang', + 'pinanganku': 'pinang', + 'meminang-minang': 'pinang', + 'pinjaman': 'pinjam', + 'pinjamannya': 'pinjam', + 'pinjamanan': 'pinjam', + 'pinjamanku': 'pinjam', + 'pinjamanmu': 'pinjam', + 'meminjam': 'pinjam', + 'meminjamnya': 'pinjam', + 'meminjamkan': 'pinjam', + 'meminjamkannya': 'pinjam', + 'meminjami': 'pinjam', + 'meminjaman': 'pinjam', + 'meminjamku': 'pinjam', + 'peminjam': 'pinjam', + 'peminjamnya': 'pinjam', + 'peminjamkan': 'pinjam', + 'peminjaman': 'pinjam', + 'meminjaminya': 'pinjam', + 'meminjamimu': 'pinjam', + 'peminjamannya': 'pinjam', + 'peminjamanku': 'pinjam', + 'meminjamkankan': 'pinjam', + 'meminjamkanku': 'pinjam', + 'pinjam-meminjam': 'pinjam', + 'memintas': 'pintas', + 'memintasi': 'pintas', + 'pintasan': 'pintas', + 'sepintas': 'pintas', + 'sepintasnya': 'pintas', + 'pemintasan': 'pintas', + 'kepintasan': 'pintas', + 'memintaskan': 'pintas', + 'meminum': 'minum', + 'meminumnya': 'minum', + 'meminumkan': 'minum', + 'meminumkannya': 'minum', + 'meminuman': 'minum', + 'minuman': 'minum', + 'minumannya': 'minum', + 'minumanlah': 'minum', + 'minumanan': 'minum', + 'minumanku': 'minum', + 'minumanmu': 'minum', + 'peminum': 'minum', + 'peminumnya': 'minum', + 'peminuman': 'minum', + 'meminumi': 'minum', + 'terminum': 'minum', + 'memisit': 'pisit', + 'memohon': 'pohon', + 'memohonnya': 'pohon', + 'memohonkan': 'pohon', + 'memohonan': 'pohon', + 'pepohonan': 'pohon', + 'pepohonannya': 'pohon', + 'pohon-pohonan': 'pohon', + 'memonopoli': 'monopoli', + 'memonopolinya': 'monopoli', + 'memotivasi': 'motivasi', + 'memotivasinya': 'motivasi', + 'memotivasiku': 'motivasi', + 'memotivasimu': 'motivasi', + 'memotivasi-mu': 'motivasi', + 'termotivasi': 'motivasi', + 'termotivasinya': 'motivasi', + 'potongan': 'potong', + 'potongannya': 'potong', + 'pemotong': 'potong', + 'pemotongnya': 'potong', + 'pemotongan': 'potong', + 'memotong': 'potong', + 'memotongnya': 'potong', + 'memotongkan': 'potong', + 'memotongi': 'potong', + 'memotongan': 'potong', + 'berpotong': 'potong', + 'berpotongan': 'potong', + 'terpotong': 'potong', + 'terpotongnya': 'potong', + 'terpotonglah': 'potong', + 'pemotongannya': 'potong', + 'perpotongan': 'potong', + 'perpotongannya': 'potong', + 'potong-memotong': 'potong', + 'memperpotongkan': 'potong', + 'memotong-motong': 'potong', + 'memotong-motongnya': 'potong', + 'berpotong-potong': 'potong', + 'berpotong-potongan': 'potong', + 'memotret': 'potret', + 'memotretnya': 'potret', + 'memotretlah': 'potret', + 'memotretku': 'potret', + 'pemotret': 'potret', + 'pemotretnya': 'potret', + 'pemotretan': 'potret', + 'berpotret': 'potret', + 'pemotretannya': 'potret', + 'memparafrasakan': 'parafrasa', + 'beroleh': 'oleh', + 'berolehkan': 'oleh', + 'perolehan': 'oleh', + 'perolehannya': 'oleh', + 'memperoleh': 'oleh', + 'memperolehnya': 'oleh', + 'memperolehkan': 'oleh', + 'memperolehkannya': 'oleh', + 'memperolehan': 'oleh', + 'pemerolehan': 'oleh', + 'sembahan': 'sembah', + 'penyembah': 'sembah', + 'penyembahnya': 'sembah', + 'penyembahan': 'sembah', + 'menyembah': 'sembah', + 'menyembahnya': 'sembah', + 'menyembahkan': 'sembah', + 'menyembah-ku': 'sembah', + 'bersembah': 'sembah', + 'bersembahan': 'sembah', + 'persembahan': 'sembah', + 'persembahannya': 'sembah', + 'mempersembahkan': 'sembah', + 'mempersembahkannya': 'sembah', + 'senda gurau': 'senda', + 'mempersendakan': 'senda', + 'bersenda-senda': 'senda', + 'bersenda gurau': 'senda', + 'silakan': 'sila', + 'silakanlah': 'sila', + 'tersila': 'sila', + 'silalah': 'sila', + 'silalahi': 'sila', + 'bersila': 'sila', + 'menyilakan': 'sila', + 'menyilakannya': 'sila', + 'mempersilakan': 'sila', + 'mempersilakannya': 'sila', + 'mempersilakanku': 'sila', + 'petunang': 'tunang', + 'petunangan': 'tunang', + 'tunangan': 'tunang', + 'tunangannya': 'tunang', + 'tunanganlah': 'tunang', + 'tunanganku': 'tunang', + 'menunangi': 'tunang', + 'menunangkan': 'tunang', + 'bertunangan': 'tunang', + 'bertunanganlah': 'tunang', + 'pertunangan': 'tunang', + 'pertunangannya': 'tunang', + 'pertunanganmu': 'tunang', + 'mempertunangkan': 'tunang', + 'menunjuk': 'tunjuk', + 'menunjuknya': 'tunjuk', + 'menunjukkan': 'tunjuk', + 'menunjukkannya': 'tunjuk', + 'menunjuki': 'tunjuk', + 'menunjukan': 'tunjuk', + 'menunjukku': 'tunjuk', + 'petunjuk': 'tunjuk', + 'petunjuknya': 'tunjuk', + 'petunjukkan': 'tunjuk', + 'petunjukan': 'tunjuk', + 'petunjuk-mu': 'tunjuk', + 'penunjuk': 'tunjuk', + 'penunjuknya': 'tunjuk', + 'penunjukkan': 'tunjuk', + 'penunjukkannya': 'tunjuk', + 'penunjukan': 'tunjuk', + 'menunjukikan': 'tunjuk', + 'pertunjuk': 'tunjuk', + 'pertunjukkan': 'tunjuk', + 'pertunjukkannya': 'tunjuk', + 'pertunjukan': 'tunjuk', + 'penunjukannya': 'tunjuk', + 'penunjukanku': 'tunjuk', + 'menunjukkanlah': 'tunjuk', + 'menunjukkankan': 'tunjuk', + 'menunjukkani': 'tunjuk', + 'menunjukkanku': 'tunjuk', + 'pertunjukannya': 'tunjuk', + 'tunjuk-menunjuk': 'tunjuk', + 'mempertunjukkan': 'tunjuk', + 'mempertunjukkannya': 'tunjuk', + 'bertunjuk-tunjukan': 'tunjuk', + 'memproklamasikan': 'proklamasi', + 'memproklamasikankan': 'proklamasi', + 'mempromosikan': 'promosi', + 'mempromosikannya': 'promosi', + 'mempromosikani': 'promosi', + 'pemropaganda': 'propaganda', + 'berpropaganda': 'propaganda', + 'mempropagandakan': 'propaganda', + 'mempropagandakannya': 'propaganda', + 'pemroses': 'proses', + 'pemrosesnya': 'proses', + 'pemrosesan': 'proses', + 'memproses': 'proses', + 'memprosesnya': 'proses', + 'memprosesi': 'proses', + 'memprosesan': 'proses', + 'berproses': 'proses', + 'berprosesnya': 'proses', + 'berproseslah': 'proses', + 'berproseskan': 'proses', + 'berprosesi': 'proses', + 'pemrosesannya': 'proses', + 'berpunya': 'punya', + 'mempunyai': 'punya', + 'mempunyainya': 'punya', + 'mempunyaii': 'punya', + 'kepunyaan': 'punya', + 'kepunyaannya': 'punya', + 'kepunyaanku': 'punya', + 'kepunyaanmu': 'punya', + 'mempunyakan': 'punya', + 'memuakkan': 'muak', + 'memualkan': 'mual', + 'pemuasan': 'puas', + 'kepuasan': 'puas', + 'kepuasannya': 'puas', + 'memuaskan': 'puas', + 'memuaskannya': 'puas', + 'memuaskanlah': 'puas', + 'memuaskankan': 'puas', + 'memuaskanku': 'puas', + 'memuaskanmu': 'puas', + 'berpuas diri': 'puas', + 'sepuas-puasnya': 'puas', + 'memuat': 'muat', + 'memuatnya': 'muat', + 'memuatkan': 'muat', + 'memuati': 'muat', + 'memuatan': 'muat', + 'pemuat': 'muat', + 'pemuatan': 'muat', + 'muatan': 'muat', + 'muatannya': 'muat', + 'termuat': 'muat', + 'termuatnya': 'muat', + 'pemuatannya': 'muat', + 'bermuatan': 'muat', + 'memudar': 'pudar', + 'memudarnya': 'pudar', + 'memudarkan': 'pudar', + 'pemudaran': 'pudar', + 'pemuja': 'puja', + 'pemujanya': 'puja', + 'pemujaan': 'puja', + 'memuja': 'puja', + 'memujanya': 'puja', + 'memujaku': 'puja', + 'memujamu': 'puja', + 'pujaan': 'puja', + 'pujaannya': 'puja', + 'pujaanku': 'puja', + 'pemujaannya': 'puja', + 'memuja-muja': 'puja', + 'memuja-mujanya': 'puja', + 'pemukat': 'pukat', + 'pemukatan': 'pukat', + 'memukat': 'pukat', + 'memukau': 'pukau', + 'memukaunya': 'pukau', + 'pukauan': 'pukau', + 'terpukau': 'pukau', + 'terpukaunya': 'pukau', + 'pukulan': 'pukul', + 'pukulannya': 'pukul', + 'pukulanlah': 'pukul', + 'pukulanmu': 'pukul', + 'memukul': 'pukul', + 'memukulnya': 'pukul', + 'memukulkan': 'pukul', + 'memukulkannya': 'pukul', + 'memukuli': 'pukul', + 'memukulku': 'pukul', + 'memukulmu': 'pukul', + 'pemukul': 'pukul', + 'pemukulnya': 'pukul', + 'pemukulan': 'pukul', + 'memukulinya': 'pukul', + 'memukuliku': 'pukul', + 'memukulimu': 'pukul', + 'terpukul': 'pukul', + 'terpukulnya': 'pukul', + 'pemukulannya': 'pukul', + 'memperpukuli': 'pukul', + 'pukul-memukul': 'pukul', + 'memperpukulkan': 'pukul', + 'pemukulrataan': 'pukul rata', + 'memukulratakan': 'pukul rata', + 'memulas': 'pulas', + 'memulasnya': 'pulas', + 'memulaskan': 'pulas', + 'memulaskannya': 'pulas', + 'memulasi': 'pulas', + 'pulasan': 'pulas', + 'pulasannya': 'pulas', + 'kepulasan': 'pulas', + 'berpulasan': 'pulas', + 'pemulihan': 'pulih', + 'pemulihannya': 'pulih', + 'pemulihanku': 'pulih', + 'pemulihanmu': 'pulih', + 'memulihkan': 'pulih', + 'memulihkannya': 'pulih', + 'pemunahan': 'punah', + 'memunahkan': 'punah', + 'memuncak': 'puncak', + 'memuncaknya': 'puncak', + 'memuncakkan': 'puncak', + 'memuncaki': 'puncak', + 'pemuncak': 'puncak', + 'pemuncaknya': 'puncak', + 'punggahan': 'punggah', + 'memunggah': 'punggah', + 'pemunggahan': 'punggah', + 'muntahan': 'muntah', + 'muntahannya': 'muntah', + 'memuntahi': 'muntah', + 'memuntahinya': 'muntah', + 'memuntahkan': 'muntah', + 'memuntahkannya': 'muntah', + 'dimuntahkan': 'muntah', + 'dimuntahkannya': 'muntah', + 'dipupuk': 'pupuk', + 'dipupuknya': 'pupuk', + 'dipupuki': 'pupuk', + 'memupuk': 'pupuk', + 'memupuknya': 'pupuk', + 'memupuki': 'pupuk', + 'pemupuk': 'pupuk', + 'pemupukkan': 'pupuk', + 'pemupukan': 'pupuk', + 'terpupuk': 'pupuk', + 'terpupuklah': 'pupuk', + 'pemupukannya': 'pupuk', + 'memupus': 'pupus', + 'memupusnya': 'pupus', + 'memupuskan': 'pupus', + 'memupuskannya': 'pupus', + 'terpupus': 'pupus', + 'memutar balik': 'putar balik', + 'pemutarbalikan': 'putar balik', + 'memutarbalikkan': 'putar balik', + 'memutarbalikkannya': 'putar balik', + 'terputarbalikkan': 'putar balik', + 'menabung': 'tabung', + 'menabungnya': 'tabung', + 'menabunglah': 'tabung', + 'menabungkan': 'tabung', + 'menabungkannya': 'tabung', + 'menabungmu': 'tabung', + 'penabung': 'tabung', + 'penabungnya': 'tabung', + 'penabungan': 'tabung', + 'tabungan': 'tabung', + 'tabungannya': 'tabung', + 'tabunganku': 'tabung', + 'tabunganmu': 'tabung', + 'menadah': 'tadah', + 'menadahnya': 'tadah', + 'menadahkan': 'tadah', + 'menadahi': 'tadah', + 'tadahan': 'tadah', + 'penadah': 'tadah', + 'penadahnya': 'tadah', + 'penadahan': 'tadah', + 'bertadah': 'tadah', + 'menafikan': 'nafi', + 'menafikannya': 'nafi', + 'tahunan': 'tahun', + 'tahunannya': 'tahun', + 'tahunanan': 'tahun', + 'menahun': 'tahun', + 'menahunnya': 'tahun', + 'setahun': 'tahun', + 'setahunnya': 'tahun', + 'setahunlah': 'tahun', + 'setahunan': 'tahun', + 'bertahun': 'tahun', + 'bertahunan': 'tahun', + 'pertahunan': 'tahun', + 'bertahun-tahun': 'tahun', + 'bertahun-tahunnya': 'tahun', + 'bertahun-tahunlah': 'tahun', + 'menajak': 'tajak', + 'penajakan': 'tajak', + 'penajaman': 'tajam', + 'penajamanlah': 'tajam', + 'penajamanan': 'tajam', + 'menajamkan': 'tajam', + 'mempertajam': 'tajam', + 'mempertajamnya': 'tajam', + 'bertakdir': 'takdir', + 'menakdirkan': 'takdir', + 'menakdirkannya': 'takdir', + 'menakdirkanku': 'takdir', + 'penakik': 'takik', + 'takikan': 'takik', + 'menakik': 'takik', + 'menakikan': 'takik', + 'bertakik': 'takik', + 'bertakik-takik': 'takik', + 'taksiran': 'taksir', + 'taksirannya': 'taksir', + 'menaksir': 'taksir', + 'menaksirnya': 'taksir', + 'menaksirkan': 'taksir', + 'menaksirkannya': 'taksir', + 'penaksiran': 'taksir', + 'penaksirannya': 'taksir', + 'menakuk': 'takuk', + 'menakukkan': 'takuk', + 'menakukan': 'takuk', + 'bertakuk': 'takuk', + 'menakung': 'takung', + 'tertakung': 'takung', + 'bertakung': 'takung', + 'setala': 'tala', + 'penala': 'tala', + 'penalaan': 'tala', + 'menala': 'tala', + 'menalakan': 'tala', + 'bertala-tala': 'tala', + 'menambah': 'tambah', + 'menambahnya': 'tambah', + 'menambahkan': 'tambah', + 'menambahkannya': 'tambah', + 'menambahi': 'tambah', + 'menambahan': 'tambah', + 'penambah': 'tambah', + 'penambahkan': 'tambah', + 'penambahan': 'tambah', + 'tambahan': 'tambah', + 'tambahannya': 'tambah', + 'tambahanlah': 'tambah', + 'tambahankan': 'tambah', + 'tambahani': 'tambah', + 'tambahanan': 'tambah', + 'bertambah': 'tambah', + 'bertambahnya': 'tambah', + 'bertambahlah': 'tambah', + 'bertambahkan': 'tambah', + 'bertambahan': 'tambah', + 'menambahinya': 'tambah', + 'menambahikan': 'tambah', + 'penambahannya': 'tambah', + 'penambahanan': 'tambah', + 'pertambahan': 'tambah', + 'pertambahannya': 'tambah', + 'pertambahanan': 'tambah', + 'menambahkankan': 'tambah', + 'bertambah-tambah': 'tambah', + 'menambak': 'tambak', + 'menambakkan': 'tambak', + 'menambaki': 'tambak', + 'menambakan': 'tambak', + 'penambak': 'tambak', + 'penambakan': 'tambak', + 'petambak': 'tambak', + 'petambakan': 'tambak', + 'bertambak': 'tambak', + 'menambat': 'tambat', + 'menambatkan': 'tambat', + 'menambatkannya': 'tambat', + 'tambatan': 'tambat', + 'tambatannya': 'tambat', + 'bertambat': 'tambat', + 'bertambatnya': 'tambat', + 'tertambat': 'tambat', + 'pertambatan': 'tambat', + 'bertambatkan': 'tambat', + 'tampalan': 'tampal', + 'menampal': 'tampal', + 'menampalkan': 'tampal', + 'menampali': 'tampal', + 'menampung': 'tampung', + 'menampungnya': 'tampung', + 'menampungkan': 'tampung', + 'menampungi': 'tampung', + 'menampungan': 'tampung', + 'penampung': 'tampung', + 'penampungnya': 'tampung', + 'penampungan': 'tampung', + 'bertampung': 'tampung', + 'penampungannya': 'tampung', + 'penandasan': 'tandas', + 'menandaskan': 'tandas', + 'penanda tangan': 'tanda tangan', + 'menandatangani': 'tanda tangan', + 'menandatanganinya': 'tanda tangan', + 'menandatanganii': 'tanda tangan', + 'penandatanganan': 'tanda tangan', + 'penandatanganannya': 'tanda tangan', + 'penandatangananan': 'tanda tangan', + 'tertandatangani': 'tanda tangan', + 'bertanda tangan': 'tanda tangan', + 'menandu': 'tandu', + 'menandunya': 'tandu', + 'penandu': 'tandu', + 'penandukan': 'tandu', + 'bertandu': 'tandu', + 'pemenang': 'menang', + 'pemenangnya': 'menang', + 'pemenanglah': 'menang', + 'pemenangkan': 'menang', + 'pemenangan': 'menang', + 'pemenangku': 'menang', + 'memenangi': 'menang', + 'memenanginya': 'menang', + 'pemenangannya': 'menang', + 'pemenanganan': 'menang', + 'kemenangan': 'menang', + 'kemenangannya': 'menang', + 'kemenanganlah': 'menang', + 'kemenangani': 'menang', + 'kemenanganan': 'menang', + 'kemenanganku': 'menang', + 'kemenanganmu': 'menang', + 'memenangkan': 'menang', + 'memenangkannya': 'menang', + 'memenangkankan': 'menang', + 'mempermenangkan': 'menang', + 'menangap': 'tangap', + 'menangapi': 'tangap', + 'tanggapan': 'tanggap', + 'tanggapannya': 'tanggap', + 'tanggapanku': 'tanggap', + 'menanggap': 'tanggap', + 'menanggapnya': 'tanggap', + 'menanggapi': 'tanggap', + 'menanggapan': 'tanggap', + 'menanggapinya': 'tanggap', + 'menanggapkan': 'tanggap', + 'menangguk': 'tangguk', + 'penangguk': 'tangguk', + 'tertangguk': 'tangguk', + 'menangis': 'tangis', + 'menangisnya': 'tangis', + 'menangislah': 'tangis', + 'menangisi': 'tangis', + 'tangisan': 'tangis', + 'tangisannya': 'tangis', + 'tangisanlah': 'tangis', + 'tangisanku': 'tangis', + 'penangis': 'tangis', + 'menangisinya': 'tangis', + 'bertangisan': 'tangis', + 'menangiskan': 'tangis', + 'mempertangis': 'tangis', + 'bertangis-tangisan': 'tangis', + 'menangkis': 'tangkis', + 'menangkisnya': 'tangkis', + 'tangkisan': 'tangkis', + 'penangkis': 'tangkis', + 'penangkisan': 'tangkis', + 'tertangkis': 'tangkis', + 'tanjakan': 'tanjak', + 'tanjakannya': 'tanjak', + 'menanjak': 'tanjak', + 'menanjaknya': 'tanjak', + 'menanjakkan': 'tanjak', + 'menanjaki': 'tanjak', + 'bertanjak': 'tanjak', + 'ditanjakkan': 'tanjak', + 'penanti': 'nanti', + 'penantikan': 'nanti', + 'penantian': 'nanti', + 'menanti': 'nanti', + 'menantinya': 'nanti', + 'menantikan': 'nanti', + 'menantikannya': 'nanti', + 'menantii': 'nanti', + 'menantian': 'nanti', + 'menantiku': 'nanti', + 'menantimu': 'nanti', + 'nantinya': 'nanti', + 'penantiannya': 'nanti', + 'penantianku': 'nanti', + 'bernantian': 'nanti', + 'menantikanmu': 'nanti', + 'nanti-nantian': 'nanti', + 'menanti-nanti': 'nanti', + 'menanti-nantikan': 'nanti', + 'menanti-nantikannya': 'nanti', + 'bernanti-nanti': 'nanti', + 'ternanti-nanti': 'nanti', + 'bermenantu': 'menantu', + 'bermenantukan': 'menantu', + 'penapai': 'tapai', + 'penapaian': 'tapai', + 'menapai': 'tapai', + 'tapaian': 'tapai', + 'menapis': 'tapis', + 'menapiskan': 'tapis', + 'tapisan': 'tapis', + 'penapis': 'tapis', + 'penapisan': 'tapis', + 'menarah': 'tarah', + 'menarahkannya': 'tarah', + 'tarahan': 'tarah', + 'penarah': 'tarah', + 'bertarah': 'tarah', + 'bertarahan': 'tarah', + 'penarahan': 'tarah', + 'tarian': 'tari', + 'tariannya': 'tari', + 'tarianku': 'tari', + 'menari': 'tari', + 'menarinya': 'tari', + 'menarilah': 'tari', + 'menarikan': 'tarik', + 'menarikannya': 'tari', + 'penari': 'tari', + 'penarinya': 'tari', + 'penarilah': 'tari', + 'penarikan': 'tarik', + 'penarikannya': 'tarik', + 'penarian': 'tari', + 'bertari': 'tari', + 'bertarikan': 'tari', + 'tari-menari': 'tari', + 'tari-tarian': 'tari', + 'tari-tarianan': 'tari', + 'menarik': 'tarik', + 'menariknya': 'tarik', + 'menariklah': 'tarik', + 'menarikkan': 'tarik', + 'menariki': 'tarik', + 'menarikku': 'tarik', + 'menarikmu': 'tarik', + 'penarik': 'tarik', + 'penariknya': 'tarik', + 'penarikkan': 'tarik', + 'tarikan': 'tarik', + 'tarikannya': 'tarik', + 'tertarik': 'tarik', + 'tertariknya': 'tarik', + 'tertariklah': 'tarik', + 'tertarikkan': 'tarik', + 'tertarikan': 'tarik', + 'ketertarikan': 'tarik', + 'ketertarikannya': 'tarik', + 'ketertarikanku': 'tarik', + 'ketertarikanmu': 'tarik', + 'tarik-menarik': 'tarik', + 'tarik-menariknya': 'tarik', + 'bertarik-tarikan': 'tarik', + 'menatang': 'tatang', + 'menatangi': 'tatang', + 'tatapan': 'tatap', + 'tatapannya': 'tatap', + 'menatap': 'tatap', + 'menatapnya': 'tatap', + 'menatapkan': 'tatap', + 'menatapi': 'tatap', + 'menatapku': 'tatap', + 'menatapmu': 'tatap', + 'penatapan': 'tatap', + 'bertatapan': 'tatap', + 'bertatap-tatapan': 'tatap', + 'menaturalisasi': 'naturalisasi', + 'menaturalisasinya': 'naturalisasi', + 'menaturalisasikan': 'naturalisasi', + 'menaturalisasikannya': 'naturalisasi', + 'tawaran': 'tawar', + 'tawarannya': 'tawar', + 'tawaranku': 'tawar', + 'menawar': 'tawar', + 'menawarnya': 'tawar', + 'menawarlah': 'tawar', + 'menawarkan': 'tawar', + 'menawarkannya': 'tawar', + 'menawari': 'tawar', + 'menawaran': 'tawar', + 'menawarku': 'tawar', + 'penawar': 'tawar', + 'penawarnya': 'tawar', + 'penawarkan': 'tawar', + 'penawaran': 'tawar', + 'menawarinya': 'tawar', + 'menawariku': 'tawar', + 'menawarimu': 'tawar', + 'ketawaran': 'tawar', + 'penawarannya': 'tawar', + 'penawaranlah': 'tawar', + 'penawaranan': 'tawar', + 'penawaranku': 'tawar', + 'penawaranmu': 'tawar', + 'bertawaran': 'tawar', + 'menawarkankan': 'tawar', + 'menawarkanku': 'tawar', + 'menawarkanmu': 'tawar', + 'tawar jambi': 'tawar', + 'tawar-menawar': 'tawar', + 'tawar-menawarnya': 'tawar', + 'tawar-menawarkan': 'tawar', + 'tawar-menawari': 'tawar', + 'bertawar-tawaran': 'tawar', + 'tayangan': 'tayang', + 'tayangannya': 'tayang', + 'tayanganlah': 'tayang', + 'menayang': 'tayang', + 'menayangkan': 'tayang', + 'menayangkannya': 'tayang', + 'menayangan': 'tayang', + 'tertayang': 'tayang', + 'tertayangkan': 'tayang', + 'penayangan': 'tayang', + 'penayangannya': 'tayang', + 'penayanganan': 'tayang', + 'mencak-mencak': 'mencak', + 'mendingan': 'mending', + 'mendinganlah': 'mending', + 'menebah': 'tebah', + 'menebahkan': 'tebah', + 'penebang': 'tebang', + 'penebangnya': 'tebang', + 'penebangan': 'tebang', + 'tebangan': 'tebang', + 'tebangannya': 'tebang', + 'menebang': 'tebang', + 'menebangnya': 'tebang', + 'menebangkan': 'tebang', + 'menebangi': 'tebang', + 'menebanginya': 'tebang', + 'penebangannya': 'tebang', + 'penebar': 'tebar', + 'penebarnya': 'tebar', + 'penebaran': 'tebar', + 'menebar': 'tebar', + 'menebarnya': 'tebar', + 'menebarkan': 'tebar', + 'menebarkannya': 'tebar', + 'menebari': 'tebar', + 'tebaran': 'tebar', + 'tebarannya': 'tebar', + 'tertebar': 'tebar', + 'tertebaran': 'tebar', + 'bertebaran': 'tebar', + 'bertebarannya': 'tebar', + 'bertebaranlah': 'tebar', + 'mempertebarkan': 'tebar', + 'penebas': 'tebas', + 'penebasan': 'tebas', + 'menebas': 'tebas', + 'menebasnya': 'tebas', + 'menebaskan': 'tebas', + 'menebaskannya': 'tebas', + 'menebasi': 'tebas', + 'tebasan': 'tebas', + 'menebat': 'tebat', + 'penebatan': 'tebat', + 'ditebuk': 'tebuk', + 'menebuk': 'tebuk', + 'penebuk': 'tebuk', + 'tebukan': 'tebuk', + 'penebukan': 'tebuk', + 'tebusan': 'tebus', + 'tebusannya': 'tebus', + 'penebus': 'tebus', + 'penebusnya': 'tebus', + 'penebusan': 'tebus', + 'menebus': 'tebus', + 'menebusnya': 'tebus', + 'menebuslah': 'tebus', + 'menebuskan': 'tebus', + 'menebusku': 'tebus', + 'menebusmu': 'tebus', + 'penebusannya': 'tebus', + 'menegah': 'tegah', + 'menegahnya': 'tegah', + 'menegahi': 'tegah', + 'tegahan': 'tegah', + 'bertegah': 'tegah', + 'menegahkan': 'tegah', + 'menegak': 'tegak', + 'menegaknya': 'tegak', + 'menegakkan': 'tegak', + 'menegakkannya': 'tegak', + 'menegakan': 'tegak', + 'tegakan': 'tegak', + 'tegakanlah': 'tegak', + 'setegak': 'tegak', + 'setegaknya': 'tegak', + 'penegak': 'tegak', + 'penegaknya': 'tegak', + 'penegakkan': 'tegak', + 'penegakkannya': 'tegak', + 'penegakan': 'tegak', + 'tertegak': 'tegak', + 'bertegak': 'tegak', + 'penegakannya': 'tegak', + 'penegakanan': 'tegak', + 'ketegakan': 'tegak', + 'sepertegak': 'tegak', + 'tegak-tegak': 'tegak', + 'meneguk': 'teguk', + 'meneguknya': 'teguk', + 'menegukan': 'teguk', + 'seteguk': 'teguk', + 'terteguk': 'teguk', + 'ketegukan': 'teguk', + 'menegur': 'tegur', + 'menegurnya': 'tegur', + 'menegurku': 'tegur', + 'teguran': 'tegur', + 'tegurannya': 'tegur', + 'meneguri': 'tegur', + 'keteguran': 'tegur', + 'berteguran': 'tegur', + 'menegur-neguri': 'tegur', + 'menekan': 'tekan', + 'menekannya': 'tekan', + 'menekankan': 'tekan', + 'menekankannya': 'tekan', + 'menekanan': 'tekan', + 'menekanku': 'tekan', + 'menekanmu': 'tekan', + 'tekanan': 'tekan', + 'tekanannya': 'tekan', + 'tekananan': 'tekan', + 'tekananku': 'tekan', + 'penekan': 'tekan', + 'penekannya': 'tekan', + 'penekankan': 'tekan', + 'penekanan': 'tekan', + 'tertekan': 'tekan', + 'tertekannya': 'tekan', + 'tertekanlah': 'tekan', + 'tertekanan': 'tekan', + 'bertekan': 'tekan', + 'bertekanan': 'tekan', + 'penekanannya': 'tekan', + 'penekananan': 'tekan', + 'menekankankan': 'tekan', + 'menekankani': 'tekan', + 'bersetekan': 'tekan', + 'tertekan-tekan': 'tekan', + 'menekap': 'tekap', + 'tekapan': 'tekap', + 'menekapi': 'tekap', + 'bertekap': 'tekap', + 'menekapkan': 'tekap', + 'menelan': 'telan', + 'menelannya': 'telan', + 'menelankan': 'telan', + 'menelanku': 'telan', + 'menelanmu': 'telan', + 'tertelan': 'telan', + 'tertelannya': 'telan', + 'penelanan': 'telan', + 'bertelangkup': 'telangkup', + 'menelangkupkan': 'telangkup', + 'terteleng': 'teleng', + 'menelengkan': 'teleng', + 'bunga teleng': 'teleng', + 'terteleng-teleng': 'teleng', + 'menelungkup': 'telungkup', + 'menelungkupkan': 'telungkup', + 'menelungkupkannya': 'telungkup', + 'bertelengkup': 'telungkup', + 'tertelungkup': 'telungkup', + 'tembakan': 'tembak', + 'tembakannya': 'tembak', + 'tembakanku': 'tembak', + 'tembakanmu': 'tembak', + 'petembak': 'tembak', + 'penembak': 'tembak', + 'penembaknya': 'tembak', + 'penembakkan': 'tembak', + 'penembakan': 'tembak', + 'menembak': 'tembak', + 'menembaknya': 'tembak', + 'menembakkan': 'tembak', + 'menembakkannya': 'tembak', + 'menembaki': 'tembak', + 'menembakan': 'tembak', + 'menembakku': 'tembak', + 'menembakmu': 'tembak', + 'menembakinya': 'tembak', + 'tertembak': 'tembak', + 'tertembaknya': 'tembak', + 'tertembakan': 'tembak', + 'penembakannya': 'tembak', + 'penembakanan': 'tembak', + 'bertembakan': 'tembak', + 'tembak-menembak': 'tembak', + 'menemberang': 'temberang', + 'menembuk': 'tembuk', + 'menembukan': 'tembuk', + 'bertembuk-tembuk': 'tembuk', + 'tembusan': 'tembus', + 'tembusannya': 'tembus', + 'menembusi': 'tembus', + 'tertembus': 'tembus', + 'tertembusnya': 'tembus', + 'tertembuskan': 'tembus', + 'penembusan': 'tembus', + 'penembusannya': 'tembus', + 'tempaan': 'tempa', + 'penempa': 'tempa', + 'penempakan': 'tempa', + 'penempaan': 'tempa', + 'menempa': 'tempa', + 'menempanya': 'tempa', + 'menempakan': 'tempa', + 'menempai': 'tempa', + 'menempaku': 'tempa', + 'tempa-menempa': 'tempa', + 'tendangan': 'tendang', + 'tendangannya': 'tendang', + 'tendanganku': 'tendang', + 'tendanganmu': 'tendang', + 'menendang': 'tendang', + 'menendangnya': 'tendang', + 'menendangkan': 'tendang', + 'menendangkannya': 'tendang', + 'menendangi': 'tendang', + 'menendangan': 'tendang', + 'menendangku': 'tendang', + 'menendangmu': 'tendang', + 'tertendang': 'tendang', + 'tertendangnya': 'tendang', + 'tertendang-tendang': 'tendang', + 'menenggala': 'tenggala', + 'penenggelaman': 'tenggelam', + 'penenggelamannya': 'tenggelam', + 'menenggelamkan': 'tenggelam', + 'menenggelamkannya': 'tenggelam', + 'menenggelamkanku': 'tenggelam', + 'penenteraman': 'tenteram', + 'ketenteraman': 'tenteram', + 'menenteramkan': 'tenteram', + 'menentu': 'tentu', + 'menentunya': 'tentu', + 'menentukan': 'tentu', + 'menentukannya': 'tentu', + 'menentuan': 'tentu', + 'penentu': 'tentu', + 'penentunya': 'tentu', + 'penentukan': 'tentu', + 'penentuan': 'tentu', + 'bertentu': 'tentu', + 'tertentu': 'tentu', + 'tertentunya': 'tentu', + 'tertentulah': 'tentu', + 'tertentui': 'tentu', + 'menentui': 'tentu', + 'penentuannya': 'tentu', + 'ketentuan': 'tentu', + 'ketentuannya': 'tentu', + 'ketentuanlah': 'tentu', + 'ketentuanan': 'tentu', + 'menentukankan': 'tentu', + 'menentukanku': 'tentu', + 'berketentuan': 'tentu', + 'bertentu-tentu': 'tentu', + 'menepak': 'tepak', + 'menepakkan': 'tepak', + 'menepak-nepak': 'tepak', + 'menepak-nepakkan': 'tepak', + 'tepatan': 'tepat', + 'menepat': 'tepat', + 'menepatkan': 'tepat', + 'menepatkannya': 'tepat', + 'menepati': 'tepat', + 'menepatinya': 'tepat', + 'ketepatan': 'tepat', + 'ketepatannya': 'tepat', + 'pertepatan': 'tepat', + 'bertepatan': 'tepat', + 'bertepatannya': 'tepat', + 'berketepatan': 'tepat', + 'menepek': 'tepek', + 'bertepek-tepek': 'tepek', + 'menepis': 'tepis', + 'menepisnya': 'tepis', + 'menepiskan': 'tepis', + 'menera': 'tera', + 'menerakan': 'tera', + 'teraan': 'tera', + 'bertera': 'tera', + 'tertera': 'tera', + 'terteranya': 'tera', + 'peneraan': 'tera', + 'perteraan': 'tera', + 'penerang': 'terang', + 'penerangnya': 'terang', + 'penerangan': 'terang', + 'menerang': 'terang', + 'menerangkan': 'terang', + 'menerangkannya': 'terang', + 'menerangi': 'terang', + 'menerangan': 'terang', + 'meneranginya': 'terang', + 'penerangannya': 'terang', + 'peneranganan': 'terang', + 'keterangan': 'terang', + 'keterangannya': 'terang', + 'keteranganlah': 'terang', + 'keteranganan': 'terang', + 'keterangannyalah': 'terang', + 'keteranganmu': 'terang', + 'menerangkankan': 'terang', + 'berpenerangan': 'terang', + 'terang-terang': 'terang', + 'terang-terangnya': 'terang', + 'terang-terangkan': 'terang', + 'terang-terangan': 'terang', + 'terang-terangannya': 'terang', + 'terang-teranganan': 'terang', + 'berterang-terang': 'terang', + 'berterang-terangan': 'terang', + 'terang-terang laras': 'terang', + 'penerima': 'terima', + 'penerimanya': 'terima', + 'penerimalah': 'terima', + 'penerimaan': 'terima', + 'penerimamu': 'terima', + 'menerima': 'terima', + 'menerimanya': 'terima', + 'menerimalah': 'terima', + 'menerimakan': 'terima', + 'menerimaan': 'terima', + 'menerimaku': 'terima', + 'menerimamu': 'terima', + 'berterima': 'terima', + 'berterimakan': 'terima', + 'penerimaannya': 'terima', + 'penerimaanmu': 'terima', + 'keberterimaan': 'terima', + 'menerkam': 'terkam', + 'menerkamnya': 'terkam', + 'menerkamku': 'terkam', + 'penerkam': 'terkam', + 'penerkaman': 'terkam', + 'terkaman': 'terkam', + 'terkamannya': 'terkam', + 'terobosan': 'terobos', + 'terobosannya': 'terobos', + 'menerobos': 'terobos', + 'menerobosnya': 'terobos', + 'meneroboskan': 'terobos', + 'meneroboskannya': 'terobos', + 'penerobosan': 'terobos', + 'meneroka': 'teroka', + 'peneroka': 'teroka', + 'menerpa': 'terpa', + 'menerpanya': 'terpa', + 'menerpakan': 'terpa', + 'terpaan': 'terpa', + 'terpaannya': 'terpa', + 'terusan': 'terus', + 'terusannya': 'terus', + 'penerus': 'terus', + 'penerusnya': 'terus', + 'peneruslah': 'terus', + 'penerusan': 'terus', + 'penerusku': 'terus', + 'menerus': 'terus', + 'menerusnya': 'terus', + 'meneruslah': 'terus', + 'meneruskan': 'terus', + 'meneruskannya': 'terus', + 'menerusi': 'terus', + 'penerusannya': 'terus', + 'keterusan': 'terus', + 'keterusanlah': 'terus', + 'meneruskankan': 'terus', + 'seterusnya': 'terus', + 'terus-menerus': 'terus', + 'terus-menerusnya': 'terus', + 'terus-terusan': 'terus', + 'terus-terusanlah': 'terus', + 'terus-terusanan': 'terus', + 'menetak': 'tetak', + 'menetakan': 'tetak', + 'menetakkan': 'tetak', + 'bertetakan': 'tetak', + 'menetas': 'tetas', + 'menetasnya': 'tetas', + 'menetaskan': 'tetas', + 'menetaskannya': 'tetas', + 'penetas': 'tetas', + 'penetasi': 'tetas', + 'penetasan': 'tetas', + 'menetek': 'tetek', + 'meneteki': 'tetek', + 'menetekkan': 'tetek', + 'termengah-mengah': 'mengah', + 'mengap-mengap': 'mengap', + 'pengasoan': 'aso', + 'mengeong': 'ngeong', + 'mengepos': 'pos', + 'mengeposkan': 'pos', + 'mengeposkannya': 'pos', + 'pengeposan': 'pos', + 'semengga': 'mengga', + 'semengga-mengga': 'mengga', + 'bermengkal': 'mengkal', + 'memengkalkan': 'mengkal', + 'kemengkelan': 'mengkelan', + 'termengkelan': 'mengkelan', + 'cengking-mengking': 'mengking', + 'memengkis': 'mengkis', + 'ocehan': 'oceh', + 'ocehannya': 'oceh', + 'mengoceh': 'oceh', + 'mengocehi': 'oceh', + 'omelan': 'omel', + 'omelannya': 'omel', + 'mengomel': 'omel', + 'mengomeli': 'omel', + 'pengomel': 'omel', + 'mengomelinya': 'omel', + 'mengongkosi': 'ongkos', + 'mengongkosinya': 'ongkos', + 'perongkosan': 'ongkos', + 'uapan': 'uap', + 'penguap': 'uap', + 'penguapan': 'uap', + 'menguapinya': 'uap', + 'penguapannya': 'uap', + 'teruapkan': 'uap', + 'ubah suaian': 'ubah suai', + 'pengubahsuaian': 'ubah suai', + 'mengubahsuaikan': 'ubah suai', + 'ucapan': 'ucap', + 'ucapannya': 'ucap', + 'ucapanku': 'ucap', + 'ucapanmu': 'ucap', + 'berucap': 'ucap', + 'berucaplah': 'ucap', + 'mengucap': 'ucap', + 'mengucapnya': 'ucap', + 'mengucapkan': 'ucap', + 'mengucapkannya': 'ucap', + 'mengucapan': 'ucap', + 'pengucap': 'ucap', + 'pengucapnya': 'ucap', + 'pengucapan': 'ucap', + 'mengucapi': 'ucap', + 'pengucapannya': 'ucap', + 'terucapkan': 'ucap', + 'mengucapkankan': 'ucap', + 'ugutan': 'ugut', + 'mengugut': 'ugut', + 'diuji': 'uji', + 'diujinya': 'uji', + 'diujilah': 'uji', + 'diujikan': 'uji', + 'diujian': 'uji', + 'ujian': 'uji', + 'ujiannya': 'uji', + 'ujiani': 'uji', + 'ujianmu': 'uji', + 'beruji': 'uji', + 'berujian': 'uji', + 'teruji': 'uji', + 'terujinya': 'uji', + 'terujikan': 'uji', + 'penguji': 'uji', + 'pengujinya': 'uji', + 'pengujikan': 'uji', + 'pengujian': 'uji', + 'menguji': 'uji', + 'mengujinya': 'uji', + 'mengujikan': 'uji', + 'mengujikannya': 'uji', + 'mengujii': 'uji', + 'mengujian': 'uji', + 'mengujimu': 'uji', + 'keujian': 'uji', + 'pengujiannya': 'uji', + 'keterujian': 'uji', + 'pengumbuk': 'umbuk', + 'mengumbuk': 'umbuk', + 'seumpama': 'umpama', + 'seumpamanya': 'umpama', + 'berumpama': 'umpama', + 'mengumpamai': 'umpama', + 'perumpamaan': 'umpama', + 'perumpamaannya': 'umpama', + 'mengumpamakan': 'umpama', + 'mengumpamakannya': 'umpama', + 'mengumpan': 'umpan', + 'mengumpannya': 'umpan', + 'mengumpankan': 'umpan', + 'mengumpankannya': 'umpan', + 'mengumpani': 'umpan', + 'pengumpil': 'umpil', + 'pengumpilnya': 'umpil', + 'pengumpilan': 'umpil', + 'mengumpil': 'umpil', + 'mengumpilkan': 'umpil', + 'mengumpilan': 'umpil', + 'seumumnya': 'umum', + 'memperumum': 'umum', + 'pengumuman': 'umum', + 'pengumumannya': 'umum', + 'pengumumanlah': 'umum', + 'pengumumanan': 'umum', + 'mengumumkan': 'umum', + 'mengumumkannya': 'umum', + 'mengumumkankan': 'umum', + 'undangan': 'undang', + 'undangannya': 'undang', + 'undanganlah': 'undang', + 'undanganan': 'undang', + 'undanganku': 'undang', + 'undanganmu': 'undang', + 'berundang': 'undang', + 'pengundang': 'undang', + 'pengundangnya': 'undang', + 'pengundangan': 'undang', + 'undang-undang': 'undang', + 'undang-undangnya': 'undang', + 'undang-undanglah': 'undang', + 'undang-undangkan': 'undang', + 'undang-undangi': 'undang', + 'undang-undangan': 'undang', + 'pengundang-undang': 'undang', + 'pengundang-undangan': 'undang', + 'perundang-undangan': 'undang', + 'perundang-undangannya': 'undang', + 'perundang-undanganan': 'undang', + 'undian': 'undi', + 'undiannya': 'undi', + 'berundi': 'undi', + 'pengundi': 'undi', + 'pengundian': 'undi', + 'mengundi': 'undi', + 'mengundinya': 'undi', + 'pengundiannya': 'undi', + 'memperundikan': 'undi', + 'mengundur': 'undur', + 'mengundurnya': 'undur', + 'mengundurkan': 'undur', + 'mengundurkannya': 'undur', + 'mengunduran': 'undur', + 'pengunduran': 'undur', + 'pengundurannya': 'undur', + 'termengung': 'mengung', + 'mengunggis': 'unggis', + 'pengunggis': 'unggis', + 'unggunan': 'unggun', + 'berunggun': 'unggun', + 'mengunggun': 'unggun', + 'mengunggunkan': 'unggun', + 'berunggun-unggun': 'unggun', + 'ungkaian': 'ungkai', + 'mengungkai': 'ungkai', + 'ungkapan': 'ungkap', + 'ungkapannya': 'ungkap', + 'terungkap': 'ungkap', + 'terungkapnya': 'ungkap', + 'terungkaplah': 'ungkap', + 'terungkapkan': 'ungkap', + 'mengungkap': 'ungkap', + 'mengungkapnya': 'ungkap', + 'mengungkapkan': 'ungkap', + 'mengungkapkannya': 'ungkap', + 'mengungkapan': 'ungkap', + 'mengungkapi': 'ungkap', + 'pengungkapan': 'ungkap', + 'pengungkapannya': 'ungkap', + 'mengungkapkankan': 'ungkap', + 'mengungkapkanan': 'ungkap', + 'terungkap-ungkap': 'ungkap', + 'mengungkit': 'ungkit', + 'mengungkitnya': 'ungkit', + 'pengungkit': 'ungkit', + 'pengungkitnya': 'ungkit', + 'pengungkitan': 'ungkit', + 'ungkit-ungkit': 'ungkit', + 'mengungkit-ungkit': 'ungkit', + 'mengungkit-ungkitnya': 'ungkit', + 'mengunjuk': 'unjuk', + 'mengunjukkan': 'unjuk', + 'mengunjukan': 'unjuk', + 'pengunjukan': 'unjuk', + 'sepengunjuk': 'unjuk', + 'mengunting': 'unting', + 'unting-unting': 'unting', + 'upahan': 'upah', + 'berupah': 'upah', + 'mengupah': 'upah', + 'mengupahnya': 'upah', + 'mengupahi': 'upah', + 'pengupahan': 'upah', + 'pengupahannya': 'upah', + 'mengupahkan': 'upah', + 'upah-mengupah': 'upah', + 'uraian': 'urai', + 'uraiannya': 'urai', + 'terurai': 'urai', + 'terurainya': 'urai', + 'teruraikan': 'urai', + 'berurai': 'urai', + 'beruraikan': 'urai', + 'beruraian': 'urai', + 'mengurai': 'urai', + 'mengurainya': 'urai', + 'menguraikan': 'urai', + 'menguraikannya': 'urai', + 'peruraian': 'urai', + 'penguraian': 'urai', + 'penguraiannya': 'urai', + 'mengurup': 'urup', + 'urup-urup': 'urup', + 'urup-urupan': 'urup', + 'keurus': 'urus', + 'urusan': 'urus', + 'urusannya': 'urus', + 'urusanlah': 'urus', + 'urusani': 'urus', + 'urusanku': 'urus', + 'urusanmu': 'urus', + 'urusan-ku': 'urus', + 'terurus': 'urus', + 'terurusnya': 'urus', + 'keurusan': 'urus', + 'pengurus': 'urus', + 'pengurusnya': 'urus', + 'penguruslah': 'urus', + 'pengurusi': 'urus', + 'pengurusku': 'urus', + 'pengurusmu': 'urus', + 'mengurusinya': 'urus', + 'mengurusiku': 'urus', + 'mengurusimu': 'urus', + 'berurusan': 'urus', + 'urus-urus': 'urus', + 'urus-urusan': 'urus', + 'kepengurusan': 'urus', + 'kepengurusannya': 'urus', + 'kepengurusanan': 'urus', + 'kepengurusannyalah': 'urus', + 'mengusainya': 'usai', + 'mengusaikan': 'usai', + 'mengusap': 'usap', + 'mengusapnya': 'usap', + 'mengusapkan': 'usap', + 'mengusapkannya': 'usap', + 'mengusapi': 'usap', + 'usikan': 'usik', + 'terusik': 'usik', + 'terusiknya': 'usik', + 'pengusik': 'usik', + 'pengusiknya': 'usik', + 'mengusik': 'usik', + 'mengusiknya': 'usik', + 'mengusikku': 'usik', + 'mengusikmu': 'usik', + 'usiran': 'usir', + 'usirannya': 'usir', + 'terusir': 'usir', + 'terusirnya': 'usir', + 'pengusir': 'usir', + 'pengusirnya': 'usir', + 'pengusiran': 'usir', + 'mengusir': 'usir', + 'mengusirnya': 'usir', + 'mengusiri': 'usir', + 'mengusiran': 'usir', + 'mengusirku': 'usir', + 'mengusirmu': 'usir', + 'pengusirannya': 'usir', + 'usulan': 'usul', + 'usulannya': 'usul', + 'usulanku': 'usul', + 'usulanmu': 'usul', + 'pengusul': 'usul', + 'pengusulnya': 'usul', + 'pengusulan': 'usul', + 'mengusul': 'usul', + 'mengusulkan': 'usul', + 'mengusulkannya': 'usul', + 'mengusulan': 'usul', + 'pengusuli': 'usul', + 'mengusuli': 'usul', + 'pengusulannya': 'usul', + 'usungan': 'usung', + 'usungannya': 'usung', + 'berusung': 'usung', + 'pengusung': 'usung', + 'pengusungnya': 'usung', + 'pengusunglah': 'usung', + 'pengusungan': 'usung', + 'mengusung': 'usung', + 'mengusungnya': 'usung', + 'mengusungkan': 'usung', + 'mengusungi': 'usung', + 'pengusungannya': 'usung', + 'mengutara': 'utara', + 'mengutarakan': 'utara', + 'mengutarakannya': 'utara', + 'pengutaraan': 'utara', + 'utusan': 'utus', + 'utusannya': 'utus', + 'mengutus': 'utus', + 'mengutusnya': 'utus', + 'mengutuskan': 'utus', + 'mengutusku': 'utus', + 'mengutusmu': 'utus', + 'perutusan': 'utus', + 'perutusannya': 'utus', + 'pengutusan': 'utus', + 'meniarap': 'tiarap', + 'tertiarap': 'tiarap', + 'bertiarap': 'tiarap', + 'meniarapkan': 'tiarap', + 'menikah': 'nikah', + 'menikahnya': 'nikah', + 'menikahlah': 'nikah', + 'menikahkan': 'nikah', + 'menikahkannya': 'nikah', + 'menikahi': 'nikah', + 'menikahinya': 'nikah', + 'menikahiku': 'nikah', + 'menikahimu': 'nikah', + 'pernikahan': 'nikah', + 'pernikahannya': 'nikah', + 'pernikahanlah': 'nikah', + 'pernikahanan': 'nikah', + 'pernikahanku': 'nikah', + 'pernikahanmu': 'nikah', + 'menikahkanku': 'nikah', + 'menikam': 'tikam', + 'menikamnya': 'tikam', + 'menikamkan': 'tikam', + 'menikamkannya': 'tikam', + 'menikami': 'tikam', + 'menikamku': 'tikam', + 'menikammu': 'tikam', + 'penikam': 'tikam', + 'penikaman': 'tikam', + 'tikaman': 'tikam', + 'tertikam': 'tikam', + 'penikamannya': 'tikam', + 'pertikaman': 'tikam', + 'tikam-menikam': 'tikam', + 'bertikam-tikaman': 'tikam', + 'penikmat': 'nikmat', + 'penikmatnya': 'nikmat', + 'penikmati': 'nikmat', + 'penikmatan': 'nikmat', + 'menikmati': 'nikmat', + 'menikmatinya': 'nikmat', + 'menikmatilah': 'nikmat', + 'menikmatii': 'nikmat', + 'menikmatiku': 'nikmat', + 'menikmatimu': 'nikmat', + 'kenikmatan': 'nikmat', + 'kenikmatannya': 'nikmat', + 'kenikmatanlah': 'nikmat', + 'penilik': 'tilik', + 'penilikan': 'tilik', + 'menilik': 'tilik', + 'meniliknya': 'tilik', + 'meniliki': 'tilik', + 'tilikan': 'tilik', + 'tilikannya': 'tilik', + 'tilik-menilik': 'tilik', + 'menimang': 'timang', + 'menimangnya': 'timang', + 'ditimang': 'timang', + 'menimangkan': 'timang', + 'menimang-nimang': 'timang', + 'menimang-nimangnya': 'timang', + 'timang-timangan': 'timang', + 'timbangan': 'timbang', + 'timbangannya': 'timbang', + 'timbanganku': 'timbang', + 'setimbang': 'timbang', + 'ketimbang': 'timbang', + 'ketimbangnya': 'timbang', + 'ketimbangkan': 'timbang', + 'ketimbangan': 'timbang', + 'ketimbangku': 'timbang', + 'menimbang': 'timbang', + 'menimbangnya': 'timbang', + 'menimbangkan': 'timbang', + 'menimbangkannya': 'timbang', + 'menimbangi': 'timbang', + 'penimbang': 'timbang', + 'penimbangan': 'timbang', + 'bertimbang': 'timbang', + 'bertimbangkan': 'timbang', + 'setimbangan': 'timbang', + 'bertimbangan': 'timbang', + 'pertimbangan': 'timbang', + 'pertimbangannya': 'timbang', + 'pertimbanganlah': 'timbang', + 'pertimbangankan': 'timbang', + 'pertimbanganan': 'timbang', + 'pertimbanganku': 'timbang', + 'kesetimbangan': 'timbang', + 'kesetimbangannya': 'timbang', + 'menyetimbangkan': 'timbang', + 'mempertimbangkan': 'timbang', + 'mempertimbangkannya': 'timbang', + 'mempertimbangkankan': 'timbang', + 'mempertimbangkanku': 'timbang', + 'menimbang-nimbang': 'timbang', + 'menimbang-nimbangnya': 'timbang', + 'timbang-menimbang': 'timbang', + 'menimbus': 'timbus', + 'menimbusi': 'timbus', + 'tertimbus': 'timbus', + 'menimpa': 'timpa', + 'menimpanya': 'timpa', + 'menimpakan': 'timpa', + 'menimpakannya': 'timpa', + 'menimpai': 'timpa', + 'menimpanyalah': 'timpa', + 'menimpaku': 'timpa', + 'menimpamu': 'timpa', + 'ditimpa': 'timpa', + 'ditimpanya': 'timpa', + 'ditimpakan': 'timpa', + 'ditimpakannya': 'timpa', + 'timpaan': 'timpa', + 'tertimpa': 'timpa', + 'tertimpanya': 'timpa', + 'tertimpalah': 'timpa', + 'timpa-menimpa': 'timpa', + 'bertimpa-timpa': 'timpa', + 'menindik': 'tindik', + 'menindiknya': 'tindik', + 'menindikan': 'tindik', + 'bertindik': 'tindik', + 'tinggalan': 'tinggal', + 'tinggalannya': 'tinggal', + 'peninggal': 'tinggal', + 'peninggalkan': 'tinggal', + 'peninggalan': 'tinggal', + 'meninggal': 'tinggal', + 'meninggalnya': 'tinggal', + 'meninggalkan': 'tinggal', + 'meninggalkannya': 'tinggal', + 'meninggali': 'tinggal', + 'meninggalan': 'tinggal', + 'meninggalku': 'tinggal', + 'tertinggal': 'tinggal', + 'tertinggalnya': 'tinggal', + 'tertinggalkan': 'tinggal', + 'tertinggalan': 'tinggal', + 'meninggalinya': 'tinggal', + 'pertinggal': 'tinggal', + 'pertinggalnya': 'tinggal', + 'pertinggalan': 'tinggal', + 'bertinggal': 'tinggal', + 'sepeninggal': 'tinggal', + 'sepeninggalnya': 'tinggal', + 'sepeninggalan': 'tinggal', + 'ketinggalan': 'tinggal', + 'ketinggalannya': 'tinggal', + 'peninggalannya': 'tinggal', + 'peninggalanan': 'tinggal', + 'meninggalkankan': 'tinggal', + 'meninggalkanku': 'tinggal', + 'meninggalkanmu': 'tinggal', + 'ketertinggalan': 'tinggal', + 'ketertinggalannya': 'tinggal', + 'ketertinggalanku': 'tinggal', + 'peninjau': 'tinjau', + 'peninjaunya': 'tinjau', + 'peninjaukan': 'tinjau', + 'peninjauan': 'tinjau', + 'meninjau': 'tinjau', + 'meninjaunya': 'tinjau', + 'meninjaui': 'tinjau', + 'meninjauan': 'tinjau', + 'tinjauan': 'tinjau', + 'tinjauannya': 'tinjau', + 'peninjauannya': 'tinjau', + 'peninjauanan': 'tinjau', + 'tinjau-meninjau': 'tinjau', + 'bertinjau-tinjauan': 'tinjau', + 'penipu': 'tipu', + 'penipunya': 'tipu', + 'penipuan': 'tipu', + 'menipu': 'tipu', + 'menipunya': 'tipu', + 'menipukan': 'tipu', + 'menipuku': 'tipu', + 'menipumu': 'tipu', + 'tipuan': 'tipu', + 'tipuannya': 'tipu', + 'penipuannya': 'tipu', + 'penipuanlah': 'tipu', + 'bertipuan': 'tipu', + 'peniru': 'tiru', + 'penirunya': 'tiru', + 'peniruan': 'tiru', + 'tiruan': 'tiru', + 'tiruannya': 'tiru', + 'meniru': 'tiru', + 'menirunya': 'tiru', + 'menirulah': 'tiru', + 'menirukan': 'tiru', + 'menirukannya': 'tiru', + 'menirui': 'tiru', + 'menirumu': 'tiru', + 'meniru-niru': 'tiru', + 'tiru-tiruan': 'tiru', + 'menisik': 'tisik', + 'tisikan': 'tisik', + 'menisiki': 'tisik', + 'menitik': 'titik', + 'menitikkan': 'titik', + 'menitikan': 'titik', + 'bertitik': 'titik', + 'menitiki': 'titik', + 'bertitik-titik': 'titik', + 'penitikberatan': 'titik berat', + 'menitikberatkan': 'titik berat', + 'menitikberatkannya': 'titik berat', + 'titisan': 'titis', + 'titisannya': 'titis', + 'menitis': 'titis', + 'menitiskan': 'titis', + 'penitisan': 'titis', + 'ketitisan': 'titis', + 'bernoda': 'noda', + 'bernodakan': 'noda', + 'ternoda': 'noda', + 'ternodanya': 'noda', + 'ternodakan': 'noda', + 'ternodai': 'noda', + 'menodai': 'noda', + 'menodainya': 'noda', + 'penokok': 'tokok', + 'menokok': 'tokok', + 'bertokok': 'tokok', + 'tokok-menokok': 'tokok', + 'penolong': 'tolong', + 'penolongnya': 'tolong', + 'penolongi': 'tolong', + 'penolongan': 'tolong', + 'penolongmu': 'tolong', + 'menolong': 'tolong', + 'menolongnya': 'tolong', + 'menolonglah': 'tolong', + 'menolongku': 'tolong', + 'menolongmu': 'tolong', + 'tertolong': 'tolong', + 'tertolongnya': 'tolong', + 'tertolongkan': 'tolong', + 'tertolongan': 'tolong', + 'ketolongan': 'tolong', + 'pertolongan': 'tolong', + 'pertolongannya': 'tolong', + 'pertolongankan': 'tolong', + 'pertolonganku': 'tolong', + 'pertolonganmu': 'tolong', + 'pertolongan-mu': 'tolong', + 'tolong-menolong': 'tolong', + 'tolong-menolonglah': 'tolong', + 'bertolong-tolongan': 'tolong', + 'tonjolan': 'tonjol', + 'tonjolannya': 'tonjol', + 'menonjol': 'tonjol', + 'menonjolnya': 'tonjol', + 'menonjolkan': 'tonjol', + 'menonjolkannya': 'tonjol', + 'menonjolan': 'tonjol', + 'bertonjol': 'tonjol', + 'bertonjolan': 'tonjol', + 'tertonjol': 'tonjol', + 'tertonjolkan': 'tonjol', + 'penonjolan': 'tonjol', + 'penonjolannya': 'tonjol', + 'bertonjol-tonjol': 'tonjol', + 'menonjol-nonjolkan': 'tonjol', + 'tontonan': 'tonton', + 'tontonannya': 'tonton', + 'penonton': 'tonton', + 'penontonnya': 'tonton', + 'menonton': 'tonton', + 'menontonnya': 'tonton', + 'menontonkan': 'tonton', + 'menontonkannya': 'tonton', + 'menontoni': 'tonton', + 'menontonku': 'tonton', + 'menontonmu': 'tonton', + 'kepenontonan': 'tonton', + 'mempertontonkan': 'tonton', + 'mempertontonkannya': 'tonton', + 'mempertontonkankan': 'tonton', + 'penopang': 'topang', + 'penopangnya': 'topang', + 'topangan': 'topang', + 'menopang': 'topang', + 'menopangnya': 'topang', + 'menopangkan': 'topang', + 'menopangku': 'topang', + 'menopangmu': 'topang', + 'bertopang': 'topang', + 'bertopangkan': 'topang', + 'torehan': 'toreh', + 'torehannya': 'toreh', + 'menoreh': 'toreh', + 'menorehnya': 'toreh', + 'menorehkan': 'toreh', + 'menorehkannya': 'toreh', + 'menorehan': 'toreh', + 'penoreh': 'toreh', + 'penorehnya': 'toreh', + 'penorehan': 'toreh', + 'stensilan': 'stensil', + 'menstensil': 'stensil', + 'penswastaan': 'swasta', + 'menswastakan': 'swasta', + 'kementahan': 'mentah', + 'mementahkan': 'mentah', + 'mementahkannya': 'mentah', + 'mentah-mentah': 'mentah', + 'kementakan': 'mentak', + 'sementang': 'mentang', + 'sementangkan': 'mentang', + 'mentang-mentang': 'mentang', + 'mentang-mentanglah': 'mentang', + 'sementang-mentang': 'mentang', + 'mementegai': 'mentega', + 'kementerengan': 'mentereng', + 'menuam': 'tuam', + 'menuami': 'tuam', + 'bertuam': 'tuam', + 'tuangan': 'tuang', + 'tuangannya': 'tuang', + 'dituang': 'tuang', + 'dituangnya': 'tuang', + 'dituangkan': 'tuang', + 'dituangkannya': 'tuang', + 'dituangi': 'tuang', + 'dituangan': 'tuang', + 'menuang': 'tuang', + 'menuangnya': 'tuang', + 'menuangkan': 'tuang', + 'menuangkannya': 'tuang', + 'menuangi': 'tuang', + 'menuanginya': 'tuang', + 'bertuang': 'tuang', + 'bertuangan': 'tuang', + 'penuangan': 'tuang', + 'penuangannya': 'tuang', + 'ketuangan': 'tuang', + 'tubian': 'tubi', + 'menubikan': 'tubi', + 'bertubi-tubi': 'tubi', + 'bertubi-tubinya': 'tubi', + 'mempertubikan': 'tubi', + 'mempertubi-tubi': 'tubi', + 'mempertubi-tubikan': 'tubi', + 'tugalan': 'tugal', + 'menugal': 'tugal', + 'menugalkan': 'tugal', + 'menujah': 'tujah', + 'menujahkan': 'tujah', + 'penuju': 'tuju', + 'penujukan': 'tuju', + 'penujukannya': 'tuju', + 'setuju': 'tuju', + 'setujunya': 'tuju', + 'setujulah': 'tuju', + 'setujui': 'tuju', + 'setujuan': 'tuju', + 'menuju': 'tuju', + 'menujunya': 'tuju', + 'menujukan': 'tuju', + 'menujukannya': 'tuju', + 'menujui': 'tuju', + 'menujuku': 'tuju', + 'tujuan': 'tuju', + 'tujuannya': 'tuju', + 'tujuanku': 'tuju', + 'tujuanmu': 'tuju', + 'tertuju': 'tuju', + 'tertujunya': 'tuju', + 'tertujuan': 'tuju', + 'setujuannya': 'tuju', + 'bersetuju': 'tuju', + 'bersetujuan': 'tuju', + 'bertujuan': 'tuju', + 'bertujuannya': 'tuju', + 'bertujuani': 'tuju', + 'kesetujuan': 'tuju', + 'kesetujuannya': 'tuju', + 'menyetujui': 'tuju', + 'menyetujuinya': 'tuju', + 'persetujuan': 'tuju', + 'persetujuannya': 'tuju', + 'persetujuanmu': 'tuju', + 'menyetujukan': 'tuju', + 'mempersetujukan': 'tuju', + 'menukul': 'tukul', + 'penukul': 'tukul', + 'menular': 'tular', + 'menularnya': 'tular', + 'menularkan': 'tular', + 'menularkannya': 'tular', + 'menulari': 'tular', + 'menularan': 'tular', + 'menularinya': 'tular', + 'tertulari': 'tular', + 'penularan': 'tular', + 'penularannya': 'tular', + 'penularanan': 'tular', + 'ketularan': 'tular', + 'menumbang': 'tumbang', + 'menumbangkan': 'tumbang', + 'menumbangkannya': 'tumbang', + 'tumpasan': 'tumpas', + 'penumpas': 'tumpas', + 'penumpasan': 'tumpas', + 'menumpas': 'tumpas', + 'menumpasnya': 'tumpas', + 'menumpaskan': 'tumpas', + 'penumpasannya': 'tumpas', + 'penunaian': 'tunai', + 'menunaikan': 'tunai', + 'menunaikannya': 'tunai', + 'pertunaian': 'tunai', + 'penunda': 'tunda', + 'penundaan': 'tunda', + 'menunda': 'tunda', + 'menundanya': 'tunda', + 'menundaan': 'tunda', + 'bertunda': 'tunda', + 'tertunda': 'tunda', + 'tertundanya': 'tunda', + 'penundaannya': 'tunda', + 'penundaani': 'tunda', + 'menundakan': 'tunda', + 'menunda-nunda': 'tunda', + 'menunda-nundanya': 'tunda', + 'bertunda-tunda': 'tunda', + 'menunduk': 'tunduk', + 'menunduklah': 'tunduk', + 'menundukkan': 'tunduk', + 'menundukkannya': 'tunduk', + 'menundukan': 'tunduk', + 'petunduk': 'tunduk', + 'penundukan': 'tunduk', + 'ketundukan': 'tunduk', + 'ketertundukan': 'tunduk', + 'ketertundukannya': 'tunduk', + 'menunduk-nunduk': 'tunduk', + 'menunggang': 'tunggang', + 'menunggangnya': 'tunggang', + 'menunggangi': 'tunggang', + 'tunggangan': 'tunggang', + 'tunggangannya': 'tunggang', + 'penunggang': 'tunggang', + 'penunggangnya': 'tunggang', + 'penunggangan': 'tunggang', + 'bertunggang': 'tunggang', + 'menungganginya': 'tunggang', + 'tertunggang': 'tunggang', + 'bersetunggang': 'tunggang', + 'menunggangkan': 'tunggang', + 'tunggang-tunggit': 'tunggang', + 'tunggang-tunggik': 'tunggang', + 'tunggang-tungging': 'tunggang', + 'mempertunggangkan': 'tunggang', + 'penunggu': 'tunggu', + 'penunggunya': 'tunggu', + 'penungguan': 'tunggu', + 'menunggu': 'tunggu', + 'menunggunya': 'tunggu', + 'menunggulah': 'tunggu', + 'menunggukan': 'tunggu', + 'menunggui': 'tunggu', + 'menungguku': 'tunggu', + 'menunggumu': 'tunggu', + 'menungguinya': 'tunggu', + 'menungguiku': 'tunggu', + 'bertunggu': 'tunggu', + 'menuntun': 'tuntun', + 'menuntunnya': 'tuntun', + 'menuntunkan': 'tuntun', + 'menuntunku': 'tuntun', + 'menuntunmu': 'tuntun', + 'penuntun': 'tuntun', + 'penuntunnya': 'tuntun', + 'penuntunan': 'tuntun', + 'tuntunan': 'tuntun', + 'tuntunannya': 'tuntun', + 'bertuntun': 'tuntun', + 'menuris': 'turis', + 'seturut': 'turut', + 'menurut': 'turut', + 'menurutnya': 'turut', + 'menurutkan': 'turut', + 'menuruti': 'turut', + 'menurutan': 'turut', + 'menurutnyalah': 'turut', + 'menurutku': 'turut', + 'menurutmu': 'turut', + 'menurut-mu': 'turut', + 'penurut': 'turut', + 'penurutnya': 'turut', + 'penurutan': 'turut', + 'turutan': 'turut', + 'menurutinya': 'turut', + 'berturuti': 'turut', + 'perturutan': 'turut', + 'perturutannya': 'turut', + 'turut-menurut': 'turut', + 'turut-turutan': 'turut', + 'berturut-turut': 'turut', + 'berturut-turutnya': 'turut', + 'berturut-turutlah': 'turut', + 'memperturutkan': 'turut', + 'memperturut-turutkan': 'turut', + 'menusuk': 'tusuk', + 'menusuknya': 'tusuk', + 'menusukkan': 'tusuk', + 'menusukkannya': 'tusuk', + 'menusuki': 'tusuk', + 'menusukan': 'tusuk', + 'menusukku': 'tusuk', + 'menusukmu': 'tusuk', + 'tertusuk': 'tusuk', + 'tertusuknya': 'tusuk', + 'menusuk-nusuk': 'tusuk', + 'menusuk-nusukkan': 'tusuk', + 'menusuk-nusukan': 'tusuk', + 'menutup': 'tutup', + 'menutupnya': 'tutup', + 'menutupkan': 'tutup', + 'menutupi': 'tutup', + 'menutupan': 'tutup', + 'menutupku': 'tutup', + 'tutupan': 'tutup', + 'tutupannya': 'tutup', + 'penutup': 'tutup', + 'penutupnya': 'tutup', + 'penutupkan': 'tutup', + 'penutupi': 'tutup', + 'penutupan': 'tutup', + 'tertutup': 'tutup', + 'tertutupnya': 'tutup', + 'tertutuplah': 'tutup', + 'tertutupi': 'tutup', + 'bertutup': 'tutup', + 'bertutupkan': 'tutup', + 'menutupinya': 'tutup', + 'penutupannya': 'tutup', + 'penutupani': 'tutup', + 'ketertutupan': 'tutup', + 'ketertutupannya': 'tutup', + 'tersadar': 'sadar', + 'tersadarkan': 'sadar', + 'menyadar': 'sadar', + 'menyadarkan': 'sadar', + 'menyadarkannya': 'sadar', + 'menyadari': 'sadar', + 'menyadarinya': 'sadar', + 'menyadarilah': 'sadar', + 'kesadaran': 'sadar', + 'kesadarannya': 'sadar', + 'kesadaranku': 'sadar', + 'penyadaran': 'sadar', + 'penyadaranlah': 'sadar', + 'menyadarkanku': 'sadar', + 'menyadarkanmu': 'sadar', + 'sahutan': 'sahut', + 'sahutannya': 'sahut', + 'bersahut': 'sahut', + 'bersahutan': 'sahut', + 'penyahut': 'sahut', + 'menyahut': 'sahut', + 'menyahutnya': 'sahut', + 'menyahuti': 'sahut', + 'menyahutinya': 'sahut', + 'penyahutan': 'sahut', + 'sahut-menyahut': 'sahut', + 'bersahut-sahutan': 'sahut', + 'saingan': 'saing', + 'saingannya': 'saing', + 'sainganku': 'saing', + 'sainganmu': 'saing', + 'sesaing': 'saing', + 'pesaing': 'saing', + 'pesaingnya': 'saing', + 'pesaingan': 'saing', + 'pesaingku': 'saing', + 'penyaing': 'saing', + 'bersaing': 'saing', + 'bersaingnya': 'saing', + 'bersainglah': 'saing', + 'bersaingan': 'saing', + 'menyaingi': 'saing', + 'menyainginya': 'saing', + 'menyaingikan': 'saing', + 'menyaingiku': 'saing', + 'tersaingi': 'saing', + 'persaingan': 'saing', + 'persaingannya': 'saing', + 'persainganlah': 'saing', + 'persainganan': 'saing', + 'bersaingannya': 'saing', + 'mempersaingkan': 'saing', + 'saing-menyaing': 'saing', + 'penyalahgunaan': 'salah guna', + 'penyalahgunaannya': 'salah guna', + 'menyalahgunakan': 'salah guna', + 'menyalahgunakannya': 'salah guna', + 'salaian': 'salai', + 'tersalai': 'salai', + 'bersalai': 'salai', + 'saluran': 'salur', + 'salurannya': 'salur', + 'salurankan': 'salur', + 'saluranku': 'salur', + 'penyalur': 'salur', + 'penyalurnya': 'salur', + 'penyalurkan': 'salur', + 'penyaluran': 'salur', + 'tersalur': 'salur', + 'tersalurnya': 'salur', + 'tersalurkan': 'salur', + 'tersalurkannya': 'salur', + 'tersaluri': 'salur', + 'penyalurannya': 'salur', + 'penyaluranlah': 'salur', + 'penyaluranan': 'salur', + 'menyalurkan': 'salur', + 'menyalurkannya': 'salur', + 'menyalurkankannya': 'salur', + 'penyamak': 'samak', + 'penyamaknya': 'samak', + 'penyamakan': 'samak', + 'menyamak': 'samak', + 'menyamakkan': 'samak', + 'kenyamanan': 'nyaman', + 'kenyamanannya': 'nyaman', + 'kenyamananlah': 'nyaman', + 'kenyamananan': 'nyaman', + 'kenyamananmu': 'nyaman', + 'menyamankan': 'saman', + 'menyamankannya': 'saman', + 'sambaran': 'sambar', + 'sambarannya': 'sambar', + 'menyambar': 'sambar', + 'menyambarnya': 'sambar', + 'menyambarku': 'sambar', + 'penyambar': 'sambar', + 'tersambar': 'sambar', + 'tersambarnya': 'sambar', + 'bersambaran': 'sambar', + 'sambar-menyambar': 'sambar', + 'menyambar-nyambar': 'sambar', + 'bersambar-sambaran': 'sambar', + 'sambutan': 'sambut', + 'sambutannya': 'sambut', + 'menyambut': 'sambut', + 'menyambutnya': 'sambut', + 'menyambutkan': 'sambut', + 'menyambutan': 'sambut', + 'menyambutku': 'sambut', + 'menyambutmu': 'sambut', + 'bersambut': 'sambut', + 'bersambutan': 'sambut', + 'penyambut': 'sambut', + 'penyambutnya': 'sambut', + 'penyambutkan': 'sambut', + 'penyambutan': 'sambut', + 'penyambutannya': 'sambut', + 'sambut-menyambut': 'sambut', + 'bersambut-sambutan': 'sambut', + 'penyampah': 'sampah', + 'menyampah': 'sampah', + 'menyampahi': 'sampah', + 'penyampahan': 'sampah', + 'persampahan': 'sampah', + 'mempersampahkan': 'sampah', + 'tersampang': 'sampang', + 'menyampang': 'sampang', + 'menyampangi': 'sampang', + 'menyampu': 'sampu', + 'menyampuk': 'sampuk', + 'bersampuk': 'sampuk', + 'tersampuk': 'sampuk', + 'kesampukan': 'sampuk', + 'menyampukkan': 'sampuk', + 'samunan': 'samun', + 'menyamun': 'samun', + 'penyamun': 'samun', + 'kesamunan': 'samun', + 'menyamuni': 'samun', + 'penyamunan': 'samun', + 'bersandiwara': 'sandiwara', + 'penyandiwaraan': 'sandiwara', + 'menyandiwarakan': 'sandiwara', + 'penyangga': 'sangga', + 'penyangganya': 'sangga', + 'penyanggaan': 'sangga', + 'bersangga': 'sangga', + 'menyangga': 'sangga', + 'menyangganya': 'sangga', + 'bersanggakan': 'sangga', + 'sangkaan': 'sangka', + 'sangkaannya': 'sangka', + 'tersangka': 'sangka', + 'tersangkanya': 'sangka', + 'tersangkalah': 'sangka', + 'tersangkakan': 'sangka', + 'tersangkai': 'sangka', + 'tersangkaan': 'sangka', + 'menyangka': 'sangka', + 'menyangkanya': 'sangka', + 'menyangkakan': 'sangkak', + 'menyangkakannya': 'sangka', + 'bersangka': 'sangka', + 'sangkalan': 'sangkal', + 'sangkalannya': 'sangkal', + 'bersangkal': 'sangkal', + 'penyangkal': 'sangkal', + 'penyangkalan': 'sangkal', + 'menyangkal': 'sangkal', + 'menyangkalnya': 'sangkal', + 'menyangkali': 'sangkal', + 'penyangkalannya': 'sangkal', + 'penyangkalanku': 'sangkal', + 'sangkutan': 'sangkut', + 'sangkutannya': 'sangkut', + 'penyangkut': 'sangkut', + 'penyangkutnya': 'sangkut', + 'bersangkut': 'sangkut', + 'bersangkutkan': 'sangkut', + 'bersangkutan': 'sangkut', + 'menyangkut': 'sangkut', + 'menyangkutnya': 'sangkut', + 'menyangkutkan': 'sangkut', + 'menyangkutkannya': 'sangkut', + 'tersangkut': 'sangkut', + 'tersangkutnya': 'sangkut', + 'tersangkutan': 'sangkut', + 'persangkutan': 'sangkut', + 'bersangkutannya': 'sangkut', + 'bersangkutanlah': 'sangkut', + 'mempersangkutkan': 'sangkut', + 'sangkut-menyangkut': 'sangkut', + 'menyangkut-nyangkutkan': 'sangkut', + 'sanjungan': 'sanjung', + 'sanjungannya': 'sanjung', + 'tersanjung': 'sanjung', + 'tersanjungnya': 'sanjung', + 'menyanjung': 'sanjung', + 'menyanjungnya': 'sanjung', + 'menyanjungku': 'sanjung', + 'penyanjung': 'sanjung', + 'penyanjungan': 'sanjung', + 'menyanjung-nyanjung': 'sanjung', + 'menyanjung-nyanjungkan': 'sanjung', + 'sapaan': 'sapa', + 'sapaannya': 'sapa', + 'disapa': 'sapa', + 'disapanya': 'sapa', + 'disapai': 'sapa', + 'menyapa': 'sapa', + 'menyapanya': 'sapa', + 'menyapalah': 'sapa', + 'menyapakan': 'sapa', + 'menyapai': 'sapa', + 'menyapaku': 'sapa', + 'bersapa': 'sapa', + 'bersapaan': 'sapa', + 'tersapa': 'sapa', + 'sapa-menyapa': 'sapa', + 'bersapa-sapaan': 'sapa', + 'menyara': 'sara', + 'menyarakan': 'sarak', + 'menyarakannya': 'sara', + 'bersara': 'sara', + 'bersarakan': 'sarak', + 'menyarai': 'sara', + 'tersara bara': 'sara', + 'saranan': 'saran', + 'saranannya': 'saran', + 'saranani': 'saran', + 'menyarani': 'saran', + 'menyarankan': 'saran', + 'menyarankannya': 'saran', + 'menyarankankan': 'saran', + 'menyarankanku': 'saran', + 'sari-sari': 'sari', + 'sari-sarinya': 'sari', + 'menyarikan': 'sari', + 'sayatan': 'sayat', + 'sayatannya': 'sayat', + 'sesayat': 'sayat', + 'tersayat': 'sayat', + 'tersayatnya': 'sayat', + 'menyayat': 'sayat', + 'menyayatnya': 'sayat', + 'menyayatkan': 'sayat', + 'menyayati': 'sayat', + 'menyayat-nyayat': 'sayat', + 'kesayuan': 'sayu', + 'menyayukan': 'sayu', + 'sebaran': 'sebar', + 'sebarannya': 'sebar', + 'penyebar': 'sebar', + 'penyebarnya': 'sebar', + 'penyebarkan': 'sebar', + 'penyebaran': 'sebar', + 'menyebar': 'sebar', + 'menyebarnya': 'sebar', + 'menyebarlah': 'sebar', + 'menyebarkan': 'sebar', + 'menyebarkannya': 'sebar', + 'menyebari': 'sebar', + 'menyebaran': 'sebar', + 'tersebar': 'sebar', + 'tersebarnya': 'sebar', + 'tersebarlah': 'sebar', + 'tersebarkan': 'sebar', + 'tersebari': 'sebar', + 'bersebar': 'sebar', + 'bersebaran': 'sebar', + 'penyebarannya': 'sebar', + 'persebaran': 'sebar', + 'persebarannya': 'sebar', + 'menyebarkanlah': 'sebar', + 'tersebar luas': 'sebar luas', + 'penyebarluasan': 'sebar luas', + 'penyebarluasannya': 'sebar luas', + 'menyebarluaskan': 'sebar luas', + 'menyebarluaskannya': 'sebar luas', + 'menyebat': 'sebat', + 'menyebatkan': 'sebat', + 'kesebatan': 'sebat', + 'penyebatan': 'sebat', + 'sebutan': 'sebut', + 'sebutannya': 'sebut', + 'tersebut': 'sebut', + 'tersebutnya': 'sebut', + 'tersebutlah': 'sebut', + 'tersebutkan': 'sebut', + 'tersebuti': 'sebut', + 'penyebut': 'sebut', + 'penyebutnya': 'sebut', + 'penyebutkan': 'sebut', + 'penyebutan': 'sebut', + 'menyebut': 'sebut', + 'menyebutnya': 'sebut', + 'menyebutkan': 'sebut', + 'menyebutkannya': 'sebut', + 'menyebutan': 'sebut', + 'menyebutku': 'sebut', + 'menyebutmu': 'sebut', + 'penyebutannya': 'sebut', + 'penyebutanan': 'sebut', + 'menyebutkankan': 'sebut', + 'menyebutkani': 'sebut', + 'bersedih': 'sedih', + 'bersedihlah': 'sedih', + 'penyedih': 'sedih', + 'kesedihan': 'sedih', + 'kesedihannya': 'sedih', + 'kesedihanlah': 'sedih', + 'kesedihanku': 'sedih', + 'kesedihanmu': 'sedih', + 'menyedihkan': 'sedih', + 'menyedihkannya': 'sedih', + 'menyedihkanlah': 'sedih', + 'tersedih-sedih': 'sedih', + 'penyeduh': 'seduh', + 'penyeduhan': 'seduh', + 'menyeduh': 'seduh', + 'menyeduhnya': 'seduh', + 'menyeduhkan': 'seduh', + 'terseduh-seduh': 'seduh', + 'penyegan': 'segan', + 'keseganan': 'segan', + 'kesegananan': 'segan', + 'menyegani': 'segan', + 'menyeganinya': 'segan', + 'segan-segan': 'segan', + 'segan-segannya': 'segan', + 'segan-menyegan': 'segan', + 'segan-menyegani': 'segan', + 'menyejatkan': 'sejat', + 'sekaan': 'seka', + 'berseka': 'seka', + 'menyeka': 'seka', + 'menyekanya': 'seka', + 'menyekalah': 'seka', + 'menyekai': 'seka', + 'menyekakan': 'seka', + 'peselam': 'selam', + 'terselam': 'selam', + 'terselami': 'selam', + 'menyelam': 'selam', + 'menyelamnya': 'selam', + 'menyelamlah': 'selam', + 'menyelamkan': 'selam', + 'menyelami': 'selam', + 'berselam': 'selam', + 'penyelam': 'selam', + 'penyelamnya': 'selam', + 'penyelaman': 'selam', + 'menyelaminya': 'selam', + 'penyelamannya': 'selam', + 'penyelamanan': 'selam', + 'menyelar': 'selar', + 'menyelarkan': 'selar', + 'selenggaraan': 'selenggara', + 'menyelenggara': 'selenggara', + 'menyelenggarakan': 'selenggara', + 'menyelenggarakannya': 'selenggara', + 'menyelenggaraan': 'selenggara', + 'penyelenggara': 'selenggara', + 'penyelenggaranya': 'selenggara', + 'penyelenggaralah': 'selenggara', + 'penyelenggarakan': 'selenggara', + 'penyelenggarai': 'selenggara', + 'penyelenggaraan': 'selenggara', + 'terselenggara': 'selenggara', + 'terselenggaranya': 'selenggara', + 'terselenggaralah': 'selenggara', + 'terselenggarakan': 'selenggara', + 'terselenggarakannya': 'selenggara', + 'penyelenggaraannya': 'selenggara', + 'selesaian': 'selesai', + 'keselesaian': 'selesai', + 'penyelesaian': 'selesai', + 'penyelesaiannya': 'selesai', + 'penyelesaianlah': 'selesai', + 'penyelesaianan': 'selesai', + 'menyelesaikan': 'selesai', + 'menyelesaikannya': 'selesai', + 'terselesaikan': 'selesai', + 'terselesaikannya': 'selesai', + 'menyeleweng': 'seleweng', + 'menyelewengnya': 'seleweng', + 'menyelewengkan': 'seleweng', + 'menyelewengkannya': 'seleweng', + 'menyelewengi': 'seleweng', + 'menyelewengan': 'seleweng', + 'penyeleweng': 'seleweng', + 'penyelewengkan': 'seleweng', + 'penyelewengan': 'seleweng', + 'penyelewengannya': 'seleweng', + 'penyelidik': 'selidik', + 'penyelidiknya': 'selidik', + 'penyelidikkan': 'selidik', + 'penyelidiki': 'selidik', + 'penyelidikan': 'selidik', + 'menyelidik': 'selidik', + 'menyelidiknya': 'selidik', + 'menyelidiki': 'selidik', + 'menyelidikan': 'selidik', + 'menyelidikinya': 'selidik', + 'menyelidikii': 'selidik', + 'penyelidikannya': 'selidik', + 'berselimut': 'selimut', + 'berselimutkan': 'selimut', + 'berselimuti': 'selimut', + 'menyelimuti': 'selimut', + 'menyelimutinya': 'selimut', + 'menyelimutiku': 'selimut', + 'menyelimutimu': 'selimut', + 'menyelimutkan': 'selimut', + 'penyelinap': 'selinap', + 'penyelinapan': 'selinap', + 'menyelinap': 'selinap', + 'menyelinapnya': 'selinap', + 'menyelinaplah': 'selinap', + 'menyelinapkan': 'selinap', + 'menyelinapkannya': 'selinap', + 'penyelinapannya': 'selinap', + 'selipan': 'selip', + 'menyelip': 'selip', + 'menyelipnya': 'selip', + 'menyelipkan': 'selip', + 'menyelipkannya': 'selip', + 'menyelipi': 'selip', + 'terselip': 'selip', + 'terselipnya': 'selip', + 'terseliplah': 'selip', + 'terselipkan': 'selip', + 'terselipi': 'selip', + 'terselip': 'selip', + 'menyelisik': 'selisik', + 'penyelisikan': 'selisik', + 'terselit': 'selit', + 'menyelitkan': 'selit', + 'berselit sepit': 'selit', + 'berselit-selit': 'selit', + 'berselubung': 'selubung', + 'berselubungkan': 'selubung', + 'menyelubung': 'selubung', + 'menyelubungkan': 'selubung', + 'menyelubungi': 'selubung', + 'penyelubung': 'selubung', + 'penyelubungan': 'selubung', + 'terselubung': 'selubung', + 'terselubungnya': 'selubung', + 'terselubungi': 'selubung', + 'menyelubunginya': 'selubung', + 'seludupan': 'seludup', + 'penyeludup': 'seludup', + 'penyeludupan': 'seludup', + 'menyeludup': 'seludup', + 'menyeludupkan': 'seludup', + 'menyeludupkannya': 'seludup', + 'berseluk': 'seluk', + 'menyeluk': 'seluk', + 'seluk-semeluk': 'seluk', + 'memperselukkan': 'seluk', + 'semahan': 'semah', + 'menyemah': 'semah', + 'penyemah': 'semah', + 'semah-semah': 'semah', + 'menyemahkan': 'semah', + 'semaian': 'semai', + 'tersemai': 'semai', + 'tersemainya': 'semai', + 'menyemai': 'semai', + 'menyemaikan': 'semai', + 'pesemaian': 'semai', + 'penyemaian': 'semai', + 'penyemaiannya': 'semai', + 'persemaian': 'semai', + 'persemaiannya': 'semai', + 'mempersemaikan': 'semai', + 'sematan': 'semat', + 'menyemat': 'semat', + 'menyematkan': 'semat', + 'menyematkannya': 'semat', + 'menyemati': 'semat', + 'tersemat': 'semat', + 'tersematnya': 'semat', + 'tersematkan': 'semat', + 'tersemati': 'semat', + 'penyemat': 'semat', + 'penyematan': 'semat', + 'penyematannya': 'semat', + 'sembelihan': 'sembelih', + 'penyembelih': 'sembelih', + 'penyembelihan': 'sembelih', + 'menyembelih': 'sembelih', + 'menyembelihnya': 'sembelih', + 'penyembelihannya': 'sembelih', + 'penyembuh': 'sembuh', + 'penyembuhnya': 'sembuh', + 'penyembuhkan': 'sembuh', + 'penyembuhan': 'sembuh', + 'kesembuhan': 'sembuh', + 'kesembuhannya': 'sembuh', + 'kesembuhanku': 'sembuh', + 'penyembuhannya': 'sembuh', + 'penyembuhanku': 'sembuh', + 'penyembuhanmu': 'sembuh', + 'menyembuhkan': 'sembuh', + 'menyembuhkannya': 'sembuh', + 'menyembuhkanku': 'sembuh', + 'menyembuhkanmu': 'sembuh', + 'bersenang': 'senang', + 'kesenangan': 'senang', + 'kesenangannya': 'senang', + 'kesenanganku': 'senang', + 'kesenanganmu': 'senang', + 'menyenangi': 'senang', + 'menyenanginya': 'senang', + 'menyenangkan': 'senang', + 'menyenangkannya': 'senang', + 'mempersenang': 'senang', + 'mempersenangkan': 'senang', + 'bersenang-senang': 'senang', + 'bersenang-senangnya': 'senang', + 'bersenang-senanglah': 'senang', + 'bersenang-senangkan': 'senang', + 'menyenaraikan': 'senarai', + 'sendalan': 'sendal', + 'tersendal': 'sendal', + 'menyendal': 'sendal', + 'kesendalan': 'sendal', + 'menyendalkan': 'sendal', + 'bersendeng': 'sendeng', + 'menyendeng': 'sendeng', + 'menyendengkan': 'sendeng', + 'bersendengan': 'sendeng', + 'tersendeng-sendeng': 'sendeng', + 'sengauan': 'sengau', + 'menyengau': 'sengau', + 'penyengauan': 'sengau', + 'menyengaukan': 'sengau', + 'sengau-sengauan': 'sengau', + 'tersenget': 'senget', + 'menyenget': 'senget', + 'menyengetkan': 'senget', + 'sentakan': 'sentak', + 'menyentak': 'sentak', + 'menyentaknya': 'sentak', + 'menyentakkan': 'sentak', + 'menyentakan': 'sentak', + 'tersentak': 'sentak', + 'tersentaklah': 'sentak', + 'menyentak-nyentak': 'sentak', + 'sepakan': 'sepak', + 'sepakannya': 'sepak', + 'sepakanku': 'sepak', + 'penyepak': 'sepak', + 'menyepak': 'sepak', + 'menyepaknya': 'sepak', + 'menyepakkan': 'sepak', + 'menyepaki': 'sepak', + 'penyepakan': 'sepak', + 'bersepak-sepakan': 'sepak', + 'menyepak-nyepakkan': 'sepak', + 'keseraman': 'seram', + 'keseramannya': 'seram', + 'menyeramkan': 'seram', + 'menyeramkannya': 'seram', + 'menyeranah': 'seranah', + 'serangan': 'serang', + 'serangannya': 'serang', + 'serangankan': 'serang', + 'seranganan': 'serang', + 'seranganmu': 'serang', + 'menyerang': 'serang', + 'menyerangnya': 'serang', + 'menyeranglah': 'serang', + 'menyerangkan': 'serang', + 'menyerangan': 'serang', + 'menyerangku': 'serang', + 'menyerangmu': 'serang', + 'penyerang': 'serang', + 'penyerangnya': 'serang', + 'penyeranglah': 'serang', + 'penyerangkan': 'serang', + 'penyerangan': 'serang', + 'penyerangmu': 'serang', + 'berserang': 'serang', + 'berserangan': 'serang', + 'terserang': 'serang', + 'terserangnya': 'serang', + 'penyerangannya': 'serang', + 'penyeranganlah': 'serang', + 'serang-serangan': 'serang', + 'serang-serangannya': 'serang', + 'serang-menyerang': 'serang', + 'teserbu': 'serbu', + 'serbuan': 'serbu', + 'serbuannya': 'serbu', + 'menyerbu': 'serbu', + 'menyerbunya': 'serbu', + 'penyerbuan': 'serbu', + 'penyerbuannya': 'serbu', + 'menyerbukan': 'serbu', + 'terseret': 'seret', + 'terseretnya': 'seret', + 'terseretlah': 'seret', + 'penyeret': 'seret', + 'penyeretan': 'seret', + 'menyeret': 'seret', + 'menyeretnya': 'seret', + 'menyeretkan': 'seret', + 'menyeretku': 'seret', + 'menyeret-nyeret': 'seret', + 'menyerkap': 'serkap', + 'menyerkapi': 'serkap', + 'penyerkapan': 'serkap', + 'teserlah': 'serlah', + 'menyerlah': 'serlah', + 'penyesah': 'sesah', + 'penyesahan': 'sesah', + 'bersesah': 'sesah', + 'menyesah': 'sesah', + 'menyesahkan': 'sesah', + 'sesalan': 'sesal', + 'bersesal': 'sesal', + 'menyesal': 'sesal', + 'menyesalnya': 'sesal', + 'menyesallah': 'sesal', + 'menyesalkan': 'sesal', + 'menyesalkannya': 'sesal', + 'menyesali': 'sesal', + 'menyesalinya': 'sesal', + 'penyesalan': 'sesal', + 'penyesalannya': 'sesal', + 'penyesalanlah': 'sesal', + 'penyesalanku': 'sesal', + 'bersesalan': 'sesal', + 'menyesalkanlah': 'sesal', + 'sesal-menyesali': 'sesal', + 'penyetir': 'setir', + 'penyetiran': 'setir', + 'menyetir': 'setir', + 'menyetirnya': 'setir', + 'menyetiri': 'setir', + 'sewaan': 'sewa', + 'sewaannya': 'sewa', + 'menyewa': 'sewa', + 'menyewanya': 'sewa', + 'menyewakan': 'sewa', + 'menyewakannya': 'sewa', + 'menyewaan': 'sewa', + 'menyewaku': 'sewa', + 'penyewa': 'sewa', + 'penyewanya': 'sewa', + 'penyewaan': 'sewa', + 'penyewaannya': 'sewa', + 'mempersewakan': 'sewa', + 'bersiap': 'siap', + 'bersiapnya': 'siap', + 'bersiaplah': 'siap', + 'bersiapkan': 'siap', + 'bersiapan': 'siap', + 'penyiapan': 'siap', + 'penyiapannya': 'siap', + 'persiapan': 'siap', + 'persiapannya': 'siap', + 'persiapanlah': 'siap', + 'persiapankan': 'siap', + 'persiapanan': 'siap', + 'persiapanku': 'siap', + 'persiapanmu': 'siap', + 'menyiapkan': 'siap', + 'menyiapkannya': 'siap', + 'menyiapkanlah': 'siap', + 'menyiapkanku': 'siap', + 'bersiap-siap': 'siap', + 'bersiap-siaplah': 'siap', + 'bersiap-siapkan': 'siap', + 'mempersiapkan': 'siap', + 'mempersiapkannya': 'siap', + 'mempersiapkanan': 'siap', + 'siaran': 'siar', + 'siarannya': 'siar', + 'siarankan': 'siar', + 'siaranku': 'siar', + 'pesiar': 'siar', + 'pesiarnya': 'siar', + 'penyiar': 'siar', + 'penyiarnya': 'siar', + 'penyiaran': 'siar', + 'tersiar': 'siar', + 'tersiarnya': 'siar', + 'tersiarlah': 'siar', + 'tersiarkan': 'siar', + 'tersiarkannya': 'siar', + 'menyiar': 'siar', + 'menyiarkan': 'siar', + 'menyiarkannya': 'siar', + 'menyiaran': 'siar', + 'bersiar': 'siar', + 'bersiaran': 'siar', + 'penyiarannya': 'siar', + 'persiaran': 'siar', + 'bersiar-siar': 'siar', + 'menyiasat': 'siasat', + 'menyiasatkan': 'siasat', + 'menyiasati': 'siasat', + 'bersiasat': 'siasat', + 'menyiasatinya': 'siasat', + 'menyidai': 'sidai', + 'menyidaikan': 'sidai', + 'menyigung': 'sigung', + 'tersihir': 'sihir', + 'menyihir': 'sihir', + 'menyihirnya': 'sihir', + 'menyihiri': 'sihir', + 'menyihirkan': 'sihir', + 'siksaan': 'siksa', + 'siksaannya': 'siksa', + 'penyiksa': 'siksa', + 'penyiksanya': 'siksa', + 'penyiksaan': 'siksa', + 'penyiksaku': 'siksa', + 'tersiksa': 'siksa', + 'tersiksanya': 'siksa', + 'menyiksa': 'siksa', + 'menyiksanya': 'siksa', + 'menyiksalah': 'siksa', + 'menyiksakan': 'siksa', + 'menyiksaan': 'siksa', + 'menyiksaku': 'siksa', + 'menyiksamu': 'siksa', + 'menyiksai': 'siksa', + 'penyiksaannya': 'siksa', + 'ketersiksaan': 'siksa', + 'bersiku': 'siku', + 'menyiku': 'siku', + 'menyikunya': 'siku', + 'siku-siku': 'siku', + 'siku-sikunya': 'siku', + 'menyikukan': 'siku', + 'tersilau': 'silau', + 'tersilaukan': 'silau', + 'menyilau': 'silau', + 'menyilaukan': 'silau', + 'kesilauan': 'silau', + 'menyimbah': 'simbah', + 'bersimbah': 'simbah', + 'bersimbahkan': 'simbah', + 'tersimbah': 'simbah', + 'menyimbahkan': 'simbah', + 'simpanan': 'simpan', + 'simpanannya': 'simpan', + 'simpananmu': 'simpan', + 'menyimpan': 'simpan', + 'menyimpannya': 'simpan', + 'menyimpankan': 'simpan', + 'menyimpanan': 'simpan', + 'bersimpan': 'simpan', + 'penyimpan': 'simpan', + 'penyimpannya': 'simpan', + 'penyimpanan': 'simpan', + 'tersimpan': 'simpan', + 'tersimpannya': 'simpan', + 'menyimpani': 'simpan', + 'penyimpanannya': 'simpan', + 'penyimpananan': 'simpan', + 'sindiran': 'sindir', + 'sindirannya': 'sindir', + 'penyindir': 'sindir', + 'penyindiran': 'sindir', + 'menyindir': 'sindir', + 'menyindirnya': 'sindir', + 'menyindirkan': 'sindir', + 'menyindiri': 'sindir', + 'tersindir': 'sindir', + 'tersindiri': 'sindir', + 'sindir-menyindir': 'sindir', + 'menyinggung': 'singgung', + 'menyinggungnya': 'singgung', + 'menyinggungkan': 'singgung', + 'menyinggungku': 'singgung', + 'tersinggung': 'singgung', + 'tersinggungnya': 'singgung', + 'persinggungan': 'singgung', + 'persinggungannya': 'singgung', + 'bersinggungan': 'singgung', + 'menyingkir': 'singkir', + 'menyingkirnya': 'singkir', + 'menyingkirlah': 'singkir', + 'menyingkirkan': 'singkir', + 'menyingkirkannya': 'singkir', + 'menyingkiran': 'singkir', + 'tersingkir': 'singkir', + 'tersingkirnya': 'singkir', + 'tersingkirkan': 'singkir', + 'tersingkirkannya': 'singkir', + 'tersingkiri': 'singkir', + 'penyingkir': 'singkir', + 'penyingkiran': 'singkir', + 'menyingkiri': 'singkir', + 'menyingkirikan': 'singkir', + 'penyingkirannya': 'singkir', + 'menyingkirkanku': 'singkir', + 'menyingkirkanmu': 'singkir', + 'tersingsing': 'singsing', + 'menyingsing': 'singsing', + 'menyingsingkan': 'singsing', + 'disisih': 'sisih', + 'disisihkan': 'sisih', + 'disisihkannya': 'sisih', + 'tersisih': 'sisih', + 'tersisihnya': 'sisih', + 'tersisihkan': 'sisih', + 'tersisihkannya': 'sisih', + 'tersisihan': 'sisih', + 'menyisih': 'sisih', + 'menyisihkan': 'sisih', + 'menyisihkannya': 'sisih', + 'menyisihan': 'sisih', + 'penyisihan': 'sisih', + 'penyisihannya': 'sisih', + 'menyisihkankan': 'sisih', + 'ketersisihan': 'sisih', + 'sisipan': 'sisip', + 'tersisip': 'sisip', + 'tersisipnya': 'sisip', + 'tersisipkan': 'sisip', + 'tersisipi': 'sisip', + 'menyisip': 'sisip', + 'menyisipkan': 'sisip', + 'menyisipkannya': 'sisip', + 'menyisipi': 'sisip', + 'penyisip': 'sisip', + 'penyisipan': 'sisip', + 'kesisipan': 'sisip', + 'mempersisipkan': 'sisip', + 'sogokan': 'sogok', + 'sogokannya': 'sogok', + 'penyogok': 'sogok', + 'penyogokkan': 'sogok', + 'penyogokan': 'sogok', + 'menyogok': 'sogok', + 'menyogoknya': 'sogok', + 'sokongan': 'sokong', + 'sokongannya': 'sokong', + 'sokonganku': 'sokong', + 'menyokong': 'sokong', + 'menyokongnya': 'sokong', + 'penyokong': 'sokong', + 'penyokongnya': 'sokong', + 'penyokongan': 'sokong', + 'menyokongkan': 'sokong', + 'menyompoh': 'sompoh', + 'sorotan': 'sorot', + 'sorotannya': 'sorot', + 'menyorot': 'sorot', + 'menyorotnya': 'sorot', + 'menyorotlah': 'sorot', + 'menyorotkan': 'sorot', + 'menyorotkannya': 'sorot', + 'menyoroti': 'sorot', + 'penyorot': 'sorot', + 'penyoroti': 'sorot', + 'penyorotan': 'sorot', + 'menyorotinya': 'sorot', + 'suapan': 'suap', + 'suapannya': 'suap', + 'sesuap': 'suap', + 'menyuap': 'suap', + 'menyuapnya': 'suap', + 'menyuapkan': 'suap', + 'menyuapkannya': 'suap', + 'menyuapi': 'suap', + 'menyuapan': 'suap', + 'penyuap': 'suap', + 'penyuapnya': 'suap', + 'penyuapan': 'suap', + 'bersuap': 'suap', + 'bersuapan': 'suap', + 'menyuapinya': 'suap', + 'penyuapannya': 'suap', + 'menyuapkankan': 'suap', + 'bersuap-suapan': 'suap', + 'sesukat': 'sukat', + 'sukatan': 'sukat', + 'sukatani': 'sukat', + 'penyukat': 'sukat', + 'menyukat': 'sukat', + 'bersukat': 'sukat', + 'penyukatan': 'sukat', + 'sulaan': 'sula', + 'menyula': 'sula', + 'menyulai': 'sula', + 'penyula': 'sula', + 'penyulai': 'sula', + 'penyulaan': 'sula', + 'menyulakan': 'sula', + 'sulaman': 'sulam', + 'sulamannya': 'sulam', + 'sulamani': 'sulam', + 'menyulam': 'sulam', + 'menyulamnya': 'sulam', + 'menyulamkan': 'sulam', + 'bersulam': 'sulam', + 'penyulaman': 'sulam', + 'penyulamannya': 'sulam', + 'pesulap': 'sulap', + 'pesulapnya': 'sulap', + 'sulapan': 'sulap', + 'menyulap': 'sulap', + 'menyulapnya': 'sulap', + 'menyulapmu': 'sulap', + 'penyulap': 'sulap', + 'penyulapan': 'sulap', + 'bersulap': 'sulap', + 'sulingan': 'suling', + 'menyuling': 'suling', + 'tersuling': 'suling', + 'penyulingan': 'suling', + 'penyulingannya': 'suling', + 'menyulingkan': 'suling', + 'sunatan': 'sunat', + 'sunatannya': 'sunat', + 'bersunat': 'sunat', + 'menyunat': 'sunat', + 'menyunatnya': 'sunat', + 'menyunatkan': 'sunat', + 'menyunati': 'sunat', + 'penyunatan': 'sunat', + 'menyunatrasulkan': 'sunat rasul', + 'bersundal': 'sundal', + 'menyundal': 'sundal', + 'persundalan': 'sundal', + 'sungkupan': 'sungkup', + 'penyungkup': 'sungkup', + 'menyungkup': 'sungkup', + 'tersungkup': 'sungkup', + 'bersungkup': 'sungkup', + 'menyungkupi': 'sungkup', + 'menyungkupkan': 'sungkup', + 'tersungkur': 'sungkur', + 'tersungkurnya': 'sungkur', + 'menyungkur': 'sungkur', + 'menyungkurkan': 'sungkur', + 'suntikan': 'suntik', + 'suntikannya': 'suntik', + 'menyuntik': 'suntik', + 'menyuntiknya': 'suntik', + 'menyuntikkan': 'suntik', + 'menyuntikkannya': 'suntik', + 'menyuntikan': 'suntik', + 'menyuntikku': 'suntik', + 'penyuntikan': 'suntik', + 'penyuntikannya': 'suntik', + 'suntingan': 'sunting', + 'suntingannya': 'sunting', + 'menyunting': 'sunting', + 'menyuntingnya': 'sunting', + 'tersunting': 'sunting', + 'bersunting': 'sunting', + 'penyunting': 'sunting', + 'penyuntingan': 'sunting', + 'penyuntingannya': 'sunting', + 'menyuntingkan': 'sunting', + 'bersuntingkan': 'sunting', + 'mempersunting': 'sunting', + 'mempersuntingnya': 'sunting', + 'sunting-menyunting': 'sunting', + 'pesuruh': 'suruh', + 'pesuruhnya': 'suruh', + 'pesuruhan': 'suruh', + 'pesuruhmu': 'suruh', + 'suruhan': 'suruh', + 'suruhannya': 'suruh', + 'penyuruh': 'suruh', + 'penyuruhnya': 'suruh', + 'menyuruh': 'suruh', + 'menyuruhnya': 'suruh', + 'menyuruhkan': 'suruh', + 'menyuruhku': 'suruh', + 'menyuruhmu': 'suruh', + 'suruh-suruhan': 'suruh', + 'susukan': 'susuk', + 'susukanlah': 'susuk', + 'bersusuk': 'susuk', + 'menyusuk': 'susuk', + 'menyusukan': 'susuk', + 'bersusuk-susuk': 'susuk', + 'bersusuk-susukan': 'susuk', + 'susulan': 'susul', + 'susulannya': 'susul', + 'tersusul': 'susul', + 'penyusul': 'susul', + 'penyusulan': 'susul', + 'menyusul': 'susul', + 'menyusulnya': 'susul', + 'menyusullah': 'susul', + 'menyusulkan': 'susul', + 'menyusulkannya': 'susul', + 'menyusuli': 'susul', + 'menyusulku': 'susul', + 'menyusulmu': 'susul', + 'menyusulinya': 'susul', + 'susul-menyusul': 'susul', + 'susunan': 'susun', + 'susunannya': 'susun', + 'susunanlah': 'susun', + 'susunanan': 'susun', + 'menyusun': 'susun', + 'menyusunnya': 'susun', + 'menyusunkan': 'susun', + 'menyusunan': 'susun', + 'penyusun': 'susun', + 'penyusunnya': 'susun', + 'penyusunan': 'susun', + 'bersusun': 'susun', + 'bersusunan': 'susun', + 'tersusun': 'susun', + 'tersusunnya': 'susun', + 'tersusunlah': 'susun', + 'penyusunannya': 'susun', + 'penyusunanan': 'susun', + 'susupan': 'susup', + 'menyusup': 'susup', + 'menyusupnya': 'susup', + 'menyusuplah': 'susup', + 'menyusupkan': 'susup', + 'menyusupi': 'susup', + 'penyusup': 'susup', + 'penyusupnya': 'susup', + 'penyusupan': 'susup', + 'kesusupan': 'susup', + 'penyusupannya': 'susup', + 'susuran': 'susur', + 'menyusur': 'susur', + 'menyusurnya': 'susur', + 'menyusuri': 'susur', + 'penyusur': 'susur', + 'penyusuran': 'susur', + 'menyusurinya': 'susur', + 'penyusur bayar': 'susur', + 'menyusut': 'susut', + 'menyusutnya': 'susut', + 'menyusutlah': 'susut', + 'menyusutkan': 'susut', + 'menyusutan': 'susut', + 'menyusuti': 'susut', + 'penyusutan': 'susut', + 'penyusutannya': 'susut', + 'meraban': 'raban', + 'meracau': 'racau', + 'meradang': 'radang', + 'meradangnya': 'radang', + 'meradangkan': 'radang', + 'meradangan': 'radang', + 'peradang': 'radang', + 'peradangan': 'radang', + 'peradangannya': 'radang', + 'peradanganlah': 'radang', + 'seragam': 'ragam', + 'seragamnya': 'ragam', + 'seragamkan': 'ragam', + 'seragaman': 'ragam', + 'seragamku': 'ragam', + 'seragammu': 'ragam', + 'meragam': 'ragam', + 'meragamkan': 'ragam', + 'keragaman': 'ragam', + 'keragamannya': 'ragam', + 'keragamanan': 'ragam', + 'beragam-ragam': 'ragam', + 'seragam sebahu': 'ragam', + 'meragut': 'ragut', + 'perajut': 'rajut', + 'perajutan': 'rajut', + 'rajutan': 'rajut', + 'rajutannya': 'rajut', + 'terajut': 'rajut', + 'merajut': 'rajut', + 'merajutnya': 'rajut', + 'merajutkan': 'rajut', + 'merajutkannya': 'rajut', + 'merak hati': 'merak', + 'merak simpin': 'merak', + 'ramalan': 'ramal', + 'ramalannya': 'ramal', + 'ramalanmu': 'ramal', + 'meramal': 'ramal', + 'meramalnya': 'ramal', + 'meramalkan': 'ramal', + 'meramalkannya': 'ramal', + 'terambah': 'rambah', + 'merambah': 'rambah', + 'merambahnya': 'rambah', + 'merambahkan': 'rambah', + 'merambahi': 'rambah', + 'perambah': 'rambah', + 'perambahnya': 'rambah', + 'perambahan': 'rambah', + 'rambahan': 'rambah', + 'rambahannya': 'rambah', + 'perambahannya': 'rambah', + 'merambat': 'rambat', + 'merambatnya': 'rambat', + 'merambatlah': 'rambat', + 'merambatkan': 'rambat', + 'merambatkannya': 'rambat', + 'merambati': 'rambat', + 'rambatan': 'rambat', + 'rambatannya': 'rambat', + 'perambat': 'rambat', + 'perambatnya': 'rambat', + 'perambatan': 'rambat', + 'perambatannya': 'rambat', + 'perampas': 'rampas', + 'perampasan': 'rampas', + 'rampasan': 'rampas', + 'rampasannya': 'rampas', + 'merampas': 'rampas', + 'merampasnya': 'rampas', + 'merampasan': 'rampas', + 'merampasi': 'rampas', + 'perampasannya': 'rampas', + 'merancap': 'rancap', + 'meranduk': 'randuk', + 'meranggas': 'ranggas', + 'meranggasnya': 'ranggas', + 'meranggaskan': 'ranggas', + 'rangkakan': 'rangkak', + 'merangkak': 'rangkak', + 'merangkaknya': 'rangkak', + 'merangkaklah': 'rangkak', + 'merangkaki': 'rangkak', + 'perangkakan': 'rangkak', + 'merangkakkan': 'rangkak', + 'merangkak-rangkak': 'rangkak', + 'rangkulan': 'rangkul', + 'rangkulannya': 'rangkul', + 'merangkul': 'rangkul', + 'merangkulnya': 'rangkul', + 'merangkulkan': 'rangkul', + 'merangkuli': 'rangkul', + 'merangkulku': 'rangkul', + 'berangkulan': 'rangkul', + 'berangkulanlah': 'rangkul', + 'rangkul-merangkul': 'rangkul', + 'rangkuman': 'rangkum', + 'rangkumannya': 'rangkum', + 'merangkum': 'rangkum', + 'merangkumnya': 'rangkum', + 'merangkumkan': 'rangkum', + 'merangkumkannya': 'rangkum', + 'merangkuman': 'rangkum', + 'merangkup': 'rangkup', + 'terangkup': 'rangkup', + 'rantaian': 'rantai', + 'terantai': 'rantai', + 'merantai': 'rantai', + 'merantainya': 'rantai', + 'merantaikan': 'rantai', + 'berantai': 'rantai', + 'berantainya': 'rantai', + 'berantailah': 'rantai', + 'berantai-rantai': 'rantai', + 'rapatan': 'rapat', + 'berapat': 'rapat', + 'merapat': 'rapat', + 'merapatnya': 'rapat', + 'merapatlah': 'rapat', + 'merapatkan': 'rapat', + 'merapatkannya': 'rapat', + 'merapati': 'rapat', + 'perapat': 'rapat', + 'perapatan': 'rapat', + 'kerapatan': 'rapat', + 'kerapatannya': 'rapat', + 'kerapatanan': 'rapat', + 'memperapat': 'rapat', + 'perasaian': 'rasai', + 'merasaikan': 'rasai', + 'merasuk': 'rasuk', + 'merasuknya': 'rasuk', + 'merasuki': 'rasuk', + 'kerasukan': 'rasuk', + 'merata': 'rata', + 'meratanya': 'rata', + 'meratalah': 'rata', + 'meratakan': 'rata', + 'meratakannya': 'rata', + 'meratai': 'rata', + 'merataan': 'rata', + 'serata': 'rata', + 'rata-rata': 'rata', + 'rata-ratanya': 'rata', + 'rata-ratalah': 'rata', + 'rata-ratakan': 'rata', + 'rata-ratai': 'rata', + 'pemerataan': 'rata', + 'pemerataannya': 'rata', + 'memeratakan': 'rata', + 'menyeratakan': 'rata', + 'merata-ratakan': 'rata', + 'ratapan': 'ratap', + 'ratapannya': 'ratap', + 'ratapani': 'ratap', + 'meratap': 'ratap', + 'meratapi': 'ratap', + 'meratapinya': 'ratap', + 'raungan': 'raung', + 'raungannya': 'raung', + 'meraung': 'raung', + 'meraungkan': 'raung', + 'meraungi': 'raung', + 'meraung-raung': 'raung', + 'meraung-raungnya': 'raung', + 'meraung-raungkan': 'raung', + 'peraup': 'raup', + 'raupan': 'raup', + 'seraup': 'raup', + 'meraup': 'raup', + 'meraupnya': 'raup', + 'meraupkannya': 'raup', + 'merawat': 'rawat', + 'merawatnya': 'rawat', + 'merawatkan': 'rawat', + 'merawatkannya': 'rawat', + 'merawati': 'rawat', + 'merawatan': 'rawat', + 'merawatku': 'rawat', + 'merawatmu': 'rawat', + 'terawat': 'rawat', + 'terawatnya': 'rawat', + 'rawatan': 'rawat', + 'perawat': 'rawat', + 'perawatnya': 'rawat', + 'perawatlah': 'rawat', + 'perawati': 'rawat', + 'perawatan': 'rawat', + 'perawatku': 'rawat', + 'perawatannya': 'rawat', + 'perawatanan': 'rawat', + 'perawatanku': 'rawat', + 'keperawatan': 'rawat', + 'keperawatannya': 'rawat', + 'perayaan': 'raya', + 'perayaannya': 'raya', + 'perayaanan': 'raya', + 'merayakan': 'raya', + 'merayakannya': 'raya', + 'merayan': 'rayan', + 'merayani': 'rayan', + 'terayan-rayan': 'rayan', + 'merayau': 'rayau', + 'merayau-rayau': 'rayau', + 'rayuan': 'rayu', + 'rayuannya': 'rayu', + 'rayuanmu': 'rayu', + 'perayu': 'rayu', + 'perayunya': 'rayu', + 'merayu': 'rayu', + 'merayunya': 'rayu', + 'merayuku': 'rayu', + 'merayukan': 'rayu', + 'merayu-rayu': 'rayu', + 'kemercusuaran': 'mercusuar', + 'rebahan': 'rebah', + 'merebah': 'rebah', + 'merebahnya': 'rebah', + 'merebahkan': 'rebah', + 'merebahkannya': 'rebah', + 'rebah-rebah': 'rebah', + 'rebah-rebahan': 'rebah', + 'merebak': 'rebak', + 'merebaknya': 'rebak', + 'merebaklah': 'rebak', + 'merebakkan': 'rebak', + 'merebakan': 'rebak', + 'merebu': 'rebu', + 'merebus': 'rebus', + 'merebusnya': 'rebus', + 'rebusan': 'rebus', + 'rebusannya': 'rebus', + 'rebutan': 'rebut', + 'rebutannya': 'rebut', + 'merebut': 'rebut', + 'merebutnya': 'rebut', + 'merebutkan': 'rebut', + 'terebut': 'rebut', + 'terebutnya': 'rebut', + 'berebut': 'rebut', + 'berebutnya': 'rebut', + 'berebutlah': 'rebut', + 'berebutkan': 'rebut', + 'berebutan': 'rebut', + 'perebutan': 'rebut', + 'perebutannya': 'rebut', + 'berebut-rebut': 'rebut', + 'memperebutkan': 'rebut', + 'memperebutkannya': 'rebut', + 'memperebutkankan': 'rebut', + 'berebut-rebutan': 'rebut', + 'bereda': 'reda', + 'beredanya': 'reda', + 'mereda': 'reda', + 'meredanya': 'reda', + 'meredakan': 'reda', + 'meredakannya': 'reda', + 'meredai': 'reda', + 'peredaan': 'reda', + 'peredaannya': 'reda', + 'keredaan': 'reda', + 'redaman': 'redam', + 'redamannya': 'redam', + 'meredam': 'redam', + 'meredamnya': 'redam', + 'meredamkan': 'redam', + 'peredam': 'redam', + 'peredamnya': 'redam', + 'peredaman': 'redam', + 'peredamannya': 'redam', + 'redam-redam': 'redam', + 'bermerek': 'merek', + 'bermereknya': 'merek', + 'merekanya': 'reka', + 'merekalah': 'reka', + 'merekakan': 'reka', + 'merekai': 'reka', + 'rekaan': 'reka', + 'rekaannya': 'reka', + 'reka-reka': 'reka', + 'reka-rekaan': 'reka', + 'mereka-reka': 'reka', + 'merekah': 'rekah', + 'merekahnya': 'rekah', + 'merekahlah': 'rekah', + 'merekahkan': 'rekah', + 'perekat': 'rekat', + 'perekatnya': 'rekat', + 'perekatkan': 'rekat', + 'perekatan': 'rekat', + 'merekat': 'rekat', + 'merekatnya': 'rekat', + 'merekatkan': 'rekat', + 'merekatkannya': 'rekat', + 'serela': 'rela', + 'serelanya': 'rela', + 'merelai': 'relai', + 'merelainya': 'relai', + 'kerelaan': 'rela', + 'kerelaannya': 'rela', + 'merelakan': 'rela', + 'merelakannya': 'rela', + 'merelakanku': 'rela', + 'merelap': 'relap', + 'merelap-relap': 'relap', + 'merem-merem': 'merem', + 'memeremkan': 'merem', + 'meremang': 'remang', + 'meremangkan': 'remang', + 'keremangan': 'remang', + 'remang-remang': 'remang', + 'remang-remangnya': 'remang', + 'merembes': 'rembes', + 'merembesnya': 'rembes', + 'merembeskan': 'rembes', + 'merembesi': 'rembes', + 'perembesan': 'rembes', + 'perembesannya': 'rembes', + 'merempuh': 'rempuh', + 'perencana': 'rencana', + 'perencananya': 'rencana', + 'perencanakan': 'rencana', + 'perencanaan': 'rencana', + 'berencana': 'rencana', + 'berencananya': 'rencana', + 'berencanalah': 'rencana', + 'berencanakan': 'rencana', + 'merencana': 'rencana', + 'merencanakan': 'rencana', + 'merencanakannya': 'rencana', + 'merencanaan': 'rencana', + 'perencanaannya': 'rencana', + 'perencanaanku': 'rencana', + 'perencanaanmu': 'rencana', + 'merencanakankan': 'rencana', + 'terendam': 'rendam', + 'terendamnya': 'rendam', + 'rendaman': 'rendam', + 'rendamannya': 'rendam', + 'berendam': 'rendam', + 'berendamnya': 'rendam', + 'berendamlah': 'rendam', + 'merendam': 'rendam', + 'merendamnya': 'rendam', + 'merendamkan': 'rendam', + 'merendami': 'rendam', + 'perendaman': 'rendam', + 'merengek': 'rengek', + 'merengeki': 'rengek', + 'merengek-rengek': 'rengek', + 'merenggut': 'renggut', + 'merenggutnya': 'renggut', + 'merenggutku': 'renggut', + 'merengus': 'rengus', + 'perengus': 'rengus', + 'rentangan': 'rentang', + 'rentangannya': 'rentang', + 'merentang': 'rentang', + 'merentangkan': 'rentang', + 'merentangan': 'rentang', + 'terentang': 'rentang', + 'serentang': 'rentang', + 'merentangi': 'rentang', + 'renungan': 'renung', + 'renungannya': 'renung', + 'merenung': 'renung', + 'merenunglah': 'renung', + 'merenungkan': 'renung', + 'merenungkannya': 'renung', + 'merenungi': 'renung', + 'merenunginya': 'renung', + 'perenungan': 'renung', + 'perenungannya': 'renung', + 'merepes': 'repes', + 'resapan': 'resap', + 'resapannya': 'resap', + 'teresap': 'resap', + 'meresap': 'resap', + 'meresapnya': 'resap', + 'meresapkan': 'resap', + 'meresapi': 'resap', + 'meresapinya': 'resap', + 'peresapan': 'resap', + 'merestui': 'restu', + 'merestuinya': 'restu', + 'meretak': 'retak', + 'meretaknya': 'retak', + 'meretakkan': 'retak', + 'meretakkannya': 'retak', + 'meretakan': 'retak', + 'retakan': 'retak', + 'retakannya': 'retak', + 'peretakan': 'retak', + 'keretakan': 'retak', + 'keretakannya': 'retak', + 'retak-retak': 'retak', + 'merewang': 'rewang', + 'bermerger': 'merger', + 'meriah': 'riah', + 'meriahnya': 'riah', + 'meriahlah': 'riah', + 'meriahkan': 'riah', + 'meriam buluh': 'meriam katak', + 'berias': 'rias', + 'beriaslah': 'rias', + 'beriaskan': 'rias', + 'merias': 'rias', + 'meriasnya': 'rias', + 'meriasi': 'rias', + 'riasan': 'rias', + 'riasannya': 'rias', + 'riasanku': 'rias', + 'meringkik': 'ringkik', + 'rintihan': 'rintih', + 'rintihannya': 'rintih', + 'merintih': 'rintih', + 'perintis': 'rintis', + 'perintisnya': 'rintis', + 'perintisi': 'rintis', + 'perintisan': 'rintis', + 'merintis': 'rintis', + 'merintisnya': 'rintis', + 'rintisan': 'rintis', + 'rintisannya': 'rintis', + 'keperintisan': 'rintis', + 'perobohan': 'roboh', + 'perobohannya': 'roboh', + 'merobohkan': 'roboh', + 'merobohkannya': 'roboh', + 'robohan': 'roboh', + 'kerobohan': 'roboh', + 'merodok': 'rodok', + 'perokok': 'rokok', + 'perokoknya': 'rokok', + 'perokoklah': 'rokok', + 'merokok': 'rokok', + 'merokoknya': 'rokok', + 'merokoklah': 'rokok', + 'merokoknyalah': 'rokok', + 'perompak': 'rompak', + 'perompaknya': 'rompak', + 'perompakkan': 'rompak', + 'perompakan': 'rompak', + 'merompak': 'rompak', + 'merompaknya': 'rompak', + 'peronda': 'ronda', + 'perondaan': 'ronda', + 'meronda': 'ronda', + 'merondai': 'ronda', + 'merosot': 'rosot', + 'merosotnya': 'rosot', + 'merosotlah': 'rosot', + 'merosotkan': 'rosot', + 'merosotan': 'rosot', + 'kemerosotan': 'rosot', + 'kemerosotannya': 'rosot', + 'merotan': 'rotan', + 'perotan': 'rotan', + 'berotan': 'rotan', + 'rujukan': 'rujuk', + 'rujukannya': 'rujuk', + 'rujukanlah': 'rujuk', + 'merujuk': 'rujuk', + 'merujuknya': 'rujuk', + 'merujukkan': 'rujuk', + 'merujuki': 'rujuk', + 'merujukan': 'rujuk', + 'perumus': 'rumus', + 'perumusnya': 'rumus', + 'perumuskan': 'rumus', + 'perumusan': 'rumus', + 'perumusannya': 'rumus', + 'merumuskan': 'rumus', + 'merumuskannya': 'rumus', + 'merundung': 'rundung', + 'merundungnya': 'rundung', + 'merundungi': 'rundung', + 'seruntai': 'runtai', + 'meruntai': 'runtai', + 'berusak': 'rusak', + 'merusak': 'rusak', + 'merusaknya': 'rusak', + 'merusaklah': 'rusak', + 'merusakkan': 'rusak', + 'merusaki': 'rusak', + 'merusakan': 'rusak', + 'perusak': 'rusak', + 'perusaknya': 'rusak', + 'perusakkan': 'rusak', + 'perusakan': 'rusak', + 'merusakinya': 'rusak', + 'kerusakan': 'rusak', + 'kerusakannya': 'rusak', + 'kerusakani': 'rusak', + 'kerusakanan': 'rusak', + 'perusakannya': 'rusak', + 'bermesin': 'mesin', + 'bermesinkan': 'mesin', + 'permesinan': 'mesin', + 'permesinannya': 'mesin', + 'meskipun': 'meski', + 'meskipunnya': 'meski', + 'kemestian': 'mesti', + 'memestikan': 'mesti', + 'semestinya': 'mesti', + 'semestinyalah': 'mesti', + 'semestinyakan': 'mesti', + 'memesumi': 'mesum', + 'bermesum': 'mesum', + 'kemesuman': 'mesum', + 'permesuman': 'mesum', + 'bermetamorfosis': 'metamorfosis', + 'meteran': 'meter', + 'meterannya': 'meter', + 'termeterai': 'meterai', + 'bermeterai': 'meterai', + 'bermeteraikan': 'meterai', + 'memeteraikan': 'meterai', + 'kemewahan': 'mewah', + 'kemewahannya': 'mewah', + 'bermewah-mewah': 'mewah', + 'bermewah-mewahan': 'mewah', + 'pewaris': 'waris', + 'pewarisnya': 'waris', + 'pewarisan': 'waris', + 'warisan': 'waris', + 'warisannya': 'waris', + 'warisanku': 'waris', + 'warisanmu': 'waris', + 'mewarisi': 'waris', + 'mewarisinya': 'waris', + 'pewarisannya': 'waris', + 'kewarisan': 'waris', + 'mewariskan': 'waris', + 'mewariskannya': 'waris', + 'pewarta': 'warta', + 'pewartanya': 'warta', + 'pewartaan': 'warta', + 'pewartaannya': 'warta', + 'mewartakan': 'warta', + 'mewartakannya': 'warta', + 'semiang': 'miang', + 'bermigrasi': 'migrasi', + 'bermigrasinya': 'migrasi', + 'miju-miju': 'miju', + 'kemiliteran': 'militer', + 'kemiliterannya': 'militer', + 'mingguan': 'minggu', + 'mingguannya': 'minggu', + 'mingguanlah': 'minggu', + 'berminggu-minggu': 'minggu', + 'bermini': 'mini', + 'meminikan': 'mini', + 'meminimalkan': 'minimal', + 'meminimalkannya': 'minimal', + 'meminta': 'minta', + 'memintanya': 'minta', + 'memintalah': 'minta', + 'memintakan': 'minta', + 'memintai': 'minta', + 'memintaan': 'minta', + 'memintaku': 'minta', + 'memintamu': 'minta', + 'peminta': 'minta', + 'pemintanya': 'minta', + 'pemintai': 'minta', + 'pemintaan': 'minta', + 'berminta': 'minta', + 'memintainya': 'minta', + 'permintaan': 'minta', + 'permintaannya': 'minta', + 'permintaani': 'minta', + 'permintaanku': 'minta', + 'permintaanmu': 'minta', + 'minta-minta': 'minta', + 'minta-mintalah': 'minta', + 'meminta-minta': 'minta', + 'peminta-minta': 'minta', + 'berminta-minta': 'minta', + 'bermisai': 'misai', + 'semisal': 'misal', + 'semisalnya': 'misal', + 'memisalkan': 'misal', + 'pemitosan': 'mitos', + 'memitoskan': 'mitos', + 'bermitra': 'mitra', + 'bermitranya': 'mitra', + 'bermitralah': 'mitra', + 'kemitraan': 'mitra', + 'kemitraannya': 'mitra', + 'kemitrasejajaran': 'mitra sejajar', + 'bermobil': 'mobil', + 'permobilan': 'mobil', + 'memobilisasi': 'mobilisasi', + 'memobilisasinya': 'mobilisasi', + 'memobilisasikan': 'mobilisasi', + 'pemobilisasian': 'mobilisasi', + 'pemodal': 'modal', + 'pemodalnya': 'modal', + 'pemodalan': 'modal', + 'memodali': 'modal', + 'memodalinya': 'modal', + 'bermodal': 'modal', + 'bermodalnya': 'modal', + 'bermodalkan': 'modal', + 'permodalan': 'modal', + 'permodalannya': 'modal', + 'permodalanan': 'modal', + 'memoderatori': 'moderator', + 'termodern': 'modern', + 'kemodernan': 'modern', + 'pemodernan': 'modern', + 'memodernkan': 'modern', + 'memodernkannya': 'modern', + 'memodernisasi': 'modernisasi', + 'memodernisasinya': 'modernisasi', + 'memodernisasikan': 'modernisasi', + 'memodernisasikannya': 'modernisasi', + 'pemodifikasi': 'modifikasi', + 'pemodifikasian': 'modifikasi', + 'memodifikasi': 'modifikasi', + 'memodifikasinya': 'modifikasi', + 'memodifikasikan': 'modifikasi', + 'memodifikasii': 'modifikasi', + 'termodifikasi': 'modifikasi', + 'semoga': 'moga', + 'semoganya': 'moga', + 'semogalah': 'moga', + 'moga-moga': 'moga', + 'pemogok': 'mogok', + 'pemogokkan': 'mogok', + 'pemogokan': 'mogok', + 'pemogokannya': 'mogok', + 'pemohon': 'mohon', + 'pemohonnya': 'mohon', + 'pemohonlah': 'mohon', + 'pemohonan': 'mohon', + 'bermohon': 'mohon', + 'bermohonnya': 'mohon', + 'permohonan': 'mohon', + 'permohonannya': 'mohon', + 'permohonanan': 'mohon', + 'permohonanku': 'mohon', + 'permohonanmu': 'mohon', + 'kemolekan': 'molek', + 'kemolekannya': 'molek', + 'momongan': 'momong', + 'bermoncong': 'moncong', + 'memoncongkan': 'moncong', + 'bermongkok': 'mongkok', + 'memonitor': 'monitor', + 'memonitornya': 'monitor', + 'memonitori': 'monitor', + 'pemonitoran': 'monitor', + 'bermonolog': 'monolog', + 'termonyong-monyong': 'monyong', + 'morak-marik': 'morak', + 'bermotif': 'motif', + 'bermotifkan': 'motif', + 'memuai': 'muai', + 'memuaikan': 'muai', + 'pemuaian': 'muai', + 'bermuara': 'muara', + 'bermuaranya': 'muara', + 'pemubaziran': 'mubazir', + 'kemubaziran': 'mubazir', + 'memubazirkan': 'mubazir', + 'memubazirkannya': 'mubazir', + 'pemuda': 'muda', + 'pemudanya': 'muda', + 'pemudalah': 'muda', + 'pemudaan': 'muda', + 'pemudaku': 'muda', + 'bermuda': 'muda', + 'termuda': 'muda', + 'termudanya': 'muda', + 'kemudaan': 'muda', + 'kemudaannya': 'muda', + 'memudakan': 'muda', + 'kepemudaan': 'muda', + 'kepemudaannya': 'muda', + 'mempermuda': 'muda', + 'bermuda-muda': 'muda', + 'kemuda-mudaan': 'muda', + 'pemudah': 'mudah', + 'pemudahan': 'mudah', + 'semudah': 'mudah', + 'semudahnya': 'mudah', + 'kemudahan': 'mudah', + 'kemudahannya': 'mudah', + 'kemudahanlah': 'mudah', + 'memudahkan': 'mudah', + 'memudahkannya': 'mudah', + 'memudahkankan': 'mudah', + 'memudahkanku': 'mudah', + 'memudahkanmu': 'mudah', + 'mempermudah': 'mudah', + 'mempermudahnya': 'mudah', + 'mempermudahkan': 'mudah', + 'mempermudahan': 'mudah', + 'mempermudahmu': 'mudah', + 'mudah-mudahan': 'mudah', + 'mudah-mudahannya': 'mudah', + 'mudah-mudahanlah': 'mudah', + 'mudah-mudahanan': 'mudah', + 'bermudah-mudah': 'mudah', + 'memudik': 'mudik', + 'memudikkan': 'mudik', + 'memudiki': 'mudik', + 'pemudik': 'mudik', + 'pemudiknya': 'mudik', + 'pemudikan': 'mudik', + 'semudik': 'mudik', + 'bermudun': 'mudun', + 'memufakati': 'mufakat', + 'bermufakat': 'mufakat', + 'kemufakatan': 'mufakat', + 'pemufakatan': 'mufakat', + 'pemufakatannya': 'mufakat', + 'memufakatkan': 'mufakat', + 'memufakatkannya': 'mufakat', + 'almuhit': 'muhit', + 'semujur': 'mujur', + 'pemujur': 'mujur', + 'kemujuran': 'mujur', + 'kemujurannya': 'mujur', + 'semujur-mujurnya': 'mujur', + 'memukabalahkan': 'mukabalah', + 'pemukim': 'mukim', + 'pemukimnya': 'mukim', + 'pemukiman': 'mukim', + 'bermukim': 'mukim', + 'bermukimnya': 'mukim', + 'bermukimlah': 'mukim', + 'bermukiman': 'mukim', + 'pemukimannya': 'mukim', + 'pemukimanan': 'mukim', + 'pemukimanku': 'mukim', + 'memukimkan': 'mukim', + 'memukimkannya': 'mukim', + 'permukiman': 'mukim', + 'permukimannya': 'mukim', + 'permukimanan': 'mukim', + 'kemujizatan': 'mukjizat', + 'memula': 'mula', + 'memulakan': 'mula', + 'memulai': 'mula', + 'semula': 'mula', + 'semulanya': 'mula', + 'semulai': 'mula', + 'pemula': 'mula', + 'pemulanya': 'mula', + 'pemulai': 'mula', + 'pemulaan': 'mula', + 'bermula': 'mula', + 'bermulanya': 'mula', + 'bermulai': 'mula', + 'bermulaan': 'mula', + 'mula-mula': 'mula', + 'mula-mulanya': 'mula', + 'mula-mulai': 'mula', + 'permulaan': 'mula', + 'permulaannya': 'mula', + 'sebermula': 'mula', + 'bermula-mula': 'mula', + 'pemulsaan': 'mulsa', + 'muluk-muluk': 'muluk', + 'muluk-muluklah': 'muluk', + 'bermuluk-muluk': 'muluk', + 'memulur': 'mulur', + 'kemulusan': 'mulus', + 'kemulusannya': 'mulus', + 'memuluskan': 'mulus', + 'memuluskannya': 'mulus', + 'memuluskanmu': 'mulus', + 'mempermulus': 'mulus', + 'bermulut': 'mulut', + 'mulut-mulutan': 'mulut', + 'bermulut-mulut': 'mulut', + 'memumikan': 'mumi', + 'bermunajat': 'munajat', + 'memuncrat': 'muncrat', + 'memuncratkan': 'muncrat', + 'kemunculan': 'muncul', + 'kemunculannya': 'muncul', + 'kemunculanan': 'muncul', + 'pemunculan': 'muncul', + 'pemunculannya': 'muncul', + 'memunculkan': 'muncul', + 'memunculkannya': 'muncul', + 'bermunculan': 'muncul', + 'bermunculannya': 'muncul', + 'bermunculanlah': 'muncul', + 'pemunduran': 'mundur', + 'pemundurannya': 'mundur', + 'kemunduran': 'mundur', + 'kemundurannya': 'mundur', + 'memundurkan': 'mundur', + 'memundurkannya': 'mundur', + 'memungkari': 'mungkar', + 'kemungkaran': 'mungkar', + 'memungkiri': 'mungkir', + 'memungkirinya': 'mungkir', + 'mungmungan': 'mungmung', + 'memunjung': 'punjung', + 'pemurah': 'murah', + 'murahan': 'murah', + 'murahannya': 'murah', + 'kemurahan': 'murah', + 'kemurahannya': 'murah', + 'kemurahan-mu': 'murah', + 'memurahkan': 'murah', + 'mempermurah': 'murah', + 'permuseuman': 'museum', + 'memuseumkan': 'museum', + 'musikan': 'musik', + 'musikanan': 'musik', + 'pemusik': 'musik', + 'pemusiknya': 'musik', + 'bermusik': 'musik', + 'bermusiknya': 'musik', + 'bermusikmu': 'musik', + 'memusiki': 'musik', + 'memusikkan': 'musik', + 'permusikan': 'musik', + 'musiman': 'musim', + 'musimannya': 'musim', + 'bermusim': 'musim', + 'kemuskilan': 'muskil', + 'memuskilkan': 'muskil', + 'pemusnah': 'musnah', + 'pemusnahnya': 'musnah', + 'pemusnahkan': 'musnah', + 'pemusnahan': 'musnah', + 'pemusnahannya': 'musnah', + 'kemusnahan': 'musnah', + 'kemusnahannya': 'musnah', + 'memusnahkan': 'musnah', + 'memusnahkannya': 'musnah', + 'kemustahilan': 'mustahil', + 'kemustahilannya': 'mustahil', + 'memustahilkan': 'mustahil', + 'bermusyawarah': 'musyawarah', + 'bermusyawarahlah': 'musyawarah', + 'memusyawarahkan': 'musyawarah', + 'memusyawarahkannya': 'musyawarah', + 'kemusyrikan': 'musyrik', + 'memutalaah': 'mutalaah', + 'memutalaahkan': 'mutalaah', + 'pemutasian': 'mutasi', + 'pemutasiannya': 'mutasi', + 'memutasikan': 'mutasi', + 'memutasikannya': 'mutasi', + 'bermuwajahah': 'muwajahah', + 'kenabian': 'nabi', + 'kenabiannya': 'nabi', + 'bernada': 'nada', + 'bernadakan': 'nada', + 'nada-nadanya': 'nada', + 'bernafiri': 'nafiri', + 'menafkahi': 'nafkah', + 'menafkahinya': 'nafkah', + 'menafkahiku': 'nafkah', + 'menafkahkan': 'nafkah', + 'bernafsi-nafsi': 'nafsi', + 'naga-naga': 'naga', + 'naga-naganya': 'naga', + 'ternahak': 'nahak', + 'menaikkelaskan': 'naik kelas', + 'menaik': 'naik', + 'menaiknya': 'naik', + 'menaikkan': 'naik', + 'menaikkannya': 'naik', + 'menaiki': 'naik', + 'menaikan': 'naik', + 'menaikinya': 'naik', + 'menaikikan': 'naik', + 'penaikan': 'naik', + 'penaikannya': 'naik', + 'penaikanan': 'naik', + 'kenaikan': 'naik', + 'kenaikannya': 'naik', + 'kenaikanlah': 'naik', + 'kenaikani': 'naik', + 'menaikturunkan': 'naik turun', + 'kenajisan': 'najis', + 'menajiskan': 'najis', + 'bernaka-naka': 'naka', + 'menakali': 'nakal', + 'menakalinya': 'nakal', + 'kenakalan': 'nakal', + 'kenakalannya': 'nakal', + 'nakal-nakalan': 'nakal', + 'menakhodai': 'nakhoda', + 'bernala-nala': 'nala', + 'bernalam': 'nalam', + 'menalamkan': 'nalam', + 'bernalar': 'nalar', + 'penalaran': 'nalar', + 'penalarannya': 'nalar', + 'menalarkan': 'nalar', + 'kebernalaran': 'nalar', + 'menanap': 'nanap', + 'ternanar': 'nanar', + 'menanarkan': 'nanar', + 'senapas': 'napas', + 'bernapas': 'napas', + 'bernapasnya': 'napas', + 'bernapaslah': 'napas', + 'bernapaskan': 'napas', + 'bernapasan': 'napas', + 'pernapasan': 'napas', + 'pernapasannya': 'napas', + 'menapaskan': 'napas', + 'menaskan': 'nas', + 'menasakhkan': 'nasakh', + 'penasihat': 'nasihat', + 'penasihatnya': 'nasihat', + 'penasihatan': 'nasihat', + 'penasihatku': 'nasihat', + 'menasihati': 'nasihat', + 'menasihatinya': 'nasihat', + 'menasihatiku': 'nasihat', + 'menasihatkan': 'nasihat', + 'menasihatkannya': 'nasihat', + 'menasionalisasi': 'nasionalisasi', + 'menasionalisasinya': 'nasionalisasi', + 'menasionalisasikan': 'nasionalisasi', + 'menasionalisasikannya': 'nasionalisasi', + 'menazamkan': 'nazam', + 'menegara': 'negara', + 'menegarakan': 'negara', + 'menegarai': 'negara', + 'bernegara': 'negara', + 'bernegaranya': 'negara', + 'kenegaraan': 'negara', + 'kenegaraannya': 'negara', + 'kenegarawanan': 'negarawan', + 'kenegarawanannya': 'negarawan', + 'kenegarawananlah': 'negarawan', + 'kenegatifan': 'negatif', + 'menegosiasikan': 'negosiasi', + 'menegosiasikannya': 'negosiasi', + 'nenek-nenek': 'nenek', + 'menenes': 'nenes', + 'peneonan': 'neon', + 'menerakakan': 'neraka', + 'kenestapaan': 'nestapa', + 'kenetralan': 'netral', + 'kenetralannya': 'netral', + 'penetralan': 'netral', + 'menetralkan': 'netral', + 'menetralkannya': 'netral', + 'menganga': 'nganga', + 'mengangakan': 'nganga', + 'mengangai': 'nganga', + 'ternganga': 'nganga', + 'ternganganya': 'nganga', + 'ngeang-ngeang': 'ngeang', + 'mengenas': 'ngenas', + 'mengenasi': 'ngenas', + 'mengiang': 'ngiang', + 'terngiang': 'ngiang', + 'mengiang-ngiang': 'ngiang', + 'terngiang-ngiang': 'ngiang', + 'meniaga': 'niaga', + 'meniagakan': 'niaga', + 'meniagakannya': 'niaga', + 'peniaga': 'niaga', + 'peniagaan': 'niaga', + 'berniaga': 'niaga', + 'perniagaan': 'niaga', + 'perniagaannya': 'niaga', + 'memperniagakan': 'niaga', + 'menihilkan': 'nihil', + 'menihilkannya': 'nihil', + 'penilai': 'nilai', + 'penilainya': 'nilai', + 'penilaian': 'nilai', + 'menilai': 'nilai', + 'menilainya': 'nilai', + 'menilailah': 'nilai', + 'menilaii': 'nilai', + 'menilaian': 'nilai', + 'menilaiku': 'nilai', + 'menilaimu': 'nilai', + 'bernilai': 'nilai', + 'bernilainya': 'nilai', + 'bernilaian': 'nilai', + 'ternilai': 'nilai', + 'penilaiannya': 'nilai', + 'penilaianan': 'nilai', + 'penilaianku': 'nilai', + 'penilaianmu': 'nilai', + 'terninabobo': 'ninabobo', + 'terninabobokan': 'ninabobo', + 'meninabobokan': 'ninabobo', + 'meningratkan': 'ningrat', + 'keningrat-ningratan': 'ningrat', + 'keniraksaraan': 'niraksara', + 'kenisbian': 'nisbi', + 'menisbikan': 'nisbi', + 'keniscayaan': 'niscaya', + 'keniscayaannya': 'niscaya', + 'penista': 'nista', + 'penistanya': 'nista', + 'penistakan': 'nista', + 'penistaan': 'nista', + 'menista': 'nista', + 'menistanya': 'nista', + 'menistakan': 'nista', + 'menistakannya': 'nista', + 'menistai': 'nista', + 'menistaan': 'nista', + 'nistaan': 'nista', + 'ternista': 'nista', + 'ternistakan': 'nista', + 'kenistaan': 'nista', + 'menistakanan': 'nista', + 'penobatan': 'nobat', + 'penobatannya': 'nobat', + 'menobatkan': 'tobat', + 'menobatkannya': 'tobat', + 'menominasikan': 'nominasi', + 'menominasikannya': 'nominasi', + 'menomori': 'nomor', + 'menomorinya': 'nomor', + 'bernomor': 'nomor', + 'bernomorkan': 'nomor', + 'penomoran': 'nomor', + 'penomorannya': 'nomor', + 'nona makan sirih': 'nona', + 'penonaktifan': 'nonaktif', + 'penonaktifannya': 'nonaktif', + 'menonaktifkan': 'nonaktif', + 'menonaktifkannya': 'nonaktif', + 'menonong': 'nonong', + 'menormalkan': 'normal', + 'menormalkannya': 'normal', + 'menormalisasikan': 'normalisasi', + 'bernostalgia': 'nostalgia', + 'bernostalgialah': 'nostalgia', + 'kenotarisan': 'notaris', + 'pernovelan': 'novel', + 'bernubuat': 'nubuat', + 'menubuatkan': 'nubuat', + 'kenudisan': 'nudis', + 'nujuman': 'nujum', + 'menujum': 'nujum', + 'penujuman': 'nujum', + 'menujumkan': 'nujum', + 'menukil': 'nukil', + 'menukilkan': 'nukil', + 'nukilan': 'nukil', + 'nukilannya': 'nukil', + 'ternukil': 'nukil', + 'nyai-nyai': 'nyai', + 'menyalangkan': 'nyalang', + 'bernyali': 'nyali', + 'bernyalinya': 'nyali', + 'bernyalilah': 'nyali', + 'nyamikan': 'nyamik', + 'ternyana': 'nyana', + 'menyanya': 'nyanya', + 'menyanyakan': 'nyanya', + 'menyanyah': 'nyanyah', + 'menyanyu': 'nyanyu', + 'senyawa': 'nyawa', + 'senyawanya': 'nyawa', + 'senyawaan': 'senyawa', + 'bernyawa': 'nyawa', + 'bernyawakan': 'nyawa', + 'bersenyawa': 'senyawa', + 'bersenyawanya': 'senyawa', + 'persenyawaan': 'senyawa', + 'menyenyeh': 'nyenyeh', + 'kenyinyiran': 'nyinyir', + 'nyolong-nyolong': 'nyolong', + 'menyonyong': 'nyonyong', + 'menyonyor': 'nyonyor', + 'menyunyut': 'nyunyut', + 'nyut-nyutan': 'nyut', + 'berobat': 'obat', + 'berobatnya': 'obat', + 'berobatlah': 'obat', + 'berobatkan': 'obat', + 'berobati': 'obat', + 'terobat': 'obat', + 'terobati': 'obat', + 'pengobat': 'obat', + 'pengobatnya': 'obat', + 'pengobati': 'obat', + 'pengobatan': 'obat', + 'terobatinya': 'obat', + 'terobatilah': 'obat', + 'mengobati': 'obat', + 'mengobatinya': 'obat', + 'mengobatiku': 'obat', + 'pengobatannya': 'obat', + 'pengobatanan': 'obat', + 'pengobatanku': 'obat', + 'mengobatkan': 'obat', + 'mengobatkannya': 'obat', + 'obat-obatan': 'obat', + 'obat-obatannya': 'obat', + 'obat-obatanan': 'obat', + 'obat-obatanku': 'obat', + 'pengobeng': 'obeng', + 'mengobeng': 'obeng', + 'objekan': 'objek', + 'pengobjek': 'objek', + 'mengobjek': 'objek', + 'mengobjekkan': 'objek', + 'pengobjekan': 'objek', + 'mengobor': 'obor', + 'mengobori': 'obor', + 'pengoboran': 'obor', + 'obralan': 'obral', + 'mengobral': 'obral', + 'mengobralnya': 'obral', + 'mengobralkan': 'obral', + 'mengobralkannya': 'obral', + 'pengobralan': 'obral', + 'obrolan': 'obrol', + 'obrolannya': 'obrol', + 'obrolanku': 'obrol', + 'obrolanmu': 'obrol', + 'mengobrol': 'obrol', + 'mengobrollah': 'obrol', + 'mengobrolkan': 'obrol', + 'mengobrolkannya': 'obrol', + 'mengobservasi': 'observasi', + 'mengobservasinya': 'observasi', + 'mengobservasikan': 'observasi', + 'mengobservasiku': 'observasi', + 'terobsesi': 'obsesi', + 'terobsesinya': 'obsesi', + 'odolan': 'odol', + 'mengodol': 'odol', + 'pengodolan': 'odol', + 'mengodol-odol': 'odol', + 'mengogah': 'ogah', + 'ogah-ogahan': 'ogah', + 'berogak-ogak': 'ogak-ogak', + 'mengogam': 'ogam', + 'mengogel': 'ogel', + 'mengogok': 'ogok', + 'mengogokkan': 'ogok', + 'mengogok-ogok': 'ogok', + 'mengoja': 'oja', + 'pengojek': 'ojek', + 'pengojeknya': 'ojek', + 'mengojek': 'ojek', + 'mengojeknya': 'ojek', + 'mengojekkan': 'ojek', + 'mengojok': 'ojok', + 'teroksidasi': 'oksidasi', + 'pengoksidasi': 'oksidasi', + 'mengoksidasi': 'oksidasi', + 'beroksigen': 'oksigen', + 'olahan': 'olah', + 'olahannya': 'olah', + 'olahanan': 'olah', + 'berolah': 'olah', + 'berolahan': 'olah', + 'pengolah': 'olah', + 'pengolahnya': 'olah', + 'pengolahan': 'olah', + 'mengolah': 'olah', + 'mengolahnya': 'olah', + 'mengolahkan': 'olah', + 'mengolahan': 'olah', + 'pengolahannya': 'olah', + 'pengolahanan': 'olah', + 'seolah-olah': 'olah', + 'seolah-olahnya': 'olah', + 'memperolahkan': 'olah', + 'mengolak-alik': 'olak-alik', + 'mengolak-alikkan': 'olak-alik', + 'olang-alingan': 'olang-aling', + 'mengolang-aling': 'olang-aling', + 'mengolang-alingkan': 'olang-aling', + 'mengolek': 'olek', + 'mengoleki': 'olek', + 'olengan': 'oleng', + 'mengoleng': 'oleng', + 'teroleng-oleng': 'oleng', + 'beroleng-oleng': 'oleng', + 'mengoleng-oleng': 'oleng', + 'olesan': 'oles', + 'olesannya': 'oles', + 'mengoles': 'oles', + 'mengolesnya': 'oles', + 'mengoleskan': 'oles', + 'mengoleskannya': 'oles', + 'mengolesi': 'oles', + 'pengoles': 'oles', + 'pengolesnya': 'oles', + 'pengolesan': 'oles', + 'mengolet': 'olet', + 'olok-olok': 'olok', + 'olok-oloknya': 'olok', + 'olok-olokkan': 'olok', + 'olok-olokan': 'olok', + 'berolok-olok': 'olok', + 'mengolok-olok': 'olok', + 'mengolok-oloknya': 'olok', + 'mengolok-olokkan': 'olok', + 'mengolok-olokku': 'olok', + 'memperolok-olok': 'olok', + 'memperolok-olokkan': 'olok', + 'memperolok-olokan': 'olok', + 'berombak': 'ombak', + 'mengombak': 'ombak', + 'terombang-ambing': 'ombang-ambing', + 'terombang-ambingnya': 'ombang-ambing', + 'terombang-ambingkan': 'ombang-ambing', + 'mengombang-ambing': 'ombang-ambing', + 'mengombang-ambingkan': 'ombang-ambing', + 'mengombang-ambingkannya': 'ombang-ambing', + 'ombyokan': 'ombyok', + 'omongan': 'omong', + 'omongannya': 'omong', + 'omonganlah': 'omong', + 'omonganku': 'omong', + 'mengomong': 'omong', + 'mengomongkannya': 'omong', + 'pengomongan': 'omong', + 'mengomongkan': 'omong', + 'beromong-omong': 'omong', + 'mengompol': 'ompol', + 'mengompolnya': 'ompol', + 'omprengan': 'ompreng', + 'mengompreng': 'ompreng', + 'pengomprong': 'omprong', + 'mengomprong': 'omprong', + 'pengomprongan': 'omprong', + 'beromzet': 'omzet', + 'keonaran': 'onar', + 'keonarannya': 'onar', + 'mengonarkan': 'onar', + 'mengondokkan': 'ondok', + 'ondos-ondos': 'ondos', + 'onggokan': 'onggok', + 'mengonggokkan': 'onggok', + 'beronggok-onggok': 'onggok', + 'ongkang-ongkang': 'ongkang', + 'mengongkang-ongkang': 'ongkang', + 'mengongkoki': 'ongkok', + 'mengongkok-ongkok': 'ongkok', + 'mengonslah': 'onslah', + 'mengonyah-anyih': 'onyah-anyih', + 'mengonyok': 'onyok', + 'mengonyokkan': 'onyok', + 'onyotan': 'onyot', + 'mengonyot': 'onyot', + 'mengopak-apik': 'opak-apik', + 'mengopeletkan': 'opelet', + 'operan': 'oper', + 'operannya': 'oper', + 'mengoper': 'oper', + 'mengopernya': 'oper', + 'mengoperkan': 'oper', + 'mengoperkannya': 'oper', + 'pengoperan': 'oper', + 'beroperasi': 'operasi', + 'beroperasinya': 'operasi', + 'beroperasilah': 'operasi', + 'beroperasikan': 'operasi', + 'beroperasii': 'operasi', + 'mengoperasi': 'operasi', + 'mengoperasinya': 'operasi', + 'mengoperasikan': 'operasi', + 'mengoperasikannya': 'operasi', + 'mengoperasian': 'operasi', + 'mengoperasiku': 'operasi', + 'pengoperasian': 'operasi', + 'pengoperasiannya': 'operasi', + 'mengoperasikanan': 'operasi', + 'beroplah': 'oplah', + 'mengoplos': 'oplos', + 'mengoplosnya': 'oplos', + 'mengoposisi': 'oposisi', + 'mengoposisikan': 'oposisi', + 'pengoptimalan': 'optimal', + 'pengoptimalannya': 'optimal', + 'mengoptimalkan': 'optimal', + 'mengoptimalkannya': 'optimal', + 'mengoptimalkankan': 'optimal', + 'pengoptimuman': 'optimum', + 'mengoptimumkan': 'optimum', + 'terorak': 'orak', + 'pengorak': 'orak', + 'mengorak': 'orak', + 'mengorak-arik': 'orak-arik', + 'pengorak-arik': 'orak-arik', + 'seorang': 'orang', + 'seorangnya': 'orang', + 'seoranglah': 'orang', + 'seorangan': 'orang', + 'seseorang': 'orang', + 'seseoranglah': 'orang', + 'seseorangan': 'orang', + 'perorangan': 'orang', + 'perorangannya': 'orang', + 'keseorangan': 'orang', + 'mengorangkan': 'orang', + 'perseorangan': 'orang', + 'perseorangannya': 'orang', + 'orang-orangan': 'orang', + 'berorang-orang': 'orang', + 'berorasi': 'orasi', + 'berorasinya': 'orasi', + 'mengorat-oret': 'orat-oret', + 'mengorbit': 'orbit', + 'mengorbitnya': 'orbit', + 'mengorbitkan': 'orbit', + 'mengorbitkannya': 'orbit', + 'mengorbiti': 'orbit', + 'pengorbitan': 'orbit', + 'pengorbitannya': 'orbit', + 'oretan': 'oret', + 'mengoret-oret': 'oret', + 'terorganisasi': 'organisasi', + 'terorganisasikan': 'organisasi', + 'berorganisasi': 'organisasi', + 'berorganisasilah': 'organisasi', + 'pengorganisasi': 'organisasi', + 'pengorganisasian': 'organisasi', + 'mengorganisasi': 'organisasi', + 'mengorganisasikan': 'organisasi', + 'mengorganisasikannya': 'organisasi', + 'keorganisasian': 'organisasi', + 'keorganisasiannya': 'organisasi', + 'pengorganisasiannya': 'organisasi', + 'berorientasi': 'orientasi', + 'berorientasikan': 'orientasi', + 'mengorkestrasikan': 'orkestrasi', + 'pengornamenan': 'ornamen', + 'mengornamenkan': 'ornamen', + 'mengorok-orok': 'orok-orok', + 'berotak': 'otak', + 'berotakkan': 'otak', + 'mengotakinya': 'otak', + 'otak-otakan': 'otak', + 'otak udang': 'mengotaki', + 'mengotak-atik': 'otak-atik', + 'mengotak-atiknya': 'otak-atik', + 'pengotomatisan': 'otomatis', + 'mengotomatiskan': 'otomatis', + 'berotonomi': 'otonomi', + 'pengotonomian': 'otonomi', + 'mengotonomikan': 'otonomi', + 'mengotot': 'otot', + 'mengototnya': 'otot', + 'perototan': 'otot', + 'ovenan': 'oven', + 'mengoyak-oyak': 'oyak', + 'mengoyok': 'oyok', + 'kepabeanan': 'pabean', + 'kepabeanannya': 'pabean', + 'kepabeananan': 'pabean', + 'berpacangan': 'pacangan', + 'pacaran': 'pacar', + 'pacarannya': 'pacar', + 'memacari': 'pacar', + 'memacarinya': 'pacar', + 'memacarimu': 'pacar', + 'berpacaran': 'pacar', + 'berpacarannya': 'pacar', + 'memacek': 'pacek', + 'pemacek': 'pacek', + 'berpacek': 'pacek', + 'pemacekan': 'pacek', + 'memacik': 'pacik', + 'memacu': 'pacu', + 'memacunya': 'pacu', + 'memacukan': 'pacu', + 'memacuku': 'pacu', + 'pacuan': 'pacu', + 'pacuannya': 'pacu', + 'pemacu': 'pacu', + 'pemacunya': 'pacu', + 'pemacuan': 'pacu', + 'berpacu': 'pacu', + 'berpacunya': 'pacu', + 'berpacuan': 'pacu', + 'memacuk': 'pacuk', + 'memacul': 'pacul', + 'terpacul': 'pacul', + 'memadai': 'pada', + 'memadainya': 'pada', + 'memadailah': 'pada', + 'terpada': 'pada', + 'kepadaan': 'pada', + 'kepadaannya': 'pada', + 'memadakan': 'pada', + 'memadakannya': 'pada', + 'memada-madai': 'pada', + 'berpada-pada': 'pada', + 'padahan': 'padah', + 'pemadam': 'padam', + 'pemadamnya': 'padam', + 'pemadamkan': 'padam', + 'pemadaman': 'padam', + 'memadami': 'padam', + 'pemadamannya': 'padam', + 'pemadamanan': 'padam', + 'kepadaman': 'padam', + 'memadamkan': 'padam', + 'memadamkannya': 'padam', + 'memadan': 'padan', + 'memadankan': 'padan', + 'memadankannya': 'padan', + 'memadani': 'padan', + 'padanan': 'padan', + 'padanannya': 'padan', + 'pemadan': 'padan', + 'pemadanan': 'padan', + 'berpadan': 'padan', + 'berpadanan': 'padan', + 'bersepadan': 'padan', + 'menyepadan': 'padan', + 'menyepadankan': 'padan', + 'memadan-madan': 'padan', + 'sepadan': 'padan', + 'berpadang': 'padang', + 'berpadangan': 'padang', + 'sepadi': 'padi', + 'berpadi': 'padi', + 'perpadian': 'padi', + 'padi-padian': 'padi', + 'memaes': 'paes', + 'paesan': 'paes', + 'paesani': 'paes', + 'memagas': 'pagas', + 'sepagian': 'pagi', + 'kepagian': 'pagi', + 'pagi-pagi': 'pagi', + 'pagi-paginya': 'pagi', + 'sepaha': 'paha', + 'berpahala': 'pahala', + 'sepaham': 'paham', + 'sepahamnya': 'paham', + 'sepahamlah': 'paham', + 'sepahaman': 'paham', + 'memahami': 'paham', + 'memahaminya': 'paham', + 'memahamilah': 'paham', + 'memahamii': 'paham', + 'memahamiku': 'paham', + 'memahamimu': 'paham', + 'berpaham': 'paham', + 'berpahamkan': 'paham', + 'terpahami': 'paham', + 'pemahaman': 'paham', + 'pemahamannya': 'paham', + 'pemahamanan': 'paham', + 'pemahamanku': 'paham', + 'pemahamanmu': 'paham', + 'memahamkan': 'paham', + 'sepahit': 'pahit', + 'kepahitan': 'pahit', + 'kepahitannya': 'pahit', + 'memahitkan': 'pahit', + 'berpahit-pahit': 'pahit', + 'pailan': 'pail', + 'kepailitan': 'pailit', + 'kepailitannya': 'pailit', + 'pemair': 'pair', + 'memairi': 'pair', + 'berpair-pair': 'pair', + 'pemajak': 'pajak', + 'pemajakan': 'pajak', + 'memajaki': 'pajak', + 'memajakinya': 'pajak', + 'pemajakannya': 'pajak', + 'perpajakan': 'pajak', + 'perpajakannya': 'pajak', + 'pemajaan': 'pajan', + 'terpajan': 'pajan', + 'terpajannya': 'pajan', + 'memajankan': 'pajan', + 'pajangan': 'pajang', + 'pajangannya': 'pajang', + 'pemajang': 'pajang', + 'pemajangan': 'pajang', + 'memajang': 'pajang', + 'memajangnya': 'pajang', + 'memajangkan': 'pajang', + 'pakanan': 'pakan', + 'berpakan': 'pakan', + 'berpakankan': 'pakan', + 'berpakansi': 'pakansi', + 'memaksa': 'paksa', + 'memaksanya': 'paksa', + 'memaksakan': 'paksa', + 'memaksakannya': 'paksa', + 'memaksaan': 'paksa', + 'memaksaku': 'paksa', + 'memaksamu': 'paksa', + 'paksaan': 'paksa', + 'paksaannya': 'paksa', + 'terpaksa': 'paksa', + 'terpaksanya': 'paksa', + 'terpaksalah': 'paksa', + 'terpaksai': 'paksa', + 'pemaksaan': 'paksa', + 'pemaksaannya': 'paksa', + 'memaksakanlah': 'paksa', + 'keterpaksaan': 'paksa', + 'keterpaksaannya': 'paksa', + 'keterpaksaanlah': 'paksa', + 'memaksa-maksa': 'paksa', + 'memakuk': 'pakuk', + 'berpal-pal': 'pal', + 'sepala-pala': 'pala', + 'pemalak': 'palak', + 'pemalakan': 'palak', + 'memalak': 'palak', + 'memalaknya': 'palak', + 'memalaki': 'palak', + 'memalam': 'palam', + 'pemalam': 'palam', + 'memalang': 'palang', + 'memalangnya': 'palang', + 'memalangkan': 'palang', + 'memalangkannya': 'palang', + 'memalarkan': 'palar', + 'palean': 'pale', + 'memale': 'pale', + 'palingan': 'paling', + 'sepaling': 'paling', + 'berpaling': 'paling', + 'berpalingnya': 'paling', + 'berpalinglah': 'paling', + 'paling-paling': 'paling', + 'memalis': 'palis', + 'berpalis': 'palis', + 'terpalis': 'palis', + 'memaliskan': 'palis', + 'paluan': 'palu', + 'memalu': 'palu', + 'memalunya': 'palu', + 'palu-memalu': 'palu', + 'berpalu-palu': 'palu', + 'berpalu-paluan': 'palu', + 'memalun': 'palun', + 'memalunkan': 'palun', + 'berpalun-palun': 'palun', + 'palungan': 'palung', + 'pemalut': 'palut', + 'memalut': 'palut', + 'berpalut': 'palut', + 'terpalut': 'palut', + 'berpaman': 'paman', + 'pameran': 'pamer', + 'pamerannya': 'pamer', + 'pamerankan': 'pamer', + 'berpameran': 'pamer', + 'memamerkan': 'pamer', + 'memamerkannya': 'pamer', + 'memamerkankan': 'pamer', + 'memamitkan': 'pamit', + 'berpamitan': 'pamit', + 'berpamitannya': 'pamit', + 'kepamongprajaan': 'pamong praja', + 'berpamor': 'pamor', + 'memampas': 'pampas', + 'pampasan': 'pampas', + 'pemampasan': 'pampas', + 'memampat': 'pampat', + 'memampatkan': 'pampat', + 'memampatkannya': 'pampat', + 'pemampat': 'pampat', + 'pemampatan': 'pampat', + 'terpampat': 'pampat', + 'kepampatan': 'pampat', + 'keterpampatan': 'pampat', + 'kepamrihan': 'pamrih', + 'terpana': 'pana', + 'keterpanaan': 'pana', + 'memancal': 'pancal', + 'memancarteruskan': 'pancar terus', + 'memancit': 'pancit', + 'memancit-mancitkan': 'pancit', + 'berpanco': 'panco', + 'memandakkan': 'pandak', + 'memperpandak': 'pandak', + 'kepandiran': 'pandir', + 'kepandir-pandiran': 'pandir', + 'pemandu': 'pandu', + 'pemandunya': 'pandu', + 'pemanduan': 'pandu', + 'pemandumu': 'pandu', + 'memandu': 'pandu', + 'memandunya': 'pandu', + 'memandukan': 'pandu', + 'memanduku': 'pandu', + 'memandumu': 'pandu', + 'panduan': 'pandu', + 'panduannya': 'pandu', + 'panduanmu': 'pandu', + 'berpandu': 'pandu', + 'berpandukan': 'pandu', + 'berpanduan': 'pandu', + 'kepanduan': 'pandu', + 'panenan': 'panen', + 'panenannya': 'panen', + 'memanen': 'panen', + 'memanennya': 'panen', + 'memanenkan': 'panen', + 'memanenkannya': 'panen', + 'pemanenan': 'panen', + 'pemanenannya': 'panen', + 'terpangah': 'pangah', + 'memanggakkan': 'panggak', + 'panggalan': 'panggal', + 'memanggul': 'panggul', + 'memanggulnya': 'panggul', + 'memanggung': 'panggung', + 'memanggungkan': 'panggung', + 'memanggungkannya': 'panggung', + 'panggungan': 'panggung', + 'pemanggungan': 'panggung', + 'memangkah': 'pangkah', + 'memangkal': 'pangkal', + 'memangkalkan': 'pangkal', + 'pangkalan': 'pangkal', + 'pangkalannya': 'pangkal', + 'pangkalanan': 'pangkal', + 'berpangkal': 'pangkal', + 'berpangkalan': 'pangkal', + 'berpangkalanlah': 'pangkal', + 'berpangkal tolak': 'pangkal tolak', + 'memangkek': 'pangkek', + 'pemangku': 'pangku', + 'pemangkui': 'pangku', + 'pemangkuan': 'pangku', + 'memangku': 'pangku', + 'memangkunya': 'pangku', + 'pangkuan': 'pangku', + 'pangkuannya': 'pangku', + 'pangkuanku': 'pangku', + 'pangkuanmu': 'pangku', + 'pangkuan-mu': 'pangku', + 'berpangku': 'pangku', + 'berpangkuan': 'pangku', + 'memangkung': 'pangkung', + 'memangkur': 'pangkur', + 'berpangsa': 'pangsa', + 'memangsakan': 'pangsa', + 'kepangsek': 'pangsek', + 'berpangsi': 'pangsi', + 'memanguk': 'panguk', + 'memangur': 'pangur', + 'kepanikan': 'panik', + 'kepanikannya': 'panik', + 'kepanikanku': 'panik', + 'kepanikanmu': 'panik', + 'kepaniteraan': 'panitera', + 'kepanitiaan': 'panitia', + 'kepanitiaannya': 'panitia', + 'mempanitiai': 'panitia', + 'mengarak panja': 'panja', + 'memanjang': 'panjang', + 'memanjangnya': 'panjang', + 'memanjangkan': 'panjang', + 'memanjangkannya': 'panjang', + 'memanjangi': 'panjang', + 'sepanjang': 'panjang', + 'sepanjangnya': 'panjang', + 'sepanjangan': 'panjang', + 'berpanjang': 'panjang', + 'berpanjangan': 'panjang', + 'pemanjangan': 'panjang', + 'kepanjangan': 'panjang', + 'kepanjangannya': 'panjang', + 'kepanjanganan': 'panjang', + 'perpanjangan': 'panjang', + 'perpanjangannya': 'panjang', + 'perpanjanganan': 'panjang', + 'memperpanjang': 'panjang', + 'memperpanjangnya': 'panjang', + 'memperpanjangkan': 'panjang', + 'memperpanjangan': 'panjang', + 'pemerpanjangan': 'panjang', + 'berkepanjangan': 'panjang', + 'berkepanjangannya': 'panjang', + 'berkepanjanganlah': 'panjang', + 'berpanjang kalam': 'panjang', + 'berpanjang-panjang': 'panjang', + 'panjatan': 'panjat', + 'panjatannya': 'panjat', + 'memanjat': 'panjat', + 'memanjatnya': 'panjat', + 'memanjatlah': 'panjat', + 'memanjatkan': 'panjat', + 'memanjatkannya': 'panjat', + 'memanjati': 'panjat', + 'memanjatan': 'panjat', + 'pemanjat': 'panjat', + 'pemanjatnya': 'panjat', + 'pemanjatan': 'panjat', + 'pemanjatannya': 'panjat', + 'panji-panji': 'panji', + 'panji-panjinya': 'panji', + 'memanjingkan': 'panjing', + 'memanjut': 'panjut', + 'memanjutkan': 'panjut', + 'memanjut-manjut': 'panjut', + 'memantai': 'pantai', + 'pantaran': 'pantar', + 'pantarannya': 'pantar', + 'sepantar': 'pantar', + 'sepantaran': 'pantar', + 'pemantas': 'pantas', + 'pemantasan': 'pantas', + 'memantas': 'pantas', + 'memantaskan': 'pantas', + 'sepantasnya': 'pantas', + 'sepantasnyalah': 'pantas', + 'memantas-mantas diri': 'pantas', + 'memantati': 'pantat', + 'pantauan': 'pantau', + 'pantauannya': 'pantau', + 'pemantau': 'pantau', + 'pemantaunya': 'pantau', + 'pemantaulah': 'pantau', + 'pemantauan': 'pantau', + 'memantau': 'pantau', + 'memantaunya': 'pantau', + 'memantaulah': 'pantau', + 'memantauan': 'pantau', + 'memantauku': 'pantau', + 'memantaumu': 'pantau', + 'terpantau': 'pantau', + 'terpantaunya': 'pantau', + 'terpantaui': 'pantau', + 'pemantauannya': 'pantau', + 'memantek': 'pantek', + 'terpantek': 'pantek', + 'pemantik': 'pantik', + 'pemantiknya': 'pantik', + 'memantik': 'pantik', + 'memantiknya': 'pantik', + 'memantikkan': 'pantik', + 'memantikan': 'pantik', + 'pemantikan': 'pantik', + 'terpanting': 'panting', + 'berpantingan': 'panting', + 'memantis': 'pantis', + 'sepantun': 'pantun', + 'pemantun': 'pantun', + 'berpantun': 'pantun', + 'memantuni': 'pantun', + 'memantunkan': 'pantun', + 'berpantun-pantun': 'pantun', + 'memapah': 'papah', + 'memapahnya': 'papah', + 'memapahku': 'papah', + 'berpapah': 'papah', + 'memapak': 'papak', + 'memapaki': 'papak', + 'pemapakan': 'papak', + 'berpapakan': 'papak', + 'memapan': 'papan', + 'memapankan': 'papan', + 'memapani': 'papan', + 'memapras': 'papras', + 'para-para': 'para', + 'paraban': 'parab', + 'berparade': 'parade', + 'memaraf': 'paraf', + 'memarafnya': 'paraf', + 'memparafrasekan': 'parafrase', + 'memperparah': 'parah', + 'memperparahnya': 'parah', + 'memarani': 'paran', + 'memarang': 'parang', + 'memarangi': 'parang', + 'parangan': 'parang', + 'memarangkan': 'parang', + 'pemarap': 'parap', + 'pemarapan': 'parap', + 'memarap': 'parap', + 'berparap': 'parap', + 'memaras': 'paras', + 'separas': 'paras', + 'separasi': 'paras', + 'memarih': 'parih', + 'memarit': 'parit', + 'berpariwisata': 'pariwisata', + 'kepariwisataan': 'pariwisata', + 'kepariwisataannya': 'pariwisata', + 'memarkir': 'parkir', + 'memarkirnya': 'parkir', + 'memarkirkan': 'parkir', + 'memarkirkannya': 'parkir', + 'memarkiran': 'parkir', + 'terparkir': 'parkir', + 'terparkirnya': 'parkir', + 'terparkirkan': 'parkir', + 'terparkiri': 'parkir', + 'perparkiran': 'parkir', + 'perparkirannya': 'parkir', + 'memarodikan': 'parodi', + 'berpartai': 'partai', + 'berpartailah': 'partai', + 'kepartaian': 'partai', + 'kepartaiannya': 'partai', + 'berpartisipasi': 'partisipasi', + 'berpartisipasinya': 'partisipasi', + 'berpartisipasilah': 'partisipasi', + 'berpartner': 'partner', + 'paru-paru': 'paru', + 'paru-parunya': 'paru', + 'paru-paruku': 'paru', + 'paru-parumu': 'paru', + 'paruhan': 'paruh', + 'separuh': 'paruh', + 'separuhnya': 'paruh', + 'separuhlah': 'paruh', + 'separuhnyalah': 'paruh', + 'memaruh': 'paruh', + 'pemaruh': 'paruh', + 'pemarun': 'parun', + 'memarun': 'parun', + 'parunan': 'parun', + 'pemarunan': 'parun', + 'mengepas': 'pas', + 'mengepasnya': 'pas', + 'mengepaskan': 'pas', + 'pas-pasan': 'pas', + 'pas-pasanlah': 'pas', + 'terpasah': 'pasah', + 'memasok': 'pasok', + 'memasoknya': 'pasok', + 'memasoki': 'pasok', + 'memasokan': 'pasok', + 'pasokan': 'pasok', + 'pasokannya': 'pasok', + 'pasokani': 'pasok', + 'pasokanan': 'pasok', + 'pemasok': 'pasok', + 'pemasoknya': 'pasok', + 'pemasoklah': 'pasok', + 'pemasokkan': 'pasok', + 'pemasokan': 'pasok', + 'pemasokannya': 'pasok', + 'memasokkan': 'pasok', + 'berpaspor': 'paspor', + 'berpasporkan': 'paspor', + 'berpasrah': 'pasrah', + 'kepasrahan': 'pasrah', + 'kepasrahannya': 'pasrah', + 'kepasrahanku': 'pasrah', + 'memasrahkan': 'pasrah', + 'memasrahkannya': 'pasrah', + 'dipasteurisasi': 'pasteurisasi', + 'pemastian': 'pasti', + 'pemastiannya': 'pasti', + 'kepastian': 'pasti', + 'kepastiannya': 'pasti', + 'kepastianlah': 'pasti', + 'memastikan': 'pasti', + 'memastikannya': 'pasti', + 'memastikanan': 'pasti', + 'pastoran': 'pastor', + 'pasukan': 'pasuk', + 'pasukannya': 'pasuk', + 'pasukanlah': 'pasuk', + 'pasukanan': 'pasuk', + 'pasukanku': 'pasuk', + 'pasukanmu': 'pasuk', + 'berpasuk-pasuk': 'pasuk', + 'memasung': 'pasung', + 'memasungnya': 'pasung', + 'pasungan': 'pasung', + 'pasungannya': 'pasung', + 'pemasungan': 'pasung', + 'pemasungannya': 'pasung', + 'memasungkan': 'pasung', + 'berpatam': 'patam', + 'mematar': 'patar', + 'mematenkan': 'paten', + 'mematenkannya': 'paten', + 'pematih': 'patih', + 'pematihan': 'patih', + 'kepatihan': 'patih', + 'mematik': 'patik', + 'mematiknya': 'patik', + 'mematikkan': 'patik', + 'mematil': 'patil', + 'memating': 'pating', + 'patokan': 'patok', + 'patokannya': 'patok', + 'patokanan': 'patok', + 'mematok': 'patok', + 'mematoknya': 'patok', + 'mematokkan': 'patok', + 'mematokan': 'patok', + 'pematokan': 'patok', + 'pematokannya': 'patok', + 'mematri': 'patri', + 'mematrikan': 'patri', + 'patrian': 'patri', + 'patriani': 'patri', + 'pematri': 'patri', + 'pematrian': 'patri', + 'terpatri': 'patri', + 'terpatrikan': 'patri', + 'mempatroli': 'patroli', + 'berpatroli': 'patroli', + 'mematuhi': 'patuh', + 'mematuhinya': 'patuh', + 'mematuhiku': 'patuh', + 'kepatuhan': 'patuh', + 'kepatuhannya': 'patuh', + 'pematuhan': 'patuh', + 'pematung': 'patung', + 'pematungnya': 'patung', + 'mematung': 'patung', + 'mematungnya': 'patung', + 'mematungkan': 'patung', + 'berpatungan': 'patungan', + 'mematut': 'patut', + 'mematutkan': 'patut', + 'kepatutan': 'patut', + 'kepatutannya': 'patut', + 'berpatutan': 'patut', + 'sepatutnya': 'patut', + 'sepatutnyalah': 'patut', + 'mematut-matut': 'patut', + 'memauk': 'pauk', + 'memaukkan': 'pauk', + 'memauki': 'pauk', + 'pemauk': 'pauk', + 'kepausan': 'paus', + 'kepausannya': 'paus', + 'berpawai': 'pawai', + 'memayang': 'payang', + 'pemayar': 'payar', + 'pemayaran': 'payar', + 'berpayudara': 'payudara', + 'memayungi': 'payung', + 'memayunginya': 'payung', + 'berpayung': 'payung', + 'berpayungkan': 'payung', + 'berpayungan': 'payung', + 'memayungkan': 'payung', + 'memecakkan': 'pecak', + 'memecal': 'pecal', + 'memeda': 'peda', + 'memedai': 'peda', + 'memedang': 'pedang', + 'kepedihan': 'pedih', + 'kepedihannya': 'pedih', + 'memedihkan': 'pedih', + 'berpedoman': 'pedoman', + 'memedomani': 'pedoman', + 'kepedulian': 'peduli', + 'kepeduliannya': 'peduli', + 'kepedulianlah': 'peduli', + 'memedulikan': 'peduli', + 'memedulikannya': 'peduli', + 'terpegah': 'pegah', + 'memegalkan': 'pegal', + 'terpegan': 'pegan', + 'memegas': 'pegas', + 'memegaskan': 'pegas', + 'memegat': 'pegat', + 'pemegatan': 'pegat', + 'kepegawaian': 'pegawai', + 'kepegawaiannya': 'pegawai', + 'kepegawaianan': 'pegawai', + 'kepegawaianmu': 'pegawai', + 'terpegun': 'pegun', + 'terpejam': 'pejam', + 'memejamkan': 'pejam', + 'memejamkannya': 'pejam', + 'kepekatan': 'pekat', + 'kepekatannya': 'pekat', + 'memekatkan': 'pekat', + 'memekau': 'pekau', + 'memeking': 'peking', + 'memekis': 'pekis', + 'sepeku': 'peku', + 'memekuk': 'pekuk', + 'mengepel': 'pel', + 'mengepelnya': 'pel', + 'memelankan': 'pelan', + 'memelankannya': 'pelan', + 'pelan-pelan': 'pelan', + 'pelan-pelanlah': 'pelan', + 'memelana': 'pelana', + 'berpelana': 'pelana', + 'terpelanting': 'pelanting', + 'memelaspas': 'pelaspas', + 'berpelatuk': 'pelatuk', + 'pelawaan': 'pelawa', + 'memelawa': 'pelawa', + 'memeleceh': 'peleceh', + 'terpelecok': 'pelecok', + 'terpelekok': 'pelekok', + 'terpelencit': 'pelencit', + 'terpelengak': 'pelengak', + 'berpelepah': 'pelepah', + 'memelesat': 'pelesat', + 'terpelesat': 'pelesat', + 'pelesiran': 'pelesir', + 'pelesirannya': 'pelesir', + 'berpelesir': 'pelesir', + 'berpelesiran': 'pelesir', + 'peletan': 'pelet', + 'memelet': 'pelet', + 'memeletnya': 'pelet', + 'memeletek': 'peletek', + 'peliharaan': 'pelihara', + 'peliharaannya': 'pelihara', + 'peliharaanku': 'pelihara', + 'peliharaanmu': 'pelihara', + 'pemelihara': 'pelihara', + 'pemeliharanya': 'pelihara', + 'pemeliharaan': 'pelihara', + 'memelihara': 'pelihara', + 'memeliharanya': 'pelihara', + 'memeliharamu': 'pelihara', + 'terpelihara': 'pelihara', + 'terpeliharanya': 'pelihara', + 'pemeliharaannya': 'pelihara', + 'memeliharakan': 'pelihara', + 'pelintiran': 'pelintir', + 'pelintirannya': 'pelintir', + 'memelintir': 'pelintir', + 'memelintirnya': 'pelintir', + 'memelintirkan': 'pelintir', + 'pemelintir': 'pelintir', + 'pemelintiran': 'pelintir', + 'terpelintir': 'pelintir', + 'terpelintirnya': 'pelintir', + 'memelintir-melintir': 'pelintir', + 'pelipisan': 'pelipis', + 'memelisit': 'pelisit', + 'kepelitan': 'pelit', + 'memelitur': 'pelitur', + 'pelituran': 'pelitur', + 'berpelitur': 'pelitur', + 'memelonco': 'pelonco', + 'perpeloncoan': 'pelonco', + 'memelopori': 'pelopor', + 'memeloporinya': 'pelopor', + 'kepeloporan': 'pelopor', + 'kepeloporannya': 'pelopor', + 'memeloroti': 'pelorot', + 'terpelosot': 'pelosot', + 'memelotot': 'pelotot', + 'memelototkan': 'pelotot', + 'memelototi': 'pelotot', + 'memelototinya': 'pelotot', + 'memelototiku': 'pelotot', + 'berpeluang': 'peluang', + 'berpeluangnya': 'peluang', + 'berpeluangan': 'peluang', + 'berpematang': 'pematang', + 'berpentas': 'pentas', + 'pementasan': 'pentas', + 'pementasannya': 'pentas', + 'mementaskan': 'pentas', + 'mementaskannya': 'pentas', + 'pemerintah': 'perintah', + 'pemerintahnya': 'perintah', + 'pemerintahlah': 'perintah', + 'pemerintahkan': 'perintah', + 'pemerintahi': 'perintah', + 'pemerintahan': 'perintah', + 'pemerintahku': 'perintah', + 'pemerintahmu': 'perintah', + 'memerintah': 'perintah', + 'memerintahnya': 'perintah', + 'memerintahkan': 'perintah', + 'memerintahkannya': 'perintah', + 'memerintahan': 'perintah', + 'memerintahmu': 'perintah', + 'terperintah': 'perintah', + 'memerintahi': 'perintah', + 'pemerintahannya': 'perintah', + 'pemerintahanlah': 'perintah', + 'pemerintahanan': 'perintah', + 'pemerintahannyalah': 'perintah', + 'pemerintahanku': 'perintah', + 'pemerintahanmu': 'perintah', + 'memerintahkankan': 'perintah', + 'memerintahkanku': 'perintah', + 'memerintahkanmu': 'perintah', + 'berpemerintahan': 'perintah', + 'petaan': 'peta', + 'terpeta': 'peta', + 'terpetakan': 'peta', + 'terpetakannya': 'peta', + 'pemetaan': 'peta', + 'pemetaannya': 'peta', + 'perpetaan': 'peta', + 'perpetaannya': 'peta', + 'memetakan': 'peta', + 'memetakannya': 'peta', + 'pemidangan': 'pemidang', + 'pemirsa': 'pirsa', + 'pemirsanya': 'pirsa', + 'penambang': 'tambang', + 'penambangnya': 'tambang', + 'penambangan': 'tambang', + 'menambang': 'tambang', + 'menambangnya': 'tambang', + 'menambangkan': 'tambang', + 'menambangan': 'tambang', + 'tambangan': 'tambang', + 'penambangannya': 'tambang', + 'bertambangan': 'tambang', + 'pertambangan': 'tambang', + 'pertambangannya': 'tambang', + 'pertambanganlah': 'tambang', + 'penampilan': 'tampil', + 'penampilannya': 'tampil', + 'penampilannyalah': 'tampil', + 'penampilanku': 'tampil', + 'penampilanmu': 'tampil', + 'menampilkan': 'tampil', + 'menampilkannya': 'tampil', + 'menampilkankan': 'tampil', + 'berpenampilan': 'tampil', + 'berpenampilannya': 'tampil', + 'berpenampilanlah': 'tampil', + 'penangkal': 'tangkal', + 'penangkalnya': 'tangkal', + 'penangkalan': 'tangkal', + 'menangkal': 'tangkal', + 'menangkalnya': 'tangkal', + 'menangkali': 'tangkal', + 'tertangkal': 'tangkal', + 'penangkalannya': 'tangkal', + 'menangkalkan': 'tangkal', + 'memencak-mencak': 'pencak', + 'memencet': 'pencet', + 'memencetnya': 'pencet', + 'memenceti': 'pencet', + 'kepencut': 'pencut', + 'memenda': 'penda', + 'pendaan': 'penda', + 'pendaannya': 'penda', + 'pendaanan': 'penda', + 'memendaki': 'pendak', + 'pendaran': 'pendar', + 'berpendar': 'pendar', + 'berpendarnya': 'pendar', + 'berpendaran': 'pendar', + 'berpendar-pendar': 'pendar', + 'memendek': 'pendek', + 'memendeknya': 'pendek', + 'memendekkan': 'pendek', + 'memendekkannya': 'pendek', + 'memendekan': 'pendek', + 'pemendekan': 'pendek', + 'kependekan': 'pendek', + 'kependetaan': 'pendeta', + 'kependetaannya': 'pendeta', + 'berpending': 'pending', + 'berpendingan': 'pending', + 'menegas': 'tegas', + 'menegasnya': 'tegas', + 'menegaskan': 'tegas', + 'menegaskannya': 'tegas', + 'menegasi': 'tegas', + 'menegasan': 'tegas', + 'penegasan': 'tegas', + 'penegasannya': 'tegas', + 'ketegasan': 'tegas', + 'ketegasannya': 'tegas', + 'ketegasanlah': 'tegas', + 'ketegasanan': 'tegas', + 'ketegasanmu': 'tegas', + 'menegaskankan': 'tegas', + 'menegaskanku': 'tegas', + 'pertegasan': 'tegas', + 'mempertegas': 'tegas', + 'mempertegasnya': 'tegas', + 'mempertegaskan': 'tegas', + 'penerbang': 'terbang', + 'penerbangnya': 'terbang', + 'penerbangkan': 'terbang', + 'penerbangan': 'terbang', + 'menerbangi': 'terbang', + 'menerbanginya': 'terbang', + 'penerbangannya': 'terbang', + 'penerbanganan': 'terbang', + 'penerbanganku': 'terbang', + 'beterbangan': 'terbang', + 'beterbangannya': 'terbang', + 'menerbangkan': 'terbang', + 'menerbangkannya': 'terbang', + 'terbang-terbang': 'terbang', + 'terbang-terbangan': 'terbang', + 'terbang-terbang hinggap': 'terbang', + 'berpenetrasi': 'penetrasi', + 'berpengantin': 'pengantin', + 'memengap': 'pengap', + 'kepengapan': 'pengap', + 'memengapkan': 'pengap', + 'memengat': 'pengat', + 'pengkolan': 'pengkol', + 'memengkol': 'pengkol', + 'memengos': 'pengos', + 'tiduran': 'tidur', + 'penidur': 'tidur', + 'peniduran': 'tidur', + 'meniduri': 'tidur', + 'menidurinya': 'tidur', + 'menidurimu': 'tidur', + 'tertidur': 'tidur', + 'tertidurnya': 'tidur', + 'petiduran': 'tidur', + 'ketiduran': 'tidur', + 'menidurkan': 'tidur', + 'menidurkannya': 'tidur', + 'seketiduran': 'tidur', + 'tidur-tidur': 'tidur', + 'tidur-tiduran': 'tidur', + 'berseketiduran': 'tidur', + 'ketidur-tiduran': 'tidur', + 'penimbal': 'timbal', + 'timbalan': 'timbal', + 'menimbal': 'timbal', + 'menimbalkan': 'timbal', + 'setimbal': 'timbal', + 'bertimbal': 'timbal', + 'menimbali': 'timbal', + 'bertimbalan': 'timbal', + 'kesetimbalan': 'timbal', + 'bertimbal-timbalan': 'timbal', + 'memensiun': 'pensiun', + 'memensiunkan': 'pensiun', + 'memensiunkannya': 'pensiun', + 'pensiunan': 'pensiun', + 'pensiunannya': 'pensiun', + 'penyair': 'syair', + 'penyairnya': 'syair', + 'penyairan': 'syair', + 'penyairku': 'syair', + 'pensyair': 'syair', + 'bersyair': 'syair', + 'bersyairkan': 'syair', + 'menyairkan': 'syair', + 'kepenyairan': 'syair', + 'kepenyairannya': 'syair', + 'terpental': 'pental', + 'terpentalnya': 'pental', + 'mementang': 'pentang', + 'terpentang': 'pentang', + 'mementil': 'pentil', + 'pentolan': 'pentol', + 'pentolannya': 'pentol', + 'berpentol': 'pentol', + 'pentungan': 'pentung', + 'pentungannya': 'pentung', + 'mementung': 'pentung', + 'mementungi': 'pentung', + 'pentung-pentungan': 'pentung', + 'dituai': 'tuai', + 'dituainya': 'tuai', + 'penuai': 'tuai', + 'penuaian': 'tuai', + 'menuai': 'tuai', + 'menuainya': 'tuai', + 'menuaikan': 'tuai', + 'menuaii': 'tuai', + 'tuaian': 'tuai', + 'menumpang': 'tumpang', + 'menumpangnya': 'tumpang', + 'menumpanglah': 'tumpang', + 'menumpangkan': 'tumpang', + 'menumpangkannya': 'tumpang', + 'menumpangi': 'tumpang', + 'penumpang': 'tumpang', + 'penumpangnya': 'tumpang', + 'penumpanglah': 'tumpang', + 'penumpangkan': 'tumpang', + 'penumpangan': 'tumpang', + 'penumpangku': 'tumpang', + 'tumpangan': 'tumpang', + 'tumpangannya': 'tumpang', + 'tertumpang': 'tumpang', + 'tertumpangi': 'tumpang', + 'menumpanginya': 'tumpang', + 'penumpangannya': 'tumpang', + 'tunjangan': 'tunjang', + 'tunjangannya': 'tunjang', + 'penunjang': 'tunjang', + 'penunjangnya': 'tunjang', + 'penunjangan': 'tunjang', + 'menunjang': 'tunjang', + 'menunjangnya': 'tunjang', + 'menunjangkan': 'tunjang', + 'tertunjang': 'tunjang', + 'bersajak': 'sajak', + 'penyajak': 'sajak', + 'menyajak': 'sajak', + 'persajakan': 'sajak', + 'menyajakkan': 'sajak', + 'menyalir': 'salir', + 'penyaliran': 'salir', + 'sandangan': 'sandang', + 'penyandang': 'sandang', + 'penyandangnya': 'sandang', + 'penyandangan': 'sandang', + 'menyandang': 'sandang', + 'menyandangnya': 'sandang', + 'menyandangkan': 'sandang', + 'mempersandangkan': 'sandang', + 'saringan': 'saring', + 'saringannya': 'saring', + 'menyaring': 'saring', + 'menyaringnya': 'saring', + 'menyaringan': 'saring', + 'penyaring': 'saring', + 'penyaringnya': 'saring', + 'penyaringan': 'saring', + 'penyaringannya': 'saring', + 'semburan': 'sembur', + 'semburannya': 'sembur', + 'penyembur': 'sembur', + 'penyemburkan': 'sembur', + 'penyemburan': 'sembur', + 'tersembur': 'sembur', + 'tersemburlah': 'sembur', + 'menyembur': 'sembur', + 'menyemburnya': 'sembur', + 'menyemburkan': 'sembur', + 'menyemburkannya': 'sembur', + 'menyemburi': 'sembur', + 'bersemburan': 'sembur', + 'penyemburannya': 'sembur', + 'sembur-sembur': 'sembur', + 'bersembur-semburan': 'sembur', + 'semprotan': 'semprot', + 'semprotannya': 'semprot', + 'menyemprot': 'semprot', + 'menyemprotnya': 'semprot', + 'menyemprotkan': 'semprot', + 'menyemprotkannya': 'semprot', + 'menyemproti': 'semprot', + 'menyemprotan': 'semprot', + 'penyemprot': 'semprot', + 'penyemprotnya': 'semprot', + 'penyemprotkan': 'semprot', + 'penyemprotan': 'semprot', + 'penyemprotannya': 'semprot', + 'menyengap': 'sengap', + 'penyengap': 'sengap', + 'menyengapkan': 'sengap', + 'serahan': 'serah', + 'menyerah': 'serah', + 'menyerahnya': 'serah', + 'menyerahlah': 'serah', + 'menyerahkan': 'serah', + 'menyerahkannya': 'serah', + 'menyerahan': 'serah', + 'terserah': 'serah', + 'terserahnya': 'serah', + 'terserahlah': 'serah', + 'berserah': 'serah', + 'berserahlah': 'serah', + 'berserahkan': 'serah', + 'berserahan': 'serah', + 'seserahan': 'serah', + 'seserahannya': 'serah', + 'menyerahi': 'serah', + 'penyerahan': 'serah', + 'penyerahannya': 'serah', + 'penyerahanan': 'serah', + 'menyerahkankan': 'serah', + 'menyerahkani': 'serah', + 'menyerahkanku': 'serah', + 'menyerahkanmu': 'serah', + 'memepah': 'pepah', + 'sepepak': 'pepak', + 'memepak': 'pepak', + 'memepas': 'pepas', + 'memepat': 'pepat', + 'memepati': 'pepat', + 'berpepat': 'pepat', + 'memeper': 'peper', + 'memeperkan': 'peper', + 'terpeper': 'peper', + 'pepesan': 'pepes', + 'pepesanan': 'pepes', + 'memepes': 'pepes', + 'memepet': 'pepet', + 'memepetnya': 'pepet', + 'memepetkan': 'pepet', + 'kepepet': 'pepet', + 'kepepetnya': 'pepet', + 'memepeti': 'pepet', + 'terpepet': 'pepet', + 'meraga': 'raga', + 'meragakan': 'raga', + 'peraga': 'raga', + 'peraganya': 'raga', + 'peragakan': 'raga', + 'peragaan': 'raga', + 'peragaannya': 'raga', + 'pemeraga': 'raga', + 'pemeragaan': 'raga', + 'memperagakan': 'raga', + 'memperagakannya': 'raga', + 'keperagawanan': 'peragawan', + 'keperagawatian': 'peragawati', + 'perah keringat': 'perah otak', + 'berperahu': 'perahu', + 'memerai': 'perai', + 'berperai-perai': 'perai', + 'teraih': 'raih', + 'peraih': 'raih', + 'peraihnya': 'raih', + 'peraihan': 'raih', + 'meraih': 'raih', + 'meraihnya': 'raih', + 'meraihkan': 'raih', + 'meraihan': 'raih', + 'meraihku': 'raih', + 'meraihmu': 'raih', + 'keperakan': 'perak', + 'keperakannya': 'perak', + 'keperak-perakan': 'perak', + 'pemeran': 'peran', + 'pemerannya': 'peran', + 'pemeranan': 'peran', + 'peranan': 'peran', + 'peranannya': 'peran', + 'perananan': 'peran', + 'berperan': 'peran', + 'berperannya': 'peran', + 'berperanlah': 'peran', + 'berperanan': 'peran', + 'memerankan': 'peran', + 'memerankannya': 'peran', + 'memerankanku': 'peran', + 'berperan serta': 'peran serta', + 'perancah': 'rancah', + 'perancahnya': 'rancah', + 'memerangi': 'perang', + 'memeranginya': 'perang', + 'memerangimu': 'perang', + 'berperang': 'perang', + 'berperangnya': 'perang', + 'berperangan': 'perang', + 'peperangan': 'perang', + 'peperangannya': 'perang', + 'peperanganku': 'perang', + 'berperang-perangan': 'perang', + 'terperangah': 'perangah', + 'terperangahnya': 'perangah', + 'memerangahkan': 'perangah', + 'seperanggu': 'peranggu', + 'seperangguan': 'peranggu', + 'merangkap': 'rangkap', + 'merangkapnya': 'rangkap', + 'merangkapkan': 'rangkap', + 'berangkap': 'rangkap', + 'perangkap': 'rangkap', + 'perangkapnya': 'rangkap', + 'perangkapan': 'rangkap', + 'perangkapku': 'rangkap', + 'berangkap-rangkapan': 'rangkap', + 'memerap': 'perap', + 'memerapkan': 'perap', + 'terperap': 'perap', + 'berperata': 'perata', + 'memerawani': 'perawan', + 'keperawanan': 'perawan', + 'keperawanannya': 'perawan', + 'keperawananku': 'perawan', + 'keperawananmu': 'perawan', + 'diperbal': 'perbal', + 'memerban': 'perban', + 'memercit': 'percit', + 'tepercit': 'percit', + 'tepercul': 'percul', + 'diperdanakan': 'perdana', + 'diperdom': 'perdom', + 'diperdomi': 'perdom', + 'terperedus': 'peredus', + 'terpereh-pereh': 'pereh', + 'keperempuanan': 'perempuan', + 'keperempuanannya': 'perempuan', + 'terperenyuk': 'perenyuk', + 'memereteli': 'peretel', + 'pemeretelan': 'peretel', + 'kepergok': 'pergok', + 'kepergoknya': 'pergok', + 'tepergok': 'pergok', + 'tepergoknya': 'pergok', + 'tepergoki': 'pergok', + 'memergoki': 'pergok', + 'memergokinya': 'pergok', + 'memergokiku': 'pergok', + 'memergol': 'pergol', + 'memergoli': 'pergol', + 'berperi': 'peri', + 'berperikan': 'peri', + 'pemerian': 'peri', + 'memerikan': 'peri', + 'terperikan': 'peri', + 'keperigelan': 'perigel', + 'perincian': 'perinci', + 'perinciannya': 'perinci', + 'memerinci': 'perinci', + 'memerincinya': 'perinci', + 'memerincikan': 'perinci', + 'terperinci': 'perinci', + 'pemerincian': 'perinci', + 'memeringis': 'peringis', + 'rintangan': 'rintang', + 'rintangannya': 'rintang', + 'rintanganlah': 'rintang', + 'perintang': 'rintang', + 'perintangan': 'rintang', + 'merintang': 'rintang', + 'merintangi': 'rintang', + 'terintang': 'rintang', + 'terintangi': 'rintang', + 'merintanginya': 'rintang', + 'merintangkan': 'rintang', + 'perintang-rintang': 'rintang', + 'merintang-rintang': 'rintang', + 'berperistiwa': 'peristiwa', + 'beperkara': 'perkara', + 'beperkaralah': 'perkara', + 'memperkarai': 'perkara', + 'memperkarakan': 'perkara', + 'memperkarakannya': 'perkara', + 'memerkosa': 'perkosa', + 'memerkosanya': 'perkosa', + 'memerkosaan': 'perkosa', + 'memerkosaku': 'perkosa', + 'pemerkosa': 'perkosa', + 'pemerkosanya': 'perkosa', + 'pemerkosaan': 'perkosa', + 'pemerkosaku': 'perkosa', + 'pemerkosaannya': 'perkosa', + 'memerlahan': 'perlahan', + 'memerlahankan': 'perlahan', + 'perlahan-lahan': 'perlahan', + 'perlahan-lahanlah': 'perlahan', + 'perlian': 'perli', + 'memerli': 'perli', + 'memerlikan': 'perli', + 'teperling': 'perling', + 'perlip-perlipan': 'perlip', + 'teperlus': 'perlus', + 'kepermaian': 'permai', + 'memermak': 'permak', + 'memermaknya': 'permak', + 'tepermanai': 'permana', + 'mempermisikan': 'permisi', + 'pernak-pernik': 'pernik', + 'pernak-perniknya': 'pernik', + 'pernik-pernik': 'pernik', + 'memernis': 'pernis', + 'pernisan': 'pernis', + 'memerogol': 'perogol', + 'terperohong': 'perohong', + 'terperonyok': 'peronyok', + 'terperosok': 'perosok', + 'terperosoknya': 'perosok', + 'merosot': 'perosot', + 'memerosot': 'perosot', + 'memerosotkan': 'perosot', + 'kepustakaan': 'pustaka', + 'perpustakaan': 'pustaka', + 'perpustakaannya': 'pustaka', + 'bersahabat': 'sahabat', + 'bersahabatnya': 'sahabat', + 'bersahabatlah': 'sahabat', + 'bersahabatan': 'sahabat', + 'persahabatan': 'sahabat', + 'persahabatannya': 'sahabat', + 'persahabatanlah': 'sahabat', + 'persahabatanku': 'sahabat', + 'persahabatanmu': 'sahabat', + 'mempersahabatkan': 'sahabat', + 'bersegi': 'segi', + 'persegi': 'segi', + 'perseginya': 'segi', + 'memersekoti': 'persekot', + 'mempersekoti': 'persekot', + 'memersekusi': 'persekusi', + 'persenan': 'persen', + 'persenannya': 'persen', + 'persenanlah': 'persen', + 'memerseni': 'persen', + 'memersenkan': 'persen', + 'bersenjata': 'senjata', + 'bersenjatanya': 'senjata', + 'bersenjatalah': 'senjata', + 'bersenjatakan': 'senjata', + 'kesenjataan': 'senjata', + 'kesenjataannya': 'senjata', + 'persenjataan': 'senjata', + 'persenjataannya': 'senjata', + 'mempersenjatai': 'senjata', + 'mempersenjatainya': 'senjata', + 'tersenyawa': 'senyawa', + 'memersepsikan': 'persepsi', + 'memersepsikannya': 'persepsi', + 'seratus': 'ratus', + 'seratusnya': 'ratus', + 'seratusan': 'ratus', + 'ratusan': 'ratus', + 'ratusannya': 'ratus', + 'ratusanlah': 'ratus', + 'ratusanan': 'ratus', + 'meratus': 'ratus', + 'peratus': 'ratus', + 'peratusan': 'ratus', + 'seperatus': 'ratus', + 'menyeratus': 'ratus', + 'perseratus': 'ratus', + 'seperseratus': 'ratus', + 'seperseratusnya': 'ratus', + 'beratus-ratus': 'ratus', + 'pesero': 'sero', + 'peseroan': 'sero', + 'perseroan': 'sero', + 'perseroannya': 'sero', + 'perseroankan': 'sero', + 'berseteru': 'seteru', + 'berseterunya': 'seteru', + 'berseteruan': 'seteru', + 'menyeterui': 'seteru', + 'perseteruan': 'seteru', + 'perseteruannya': 'seteru', + 'memperseterukan': 'seteru', + 'setubuh': 'tubuh', + 'setubuhnya': 'tubuh', + 'setubuhi': 'tubuh', + 'bertubuh': 'tubuh', + 'menubuhkan': 'tubuh', + 'pertubuhan': 'tubuh', + 'bersetubuh': 'tubuh', + 'bersetubuhi': 'tubuh', + 'bersetubuhan': 'tubuh', + 'menyetubuhi': 'tubuh', + 'menyetubuhinya': 'tubuh', + 'persetubuhan': 'tubuh', + 'persetubuhannya': 'tubuh', + 'tepersil': 'persil', + 'memersonanongratakan': 'persona nongrata', + 'memersonifikasi': 'personifikasi', + 'memersonifikasikan': 'personifikasi', + 'memersuasi': 'persuasi', + 'pertalan': 'pertal', + 'memert al': 'pertal', + 'memertamakan': 'pertama', + 'pertama-tama': 'pertama', + 'pertama-tamanya': 'pertama', + 'terperuak': 'peruak', + 'memeruk': 'peruk', + 'memerukan': 'peruk', + 'terperuk': 'peruk', + 'memerukkan': 'peruk', + 'memerum': 'perum', + 'memerun': 'perun', + 'pemerunan': 'perun', + 'seperunjung': 'perunjung', + 'seperunjungan': 'perunjung', + 'memerusa': 'perusa', + 'seperut': 'perut', + 'memeruti': 'perut', + 'berperut': 'perut', + 'perwalian': 'wali', + 'perwaliannya': 'wali', + 'mewalikan': 'wali', + 'memperwalikan': 'wali', + 'berwatak': 'watak', + 'berwatakkan': 'watak', + 'mewataki': 'watak', + 'perwatakan': 'watak', + 'berpesai-pesai': 'pesai', + 'memesamkan': 'pesam', + 'pesangon': 'sangon', + 'pesangonnya': 'sangon', + 'pesangonlah': 'sangon', + 'pesangonkan': 'sangon', + 'pesangonan': 'sangon', + 'berpesawat': 'pesawat', + 'sepeser': 'peser', + 'memesona': 'pesona', + 'memesonanya': 'pesona', + 'memesonakan': 'pesona', + 'terpesona': 'pesona', + 'terpesonanya': 'pesona', + 'memesonai': 'pesona', + 'memesonakanku': 'pesona', + 'berpesta pora': 'pesta pora', + 'kepetah-lidahan': 'petah lidah', + 'petakan': 'petak', + 'petakannya': 'petak', + 'berpetak': 'petak', + 'memetak-metak': 'petak', + 'berpetak-petak': 'petak', + 'memetalkan': 'petal', + 'berpetam': 'petam', + 'kepetangan': 'petang', + 'petang-petang': 'petang', + 'sepetang-petangan': 'petang', + 'pemetang-metangan': 'petang', + 'memetang-metangkan': 'petang', + '2 tani': 'tani', + 'petani': 'tani', + 'petaninya': 'tani', + 'petanilah': 'tani', + 'petanian': 'tani', + 'bertani': 'tani', + 'bertaninya': 'tani', + 'pertanian': 'tani', + 'pertaniannya': 'tani', + 'pertanianan': 'tani', + 'petasan': 'petas', + 'petasannya': 'petas', + 'petentengan': 'petenteng', + 'memetieskan': 'peti es', + 'berpeti-peti': 'peti', + 'memetia': 'petia', + 'memetiakan': 'petia', + 'memeting': 'peting', + 'memetingkan': 'peting', + 'memetir-metir': 'petir', + 'berpetua': 'petua', + 'dipetuakan': 'petua', + 'berpetuah': 'petuah', + 'memetuahkan': 'petuah', + 'pewawancara': 'wawancara', + 'pewawancaranya': 'wawancara', + 'pewawancaramu': 'wawancara', + 'mewawancarai': 'wawancara', + 'mewawancarainya': 'wawancara', + 'mewawancaraiku': 'wawancara', + 'mewawancaraimu': 'wawancara', + 'berwawancara': 'wawancara', + 'terwawancara': 'wawancara', + 'memiagamkan': 'piagam', + 'berpialang': 'pialang', + 'memialangkan': 'pialang', + 'berpiama': 'piama', + 'memiang': 'piang', + 'memiangnya': 'piang', + 'pemiara': 'piara', + 'piaraan': 'piara', + 'piaraannya': 'piara', + 'piaraanku': 'piara', + 'memiara': 'piara', + 'pemiaraan': 'piara', + 'memiat': 'piat', + 'piat-piut': 'piat', + 'kepiatuan': 'piatu', + 'kepiawaian': 'piawai', + 'kepiawaiannya': 'piawai', + 'terpica': 'pica', + 'memicakan': 'pica', + 'kepicikan': 'picik', + 'memicikkan': 'picik', + 'memicing': 'picing', + 'memicingkan': 'picing', + 'sepicing': 'picing', + 'terpicing': 'picing', + 'berpicing': 'picing', + 'picisan': 'picis', + 'sepicis': 'picis', + 'terpico': 'pico', + 'memicu': 'picu', + 'memicunya': 'picu', + 'memicui': 'picu', + 'memicuku': 'picu', + 'pemicu': 'picu', + 'pemicunya': 'picu', + 'pemiculah': 'picu', + 'pemicuan': 'picu', + 'memidana': 'pidana', + 'memidanakan': 'pidana', + 'memidanakannya': 'pidana', + 'terpidana': 'pidana', + 'terpidananya': 'pidana', + 'terpidanai': 'pidana', + 'berpidana': 'pidana', + 'pemidanaan': 'pidana', + 'pemidanaannya': 'pidana', + 'memidi': 'pidi', + 'memijah': 'pijah', + 'memijahnya': 'pijah', + 'memijahkan': 'pijah', + 'pemijahan': 'pijah', + 'pemijahannya': 'pijah', + 'memijat': 'pijat', + 'memijatnya': 'pijat', + 'memijatkan': 'pijat', + 'memijatkannya': 'pijat', + 'memijati': 'pijat', + 'memijatmu': 'pijat', + 'pemijat': 'pijat', + 'pemijatnya': 'pijat', + 'pemijatan': 'pijat', + 'pijatan': 'pijat', + 'pijatannya': 'pijat', + 'pemijatannya': 'pijat', + 'pijat-pijat': 'pijat', + 'pijat-pijatlah': 'pijat', + 'pijat-pijatan': 'pijat', + 'memijit': 'pijit', + 'memijitnya': 'pijit', + 'terpijit': 'pijit', + 'berpikauan': 'pikau', + 'terpikau-pikau': 'pikau', + 'berpiknik': 'piknik', + 'memikul': 'pikul', + 'memikulnya': 'pikul', + 'memikulkan': 'pikul', + 'pemikul': 'pikul', + 'pemikulan': 'pikul', + 'pikulan': 'pikul', + 'pikulannya': 'pikul', + 'berpikul-pikul': 'pikul', + 'memilah': 'pilah', + 'memilahnya': 'pilah', + 'memilahkan': 'pilah', + 'terpilah': 'pilah', + 'terpilah-pilah': 'pilah', + 'memilis': 'pilis', + 'berpilis': 'pilis', + 'memiloti': 'pilot', + 'berpinak': 'pinak', + 'berpinar': 'pinar', + 'memincuk': 'pincuk', + 'kepincuk': 'pincuk', + 'terpincut': 'pincut', + 'terpincutnya': 'pincut', + 'pindaan': 'pinda', + 'meminda': 'pinda', + 'memindakan': 'pinda', + 'memindai': 'pindai', + 'pemindaan': 'pinda', + 'memindahtangankan': 'pindah tangan', + 'memindahtugaskan': 'pindah tugas', + 'memindahtugaskannya': 'pindah tugas', + 'memindainya': 'pindai', + 'pemindai': 'pindai', + 'pemindainya': 'pindai', + 'pemindaian': 'pindai', + 'pemindaiannya': 'pindai', + 'terpinga-pinga': 'pinga', + 'sepinggan': 'pinggan', + 'peminggang': 'pinggang', + 'sepinggang': 'pinggang', + 'sepinggangnya': 'pinggang', + 'berpinggang': 'pinggang', + 'peminggir': 'pinggir', + 'peminggiran': 'pinggir', + 'pinggiran': 'pinggir', + 'pinggirannya': 'pinggir', + 'meminggir': 'pinggir', + 'meminggirkan': 'pinggir', + 'meminggirkannya': 'pinggir', + 'meminggiri': 'pinggir', + 'kepinggiran': 'pinggir', + 'terpinggirkan': 'pinggir', + 'terpinggirkannya': 'pinggir', + 'pingitan': 'pingit', + 'pingitannya': 'pingit', + 'memingit': 'pingit', + 'berpingit': 'pingit', + 'terpingkal-pingkal': 'pingkal', + 'terpingkau-pingkau': 'pingkau', + 'dipingpong': 'pingpong', + 'terpinta': 'pinta', + 'berpinta': 'pinta', + 'terpintar': 'pintar', + 'kepintaran': 'pintar', + 'kepintarannya': 'pintar', + 'kepintaranmu': 'pintar', + 'kepioniran': 'pionir', + 'kepionirannya': 'pionir', + 'pemipaan': 'pipa', + 'perpipaan': 'pipa', + 'memipihkan': 'pipih', + 'pipilan': 'pipil', + 'memipil': 'pipil', + 'pipisan': 'pipis', + 'memipis': 'pipis', + 'memipiskan': 'pipis', + 'memipit': 'pipit', + 'pipitan': 'pipit', + 'memirau': 'pirau', + 'berpirau': 'pirau', + 'berpirau-pirau': 'pirau', + 'memirik': 'pirik', + 'piringan': 'piring', + 'piringannya': 'piring', + 'perpisangan': 'pisang', + 'pisang-pisang': 'pisang', + 'pisang-pisangan': 'pisang', + 'memistol': 'pistol', + 'pistol-pistolan': 'pistol', + 'pisuhan': 'pisuh', + 'berpita': 'pita', + 'memitar': 'pitar', + 'pitingan': 'piting', + 'memiting': 'piting', + 'memitingnya': 'piting', + 'piting-memiting': 'piting', + 'berpiutang': 'piutang', + 'memiutangi': 'piutang', + 'memiutangkan': 'piutang', + 'keplastisan': 'plastis', + 'memplombir': 'plombir', + 'perploncoan': 'plonco', + 'perploncoannya': 'plonco', + 'memoces': 'poces', + 'memocok': 'pocok', + 'sepocong': 'pocong', + 'memojok': 'pojok', + 'memojokkan': 'pojok', + 'memojokkannya': 'pojok', + 'memojoki': 'pojok', + 'memojokan': 'pojok', + 'terpojok': 'pojok', + 'terpojoknya': 'pojok', + 'terpojokkan': 'pojok', + 'terpojokan': 'pojok', + 'pemojokan': 'pojok', + 'berpokok': 'pokok', + 'memokoki': 'pokok', + 'memokokkan': 'pokok', + 'memokrolkan': 'pokrol', + 'pokrol-pokrolan': 'pokrol', + 'berpola': 'pola', + 'berpolah-polah': 'polah', + 'polang-paling': 'polang', + 'berpolemik': 'polemik', + 'berpolemiknya': 'polemik', + 'poleng-poleng': 'poleng', + 'polesan': 'poles', + 'polesannya': 'poles', + 'pemoles': 'poles', + 'pemolesan': 'poles', + 'memoles': 'poles', + 'memolesnya': 'poles', + 'memoleskan': 'poles', + 'memoleskannya': 'poles', + 'memolesi': 'poles', + 'berpoligami': 'poligami', + 'pemolimeran': 'polimer', + 'kepolisian': 'polisi', + 'kepolisiannya': 'polisi', + 'kepolisianlah': 'polisi', + 'kepolisiani': 'polisi', + 'memolok': 'polok', + 'berpolok-polok': 'polok', + 'polongan': 'polong', + 'polong-polongan': 'polong', + 'kepolosan': 'polos', + 'kepolosannya': 'polos', + 'poma-poma': 'poma', + 'pompaan': 'pompa', + 'memompa': 'pompa', + 'memompanya': 'pompa', + 'memompakan': 'pompa', + 'pemompaan': 'pompa', + 'pemompaannya': 'pompa', + 'memondok': 'pondok', + 'memondokkan': 'pondok', + 'pondokan': 'pondok', + 'pondokannya': 'pondok', + 'pemondokan': 'pondok', + 'pemondokannya': 'pondok', + 'pondongan': 'pondong', + 'memondong': 'pondong', + 'memondongi': 'pondong', + 'berpondong': 'pondong', + 'terponggok': 'ponggok', + 'berponi': 'poni', + 'berponinya': 'poni', + 'terpontang-panting': 'pontang-panting', + 'berpontang-panting': 'pontang-panting', + 'memontang-mantingkan': 'pontang-panting', + 'memonten': 'ponten', + 'popokan': 'popok', + 'memopok': 'popok', + 'memopokkan': 'popok', + 'memopor': 'popor', + 'kepopuleran': 'populer', + 'kepopulerannya': 'populer', + 'memopulerkan': 'populer', + 'memopulerkannya': 'populer', + 'memorahkan': 'porah', + 'berporah-porah': 'porah', + 'memorakporandakan': 'porak', + 'memorak-perandakan': 'porak-peranda', + 'memorak-porandakan': 'porak-poranda', + 'berpori': 'pori', + 'berporinya': 'pori', + 'keporian': 'pori', + 'memorot': 'porot', + 'memoroti': 'porot', + 'berpose': 'pose', + 'berposenya': 'pose', + 'berposelah': 'pose', + 'memposer': 'poser', + 'pemosisian': 'posisi', + 'pemosisiannya': 'posisi', + 'memosisikan': 'posisi', + 'memosisikannya': 'posisi', + 'kepositifan': 'positif', + 'kepositifannya': 'positif', + 'memositifkan': 'positif', + 'keprabuan': 'prabu', + 'keprajuritan': 'prajurit', + 'pemrakarsa': 'prakarsa', + 'pemrakarsanya': 'prakarsa', + 'berprakarsa': 'prakarsa', + 'memprakarsai': 'prakarsa', + 'memprakarsainya': 'prakarsa', + 'pemrakarsaan': 'prakarsa', + 'prakiraan': 'prakira', + 'prakiraannya': 'prakira', + 'pemrakiraan': 'prakira', + 'memprakirakan': 'prakira', + 'berpraktik': 'praktik', + 'mempraktikkan': 'praktik', + 'mempraktikkannya': 'praktik', + 'kepraktisan': 'praktis', + 'kepraktisannya': 'praktis', + 'sepraktis-praktisnya': 'praktis', + 'kepramugaraan': 'pramugara', + 'kepramukaan': 'pramuka', + 'kepramukaannya': 'pramuka', + 'mempraperadilankan': 'praperadilan', + 'pemrasaran': 'prasaran', + 'memprediksi': 'prediksi', + 'memprediksinya': 'prediksi', + 'memprediksikan': 'prediksi', + 'memprediksikannya': 'prediksi', + 'mengepres': 'pres', + 'pengepresan': 'pres', + 'mempresentasikan': 'presentasi', + 'mempresentasikannya': 'presentasi', + 'kepresidenan': 'presiden', + 'kepresidenannya': 'presiden', + 'kepresidenanan': 'presiden', + 'kepresidenanku': 'presiden', + 'kepresidenanmu': 'presiden', + 'berprestasi': 'prestasi', + 'berprestasinya': 'prestasi', + 'berprestasilah': 'prestasi', + 'berprestise': 'prestise', + 'berpretensi': 'pretensi', + 'kepriayian': 'priayi', + 'mempribumikan': 'pribumi', + 'berprihatin': 'prihatin', + 'keprihatinan': 'prihatin', + 'keprihatinannya': 'prihatin', + 'keprihatinanlah': 'prihatin', + 'keprihatinanan': 'prihatin', + 'memprihatinkan': 'prihatin', + 'memprihatinkannya': 'prihatin', + 'memprihatinkanlah': 'prihatin', + 'memprioritaskan': 'prioritas', + 'memprioritaskannya': 'prioritas', + 'mengemprit': 'prit', + 'memprivatisasikan': 'privatisasi', + 'pemroduksi': 'produksi', + 'pemroduksinya': 'produksi', + 'pemroduksian': 'produksi', + 'berproduksi': 'produksi', + 'berproduksinya': 'produksi', + 'memproduksi': 'produksi', + 'memproduksinya': 'produksi', + 'memproduksikan': 'produksi', + 'keproduktifan': 'produktif', + 'keproduktifannya': 'produktif', + 'berprofesi': 'profesi', + 'pemrogram': 'program', + 'pemrogramnya': 'program', + 'pemrograman': 'program', + 'memprogram': 'program', + 'memprogramnya': 'program', + 'memprogramkan': 'program', + 'memprogramkannya': 'program', + 'memprograman': 'program', + 'terprogram': 'program', + 'terprogramnya': 'program', + 'terprogramlah': 'program', + 'terprogramkan': 'program', + 'pemrogramannya': 'program', + 'memprosakan': 'prosa', + 'pemrotes': 'protes', + 'pemrotesnya': 'protes', + 'pemrotesan': 'protes', + 'memprotes': 'protes', + 'memprotesnya': 'protes', + 'memprotesi': 'protes', + 'terprovokasi': 'provokasi', + 'terprovokasinya': 'provokasi', + 'memproyeksikan': 'proyeksi', + 'memproyeksikannya': 'proyeksi', + 'berpuak-puak': 'puak', + 'berpuaka': 'puaka', + 'kepualan': 'pual', + 'berpual-pual': 'pual', + 'terpublikasi': 'publikasi', + 'terpublikasinya': 'publikasi', + 'terpublikasikan': 'publikasi', + 'terpublikasikannya': 'publikasi', + 'pemublikasian': 'publikasi', + 'memublikasikan': 'publikasi', + 'memublikasikannya': 'publikasi', + 'berpucuk': 'pucuk', + 'memudikan': 'pudi', + 'memudur': 'pudur', + 'memudurkan': 'pudur', + 'memuduri': 'pudur', + 'berpugak-pugak': 'pugak', + 'memugar': 'pugar', + 'memugarnya': 'pugar', + 'pemugar': 'pugar', + 'pemugaran': 'pugar', + 'memugari': 'pugar', + 'pemugarannya': 'pugar', + 'memugarkan': 'pugar', + 'memugas': 'pugas', + 'pugasan': 'pugas', + 'pemugasan': 'pugas', + 'memuingkan': 'puing', + 'puing-puing': 'puing', + 'puing-puingnya': 'puing', + 'berpuing-puing': 'puing', + 'berpuisi': 'puisi', + 'pemuisian': 'puisi', + 'memuisikan': 'puisi', + 'kepujanggaan': 'pujangga', + 'memujuk': 'pujuk', + 'memujuknya': 'pujuk', + 'terpujuk': 'pujuk', + 'memujut': 'pujut', + 'memukal': 'pukal', + 'sepukal': 'pukal', + 'memukang-mukang': 'pukang', + 'berpukas': 'pukas', + 'berpukas-pukas': 'pukas', + 'pengepul': 'pul', + 'pengepulnya': 'pul', + 'pengepulkan': 'pul', + 'puluhan': 'puluh', + 'puluhannya': 'puluh', + 'puluhanlah': 'puluh', + 'puluhanan': 'puluh', + 'sepuluh': 'puluh', + 'sepuluhnya': 'puluh', + 'sepuluhan': 'puluh', + 'perpuluhan': 'puluh', + 'persepuluhan': 'puluh', + 'berpuluh-puluh': 'puluh', + 'memulun-mulun': 'pulun', + 'berpulun-pulun': 'pulun', + 'pemulung': 'pulung', + 'pemulungnya': 'pulung', + 'pemulungan': 'pulung', + 'memulung': 'pulung', + 'memulungnya': 'pulung', + 'memulungi': 'pulung', + 'memulut': 'pulut', + 'terpulut': 'pulut', + 'pulut-pulut': 'pulut', + 'memumpun': 'pumpun', + 'memumpuni': 'pumpun', + 'pumpunan': 'pumpun', + 'terpumpun': 'pumpun', + 'berpumpun': 'pumpun', + 'pundi-pundi': 'pundi', + 'pundi-pundinya': 'pundi', + 'memundi-mundi': 'pundi', + 'memundi-mundikan': 'pundi', + 'memunggal': 'punggal', + 'memunggung': 'punggung', + 'memunggungi': 'punggung', + 'memunggungkan': 'punggung', + 'punggung-memunggung': 'punggung', + 'memungkang': 'pungkang', + 'pungkasan': 'pungkas', + 'pemungkas': 'pungkas', + 'pemungkasnya': 'pungkas', + 'memungkasi': 'pungkas', + 'pemungkur': 'pungkur', + 'memungli': 'pungli', + 'sepunguk': 'punguk', + 'punjungan': 'punjung', + 'memunjungi': 'punjung', + 'memunjut': 'punjut', + 'puntalan': 'puntal', + 'memuntal': 'puntal', + 'pemuntal': 'puntal', + 'pemuntalan': 'puntal', + 'berpuntal-puntal': 'puntalan', + 'puntiran': 'puntir', + 'memuntir': 'puntir', + 'memuntirnya': 'puntir', + 'memuntung': 'puntung', + 'memuntungkan': 'puntung', + 'berpunuk': 'punuk', + 'sepupu': 'pupu', + 'sepupunya': 'pupu', + 'sepupuan': 'pupu', + 'sepupuku': 'pupu', + 'sepupumu': 'pupu', + 'memupuh': 'pupuh', + 'berpupuh': 'pupuh', + 'memperpupuhkan': 'pupuh', + 'pupuk hijau': 'memupuk', + 'memupur': 'pupur', + 'memupuri': 'pupur', + 'berpupur': 'pupur', + 'memupurkan': 'pupur', + 'puputan': 'puput', + 'memuput': 'puput', + 'berpuput': 'puput', + 'berpura-pura': 'pura-pura', + 'berpura-puralah': 'pura-pura', + 'kepura-puraan': 'pura-pura', + 'kepurbaan': 'purba', + 'kepurbakalaan': 'purbakala', + 'berpuru': 'puru', + 'berpuruan': 'puru', + 'terpuruk': 'puruk', + 'terpuruknya': 'puruk', + 'terpuruklah': 'puruk', + 'terpurukan': 'puruk', + 'memurukkan': 'puruk', + 'seterpuruk': 'puruk', + 'memusakai': 'pusaka', + 'berpusaka': 'pusaka', + 'memusakakan': 'pusaka', + 'memusar': 'pusar', + 'pusaran': 'pusar', + 'pusarannya': 'pusar', + 'berpusar': 'pusar', + 'berpusaran': 'pusar', + 'pusar-pusar': 'pusar', + 'berpusar-pusar': 'pusar', + 'sepusat': 'pusat', + 'berpusat': 'pusat', + 'berpusatnya': 'pusat', + 'berpusatkan': 'pusat', + 'pemusatan': 'pusat', + 'pemusatanan': 'pusat', + 'memusatkan': 'pusat', + 'memusatkannya': 'pusat', + 'memusokan': 'puso', + 'berpusu': 'pusu', + 'berpusu-pusu': 'pusu', + 'memusut': 'pusut', + 'memusutkan': 'pusut', + 'berputar lidah': 'putar lidah', + 'puteran': 'puter', + 'memuter': 'puter', + 'berputih mata': 'putih mata', + 'berputih tulang': 'putih tulang', + 'berputik': 'putik', + 'berputra': 'putra', + 'keputraan': 'putra', + 'memutrakan': 'putra', + 'berputrakan': 'putra', + 'berpuyan': 'puyan', + 'memuyengkan': 'puyeng', + 'memuyu-muyu': 'puyu', + 'berqalam': 'qalam', + 'mengqasar': 'qasar', + 'rabaan': 'raba', + 'meraba': 'raba', + 'merabanya': 'raba', + 'merabai': 'raba', + 'peraba': 'raba', + 'perabanya': 'raba', + 'perabaan': 'raba', + 'teraba': 'raba', + 'terabanya': 'raba', + 'perabaannya': 'raba', + 'meraba-raba': 'raba', + 'meraba-rabanya': 'raba', + 'meraba-rabakan': 'raba', + 'meraba-rabaku': 'raba', + 'teraba-raba': 'raba', + 'raba-rabaan': 'raba', + 'merabak': 'rabak', + 'terabak': 'rabak', + 'merabas': 'rabas', + 'merabat': 'rabat', + 'merabet': 'rabet', + 'merabit': 'rabit', + 'merabuk': 'rabuk', + 'merabuki': 'rabuk', + 'perabun': 'rabun', + 'merabuni': 'rabun', + 'kerabunan': 'rabun', + 'merabunkan': 'rabun', + 'berabun-rabun': 'rabun', + 'perabung': 'rabung', + 'merabung': 'rabung', + 'perabungan': 'rabung', + 'merabut': 'rabut', + 'meracak': 'racak', + 'seracik': 'racik', + 'meracik': 'racik', + 'meraciknya': 'racik', + 'meracikkan': 'racik', + 'racikan': 'racik', + 'racikannya': 'racik', + 'peracikan': 'racik', + 'peracikannya': 'racik', + 'meracuh': 'racuh', + 'rada-rada': 'rada', + 'rada-radanya': 'rada', + 'meradah': 'radah', + 'meradai': 'radai', + 'meradak': 'radak', + 'meradakan': 'radak', + 'beradak': 'radak', + 'meradakkan': 'radak', + 'meradikalkan': 'radikal', + 'meradiokan': 'radio', + 'meradukan': 'radu', + 'meragang': 'ragang', + 'ragangan': 'ragang', + 'meragas': 'ragas', + 'meraguk': 'raguk', + 'teragung': 'ragung', + 'merahap': 'rahap', + 'perahap': 'rahap', + 'merahapkan': 'rahap', + 'berahasia': 'rahasia', + 'berahasiakan': 'rahasia', + 'kerahasiaan': 'rahasia', + 'kerahasiaannya': 'rahasia', + 'merahasiakan': 'rahasia', + 'merahasiakannya': 'rahasia', + 'rahasia-rahasiaan': 'rahasia', + 'merahimi': 'rahim', + 'kerahiman': 'rahim', + 'kerahimannya': 'rahim', + 'merais': 'rais', + 'merajah': 'rajah', + 'merajahi': 'rajah', + 'merajalela': 'rajalela', + 'merajalelanya': 'rajalela', + 'rajaman': 'rajam', + 'merajam': 'rajam', + 'terajam': 'rajam', + 'merajang': 'rajang', + 'rajangan': 'rajang', + 'merajuk': 'rajuk', + 'merajuknya': 'rajuk', + 'perajuk': 'rajuk', + 'merajuki': 'rajuk', + 'merakah': 'rakah', + 'merakap': 'rakap', + 'merakat': 'rakat', + 'serakit': 'rakit', + 'merakit': 'rakit', + 'merakitnya': 'rakit', + 'berakit': 'rakit', + 'berakitan': 'rakit', + 'rakitan': 'rakit', + 'rakitannya': 'rakit', + 'perakit': 'rakit', + 'perakitnya': 'rakit', + 'perakitan': 'rakit', + 'perakitannya': 'rakit', + 'berakit-rakit': 'rakit', + 'meraksasa': 'raksasa', + 'meraksasanya': 'raksasa', + 'peraksi': 'raksi', + 'meraksi': 'raksi', + 'meraksikan': 'raksi', + 'berakuk': 'rakuk', + 'rakungan': 'rakung', + 'merakut': 'rakut', + 'merakyat': 'rakyat', + 'merakyatnya': 'rakyat', + 'merakyatlah': 'rakyat', + 'merakyatkan': 'rakyat', + 'perakyatan': 'rakyat', + 'kerakyatan': 'rakyat', + 'kerakyatannya': 'rakyat', + 'meralat': 'ralat', + 'meralatnya': 'ralat', + 'meralip': 'ralip', + 'beramah-tamah': 'ramah tamah', + 'keramahtamahan': 'ramah tamah', + 'keramahtamahannya': 'ramah tamah', + 'keramahtamahanan': 'ramah tamah', + 'teramai': 'ramai', + 'keramaian': 'ramai', + 'keramaiannya': 'ramai', + 'keramaianan': 'ramai', + 'meramaikan': 'ramai', + 'meramaikannya': 'ramai', + 'beramai-ramai': 'ramai', + 'berambai': 'rambai', + 'merambak': 'rambak', + 'merambakkan': 'rambak', + 'rambak tiongkok': 'rambak', + 'meramban': 'ramban', + 'rambanan': 'ramban', + 'merambang': 'rambang', + 'merambang-rambang': 'rambang', + 'merambeh': 'rambeh', + 'rambeh-rambeh': 'rambeh', + 'meraminkan': 'ramin', + 'merampai': 'rampai', + 'rampaian': 'rampai', + 'merampaikan': 'rampai', + 'merampak': 'rampak', + 'perampang': 'rampang', + 'rampatan': 'rampat', + 'merampat': 'rampat', + 'perampatan': 'rampat', + 'kerampatan': 'rampat', + 'merampatkan': 'rampat', + 'meramping': 'ramping', + 'merampingnya': 'ramping', + 'merampingkan': 'ramping', + 'merampingkannya': 'ramping', + 'merampok': 'rampok', + 'merampoknya': 'rampok', + 'merampokan': 'rampok', + 'perampok': 'rampok', + 'perampoknya': 'rampok', + 'perampokkan': 'rampok', + 'perampokan': 'rampok', + 'perampokannya': 'rampok', + 'perampungan': 'rampung', + 'perampungannya': 'rampung', + 'merampungkan': 'rampung', + 'merampungkannya': 'rampung', + 'berampus': 'rampus', + 'merampus': 'rampus', + 'meramu': 'ramu', + 'meramunya': 'ramu', + 'peramu': 'ramu', + 'peramunya': 'ramu', + 'peramuan': 'ramu', + 'ramuan': 'ramu', + 'ramuannya': 'ramu', + 'reramuan': 'ramu', + 'ramu-ramuan': 'ramu', + 'meramus': 'ramus', + 'beramus': 'ramus', + 'meranap': 'ranap', + 'meranca': 'ranca', + 'merancakan': 'rancak', + 'serancak': 'rancak', + 'rancakan': 'rancak', + 'merancak': 'rancak', + 'kerancakan': 'rancak', + 'kerancak-rancakan': 'rancak', + 'rancaman': 'rancam', + 'perancang': 'rancang', + 'perancangnya': 'rancang', + 'perancangan': 'rancang', + 'berancang': 'rancang', + 'rancangan': 'rancang', + 'rancangannya': 'rancang', + 'rancanganan': 'rancang', + 'rancanganku': 'rancang', + 'merancang': 'rancang', + 'merancangnya': 'rancang', + 'merancangkan': 'rancang', + 'merancangkannya': 'rancang', + 'merancangan': 'rancang', + 'perancangannya': 'rancang', + 'kerancuan': 'rancu', + 'kerancuannya': 'rancu', + 'merancukan': 'rancu', + 'merancung': 'rancung', + 'perancung': 'rancung', + 'perancungan': 'rancung', + 'meranda': 'randa', + 'merandai': 'randai', + 'berandai-randai': 'randai', + 'merandak': 'randak', + 'merandat': 'randat', + 'merandatkan': 'randat', + 'merandau': 'randau', + 'merandek': 'randek', + 'merandungkan': 'randung', + 'merangah': 'rangah', + 'merangai': 'rangai', + 'merangak': 'rangak', + 'meranggah': 'ranggah', + 'meranggakkan': 'ranggak', + 'meranggikan': 'ranggi', + 'meranggitkan': 'ranggit', + 'meranggul': 'ranggul', + 'meranggung': 'ranggung', + 'berangkaian': 'rangkai', + 'serangkai': 'rangkai', + 'serangkaian': 'rangkai', + 'perangkai': 'rangkai', + 'perangkainya': 'rangkai', + 'perangkaian': 'rangkai', + 'merangkai': 'rangkai', + 'merangkainya': 'rangkai', + 'merangkaikan': 'rangkai', + 'merangkaikannya': 'rangkai', + 'rangkaian': 'rangkai', + 'rangkaiannya': 'rangkai', + 'menyerangkaikan': 'rangkai', + 'berangkai-rangkai': 'rangkai', + 'merangkam': 'rangkam', + 'merangkang': 'rangkang', + 'merangket': 'rangket', + 'merangkit': 'rangkit', + 'merangkung': 'rangkung', + 'rangkungan': 'rangkung', + 'merangkus': 'rangkus', + 'merangkut': 'rangkut', + 'merangum': 'rangum', + 'seranjang': 'ranjang', + 'seranjangnya': 'ranjang', + 'berseranjang': 'ranjang', + 'meranjangkan': 'ranjang', + 'keranjingan': 'ranjing', + 'keranjingannya': 'ranjing', + 'meransum': 'ransum', + 'berantam': 'rantam', + 'berantamlah': 'rantam', + 'merantas': 'rantas', + 'perantau': 'rantau', + 'perantauan': 'rantau', + 'merantau': 'rantau', + 'merantaunya': 'rantau', + 'merantaulah': 'rantau', + 'serantau': 'rantau', + 'perantauannya': 'rantau', + 'perantauanmu': 'rantau', + 'meranting': 'ranting', + 'beranting': 'ranting', + 'merantuk': 'rantuk', + 'merantukkan': 'rantuk', + 'meranyah': 'ranyah', + 'meranyau': 'ranyau', + 'meranyun': 'ranyun', + 'merapah': 'rapah', + 'merapai': 'rapai', + 'merapal': 'rapal', + 'merapalkan': 'rapal', + 'merapik': 'rapik', + 'merapikkan': 'rapik', + 'raporan': 'rapor', + 'meraporkan': 'rapor', + 'merapu': 'rapu', + 'merapukan': 'rapu', + 'perapuh': 'rapuh', + 'perapuhan': 'rapuh', + 'kerapuhan': 'rapuh', + 'kerapuhannya': 'rapuh', + 'merapuhkan': 'rapuh', + 'berapun': 'rapun', + 'merapun': 'rapun', + 'merapung': 'rapung', + 'merapungkan': 'rapung', + 'merapus': 'rapus', + 'merarai': 'rarai', + 'perarai': 'rarai', + 'merarasi': 'raras', + 'serasam': 'rasam', + 'berasan': 'rasan', + 'merasani': 'rasan', + 'perasanan': 'rasan', + 'perasanannya': 'rasan', + 'merasi': 'rasi', + 'merasikan': 'rasi', + 'berasian': 'rasian', + 'merasiankan': 'rasian', + 'berasio': 'rasio', + 'kerasionalan': 'rasional', + 'merasionalkan': 'rasional', + 'merasionalisasi': 'rasionalisasi', + 'merasionalisasikan': 'rasionalisasi', + 'merasionalisasikannya': 'rasionalisasi', + 'kerasulan': 'rasul', + 'kerasulannya': 'rasul', + 'meratah': 'ratah', + 'meratib': 'ratib', + 'meratibkan': 'ratib', + 'meratifikasi': 'ratifikasi', + 'meratifikasinya': 'ratifikasi', + 'meraum': 'raum', + 'meraun': 'raun', + 'raun-raun': 'raun', + 'rautan': 'raut', + 'meraut': 'raut', + 'berawa': 'rawa', + 'berawa-rawa': 'rawa', + 'merawai': 'rawai', + 'merawaikan': 'rawai', + 'merawak': 'rawak', + 'serawan': 'rawan', + 'merawan': 'rawan', + 'kerawanan': 'rawan', + 'kerawanannya': 'rawan', + 'kerawananan': 'rawan', + 'merawankan': 'rawan', + 'merawang': 'rawang', + 'perawi': 'rawi', + 'perawinya': 'rawi', + 'merawi': 'rawi', + 'merawikan': 'rawi', + 'merawit': 'rawit', + 'kerawitan': 'rawit', + 'pengrawit': 'rawit', + 'rayahan': 'rayah', + 'merayah': 'rayah', + 'merayahi': 'rayah', + 'merayang': 'rayang', + 'merayap': 'rayap', + 'merayapnya': 'rayap', + 'merayapi': 'rayap', + 'rayapan': 'rayap', + 'terayap-rayap': 'rayap', + 'perayonan': 'rayon', + 'merealisasi': 'realisasi', + 'merealisasikan': 'realisasi', + 'merealisasikannya': 'realisasi', + 'merealisasian': 'realisasi', + 'berebab': 'rebab', + 'merebankan': 'reban', + 'berebana': 'rebana', + 'rebas-rebas': 'rebas', + 'merebat': 'rebat', + 'merebeh': 'rebeh', + 'rebekan': 'rebek', + 'berebesan': 'rebes', + 'merebuk': 'rebuk', + 'merebung': 'rebung', + 'merecak': 'recak', + 'recehan': 'receh', + 'recehannya': 'receh', + 'perecik': 'recik', + 'merecik': 'recik', + 'recikan': 'recik', + 'merecikkan': 'recik', + 'perecok': 'recok', + 'merecok': 'recok', + 'merecokkan': 'recok', + 'merecoki': 'recok', + 'merecokinya': 'recok', + 'kerecokan': 'recok', + 'merecup': 'recup', + 'meredah': 'redah', + 'meredahkan': 'redah', + 'meredih': 'redih', + 'peredih': 'redih', + 'meredik': 'redik', + 'mereduksi': 'reduksi', + 'mereduksinya': 'reduksi', + 'meredup': 'redup', + 'meredupnya': 'redup', + 'meredupkan': 'redup', + 'meredupkannya': 'redup', + 'keredupan': 'redup', + 'redep-redup': 'redup', + 'meredusir': 'redusir', + 'meredut': 'redut', + 'mereekspor': 'reekspor', + 'merefleksikan': 'refleksi', + 'merefleksikannya': 'refleksi', + 'terefleksikan': 'refleksi', + 'berefraksi': 'refraksi', + 'meregah': 'regah', + 'meregang': 'regang', + 'meregangnya': 'regang', + 'meregangkan': 'regang', + 'meregangkannya': 'regang', + 'regangan': 'regang', + 'regangannya': 'regang', + 'peregangan': 'regang', + 'peregangannya': 'regang', + 'berseregang': 'seregang', + 'beregang-regang': 'regang', + 'meregas': 'regas', + 'meregat': 'regat', + 'keregenan': 'regen', + 'sereguk': 'reguk', + 'mereguk': 'reguk', + 'mereguknya': 'reguk', + 'meregukan': 'reguk', + 'meregup': 'regup', + 'merehab': 'rehab', + 'merehabnya': 'rehab', + 'merehabilitasi': 'rehabilitasi', + 'merehabilitasinya': 'rehabilitasi', + 'merehabilitasikan': 'rehabilitasi', + 'reja-reja': 'reja', + 'merejah': 'rejah', + 'perejah': 'rejah', + 'merejahkan': 'rejah', + 'merejan': 'rejan', + 'merejang': 'rejang', + 'perejang': 'rejang', + 'serejang': 'rejang', + 'merejeng': 'rejeng', + 'merejuk': 'rejuk', + 'mereka cipta': 'reka cipta', + 'perekam': 'rekam', + 'perekamnya': 'rekam', + 'perekaman': 'rekam', + 'rekaman': 'rekam', + 'rekamannya': 'rekam', + 'rekamanlah': 'rekam', + 'rekamanan': 'rekam', + 'rekamanku': 'rekam', + 'merekam': 'rekam', + 'merekamnya': 'rekam', + 'merekamlah': 'rekam', + 'merekamkan': 'rekam', + 'merekaman': 'rekam', + 'merekammu': 'rekam', + 'perekamannya': 'rekam', + 'perekamanan': 'rekam', + 'merekan': 'rekan', + 'berekan': 'rekan', + 'berekanan': 'rekan', + 'rekanan': 'rekan', + 'rekanannya': 'rekan', + 'rekananan': 'rekan', + 'perekayasa': 'rekayasa', + 'perekayasaan': 'rekayasa', + 'merekayasa': 'rekayasa', + 'merekayasanya': 'rekayasa', + 'rekenan': 'reken', + 'mereken': 'reken', + 'merekes': 'rekes', + 'mereklamasikan': 'reklamasi', + 'merekomendasi': 'rekomendasi', + 'merekomendasinya': 'rekomendasi', + 'merekomendasikan': 'rekomendasi', + 'merekomendasikannya': 'rekomendasi', + 'merekonstruksi': 'rekonstruksi', + 'merekonstruksinya': 'rekonstruksi', + 'merekonstruksikan': 'rekonstruksi', + 'berekreasi': 'rekreasi', + 'merekrut': 'rekrut', + 'merekrutnya': 'rekrut', + 'merekruti': 'rekrut', + 'merekrutku': 'rekrut', + 'merekrutmu': 'rekrut', + 'perekrutan': 'rekrut', + 'perekrutannya': 'rekrut', + 'merelang': 'relang', + 'merelas': 'relas', + 'merelevansi': 'relevansi', + 'merelevansikan': 'relevansi', + 'pereli': 'reli', + 'merelokasi': 'relokasi', + 'merelokasinya': 'relokasi', + 'merelokasikan': 'relokasi', + 'merelokasikannya': 'relokasi', + 'bereluk': 'reluk', + 'merelung': 'relung', + 'mengerem': 'rem', + 'mengeremnya': 'rem', + 'keremahan': 'remah', + 'meremahkan': 'remah', + 'remah-remah': 'remah', + 'remah-remahnya': 'remah', + 'remah-remahan': 'remah', + 'meremah-remah': 'remah', + 'peremajaan': 'remaja', + 'peremajaannya': 'remaja', + 'meremajakan': 'remaja', + 'meremajakannya': 'remaja', + 'meremas': 'remas', + 'meremasnya': 'remas', + 'meremas-remas': 'remas', + 'meremas-remasnya': 'remas', + 'merembah': 'rembah', + 'rembah-rembah': 'rembah', + 'rembah-rembih': 'rembah', + 'merembet': 'rembet', + 'merembetnya': 'rembet', + 'merembetkan': 'rembet', + 'merembih': 'rembih', + 'berembuk': 'rembuk', + 'berembuklah': 'rembuk', + 'rembukan': 'rembuk', + 'perembukan': 'rembuk', + 'merembukkan': 'rembuk', + 'merembukkannya': 'rembuk', + 'memperembukkan': 'rembuk', + 'berembut-rembut': 'rembut', + 'terembut-rembut': 'rembut', + 'meremet': 'remet', + 'merempa': 'rempa', + 'merempah': 'rempah', + 'merempahi': 'rempah', + 'rempah-rempah': 'rempah', + 'rempah-rempahnya': 'rempah', + 'rempah-rempahan': 'rempah', + 'merempah-rempah': 'rempah', + 'merempah-rempahi': 'rempah', + 'serempak': 'rempak', + 'serempaknya': 'rempak', + 'berempak': 'rempak', + 'menyerempak': 'serempak', + 'menyerempakkan': 'serempak', + 'peremuk': 'remuk', + 'peremukan': 'remuk', + 'meremukkan': 'remuk', + 'meremukkannya': 'remuk', + 'terencah': 'rencah', + 'merencah': 'rencah', + 'perencah': 'rencah', + 'merencam': 'rencam', + 'terencat': 'rencat', + 'berenceng': 'renceng', + 'serenceng': 'renceng', + 'rencengan': 'renceng', + 'merendang': 'rendang', + 'perendangan': 'rendang', + 'berendeng': 'rendeng', + 'merendengkan': 'rendeng', + 'terendong': 'rendong', + 'merenek': 'renek', + 'merengap': 'rengap', + 'merengas': 'rengas', + 'merengat': 'rengat', + 'merengatkan': 'rengat', + 'merengeh': 'rengeh', + 'merengeng-rengeng': 'rengeng', + 'merengkah': 'rengkah', + 'perengkahan': 'rengkah', + 'merengkeh': 'rengkeh', + 'merengket': 'rengket', + 'merengkuh': 'rengkuh', + 'merengkuhnya': 'rengkuh', + 'merengsa': 'rengsa', + 'berengsaan': 'rengsa', + 'perengut': 'rengut', + 'merengut': 'rengut', + 'merengutkan': 'rengut', + 'merenik-renik': 'renik', + 'merenjeng': 'renjeng', + 'merenjis': 'renjis', + 'merenjiskan': 'renjis', + 'merenovasi': 'renovasi', + 'merenovasinya': 'renovasi', + 'merenta-renta': 'renta', + 'merentak': 'rentak', + 'merentakan': 'rentak', + 'terentak': 'rentak', + 'serentak': 'rentak', + 'serentaknya': 'rentak', + 'menyerentakkan': 'rentak', + 'merentan': 'rentan', + 'merentankan': 'rentan', + 'kerentanan': 'rentan', + 'kerentanannya': 'rentan', + 'kerentananan': 'rentan', + 'merentap': 'rentap', + 'merentapkan': 'rentap', + 'merentas': 'rentas', + 'rentengan': 'renteng', + 'serenteng': 'renteng', + 'serentengan': 'renteng', + 'merenteng': 'renteng', + 'berenteng-renteng': 'renteng', + 'berentet': 'rentet', + 'berentetan': 'rentet', + 'rentetan': 'rentet', + 'rentetannya': 'rentet', + 'merentikan': 'renti', + 'merentik': 'rentik', + 'berenyah': 'renyah', + 'merenyah': 'renyah', + 'merenyahnya': 'renyah', + 'kerenyahan': 'renyah', + 'kerenyahannya': 'renyah', + 'renyai-renyai': 'renyai', + 'merenyai-renyai': 'renyai', + 'merenyeh': 'renyeh', + 'merenyuk': 'renyuk', + 'serenyuk': 'renyuk', + 'merenyukkan': 'renyuk', + 'merenyut': 'renyut', + 'merepang': 'repang', + 'mereparasi': 'reparasi', + 'mereparasinya': 'reparasi', + 'terepas': 'repas', + 'keterepasan': 'repas', + 'merepatriasi': 'repatriasi', + 'merepatriasikan': 'repatriasi', + 'merepet': 'repet', + 'perepet': 'repet', + 'repihan': 'repih', + 'serepih': 'repih', + 'mereportasekan': 'reportase', + 'kerepotan': 'repot', + 'kerepotannya': 'repot', + 'kerepotanlah': 'repot', + 'merepotkan': 'repot', + 'merepotkannya': 'repot', + 'merepotkanmu': 'repot', + 'repot-repot': 'repot', + 'repot-repotlah': 'repot', + 'mereproduksi': 'reproduksi', + 'mereproduksinya': 'reproduksi', + 'repuh-repuh': 'repuh', + 'mererak': 'rerak', + 'bererakan': 'rerak', + 'rerotan': 'rerot', + 'mererot': 'rerot', + 'seresam': 'resam', + 'meresan': 'resan', + 'meresek-resek': 'resek', + 'meresepkan': 'resep', + 'meresepkannya': 'resep', + 'keresidenan': 'residen', + 'meresik': 'resik', + 'keresikan': 'resik', + 'peresmian': 'resmi', + 'peresmiannya': 'resmi', + 'keresmian': 'resmi', + 'keresmiannya': 'resmi', + 'meresmikan': 'resmi', + 'meresmikannya': 'resmi', + 'meresosialisasi': 'resosialisasi', + 'merespons': 'respons', + 'meresponsnya': 'respons', + 'meresponslah': 'respons', + 'meresponsi': 'respons', + 'meresponsmu': 'respons', + 'merestorasi': 'restorasi', + 'merestorasinya': 'restorasi', + 'merestrukturisasi': 'restrukturisasi', + 'merestrukturisasinya': 'restrukturisasi', + 'merestrukturisasikan': 'restrukturisasi', + 'meresumekan': 'resume', + 'peretas': 'retas', + 'peretasnya': 'retas', + 'peretaslah': 'retas', + 'peretasan': 'retas', + 'meretas': 'retas', + 'meretasnya': 'retas', + 'meretaskan': 'retas', + 'peretasannya': 'retas', + 'meretek': 'retek', + 'meretih': 'retih', + 'meretur': 'retur', + 'merevisi': 'revisi', + 'merevisinya': 'revisi', + 'merewak': 'rewak', + 'merewaknya': 'rewak', + 'kerewelan': 'rewel', + 'kerewelannya': 'rewel', + 'merewet': 'rewet', + 'keriaan': 'ria', + 'keriaannya': 'ria', + 'beria-ria': 'ria', + 'beriak': 'riak', + 'beriak-riak': 'riak', + 'meriap': 'riap', + 'meriapkan': 'riap', + 'ribaan': 'riba', + 'meriba': 'riba', + 'rica-rica': 'rica', + 'mericau': 'ricau', + 'mericik': 'ricik', + 'kericuhan': 'ricuh', + 'kericuhannya': 'ricuh', + 'meridai': 'rida', + 'berigi-rigi': 'rigi-rigi', + 'berihat': 'rihat', + 'merikuhkan': 'rikuh', + 'merilis': 'rilis', + 'merilisnya': 'rilis', + 'meriliskan': 'rilis', + 'merilisi': 'rilis', + 'berima': 'rima', + 'merimaskan': 'rimas', + 'perimba': 'rimba', + 'perimbakan': 'rimba', + 'merimba': 'rimba', + 'merimbas': 'rimbas', + 'merimbun': 'rimbun', + 'merimbunkan': 'rimbun', + 'merimbuni': 'rimbun', + 'kerimbunan': 'rimbun', + 'kerimbunannya': 'rimbun', + 'serimis': 'rimis', + 'merimpuhkan': 'rimpuh', + 'merimpung': 'rimpung', + 'merinai': 'rinai', + 'berinaian': 'rinai', + 'merinaikan': 'rinai', + 'rinai-rinai': 'rinai', + 'perincis': 'rincis', + 'rincisan': 'rincis', + 'merincis': 'rincis', + 'perincisan': 'rincis', + 'merincukan': 'rincu', + 'perindang': 'rindang', + 'perindangan': 'rindang', + 'merindang': 'rindang', + 'merindangkan': 'rindang', + 'merindangi': 'rindang', + 'merinding': 'rinding', + 'merindingnya': 'rinding', + 'merindingkan': 'rinding', + 'perindu': 'rindu', + 'perindukan': 'rindu', + 'merindu': 'rindu', + 'merindukan': 'rindu', + 'merindukannya': 'rindu', + 'merindui': 'rindu', + 'rinduan': 'rindu', + 'kerinduan': 'rindu', + 'kerinduannya': 'rindu', + 'kerinduanku': 'rindu', + 'kerinduanmu': 'rindu', + 'merindukanku': 'rindu', + 'merindukanmu': 'rindu', + 'meringgiti': 'ringgit', + 'beringgit-ringgit': 'ringgit', + 'meringih': 'ringih', + 'meringik': 'ringik', + 'meringis': 'ringis', + 'meringkai': 'ringkai', + 'meringkaikan': 'ringkai', + 'ringkasan': 'ringkas', + 'ringkasannya': 'ringkas', + 'meringkaskan': 'ringkas', + 'meringking': 'ringking', + 'meringkuk': 'ringkuk', + 'meringkuknya': 'ringkuk', + 'meringkuklah': 'ringkuk', + 'ringkukan': 'ringkuk', + 'meringkukkan': 'ringkuk', + 'dalam ringkuk': 'ringkuk', + 'meringkus': 'ringkus', + 'meringkusnya': 'ringkus', + 'meringsing': 'ringsing', + 'merintas': 'rintas', + 'berintik-rintik': 'rintik', + 'merintik-rintik': 'rintik-rintik', + 'merisak': 'risak', + 'merisaknya': 'risak', + 'periset': 'riset', + 'perisetnya': 'riset', + 'meriset': 'riset', + 'merisetnya': 'riset', + 'merisik': 'risik', + 'risikan': 'risik', + 'merisikkan': 'risik', + 'meritul': 'ritul', + 'meriung': 'riung', + 'riungan': 'riung', + 'beriwayat': 'riwayat', + 'keriwayatan': 'riwayat', + 'meriwayatkan': 'riwayat', + 'robekan': 'robek', + 'robekannya': 'robek', + 'merobek': 'robek', + 'merobeknya': 'robek', + 'merobekkan': 'robek', + 'merobeki': 'robek', + 'merobekan': 'robek', + 'perobek': 'robek', + 'perobekan': 'robek', + 'merobek-robek': 'robek', + 'merobek-robeknya': 'robek', + 'merobok': 'robok', + 'bersirobok': 'robok', + 'merobot': 'robot', + 'perobotan': 'robot', + 'beroda': 'roda', + 'berodanya': 'roda', + 'berodi': 'rodi', + 'merodong': 'rodong', + 'merodongkan': 'rodong', + 'merogoh': 'rogoh', + 'merogohnya': 'rogoh', + 'merogohkan': 'rogoh', + 'merogok': 'rogok', + 'merogol': 'rogol', + 'merogolnya': 'rogol', + 'kerohanian': 'rohani', + 'kerohaniannya': 'rohani', + 'rojengan': 'rojeng', + 'merojeng': 'rojeng', + 'merojol': 'rojol', + 'meroket': 'roket', + 'meroketnya': 'roket', + 'meroketkan': 'roket', + 'meroketi': 'roket', + 'peroketan': 'roket', + 'seroma': 'roma', + 'keromantisan': 'romantis', + 'keromantisannya': 'romantis', + 'meromantisisme': 'romantisisme', + 'merombak': 'rombak', + 'merombaknya': 'rombak', + 'merombakan': 'rombak', + 'perombakan': 'rombak', + 'perombakannya': 'rombak', + 'perombakanan': 'rombak', + 'rombengan': 'rombeng', + 'merombengkan': 'rombeng', + 'merombong': 'rombong', + 'rombongan': 'rombong', + 'rombongannya': 'rombong', + 'rombongani': 'rombong', + 'meromet': 'romet', + 'meromok': 'romok', + 'rompang-romping': 'rompang', + 'merompongkan': 'rompong', + 'meromusakan': 'romusa', + 'berona': 'rona', + 'perona': 'rona', + 'teronce': 'ronce', + 'meronce': 'ronce', + 'peroncean': 'ronce', + 'beroncet-roncet': 'roncet', + 'merondok': 'rondok', + 'berondok': 'rondok', + 'merondokkan': 'rondok', + 'meroneo': 'roneo', + 'merongga': 'rongga', + 'berongga': 'rongga', + 'meronggeng': 'ronggeng', + 'keronggengan': 'ronggeng', + 'meronggong': 'ronggong', + 'merongkok': 'rongkok', + 'berongkol': 'rongkol', + 'serongkol': 'rongkol', + 'merongos': 'rongos', + 'rongkong': 'rongos', + 'perongos': 'rongos', + 'perongrong': 'rongrong', + 'perongrongan': 'rongrong', + 'merongrong': 'rongrong', + 'merongrongnya': 'rongrong', + 'merongseng': 'rongseng', + 'rongsokan': 'rongsok', + 'rongsokannya': 'rongsok', + 'meronta': 'ronta', + 'meronta-ronta': 'ronta', + 'merontgen': 'rontgen', + 'kerontokan': 'rontok', + 'kerontokannya': 'rontok', + 'merontokkan': 'rontok', + 'merontokkannya': 'rontok', + 'meronyeh': 'ronyeh', + 'meronyok': 'ronyok', + 'merorod': 'rorod', + 'merosok': 'rosok', + 'rosokan': 'rosok', + 'merosokkan': 'rosok', + 'berotasi': 'rotasi', + 'merotok': 'rotok', + 'merowot': 'rowot', + 'meroyak': 'royak', + 'keroyalan': 'royal', + 'beroyal-royal': 'royal', + 'royal-royalan': 'royal', + 'meroyan': 'royan', + 'meroyer': 'royer', + 'merua': 'rua', + 'meruanya': 'rua', + 'meruakan': 'ruak', + 'seruah': 'ruah', + 'meruah': 'ruah', + 'meruahnya': 'ruah', + 'seperuah': 'ruah', + 'meruahkan': 'ruah', + 'meruak': 'ruak', + 'meruaknya': 'ruak', + 'ruak-ruak': 'ruak', + 'meruang': 'ruang', + 'meruangkan': 'ruang', + 'ruangan': 'ruang', + 'ruangannya': 'ruang', + 'ruanganlah': 'ruang', + 'ruanganan': 'ruang', + 'ruanganku': 'ruang', + 'ruanganmu': 'ruang', + 'meruap': 'ruap', + 'meruapnya': 'ruap', + 'meruapkan': 'ruap', + 'meruapan': 'ruap', + 'meruap-ruap': 'ruap', + 'seruas': 'ruas', + 'peruasan': 'ruas', + 'beruas-ruas': 'ruas', + 'meruban': 'ruban', + 'merubu': 'rubu', + 'merubu-rubu': 'rubu', + 'merubung': 'rubung', + 'merubungi': 'rubung', + 'merudal': 'rudal', + 'merudalnya': 'rudal', + 'merudu': 'rudu', + 'meruing': 'ruing', + 'teruit': 'uit', + 'merujah': 'rujah', + 'ruji-ruji': 'ruji', + 'meruku': 'ruku', + 'reruku': 'ruku', + 'ruku-ruku': 'ruku', + 'merukuk': 'rukuk', + 'kerukunan': 'rukun', + 'kerukunannya': 'rukun', + 'kerukunanan': 'rukun', + 'merukunkan': 'rukun', + 'serumah': 'rumah', + 'serumahnya': 'rumah', + 'berumah': 'rumah', + 'berumahkan': 'rumah', + 'perumahan': 'rumah', + 'perumahannya': 'rumah', + 'perumahanlah': 'rumah', + 'perumahanan': 'rumah', + 'merumahkan': 'rumah', + 'merumahkannya': 'rumah', + 'memperumahkan': 'rumah', + 'rumah-rumahan': 'rumah', + 'rumah-rumahannya': 'rumah', + 'menyerumahkan': 'rumah', + 'merumahsakitkan': 'rumah sakit', + 'berumah tangga': 'rumah tangga', + 'kerumahtanggaan': 'rumah tangga', + 'kerumahtanggaannya': 'rumah tangga', + 'berumbai-rumbai': 'rumbai', + 'merumbu': 'rumbu', + 'rumitan': 'rumit', + 'kerumitan': 'rumit', + 'kerumitannya': 'rumit', + 'merumitkan': 'rumit', + 'merumitkannya': 'rumit', + 'merumpi': 'rumpi', + 'kerumpilan': 'rumpil', + 'merumponkan': 'rumpon', + 'berumpun': 'rumpun', + 'serumpun': 'rumpun', + 'serumpunnya': 'rumpun', + 'merumpun': 'rumpun', + 'berrumpun-rumpun': 'rumpun', + 'merumput': 'rumput', + 'merumputnya': 'rumput', + 'merumputkan': 'rumput', + 'merumputkannya': 'rumput', + 'merumputi': 'rumput', + 'rerumputan': 'rumput', + 'rerumputannya': 'rumput', + 'perumputan': 'rumput', + 'rumput-rumputan': 'rumput', + 'merumrum': 'rumrum', + 'merumuk': 'rumuk', + 'merumung': 'rumung', + 'runding-merunding': 'berunding', + 'rundukan': 'runduk', + 'merunduk': 'runduk', + 'merunduklah': 'runduk', + 'merundukkan': 'runduk', + 'merundukan': 'runduk', + 'merunggas': 'runggas', + 'berunggas-runggas': 'runggas', + 'rungguhan': 'rungguh', + 'merungguh': 'rungguh', + 'merungguhkan': 'rungguh', + 'merunggut': 'runggut', + 'merungkau': 'rungkau', + 'kerungkuhan': 'rungkuh', + 'merungkup': 'rungkup', + 'merungus': 'rungus', + 'merungus-rungus': 'rungus', + 'merunjam': 'runjam', + 'merunjang': 'runjang', + 'merunjau': 'runjau', + 'merunjung': 'runjung', + 'meruntas': 'runtas', + 'merunti': 'runti', + 'meruntih': 'runtih', + 'runtunan': 'runtun', + 'meruntun': 'runtun', + 'meruntunkan': 'runtun', + 'beruntun': 'untun', + 'beruntunnya': 'untun', + 'beruntun-runtun': 'runtun', + 'beruntutan': 'runtutan', + 'perunut': 'runut', + 'perunutan': 'runut', + 'runutan': 'runut', + 'runutannya': 'runut', + 'merunut': 'runut', + 'merunutnya': 'runut', + 'merunutkan': 'runut', + 'merunuti': 'runut', + 'merunyamkan': 'runyam', + 'merunyut': 'runyut', + 'meruok': 'ruok', + 'serupiah': 'rupiah', + 'merurut': 'rurut', + 'merusuh': 'rusuh', + 'merusuhkan': 'rusuh', + 'merusuhi': 'rusuh', + 'perusuh': 'rusuh', + 'perusuhnya': 'rusuh', + 'perusuhan': 'rusuh', + 'berusuh': 'rusuh', + 'berusuhan': 'rusuh', + 'kerusuhan': 'rusuh', + 'kerusuhannya': 'rusuh', + 'kerusuhanlah': 'rusuh', + 'kerusuhanan': 'rusuh', + 'memperusuh': 'rusuh', + 'merusuk': 'rusuk', + 'kerutinan': 'rutin', + 'merutinkan': 'rutin', + 'merutuk': 'rutuk', + 'merutuki': 'rutuk', + 'ruwatan': 'ruwat', + 'ruwatannya': 'ruwat', + 'meruwat': 'ruwat', + 'keruwetan': 'ruwet', + 'keruwetannya': 'ruwet', + 'meruwetkan': 'ruwet', + 'meruyak': 'ruyak', + 'meruyaknya': 'ruyak', + 'meruyupkan': 'ruyup', + 'sesaat': 'saat', + 'sesaatnya': 'saat', + 'menyaba': 'saba', + 'bersaba': 'saba', + 'menyabak': 'sabak', + 'saban-saban': 'saban', + 'bersabar': 'sabar', + 'bersabarnya': 'sabar', + 'bersabarlah': 'sabar', + 'penyabar': 'sabar', + 'penyabaran': 'sabar', + 'tersabar': 'sabar', + 'kesabaran': 'sabar', + 'kesabarannya': 'sabar', + 'kesabaranlah': 'sabar', + 'kesabaranku': 'sabar', + 'kesabaranmu': 'sabar', + 'menyabarkan': 'sabar', + 'mempersabar': 'sabar', + 'menyabat': 'sabat', + 'bersabda': 'sabda', + 'menyabdakan': 'sabda', + 'sabetan': 'sabet', + 'sabetannya': 'sabet', + 'penyabet': 'sabet', + 'penyabetan': 'sabet', + 'menyabet': 'sabet', + 'menyabetnya': 'sabet', + 'menyabetkan': 'sabet', + 'menyabetkannya': 'sabet', + 'tersabet': 'sabet', + 'sabitan': 'sabit', + 'penyabit': 'sabit', + 'menyabit': 'sabit', + 'penyabitan': 'sabit', + 'menyabitkan': 'sabit', + 'menyablon': 'sablon', + 'penyablon': 'sablon', + 'penyablonan': 'sablon', + 'sabotan': 'sabot', + 'penyabot': 'sabot', + 'penyabotan': 'sabot', + 'menyabot': 'sabot', + 'bersabuk': 'sabuk', + 'sabuk jingga': 'sabuk', + 'menyabun': 'sabun', + 'menyabuni': 'sabun', + 'bersabun': 'sabun', + 'menyabuninya': 'sabun', + 'penyabunan': 'sabun', + 'penyabunanan': 'sabun', + 'menyabunkan': 'sabun', + 'sabungan': 'sabung', + 'penyabung': 'sabung', + 'penyabungnya': 'sabung', + 'penyabungan': 'sabung', + 'menyabung': 'sabung', + 'tersabung': 'sabung', + 'bersabung': 'sabung', + 'persabungan': 'sabung', + 'menyabungkan': 'sabung', + 'sabung-menyabung': 'sabung', + 'tersabur': 'sabur', + 'menyabur': 'sabur', + 'menyaburkan': 'sabur', + 'kesadahan': 'sadah', + 'bersadai': 'sadai', + 'tersadai': 'sadai', + 'menyadaikan': 'sadai', + 'sadang sading': 'sadang', + 'sadapan': 'sadap', + 'sadapannya': 'sadap', + 'tersadap': 'sadap', + 'tersadapnya': 'sadap', + 'menyadap': 'sadap', + 'menyadapnya': 'sadap', + 'menyadapan': 'sadap', + 'penyadap': 'sadap', + 'penyadapnya': 'sadap', + 'penyadapan': 'sadap', + 'penyadapannya': 'sadap', + 'menyadau': 'sadau', + 'bersadau': 'sadau', + 'menyadikkan': 'sadik', + 'kesadisan': 'sadis', + 'kesadisannya': 'sadis', + 'bersado': 'sado', + 'sado masokis': 'sado', + 'menyadran': 'sadran', + 'saduran': 'sadur', + 'penyadur': 'sadur', + 'penyaduran': 'sadur', + 'menyadur': 'sadur', + 'menyadurnya': 'sadur', + 'bersaf-saf': 'saf', + 'bersafar': 'safar', + 'bersafari': 'safari', + 'menyagang': 'sagang', + 'tersagang': 'sagang', + 'menyagar': 'sagar', + 'bersagar': 'sagar', + 'sesagon': 'sagon', + 'menyagu': 'sagu', + 'kesahan': 'sah', + 'pengesahan': 'sah', + 'pengesahannya': 'sah', + 'mengesahkankan': 'sah', + 'bersahaja': 'sahaja', + 'bersahajanya': 'sahaja', + 'menyahaja': 'sahaja', + 'kesahajaan': 'sahaja', + 'kesahajaannya': 'sahaja', + 'menyahajakan': 'sahaja', + 'mempersahajakan': 'sahaja', + 'menyahap': 'sahap', + 'bersahap': 'sahap', + 'kesahihan': 'sahih', + 'kesahihannya': 'sahih', + 'penyahihan': 'sahih', + 'menyahihkan': 'sahih', + 'sesajen': 'sajen', + 'sajian': 'saji', + 'sajiannya': 'saji', + 'tersaji': 'saji', + 'tersajinya': 'saji', + 'tersajilah': 'saji', + 'tersajikan': 'saji', + 'penyaji': 'saji', + 'penyajinya': 'saji', + 'penyajikan': 'saji', + 'penyajian': 'saji', + 'bersaji': 'saji', + 'penyajiannya': 'saji', + 'menyajikan': 'saji', + 'menyajikannya': 'saji', + 'saji-sajian': 'saji', + 'menyakal': 'sakal', + 'sakapan': 'sakap', + 'menyakap': 'sakap', + 'menyakapi': 'sakap', + 'penyakap': 'sakap', + 'penyakapan': 'sakap', + 'menyakar': 'sakar', + 'penyakar': 'sakar', + 'tersakat': 'sakat', + 'penyakat': 'sakat', + 'menyakatkan': 'sakat', + 'kesakralan': 'sakral', + 'kesakralannya': 'sakral', + 'bersaksi': 'saksi', + 'bersaksinya': 'saksi', + 'bersaksilah': 'saksi', + 'kesaksian': 'saksi', + 'kesaksiannya': 'saksi', + 'kesaksianku': 'saksi', + 'penyaksian': 'saksi', + 'menyaksikan': 'saksi', + 'menyaksikannya': 'saksi', + 'menyaksikanku': 'saksi', + 'menyaksikanmu': 'saksi', + 'mempersaksikan': 'saksi', + 'tersaku': 'saku', + 'saku-saku': 'saku', + 'menyakukan': 'saku', + 'penyalahartian': 'salah arti', + 'menyalahartikan': 'salah arti', + 'menyalahartikannya': 'salah arti', + 'salakan': 'salak', + 'menyalak': 'salak', + 'menyalakkan': 'salak', + 'penyalak': 'salak', + 'menyalang': 'salang', + 'bersalat': 'salat', + 'menyalatkan': 'salat', + 'menyalatkannya': 'salat', + 'kesalehan': 'saleh', + 'kesalehannya': 'saleh', + 'menyalep': 'salep', + 'penyalib': 'salib', + 'penyaliban': 'salib', + 'menyalib': 'salib', + 'menyalibnya': 'salib', + 'menyalibkan': 'salib', + 'penyalibannya': 'salib', + 'kesalingan': 'saling', + 'menyalip': 'salip', + 'menyalipnya': 'salip', + 'menyalipku': 'salip', + 'menyalipmu': 'salip', + 'bersalip-salipan': 'salip', + 'menyalju': 'salju', + 'bersalju': 'salju', + 'bersaljunya': 'salju', + 'pesalto': 'salto', + 'bersalto': 'salto', + 'bersaluir': 'saluir', + 'menyaluir': 'saluir', + 'bersaluk': 'saluk', + 'bersalung': 'salung', + 'salutan': 'salut', + 'tersalut': 'salut', + 'bersalut': 'salut', + 'penyalut': 'salut', + 'menyalut': 'salut', + 'menyaluti': 'salut', + 'penyalutan': 'salut', + 'kesamarataan': 'sama rata', + 'penyamarataan': 'sama rata', + 'menyamaratakan': 'sama rata', + 'menyamaratakannya': 'sama rata', + 'menyaman': 'saman', + 'menyamanan': 'saman', + 'kesamaptaan': 'samapta', + 'menyambal': 'sambal', + 'menyambalewa': 'sambalewa', + 'menyambalewakan': 'sambalewa', + 'bersambang': 'sambang', + 'menyambang': 'sambang', + 'menyambangi': 'sambang', + 'menyambanginya': 'sambang', + 'menyambangiku': 'sambang', + 'menyambangimu': 'sambang', + 'sambang darah': 'sambang', + 'sambatan': 'sambat', + 'sambatannya': 'sambat', + 'sesambat': 'sambat', + 'menyambat': 'sambat', + 'bersambat': 'sambat', + 'persambatan': 'sambat', + 'penyambatan': 'sambat', + 'menyambi': 'sambi', + 'menyambinya': 'sambi', + 'sambilan': 'sambil', + 'sambilannya': 'sambil', + 'tersambil': 'sambil', + 'menyambilkan': 'sambil', + 'menyambillalukan': 'sambil lalu', + 'sambitan': 'sambit', + 'menyambit': 'sambit', + 'menyambitnya': 'sambit', + 'penyambit': 'sambit', + 'penyambitan': 'sambit', + 'tersambit': 'sambit', + 'menyambiti': 'sambit', + 'menyambitkan': 'sambit', + 'sambungan': 'sambung', + 'sambungannya': 'sambung', + 'bersambung': 'sambung', + 'bersambungan': 'sambung', + 'menyambung': 'sambung', + 'menyambungnya': 'sambung', + 'menyambungkan': 'sambung', + 'menyambungkannya': 'sambung', + 'menyambungan': 'sambung', + 'penyambung': 'sambung', + 'penyambungnya': 'sambung', + 'penyambungan': 'sambung', + 'penyambungannya': 'sambung', + 'persambungan': 'sambung', + 'mempersambungkan': 'sambung', + 'sambung-bersambung': 'sambung', + 'sambung-menyambung': 'sambung', + 'bersambung tangan': 'sambung tangan', + 'menyamir': 'samir', + 'menyamirkan': 'samir', + 'sampaian': 'sampai', + 'sesampai': 'sampai', + 'sesampainya': 'sampai', + 'sesampaikan': 'sampai', + 'penyampai': 'sampai', + 'penyampaikan': 'sampai', + 'penyampaian': 'sampai', + 'tersampai': 'sampai', + 'tersampainya': 'sampai', + 'tersampaikan': 'sampai', + 'tersampaikannya': 'sampai', + 'menyampai': 'sampai', + 'menyampainya': 'sampai', + 'menyampaikan': 'sampai', + 'menyampaikannya': 'sampai', + 'menyampaian': 'sampai', + 'kesampaian': 'sampai', + 'kesampaiannya': 'sampai', + 'penyampaiannya': 'sampai', + 'menyampaikanlah': 'sampai', + 'menyampaikankan': 'sampai', + 'sampai-sampai': 'sampai', + 'berkesampaian': 'sampai', + 'menyampak': 'sampak', + 'menyampakkan': 'sampak', + 'menyampakan': 'sampak', + 'bersampan': 'sampan', + 'bersampan-sampan': 'sampan', + 'kesamper': 'samper', + 'menyamper': 'samper', + 'menyamperi': 'samper', + 'sampingan': 'samping', + 'sampingannya': 'samping', + 'sampinganmu': 'samping', + 'tersamping': 'samping', + 'tersampingkan': 'samping', + 'menyamping': 'samping', + 'menyampingnya': 'samping', + 'menyampingkan': 'samping', + 'menyampingi': 'samping', + 'bersamping': 'samping', + 'bersampingan': 'samping', + 'penyampingan': 'samping', + 'mengesampingkan': 'samping', + 'mengesampingkannya': 'samping', + 'samping-menyamping': 'samping', + 'sampiran': 'sampir', + 'tersampir': 'sampir', + 'bersampiran': 'sampir', + 'menyampirkan': 'sampir', + 'menyampirkannya': 'sampir', + 'bersamplok': 'samplok', + 'menyampo': 'sampo', + 'menyampoi': 'sampo', + 'penyampoan': 'sampo', + 'penyampul': 'sampul', + 'penyampulan': 'sampul', + 'menyampul': 'sampul', + 'menyampulnya': 'sampul', + 'bersampul': 'sampul', + 'bersampulkan': 'sampul', + 'menyampuli': 'sampul', + 'persamuhan': 'samuh', + 'bersanak': 'sanak', + 'menyanak': 'sanak', + 'bersanat': 'sanat', + 'menyandakan': 'sandak', + 'bersandal': 'sandal', + 'menyandera': 'sandera', + 'menyanderanya': 'sandera', + 'menyanderakan': 'sandera', + 'menyanderaku': 'sandera', + 'penyandera': 'sandera', + 'penyanderanya': 'sandera', + 'penyanderaan': 'sandera', + 'penyanderaannya': 'sandera', + 'sandingan': 'sanding', + 'bersanding': 'sanding', + 'bersandingnya': 'sanding', + 'bersandingkan': 'sanding', + 'bersandingan': 'sanding', + 'menyanding': 'sanding', + 'menyandingkan': 'sanding', + 'menyandingkannya': 'sanding', + 'menyandingan': 'sanding', + 'menyandingi': 'sanding', + 'menyandinginya': 'sanding', + 'mempersandingkan': 'sanding', + 'sandungan': 'sandung', + 'sandungannya': 'sandung', + 'kesandung': 'sandung', + 'menyandung': 'sandung', + 'menyandungnya': 'sandung', + 'menyandungkan': 'sandung', + 'tersandung': 'sandung', + 'tersandungnya': 'sandung', + 'tersandunglah': 'sandung', + 'tersanga-sanga': 'sanga', + 'bersangai': 'sangai', + 'tersangai': 'sangai', + 'menyangai': 'sangai', + 'kesangaran': 'sangar', + 'kesangarannya': 'sangar', + 'tersangat': 'sanggat', + 'kesangatan': 'sangat', + 'bersangatan': 'sangat', + 'menyangatkan': 'sangat', + 'mempersangat': 'sangat', + 'sangat-sangat': 'sangat', + 'sangat-sangatlah': 'sangat', + 'mempersangatkan': 'sangat', + 'sanggahan': 'sanggah', + 'sanggahannya': 'sanggah', + 'penyanggah': 'sanggah', + 'penyanggahnya': 'sanggah', + 'penyanggahan': 'sanggah', + 'menyanggah': 'sanggah', + 'menyanggahnya': 'sanggah', + 'menyanggam': 'sanggam', + 'bersanggama': 'sanggama', + 'menyanggang': 'sanggang', + 'menyanggep': 'sanggep', + 'menyanggerah': 'sanggerah', + 'bersanggit': 'sanggit', + 'menyanggit': 'sanggit', + 'menyanggrah': 'sanggrah', + 'pesanggrahan': 'sanggrah', + 'menyanggul': 'sanggul', + 'menyanggulnya': 'sanggul', + 'bersanggul': 'sanggul', + 'menyanggulkan': 'sanggul', + 'sesanggup': 'sanggup', + 'sesanggupnya': 'sanggup', + 'sesanggupan': 'sanggup', + 'menyanggupi': 'sanggup', + 'menyanggupinya': 'sanggup', + 'kesanggupan': 'sanggup', + 'kesanggupannya': 'sanggup', + 'menyanggupkan': 'sanggup', + 'sesangkak': 'sangkak', + 'bersangkak': 'sangkak', + 'menyangkak': 'sangkak', + 'menyangkaki': 'sangkak', + 'menyangkap': 'sangkap', + 'sangkaran': 'sangkar', + 'bersangkar': 'sangkar', + 'menyangkarkan': 'sangkar', + 'bersangkut paut': 'sangkut paut', + 'menyangkutpautkan': 'sangkut paut', + 'menyangling': 'sangling', + 'menyanglingkan': 'sangling', + 'menyangrai': 'sangrai', + 'menyangrainya': 'sangrai', + 'kesangsang': 'sangsang', + 'menyangsang': 'sangsang', + 'tersangsang': 'sangsang', + 'bersanksi': 'sanksi', + 'pesantai': 'santai', + 'bersantai': 'santai', + 'bersantainya': 'santai', + 'bersantailah': 'santai', + 'kesantaian': 'santai', + 'bersantai-santai': 'santai', + 'menyantak': 'santak', + 'menyantakan': 'santak', + 'menyantakkan': 'santak', + 'bersantan': 'santan', + 'bersantanlah': 'santan', + 'pesantap': 'santap', + 'santapan': 'santap', + 'santapannya': 'santap', + 'bersantap': 'santap', + 'bersantapnya': 'santap', + 'bersantaplah': 'santap', + 'menyantap': 'santap', + 'menyantapnya': 'santap', + 'penyantapan': 'santap', + 'persantapan': 'santap', + 'menyantet': 'santet', + 'menyantetnya': 'santet', + 'santiran': 'santir', + 'pesantrian': 'santri', + 'santunan': 'santun', + 'santunannya': 'santun', + 'penyantun': 'santun', + 'penyantunan': 'santun', + 'menyantun': 'santun', + 'menyantunkan': 'santun', + 'menyantuni': 'santun', + 'menyantuninya': 'santun', + 'menyantung': 'santung', + 'sapai-sapai': 'sapai', + 'sapihan': 'sapih', + 'menyapih': 'sapih', + 'menyapihnya': 'sapih', + 'sapuan': 'sapu', + 'sapuannya': 'sapu', + 'disapu': 'sapu', + 'disapunya': 'sapu', + 'disapukan': 'sapu', + 'tersapu': 'sapu', + 'tersapunya': 'sapu', + 'menyapu': 'sapu', + 'menyapunya': 'sapu', + 'menyapulah': 'sapu', + 'menyapukan': 'sapu', + 'menyapukannya': 'sapu', + 'penyapu': 'sapu', + 'penyapunya': 'sapu', + 'penyapuan': 'sapu', + 'sapu-sapu': 'sapu', + 'menyapu-nyapu': 'sapu', + 'menyaput': 'saput', + 'tersaput': 'saput', + 'menyaputi': 'saput', + 'bersarak': 'sarak', + 'menyarak': 'sarak', + 'sarapan': 'sarap', + 'sarapannya': 'sarap', + 'sarapanlah': 'sarap', + 'sarapanku': 'sarap', + 'menyarap': 'sarap', + 'menyarapi': 'sarap', + 'bersarasehan': 'sarasehan', + 'menyarasehankan': 'sarasehan', + 'menyarat': 'sarat', + 'menyaratkan': 'sarat', + 'menyarati': 'sarat', + 'menyarat-nyarat': 'sarat', + 'menyaraukan': 'sarau', + 'menyaripatikan': 'sari pati', + 'tersaripatikan': 'sari pati', + 'kesarjanaan': 'sarjana', + 'kesarjanaannya': 'sarjana', + 'menyaru': 'saru', + 'menyarukan': 'saruk', + 'menyarukannya': 'saru', + 'penyaruan': 'saru', + 'penyaruannya': 'saru', + 'menyaruk': 'saruk', + 'tersaruk': 'saruk', + 'tersaruk-saruk': 'saruk', + 'menyarut': 'sarut', + 'sasakan': 'sasak', + 'sasakannya': 'sasak', + 'menyasak': 'sasak', + 'bersasak': 'sasak', + 'menyasap': 'sasap', + 'menyasau': 'sasau', + 'kesastraan': 'sastra', + 'kesastrawanan': 'sastrawan', + 'menyatai': 'satai', + 'menyataian': 'satai', + 'persataian': 'satai', + 'mempersatai': 'satai', + 'menyatih': 'satih', + 'menyatroni': 'satron', + 'menyatumejakan': 'satu meja', + 'bersatu padu': 'satu padu', + 'penyatupaduan': 'satu padu', + 'menyatupadukan': 'satu padu', + 'mempersatupadukan': 'satu padu', + 'bersauh': 'sauh', + 'bersauhnya': 'sauh', + 'saukan': 'sauk', + 'saukani': 'sauk', + 'menyauk': 'sauk', + 'penyaukan': 'sauk', + 'sauk-sauk': 'sauk', + 'sauk-menyauk': 'sauk', + 'tersaur': 'saur', + 'bersaur': 'saur', + 'menyaur': 'saur', + 'menyauri': 'saur', + 'pesawah': 'sawah', + 'pesawahan': 'sawah', + 'bersawah': 'sawah', + 'penyawah': 'sawah', + 'menyawah': 'sawah', + 'persawahan': 'sawah', + 'persawahannya': 'sawah', + 'persawahanan': 'sawah', + 'bersawala': 'sawala', + 'sawangan': 'sawang', + 'pesawangan': 'sawang', + 'menyawar': 'sawar', + 'menyawarkan': 'sawar', + 'menyawer': 'sawer', + 'sesawi': 'sawi', + 'sawitan': 'sawit', + 'bersayap': 'sayap', + 'bersayapnya': 'sayap', + 'menyayembarakan': 'sayembara', + 'menyayung': 'sayung', + 'sayup-sayup': 'sayup', + 'sesayup-sayup': 'sayup', + 'sayup-menyayup': 'sayup', + 'sayuran': 'sayur', + 'sayurannya': 'sayur', + 'menyayur': 'sayur', + 'menyayurnya': 'sayur', + 'sayur-mayur': 'sayur', + 'sayur-mayurnya': 'sayur', + 'sayur-mayuran': 'sayur', + 'sayur-sayuran': 'sayur', + 'sayur-sayurannya': 'sayur', + 'sayur-sayuranan': 'sayur', + 'berseba': 'seba', + 'menyeba': 'seba', + 'menyebakan': 'seba', + 'tersebab': 'sebab', + 'bersebab': 'sebab', + 'penyebab': 'sebab', + 'penyebabnya': 'sebab', + 'penyebabkan': 'sebab', + 'penyebaban': 'sebab', + 'menyebabkan': 'sebab', + 'menyebabkannya': 'sebab', + 'menyebabkankan': 'sebab', + 'menyebabkankannya': 'sebab', + 'menyebabkanku': 'sebab', + 'menyebabkanmu': 'sebab', + 'menyebal': 'sebal', + 'menyebalkan': 'sebal', + 'menyebalkannya': 'sebal', + 'kesebalan': 'sebal', + 'kesebalannya': 'sebal', + 'menyebalkanmu': 'sebal', + 'menyebaurkan': 'sebaur', + 'penyeberang': 'seberang', + 'penyeberangnya': 'seberang', + 'penyeberangi': 'seberang', + 'penyeberangan': 'seberang', + 'terseberang': 'seberang', + 'terseberangkan': 'seberang', + 'menyeberang': 'seberang', + 'menyeberangnya': 'seberang', + 'menyeberanglah': 'seberang', + 'menyeberangkan': 'seberang', + 'menyeberangkannya': 'seberang', + 'menyeberangi': 'seberang', + 'menyeberangan': 'seberang', + 'menyeberanginya': 'seberang', + 'keseberangan': 'seberang', + 'penyeberangannya': 'seberang', + 'berseberangan': 'seberang', + 'berseberangannya': 'seberang', + 'seberang-menyeberang': 'seberang', + 'menyebit': 'sebit', + 'menyebitkan': 'sebit', + 'menyebrot': 'sebrot', + 'menyebu': 'sebu', + 'menyebunya': 'sebu', + 'menyebukan': 'sebuk', + 'menyebuk': 'sebuk', + 'penyebukan': 'sebuk', + 'tersedak': 'sedak', + 'tersedaknya': 'sedak', + 'kesedakan': 'sedak', + 'sedam-sedam': 'sedam', + 'bersedan-sedan': 'sedan', + 'tersedan-sedan': 'sedan', + 'menyedang': 'sedang', + 'sedangkan': 'sedang', + 'sedangkankan': 'sedang', + 'sedangkani': 'sedang', + 'sedangkanan': 'sedang', + 'menyedangkan': 'sedang', + 'sedang-menyedang': 'sedang', + 'menyedang-nyedang': 'sedang', + 'menyedang-nyedangkan': 'sedang', + 'bersedekah': 'sedekah', + 'bersedekahlah': 'sedekah', + 'menyedekahi': 'sedekah', + 'menyedekahkan': 'sedekah', + 'bersedekap': 'sedekap', + 'kesederhanaan': 'sederhana', + 'kesederhanaannya': 'sederhana', + 'penyederhanaan': 'sederhana', + 'penyederhanaannya': 'sederhana', + 'menyederhanakan': 'sederhana', + 'menyederhanakannya': 'sederhana', + 'sedikitnya': 'sedikit', + 'menyedikit': 'sedikit', + 'tersedikit': 'sedikit', + 'menyedikiti': 'sedikit', + 'menyedikitkan': 'sedikit', + 'sedikit-sedikit': 'sedikit', + 'sedikit-sedikitlah': 'sedikit', + 'mempersedikitkan': 'sedikit', + 'sedikit-sedikitnya': 'sedikit', + 'sedotan': 'sedot', + 'sedotannya': 'sedot', + 'sedotanlah': 'sedot', + 'tersedot': 'sedot', + 'tersedotnya': 'sedot', + 'menyedot': 'sedot', + 'menyedotnya': 'sedot', + 'menyedotan': 'sedot', + 'penyedot': 'sedot', + 'penyedotnya': 'sedot', + 'penyedotan': 'sedot', + 'penyedotannya': 'sedot', + 'bersedu': 'sedu', + 'tersedu-sedu': 'sedu', + 'bersedu-sedu': 'sedu', + 'menyegak': 'segak', + 'segalanya': 'segala', + 'segala-galanya': 'segala', + 'bersegeh': 'segeh', + 'menyegehi': 'segeh', + 'segelan': 'segel', + 'segelannya': 'segel', + 'bersegel': 'segel', + 'menyegel': 'segel', + 'menyegelnya': 'segel', + 'menyegelan': 'segel', + 'penyegel': 'segel', + 'penyegelan': 'segel', + 'penyegelannya': 'segel', + 'sesegera': 'segera', + 'sesegeranya': 'segera', + 'bersegera': 'segera', + 'bersegeralah': 'segera', + 'persegeraan': 'segera', + 'penyegeraan': 'segera', + 'menyegerakan': 'segera', + 'menyegerakannya': 'segera', + 'mempersegera': 'segera', + 'mepersegerakan': 'segera', + 'bersegmen': 'segmen', + 'bersegmenkan': 'segmen', + 'menyegmentasikan': 'segmentasi', + 'kesejahteraan': 'sejahtera', + 'kesejahteraannya': 'sejahtera', + 'kesejahteraanlah': 'sejahtera', + 'kesejahteraanku': 'sejahtera', + 'penyejahteraan': 'sejahtera', + 'menyejahterakan': 'sejahtera', + 'menyejahterakannya': 'sejahtera', + 'bersejingkat': 'sejingkat', + 'bersejuk': 'sejuk', + 'menyejuk': 'sejuk', + 'menyejukkan': 'sejuk', + 'menyejukkannya': 'sejuk', + 'menyejukan': 'sejuk', + 'penyejuk': 'sejuk', + 'penyejukan': 'sejuk', + 'kesejukan': 'sejuk', + 'kesejukannya': 'sejuk', + 'bersejuk-sejuk': 'sejuk', + 'tersekang': 'sekang', + 'penyekang': 'sekang', + 'menyekang': 'sekang', + 'sekapan': 'sekap', + 'sekapannya': 'sekap', + 'penyekap': 'sekap', + 'penyekapnya': 'sekap', + 'penyekapkan': 'sekap', + 'penyekapan': 'sekap', + 'tersekap': 'sekap', + 'menyekap': 'sekap', + 'menyekapnya': 'sekap', + 'menyekapan': 'sekap', + 'penyekapannya': 'sekap', + 'menyekar': 'sekar', + 'sekatan': 'sekat', + 'persekat': 'sekat', + 'persekatan': 'sekat', + 'bersekat': 'sekat', + 'penyekat': 'sekat', + 'penyekatnya': 'sekat', + 'penyekatan': 'sekat', + 'menyekat': 'sekat', + 'menyekati': 'sekat', + 'menyekatan': 'sekat', + 'tersekat': 'sekat', + 'bersekat-sekat': 'sekat', + 'bersekresi': 'sekresi', + 'menyekresi': 'sekresi', + 'menyekresikan': 'sekresi', + 'disekrup': 'sekrup', + 'menyekrup': 'sekrup', + 'bersekutu': 'sekutu', + 'menyekutui': 'sekutu', + 'persekutuan': 'sekutu', + 'persekutuannya': 'sekutu', + 'menyekutukan': 'sekutu', + 'disel': 'sel', + 'diselnya': 'sel', + 'bersel': 'sel', + 'berselan': 'sel', + 'bersela': 'sela', + 'berselai': 'sela', + 'penyela': 'sela', + 'penyelaan': 'sela', + 'menyela': 'sela', + 'menyelanya': 'sela', + 'menyelakan': 'selak', + 'menyelakannya': 'sela', + 'penyelaannya': 'sela', + 'sela-sela': 'sela', + 'sela-selanya': 'sela', + 'sela-menyela': 'sela', + 'menyeladang': 'seladang', + 'berselaju': 'selaju', + 'keselak': 'selak', + 'menyelak': 'selak', + 'terselak': 'selak', + 'menyelakkan': 'selak', + 'menyelampai': 'selampai', + 'menyelampaikan': 'selampai', + 'menyelampitkan': 'selampit', + 'berselang': 'selang', + 'berselangan': 'selang', + 'menyelang': 'selang', + 'menyelangi': 'selang', + 'menyelangkan': 'selang', + 'memperselangi': 'selang', + 'memperselangkan': 'selang', + 'selang tenggang': 'selang', + 'berselang-selang': 'selang', + 'berselang-tenggang': 'selang', + 'menyelang-nyelangkan': 'selang', + 'berselang-seli': 'selang-seli', + 'berselang-seling': 'selang-seling', + 'menyelang-nyeling': 'selang-seling', + 'menyelang-nyelingkan': 'selang-seling', + 'selangkangan': 'selangkang', + 'selangkangannya': 'selangkang', + 'menyelangkupi': 'selangkup', + 'terselap': 'selap', + 'menyelap': 'selap', + 'keselapan': 'selap', + 'menyelapi': 'selap', + 'selapanan': 'selapan', + 'menyelara': 'selara', + 'menyelarakan': 'selara', + 'terselat': 'selat', + 'terselatkan': 'selat', + 'terselatan': 'selat', + 'menyelat': 'selat', + 'menyelatkan': 'selat', + 'selawatan': 'selawat', + 'berselawat': 'selawat', + 'menyelawat': 'selawat', + 'menyelawatkan': 'selawat', + 'berselekeh': 'selekeh', + 'menyelekehi': 'selekeh', + 'berselekoh': 'selekoh', + 'menyelekoh': 'selekoh', + 'penyeleksi': 'seleksi', + 'penyeleksinya': 'seleksi', + 'penyeleksian': 'seleksi', + 'menyeleksi': 'seleksi', + 'menyeleksinya': 'seleksi', + 'menyeleksii': 'seleksi', + 'penyeleksiannya': 'seleksi', + 'keselektifan': 'selektif', + 'berseleleran': 'seleler', + 'menyelembana': 'selembana', + 'terselempang': 'selempang', + 'berselempang': 'selempang', + 'berselempangkan': 'selempang', + 'menyelempangkan': 'selempang', + 'menyelendang': 'selendang', + 'berselendang': 'selendang', + 'menyelendangi': 'selendang', + 'memperselendang': 'selendang', + 'menyelendangkan': 'selendang', + 'memperselendangkan': 'selendang', + 'menyelentik': 'selentik', + 'selentingan': 'selenting', + 'selentingannya': 'selenting', + 'menyelenting': 'selenting', + 'menyelentingkan': 'selenting', + 'berselepat': 'selepat', + 'berselesa': 'selesa', + 'menyeletuk': 'seletuk', + 'penyelia': 'selia', + 'penyelianya': 'selia', + 'penyeliaan': 'selia', + 'menyelia': 'selia', + 'berselibut': 'selibut', + 'menyeligi': 'seligi', + 'menyeligit': 'seligit', + 'menyelimpang': 'selimpang', + '4selimpat': 'selimpat', + 'menyelimpat': 'selimpat', + 'selingan': 'seling', + 'selingannya': 'seling', + 'penyeling': 'seling', + 'berseling': 'seling', + 'berselingan': 'seling', + 'berselingku': 'seling', + 'menyeling': 'seling', + 'menyelingkan': 'seling', + 'menyelingi': 'seling', + 'menyelinginya': 'seling', + 'menyelingar': 'selingar', + 'menyelingkit': 'selingkit', + 'berselingkit': 'selingkit', + 'berselingkuh': 'selingkuh', + 'berselingkuhnya': 'selingkuh', + 'perselingkuhan': 'selingkuh', + 'perselingkuhannya': 'selingkuh', + 'menyelingkuhkan': 'selingkuh', + 'menyelingkup': 'selingkup', + 'menyelingkupi': 'selingkup', + 'menyelir': 'selir', + 'memperselir': 'selir', + 'selir-menyelir': 'selir', + 'memperselirkan': 'selir', + 'berselirak': 'selirak', + 'menyelisipkan': 'selisip', + 'menyelisir': 'selisir', + 'seliweran': 'seliwer', + 'berseliweran': 'seliwer', + 'berseloka': 'seloka', + 'menyelomoti': 'selomot', + 'menyelongkan': 'selong', + 'menyelongkar': 'selongkar', + 'menyelongsongi': 'selongsong', + 'selonjoran': 'selonjor', + 'berselonjor': 'selonjor', + 'berselonjoran': 'selonjor', + 'menyelonong': 'selonong', + 'menyelot': 'selot', + 'seloyongan': 'seloyong', + 'berseloyong': 'seloyong', + 'seloyong-seloyong': 'seloyong', + 'berseluar': 'seluar', + 'menyeluduk': 'seluduk', + 'berseluk-beluk': 'seluk-beluk', + 'menyelukat': 'selukat', + 'berselulup': 'selulup', + 'terselulur': 'selulur', + 'peseluncur': 'seluncur', + 'selundupan': 'selundup', + 'selundupannya': 'selundup', + 'penyelundup': 'selundup', + 'penyelundupnya': 'selundup', + 'penyelundupkan': 'selundup', + 'penyelundupan': 'selundup', + 'menyelundup': 'selundup', + 'menyelundupnya': 'selundup', + 'menyelundupkan': 'selundup', + 'menyelundupkannya': 'selundup', + 'menyelundupan': 'selundup', + 'menyelundupi': 'selundup', + 'penyelundupannya': 'selundup', + 'menyelungkup': 'selungkup', + 'menyelungkupi': 'selungkup', + 'menyeluruh': 'seluruh', + 'menyeluruhnya': 'seluruh', + 'menyeluruhi': 'seluruh', + 'keseluruhan': 'seluruh', + 'keseluruhannya': 'seluruh', + 'keseluruhanlah': 'seluruh', + 'keseluruhanan': 'seluruh', + 'menyelusuh': 'selusuh', + 'menyelusup': 'selusup', + 'menyelusupkan': 'selusup', + 'terselusur': 'selusur', + 'menyelusur': 'selusur', + 'menyelusuri': 'selusur', + 'penyelusuran': 'selusur', + 'menyelusurkan': 'selusur', + 'sema-sema': 'sema', + 'bersemak': 'semak', + 'menyemak': 'semak', + 'menyemakan': 'semak', + 'semak-semak': 'semak', + 'semak-semaknya': 'semak', + 'menyemakkan': 'semak', + 'kesemanan': 'seman', + 'bersemangat': 'semangat', + 'bersemangatnya': 'semangat', + 'bersemangatlah': 'semangat', + 'bersemangatkan': 'semangat', + 'menyemangati': 'semangat', + 'menyemangatinya': 'semangat', + 'menyemangatiku': 'semangat', + 'penyemangatan': 'semangat', + 'menyemangatkan': 'semangat', + 'menyemangatkannya': 'semangat', + 'kesemaran': 'semara', + 'bersemayam': 'semayam', + 'bersemayamnya': 'semayam', + 'persemayaman': 'semayam', + 'persemayamannya': 'semayam', + 'menyemayamkan': 'semayam', + 'menyemayamkannya': 'semayam', + 'menyembai': 'sembai', + 'tersembam': 'sembam', + 'menyembam': 'sembam', + 'menyembamkan': 'sembam', + 'sembarangan': 'sembarang', + 'sembarangannya': 'sembarang', + 'sembaranganlah': 'sembarang', + 'menyembarangi': 'sembarang', + 'menyembat': 'sembat', + 'menyembatkan': 'sembat', + 'bersembayan': 'sembayan', + 'kesembilan': 'sembilan', + 'kesembilannya': 'sembilan', + 'bersembilan': 'sembilan', + 'sembiluan': 'sembilu', + 'menyembilu': 'sembilu', + 'sembiran': 'sembir', + 'menyembir': 'sembir', + 'bersemboyan': 'semboyan', + 'menyemboyankan': 'semboyan', + 'kesembronoan': 'sembrono', + 'kesembronoannya': 'sembrono', + 'menyembronokan': 'sembrono', + 'menyembul': 'sembul', + 'menyembulnya': 'sembul', + 'menyembullah': 'sembul', + 'menyembulkan': 'sembul', + 'tersembul': 'sembul', + 'tersembulnya': 'sembul', + 'bersemburit': 'semburit', + 'bersememeh': 'sememeh', + 'semenan': 'semen', + 'menyemen': 'semen', + 'menyemennya': 'semen', + 'bersemen': 'semen', + 'penyemenan': 'semen', + 'semena-mena': 'semena', + 'semena-menanya': 'semena', + 'kesemena-menaan': 'semena', + 'bersemenda': 'semenda', + 'semenda-menyemenda': 'semenda', + 'semenggah-menggah': 'semenggah', + 'kesementaraan': 'sementara', + 'kesemestaan': 'semesta', + 'semesteran': 'semester', + 'semesterannya': 'semester', + 'bersemi': 'semi', + 'berseminya': 'semi', + 'bersemilah': 'semi', + 'menyemir': 'semir', + 'menyemirnya': 'semir', + 'menyemirkan': 'semir', + 'bersemir': 'semir', + 'bersempadan': 'sempadan', + 'menyempadani': 'sempadan', + 'sempalan': 'sempal', + 'sempalannya': 'sempal', + 'menyempal': 'sempal', + 'tersempal': 'sempal', + 'penyempal': 'sempal', + 'penyempalan': 'sempal', + 'menyempali': 'sempal', + 'tersempalai': 'sempalai', + 'menyempang': 'sempang', + 'bersempang': 'sempang', + 'bersempena': 'sempena', + 'menyempenakan': 'sempena', + 'tersempil': 'sempil', + 'menyempil': 'sempil', + 'menyempilkan': 'sempil', + 'sempoyongan': 'sempoyong', + 'sempritan': 'semprit', + 'menyemprit': 'semprit', + 'penyemprit': 'semprit', + 'penyempritan': 'semprit', + 'bersemprong': 'semprong', + 'tersempul': 'sempul', + 'bersempuras': 'sempuras', + 'kesemrawutan': 'semrawut', + 'kesemrawutannya': 'semrawut', + 'tersemu': 'semu', + 'menyemu': 'semu', + 'penyemu': 'semu', + 'menyemui': 'semu', + 'semu-semu': 'semu', + 'penyemuan': 'semu', + 'menyemukan': 'semu', + 'semuanya': 'semua', + 'semuanyanya': 'semua', + 'semuanyalah': 'semua', + 'semuanyai': 'semua', + 'semua-muanya': 'semua', + 'menyemur': 'semur', + 'menyemurkan': 'semur', + 'menyemut': 'semut', + 'menyemutnya': 'semut', + 'menyemuti': 'semut', + 'kesemutan': 'semut', + 'kesemutannya': 'semut', + 'semut-semutan': 'semut', + 'senan': 'sen', + 'sen-senan': 'sen', + 'tersenak': 'senak', + 'menyenak': 'senak', + 'menyenakan': 'senak', + 'kesenakan': 'senak', + 'menyenakkan': 'senak', + 'kesenak-senakan': 'senak', + 'menyenak-nyenak': 'senak', + 'pesenam': 'senam', + 'bersenam': 'senam', + 'bersenapan': 'senapan', + 'tersendam': 'sendam', + 'bersendar': 'sendar', + 'tersendat': 'sendat', + 'tersendatnya': 'sendat', + 'tersendatan': 'sendat', + 'menyendat': 'sendat', + 'menyendatkan': 'sendat', + 'penyendatan': 'sendat', + 'tersendat-sendat': 'sendat', + 'tersendat-sendatnya': 'sendat', + 'bersendel': 'sendel', + 'dengan -': 'sendiri', + 'sendirian': 'sendiri', + 'sendiriannya': 'sendiri', + 'sendirianlah': 'sendiri', + 'menyendiri': 'sendiri', + 'menyendirinya': 'sendiri', + 'sendirinya': 'sendiri', + 'bersendiri': 'sendiri', + 'penyendiri': 'sendiri', + 'tersendiri': 'sendiri', + 'tersendirinya': 'sendiri', + 'tersendirikan': 'sendiri', + 'kesendirian': 'sendiri', + 'kesendiriannya': 'sendiri', + 'kesendirianmu': 'sendiri', + 'penyendirian': 'sendiri', + 'menyendirikan': 'sendiri', + 'sendiri-sendiri': 'sendiri', + 'tersendok': 'sendok', + 'menyendok': 'sendok', + 'menyendoknya': 'sendok', + 'menyendokkan': 'sendok', + 'menyendoki': 'sendok', + 'tersendorong': 'sendorong', + 'bersendorongan': 'sendorong', + 'bersendu': 'sendu', + 'kesenduan': 'sendu', + 'menyengaja': 'sengaja', + 'menyengajakan': 'sengaja', + 'bersengaja': 'sengaja', + 'kesengajaan': 'sengaja', + 'kesengajaannya': 'sengaja', + 'menyengal': 'sengal', + 'sengal-sengal': 'sengal', + 'tersengal-sengal': 'sengal', + 'menyengam': 'sengam', + 'menyengar': 'sengar', + 'menyengarkan': 'sengar', + 'sengatan': 'sengat', + 'sengatannya': 'sengat', + 'penyengat': 'sengat', + 'menyengat': 'sengat', + 'menyengatnya': 'sengat', + 'menyengatkan': 'sengat', + 'menyengatku': 'sengat', + 'tersengat': 'sengat', + 'tersengatnya': 'sengat', + 'bersengat': 'sengat', + 'penyengatan': 'sengat', + 'senggakan': 'senggak', + 'menyenggak': 'senggak', + 'menyenggaki': 'senggak', + 'bersenggang': 'senggang', + 'kesenggangan': 'senggang', + 'menyenggangkan': 'senggang', + 'senggang-tenggang': 'senggang', + 'bersenggang-senggang': 'senggang', + 'menyenggau': 'senggau', + 'bersenggau-senggau': 'senggau', + 'menyengget': 'sengget', + 'kesenggol': 'senggol', + 'senggolan': 'senggol', + 'senggolannya': 'senggol', + 'tersenggol': 'senggol', + 'bersenggol': 'senggol', + 'bersenggolan': 'senggol', + 'menyenggol': 'senggol', + 'menyenggolnya': 'senggol', + 'menyenggolmu': 'senggol', + 'bersenggolannya': 'senggol', + 'penyenggolan': 'senggol', + 'senggol-menyenggol': 'senggol', + 'menyengguk': 'sengguk', + 'tersengguk': 'sengguk', + 'sesenggukan': 'sengguk', + 'senggak-sengguk': 'sengguk', + 'tersengguk-sengguk': 'sengguk', + 'bersenggulung': 'senggulung', + 'menyenggut': 'senggut', + 'sengihan': 'sengih', + 'tersengih': 'sengih', + 'menyengih': 'sengih', + 'menyenggihkan': 'sengih', + 'menyengir': 'sengir', + 'menyengit': 'sengit', + 'menyengitkan': 'sengit', + 'kesengitan': 'sengit', + 'kesengitannya': 'sengit', + 'menyengkak': 'sengkak', + 'menyengkang': 'sengkang', + 'penyengkang': 'sengkang', + 'tersengkang': 'sengkang', + 'bersengkarut': 'sengkarut', + 'sengkedan': 'sengked', + 'bersengkela': 'sengkela', + 'menyengkela': 'sengkela', + 'menyengkelangkan': 'sengkelang', + 'menyengkeling': 'sengkeling', + 'bersengkeling': 'sengkeling', + 'menyengkelit': 'sengkelit', + 'bersengkelit': 'sengkelit', + 'sengkeran': 'sengker', + 'menyengker': 'sengker', + 'menyengkilit': 'sengkilit', + 'tersengsam': 'sengsam', + 'kesengsaman': 'sengsam', + 'kesengsem': 'sengsem', + 'kesengsemnya': 'sengsem', + 'tersengsem': 'sengsem', + 'menyenguk': 'senguk', + 'tersengut-sengut': 'sengut', + 'berseni': 'seni', + 'menyeni': 'seni', + 'kesenian': 'seni', + 'keseniannya': 'seni', + 'kesenianmu': 'seni', + 'kesenimanan': 'seniman', + 'kesenimanannya': 'seniman', + 'kesenimananku': 'seniman', + 'kesenioran': 'senior', + 'keseniorannya': 'senior', + 'kesenjaan': 'senja', + 'kesenjangan': 'senjang', + 'kesenjangannya': 'senjang', + 'persenjangan': 'senjang', + 'ketidaksenonohan': 'senonoh', + 'bersenoyong': 'senoyong', + 'sensoran': 'sensor', + 'penyensor': 'sensor', + 'penyensoran': 'sensor', + 'menyensus': 'sensus', + 'menyental': 'sental', + 'menyentalkan': 'sental', + 'menyentengi': 'senteng', + 'kesentengan': 'senteng', + 'menyentengkan': 'senteng', + 'menyenteri': 'senter', + 'menyenterinya': 'senter', + 'sentilan': 'sentil', + 'sentilannya': 'sentil', + 'menyentil': 'sentil', + 'menyentilnya': 'sentil', + 'menyentilkan': 'sentil', + 'tersentil': 'sentil', + 'bersentosa': 'sentosa', + 'kesentosaan': 'sentosa', + 'menyentosakan': 'sentosa', + 'kesentralan': 'sentral', + 'penyentralan': 'sentral', + 'menyentralkan': 'sentral', + 'menyentralisasi': 'sentralisasi', + 'menyentralisasikan': 'sentralisasi', + 'tersentralisasi': 'sentralisasi', + 'tersentralisasinya': 'sentralisasi', + 'tersentralisasikan': 'sentralisasi', + 'tersentuk': 'sentuk', + 'senyuman': 'senyum', + 'senyumannya': 'senyum', + 'senyumanan': 'senyum', + 'senyumanku': 'senyum', + 'senyumanmu': 'senyum', + 'tersenyum': 'senyum', + 'tersenyumnya': 'senyum', + 'tersenyumlah': 'senyum', + 'menyenyumi': 'senyum', + 'terseok-seok': 'seok', + 'terseok-seoknya': 'seok', + 'bersep': 'sep', + 'menyepah': 'sepah', + 'tersepah': 'sepah', + 'bersepah': 'sepah', + 'bersepah-sepah': 'sepah', + 'pesepak bola': 'sepak bola', + 'bersepak bola': 'sepak bola', + 'persepakbolaan': 'sepak bola', + 'persepakbolaannya': 'sepak bola', + 'menyepan': 'sepan', + 'bersepan': 'sepan', + 'sepelan': 'sepel', + 'menyepel': 'sepel', + 'menyepelkannya': 'sepel', + 'menyepelekan': 'sepele', + 'menyepelekannya': 'sepele', + 'menyeperah': 'seperah', + 'sepertikan': 'seperti', + 'sepertinya': 'seperti', + 'sepertinyanya': 'seperti', + 'menyepertikan': 'seperti', + 'penyepit': 'sepit', + 'penyepitan': 'sepit', + 'tersepit': 'sepit', + 'menyepit': 'sepit', + 'sepoi-sepoi': 'sepoi', + 'menyepuk': 'sepuk', + 'tersepuk': 'sepuk', + 'tersera-sera': 'sera', + 'penyerahterimaan': 'serah terima', + 'menyerahterimakan': 'serah terima', + 'berserak': 'serak', + 'berseraknya': 'serak', + 'berserakkan': 'serak', + 'berserakan': 'serak', + 'menyerak': 'serak', + 'menyerakkan': 'serak', + 'menyerakan': 'serak', + 'terserak': 'serak', + 'terserakan': 'serak', + 'berserakannya': 'serak', + 'serak-serak': 'serak', + 'berserak-serak': 'serak', + 'terserak-serak': 'serak', + 'menyerak-nyerakkan': 'serak', + 'berserama': 'serama', + 'serampangan': 'serampang', + 'serampangannya': 'serampang', + 'terserampang': 'serampang', + 'menyerampang': 'serampang', + 'keserampangan': 'serampang', + 'serampang dua belas': 'serampang', + 'terserampuk': 'serampuk', + 'berseran': 'seran', + 'menyerana': 'serana', + 'menyerandang': 'serandang', + 'terserandung': 'serandung', + 'berseranggung': 'seranggung', + 'menyeranggung': 'seranggung', + 'menyerangsang': 'serangsang', + 'penyeranian': 'serani', + 'menyeranikan': 'serani', + 'penyeranta': 'seranta', + 'menyerantakan': 'seranta', + 'diserap': 'serap', + 'diserapnya': 'serap', + 'serapan': 'serap', + 'serapannya': 'serap', + 'menyerap': 'serap', + 'menyerapnya': 'serap', + 'menyerapkan': 'serap', + 'menyerapan': 'serap', + 'terserap': 'serap', + 'terserapnya': 'serap', + 'penyerap': 'serap', + 'penyerapan': 'serap', + 'penyerapannya': 'serap', + 'menyerapahi': 'serapah', + 'menyeraya': 'seraya', + 'menyerayakan': 'seraya', + 'seraya-menyeraya': 'seraya', + 'serba-serbi': 'serba', + 'serba-serbinya': 'serba', + 'keserbagunaan': 'serbaguna', + 'menyerbak': 'serbak', + 'menyerbakkan': 'serbak', + 'beserban': 'serban', + 'beserbankan': 'serban', + 'menyerbeti': 'serbet', + 'menyerbuk': 'serbuk', + 'menyerbukkan': 'serbuk', + 'menyerbuki': 'serbuk', + 'menyerbukinya': 'serbuk', + 'penyerbukan': 'serbuk', + 'penyerbukannya': 'serbuk', + 'beserdam': 'serdam', + 'beserdawa': 'serdawa', + 'beserdih': 'serdih', + 'terserempak': 'serempak', + 'keserempakan': 'serempak', + 'keserempet': 'serempet', + 'menyerempet': 'serempet', + 'menyerempetnya': 'serempet', + 'menyerempetkan': 'serempet', + 'penyerempet': 'serempet', + 'penyerempetan': 'serempet', + 'terserempet': 'serempet', + 'terserempetnya': 'serempet', + 'menyerendeng': 'serendeng', + 'menyerendengkan': 'serendeng', + 'berserengam': 'serengam', + 'menyerengeh': 'serengeh', + 'berserenjang': 'serenjang', + 'menyerepi': 'serep', + 'menyerepkan': 'serep', + 'menyergah': 'sergah', + 'tesergam': 'sergam', + 'sergapan': 'sergap', + 'sergapannya': 'sergap', + 'tesergap': 'sergap', + 'menyergap': 'sergap', + 'menyergapnya': 'sergap', + 'menyergapi': 'sergap', + 'menyergapan': 'sergap', + 'menyergapku': 'sergap', + 'penyergap': 'sergap', + 'penyergapan': 'sergap', + 'penyergapannya': 'sergap', + 'berseri': 'seri', + 'berserinya': 'seri', + 'menyeri': 'seri', + 'menyerikan': 'seri', + 'perserian': 'seri', + 'berseri-seri': 'seri', + 'serak-serik': 'serik', + 'berserikat': 'serikat', + 'berserikatnya': 'serikat', + 'berserikatkan': 'serikat', + 'menyerikati': 'serikat', + 'perserikatan': 'serikat', + 'menyerikatkan': 'serikat', + 'keserimpet': 'serimpet', + 'menyerimpet': 'serimpet', + 'menyerimpung': 'serimpung', + 'penyerimpung': 'serimpung', + 'terserimpung': 'serimpung', + 'menyerindaikan': 'serindai', + 'menyering': 'sering', + 'menyeringkan': 'sering', + 'sering-sering': 'sering', + 'sering-seringnya': 'sering', + 'sering-seringlah': 'sering', + 'menyeringai': 'seringai', + 'terseringing': 'seringing', + 'menyeringing': 'seringing', + 'menyerit': 'serit', + 'menyeritkan': 'serit', + 'menyerkah': 'serkah', + 'menyerkai': 'serkai', + 'penyerkup': 'serkup', + 'menyerkup': 'serkup', + 'menyerkupkan': 'serkup', + 'teserling': 'serling', + 'menyernak': 'sernak', + 'terserobok': 'serobok', + 'berserobok': 'serobok', + 'menyerobot': 'serobot', + 'menyerobotnya': 'serobot', + 'penyerobot': 'serobot', + 'penyerobotan': 'serobot', + 'serobot-serobotan': 'serobot', + 'serokan': 'serok', + 'menyerok': 'serok', + 'menyeroknya': 'serok', + 'menyeroki': 'serok', + 'terserok': 'serok', + 'penyerok': 'serok', + 'terserompok': 'serompok', + 'terserondok': 'serondok', + 'menyerondol': 'serondol', + 'menyerondong': 'serondong', + 'terserondong': 'serondong', + 'keseronokan': 'seronok', + 'menyeronokkan': 'seronok', + 'menyeropot': 'seropot', + 'menyerosoh': 'serosoh', + 'terserot': 'serot', + 'menyerot': 'serot', + 'menyerotkan': 'serot', + 'menyeroti': 'serot', + 'seroyongan': 'seroyong', + 'serpihan': 'serpih', + 'serpihannya': 'serpih', + 'menyerpih': 'serpih', + 'penyerpihan': 'serpih', + 'peserta': 'serta', + 'pesertanya': 'serta', + 'pesertai': 'serta', + 'pesertaan': 'serta', + 'beserta': 'serta', + 'besertanya': 'serta', + 'besertakan': 'serta', + 'besertai': 'serta', + 'besertaan': 'serta', + 'besertamu': 'serta', + 'penyerta': 'serta', + 'penyertanya': 'serta', + 'penyertakan': 'serta', + 'penyertaan': 'serta', + 'menyertai': 'serta', + 'menyertainya': 'serta', + 'menyertaiku': 'serta', + 'menyertaimu': 'serta', + 'kesertaan': 'serta', + 'kesertaannya': 'serta', + 'penyertaannya': 'serta', + 'menyertakan': 'serta', + 'menyertakannya': 'serta', + 'serta-serta': 'serta', + 'mempesertakan': 'serta', + 'serta-menyertai': 'serta', + 'kesertamertaan': 'serta-merta', + 'penyertifikatan': 'sertifikat', + 'menyertifikatkan': 'sertifikat', + 'menyertu': 'sertu', + 'seruan': 'seru', + 'seruannya': 'seru', + 'seruanku': 'seru', + 'berseru': 'seru', + 'penyeru': 'seru', + 'penyerukan': 'seru', + 'penyeruan': 'seru', + 'menyeru': 'seru', + 'menyerunya': 'seru', + 'menyerukan': 'seru', + 'menyerukannya': 'seru', + 'menyeruan': 'seru', + 'berseru-seru': 'seru', + 'menyeru-nyerukan': 'seru', + 'menyeruak': 'seruak', + 'menyeruaknya': 'seruak', + 'menyeruaklah': 'seruak', + 'menyeruakkan': 'seruak', + 'menyeruakan': 'seruak', + 'penyerudi': 'serudi', + 'berserudi': 'serudi', + 'menyerudi': 'serudi', + 'serudukan': 'seruduk', + 'serudukannya': 'seruduk', + 'keseruduk': 'seruduk', + 'terseruduk': 'seruduk', + 'penyeruduk': 'seruduk', + 'penyerudukan': 'seruduk', + 'menyeruduk': 'seruduk', + 'menyeruduknya': 'seruduk', + 'menyerudukkan': 'seruduk', + 'menyerudukkannya': 'seruduk', + 'menyeruit': 'seruit', + 'bersuling': 'seruling', + 'menyerum': 'serum', + 'terserunda': 'serunda', + 'berserunda': 'serunda', + 'menyerunda': 'serunda', + 'menyerundang': 'serundang', + 'menyeruput': 'seruput', + 'menyeruputnya': 'seruput', + 'serutan': 'serut', + 'serutannya': 'serut', + 'menyerut': 'serut', + 'menyerutnya': 'serut', + 'penyerutan': 'serut', + 'menyeruyuk': 'seruyuk', + 'menyervis': 'servis', + 'tersesak': 'sesak', + 'menyesak': 'sesak', + 'menyesakkan': 'sesak', + 'menyesaki': 'sesak', + 'menyesakan': 'sesak', + 'kesesakan': 'sesak', + 'bersesak-sesak': 'sesak', + 'bersesak-sesakan': 'sesak', + 'sesak-menyesak': 'sesak', + 'sesapan': 'sesap', + 'menyesap': 'sesap', + 'menyesapkan': 'sesap', + 'menyesapi': 'sesap', + 'tersesap': 'sesap', + 'penyesapan': 'sesap', + 'sesaran': 'sesar', + 'menyesar': 'sesar', + 'bersesaran': 'sesar', + 'penyesaran': 'sesar', + 'menyesarkan': 'sesar', + 'bersesat': 'sesat', + 'tersesat': 'sesat', + 'tersesatnya': 'sesat', + 'tersesatkan': 'sesat', + 'kesesatan': 'sesat', + 'kesesatannya': 'sesat', + 'penyesatan': 'sesat', + 'menyesatkan': 'sesat', + 'menyesatkannya': 'sesat', + 'menyeser': 'seser', + 'sesuai': 'suai', + 'sesuainya': 'suai', + 'sesuailah': 'suai', + 'sesuaikan': 'suai', + 'sesuaii': 'suai', + 'sesuaian': 'suai', + 'bersuai': 'suai', + 'bersuaian': 'suai', + 'bersesuai': 'suai', + 'bersesuaian': 'suai', + 'kesesuaian': 'suai', + 'kesesuaiannya': 'suai', + 'penyesuaian': 'suai', + 'penyesuaiannya': 'suai', + 'penyesuaianlah': 'suai', + 'persesuaian': 'suai', + 'persesuaiannya': 'suai', + 'menyesuaikan': 'suai', + 'menyesuaikannya': 'suai', + 'menyesuaikanlah': 'suai', + 'menyesuaikankan': 'suai', + 'tersesuaikan': 'suai', + 'berkesesuaian': 'suai', + 'sesuatu': 'suatu', + 'sesuatunya': 'suatu', + 'sesuatulah': 'suatu', + 'bersuatu': 'suatu', + 'mempersuatukan': 'suatu', + 'sesudah': 'sudah', + 'sesudahnya': 'sudah', + 'sesudahmu': 'sudah', + 'bersudah': 'sudah', + 'penyudah': 'sudah', + 'penyudahan': 'sudah', + 'menyudahi': 'sudah', + 'menyudahinya': 'sudah', + 'kesudahan': 'sudah', + 'kesudahannya': 'sudah', + 'mempersudah': 'sudah', + 'menyudahkan': 'sudah', + 'sesudah-sudah': 'sudah', + 'bersudah-sudah': 'sudah', + 'sesudah-sudahnya': 'sudah', + 'berkesudahan': 'sudah', + 'sungguhan': 'sungguh', + 'sungguhannya': 'sungguh', + 'kesungguhan': 'sungguhan', + 'kesungguhannya': 'sungguhan', + 'menyungguhi': 'sungguh', + 'sesungguhnya': 'sungguhan', + 'sesungguhnyalah': 'sungguhan', + 'penyungguhan': 'sungguhan', + 'menyungguhkan': 'sungguhan', + 'berkesungguhan': 'sungguh', + 'mempersungguhi': 'sungguh', + 'sungguh-sungguh': 'sungguhan', + 'sungguh-sungguhnya': 'sungguhan', + 'bersungguh-sungguh': 'sungguhan', + 'bersungguh-sungguhlah': 'sungguhan', + 'menyungguh-nyungguhi': 'sungguh', + 'pengeset': 'set', + 'pengesetan': 'set', + 'tersetai-setai': 'setai', + 'bersetai-setai': 'setai', + 'setakat': 'takat', + 'menyetan': 'setan', + 'persetan': 'setan', + 'kesetanan': 'setan', + 'kesetanannya': 'setan', + 'mempersetan': 'setan', + 'mempersetankan': 'setan', + 'setara': 'tara', + 'setaranya': 'tara', + 'setaralah': 'tara', + 'setarakan': 'tara', + 'setaraan': 'tara', + 'tertara': 'tara', + 'bertara': 'tara', + 'menarakan': 'tara', + 'penyetara': 'tara', + 'penyetarakan': 'tara', + 'penyetaraan': 'tara', + 'menyetarakan': 'tara', + 'menyetarakannya': 'tara', + 'setekan': 'setek', + 'setelan': 'setel', + 'setelannya': 'setel', + 'menyetel': 'setel', + 'menyetelnya': 'setel', + 'menyetelkan': 'setel', + 'penyetelan': 'setel', + 'penyetelannya': 'setel', + 'bersetelan': 'setel', + 'menyetel-nyetel': 'setel', + 'penelah': 'telah', + 'penelahan': 'telah', + 'menelah': 'telah', + 'menelahan': 'telah', + 'setelah': 'telah', + 'setelahnya': 'telah', + 'setelahkan': 'telah', + 'setelahi': 'telah', + 'menyetelengkan': 'seteleng', + 'seteman': 'setem', + 'menyetem': 'setem', + 'penyeteman': 'setem', + 'setengah': 'tengah', + 'setengahnya': 'tengah', + 'setengahlah': 'tengah', + 'setengahnyalah': 'tengah', + 'menengah': 'tengah', + 'menengahnya': 'tengah', + 'menengahkan': 'tengah', + 'menengahi': 'tengah', + 'tengahan': 'tengah', + 'tengahannya': 'tengah', + 'penengah': 'tengah', + 'penengahnya': 'tengah', + 'penengahan': 'tengah', + 'menengahinya': 'tengah', + 'pertengahan': 'tengah', + 'pertengahannya': 'tengah', + 'mengetengahi': 'tengah', + 'mengetengahkan': 'tengah', + 'setengah-setengah': 'tengah', + 'kesetiakawanan': 'setia kawan', + 'kesetiakawanannya': 'setia kawan', + 'kesetiakawananan': 'setia kawan', + 'bersetia': 'setia', + 'kesetiaan': 'setia', + 'kesetiaannya': 'setia', + 'kesetiaanku': 'setia', + 'setiba': 'tiba', + 'setibanya': 'tiba', + 'setikan': 'setik', + 'setikannya': 'setik', + 'menyetik': 'setik', + 'timpalan': 'timpal', + 'timpalannya': 'timpal', + 'setimpal': 'timpal', + 'menimpali': 'timpal', + 'menimpalinya': 'timpal', + 'menyetip': 'setip', + 'setopan': 'setop', + 'penyetop': 'setop', + 'penyetopan': 'setop', + 'menyetop': 'setop', + 'menyetopnya': 'setop', + 'menyetopkan': 'setop', + 'menyetopmu': 'setop', + 'setoran': 'setor', + 'setorannya': 'setor', + 'setoranlah': 'setor', + 'menyetor': 'setor', + 'menyetornya': 'setor', + 'menyetorkan': 'setor', + 'menyetorkannya': 'setor', + 'penyetor': 'setor', + 'penyetornya': 'setor', + 'penyetorkan': 'setor', + 'penyetoran': 'setor', + 'penyetorannya': 'setor', + 'setrapan': 'setrap', + 'menyetrap': 'strap', + 'penyetrapan': 'setrap', + 'setrikaan': 'setrika', + 'bersetrika': 'setrika', + 'menyetrika': 'setrika', + 'menyetrikanya': 'setrika', + 'menyetrikakan': 'setrika', + 'penyetrika': 'setrika', + 'penyetrikaan': 'setrika', + 'bersetrip': 'setrip', + 'menyetrip': 'setrip', + 'penyetripan': 'setrip', + 'kesetrum': 'setrum', + 'tersetrum': 'setrum', + 'tersetrumnya': 'setrum', + 'menyetrum': 'setrum', + 'menyetrumnya': 'setrum', + 'menyetrumkan': 'setrum', + 'menyetrumku': 'setrum', + 'penyetruman': 'setrum', + 'menyetui': 'setu', + 'menyetum': 'setum', + 'penyetuman': 'setum', + 'menyetup': 'setup', + 'bersewaka': 'sewaka', + 'menyewat': 'sewat', + 'sewot-sewotan': 'sewot', + 'sia-sia': 'sia', + 'sia-sianya': 'sia', + 'sia-sialah': 'sia', + 'sia-siakan': 'sia', + 'tersia-sia': 'sia-sia', + 'tersia-siakan': 'sia-sia', + 'bersia-sia': 'sia-sia', + 'kesia-siaan': 'sia-sia', + 'menyia-nyiakan': 'sia-sia', + 'menyia-nyiakannya': 'sia-sia', + 'bersiaga': 'siaga', + 'bersiaganya': 'siaga', + 'bersiagalah': 'siaga', + 'kesiagaan': 'siaga', + 'kesiagaannya': 'siaga', + 'menyiagakan': 'siaga', + 'tersiah': 'siah', + 'bersiah': 'siah', + 'menyiah': 'siah', + 'menyiahkan': 'siah', + 'sesiak': 'siak', + 'bersiakon': 'siakon', + 'sialan': 'sial', + 'kesialan': 'sial', + 'kesialannya': 'sial', + 'menyialkan': 'sial', + 'bersialang': 'sialang', + 'bersiap sedia': 'siap sedia', + 'kesiapsiagaan': 'siap siaga', + 'kesiapsiagaannya': 'siap siaga', + 'siapa-siapa': 'siapa', + 'siapa-siapanya': 'siapa', + 'menyiat': 'siat', + 'menyiatkan': 'siat', + 'menyibak': 'sibak', + 'menyibaknya': 'sibak', + 'menyibakkan': 'sibak', + 'menyibakan': 'sibak', + 'bersibak': 'sibak', + 'menyibak-nyibak': 'sibak', + 'sesibar': 'sibar', + 'bersibar': 'sibar', + 'bersibaran': 'sibar', + 'sibar-sibar': 'sibar', + 'sibiran': 'sibir', + 'sesibir': 'sibir', + 'menyibuk': 'sibuk', + 'menyibukkan': 'sibuk', + 'menyibukkannya': 'sibuk', + 'menyibukan': 'sibuk', + 'bersibuk': 'sibuk', + 'kesibukan': 'sibuk', + 'kesibukannya': 'sibuk', + 'kesibukanlah': 'sibuk', + 'kesibukanku': 'sibuk', + 'kesibukanmu': 'sibuk', + 'menyibur': 'sibur', + 'sibur-sibur': 'sibur', + 'sida-sida': 'sida', + 'menyidik': 'sidik', + 'menyidiknya': 'sidik', + 'menyidiki': 'sidik', + 'menyidikan': 'sidik', + 'penyidik': 'sidik', + 'penyidiknya': 'sidik', + 'penyidiklah': 'sidik', + 'penyidikkan': 'sidik', + 'penyidikkannya': 'sidik', + 'penyidiki': 'sidik', + 'penyidikan': 'sidik', + 'penyidikannya': 'sidik', + 'penyidikanlah': 'sidik', + 'bersiduga': 'siduga', + 'menyiduk': 'siduk', + 'menyiduknya': 'siduk', + 'disigai': 'sigai', + 'menyigai': 'sigai', + 'bersigai': 'sigai', + 'bersigap': 'sigap', + 'kesigapan': 'sigap', + 'kesigapannya': 'sigap', + 'menyigapkan': 'sigap', + 'menyigar': 'sigar', + 'penyigi': 'sigi', + 'penyigian': 'sigi', + 'menyigi': 'sigi', + 'bersikap': 'sikap', + 'bersikapnya': 'sikap', + 'bersikaplah': 'sikap', + 'menyikap': 'sikap', + 'menyikapnya': 'sikap', + 'menyikapi': 'sikap', + 'menyikapinya': 'sikap', + 'penyikat': 'sikat', + 'penyikatan': 'sikat', + 'menyikat': 'sikat', + 'menyikatnya': 'sikat', + 'menyikatkan': 'sikat', + 'menyikati': 'sikat', + 'bersikudidi': 'sikudidi', + 'sikutan': 'sikut', + 'sikutannya': 'sikut', + 'tersikut': 'sikut', + 'menyikut': 'sikut', + 'menyikutnya': 'sikut', + 'menyikuti': 'sikut', + 'menyikutku': 'sikut', + 'bersikutan': 'sikut', + 'sikut-sikutan': 'sikut', + 'bersikut-sikutan': 'sikut', + 'silahkan': 'silah', + 'silahkanlah': 'silah', + 'silah-silah': 'silah', + 'tersilam': 'silam', + 'menyilam': 'silam', + 'menyilamkan': 'silam', + 'penyilap': 'silap', + 'bersilap': 'silap', + 'menyilap': 'silap', + 'pesilat': 'silat', + 'pesilatnya': 'silat', + 'bersilat': 'silat', + 'menyilat': 'silat', + 'persilatan': 'silat', + 'bersilaturahmi': 'silaturahmi', + 'bersilengah': 'silengah', + 'menyilet': 'silet', + 'menyiletkannya': 'silet', + 'menyileti': 'silet', + 'penyiletan': 'silet', + 'silihan': 'silih', + 'bersilih': 'silih', + 'menyilih': 'silih', + 'penyilihan': 'silih', + 'persilihan': 'silih', + 'menyilik': 'silik', + 'siliran': 'silir', + 'silir-semilir': 'silir', + 'bersilir-silir': 'silir', + 'menyilukan': 'silu', + 'menyimak': 'simak', + 'menyimaknya': 'simak', + 'bersimbang': 'simbang', + 'menyimbang': 'simbang', + 'menyimbangkan': 'simbang', + 'menyimbangi': 'simbang', + 'tersimbur': 'simbur', + 'menyimbur': 'simbur', + 'bersimbur': 'simbur', + 'menyimburi': 'simbur', + 'menyimburkan': 'simbur', + 'bersimbur-simburan': 'simbur', + 'bersimpai': 'simpai', + 'tersimpai': 'simpai', + 'menyimpai': 'simpai', + 'menyimpaikan': 'simpai', + 'simpangan': 'simpang', + 'simpangannya': 'simpang', + 'menyimpang': 'simpang', + 'menyimpangnya': 'simpang', + 'menyimpangkan': 'simpang', + 'menyimpangi': 'simpang', + 'menyimpangan': 'simpang', + 'bersimpang': 'simpang', + 'bersimpangan': 'simpang', + 'persimpangan': 'simpang', + 'persimpangannya': 'simpang', + 'penyimpangan': 'simpang', + 'penyimpangannya': 'simpang', + 'bersimpang siur': 'simpang siur', + 'kesimpangsiuran': 'simpang siur', + 'kesimpangsiurannya': 'simpang siur', + 'kesimpatan': 'simpat', + 'bersimpati': 'simpati', + 'kesimpatikan': 'simpatik', + 'menyimpirkan': 'simpir', + 'bersimpuh': 'simpuh', + 'bersimpuhlah': 'simpuh', + 'tersimpuh': 'simpuh', + 'menyimpuk': 'simpuk', + 'menyimpukan': 'simpuk', + 'menyimulasi': 'simulasi', + 'menyimulasikan': 'simulasi', + 'menyimulasikannya': 'simulasi', + 'bersinau-sinau': 'sinau', + 'pesinden': 'sinden', + 'menyinden': 'sinden', + 'bersinergi': 'sinergi', + 'bersinerginya': 'sinergi', + 'bersinergilah': 'sinergi', + 'bersinergii': 'sinergi', + 'mengnyinergikan': 'sinergi', + 'bersinetron': 'sinetron', + 'penyinetronan': 'sinetron', + 'menyinetronkan': 'sinetron', + 'tersingahak': 'singahak', + 'singgahan': 'singgah', + 'bersinggah': 'singgah', + 'bersinggahnya': 'singgah', + 'menyinggahi': 'singgah', + 'menyinggahinya': 'singgah', + 'persinggahan': 'singgah', + 'persinggahannya': 'singgah', + 'mempersinggah': 'singgah', + 'menyinggahkan': 'singgah', + 'singgah-menyinggah': 'singgah', + 'menyinggang': 'singgang', + 'menyinggir': 'singgir', + 'menyinggirkan': 'singgir', + 'menyinggit': 'singgit', + 'bersinggit': 'singgit', + 'menyinggul': 'singgul', + 'menyingit': 'singit', + 'tersingit': 'singit', + 'singkapan': 'singkap', + 'tersingkap': 'singkap', + 'tersingkapnya': 'singkap', + 'tersingkaplah': 'singkap', + 'tersingkapkan': 'singkap', + 'menyingkap': 'singkap', + 'menyingkapnya': 'singkap', + 'menyingkapkan': 'singkap', + 'menyingkapi': 'singkap', + 'singkatan': 'singkat', + 'singkatannya': 'singkat', + 'penyingkat': 'singkat', + 'penyingkatan': 'singkat', + 'menyingkat': 'singkat', + 'menyingkatnya': 'singkat', + 'menyingkatkan': 'singkat', + 'menyingkur': 'singkur', + 'menyingsatkan': 'singsat', + 'penyingset': 'singset', + 'penyingsetan': 'singset', + 'menyingsetkan': 'singset', + 'sinian': 'sini', + 'ke sini': 'sini', + 'kesinian': 'sini', + 'mengesinikan': 'sini', + 'menyinkronkan': 'sinkron', + 'menyinkronkannya': 'sinkron', + 'kesinoniman': 'sinonim', + 'penyinrili': 'sinrili', + 'menyinter': 'sinter', + 'penyinteran': 'sinter', + 'menyintesis': 'sintesis', + 'menyintesiskan': 'sintesis', + 'kesintingan': 'sinting', + 'kesintingannya': 'sinting', + 'menyintuk': 'sintuk', + 'bersintuk': 'sintuk', + 'menyintukkan': 'sintuk', + 'menyintung': 'sintung', + 'mensinyalir': 'sinyalir', + 'mensinyalirkan': 'sinyalir', + 'sipatan': 'sipat', + 'menyipat': 'sipat', + 'menyipati': 'sipat', + 'penyipatan': 'sipat', + 'menyipatkan': 'sipat', + 'menyipi': 'sipi', + 'tersipi': 'sipi', + 'menyipitkan': 'sipit', + 'menyipitkannya': 'sipit', + 'tersipu': 'sipu', + 'kesipuan': 'sipu', + 'tersipu-sipu': 'sipu', + 'kesipu-sipuan': 'sipu', + 'mengesir': 'sir', + 'sir-siran': 'sir', + 'tersirah': 'sirah', + 'siraman': 'siram', + 'siramannya': 'siram', + 'menyiram': 'siram', + 'menyiramnya': 'siram', + 'menyiramkan': 'siram', + 'menyiramkannya': 'siram', + 'menyirami': 'siram', + 'menyiraman': 'siram', + 'bersiram': 'siram', + 'penyiram': 'siram', + 'penyiraman': 'siram', + 'menyiraminya': 'siram', + 'pesiraman': 'siram', + 'penyiramannya': 'siram', + 'persiraman': 'siram', + 'tersirap': 'sirap', + 'menyirapkan': 'sirap', + 'siratan': 'sirat', + 'menyirat': 'sirat', + 'menyiratkan': 'sirat', + 'menyirati': 'sirat', + 'tersirat': 'sirat', + 'tersiratnya': 'sirat', + 'tersiratkan': 'sirat', + 'sirat-sirat': 'sirat', + 'kesirep': 'sirep', + 'penyirep': 'sirep', + 'menyirep': 'sirep', + 'tersirep': 'sirep', + 'menyirepi': 'sirep', + 'penyirepan': 'sirep', + 'penyirih': 'sirih', + 'menyirih': 'sirih', + 'menyirihi': 'sirih', + 'penyirihan': 'sirih', + 'menyirihkan': 'sirih', + 'sirikan': 'sirik', + 'menyirik': 'sirik', + 'menyirikan': 'sirik', + 'kesirikan': 'sirik', + 'menyirnakan': 'sirna', + 'bersiru': 'siru', + 'tersisa': 'sisa', + 'tersisanya': 'sisa', + 'tersisalah': 'sisa', + 'tersisakan': 'sisa', + 'tersisai': 'sisa', + 'bersisa': 'sisa', + 'bersisakan': 'sisa', + 'menyisai': 'sisa', + 'menyisakan': 'sisa', + 'menyisakannya': 'sisa', + 'bersisalak': 'sisalak', + 'bersisi': 'sisi', + 'bersisikan': 'sisik', + 'bersisian': 'sisi', + 'ke sisi': 'sisi', + 'menyisi': 'sisi', + 'menyisikan': 'sisik', + 'mengesisikan': 'sisi', + 'menyisik': 'sisik', + 'bersisik': 'sisik', + 'menyisiki': 'sisik', + 'menyisir': 'sisir', + 'menyisirnya': 'sisir', + 'menyisirlah': 'sisir', + 'menyisiri': 'sisir', + 'menyisiran': 'sisir', + 'bersisir': 'sisir', + 'kesisiran': 'sisir', + 'bersistem': 'sistem', + 'penyisteman': 'sistem', + 'menyistemkan': 'sistem', + 'bersisurut': 'sisurut', + 'sitaan': 'sita', + 'sitaannya': 'sita', + 'menyita': 'sita', + 'menyitanya': 'sita', + 'menyitai': 'sita', + 'penyita': 'sita', + 'penyitaan': 'sita', + 'penyitaannya': 'sita', + 'menyitat': 'sitat', + 'siteran': 'siter', + 'menyitir': 'sitir', + 'menyiuk': 'siuk', + 'siulan': 'siul', + 'siulannya': 'siul', + 'bersiul': 'siul', + 'bersiulan': 'siul', + 'menyiulkan': 'siul', + 'siungan': 'siung', + 'bersiung': 'siung', + 'berkesiuran': 'siur', + 'berskala': 'skala', + 'menskedulkan': 'skedul', + 'menskemakan': 'skema', + 'menskenariokan': 'skenario', + 'mensketsa': 'sketsa', + 'menskor': 'skor', + 'penskoran': 'skor', + 'penskorannya': 'skor', + 'menskors': 'skors', + 'menskorsnya': 'skors', + 'penskorsan': 'skors', + 'mensmokel': 'smokel', + 'bersoal': 'soal', + 'bersoalan': 'soal', + 'menyoal': 'soal', + 'menyoalkan': 'soal', + 'menyoalkannya': 'soal', + 'persoalan': 'soal', + 'persoalannya': 'soal', + 'persoalankan': 'soal', + 'persoalanan': 'soal', + 'persoalanmu': 'soal', + 'mempersoalkan': 'soal', + 'mempersoalkannya': 'soal', + 'bersobat': 'sobat', + 'menyobat': 'sobat', + 'menyobati': 'sobat', + 'persobatan': 'sobat', + 'sesobek': 'sobek', + 'sobekan': 'sobek', + 'sobekannya': 'sobek', + 'menyobek': 'sobek', + 'menyobeknya': 'sobek', + 'menyobeki': 'sobek', + 'penyobekan': 'sobek', + 'sobek-sobekan': 'sobek', + 'menyobek-nyobek': 'sobek', + 'menyobek-nyobeknya': 'sobek', + 'tersobok': 'sobok', + 'bersobok': 'sobok', + 'soda kristal': 'soda kue', + 'sodetan': 'sodet', + 'sodetannya': 'sodet', + 'menyodet': 'sodet', + 'penyodetan': 'sodet', + 'penyodok': 'sodok', + 'penyodokan': 'sodok', + 'menyodok': 'sodok', + 'menyodoknya': 'sodok', + 'menyodokkan': 'sodok', + 'menyodokan': 'sodok', + 'sodok-sodokan': 'sodok', + 'menyodomi': 'sodomi', + 'menyodominya': 'sodomi', + 'penyodomi': 'sodomi', + 'sodoran': 'sodor', + 'sodorannya': 'sodor', + 'menyodorkan': 'sodor', + 'menyodorkannya': 'sodor', + 'menyoga': 'soga', + 'kesohor': 'sohor', + 'kesohoran': 'sohor', + 'tersohor': 'sohor', + 'tersohornya': 'sohor', + 'menyoja': 'soja', + 'bersoja': 'soja', + 'tersoja-soja': 'soja', + 'bersokom': 'sokom', + 'menyokom': 'sokom', + 'menyokomkan': 'sokom', + 'bersol': 'sol', + 'mengesol': 'sol', + 'mengesolkan': 'sol', + 'menyolang': 'solang', + 'menyolder': 'solder', + 'menyolidkan': 'solid', + 'pesolok': 'solok', + 'penyolok': 'solok', + 'mengesom': 'som', + 'menyombol': 'sombol', + 'tersomplok': 'somplok', + 'bersomplokan': 'somplok', + 'tersompok': 'sompok', + 'menyondang': 'sondang', + 'penyondong': 'sondong', + 'menyondong': 'sondong', + 'menyondongkan': 'sondong', + 'tersongel': 'songel', + 'menyongket': 'songket', + 'menyongketkan': 'songket', + 'bersongkok': 'songkok', + 'menyongsong': 'songsong', + 'menyongsongnya': 'songsong', + 'menyongsongkan': 'songsong', + 'menyongsongmu': 'songsong', + 'bersongsong': 'songsong', + 'songsong arus': 'songsong', + 'sontekan': 'sontek', + 'sontekannya': 'sontek', + 'menyontek': 'sontek', + 'menyonteknya': 'sontek', + 'menyontekkan': 'sontek', + 'menyontekan': 'sontek', + 'menyontok': 'sontok', + 'kesopansantunan': 'sopan santun', + 'bersopan santun': 'sopan santun', + 'menyopir': 'sopir', + 'menyopiri': 'sopir', + 'menyopirinya': 'sopir', + 'bersorak-sorai': 'sorak-sorai', + 'sorangan': 'sorang', + 'kesorangan': 'sorang', + 'kesorean': 'sore', + 'tersoren': 'soren', + 'sorogan': 'sorog', + 'sorongan': 'sorong', + 'menyorong': 'sorong', + 'menyorongkan': 'sorong', + 'menyorongkannya': 'sorong', + 'tersorong': 'sorong', + 'menyorong-nyorongkan': 'sorong', + 'sortiran': 'sortir', + 'penyortir': 'sortir', + 'penyortiran': 'sortir', + 'menyortir': 'sortir', + 'menyortirnya': 'sortir', + 'kesosialan': 'sosial', + 'kesosialannya': 'sosial', + 'bersosialisasi': 'sosialisasi', + 'bersosialisasinya': 'sosialisasi', + 'bersosialisasilah': 'sosialisasi', + 'bersosialisasikan': 'sosialisasi', + 'mensosialisasikan': 'sosialisasi', + 'mensosialisasikannya': 'sosialisasi', + 'sosohan': 'sosoh', + 'penyosoh': 'sosoh', + 'penyosohan': 'sosoh', + 'bersosoh': 'sosoh', + 'menyosoh': 'sosoh', + 'penyosohannya': 'sosoh', + 'menyosok': 'sosok', + 'menyosokkan': 'sosok', + 'bersosok': 'sosok', + 'menyosor': 'sosor', + 'menyosorkan': 'sosor', + 'persotoan': 'soto', + 'menyoyak': 'soyak', + 'menyoyaknyoyak': 'soyak', + 'berspekulasi': 'spekulasi', + 'berspekulasilah': 'spekulasi', + 'menspekulasikan': 'spekulasi', + 'berspesialisasi': 'spesialisasi', + 'menspion': 'spion', + 'mensponsori': 'sponsor', + 'mensponsorinya': 'sponsor', + 'pensponsoran': 'sponsor', + 'sponsor-sponsoran': 'sponsor', + 'kespontanan': 'spontan', + 'kesportifan': 'sportif', + 'kestabilan': 'stabil', + 'kestabilannya': 'stabil', + 'penstabilan': 'stabil', + 'penstabilannya': 'stabil', + 'menstabilkan': 'stabil', + 'menstabilkannya': 'stabil', + 'penstandaran': 'standar', + 'menstandarkan': 'standar', + 'menstarter': 'starter', + 'menstarternya': 'starter', + 'menstarterkan': 'starter', + 'berstatus': 'status', + 'berstatusnya': 'status', + 'berstatuskan': 'status', + 'menstempel': 'stempel', + 'berstempel': 'stempel', + 'kesterilan': 'steril', + 'kesterilannya': 'steril', + 'pensterilan': 'steril', + 'mensterilkan': 'steril', + 'mensterilkannya': 'steril', + 'menstilir': 'stilir', + 'menstimulasi': 'stimulasi', + 'menstimulasinya': 'stimulasi', + 'menstimulasikan': 'stimulasi', + 'menstimulasikannya': 'stimulasi', + 'berstrata': 'strata', + 'penstrataan': 'strata', + 'menstratakan': 'strata', + 'terstruktur': 'struktur', + 'terstrukturnya': 'struktur', + 'terstrukturi': 'struktur', + 'berstruktur': 'struktur', + 'berstrukturkan': 'struktur', + 'penstrukturan': 'struktur', + 'menstrukturkan': 'struktur', + 'bersua': 'sua', + 'bersuanya': 'sua', + 'menyua': 'sua', + 'menyuai': 'sua', + 'tersua': 'sua', + 'persuaan': 'sua', + 'mempersuakan': 'sua', + 'menyuak': 'suak', + 'menyuaki': 'suak', + 'menyuakakan': 'suaka', + 'suam-suam': 'suam', + 'bersuami': 'suami', + 'bersuamikan': 'suami', + 'mempersuami': 'suami', + 'mempersuamikan': 'suami', + 'suang-suang': 'suang', + 'sesuang-suang': 'suang', + 'menyuar': 'suar', + 'menyuarkan': 'suar', + 'menyuaran': 'suar', + 'bersuar': 'suar', + 'bersuaran': 'suar', + 'tersuar': 'suar', + 'bersuara': 'suara', + 'bersuaranya': 'suara', + 'bersuaralah': 'suara', + 'penyuaraan': 'suara', + 'menyuarakan': 'suara', + 'menyuarakannya': 'suara', + 'menyuarangkan': 'suarang', + 'menyuasanai': 'suasana', + 'menyubal': 'subal', + 'menyubang': 'subang', + 'menyubangkan': 'subang', + 'bersubang': 'subang', + 'menyublim': 'sublim', + 'penyubliman': 'sublim', + 'menyubordinasikan': 'subordinasi', + 'menyubsider': 'subsider', + 'bersubsidi': 'subsidi', + 'bersubsidinya': 'subsidi', + 'tersubstitusikan': 'substitusi', + 'menyubversikan': 'subversi', + 'penyuci hama': 'suci hama', + 'menyucihamakan': 'suci hama', + 'menyudet': 'sudet', + 'menyudi': 'sudi', + 'kesudian': 'sudi', + 'menyudikan': 'sudi', + 'bersudikan': 'sudi', + 'mempersudikan': 'sudi', + 'menyudip': 'sudip', + 'menyudu': 'sudu', + 'menyudukan': 'sudu', + 'tersudu': 'sudu', + 'sudu-sudu': 'sudu', + 'sudung-sudung': 'sudung', + 'menyudut': 'sudut', + 'menyudutnya': 'sudut', + 'menyudutkan': 'sudut', + 'menyudutkannya': 'sudut', + 'tersudut': 'sudut', + 'tersudutnya': 'sudut', + 'tersudutkan': 'sudut', + 'menyudutkanku': 'sudut', + 'kesufian': 'sufi', + 'menyugar': 'sugar', + 'pesugi': 'sugi', + 'pesugian': 'sugi', + 'menyugi': 'sugi', + 'bersugi': 'sugi', + 'sugi-sugi': 'sugi', + 'suguhan': 'suguh', + 'suguhannya': 'suguh', + 'tersuguh': 'suguh', + 'tersuguhlah': 'suguh', + 'tersuguhkan': 'suguh', + 'tersuguhkannya': 'suguh', + 'tersuguhi': 'suguh', + 'menyuguhi': 'suguh', + 'menyuguhinya': 'suguh', + 'menyuguhkan': 'suguh', + 'menyuguhkannya': 'suguh', + 'menyugun': 'sugun', + 'menyugunkan': 'sugun', + 'bersuh': 'suh', + 'suitan': 'suit', + 'bersuit': 'suit', + 'sujian': 'suji', + 'menyuji': 'suji', + 'menyujikan': 'suji', + 'bersuji': 'suji', + 'bersujud': 'sujud', + 'bersujudlah': 'sujud', + 'tersujud': 'sujud', + 'bersukacita': 'sukacita', + 'bersukacitalah': 'sukacita', + 'bersukaria': 'sukaria', + 'kesuksesan': 'sukses', + 'kesuksesannya': 'sukses', + 'kesuksesanku': 'sukses', + 'kesuksesanmu': 'sukses', + 'menyukseskan': 'sukses', + 'menyukseskannya': 'sukses', + 'menyulang': 'sulang', + 'menyulangi': 'sulang', + 'menyulangkan': 'sulang', + 'bersulang-sulang': 'sulang', + 'sulang-menyulang': 'sulang', + 'menyulih': 'sulih', + 'menyulihi': 'sulih', + 'kesultanan': 'sultan', + 'kesultanannya': 'sultan', + 'pesuluh': 'suluh', + 'menyuluh': 'suluh', + 'menyuluhi': 'suluh', + 'bersuluh': 'suluh', + 'penyuluh': 'suluh', + 'penyuluhnya': 'suluh', + 'penyuluhlah': 'suluh', + 'penyuluhan': 'suluh', + 'penyuluhannya': 'suluh', + 'bersuluhkan': 'suluh', + 'bersuluk': 'suluk', + 'bersulur': 'sulur', + 'menyulur': 'sulur', + 'menyulurkan': 'sulur', + 'sulur-suluran': 'sulur', + 'menyulut': 'sulut', + 'menyulutnya': 'sulut', + 'menyulutkan': 'sulut', + 'menyulutkannya': 'sulut', + 'menyuluti': 'sulut', + 'menyumba': 'sumba', + 'menyumbakan': 'sumba', + 'sumbangan': 'sumbang', + 'sumbangannya': 'sumbang', + 'sumbangankan': 'sumbang', + 'menyumbang': 'sumbang', + 'menyumbangnya': 'sumbang', + 'menyumbanglah': 'sumbang', + 'menyumbangkan': 'sumbang', + 'menyumbangkannya': 'sumbang', + 'menyumbangan': 'sumbang', + 'penyumbang': 'sumbang', + 'penyumbangnya': 'sumbang', + 'penyumbangan': 'sumbang', + 'sesumbar': 'sumbar', + 'sesumbarnya': 'sumbar', + 'sesumbar-mu': 'sumbar', + 'bersumbar': 'sumbar', + 'menyumbar': 'sumbar', + 'sumbatan': 'sumbat', + 'sumbatannya': 'sumbat', + 'tersumbat': 'sumbat', + 'tersumbatnya': 'sumbat', + 'tersumbatkan': 'sumbat', + 'penyumbat': 'sumbat', + 'penyumbatnya': 'sumbat', + 'penyumbatan': 'sumbat', + 'menyumbat': 'sumbat', + 'menyumbatnya': 'sumbat', + 'menyumbatan': 'sumbat', + 'penyumbatannya': 'sumbat', + 'bersumber': 'sumber', + 'bersumberkan': 'sumber', + 'menyumbi': 'sumbi', + 'bersumbu': 'sumbu', + 'menyumbui': 'sumbu', + 'persumbuan': 'sumbu', + 'menyumbur': 'sumbur', + 'menyumburkan': 'sumbur', + 'menyumirkan': 'sumir', + 'pesumo': 'sumo', + 'tersumpal': 'sumpal', + 'menyumpal': 'sumpal', + 'menyumpalnya': 'sumpal', + 'menyumpalkan': 'sumpal', + 'menyumpalkannya': 'sumpal', + 'kesumpekan': 'sumpek', + 'sumpitan': 'sumpit', + 'menyumpit': 'sumpit', + 'tersumpit': 'sumpit', + 'penyumpit': 'sumpit', + 'penyumpitan': 'sumpit', + 'sumpit-sumpit': 'sumpit', + 'menyumsum': 'sumsum', + 'sumuran': 'sumur', + 'bersumur': 'sumur', + 'mengesun': 'sun', + 'disunahkan': 'sunah', + 'menyunahkan': 'sunah', + 'menyunam': 'sunam', + 'menyunamkan': 'sunam', + 'kesunanan': 'sunan', + 'tersundak': 'sundak', + 'menyundak': 'sundak', + 'sundukan': 'sunduk', + 'menyunduk': 'sunduk', + 'menyunduki': 'sunduk', + 'sundulan': 'sundul', + 'sundulannya': 'sundul', + 'sundulanku': 'sundul', + 'sundulanmu': 'sundul', + 'tersundul': 'sundul', + 'penyundul': 'sundul', + 'menyundul': 'sundul', + 'menyundulnya': 'sundul', + 'menyundulkan': 'sundul', + 'menyundulku': 'sundul', + 'penyundulan': 'sundul', + 'menyundut': 'sundut', + 'menyundutnya': 'sundut', + 'menyundutkan': 'sundut', + 'bersundut': 'sundut', + 'penyundut': 'sundut', + 'penyundutan': 'sundut', + 'sundut-bersundut': 'sundut', + 'menyungga': 'sungga', + 'menyunggi': 'sunggi', + 'menyungginya': 'sunggi', + 'penyungging': 'sungging', + 'menyungging': 'sungging', + 'menyunggingkan': 'sungging', + 'tersungging': 'sungging', + 'penyunggingan': 'sungging', + 'menyunggit': 'sunggit', + 'sungguhpun': 'sungguhan', + 'menyungkah': 'sungkah', + 'menyungkahkan': 'sungkah', + 'kesungkanan': 'sungkan', + 'tersungkap': 'sungkap', + 'bersungkawa': 'sungkawa', + 'menyungkem': 'sungkem', + 'menyungkit': 'sungkit', + 'bersungkit': 'sungkit', + 'tersungkuk': 'sungkuk', + 'tersungkuk-sungkuk': 'sungkuk', + 'menyungkum': 'sungkum', + 'tersungkum': 'sungkum', + 'menyungsang': 'sungsang', + 'menyungsangkan': 'sungsang', + 'tersunjam': 'sunjam', + 'menyuntih': 'suntih', + 'tersuntuk': 'suntuk', + 'kesuntukan': 'suntuk', + 'menyunu': 'sunu', + 'kesunyataan': 'sunyata', + 'penyuplai': 'suplai', + 'penyuplainya': 'suplai', + 'penyuplaian': 'suplai', + 'menyuplai': 'suplai', + 'menyuplainya': 'suplai', + 'supletoar': 'suplir', + 'persuratkabaran': 'surat kabar', + 'suri teladan': 'suri', + 'bersurih': 'surih', + 'menyurih': 'surih', + 'menyurihkan': 'surih', + 'surukan': 'suruk', + 'tersuruk': 'suruk', + 'menyuruk': 'suruk', + 'menyurukkan': 'suruk', + 'menyurukan': 'suruk', + 'menyuruki': 'suruk', + 'bersurukan': 'suruk', + 'suruk-surukan': 'suruk', + 'tersuruk-suruk': 'suruk', + 'menyuruk-nyuruk': 'suruk', + 'bersuruk-surukan': 'suruk', + 'kesurupan': 'surup', + 'kesurupannya': 'surup', + 'tersurut': 'surut', + 'tersurutkan': 'surut', + 'menyuruti': 'surut', + 'menyurutkan': 'surut', + 'menyurutkannya': 'surut', + 'penyurvei': 'survei', + 'penyurveinya': 'survei', + 'penyurveian': 'survei', + 'menyurvei': 'survei', + 'menyurveinya': 'survei', + 'bersusah hati': 'susah hati', + 'bersusah': 'susah', + 'menyusahi': 'susah', + 'kesusahan': 'susah', + 'kesusahannya': 'susah', + 'menyusahkan': 'susah', + 'menyusahkannya': 'susah', + 'menyusahkanku': 'susah', + 'mempersusah': 'susah', + 'bersusah-susah': 'susah', + 'kesusastraan': 'susastra', + 'kesusastraannya': 'susastra', + 'tersuspensi': 'suspensi', + 'susteran': 'suster', + 'susuan': 'susu', + 'susuanan': 'susu', + 'penyusu': 'susu', + 'penyusukan': 'susu', + 'penyusui': 'susu', + 'penyusuan': 'susu', + 'bersusu': 'susu', + 'menyusu': 'susu', + 'menyusunya': 'susu', + 'menyusui': 'susu', + 'menyusuan': 'susu', + 'menyusuinya': 'susu', + 'menyusuilah': 'susu', + 'menyusuimu': 'susu', + 'persusuan': 'susu', + 'penyusuanan': 'susu', + 'bersutan': 'sutan', + 'bersutan-sutan': 'sutan', + 'bersuten': 'suten', + 'kesutradaraan': 'sutradara', + 'menyutradarai': 'sutradara', + 'menyutradarainya': 'sutradara', + 'penyutradaraan': 'sutradara', + 'penyutradaraannya': 'sutradara', + 'menyuwir': 'suwir', + 'suwir-suwir': 'suwir', + 'keswasembadaan': 'swasembada', + 'bersyahadat': 'syahadat', + 'kesyahduan': 'syahdu', + 'mensyaki': 'syak', + 'mensyariatkan': 'syariat', + 'mensyarikat': 'syarikat', + 'bersyarikat': 'syarikat', + 'mensyirikkan': 'syirik', + 'bersyubhat': 'syubhat', + 'syukuran': 'syukur', + 'syukurannya': 'syukur', + 'syukuranlah': 'syukur', + 'bersyukur': 'syukur', + 'bersyukurnya': 'syukur', + 'bersyukurlah': 'syukur', + 'bersyukurkan': 'syukur', + 'mensyukuri': 'syukur', + 'mensyukurinya': 'syukur', + 'mensyurkan': 'syur', + 'ketaatasasan': 'taat asas', + 'menaati': 'taat', + 'menaatinya': 'taat', + 'ketaatan': 'taat', + 'ketaatannya': 'taat', + 'menabak': 'tabak', + 'menabaknya': 'tabak', + 'menabelkan': 'tabel', + 'bertabiat': 'tabiat', + 'pertabiban': 'tabib', + 'menabik': 'tabik', + 'menabikan': 'tabik', + 'bersitabik': 'tabik', + 'menabiri': 'tabir', + 'bertabir': 'tabir', + 'tabir-mabir': 'tabir', + 'bertablig': 'tablig', + 'menabligkan': 'tablig', + 'menabok': 'tabok', + 'tabrakan': 'tabrak', + 'tabrakannya': 'tabrak', + 'tabrakanlah': 'tabrak', + 'menabrak': 'tabrak', + 'menabraknya': 'tabrak', + 'menabrakkan': 'tabrak', + 'menabrakkannya': 'tabrak', + 'menabraki': 'tabrak', + 'menabrakan': 'tabrak', + 'menabrakku': 'tabrak', + 'menabrakmu': 'tabrak', + 'penabrak': 'tabrak', + 'penabraknya': 'tabrak', + 'penabrakkan': 'tabrak', + 'penabrakan': 'tabrak', + 'tertabrak': 'tabrak', + 'tertabraknya': 'tabrak', + 'tertabrakan': 'tabrak', + 'bertabrakan': 'tabrak', + 'bertabrakannya': 'tabrak', + 'tabrak-tubruk': 'tabrak', + 'menabukan': 'tabu', + 'menabuh': 'tabuh', + 'menabuhnya': 'tabuh', + 'menabuhkan': 'tabuh', + 'tabuhan': 'tabuh', + 'tabuhannya': 'tabuh', + 'tetabuhan': 'tabuh', + 'tabuh-tabuhan': 'tabuh', + 'menabulasi': 'tabulasi', + 'menabun': 'tabun', + 'tabunan': 'tabun', + 'tabun-menabun': 'tabun', + 'menadaburkan': 'tadabur', + 'bertadarus': 'tadarus', + 'penadbir': 'tadbir', + 'penadbiran': 'tadbir', + 'menadbirkan': 'tadbir', + 'tadinya': 'tadi', + 'tertadung': 'tadung', + 'menafahus': 'tafahus', + 'tafsiran': 'tafsir', + 'tafsirannya': 'tafsir', + 'penafsiran': 'tafsir', + 'penafsirannya': 'tafsir', + 'menafsirkan': 'tafsir', + 'menafsirkannya': 'tafsir', + 'menagak': 'tagak', + 'menagakkan': 'tagak', + 'menagak-nagak': 'tagak', + 'tertagak-tagak': 'tagak', + 'menagan': 'tagan', + 'menagani': 'tagan', + 'bertagan': 'tagan', + 'bertagar': 'tagar', + 'bertahajud': 'tahajud', + 'bertahak': 'tahak', + 'bertahalul': 'tahalul', + 'bertahana': 'tahana', + 'setahap': 'tahap', + 'tahapan': 'tahap', + 'tahapannya': 'tahap', + 'tahapani': 'tahap', + 'tahapanan': 'tahap', + 'bertahap': 'tahap', + 'bertahapnya': 'tahap', + 'bertahaplah': 'tahap', + 'bertahapan': 'tahap', + 'penahapan': 'tahap', + 'penahapannya': 'tahap', + 'menahapkan': 'tahap', + 'bertahar': 'tahar', + 'menaharkan': 'tahar', + 'bertaharah': 'taharah', + 'tahbisan': 'tahbis', + 'penahbisan': 'tahbis', + 'menahbiskan': 'tahbis', + 'menahbiskannya': 'tahbis', + 'ketahiran': 'tahir', + 'penahiran': 'tahir', + 'menahkikkan': 'tahkik', + 'bertahkim': 'tahkim', + 'tahlilan': 'tahlil', + 'menahnik': 'tahnik', + 'penaja': 'taja', + 'penajanya': 'taja', + 'penajaan': 'taja', + 'menaja': 'taja', + 'tajaan': 'taja', + 'kepenajaan': 'taja', + 'bertaji': 'taji', + 'bertajinya': 'taji', + 'menajin': 'tajin', + 'menajinkan': 'tajin', + 'menajuk': 'tajuk', + 'menajukan': 'tajuk', + 'bertajuk-tajuk': 'tajuk', + 'penajur': 'tajur', + 'ketakaburan': 'takabur', + 'menakah': 'takah', + 'takah-takahnya': 'takah', + 'menakak': 'takak', + 'bertakak': 'takak', + 'menakar': 'takar', + 'menakarnya': 'takar', + 'setakar': 'takar', + 'takaran': 'takar', + 'takarannya': 'takar', + 'takaranan': 'takar', + 'penakar': 'takar', + 'penakaran': 'takar', + 'menakari': 'takar', + 'penakarannya': 'takar', + 'takbiran': 'takbir', + 'takbirannya': 'takbir', + 'menakbirkan': 'takbir', + 'penakdisan': 'takdis', + 'menakdiskan': 'takdis', + 'menakhlikkan': 'takhlik', + 'menakhsiskan': 'takhsis', + 'bertakhta': 'takhta', + 'bertakhtalah': 'takhta', + 'bertakhtakan': 'takhta', + 'menakhtakan': 'takhta', + 'menaki': 'taki', + 'bertaki': 'taki', + 'menakjubi': 'takjub', + 'ketakjuban': 'takjub', + 'ketakjubannya': 'takjub', + 'menakjubkan': 'takjub', + 'menakjubkannya': 'takjub', + 'bertaklid': 'taklid', + 'menaklik': 'taklik', + 'bertaklik': 'taklik', + 'taklukan': 'takluk', + 'taklukannya': 'takluk', + 'penakluk': 'takluk', + 'penakluknya': 'takluk', + 'penaklukkan': 'takluk', + 'penaklukkannya': 'takluk', + 'penaklukan': 'takluk', + 'penaklukannya': 'takluk', + 'menaklukkan': 'takluk', + 'menaklukkannya': 'takluk', + 'menaklukkankan': 'takluk', + 'menaklukkanku': 'takluk', + 'menakma': 'takma', + 'menakmakan': 'takma', + 'takmurnian': 'takmurni', + 'menakol': 'takol', + 'ketakrifan': 'takrif', + 'menakrifkan': 'takrif', + 'ketaksaan': 'taksa', + 'menaksikan': 'taksi', + 'menakur': 'takur', + 'menakurkan': 'takur', + 'menakwilkan': 'takwil', + 'bertakziah': 'takziah', + 'menakzimkan': 'takzim', + 'menakzirkan': 'takzir', + 'bertalah-talah': 'talah', + 'menalak': 'talak', + 'menalaknya': 'talak', + 'menalang': 'talang', + 'menalangi': 'talang', + 'penalang': 'talang', + 'penalangan': 'talang', + 'menalanginya': 'talang', + 'bertalaran': 'talar', + 'setali': 'tali', + 'penali': 'tali', + 'penalinya': 'tali', + 'penalii': 'tali', + 'penalian': 'tali', + 'bertali': 'tali', + 'bertalian': 'tali', + 'tali-tali': 'tali', + 'pertalian': 'tali', + 'pertaliannya': 'tali', + 'bertali-tali': 'tali', + 'tali-bertali': 'tali', + 'mempertalikan': 'tali', + 'menalkinkan': 'talkin', + 'bertalu-talu': 'talu', + 'bertalun': 'talun', + 'talun-temalun': 'talun', + 'bertalun-talun': 'talun', + 'bertamadun': 'tamadun', + 'pertamanan': 'taman', + 'pertamanannya': 'taman', + 'pertamananan': 'taman', + 'bertamasya': 'tamasya', + 'tamatan': 'tamat', + 'tamatannya': 'tamat', + 'menamatkan': 'tamat', + 'menamatkannya': 'tamat', + 'menambal': 'tambal', + 'menambalnya': 'tambal', + 'menambalkan': 'tambal', + 'menambali': 'tambal', + 'menambalan': 'tambal', + 'tambalan': 'tambal', + 'tambalannya': 'tambal', + 'penambalan': 'tambal', + 'penambalannya': 'tambal', + 'menambari': 'tambar', + 'tambuhan': 'tambuh', + 'bertambuh': 'tambuh', + 'menambuhkan': 'tambuh', + 'penambul': 'tambul', + 'menambul': 'tambul', + 'bertambul': 'tambul', + 'menambun': 'tambun', + 'tambunan': 'tambun', + 'tambunanan': 'tambun', + 'bertambun': 'tambun', + 'bertambunnya': 'tambun', + 'menambunkan': 'tambun', + 'menambungi': 'tambung', + 'menambus': 'tambus', + 'tertambus': 'tambus', + 'menamengi': 'tameng', + 'menampak': 'tampak', + 'menampakkan': 'tampak', + 'menampakkannya': 'tampak', + 'menampaki': 'tampak', + 'menampakan': 'tampak', + 'tampaknya': 'tampak', + 'tertampak': 'tampak', + 'penampakan': 'tampak', + 'penampakannya': 'tampak', + 'tampak-tampak': 'tampak', + 'menampan': 'tampan', + 'bertampan': 'tampan', + 'mempertampan': 'tampan', + 'penampang': 'tampang', + 'penampangnya': 'tampang', + 'penampangan': 'tampang', + 'menampang': 'tampang', + 'menampangkan': 'tampang', + 'menampar': 'tampar', + 'menamparnya': 'tampar', + 'menamparkan': 'tampar', + 'menampari': 'tampar', + 'menamparku': 'tampar', + 'menamparmu': 'tampar', + 'tamparan': 'tampar', + 'tamparannya': 'tampar', + 'menamparinya': 'tampar', + 'menampariku': 'tampar', + 'bertampar': 'tampar', + 'menampas': 'tampas', + 'menampel': 'tampel', + 'tampian': 'tampi', + 'menampi': 'tampi', + 'menampikan': 'tampik', + 'penampi': 'tampi', + 'penampilah': 'tampi', + 'penampikan': 'tampik', + 'penampian': 'tampi', + 'tampikan': 'tampik', + 'tampikannya': 'tampik', + 'menampik': 'tampik', + 'menampiknya': 'tampik', + 'menampiklah': 'tampik', + 'menampikkan': 'tampik', + 'menampin': 'tampin', + 'bertampin': 'tampin', + 'bertampuk': 'tampuk', + 'tamsilan': 'tamsil', + 'bertamsil': 'tamsil', + 'menamsilkan': 'tamsil', + 'tertamsilkan': 'tamsil', + 'menamu': 'tamu', + 'menamukan': 'tamu', + 'menamui': 'tamu', + 'bertamu': 'tamu', + 'bertamunya': 'tamu', + 'ketamuan': 'tamu', + 'menamyizkan': 'tamyiz', + 'menanai': 'tanai', + 'penanak': 'tanak', + 'menanak': 'tanak', + 'bertanak': 'tanak', + 'sepenanak': 'tanak', + 'sepertanak': 'tanak', + 'mempertanak': 'tanak', + 'mempertanakan': 'tanak', + 'tanak-tanakan': 'tanak', + 'sepenanak nasi': 'tanak', + 'sepertanak nasi': 'tanak', + 'menanang': 'tanang', + 'menanangkan': 'tanang', + 'menanangi': 'tanang', + 'menancang': 'tancang', + 'menancangkan': 'tancang', + 'menancap': 'tancap', + 'menancapnya': 'tancap', + 'menancapkan': 'tancap', + 'menancapkannya': 'tancap', + 'tertancap': 'tancap', + 'tertancapnya': 'tancap', + 'penanda': 'tanda', + 'penandanya': 'tanda', + 'penandaan': 'tanda', + 'bertanda': 'tanda', + 'bertandakan': 'tandak', + 'tertanda': 'tanda', + 'tertandanya': 'tanda', + 'tertandai': 'tanda', + 'menandai': 'tanda', + 'menandainya': 'tanda', + 'menandaikan': 'tanda', + 'pertanda': 'tanda', + 'pertandanya': 'tanda', + 'pertandaan': 'tanda', + 'penandaannya': 'tanda', + 'menandakan': 'tandak', + 'menandakannya': 'tanda', + 'bertanda-tandaan': 'tanda', + 'penandak': 'tandak', + 'menandak': 'tandak', + 'menandakkan': 'tandak', + 'bertandak': 'tandak', + 'setandan': 'tandan', + 'petandang': 'tandang', + 'bertandang': 'tandang', + 'bertandangnya': 'tandang', + 'bertandanglah': 'tandang', + 'bertandangan': 'tandang', + 'menandangi': 'tandang', + 'menanding': 'tanding', + 'menandingnya': 'tanding', + 'menandingkan': 'tanding', + 'menandingkannya': 'tanding', + 'menandingi': 'tanding', + 'menandingan': 'tanding', + 'tandingan': 'tanding', + 'tandingannya': 'tanding', + 'tandinganlah': 'tanding', + 'menandinginya': 'tanding', + 'bertanding': 'tanding', + 'bertandingnya': 'tanding', + 'bertandinglah': 'tanding', + 'bertandingan': 'tanding', + 'pertandingan': 'tanding', + 'pertandingannya': 'tanding', + 'pertandinganlah': 'tanding', + 'pertandinganan': 'tanding', + 'pertandinganku': 'tanding', + 'mempertandingkan': 'tanding', + 'mempertandingkannya': 'tanding', + 'penandusan': 'tandus', + 'menanduskan': 'tandus', + 'penangas': 'tangas', + 'menangas': 'tangas', + 'bertangas': 'tangas', + 'penangasan': 'tangas', + 'setangga': 'tangga', + 'bertangga': 'tangga', + 'penanggah': 'tanggah', + 'penanggahan': 'tanggah', + 'menanggang': 'tanggang', + 'bertanggang': 'tanggang', + 'menanggar': 'tanggar', + 'menanggarkan': 'tanggar', + 'menanggul': 'tanggul', + 'menangguli': 'tanggul', + 'menanggulangi': 'tanggulang', + 'menanggulanginya': 'tanggulang', + 'penanggulangan': 'tanggulang', + 'penanggulangannya': 'tanggulang', + 'penanggulanganan': 'tanggulang', + 'penanggung jawab': 'tanggung jawab', + 'menanggungjawabi': 'tanggung jawab', + 'bertanggung jawab': 'tanggung jawab', + 'pertanggungjawaban': 'tanggung jawab', + 'pertanggungjawabannya': 'tanggung jawab', + 'pertanggungjawabanlah': 'tanggung jawab', + 'pertanggungjawabankan': 'tanggung jawab', + 'pertanggungjawabanan': 'tanggung jawab', + 'mempertanggungjawabkan': 'tanggung jawab', + 'mempertanggungjawabkannya': 'tanggung jawab', + 'penanggung': 'tanggung', + 'penanggungnya': 'tanggung', + 'penanggungan': 'tanggung', + 'menanggung': 'tanggung', + 'menanggungnya': 'tanggung', + 'menanggungkan': 'tanggung', + 'menanggungi': 'tanggung', + 'tanggungan': 'tanggung', + 'tanggungannya': 'tanggung', + 'tanggunganku': 'tanggung', + 'tertanggung': 'tanggung', + 'tertanggungkan': 'tanggung', + 'pertanggungan': 'tanggung', + 'pertanggungannya': 'tanggung', + 'tanggung-tanggung': 'tanggung', + 'mempertanggungkan': 'tanggung', + 'tanggung-menanggung': 'tanggung', + 'tangkahan': 'tangkah', + 'menangkap': 'tangkap', + 'menangkapnya': 'tangkap', + 'menangkapkan': 'tangkap', + 'menangkapi': 'tangkap', + 'menangkapan': 'tangkap', + 'menangkapku': 'tangkap', + 'menangkapmu': 'tangkap', + 'tangkapan': 'tangkap', + 'tangkapannya': 'tangkap', + 'tangkapanku': 'tangkap', + 'penangkap': 'tangkap', + 'penangkapnya': 'tangkap', + 'penangkapkan': 'tangkap', + 'penangkapan': 'tangkap', + 'bertangkap': 'tangkap', + 'tertangkap': 'tangkap', + 'tertangkapnya': 'tangkap', + 'tertangkaplah': 'tangkap', + 'tertangkapkan': 'tangkap', + 'sepenangkap': 'tangkap', + 'sepenangkapan': 'tangkap', + 'ketangkapan': 'tangkap', + 'penangkapannya': 'tangkap', + 'penangkapanan': 'tangkap', + 'penangkapanku': 'tangkap', + 'penangkar': 'tangkar', + 'penangkaran': 'tangkar', + 'penangkarannya': 'tangkar', + 'menangkarkan': 'tangkar', + 'menangkil': 'tangkil', + 'bertangkil-tangkil': 'tangkil', + 'menangkuk': 'tangkuk', + 'menangkul': 'tangkul', + 'setangkup': 'tangkup', + 'menangkup': 'tangkup', + 'menangkupnya': 'tangkup', + 'menangkupkan': 'tangkup', + 'bertangkup': 'tangkup', + 'tertangkup': 'tangkup', + 'menangkuptelentangkan': 'tangkup telentang', + 'menangsel': 'tangsel', + 'menanjul': 'tanjul', + 'menanjuli': 'tanjul', + 'tertanjul': 'tanjul', + 'menanjung': 'tanjung', + 'menanjur': 'tanjur', + 'menanjur-nanjur': 'tanjur', + 'menantang': 'tantang', + 'menantangnya': 'tantang', + 'menantangkan': 'tantang', + 'menantangi': 'tantang', + 'menantangku': 'tantang', + 'menantangmu': 'tantang', + 'penantang': 'tantang', + 'penantangnya': 'tantang', + 'penantangan': 'tantang', + 'tantangan': 'tantang', + 'tantangannya': 'tantang', + 'tantangani': 'tantang', + 'tantanganan': 'tantang', + 'tantanganku': 'tantang', + 'tantanganmu': 'tantang', + 'tertantang': 'tantang', + 'tertantanglah': 'tantang', + 'bertanti': 'tanti', + 'menanwinkan': 'tanwin', + 'menapuk': 'tapuk', + 'menapung': 'tapung', + 'menapungnya': 'tapung', + 'menapus': 'tapus', + 'setaraf': 'taraf', + 'bertaraf': 'taraf', + 'menarafkan': 'taraf', + 'menyetarafkan': 'taraf', + 'bertarak': 'tarak', + 'pertarakan': 'tarak', + 'menarang': 'tarang', + 'petarangan': 'tarang', + 'bertarap': 'tarap', + 'bertarawih': 'tarawih', + 'menarbiahkan': 'tarbiah', + 'penargetan': 'target', + 'penargetannya': 'target', + 'menargetkan': 'target', + 'menargetkannya': 'target', + 'penarifan': 'tarif', + 'menarifkan': 'tarif', + 'menarikhkan': 'tarikh', + 'menaris': 'taris', + 'bertajih': 'tarjih', + 'bertaruk': 'taruk', + 'menarupi': 'tarup', + 'menasak': 'tasak', + 'penasak': 'tasak', + 'menasarufkan': 'tasaruf', + 'bertasawuf': 'tasawuf', + 'bertasbih': 'tasbih', + 'bertasbihlah': 'tasbih', + 'bertasbihkan': 'tasbih', + 'menasdikkan': 'tasdik', + 'penashih': 'tashih', + 'menashih': 'tashih', + 'menashihkan': 'tashih', + 'menasrifkan': 'tasrif', + 'tasyakuran': 'tasyakur', + 'tasyakurannya': 'tasyakur', + 'bertasyakur': 'tasyakur', + 'bertasyhid': 'tasyhid', + 'menasyhidkan': 'tasyhid', + 'menasyrihkan': 'tasyrih', + 'ketatabahasaan': 'tata bahasa', + 'penatagunaan': 'tata guna', + 'penata': 'tata', + 'penatanya': 'tata', + 'penataan': 'tata', + 'menata': 'tata', + 'menatanya': 'tata', + 'menatakan': 'tata', + 'tataan': 'tata', + 'penataannya': 'tata', + 'ketatalaksanaan': 'tata laksana', + 'penatalaksanaan': 'tata laksana', + 'penatalaksanaannya': 'tata laksana', + 'ketatanegaraan': 'tata negara', + 'ketatanegaraannya': 'tata negara', + 'ketataniagaan': 'tata niaga', + 'ketataprajaan': 'tata praja', + 'ketatausahaan': 'tata usaha', + 'bertatai-tatai': 'tatai', + 'tatakan': 'tatak', + 'tatakannya': 'tatak', + 'menataki': 'tatak', + 'tertatal': 'tatal', + 'menatar': 'tatar', + 'penatar': 'tatar', + 'penataran': 'tatar', + 'tataran': 'tatar', + 'tatarannya': 'tatar', + 'petatar': 'tatar', + 'bertatar': 'tatar', + 'penatarannya': 'tatar', + 'menatih': 'tatih', + 'tertatih-tatih': 'tatih', + 'tertatih-tatihnya': 'tatih', + 'bertatih-tatih': 'tatih', + 'menating': 'tating', + 'menato': 'tato', + 'menatonya': 'tato', + 'menauhidkan': 'tauhid', + 'menaul': 'taul', + 'bertauliah': 'tauliah', + 'menauliahkan': 'tauliah', + 'tauran': 'taur', + 'menauri': 'taur', + 'bertawajuh': 'tawajuh', + 'menawaki': 'tawak', + 'menawakkan': 'tawak', + 'bertawakal': 'tawakal', + 'tawanan': 'tawan', + 'tawanannya': 'tawan', + 'tawananan': 'tawan', + 'penawan': 'tawan', + 'penawanan': 'tawan', + 'menawan': 'tawan', + 'menawannya': 'tawan', + 'menawanan': 'tawan', + 'tertawan': 'tawan', + 'bertawan-tawan': 'tawan', + 'tawuran': 'tawur', + 'tawurannya': 'tawur', + 'tawuranlah': 'tawur', + 'bertayamum': 'tayamum', + 'tayuban': 'tayub', + 'tayum-temayum': 'tayum', + 'berteater': 'teater', + 'meneaterkan': 'teater', + 'tebakan': 'tebak', + 'tebakannya': 'tebak', + 'tebakanku': 'tebak', + 'menebak': 'tebak', + 'menebaknya': 'tebak', + 'menebakkan': 'tebak', + 'penebak': 'tebak', + 'penebakan': 'tebak', + 'meneban': 'teban', + 'tebanan': 'teban', + 'menebeng': 'tebeng', + 'menebengnya': 'tebeng', + 'bertebeng': 'tebeng', + 'menebengkan': 'tebeng', + 'menebing': 'tebing', + 'menebok': 'tebok', + 'tebu-tebu': 'tebu', + 'menebu-nebu': 'tebu', + 'bertebu-tebu': 'tebu', + 'bertebu-tebukan': 'tebu', + 'bertedengan': 'tedeng', + 'tedong-tedong': 'tedong', + 'meneduh': 'teduh', + 'meneduhkan': 'teduh', + 'meneduhi': 'teduh', + 'peneduh': 'teduh', + 'peneduhnya': 'teduh', + 'peneduhan': 'teduh', + 'berteduh': 'teduh', + 'berteduhnya': 'teduh', + 'berteduhlah': 'teduh', + 'keteduhan': 'teduh', + 'keteduhannya': 'teduh', + 'perteduhan': 'teduh', + 'perteduhannya': 'teduh', + 'berteduhkan': 'teduh', + 'ketegapan': 'tegap', + 'menegapkan': 'tegap', + 'menegun': 'tegun', + 'bertegun': 'tegun', + 'tertegun': 'tegun', + 'tertegun-tegun': 'tegun', + 'teh-tehan': 'teh', + 'meneja': 'teja', + 'berteka-teki': 'teka teki', + 'peneka': 'tekaan', + 'penekakan': 'tekaan', + 'penekakannya': 'tekaan', + 'menekak': 'tekak', + 'menekakan': 'tekak', + 'bertekak': 'tekak', + 'menekang': 'tekang', + 'menekat': 'tekat', + 'menekati': 'tekat', + 'tekatan': 'tekat', + 'bertekat': 'tekat', + 'bertekatkan': 'tekat', + 'menekek': 'tekek', + 'menekekan': 'tekek', + 'menekel': 'tekel', + 'menekelnya': 'tekel', + 'menekelku': 'tekel', + 'penekelan': 'tekel', + 'meneken': 'teken', + 'menekennya': 'teken', + 'tekenan': 'teken', + 'penekenan': 'teken', + 'meneker': 'teker', + 'tekeran': 'teker', + 'ditekik': 'tekik', + 'menekik': 'tekik', + 'ketekoran': 'tekor', + 'pertekstilan': 'tekstil', + 'bertekstur': 'tekstur', + 'menekuk': 'tekuk', + 'menekuknya': 'tekuk', + 'menekukkan': 'tekuk', + 'menekukan': 'tekuk', + 'tekukan': 'tekuk', + 'bertekuk': 'tekuk', + 'menekur': 'tekur', + 'menekuri': 'tekur', + 'bertekur': 'tekur', + 'menekurkan': 'tekur', + 'pertelaan': 'tela', + 'menelaah': 'telaah', + 'menelaahnya': 'telaah', + 'penelaah': 'telaah', + 'penelaahan': 'telaah', + 'penelaahannya': 'telaah', + 'bertelabat': 'telabat', + 'meneladan': 'teladan', + 'meneladankan': 'teladan', + 'meneladani': 'teladan', + 'meneladaninya': 'teladan', + 'keteladanan': 'teladan', + 'keteladanannya': 'teladan', + 'keteladananan': 'teladan', + 'keteladananmu': 'teladan', + 'bertelang-telang': 'telang', + 'menelangkai': 'telangkai', + 'penelangkaian': 'telangkai', + 'ketelanjuran': 'telanjur', + 'penelantaran': 'telantar', + 'penelantarannya': 'telantar', + 'menelantarkan': 'telantar', + 'menelantarkannya': 'telantar', + 'menelantarkanku': 'telantar', + 'menelap': 'telap', + 'telapakan': 'telapak', + 'petelasan': 'telas', + 'bertelau-telau': 'telau', + 'bertele-tele': 'tele', + 'bertele-telenya': 'tele', + 'bertele-telelah': 'tele', + 'keteledoran': 'teledor', + 'keteledorannya': 'teledor', + 'meneledorkan': 'teledor', + 'menelegram': 'telegram', + 'bertelekan': 'telekan', + 'pertelekomunikasian': 'telekomunikasi', + 'berteleku': 'teleku', + 'setelempap': 'telempap', + 'menelempap': 'telempap', + 'bertelempong': 'telempong', + 'menelentang': 'telentang', + 'menelentangkan': 'telentang', + 'tertelentang': 'telentang', + 'menelepon': 'telepon', + 'meneleponnya': 'telepon', + 'meneleponkan': 'telepon', + 'meneleponi': 'telepon', + 'meneleponku': 'telepon', + 'meneleponmu': 'telepon', + 'bertelepon': 'telepon', + 'berteleponan': 'telepon', + 'bertelepuk': 'telepuk', + 'bertelepukan': 'telepuk', + 'telesan': 'teles', + 'pertelevisian': 'televisi', + 'menelik': 'telik', + 'penelik': 'telik', + 'menelikung': 'telikung', + 'menelikungnya': 'telikung', + 'bertelimpuh': 'telimpuh', + 'menelinga': 'telinga', + 'bertelinga': 'telinga', + 'bertelingkah': 'telingkah', + 'tertelingkung': 'telingkung', + 'meneliti': 'teliti', + 'menelitinya': 'teliti', + 'menelitian': 'teliti', + 'peneliti': 'teliti', + 'penelitinya': 'teliti', + 'penelitikan': 'teliti', + 'penelitii': 'teliti', + 'penelitian': 'teliti', + 'ketelitian': 'teliti', + 'ketelitiannya': 'teliti', + 'ketelitianlah': 'teliti', + 'ketelitianmu': 'teliti', + 'penelitiannya': 'teliti', + 'penelitiani': 'teliti', + 'penelitianku': 'teliti', + 'berteluk': 'teluk', + 'menelus': 'telus', + 'menelusi': 'telus', + 'menelusuk': 'telusuk', + 'menelusuri': 'telusur', + 'menelusurinya': 'telusur', + 'penelusuran': 'telusur', + 'penelusurannya': 'telusur', + 'menelutut': 'telutut', + 'mengetem': 'tem', + 'mengetemkan': 'tem', + 'bertema': 'tema', + 'bertemakan': 'tema', + 'temas-temas': 'temas', + 'menembaga': 'tembaga', + 'pertembakauan': 'tembakau', + 'menembang': 'tembang', + 'menembangnya': 'tembang', + 'menembangkan': 'tembang', + 'penembang': 'tembang', + 'penembangnya': 'tembang', + 'penembangkan': 'tembang', + 'penembangan': 'tembang', + 'menembis': 'tembis', + 'menembok': 'tembok', + 'menemboknya': 'tembok', + 'temeh-temeh': 'temeh', + 'menemin': 'temin', + 'bertemin': 'temin', + 'menempah': 'tempah', + 'tempahan': 'tempah', + 'menempap': 'tempap', + 'setempap': 'tempap', + 'bertempap': 'tempap', + 'setempat': 'tempat', + 'setempatnya': 'tempat', + 'setempatlah': 'tempat', + 'setempati': 'tempat', + 'tempatan': 'tempat', + 'bertempat': 'tempat', + 'bertempatkan': 'tempat', + 'bertempatan': 'tempat', + 'menempati': 'tempat', + 'menempatinya': 'tempat', + 'menempatikan': 'tempat', + 'menempatikannya': 'tempat', + 'menempatii': 'tempat', + 'ketempatan': 'tempat', + 'penempatan': 'tempat', + 'penempatannya': 'tempat', + 'penempatanan': 'tempat', + 'menempatkan': 'tempat', + 'menempatkannya': 'tempat', + 'menempatkankannya': 'tempat', + 'menempatkanku': 'tempat', + 'menempatkanmu': 'tempat', + 'bertempat-tempat': 'tempat', + 'setempat-setempat': 'tempat', + 'menempelak': 'tempelak', + 'menempelakkan': 'tempelak', + 'tempelengan': 'tempeleng', + 'menempeleng': 'tempeleng', + 'menempelengnya': 'tempeleng', + 'bertemperamen': 'temperamen', + 'bertemperasan': 'temperas', + 'bertemperau': 'temperau', + 'bertempiar': 'tempiar', + 'bertempiaran': 'tempiar', + 'menempias': 'tempias', + 'bertempias': 'tempias', + 'tempikan': 'tempik', + 'bertempik': 'tempik', + 'menempikkan': 'tempik', + 'menemplok': 'templok', + 'tempo-tempo': 'tempo', + 'bertempoh': 'tempoh', + 'menempohkan': 'tempoh', + 'menempong': 'tempong', + 'setempuh': 'tempuh', + 'menempuh': 'tempuh', + 'menempuhnya': 'tempuh', + 'menempuhi': 'tempuh', + 'tertempuh': 'tempuh', + 'ketempuhan': 'tempuh', + 'menempuhkan': 'tempuh', + 'bertempuh-tempuh': 'tempuh', + 'menempulingi': 'tempuling', + 'menemudugai': 'temu duga', + 'menemu duga': 'temu duga', + 'bertemu duga': 'temu duga', + 'ketenagakerjaan': 'tenaga kerja', + 'ketenagakerjaannya': 'tenaga kerja', + 'ketenaganukliran': 'tenaga nuklir', + 'ketenaran': 'tenar', + 'ketenarannya': 'tenar', + 'ketenaranku': 'tenar', + 'menenarkan': 'tenar', + 'menendas': 'tendas', + 'menendaskan': 'tendas', + 'bertendensi': 'tendensi', + 'menenderkan': 'tender', + 'menengadah': 'tengadah', + 'menengadahkan': 'tengadah', + 'menengarai': 'tengara', + 'menengarainya': 'tengara', + 'menenggak': 'tenggak', + 'menenggaknya': 'tenggak', + 'menenggakkan': 'tenggak', + 'menenggakan': 'tenggak', + 'tertenggan': 'tenggan', + 'menenggang': 'tenggang', + 'menenggangkan': 'tenggang', + 'tertenggang': 'tenggang', + 'bertenggang': 'tenggang', + 'bertenggangan': 'tenggang', + 'pertenggangan': 'tenggang', + 'mempertenggangkan': 'tenggang', + 'tenggang-menenggang': 'tenggang', + 'bertenggang-tenggangan': 'tenggang', + 'menenggara': 'tenggara', + 'menenggarai': 'tenggara', + 'tenggorokan': 'tenggorok', + 'tenggorokannya': 'tenggorok', + 'tenggorokanku': 'tenggorok', + 'tenggorokanmu': 'tenggorok', + 'menengil': 'tengil', + 'menengkarapkan': 'tengkarap', + 'menengkel': 'tengkel', + 'bertengkelek': 'tengkelek', + 'menengking': 'tengking', + 'tengkingan': 'tengking', + 'bertengking': 'tengking', + 'setengkuk': 'tengkuk', + 'bertengkuluk': 'tengkuluk', + 'menengkurap': 'tengkurap', + 'menengkurapkan': 'tengkurap', + 'menengkurapkannya': 'tengkurap', + 'menengok': 'tengok', + 'menengoknya': 'tengok', + 'menengokkan': 'tengok', + 'menengoki': 'tengok', + 'menengokan': 'tengok', + 'menengokku': 'tengok', + 'menengokmu': 'tengok', + 'tengok-menengok': 'tengok', + 'petenis': 'tenis', + 'petenisnya': 'tenis', + 'bertenjet': 'tenjet', + 'menenok': 'tenok', + 'ketentaraan': 'tentara', + 'ketentaraannya': 'tentara', + 'pertentaraan': 'tentara', + 'menenteng': 'tenteng', + 'menentengnya': 'tenteng', + 'tenunan': 'tenun', + 'tenunannya': 'tenun', + 'penenun': 'tenun', + 'penenunnya': 'tenun', + 'penenunan': 'tenun', + 'menenun': 'tenun', + 'menenunnya': 'tenun', + 'bertenun': 'tenun', + 'pertenunan': 'tenun', + 'penenung': 'tenung', + 'penenungan': 'tenung', + 'tenungan': 'tenung', + 'menenung': 'tenung', + 'bertenung': 'tenung', + 'pertenungan': 'tenung', + 'menepam': 'tepam', + 'menepas': 'tepas', + 'bertepas': 'tepas', + 'menepasi': 'tepas', + 'bertepat guna': 'tepat guna', + 'tepian': 'tepi', + 'tepiannya': 'tepi', + 'bertepi': 'tepi', + 'bertepikan': 'tepi', + 'bertepian': 'tepi', + 'menepikan': 'tepik', + 'menepikannya': 'tepi', + 'mengetepikan': 'tepi', + 'menepik': 'tepik', + 'tepukan': 'tepuk', + 'tepukannya': 'tepuk', + 'menepuk': 'tepuk', + 'menepuknya': 'tepuk', + 'menepukkan': 'tepuk', + 'menepuki': 'tepuk', + 'bertepuk': 'tepuk', + 'menepungtawari': 'tepung tawar', + 'peneral': 'teral', + 'peneralan': 'teral', + 'meneral': 'teral', + 'berterali': 'terali', + 'berteralikan': 'terali', + 'keterampilan': 'terampil', + 'keterampilannya': 'terampil', + 'keterampilanku': 'terampil', + 'menerampilkan': 'terampil', + 'meneran': 'teran', + 'menerankan': 'teran', + 'menerangjelaskan': 'terang jelas', + 'menerap': 'terap', + 'menerapkan': 'terap', + 'menerapkannya': 'terap', + 'menerapi': 'terap', + 'menerapan': 'terap', + 'terapan': 'terap', + 'terapannya': 'terap', + 'penerap': 'terap', + 'penerapnya': 'terap', + 'penerapkan': 'terap', + 'penerapi': 'terap', + 'penerapan': 'terap', + 'berterap': 'terap', + 'penerapannya': 'terap', + 'penerapanan': 'terap', + 'menerapkankannya': 'terap', + 'berteras': 'teras', + 'berteraskan': 'teras', + 'meneratak': 'teratak', + 'meneratap': 'teratap', + 'menerau': 'terau', + 'menerawang': 'terawang', + 'menerawangnya': 'terawang', + 'menerawangkan': 'terawang', + 'menerawangkannya': 'terawang', + 'berterawang': 'terawang', + 'menerbankan': 'terban', + 'penerbit': 'terbit', + 'penerbitnya': 'terbit', + 'penerbitkan': 'terbit', + 'penerbitan': 'terbit', + 'terbitan': 'terbit', + 'terbitannya': 'terbit', + 'penerbitannya': 'terbit', + 'menerbitkan': 'terbit', + 'menerbitkannya': 'terbit', + 'menerikkan': 'terik', + 'menerika': 'terika', + 'berterima kasih': 'terima kasih', + 'menerindili': 'terindil', + 'berteritik': 'teritik', + 'menerjang': 'terjang', + 'menerjangnya': 'terjang', + 'menerjangan': 'terjang', + 'penerjangan': 'terjang', + 'menerjangkan': 'terjang', + 'terjemahan': 'terjemah', + 'terjemahannya': 'terjemah', + 'terjemahanku': 'terjemah', + 'penerjemah': 'terjemah', + 'penerjemahnya': 'terjemah', + 'penerjemahan': 'terjemah', + 'penerjemahku': 'terjemah', + 'penerjemahannya': 'terjemah', + 'penerjemahanan': 'terjemah', + 'menerjemahkan': 'terjemah', + 'menerjemahkannya': 'terjemah', + 'penerjun': 'terjun', + 'penerjunnya': 'terjun', + 'penerjunan': 'terjun', + 'menerjuni': 'terjun', + 'menerjuninya': 'terjun', + 'keterjunan': 'terjun', + 'beterjunan': 'terjun', + 'penerjunannya': 'terjun', + 'menerjunkan': 'terjun', + 'menerjunkannya': 'terjun', + 'menerjunkankan': 'terjun', + 'menerka': 'terka', + 'menerkanya': 'terka', + 'terkaan': 'terka', + 'penerka': 'terka', + 'penerkaan': 'terka', + 'menerkap': 'terkap', + 'beterkup': 'terkup', + 'menerkup': 'terkup', + 'menerkupkan': 'terkup', + 'menerok': 'terok', + 'menerombol': 'terombol', + 'meneropong': 'teropong', + 'meneropongnya': 'teropong', + 'meneropongi': 'teropong', + 'meneror': 'teror', + 'menerornya': 'teror', + 'menerormu': 'teror', + 'terubusan': 'terubus', + 'menerumkan': 'terum', + 'menerungku': 'terungku', + 'menerungkukan': 'terungku', + 'terutama': 'utama', + 'terutamanya': 'utama', + 'terutamakan': 'utama', + 'keutamaan': 'utama', + 'keutamaannya': 'utama', + 'pengutamaan': 'utama', + 'pengutamaannya': 'utama', + 'mengutamakan': 'utama', + 'mengutamakannya': 'utama', + 'mengutamakankan': 'utama', + 'mengetes': 'tes', + 'mengetesnya': 'tes', + 'mengeteskan': 'tes', + 'pengetesan': 'tes', + 'pengetesannya': 'tes', + 'bertesmak': 'tesmak', + 'menetal': 'tetal', + 'ketetalan': 'tetal', + 'menetalkan': 'tetal', + 'penetap': 'tetap', + 'penetapkan': 'tetap', + 'penetapan': 'tetap', + 'menetap': 'tetap', + 'menetapnya': 'tetap', + 'menetaplah': 'tetap', + 'menetapkan': 'tetap', + 'menetapkannya': 'tetap', + 'menetapi': 'tetap', + 'menetapan': 'tetap', + 'menetapikan': 'tetap', + 'penetapannya': 'tetap', + 'penetapanan': 'tetap', + 'ketetapan': 'tetap', + 'ketetapannya': 'tetap', + 'mempertetap': 'tetap', + 'berketetapan': 'tetap', + 'mempertetapkan': 'tetap', + 'menetar': 'tetar', + 'menetes': 'tetes', + 'menetesnya': 'tetes', + 'meneteslah': 'tetes', + 'meneteskan': 'tetes', + 'meneteskannya': 'tetes', + 'menetesi': 'tetes', + 'tetesan': 'tetes', + 'tetesannya': 'tetes', + 'bertetesan': 'tetes', + 'tetua': 'tua', + 'tetuanya': 'tua', + 'menua': 'tua', + 'menuanya': 'tua', + 'menuakan': 'tua', + 'menuaan': 'tua', + 'tertua': 'tua', + 'tertuanya': 'tua', + 'tertuai': 'tua', + 'tertuaku': 'tua', + 'penuaan': 'tua', + 'penuaannya': 'tua', + 'penuaanku': 'tua', + 'ketuaan': 'tua', + 'tua-tua': 'tua', + 'tua-tuaan': 'tua', + 'pengetua': 'tua', + 'bertua-tua': 'tua', + 'ketua-tuaan': 'tua', + 'bertua-tuaan': 'tua', + 'tuang-tuang': 'tetuang', + 'ketewasan': 'tewas', + 'menewaskan': 'tewas', + 'menewaskannya': 'tewas', + 'menewaskankan': 'tewas', + 'menewaskanmu': 'tewas', + 'meniada': 'tiada', + 'meniadakan': 'tiada', + 'meniadakannya': 'tiada', + 'ketiadaan': 'tiada', + 'ketiadaannya': 'tiada', + 'peniadaan': 'tiada', + 'mempertiadakan': 'tiada', + 'meniani': 'tian', + 'bertian': 'tian', + 'meniangpancangi': 'tiang pancang', + 'setiap': 'tiap', + 'setiapnya': 'tiap', + 'meniapkan': 'tiap', + 'tiap-tiap': 'tiap', + 'tiap-tiapnya': 'tiap', + 'menidakkan': 'tidak', + 'setidaknya': 'tidak', + 'setidaknyanya': 'tidak', + 'mempertidak': 'tidak', + 'tidak-tidak': 'tidak', + 'tidak-tidaknya': 'tidak', + 'mempertidakkan': 'tidak', + 'setidak-tidaknya': 'tidak', + 'setidak-tidaknyanya': 'tidak', + 'menigari': 'tigari', + 'menigas': 'tigas', + 'mengetik': 'tik', + 'mengetiknya': 'tik', + 'mengetikkan': 'tik', + 'mengetikkannya': 'tik', + 'pengetik': 'tik', + 'pengetikkan': 'tik', + 'pengetikan': 'tik', + 'tikan': 'tik', + 'ketikan': 'tik', + 'pengetikannya': 'tik', + 'menika-nika': 'tika', + 'menikas': 'tikas', + 'bertikas': 'tikas', + 'menikung': 'tikung', + 'menikungnya': 'tikung', + 'menikus': 'tikus', + 'bertilam': 'tilam', + 'menilang': 'tilang', + 'menilangnya': 'tilang', + 'tertilang': 'tilang', + 'menilap': 'tilap', + 'petilasan': 'tilas', + 'mengetim': 'tim', + 'pengetim': 'tim', + 'pengetiman': 'tim', + 'penimba': 'timba', + 'menimba': 'timba', + 'menimbanya': 'timba', + 'tertimba': 'timba', + 'bertimba': 'timba', + 'penimbaan': 'timba', + 'tertimbakan': 'timba', + 'bertimbakan': 'timba', + 'menimbau': 'timbau', + 'menimbel': 'timbel', + 'menimbrung': 'timbrung', + 'menimbuk': 'timbuk', + 'menimbukkan': 'timbuk', + 'menimbukan': 'timbuk', + 'penimbul': 'timbul', + 'penimbulkan': 'timbul', + 'penimbulan': 'timbul', + 'menimbul': 'timbul', + 'menimbulnya': 'timbul', + 'menimbulkan': 'timbul', + 'menimbulan': 'timbul', + 'menimbulkani': 'timbul', + 'timbunan': 'timbun', + 'timbunannya': 'timbun', + 'menimbun': 'timbun', + 'menimbunnya': 'timbun', + 'menimbunlah': 'timbun', + 'menimbunkan': 'timbun', + 'menimbuni': 'timbun', + 'menimbunan': 'timbun', + 'penimbun': 'timbun', + 'penimbunnya': 'timbun', + 'penimbunan': 'timbun', + 'bertimbun': 'timbun', + 'bertimbunlah': 'timbun', + 'tertimbun': 'timbun', + 'tertimbunnya': 'timbun', + 'tertimbunan': 'timbun', + 'penimbunannya': 'timbun', + 'menimbun-nimbun': 'timbun', + 'bertimbun-timbun': 'timbun', + 'menimpang': 'timpang', + 'ketimpangan': 'timpang', + 'ketimpangannya': 'timpang', + 'menimpangkan': 'timpang', + 'tertimpang-timpang': 'timpang', + 'menimpang-nimpangkan': 'timpang', + 'bertimpas-timpas': 'timpas', + 'bertimpuh': 'timpuh', + 'menimpuk': 'timpuk', + 'menimpuknya': 'timpuk', + 'menimpukkan': 'timpuk', + 'menimpuki': 'timpuk', + 'menimpukinya': 'timpuk', + 'timun-timunan': 'timun', + 'menimur': 'timur', + 'ketimuran': 'timur', + 'ketimurannya': 'timur', + 'menindaklanjuti': 'tindak lanjut', + 'menindaklanjutinya': 'tindak lanjut', + 'menindaklanjutii': 'tindak lanjut', + 'menindan': 'tindan', + 'bertindan': 'tindan', + 'tindasan': 'tindas', + 'penindas': 'tindas', + 'penindasnya': 'tindas', + 'penindasan': 'tindas', + 'penindasmu': 'tindas', + 'menindas': 'tindas', + 'menindasnya': 'tindas', + 'menindasku': 'tindas', + 'tertindas': 'tindas', + 'tertindasnya': 'tindas', + 'penindasannya': 'tindas', + 'ketertindasan': 'tindas', + 'ketertindasannya': 'tindas', + 'ditindih': 'tindih', + 'ditindihi': 'tindih', + 'tindihan': 'tindih', + 'penindih': 'tindih', + 'penindihan': 'tindih', + 'menindih': 'tindih', + 'menindihnya': 'tindih', + 'menindihkan': 'tindih', + 'menindihi': 'tindih', + 'tertindih': 'tindih', + 'bertindih': 'tindih', + 'bertindihan': 'tindih', + 'ketindihan': 'tindih', + 'tindih-menindih': 'tindih', + 'tindih-bertindih': 'tindih', + 'meninggam': 'tinggam', + 'meninggung': 'tinggung', + 'bertinggung': 'tinggung', + 'meningkap': 'tingkap', + 'meningkapkan': 'tingkap', + 'tingkapan': 'tingkap', + 'meningkar': 'tingkar', + 'meningkarnya': 'tingkar', + 'meningkarkan': 'tingkar', + 'tingkeban': 'tingkeb', + 'bertingkrang': 'tingkrang', + 'bertingkuh': 'tingkuh', + 'peninju': 'tinju', + 'peninjuan': 'tinju', + 'meninju': 'tinju', + 'meninjunya': 'tinju', + 'meninjuku': 'tinju', + 'petinju': 'tinju', + 'petinjunya': 'tinju', + 'bertinju': 'tinju', + 'bertinjunya': 'tinju', + 'pertinjuan': 'tinju', + 'meninjukan': 'tinju', + 'tinju-meninju': 'tinju', + 'menintai': 'tinta', + 'meninting': 'tinting', + 'tintingan': 'tinting', + 'menipis': 'tipis', + 'menipisnya': 'tipis', + 'menipislah': 'tipis', + 'menipiskan': 'tipis', + 'menipiskannya': 'tipis', + 'menipisi': 'tipis', + 'menipiskankan': 'tipis', + 'tetirah': 'tirah', + 'petirahan': 'tirah', + 'tirakatan': 'tirakat', + 'bertiras-tiras': 'tiras', + 'tirisan': 'tiris', + 'meniris': 'tiris', + 'menirisnya': 'tiris', + 'meniriskan': 'tiris', + 'meniriskannya': 'tiris', + 'penirisan': 'tiris', + 'menirus': 'tirus', + 'meniruskan': 'tirus', + 'bertitah': 'titah', + 'menitahkan': 'titah', + 'menitahkannya': 'titah', + 'tertitar-titar': 'titar', + 'bertitar-titar': 'titar', + 'menitar-nitarkan': 'titar', + 'bertitel': 'titel', + 'bertitelkan': 'titel', + 'titian': 'titi', + 'meniti': 'titi', + 'menitinya': 'titi', + 'menitip': 'titip', + 'menitipkan': 'titip', + 'menitipkannya': 'titip', + 'menitipi': 'titip', + 'menitipan': 'titip', + 'penitip': 'titip', + 'penitipnya': 'titip', + 'penitipan': 'titip', + 'titipan': 'titip', + 'titipannya': 'titip', + 'titipanlah': 'titip', + 'titipanku': 'titip', + 'titipanmu': 'titip', + 'titipan-mu': 'titip', + 'penitipannya': 'titip', + 'menitipkankan': 'titip', + 'menitir': 'titir', + 'titiran': 'titir', + 'meniup': 'tiup', + 'meniupnya': 'tiup', + 'meniuplah': 'tiup', + 'meniupkan': 'tiup', + 'meniupkannya': 'tiup', + 'tiupan': 'tiup', + 'tiupannya': 'tiup', + 'tertiup': 'tiup', + 'bertiup': 'tiup', + 'bertiupnya': 'tiup', + 'tiup-tiup': 'tiup', + 'meniup-niup': 'tiup', + 'meniup-niupnya': 'tiup', + 'meniup-niupkan': 'tiup', + 'meniwahkan': 'tiwah', + 'bertiwikrama': 'tiwikrama', + 'menobak': 'tobak', + 'bertobak': 'tobak', + 'bertobat': 'tobat', + 'bertobatnya': 'tobat', + 'bertobatlah': 'tobat', + 'pertobatan': 'tobat', + 'pertobatannya': 'tobat', + 'bertoboh-toboh': 'toboh', + 'menodong': 'todong', + 'menodongnya': 'todong', + 'menodongkan': 'todong', + 'menodongkannya': 'todong', + 'menodongku': 'todong', + 'penodong': 'todong', + 'penodongnya': 'todong', + 'penodongan': 'todong', + 'menogan': 'togan', + 'menogelkan': 'togel', + 'bertogok': 'togok', + 'menohok': 'tohok', + 'menohokkan': 'tohok', + 'bertohor': 'tohor', + 'ketohoran': 'tohor', + 'menohorkan': 'tohor', + 'menokak': 'tokak', + 'tokak-takik': 'tokak', + 'bertoko': 'toko', + 'pertokoan': 'toko', + 'pertokoannya': 'toko', + 'menokong': 'tokong', + 'bertolap': 'tolap', + 'menoleh': 'toleh', + 'menolehnya': 'toleh', + 'menolehlah': 'toleh', + 'menolehkan': 'toleh', + 'pertolehan': 'toleh', + 'penolok': 'tolok', + 'penolokan': 'tolok', + 'setolok': 'tolok', + 'menolok': 'tolok', + 'menomang': 'tomang', + 'ketomboian': 'tomboi', + 'menomboki': 'tombok', + 'menombokinya': 'tombok', + 'bertonase': 'tonase', + 'menonggak': 'tonggak', + 'bertonggok': 'tonggok', + 'menonggokkan': 'tonggok', + 'tongkahan': 'tongkah', + 'menongkah': 'tongkah', + 'penongkat': 'tongkat', + 'menongkat': 'tongkat', + 'bertongkat': 'tongkat', + 'menongkatkan': 'tongkat', + 'tongkrongan': 'tongkrong', + 'tongkrongannya': 'tongkrong', + 'menongkrong': 'tongkrong', + 'menongkrongi': 'tongkrong', + 'menongol': 'tongol', + 'menongolkan': 'tongol', + 'menonjok': 'tonjok', + 'menonjoknya': 'tonjok', + 'menonjokkan': 'tonjok', + 'menonjoki': 'tonjok', + 'menonjokan': 'tonjok', + 'mengetop': 'top', + 'menopek': 'topek', + 'bertopi': 'topi', + 'bertopik': 'topik', + 'penopikan': 'topik', + 'menopikkan': 'topik', + 'menorpedo': 'torpedo', + 'mengetos': 'tos', + 'menotal': 'total', + 'menotalkan': 'total', + 'totol-totol': 'totol', + 'totol-totolnya': 'totol', + 'menoyor': 'toyor', + 'menoyornya': 'toyor', + 'mentradisi': 'tradisi', + 'mentradisikan': 'tradisi', + 'mentraktir': 'traktir', + 'mentraktirnya': 'traktir', + 'mentraktirmu': 'traktir', + 'mentraktor': 'traktor', + 'mentransfer': 'transfer', + 'mentransfernya': 'transfer', + 'mentransferkan': 'transfer', + 'mentransformasikan': 'transformasi', + 'mentransformasikannya': 'transformasi', + 'pentranskripsi': 'transkripsi', + 'pentranskripsian': 'transkripsi', + 'mentranskripsikan': 'transkripsi', + 'bertransmigrasi': 'transmigrasi', + 'mentransmigrasikan': 'transmigrasi', + 'mentransmigrasilokalkan': 'transmigrasi lokal', + 'mentransmisikan': 'transmisi', + 'mentransmisikannya': 'transmisi', + 'tertransmisikan': 'transmisi', + 'mentransmutasikan': 'transmutasi', + 'mentransplantasikan': 'transplantasi', + 'mentransplantasikannya': 'transplantasi', + 'mentranspor': 'transpor', + 'mengetren': 'tren', + 'ketrengginasan': 'trengginas', + 'triliunan': 'triliun', + 'pentrompet': 'trompet', + 'mentrompetkan': 'trompet', + 'bertruk-truk': 'truk', + 'menual': 'tual', + 'menuali': 'tual', + 'bertual-tual': 'tual', + 'petualang': 'tualang', + 'petualangnya': 'tualang', + 'petualangan': 'tualang', + 'bertualang': 'tualang', + 'bertualangan': 'tualang', + 'petualangannya': 'tualang', + 'petualanganku': 'tualang', + 'petualanganmu': 'tualang', + 'pertualangan': 'tualang', + 'pertualangannya': 'tualang', + 'bertuan': 'tuan', + 'bertuannya': 'tuan', + 'menuani': 'tuan', + 'pertuanan': 'tuan', + 'menuankan': 'tuan', + 'tuan-tuan': 'tuan', + 'bertuankan': 'tuan', + 'mempertuan': 'tuan', + 'ketuan-tuanan': 'tuan', + 'mempertuankan': 'tuan', + 'menuanrumahi': 'tuan rumah', + 'menuas': 'tuas', + 'menuba': 'tuba', + 'menubai': 'tuba', + 'tuban-tuban': 'tuban', + 'ketubruk': 'tubruk', + 'menubruk': 'tubruk', + 'menubruknya': 'tubruk', + 'menubrukkan': 'tubruk', + 'menubrukan': 'tubruk', + 'menubrukku': 'tubruk', + 'tubrukan': 'tubruk', + 'tubrukannya': 'tubruk', + 'tertubruk': 'tubruk', + 'bertubrukan': 'tubruk', + 'bertubrukannya': 'tubruk', + 'menuding': 'tuding', + 'menudingnya': 'tuding', + 'menudingkan': 'tuding', + 'menudingi': 'tuding', + 'menudingan': 'tuding', + 'tudingan': 'tuding', + 'tudingannya': 'tuding', + 'tudingani': 'tuding', + 'menuding-nuding': 'tuding', + 'menuding-nudingkan': 'tuding', + 'menuduh': 'tuduh', + 'menuduhnya': 'tuduh', + 'menuduhlah': 'tuduh', + 'menuduhkan': 'tuduh', + 'menuduhku': 'tuduh', + 'tuduhan': 'tuduh', + 'tuduhannya': 'tuduh', + 'tuduhanan': 'tuduh', + 'tuduhanku': 'tuduh', + 'penuduh': 'tuduh', + 'penuduhnya': 'tuduh', + 'penuduhan': 'tuduh', + 'tertuduh': 'tuduh', + 'tertuduhnya': 'tuduh', + 'menudung': 'tudung', + 'menudungi': 'tudung', + 'penudung': 'tudung', + 'tertudung': 'tudung', + 'bertudung': 'tudung', + 'penudungan': 'tudung', + 'menudungkan': 'tudung', + 'menugaskaryakan': 'tugas karya', + 'petugas': 'tugas', + 'petugasnya': 'tugas', + 'petugaslah': 'tugas', + 'petugasi': 'tugas', + 'petugasan': 'tugas', + 'bertugas': 'tugas', + 'bertugasnya': 'tugas', + 'bertugaslah': 'tugas', + 'bertugasi': 'tugas', + 'menugasi': 'tugas', + 'menugasinya': 'tugas', + 'penugasan': 'tugas', + 'penugasannya': 'tugas', + 'penugasanku': 'tugas', + 'menugaskan': 'tugas', + 'menugaskannya': 'tugas', + 'tuguran': 'tugur', + 'menuguri': 'tugur', + 'menuil': 'tuil', + 'menuilkan': 'tuil', + 'menujuhbulani': 'tujuh bulan', + 'tujuh bulanan': 'tujuh bulan', + 'menujuh bulan': 'tujuh bulan', + 'menujuh hari': 'tujuh hari', + 'menukai': 'tukai', + 'menukam': 'tukam', + 'menukas': 'tukas', + 'menukasnya': 'tukas', + 'menukaskan': 'tukas', + 'tukasan': 'tukas', + 'menukasi': 'tukas', + 'bertukas-tukas': 'tukas', + 'menukik': 'tukik', + 'menukiknya': 'tukik', + 'menukikkan': 'tukik', + 'bertukuk': 'tukuk', + 'menulahi': 'tulah', + 'ketulahan': 'tulah', + 'menulang': 'tulang', + 'menulangi': 'tulang', + 'tertulang': 'tulang', + 'bertulang': 'tulang', + 'bertulangnya': 'tulang', + 'penulangan': 'tulang', + 'penulangannya': 'tulang', + 'ketulangan': 'tulang', + 'pertulangan': 'tulang', + 'tulang-tulangan': 'tulang', + 'ketulusan': 'tulus', + 'ketulusannya': 'tulus', + 'mengetum': 'tum', + 'menumang': 'tumang', + 'menumangkan': 'tumang', + 'menumis': 'tumis', + 'menumisnya': 'tumis', + 'bertumis': 'tumis', + 'menumisi': 'tumis', + 'tumpahan': 'tumpah', + 'tumpahannya': 'tumpah', + 'menumpahi': 'tumpah', + 'tertumpah': 'tumpah', + 'tertumpahnya': 'tumpah', + 'tertumpahkan': 'tumpah', + 'ketumpahan': 'tumpah', + 'penumpahan': 'tumpah', + 'pertumpahan': 'tumpah', + 'menumpahkan': 'tumpah', + 'menumpahkannya': 'tumpah', + 'menumpah-numpahkan': 'tumpah', + 'setumpak': 'tumpak', + 'bertumpak-tumpak': 'tumpak', + 'menumpangsarikan': 'tumpang sari', + 'ketumpangtindihan': 'tumpang-tindih', + 'bertumpang-tindih': 'tumpang-tindih', + 'menumpat': 'tumpat', + 'tertumpat': 'tumpat', + 'menumpatkan': 'tumpat', + 'tumpengan': 'tumpeng', + 'menumpil': 'tumpil', + 'penumpil': 'tumpil', + 'menumplakkan': 'tumplak', + 'menumpuk': 'tumpuk', + 'menumpuknya': 'tumpuk', + 'menumpukkan': 'tumpuk', + 'menumpuki': 'tumpuk', + 'setumpuk': 'tumpuk', + 'setumpuknya': 'tumpuk', + 'tumpukan': 'tumpuk', + 'tumpukannya': 'tumpuk', + 'tertumpuk': 'tumpuk', + 'tertumpuknya': 'tumpuk', + 'penumpukanan': 'tumpuk', + 'bertumpuk-tumpuk': 'tumpuk', + 'bertumpuk-tumpukan': 'tumpuk', + 'ketumpulan': 'tumpul', + 'ketumpulannya': 'tumpul', + 'menumpulkan': 'tumpul', + 'menumpur': 'tumpur', + 'menumpurkan': 'tumpur', + 'tertumus': 'tumus', + 'tertunam': 'tunam', + 'menunas': 'tunas', + 'bertunas': 'tunas', + 'menunasi': 'tunas', + 'pertunasan': 'tunas', + 'bertundang': 'tundang', + 'bertundangan': 'tundang', + 'menundung': 'tundung', + 'tundungan': 'tundung', + 'menungau': 'tungau', + 'penunggak': 'tunggak', + 'penunggaknya': 'tunggak', + 'penunggakkan': 'tunggak', + 'penunggakan': 'tunggak', + 'menunggak': 'tunggak', + 'menunggaknya': 'tunggak', + 'menunggaklah': 'tunggak', + 'menunggakan': 'tunggak', + 'tunggakan': 'tunggak', + 'tunggakannya': 'tunggak', + 'menunggal': 'tunggal', + 'menunggalkan': 'tunggal', + 'setunggal': 'tunggal', + 'ketunggalan': 'tunggal', + 'ketunggalannya': 'tunggal', + 'menungganglanggangkan': 'tunggang langgang', + 'menunggik': 'tunggik', + 'tertunggik': 'tunggik', + 'menunggikkan': 'tunggik', + 'menungging': 'tungging', + 'menunggingkan': 'tungging', + 'setungging': 'tungging', + 'bersetungging': 'tungging', + 'menunggul': 'tunggul', + 'menunggulkan': 'tunggul', + 'menungguli': 'tunggul', + 'tunggul-tunggul': 'tunggul', + 'menungkai': 'tungkai', + 'penungkul': 'tungkul', + 'penungkulan': 'tungkul', + 'menungkul': 'tungkul', + 'menungkup': 'tungkup', + 'tertungkup': 'tungkup', + 'menungkupkan': 'tungkup', + 'menungkus': 'tungkus', + 'menunjal': 'tunjal', + 'menunjam': 'tunjam', + 'menunjamnya': 'tunjam', + 'ketuntasan': 'tuntas', + 'menuntaskan': 'tuntas', + 'menuntaskannya': 'tuntas', + 'menuntung': 'tuntung', + 'menuntungkan': 'tuntung', + 'menuntungkannya': 'tuntung', + 'setuntung': 'tuntung', + 'tertuntung': 'tuntung', + 'menuntut': 'tuntut', + 'menuntutnya': 'tuntut', + 'menuntutlah': 'tuntut', + 'menuntutkan': 'tuntut', + 'menuntuti': 'tuntut', + 'menuntutan': 'tuntut', + 'menuntutku': 'tuntut', + 'menuntutmu': 'tuntut', + 'penuntut': 'tuntut', + 'penuntutnya': 'tuntut', + 'penuntutan': 'tuntut', + 'tuntutan': 'tuntut', + 'tuntutannya': 'tuntut', + 'tuntutanan': 'tuntut', + 'tuntutanku': 'tuntut', + 'penuntutannya': 'tuntut', + 'menunu': 'tunu', + 'menunukan': 'tunu', + 'tertunu': 'tunu', + 'penunuan': 'tunu', + 'tupai-tupaian': 'tupai', + 'bertura-tura': 'tura', + 'peturasan': 'turas', + 'menurbakan': 'turba', + 'turi-turian': 'turi', + 'menurus': 'turus', + 'menurusnya': 'turus', + 'menuruskan': 'turus', + 'menuruskannya': 'turus', + 'menurusi': 'turus', + 'menusir': 'tusir', + 'bertutu': 'tutu', + 'menutuh': 'tutuh', + 'menutuhkan': 'tutuh', + 'menutuk': 'tutuk', + 'menutukan': 'tutuk', + 'menutuli': 'tutul', + 'menutulkan': 'tutul', + 'tuyuk-tuyuk': 'tuyuk', + 'menguani': 'uan', + 'menguankan': 'uan', + 'menguar': 'uar', + 'menguarnya': 'uar', + 'uar-uar': 'uar', + 'penguaran': 'uar', + 'menguar-uarkan': 'uar-uar', + 'mengubah bentuk': 'ubah bentuk', + 'pengubahbentukan': 'ubah bentuk', + 'mengubang': 'ubang', + 'mengubar': 'ubar', + 'mengubarkan': 'ubar', + 'ubatan': 'ubat', + 'ubek-ubekan': 'ubek', + 'mengubek-ubek': 'ubek', + 'ubel-ubel': 'ubel', + 'uberan': 'uber', + 'penguber': 'uber', + 'menguber': 'uber', + 'penguberan': 'uber', + 'menguber-uber': 'uber', + 'mengubit-ubit': 'ubit', + 'mengubrak-abrik': 'ubrak-abrik', + 'ububan': 'ubub', + 'pengubub': 'ubub', + 'mengububi': 'ubub', + 'pengububan': 'ubub', + 'mengubung': 'ubung', + 'mengubungkan': 'ubung', + 'mengubungkannya': 'ubung', + 'mengubungi': 'ubung', + 'mengubungan': 'ubung', + 'mengucek': 'ucek', + 'menguceknya': 'ucek', + 'mengucek-ucek': 'ucek', + 'mengudak': 'udak', + 'udap-udapan': 'udap', + 'mengudar': 'udar', + 'mengudari': 'udar', + 'pengudaran': 'udar', + 'mengudarkan': 'udar', + 'mengudara': 'udara', + 'mengudaranya': 'udara', + 'mengudarakan': 'udara', + 'mengudarakannya': 'udara', + 'pengudaraan': 'udara', + 'mengudek': 'udek', + 'udutan': 'udut', + 'mengudut': 'udut', + 'pengudut': 'udut', + 'berufuk': 'ufuk', + 'keugaharian': 'ugahari', + 'mengugemi': 'ugem', + 'ugeran': 'uger', + 'menguik': 'uik', + 'menguik-uik': 'uik', + 'menguis-uis': 'uis', + 'ujaran': 'ujar', + 'ujarannya': 'ujar', + 'berujar': 'ujar', + 'ujar-ujar': 'ujar', + 'ujar-ujaran': 'ujar', + 'mengujarkan': 'ujar', + 'berujud': 'ujud', + 'mengujud': 'ujud', + 'mengujudkan': 'ujud', + 'seujung': 'ujung', + 'berujung': 'ujung', + 'berujungnya': 'ujung', + 'berujunglah': 'ujung', + 'berujungan': 'ujung', + 'pengujung': 'ujung', + 'pengujungnya': 'ujung', + 'pengujungan': 'ujung', + 'mengujung': 'ujung', + 'mengujungi': 'ujung', + 'ukupan': 'ukup', + 'berukup': 'ukup', + 'pengukup': 'ukup', + 'perukupan': 'ukup', + 'mengukupi': 'ukup', + 'pengukupan': 'ukup', + 'berulah': 'ulah', + 'ulakan': 'ulak', + 'ulak-ulak': 'ulak', + 'ulaman': 'ulam', + 'berulam': 'ulam', + 'ulam-ulam': 'ulam', + 'berulang kali': 'ulang kali', + 'berulang tahun': 'ulang tahun', + 'berulang-alik': 'ulang-alik', + 'mengular': 'ular', + 'mengularnya': 'ular', + 'mengularkan': 'ular', + 'ular-ularan': 'ular', + 'seulas': 'ulas', + 'ulasan': 'ulas', + 'ulasannya': 'ulas', + 'diulas': 'ulas', + 'diulasnya': 'ulas', + 'diulaskan': 'ulas', + 'diulaskannya': 'ulas', + 'berulas': 'ulas', + 'mengulas': 'ulas', + 'mengulasnya': 'ulas', + 'mengulaskan': 'ulas', + 'mengulaskannya': 'ulas', + 'mengulasi': 'ulas', + 'pengulas': 'ulas', + 'pengulasan': 'ulas', + 'perulasan': 'ulas', + 'mengulas-ulas': 'ulas', + 'ulekan': 'ulek', + 'ulekannya': 'ulek', + 'mengulek': 'ulek', + 'menguleknya': 'ulek', + 'ulek-ulek': 'ulek', + 'pengulekan': 'ulek', + 'uleman': 'ulem', + 'mengulemi': 'ulem', + 'menguleni': 'ulen', + 'mengules': 'ules', + 'keuletan': 'ulet', + 'keuletannya': 'ulet', + 'keuletanlah': 'ulet', + 'mengulik': 'ulik', + 'menguliknya': 'ulik', + 'berulit': 'ulit', + 'mengulitkan': 'ulit', + 'mengulit-ulit': 'ulit', + 'berulos': 'ulos', + 'pengulosan': 'ulos', + 'beruluk salam': 'uluk salam', + 'uluran': 'ulur', + 'terulur': 'ulur', + 'terulurnya': 'ulur', + 'mengulur': 'ulur', + 'mengulurnya': 'ulur', + 'mengulurkan': 'ulur', + 'penguluran': 'ulur', + 'memperulur': 'ulur', + 'mengulur-ulur': 'ulur', + 'mengulur-ulurnya': 'ulur', + 'menguman': 'uman', + 'menguman-uman': 'uman', + 'keumatan': 'umat', + 'keumatannya': 'umat', + 'pengumban': 'umban', + 'terumbang-umbang': 'umbang', + 'terumbang-ambing': 'umbang-ambing', + 'mengumbang-ambingkan': 'umbang-ambing', + 'mengumbar': 'umbar', + 'mengumbarnya': 'umbar', + 'mengumbarkan': 'umbar', + 'pengumbaran': 'umbar', + 'berumbi': 'umbi', + 'umbi-umbian': 'umbi', + 'umbi-umbiannya': 'umbi', + 'umbul-umbul': 'umbul', + 'umbul-umbulnya': 'umbul', + 'mengumbut': 'umbut', + 'berumpak': 'umpak', + 'mengumpak': 'umpak', + 'mengumpakan': 'umpak', + 'pengumpak': 'umpak', + 'mengumpak-umpak': 'umpak', + 'umpatan': 'umpat', + 'umpatannya': 'umpat', + 'pengumpat': 'umpat', + 'mengumpat': 'umpat', + 'mengumpatnya': 'umpat', + 'mengumpati': 'umpat', + 'pengumpatan': 'umpat', + 'umpetan': 'umpet', + 'mengumpet': 'umpet', + 'berumpuk': 'umpuk', + 'berumun': 'umun', + 'mengumun': 'umun', + 'mengumunkan': 'umun', + 'undakan': 'undak', + 'mengundak': 'undak', + 'mengundakan': 'undak', + 'undak-undakan': 'undak', + 'undak-undakannya': 'undak', + 'berundak-undak': 'undak', + 'berundan-undan': 'undan', + 'mengunduh': 'unduh', + 'mengunduhnya': 'unduh', + 'mengunduhkan': 'unduh', + 'memperundungkan': 'undung-undung', + 'berundung-undung': 'undung-undung', + 'mengungam': 'ungam', + 'unggah ungguh': 'unggah', + 'mengunggas': 'unggas', + 'berunggut-unggut': 'unggut', + 'mengungkah': 'ungkah', + 'mengungkat-ungkat': 'ungkat', + 'pengungkil': 'ungkil', + 'pengungkilan': 'ungkil', + 'mengungkil': 'ungkil', + 'ungkulan': 'ungkul', + 'berungkur-ungkuran': 'ungkur', + 'pengungsi': 'ungsi', + 'pengungsinya': 'ungsi', + 'pengungsilah': 'ungsi', + 'pengungsian': 'ungsi', + 'mengungsi': 'ungsi', + 'mengungsinya': 'ungsi', + 'mengungsilah': 'ungsi', + 'mengungsikan': 'ungsi', + 'mengungsikannya': 'ungsi', + 'mengungsian': 'ungsi', + 'pengungsiannya': 'ungsi', + 'keungu-unguan': 'ungu', + 'beruniform': 'uniform', + 'keuniversalan': 'universal', + 'berunjuk rasa': 'unjuk rasa', + 'pengunjuk rasa': 'unjuk rasa', + 'mengunjun': 'unjun', + 'mengunjuni': 'unjun', + 'mengunjungkan': 'unjung', + 'unjuran': 'unjur', + 'belunjur': 'unjur', + 'terunjur': 'unjur', + 'mengunjur': 'unjur', + 'mengunjurkan': 'unjur', + 'mengunjutkan': 'unjut', + 'untaian': 'untai', + 'untaiannya': 'untai', + 'beruntai': 'untai', + 'teruntai': 'untai', + 'menguntai': 'untai', + 'menguntaikannya': 'untai', + 'beruntaian': 'untai', + 'beruntai-untai': 'untai', + 'menguntal': 'untal', + 'seuntil': 'until', + 'menguntil': 'until', + 'menguntir': 'untir', + 'teruntuk': 'untuk', + 'beruntuk': 'untuk', + 'peruntukan': 'untuk', + 'peruntukannya': 'untuk', + 'menguntukkan': 'untuk', + 'memperuntukkan': 'untuk', + 'memperuntukkannya': 'untuk', + 'mengunun': 'unun', + 'berunyai': 'unyai', + 'mengunyai': 'unyai', + 'berunyai-unyai': 'unyai', + 'mengupa-upa': 'upa', + 'upaman': 'upam', + 'terupam': 'upam', + 'mengupam': 'upam', + 'pengupam': 'upam', + 'mengupar': 'upar', + 'menguparkan': 'upar', + 'terupaya': 'upaya', + 'berupaya': 'upaya', + 'berupayanya': 'upaya', + 'berupayalah': 'upaya', + 'berupayakan': 'upaya', + 'pengupayaan': 'upaya', + 'mengupayakan': 'upaya', + 'mengupayakannya': 'upaya', + 'seupaya-upaya': 'upaya', + 'seupaya-upayanya': 'upaya', + 'upih-upih': 'upih', + 'berura-ura': 'ura-ura', + 'mengurah': 'urah', + 'mengurahi': 'urah', + 'urakan': 'urak', + 'urakannya': 'urak', + 'berurap': 'urap', + 'mengurap': 'urap', + 'mengurapi': 'urap', + 'beruras': 'uras', + 'berurasi': 'uras', + 'mengurasikan': 'uras', + 'menguraskan': 'uras', + 'berurat': 'urat', + 'menguri': 'uri', + 'mengurik': 'urik', + 'mengurik-urik': 'urik', + 'berurine': 'urine', + 'uring-uringan': 'uring', + 'uring-uringannya': 'uring', + 'beruris-uris': 'uris', + 'urukan': 'uruk', + 'menguruk': 'uruk', + 'menguruknya': 'uruk', + 'mengurukan': 'uruk', + 'pengurukan': 'uruk', + 'pengurukannya': 'uruk', + 'urunan': 'urun', + 'urunannya': 'urun', + 'urunanan': 'urun', + 'berurung': 'urung', + 'usahkan': 'usah', + 'mengusaki': 'usak', + 'berusali': 'usali', + 'user-useran': 'user-user', + 'usilan': 'usil', + 'mengusil-usil': 'usil', + 'mengusil-usilkan': 'usil', + 'keusrekan': 'usrek', + 'pengusutan': 'usut', + 'pengusutannya': 'usut', + 'mengutak-atik': 'utak-atik', + 'mengutak-atiknya': 'utak-atik', + 'utangan': 'utang', + 'berutang': 'utang', + 'berutangnya': 'utang', + 'berutanglah': 'utang', + 'mengutangi': 'utang', + 'mengutanginya': 'utang', + 'perutangan': 'utang', + 'mengutangkan': 'utang', + 'memperutangi': 'utang', + 'memperutangkan': 'utang', + 'utasan': 'utas', + 'berutas': 'utas', + 'pengutik': 'utik', + 'pengutikan': 'utik', + 'mengutik-utik': 'utik', + 'menguyuh': 'uyuh', + 'menguyuhi': 'uyuh', + 'pervaginaan': 'vagina', + 'bervakansi': 'vakansi', + 'memvaksinasi': 'vaksinasi', + 'memvaksinasinya': 'vaksinasi', + 'memvaksinasikan': 'vaksinasi', + 'kevakuman': 'vakum', + 'pervalasan': 'valas', + 'bervariasi': 'variasi', + 'bervariasinya': 'variasi', + 'memvariasikan': 'variasi', + 'memvariasikannya': 'variasi', + 'memveto': 'veto', + 'memvetonya': 'veto', + 'virus': 'visa', + 'virusnya': 'visa', + 'memvisualkan': 'visual', + 'memvisualkannya': 'visual', + 'memvisualisasikan': 'visualisasi', + 'memvisualisasikannya': 'visualisasi', + 'memvitalkan': 'vital', + 'memvonis': 'vonis', + 'memvonisnya': 'vonis', + 'memvonisku': 'vonis', + 'berwaad': 'waad', + 'mewabah': 'wabah', + 'mewabahnya': 'wabah', + 'mewabahkan': 'wabah', + 'mewabahi': 'wabah', + 'mewadahi': 'wadah', + 'mewadahinya': 'wadah', + 'terwadahi': 'wadah', + 'terwadahinya': 'wadah', + 'berwadahkan': 'wadah', + 'mewahyukan': 'wahyu', + 'berwajah': 'wajah', + 'berwajahkan': 'wajah', + 'perwajahan': 'wajah', + 'perwajahannya': 'wajah', + 'berwakaf': 'wakaf', + 'mewakafkan': 'wakaf', + 'mewakafkannya': 'wakaf', + 'berwakil': 'wakil', + 'berwakilan': 'wakil', + 'mewakili': 'wakil', + 'mewakilinya': 'wakil', + 'mewakilii': 'wakil', + 'mewakiliku': 'wakil', + 'terwakili': 'wakil', + 'terwakilinya': 'wakil', + 'mewakilkan': 'wakil', + 'mewakilkannya': 'wakil', + 'perwakilan': 'wakil', + 'perwakilannya': 'wakil', + 'perwakilani': 'wakil', + 'perwakilanku': 'wakil', + 'keterwakilan': 'wakil', + 'keterwakilannya': 'wakil', + 'sewaktu': 'waktu', + 'berwaktu': 'waktu', + 'pewaktuan': 'waktu', + 'sewaktu-waktu': 'waktu', + 'sewaktu-waktunya': 'waktu', + 'terwalak': 'walak', + 'mewalakkan': 'walak', + 'kewangsaan': 'wangsa', + 'wanita tunasusila': 'kewanitaan', + 'wantahan': 'wantah', + 'mewantek': 'wantek', + 'pewantekan': 'wantek', + 'mewanti-wanti': 'wanti-wanti', + 'mewanti-wantinya': 'wanti-wanti', + 'mewanti-wantikan': 'wanti-wanti', + 'wara-wara': 'wara', + 'pewaralaba': 'waralaba', + 'pewaralabanya': 'waralaba', + 'terwaralaba': 'waralaba', + 'pewaralabaan': 'waralaba', + 'kewargaan': 'warga', + 'kewargaannya': 'warga', + 'kewarganegaraan': 'warga negara', + 'kewarganegaraannya': 'warga negara', + 'kewarganegaraanku': 'warga negara', + 'kewarganegaraanmu': 'warga negara', + 'pewarganegaraan': 'warga negara', + 'mewarganegarakan': 'warga negara', + 'berwari': 'wari', + 'berwarna-warni': 'warna-warni', + 'berwarna-warninya': 'warna-warni', + 'mewarna-warnikan': 'warna-warni', + 'berwarung': 'warung', + 'mewasiti': 'wasit', + 'perwasitan': 'wasit', + 'perwasitannya': 'wasit', + 'kewaskitaan': 'waskita', + 'mewaspadai': 'waspada', + 'mewaspadainya': 'waspada', + 'berwaspada': 'waspada', + 'berwaspadalah': 'waspada', + 'kewaspadaan': 'waspada', + 'kewaspadaannya': 'waspada', + 'kewaspadaanmu': 'waspada', + 'mewaspadakan': 'waspada', + 'berwaswas': 'waswas', + 'pewatas': 'watas', + 'mewatasi': 'watas', + 'berwawanmuka': 'wawanmuka', + 'berwawanrembuk': 'wawanrembuk', + 'mewawas diri': 'wawas diri', + 'mewawas': 'wawas', + 'wawasan': 'wawas', + 'wawasannya': 'wawas', + 'wawasanmu': 'wawas', + 'pewayang': 'wayang', + 'pewayangan': 'wayang', + 'wayangan': 'wayang', + 'wayangannya': 'wayang', + 'mewayangkan': 'wayang', + 'kewedanaan': 'wedana', + 'mewedar': 'wedar', + 'wedaran': 'wedar', + 'wedelan': 'wedel', + 'mewedel': 'wedel', + 'kewedukan': 'weduk', + 'mewejang': 'wejang', + 'wejangan': 'wejang', + 'wejangannya': 'wejang', + 'welasan': 'welas', + 'welingan': 'weling', + 'wewenang': 'wenang', + 'wewenangnya': 'wenang', + 'wewenanglah': 'wenang', + 'wewenangkan': 'wenang', + 'wewenangan': 'wenang', + 'wewenangku': 'wenang', + 'berwenang': 'wenang', + 'berwenangnya': 'wenang', + 'berwenanglah': 'wenang', + 'berwenangkan': 'wenang', + 'berwenangan': 'wenang', + 'kewenangan': 'wenang', + 'kewenangannya': 'wenang', + 'kewenangankan': 'wenang', + 'kewenanganan': 'wenang', + 'kewenanganku': 'wenang', + 'sewenang-wenang': 'wenang', + 'sewenang-wenangnya': 'wenang', + 'sewenang-wenangan': 'wenang', + 'kesewenang-wenangan': 'wenang', + 'kesewenang-wenangannya': 'wenang', + 'kesewenang-wenanganan': 'wenang', + 'wijikan': 'wijik', + 'sewilayah': 'wilayah', + 'sewilayahnya': 'wilayah', + 'mewilayahi': 'wilayah', + 'perwilayahan': 'wilayah', + 'berwindu-windu': 'windu', + 'sewingit': 'wingit', + 'kewiraan': 'wira', + 'berwiraswasta': 'wiraswasta', + 'kewiraswastaan': 'wiraswasta', + 'mewiraswastakan': 'wiraswasta', + 'wiridan': 'wirid', + 'mewiridkan': 'wirid', + 'mewiru': 'wiru', + 'mewirukan': 'wiru', + 'berwiru-wiru': 'wiru', + 'berwisata': 'wisata', + 'berwisatanya': 'wisata', + 'berwisatalah': 'wisata', + 'mewismakan': 'wisma', + 'mewisuda': 'wisuda', + 'mewisudanya': 'wisuda', + 'mewisudakan': 'wisuda', + 'berwudu': 'wudu', + 'mewujud': 'wujud', + 'mewujudnya': 'wujud', + 'mewujudkan': 'wujud', + 'mewujudkannya': 'wujud', + 'mewujudan': 'wujud', + 'terwujud': 'wujud', + 'terwujudnya': 'wujud', + 'terwujudlah': 'wujud', + 'terwujudkan': 'wujud', + 'terwujudkannya': 'wujud', + 'berwujud': 'wujud', + 'pewujudan': 'wujud', + 'pewujudannya': 'wujud', + 'kewujudan': 'wujud', + 'mewujudkankannya': 'wujud', + 'perwujudan': 'wujud', + 'perwujudannya': 'wujud', + 'memperwujudkan': 'wujud', + 'berwukuf': 'wukuf', + 'wulangan': 'wulang', + 'memperyahudikan': 'yahudi', + 'meyakini': 'yakin', + 'meyakininya': 'yakin', + 'keyakinan': 'yakin', + 'keyakinannya': 'yakin', + 'keyakinanlah': 'yakin', + 'keyakinanan': 'yakin', + 'keyakinanku': 'yakin', + 'keyakinanmu': 'yakin', + 'meyakinkan': 'yakin', + 'meyakinkannya': 'yakin', + 'meyakinkankan': 'yakin', + 'meyakinkanku': 'yakin', + 'meyakinkanmu': 'yakin', + 'berkeyakinan': 'yakin', + 'berkeyakinannya': 'yakin', + 'berkeyakinanan': 'yakin', + 'meyakin-yakini': 'yakin', + 'kun fa yakun': 'yakun', + 'yang-yang': 'yang', + 'yang-yangan': 'yang', + 'beryang-yang': 'yang', + 'beryoga': 'yoga', + 'beryogalah': 'yoga', + 'seyogianya': 'yogia', + 'sezarah': 'zarah', + 'menzarah': 'zarah', + 'pezikir': 'zikir', + 'berzikir': 'zikir', + 'berzikirlah': 'zikir', + 'berzikiri': 'zikir', + 'perzonaan': 'zona' +} diff --git a/spacy/lang/id/lex_attrs.py b/spacy/lang/id/lex_attrs.py new file mode 100644 index 000000000..fb6a31f99 --- /dev/null +++ b/spacy/lang/id/lex_attrs.py @@ -0,0 +1,41 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...attrs import LIKE_NUM + + +_num_words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', + 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', + 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen', 'twenty', + 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety', + 'hundred', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', + 'gajillion', 'bazillion', + 'nol', 'satu', 'dua', 'tiga', 'empat', 'lima', 'enam', 'tujuh', + 'delapan', 'sembilan', 'sepuluh', 'sebelas', 'duabelas', 'tigabelas', + 'empatbelas', 'limabelas', 'enambelas', 'tujuhbelas', 'delapanbelas', + 'sembilanbelas', 'duapuluh', 'seratus', 'seribu', 'sejuta', + 'ribu', 'rb', 'juta', 'jt', 'miliar', 'biliun', 'triliun', + 'kuadriliun', 'kuintiliun', 'sekstiliun', 'septiliun', 'oktiliun', + 'noniliun', 'desiliun'] + + +def like_num(text): + text = text.replace(',', '').replace('.', '') + if text.isdigit(): + return True + if text.count('/') == 1: + num, denom = text.split('/') + if num.isdigit() and denom.isdigit(): + return True + if text in _num_words: + return True + if text.count('-') == 1: + _, num = text.split('-') + if num.isdigit() or num in _num_words: + return True + return False + + +LEX_ATTRS = { + LIKE_NUM: like_num +} diff --git a/spacy/lang/id/norm_exceptions.py b/spacy/lang/id/norm_exceptions.py new file mode 100644 index 000000000..cb168dfeb --- /dev/null +++ b/spacy/lang/id/norm_exceptions.py @@ -0,0 +1,17 @@ +# coding: utf8 +from __future__ import unicode_literals + +_exc = { + "Rp": "$", + "IDR": "$", + "RMB": "$", + "USD": "$", + "AUD": "$", + "GBP": "$", +} + +NORM_EXCEPTIONS = {} + +for string, norm in _exc.items(): + NORM_EXCEPTIONS[string] = norm + NORM_EXCEPTIONS[string.title()] = norm diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py new file mode 100644 index 000000000..b8f8c57a8 --- /dev/null +++ b/spacy/lang/id/punctuation.py @@ -0,0 +1,53 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ..punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES +from ..char_classes import merge_chars, split_chars, _currency, _units +from ..char_classes import LIST_PUNCT, LIST_ELLIPSES, LIST_QUOTES +from ..char_classes import QUOTES, UNITS, ALPHA, ALPHA_LOWER, ALPHA_UPPER, HYPHENS + +_units = (_units + 's bit Gbps Mbps mbps Kbps kbps ƒ ppi px ' + 'Hz kHz MHz GHz mAh ' + 'ratus rb ribu ribuan ' + 'juta jt jutaan mill?iar million bil[l]?iun bilyun billion ' + ) +_currency = (_currency + r' USD Rp IDR RMB SGD S\$') +_months = ('Januari Februari Maret April Mei Juni Juli Agustus September ' + 'Oktober November Desember January February March May June ' + 'July August October December Jan Feb Mar Jun Jul Aug Sept ' + 'Oct Okt Nov Des ') + + +UNITS = merge_chars(_units) +CURRENCY = merge_chars(_currency) +HTML_PREFIX = r'<(b|strong|i|em|p|span|div|br)\s?/>|]+)>' +HTML_SUFFIX = r'' +MONTHS = merge_chars(_months) +LIST_CURRENCY = split_chars(_currency) + +TOKENIZER_PREFIXES.remove('#') # hashtag +_prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['/', '—'] + +_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '-[KkMm]u', '[—-]'] + [ + r'(?<={c})(?:[0-9]+)'.format(c=CURRENCY), + r'(?<=[0-9])(?:{u})'.format(u=UNITS), + r'(?<=[0-9])%', + r'(?<=[0-9{a}]{h})(?:[\.,:-])'.format(a=ALPHA, h=HTML_SUFFIX), + r'(?<=[0-9{a}])(?:{h})'.format(a=ALPHA, h=HTML_SUFFIX), + ] + +_infixes = TOKENIZER_INFIXES + [ + r'(?<=[0-9])[\\/](?=[0-9%-])', + r'(?<=[0-9])%(?=[{a}0-9/])'.format(a=ALPHA), + r'(?<={u})[\/-](?=[0-9])'.format(u=UNITS), + r'(?<={m})[\/-](?=[0-9])'.format(m=MONTHS), + r'(?<=[0-9\)][\.,])"(?=[0-9])', + r'(?<=[{a}\)][\.,\'])["—](?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}])-(?=[0-9])'.format(a=ALPHA), + r'(?<=[0-9])-(?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}])[\/-](?={c}{a})'.format(a=ALPHA, c=CURRENCY), +] + +TOKENIZER_PREFIXES = _prefixes +TOKENIZER_SUFFIXES = _suffixes +TOKENIZER_INFIXES = _infixes diff --git a/spacy/lang/id/stop_words.py b/spacy/lang/id/stop_words.py new file mode 100644 index 000000000..0b72df5a1 --- /dev/null +++ b/spacy/lang/id/stop_words.py @@ -0,0 +1,763 @@ +# coding: utf8 +from __future__ import unicode_literals + +STOP_WORDS = set(""" +ada +adalah +adanya +adapun +agak +agaknya +agar +akan +akankah +akhir +akhiri +akhirnya +aku +akulah +amat +amatlah +anda +andalah +antar +antara +antaranya +apa +apaan +apabila +apakah +apalagi +apatah +artinya +asal +asalkan +atas +atau +ataukah +ataupun +awal +awalnya +bagai +bagaikan +bagaimana +bagaimanakah +bagaimanapun +bagi +bagian +bahkan +bahwa +bahwasanya +baik +bakal +bakalan +balik +banyak +bapak +baru +bawah +beberapa +begini +beginian +beginikah +beginilah +begitu +begitukah +begitulah +begitupun +bekerja +belakang +belakangan +belum +belumlah +benar +benarkah +benarlah +berada +berakhir +berakhirlah +berakhirnya +berapa +berapakah +berapalah +berapapun +berarti +berawal +berbagai +berdatangan +beri +berikan +berikut +berikutnya +berjumlah +berkali-kali +berkata +berkehendak +berkeinginan +berkenaan +berlainan +berlalu +berlangsung +berlebihan +bermacam +bermacam-macam +bermaksud +bermula +bersama +bersama-sama +bersiap +bersiap-siap +bertanya +bertanya-tanya +berturut +berturut-turut +bertutur +berujar +berupa +besar +betul +betulkah +biasa +biasanya +bila +bilakah +bisa +bisakah +boleh +bolehkah +bolehlah +buat +bukan +bukankah +bukanlah +bukannya +bulan +bung +cara +caranya +cukup +cukupkah +cukuplah +cuma +dahulu +dalam +dan +dapat +dari +daripada +datang +dekat +demi +demikian +demikianlah +dengan +depan +di +dia +diakhiri +diakhirinya +dialah +diantara +diantaranya +diberi +diberikan +diberikannya +dibuat +dibuatnya +didapat +didatangkan +digunakan +diibaratkan +diibaratkannya +diingat +diingatkan +diinginkan +dijawab +dijelaskan +dijelaskannya +dikarenakan +dikatakan +dikatakannya +dikerjakan +diketahui +diketahuinya +dikira +dilakukan +dilalui +dilihat +dimaksud +dimaksudkan +dimaksudkannya +dimaksudnya +diminta +dimintai +dimisalkan +dimulai +dimulailah +dimulainya +dimungkinkan +dini +dipastikan +diperbuat +diperbuatnya +dipergunakan +diperkirakan +diperlihatkan +diperlukan +diperlukannya +dipersoalkan +dipertanyakan +dipunyai +diri +dirinya +disampaikan +disebut +disebutkan +disebutkannya +disini +disinilah +ditambahkan +ditandaskan +ditanya +ditanyai +ditanyakan +ditegaskan +ditujukan +ditunjuk +ditunjuki +ditunjukkan +ditunjukkannya +ditunjuknya +dituturkan +dituturkannya +diucapkan +diucapkannya +diungkapkan +dong +dua +dulu +empat +enggak +enggaknya +entah +entahlah +guna +gunakan +hal +hampir +hanya +hanyalah +hari +harus +haruslah +harusnya +hendak +hendaklah +hendaknya +hingga +ia +ialah +ibarat +ibaratkan +ibaratnya +ibu +ikut +ingat +ingat-ingat +ingin +inginkah +inginkan +ini +inikah +inilah +itu +itukah +itulah +jadi +jadilah +jadinya +jangan +jangankan +janganlah +jauh +jawab +jawaban +jawabnya +jelas +jelaskan +jelaslah +jelasnya +jika +jikalau +juga +jumlah +jumlahnya +justru +kala +kalau +kalaulah +kalaupun +kalian +kami +kamilah +kamu +kamulah +kan +kapan +kapankah +kapanpun +karena +karenanya +kasus +kata +katakan +katakanlah +katanya +ke +keadaan +kebetulan +kecil +kedua +keduanya +keinginan +kelamaan +kelihatan +kelihatannya +kelima +keluar +kembali +kemudian +kemungkinan +kemungkinannya +kenapa +kepada +kepadanya +kesampaian +keseluruhan +keseluruhannya +keterlaluan +ketika +khususnya +kini +kinilah +kira +kira-kira +kiranya +kita +kitalah +kok +kurang +lagi +lagian +lah +lain +lainnya +lalu +lama +lamanya +lanjut +lanjutnya +lebih +lewat +lima +luar +macam +maka +makanya +makin +malah +malahan +mampu +mampukah +mana +manakala +manalagi +masa +masalah +masalahnya +masih +masihkah +masing +masing-masing +mau +maupun +melainkan +melakukan +melalui +melihat +melihatnya +memang +memastikan +memberi +memberikan +membuat +memerlukan +memihak +meminta +memintakan +memisalkan +memperbuat +mempergunakan +memperkirakan +memperlihatkan +mempersiapkan +mempersoalkan +mempertanyakan +mempunyai +memulai +memungkinkan +menaiki +menambahkan +menandaskan +menanti +menanti-nanti +menantikan +menanya +menanyai +menanyakan +mendapat +mendapatkan +mendatang +mendatangi +mendatangkan +menegaskan +mengakhiri +mengapa +mengatakan +mengatakannya +mengenai +mengerjakan +mengetahui +menggunakan +menghendaki +mengibaratkan +mengibaratkannya +mengingat +mengingatkan +menginginkan +mengira +mengucapkan +mengucapkannya +mengungkapkan +menjadi +menjawab +menjelaskan +menuju +menunjuk +menunjuki +menunjukkan +menunjuknya +menurut +menuturkan +menyampaikan +menyangkut +menyatakan +menyebutkan +menyeluruh +menyiapkan +merasa +mereka +merekalah +merupakan +meski +meskipun +meyakini +meyakinkan +minta +mirip +misal +misalkan +misalnya +mula +mulai +mulailah +mulanya +mungkin +mungkinkah +nah +naik +namun +nanti +nantinya +nyaris +nyatanya +oleh +olehnya +pada +padahal +padanya +pak +paling +panjang +pantas +para +pasti +pastilah +penting +pentingnya +per +percuma +perlu +perlukah +perlunya +pernah +persoalan +pertama +pertama-tama +pertanyaan +pertanyakan +pihak +pihaknya +pukul +pula +pun +punya +rasa +rasanya +rata +rupanya +saat +saatnya +saja +sajalah +saling +sama +sama-sama +sambil +sampai +sampai-sampai +sampaikan +sana +sangat +sangatlah +satu +saya +sayalah +se +sebab +sebabnya +sebagai +sebagaimana +sebagainya +sebagian +sebaik +sebaik-baiknya +sebaiknya +sebaliknya +sebanyak +sebegini +sebegitu +sebelum +sebelumnya +sebenarnya +seberapa +sebesar +sebetulnya +sebisanya +sebuah +sebut +sebutlah +sebutnya +secara +secukupnya +sedang +sedangkan +sedemikian +sedikit +sedikitnya +seenaknya +segala +segalanya +segera +seharusnya +sehingga +seingat +sejak +sejauh +sejenak +sejumlah +sekadar +sekadarnya +sekali +sekali-kali +sekalian +sekaligus +sekalipun +sekarang +sekarang +sekecil +seketika +sekiranya +sekitar +sekitarnya +sekurang-kurangnya +sekurangnya +sela +selain +selaku +selalu +selama +selama-lamanya +selamanya +selanjutnya +seluruh +seluruhnya +semacam +semakin +semampu +semampunya +semasa +semasih +semata +semata-mata +semaunya +sementara +semisal +semisalnya +sempat +semua +semuanya +semula +sendiri +sendirian +sendirinya +seolah +seolah-olah +seorang +sepanjang +sepantasnya +sepantasnyalah +seperlunya +seperti +sepertinya +sepihak +sering +seringnya +serta +serupa +sesaat +sesama +sesampai +sesegera +sesekali +seseorang +sesuatu +sesuatunya +sesudah +sesudahnya +setelah +setempat +setengah +seterusnya +setiap +setiba +setibanya +setidak-tidaknya +setidaknya +setinggi +seusai +sewaktu +siap +siapa +siapakah +siapapun +sini +sinilah +soal +soalnya +suatu +sudah +sudahkah +sudahlah +supaya +tadi +tadinya +tahu +tahun +tak +tambah +tambahnya +tampak +tampaknya +tandas +tandasnya +tanpa +tanya +tanyakan +tanyanya +tapi +tegas +tegasnya +telah +tempat +tengah +tentang +tentu +tentulah +tentunya +tepat +terakhir +terasa +terbanyak +terdahulu +terdapat +terdiri +terhadap +terhadapnya +teringat +teringat-ingat +terjadi +terjadilah +terjadinya +terkira +terlalu +terlebih +terlihat +termasuk +ternyata +tersampaikan +tersebut +tersebutlah +tertentu +tertuju +terus +terutama +tetap +tetapi +tiap +tiba +tiba-tiba +tidak +tidakkah +tidaklah +tiga +tinggi +toh +tunjuk +turut +tutur +tuturnya +ucap +ucapnya +ujar +ujarnya +umum +umumnya +ungkap +ungkapnya +untuk +usah +usai +waduh +wah +wahai +waktu +waktunya +walau +walaupun +wong +yaitu +yakin +yakni +yang +""".split()) \ No newline at end of file diff --git a/spacy/lang/id/syntax_iterators.py b/spacy/lang/id/syntax_iterators.py new file mode 100644 index 000000000..c9de4f084 --- /dev/null +++ b/spacy/lang/id/syntax_iterators.py @@ -0,0 +1,42 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...symbols import NOUN, PROPN, PRON + + +def noun_chunks(obj): + """ + Detect base noun phrases from a dependency parse. Works on both Doc and Span. + """ + labels = ['nsubj', 'nsubj:pass', 'obj', 'iobj', 'ROOT', 'appos', 'nmod', 'nmod:poss'] + doc = obj.doc # Ensure works on both Doc and Span. + np_deps = [doc.vocab.strings[label] for label in labels] + conj = doc.vocab.strings.add('conj') + np_label = doc.vocab.strings.add('NP') + seen = set() + for i, word in enumerate(obj): + if word.pos not in (NOUN, PROPN, PRON): + continue + # Prevent nested chunks from being produced + if word.i in seen: + continue + if word.dep in np_deps: + if any(w.i in seen for w in word.subtree): + continue + seen.update(j for j in range(word.left_edge.i, word.right_edge.i+1)) + yield word.left_edge.i, word.right_edge.i+1, np_label + elif word.dep == conj: + head = word.head + while head.dep == conj and head.head.i < head.i: + head = head.head + # If the head is an NP, and we're coordinated to it, we're an NP + if head.dep in np_deps: + if any(w.i in seen for w in word.subtree): + continue + seen.update(j for j in range(word.left_edge.i, word.right_edge.i+1)) + yield word.left_edge.i, word.right_edge.i+1, np_label + + +SYNTAX_ITERATORS = { + 'noun_chunks': noun_chunks +} diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py new file mode 100644 index 000000000..9978606b0 --- /dev/null +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -0,0 +1,50 @@ +# coding: utf8 +from __future__ import unicode_literals + +import regex as re + +from ._tokenizer_exceptions_list import ID_BASE_EXCEPTIONS +from ..tokenizer_exceptions import URL_PATTERN +from ...symbols import ORTH + + +_exc = {} + +for orth in ID_BASE_EXCEPTIONS: + _exc[orth] = [{ORTH: orth}] + + orth_title = orth.title() + _exc[orth_title] = [{ORTH: orth_title}] + + orth_caps = orth.upper() + _exc[orth_caps] = [{ORTH: orth_caps}] + + orth_lower = orth.lower() + _exc[orth_lower] = [{ORTH: orth_lower}] + + if '-' in orth: + orth_title = '-'.join([part.title() for part in orth.split('-')]) + _exc[orth_title] = [{ORTH: orth_title}] + + orth_caps = '-'.join([part.upper() for part in orth.split('-')]) + _exc[orth_caps] = [{ORTH: orth_caps}] + + +for orth in [ + "'d", "a.m.", "Adm.", "Bros.", "co.", "Co.", "Corp.", "D.C.", "Dr.", "e.g.", + "E.g.", "E.G.", "Gen.", "Gov.", "i.e.", "I.e.", "I.E.", "Inc.", "Jr.", + "Ltd.", "Md.", "Messrs.", "Mo.", "Mont.", "Mr.", "Mrs.", "Ms.", "p.m.", + "Ph.D.", "Rep.", "Rev.", "Sen.", "St.", "vs.", + "B.A.", "B.Ch.E.", "B.Sc.", "Dr.", "Dra.", "Drs.", "Hj.", "Ka.", "Kp.", + "M.Ag.", "M.Hum.", "M.Kes,", "M.Kom.", "M.M.", "M.P.", "M.Pd.", "M.Sc.", + "M.Si.", "M.Sn.", "M.T.", "M.Th.", "No.", "Pjs.", "Plt.", "R.A.", "S.Ag.", + "S.E.", "S.H.", "S.Hut.", "S.K.M.", "S.Kedg.", "S.Kedh.", "S.Kom.", + "S.Pd.", "S.Pol.", "S.Psi.", "S.S.", "S.Sos.", "S.T.", "S.Tekp.", "S.Th.", + "a.l.", "a.n.", "a.s.", "b.d.", "d.a.", "d.l.", "d/h", "dkk.", "dll.", + "dr.", "drh.", "ds.", "dsb.", "dst.", "faks.", "fax.", "hlm.", "i/o", + "n.b.", "p.p." "pjs.", "s.d.", "tel.", "u.p.", + ]: + _exc[orth] = [{ORTH: orth}] + +TOKENIZER_EXCEPTIONS = dict(_exc) + diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py index 7cc717cb3..6bc47ce92 100644 --- a/spacy/lang/it/__init__.py +++ b/spacy/lang/it/__init__.py @@ -7,7 +7,6 @@ from .lemmatizer import LOOKUP from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups @@ -16,13 +15,9 @@ class ItalianDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'it' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS) - stop_words = set(STOP_WORDS) - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + stop_words = STOP_WORDS + lemma_lookup = LOOKUP class Italian(Language): diff --git a/spacy/lang/it/examples.py b/spacy/lang/it/examples.py new file mode 100644 index 000000000..d35b9f834 --- /dev/null +++ b/spacy/lang/it/examples.py @@ -0,0 +1,18 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.it.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple vuole comprare una startup del Regno Unito per un miliardo di dollari", + "Le automobili a guida autonoma spostano la responsabilità assicurativa verso i produttori", + "San Francisco prevede di bandire i robot di consegna porta a porta", + "Londra è una grande città del Regno Unito." +] diff --git a/spacy/lang/ja/__init__.py b/spacy/lang/ja/__init__.py index 09ad9945e..3a9c58fca 100644 --- a/spacy/lang/ja/__init__.py +++ b/spacy/lang/ja/__init__.py @@ -4,18 +4,36 @@ from __future__ import unicode_literals, print_function from ...language import Language from ...attrs import LANG from ...tokens import Doc +from ...tokenizer import Tokenizer + + +class JapaneseTokenizer(object): + def __init__(self, cls, nlp=None): + self.vocab = nlp.vocab if nlp is not None else cls.create_vocab(nlp) + try: + from janome.tokenizer import Tokenizer + except ImportError: + raise ImportError("The Japanese tokenizer requires the Janome " + "library: https://github.com/mocobeta/janome") + self.tokenizer = Tokenizer() + + def __call__(self, text): + words = [x.surface for x in self.tokenizer.tokenize(text)] + return Doc(self.vocab, words=words, spaces=[False]*len(words)) + + +class JapaneseDefaults(Language.Defaults): + @classmethod + def create_tokenizer(cls, nlp=None): + return JapaneseTokenizer(cls, nlp) class Japanese(Language): lang = 'ja' + Defaults = JapaneseDefaults def make_doc(self, text): - try: - from janome.tokenizer import Tokenizer - except ImportError: - raise ImportError("The Japanese tokenizer requires the Janome library: " - "https://github.com/mocobeta/janome") - words = [x.surface for x in Tokenizer().tokenize(text)] + words = self.tokenizer(text) return Doc(self.vocab, words=words, spaces=[False]*len(words)) diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py index 4c3284b1e..d4beebd26 100644 --- a/spacy/lang/lex_attrs.py +++ b/spacy/lang/lex_attrs.py @@ -137,6 +137,7 @@ LEX_ATTRS = { attrs.IS_UPPER: lambda string: string.isupper(), attrs.IS_STOP: lambda string: False, attrs.IS_OOV: lambda string: True, + attrs.PROB: lambda string: -20., attrs.LIKE_EMAIL: like_email, attrs.LIKE_NUM: like_num, attrs.IS_PUNCT: is_punct, diff --git a/spacy/lang/nb/__init__.py b/spacy/lang/nb/__init__.py index c1b4af263..4250e6809 100644 --- a/spacy/lang/nb/__init__.py +++ b/spacy/lang/nb/__init__.py @@ -16,9 +16,8 @@ class NorwegianDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'nb' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) + stop_words = STOP_WORDS class Norwegian(Language): diff --git a/spacy/lang/nb/examples.py b/spacy/lang/nb/examples.py new file mode 100644 index 000000000..0dc5c8144 --- /dev/null +++ b/spacy/lang/nb/examples.py @@ -0,0 +1,18 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.nb.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple vurderer å kjøpe britisk oppstartfirma for en milliard dollar", + "Selvkjørende biler flytter forsikringsansvaret over på produsentene ", + "San Francisco vurderer å forby robotbud på fortauene", + "London er en stor by i Storbritannia." +] diff --git a/spacy/lang/nl/__init__.py b/spacy/lang/nl/__init__.py index 7b948f295..13786a7bc 100644 --- a/spacy/lang/nl/__init__.py +++ b/spacy/lang/nl/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from .stop_words import STOP_WORDS +from .lex_attrs import LEX_ATTRS from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS @@ -12,11 +13,11 @@ from ...util import update_exc, add_lookups class DutchDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters.update(LEX_ATTRS) lex_attr_getters[LANG] = lambda text: 'nl' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS) - stop_words = set(STOP_WORDS) + stop_words = STOP_WORDS class Dutch(Language): diff --git a/spacy/lang/nl/lex_attrs.py b/spacy/lang/nl/lex_attrs.py new file mode 100644 index 000000000..08b1df3be --- /dev/null +++ b/spacy/lang/nl/lex_attrs.py @@ -0,0 +1,40 @@ +# coding: utf8 +from __future__ import unicode_literals + +from ...attrs import LIKE_NUM + + +_num_words = set(""" +nul een één twee drie vier vijf zes zeven acht negen tien elf twaalf dertien +veertien twintig dertig veertig vijftig zestig zeventig tachtig negentig honderd +duizend miljoen miljard biljoen biljard triljoen triljard +""".split()) + +_ordinal_words = set(""" +eerste tweede derde vierde vijfde zesde zevende achtste negende tiende elfde +twaalfde dertiende veertiende twintigste dertigste veertigste vijftigste +zestigste zeventigste tachtigste negentigste honderdste duizendste miljoenste +miljardste biljoenste biljardste triljoenste triljardste +""".split()) + + +def like_num(text): + # This only does the most basic check for whether a token is a digit + # or matches one of the number words. In order to handle numbers like + # "drieëntwintig", more work is required. + # See this discussion: https://github.com/explosion/spaCy/pull/1177 + text = text.replace(',', '').replace('.', '') + if text.isdigit(): + return True + if text.count('/') == 1: + num, denom = text.split('/') + if num.isdigit() and denom.isdigit(): + return True + if text in _num_words: + return True + return False + + +LEX_ATTRS = { + LIKE_NUM: like_num +} diff --git a/spacy/lang/norm_exceptions.py b/spacy/lang/norm_exceptions.py index b02dda2c8..7857a16bf 100644 --- a/spacy/lang/norm_exceptions.py +++ b/spacy/lang/norm_exceptions.py @@ -31,11 +31,21 @@ BASE_NORMS = { "„": '"', "»": '"', "«": '"', + "‘‘": '"', + "’’": '"', + "?": "?", + "!": "!", + ",": ",", + ";": ";", + ":": ":", + "。": ".", + "।": ".", "…": "...", "—": "-", "–": "-", "--": "-", "---": "-", + "——": "-", "€": "$", "£": "$", "¥": "$", diff --git a/spacy/lang/pl/__init__.py b/spacy/lang/pl/__init__.py index 067646dbd..80011f9d8 100644 --- a/spacy/lang/pl/__init__.py +++ b/spacy/lang/pl/__init__.py @@ -1,6 +1,7 @@ # coding: utf8 from __future__ import unicode_literals +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .stop_words import STOP_WORDS from ..tokenizer_exceptions import BASE_EXCEPTIONS @@ -14,9 +15,8 @@ class PolishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'pl' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS) - stop_words = set(STOP_WORDS) + tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + stop_words = STOP_WORDS class Polish(Language): diff --git a/spacy/lang/pl/examples.py b/spacy/lang/pl/examples.py new file mode 100644 index 000000000..af6c72af0 --- /dev/null +++ b/spacy/lang/pl/examples.py @@ -0,0 +1,20 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.pl.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Poczuł przyjemną woń mocnej kawy.", + "Istnieje wiele dróg oddziaływania substancji psychoaktywnej na układ nerwowy.", + "Powitał mnie biało-czarny kot, płosząc siedzące na płocie trzy dorodne dudki.", + "Nowy abonament pod lupą Komisji Europejskiej", + "Czy w ciągu ostatnich 48 godzin spożyłeś leki zawierające paracetamol?", + "Kto ma ochotę zapoznać się z innymi niż w książkach przygodami Muminków i ich przyjaciół, temu polecam komiks Tove Jansson „Muminki i morze”." +] diff --git a/spacy/lang/pl/tokenizer_exceptions.py b/spacy/lang/pl/tokenizer_exceptions.py new file mode 100644 index 000000000..4dffb6209 --- /dev/null +++ b/spacy/lang/pl/tokenizer_exceptions.py @@ -0,0 +1,23 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from ..symbols import ORTH, LEMMA, POS + + +_exc = {} + +for exc_data in [ + {ORTH: "m.in.", LEMMA: "między innymi", POS: ADV}, + {ORTH: "inż.", LEMMA: "inżynier", POS: NOUN}, + {ORTH: "mgr.", LEMMA: "magister", POS: NOUN}, + {ORTH: "tzn.", LEMMA: "to znaczy", POS: ADV}, + {ORTH: "tj.", LEMMA: "to jest", POS: ADV}, + {ORTH: "tzw.", LEMMA: "tak zwany", POS: ADJ}]: + _exc[exc_data[ORTH]] = [dict(exc_data)], + +for orth in [ + "w.", "r."]: + _exc[orth] = [{ORTH: orth}] + + +TOKENIZER_EXCEPTIONS = dict(_exc) diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py index 67539034d..2a8323597 100644 --- a/spacy/lang/pt/__init__.py +++ b/spacy/lang/pt/__init__.py @@ -9,7 +9,6 @@ from .lemmatizer import LOOKUP from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups @@ -19,13 +18,9 @@ class PortugueseDefaults(Language.Defaults): lex_attr_getters[LANG] = lambda text: 'pt' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) lex_attr_getters.update(LEX_ATTRS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + stop_words = STOP_WORDS + lemma_lookup = LOOKUP class Portuguese(Language): diff --git a/spacy/lang/pt/examples.py b/spacy/lang/pt/examples.py new file mode 100644 index 000000000..239929215 --- /dev/null +++ b/spacy/lang/pt/examples.py @@ -0,0 +1,18 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.pt.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple está querendo comprar uma startup do Reino Unido por 100 milhões de dólares", + "Carros autônomos empurram a responsabilidade do seguro para os fabricantes." + "São Francisco considera banir os robôs de entrega que andam pelas calçadas", + "Londres é a maior cidade do Reino Unido" +] diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py index 2d3a640c5..224c105d7 100644 --- a/spacy/lang/sv/__init__.py +++ b/spacy/lang/sv/__init__.py @@ -9,7 +9,6 @@ from .lemmatizer import LEMMA_RULES, LOOKUP from ..tokenizer_exceptions import BASE_EXCEPTIONS from ..norm_exceptions import BASE_NORMS from ...language import Language -from ...lemmatizerlookup import Lemmatizer from ...attrs import LANG, NORM from ...util import update_exc, add_lookups @@ -18,13 +17,10 @@ class SwedishDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'sv' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) - stop_words = set(STOP_WORDS) - - @classmethod - def create_lemmatizer(cls, nlp=None): - return Lemmatizer(LOOKUP) + stop_words = STOP_WORDS + lemma_rules = LEMMA_RULES + lemma_lookup = LOOKUP class Swedish(Language): diff --git a/spacy/lang/sv/examples.py b/spacy/lang/sv/examples.py new file mode 100644 index 000000000..be279c4bd --- /dev/null +++ b/spacy/lang/sv/examples.py @@ -0,0 +1,18 @@ +# coding: utf8 +from __future__ import unicode_literals + + +""" +Example sentences to test spaCy and its language models. + +>>> from spacy.lang.sv.examples import sentences +>>> docs = nlp.pipe(sentences) +""" + + +sentences = [ + "Apple överväger att köpa brittisk startup för 1 miljard dollar.", + "Självkörande bilar förskjuter försäkringsansvar mot tillverkare.", + "San Fransisco överväger förbud mot leveransrobotar på trottoarer.". + "London är en storstad i Storbritannien." +] diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py new file mode 100644 index 000000000..bedec46c8 --- /dev/null +++ b/spacy/lang/th/__init__.py @@ -0,0 +1,38 @@ +# coding: utf8 +from __future__ import unicode_literals + +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .tag_map import TAG_MAP +from .stop_words import STOP_WORDS + +from ..tokenizer_exceptions import BASE_EXCEPTIONS +from ...tokens import Doc +from ..norm_exceptions import BASE_NORMS +from ...language import Language +from ...attrs import LANG, NORM +from ...util import update_exc, add_lookups + + +class ThaiDefaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters[LANG] = lambda text: 'th' + tokenizer_exceptions = dict(TOKENIZER_EXCEPTIONS) + tag_map = TAG_MAP + stop_words = STOP_WORDS + + +class Thai(Language): + lang = 'th' + Defaults = ThaiDefaults + + def make_doc(self, text): + try: + from pythainlp.tokenize import word_tokenize + except ImportError: + raise ImportError("The Thai tokenizer requires the PyThaiNLP library: " + "https://github.com/wannaphongcom/pythainlp/") + words = [x for x in list(word_tokenize(text,"newmm"))] + return Doc(self.vocab, words=words, spaces=[False]*len(words)) + + +__all__ = ['Thai'] diff --git a/spacy/lang/th/stop_words.py b/spacy/lang/th/stop_words.py new file mode 100644 index 000000000..e13dec984 --- /dev/null +++ b/spacy/lang/th/stop_words.py @@ -0,0 +1,62 @@ +# encoding: utf8 +from __future__ import unicode_literals + +# data from https://github.com/wannaphongcom/pythainlp/blob/dev/pythainlp/corpus/stopwords-th.txt +# stop words as whitespace-separated list +STOP_WORDS = set(""" +นี้ นํา นั้น นัก นอกจาก ทุก ที่สุด ที่ ทําให้ ทํา ทาง ทั้งนี้ ดัง ซึ่ง ช่วง จาก จัด จะ คือ ความ ครั้ง คง ขึ้น ของ +ขอ รับ ระหว่าง รวม ยัง มี มาก มา พร้อม พบ ผ่าน ผล บาง น่า เปิดเผย เปิด เนื่องจาก เดียวกัน เดียว เช่น เฉพาะ เข้า ถ้า +ถูก ถึง ต้อง ต่างๆ ต่าง ต่อ ตาม ตั้งแต่ ตั้ง ด้าน ด้วย อีก อาจ ออก อย่าง อะไร อยู่ อยาก หาก หลาย หลังจาก แต่ เอง เห็น +เลย เริ่ม เรา เมื่อ เพื่อ เพราะ เป็นการ เป็น หลัง หรือ หนึ่ง ส่วน ส่ง สุด สําหรับ ว่า ลง ร่วม ราย ขณะ ก่อน ก็ การ กับ กัน +กว่า กล่าว จึง ไว้ ไป ได้ ให้ ใน โดย แห่ง แล้ว และ แรก แบบ ๆ ทั้ง วัน เขา เคย ไม่ อยาก เกิน เกินๆ เกี่ยวกัน เกี่ยวกับ +เกี่ยวข้อง เกี่ยวเนื่อง เกี่ยวๆ เกือบ เกือบจะ เกือบๆ แก แก่ แก้ไข ใกล้ ใกล้ๆ ไกล ไกลๆ ขณะเดียวกัน ขณะใด ขณะใดๆ ขณะที่ ขณะนั้น ขณะนี้ ขณะหนึ่ง ขวาง +ขวางๆ ขั้น ใคร ใคร่ ใคร่จะ ใครๆ ง่าย ง่ายๆ ไง จง จด จน จนกระทั่ง จนกว่า จนขณะนี้ จนตลอด จนถึง จนทั่ว จนบัดนี้ จนเมื่อ จนแม้ จนแม้น +จรด จรดกับ จริง จริงจัง จริงๆ จริงๆจังๆ จวน จวนจะ จวนเจียน จวบ ซึ่งก็ ซึ่งก็คือ ซึ่งกัน ซึ่งกันและกัน ซึ่งได้แก่ ซึ่งๆ ณ ด้วย ด้วยกัน ด้วยเช่นกัน ด้วยที่ ด้วยประการฉะนี้ +ด้วยเพราะ ด้วยว่า ด้วยเหตุที่ ด้วยเหตุนั้น ด้วยเหตุนี้ ด้วยเหตุเพราะ ด้วยเหตุว่า ด้วยเหมือนกัน ดั่ง ดังกล่าว ดังกับ ดั่งกับ ดังกับว่า ดั่งกับว่า ดังเก่า +ดั่งเก่า ดังเคย ใดๆ ได้ ได้แก่ ได้แต่ ได้ที่ ได้มา ได้รับ ตน ตนเอง ตนฯ ตรง ตรงๆ ตลอด ตลอดกาล ตลอดกาลนาน ตลอดจน ตลอดถึง ตลอดทั้ง +ตลอดทั่ว ตลอดทั่วถึง ตลอดทั่วทั้ง ตลอดปี ตลอดไป ตลอดมา ตลอดระยะเวลา ตลอดวัน ตลอดเวลา ตลอดศก ต่อ ต่อกัน ถึงแก่ ถึงจะ ถึงบัดนั้น ถึงบัดนี้ +ถึงเมื่อ ถึงเมื่อใด ถึงเมื่อไร ถึงแม้ ถึงแม้จะ ถึงแม้ว่า ถึงอย่างไร ถือ ถือว่า ถูกต้อง ถูกๆ เถอะ เถิด ทรง ทว่า ทั้งคน ทั้งตัว ทั้งที ทั้งที่ ทั้งนั้น ทั้งนั้นด้วย ทั้งนั้นเพราะ +นอก นอกจากที่ นอกจากนั้น นอกจากนี้ นอกจากว่า นอกนั้น นอกเหนือ นอกเหนือจาก น้อย น้อยกว่า น้อยๆ นะ น่ะ นักๆ นั่น นั่นไง นั่นเป็น นั่นแหละ +นั่นเอง นั้นๆ นับ นับจากนั้น นับจากนี้ นับตั้งแต่ นับแต่ นับแต่ที่ นับแต่นั้น เป็นต้น เป็นต้นไป เป็นต้นมา เป็นแต่ เป็นแต่เพียง เป็นที เป็นที่ เป็นที่สุด เป็นเพราะ +เป็นเพราะว่า เป็นเพียง เป็นเพียงว่า เป็นเพื่อ เป็นอัน เป็นอันมาก เป็นอันว่า เป็นอันๆ เป็นอาทิ เป็นๆ เปลี่ยน เปลี่ยนแปลง เปิด เปิดเผย ไป่ ผ่าน ผ่านๆ +ผิด ผิดๆ ผู้ เพียงเพื่อ เพียงไร เพียงไหน เพื่อที่ เพื่อที่จะ เพื่อว่า เพื่อให้ ภาค ภาคฯ ภาย ภายใต้ ภายนอก ภายใน ภายภาค ภายภาคหน้า ภายหน้า ภายหลัง +มอง มองว่า มัก มักจะ มัน มันๆ มั้ย มั้ยนะ มั้ยนั่น มั้ยเนี่ย มั้ยล่ะ ยืนนาน ยืนยง ยืนยัน ยืนยาว เยอะ เยอะแยะ เยอะๆ แยะ แยะๆ รวด รวดเร็ว ร่วม รวมกัน ร่วมกัน +รวมด้วย ร่วมด้วย รวมถึง รวมทั้ง ร่วมมือ รวมๆ ระยะ ระยะๆ ระหว่าง รับรอง รึ รึว่า รือ รือว่า สิ้นกาลนาน สืบเนื่อง สุดๆ สู่ สูง สูงกว่า สูงส่ง สูงสุด สูงๆ เสมือนกับ +เสมือนว่า เสร็จ เสร็จกัน เสร็จแล้ว เสร็จสมบูรณ์ เสร็จสิ้น เสีย เสียก่อน เสียจน เสียจนกระทั่ง เสียจนถึง เสียด้วย เสียนั่น เสียนั่นเอง เสียนี่ เสียนี่กระไร เสียยิ่ง +เสียยิ่งนัก เสียแล้ว ใหญ่ๆ ให้ดี ให้แด่ ให้ไป ใหม่ ให้มา ใหม่ๆ ไหน ไหนๆ อดีต อนึ่ง อย่าง อย่างเช่น อย่างดี อย่างเดียว อย่างใด อย่างที่ อย่างน้อย อย่างนั้น +อย่างนี้ อย่างโน้น ก็คือ ก็แค่ ก็จะ ก็ดี ก็ได้ ก็ต่อเมื่อ ก็ตาม ก็ตามแต่ ก็ตามที ก็แล้วแต่ กระทั่ง กระทำ กระนั้น กระผม กลับ กล่าวคือ กลุ่ม กลุ่มก้อน +กลุ่มๆ กว้าง กว้างขวาง กว้างๆ ก่อนหน้า ก่อนหน้านี้ ก่อนๆ กันดีกว่า กันดีไหม กันเถอะ กันนะ กันและกัน กันไหม กันเอง กำลัง กำลังจะ กำหนด กู เก็บ +เกิด เกี่ยวข้อง แก่ แก้ไข ใกล้ ใกล้ๆ ข้า ข้าง ข้างเคียง ข้างต้น ข้างบน ข้างล่าง ข้างๆ ขาด ข้าพเจ้า ข้าฯ เข้าใจ เขียน คงจะ คงอยู่ ครบ ครบครัน ครบถ้วน +ครั้งกระนั้น ครั้งก่อน ครั้งครา ครั้งคราว ครั้งใด ครั้งที่ ครั้งนั้น ครั้งนี้ ครั้งละ ครั้งหนึ่ง ครั้งหลัง ครั้งหลังสุด ครั้งไหน ครั้งๆ ครัน ครับ ครา คราใด คราที่ ครานั้น ครานี้ คราหนึ่ง +คราไหน คราว คราวก่อน คราวใด คราวที่ คราวนั้น คราวนี้ คราวโน้น คราวละ คราวหน้า คราวหนึ่ง คราวหลัง คราวไหน คราวๆ คล้าย คล้ายกัน คล้ายกันกับ +คล้ายกับ คล้ายกับว่า คล้ายว่า ควร ค่อน ค่อนข้าง ค่อนข้างจะ ค่อยไปทาง ค่อนมาทาง ค่อย ค่อยๆ คะ ค่ะ คำ คิด คิดว่า คุณ คุณๆ +เคยๆ แค่ แค่จะ แค่นั้น แค่นี้ แค่เพียง แค่ว่า แค่ไหน ใคร่ ใคร่จะ ง่าย ง่ายๆ จนกว่า จนแม้ จนแม้น จังๆ จวบกับ จวบจน จ้ะ จ๊ะ จะได้ จัง จัดการ จัดงาน จัดแจง +จัดตั้ง จัดทำ จัดหา จัดให้ จับ จ้า จ๋า จากนั้น จากนี้ จากนี้ไป จำ จำเป็น จำพวก จึงจะ จึงเป็น จู่ๆ ฉะนั้น ฉะนี้ ฉัน เฉกเช่น เฉย เฉยๆ ไฉน ช่วงก่อน +ช่วงต่อไป ช่วงถัดไป ช่วงท้าย ช่วงที่ ช่วงนั้น ช่วงนี้ ช่วงระหว่าง ช่วงแรก ช่วงหน้า ช่วงหลัง ช่วงๆ ช่วย ช้า ช้านาน ชาว ช้าๆ เช่นก่อน เช่นกัน เช่นเคย +เช่นดัง เช่นดังก่อน เช่นดังเก่า เช่นดังที่ เช่นดังว่า เช่นเดียวกัน เช่นเดียวกับ เช่นใด เช่นที่ เช่นที่เคย เช่นที่ว่า เช่นนั้น เช่นนั้นเอง เช่นนี้ เช่นเมื่อ เช่นไร เชื่อ +เชื่อถือ เชื่อมั่น เชื่อว่า ใช่ ใช่ไหม ใช้ ซะ ซะก่อน ซะจน ซะจนกระทั่ง ซะจนถึง ซึ่งได้แก่ ด้วยกัน ด้วยเช่นกัน ด้วยที่ ด้วยเพราะ ด้วยว่า ด้วยเหตุที่ ด้วยเหตุนั้น +ด้วยเหตุนี้ ด้วยเหตุเพราะ ด้วยเหตุว่า ด้วยเหมือนกัน ดังกล่าว ดังกับว่า ดั่งกับว่า ดังเก่า ดั่งเก่า ดั่งเคย ต่างก็ ต่างหาก ตามด้วย ตามแต่ ตามที่ +ตามๆ เต็มไปด้วย เต็มไปหมด เต็มๆ แต่ก็ แต่ก่อน แต่จะ แต่เดิม แต่ต้อง แต่ถ้า แต่ทว่า แต่ที่ แต่นั้น แต่เพียง แต่เมื่อ แต่ไร แต่ละ แต่ว่า แต่ไหน แต่อย่างใด โต +โตๆ ใต้ ถ้าจะ ถ้าหาก ถึงแก่ ถึงแม้ ถึงแม้จะ ถึงแม้ว่า ถึงอย่างไร ถือว่า ถูกต้อง ทว่า ทั้งนั้นด้วย ทั้งปวง ทั้งเป็น ทั้งมวล ทั้งสิ้น ทั้งหมด ทั้งหลาย ทั้งๆ ทัน +ทันใดนั้น ทันที ทันทีทันใด ทั่ว ทำไม ทำไร ทำให้ ทำๆ ที ที่จริง ที่ซึ่ง ทีเดียว ทีใด ที่ใด ที่ได้ ทีเถอะ ที่แท้ ที่แท้จริง ที่นั้น ที่นี้ ทีไร ทีละ ที่ละ +ที่แล้ว ที่ว่า ที่แห่งนั้น ที่ไหน ทีๆ ที่ๆ ทุกคน ทุกครั้ง ทุกครา ทุกคราว ทุกชิ้น ทุกตัว ทุกทาง ทุกที ทุกที่ ทุกเมื่อ ทุกวัน ทุกวันนี้ ทุกสิ่ง ทุกหน ทุกแห่ง ทุกอย่าง +ทุกอัน ทุกๆ เท่า เท่ากัน เท่ากับ เท่าใด เท่าที่ เท่านั้น เท่านี้ เท่าไร เท่าไหร่ แท้ แท้จริง เธอ นอกจากว่า น้อย น้อยกว่า น้อยๆ น่ะ นั้นไว นับแต่นี้ นาง +นางสาว น่าจะ นาน นานๆ นาย นำ นำพา นำมา นิด นิดหน่อย นิดๆ นี่ นี่ไง นี่นา นี่แน่ะ นี่แหละ นี้แหล่ นี่เอง นี้เอง นู่น นู้น เน้น เนี่ย +เนี่ยเอง ในช่วง ในที่ ในเมื่อ ในระหว่าง บน บอก บอกแล้ว บอกว่า บ่อย บ่อยกว่า บ่อยครั้ง บ่อยๆ บัดดล บัดเดี๋ยวนี้ บัดนั้น บัดนี้ บ้าง บางกว่า +บางขณะ บางครั้ง บางครา บางคราว บางที บางที่ บางแห่ง บางๆ ปฏิบัติ ประกอบ ประการ ประการฉะนี้ ประการใด ประการหนึ่ง ประมาณ ประสบ ปรับ +ปรากฏ ปรากฏว่า ปัจจุบัน ปิด เป็นด้วย เป็นดัง เป็นต้น เป็นแต่ เป็นเพื่อ เป็นอัน เป็นอันมาก เป็นอาทิ ผ่านๆ ผู้ ผู้ใด เผื่อ เผื่อจะ เผื่อที่ เผื่อว่า ฝ่าย +ฝ่ายใด พบว่า พยายาม พร้อมกัน พร้อมกับ พร้อมด้วย พร้อมทั้ง พร้อมที่ พร้อมเพียง พวก พวกกัน พวกกู พวกแก พวกเขา พวกคุณ พวกฉัน พวกท่าน +พวกที่ พวกเธอ พวกนั้น พวกนี้ พวกนู้น พวกโน้น พวกมัน พวกมึง พอ พอกัน พอควร พอจะ พอดี พอตัว พอที พอที่ พอเพียง พอแล้ว พอสม พอสมควร +พอเหมาะ พอๆ พา พึง พึ่ง พื้นๆ พูด เพราะฉะนั้น เพราะว่า เพิ่ง เพิ่งจะ เพิ่ม เพิ่มเติม เพียง เพียงแค่ เพียงใด เพียงแต่ เพียงพอ เพียงเพราะ +เพื่อว่า เพื่อให้ ภายใต้ มองว่า มั๊ย มากกว่า มากมาย มิ มิฉะนั้น มิใช่ มิได้ มีแต่ มึง มุ่ง มุ่งเน้น มุ่งหมาย เมื่อก่อน เมื่อครั้ง เมื่อครั้งก่อน +เมื่อคราวก่อน เมื่อคราวที่ เมื่อคราว เมื่อคืน เมื่อเช้า เมื่อใด เมื่อนั้น เมื่อนี้ เมื่อเย็น เมื่อไร เมื่อวันวาน เมื่อวาน เมื่อไหร่ แม้ แม้กระทั่ง แม้แต่ แม้นว่า แม้ว่า +ไม่ค่อย ไม่ค่อยจะ ไม่ค่อยเป็น ไม่ใช่ ไม่เป็นไร ไม่ว่า ยก ยกให้ ยอม ยอมรับ ย่อม ย่อย ยังคง ยังงั้น ยังงี้ ยังโง้น ยังไง ยังจะ ยังแต่ ยาก +ยาว ยาวนาน ยิ่ง ยิ่งกว่า ยิ่งขึ้น ยิ่งขึ้นไป ยิ่งจน ยิ่งจะ ยิ่งนัก ยิ่งเมื่อ ยิ่งแล้ว ยิ่งใหญ่ ร่วมกัน รวมด้วย ร่วมด้วย รือว่า เร็ว เร็วๆ เราๆ เรียก เรียบ เรื่อย +เรื่อยๆ ไร ล้วน ล้วนจน ล้วนแต่ ละ ล่าสุด เล็ก เล็กน้อย เล็กๆ เล่าว่า แล้วกัน แล้วแต่ แล้วเสร็จ วันใด วันนั้น วันนี้ วันไหน สบาย สมัย สมัยก่อน +สมัยนั้น สมัยนี้ สมัยโน้น ส่วนเกิน ส่วนด้อย ส่วนดี ส่วนใด ส่วนที่ ส่วนน้อย ส่วนนั้น ส่วนมาก ส่วนใหญ่ สั้น สั้นๆ สามารถ สำคัญ สิ่ง +สิ่งใด สิ่งนั้น สิ่งนี้ สิ่งไหน สิ้น เสร็จแล้ว เสียด้วย เสียแล้ว แสดง แสดงว่า หน หนอ หนอย หน่อย หมด หมดกัน หมดสิ้น หรือไง หรือเปล่า หรือไม่ หรือยัง +หรือไร หากแม้ หากแม้น หากแม้นว่า หากว่า หาความ หาใช่ หารือ เหตุ เหตุผล เหตุนั้น เหตุนี้ เหตุไร เห็นแก่ เห็นควร เห็นจะ เห็นว่า เหลือ เหลือเกิน เหล่า +เหล่านั้น เหล่านี้ แห่งใด แห่งนั้น แห่งนี้ แห่งโน้น แห่งไหน แหละ ให้แก่ ใหญ่ ใหญ่โต อย่างเช่น อย่างดี อย่างเดียว อย่างใด อย่างที่ อย่างน้อย อย่างนั้น อย่างนี้ +อย่างโน้น อย่างมาก อย่างยิ่ง อย่างไร อย่างไรก็ อย่างไรก็ได้ อย่างไรเสีย อย่างละ อย่างหนึ่ง อย่างไหน อย่างๆ อัน อันจะ อันใด อันได้แก่ อันที่ +อันที่จริง อันที่จะ อันเนื่องมาจาก อันละ อันไหน อันๆ อาจจะ อาจเป็น อาจเป็นด้วย อื่น อื่นๆ เอ็ง เอา ฯ ฯล ฯลฯ +""".split()) \ No newline at end of file diff --git a/spacy/lang/th/tag_map.py b/spacy/lang/th/tag_map.py new file mode 100644 index 000000000..40e5ac44c --- /dev/null +++ b/spacy/lang/th/tag_map.py @@ -0,0 +1,81 @@ +# encoding: utf8 +# data from Korakot Chaovavanich (https://www.facebook.com/photo.php?fbid=390564854695031&set=p.390564854695031&type=3&permPage=1&ifg=1) +from __future__ import unicode_literals + +from ...symbols import * + +TAG_MAP = { + #NOUN + "NOUN": {POS: NOUN}, + "NCMN": {POS: NOUN}, + "NTTL": {POS: NOUN}, + "CNIT": {POS: NOUN}, + "CLTV": {POS: NOUN}, + "CMTR": {POS: NOUN}, + "CFQC": {POS: NOUN}, + "CVBL": {POS: NOUN}, + #PRON + "PRON": {POS: PRON}, + "NPRP": {POS: PRON}, + # ADJ + "ADJ": {POS: ADJ}, + "NONM": {POS: ADJ}, + "VATT": {POS: ADJ}, + "DONM": {POS: ADJ}, + # ADV + "ADV": {POS: ADV}, + "ADVN": {POS: ADV}, + "ADVI": {POS: ADV}, + "ADVP": {POS: ADV}, + "ADVS": {POS: ADV}, + # INT + "INT": {POS: INTJ}, + # PRON + "PROPN": {POS: PROPN}, + "PPRS": {POS: PROPN}, + "PDMN": {POS: PROPN}, + "PNTR": {POS: PROPN}, + # DET + "DET": {POS: DET}, + "DDAN": {POS: DET}, + "DDAC": {POS: DET}, + "DDBQ": {POS: DET}, + "DDAQ": {POS: DET}, + "DIAC": {POS: DET}, + "DIBQ": {POS: DET}, + "DIAQ": {POS: DET}, + "DCNM": {POS: DET}, + # NUM + "NUM": {POS: NUM}, + "NCNM": {POS: NUM}, + "NLBL": {POS: NUM}, + "DCNM": {POS: NUM}, + # AUX + "AUX": {POS: AUX}, + "XVBM": {POS: AUX}, + "XVAM": {POS: AUX}, + "XVMM": {POS: AUX}, + "XVBB": {POS: AUX}, + "XVAE": {POS: AUX}, + # ADP + "ADP": {POS: ADP}, + "RPRE": {POS: ADP}, + # CCONJ + "CCONJ": {POS: CCONJ}, + "JCRG": {POS: CCONJ}, + # SCONJ + "SCONJ": {POS: SCONJ}, + "PREL": {POS: SCONJ}, + "JSBR": {POS: SCONJ}, + "JCMP": {POS: SCONJ}, + # PART + "PART": {POS: PART}, + "FIXN": {POS: PART}, + "FIXV": {POS: PART}, + "EAFF": {POS: PART}, + "AITT": {POS: PART}, + "NEG": {POS: PART}, + # PUNCT + "PUNCT": {POS: PUNCT}, + "PUNC": {POS: PUNCT} +} diff --git a/spacy/lang/th/tokenizer_exceptions.py b/spacy/lang/th/tokenizer_exceptions.py new file mode 100644 index 000000000..c31595893 --- /dev/null +++ b/spacy/lang/th/tokenizer_exceptions.py @@ -0,0 +1,43 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from ...symbols import * + +TOKENIZER_EXCEPTIONS = { + "ม.ค.": [ + {ORTH: "ม.ค.", LEMMA: "มกราคม"} + ], + "ก.พ.": [ + {ORTH: "ก.พ.", LEMMA: "กุมภาพันธ์"} + ], + "มี.ค.": [ + {ORTH: "มี.ค.", LEMMA: "มีนาคม"} + ], + "เม.ย.": [ + {ORTH: "เม.ย.", LEMMA: "เมษายน"} + ], + "พ.ค.": [ + {ORTH: "พ.ค.", LEMMA: "พฤษภาคม"} + ], + "มิ.ย.": [ + {ORTH: "มิ.ย.", LEMMA: "มิถุนายน"} + ], + "ก.ค.": [ + {ORTH: "ก.ค.", LEMMA: "กรกฎาคม"} + ], + "ส.ค.": [ + {ORTH: "ส.ค.", LEMMA: "สิงหาคม"} + ], + "ก.ย.": [ + {ORTH: "ก.ย.", LEMMA: "กันยายน"} + ], + "ต.ค.": [ + {ORTH: "ต.ค.", LEMMA: "ตุลาคม"} + ], + "พ.ย.": [ + {ORTH: "พ.ย.", LEMMA: "พฤศจิกายน"} + ], + "ธ.ค.": [ + {ORTH: "ธ.ค.", LEMMA: "ธันวาคม"} + ] +} diff --git a/spacy/lang/tokenizer_exceptions.py b/spacy/lang/tokenizer_exceptions.py index 6a7c09a44..73ad88d08 100644 --- a/spacy/lang/tokenizer_exceptions.py +++ b/spacy/lang/tokenizer_exceptions.py @@ -36,11 +36,11 @@ URL_PATTERN = ( r"(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))" r"|" # host name - r"(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)" + r"(?:(?:[a-z0-9\-]*)?[a-z0-9]+)" # domain name - r"(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*" + r"(?:\.(?:[a-z0-9\-])*[a-z0-9]+)*" # TLD identifier - r"(?:\.(?:[a-z\u00a1-\uffff]{2,}))" + r"(?:\.(?:[a-z]{2,}))" r")" # port number r"(?::\d{2,5})?" diff --git a/spacy/lang/xx/__init__.py b/spacy/lang/xx/__init__.py index dc63ee33f..017f55ecc 100644 --- a/spacy/lang/xx/__init__.py +++ b/spacy/lang/xx/__init__.py @@ -13,7 +13,6 @@ class MultiLanguageDefaults(Language.Defaults): lex_attr_getters = dict(Language.Defaults.lex_attr_getters) lex_attr_getters[LANG] = lambda text: 'xx' lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM], BASE_NORMS) - tokenizer_exceptions = update_exc(BASE_EXCEPTIONS) diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py index d63323b4e..46ad3946f 100644 --- a/spacy/lang/zh/__init__.py +++ b/spacy/lang/zh/__init__.py @@ -14,7 +14,8 @@ class Chinese(Language): except ImportError: raise ImportError("The Chinese tokenizer requires the Jieba library: " "https://github.com/fxsjy/jieba") - words = list(jieba.cut(text, cut_all=True)) + words = list(jieba.cut(text, cut_all=False)) + words = [x for x in words if x] return Doc(self.vocab, words=words, spaces=[False]*len(words)) diff --git a/spacy/language.py b/spacy/language.py index bd90fa395..047c94a37 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -1,42 +1,40 @@ # coding: utf8 from __future__ import absolute_import, unicode_literals from contextlib import contextmanager -import dill -import numpy from thinc.neural import Model -from thinc.neural.ops import NumpyOps, CupyOps -from thinc.neural.optimizers import Adam, SGD +from thinc.neural.optimizers import Adam import random import ujson from collections import OrderedDict +import itertools from .tokenizer import Tokenizer from .vocab import Vocab from .tagger import Tagger from .lemmatizer import Lemmatizer from .syntax.parser import get_templates -from .syntax import nonproj -from .pipeline import NeuralDependencyParser, EntityRecognizer -from .pipeline import TokenVectorEncoder, NeuralTagger, NeuralEntityRecognizer -from .pipeline import NeuralLabeller -from .pipeline import SimilarityHook +from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger +from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer -from .compat import json_dumps +from .compat import json_dumps, izip +from .scorer import Scorer +from ._ml import link_vectors_to_models from .attrs import IS_STOP from .lang.punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES from .lang.tokenizer_exceptions import TOKEN_MATCH from .lang.tag_map import TAG_MAP from .lang.lex_attrs import LEX_ATTRS from . import util -from .scorer import Scorer +from . import about class BaseDefaults(object): @classmethod def create_lemmatizer(cls, nlp=None): - return Lemmatizer(cls.lemma_index, cls.lemma_exc, cls.lemma_rules) + return Lemmatizer(cls.lemma_index, cls.lemma_exc, cls.lemma_rules, + cls.lemma_lookup) @classmethod def create_vocab(cls, nlp=None): @@ -66,58 +64,7 @@ class BaseDefaults(object): prefix_search=prefix_search, suffix_search=suffix_search, infix_finditer=infix_finditer, token_match=token_match) - @classmethod - def create_tagger(cls, nlp=None, **cfg): - if nlp is None: - return NeuralTagger(cls.create_vocab(nlp), **cfg) - else: - return NeuralTagger(nlp.vocab, **cfg) - - @classmethod - def create_parser(cls, nlp=None, **cfg): - if nlp is None: - return NeuralDependencyParser(cls.create_vocab(nlp), **cfg) - else: - return NeuralDependencyParser(nlp.vocab, **cfg) - - @classmethod - def create_entity(cls, nlp=None, **cfg): - if nlp is None: - return NeuralEntityRecognizer(cls.create_vocab(nlp), **cfg) - else: - return NeuralEntityRecognizer(nlp.vocab, **cfg) - - @classmethod - def create_pipeline(cls, nlp=None, disable=tuple()): - meta = nlp.meta if nlp is not None else {} - # Resolve strings, like "cnn", "lstm", etc - pipeline = [] - for entry in cls.pipeline: - if entry in disable or getattr(entry, 'name', entry) in disable: - continue - factory = cls.Defaults.factories[entry] - pipeline.append(factory(nlp, **meta.get(entry, {}))) - return pipeline - - factories = { - 'make_doc': create_tokenizer, - 'tensorizer': lambda nlp, **cfg: [TokenVectorEncoder(nlp.vocab, **cfg)], - 'tagger': lambda nlp, **cfg: [NeuralTagger(nlp.vocab, **cfg)], - 'parser': lambda nlp, **cfg: [ - NeuralDependencyParser(nlp.vocab, **cfg), - nonproj.deprojectivize], - 'ner': lambda nlp, **cfg: [NeuralEntityRecognizer(nlp.vocab, **cfg)], - # Temporary compatibility -- delete after pivot - 'token_vectors': lambda nlp, **cfg: [TokenVectorEncoder(nlp.vocab, **cfg)], - 'tags': lambda nlp, **cfg: [NeuralTagger(nlp.vocab, **cfg)], - 'dependencies': lambda nlp, **cfg: [ - NeuralDependencyParser(nlp.vocab, **cfg), - nonproj.deprojectivize, - ], - 'entities': lambda nlp, **cfg: [NeuralEntityRecognizer(nlp.vocab, **cfg)], - 'similarity': lambda nlp, **cfg: [SimilarityHook(nlp.vocab, **cfg)] - } - + pipe_names = ['tensorizer', 'tagger', 'parser', 'ner'] token_match = TOKEN_MATCH prefixes = tuple(TOKENIZER_PREFIXES) suffixes = tuple(TOKENIZER_SUFFIXES) @@ -131,6 +78,7 @@ class BaseDefaults(object): lemma_rules = {} lemma_exc = {} lemma_index = {} + lemma_lookup = {} morph_rules = {} lex_attr_getters = LEX_ATTRS syntax_iterators = {} @@ -147,8 +95,17 @@ class Language(object): Defaults = BaseDefaults lang = None - def __init__(self, vocab=True, make_doc=True, pipeline=None, meta={}, - disable=tuple(), **kwargs): + factories = { + 'tokenizer': lambda nlp: nlp.Defaults.create_tokenizer(nlp), + 'tensorizer': lambda nlp, **cfg: TokenVectorEncoder(nlp.vocab, **cfg), + 'tagger': lambda nlp, **cfg: NeuralTagger(nlp.vocab, **cfg), + 'parser': lambda nlp, **cfg: NeuralDependencyParser(nlp.vocab, **cfg), + 'ner': lambda nlp, **cfg: NeuralEntityRecognizer(nlp.vocab, **cfg), + 'similarity': lambda nlp, **cfg: SimilarityHook(nlp.vocab, **cfg), + 'textcat': lambda nlp, **cfg: TextCategorizer(nlp.vocab, **cfg) + } + + def __init__(self, vocab=True, make_doc=True, meta={}, **kwargs): """Initialise a Language object. vocab (Vocab): A `Vocab` object. If `True`, a vocab is created via @@ -165,7 +122,7 @@ class Language(object): models to add model meta data. RETURNS (Language): The newly constructed object. """ - self.meta = dict(meta) + self._meta = dict(meta) if vocab is True: factory = self.Defaults.create_vocab vocab = factory(self, **meta.get('vocab', {})) @@ -174,60 +131,168 @@ class Language(object): factory = self.Defaults.create_tokenizer make_doc = factory(self, **meta.get('tokenizer', {})) self.tokenizer = make_doc - if pipeline is True: - self.pipeline = self.Defaults.create_pipeline(self, disable) - elif pipeline: - # Careful not to do getattr(p, 'name', None) here - # If we had disable=[None], we'd disable everything! - self.pipeline = [p for p in pipeline - if p not in disable - and getattr(p, 'name', p) not in disable] - # Resolve strings, like "cnn", "lstm", etc - for i, entry in enumerate(self.pipeline): - if entry in self.Defaults.factories: - factory = self.Defaults.factories[entry] - self.pipeline[i] = factory(self, **meta.get(entry, {})) - else: - self.pipeline = [] - flat_list = [] - for pipe in self.pipeline: - if isinstance(pipe, list): - flat_list.extend(pipe) - else: - flat_list.append(pipe) - self.pipeline = flat_list + self.pipeline = [] + self._optimizer = None + + @property + def meta(self): + self._meta.setdefault('lang', self.vocab.lang) + self._meta.setdefault('name', '') + self._meta.setdefault('version', '0.0.0') + self._meta.setdefault('spacy_version', about.__version__) + self._meta.setdefault('description', '') + self._meta.setdefault('author', '') + self._meta.setdefault('email', '') + self._meta.setdefault('url', '') + self._meta.setdefault('license', '') + self._meta['pipeline'] = self.pipe_names + return self._meta + + @meta.setter + def meta(self, value): + self._meta = value # Conveniences to access pipeline components @property def tensorizer(self): - return self.get_component('tensorizer') + return self.get_pipe('tensorizer') @property def tagger(self): - return self.get_component('tagger') + return self.get_pipe('tagger') @property def parser(self): - return self.get_component('parser') + return self.get_pipe('parser') @property def entity(self): - return self.get_component('ner') + return self.get_pipe('ner') @property def matcher(self): - return self.get_component('matcher') + return self.get_pipe('matcher') - def get_component(self, name): - if self.pipeline in (True, None): - return None - for proc in self.pipeline: - if hasattr(proc, 'name') and proc.name.endswith(name): - return proc - return None + @property + def pipe_names(self): + """Get names of available pipeline components. + + RETURNS (list): List of component name strings, in order. + """ + return [pipe_name for pipe_name, _ in self.pipeline] + + def get_pipe(self, name): + """Get a pipeline component for a given component name. + + name (unicode): Name of pipeline component to get. + RETURNS (callable): The pipeline component. + """ + for pipe_name, component in self.pipeline: + if pipe_name == name: + return component + msg = "No component '{}' found in pipeline. Available names: {}" + raise KeyError(msg.format(name, self.pipe_names)) + + def create_pipe(self, name, config=dict()): + """Create a pipeline component from a factory. + + name (unicode): Factory name to look up in `Language.factories`. + config (dict): Configuration parameters to initialise component. + RETURNS (callable): Pipeline component. + """ + if name not in self.factories: + raise KeyError("Can't find factory for '{}'.".format(name)) + factory = self.factories[name] + return factory(self, **config) + + def add_pipe(self, component, name=None, before=None, after=None, + first=None, last=None): + """Add a component to the processing pipeline. Valid components are + callables that take a `Doc` object, modify it and return it. Only one of + before, after, first or last can be set. Default behaviour is "last". + + component (callable): The pipeline component. + name (unicode): Name of pipeline component. Overwrites existing + component.name attribute if available. If no name is set and + the component exposes no name attribute, component.__name__ is + used. An error is raised if the name already exists in the pipeline. + before (unicode): Component name to insert component directly before. + after (unicode): Component name to insert component directly after. + first (bool): Insert component first / not first in the pipeline. + last (bool): Insert component last / not last in the pipeline. + + EXAMPLE: + >>> nlp.add_pipe(component, before='ner') + >>> nlp.add_pipe(component, name='custom_name', last=True) + """ + if name is None: + if hasattr(component, 'name'): + name = component.name + elif hasattr(component, '__name__'): + name = component.__name__ + elif hasattr(component, '__class__') and hasattr(component.__class__, '__name__'): + name = component.__class__.__name__ + else: + name = repr(component) + if name in self.pipe_names: + raise ValueError("'{}' already exists in pipeline.".format(name)) + if sum([bool(before), bool(after), bool(first), bool(last)]) >= 2: + msg = ("Invalid constraints. You can only set one of the " + "following: before, after, first, last.") + raise ValueError(msg) + pipe = (name, component) + if last or not any([first, before, after]): + self.pipeline.append(pipe) + elif first: + self.pipeline.insert(0, pipe) + elif before and before in self.pipe_names: + self.pipeline.insert(self.pipe_names.index(before), pipe) + elif after and after in self.pipe_names: + self.pipeline.insert(self.pipe_names.index(after), pipe) + else: + msg = "Can't find '{}' in pipeline. Available names: {}" + unfound = before or after + raise ValueError(msg.format(unfound, self.pipe_names)) + + def replace_pipe(self, name, component): + """Replace a component in the pipeline. + + name (unicode): Name of the component to replace. + component (callable): Pipeline component. + """ + if name not in self.pipe_names: + msg = "Can't find '{}' in pipeline. Available names: {}" + raise ValueError(msg.format(name, self.pipe_names)) + self.pipeline[self.pipe_names.index(name)] = (name, component) + + def rename_pipe(self, old_name, new_name): + """Rename a pipeline component. + + old_name (unicode): Name of the component to rename. + new_name (unicode): New name of the component. + """ + if old_name not in self.pipe_names: + msg = "Can't find '{}' in pipeline. Available names: {}" + raise ValueError(msg.format(old_name, self.pipe_names)) + if new_name in self.pipe_names: + msg = "'{}' already exists in pipeline. Existing names: {}" + raise ValueError(msg.format(new_name, self.pipe_names)) + i = self.pipe_names.index(old_name) + self.pipeline[i] = (new_name, self.pipeline[i][1]) + + def remove_pipe(self, name): + """Remove a component from the pipeline. + + name (unicode): Name of the component to remove. + RETURNS (tuple): A `(name, component)` tuple of the removed component. + """ + if name not in self.pipe_names: + msg = "Can't find '{}' in pipeline. Available names: {}" + raise ValueError(msg.format(name, self.pipe_names)) + return self.pipeline.pop(self.pipe_names.index(name)) def __call__(self, text, disable=[]): - """'Apply the pipeline to some text. The text can span multiple sentences, + """Apply the pipeline to some text. The text can span multiple sentences, and can contain arbtrary whitespace. Alignment into the original string is preserved. @@ -241,8 +306,7 @@ class Language(object): ('An', 'NN') """ doc = self.make_doc(text) - for proc in self.pipeline: - name = getattr(proc, 'name', None) + for name, proc in self.pipeline: if name in disable: continue doc = proc(doc) @@ -266,28 +330,26 @@ class Language(object): >>> for docs, golds in epoch: >>> state = nlp.update(docs, golds, sgd=optimizer) """ - tok2vec = self.pipeline[0] - feats = tok2vec.doc2feats(docs) + if len(docs) != len(golds): + raise IndexError("Update expects same number of docs and golds " + "Got: %d, %d" % (len(docs), len(golds))) + if len(docs) == 0: + return + if sgd is None: + if self._optimizer is None: + self._optimizer = Adam(Model.ops, 0.001) + sgd = self._optimizer grads = {} def get_grads(W, dW, key=None): grads[key] = (W, dW) - pipes = list(self.pipeline[1:]) + pipes = list(self.pipeline) random.shuffle(pipes) - for proc in pipes: + for name, proc in pipes: if not hasattr(proc, 'update'): continue - tokvecses, bp_tokvecses = tok2vec.model.begin_update(feats, drop=drop) - d_tokvecses = proc.update((docs, tokvecses), golds, - drop=drop, sgd=get_grads, losses=losses) - if d_tokvecses is not None: - bp_tokvecses(d_tokvecses, sgd=sgd) + proc.update(docs, golds, drop=drop, sgd=get_grads, losses=losses) for key, (W, dW) in grads.items(): sgd(W, dW, key=key) - # Clear the tensor variable, to free GPU memory. - # If we don't do this, the memory leak gets pretty - # bad, because we may be holding part of a batch. - for doc in docs: - doc.tensor = None def preprocess_gold(self, docs_golds): """Can be called before training to pre-process gold data. By default, @@ -296,43 +358,56 @@ class Language(object): docs_golds (iterable): Tuples of `Doc` and `GoldParse` objects. YIELDS (tuple): Tuples of preprocessed `Doc` and `GoldParse` objects. """ - for proc in self.pipeline: + for name, proc in self.pipeline: if hasattr(proc, 'preprocess_gold'): docs_golds = proc.preprocess_gold(docs_golds) for doc, gold in docs_golds: yield doc, gold - def begin_training(self, get_gold_tuples, **cfg): + def resume_training(self, **cfg): + if cfg.get('device', -1) >= 0: + device = util.use_gpu(cfg['device']) + if self.vocab.vectors.data.shape[1] >= 1: + self.vocab.vectors.data = Model.ops.asarray( + self.vocab.vectors.data) + else: + device = None + learn_rate = util.env_opt('learn_rate', 0.001) + beta1 = util.env_opt('optimizer_B1', 0.9) + beta2 = util.env_opt('optimizer_B2', 0.999) + eps = util.env_opt('optimizer_eps', 1e-08) + L2 = util.env_opt('L2_penalty', 1e-6) + max_grad_norm = util.env_opt('grad_norm_clip', 1.) + self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1, + beta2=beta2, eps=eps) + self._optimizer.max_grad_norm = max_grad_norm + self._optimizer.device = device + return self._optimizer + + def begin_training(self, get_gold_tuples=None, **cfg): """Allocate models, pre-process training data and acquire a trainer and optimizer. Used as a contextmanager. - gold_tuples (iterable): Gold-standard training data. + get_gold_tuples (function): Function returning gold data **cfg: Config parameters. - YIELDS (tuple): A trainer and an optimizer. - - EXAMPLE: - >>> with nlp.begin_training(gold, use_gpu=True) as (trainer, optimizer): - >>> for epoch in trainer.epochs(gold): - >>> for docs, golds in epoch: - >>> state = nlp.update(docs, golds, sgd=optimizer) + RETURNS: An optimizer """ - if self.parser: - self.pipeline.append(NeuralLabeller(self.vocab)) # Populate vocab - for _, annots_brackets in get_gold_tuples(): - for annots, _ in annots_brackets: - for word in annots[1]: - _ = self.vocab[word] + if get_gold_tuples is not None: + for _, annots_brackets in get_gold_tuples(): + for annots, _ in annots_brackets: + for word in annots[1]: + _ = self.vocab[word] contexts = [] if cfg.get('device', -1) >= 0: - import cupy.cuda.device - device = cupy.cuda.device.Device(cfg['device']) - device.use() - Model.ops = CupyOps() - Model.Ops = CupyOps + device = util.use_gpu(cfg['device']) + if self.vocab.vectors.data.shape[1] >= 1: + self.vocab.vectors.data = Model.ops.asarray( + self.vocab.vectors.data) else: device = None - for proc in self.pipeline: + link_vectors_to_models(self.vocab) + for name, proc in self.pipeline: if hasattr(proc, 'begin_training'): context = proc.begin_training(get_gold_tuples(), pipeline=self.pipeline) @@ -343,18 +418,28 @@ class Language(object): eps = util.env_opt('optimizer_eps', 1e-08) L2 = util.env_opt('L2_penalty', 1e-6) max_grad_norm = util.env_opt('grad_norm_clip', 1.) - optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1, - beta2=beta2, eps=eps) - optimizer.max_grad_norm = max_grad_norm - optimizer.device = device - return optimizer + self._optimizer = Adam(Model.ops, learn_rate, L2=L2, beta1=beta1, + beta2=beta2, eps=eps) + self._optimizer.max_grad_norm = max_grad_norm + self._optimizer.device = device + return self._optimizer - def evaluate(self, docs_golds): - docs, golds = zip(*docs_golds) + def evaluate(self, docs_golds, verbose=False): scorer = Scorer() - for doc, gold in zip(self.pipe(docs, batch_size=32), golds): - scorer.score(doc, gold) - doc.tensor = None + docs, golds = zip(*docs_golds) + docs = list(docs) + golds = list(golds) + for name, pipe in self.pipeline: + if not hasattr(pipe, 'pipe'): + for doc in docs: + pipe(doc) + else: + docs = list(pipe.pipe(docs)) + assert len(docs) == len(golds) + for doc, gold in zip(docs, golds): + if verbose: + print(doc) + scorer.score(doc, gold, verbose=verbose) return scorer @contextmanager @@ -370,7 +455,7 @@ class Language(object): >>> with nlp.use_params(optimizer.averages): >>> nlp.to_disk('/tmp/checkpoint') """ - contexts = [pipe.use_params(params) for pipe + contexts = [pipe.use_params(params) for name, pipe in self.pipeline if hasattr(pipe, 'use_params')] # TODO: Having trouble with contextlib # Workaround: these aren't actually context managers atm. @@ -386,11 +471,16 @@ class Language(object): except StopIteration: pass - def pipe(self, texts, n_threads=2, batch_size=1000, disable=[]): + def pipe(self, texts, as_tuples=False, n_threads=2, batch_size=1000, + disable=[]): """Process texts as a stream, and yield `Doc` objects in order. Supports GIL-free multi-threading. texts (iterator): A sequence of texts to process. + as_tuples (bool): + If set to True, inputs should be a sequence of + (text, context) tuples. Output will then be a sequence of + (doc, context) tuples. Defaults to False. n_threads (int): The number of worker threads to use. If -1, OpenMP will decide how many to use at run time. Default is 2. batch_size (int): The number of texts to buffer. @@ -402,10 +492,17 @@ class Language(object): >>> for doc in nlp.pipe(texts, batch_size=50, n_threads=4): >>> assert doc.is_parsed """ + if as_tuples: + text_context1, text_context2 = itertools.tee(texts) + texts = (tc[0] for tc in text_context1) + contexts = (tc[1] for tc in text_context2) + docs = self.pipe(texts, n_threads=n_threads, batch_size=batch_size, + disable=disable) + for doc, context in izip(docs, contexts): + yield (doc, context) + return docs = (self.make_doc(text) for text in texts) - docs = texts - for proc in self.pipeline: - name = getattr(proc, 'name', None) + for name, proc in self.pipeline: if name in disable: continue if hasattr(proc, 'pipe'): @@ -430,18 +527,18 @@ class Language(object): """ path = util.ensure_path(path) serializers = OrderedDict(( - ('vocab', lambda p: self.vocab.to_disk(p)), ('tokenizer', lambda p: self.tokenizer.to_disk(p, vocab=False)), ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta))) )) - for proc in self.pipeline: + for name, proc in self.pipeline: if not hasattr(proc, 'name'): continue - if proc.name in disable: + if name in disable: continue if not hasattr(proc, 'to_disk'): continue - serializers[proc.name] = lambda p, proc=proc: proc.to_disk(p, vocab=False) + serializers[name] = lambda p, proc=proc: proc.to_disk(p, vocab=False) + serializers['vocab'] = lambda p: self.vocab.to_disk(p) util.to_disk(path, serializers, {p: False for p in disable}) def from_disk(self, path, disable=tuple()): @@ -464,14 +561,12 @@ class Language(object): ('tokenizer', lambda p: self.tokenizer.from_disk(p, vocab=False)), ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta))) )) - for proc in self.pipeline: - if not hasattr(proc, 'name'): - continue - if proc.name in disable: + for name, proc in self.pipeline: + if name in disable: continue if not hasattr(proc, 'to_disk'): continue - deserializers[proc.name] = lambda p, proc=proc: proc.from_disk(p, vocab=False) + deserializers[name] = lambda p, proc=proc: proc.from_disk(p, vocab=False) exclude = {p: False for p in disable} if not (path / 'vocab').exists(): exclude['vocab'] = True @@ -490,8 +585,8 @@ class Language(object): ('tokenizer', lambda: self.tokenizer.to_bytes(vocab=False)), ('meta', lambda: ujson.dumps(self.meta)) )) - for i, proc in enumerate(self.pipeline): - if getattr(proc, 'name', None) in disable: + for i, (name, proc) in enumerate(self.pipeline): + if name in disable: continue if not hasattr(proc, 'to_bytes'): continue @@ -510,8 +605,8 @@ class Language(object): ('tokenizer', lambda b: self.tokenizer.from_bytes(b, vocab=False)), ('meta', lambda b: self.meta.update(ujson.loads(b))) )) - for i, proc in enumerate(self.pipeline): - if getattr(proc, 'name', None) in disable: + for i, (name, proc) in enumerate(self.pipeline): + if name in disable: continue if not hasattr(proc, 'from_bytes'): continue diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py index d7541c56b..bd2ca766a 100644 --- a/spacy/lemmatizer.py +++ b/spacy/lemmatizer.py @@ -10,20 +10,23 @@ class Lemmatizer(object): def load(cls, path, index=None, exc=None, rules=None): return cls(index or {}, exc or {}, rules or {}) - def __init__(self, index, exceptions, rules): - self.index = index - self.exc = exceptions - self.rules = rules + def __init__(self, index=None, exceptions=None, rules=None, lookup=None): + self.index = index if index is not None else {} + self.exc = exceptions if exceptions is not None else {} + self.rules = rules if rules is not None else {} + self.lookup_table = lookup if lookup is not None else {} def __call__(self, string, univ_pos, morphology=None): - if univ_pos == NOUN: + if univ_pos in (NOUN, 'NOUN', 'noun'): univ_pos = 'noun' - elif univ_pos == VERB: + elif univ_pos in (VERB, 'VERB', 'verb'): univ_pos = 'verb' - elif univ_pos == ADJ: + elif univ_pos in (ADJ, 'ADJ', 'adj'): univ_pos = 'adj' - elif univ_pos == PUNCT: + elif univ_pos in (PUNCT, 'PUNCT', 'punct'): univ_pos = 'punct' + else: + return set([string.lower()]) # See Issue #435 for example of where this logic is requied. if self.is_base_form(univ_pos, morphology): return set([string.lower()]) @@ -38,12 +41,20 @@ class Lemmatizer(object): avoid lemmatization entirely. """ morphology = {} if morphology is None else morphology - others = [key for key in morphology if key not in (POS, 'number', 'pos', 'verbform')] + others = [key for key in morphology + if key not in (POS, 'Number', 'POS', 'VerbForm', 'Tense')] true_morph_key = morphology.get('morph', 0) if univ_pos == 'noun' and morphology.get('Number') == 'sing': return True elif univ_pos == 'verb' and morphology.get('VerbForm') == 'inf': return True + # This maps 'VBP' to base form -- probably just need 'IS_BASE' + # morphology + elif univ_pos == 'verb' and (morphology.get('VerbForm') == 'fin' and \ + morphology.get('Tense') == 'pres' and \ + morphology.get('Number') is None and \ + not others): + return True elif univ_pos == 'adj' and morphology.get('Degree') == 'pos': return True elif VerbForm_inf in morphology: @@ -69,6 +80,11 @@ class Lemmatizer(object): def punct(self, string, morphology=None): return self(string, 'punct', morphology) + def lookup(self, string): + if string in self.lookup_table: + return self.lookup_table[string] + return string + def lemmatize(string, index, exceptions, rules): string = string.lower() @@ -78,15 +94,16 @@ def lemmatize(string, index, exceptions, rules): # forms.append(string) forms.extend(exceptions.get(string, [])) oov_forms = [] - for old, new in rules: - if string.endswith(old): - form = string[:len(string) - len(old)] + new - if not form: - pass - elif form in index or not form.isalpha(): - forms.append(form) - else: - oov_forms.append(form) + if not forms: + for old, new in rules: + if string.endswith(old): + form = string[:len(string) - len(old)] + new + if not form: + pass + elif form in index or not form.isalpha(): + forms.append(form) + else: + oov_forms.append(form) if not forms: forms.extend(oov_forms) if not forms: diff --git a/spacy/lemmatizerlookup.py b/spacy/lemmatizerlookup.py deleted file mode 100644 index 0c0c693c1..000000000 --- a/spacy/lemmatizerlookup.py +++ /dev/null @@ -1,19 +0,0 @@ -# coding: utf8 -from __future__ import unicode_literals - -from .lemmatizer import Lemmatizer - - -class Lemmatizer(Lemmatizer): - @classmethod - def load(cls, path, lookup): - return cls(lookup or {}) - - def __init__(self, lookup): - self.lookup = lookup - - def __call__(self, string, univ_pos, morphology=None): - try: - return set([self.lookup[string]]) - except: - return set([string]) \ No newline at end of file diff --git a/spacy/lexeme.pyx b/spacy/lexeme.pyx index bcd84d184..f0f5c6398 100644 --- a/spacy/lexeme.pyx +++ b/spacy/lexeme.pyx @@ -171,6 +171,8 @@ cdef class Lexeme: property rank: def __get__(self): return self.c.id + def __set__(self, value): + self.c.id = value property sentiment: def __get__(self): diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index c75d23957..8893b2fed 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -17,7 +17,7 @@ from libcpp.pair cimport pair from murmurhash.mrmr cimport hash64 from libc.stdint cimport int32_t -from .attrs cimport ID, ENT_TYPE +from .attrs cimport ID, NULL_ATTR, ENT_TYPE from . import attrs from .tokens.doc cimport get_token_attr from .tokens.doc cimport Doc @@ -142,6 +142,10 @@ def _convert_strings(token_specs, string_store): tokens = [] op = ONE for spec in token_specs: + if not spec: + # Signifier for 'any token' + tokens.append((ONE, [(NULL_ATTR, 0)])) + continue token = [] ops = (ONE,) for attr, value in spec.items(): @@ -295,7 +299,7 @@ cdef class Matcher: """Find all token sequences matching the supplied patterns on the `Doc`. doc (Doc): The document to match over. - RETURNS (list): A list of `(key, label_id, start, end)` tuples, + RETURNS (list): A list of `(key, start, end)` tuples, describing the matches. A match tuple describes a span `doc[start:end]`. The `label_id` and `key` are both integers. """ @@ -421,47 +425,69 @@ cdef class PhraseMatcher: cdef int max_length cdef attr_t* _phrase_key - def __init__(self, Vocab vocab, phrases, max_length=10): + cdef public object _callbacks + cdef public object _patterns + + def __init__(self, Vocab vocab, max_length=10): self.mem = Pool() self._phrase_key = self.mem.alloc(max_length, sizeof(attr_t)) self.max_length = max_length self.vocab = vocab - self.matcher = Matcher(self.vocab, {}) + self.matcher = Matcher(self.vocab) self.phrase_ids = PreshMap() - for phrase in phrases: - if len(phrase) < max_length: - self.add(phrase) - abstract_patterns = [] for length in range(1, max_length): abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) - self.matcher.add('Candidate', 'MWE', {}, abstract_patterns, acceptor=self.accept_match) + self.matcher.add('Candidate', None, *abstract_patterns) + self._callbacks = {} - def add(self, Doc tokens): - cdef int length = tokens.length - assert length < self.max_length - tags = get_bilou(length) - assert len(tags) == length, length + def __len__(self): + raise NotImplementedError + def __contains__(self, key): + raise NotImplementedError + + def __reduce__(self): + return (self.__class__, (self.vocab,), None, None) + + def add(self, key, on_match, *docs): + cdef Doc doc + for doc in docs: + if len(doc) >= self.max_length: + msg = ( + "Pattern length (%d) >= phrase_matcher.max_length (%d). " + "Length can be set on initialization, up to 10." + ) + raise ValueError(msg % (len(doc), self.max_length)) + cdef hash_t ent_id = self.matcher._normalize_key(key) + self._callbacks[ent_id] = on_match + + cdef int length cdef int i - for i in range(self.max_length): - self._phrase_key[i] = 0 - for i, tag in enumerate(tags): - lexeme = self.vocab[tokens.c[i].lex.orth] - lexeme.set_flag(tag, True) - self._phrase_key[i] = lexeme.orth - cdef hash_t key = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) - self.phrase_ids[key] = True + cdef hash_t phrase_hash + for doc in docs: + length = doc.length + tags = get_bilou(length) + for i in range(self.max_length): + self._phrase_key[i] = 0 + for i, tag in enumerate(tags): + lexeme = self.vocab[doc.c[i].lex.orth] + lexeme.set_flag(tag, True) + self._phrase_key[i] = lexeme.orth + phrase_hash = hash64(self._phrase_key, + self.max_length * sizeof(attr_t), 0) + self.phrase_ids.set(phrase_hash, ent_id) def __call__(self, Doc doc): matches = [] - for ent_id, label, start, end in self.matcher(doc): - cand = doc[start : end] - start = cand[0].idx - end = cand[-1].idx + len(cand[-1]) - matches.append((start, end, cand.root.tag_, cand.text, 'MWE')) - for match in matches: - doc.merge(*match) + for _, start, end in self.matcher(doc): + ent_id = self.accept_match(doc, start, end) + if ent_id is not None: + matches.append((ent_id, start, end)) + for i, (ent_id, start, end) in enumerate(matches): + on_match = self._callbacks.get(ent_id) + if on_match is not None: + on_match(self, doc, i, matches) return matches def pipe(self, stream, batch_size=1000, n_threads=2): @@ -469,7 +495,7 @@ cdef class PhraseMatcher: self(doc) yield doc - def accept_match(self, Doc doc, attr_t ent_id, attr_t label, int start, int end): + def accept_match(self, Doc doc, int start, int end): assert (end - start) < self.max_length cdef int i, j for i in range(self.max_length): @@ -477,7 +503,8 @@ cdef class PhraseMatcher: for i, j in enumerate(range(start, end)): self._phrase_key[i] = doc.c[j].lex.orth cdef hash_t key = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) - if self.phrase_ids.get(key): - return (ent_id, label, start, end) + ent_id = self.phrase_ids.get(key) + if ent_id == 0: + return None else: - return False + return ent_id diff --git a/spacy/morphology.pxd b/spacy/morphology.pxd index 922843d6d..be6711bfd 100644 --- a/spacy/morphology.pxd +++ b/spacy/morphology.pxd @@ -35,6 +35,8 @@ cdef class Morphology: cdef RichTagC* rich_tags cdef PreshMapArray _cache + cdef int assign_untagged(self, TokenC* token) except -1 + cdef int assign_tag(self, TokenC* token, tag) except -1 cdef int assign_tag_id(self, TokenC* token, int tag_id) except -1 diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx index 13a0ed8e3..4a1a0aa54 100644 --- a/spacy/morphology.pyx +++ b/spacy/morphology.pyx @@ -42,7 +42,7 @@ cdef class Morphology: self.tag_names = tuple(sorted(tag_map.keys())) self.reverse_index = {} - self.rich_tags = self.mem.alloc(self.n_tags, sizeof(RichTagC)) + self.rich_tags = self.mem.alloc(self.n_tags+1, sizeof(RichTagC)) for i, (tag_str, attrs) in enumerate(sorted(tag_map.items())): self.tag_map[tag_str] = dict(attrs) attrs = _normalize_props(attrs) @@ -52,6 +52,10 @@ cdef class Morphology: self.rich_tags[i].morph = 0 self.rich_tags[i].pos = attrs[POS] self.reverse_index[self.rich_tags[i].name] = i + # Add a 'null' tag, which we can reference when assign morphology to + # untagged tokens. + self.rich_tags[self.n_tags].id = self.n_tags + self._cache = PreshMapArray(self.n_tags) self.exc = {} if exc is not None: @@ -62,6 +66,15 @@ cdef class Morphology: return (Morphology, (self.strings, self.tag_map, self.lemmatizer, self.exc), None, None) + cdef int assign_untagged(self, TokenC* token) except -1: + """Set morphological attributes on a token without a POS tag. Uses + the lemmatizer's lookup() method, which looks up the string in the + table provided by the language data as lemma_lookup (if available).""" + if token.lemma == 0: + orth_str = self.strings[token.lex.orth] + lemma = self.lemmatizer.lookup(orth_str) + token.lemma = self.strings.add(lemma) + cdef int assign_tag(self, TokenC* token, tag) except -1: if isinstance(tag, basestring): tag = self.strings.add(tag) @@ -72,7 +85,7 @@ cdef class Morphology: token.tag = tag cdef int assign_tag_id(self, TokenC* token, int tag_id) except -1: - if tag_id >= self.n_tags: + if tag_id > self.n_tags: raise ValueError("Unknown tag ID: %s" % tag_id) # TODO: It's pretty arbitrary to put this logic here. I guess the justification # is that this is where the specific word and the tag interact. Still, @@ -146,11 +159,11 @@ cdef class Morphology: self.add_special_case(tag_str, form_str, attrs) def lemmatize(self, const univ_pos_t univ_pos, attr_t orth, morphology): + if orth not in self.strings: + return orth cdef unicode py_string = self.strings[orth] if self.lemmatizer is None: return self.strings.add(py_string.lower()) - if univ_pos not in (NOUN, VERB, ADJ, PUNCT): - return self.strings.add(py_string.lower()) cdef set lemma_strings cdef unicode lemma_string lemma_strings = self.lemmatizer(py_string, univ_pos, morphology) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 9137dc58e..5bb4b090e 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -4,7 +4,6 @@ from __future__ import unicode_literals from thinc.api import chain, layerize, with_getitem -from thinc.neural import Model, Softmax import numpy cimport numpy as np import cytoolz @@ -14,20 +13,22 @@ import ujson import msgpack from thinc.api import add, layerize, chain, clone, concatenate, with_flatten -from thinc.neural import Model, Maxout, Softmax, Affine -from thinc.neural._classes.hash_embed import HashEmbed +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU +from thinc.i2v import HashEmbed +from thinc.t2v import Pooling, max_pool, mean_pool, sum_pool +from thinc.t2t import ExtractWindow, ParametricAttention +from thinc.misc import Residual +from thinc.misc import BatchNorm as BN +from thinc.misc import LayerNorm as LN + from thinc.neural.util import to_categorical -from thinc.neural.pooling import Pooling, max_pool, mean_pool from thinc.neural._classes.difference import Siamese, CauchySimilarity -from thinc.neural._classes.convolution import ExtractWindow -from thinc.neural._classes.resnet import Residual -from thinc.neural._classes.batchnorm import BatchNorm as BN - from .tokens.doc cimport Doc from .syntax.parser cimport Parser as LinearParser from .syntax.nn_parser cimport Parser as NeuralParser +from .syntax import nonproj from .syntax.parser import get_templates as get_feature_templates from .syntax.beam_parser cimport BeamParser from .syntax.ner cimport BiluoPushDown @@ -41,16 +42,186 @@ from .syntax import nonproj from .compat import json_dumps from .attrs import ID, LOWER, PREFIX, SUFFIX, SHAPE, TAG, DEP, POS -from ._ml import rebatch, Tok2Vec, flatten, get_col, doc2feats +from ._ml import rebatch, Tok2Vec, flatten +from ._ml import build_text_classifier, build_tagger_model +from ._ml import link_vectors_to_models from .parts_of_speech import X -class TokenVectorEncoder(object): +class SentenceSegmenter(object): + """A simple spaCy hook, to allow custom sentence boundary detection logic + (that doesn't require the dependency parse). + + To change the sentence boundary detection strategy, pass a generator + function `strategy` on initialization, or assign a new strategy to + the .strategy attribute. + + Sentence detection strategies should be generators that take `Doc` objects + and yield `Span` objects for each sentence. + """ + name = 'sbd' + + def __init__(self, vocab, strategy=None): + self.vocab = vocab + if strategy is None or strategy == 'on_punct': + strategy = self.split_on_punct + self.strategy = strategy + + def __call__(self, doc): + doc.user_hooks['sents'] = self.strategy + + @staticmethod + def split_on_punct(doc): + start = 0 + seen_period = False + for i, word in enumerate(doc): + if seen_period and not word.is_punct: + yield doc[start : word.i] + start = word.i + seen_period = False + elif word.text in ['.', '!', '?']: + seen_period = True + if start < len(doc): + yield doc[start : len(doc)] + + +class BaseThincComponent(object): + name = None + + @classmethod + def Model(cls, *shape, **kwargs): + """Initialize a model for the pipe.""" + raise NotImplementedError + + def __init__(self, vocab, model=True, **cfg): + """Create a new pipe instance.""" + raise NotImplementedError + + def __call__(self, doc): + """Apply the pipe to one document. The document is + modified in-place, and returned. + + Both __call__ and pipe should delegate to the `predict()` + and `set_annotations()` methods. + """ + scores = self.predict([doc]) + self.set_annotations([doc], scores) + return doc + + def pipe(self, stream, batch_size=128, n_threads=-1): + """Apply the pipe to a stream of documents. + + Both __call__ and pipe should delegate to the `predict()` + and `set_annotations()` methods. + """ + for docs in cytoolz.partition_all(batch_size, stream): + docs = list(docs) + scores = self.predict(docs) + self.set_annotations(docs, scores) + yield from docs + + def predict(self, docs): + """Apply the pipeline's model to a batch of docs, without + modifying them. + """ + raise NotImplementedError + + def set_annotations(self, docs, scores): + """Modify a batch of documents, using pre-computed scores.""" + raise NotImplementedError + + def update(self, docs, golds, drop=0., sgd=None, losses=None): + """Learn from a batch of documents and gold-standard information, + updating the pipe's model. + + Delegates to predict() and get_loss(). + """ + raise NotImplementedError + + def get_loss(self, docs, golds, scores): + """Find the loss and gradient of loss for the batch of + documents and their predicted scores.""" + raise NotImplementedError + + def begin_training(self, gold_tuples=tuple(), pipeline=None): + """Initialize the pipe for training, using data exampes if available. + If no model has been initialized yet, the model is added.""" + if self.model is True: + self.model = self.Model(**self.cfg) + link_vectors_to_models(self.vocab) + + def use_params(self, params): + """Modify the pipe's model, to use the given parameter values. + """ + with self.model.use_params(params): + yield + + def to_bytes(self, **exclude): + """Serialize the pipe to a bytestring.""" + serialize = OrderedDict() + serialize['cfg'] = lambda: json_dumps(self.cfg) + if self.model in (True, False, None): + serialize['model'] = lambda: self.model + else: + serialize['model'] = self.model.to_bytes + serialize['vocab'] = self.vocab.to_bytes + return util.to_bytes(serialize, exclude) + + def from_bytes(self, bytes_data, **exclude): + """Load the pipe from a bytestring.""" + def load_model(b): + if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length + self.model = self.Model(**self.cfg) + self.model.from_bytes(b) + + deserialize = OrderedDict(( + ('cfg', lambda b: self.cfg.update(ujson.loads(b))), + ('vocab', lambda b: self.vocab.from_bytes(b)), + ('model', load_model), + )) + util.from_bytes(bytes_data, deserialize, exclude) + return self + + def to_disk(self, path, **exclude): + """Serialize the pipe to disk.""" + serialize = OrderedDict() + serialize['cfg'] = lambda p: p.open('w').write(json_dumps(self.cfg)) + serialize['vocab'] = lambda p: self.vocab.to_disk(p) + if self.model not in (None, True, False): + serialize['model'] = lambda p: p.open('wb').write(self.model.to_bytes()) + util.to_disk(path, serialize, exclude) + + def from_disk(self, path, **exclude): + """Load the pipe from disk.""" + def load_model(p): + if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length + self.model = self.Model(**self.cfg) + self.model.from_bytes(p.open('rb').read()) + + deserialize = OrderedDict(( + ('cfg', lambda p: self.cfg.update(_load_cfg(p))), + ('vocab', lambda p: self.vocab.from_disk(p)), + ('model', load_model), + )) + util.from_disk(path, deserialize, exclude) + return self + + +def _load_cfg(path): + if path.exists(): + return ujson.load(path.open()) + else: + return {} + + +class TokenVectorEncoder(BaseThincComponent): """Assign position-sensitive vectors to tokens, using a CNN or RNN.""" name = 'tensorizer' @classmethod - def Model(cls, width=128, embed_size=7500, **cfg): + def Model(cls, width=128, embed_size=4000, **cfg): """Create a new statistical model for the class. width (int): Output size of the model. @@ -60,7 +231,7 @@ class TokenVectorEncoder(object): """ width = util.env_opt('token_vector_width', width) embed_size = util.env_opt('embed_size', embed_size) - return Tok2Vec(width, embed_size, preprocess=None) + return Tok2Vec(width, embed_size, **cfg) def __init__(self, vocab, model=True, **cfg): """Construct a new statistical model. Weights are not allocated on @@ -77,8 +248,10 @@ class TokenVectorEncoder(object): >>> tok2vec.model = tok2vec.Model(128, 5000) """ self.vocab = vocab - self.doc2feats = doc2feats() self.model = model + self.cfg = dict(cfg) + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + self.cfg.setdefault('cnn_maxout_pieces', 3) def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -111,8 +284,7 @@ class TokenVectorEncoder(object): docs (iterable): A sequence of `Doc` objects. RETURNS (object): Vector representations for each token in the documents. """ - feats = self.doc2feats(docs) - tokvecs = self.model(feats) + tokvecs = self.model(docs) return tokvecs def set_annotations(self, docs, tokvecses): @@ -136,95 +308,55 @@ class TokenVectorEncoder(object): """ if isinstance(docs, Doc): docs = [docs] - feats = self.doc2feats(docs) - tokvecs, bp_tokvecs = self.model.begin_update(feats, drop=drop) + tokvecs, bp_tokvecs = self.model.begin_update(docs, drop=drop) return tokvecs, bp_tokvecs def get_loss(self, docs, golds, scores): # TODO: implement raise NotImplementedError - def begin_training(self, gold_tuples, pipeline=None): + def begin_training(self, gold_tuples=tuple(), pipeline=None): """Allocate models, pre-process training data and acquire a trainer and optimizer. gold_tuples (iterable): Gold-standard training data. pipeline (list): The pipeline the model is part of. """ - self.doc2feats = doc2feats() if self.model is True: - self.model = self.Model() - - def use_params(self, params): - """Replace weights of models in the pipeline with those provided in the - params dictionary. - - params (dict): A dictionary of parameters keyed by model ID. - """ - with self.model.use_params(params): - yield - - def to_bytes(self, **exclude): - serialize = OrderedDict(( - ('model', lambda: self.model.to_bytes()), - ('vocab', lambda: self.vocab.to_bytes()) - )) - return util.to_bytes(serialize, exclude) - - def from_bytes(self, bytes_data, **exclude): - if self.model is True: - self.model = self.Model() - deserialize = OrderedDict(( - ('model', lambda b: self.model.from_bytes(b)), - ('vocab', lambda b: self.vocab.from_bytes(b)) - )) - util.from_bytes(bytes_data, deserialize, exclude) - return self - - def to_disk(self, path, **exclude): - serialize = OrderedDict(( - ('model', lambda p: p.open('wb').write(self.model.to_bytes())), - ('vocab', lambda p: self.vocab.to_disk(p)) - )) - util.to_disk(path, serialize, exclude) - - def from_disk(self, path, **exclude): - if self.model is True: - self.model = self.Model() - deserialize = OrderedDict(( - ('model', lambda p: self.model.from_bytes(p.open('rb').read())), - ('vocab', lambda p: self.vocab.from_disk(p)) - )) - util.from_disk(path, deserialize, exclude) - return self + self.cfg['pretrained_dims'] = self.vocab.vectors_length + self.model = self.Model(**self.cfg) + link_vectors_to_models(self.vocab) -class NeuralTagger(object): +class NeuralTagger(BaseThincComponent): name = 'tagger' - def __init__(self, vocab, model=True): + def __init__(self, vocab, model=True, **cfg): self.vocab = vocab self.model = model + self.cfg = dict(cfg) + self.cfg.setdefault('cnn_maxout_pieces', 2) + self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1]) def __call__(self, doc): - tags = self.predict([doc.tensor]) + tags = self.predict([doc]) self.set_annotations([doc], tags) return doc def pipe(self, stream, batch_size=128, n_threads=-1): for docs in cytoolz.partition_all(batch_size, stream): - tokvecs = [d.tensor for d in docs] - tag_ids = self.predict(tokvecs) + docs = list(docs) + tag_ids = self.predict(docs) self.set_annotations(docs, tag_ids) yield from docs - def predict(self, tokvecs): - scores = self.model(tokvecs) + def predict(self, docs): + scores = self.model(docs) scores = self.model.ops.flatten(scores) guesses = scores.argmax(axis=1) if not isinstance(guesses, numpy.ndarray): guesses = guesses.get() guesses = self.model.ops.unflatten(guesses, - [tv.shape[0] for tv in tokvecs]) + [len(d) for d in docs]) return guesses def set_annotations(self, docs, batch_tag_ids): @@ -235,6 +367,8 @@ class NeuralTagger(object): cdef Vocab vocab = self.vocab for i, doc in enumerate(docs): doc_tag_ids = batch_tag_ids[i] + if hasattr(doc_tag_ids, 'get'): + doc_tag_ids = doc_tag_ids.get() for j, tag_id in enumerate(doc_tag_ids): # Don't clobber preset POS tags if doc.c[j].tag == 0 and doc.c[j].pos == 0: @@ -242,18 +376,16 @@ class NeuralTagger(object): idx += 1 doc.is_tagged = True - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - docs, tokvecs = docs_tokvecs + def update(self, docs, golds, drop=0., sgd=None, losses=None): + if losses is not None and self.name not in losses: + losses[self.name] = 0. - if self.model.nI is None: - self.model.nI = tokvecs[0].shape[1] - - tag_scores, bp_tag_scores = self.model.begin_update(tokvecs, drop=drop) + tag_scores, bp_tag_scores = self.model.begin_update(docs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) + bp_tag_scores(d_tag_scores, sgd=sgd) - d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) - - return d_tokvecs + if losses is not None: + losses[self.name] += loss def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) @@ -276,7 +408,7 @@ class NeuralTagger(object): d_scores = self.model.ops.unflatten(d_scores, [len(d) for d in docs]) return float(loss), d_scores - def begin_training(self, gold_tuples, pipeline=None): + def begin_training(self, gold_tuples=tuple(), pipeline=None): orig_tag_map = dict(self.vocab.morphology.tag_map) new_tag_map = {} for raw_text, annots_brackets in gold_tuples: @@ -294,35 +426,38 @@ class NeuralTagger(object): vocab.morphology = Morphology(vocab.strings, new_tag_map, vocab.morphology.lemmatizer, exc=vocab.morphology.exc) - token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width) + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) + link_vectors_to_models(self.vocab) @classmethod - def Model(cls, n_tags, token_vector_width): - return with_flatten( - chain(Maxout(token_vector_width, token_vector_width), - Softmax(n_tags, token_vector_width))) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def use_params(self, params): with self.model.use_params(params): yield def to_bytes(self, **exclude): - serialize = OrderedDict(( - ('model', lambda: self.model.to_bytes()), - ('vocab', lambda: self.vocab.to_bytes()), - ('tag_map', lambda: msgpack.dumps(self.vocab.morphology.tag_map, - use_bin_type=True, - encoding='utf8')) - )) + serialize = OrderedDict() + if self.model in (None, True, False): + serialize['model'] = lambda: self.model + else: + serialize['model'] = self.model.to_bytes + serialize['vocab'] = self.vocab.to_bytes + + serialize['tag_map'] = lambda: msgpack.dumps(self.vocab.morphology.tag_map, + use_bin_type=True, + encoding='utf8') return util.to_bytes(serialize, exclude) def from_bytes(self, bytes_data, **exclude): def load_model(b): if self.model is True: - token_vector_width = util.env_opt('token_vector_width', 128) - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width) + token_vector_width = util.env_opt('token_vector_width', + self.cfg.get('token_vector_width', 128)) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) self.model.from_bytes(b) def load_tag_map(b): @@ -331,7 +466,7 @@ class NeuralTagger(object): self.vocab.strings, tag_map=tag_map, lemmatizer=self.vocab.morphology.lemmatizer, exc=self.vocab.morphology.exc) - + deserialize = OrderedDict(( ('vocab', lambda b: self.vocab.from_bytes(b)), ('tag_map', load_tag_map), @@ -341,6 +476,7 @@ class NeuralTagger(object): return self def to_disk(self, path, **exclude): + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] serialize = OrderedDict(( ('vocab', lambda p: self.vocab.to_disk(p)), ('tag_map', lambda p: p.open('wb').write(msgpack.dumps( @@ -348,14 +484,14 @@ class NeuralTagger(object): use_bin_type=True, encoding='utf8'))), ('model', lambda p: p.open('wb').write(self.model.to_bytes())), + ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))) )) util.to_disk(path, serialize, exclude) def from_disk(self, path, **exclude): def load_model(p): if self.model is True: - token_vector_width = util.env_opt('token_vector_width', 128) - self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -367,6 +503,7 @@ class NeuralTagger(object): exc=self.vocab.morphology.exc) deserialize = OrderedDict(( + ('cfg', lambda p: self.cfg.update(_load_cfg(p))), ('vocab', lambda p: self.vocab.from_disk(p)), ('tag_map', load_tag_map), ('model', load_model), @@ -377,53 +514,114 @@ class NeuralTagger(object): class NeuralLabeller(NeuralTagger): name = 'nn_labeller' - def __init__(self, vocab, model=True): + def __init__(self, vocab, model=True, target='dep_tag_offset', **cfg): self.vocab = vocab self.model = model - self.labels = {} + if target == 'dep': + self.make_label = self.make_dep + elif target == 'tag': + self.make_label = self.make_tag + elif target == 'ent': + self.make_label = self.make_ent + elif target == 'dep_tag_offset': + self.make_label = self.make_dep_tag_offset + elif target == 'ent_tag': + self.make_label = self.make_ent_tag + elif hasattr(target, '__call__'): + self.make_label = target + else: + raise ValueError( + "NeuralLabeller target should be function or one of " + "['dep', 'tag', 'ent', 'dep_tag_offset', 'ent_tag']") + self.cfg = dict(cfg) + self.cfg.setdefault('cnn_maxout_pieces', 2) + self.cfg.setdefault('pretrained_dims', self.vocab.vectors.data.shape[1]) + + @property + def labels(self): + return self.cfg.setdefault('labels', {}) + + @labels.setter + def labels(self, value): + self.cfg['labels'] = value def set_annotations(self, docs, dep_ids): pass - def begin_training(self, gold_tuples, pipeline=None): + def begin_training(self, gold_tuples=tuple(), pipeline=None, tok2vec=None): gold_tuples = nonproj.preprocess_training_data(gold_tuples) for raw_text, annots_brackets in gold_tuples: for annots, brackets in annots_brackets: ids, words, tags, heads, deps, ents = annots - for dep in deps: - if dep not in self.labels: - self.labels[dep] = len(self.labels) - token_vector_width = pipeline[0].model.nO + for i in range(len(ids)): + label = self.make_label(i, words, tags, heads, deps, ents) + if label is not None and label not in self.labels: + self.labels[label] = len(self.labels) if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width) + token_vector_width = util.env_opt('token_vector_width') + self.model = chain( + tok2vec, + Softmax(len(self.labels), token_vector_width) + ) + link_vectors_to_models(self.vocab) @classmethod - def Model(cls, n_tags, token_vector_width): - return with_flatten( - chain(Maxout(token_vector_width, token_vector_width), - Softmax(n_tags, token_vector_width))) + def Model(cls, n_tags, tok2vec=None, **cfg): + return build_tagger_model(n_tags, tok2vec=tok2vec, **cfg) def get_loss(self, docs, golds, scores): - scores = self.model.ops.flatten(scores) cdef int idx = 0 correct = numpy.zeros((scores.shape[0],), dtype='i') guesses = scores.argmax(axis=1) for gold in golds: - for tag in gold.labels: - if tag is None or tag not in self.labels: + for i in range(len(gold.labels)): + label = self.make_label(i, gold.words, gold.tags, gold.heads, + gold.labels, gold.ents) + if label is None or label not in self.labels: correct[idx] = guesses[idx] else: - correct[idx] = self.labels[tag] + correct[idx] = self.labels[label] idx += 1 correct = self.model.ops.xp.array(correct, dtype='i') d_scores = scores - to_categorical(correct, nb_classes=scores.shape[1]) d_scores /= d_scores.shape[0] loss = (d_scores**2).sum() - d_scores = self.model.ops.unflatten(d_scores, [len(d) for d in docs]) return float(loss), d_scores + @staticmethod + def make_dep(i, words, tags, heads, deps, ents): + if deps[i] is None or heads[i] is None: + return None + return deps[i] -class SimilarityHook(object): + @staticmethod + def make_tag(i, words, tags, heads, deps, ents): + return tags[i] + + @staticmethod + def make_ent(i, words, tags, heads, deps, ents): + if ents is None: + return None + return ents[i] + + @staticmethod + def make_dep_tag_offset(i, words, tags, heads, deps, ents): + if deps[i] is None or heads[i] is None: + return None + offset = heads[i] - i + offset = min(offset, 2) + offset = max(offset, -2) + return '%s-%s:%d' % (deps[i], tags[i], offset) + + @staticmethod + def make_ent_tag(i, words, tags, heads, deps, ents): + if ents is None or ents[i] is None: + return None + else: + return '%s-%s' % (tags[i], ents[i]) + + +class SimilarityHook(BaseThincComponent): """ Experimental @@ -439,16 +637,17 @@ class SimilarityHook(object): Where W is a vector of dimension weights, initialized to 1. """ name = 'similarity' - def __init__(self, vocab, model=True): + def __init__(self, vocab, model=True, **cfg): self.vocab = vocab self.model = model + self.cfg = dict(cfg) @classmethod def Model(cls, length): return Siamese(Pooling(max_pool, mean_pool), CauchySimilarity(length)) def __call__(self, doc): - '''Install similarity hook''' + """Install similarity hook""" doc.user_hooks['similarity'] = self.predict return doc @@ -457,17 +656,12 @@ class SimilarityHook(object): yield self(doc) def predict(self, doc1, doc2): - return self.model.predict([(doc1.tensor, doc2.tensor)]) + return self.model.predict([(doc1, doc2)]) - def update(self, doc1_tensor1_doc2_tensor2, golds, sgd=None, drop=0.): - doc1s, tensor1s, doc2s, tensor2s = doc1_tensor1_doc2_tensor2 - sims, bp_sims = self.model.begin_update(zip(tensor1s, tensor2s), - drop=drop) - d_tensor1s, d_tensor2s = bp_sims(golds, sgd=sgd) + def update(self, doc1_doc2, golds, sgd=None, drop=0.): + sims, bp_sims = self.model.begin_update(doc1_doc2, drop=drop) - return d_tensor1s, d_tensor2s - - def begin_training(self, _, pipeline=None): + def begin_training(self, _=tuple(), pipeline=None): """ Allocate model, using width from tensorizer in pipeline. @@ -476,49 +670,85 @@ class SimilarityHook(object): """ if self.model is True: self.model = self.Model(pipeline[0].model.nO) + link_vectors_to_models(self.vocab) - def use_params(self, params): - """Replace weights of models in the pipeline with those provided in the - params dictionary. - params (dict): A dictionary of parameters keyed by model ID. - """ - with self.model.use_params(params): - yield +class TextCategorizer(BaseThincComponent): + name = 'textcat' - def to_bytes(self, **exclude): - serialize = OrderedDict(( - ('model', lambda: self.model.to_bytes()), - ('vocab', lambda: self.vocab.to_bytes()) - )) - return util.to_bytes(serialize, exclude) + @classmethod + def Model(cls, nr_class=1, width=64, **cfg): + return build_text_classifier(nr_class, width, **cfg) - def from_bytes(self, bytes_data, **exclude): + def __init__(self, vocab, model=True, **cfg): + self.vocab = vocab + self.model = model + self.cfg = dict(cfg) + + @property + def labels(self): + return self.cfg.get('labels', ['LABEL']) + + @labels.setter + def labels(self, value): + self.cfg['labels'] = value + + def __call__(self, doc): + scores = self.predict([doc]) + self.set_annotations([doc], scores) + return doc + + def pipe(self, stream, batch_size=128, n_threads=-1): + for docs in cytoolz.partition_all(batch_size, stream): + docs = list(docs) + scores = self.predict(docs) + self.set_annotations(docs, scores) + yield from docs + + def predict(self, docs): + scores = self.model(docs) + scores = self.model.ops.asarray(scores) + return scores + + def set_annotations(self, docs, scores): + for i, doc in enumerate(docs): + for j, label in enumerate(self.labels): + doc.cats[label] = float(scores[i, j]) + + def update(self, docs, golds, state=None, drop=0., sgd=None, losses=None): + scores, bp_scores = self.model.begin_update(docs, drop=drop) + loss, d_scores = self.get_loss(docs, golds, scores) + bp_scores(d_scores, sgd=sgd) + if losses is not None: + losses.setdefault(self.name, 0.0) + losses[self.name] += loss + + def get_loss(self, docs, golds, scores): + truths = numpy.zeros((len(golds), len(self.labels)), dtype='f') + not_missing = numpy.ones((len(golds), len(self.labels)), dtype='f') + for i, gold in enumerate(golds): + for j, label in enumerate(self.labels): + if label in gold.cats: + truths[i, j] = gold.cats[label] + else: + not_missing[i, j] = 0. + truths = self.model.ops.asarray(truths) + not_missing = self.model.ops.asarray(not_missing) + d_scores = (scores-truths) / scores.shape[0] + d_scores *= not_missing + mean_square_error = ((scores-truths)**2).sum(axis=1).mean() + return mean_square_error, d_scores + + def begin_training(self, gold_tuples=tuple(), pipeline=None): + if pipeline and getattr(pipeline[0], 'name', None) == 'tensorizer': + token_vector_width = pipeline[0].model.nO + else: + token_vector_width = 64 if self.model is True: - self.model = self.Model() - deserialize = OrderedDict(( - ('model', lambda b: self.model.from_bytes(b)), - ('vocab', lambda b: self.vocab.from_bytes(b)) - )) - util.from_bytes(bytes_data, deserialize, exclude) - return self - - def to_disk(self, path, **exclude): - serialize = OrderedDict(( - ('model', lambda p: p.open('wb').write(self.model.to_bytes())), - ('vocab', lambda p: self.vocab.to_disk(p)) - )) - util.to_disk(path, serialize, exclude) - - def from_disk(self, path, **exclude): - if self.model is True: - self.model = self.Model() - deserialize = OrderedDict(( - ('model', lambda p: self.model.from_bytes(p.open('rb').read())), - ('vocab', lambda p: self.vocab.from_disk(p)) - )) - util.from_disk(path, deserialize, exclude) - return self + self.cfg['pretrained_dims'] = self.vocab.vectors_length + self.model = self.Model(len(self.labels), token_vector_width, + **self.cfg) + link_vectors_to_models(self.vocab) cdef class EntityRecognizer(LinearParser): @@ -554,11 +784,27 @@ cdef class DependencyParser(LinearParser): if isinstance(label, basestring): label = self.vocab.strings[label] + @property + def postprocesses(self): + return [nonproj.deprojectivize] + cdef class NeuralDependencyParser(NeuralParser): name = 'parser' TransitionSystem = ArcEager + @property + def postprocesses(self): + return [nonproj.deprojectivize] + + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + for target in []: + labeller = NeuralLabeller(self.vocab, target=target) + tok2vec = self.model[0] + labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) + pipeline.append(labeller) + self._multitasks.append(labeller) + def __reduce__(self): return (NeuralDependencyParser, (self.vocab, self.moves, self.model), None, None) @@ -569,6 +815,14 @@ cdef class NeuralEntityRecognizer(NeuralParser): nr_feature = 6 + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + for target in []: + labeller = NeuralLabeller(self.vocab, target=target) + tok2vec = self.model[0] + labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) + pipeline.append(labeller) + self._multitasks.append(labeller) + def __reduce__(self): return (NeuralEntityRecognizer, (self.vocab, self.moves, self.model), None, None) @@ -583,6 +837,11 @@ cdef class BeamDependencyParser(BeamParser): if isinstance(label, basestring): label = self.vocab.strings[label] + @property + def postprocesses(self): + return [nonproj.deprojectivize] + + __all__ = ['Tagger', 'DependencyParser', 'EntityRecognizer', 'BeamDependencyParser', 'BeamEntityRecognizer', 'TokenVectorEnoder'] diff --git a/spacy/strings.pyx b/spacy/strings.pyx index 2e42b9667..6f676c79a 100644 --- a/spacy/strings.pyx +++ b/spacy/strings.pyx @@ -215,7 +215,10 @@ cdef class StringStore: path = util.ensure_path(path) with path.open('r') as file_: strings = ujson.load(file_) + prev = list(self) self._reset_and_load(strings) + for word in prev: + self.add(word) return self def to_bytes(self, **exclude): @@ -234,7 +237,10 @@ cdef class StringStore: RETURNS (StringStore): The `StringStore` object. """ strings = ujson.loads(bytes_data) + prev = list(self) self._reset_and_load(strings) + for word in prev: + self.add(word) return self def set_frozen(self, bint is_frozen): diff --git a/spacy/structs.pxd b/spacy/structs.pxd index 3c60cd87f..cfcadc3d0 100644 --- a/spacy/structs.pxd +++ b/spacy/structs.pxd @@ -61,13 +61,13 @@ cdef struct TokenC: attr_t sense int head attr_t dep - bint sent_start uint32_t l_kids uint32_t r_kids uint32_t l_edge uint32_t r_edge + int sent_start int ent_iob attr_t ent_type # TODO: Is there a better way to do this? Multiple sources of truth.. hash_t ent_id diff --git a/spacy/symbols.pxd b/spacy/symbols.pxd index 0b713cb21..e981de6ae 100644 --- a/spacy/symbols.pxd +++ b/spacy/symbols.pxd @@ -1,4 +1,4 @@ -cpdef enum symbol_t: +cdef enum symbol_t: NIL IS_ALPHA IS_ASCII diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx index 9f4009579..dd0e38cad 100644 --- a/spacy/symbols.pyx +++ b/spacy/symbols.pyx @@ -1,4 +1,6 @@ # coding: utf8 +#cython: optimize.unpack_method_calls=False + from __future__ import unicode_literals IDS = { @@ -458,4 +460,11 @@ IDS = { "xcomp": xcomp } -NAMES = [it[0] for it in sorted(IDS.items(), key=lambda it: it[1])] +def sort_nums(x): + return x[1] + +NAMES = [it[0] for it in sorted(IDS.items(), key=sort_nums)] +# Unfortunate hack here, to work around problem with long cpdef enum +# (which is generating an enormous amount of C++ in Cython 0.24+) +# We keep the enum cdef, and just make sure the names are available to Python +locals().update(IDS) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx new file mode 100644 index 000000000..da4efefbc --- /dev/null +++ b/spacy/syntax/_beam_utils.pyx @@ -0,0 +1,291 @@ +# cython: infer_types=True +# cython: profile=True +cimport numpy as np +import numpy +from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF +from thinc.extra.search cimport Beam +from thinc.extra.search import MaxViolation +from thinc.typedefs cimport hash_t, class_t +from thinc.extra.search cimport MaxViolation + +from .transition_system cimport TransitionSystem, Transition +from .stateclass cimport StateClass +from ..gold cimport GoldParse +from ..tokens.doc cimport Doc + + +# These are passed as callbacks to thinc.search.Beam +cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves) except -1: + dest = _dest + src = _src + moves = _moves + dest.clone(src) + moves[clas].do(dest.c, moves[clas].label) + dest.c.push_hist(clas) + + +cdef int _check_final_state(void* _state, void* extra_args) except -1: + return (_state).is_final() + + +def _cleanup(Beam beam): + for i in range(beam.width): + Py_XDECREF(beam._states[i].content) + Py_XDECREF(beam._parents[i].content) + + +cdef hash_t _hash_state(void* _state, void* _) except 0: + state = _state + if state.c.is_final(): + return 1 + else: + return state.c.hash() + + +cdef class ParserBeam(object): + cdef public TransitionSystem moves + cdef public object states + cdef public object golds + cdef public object beams + cdef public object dones + + def __init__(self, TransitionSystem moves, states, golds, + int width, float density): + self.moves = moves + self.states = states + self.golds = golds + self.beams = [] + cdef Beam beam + cdef StateClass state, st + for state in states: + beam = Beam(self.moves.n_moves, width, density) + beam.initialize(self.moves.init_beam_state, state.c.length, state.c._sent) + for i in range(beam.width): + st = beam.at(i) + st.c.offset = state.c.offset + self.beams.append(beam) + self.dones = [False] * len(self.beams) + + def __dealloc__(self): + if self.beams is not None: + for beam in self.beams: + if beam is not None: + _cleanup(beam) + + @property + def is_done(self): + return all(b.is_done or self.dones[i] for i, b in enumerate(self.beams)) + + def __getitem__(self, i): + return self.beams[i] + + def __len__(self): + return len(self.beams) + + def advance(self, scores, follow_gold=False): + cdef Beam beam + for i, beam in enumerate(self.beams): + if beam.is_done or not scores[i].size or self.dones[i]: + continue + self._set_scores(beam, scores[i]) + if self.golds is not None: + self._set_costs(beam, self.golds[i], follow_gold=follow_gold) + if follow_gold: + beam.advance(_transition_state, NULL, self.moves.c) + else: + beam.advance(_transition_state, _hash_state, self.moves.c) + beam.check_done(_check_final_state, NULL) + if beam.is_done and self.golds is not None: + for j in range(beam.size): + state = beam.at(j) + if state.is_final(): + try: + if self.moves.is_gold_parse(state, self.golds[i]): + beam._states[j].loss = 0.0 + elif beam._states[j].loss == 0.0: + beam._states[j].loss = 1.0 + except NotImplementedError: + break + + def _set_scores(self, Beam beam, float[:, ::1] scores): + cdef float* c_scores = &scores[0, 0] + cdef int nr_state = min(scores.shape[0], beam.size) + cdef int nr_class = scores.shape[1] + for i in range(nr_state): + state = beam.at(i) + if not state.is_final(): + for j in range(nr_class): + beam.scores[i][j] = c_scores[i * nr_class + j] + self.moves.set_valid(beam.is_valid[i], state.c) + else: + for j in range(beam.nr_class): + beam.scores[i][j] = 0 + beam.costs[i][j] = 0 + + def _set_costs(self, Beam beam, GoldParse gold, int follow_gold=False): + for i in range(beam.size): + state = beam.at(i) + if not state.c.is_final(): + self.moves.set_costs(beam.is_valid[i], beam.costs[i], state, gold) + if follow_gold: + for j in range(beam.nr_class): + if beam.costs[i][j] >= 1: + beam.is_valid[i][j] = 0 + + +def get_token_ids(states, int n_tokens): + cdef StateClass state + cdef np.ndarray ids = numpy.zeros((len(states), n_tokens), + dtype='int32', order='C') + c_ids = ids.data + for i, state in enumerate(states): + if not state.is_final(): + state.c.set_context_tokens(c_ids, n_tokens) + else: + ids[i] = -1 + c_ids += ids.shape[1] + return ids + +nr_update = 0 +def update_beam(TransitionSystem moves, int nr_feature, int max_steps, + states, golds, + state2vec, vec2scores, + int width, float density, int hist_feats, + losses=None, drop=0.): + global nr_update + cdef MaxViolation violn + nr_update += 1 + pbeam = ParserBeam(moves, states, golds, + width=width, density=density) + gbeam = ParserBeam(moves, states, golds, + width=width, density=0.0) + cdef StateClass state + beam_maps = [] + backprops = [] + violns = [MaxViolation() for _ in range(len(states))] + for t in range(max_steps): + if pbeam.is_done and gbeam.is_done: + break + # The beam maps let us find the right row in the flattened scores + # arrays for each state. States are identified by (example id, history). + # We keep a different beam map for each step (since we'll have a flat + # scores array for each step). The beam map will let us take the per-state + # losses, and compute the gradient for each (step, state, class). + beam_maps.append({}) + # Gather all states from the two beams in a list. Some stats may occur + # in both beams. To figure out which beam each state belonged to, + # we keep two lists of indices, p_indices and g_indices + states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1], nr_update) + if not states: + break + # Now that we have our flat list of states, feed them through the model + token_ids = get_token_ids(states, nr_feature) + vectors, bp_vectors = state2vec.begin_update(token_ids, drop=drop) + if hist_feats: + hists = numpy.asarray([st.history[:hist_feats] for st in states], dtype='i') + scores, bp_scores = vec2scores.begin_update((vectors, hists), drop=drop) + else: + scores, bp_scores = vec2scores.begin_update(vectors, drop=drop) + + # Store the callbacks for the backward pass + backprops.append((token_ids, bp_vectors, bp_scores)) + + # Unpack the flat scores into lists for the two beams. The indices arrays + # tell us which example and state the scores-row refers to. + p_scores = [numpy.ascontiguousarray(scores[indices], dtype='f') for indices in p_indices] + g_scores = [numpy.ascontiguousarray(scores[indices], dtype='f') for indices in g_indices] + # Now advance the states in the beams. The gold beam is contrained to + # to follow only gold analyses. + pbeam.advance(p_scores) + gbeam.advance(g_scores, follow_gold=True) + # Track the "maximum violation", to use in the update. + for i, violn in enumerate(violns): + violn.check_crf(pbeam[i], gbeam[i]) + histories = [] + losses = [] + for violn in violns: + if violn.p_hist: + histories.append(violn.p_hist + violn.g_hist) + losses.append(violn.p_probs + violn.g_probs) + else: + histories.append([]) + losses.append([]) + states_d_scores = get_gradient(moves.n_moves, beam_maps, histories, losses) + return states_d_scores, backprops[:len(states_d_scores)] + + +def get_states(pbeams, gbeams, beam_map, nr_update): + seen = {} + states = [] + p_indices = [] + g_indices = [] + cdef Beam pbeam, gbeam + assert len(pbeams) == len(gbeams) + for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): + p_indices.append([]) + g_indices.append([]) + for i in range(pbeam.size): + state = pbeam.at(i) + if not state.is_final(): + key = tuple([eg_id] + pbeam.histories[i]) + assert key not in seen, (key, seen) + seen[key] = len(states) + p_indices[-1].append(len(states)) + states.append(state) + beam_map.update(seen) + for i in range(gbeam.size): + state = gbeam.at(i) + if not state.is_final(): + key = tuple([eg_id] + gbeam.histories[i]) + if key in seen: + g_indices[-1].append(seen[key]) + else: + g_indices[-1].append(len(states)) + beam_map[key] = len(states) + states.append(state) + p_idx = [numpy.asarray(idx, dtype='i') for idx in p_indices] + g_idx = [numpy.asarray(idx, dtype='i') for idx in g_indices] + return states, p_idx, g_idx + + +def get_gradient(nr_class, beam_maps, histories, losses): + """ + The global model assigns a loss to each parse. The beam scores + are additive, so the same gradient is applied to each action + in the history. This gives the gradient of a single *action* + for a beam state -- so we have "the gradient of loss for taking + action i given history H." + + Histories: Each hitory is a list of actions + Each candidate has a history + Each beam has multiple candidates + Each batch has multiple beams + So history is list of lists of lists of ints + """ + nr_step = len(beam_maps) + grads = [] + nr_step = 0 + for eg_id, hists in enumerate(histories): + for loss, hist in zip(losses[eg_id], hists): + if loss != 0.0 and not numpy.isnan(loss): + nr_step = max(nr_step, len(hist)) + for i in range(nr_step): + grads.append(numpy.zeros((max(beam_maps[i].values())+1, nr_class), dtype='f')) + assert len(histories) == len(losses) + for eg_id, hists in enumerate(histories): + for loss, hist in zip(losses[eg_id], hists): + if loss == 0.0 or numpy.isnan(loss): + continue + key = tuple([eg_id]) + # Adjust loss for length + avg_loss = loss / len(hist) + loss += avg_loss * (nr_step - len(hist)) + for j, clas in enumerate(hist): + i = beam_maps[j][key] + # In step j, at state i action clas + # resulted in loss + grads[j][i, clas] += loss + key = key + tuple([clas]) + return grads + + diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index c06851978..4675d887e 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -1,4 +1,4 @@ -from libc.string cimport memcpy, memset +from libc.string cimport memcpy, memset, memmove from libc.stdlib cimport malloc, calloc, free from libc.stdint cimport uint32_t, uint64_t @@ -15,6 +15,23 @@ from ..typedefs cimport attr_t cdef inline bint is_space_token(const TokenC* token) nogil: return Lexeme.c_check_flag(token.lex, IS_SPACE) +cdef struct RingBufferC: + int[8] data + int i + int default + +cdef inline int ring_push(RingBufferC* ring, int value) nogil: + ring.data[ring.i] = value + ring.i += 1 + if ring.i >= 8: + ring.i = 0 + +cdef inline int ring_get(RingBufferC* ring, int i) nogil: + if i >= ring.i: + return ring.default + else: + return ring.data[ring.i-i] + cdef cppclass StateC: int* _stack @@ -23,6 +40,7 @@ cdef cppclass StateC: TokenC* _sent Entity* _ents TokenC _empty_token + RingBufferC _hist int length int offset int _s_i @@ -37,6 +55,8 @@ cdef cppclass StateC: this.shifted = calloc(length + (PADDING * 2), sizeof(bint)) this._sent = calloc(length + (PADDING * 2), sizeof(TokenC)) this._ents = calloc(length + (PADDING * 2), sizeof(Entity)) + memset(&this._hist, 0, sizeof(this._hist)) + this.offset = 0 cdef int i for i in range(length + (PADDING * 2)): this._ents[i].end = -1 @@ -73,7 +93,19 @@ cdef cppclass StateC: free(this.shifted - PADDING) void set_context_tokens(int* ids, int n) nogil: - if n == 13: + if n == 2: + ids[0] = this.B(0) + ids[1] = this.S(0) + if n == 8: + ids[0] = this.B(0) + ids[1] = this.B(1) + ids[2] = this.S(0) + ids[3] = this.S(1) + ids[4] = this.H(this.S(0)) + ids[5] = this.L(this.B(0), 1) + ids[6] = this.L(this.S(0), 2) + ids[7] = this.R(this.S(0), 1) + elif n == 13: ids[0] = this.B(0) ids[1] = this.B(1) ids[2] = this.S(0) @@ -91,9 +123,10 @@ cdef cppclass StateC: elif n == 6: if this.B(0) >= 0: ids[0] = this.B(0) + ids[1] = this.B(0)-1 else: ids[0] = -1 - ids[1] = this.B(0) + ids[1] = -1 ids[2] = this.B(1) ids[3] = this.E(0) if ids[3] >= 1: @@ -110,6 +143,8 @@ cdef cppclass StateC: for i in range(n): if ids[i] >= 0: ids[i] += this.offset + else: + ids[i] = -1 int S(int i) nogil const: if i >= this._s_i: @@ -152,9 +187,9 @@ cdef cppclass StateC: int E(int i) nogil const: if this._e_i <= 0 or this._e_i >= this.length: - return 0 + return -1 if i < 0 or i >= this._e_i: - return 0 + return -1 return this._ents[this._e_i - (i+1)].start int L(int i, int idx) nogil const: @@ -258,13 +293,22 @@ cdef cppclass StateC: sig[8] = this.B_(0)[0] sig[9] = this.E_(0)[0] sig[10] = this.E_(1)[0] - return hash64(sig, sizeof(sig), this._s_i) + return hash64(sig, sizeof(sig), this._s_i) \ + + hash64(&this._hist, sizeof(RingBufferC), 1) + + void push_hist(int act) nogil: + ring_push(&this._hist, act+1) + + int get_hist(int i) nogil: + return ring_get(&this._hist, i) void push() nogil: if this.B(0) != -1: this._stack[this._s_i] = this.B(0) this._s_i += 1 this._b_i += 1 + if this.B_(0).sent_start == 1: + this.set_break(this.B(0)) if this._b_i > this._break: this._break = -1 @@ -341,7 +385,7 @@ cdef cppclass StateC: void set_break(int i) nogil: if 0 <= i < this.length: - this._sent[i].sent_start = True + this._sent[i].sent_start = 1 this._break = this._b_i void clone(const StateC* src) nogil: diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 7df5fe081..9770383d1 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -10,6 +10,8 @@ from libc.stdint cimport uint32_t from libc.string cimport memcpy from cymem.cymem cimport Pool from collections import OrderedDict +from thinc.extra.search cimport Beam +import numpy from .stateclass cimport StateClass from ._state cimport StateC, is_space_token @@ -18,7 +20,7 @@ from .transition_system cimport do_func_t, get_cost_func_t from .transition_system cimport move_cost_func_t, label_cost_func_t from ..gold cimport GoldParse from ..gold cimport GoldParseC -from ..attrs cimport TAG, HEAD, DEP, ENT_IOB, ENT_TYPE, IS_SPACE +from ..attrs cimport TAG, HEAD, DEP, ENT_IOB, ENT_TYPE, IS_SPACE, IS_PUNCT from ..lexeme cimport Lexeme from ..structs cimport TokenC @@ -116,7 +118,7 @@ cdef bint _is_gold_root(const GoldParseC* gold, int word) nogil: cdef class Shift: @staticmethod cdef bint is_valid(const StateC* st, attr_t label) nogil: - return st.buffer_length() >= 2 and not st.shifted[st.B(0)] and not st.B_(0).sent_start + return st.buffer_length() >= 2 and not st.shifted[st.B(0)] and st.B_(0).sent_start != 1 @staticmethod cdef int transition(StateC* st, attr_t label) nogil: @@ -176,7 +178,7 @@ cdef class Reduce: cdef class LeftArc: @staticmethod cdef bint is_valid(const StateC* st, attr_t label) nogil: - return not st.B_(0).sent_start + return st.B_(0).sent_start != 1 @staticmethod cdef int transition(StateC* st, attr_t label) nogil: @@ -210,7 +212,7 @@ cdef class LeftArc: cdef class RightArc: @staticmethod cdef bint is_valid(const StateC* st, attr_t label) nogil: - return not st.B_(0).sent_start + return st.B_(0).sent_start != 1 @staticmethod cdef int transition(StateC* st, attr_t label) nogil: @@ -246,6 +248,10 @@ cdef class Break: return False elif st.stack_depth() < 1: return False + elif st.B_(0).l_edge < 0: + return False + elif st._sent[st.B_(0).l_edge].sent_start < 0: + return False else: return True @@ -284,7 +290,7 @@ cdef class Break: return 0 cdef int _get_root(int word, const GoldParseC* gold) nogil: - while gold.heads[word] != word and not gold.has_dep[word] and word >= 0: + while gold.heads[word] != word and gold.has_dep[word] and word >= 0: word = gold.heads[word] if not gold.has_dep[word]: return -1 @@ -349,6 +355,20 @@ cdef class ArcEager(TransitionSystem): def __get__(self): return (SHIFT, REDUCE, LEFT, RIGHT, BREAK) + def is_gold_parse(self, StateClass state, GoldParse gold): + predicted = set() + truth = set() + for i in range(gold.length): + if gold.cand_to_gold[i] is None: + continue + if state.safe_get(i).dep: + predicted.add((i, state.H(i), self.strings[state.safe_get(i).dep])) + else: + predicted.add((i, state.H(i), 'ROOT')) + id_, word, tag, head, dep, ner = gold.orig_annot[gold.cand_to_gold[i]] + truth.add((id_, head, dep)) + return truth == predicted + def has_gold(self, GoldParse gold, start=0, end=None): end = end or len(gold.heads) if all([tag is None for tag in gold.heads[start:end]]): @@ -360,7 +380,7 @@ cdef class ArcEager(TransitionSystem): if not self.has_gold(gold): return None for i in range(gold.length): - if gold.heads[i] is None: # Missing values + if gold.heads[i] is None or gold.labels[i] is None: # Missing values gold.c.heads[i] = i gold.c.has_dep[i] = False else: @@ -383,6 +403,7 @@ cdef class ArcEager(TransitionSystem): for i in range(self.n_moves): if self.c[i].move == move and self.c[i].label == label: return self.c[i] + return Transition(clas=0, move=MISSING, label=0) def move_name(self, int move, attr_t label): label_str = self.strings[label] @@ -499,9 +520,11 @@ cdef class ArcEager(TransitionSystem): "before training and after parsing. Either pass make_projective=True " "to the GoldParse class, or use PseudoProjectivity.preprocess_training_data") else: + print(gold.orig_annot) print(gold.words) print(gold.heads) print(gold.labels) + print(gold.sent_starts) raise ValueError( "Could not find a gold-standard action to supervise the dependency " "parser.\n" @@ -510,3 +533,23 @@ cdef class ArcEager(TransitionSystem): "State at failure:\n" "%s" % (self.n_moves, stcls.print_state(gold.words))) assert n_gold >= 1 + + def get_beam_annot(self, Beam beam): + length = (beam.at(0)).c.length + heads = [{} for _ in range(length)] + deps = [{} for _ in range(length)] + probs = beam.probs + for i in range(beam.size): + stcls = beam.at(i) + self.finalize_state(stcls.c) + if stcls.is_final(): + prob = probs[i] + for j in range(stcls.c.length): + head = j + stcls.c._sent[j].head + dep = stcls.c._sent[j].dep + heads[j].setdefault(head, 0.0) + heads[j][head] += prob + deps[j].setdefault(dep, 0.0) + deps[j][dep] += prob + return heads, deps + diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx index e96e28fcf..68e9f27af 100644 --- a/spacy/syntax/beam_parser.pyx +++ b/spacy/syntax/beam_parser.pyx @@ -107,7 +107,7 @@ cdef class BeamParser(Parser): # The non-monotonic oracle makes it difficult to ensure final costs are # correct. Therefore do final correction for i in range(pred.size): - if is_gold(pred.at(i), gold_parse, self.moves.strings): + if self.moves.is_gold_parse(pred.at(i), gold_parse): pred._states[i].loss = 0.0 elif pred._states[i].loss == 0.0: pred._states[i].loss = 1.0 @@ -213,7 +213,7 @@ def _check_train_integrity(Beam pred, Beam gold, GoldParse gold_parse, Transitio if not pred._states[i].is_done or pred._states[i].loss == 0: continue state = pred.at(i) - if is_gold(state, gold_parse, moves.strings) == True: + if moves.is_gold_parse(state, gold_parse) == True: for dep in gold_parse.orig_annot: print(dep[1], dep[3], dep[4]) print("Cost", pred._states[i].loss) @@ -227,7 +227,7 @@ def _check_train_integrity(Beam pred, Beam gold, GoldParse gold_parse, Transitio if not gold._states[i].is_done: continue state = gold.at(i) - if is_gold(state, gold_parse, moves.strings) == False: + if moves.is_gold(state, gold_parse) == False: print("Truth") for dep in gold_parse.orig_annot: print(dep[1], dep[3], dep[4]) @@ -237,16 +237,3 @@ def _check_train_integrity(Beam pred, Beam gold, GoldParse gold_parse, Transitio raise Exception("Gold parse is not gold-standard") -def is_gold(StateClass state, GoldParse gold, StringStore strings): - predicted = set() - truth = set() - for i in range(gold.length): - if gold.cand_to_gold[i] is None: - continue - if state.safe_get(i).dep: - predicted.add((i, state.H(i), strings[state.safe_get(i).dep])) - else: - predicted.add((i, state.H(i), 'ROOT')) - id_, word, tag, head, dep, ner = gold.orig_annot[gold.cand_to_gold[i]] - truth.add((id_, head, dep)) - return truth == predicted diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 93d98a8cd..5c4e42176 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -2,7 +2,10 @@ from __future__ import unicode_literals from thinc.typedefs cimport weight_t +from thinc.extra.search cimport Beam from collections import OrderedDict +import numpy +from thinc.neural.ops import NumpyOps from .stateclass cimport StateClass from ._state cimport StateC @@ -110,7 +113,7 @@ cdef class BiluoPushDown(TransitionSystem): def has_gold(self, GoldParse gold, start=0, end=None): end = end or len(gold.ner) - if all([tag == '-' for tag in gold.ner[start:end]]): + if all([tag in ('-', None) for tag in gold.ner[start:end]]): return False else: return True @@ -122,11 +125,45 @@ cdef class BiluoPushDown(TransitionSystem): gold.c.ner[i] = self.lookup_transition(gold.ner[i]) return gold + def get_beam_annot(self, Beam beam): + entities = {} + probs = beam.probs + for i in range(beam.size): + stcls = beam.at(i) + if stcls.is_final(): + self.finalize_state(stcls.c) + prob = probs[i] + for j in range(stcls.c._e_i): + start = stcls.c._ents[j].start + end = stcls.c._ents[j].end + label = stcls.c._ents[j].label + entities.setdefault((start, end, label), 0.0) + entities[(start, end, label)] += prob + return entities + + def get_beam_parses(self, Beam beam): + parses = [] + probs = beam.probs + for i in range(beam.size): + stcls = beam.at(i) + if stcls.is_final(): + self.finalize_state(stcls.c) + prob = probs[i] + parse = [] + for j in range(stcls.c._e_i): + start = stcls.c._ents[j].start + end = stcls.c._ents[j].end + label = stcls.c._ents[j].label + parse.append((start, end, self.strings[label])) + parses.append((prob, parse)) + return parses + cdef Transition lookup_transition(self, object name) except *: cdef attr_t label if name == '-' or name == None: - move_str = 'M' - label = 0 + return Transition(clas=0, move=MISSING, label=0, score=0) + elif name == '!O': + return Transition(clas=0, move=ISNT, label=0, score=0) elif '-' in name: move_str, label_str = name.split('-', 1) # Hacky way to denote 'not this entity' @@ -182,6 +219,29 @@ cdef class BiluoPushDown(TransitionSystem): raise Exception(move) return t + def add_action(self, int action, label_name): + cdef attr_t label_id + if not isinstance(label_name, (int, long)): + label_id = self.strings.add(label_name) + else: + label_id = label_name + if action == OUT and label_id != 0: + return + if action == MISSING or action == ISNT: + return + # Check we're not creating a move we already have, so that this is + # idempotent + for trans in self.c[:self.n_moves]: + if trans.move == action and trans.label == label_id: + return 0 + if self.n_moves >= self._size: + self._size *= 2 + self.c = self.mem.realloc(self.c, self._size * sizeof(self.c[0])) + self.c[self.n_moves] = self.init_transition(self.n_moves, action, label_id) + assert self.c[self.n_moves].label == label_id + self.n_moves += 1 + return 1 + cdef int initialize_state(self, StateC* st) nogil: # This is especially necessary when we use limited training data. for i in range(st.length): @@ -308,6 +368,9 @@ cdef class In: elif g_act == UNIT: # I, Gold U --> True iff next tag == O return next_act != OUT + # Support partial supervision in the form of "not this label" + elif g_act == ISNT: + return 0 else: return 1 @@ -350,6 +413,9 @@ cdef class Last: elif g_act == UNIT: # L, Gold U --> True return 0 + # Support partial supervision in the form of "not this label" + elif g_act == ISNT: + return 0 else: return 1 @@ -418,7 +484,9 @@ cdef class Out: cdef int g_act = gold.ner[s.B(0)].move cdef attr_t g_tag = gold.ner[s.B(0)].label - if g_act == MISSING or g_act == ISNT: + if g_act == ISNT and g_tag == 0: + return 1 + elif g_act == MISSING or g_act == ISNT: return 0 elif g_act == BEGIN: # O, Gold B --> False diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd index 524718965..b0b7693b7 100644 --- a/spacy/syntax/nn_parser.pxd +++ b/spacy/syntax/nn_parser.pxd @@ -13,6 +13,7 @@ cdef class Parser: cdef public object model cdef readonly TransitionSystem moves cdef readonly object cfg + cdef public object _multitasks cdef void _parse_step(self, StateC* state, const float* feat_weights, diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 91a651200..1f4918935 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -7,6 +7,7 @@ from __future__ import unicode_literals, print_function from collections import Counter, OrderedDict import ujson +import json import contextlib from libc.math cimport exp @@ -29,22 +30,28 @@ from thinc.linear.avgtron cimport AveragedPerceptron from thinc.linalg cimport VecVec from thinc.structs cimport SparseArrayC, FeatureC, ExampleC from thinc.extra.eg cimport Example +from thinc.extra.search cimport Beam from cymem.cymem cimport Pool, Address from murmurhash.mrmr cimport hash64 from preshed.maps cimport MapStruct from preshed.maps cimport map_get -from thinc.api import layerize, chain, noop, clone -from thinc.neural import Model, Affine, ELU, ReLu, Maxout +from thinc.api import layerize, chain, noop, clone, with_flatten +from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU +from thinc.misc import LayerNorm + from thinc.neural.ops import NumpyOps, CupyOps from thinc.neural.util import get_array_module from .. import util from ..util import get_async, get_cuda_stream from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts -from .._ml import Tok2Vec, doc2feats, rebatch -from ..compat import json_dumps +from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune +from .._ml import Residual, drop_layer, flatten +from .._ml import link_vectors_to_models +from .._ml import HistoryFeatures +from ..compat import json_dumps, copy_array from . import _parse_features from ._parse_features cimport CONTEXT_SIZE @@ -58,13 +65,13 @@ from ..structs cimport TokenC from ..tokens.doc cimport Doc from ..strings cimport StringStore from ..gold cimport GoldParse -from ..attrs cimport TAG, DEP +from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG +from . import _beam_utils def get_templates(*args, **kwargs): return [] -USE_FTRL = True DEBUG = False def set_debug(val): global DEBUG @@ -110,7 +117,6 @@ cdef class precompute_hiddens: self.nO = cached.shape[2] self.nP = getattr(lower_model, 'nP', 1) self.ops = lower_model.ops - self._features = numpy.zeros((batch_size, self.nO*self.nP), dtype='f') self._is_synchronized = False self._cuda_stream = cuda_stream self._cached = cached @@ -127,13 +133,12 @@ cdef class precompute_hiddens: return self.begin_update(X)[0] def begin_update(self, token_ids, drop=0.): - self._features.fill(0) + cdef np.ndarray state_vector = numpy.zeros((token_ids.shape[0], self.nO*self.nP), dtype='f') # This is tricky, but (assuming GPU available); # - Input to forward on CPU # - Output from forward on CPU # - Input to backward on GPU! # - Output from backward on GPU - cdef np.ndarray state_vector = self._features[:len(token_ids)] bp_hiddens = self._bp_hiddens feat_weights = self.get_feat_weights() @@ -233,11 +238,20 @@ cdef class Parser: Base class of the DependencyParser and EntityRecognizer. """ @classmethod - def Model(cls, nr_class, token_vector_width=128, hidden_width=128, depth=1, **cfg): - depth = util.env_opt('parser_hidden_depth', depth) - token_vector_width = util.env_opt('token_vector_width', token_vector_width) - hidden_width = util.env_opt('hidden_width', hidden_width) - parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) + def Model(cls, nr_class, **cfg): + depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1)) + token_vector_width = util.env_opt('token_vector_width', cfg.get('token_vector_width', 128)) + hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 200)) + parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2)) + embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000)) + hist_size = util.env_opt('history_feats', cfg.get('hist_size', 0)) + hist_width = util.env_opt('history_width', cfg.get('hist_width', 0)) + if hist_size >= 1 and depth == 0: + raise ValueError("Inconsistent hyper-params: " + "history_feats >= 1 but parser_hidden_depth==0") + tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=cfg.get('pretrained_dims', 0)) + tok2vec = chain(tok2vec, flatten) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -252,24 +266,42 @@ cdef class Parser: if depth == 0: upper = chain() upper.is_noop = True - else: + elif hist_size and depth == 1: upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) + HistoryFeatures(nr_class=nr_class, hist_size=hist_size, + nr_dim=hist_width), + zero_init(Affine(nr_class, hidden_width+hist_size*hist_width, + drop_factor=0.0))) + upper.is_noop = False + elif hist_size: + upper = chain( + HistoryFeatures(nr_class=nr_class, hist_size=hist_size, + nr_dim=hist_width), + LayerNorm(Maxout(hidden_width, hidden_width+hist_size*hist_width)), + clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-2), + zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) ) upper.is_noop = False + else: + upper = chain( + clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-1), + zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) + ) + upper.is_noop = False + # TODO: This is an unfortunate hack atm! # Used to set input dimensions in network. lower.begin_training(lower.ops.allocate((500, token_vector_width))) - upper.begin_training(upper.ops.allocate((500, hidden_width))) cfg = { 'nr_class': nr_class, - 'depth': depth, + 'hidden_depth': depth, 'token_vector_width': token_vector_width, 'hidden_width': hidden_width, - 'maxout_pieces': parser_maxout_pieces + 'maxout_pieces': parser_maxout_pieces, + 'hist_size': hist_size, + 'hist_width': hist_width } - return (lower, upper), cfg + return (tok2vec, lower, upper), cfg def __init__(self, Vocab vocab, moves=True, model=True, **cfg): """ @@ -295,17 +327,25 @@ cdef class Parser: self.moves = self.TransitionSystem(self.vocab.strings, {}) else: self.moves = moves + if 'beam_width' not in cfg: + cfg['beam_width'] = util.env_opt('beam_width', 1) + if 'beam_density' not in cfg: + cfg['beam_density'] = util.env_opt('beam_density', 0.0) + if 'pretrained_dims' not in cfg: + cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + cfg.setdefault('cnn_maxout_pieces', 3) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): for label in labels: self.moves.add_action(action, label) self.model = model + self._multitasks = [] def __reduce__(self): return (Parser, (self.vocab, self.moves, self.model), None, None) - def __call__(self, Doc doc): + def __call__(self, Doc doc, beam_width=None, beam_density=None): """ Apply the parser or entity recognizer, setting the annotations onto the Doc object. @@ -314,11 +354,26 @@ cdef class Parser: Returns: None """ - states = self.parse_batch([doc], [doc.tensor]) - self.set_annotations([doc], states) - return doc + if beam_width is None: + beam_width = self.cfg.get('beam_width', 1) + if beam_density is None: + beam_density = self.cfg.get('beam_density', 0.0) + cdef Beam beam + if beam_width == 1: + states = self.parse_batch([doc]) + self.set_annotations([doc], states) + return doc + else: + beam = self.beam_parse([doc], + beam_width=beam_width, beam_density=beam_density)[0] + output = self.moves.get_beam_annot(beam) + state = beam.at(0) + self.set_annotations([doc], [state]) + _cleanup(beam) + return output - def pipe(self, docs, int batch_size=1000, int n_threads=2): + def pipe(self, docs, int batch_size=256, int n_threads=2, + beam_width=None, beam_density=None): """ Process a stream of documents. @@ -330,17 +385,27 @@ cdef class Parser: The number of threads with which to work on the buffer in parallel. Yields (Doc): Documents, in order. """ - cdef StateClass parse_state + if beam_width is None: + beam_width = self.cfg.get('beam_width', 1) + if beam_density is None: + beam_density = self.cfg.get('beam_density', 0.0) cdef Doc doc - queue = [] + cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): docs = list(docs) - tokvecs = [d.tensor for d in docs] - parse_states = self.parse_batch(docs, tokvecs) + if beam_width == 1: + parse_states = self.parse_batch(docs) + beams = [] + else: + beams = self.beam_parse(docs, + beam_width=beam_width, beam_density=beam_density) + parse_states = [] + for beam in beams: + parse_states.append(beam.at(0)) self.set_annotations(docs, parse_states) yield from docs - def parse_batch(self, docs, tokvecses): + def parse_batch(self, docs): cdef: precompute_hiddens state2vec StateClass state @@ -352,16 +417,14 @@ cdef class Parser: if isinstance(docs, Doc): docs = [docs] - tokvecs = self.model[0].ops.flatten(tokvecses) + cuda_stream = get_cuda_stream() + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + 0.0) nr_state = len(docs) nr_class = self.moves.n_moves nr_dim = tokvecs.shape[1] nr_feat = self.nr_feature - - cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(nr_state, tokvecs, - cuda_stream, 0.0) nr_piece = state2vec.nP states = self.moves.init_batch(docs) @@ -377,26 +440,35 @@ cdef class Parser: c_token_ids = token_ids.data c_is_valid = is_valid.data cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) + cdef int nr_step while not next_step.empty(): + nr_step = next_step.size() if not has_hidden: - for i in cython.parallel.prange( - next_step.size(), num_threads=6, nogil=True): + for i in cython.parallel.prange(nr_step, num_threads=6, + nogil=True): self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) else: - for i in range(next_step.size()): + hists = [] + for i in range(nr_step): st = next_step[i] st.set_context_tokens(&c_token_ids[i*nr_feat], nr_feat) self.moves.set_valid(&c_is_valid[i*nr_class], st) + hists.append([st.get_hist(j+1) for j in range(8)]) + hists = numpy.asarray(hists) vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) + if self.cfg.get('hist_size'): + scores = vec2scores((vectors, hists)) + else: + scores = vec2scores(vectors) c_scores = scores.data - for i in range(next_step.size()): + for i in range(nr_step): st = next_step[i] guess = arg_max_if_valid( &c_scores[i*nr_class], &c_is_valid[i*nr_class], nr_class) action = self.moves.c[guess] action.do(st, action.label) + st.push_hist(guess) this_step, next_step = next_step, this_step next_step.clear() for st in this_step: @@ -404,12 +476,61 @@ cdef class Parser: next_step.push_back(st) return states + def beam_parse(self, docs, int beam_width=3, float beam_density=0.001): + cdef Beam beam + cdef np.ndarray scores + cdef Doc doc + cdef int nr_class = self.moves.n_moves + cdef StateClass stcls, output + cuda_stream = get_cuda_stream() + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + 0.0) + beams = [] + cdef int offset = 0 + cdef int j = 0 + cdef int k + for doc in docs: + beam = Beam(nr_class, beam_width, min_density=beam_density) + beam.initialize(self.moves.init_beam_state, doc.length, doc.c) + for i in range(beam.width): + stcls = beam.at(i) + stcls.c.offset = offset + offset += len(doc) + beam.check_done(_check_final_state, NULL) + while not beam.is_done: + states = [] + for i in range(beam.size): + stcls = beam.at(i) + # This way we avoid having to score finalized states + # We do have to take care to keep indexes aligned, though + if not stcls.is_final(): + states.append(stcls) + token_ids = self.get_token_ids(states) + vectors = state2vec(token_ids) + if self.cfg.get('hist_size', 0): + hists = numpy.asarray([st.history[:self.cfg['hist_size']] + for st in states], dtype='i') + scores = vec2scores((vectors, hists)) + else: + scores = vec2scores(vectors) + j = 0 + c_scores = scores.data + for i in range(beam.size): + stcls = beam.at(i) + if not stcls.is_final(): + self.moves.set_valid(beam.is_valid[i], stcls.c) + for k in range(nr_class): + beam.scores[i][k] = c_scores[j * scores.shape[1] + k] + j += 1 + beam.advance(_transition_state, _hash_state, self.moves.c) + beam.check_done(_check_final_state, NULL) + beams.append(beam) + return beams + cdef void _parse_step(self, StateC* state, const float* feat_weights, int nr_class, int nr_feat, int nr_piece) nogil: '''This only works with no hidden layers -- fast but inaccurate''' - #for i in cython.parallel.prange(next_step.size(), num_threads=4, nogil=True): - # self._parse_step(next_step[i], feat_weights, nr_class, nr_feat) token_ids = calloc(nr_feat, sizeof(int)) scores = calloc(nr_class * nr_piece, sizeof(float)) is_valid = calloc(nr_class, sizeof(int)) @@ -421,16 +542,21 @@ cdef class Parser: guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece) action = self.moves.c[guess] action.do(state, action.label) + state.push_hist(guess) free(is_valid) free(scores) free(token_ids) - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + def update(self, docs, golds, drop=0., sgd=None, losses=None): + if not any(self.moves.has_gold(gold) for gold in golds): + return None + if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: + return self.update_beam(docs, golds, + self.cfg['beam_width'], self.cfg['beam_density'], + drop=drop, sgd=sgd, losses=losses) if losses is not None and self.name not in losses: losses[self.name] = 0. - docs, tokvec_lists = docs_tokvecs - tokvecs = self.model[0].ops.flatten(tokvec_lists) if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] @@ -438,8 +564,8 @@ cdef class Parser: cuda_stream = get_cuda_stream() states, golds, max_steps = self._init_gold_batch(docs, golds) - state2vec, vec2scores = self.get_batch_model(len(states), tokvecs, cuda_stream, - 0.0) + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + drop) todo = [(s, g) for (s, g) in zip(states, golds) if not s.is_final() and g is not None] if not todo: @@ -457,16 +583,21 @@ cdef class Parser: if drop != 0: mask = vec2scores.ops.get_dropout_mask(vector.shape, drop) vector *= mask - scores, bp_scores = vec2scores.begin_update(vector, drop=drop) + hists = numpy.asarray([st.history for st in states], dtype='i') + if self.cfg.get('hist_size', 0): + scores, bp_scores = vec2scores.begin_update((vector, hists), drop=drop) + else: + scores, bp_scores = vec2scores.begin_update(vector, drop=drop) d_scores = self.get_batch_loss(states, golds, scores) - d_vector = bp_scores(d_scores / d_scores.shape[0], sgd=sgd) + d_scores /= len(docs) + d_vector = bp_scores(d_scores, sgd=sgd) if drop != 0: d_vector *= mask if isinstance(self.model[0].ops, CupyOps) \ and not isinstance(token_ids, state2vec.ops.xp.ndarray): - # Move token_ids and d_vector to CPU, asynchronously + # Move token_ids and d_vector to GPU, asynchronously backprops.append(( get_async(cuda_stream, token_ids), get_async(cuda_stream, d_vector), @@ -475,15 +606,60 @@ cdef class Parser: else: backprops.append((token_ids, d_vector, bp_vector)) self.transition_batch(states, scores) - todo = [st for st in todo if not st[0].is_final()] + todo = [(st, gold) for (st, gold) in todo + if not st.is_final()] if losses is not None: losses[self.name] += (d_scores**2).sum() n_steps += 1 if n_steps >= max_steps: break self._make_updates(d_tokvecs, - backprops, sgd, cuda_stream) - return self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) + bp_tokvecs, backprops, sgd, cuda_stream) + + def update_beam(self, docs, golds, width=None, density=None, + drop=0., sgd=None, losses=None): + if not any(self.moves.has_gold(gold) for gold in golds): + return None + if not golds: + return None + if width is None: + width = self.cfg.get('beam_width', 2) + if density is None: + density = self.cfg.get('beam_density', 0.0) + if losses is not None and self.name not in losses: + losses[self.name] = 0. + lengths = [len(d) for d in docs] + assert min(lengths) >= 1 + states = self.moves.init_batch(docs) + for gold in golds: + self.moves.preprocess_gold(gold) + + cuda_stream = get_cuda_stream() + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, drop) + + states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, + states, golds, + state2vec, vec2scores, + width, density, self.cfg.get('hist_size', 0), + drop=drop, losses=losses) + backprop_lower = [] + cdef float batch_size = len(docs) + for i, d_scores in enumerate(states_d_scores): + d_scores /= batch_size + if losses is not None: + losses[self.name] += (d_scores**2).sum() + ids, bp_vectors, bp_scores = backprops[i] + d_vector = bp_scores(d_scores, sgd=sgd) + if isinstance(self.model[0].ops, CupyOps) \ + and not isinstance(ids, state2vec.ops.xp.ndarray): + backprop_lower.append(( + get_async(cuda_stream, ids), + get_async(cuda_stream, d_vector), + bp_vectors)) + else: + backprop_lower.append((ids, d_vector, bp_vectors)) + d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) + self._make_updates(d_tokvecs, bp_tokvecs, backprop_lower, sgd, cuda_stream) def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long @@ -510,6 +686,7 @@ cdef class Parser: while state.B(0) < start and not state.is_final(): action = self.moves.c[oracle_actions.pop(0)] action.do(state.c, action.label) + state.c.push_hist(action.clas) n_moves += 1 has_gold = self.moves.has_gold(gold, start=start, end=start+max_length) @@ -521,21 +698,18 @@ cdef class Parser: max_moves = max(max_moves, len(oracle_actions)) return states, golds, max_moves - def _make_updates(self, d_tokvecs, backprops, sgd, cuda_stream=None): + def _make_updates(self, d_tokvecs, bp_tokvecs, backprops, sgd, cuda_stream=None): # Tells CUDA to block, so our async copies complete. if cuda_stream is not None: cuda_stream.synchronize() xp = get_array_module(d_tokvecs) for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) - active_feats = ids * (ids >= 0) - active_feats = active_feats.reshape((ids.shape[0], ids.shape[1], 1)) - if hasattr(xp, 'scatter_add'): - xp.scatter_add(d_tokvecs, - ids, d_state_features * active_feats) - else: - xp.add.at(d_tokvecs, - ids, d_state_features * active_feats) + mask = ids >= 0 + d_state_features *= mask.reshape(ids.shape + (1,)) + self.model[0].ops.scatter_add(d_tokvecs, ids * mask, + d_state_features) + bp_tokvecs(d_tokvecs, sgd=sgd) @property def move_names(self): @@ -545,13 +719,14 @@ cdef class Parser: names.append(name) return names - def get_batch_model(self, batch_size, tokvecs, stream, dropout): - lower, upper = self.model - state2vec = precompute_hiddens(batch_size, tokvecs, - lower, stream, drop=dropout) - return state2vec, upper + def get_batch_model(self, docs, stream, dropout): + tok2vec, lower, upper = self.model + tokvecs, bp_tokvecs = tok2vec.begin_update(docs, drop=dropout) + state2vec = precompute_hiddens(len(docs), tokvecs, + lower, stream, drop=0.0) + return (tokvecs, bp_tokvecs), state2vec, upper - nr_feature = 13 + nr_feature = 8 def get_token_ids(self, states): cdef StateClass state @@ -560,7 +735,8 @@ cdef class Parser: dtype='i', order='C') c_ids = ids.data for i, state in enumerate(states): - state.c.set_context_tokens(c_ids, n_tokens) + if not state.is_final(): + state.c.set_context_tokens(c_ids, n_tokens) c_ids += ids.shape[1] return ids @@ -574,6 +750,7 @@ cdef class Parser: action = self.moves.c[guess] action.do(state.c, action.label) c_scores += scores.shape[1] + state.c.push_hist(guess) def get_batch_loss(self, states, golds, float[:, ::1] scores): cdef StateClass state @@ -602,27 +779,67 @@ cdef class Parser: for i in range(doc.length): doc.c[i] = state.c._sent[i] self.moves.finalize_doc(doc) + for hook in self.postprocesses: + for doc in docs: + hook(doc) + + @property + def postprocesses(self): + # Available for subclasses, e.g. to deprojectivize + return [] def add_label(self, label): + resized = False for action in self.moves.action_types: added = self.moves.add_action(action, label) if added: # Important that the labels be stored as a list! We need the # order, or the model goes out of synch self.cfg.setdefault('extra_labels', []).append(label) + resized = True + if self.model not in (True, False, None) and resized: + # Weights are stored in (nr_out, nr_in) format, so we're basically + # just adding rows here. + if self.model[-1].is_noop: + smaller = self.model[1] + dims = dict(self.model[1]._dims) + dims['nO'] = self.moves.n_moves + larger = self.model[1].__class__(**dims) + copy_array(larger.W[:, :smaller.nO], smaller.W) + copy_array(larger.b[:smaller.nO], smaller.b) + self.model = (self.model[0], larger, self.model[2]) + else: + smaller = self.model[-1]._layers[-1] + larger = Affine(self.moves.n_moves, smaller.nI) + copy_array(larger.W[:smaller.nO], smaller.W) + copy_array(larger.b[:smaller.nO], smaller.b) + self.model[-1]._layers[-1] = larger - def begin_training(self, gold_tuples, **cfg): + def begin_training(self, gold_tuples, pipeline=None, **cfg): if 'model' in cfg: self.model = cfg['model'] - gold_tuples = nonproj.preprocess_training_data(gold_tuples) + gold_tuples = nonproj.preprocess_training_data(gold_tuples, label_freq_cutoff=100) actions = self.moves.get_actions(gold_parses=gold_tuples) for action, labels in actions.items(): for label in labels: self.moves.add_action(action, label) if self.model is True: + cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(self.moves.n_moves, **cfg) + self.init_multitask_objectives(gold_tuples, pipeline, **cfg) + link_vectors_to_models(self.vocab) self.cfg.update(cfg) + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + '''Setup models for secondary objectives, to benefit from multi-task + learning. This method is intended to be overridden by subclasses. + + For instance, the dependency parser can benefit from sharing + an input representation with a label prediction model. These auxiliary + models are discarded after training. + ''' + pass + def preprocess_gold(self, docs_golds): for doc, gold in docs_golds: yield doc, gold @@ -635,10 +852,12 @@ cdef class Parser: def to_disk(self, path, **exclude): serializers = { - 'lower_model': lambda p: p.open('wb').write( + 'tok2vec_model': lambda p: p.open('wb').write( self.model[0].to_bytes()), - 'upper_model': lambda p: p.open('wb').write( + 'lower_model': lambda p: p.open('wb').write( self.model[1].to_bytes()), + 'upper_model': lambda p: p.open('wb').write( + self.model[2].to_bytes()), 'vocab': lambda p: self.vocab.to_disk(p), 'moves': lambda p: self.moves.to_disk(p, strings=False), 'cfg': lambda p: p.open('w').write(json_dumps(self.cfg)) @@ -656,27 +875,33 @@ cdef class Parser: if 'model' not in exclude: path = util.ensure_path(path) if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(**self.cfg) else: cfg = {} - with (path / 'lower_model').open('rb') as file_: + with (path / 'tok2vec_model').open('rb') as file_: bytes_data = file_.read() self.model[0].from_bytes(bytes_data) - with (path / 'upper_model').open('rb') as file_: + with (path / 'lower_model').open('rb') as file_: bytes_data = file_.read() self.model[1].from_bytes(bytes_data) + with (path / 'upper_model').open('rb') as file_: + bytes_data = file_.read() + self.model[2].from_bytes(bytes_data) self.cfg.update(cfg) return self def to_bytes(self, **exclude): serializers = OrderedDict(( - ('lower_model', lambda: self.model[0].to_bytes()), - ('upper_model', lambda: self.model[1].to_bytes()), + ('tok2vec_model', lambda: self.model[0].to_bytes()), + ('lower_model', lambda: self.model[1].to_bytes()), + ('upper_model', lambda: self.model[2].to_bytes()), ('vocab', lambda: self.vocab.to_bytes()), ('moves', lambda: self.moves.to_bytes(strings=False)), - ('cfg', lambda: ujson.dumps(self.cfg)) + ('cfg', lambda: json.dumps(self.cfg, indent=2, sort_keys=True)) )) if 'model' in exclude: + exclude['tok2vec_model'] = True exclude['lower_model'] = True exclude['upper_model'] = True exclude.pop('model') @@ -686,20 +911,25 @@ cdef class Parser: deserializers = OrderedDict(( ('vocab', lambda b: self.vocab.from_bytes(b)), ('moves', lambda b: self.moves.from_bytes(b, strings=False)), - ('cfg', lambda b: self.cfg.update(ujson.loads(b))), + ('cfg', lambda b: self.cfg.update(json.loads(b))), + ('tok2vec_model', lambda b: None), ('lower_model', lambda b: None), ('upper_model', lambda b: None) )) msg = util.from_bytes(bytes_data, deserializers, exclude) if 'model' not in exclude: if self.model is True: - self.model, cfg = self.Model(self.moves.n_moves) + self.model, cfg = self.Model(**self.cfg) + cfg['pretrained_dims'] = self.vocab.vectors_length else: cfg = {} + cfg['pretrained_dims'] = self.vocab.vectors_length + if 'tok2vec_model' in msg: + self.model[0].from_bytes(msg['tok2vec_model']) if 'lower_model' in msg: - self.model[0].from_bytes(msg['lower_model']) + self.model[1].from_bytes(msg['lower_model']) if 'upper_model' in msg: - self.model[1].from_bytes(msg['upper_model']) + self.model[2].from_bytes(msg['upper_model']) self.cfg.update(cfg) return self @@ -762,3 +992,31 @@ cdef int _arg_max_clas(const weight_t* scores, int move, const Transition* actio mode = i score = scores[i] return mode + + +# These are passed as callbacks to thinc.search.Beam +cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves) except -1: + dest = _dest + src = _src + moves = _moves + dest.clone(src) + moves[clas].do(dest.c, moves[clas].label) + dest.c.push_hist(clas) + + +cdef int _check_final_state(void* _state, void* extra_args) except -1: + return (_state).is_final() + + +def _cleanup(Beam beam): + for i in range(beam.width): + Py_XDECREF(beam._states[i].content) + Py_XDECREF(beam._parents[i].content) + + +cdef hash_t _hash_state(void* _state, void* _) except 0: + state = _state + if state.c.is_final(): + return 1 + else: + return state.c.hash() diff --git a/spacy/syntax/stateclass.pyx b/spacy/syntax/stateclass.pyx index 228a3ff91..ddd1f558c 100644 --- a/spacy/syntax/stateclass.pyx +++ b/spacy/syntax/stateclass.pyx @@ -4,6 +4,7 @@ from __future__ import unicode_literals from libc.string cimport memcpy, memset from libc.stdint cimport uint32_t, uint64_t +import numpy from ..vocab cimport EMPTY_LEXEME from ..structs cimport Entity @@ -38,6 +39,13 @@ cdef class StateClass: def token_vector_lenth(self): return self.doc.tensor.shape[1] + @property + def history(self): + hist = numpy.ndarray((8,), dtype='i') + for i in range(8): + hist[i] = self.c.get_hist(i+1) + return hist + def is_final(self): return self.c.is_final() @@ -54,27 +62,3 @@ cdef class StateClass: n0 = words[self.B(0)] n1 = words[self.B(1)] return ' '.join((third, second, top, '|', n0, n1)) - - @classmethod - def nr_context_tokens(cls): - return 13 - - def set_context_tokens(self, int[::1] output): - output[0] = self.B(0) - output[1] = self.B(1) - output[2] = self.S(0) - output[3] = self.S(1) - output[4] = self.S(2) - output[5] = self.L(self.S(0), 1) - output[6] = self.L(self.S(0), 2) - output[6] = self.R(self.S(0), 1) - output[7] = self.L(self.B(0), 1) - output[8] = self.R(self.S(0), 2) - output[9] = self.L(self.S(1), 1) - output[10] = self.L(self.S(1), 2) - output[11] = self.R(self.S(1), 1) - output[12] = self.R(self.S(1), 2) - - for i in range(13): - if output[i] != -1: - output[i] += self.c.offset diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index e33a29ac2..055129c8b 100644 --- a/spacy/syntax/transition_system.pyx +++ b/spacy/syntax/transition_system.pyx @@ -99,6 +99,9 @@ cdef class TransitionSystem: def preprocess_gold(self, GoldParse gold): raise NotImplementedError + def is_gold_parse(self, StateClass state, GoldParse gold): + raise NotImplementedError + cdef Transition lookup_transition(self, object name) except *: raise NotImplementedError @@ -107,6 +110,8 @@ cdef class TransitionSystem: def is_valid(self, StateClass stcls, move_name): action = self.lookup_transition(move_name) + if action.move == 0: + return False return action.is_valid(stcls.c, action.label) cdef int set_valid(self, int* is_valid, const StateC* st) nogil: @@ -137,9 +142,13 @@ cdef class TransitionSystem: "the entity recognizer\n" "The transition system has %d actions." % (self.n_moves)) + def get_class_name(self, int clas): + act = self.c[clas] + return self.move_name(act.move, act.label) + def add_action(self, int action, label_name): cdef attr_t label_id - if not isinstance(label_name, int): + if not isinstance(label_name, (int, long)): label_id = self.strings.add(label_name) else: label_id = label_name diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index 200f9ff4f..29f37c9fa 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -11,9 +11,13 @@ from ..strings import StringStore from .. import util -_languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'it', 'nb', - 'nl', 'pl', 'pt', 'sv', 'xx'] -_models = {'en': ['en_depent_web_sm', 'en_core_web_md'], +# These languages are used for generic tokenizer tests – only add a language +# here if it's using spaCy's tokenizer (not a different library) +# TODO: re-implement generic tokenizer tests +_languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id', + 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx'] + +_models = {'en': ['en_core_web_sm'], 'de': ['de_core_news_md'], 'fr': ['fr_depvec_web_lg'], 'xx': ['xx_ent_web_md']} @@ -42,6 +46,7 @@ def FR(request): #lang = util.get_lang_class(request.param) #return lang.Defaults.create_tokenizer() + @pytest.fixture def tokenizer(): return util.get_lang_class('xx').Defaults.create_tokenizer() @@ -58,8 +63,9 @@ def en_vocab(): @pytest.fixture -def en_parser(): - return util.get_lang_class('en').Defaults.create_parser() +def en_parser(en_vocab): + nlp = util.get_lang_class('en')(en_vocab) + return nlp.create_pipe('parser') @pytest.fixture @@ -87,6 +93,11 @@ def fi_tokenizer(): return util.get_lang_class('fi').Defaults.create_tokenizer() +@pytest.fixture +def id_tokenizer(): + return util.get_lang_class('id').Defaults.create_tokenizer() + + @pytest.fixture def sv_tokenizer(): return util.get_lang_class('sv').Defaults.create_tokenizer() @@ -101,11 +112,24 @@ def bn_tokenizer(): def he_tokenizer(): return util.get_lang_class('he').Defaults.create_tokenizer() + @pytest.fixture def nb_tokenizer(): return util.get_lang_class('nb').Defaults.create_tokenizer() +@pytest.fixture +def ja_tokenizer(): + janome = pytest.importorskip("janome") + return util.get_lang_class('ja').Defaults.create_tokenizer() + + +@pytest.fixture +def th_tokenizer(): + pythainlp = pytest.importorskip("pythainlp") + return util.get_lang_class('th').Defaults.create_tokenizer() + + @pytest.fixture def stringstore(): return StringStore() @@ -120,6 +144,7 @@ def en_entityrecognizer(): def text_file(): return StringIO() + @pytest.fixture def text_file_b(): return BytesIO() diff --git a/spacy/tests/doc/test_creation.py b/spacy/tests/doc/test_creation.py new file mode 100644 index 000000000..c14fdfbe9 --- /dev/null +++ b/spacy/tests/doc/test_creation.py @@ -0,0 +1,37 @@ +'''Test Doc sets up tokens correctly.''' +from __future__ import unicode_literals +import pytest + +from ...vocab import Vocab +from ...tokens.doc import Doc +from ...lemmatizer import Lemmatizer + + +@pytest.fixture +def lemmatizer(): + return Lemmatizer(lookup={'dogs': 'dog', 'boxen': 'box', 'mice': 'mouse'}) + + +@pytest.fixture +def vocab(lemmatizer): + return Vocab(lemmatizer=lemmatizer) + + +def test_empty_doc(vocab): + doc = Doc(vocab) + assert len(doc) == 0 + + +def test_single_word(vocab): + doc = Doc(vocab, words=['a']) + assert doc.text == 'a ' + doc = Doc(vocab, words=['a'], spaces=[False]) + assert doc.text == 'a' + + +def test_lookup_lemmatization(vocab): + doc = Doc(vocab, words=['dogs', 'dogses']) + assert doc[0].text == 'dogs' + assert doc[0].lemma_ == 'dog' + assert doc[1].text == 'dogses' + assert doc[1].lemma_ == 'dogses' diff --git a/spacy/tests/lang/de/test_lemma.py b/spacy/tests/lang/de/test_lemma.py new file mode 100644 index 000000000..39b3b0313 --- /dev/null +++ b/spacy/tests/lang/de/test_lemma.py @@ -0,0 +1,13 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import pytest + + +@pytest.mark.parametrize('string,lemma', [('Abgehängten', 'Abgehängte'), + ('engagierte', 'engagieren'), + ('schließt', 'schließen'), + ('vorgebenden', 'vorgebend')]) +def test_lemmatizer_lookup_assigns(de_tokenizer, string, lemma): + tokens = de_tokenizer(string) + assert tokens[0].lemma_ == lemma diff --git a/spacy/tests/lang/de/test_prefix_suffix_infix.py b/spacy/tests/lang/de/test_prefix_suffix_infix.py index dcf4f4ef0..bdc68037e 100644 --- a/spacy/tests/lang/de/test_prefix_suffix_infix.py +++ b/spacy/tests/lang/de/test_prefix_suffix_infix.py @@ -67,12 +67,6 @@ def test_tokenizer_splits_uneven_wrap_interact(de_tokenizer, text): assert len(tokens) == 4 -@pytest.mark.parametrize('text', ["blau-rot"]) -def test_tokenizer_splits_hyphens(de_tokenizer, text): - tokens = de_tokenizer(text) - assert len(tokens) == 3 - - @pytest.mark.parametrize('text', ["0.1-13.5", "0.0-0.1", "103.27-300"]) def test_tokenizer_splits_numeric_range(de_tokenizer, text): tokens = de_tokenizer(text) @@ -100,17 +94,21 @@ def test_tokenizer_splits_ellipsis_infix(de_tokenizer, text): assert len(tokens) == 3 +@pytest.mark.parametrize('text', ['Islam-Konferenz', 'Ost-West-Konflikt']) +def test_tokenizer_keeps_hyphens(de_tokenizer, text): + tokens = de_tokenizer(text) + assert len(tokens) == 1 + + def test_tokenizer_splits_double_hyphen_infix(de_tokenizer): tokens = de_tokenizer("Viele Regeln--wie die Bindestrich-Regeln--sind kompliziert.") - assert len(tokens) == 12 + assert len(tokens) == 10 assert tokens[0].text == "Viele" assert tokens[1].text == "Regeln" assert tokens[2].text == "--" assert tokens[3].text == "wie" assert tokens[4].text == "die" - assert tokens[5].text == "Bindestrich" - assert tokens[6].text == "-" - assert tokens[7].text == "Regeln" - assert tokens[8].text == "--" - assert tokens[9].text == "sind" - assert tokens[10].text == "kompliziert" + assert tokens[5].text == "Bindestrich-Regeln" + assert tokens[6].text == "--" + assert tokens[7].text == "sind" + assert tokens[8].text == "kompliziert" diff --git a/spacy/tests/lang/de/test_text.py b/spacy/tests/lang/de/test_text.py index 84fa6f2a5..34180b982 100644 --- a/spacy/tests/lang/de/test_text.py +++ b/spacy/tests/lang/de/test_text.py @@ -25,15 +25,15 @@ Umfang kläglich dünnen Beine flimmerten ihm hilflos vor den Augen. assert len(tokens) == 109 -@pytest.mark.parametrize('text,length', [ - ("Donaudampfschifffahrtsgesellschaftskapitänsanwärterposten", 1), - ("Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz", 1), - ("Kraftfahrzeug-Haftpflichtversicherung", 3), - ("Vakuum-Mittelfrequenz-Induktionsofen", 5) +@pytest.mark.parametrize('text', [ + "Donaudampfschifffahrtsgesellschaftskapitänsanwärterposten", + "Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz", + "Kraftfahrzeug-Haftpflichtversicherung", + "Vakuum-Mittelfrequenz-Induktionsofen" ]) -def test_tokenizer_handles_long_words(de_tokenizer, text, length): +def test_tokenizer_handles_long_words(de_tokenizer, text): tokens = de_tokenizer(text) - assert len(tokens) == length + assert len(tokens) == 1 @pytest.mark.parametrize('text,length', [ diff --git a/spacy/tests/lang/en/test_customized_tokenizer.py b/spacy/tests/lang/en/test_customized_tokenizer.py new file mode 100644 index 000000000..1d35fb128 --- /dev/null +++ b/spacy/tests/lang/en/test_customized_tokenizer.py @@ -0,0 +1,42 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import pytest + +from ....lang.en import English +from ....tokenizer import Tokenizer +from .... import util + + +@pytest.fixture +def custom_en_tokenizer(en_vocab): + prefix_re = util.compile_prefix_regex(English.Defaults.prefixes) + suffix_re = util.compile_suffix_regex(English.Defaults.suffixes) + custom_infixes = ['\.\.\.+', + '(?<=[0-9])-(?=[0-9])', + # '(?<=[0-9]+),(?=[0-9]+)', + '[0-9]+(,[0-9]+)+', + '[\[\]!&:,()\*—–\/-]'] + + infix_re = util.compile_infix_regex(custom_infixes) + return Tokenizer(en_vocab, + English.Defaults.tokenizer_exceptions, + prefix_re.search, + suffix_re.search, + infix_re.finditer, + token_match=None) + + +def test_customized_tokenizer_handles_infixes(custom_en_tokenizer): + sentence = "The 8 and 10-county definitions are not used for the greater Southern California Megaregion." + context = [word.text for word in custom_en_tokenizer(sentence)] + assert context == ['The', '8', 'and', '10', '-', 'county', 'definitions', + 'are', 'not', 'used', 'for', 'the', 'greater', + 'Southern', 'California', 'Megaregion', '.'] + + # the trailing '-' may cause Assertion Error + sentence = "The 8- and 10-county definitions are not used for the greater Southern California Megaregion." + context = [word.text for word in custom_en_tokenizer(sentence)] + assert context == ['The', '8', '-', 'and', '10', '-', 'county', + 'definitions', 'are', 'not', 'used', 'for', 'the', + 'greater', 'Southern', 'California', 'Megaregion', '.'] diff --git a/spacy/tests/lang/en/test_lemmatizer.py b/spacy/tests/lang/en/test_lemmatizer.py index d02ae1700..22c8f2499 100644 --- a/spacy/tests/lang/en/test_lemmatizer.py +++ b/spacy/tests/lang/en/test_lemmatizer.py @@ -2,12 +2,18 @@ from __future__ import unicode_literals import pytest +from ....tokens.doc import Doc @pytest.fixture def en_lemmatizer(EN): return EN.Defaults.create_lemmatizer() +@pytest.mark.models('en') +def test_doc_lemmatization(EN): + doc = Doc(EN.vocab, words=['bleed']) + doc[0].tag_ = 'VBP' + assert doc[0].lemma_ == 'bleed' @pytest.mark.models('en') @pytest.mark.parametrize('text,lemmas', [("aardwolves", ["aardwolf"]), @@ -19,6 +25,16 @@ def test_en_lemmatizer_noun_lemmas(en_lemmatizer, text, lemmas): assert en_lemmatizer.noun(text) == set(lemmas) +@pytest.mark.models('en') +@pytest.mark.parametrize('text,lemmas', [("bleed", ["bleed"]), + ("feed", ["feed"]), + ("need", ["need"]), + ("ring", ["ring"]), + ("axes", ["axis", "axe", "ax"])]) +def test_en_lemmatizer_noun_lemmas(en_lemmatizer, text, lemmas): + assert en_lemmatizer.noun(text) == set(lemmas) + + @pytest.mark.xfail @pytest.mark.models('en') def test_en_lemmatizer_base_forms(en_lemmatizer): @@ -41,7 +57,5 @@ def test_en_lemmatizer_punct(en_lemmatizer): def test_en_lemmatizer_lemma_assignment(EN): text = "Bananas in pyjamas are geese." doc = EN.make_doc(text) - EN.tensorizer(doc) - assert all(t.lemma_ == '' for t in doc) EN.tagger(doc) assert all(t.lemma_ != '' for t in doc) diff --git a/spacy/tests/lang/en/test_models.py b/spacy/tests/lang/en/test_models.py index 4b1cf1f91..ab318213c 100644 --- a/spacy/tests/lang/en/test_models.py +++ b/spacy/tests/lang/en/test_models.py @@ -52,12 +52,13 @@ def test_en_models_vectors(example): # this isn't a perfect test since this could in principle fail # in a sane model as well, # but that's very unlikely and a good indicator if something is wrong - vector0 = example[0].vector - vector1 = example[1].vector - vector2 = example[2].vector - assert not numpy.array_equal(vector0,vector1) - assert not numpy.array_equal(vector0,vector2) - assert not numpy.array_equal(vector1,vector2) + if example.vocab.vectors_length: + vector0 = example[0].vector + vector1 = example[1].vector + vector2 = example[2].vector + assert not numpy.array_equal(vector0,vector1) + assert not numpy.array_equal(vector0,vector2) + assert not numpy.array_equal(vector1,vector2) @pytest.mark.xfail diff --git a/spacy/tests/lang/en/test_parser.py b/spacy/tests/lang/en/test_parser.py index 39d0fce61..9468fe09d 100644 --- a/spacy/tests/lang/en/test_parser.py +++ b/spacy/tests/lang/en/test_parser.py @@ -45,3 +45,33 @@ def test_parser_noun_chunks_pp_chunks(en_tokenizer): assert len(chunks) == 2 assert chunks[0].text_with_ws == "A phrase " assert chunks[1].text_with_ws == "another phrase " + + +def test_parser_noun_chunks_appositional_modifiers(en_tokenizer): + text = "Sam, my brother, arrived to the house." + heads = [5, -1, 1, -3, -4, 0, -1, 1, -2, -4] + tags = ['NNP', ',', 'PRP$', 'NN', ',', 'VBD', 'IN', 'DT', 'NN', '.'] + deps = ['nsubj', 'punct', 'poss', 'appos', 'punct', 'ROOT', 'prep', 'det', 'pobj', 'punct'] + + tokens = en_tokenizer(text) + doc = get_doc(tokens.vocab, [t.text for t in tokens], tags=tags, deps=deps, heads=heads) + chunks = list(doc.noun_chunks) + assert len(chunks) == 3 + assert chunks[0].text_with_ws == "Sam " + assert chunks[1].text_with_ws == "my brother " + assert chunks[2].text_with_ws == "the house " + + +def test_parser_noun_chunks_dative(en_tokenizer): + text = "She gave Bob a raise." + heads = [1, 0, -1, 1, -3, -4] + tags = ['PRP', 'VBD', 'NNP', 'DT', 'NN', '.'] + deps = ['nsubj', 'ROOT', 'dative', 'det', 'dobj', 'punct'] + + tokens = en_tokenizer(text) + doc = get_doc(tokens.vocab, [t.text for t in tokens], tags=tags, deps=deps, heads=heads) + chunks = list(doc.noun_chunks) + assert len(chunks) == 3 + assert chunks[0].text_with_ws == "She " + assert chunks[1].text_with_ws == "Bob " + assert chunks[2].text_with_ws == "a raise " diff --git a/spacy/tests/lang/en/test_tagger.py b/spacy/tests/lang/en/test_tagger.py index 47a093b99..37d43d0c7 100644 --- a/spacy/tests/lang/en/test_tagger.py +++ b/spacy/tests/lang/en/test_tagger.py @@ -25,7 +25,6 @@ def test_tag_names(EN): doc = EN(text, disable=['parser']) assert type(doc[2].pos) == int assert isinstance(doc[2].pos_, six.text_type) - assert type(doc[2].dep) == int assert isinstance(doc[2].dep_, six.text_type) assert doc[2].tag_ == u'NNS' diff --git a/spacy/tests/lang/id/__init__.py b/spacy/tests/lang/id/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_prefix_suffix_infix.py b/spacy/tests/lang/id/test_prefix_suffix_infix.py new file mode 100644 index 000000000..539fd1a13 --- /dev/null +++ b/spacy/tests/lang/id/test_prefix_suffix_infix.py @@ -0,0 +1,115 @@ +# coding: utf-8 +"""Test that tokenizer prefixes, suffixes and infixes are handled correctly.""" + + +from __future__ import unicode_literals + +import pytest + + +@pytest.mark.parametrize('text', ["(Ma'arif)"]) +def test_tokenizer_splits_no_special(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + + +@pytest.mark.parametrize('text', ["Ma'arif"]) +def test_tokenizer_splits_no_punct(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 1 + + +@pytest.mark.parametrize('text', ["(Ma'arif"]) +def test_tokenizer_splits_prefix_punct(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 2 + + +@pytest.mark.parametrize('text', ["Ma'arif)"]) +def test_tokenizer_splits_suffix_punct(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 2 + + +@pytest.mark.parametrize('text', ["(Ma'arif)"]) +def test_tokenizer_splits_even_wrap(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + + +@pytest.mark.parametrize('text', ["(Ma'arif?)"]) +def test_tokenizer_splits_uneven_wrap(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 4 + + +@pytest.mark.parametrize('text,length', [("S.Kom.", 1), ("SKom.", 2), ("(S.Kom.", 2)]) +def test_tokenizer_splits_prefix_interact(id_tokenizer, text, length): + tokens = id_tokenizer(text) + assert len(tokens) == length + + +@pytest.mark.parametrize('text', ["S.Kom.)"]) +def test_tokenizer_splits_suffix_interact(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 2 + + +@pytest.mark.parametrize('text', ["(S.Kom.)"]) +def test_tokenizer_splits_even_wrap_interact(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + + +@pytest.mark.parametrize('text', ["(S.Kom.?)"]) +def test_tokenizer_splits_uneven_wrap_interact(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 4 + + +@pytest.mark.parametrize('text,length', [("gara-gara", 1), ("Jokowi-Ahok", 3), ("Sukarno-Hatta", 3)]) +def test_tokenizer_splits_hyphens(id_tokenizer, text, length): + tokens = id_tokenizer(text) + assert len(tokens) == length + + +@pytest.mark.parametrize('text', ["0.1-13.5", "0.0-0.1", "103.27-300"]) +def test_tokenizer_splits_numeric_range(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + + +@pytest.mark.parametrize('text', ["ini.Budi", "Halo.Bandung"]) +def test_tokenizer_splits_period_infix(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + + +@pytest.mark.parametrize('text', ["Halo,Bandung", "satu,dua"]) +def test_tokenizer_splits_comma_infix(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + assert tokens[0].text == text.split(",")[0] + assert tokens[1].text == "," + assert tokens[2].text == text.split(",")[1] + + +@pytest.mark.parametrize('text', ["halo...Bandung", "dia...pergi"]) +def test_tokenizer_splits_ellipsis_infix(id_tokenizer, text): + tokens = id_tokenizer(text) + assert len(tokens) == 3 + + +def test_tokenizer_splits_double_hyphen_infix(id_tokenizer): + tokens = id_tokenizer("Arsene Wenger--manajer Arsenal--melakukan konferensi pers.") + assert len(tokens) == 10 + assert tokens[0].text == "Arsene" + assert tokens[1].text == "Wenger" + assert tokens[2].text == "--" + assert tokens[3].text == "manajer" + assert tokens[4].text == "Arsenal" + assert tokens[5].text == "--" + assert tokens[6].text == "melakukan" + assert tokens[7].text == "konferensi" + assert tokens[8].text == "pers" + assert tokens[9].text == "." diff --git a/spacy/tests/lang/ja/__init__.py b/spacy/tests/lang/ja/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/ja/test_tokenizer.py b/spacy/tests/lang/ja/test_tokenizer.py new file mode 100644 index 000000000..1e30973a3 --- /dev/null +++ b/spacy/tests/lang/ja/test_tokenizer.py @@ -0,0 +1,19 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import pytest + + +TOKENIZER_TESTS = [ + ("日本語だよ", ['日本語', 'だ', 'よ']), + ("東京タワーの近くに住んでいます。", ['東京', 'タワー', 'の', '近く', 'に', '住ん', 'で', 'い', 'ます', '。']), + ("吾輩は猫である。", ['吾輩', 'は', '猫', 'で', 'ある', '。']), + ("月に代わって、お仕置きよ!", ['月', 'に', '代わっ', 'て', '、', 'お仕置き', 'よ', '!']), + ("すもももももももものうち", ['すもも', 'も', 'もも', 'も', 'もも', 'の', 'うち']) +] + + +@pytest.mark.parametrize('text,expected_tokens', TOKENIZER_TESTS) +def test_japanese_tokenizer(ja_tokenizer, text, expected_tokens): + tokens = [token.text for token in ja_tokenizer(text)] + assert tokens == expected_tokens diff --git a/spacy/tests/lang/th/__init__.py b/spacy/tests/lang/th/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/th/test_tokenizer.py b/spacy/tests/lang/th/test_tokenizer.py new file mode 100644 index 000000000..f5925da1e --- /dev/null +++ b/spacy/tests/lang/th/test_tokenizer.py @@ -0,0 +1,13 @@ +# coding: utf8 +from __future__ import unicode_literals + +import pytest + +TOKENIZER_TESTS = [ + ("คุณรักผมไหม", ['คุณ', 'รัก', 'ผม', 'ไหม']) +] + +@pytest.mark.parametrize('text,expected_tokens', TOKENIZER_TESTS) +def test_thai_tokenizer(th_tokenizer, text, expected_tokens): + tokens = [token.text for token in th_tokenizer(text)] + assert tokens == expected_tokens diff --git a/spacy/tests/parser/test_add_label.py b/spacy/tests/parser/test_add_label.py new file mode 100644 index 000000000..3fbfc96a6 --- /dev/null +++ b/spacy/tests/parser/test_add_label.py @@ -0,0 +1,70 @@ +'''Test the ability to add a label to a (potentially trained) parsing model.''' +from __future__ import unicode_literals +import pytest +import numpy.random +from thinc.neural.optimizers import Adam +from thinc.neural.ops import NumpyOps + +from ...attrs import NORM +from ...gold import GoldParse +from ...vocab import Vocab +from ...tokens import Doc +from ...pipeline import NeuralDependencyParser + +numpy.random.seed(0) + + +@pytest.fixture +def vocab(): + return Vocab(lex_attr_getters={NORM: lambda s: s}) + + +@pytest.fixture +def parser(vocab): + parser = NeuralDependencyParser(vocab) + parser.cfg['token_vector_width'] = 8 + parser.cfg['hidden_width'] = 30 + parser.cfg['hist_size'] = 0 + parser.add_label('left') + parser.begin_training([], **parser.cfg) + sgd = Adam(NumpyOps(), 0.001) + + for i in range(10): + losses = {} + doc = Doc(vocab, words=['a', 'b', 'c', 'd']) + gold = GoldParse(doc, heads=[1, 1, 3, 3], + deps=['left', 'ROOT', 'left', 'ROOT']) + parser.update([doc], [gold], sgd=sgd, losses=losses) + return parser + +def test_init_parser(parser): + pass + +def test_add_label(parser): + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc = parser(doc) + assert doc[0].head.i == 1 + assert doc[0].dep_ == 'left' + assert doc[1].head.i == 1 + assert doc[2].head.i == 3 + assert doc[2].head.i == 3 + parser.add_label('right') + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc = parser(doc) + assert doc[0].head.i == 1 + assert doc[0].dep_ == 'left' + assert doc[1].head.i == 1 + assert doc[2].head.i == 3 + assert doc[2].head.i == 3 + sgd = Adam(NumpyOps(), 0.001) + for i in range(10): + losses = {} + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + gold = GoldParse(doc, heads=[1, 1, 3, 3], + deps=['right', 'ROOT', 'left', 'ROOT']) + parser.update([doc], [gold], sgd=sgd, losses=losses) + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc = parser(doc) + assert doc[0].dep_ == 'right' + assert doc[2].dep_ == 'left' + diff --git a/spacy/tests/parser/test_beam_parse.py b/spacy/tests/parser/test_beam_parse.py new file mode 100644 index 000000000..dd77c6805 --- /dev/null +++ b/spacy/tests/parser/test_beam_parse.py @@ -0,0 +1,11 @@ +# coding: utf8 +from __future__ import unicode_literals + +import pytest + + +@pytest.mark.models('en') +def test_beam_parse(EN): + doc = EN(u'Australia is a country', disable=['ner']) + ents = EN.entity(doc, beam_width=2) + print(ents) diff --git a/spacy/tests/parser/test_ner.py b/spacy/tests/parser/test_ner.py new file mode 100644 index 000000000..e74c9ccb0 --- /dev/null +++ b/spacy/tests/parser/test_ner.py @@ -0,0 +1,73 @@ +from __future__ import unicode_literals + +import pytest + +from ...vocab import Vocab +from ...syntax.ner import BiluoPushDown +from ...gold import GoldParse +from ...tokens import Doc + + +@pytest.fixture +def vocab(): + return Vocab() + + +@pytest.fixture +def doc(vocab): + return Doc(vocab, words=['Casey', 'went', 'to', 'New', 'York', '.']) + + +@pytest.fixture +def entity_annots(doc): + casey = doc[0:1] + ny = doc[3:5] + return [(casey.start_char, casey.end_char, 'PERSON'), + (ny.start_char, ny.end_char, 'GPE')] + + +@pytest.fixture +def entity_types(entity_annots): + return sorted(set([label for (s, e, label) in entity_annots])) + + +@pytest.fixture +def tsys(vocab, entity_types): + actions = BiluoPushDown.get_actions(entity_types=entity_types) + return BiluoPushDown(vocab.strings, actions) + + +def test_get_oracle_moves(tsys, doc, entity_annots): + gold = GoldParse(doc, entities=entity_annots) + tsys.preprocess_gold(gold) + act_classes = tsys.get_oracle_sequence(doc, gold) + names = [tsys.get_class_name(act) for act in act_classes] + assert names == ['U-PERSON', 'O', 'O', 'B-GPE', 'L-GPE', 'O'] + +def test_get_oracle_moves_negative_entities(tsys, doc, entity_annots): + entity_annots = [(s, e, '!' + label) for s, e, label in entity_annots] + gold = GoldParse(doc, entities=entity_annots) + for i, tag in enumerate(gold.ner): + if tag == 'L-!GPE': + gold.ner[i] = '-' + tsys.preprocess_gold(gold) + act_classes = tsys.get_oracle_sequence(doc, gold) + names = [tsys.get_class_name(act) for act in act_classes] + + +def test_get_oracle_moves_negative_entities2(tsys, vocab): + doc = Doc(vocab, words=['A', 'B', 'C', 'D']) + gold = GoldParse(doc, entities=[]) + gold.ner = ['B-!PERSON', 'L-!PERSON', 'B-!PERSON', 'L-!PERSON'] + tsys.preprocess_gold(gold) + act_classes = tsys.get_oracle_sequence(doc, gold) + names = [tsys.get_class_name(act) for act in act_classes] + + +def test_get_oracle_moves_negative_O(tsys, vocab): + doc = Doc(vocab, words=['A', 'B', 'C', 'D']) + gold = GoldParse(doc, entities=[]) + gold.ner = ['O', '!O', 'O', '!O'] + tsys.preprocess_gold(gold) + act_classes = tsys.get_oracle_sequence(doc, gold) + names = [tsys.get_class_name(act) for act in act_classes] diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 1fa9a838b..ae20cd5f0 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -1,7 +1,6 @@ # coding: utf8 from __future__ import unicode_literals from thinc.neural import Model -from mock import Mock import pytest import numpy @@ -27,7 +26,7 @@ def arc_eager(vocab): @pytest.fixture def tok2vec(): - return Tok2Vec(8, 100, preprocess=doc2feats()) + return Tok2Vec(8, 100) @pytest.fixture @@ -36,7 +35,8 @@ def parser(vocab, arc_eager): @pytest.fixture def model(arc_eager, tok2vec): - return Parser.Model(arc_eager.n_moves, token_vector_width=tok2vec.nO) + return Parser.Model(arc_eager.n_moves, token_vector_width=tok2vec.nO, + hist_size=0)[0] @pytest.fixture def doc(vocab): @@ -45,29 +45,39 @@ def doc(vocab): @pytest.fixture def gold(doc): return GoldParse(doc, heads=[1, 1, 1], deps=['L', 'ROOT', 'R']) + + def test_can_init_nn_parser(parser): assert parser.model is None def test_build_model(parser): - parser.model = Parser.Model(parser.moves.n_moves) + parser.model = Parser.Model(parser.moves.n_moves, hist_size=0)[0] assert parser.model is not None -@pytest.mark.xfail def test_predict_doc(parser, tok2vec, model, doc): - doc.tensor = tok2vec([doc]) + doc.tensor = tok2vec([doc])[0] parser.model = model parser(doc) -@pytest.mark.xfail -def test_update_doc(parser, tok2vec, model, doc, gold): +def test_update_doc(parser, model, doc, gold): parser.model = model - tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) - d_tokvecs = parser.update((doc, tokvecs), gold) - assert d_tokvecs.shape == tokvecs.shape def optimize(weights, gradient, key=None): weights -= 0.001 * gradient - bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs.sum() == 0. + parser.update([doc], [gold], sgd=optimize) + + +def test_predict_doc_beam(parser, model, doc): + parser.model = model + parser(doc, beam_width=32, beam_density=0.001) + + +def test_update_doc_beam(parser, model, doc, gold): + parser.model = model + def optimize(weights, gradient, key=None): + weights -= 0.001 * gradient + parser.update_beam([doc], [gold], sgd=optimize) + + diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py new file mode 100644 index 000000000..ab8bf012b --- /dev/null +++ b/spacy/tests/parser/test_nn_beam.py @@ -0,0 +1,87 @@ +from __future__ import unicode_literals +import pytest +import numpy +from thinc.api import layerize + +from ...vocab import Vocab +from ...syntax.arc_eager import ArcEager +from ...tokens import Doc +from ...gold import GoldParse +from ...syntax._beam_utils import ParserBeam, update_beam +from ...syntax.stateclass import StateClass + + +@pytest.fixture +def vocab(): + return Vocab() + +@pytest.fixture +def moves(vocab): + aeager = ArcEager(vocab.strings, {}) + aeager.add_action(2, 'nsubj') + aeager.add_action(3, 'dobj') + aeager.add_action(2, 'aux') + return aeager + + +@pytest.fixture +def docs(vocab): + return [Doc(vocab, words=['Rats', 'bite', 'things'])] + +@pytest.fixture +def states(docs): + return [StateClass(doc) for doc in docs] + +@pytest.fixture +def tokvecs(docs, vector_size): + output = [] + for doc in docs: + vec = numpy.random.uniform(-0.1, 0.1, (len(doc), vector_size)) + output.append(numpy.asarray(vec)) + return output + + +@pytest.fixture +def golds(docs): + return [GoldParse(doc) for doc in docs] + + +@pytest.fixture +def batch_size(docs): + return len(docs) + + +@pytest.fixture +def beam_width(): + return 4 + + +@pytest.fixture +def vector_size(): + return 6 + + +@pytest.fixture +def beam(moves, states, golds, beam_width): + return ParserBeam(moves, states, golds, width=beam_width, density=0.0) + +@pytest.fixture +def scores(moves, batch_size, beam_width): + return [ + numpy.asarray( + numpy.random.uniform(-0.1, 0.1, (batch_size, moves.n_moves)), + dtype='f') + for _ in range(batch_size)] + + +def test_create_beam(beam): + pass + + +def test_beam_advance(beam, scores): + beam.advance(scores) + + +def test_beam_advance_too_few_scores(beam, scores): + with pytest.raises(IndexError): + beam.advance(scores[:-1]) diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py new file mode 100644 index 000000000..4c973bd97 --- /dev/null +++ b/spacy/tests/parser/test_preset_sbd.py @@ -0,0 +1,73 @@ +'''Test that the parser respects preset sentence boundaries.''' +from __future__ import unicode_literals +import pytest +from thinc.neural.optimizers import Adam +from thinc.neural.ops import NumpyOps + +from ...attrs import NORM +from ...gold import GoldParse +from ...vocab import Vocab +from ...tokens import Doc +from ...pipeline import NeuralDependencyParser + +@pytest.fixture +def vocab(): + return Vocab(lex_attr_getters={NORM: lambda s: s}) + +@pytest.fixture +def parser(vocab): + parser = NeuralDependencyParser(vocab) + parser.cfg['token_vector_width'] = 4 + parser.cfg['hidden_width'] = 32 + #parser.add_label('right') + parser.add_label('left') + parser.begin_training([], **parser.cfg) + sgd = Adam(NumpyOps(), 0.001) + + for i in range(10): + losses = {} + doc = Doc(vocab, words=['a', 'b', 'c', 'd']) + gold = GoldParse(doc, heads=[1, 1, 3, 3], + deps=['left', 'ROOT', 'left', 'ROOT']) + parser.update([doc], [gold], sgd=sgd, losses=losses) + return parser + +def test_no_sentences(parser): + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc = parser(doc) + assert len(list(doc.sents)) >= 1 + + +def test_sents_1(parser): + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc[2].sent_start = True + doc = parser(doc) + assert len(list(doc.sents)) >= 2 + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc[1].sent_start = False + doc[2].sent_start = True + doc[3].sent_start = False + doc = parser(doc) + assert len(list(doc.sents)) == 2 + + +def test_sents_1_2(parser): + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc[1].sent_start = True + doc[2].sent_start = True + doc = parser(doc) + assert len(list(doc.sents)) == 3 + + +def test_sents_1_3(parser): + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc[1].sent_start = True + doc[3].sent_start = True + doc = parser(doc) + assert len(list(doc.sents)) >= 3 + doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd']) + doc[1].sent_start = True + doc[2].sent_start = False + doc[3].sent_start = True + doc = parser(doc) + assert len(list(doc.sents)) == 3 diff --git a/spacy/tests/pipeline/__init__.py b/spacy/tests/pipeline/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/pipeline/test_pipe_methods.py b/spacy/tests/pipeline/test_pipe_methods.py new file mode 100644 index 000000000..5ec78aefb --- /dev/null +++ b/spacy/tests/pipeline/test_pipe_methods.py @@ -0,0 +1,84 @@ +# coding: utf8 +from __future__ import unicode_literals + +import pytest + +from ...language import Language + + +@pytest.fixture +def nlp(): + return Language() + + +def new_pipe(doc): + return doc + + +def test_add_pipe_no_name(nlp): + nlp.add_pipe(new_pipe) + assert 'new_pipe' in nlp.pipe_names + + +def test_add_pipe_duplicate_name(nlp): + nlp.add_pipe(new_pipe, name='duplicate_name') + with pytest.raises(ValueError): + nlp.add_pipe(new_pipe, name='duplicate_name') + + +@pytest.mark.parametrize('name', ['parser']) +def test_add_pipe_first(nlp, name): + nlp.add_pipe(new_pipe, name=name, first=True) + assert nlp.pipeline[0][0] == name + + +@pytest.mark.parametrize('name1,name2', [('parser', 'lambda_pipe')]) +def test_add_pipe_last(nlp, name1, name2): + nlp.add_pipe(lambda doc: doc, name=name2) + nlp.add_pipe(new_pipe, name=name1, last=True) + assert nlp.pipeline[0][0] != name1 + assert nlp.pipeline[-1][0] == name1 + + +def test_cant_add_pipe_first_and_last(nlp): + with pytest.raises(ValueError): + nlp.add_pipe(new_pipe, first=True, last=True) + + +@pytest.mark.parametrize('name', ['my_component']) +def test_get_pipe(nlp, name): + with pytest.raises(KeyError): + nlp.get_pipe(name) + nlp.add_pipe(new_pipe, name=name) + assert nlp.get_pipe(name) == new_pipe + + +@pytest.mark.parametrize('name,replacement', [('my_component', lambda doc: doc)]) +def test_replace_pipe(nlp, name, replacement): + with pytest.raises(ValueError): + nlp.replace_pipe(name, new_pipe) + nlp.add_pipe(new_pipe, name=name) + nlp.replace_pipe(name, replacement) + assert nlp.get_pipe(name) != new_pipe + assert nlp.get_pipe(name) == replacement + + +@pytest.mark.parametrize('old_name,new_name', [('old_pipe', 'new_pipe')]) +def test_rename_pipe(nlp, old_name, new_name): + with pytest.raises(ValueError): + nlp.rename_pipe(old_name, new_name) + nlp.add_pipe(new_pipe, name=old_name) + nlp.rename_pipe(old_name, new_name) + assert nlp.pipeline[0][0] == new_name + + +@pytest.mark.parametrize('name', ['my_component']) +def test_remove_pipe(nlp, name): + with pytest.raises(ValueError): + nlp.remove_pipe(name) + nlp.add_pipe(new_pipe, name=name) + assert len(nlp.pipeline) == 1 + removed_name, removed_component = nlp.remove_pipe(name) + assert not len(nlp.pipeline) + assert removed_name == name + assert removed_component == new_pipe diff --git a/spacy/tests/regression/test_issue1257.py b/spacy/tests/regression/test_issue1257.py new file mode 100644 index 000000000..de6b014a6 --- /dev/null +++ b/spacy/tests/regression/test_issue1257.py @@ -0,0 +1,12 @@ +'''Test tokens compare correctly''' +from __future__ import unicode_literals + +from ..util import get_doc +from ...vocab import Vocab + + +def test_issue1257(): + doc1 = get_doc(Vocab(), ['a', 'b', 'c']) + doc2 = get_doc(Vocab(), ['a', 'c', 'e']) + assert doc1[0] != doc2[0] + assert not doc1[0] == doc2[0] diff --git a/spacy/tests/regression/test_issue1305.py b/spacy/tests/regression/test_issue1305.py new file mode 100644 index 000000000..e123ce0ba --- /dev/null +++ b/spacy/tests/regression/test_issue1305.py @@ -0,0 +1,8 @@ +import pytest + +@pytest.mark.models('en') +def test_issue1305(EN): + '''Test lemmatization of English VBZ''' + assert EN.vocab.morphology.lemmatizer('works', 'verb') == set(['work']) + doc = EN(u'This app works well') + assert doc[2].lemma_ == 'work' diff --git a/spacy/tests/regression/test_issue1380.py b/spacy/tests/regression/test_issue1380.py new file mode 100644 index 000000000..b2d610954 --- /dev/null +++ b/spacy/tests/regression/test_issue1380.py @@ -0,0 +1,14 @@ +from __future__ import unicode_literals +import pytest + +from ...language import Language + +def test_issue1380_empty_string(): + nlp = Language() + doc = nlp('') + assert len(doc) == 0 + +@pytest.mark.models('en') +def test_issue1380_en(EN): + doc = EN('') + assert len(doc) == 0 diff --git a/spacy/tests/regression/test_issue1387.py b/spacy/tests/regression/test_issue1387.py new file mode 100644 index 000000000..4bd0092d0 --- /dev/null +++ b/spacy/tests/regression/test_issue1387.py @@ -0,0 +1,22 @@ +# coding: utf-8 +from __future__ import unicode_literals + +from ...symbols import POS, VERB, VerbForm_part +from ...vocab import Vocab +from ...lemmatizer import Lemmatizer +from ..util import get_doc + +import pytest + + +def test_issue1387(): + tag_map = {'VBG': {POS: VERB, VerbForm_part: True}} + index = {"verb": ("cope","cop")} + exc = {"verb": {"coping": ("cope",)}} + rules = {"verb": [["ing", ""]]} + lemmatizer = Lemmatizer(index, exc, rules) + vocab = Vocab(lemmatizer=lemmatizer, tag_map=tag_map) + doc = get_doc(vocab, ["coping"]) + doc[0].tag_ = 'VBG' + assert doc[0].text == "coping" + assert doc[0].lemma_ == "cope" diff --git a/spacy/tests/regression/test_issue429.py b/spacy/tests/regression/test_issue429.py index 1baa9a1db..4804225ac 100644 --- a/spacy/tests/regression/test_issue429.py +++ b/spacy/tests/regression/test_issue429.py @@ -9,17 +9,19 @@ import pytest @pytest.mark.models('en') def test_issue429(EN): def merge_phrases(matcher, doc, i, matches): - if i != len(matches) - 1: - return None - spans = [(ent_id, ent_id, doc[start:end]) for ent_id, start, end in matches] - for ent_id, label, span in spans: - span.merge('NNP' if label else span.root.tag_, span.text, EN.vocab.strings[label]) + if i != len(matches) - 1: + return None + spans = [(ent_id, ent_id, doc[start:end]) for ent_id, start, end in matches] + for ent_id, label, span in spans: + span.merge( + tag=('NNP' if label else span.root.tag_), + lemma=span.text, + label='PERSON') doc = EN('a') matcher = Matcher(EN.vocab) matcher.add('TEST', merge_phrases, [{'ORTH': 'a'}]) doc = EN.make_doc('a b c') - EN.tensorizer(doc) EN.tagger(doc) matcher(doc) EN.entity(doc) diff --git a/spacy/tests/regression/test_issue589.py b/spacy/tests/regression/test_issue589.py index 27363739d..96ea4be61 100644 --- a/spacy/tests/regression/test_issue589.py +++ b/spacy/tests/regression/test_issue589.py @@ -7,6 +7,7 @@ from ..util import get_doc import pytest +@pytest.mark.xfail def test_issue589(): vocab = Vocab() vocab.strings.set_frozen(True) diff --git a/spacy/tests/serialize/test_serialize_empty_model.py b/spacy/tests/serialize/test_serialize_empty_model.py new file mode 100644 index 000000000..b614a3648 --- /dev/null +++ b/spacy/tests/serialize/test_serialize_empty_model.py @@ -0,0 +1,9 @@ +import spacy +import spacy.lang.en +from spacy.pipeline import TextCategorizer + +def test_bytes_serialize_issue_1105(): + nlp = spacy.lang.en.English() + tokenizer = nlp.tokenizer + textcat = TextCategorizer(tokenizer.vocab, labels=['ENTITY', 'ACTION', 'MODIFIER']) + textcat_bytes = textcat.to_bytes() diff --git a/spacy/tests/serialize/test_serialize_tagger.py b/spacy/tests/serialize/test_serialize_tagger.py index fa9a776bb..475be1cef 100644 --- a/spacy/tests/serialize/test_serialize_tagger.py +++ b/spacy/tests/serialize/test_serialize_tagger.py @@ -11,8 +11,8 @@ import pytest def taggers(en_vocab): tagger1 = Tagger(en_vocab) tagger2 = Tagger(en_vocab) - tagger1.model = tagger1.Model(None, None) - tagger2.model = tagger2.Model(None, None) + tagger1.model = tagger1.Model(8) + tagger2.model = tagger1.model return (tagger1, tagger2) @@ -20,7 +20,6 @@ def test_serialize_tagger_roundtrip_bytes(en_vocab, taggers): tagger1, tagger2 = taggers tagger1_b = tagger1.to_bytes() tagger2_b = tagger2.to_bytes() - assert tagger1_b == tagger2_b tagger1 = tagger1.from_bytes(tagger1_b) assert tagger1.to_bytes() == tagger1_b new_tagger1 = Tagger(en_vocab).from_bytes(tagger1_b) diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py index d22fa52ae..7ed9333b8 100644 --- a/spacy/tests/spans/test_span.py +++ b/spacy/tests/spans/test_span.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from ..util import get_doc +from ...attrs import ORTH, LENGTH import pytest @@ -89,3 +90,19 @@ def test_spans_are_hashable(en_tokenizer): span3 = tokens[0:2] assert hash(span3) == hash(span1) + +def test_spans_by_character(doc): + span1 = doc[1:-2] + span2 = doc.char_span(span1.start_char, span1.end_char, label='GPE') + assert span1.start_char == span2.start_char + assert span1.end_char == span2.end_char + assert span2.label_ == 'GPE' + + +def test_span_to_array(doc): + span = doc[1:-2] + arr = span.to_array([ORTH, LENGTH]) + assert arr.shape == (len(span), 2) + assert arr[0, 0] == span[0].orth + assert arr[0, 1] == len(span[0]) + diff --git a/spacy/tests/stringstore/test_stringstore.py b/spacy/tests/stringstore/test_stringstore.py index 65b994606..3f2992a6f 100644 --- a/spacy/tests/stringstore/test_stringstore.py +++ b/spacy/tests/stringstore/test_stringstore.py @@ -6,6 +6,16 @@ from ...strings import StringStore import pytest +def test_string_hash(stringstore): + '''Test that string hashing is stable across platforms''' + ss = stringstore + assert ss.add('apple') == 8566208034543834098 + heart = '\U0001f499' + print(heart) + h = ss.add(heart) + assert h == 11841826740069053588 + + def test_stringstore_from_api_docs(stringstore): apple_hash = stringstore.add('apple') assert apple_hash == 8566208034543834098 diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py index 388aab03e..b36c67d8c 100644 --- a/spacy/tests/test_matcher.py +++ b/spacy/tests/test_matcher.py @@ -34,7 +34,6 @@ def test_matcher_from_api_docs(en_vocab): assert len(patterns[0]) -@pytest.mark.xfail def test_matcher_from_usage_docs(en_vocab): text = "Wow 😀 This is really cool! 😂 😂" doc = get_doc(en_vocab, words=text.split(' ')) @@ -46,7 +45,8 @@ def test_matcher_from_usage_docs(en_vocab): if doc.vocab.strings[match_id] == 'HAPPY': doc.sentiment += 0.1 span = doc[start : end] - token = span.merge(norm='happy emoji') + token = span.merge() + token.vocab[token.text].norm_ = 'happy emoji' matcher = Matcher(en_vocab) matcher.add('HAPPY', label_sentiment, *pos_patterns) @@ -98,11 +98,25 @@ def test_matcher_match_multi(matcher): (doc.vocab.strings['Java'], 5, 6)] -@pytest.mark.xfail +def test_matcher_empty_dict(en_vocab): + '''Test matcher allows empty token specs, meaning match on any token.''' + matcher = Matcher(en_vocab) + abc = ["a", "b", "c"] + doc = get_doc(matcher.vocab, abc) + matcher.add('A.C', None, [{'ORTH': 'a'}, {}, {'ORTH': 'c'}]) + matches = matcher(doc) + assert len(matches) == 1 + assert matches[0][1:] == (0, 3) + matcher.add('A.', None, [{'ORTH': 'a'}, {}]) + matches = matcher(doc) + assert matches[0][1:] == (0, 2) + + def test_matcher_phrase_matcher(en_vocab): words = ["Google", "Now"] doc = get_doc(en_vocab, words) - matcher = PhraseMatcher(en_vocab, [doc]) + matcher = PhraseMatcher(en_vocab) + matcher.add('COMPANY', None, doc) words = ["I", "like", "Google", "Now", "best"] doc = get_doc(en_vocab, words) assert len(matcher(doc)) == 1 diff --git a/spacy/tests/test_misc.py b/spacy/tests/test_misc.py index 80b859c70..762ea4c08 100644 --- a/spacy/tests/test_misc.py +++ b/spacy/tests/test_misc.py @@ -9,7 +9,8 @@ from .util import get_doc from pathlib import Path import pytest -from thinc.neural import Maxout, Softmax +from thinc.neural._classes.maxout import Maxout +from thinc.neural._classes.softmax import Softmax from thinc.api import chain diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py new file mode 100644 index 000000000..c7df57b62 --- /dev/null +++ b/spacy/tests/test_underscore.py @@ -0,0 +1,53 @@ +from mock import Mock +from ..tokens.underscore import Underscore + + +def test_create_doc_underscore(): + doc = Mock() + doc.doc = doc + uscore = Underscore(Underscore.doc_extensions, doc) + assert uscore._doc is doc + assert uscore._start is None + assert uscore._end is None + + +def test_doc_underscore_getattr_setattr(): + doc = Mock() + doc.doc = doc + doc.user_data = {} + Underscore.doc_extensions['hello'] = (False, None, None, None) + doc._ = Underscore(Underscore.doc_extensions, doc) + assert doc._.hello == False + doc._.hello = True + assert doc._.hello == True + + +def test_create_span_underscore(): + span = Mock(doc=Mock(), start=0, end=2) + uscore = Underscore(Underscore.span_extensions, span, + start=span.start, end=span.end) + assert uscore._doc is span.doc + assert uscore._start is span.start + assert uscore._end is span.end + + +def test_span_underscore_getter_setter(): + span = Mock(doc=Mock(), start=0, end=2) + Underscore.span_extensions['hello'] = (None, None, + lambda s: (s.start, 'hi'), + lambda s, value: setattr(s, 'start', + value)) + span._ = Underscore(Underscore.span_extensions, span, + start=span.start, end=span.end) + + assert span._.hello == (0, 'hi') + span._.hello = 1 + assert span._.hello == (1, 'hi') + + +def test_token_underscore_method(): + token = Mock(doc=Mock(), idx=7, say_cheese=lambda token: 'cheese') + Underscore.token_extensions['hello'] = (None, token.say_cheese, + None, None) + token._ = Underscore(Underscore.token_extensions, token, start=token.idx) + assert token._.hello() == 'cheese' diff --git a/spacy/tests/tokenizer/test_exceptions.py b/spacy/tests/tokenizer/test_exceptions.py index 57281b998..132f27433 100644 --- a/spacy/tests/tokenizer/test_exceptions.py +++ b/spacy/tests/tokenizer/test_exceptions.py @@ -1,6 +1,7 @@ # coding: utf-8 from __future__ import unicode_literals +import sys import pytest @@ -37,9 +38,10 @@ def test_tokenizer_excludes_false_pos_emoticons(tokenizer, text, length): tokens = tokenizer(text) assert len(tokens) == length - @pytest.mark.parametrize('text,length', [('can you still dunk?🍕🍔😵LOL', 8), ('i💙you', 3), ('🤘🤘yay!', 4)]) def test_tokenizer_handles_emoji(tokenizer, text, length): - tokens = tokenizer(text) - assert len(tokens) == length + # These break on narrow unicode builds, e.g. Windows + if sys.maxunicode >= 1114111: + tokens = tokenizer(text) + assert len(tokens) == length diff --git a/spacy/tests/tokenizer/test_urls.py b/spacy/tests/tokenizer/test_urls.py index 959067110..3bb6521f1 100644 --- a/spacy/tests/tokenizer/test_urls.py +++ b/spacy/tests/tokenizer/test_urls.py @@ -33,13 +33,10 @@ URLS_SHOULD_MATCH = [ "http://userid:password@example.com/", "http://142.42.1.1/", "http://142.42.1.1:8080/", - "http://⌘.ws", - "http://⌘.ws/", "http://foo.com/blah_(wikipedia)#cite-1", "http://foo.com/blah_(wikipedia)_blah#cite-1", "http://foo.com/unicode_(✪)_in_parens", "http://foo.com/(something)?after=parens", - "http://☺.damowmow.com/", "http://code.google.com/events/#&product=browser", "http://j.mp", "ftp://foo.bar/baz", @@ -49,14 +46,17 @@ URLS_SHOULD_MATCH = [ "http://a.b-c.de", "http://223.255.255.254", "http://a.b--c.de/", # this is a legit domain name see: https://gist.github.com/dperini/729294 comment on 9/9/2014 - "http://✪df.ws/123", - "http://➡.ws/䨹", - "http://مثال.إختبار", - "http://例子.测试", - "http://उदाहरण.परीक्षा", pytest.mark.xfail("http://foo.com/blah_blah_(wikipedia)"), pytest.mark.xfail("http://foo.com/blah_blah_(wikipedia)_(again)"), + pytest.mark.xfail("http://⌘.ws"), + pytest.mark.xfail("http://⌘.ws/"), + pytest.mark.xfail("http://☺.damowmow.com/"), + pytest.mark.xfail("http://✪df.ws/123"), + pytest.mark.xfail("http://➡.ws/䨹"), + pytest.mark.xfail("http://مثال.إختبار"), + pytest.mark.xfail("http://例子.测试"), + pytest.mark.xfail("http://उदाहरण.परीक्षा"), ] URLS_SHOULD_NOT_MATCH = [ @@ -83,7 +83,6 @@ URLS_SHOULD_NOT_MATCH = [ "http://foo.bar/foo(bar)baz quux", "ftps://foo.bar/", "http://-error-.invalid/", - "http://-a.b.co", "http://a.b-.co", "http://0.0.0.0", "http://10.1.1.0", @@ -99,6 +98,7 @@ URLS_SHOULD_NOT_MATCH = [ pytest.mark.xfail("foo.com"), pytest.mark.xfail("http://1.1.1.1.1"), pytest.mark.xfail("http://www.foo.bar./"), + pytest.mark.xfail("http://-a.b.co"), ] diff --git a/spacy/tests/util.py b/spacy/tests/util.py index 56aeb5223..2f474a926 100644 --- a/spacy/tests/util.py +++ b/spacy/tests/util.py @@ -79,9 +79,9 @@ def add_vecs_to_vocab(vocab, vectors): """Add list of vector tuples to given vocab. All vectors need to have the same length. Format: [("text", [1, 2, 3])]""" length = len(vectors[0][1]) - vocab.resize_vectors(length) + vocab.clear_vectors(length) for word, vec in vectors: - vocab[word].vector = vec + vocab.set_vector(word, vec) return vocab diff --git a/spacy/tests/vectors/test_similarity.py b/spacy/tests/vectors/test_similarity.py index 1260728be..f9c18adca 100644 --- a/spacy/tests/vectors/test_similarity.py +++ b/spacy/tests/vectors/test_similarity.py @@ -14,10 +14,9 @@ def vectors(): @pytest.fixture() def vocab(en_vocab, vectors): - #return add_vecs_to_vocab(en_vocab, vectors) - return None + add_vecs_to_vocab(en_vocab, vectors) + return en_vocab -@pytest.mark.xfail def test_vectors_similarity_LL(vocab, vectors): [(word1, vec1), (word2, vec2)] = vectors lex1 = vocab[word1] @@ -31,7 +30,6 @@ def test_vectors_similarity_LL(vocab, vectors): assert numpy.isclose(lex2.similarity(lex2), lex1.similarity(lex1)) -@pytest.mark.xfail def test_vectors_similarity_TT(vocab, vectors): [(word1, vec1), (word2, vec2)] = vectors doc = get_doc(vocab, words=[word1, word2]) @@ -44,21 +42,18 @@ def test_vectors_similarity_TT(vocab, vectors): assert numpy.isclose(doc[1].similarity(doc[0]), doc[0].similarity(doc[1])) -@pytest.mark.xfail def test_vectors_similarity_TD(vocab, vectors): [(word1, vec1), (word2, vec2)] = vectors doc = get_doc(vocab, words=[word1, word2]) assert doc.similarity(doc[0]) == doc[0].similarity(doc) -@pytest.mark.xfail def test_vectors_similarity_DS(vocab, vectors): [(word1, vec1), (word2, vec2)] = vectors doc = get_doc(vocab, words=[word1, word2]) assert doc.similarity(doc[:2]) == doc[:2].similarity(doc) -@pytest.mark.xfail def test_vectors_similarity_TS(vocab, vectors): [(word1, vec1), (word2, vec2)] = vectors doc = get_doc(vocab, words=[word1, word2]) diff --git a/spacy/tests/vectors/test_vectors.py b/spacy/tests/vectors/test_vectors.py index c42c3a4ce..798871edd 100644 --- a/spacy/tests/vectors/test_vectors.py +++ b/spacy/tests/vectors/test_vectors.py @@ -2,6 +2,8 @@ from __future__ import unicode_literals from ...vectors import Vectors +from ...tokenizer import Tokenizer +from ..util import add_vecs_to_vocab, get_doc import numpy import pytest @@ -11,22 +13,42 @@ import pytest def strings(): return ["apple", "orange"] +@pytest.fixture +def vectors(): + return [ + ("apple", [1, 2, 3]), + ("orange", [-1, -2, -3]), + ('and', [-1, -1, -1]), + ('juice', [5, 5, 10]), + ('pie', [7, 6.3, 8.9])] + + @pytest.fixture def data(): return numpy.asarray([[0.0, 1.0, 2.0], [3.0, -2.0, 4.0]], dtype='f') +@pytest.fixture() +def vocab(en_vocab, vectors): + add_vecs_to_vocab(en_vocab, vectors) + return en_vocab + + def test_init_vectors_with_data(strings, data): v = Vectors(strings, data) assert v.shape == data.shape def test_init_vectors_with_width(strings): v = Vectors(strings, 3) + for string in strings: + v.add(string) assert v.shape == (len(strings), 3) def test_get_vector(strings, data): v = Vectors(strings, data) + for string in strings: + v.add(string) assert list(v[strings[0]]) == list(data[0]) assert list(v[strings[0]]) != list(data[1]) assert list(v[strings[1]]) != list(data[0]) @@ -35,6 +57,8 @@ def test_get_vector(strings, data): def test_set_vector(strings, data): orig = data.copy() v = Vectors(strings, data) + for string in strings: + v.add(string) assert list(v[strings[0]]) == list(orig[0]) assert list(v[strings[0]]) != list(orig[1]) v[strings[0]] = data[1] @@ -42,125 +66,111 @@ def test_set_vector(strings, data): assert list(v[strings[0]]) != list(orig[0]) -# -#@pytest.fixture() -#def tokenizer_v(vocab): -# return Tokenizer(vocab, {}, None, None, None) -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', ["apple and orange"]) -#def test_vectors_token_vector(tokenizer_v, vectors, text): -# doc = tokenizer_v(text) -# assert vectors[0] == (doc[0].text, list(doc[0].vector)) -# assert vectors[1] == (doc[2].text, list(doc[2].vector)) -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', ["apple", "orange"]) -#def test_vectors_lexeme_vector(vocab, text): -# lex = vocab[text] -# assert list(lex.vector) -# assert lex.vector_norm -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "and", "orange"]]) -#def test_vectors_doc_vector(vocab, text): -# doc = get_doc(vocab, text) -# assert list(doc.vector) -# assert doc.vector_norm -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "and", "orange"]]) -#def test_vectors_span_vector(vocab, text): -# span = get_doc(vocab, text)[0:2] -# assert list(span.vector) -# assert span.vector_norm -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', ["apple orange"]) -#def test_vectors_token_token_similarity(tokenizer_v, text): -# doc = tokenizer_v(text) -# assert doc[0].similarity(doc[1]) == doc[1].similarity(doc[0]) -# assert 0.0 < doc[0].similarity(doc[1]) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text1,text2', [("apple", "orange")]) -#def test_vectors_token_lexeme_similarity(tokenizer_v, vocab, text1, text2): -# token = tokenizer_v(text1) -# lex = vocab[text2] -# assert token.similarity(lex) == lex.similarity(token) -# assert 0.0 < token.similarity(lex) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) -#def test_vectors_token_span_similarity(vocab, text): -# doc = get_doc(vocab, text) -# assert doc[0].similarity(doc[1:3]) == doc[1:3].similarity(doc[0]) -# assert 0.0 < doc[0].similarity(doc[1:3]) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) -#def test_vectors_token_doc_similarity(vocab, text): -# doc = get_doc(vocab, text) -# assert doc[0].similarity(doc) == doc.similarity(doc[0]) -# assert 0.0 < doc[0].similarity(doc) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) -#def test_vectors_lexeme_span_similarity(vocab, text): -# doc = get_doc(vocab, text) -# lex = vocab[text[0]] -# assert lex.similarity(doc[1:3]) == doc[1:3].similarity(lex) -# assert 0.0 < doc.similarity(doc[1:3]) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text1,text2', [("apple", "orange")]) -#def test_vectors_lexeme_lexeme_similarity(vocab, text1, text2): -# lex1 = vocab[text1] -# lex2 = vocab[text2] -# assert lex1.similarity(lex2) == lex2.similarity(lex1) -# assert 0.0 < lex1.similarity(lex2) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) -#def test_vectors_lexeme_doc_similarity(vocab, text): -# doc = get_doc(vocab, text) -# lex = vocab[text[0]] -# assert lex.similarity(doc) == doc.similarity(lex) -# assert 0.0 < lex.similarity(doc) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) -#def test_vectors_span_span_similarity(vocab, text): -# doc = get_doc(vocab, text) -# assert doc[0:2].similarity(doc[1:3]) == doc[1:3].similarity(doc[0:2]) -# assert 0.0 < doc[0:2].similarity(doc[1:3]) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) -#def test_vectors_span_doc_similarity(vocab, text): -# doc = get_doc(vocab, text) -# assert doc[0:2].similarity(doc) == doc.similarity(doc[0:2]) -# assert 0.0 < doc[0:2].similarity(doc) < 1.0 -# -# -#@pytest.mark.xfail -#@pytest.mark.parametrize('text1,text2', [ -# (["apple", "and", "apple", "pie"], ["orange", "juice"])]) -#def test_vectors_doc_doc_similarity(vocab, text1, text2): -# doc1 = get_doc(vocab, text1) -# doc2 = get_doc(vocab, text2) -# assert doc1.similarity(doc2) == doc2.similarity(doc1) -# assert 0.0 < doc1.similarity(doc2) < 1.0 + +@pytest.fixture() +def tokenizer_v(vocab): + return Tokenizer(vocab, {}, None, None, None) + + +@pytest.mark.parametrize('text', ["apple and orange"]) +def test_vectors_token_vector(tokenizer_v, vectors, text): + doc = tokenizer_v(text) + assert vectors[0] == (doc[0].text, list(doc[0].vector)) + assert vectors[1] == (doc[2].text, list(doc[2].vector)) + + +@pytest.mark.parametrize('text', ["apple", "orange"]) +def test_vectors_lexeme_vector(vocab, text): + lex = vocab[text] + assert list(lex.vector) + assert lex.vector_norm + + +@pytest.mark.parametrize('text', [["apple", "and", "orange"]]) +def test_vectors_doc_vector(vocab, text): + doc = get_doc(vocab, text) + assert list(doc.vector) + assert doc.vector_norm + + +@pytest.mark.parametrize('text', [["apple", "and", "orange"]]) +def test_vectors_span_vector(vocab, text): + span = get_doc(vocab, text)[0:2] + assert list(span.vector) + assert span.vector_norm + + +@pytest.mark.parametrize('text', ["apple orange"]) +def test_vectors_token_token_similarity(tokenizer_v, text): + doc = tokenizer_v(text) + assert doc[0].similarity(doc[1]) == doc[1].similarity(doc[0]) + assert -1. < doc[0].similarity(doc[1]) < 1.0 + + +@pytest.mark.parametrize('text1,text2', [("apple", "orange")]) +def test_vectors_token_lexeme_similarity(tokenizer_v, vocab, text1, text2): + token = tokenizer_v(text1) + lex = vocab[text2] + assert token.similarity(lex) == lex.similarity(token) + assert -1. < token.similarity(lex) < 1.0 + + +@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) +def test_vectors_token_span_similarity(vocab, text): + doc = get_doc(vocab, text) + assert doc[0].similarity(doc[1:3]) == doc[1:3].similarity(doc[0]) + assert -1. < doc[0].similarity(doc[1:3]) < 1.0 + + +@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) +def test_vectors_token_doc_similarity(vocab, text): + doc = get_doc(vocab, text) + assert doc[0].similarity(doc) == doc.similarity(doc[0]) + assert -1. < doc[0].similarity(doc) < 1.0 + + +@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) +def test_vectors_lexeme_span_similarity(vocab, text): + doc = get_doc(vocab, text) + lex = vocab[text[0]] + assert lex.similarity(doc[1:3]) == doc[1:3].similarity(lex) + assert -1. < doc.similarity(doc[1:3]) < 1.0 + + +@pytest.mark.parametrize('text1,text2', [("apple", "orange")]) +def test_vectors_lexeme_lexeme_similarity(vocab, text1, text2): + lex1 = vocab[text1] + lex2 = vocab[text2] + assert lex1.similarity(lex2) == lex2.similarity(lex1) + assert -1. < lex1.similarity(lex2) < 1.0 + + +@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) +def test_vectors_lexeme_doc_similarity(vocab, text): + doc = get_doc(vocab, text) + lex = vocab[text[0]] + assert lex.similarity(doc) == doc.similarity(lex) + assert -1. < lex.similarity(doc) < 1.0 + + +@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) +def test_vectors_span_span_similarity(vocab, text): + doc = get_doc(vocab, text) + assert doc[0:2].similarity(doc[1:3]) == doc[1:3].similarity(doc[0:2]) + assert -1. < doc[0:2].similarity(doc[1:3]) < 1.0 + + +@pytest.mark.parametrize('text', [["apple", "orange", "juice"]]) +def test_vectors_span_doc_similarity(vocab, text): + doc = get_doc(vocab, text) + assert doc[0:2].similarity(doc) == doc.similarity(doc[0:2]) + assert -1. < doc[0:2].similarity(doc) < 1.0 + + +@pytest.mark.parametrize('text1,text2', [ + (["apple", "and", "apple", "pie"], ["orange", "juice"])]) +def test_vectors_doc_doc_similarity(vocab, text1, text2): + doc1 = get_doc(vocab, text1) + doc2 = get_doc(vocab, text2) + assert doc1.similarity(doc2) == doc2.similarity(doc1) + assert -1. < doc1.similarity(doc2) < 1.0 diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx index de184baba..f2d21de44 100644 --- a/spacy/tokenizer.pyx +++ b/spacy/tokenizer.pyx @@ -248,7 +248,8 @@ cdef class Tokenizer: start = infix_end span = string[start:] - tokens.push_back(self.vocab.get(tokens.mem, span), False) + if span: + tokens.push_back(self.vocab.get(tokens.mem, span), False) cdef vector[const LexemeC*].reverse_iterator it = suffixes.rbegin() while it != suffixes.rend(): lexeme = deref(it) diff --git a/spacy/tokens/doc.pxd b/spacy/tokens/doc.pxd index ef1f85ea7..ad2b9876d 100644 --- a/spacy/tokens/doc.pxd +++ b/spacy/tokens/doc.pxd @@ -33,6 +33,7 @@ cdef class Doc: cdef public object _vector_norm cdef public object tensor + cdef public object cats cdef public object user_data cdef TokenC* c @@ -53,7 +54,7 @@ cdef class Doc: cdef public object noun_chunks_iterator - cdef int push_back(self, LexemeOrToken lex_or_tok, bint trailing_space) except -1 + cdef int push_back(self, LexemeOrToken lex_or_tok, bint has_space) except -1 cpdef np.ndarray to_array(self, object features) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index 1eceab00d..05d393d2b 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -30,7 +30,7 @@ from ..util import normalize_slice from ..compat import is_config from .. import about from .. import util - +from .underscore import Underscore DEF PADDING = 5 @@ -64,6 +64,7 @@ cdef attr_t get_token_attr(const TokenC* token, attr_id_t feat_name) nogil: else: return Lexeme.get_struct_attr(token.lex, feat_name) + def _get_chunker(lang): try: cls = util.get_lang_class(lang) @@ -73,6 +74,7 @@ def _get_chunker(lang): return None return cls.Defaults.syntax_iterators.get(u'noun_chunks') + cdef class Doc: """A sequence of Token objects. Access sentences and named entities, export annotations to numpy arrays, losslessly serialize to compressed binary strings. @@ -87,6 +89,21 @@ cdef class Doc: >>> from spacy.tokens import Doc >>> doc = Doc(nlp.vocab, words=[u'hello', u'world', u'!'], spaces=[True, False, False]) """ + @classmethod + def set_extension(cls, name, default=None, method=None, + getter=None, setter=None): + nr_defined = sum(t is not None for t in (default, getter, setter, method)) + assert nr_defined == 1 + Underscore.doc_extensions[name] = (default, method, getter, setter) + + @classmethod + def get_extension(cls, name): + return Underscore.doc_extensions.get(name) + + @classmethod + def has_extension(cls, name): + return name in Underscore.doc_extensions + def __init__(self, Vocab vocab, words=None, spaces=None, orths_and_spaces=None): """Create a Doc object. @@ -117,6 +134,7 @@ cdef class Doc: self.is_tagged = False self.is_parsed = False self.sentiment = 0.0 + self.cats = {} self.user_hooks = {} self.user_token_hooks = {} self.user_span_hooks = {} @@ -158,6 +176,10 @@ cdef class Doc: self.is_tagged = True self.is_parsed = True + @property + def _(self): + return Underscore(Underscore.doc_extensions, self) + def __getitem__(self, object i): """Get a `Token` or `Span` object. @@ -237,6 +259,29 @@ cdef class Doc: def doc(self): return self + def char_span(self, int start_idx, int end_idx, label=0, vector=None): + """Create a `Span` object from the slice `doc.text[start : end]`. + + doc (Doc): The parent document. + start (int): The index of the first character of the span. + end (int): The index of the first character after the span. + label (uint64 or string): A label to attach to the Span, e.g. for named entities. + vector (ndarray[ndim=1, dtype='float32']): A meaning representation of the span. + RETURNS (Span): The newly constructed object. + """ + if not isinstance(label, int): + label = self.vocab.strings.add(label) + cdef int start = token_by_start(self.c, self.length, start_idx) + if start == -1: + return None + cdef int end = token_by_end(self.c, self.length, end_idx) + if end == -1: + return None + # Currently we have the token index, we want the range-end index + end += 1 + cdef Span span = Span(self, start, end, label=label, vector=vector) + return span + def similarity(self, other): """Make a semantic similarity estimate. The default estimate is cosine similarity using an average of word vectors. @@ -279,8 +324,14 @@ cdef class Doc: return self.user_hooks['vector'](self) if self._vector is not None: return self._vector - elif self.has_vector and len(self): - self._vector = sum(t.vector for t in self) / len(self) + elif not len(self): + self._vector = numpy.zeros((self.vocab.vectors_length,), dtype='f') + return self._vector + elif self.has_vector: + vector = numpy.zeros((self.vocab.vectors_length,), dtype='f') + for token in self.c[:self.length]: + vector += self.vocab.get_vector(token.lex.orth) + self._vector = vector / len(self) return self._vector elif self.tensor is not None: self._vector = self.tensor.mean(axis=0) @@ -455,7 +506,7 @@ cdef class Doc: cdef int i start = 0 for i in range(1, self.length): - if self.c[i].sent_start: + if self.c[i].sent_start == 1: yield Span(self, start, i) start = i if start != self.length: @@ -482,6 +533,8 @@ cdef class Doc: assert t.lex.orth != 0 t.spacy = has_space self.length += 1 + # Set morphological attributes, e.g. by lemma, if possible + self.vocab.morphology.assign_untagged(t) self._py_tokens.append(None) return t.idx + t.lex.length + t.spacy @@ -630,7 +683,7 @@ cdef class Doc: """ with path.open('rb') as file_: bytes_data = file_.read() - self.from_bytes(bytes_data, **exclude) + return self.from_bytes(bytes_data, **exclude) def to_bytes(self, **exclude): """Serialize, i.e. export the document contents to a binary string. diff --git a/spacy/tokens/span.pxd b/spacy/tokens/span.pxd index 8d675c04f..9645189a5 100644 --- a/spacy/tokens/span.pxd +++ b/spacy/tokens/span.pxd @@ -15,5 +15,5 @@ cdef class Span: cdef public _vector cdef public _vector_norm - cpdef int _recalculate_indices(self) except -1 + cpdef np.ndarray to_array(self, object features) diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx index 9f2115fe1..3b31c50c0 100644 --- a/spacy/tokens/span.pyx +++ b/spacy/tokens/span.pyx @@ -7,7 +7,7 @@ import numpy import numpy.linalg from libc.math cimport sqrt -from .doc cimport token_by_start, token_by_end +from .doc cimport token_by_start, token_by_end, get_token_attr from ..structs cimport TokenC, LexemeC from ..typedefs cimport flags_t, attr_t, hash_t from ..attrs cimport attr_id_t @@ -17,10 +17,24 @@ from ..attrs cimport IS_PUNCT, IS_SPACE from ..lexeme cimport Lexeme from ..compat import is_config from .. import about +from .underscore import Underscore cdef class Span: """A slice from a Doc object.""" + @classmethod + def set_extension(cls, name, default=None, method=None, + getter=None, setter=None): + Underscore.span_extensions[name] = (default, method, getter, setter) + + @classmethod + def get_extension(cls, name): + return Underscore.span_extensions.get(name) + + @classmethod + def has_extension(cls, name): + return name in Underscore.span_extensions + def __cinit__(self, Doc doc, int start, int end, attr_t label=0, vector=None, vector_norm=None): """Create a `Span` object from the slice `doc[start : end]`. @@ -111,6 +125,34 @@ cdef class Span: for i in range(self.start, self.end): yield self.doc[i] + @property + def _(self): + return Underscore(Underscore.span_extensions, self, + start=self.start_char, end=self.end_char) + def as_doc(self): + '''Create a Doc object view of the Span's data. + + This is mostly useful for C-typed interfaces. + ''' + cdef Doc doc = Doc(self.doc.vocab) + doc.length = self.end-self.start + doc.c = &self.doc.c[self.start] + doc.mem = self.doc.mem + doc.is_parsed = self.doc.is_parsed + doc.is_tagged = self.doc.is_tagged + doc.noun_chunks_iterator = self.doc.noun_chunks_iterator + doc.user_hooks = self.doc.user_hooks + doc.user_span_hooks = self.doc.user_span_hooks + doc.user_token_hooks = self.doc.user_token_hooks + doc.vector = self.vector + doc.vector_norm = self.vector_norm + for key, value in self.doc.cats.items(): + if hasattr(key, '__len__') and len(key) == 3: + cat_start, cat_end, cat_label = key + if cat_start == self.start_char and cat_end == self.end_char: + doc.cats[cat_label] = value + return doc + def merge(self, *args, **attributes): """Retokenize the document, such that the span is merged into a single token. @@ -135,6 +177,29 @@ cdef class Span: return 0.0 return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm) + cpdef np.ndarray to_array(self, object py_attr_ids): + """Given a list of M attribute IDs, export the tokens to a numpy + `ndarray` of shape `(N, M)`, where `N` is the length of the document. + The values will be 32-bit integers. + + attr_ids (list[int]): A list of attribute ID ints. + RETURNS (numpy.ndarray[long, ndim=2]): A feature matrix, with one row + per word, and one column per attribute indicated in the input + `attr_ids`. + """ + cdef int i, j + cdef attr_id_t feature + cdef np.ndarray[attr_t, ndim=2] output + # Make an array from the attributes --- otherwise our inner loop is Python + # dict iteration. + cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64) + cdef int length = self.end - self.start + output = numpy.ndarray(shape=(length, len(attr_ids)), dtype=numpy.uint64) + for i in range(self.start, self.end): + for j, feature in enumerate(attr_ids): + output[i-self.start, j] = get_token_attr(&self.doc.c[i], feature) + return output + cpdef int _recalculate_indices(self) except -1: if self.end > self.doc.length \ or self.doc.c[self.start].idx != self.start_char \ diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx index 5b8c276d8..9ff59eabe 100644 --- a/spacy/tokens/token.pyx +++ b/spacy/tokens/token.pyx @@ -20,10 +20,24 @@ from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, LENGTH, CLUST from ..attrs cimport LEMMA, POS, TAG, DEP from ..compat import is_config from .. import about +from .underscore import Underscore cdef class Token: """An individual token – i.e. a word, punctuation symbol, whitespace, etc.""" + @classmethod + def set_extension(cls, name, default=None, method=None, + getter=None, setter=None): + Underscore.token_extensions[name] = (default, method, getter, setter) + + @classmethod + def get_extension(cls, name): + return Underscore.span_extensions.get(name) + + @classmethod + def has_extension(cls, name): + return name in Underscore.span_extensions + def __cinit__(self, Vocab vocab, Doc doc, int offset): """Construct a `Token` object. @@ -62,23 +76,36 @@ cdef class Token: def __richcmp__(self, Token other, int op): # http://cython.readthedocs.io/en/latest/src/userguide/special_methods.html + cdef Doc my_doc = self.doc + cdef Doc other_doc = other.doc my = self.idx their = other.idx if other is not None else None if op == 0: return my < their elif op == 2: - return my == their + if my_doc is other_doc: + return my == their + else: + return False elif op == 4: return my > their elif op == 1: return my <= their elif op == 3: - return my != their + if my_doc is other_doc: + return my != their + else: + return True elif op == 5: return my >= their else: raise ValueError(op) + @property + def _(self): + return Underscore(Underscore.token_extensions, self, + start=self.idx, end=None) + cpdef bint check_flag(self, attr_id_t flag_id) except -1: """Check the value of a boolean flag. @@ -258,7 +285,7 @@ cdef class Token: def __get__(self): if 'vector_norm' in self.doc.user_token_hooks: return self.doc.user_token_hooks['vector_norm'](self) - vector = self.vector + vector = self.vector return numpy.sqrt((vector ** 2).sum()) property n_lefts: @@ -273,13 +300,21 @@ cdef class Token: def __get__(self): return self.c.sent_start - def __set__(self, bint value): + def __set__(self, value): if self.doc.is_parsed: raise ValueError( 'Refusing to write to token.sent_start if its document is parsed, ' 'because this may cause inconsistent state. ' 'See https://github.com/spacy-io/spaCy/issues/235 for workarounds.') - self.c.sent_start = value + if value is None: + self.c.sent_start = 0 + elif value is True: + self.c.sent_start = 1 + elif value is False: + self.c.sent_start = -1 + else: + raise ValueError("Invalid value for token.sent_start -- must be one of " + "None, True, False") property lefts: def __get__(self): diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py new file mode 100644 index 000000000..6e782647b --- /dev/null +++ b/spacy/tokens/underscore.py @@ -0,0 +1,50 @@ +import functools + +class Underscore(object): + doc_extensions = {} + span_extensions = {} + token_extensions = {} + + def __init__(self, extensions, obj, start=None, end=None): + object.__setattr__(self, '_extensions', extensions) + object.__setattr__(self, '_obj', obj) + # Assumption is that for doc values, _start and _end will both be None + # Span will set non-None values for _start and _end + # Token will have _start be non-None, _end be None + # This lets us key everything into the doc.user_data dictionary, + # (see _get_key), and lets us use a single Underscore class. + object.__setattr__(self, '_doc', obj.doc) + object.__setattr__(self, '_start', start) + object.__setattr__(self, '_end', end) + + def __getattr__(self, name): + if name not in self._extensions: + raise AttributeError(name) + default, method, getter, setter = self._extensions[name] + if getter is not None: + return getter(self._obj) + elif method is not None: + return functools.partial(method, self._obj) + else: + return self._doc.user_data.get(self._get_key(name), default) + + def __setattr__(self, name, value): + if name not in self._extensions: + raise AttributeError(name) + default, method, getter, setter = self._extensions[name] + if setter is not None: + return setter(self._obj, value) + else: + self._doc.user_data[self._get_key(name)] = value + + def set(self, name, value): + return self.__setattr__(name, value) + + def get(self, name): + return self.__getattr__(name) + + def has(self, name): + return name in self._extensions + + def _get_key(self, name): + return ('._.', name, self._start, self._end) diff --git a/spacy/util.py b/spacy/util.py index ccb81fbed..50ebc036b 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals, print_function import os import ujson -import pip +import pkg_resources import importlib import regex as re from pathlib import Path @@ -14,6 +14,7 @@ import numpy import io import dill from collections import OrderedDict +from thinc.neural._classes.model import Model import msgpack import msgpack_numpy @@ -22,7 +23,7 @@ import ujson from .symbols import ORTH from .compat import cupy, CudaStream, path2str, basestring_, input_, unicode_ -from .compat import copy_array, normalize_string_keys, getattr_ +from .compat import copy_array, normalize_string_keys, getattr_, import_file LANGUAGES = {} @@ -112,15 +113,13 @@ def load_model(name, **overrides): def load_model_from_link(name, **overrides): """Load a model from a shortcut link, or directory in spaCy data path.""" - init_file = get_data_path() / name / '__init__.py' - spec = importlib.util.spec_from_file_location(name, init_file) + path = get_data_path() / name / '__init__.py' try: - cls = importlib.util.module_from_spec(spec) + cls = import_file(name, path) except AttributeError: raise IOError( "Cant' load '%s'. If you're using a shortcut link, make sure it " "points to a valid model package (not just a data directory)." % name) - spec.loader.exec_module(cls) return cls.load(**overrides) @@ -136,7 +135,18 @@ def load_model_from_path(model_path, meta=False, **overrides): if not meta: meta = get_model_meta(model_path) cls = get_lang_class(meta['lang']) - nlp = cls(pipeline=meta.get('pipeline', True), meta=meta, **overrides) + nlp = cls(meta=meta, **overrides) + pipeline = meta.get('pipeline', []) + disable = overrides.get('disable', []) + if pipeline is True: + pipeline = nlp.Defaults.pipe_names + elif pipeline in (False, None): + pipeline = [] + for name in pipeline: + if name not in disable: + config = meta.get('pipeline_args', {}).get(name, {}) + component = nlp.create_pipe(name, config=config) + nlp.add_pipe(component, name=name) return nlp.from_disk(model_path) @@ -171,8 +181,8 @@ def get_model_meta(path): raise IOError("Could not read meta.json from %s" % meta_path) meta = read_json(meta_path) for setting in ['lang', 'name', 'version']: - if setting not in meta: - raise ValueError('No %s setting found in model meta.json' % setting) + if setting not in meta or not meta[setting]: + raise ValueError("No valid '%s' setting found in model meta.json" % setting) return meta @@ -182,9 +192,10 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ - packages = pip.get_installed_distributions() + name = name.lower() # compare package name against lowercase name + packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.project_name.replace('-', '_') == name: + if package.lower().replace('-', '_') == name: return True return False @@ -195,6 +206,7 @@ def get_package_path(name): name (unicode): Package name. RETURNS (Path): Path to installed package. """ + name = name.lower() # use lowercase version to be safe # Here we're importing the module just to find it. This is worryingly # indirect, but it's otherwise very difficult to find the package. pkg = importlib.import_module(name) @@ -559,3 +571,17 @@ def minify_html(html): RETURNS (unicode): "Minified" HTML. """ return html.strip().replace(' ', '').replace('\n', '') + + +def use_gpu(gpu_id): + try: + import cupy.cuda.device + except ImportError: + return None + from thinc.neural.ops import CupyOps + device = cupy.cuda.device.Device(gpu_id) + device.use() + Model.ops = CupyOps() + Model.Ops = CupyOps + return device + diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 35d4d17ab..8ce150531 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -1,57 +1,116 @@ +from __future__ import unicode_literals +from libc.stdint cimport int32_t, uint64_t import numpy from collections import OrderedDict import msgpack import msgpack_numpy msgpack_numpy.patch() +cimport numpy as np +from thinc.neural.util import get_array_module +from thinc.neural._classes.model import Model +from .typedefs cimport attr_t from .strings cimport StringStore from . import util +from .compat import basestring_ cdef class Vectors: - '''Store, save and load word vectors.''' + '''Store, save and load word vectors. + + Vectors data is kept in the vectors.data attribute, which should be an + instance of numpy.ndarray (for CPU vectors) + or cupy.ndarray (for GPU vectors). + + vectors.key2row is a dictionary mapping word hashes to rows + in the vectors.data table. The array `vectors.keys` keeps + the keys in order, such that keys[vectors.key2row[key]] == key. + ''' cdef public object data cdef readonly StringStore strings - cdef public object key2i + cdef public object key2row + cdef public object keys + cdef public int i - def __init__(self, strings, data_or_width): - self.strings = StringStore() + def __init__(self, strings, data_or_width=0): + if isinstance(strings, StringStore): + self.strings = strings + else: + self.strings = StringStore() + for string in strings: + self.strings.add(string) if isinstance(data_or_width, int): self.data = data = numpy.zeros((len(strings), data_or_width), dtype='f') else: data = data_or_width + self.i = 0 self.data = data - self.key2i = {} - for i, string in enumerate(strings): - self.key2i[self.strings.add(string)] = i + self.key2row = {} + self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') def __reduce__(self): return (Vectors, (self.strings, self.data)) def __getitem__(self, key): + '''Get a vector by key. If key is a string, it is hashed + to an integer ID using the vectors.strings table. + + If the integer key is not found in the table, a KeyError is raised. + ''' if isinstance(key, basestring): key = self.strings[key] - i = self.key2i[key] + i = self.key2row[key] if i is None: raise KeyError(key) else: return self.data[i] def __setitem__(self, key, vector): + '''Set a vector for the given key. If key is a string, it is hashed + to an integer ID using the vectors.strings table. + ''' if isinstance(key, basestring): key = self.strings.add(key) - i = self.key2i[key] + i = self.key2row[key] self.data[i] = vector def __iter__(self): + '''Yield vectors from the table.''' yield from self.data def __len__(self): - return len(self.strings) + '''Return the number of vectors that have been assigned.''' + return self.i + + def __contains__(self, key): + '''Check whether a key has a vector entry in the table.''' + if isinstance(key, basestring_): + key = self.strings[key] + return key in self.key2row + + def add(self, key, vector=None): + '''Add a key to the table, optionally setting a vector value as well.''' + if isinstance(key, basestring_): + key = self.strings.add(key) + if key not in self.key2row: + i = self.i + if i >= self.keys.shape[0]: + self.keys.resize((self.keys.shape[0]*2,)) + self.data.resize((self.data.shape[0]*2, self.data.shape[1])) + self.key2row[key] = self.i + self.keys[self.i] = key + self.i += 1 + else: + i = self.key2row[key] + if vector is not None: + self.data[i] = vector + return i def items(self): - for i, string in enumerate(self.strings): + '''Iterate over (string key, vector) pairs, in order.''' + for i, key in enumerate(self.keys): + string = self.strings[key] yield string, self.data[i] @property @@ -61,34 +120,93 @@ cdef class Vectors: def most_similar(self, key): raise NotImplementedError - def to_disk(self, path): - raise NotImplementedError + def from_glove(self, path): + '''Load GloVe vectors from a directory. Assumes binary format, + that the vocab is in a vocab.txt, and that vectors are named + vectors.{size}.[fd].bin, e.g. vectors.128.f.bin for 128d float32 + vectors, vectors.300.d.bin for 300d float64 (double) vectors, etc. + By default GloVe outputs 64-bit vectors.''' + path = util.ensure_path(path) + for name in path.iterdir(): + if name.parts[-1].startswith('vectors'): + _, dims, dtype, _2 = name.parts[-1].split('.') + self.width = int(dims) + break + else: + raise IOError("Expected file named e.g. vectors.128.f.bin") + bin_loc = path / 'vectors.{dims}.{dtype}.bin'.format(dims=dims, + dtype=dtype) + with bin_loc.open('rb') as file_: + self.data = numpy.fromfile(file_, dtype='float64') + self.data = numpy.ascontiguousarray(self.data, dtype='float32') + n = 0 + with (path / 'vocab.txt').open('r') as file_: + for line in file_: + self.add(line.strip()) + n += 1 + if (self.data.size % self.width) == 0: + self.data - def from_disk(self, path): - raise NotImplementedError + def to_disk(self, path, **exclude): + xp = get_array_module(self.data) + if xp is numpy: + save_array = lambda arr, file_: xp.save(file_, arr, allow_pickle=False) + else: + save_array = lambda arr, file_: xp.save(file_, arr) + serializers = OrderedDict(( + ('vectors', lambda p: save_array(self.data, p.open('wb'))), + ('keys', lambda p: xp.save(p.open('wb'), self.keys)) + )) + return util.to_disk(path, serializers, exclude) + + def from_disk(self, path, **exclude): + def load_keys(path): + if path.exists(): + self.keys = numpy.load(path) + for i, key in enumerate(self.keys): + self.keys[i] = key + self.key2row[key] = i + + def load_vectors(path): + xp = Model.ops.xp + if path.exists(): + self.data = xp.load(path) + + serializers = OrderedDict(( + ('keys', load_keys), + ('vectors', load_vectors), + )) + util.from_disk(path, serializers, exclude) + return self def to_bytes(self, **exclude): def serialize_weights(): - if hasattr(self.weights, 'to_bytes'): - return self.weights.to_bytes() + if hasattr(self.data, 'to_bytes'): + return self.data.to_bytes() else: - return msgpack.dumps(self.weights) - + return msgpack.dumps(self.data) serializers = OrderedDict(( - ('strings', lambda: self.strings.to_bytes()), - ('weights', serialize_weights) + ('keys', lambda: msgpack.dumps(self.keys)), + ('vectors', serialize_weights) )) return util.to_bytes(serializers, exclude) def from_bytes(self, data, **exclude): def deserialize_weights(b): - if hasattr(self.weights, 'from_bytes'): - self.weights.from_bytes() + if hasattr(self.data, 'from_bytes'): + self.data.from_bytes() else: - self.weights = msgpack.loads(b) + self.data = msgpack.loads(b) + + def load_keys(keys): + self.keys.resize((len(keys),)) + for i, key in enumerate(keys): + self.keys[i] = key + self.key2row[key] = i deserializers = OrderedDict(( - ('strings', lambda b: self.strings.from_bytes(b)), - ('weights', deserialize_weights) + ('keys', lambda b: load_keys(msgpack.loads(b))), + ('vectors', deserialize_weights) )) - return util.from_bytes(deserializers, exclude) + util.from_bytes(data, deserializers, exclude) + return self diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 149317779..a5f8bf6ad 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -4,6 +4,7 @@ from __future__ import unicode_literals import bz2 import ujson import re +import numpy from libc.string cimport memset, memcpy from libc.stdint cimport int32_t @@ -19,12 +20,14 @@ from .tokens.token cimport Token from .attrs cimport PROB, LANG from .structs cimport SerializedLexemeC -from .compat import copy_reg, pickle +from .compat import copy_reg, pickle, basestring_ from .lemmatizer import Lemmatizer from .attrs import intify_attrs +from .vectors import Vectors from . import util from . import attrs from . import symbols +from ._ml import link_vectors_to_models cdef class Vocab: @@ -63,6 +66,7 @@ cdef class Vocab: self.strings.add(name) self.lex_attr_getters = lex_attr_getters self.morphology = Morphology(self.strings, tag_map, lemmatizer) + self.vectors = Vectors(self.strings) property lang: def __get__(self): @@ -242,13 +246,15 @@ cdef class Vocab: @property def vectors_length(self): - raise NotImplementedError + return self.vectors.data.shape[1] - def clear_vectors(self): + def clear_vectors(self, new_dim=None): """Drop the current vector table. Because all vectors must be the same width, you have to call this to change the size of the vectors. """ - raise NotImplementedError + if new_dim is None: + new_dim = self.vectors.data.shape[1] + self.vectors = Vectors(self.strings, new_dim) def get_vector(self, orth): """Retrieve a vector for a word in the vocabulary. @@ -256,13 +262,18 @@ cdef class Vocab: Words can be looked up by string or int ID. RETURNS: - A word vector. Size and shape determed by the + A word vector. Size and shape determined by the vocab.vectors instance. Usually, a numpy ndarray of shape (300,) and dtype float32. RAISES: If no vectors data is loaded, ValueError is raised. """ - raise NotImplementedError + if isinstance(orth, basestring_): + orth = self.strings.add(orth) + if orth in self.vectors.key2row: + return self.vectors[orth] + else: + return numpy.zeros((self.vectors_length,), dtype='f') def set_vector(self, orth, vector): """Set a vector for a word in the vocabulary. @@ -272,15 +283,19 @@ cdef class Vocab: RETURNS: None """ - raise NotImplementedError + if not isinstance(orth, basestring_): + orth = self.strings[orth] + self.vectors.add(orth, vector=vector) def has_vector(self, orth): """Check whether a word has a vector. Returns False if no vectors have been loaded. Words can be looked up by string or int ID.""" - return False + if isinstance(orth, basestring_): + orth = self.strings.add(orth) + return orth in self.vectors - def to_disk(self, path): + def to_disk(self, path, **exclude): """Save the current state to a directory. path (unicode or Path): A path to a directory, which will be created if @@ -292,8 +307,10 @@ cdef class Vocab: self.strings.to_disk(path / 'strings.json') with (path / 'lexemes.bin').open('wb') as file_: file_.write(self.lexemes_to_bytes()) + if self.vectors is not None: + self.vectors.to_disk(path) - def from_disk(self, path): + def from_disk(self, path, **exclude): """Loads state from a directory. Modifies the object in place and returns it. @@ -305,6 +322,9 @@ cdef class Vocab: self.strings.from_disk(path / 'strings.json') with (path / 'lexemes.bin').open('rb') as file_: self.lexemes_from_bytes(file_.read()) + if self.vectors is not None: + self.vectors.from_disk(path, exclude='strings.json') + link_vectors_to_models(self) return self def to_bytes(self, **exclude): @@ -313,9 +333,16 @@ cdef class Vocab: **exclude: Named attributes to prevent from being serialized. RETURNS (bytes): The serialized form of the `Vocab` object. """ + def deserialize_vectors(): + if self.vectors is None: + return None + else: + return self.vectors.to_bytes(exclude='strings.json') + getters = OrderedDict(( ('strings', lambda: self.strings.to_bytes()), ('lexemes', lambda: self.lexemes_to_bytes()), + ('vectors', deserialize_vectors) )) return util.to_bytes(getters, exclude) @@ -326,9 +353,15 @@ cdef class Vocab: **exclude: Named attributes to prevent from being loaded. RETURNS (Vocab): The `Vocab` object. """ + def serialize_vectors(b): + if self.vectors is None: + return None + else: + return self.vectors.from_bytes(b, exclude='strings') setters = OrderedDict(( ('strings', lambda b: self.strings.from_bytes(b)), ('lexemes', lambda b: self.lexemes_from_bytes(b)), + ('vectors', lambda b: serialize_vectors(b)) )) util.from_bytes(bytes_data, setters, exclude) return self @@ -405,6 +438,7 @@ def unpickle_vocab(sstore, morphology, data_dir, vocab.lex_attr_getters = lex_attr_getters vocab.lexemes_from_bytes(lexemes_data) vocab.length = length + link_vectors_to_models(vocab) return vocab diff --git a/travis.sh b/travis.sh index 67d413a1b..eed6a96f2 100755 --- a/travis.sh +++ b/travis.sh @@ -2,9 +2,8 @@ if [ "${VIA}" == "pypi" ]; then rm -rf * - pip install spacy - python -m spacy.en.download - python -m spacy.de.download + pip install spacy-nightly + python -m spacy download en fi if [[ "${VIA}" == "sdist" && "${TRAVIS_PULL_REQUEST}" == "false" ]]; then @@ -18,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + python setup.py build_ext --inplace pip install -e . fi diff --git a/website/404.jade b/website/404.jade index 33b936a08..af4e7d0f2 100644 --- a/website/404.jade +++ b/website/404.jade @@ -8,4 +8,5 @@ include _includes/_mixins | does not exist! h2.c-landing__title.u-heading-3.u-padding-small - a(href="javascript:history.go(-1)") Click here to go back. + +button(false, true, "secondary-light")(href="javascript:history.go(-1)") + | Click here to go back diff --git a/website/_data.json b/website/_data.json index 525c70d80..53543b2d0 100644 --- a/website/_data.json +++ b/website/_data.json @@ -3,24 +3,22 @@ "landing": true, "logos": [ { - "quora": [ "https://www.quora.com", 150 ], - "chartbeat": [ "https://chartbeat.com", 200 ], - "duedil": [ "https://www.duedil.com", 150 ], - "stitchfix": [ "https://www.stitchfix.com", 190 ] + "airbnb": [ "https://www.airbnb.com", 150, 45], + "quora": [ "https://www.quora.com", 120, 34 ], + "retriever": [ "https://www.retriever.no", 150, 33 ], + "stitchfix": [ "https://www.stitchfix.com", 150, 18 ] }, { - "wayblazer": [ "http://wayblazer.com", 200 ], - "indico": [ "https://indico.io", 150 ], - "chattermill": [ "https://chattermill.io", 175 ], - "turi": [ "https://turi.com", 150 ], - "kip": [ "http://kipthis.com", 70 ] - }, + "chartbeat": [ "https://chartbeat.com", 180, 25 ], + "allenai": [ "https://allenai.org", 220, 37 ] + } + ], + "features": [ { - "socrata": [ "https://www.socrata.com", 150 ], - "cytora": [ "http://www.cytora.com", 125 ], - "signaln": [ "http://signaln.com", 150 ], - "wonderflow": [ "http://www.wonderflow.co", 200 ], - "synapsify": [ "http://www.gosynapsify.com", 150 ] + "thoughtworks": ["https://www.thoughtworks.com/radar/tools", 150, 28], + "wapo": ["https://www.washingtonpost.com/news/wonk/wp/2016/05/18/googles-new-artificial-intelligence-cant-understand-these-sentences-can-you/", 100, 77], + "venturebeat": ["https://venturebeat.com/2017/01/27/4-ai-startups-that-analyze-customer-reviews/", 150, 19], + "microsoft": ["https://www.microsoft.com/developerblog/2016/09/13/training-a-classifier-for-relation-extraction-from-medical-literature/", 130, 28] } ] }, @@ -34,7 +32,24 @@ "landing": true }, - "announcement" : { - "title": "Important Announcement" + "styleguide": { + "title": "Styleguide", + "sidebar": { + "Styleguide": { "": "styleguide" }, + "Resources": { + "Website Source": "https://github.com/explosion/spacy/tree/master/website", + "Contributing Guide": "https://github.com/explosion/spaCy/blob/master/CONTRIBUTING.md" + } + }, + "menu": { + "Introduction": "intro", + "Logo": "logo", + "Colors": "colors", + "Typography": "typography", + "Elements": "elements", + "Components": "components", + "Embeds": "embeds", + "Markup Reference": "markup" + } } } diff --git a/website/_harp.json b/website/_harp.json index 1c27426f4..7c69beef0 100644 --- a/website/_harp.json +++ b/website/_harp.json @@ -11,12 +11,9 @@ "COMPANY": "Explosion AI", "COMPANY_URL": "https://explosion.ai", "DEMOS_URL": "https://demos.explosion.ai", + "MODELS_REPO": "explosion/spacy-models", - "SPACY_VERSION": "1.8", - "LATEST_NEWS": { - "url": "https://github.com/explosion/spaCy/releases/tag/v2.0.0-alpha", - "title": "Test spaCy v2.0.0 alpha!" - }, + "SPACY_VERSION": "2.0", "SOCIAL": { "twitter": "spacy_io", @@ -27,25 +24,23 @@ }, "NAVIGATION": { - "Home": "/", - "Usage": "/docs/usage", - "Reference": "/docs/api", - "Demos": "/docs/usage/showcase", - "Blog": "https://explosion.ai/blog" + "Usage": "/usage", + "Models": "/models", + "API": "/api" }, "FOOTER": { "spaCy": { - "Usage": "/docs/usage", - "API Reference": "/docs/api", - "Tutorials": "/docs/usage/tutorials", - "Showcase": "/docs/usage/showcase" + "Usage": "/usage", + "Models": "/models", + "API Reference": "/api", + "Resources": "/usage/resources" }, "Support": { "Issue Tracker": "https://github.com/explosion/spaCy/issues", "StackOverflow": "http://stackoverflow.com/questions/tagged/spacy", - "Reddit usergroup": "https://www.reddit.com/r/spacynlp/", - "Gitter chat": "https://gitter.im/explosion/spaCy" + "Reddit Usergroup": "https://www.reddit.com/r/spacynlp/", + "Gitter Chat": "https://gitter.im/explosion/spaCy" }, "Connect": { "Twitter": "https://twitter.com/spacy_io", @@ -74,21 +69,11 @@ {"id": "venv", "title": "virtualenv", "help": "Use a virtual environment and install spaCy into a user directory" }, {"id": "gpu", "title": "GPU", "help": "Run spaCy on GPU to make it faster. Requires an NVDIA graphics card with CUDA 2+. See section below for more info."}] }, - { "id": "model", "title": "Models", "multiple": true, "options": [ - { "id": "en", "title": "English", "meta": "50MB" }, - { "id": "de", "title": "German", "meta": "645MB" }, - { "id": "fr", "title": "French", "meta": "1.33GB" }, - { "id": "es", "title": "Spanish", "meta": "377MB"}] - } + { "id": "model", "title": "Models", "multiple": true } ], "QUICKSTART_MODELS": [ - { "id": "lang", "title": "Language", "options": [ - { "id": "en", "title": "English", "checked": true }, - { "id": "de", "title": "German" }, - { "id": "fr", "title": "French" }, - { "id": "es", "title": "Spanish" }] - }, + { "id": "lang", "title": "Language"}, { "id": "load", "title": "Loading style", "options": [ { "id": "spacy", "title": "Use spacy.load()", "checked": true, "help": "Use spaCy's built-in loader to load the model by name." }, { "id": "module", "title": "Import as module", "help": "Import the model explicitly as a Python module." }] @@ -98,50 +83,15 @@ } ], - "MODELS": { - "en": [ - { "id": "en_core_web_sm", "lang": "English", "feats": [1, 1, 1, 1], "size": "50 MB", "license": "CC BY-SA", "def": true }, - { "id": "en_core_web_md", "lang": "English", "feats": [1, 1, 1, 1], "size": "1 GB", "license": "CC BY-SA" }, - { "id": "en_depent_web_md", "lang": "English", "feats": [1, 1, 1, 0], "size": "328 MB", "license": "CC BY-SA" }, - { "id": "en_vectors_glove_md", "lang": "English", "feats": [1, 0, 0, 1], "size": "727 MB", "license": "CC BY-SA" } - ], - "de": [ - { "id": "de_core_news_md", "lang": "German", "feats": [1, 1, 1, 1], "size": "645 MB", "license": "CC BY-SA" } - ], - "fr": [ - { "id": "fr_depvec_web_lg", "lang": "French", "feats": [1, 1, 0, 1], "size": "1.33 GB", "license": "CC BY-NC" } - ], - "es": [ - { "id": "es_core_web_md", "lang": "Spanish", "feats": [1, 1, 1, 1], "size": "377 MB", "license": "CC BY-SA"} - ] - }, - - "EXAMPLE_SENTENCES": { - "en": "This is a sentence.", - "de": "Dies ist ein Satz.", - "fr": "C'est une phrase.", - "es": "Esto es una frase." - }, - "ALPHA": true, - "V_CSS": "1.6", - "V_JS": "1.2", + "V_CSS": "2.0a1", + "V_JS": "2.0a0", "DEFAULT_SYNTAX": "python", "ANALYTICS": "UA-58931649-1", "MAILCHIMP": { "user": "spacy.us12", "id": "83b0498b1e7fa3c91ce68c3f1", "list": "89ad33e698" - }, - "BADGES": { - "pipy": { - "badge": "https://img.shields.io/pypi/v/spacy.svg?style=flat-square", - "link": "https://pypi.python.org/pypi/spacy" - }, - "conda": { - "badge": "https://anaconda.org/conda-forge/spacy/badges/version.svg", - "link": "https://anaconda.org/conda-forge/spacy" - } } } } diff --git a/website/_includes/_footer.jade b/website/_includes/_footer.jade index e933f37a8..4d0d34cb5 100644 --- a/website/_includes/_footer.jade +++ b/website/_includes/_footer.jade @@ -1,8 +1,6 @@ //- 💫 INCLUDES > FOOTER -include _mixins - -footer.o-footer.u-text.u-border-dotted +footer.o-footer.u-text +grid.o-content each group, label in FOOTER +grid-col("quarter") @@ -13,18 +11,18 @@ footer.o-footer.u-text.u-border-dotted li +a(url)=item - if SECTION != "docs" + if SECTION == "index" +grid-col("quarter") include _newsletter - if SECTION == "docs" + if SECTION != "index" .o-content.o-block.u-border-dotted include _newsletter .o-inline-list.u-text-center.u-text-tiny.u-color-subtle span © 2016-#{new Date().getFullYear()} #[+a(COMPANY_URL, true)=COMPANY] - +a(COMPANY_URL, true) - +svg("graphics", "explosion", 45).o-icon.u-color-theme.u-grayscale + +a(COMPANY_URL, true)(aria-label="Explosion AI") + +icon("explosion", 45).o-icon.u-color-theme.u-grayscale +a(COMPANY_URL + "/legal", true) Legal / Imprint diff --git a/website/_includes/_functions.jade b/website/_includes/_functions.jade index e88e678cb..5209dbbec 100644 --- a/website/_includes/_functions.jade +++ b/website/_includes/_functions.jade @@ -1,35 +1,71 @@ //- 💫 INCLUDES > FUNCTIONS -//- More descriptive variables for current.path and current.source +//- Descriptive variables, available in the global scope - CURRENT = current.source - SECTION = current.path[0] -- SUBSECTION = current.path[1] +- LANGUAGES = public.models._data.LANGUAGES +- MODELS = public.models._data.MODELS +- CURRENT_MODELS = MODELS[current.source] || [] + +- MODEL_COUNT = Object.keys(MODELS).map(m => Object.keys(MODELS[m]).length).reduce((a, b) => a + b) +- MODEL_LANG_COUNT = Object.keys(MODELS).length +- LANG_COUNT = Object.keys(LANGUAGES).length + +- MODEL_META = public.models._data.MODEL_META +- MODEL_LICENSES = public.models._data.MODEL_LICENSES +- MODEL_ACCURACY = public.models._data.MODEL_ACCURACY +- EXAMPLE_SENTENCES = public.models._data.EXAMPLE_SENTENCES + +- IS_PAGE = (SECTION != "index") && !landing +- IS_MODELS = (SECTION == "models" && LANGUAGES[current.source]) +- HAS_MODELS = IS_MODELS && CURRENT_MODELS.length //- Add prefixes to items of an array (for modifier CSS classes) + array - [array] list of class names or options, e.g. ["foot"] + prefix - [string] prefix to add to each class, e.g. "c-table__row" + RETURNS - [array] list of modified class names - function prefixArgs(array, prefix) { -- return array.map(function(arg) { -- return prefix + '--' + arg; -- }).join(' '); +- return array.map(arg => prefix + '--' + arg).join(' '); +- } + + +//- Convert API paths (semi-temporary fix for renamed sections) + path - [string] link path supplied to +api mixin + RETURNS - [string] new link path to correct location + +- function convertAPIPath(path) { +- if (path.startsWith('spacy#') || path.startsWith('displacy#') || path.startsWith('util#')) { +- var comps = path.split('#'); +- return "top-level#" + comps[0] + '.' + comps[1]; +- } +- else if (path.startsWith('cli#')) { +- return "top-level#" + path.split('#')[1]; +- } +- return path; +- } + + +//- Get model components from ID. Components can then be looked up in LANGUAGES + and MODEL_META respectively, to get their human-readable form. + id - [string] model ID, e.g. "en_core_web_sm" + RETURNS - [object] object keyed by components lang, type, genre and size + +- function getModelComponents(id) { +- var comps = id.split('_'); +- return {'lang': comps[0], 'type': comps[1], 'genre': comps[2], 'size': comps[3]} - } //- Generate GitHub links + repo - [string] name of repo owned by explosion + filepath - [string] logical path to file relative to repository root + branch - [string] optional branch, defaults to "master" + RETURNS - [string] the correct link to the file on GitHub - function gh(repo, filepath, branch) { - var branch = ALPHA ? 'develop' : branch -- return 'https://github.com/' + SOCIAL.github + '/' + repo + (filepath ? '/blob/' + (branch || 'master') + '/' + filepath : '' ); -- } - - -//- Get social images - -- function getSocialImg() { -- var base = SITE_URL + '/assets/img/social/preview_' -- var image = ALPHA ? 'alpha' : 'default' -- if (preview) image = preview -- else if (SECTION == 'docs' && !ALPHA) image = 'docs' -- return base + image + '.jpg' +- return 'https://github.com/' + SOCIAL.github + '/' + (repo || '') + (filepath ? '/blob/' + (branch || 'master') + '/' + filepath : '' ); - } diff --git a/website/_includes/_mixins-base.jade b/website/_includes/_mixins-base.jade index 7534a6f4e..752423d79 100644 --- a/website/_includes/_mixins-base.jade +++ b/website/_includes/_mixins-base.jade @@ -1,5 +1,13 @@ //- 💫 MIXINS > BASE +//- Section + id - [string] anchor assigned to section (used for breadcrumb navigation) + +mixin section(id) + section.o-section(id="section-" + id data-section=id) + block + + //- Aside wrapper label - [string] aside label @@ -11,34 +19,26 @@ mixin aside-wrapper(label) block -//- Date - input - [string] date in the format YYYY-MM-DD -mixin date(input) - - var date = new Date(input) - - var months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ] - - time(datetime=JSON.parse(JSON.stringify(date)))&attributes(attributes)=months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear() - - -//- SVG from map - file - [string] SVG file name in /assets/img/ +//- SVG from map (uses embedded SVG sprite) name - [string] SVG symbol id width - [integer] width in px height - [integer] height in px (default: same as width) -mixin svg(file, name, width, height) +mixin svg(name, width, height) svg(aria-hidden="true" viewBox="0 0 #{width} #{height || width}" width=width height=(height || width))&attributes(attributes) - use(xlink:href="/assets/img/#{file}.svg##{name}") + use(xlink:href="#svg_#{name}") //- Icon - name - [string] icon name, should be SVG symbol ID - size - [integer] icon width and height (default: 20) + name - [string] icon name (will be used as symbol id: #svg_{name}) + width - [integer] icon width (default: 20) + height - [integer] icon height (defaults to width) -mixin icon(name, size) - - var size = size || 20 - +svg("icons", name, size).o-icon(style="min-width: #{size}px")&attributes(attributes) +mixin icon(name, width, height) + - var width = width || 20 + - var height = height || width + +svg(name, width, height).o-icon(style="min-width: #{width}px")&attributes(attributes) //- Pro/Con/Neutral icon @@ -46,8 +46,8 @@ mixin icon(name, size) size - [integer] icon size (optional) mixin procon(icon, size) - - colors = { pro: "green", con: "red", neutral: "yellow" } - +icon(icon, size)(class="u-color-#{colors[icon] || 'subtle'}" aria-label=icon)&attributes(attributes) + - colors = { pro: "green", con: "red", neutral: "subtle" } + +icon("circle", size || 16)(class="u-color-#{colors[icon] || 'subtle'}" aria-label=icon)&attributes(attributes) //- Headlines Helper Mixin @@ -80,8 +80,7 @@ mixin headline(level) mixin permalink(id) if id - a.u-permalink(id=id href="##{id}") - +icon("anchor").u-permalink__icon + a.u-permalink(href="##{id}") block else @@ -109,7 +108,7 @@ mixin quickstart(groups, headline, description, hide_results) .c-quickstart__fields for option in group.options input.c-quickstart__input(class="c-quickstart__input--" + (group.input_style ? group.input_style : group.multiple ? "check" : "radio") type=group.multiple ? "checkbox" : "radio" name=group.id id="qs-#{option.id}" value=option.id checked=option.checked) - label.c-quickstart__label(for="qs-#{option.id}")!=option.title + label.c-quickstart__label.u-text-tiny(for="qs-#{option.id}")!=option.title if option.meta | #[span.c-quickstart__label__meta (#{option.meta})] if option.help @@ -122,12 +121,10 @@ mixin quickstart(groups, headline, description, hide_results) code.c-code-block__content.c-quickstart__code(data-qs-results="") block - .c-quickstart__info.u-text-tiny.o-block.u-text-right - | Like this widget? Check out #[+a("https://github.com/ines/quickstart").u-link quickstart.js]! - //- Quickstart code item - data [object] - Rendering conditions (keyed by option group ID, value: option) + data - [object] Rendering conditions (keyed by option group ID, value: option) + style - [string] modifier ID for line style mixin qs(data, style) - args = {} @@ -148,6 +145,13 @@ mixin terminal(label) +code.x-terminal__code block +//- Chart.js + id - [string] chart ID, will be assigned as #chart_{id} + +mixin chart(id) + figure.o-block&attributes(attributes) + canvas(id="chart_#{id}" width="800" height="400" style="max-width: 100%") + //- Gitter chat button and widget button - [string] text shown on button @@ -156,26 +160,24 @@ mixin terminal(label) mixin gitter(button, label) aside.js-gitter.c-chat.is-collapsed(data-title=(label || button)) - button.js-gitter-button.c-chat__button.u-text-small - +icon("chat").o-icon--inline + button.js-gitter-button.c-chat__button.u-text-tag + +icon("chat", 16).o-icon--inline !=button //- Badge - name - [string] "pipy" or "conda" + image - [string] path to badge image + url - [string] badge link -mixin badge(name) - - site = BADGES[name] - - if site - +a(site.link).u-padding-small - img(src=site.badge alt="{name} version" height="20") +mixin badge(image, url) + +a(url).u-padding-small.u-hide-link&attributes(attributes) + img.o-badge(src=image alt=url height="20") -//- Logo +//- spaCy logo mixin logo() - +svg("graphics", "spacy", 675, 215).o-logo&attributes(attributes) + +svg("spacy", 675, 215).o-logo&attributes(attributes) //- Landing @@ -186,18 +188,56 @@ mixin landing-header() .c-landing__content block +mixin landing-banner(headline, label) + .c-landing__banner.u-padding.o-block.u-color-light + +grid.c-landing__banner__content.o-no-block + +grid-col("third") + h3.u-heading.u-heading-1 + if label + div + span.u-text-label.u-text-label--light=label + !=headline -mixin landing-badge(url, graphic, alt, size) - +a(url)(aria-label=alt title=alt).c-landing__badge - +svg("graphics", graphic, size || 225) + +grid-col("two-thirds").c-landing__banner__text + block + + +mixin landing-logos(title, logos) + .o-content.u-text-center&attributes(attributes) + h3.u-heading.u-text-label.u-color-dark=title + + each row, i in logos + - var is_last = i == logos.length - 1 + +grid("center").o-inline-list.o-no-block(class=is_last ? "o-no-block" : null) + each details, name in row + +a(details[0]).u-padding-medium + +icon(name, details[1], details[2]) + + if is_last + block //- Under construction (temporary) Marks sections that still need to be completed for the v2.0 release. mixin under-construction() - +infobox("🚧 Under construction") + +infobox("Under construction", "🚧") | This section is still being written and will be updated for the v2.0 | release. Is there anything that you think should definitely mentioned or | explained here? Any examples you'd like to see? #[strong Let us know] | on the #[+a(gh("spacy") + "/issues/1105") v2.0 alpha thread] on GitHub! + + +//- Alpha infobox (temporary) + Added in the templates to notify user that they're visiting the alpha site. + +mixin alpha-info() + +infobox("You are viewing the spaCy v2.0.0 alpha docs", "⚠️") + strong This page is part of the alpha documentation for spaCy v2.0. + | It does not reflect the state of the latest stable release. + | Because v2.0 is still under development, the implementation + | may differ from the intended state described here. See the + | #[+a(gh("spaCy") + "/releases/tag/v2.0.0-alpha") release notes] + | for details on how to install and test the new version. To + | read the official docs for spaCy v1.x, + | #[+a("https://spacy.io/docs") go here]. diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade index 16514bcda..414ee809e 100644 --- a/website/_includes/_mixins.jade +++ b/website/_includes/_mixins.jade @@ -8,11 +8,15 @@ include _mixins-base level - [integer] headline level, corresponds to h1, h2, h3 etc. id - [string] unique identifier, creates permalink (optional) -mixin h(level, id) - +headline(level).u-heading&attributes(attributes) +mixin h(level, id, source) + +headline(level).u-heading(id=id)&attributes(attributes) +permalink(id) block + if source + +button(gh("spacy", source), false, "secondary", "small").u-nowrap.u-float-right + span Source #[+icon("code", 14).o-icon--inline] + //- External links url - [string] link href @@ -38,21 +42,23 @@ mixin src(url) //- API link (with added tag and automatically generated path) - path - [string] path to API docs page relative to /docs/api/ + path - [string] path to API docs page relative to /api/ mixin api(path) - +a("/docs/api/" + path, true)(target="_self").u-no-border.u-inline-block.u-nowrap + - path = convertAPIPath(path) + +a("/api/" + path, true)(target="_self").u-no-border.u-inline-block.u-nowrap block - | #[+icon("book", 18).o-icon--inline.u-color-theme] + | #[+icon("book", 16).o-icon--inline.u-color-theme] //- Help icon with tooltip - tooltip - [string] Tooltip text + tooltip - [string] Tooltip text + icon_size - [integer] Optional size of help icon in px. -mixin help(tooltip) +mixin help(tooltip, icon_size) span(data-tooltip=tooltip)&attributes(attributes) - +icon("help", 16).i-icon--inline + +icon("help", icon_size || 16).o-icon--inline //- Aside for text @@ -68,24 +74,43 @@ mixin aside(label) label - [string] aside title (optional or false for no label) language - [string] language for syntax highlighting (default: "python") supports basic relevant languages available for PrismJS + prompt - [string] prompt displayed before first line, e.g. "$" -mixin aside-code(label, language) +mixin aside-code(label, language, prompt) +aside-wrapper(label) - +code(false, language).o-no-block + +code(false, language, prompt).o-no-block block //- Infobox label - [string] infobox title (optional or false for no title) + emoji - [string] optional emoji displayed before the title, necessary as + argument to be able to wrap it for spacing -mixin infobox(label) +mixin infobox(label, emoji) aside.o-box.o-block.u-text-small if label - h3.u-text-label.u-color-theme=label + h3.u-heading.u-text-label.u-color-theme + if emoji + span.o-emoji=emoji + | #{label} block +//- Logos displayed in the top corner of some infoboxes + logos - [array] List of icon ID, width, height and link. + +mixin infobox-logos(...logos) + .o-box__logos.u-text-right.u-float-right + for logo in logos + if logo[3] + | #[+a(logo[3]).u-inline-block.u-hide-link.u-padding-small #[+icon(logo[0], logo[1], logo[2]).u-color-dark]] + else + | #[+icon(logo[0], logo[1], logo[2]).u-color-dark] + + + //- Link button url - [string] link href trusted - [boolean] if not set / false, rel="noopener nofollow" is added @@ -94,7 +119,7 @@ mixin infobox(label) see assets/css/_components/_buttons.sass mixin button(url, trusted, ...style) - - external = url.includes("http") + - external = url && url.includes("http") a.c-button.u-text-label(href=url class=prefixArgs(style, "c-button") role="button" target=external ? "_blank" : null rel=external && !trusted ? "noopener nofollow" : null)&attributes(attributes) block @@ -103,31 +128,37 @@ mixin button(url, trusted, ...style) label - [string] aside title (optional or false for no label) language - [string] language for syntax highlighting (default: "python") supports basic relevant languages available for PrismJS - icon - [string] icon to display next to code block, mostly used for old/new + prompt - [string] prompt displayed before first line, e.g. "$" height - [integer] optional height to clip code block to + icon - [string] icon displayed next to code block (e.g. "accept" for new code) + wrap - [boolean] wrap text and disable horizontal scrolling -mixin code(label, language, icon, height) +mixin code(label, language, prompt, height, icon, wrap) pre.c-code-block.o-block(class="lang-#{(language || DEFAULT_SYNTAX)}" class=icon ? "c-code-block--has-icon" : null style=height ? "height: #{height}px" : null)&attributes(attributes) if label h4.u-text-label.u-text-label--dark=label - + - var icon = icon || (prompt == 'accept' || prompt == 'reject') if icon - var classes = {'accept': 'u-color-green', 'reject': 'u-color-red'} .c-code-block__icon(class=classes[icon] || null class=classes[icon] ? "c-code-block__icon--border" : null) +icon(icon, 18) - code.c-code-block__content + code.c-code-block__content(class=wrap ? "u-wrap" : null data-prompt=icon ? null : prompt) block //- Code blocks to display old/new versions +mixin code-wrapper() + span.u-inline-block.u-padding-top.u-width-full + block + mixin code-old() - +code(false, false, "reject").o-block-small + +code(false, false, false, false, "reject").o-block-small block mixin code-new() - +code(false, false, "accept").o-block-small + +code(false, false, false, false, "accept").o-block-small block @@ -138,12 +169,33 @@ mixin code-new() mixin codepen(slug, height, default_tab) figure.o-block(style="min-height: #{height}px")&attributes(attributes) - .codepen(data-height=height data-theme-id="26467" data-slug-hash=slug data-default-tab=(default_tab || "result") data-embed-version="2" data-user=SOCIAL.codepen) + .codepen(data-height=height data-theme-id="31335" data-slug-hash=slug data-default-tab=(default_tab || "result") data-embed-version="2" data-user=SOCIAL.codepen) +a("https://codepen.io/" + SOCIAL.codepen + "/" + slug) View on CodePen script(async src="https://assets.codepen.io/assets/embed/ei.js") +//- GitHub embed + repo - [string] repository owned by explosion organization + file - [string] logical path to file, relative to repository root + alt_file - [string] alternative file path used in footer and link button + height - [integer] height of code preview in px + +mixin github(repo, file, alt_file, height) + - var branch = ALPHA ? "develop" : "master" + - var height = height || 250 + + figure.o-block + pre.c-code-block.o-block-small(class="lang-#{(language || DEFAULT_SYNTAX)}" style="height: #{height}px; min-height: #{height}px") + code.c-code-block__content(data-gh-embed="#{repo}/#{branch}/#{file}") + + footer.o-grid.u-text + .o-block-small.u-flex-full.u-padding-small #[+icon("github")] #[code.u-break.u-break--all=repo + '/' + (alt_file || file)] + div + +button(gh(repo, alt_file || file), false, "primary", "small") View on GitHub + + + //- Images / figures url - [string] url or path to image width - [integer] image width in px, for better rendering (default: 500) @@ -168,10 +220,26 @@ mixin image-caption() block -//- Label +//- Graphic or illustration with button + original - [string] Path to original image + +mixin graphic(original) + +image + block + if original + .u-text-right + +button(original, false, "secondary", "small") View large graphic + + +//- Labels mixin label() - .u-text-label.u-color-subtle&attributes(attributes) + .u-text-label.u-color-dark&attributes(attributes) + block + + +mixin label-inline() + strong.u-text-label.u-color-dark&attributes(attributes) block @@ -188,8 +256,10 @@ mixin tag() mixin tag-model(...capabs) - var intro = "To use this functionality, spaCy needs a model to be installed" - var ext = capabs.length ? " that supports the following capabilities: " + capabs.join(', ') : "" - +tag Requires model - +help(intro + ext + ".").u-color-theme + + span.u-nowrap + +tag Needs model + +help(intro + ext + ".").u-color-theme //- "New" tag to label features new in a specific version @@ -219,15 +289,9 @@ mixin list(type, start) //- List item (only used within +list) -mixin item(procon) - if procon - li&attributes(attributes) - +procon(procon).c-list__icon - block - - else - li.c-list__item&attributes(attributes) - block +mixin item() + li.c-list__item&attributes(attributes) + block //- Table @@ -237,9 +301,9 @@ mixin table(head) table.c-table.o-block&attributes(attributes) if head - +row + +row("head") each column in head - th.c-table__head-cell.u-text-label=column + +head-cell=column block @@ -251,10 +315,11 @@ mixin row(...style) block -//- Footer table row (only ued within +table) -mixin footrow() - tr.c-table__row.c-table__row--foot&attributes(attributes) +//- Header table cell (only used within +row) + +mixin head-cell() + th.c-table__head-cell.u-text-label&attributes(attributes) block @@ -284,71 +349,58 @@ mixin grid-col(width) //- Card (only used within +grid) - title - [string] card title - details - [object] url, image, author, description, tags etc. - (see /docs/usage/_data.json) + title - [string] card title + url - [string] link for card + author - [string] optional author, displayed as byline at the bottom + icon - [string] optional ID of icon displayed with card + width - [string] optional width of grid column, defaults to "half" -mixin card(title, details) - +grid-col("half").o-card.u-text&attributes(attributes) - if details.image - +a(details.url).o-block-small - img(src=details.image alt=title width="300" role="presentation") - - if title - +a(details.url) - +h(3)=title - - if details.author - .u-text-small.u-color-subtle by #{details.author} - - if details.description || details.tags - ul - if details.description - li=details.description - - if details.tags - li - each tag in details.tags - span.u-text-tag #{tag} - |   - - block +mixin card(title, url, author, icon, width) + +grid-col(width || "half").o-box.o-grid.o-grid--space.u-text&attributes(attributes) + +a(url) + h4.u-heading.u-text-label + if icon + +icon(icon, 25).u-float-right + if title + span.u-color-dark=title + .o-block-small.u-text-small + block + if author + .u-color-subtle.u-text-tiny by #{author} -//- Simpler card list item (only used within +list) - title - [string] card title - details - [object] url, image, author, description, tags etc. - (see /docs/usage/_data.json) +//- Table of contents, to be used with +item mixins for links + col - [string] width of column (see +grid-col) -mixin card-item(title, details) - +item&attributes(attributes) - +a(details.url)=title - - if details.description - br - span=details.description - - if details.author - br - span.u-text-small.u-color-subtle by #{details.author} +mixin table-of-contents(col) + +grid-col(col || "half") + +infobox + +label.o-block-small Table of contents + +list("numbers").u-text-small.o-no-block + block -//- Table row for models table +//- Bibliography + id - [string] ID of bibliography component, for anchor links. Can be used if + there's more than one bibliography on one page. -mixin model-row(name, lang, procon, size, license, default_model, divider) - - var licenses = { "CC BY-SA": "https://creativecommons.org/licenses/by-sa/3.0/", "CC BY-NC": "https://creativecommons.org/licenses/by-nc/3.0/" } +mixin bibliography(id) + section(id=id || "bibliography") + +infobox + +label.o-block-small Bibliography + +list("numbers").u-text-small.o-no-block + block - +row(divider ? "divider": null) - +cell #[code=name] - if default_model - | #[span.u-color-theme(title="default model") #[+icon("star", 16)]] - +cell=lang - each icon in procon - +cell.u-text-center #[+procon(icon ? "pro" : "con")] - +cell.u-text-right=size - +cell - if license in licenses - +a(licenses[license])=license + +//- Footnote + id - [string / integer] ID of footnote. + bib_id - [string] ID of bibliography component, defaults to "bibliography". + tooltip - [string] optional text displayed as tooltip + +mixin fn(id, bib_id, tooltip) + sup.u-padding-small(id="bib" + id data-tooltip=tooltip) + span.u-text-tag + +a("#" + (bib_id || "bibliography")).u-hide-link #{id} //- Table rows for annotation specs @@ -383,14 +435,3 @@ mixin annotation-row(annots, style) else +cell=cell block - - -//- Table of contents, to be used with +item mixins for links - col - [string] width of column (see +grid-col) - -mixin table-of-contents(col) - +grid-col(col || "half") - +infobox - +label.o-block-small Table of contents - +list("numbers").u-text-small.o-no-block - block diff --git a/website/_includes/_navigation.jade b/website/_includes/_navigation.jade index f113ca3f4..c7f2c956f 100644 --- a/website/_includes/_navigation.jade +++ b/website/_includes/_navigation.jade @@ -1,19 +1,15 @@ //- 💫 INCLUDES > TOP NAVIGATION -include _mixins - nav.c-nav.u-text.js-nav(class=landing ? "c-nav--theme" : null) - a(href='/') #[+logo] - - if SUBSECTION != "index" - .u-text-label.u-padding-small.u-hidden-xs=SUBSECTION + a(href="/" aria-label=SITENAME) #[+logo] ul.c-nav__menu - - var NAV = ALPHA ? { "Usage": "/docs/usage", "Reference": "/docs/api" } : NAVIGATION - - each url, item in NAV - li.c-nav__menu__item(class=(url == "/") ? "u-hidden-xs" : null) + - var current_url = '/' + current.path[0] + each url, item in NAVIGATION + li.c-nav__menu__item(class=(current_url == url) ? "is-active" : null) +a(url)=item - li.c-nav__menu__item - +a(gh("spaCy"))(aria-label="GitHub").u-hidden-xs #[+icon("github", 20)] + li.c-nav__menu__item.u-hidden-xs + +a(gh("spaCy"))(aria-label="GitHub") #[+icon("github", 20)] + + progress.c-progress.js-progress(value="0" max="1") diff --git a/website/_includes/_newsletter.jade b/website/_includes/_newsletter.jade index 9bfe88d39..ca8333f86 100644 --- a/website/_includes/_newsletter.jade +++ b/website/_includes/_newsletter.jade @@ -1,6 +1,6 @@ //- 💫 INCLUDES > NEWSLETTER -ul.o-block +ul.o-block-small li.u-text-label.u-color-subtle Stay in the loop! li Receive updates about new releases, tutorials and more. @@ -10,7 +10,6 @@ form.o-grid#mc-embedded-subscribe-form(action="//#{MAILCHIMP.user}.list-manage.c div(style="position: absolute; left: -5000px;" aria-hidden="true") input(type="text" name="b_#{MAILCHIMP.id}_#{MAILCHIMP.list}" tabindex="-1" value="") - .o-grid-col.u-border.u-padding-small - input#mce-EMAIL.u-text(type="email" name="EMAIL" placeholder="Your email") - - button#mc-embedded-subscribe.u-text-label.u-color-theme(type="submit" name="subscribe") Sign up + .o-grid-col.o-grid.o-grid--nowrap.o-field.u-padding-small + input#mce-EMAIL.o-field__input.u-text(type="email" name="EMAIL" placeholder="Your email" aria-label="Your email") + button#mc-embedded-subscribe.o-field__button.u-text-label.u-color-theme.u-nowrap(type="submit" name="subscribe") Sign up diff --git a/website/_includes/_page-docs.jade b/website/_includes/_page-docs.jade index 7afbc6bdc..703102487 100644 --- a/website/_includes/_page-docs.jade +++ b/website/_includes/_page-docs.jade @@ -1,47 +1,56 @@ //- 💫 INCLUDES > DOCS PAGE TEMPLATE -- sidebar_content = (SUBSECTION != "index") ? public.docs[SUBSECTION]._data.sidebar : public.docs._data.sidebar || FOOTER +- sidebar_content = (public[SECTION] ? public[SECTION]._data.sidebar : public._data[SECTION] ? public._data[SECTION].sidebar : false) || FOOTER include _sidebar main.o-main.o-main--sidebar.o-main--aside article.o-content +grid.o-no-block - +grid-col(source ? "two-thirds" : "full") - +h(1)=title - if tag - +tag=tag + +h(1).u-heading--title=title.replace("'", "’") + if tag + +tag=tag + if tag_new + +tag-new(tag_new) + + if teaser + .u-heading__teaser.u-text-small.u-color-dark=teaser + else if IS_MODELS + .u-heading__teaser.u-text-small.u-color-dark + | Available statistical models for + | #[code=current.source] (#{LANGUAGES[current.source]}). if source - +grid-col("third").u-text-right - .o-inline-list - +button(gh("spacy", source), false, "secondary").u-text-tag Source #[+icon("code", 14)] + .o-block.u-text-right + +button(gh("spacy", source), false, "secondary", "small").u-nowrap + | Source #[+icon("code", 14)] + //-if ALPHA + //- +alpha-info - if ALPHA - +infobox("⚠️ You are viewing the spaCy v2.0.0 alpha docs") - strong This page is part of the alpha documentation for spaCy v2.0. - | It does not reflect the state of the latest stable release. - | Because v2.0 is still under development, the implementation - | may differ from the intended state described here. See the - | #[+a(gh("spaCy") + "/releases/tag/v2.0.0-alpha") release notes] - | for details on how to install and test the new version. To - | read the official docs for spaCy v1.x, - | #[+a("https://spacy.io/docs") go here]. - - !=yield + if IS_MODELS + include _page_models + else + !=yield +grid.o-content.u-text +grid-col("half") - if next && public.docs[SUBSECTION]._data[next] - - data = public.docs[SUBSECTION]._data[next] - + if !IS_MODELS .o-inline-list - span #[strong.u-text-label Read next:] #[+a(next).u-link=data.title] + +button(gh("spacy", "website/" + current.path.join('/') + ".jade"), false, "secondary", "small") + | #[span.o-icon Suggest edits] #[+icon("code", 14)] +grid-col("half").u-text-right - .o-inline-list - +button(gh("spacy", "website/" + current.path.join('/') + ".jade"), false, "secondary").u-text-tag Suggest edits #[+icon("code", 14)] + if next && public[SECTION]._data[next] + - data = public[SECTION]._data[next] + + +grid("vcenter") + +a(next).u-text-small.u-flex-full + h4.u-text-label.u-color-dark Read next + | #{data.title} + + +a(next).c-icon-button.c-icon-button--right(aria-hidden="true") + +icon("arrow-right", 24) +gitter("spaCy chat") diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade new file mode 100644 index 000000000..c5bd799f0 --- /dev/null +++ b/website/_includes/_page_models.jade @@ -0,0 +1,77 @@ +//- 💫 INCLUDES > MODELS PAGE TEMPLATE + +for id in CURRENT_MODELS + +section(id) + +grid("vcenter").o-no-block(id=id) + +grid-col("two-thirds") + +h(2) + +a("#" + id).u-permalink=id + + +grid-col("third").u-text-right + .u-color-subtle.u-text-tiny + +button(gh("spacy-models") + "/releases", true, "secondary", "small")(data-tpl=id data-tpl-key="download") + | Release details + .u-padding-small Latest: #[code(data-tpl=id data-tpl-key="version") n/a] + + +aside-code("Installation", "bash", "$"). + spacy download #{id} + + - var comps = getModelComponents(id) + + p(data-tpl=id data-tpl-key="description") + + div(data-tpl=id data-tpl-key="error" style="display: none") + +infobox + | Unable to load model details from GitHub. To find out more + | about this model, see the overview of the + | #[+a(gh("spacy-models") + "/releases") latest model releases]. + + +table(data-tpl=id data-tpl-key="table") + +row + +cell #[+label Language] + +cell #[+tag=comps.lang] #{LANGUAGES[comps.lang]} + for comp, label in {"Type": comps.type, "Genre": comps.genre} + +row + +cell #[+label=label] + +cell #[+tag=comp] #{MODEL_META[comp]} + +row + +cell #[+label Size] + +cell #[+tag=comps.size] #[span(data-tpl=id data-tpl-key="size") #[em n/a]] + + each label in ["Pipeline", "Sources", "Author", "License"] + - var field = label.toLowerCase() + +row + +cell.u-nowrap + +label=label + if MODEL_META[field] + | #[+help(MODEL_META[field]).u-color-subtle] + +cell + span(data-tpl=id data-tpl-key=field) #[em n/a] + + +row(data-tpl=id data-tpl-key="compat-wrapper" style="display: none") + +cell + +label Compat #[+help("Latest compatible model version for your spaCy installation").u-color-subtle] + +cell + .o-field.u-float-left + select.o-field__select.u-text-small(data-tpl=id data-tpl-key="compat") + .o-empty(data-tpl=id data-tpl-key="compat-versions")   + + section(data-tpl=id data-tpl-key="accuracy-wrapper" style="display: none") + +grid.o-no-block + +grid-col("third") + +h(4) Accuracy + +table.o-block-small + for label, field in MODEL_ACCURACY + +row(style="display: none") + +cell.u-nowrap + +label=label + if MODEL_META[field] + | #[+help(MODEL_META[field]).u-color-subtle] + +cell.u-text-right(data-tpl=id data-tpl-key=field) + | n/a + + +grid-col("two-thirds") + +h(4) Comparison + +chart(id).u-padding-small + + p.u-text-small.u-color-dark(data-tpl=id data-tpl-key="notes") diff --git a/website/_includes/_scripts.jade b/website/_includes/_scripts.jade index e5a863787..4bb4d87ef 100644 --- a/website/_includes/_scripts.jade +++ b/website/_includes/_scripts.jade @@ -1,27 +1,46 @@ //- 💫 INCLUDES > SCRIPTS -script(src="/assets/js/main.js?v#{V_JS}") -script(src="/assets/js/prism.js") +if quickstart + script(src="/assets/js/quickstart.min.js") -if SECTION == "docs" - if quickstart - script(src="/assets/js/quickstart.js") - script var qs = new Quickstart("#qs") +if IS_PAGE + script(src="/assets/js/in-view.min.js") - script. - ((window.gitter = {}).chat = {}).options = { - useStyles: false, - activationElement: '.js-gitter-button', - targetElement: '.js-gitter', - room: '!{SOCIAL.gitter}' - }; - - script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer) +if HAS_MODELS + script(src="/assets/js/chart.min.js") if environment == "deploy" - script + script(async src="https://www.google-analytics.com/analytics.js") + +script(src="/assets/js/prism.min.js") +script(src="/assets/js/main.js?v#{V_JS}") + +script + | new ProgressBar('.js-progress'); + + if changelog + | new Changelog('!{SOCIAL.github}', 'spacy'); + + if quickstart + | new Quickstart("#qs"); + + if IS_PAGE + | new SectionHighlighter('data-section', 'data-nav'); + | new GitHubEmbed('!{SOCIAL.github}', 'data-gh-embed'); + | ((window.gitter = {}).chat = {}).options = { + | useStyles: false, + | activationElement: '.js-gitter-button', + | targetElement: '.js-gitter', + | room: '!{SOCIAL.gitter}' + | }; + + if HAS_MODELS + | new ModelLoader('!{MODELS_REPO}', !{JSON.stringify(CURRENT_MODELS)}, !{JSON.stringify(MODEL_LICENSES)}, !{JSON.stringify(MODEL_ACCURACY)}); + + if environment == "deploy" | window.ga=window.ga||function(){ | (ga.q=ga.q||[]).push(arguments)}; ga.l=+new Date; | ga('create', '#{ANALYTICS}', 'auto'); ga('send', 'pageview'); - script(async src="https://www.google-analytics.com/analytics.js") +if IS_PAGE + script(src="https://sidecar.gitter.im/dist/sidecar.v1.js" async defer) diff --git a/website/_includes/_sidebar.jade b/website/_includes/_sidebar.jade index 241a77132..1bca2cb80 100644 --- a/website/_includes/_sidebar.jade +++ b/website/_includes/_sidebar.jade @@ -1,13 +1,23 @@ //- 💫 INCLUDES > SIDEBAR -include _mixins - menu.c-sidebar.js-sidebar.u-text if sidebar_content - each items, menu in sidebar_content - ul.c-sidebar__section.o-block - li.u-text-label.u-color-subtle=menu + each items, sectiontitle in sidebar_content + ul.c-sidebar__section.o-block-small + li.u-text-label.u-color-dark=sectiontitle each url, item in items - li(class=(CURRENT == url || (CURRENT == "index" && url == "./")) ? "is-active" : null) - +a(url)=item + - var is_current = CURRENT == url || (CURRENT == "index" && url == "./") + li.c-sidebar__item + +a(url)(class=is_current ? "is-active" : null)=item + + if is_current + if IS_MODELS && CURRENT_MODELS.length + - menu = Object.assign({}, ...CURRENT_MODELS.map(id => ({ [id]: id }))) + if menu + ul.c-sidebar__crumb.u-hidden-sm + - var counter = 0 + for id, title in menu + - counter++ + li.c-sidebar__crumb__item(data-nav=id class=(counter == 1) ? "is-active" : null) + +a("#section-" + id)=title diff --git a/website/_includes/_svg.jade b/website/_includes/_svg.jade new file mode 100644 index 000000000..f9d7a2b53 --- /dev/null +++ b/website/_includes/_svg.jade @@ -0,0 +1,157 @@ +//- 💫 INCLUDES > SVG + +svg(style="position: absolute; visibility: hidden; width: 0; height: 0;" width="0" height="0" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink") + defs + //- UI icons + + symbol#svg_github(viewBox="0 0 27 32") + path(d="M13.714 2.286q3.732 0 6.884 1.839t4.991 4.991 1.839 6.884q0 4.482-2.616 8.063t-6.759 4.955q-0.482 0.089-0.714-0.125t-0.232-0.536q0-0.054 0.009-1.366t0.009-2.402q0-1.732-0.929-2.536 1.018-0.107 1.83-0.321t1.679-0.696 1.446-1.188 0.946-1.875 0.366-2.688q0-2.125-1.411-3.679 0.661-1.625-0.143-3.643-0.5-0.161-1.446 0.196t-1.643 0.786l-0.679 0.429q-1.661-0.464-3.429-0.464t-3.429 0.464q-0.286-0.196-0.759-0.482t-1.491-0.688-1.518-0.241q-0.804 2.018-0.143 3.643-1.411 1.554-1.411 3.679 0 1.518 0.366 2.679t0.938 1.875 1.438 1.196 1.679 0.696 1.83 0.321q-0.696 0.643-0.875 1.839-0.375 0.179-0.804 0.268t-1.018 0.089-1.17-0.384-0.991-1.116q-0.339-0.571-0.866-0.929t-0.884-0.429l-0.357-0.054q-0.375 0-0.518 0.080t-0.089 0.205 0.161 0.25 0.232 0.214l0.125 0.089q0.393 0.179 0.777 0.679t0.563 0.911l0.179 0.411q0.232 0.679 0.786 1.098t1.196 0.536 1.241 0.125 0.991-0.063l0.411-0.071q0 0.679 0.009 1.58t0.009 0.973q0 0.321-0.232 0.536t-0.714 0.125q-4.143-1.375-6.759-4.955t-2.616-8.063q0-3.732 1.839-6.884t4.991-4.991 6.884-1.839zM5.196 21.982q0.054-0.125-0.125-0.214-0.179-0.054-0.232 0.036-0.054 0.125 0.125 0.214 0.161 0.107 0.232-0.036zM5.75 22.589q0.125-0.089-0.036-0.286-0.179-0.161-0.286-0.054-0.125 0.089 0.036 0.286 0.179 0.179 0.286 0.054zM6.286 23.393q0.161-0.125 0-0.339-0.143-0.232-0.304-0.107-0.161 0.089 0 0.321t0.304 0.125zM7.036 24.143q0.143-0.143-0.071-0.339-0.214-0.214-0.357-0.054-0.161 0.143 0.071 0.339 0.214 0.214 0.357 0.054zM8.054 24.589q0.054-0.196-0.232-0.286-0.268-0.071-0.339 0.125t0.232 0.268q0.268 0.107 0.339-0.107zM9.179 24.679q0-0.232-0.304-0.196-0.286 0-0.286 0.196 0 0.232 0.304 0.196 0.286 0 0.286-0.196zM10.214 24.5q-0.036-0.196-0.321-0.161-0.286 0.054-0.25 0.268t0.321 0.143 0.25-0.25z") + + symbol#svg_code(viewBox="0 0 20 20") + path(d="M5.719 14.75c-0.236 0-0.474-0.083-0.664-0.252l-5.060-4.498 5.341-4.748c0.412-0.365 1.044-0.33 1.411 0.083s0.33 1.045-0.083 1.412l-3.659 3.253 3.378 3.002c0.413 0.367 0.45 0.999 0.083 1.412-0.197 0.223-0.472 0.336-0.747 0.336zM14.664 14.748l5.341-4.748-5.060-4.498c-0.413-0.367-1.045-0.33-1.411 0.083s-0.33 1.045 0.083 1.412l3.378 3.003-3.659 3.252c-0.413 0.367-0.45 0.999-0.083 1.412 0.197 0.223 0.472 0.336 0.747 0.336 0.236 0 0.474-0.083 0.664-0.252zM9.986 16.165l2-12c0.091-0.545-0.277-1.060-0.822-1.151-0.547-0.092-1.061 0.277-1.15 0.822l-2 12c-0.091 0.545 0.277 1.060 0.822 1.151 0.056 0.009 0.11 0.013 0.165 0.013 0.48 0 0.904-0.347 0.985-0.835z") + + symbol#svg_arrow-right(viewBox="0 0 24 24") + path(d="M20.744 12.669c0 0 0 0 0 0 0.006-0.006 0.006-0.006 0.006-0.006s0 0 0 0 0.006-0.006 0.006-0.006c0 0 0.006-0.006 0.006-0.006s0 0 0 0 0.006-0.006 0.006-0.006c0 0 0 0 0 0 0.063-0.075 0.112-0.156 0.15-0.244 0 0 0 0 0-0.006 0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0 0 0 0 0.038-0.094 0.063-0.194 0.069-0.3 0 0 0 0 0 0s0-0.006 0-0.006c0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0-0.006 0-0.006s0 0 0-0.006c0-0.025 0-0.050 0-0.075 0 0 0 0 0-0.006 0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0-0.006 0-0.006s0-0.006 0-0.006c0 0 0 0 0 0-0.006-0.106-0.031-0.206-0.069-0.3 0 0 0 0 0-0.006 0 0 0 0 0-0.006 0 0 0-0.006-0.006-0.006 0 0 0 0 0 0-0.038-0.094-0.094-0.175-0.156-0.256 0 0 0 0 0 0s-0.006-0.006-0.006-0.006c0 0 0 0 0 0s-0.006-0.006-0.006-0.006-0.006-0.006-0.006-0.006 0 0 0-0.006c-0.012-0.012-0.025-0.025-0.037-0.037l-6-6c-0.387-0.387-1.025-0.387-1.413 0s-0.387 1.025 0 1.413l4.294 4.294h-13.581c-0.55 0-1 0.45-1 1s0.45 1 1 1h13.587l-4.294 4.294c-0.387 0.387-0.387 1.025 0 1.413 0.194 0.194 0.45 0.294 0.706 0.294s0.513-0.1 0.706-0.294l5.994-5.994c0.019-0.025 0.031-0.044 0.044-0.056z") + + symbol#svg_book(viewBox="0 0 20 20") + path(d="M15.5 11h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM15.5 7h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM10.5 15h-6c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h6c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5zM15.5 3h-11c-0.275 0-0.5 0.225-0.5 0.5v1c0 0.276 0.225 0.5 0.5 0.5h11c0.276 0 0.5-0.224 0.5-0.5v-1c0-0.275-0.224-0.5-0.5-0.5z") + + symbol#svg_circle(viewBox="0 0 18 18") + ellipse(rx="9" ry="9" cx="9" cy="9") + + symbol#svg_chat(viewBox="0 0 30 30") + path(d="M28.74 25.2c-1.73-.3-3.77-1.46-4.74-3.6 3.64-2.2 6-5.68 6-9.6 0-6.63-6.72-12-15-12S0 5.37 0 12s6.72 12 15 12c1.1 0 2.2-.1 3.23-.3 2.86 2 6.25 2.62 10.4 2.15.26-.02.37-.15.37-.32 0-.16-.1-.3-.26-.32zM23 14c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1zm0-4c0 .55-.45 1-1 1H8c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1z") + + symbol#svg_star(viewBox="0 0 24 24") + path(d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z") + + symbol#svg_help(viewBox="0 0 24 24") + path(d="M12 6c2.203 0 3.984 1.781 3.984 3.984 0 2.484-3 2.766-3 5.016h-1.969c0-3.234 3-3 3-5.016 0-1.078-0.938-1.969-2.016-1.969s-2.016 0.891-2.016 1.969h-1.969c0-2.203 1.781-3.984 3.984-3.984zM12 20.016c4.406 0 8.016-3.609 8.016-8.016s-3.609-8.016-8.016-8.016-8.016 3.609-8.016 8.016 3.609 8.016 8.016 8.016zM12 2.016c5.531 0 9.984 4.453 9.984 9.984s-4.453 9.984-9.984 9.984-9.984-4.453-9.984-9.984 4.453-9.984 9.984-9.984zM11.016 18v-2.016h1.969v2.016h-1.969z") + + symbol#svg_reject(viewBox="0 0 24 24") + path(d="M18.984 6.422l-5.578 5.578 5.578 5.578-1.406 1.406-5.578-5.578-5.578 5.578-1.406-1.406 5.578-5.578-5.578-5.578 1.406-1.406 5.578 5.578 5.578-5.578z") + + symbol#svg_accept(viewBox="0 0 24 24") + path(d="M9 16.172l10.594-10.594 1.406 1.406-12 12-5.578-5.578 1.406-1.406z") + + symbol#svg_markdown(viewBox="0 0 32 32") + path(d="M29.692 6h-27.385c-1.272 0-2.308 1.035-2.308 2.308v15.385c0 1.273 1.035 2.308 2.308 2.308h27.385c1.273 0 2.308-1.035 2.308-2.308v-15.385c0-1.272-1.035-2.308-2.308-2.308zM18 21.996l-4 0.004v-6l-3 3.846-3-3.846v6h-4v-12h4l3 4 3-4 4-0.004v12zM23.972 22.996l-4.972-6.996h3v-6h4v6h3l-5.028 6.996z") + + symbol#svg_course(viewBox="0 0 20 20") + path(d="M3.302 12.238c0.464 1.879 1.054 2.701 3.022 3.562 1.969 0.86 2.904 1.8 3.676 1.8s1.648-0.822 3.616-1.684c1.969-0.861 1.443-1.123 1.907-3.002l-5.523 2.686-6.698-3.362zM19.511 7.336l-8.325-4.662c-0.652-0.365-1.72-0.365-2.372 0l-8.326 4.662c-0.652 0.365-0.652 0.963 0 1.328l8.325 4.662c0.652 0.365 1.72 0.365 2.372 0l5.382-3.014-5.836-1.367c-0.225 0.055-0.472 0.086-0.731 0.086-1.052 0-1.904-0.506-1.904-1.131 0-0.627 0.853-1.133 1.904-1.133 0.816 0 1.51 0.307 1.78 0.734l6.182 2.029 1.549-0.867c0.651-0.364 0.651-0.962 0-1.327zM16.967 16.17c-0.065 0.385 1.283 1.018 1.411-0.107 0.579-5.072-0.416-6.531-0.416-6.531l-1.395 0.781c0-0.001 1.183 1.125 0.4 5.857z") + + symbol#svg_jupyter(viewBox="245 20 270 270") + path(d="M379.3 231.3c-42.6 0-79.7-15.3-99-38 14.6 40.6 53.4 69.6 99 69.6 45.5 0 84.3-29 99-69.7-19.4 22.7-56.5 38-99 38M379.3 84c42.5 0 79.6 15.4 99 38-14.7-40.6-53.5-69.6-99-69.6-45.6 0-84.4 29-99 69.6 19.3-22.6 56.4-38 99-38") + path(d="M299.5 286c-9.2.3-17-6.8-17.3-16-.4-9 6.7-16.8 15.8-17.2 9.2-.4 17 6.7 17.3 15.8.4 9.2-6.7 17-15.8 17.3zM286.8 70.4c-5.7.2-10.6-4.2-10.8-10-.3-5.6 4.2-10.5 10-10.7 5.6-.2 10.4 4.2 10.6 10 .3 5.6-4 10.4-9.8 10.7zM451 58c-9 .5-16.4-6.4-16.8-15.3-.3-8.8 6.5-16.3 15.4-16.7 9-.4 16.4 6.5 16.7 15.4.4 8.8-6.5 16.3-15.3 16.7z" ) + + + //- Logos + + symbol#svg_spacy(viewBox="0 0 675 215") + path(fill="currentColor" d="M83.6 83.3C68.3 81.5 67.2 61 47.5 62.8c-9.5 0-18.4 4-18.4 12.7 0 13.2 20.3 14.4 32.5 17.7 20.9 6.3 41 10.7 41 33.3 0 28.8-22.6 38.8-52.4 38.8-24.9 0-50.2-8.9-50.2-31.8 0-6.4 6.1-11.3 12-11.3 7.5 0 10.1 3.2 12.7 8.4 5.8 10.2 12.3 15.6 28.3 15.6 10.2 0 20.6-3.9 20.6-12.7 0-12.6-12.8-15.3-26.1-18.4-23.5-6.6-43.6-10-46-36.1C-1 34.5 91.7 32.9 97 71.9c.1 7.1-6.5 11.4-13.4 11.4zm110.2-39c32.5 0 51 27.2 51 60.8 0 33.7-17.9 60.8-51 60.8-18.4 0-29.8-7.8-38.1-19.8v44.5c0 13.4-4.3 19.8-14.1 19.8-11.9 0-14.1-7.6-14.1-19.8V61.3c0-10.6 4.4-17 14.1-17 9.1 0 14.1 7.2 14.1 17v3.6c9.2-11.6 19.7-20.6 38.1-20.6zm-7.7 98.4c19.1 0 27.6-17.6 27.6-38.1 0-20.1-8.6-38.1-27.6-38.1-19.8 0-29 16.3-29 38.1 0 21.2 9.2 38.1 29 38.1zM266.9 76c0-23.4 26.9-31.7 52.9-31.7 36.6 0 51.7 10.7 51.7 46v34c0 8.1 5 24.1 5 29 0 7.4-6.8 12-14.1 12-8.1 0-14.1-9.5-18.4-16.3-11.9 9.5-24.5 16.3-43.8 16.3-21.3 0-38.1-12.6-38.1-33.3 0-18.4 13.2-28.9 29-32.5 0 .1 51-12 51-12.1 0-15.7-5.5-22.6-22-22.6-14.5 0-21.9 4-27.5 12.7-4.5 6.6-4 10.6-12.7 10.6-6.9-.1-13-4.9-13-12.1zm43.6 70.2c22.3 0 31.8-11.8 31.8-35.3v-5c-6 2-30.3 8-36.8 9.1-7 1.4-14.1 6.6-14.1 14.9.1 9.1 9.4 16.3 19.1 16.3zM474.5 0c31.5 0 65.7 18.8 65.7 48.8 0 7.7-5.8 14.1-13.4 14.1-10.3 0-11.8-5.5-16.3-13.4-7.6-13.9-16.5-23.3-36.1-23.3-30.2-.2-43.7 25.6-43.7 57.8 0 32.4 11.2 55.8 42.4 55.8 20.7 0 32.2-12 38.1-27.6 2.4-7.1 6.7-14.1 15.6-14.1 7 0 14.1 7.2 14.1 14.8 0 31.8-32.4 53.8-65.8 53.8-36.5 0-57.2-15.4-68.5-41-5.5-12.2-9.1-24.9-9.1-42.4-.1-49.2 28.6-83.3 77-83.3zm180.3 44.3c8 0 12.7 5.2 12.7 13.4 0 3.3-2.6 9.9-3.6 13.4L625.1 173c-8.6 22.1-15.1 37.4-44.5 37.4-14 0-26.1-1.2-26.1-13.4 0-7 5.3-10.6 12.7-10.6 1.4 0 3.6.7 5 .7 2.1 0 3.6.7 5 .7 14.7 0 16.8-15.1 22-25.5l-37.4-92.6c-2.1-5-3.6-8.4-3.6-11.3 0-8.2 6.4-14.1 14.8-14.1 9.5 0 13.3 7.5 15.6 15.6l24.7 73.5L638 65.5c3.9-10.5 4.2-21.2 16.8-21.2z" ) + + symbol#svg_explosion(viewBox="0 0 500 500") + path(fill="currentColor" d="M111.7 74.9L91.2 93.1l9.1 10.2 17.8-15.8 7.4 8.4-17.8 15.8 10.1 11.4 20.6-18.2 7.7 8.7-30.4 26.9-41.9-47.3 30.3-26.9 7.6 8.6zM190.8 59.6L219 84.3l-14.4 4.5-20.4-18.2-6.4 26.6-14.4 4.5 8.9-36.4-26.9-24.1 14.3-4.5L179 54.2l5.7-25.2 14.3-4.5-8.2 35.1zM250.1 21.2l27.1 3.4c6.1.8 10.8 3.1 14 7.2 3.2 4.1 4.5 9.2 3.7 15.5-.8 6.3-3.2 11-7.4 14.1-4.1 3.1-9.2 4.3-15.3 3.5L258 63.2l-2.8 22.3-13-1.6 7.9-62.7zm11.5 13l-2.2 17.5 12.6 1.6c5.1.6 9.1-2 9.8-7.6.7-5.6-2.5-9.2-7.6-9.9l-12.6-1.6zM329.1 95.4l23.8 13.8-5.8 10L312 98.8l31.8-54.6 11.3 6.6-26 44.6zM440.5 145c-1.3 8.4-5.9 15.4-13.9 21.1s-16.2 7.7-24.6 6.1c-8.4-1.6-15.3-6.3-20.8-14.1-5.5-7.9-7.6-16-6.4-24.4 1.3-8.5 6-15.5 14-21.1 8-5.6 16.2-7.7 24.5-6 8.4 1.6 15.4 6.3 20.9 14.2 5.5 7.6 7.6 15.7 6.3 24.2zM412 119c-5.1-.8-10.3.6-15.6 4.4-5.2 3.7-8.4 8.1-9.4 13.2-1 5.2.2 10.1 3.5 14.8 3.4 4.8 7.5 7.5 12.7 8.2 5.2.8 10.4-.7 15.6-4.4 5.3-3.7 8.4-8.1 9.4-13.2 1.1-5.1-.1-9.9-3.4-14.7-3.4-4.8-7.6-7.6-12.8-8.3zM471.5 237.9c-2.8 4.8-7.1 7.6-13 8.7l-2.6-13.1c5.3-.9 8.1-5 7.2-11-.9-5.8-4.3-8.8-8.9-8.2-2.3.3-3.7 1.4-4.5 3.3-.7 1.9-1.4 5.2-1.7 10.1-.8 7.5-2.2 13.1-4.3 16.9-2.1 3.9-5.7 6.2-10.9 7-6.3.9-11.3-.5-15.2-4.4-3.9-3.8-6.3-9-7.3-15.7-1.1-7.4-.2-13.7 2.6-18.8 2.8-5.1 7.4-8.2 13.7-9.2l2.6 13c-5.6 1.1-8.7 6.6-7.7 13.4 1 6.6 3.9 9.5 8.6 8.8 4.4-.7 5.7-4.5 6.7-14.1.3-3.5.7-6.2 1.1-8.4.4-2.2 1.2-4.4 2.2-6.8 2.1-4.7 6-7.2 11.8-8.1 5.4-.8 10.3.4 14.5 3.7 4.2 3.3 6.9 8.5 8 15.6.9 6.9-.1 12.6-2.9 17.3zM408.6 293.5l2.4-12.9 62 11.7-2.4 12.9-62-11.7zM419.6 396.9c-8.3 2-16.5.3-24.8-5-8.2-5.3-13.2-12.1-14.9-20.5-1.6-8.4.1-16.6 5.3-24.6 5.2-8.1 11.9-13.1 20.2-15.1 8.4-1.9 16.6-.3 24.9 5 8.2 5.3 13.2 12.1 14.8 20.5 1.7 8.4 0 16.6-5.2 24.7-5.2 8-12 13-20.3 15zm13.4-36.3c-1.2-5.1-4.5-9.3-9.9-12.8s-10.6-4.7-15.8-3.7-9.3 4-12.4 8.9-4.1 9.8-2.8 14.8c1.2 5.1 4.5 9.3 9.9 12.8 5.5 3.5 10.7 4.8 15.8 3.7 5.1-.9 9.2-3.8 12.3-8.7s4.1-9.9 2.9-15zM303.6 416.5l9.6-5.4 43.3 20.4-19.2-34 11.4-6.4 31 55-9.6 5.4-43.4-20.5 19.2 34.1-11.3 6.4-31-55zM238.2 468.8c-49 0-96.9-17.4-134.8-49-38.3-32-64-76.7-72.5-125.9-2-11.9-3.1-24-3.1-35.9 0-36.5 9.6-72.6 27.9-104.4 2.1-3.6 6.7-4.9 10.3-2.8 3.6 2.1 4.9 6.7 2.8 10.3-16.9 29.5-25.9 63.1-25.9 96.9 0 11.1 1 22.3 2.9 33.4 7.9 45.7 31.8 87.2 67.3 116.9 35.2 29.3 79.6 45.5 125.1 45.5 11.1 0 22.3-1 33.4-2.9 4.1-.7 8 2 8.7 6.1.7 4.1-2 8-6.1 8.7-11.9 2-24 3.1-36 3.1z") + + + //- Machine learning & NLP libraries + + symbol#svg_tensorflow(viewBox="0 0 31 33") + path(d="M17.3 5v5l8.7 5v-5zM0 10v5l4.3 2.5v-5zm13 2.5L8.7 15v15l4.3 2.5v-10l4.3 2.5v-5L13 17.5z" fill="#e55b2d") + path(d="M17.3 5l-13 7.5v5l8.7-5v5l4.3-2.5zm13 2.5L26 10v5l4.3-2.5zm-8.6 10L17.3 20v5l4.4-2.5zM17.3 25L13 22.5v10l4.3-2.5z" fill="#ed8e24") + path(d="M17.3 0L0 10l4.3 2.5 13-7.5 8.7 5 4.3-2.5zm0 15L13 17.5l4.3 2.5 4.4-2.5z" fill="#f8bf3c") + + symbol#svg_keras(viewBox="0 0 512 512") + path(fill="#D01317" d="M64 64h384v384H64z") + path(fill="#F6F6F6" d="M162 145v222l7 8h22.8l10.2-8.3V292l30-32 76 115h35l7.3-12.3-89.5-129.3 83.3-82.6L338 137h-35L202 239v-93.7l-8-8.3h-24.4") + + symbol#svg_pytorch(viewBox="0 0 200 41") + path(fill="#F05732" d="M102.7 12.2c-1.3-1-1.8 4-4.4 4-3 0-4-13-6.3-13-.7 0-.8-.5-8 21.2-2.8 9 4.5 15.8 12 15.8 4.5 0 12.2-3 12.2-12.6 0-7-3.5-14-5.5-15.4zm-7 23c-3.6 0-6.6-3-6.6-7 0-3.8 3-7 6.8-7s6.7 3.2 6.7 7c0 4-3 7-6.7 7z") + path(fill="#9E529F" d="M99.8 0C99.3 0 98 2.5 98 3.6c0 1.5 1 2 1.8 2s1.8-.5 1.8-2c0-1-1.4-3.6-1.8-3.6z") + path(fill="#333333" d="M0 39.5V15h11.5c5.3 0 8.3 3.5 8.3 7.8s-3 8-8.3 8H5.2v8.7H0zm14.4-16.7c0-2-1.6-3.3-3.7-3.3H5.2V26h5.5c2 0 3.7-1.2 3.7-3.2zM35.2 39.5v-10l-9.4-14.6h6l6 9.7L44 15h6l-9.5 14.4v10h-5.3zM63.3 39.5v-20H56V15h19.7v4.5h-7.2v20h-5.2zM131.4 39.5l-4.8-8.7h-3.8v8.7h-5.2V15H129c5 0 8.3 3.3 8.3 7.8 0 4.3-2.8 6.7-5.4 7.3l5.5 9.5h-6zm.5-16.7c0-2-1.7-3.3-3.8-3.3h-5.5V26h5.5c2 0 3.7-1 3.7-3.2zM145.6 27.2c0-7.6 5.7-12.7 13-12.7 5.5 0 8.6 3 10.4 6l-4.5 2.2c-1-2-3.2-3.6-5.8-3.6-4.5 0-7.7 3.5-7.7 8.2 0 4.6 3.2 8 7.7 8 2.5 0 4.7-1.5 5.8-3.5L169 34c-1.7 3-5 6-10.3 6-7.4 0-13-5.3-13-12.8zM194.5 39.5V29H183v10.5h-5.3V15h5.2v9.6h11.5V15h5.3v24.5h-5.3z") + + symbol#svg_scikitlearn(viewBox="0 0 278 150") + path(fill="#f89939" d="M212.7 127.1c33.9-33.9 39.5-83.17 12.6-110.1S149.1-4.3 115.24 29.57c-33.87 33.86-24.07 98.56-12.57 110.06 9.3 9.3 76.2 21.3 110.06-12.57z") + path(fill="#3499cd" d="M73.74 78.15C54.1 58.5 25.5 55.23 9.87 70.85c-15.62 15.63-12.35 44.23 7.3 63.87 19.65 19.65 57.2 13.97 63.86 7.3 5.4-5.4 12.37-44.22-7.3-63.87z") + path(fill="#010101" d="M141.53 118.8c-3.47 3.18-6.5 5.54-9.13 7.05-2.62 1.52-5.1 2.28-7.5 2.28-2.72 0-4.92-1.06-6.6-3.17-1.67-2.13-2.5-4.97-2.5-8.55 0-5.34 1.16-11.77 3.48-19.3 2.32-7.5 5.15-14.4 8.47-20.74l9.73-3.6c.3-.1.53-.16.7-.16.73 0 1.34.54 1.8 1.62.48 1.1.7 2.55.7 4.4 0 5.2-1.18 10.24-3.6 15.12-2.4 4.88-6.14 10.08-11.25 15.63-.2 2.65-.3 4.48-.3 5.47 0 2.23.4 3.98 1.22 5.3.82 1.3 1.9 1.94 3.26 1.94 1.4 0 2.86-.5 4.4-1.5 1.58-1 3.95-3.05 7.14-6.2v4.4zm-14.66-15c3.24-3.6 5.87-7.63 7.9-12.1 2-4.48 3-8.33 3-11.56 0-.94-.13-1.7-.4-2.27-.3-.58-.65-.87-1.08-.87-.96 0-2.34 2.35-4.14 7.06-1.8 4.7-3.57 11.3-5.3 19.75z M170.2 118.8c-3.26 3.18-6.17 5.54-8.75 7.05-2.58 1.52-5.42 2.28-8.54 2.28-3.45 0-6.25-1.1-8.4-3.33-2.12-2.22-3.2-5.14-3.2-8.77 0-5.4 1.9-10.3 5.65-14.7 3.75-4.37 7.92-6.56 12.5-6.56 2.36 0 4.26.62 5.7 1.84 1.42 1.25 2.14 2.86 2.14 4.85 0 5.3-5.63 9.57-16.86 12.87 1.02 4.98 3.68 7.48 8 7.48 1.7 0 3.3-.46 4.82-1.36 1.54-.9 3.85-2.92 6.94-6.04v4.4zm-20.08-7.1c6.53-1.84 9.8-5.23 9.8-10.2 0-2.44-.9-3.66-2.68-3.66-1.68 0-3.3 1.28-4.82 3.85-1.54 2.54-2.3 5.9-2.3 10z M211.1 118.8c-4.1 3.87-7.02 6.4-8.78 7.57-1.76 1.18-3.44 1.76-5.05 1.76-4.04 0-5.94-3.56-5.7-10.68-2.56 3.65-4.92 6.34-7.08 8.08-2.18 1.74-4.4 2.6-6.7 2.6-2.25 0-4.16-1.05-5.73-3.15-1.57-2.1-2.35-4.7-2.35-7.76 0-3.83 1.05-7.48 3.15-10.96 2.1-3.47 4.8-6.28 8.1-8.42 3.3-2.15 6.2-3.22 8.74-3.22 3.2 0 5.44 1.47 6.7 4.4l7.84-4.32h2.15l-3.4 11.22c-1.73 5.64-2.6 9.5-2.6 11.6 0 2.2.78 3.3 2.34 3.3 1 0 2.1-.53 3.3-1.6 1.2-1.05 2.87-2.67 5.04-4.84v4.4zm-28.04 2.1c2.55 0 4.95-2.18 7.22-6.53 2.26-4.36 3.4-8.38 3.4-12.05 0-1.43-.33-2.55-.97-3.35-.62-.8-1.5-1.2-2.55-1.2-2.55 0-4.97 2.16-7.25 6.5-2.3 4.34-3.44 8.34-3.44 12 0 1.37.34 2.5 1 3.34.7.88 1.55 1.3 2.6 1.3z M239.7 118.8c-6.4 6.27-11.35 9.4-14.82 9.4-1.56 0-2.87-.65-3.94-1.96-1.07-1.3-1.6-2.94-1.6-4.9 0-3.6 1.92-8.4 5.77-14.46-1.87.97-3.93 1.64-6.2 2.03-1.64 3.08-4.25 6.38-7.8 9.9h-.9v-3.45c2-2.07 3.8-4.3 5.4-6.66-2.17-.98-3.27-2.43-3.27-4.34 0-1.97.67-4.07 2-6.3 1.35-2.24 3.2-3.35 5.55-3.35 2 0 2.98 1.03 2.98 3.07 0 1.6-.57 3.9-1.72 6.9 4.24-.47 7.94-3.7 11.1-9.73l3.5-.16-3.57 9.8c-1.48 4.14-2.44 6.96-2.87 8.45-.45 1.5-.66 2.82-.66 3.97 0 1.06.25 1.92.74 2.55.5.65 1.17.96 2 .96.93 0 1.8-.3 2.66-.9.84-.65 2.73-2.37 5.67-5.2v4.4z M277.32 118.8c-5.9 6.22-10.96 9.33-15.17 9.33-1.7 0-3.1-.6-4.14-1.8-1.02-1.2-1.55-2.8-1.55-4.82 0-2.7 1.13-6.9 3.38-12.5 1.2-3.02 1.8-4.94 1.8-5.75 0-.82-.33-1.23-.96-1.23-.36 0-.83.2-1.42.55-.54.36-1.16.86-1.88 1.5-.63.58-1.35 1.3-2.14 2.14-.7.7-1.43 1.53-2.22 2.45l-2.14 2.5c-.94 1.14-1.53 2.35-1.76 3.63-.4 2.17-.65 4.16-.78 5.98-.08 1.35-.1 3.17-.1 5.47l-8.48 2c-.28-3.46-.42-6.02-.42-7.7 0-4.12.48-8 1.44-11.7.96-3.67 2.5-7.8 4.6-12.4l9.36-1.8c-1.97 5.3-3.26 9.45-3.87 12.5 4.2-4.7 7.5-7.92 9.97-9.72 2.46-1.8 4.64-2.7 6.56-2.7 1.3 0 2.38.5 3.25 1.48.87.98 1.3 2.22 1.3 3.7 0 2.44-1.1 6.47-3.3 12.1-1.5 3.85-2.26 6.35-2.26 7.5 0 1.54.63 2.3 1.9 2.3 1.85 0 4.88-2.46 9.05-7.38v4.4z") + text(x="153.33" y="81.95" fill="#fff" font-size="23.08" font-family="Helvetica") scikit + + symbol#svg_dynet(viewBox="0 0 400 170") + image(overflow="visible" width="402" height="169" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZIAAACpCAYAAAABSLsgAAAACXBIWXMAAAsSAAALEgHS3X78AAAY oElEQVR42u2dT3LbuNbFT1yey9+YrLLeCqy3AjELSEVZgeUBx1JWEHoFoccahF7BkysLaHoFsVbQ UpU0ftYK/Aa8/KJWAJKS+QcAz6/K1dWUY9MgiINzLy7w4e3tDYQQQsi5XLAJCCGEUEgIIYR0xiWb gLjKw8PPEYA5gCsAyWz2aclWIaR+PjBHQhwVkSGAFwCDg8tfKCaE1A9DW8RVJkciAnEnhBAKCSGV CNgEhFBICKlbSFI2CyEUEkJKkfzIQPHRC1uHEAoJIee6EToSQigkhFRmpLi2mc0+vbJpCKGQEHKu I6EbIaQhWJBIXORGcY35EeI8nh8OAQwBvO62i9b6/KUFDTOSGeaVYqaZygCR7rYLhi0IHh5+BpqP 6EiI6yIyBfDj4P/vdttF0lshkQaZiHAMCr51fPBvngDEu+2CA0a/UQrJbPaJjoS4LCJXhyIi/ADQ LyERSzYHMC0RDx2fAXwWQZnSofQWVaL9mc1CetjvW6PzZLvnh1eeH8YA/gYwO1NEjgVlLSExwhcK YFiLEHeFxPPDCYC1CEidDACkFJN+IYWI14qPGNYipEE6CW1JPC8R91CVZxGd9cHMc6QZOA7FJGhz 9QIx0t7TkRDikpCIS0igXqJ5yF6+b1mUQPf8MAAQa35eLiZD5kx6QaC4xkJEQlwSEhGRFMV5kA2A qOqyNRGZkeeHEYBvGjFZgrvB9tWR0I0Q0jCt5UgqiMgewN1uuxies/Z5t11EAO40H49lSTFxm7Hi GsOahLggJJITKRKRZwDD9xbPyL//qvk4lvsgDsJCRELcdyRFIvKw2y6CunIYu+0iBvCk+GgAnpDn MspEOwsRCXFASKRGRJdYv9ttF00M7lNkobJj5nQlzhJonC4hxGYhkRVVuhqRr03tAyPuJta4kikf e28cScpmIcR+R6ITikcJQTWGJN+VroSP3S1YiEiIo0Iiy3FVL/eqxcFcJVbXrHjvhRuhIyHEZiGR PIROLNrcUFHneuhK3CJQXGMhIiGWO5I51Ku07tvcrkQE66niwEPcciR0I4RYLiRTxbV9gUNokqXi GsNbbsFCREJcEhLZ0VeVG4k72u9qqbk+4eO3HxYiEuKmIzHJjeThLVU9QcDH7wQsRCTEJSGRJLtq a/hlx7vvqmanYz5+J1BNCFiISIjFjkSXd4g7/jtTjfAxT+KmI0nZLIRYKiSypftxEeCm64OlCs4z oZBYDAsRCXHTkQBZEnuTiwjMSWqvKCS9cCN0JIS0TO0HW8nsf2jg3/qCPzePpJDYTaC4xkJEQhxw JKayVlwbsgs450joRgihkDSGaoC5ZhewGhYiEkIh6R7PD+lKLISFiIRQSFqnYOUWhcROWIhICIWE kHehciQsRCSEQtI4+6ozW2KlI0nZLIRQSJpGFfbgGe6WwUJEQigkhDThRuhICKGQEFKZQHGNhYiE UEha4bXioETscyR0I4RQSFqBMXQ3YCEiIRQSQs6DhYiEUEgIeS8sRCTEMC7ZBESFHPoVIwsjbQDM d9vF0oBbUzkSFiKyv17JJCNAtlvFENnS/hvFt+/xOxSaItvQNd1tF2u2JIUEnh8GR4PNCL/rRIao cZNGzw8jAHMAAwCPMtC6tGooFxFIuyWeHw4N+BuNTrR7fhgDmMlgley2i3kLfT446OtjjdCupZ2c GTBlsjOVv//mhH86OGin8cHP2wNYSjs1djy43PcSLWwa6/nhW80/ci9jXXJ48cPb25uNHSh/cYby 35F0jnN43m0XwRm//6+jy/e77SJyaHb3X8VHHwv2LGscKUT8W/HRl9ns09KAdpsD+H50+e74pXvn 7xgiOyxuohGNKjwBiLt8lu/sm3MRkCYH4lxUkrrbyfPDNezfefz/DoX20pKOExx83RhwWyrhmXt+ GDviSnQFf2tD78uUAVF1GuiwpvdgIoPn5xp+3GcAnz0/tMZJi4BGAG5b+pUD+V23nh8+A4hqFJRr R8aI1GghkRn/xCDhqDKgDpCFg6YOdBKVUO4NCImo7svZQkSZRE1lBt7E4HMLIPD8cLLbLl4MboMI WbiwK8YA/qpRUDYOiMk/xoJLgzrM5MCyD0xuwd12kUiO5Lgz3Hp+GDkQg1bN/F8Mva8UDnKUg2uS awCp54eBaWIiY0JyYhvkifS0oH/k+aQ8PF51spoLyoMIyrkTmInc18DCrpnnSMwREkk6zRsQj+NV GYdhhrqscQTgh+a67a4kMHTAdr4Q0fPDqfSh6zP6eyozxfVRnx/JO6b7mQMRExMWU+QuJEH1MN4T fifIq0ziUsXvC06YyM4ATDw/nJ7jTkSwr2T8q2vT2BH+zM8BwMeaJ9HKv/eyw5dljveHrVby0uQv 0WvRrEpmeXQl5eI+ME1IXC9EPFpuXTU8EiNbhVVFTOcSMo40v2OALLkcGNAOVVY05X9/8l7xk3+/ lK/cCc1LnsW1uJOzF9nU6QA9Pzxp4K+byxY7SL7a4ly7vpdBIwXwYsiKE50riaFOvNqALqH9YuJ9 2V6IeEYO4BHZiquT/255Z4KDJcp/OD6ZZScdTjDjkvFhgyys1Ng9Sr3UsmKC/5vnh6mNK+CsEpJ3 CsizzBJSE5OB4kpUzuqzxJxt7FyqGenKgJBHoOkfNotIICGcstn3XgbYWlYF7raLueeHrwC+aSZH SQdtMdVMyv7RBm0usZeowtTzw0TGId34NUXPt+i5bKFzlM0wjnnKbaYlS2nn+LOmJH8hAwv7hOqe TXhJnEq0F7iCxgTkaJCMJIx0nIe4btuVVBCRZwDTLsLF0kZRyRjW+8PxLhts/ATVcyAreWGWttVh 7LaLVJYFjhVhAqtciVh5404edOlERGnjZYV34xFZCKfJwXMuE4eB4nrSUnuUiUgnhb4SSYlRvjhn L+3Vay4aeAARgF8VReQRwL9328Vot10kLYjIsKGfG5143SY3YsLM34kTESWJ+1LybmyQ7SDQ+Axc fr5KMG5E8NqY7f8oGKDvOhKRObJFPGUisunKKTnrSE5wIY3Z9TOF5KWGF7LIlUwM2ezwXCHZsBCx lvejSiiri9m37r4m8lmTziwtGCNar2s5NWflypZIxjgSsadpBRG5BzDcbReRQSGsuu4jKnhRbXYk Jsz6bc6PXHl+mJaIyEaceesDk0wSVhohaRJd8rp1EfH8cOj54RJZrrNMRB4BjCgiNTuSijOtJyiq IV1CXMmjwg5fd7mk8sQZ4rWhA7bNhYhl74YJ+12pcjbjBvtaVDDpbG27lhNXlK7kOdkygbFHSGRZ 3G3JTGtqUOMPG/75kaY9InSwpPJEJgWDTGc4XIio3I67I1IolgJ7fjiqe1CXEPg3zcd3bY0Vkq+K US2MFe22ixhEy8WZD+GqgojkFtCkF77RlT/iuB5Vv1fCfyajGrBXhp4/Ynsh4gZZ+MaIyUXBO9rE slbdgPzYRnt4fjiSUON/KojIA7JQPEWkIUdStCzOpJlWFeoeKHWuJPb80OTlzYGhs37VfdlciPiM LHxjWj/Y48/wTlBnH5Bk9lgjrE0fAHbKDgLPMobx+OamHEmJEzFqpqWw1G3M7tYykzlmAEPXm8sL btz+WgWOJLX0fXvcbReBoZOJNgZN3bgwbbJNJBqwriAiGwBf5BlRRJoSEkms60RkhSyUZeoDuDrR 1r/XlewV1+cyMzKNiaZtus6PDOFIISKy+P+0rwONTFZUz/KpqfC354eB54cvyGpVypLp9zJ+LUGa ExJJTs0KRCQwvCq9tQFc2iG2yJUEqhfcUDdioyO5syjU2xSR5nrt74Ms502QLectK0l4AvAvw0oS 3BQSWRqaWCwiukFp1eDvi21wJfJsbwwdrFUCZ9uJiA99FxHpY6rcyGPdJQGytPgF1arSP+62iwkr 09tzJInGGm4sERGdI2nsvktciUmrQALNdRMsvgv5Ec5y9Qe91fYeSBhrjWxpcVEYaw/g6267GLIm pEUhkX1nxpoHMrHIDnZxfGwsYnvMbRt7GVVElR/ZGDJLc/5ExJ6g6mOrOvKpEsZKUb0qnct52xaS gyVzKmxbHjdse7YoIqtrv8iAkMMV1MeZdu5GXD8RsS8UhE6T9/ZdCWP9jfIq/Gf83giTDrEDR6I7 S+TJwrhvJ9t/SDuZ6kpMHqydPBGxh+j62NmTFVnO+wJ9hXxOvoNwwDBWR0Iig9yt5uFMLZsV6Tpz W7MTU12JKuSwN2QJZKCZWRL7hWR1Tuj0oCr9B6pXpSd8BN06Eu3gZ6E9HGrcQiuz2xJXEhgmJKas o+8ip0XaeY4nuYODLZl+oVoY61+77WLOMFbHQiKxc10SNnakM69avoepSa5E6oKMrGYvKERkeMI+ bt4zITjxkKm8Kn3NZjfDkUw1g0xk6d/Z+exWYrSq0My4I1di5G6/Bc+LjsQyCrYlWlf4t3lV+neU L+e9l+W8rErviMsTZs8bi+ONpiwjjZAtU1Rdb1tMVELyZEg4QNUWm9nsE2eadnHytkSSm42hXk34 R3+F4+ccWetImlquZ+CsqHUhMcWVFIS1mB8hXb2nVwdV6WUisgKr0o13JLqQh61uJDh1VtSRK0nQ /MFbZc/YFCFROciUr6sT795GM7HhIVMuORLoq1DXDnXmVVc3IwLW9eFXxoa1CgoR6UjcYH0gIEMe MuWuIxkbPFOtS0i6nt1G6OhIXkvDWpjNPtGROAIPmXLckRTE6VNLO+wIBi5x7fhIXtPDWoFmMCFu MET1Q6bueMiUhUKimw1avL2AycIY6a43vM28yau1dH2QA4mdqJ7bNaofMpWwCe0UEtdmg6rZ/cqE QbPgSN5rNHT4lbgdY8NaLER0jlPfMx4y5YiQDF15iQuWMZuU74nQ7uFXpoe1WIjYT3jIlGNCcuPQ S2z6oNnqkbwFW8Y/GjT7UzliFiJaSoWQ+GFVOl2nC0JSULhnq8WcqgYlAxN3bR3JOzVdWMH8iKtu Q0V+yFTEJnLLkZy8nYGpWBLWquJK6nzJVEKyN2x/IhYiuodqIvDMQ6bcFZKhxnraiC4slBh6vzpX Mqvj8Ctxm0Zve8NCxF4JybjhlYnEMCGx9SVWzb5Xpq5Hl5mZTvzqcCU2CCsLEd1E53gnbBo3hcQJ Cpa4Gr21QlNH8hacLWOasKocCQsRLUf62J5CQiGxDdUMfg87tnmJGnAlE0uElYn2frmSz3WEbQmF pCk3oipoW9qQ2GvoSN656cLKQkTnSTTXp2waCklfZvRtU1uupCDJbpqwshDRYWTlp2qCNGfSvfHJ dSvte+FQg+ncyKNN1bKyHLeuw690omRaWEv1d7EQ0S1aKbw1YeD2/DD1/PDN88PXto6GKCjTGJkg JEOLVDd2wI3U5qwsSrLrOjvdiFskUCfdvzmWK1nidz3UAMCPPuSCDoVEpWjXlvwdEdQJ5Ucb9+6p 6UjeKexZvcZCRMcpKLzNRcYFNzLR9OW2hGRvgiN51TROYPjDC6A+22BvqRspcx9VXzrjk+wACxF7 Rgx1rmTs+aHVIS6JAOjezbbykap3ppXx++JgxqB7cQNLH15s806i4kqeVC6xLO5akC9KDFy9xkLE frkSnWB8L9jvzwaWmgjAc4uh5O6FJP+jFd9jcuFQohkwV45sBnfuCq5pwYzQNFQdnYWI7orJUjNB AoDUxlVcnh8mUIe09mh3ibNq8jVoI+F/oVDVY25MTBZ5fhhDvS064Mj69HOO5JVQn6pTPxnq0Jho 7x9TqOP5A9vEREJyt7oJX5vvnIj0vovxsIqQVJkBt/3wptCf+Xzv2BnP0YnXrXEjLETsrSt5hT7S cWOLmMg49F3z8dNuu+jinVON4WNZCNCOkIh6rhTfd2uKK5GH90Pz8bNr5xuUuJLoqG2GmtnRytDj AFiI2F8xSQF8LRGToan3L+Es3Ti0QndREd34FzcpzhcnzFwTQ2yk7uFt4O5GcHNUO/wqssWNCIHq ObIQsTdiEmsmSbmYvJiWgJeCwyX04aw9gElXi1qKJp5NjgMXihtJoF+iF3f48JICG9npw2spFFBY GVzgRjbyTE2E+RGKybRATAYAfh077w5FZCT983PBOBQYkIvUtddtU8usLwpmwCpmbZX8Hz28tGQG EDiWF9G5iiJXEp3YqUyAhYikTEyArPo97cqdyEQ2BvAL+iJtY8YhEbJ7zcffmxCTC82NFC3R+9GG Mzl6eDc9F5EyVxJrhHZvqhthISI5UUzG4k6SNnMnMnFeQ7+4B8hyIkaNQ5IrXhWISVJnzqRor60p 1CGu3Jk0Er8UAYkqPLzeiEgFV3Jb8P2mwkJEohKTryXfdgvg7yYFRcagueeHa2Q52UHBtz8bPA4F 0B+XfossBxU0KiQHS/R0N3JT5wzB88OJ5EH+C+BbycNbARj1TETKKoNVQmubkLAQkWISA/hYMIk9 FpQXGfTfNQaJeByOQd9Rvtfg/W67CEzNzcp9FYnJNYC/JGz4LkG5LLmRXLHSgoH9FlkSZ4VsZVda NsDLQx/KHzmS/w6qRkV228W8xy9aIo6trJPHhi8+UHVchrUIdttFng9JoE9sH05ovyML12xkrHqR r1fVWCQhnZGMQSP5Gp9wixsAU0OX1J8zho9FUDbI6lBSAOtTJuqXJ9xIAn2u4vCBwvPDvLHXilno 4Mw2sebhtUAE/TJo493Iw8PPK7AQkZTPpicHY0+Vnciv84ntgWjUeVt7maBFlrVlnoZYlozh18jS CbOjttsDmBflWy+q3ojMIJ9OuP9rUbrDr8GZD+9+t10MKSK/XUmJ9bfRjbjgSF557/W7k912MQRw h/JwV1Pska2CGtpa8LzbLta77WIE4OGMf56fqzJ6l5DkM4TddjFBtfhlHWxsf3gNExe0W2z4vas6 pAuFiKoZ29LS/rSHQeeE7LaL5EBQ2sql/WMMcqFOTdIC/z6zDbUF35dn3EgKYCjL4uYlVukcnpBt d74EOeeh2tDhAwfdCHbbxdLzwy/IVjy+Sj9+seTeU88PPx7d+9rA+0wA5At8JnK/dY5BeZ5l6eoY lEeYJGw4R3keKkfbHz68vb2966bE7kzk69QHupcBJAXwQvGo3OYTAP9RvQQyazOah4efqk73dTb7 FPPpkjPehyF+L9zJv6qG0Vf4nZxP+7YSVNrv6mAMH0Gdj3qSiFQzQqK4qeAgfHFc8PJ6MPN8cXVL kxYe/FrzsL+YLsYPDz9HyIpMj/nIGhJS83uiGoP+34GxhSqN44Bm9VujQkIaf8ARsjqbY55320Vg gRuZQ7Fn2mz26QOfLiF2csEmsM7C62pobKmtYSEiIRQS0iEx1LHfR4tiuyrXxEJEQigkpAU3EkC9 umJvixthISIhFBLSnYhcQb+m36b17YHmOh0JIRQS0jBzzUx+1dG50OfiaiEiIRQSYrQbGUG9SisX GJsI6EYIoZCQ9kk01x8sXAvPExEJoZCQlt1IBPVuARuYfYTun6qXFSKCjoQQCglpT0QC6ENaUwt3 BQhUF1nNTgiFhDQjIkWrtB4s3d6BhYiEUEhIiyRQr9KyLqRV4kgY1iKEQkIacCNT6Ld1tjGkxUJE QigkpEURGUF/hO69xTuWBprrdCSEUEhIjSJyBf1peivLT4lkISIhFBLSAkuowz97FBxxabEjoRsh hEJCanQjCdTFekCWF7F95s5CREIoJKRBEZkCuNV8fG/78cMsRCSEQkKaFxFdcv3J8rxITqC6yEJE Qigk5P0iMkJ2UJWKFYCpI38qCxEJoZCQhkQkhfq0wz2AiY31Iic4Eoa1CKGQkAZFJHAguQ6AhYiE UEhI2yICZCu0XJqtB5rrdCSEUEhIAyJyZ/sKLQUsRCSEQkJaFJHEwT89oBshhEJC3i8iUwC/eigi AAsRCaGQkHeLSAR9nYjTIsJCREL6wyWboBEBuUJWI3LbRxERAtVFFiISQiEh5SIyQnYw1U2PRQRg ISIhFBJylojMkZ1gqMuH5HUifQjvqBwJw1qEUEiIRkCG4kLGBd+2gnt1IkpYiEhIv2CyvR4X8lIi Ik89ciI6N0JHQggdCTkSkABZQv2m5FvvHdnF9xRYiEgIhYSUCEhU4kAAYIMslJX2sJkCuhFCKCTk fAEBslDW1KEdfE+FhYiEUEiIiMcVsnNB5lAnj1UuZO7gnlmVYSEiIRQSike2AisAMAHw+YR/eg8g 7rELyQlUF1mISAiFxGXhGCFLDo9kELw58Uc8AohcOUOkBliISAiFxDmRmBxdHsrX1RmicTw4Rj1N pp/qSBjWIoRCYqWITFG8YeK50IFoYCEiIRQS14hr/FkrZJXrCXMgJ7sROhJCKCTWMqhBPFIRDw6E 1WAhIiEUEqd4RrWaj0PheBHxSBm6qg2KMCEUEmuZIAtvDRWfpQeD3JqOozaWAL4dXUvYLIS4zYe3 tze2AqmNh4efAbIizisAMetHCKGQEEIIIYVwG3lCCCHv4n8phXIdiL9d2wAAAABJRU5ErkJggg==") + + symbol#svg_chainer(viewBox="0 0 150 80") + image(overflow="visible" width="150" height="80" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAABQCAYAAAD7sIxLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAADElJREFUeNrsXQuUVVUZ3jMNqMP4YDSRhzIkYSryMKwIH4MKkhpioi3x sULwUaJpgpXDwpnEwAxFZZbSkuVIiqJEFMpr5SQwhIoOKILNKAppGJoEihYMj76v85/u5nI5r3su 955z9r/Wt8695+69z95nf3c//v3vfxepmMpGVX4QLmcAvYAy4AtgLbC4g9r8WcjP6o3LmUBbYDPw ErACz9mjEipFMSRUZ1zuBq5wCPY2MB54FpX/7yyeNRSXh4GjMvy8G5gD3A8sSxrJimJGqi64LAK6 eozyAnAJKn1rgGddisszHoPXA1V4zktJIVZxzMrzax+kopzjgxzp8isfYc8GloCMo0yLFc0WK2h3 8+z/ojvLDhmn2XJnwGd9Hy3XM3EnVtxarG0B47X3EKY1cISGpoDPuiEJLVZJzMrzCDA6QLxRaEVe 99k6nsKZH3CQz2cdbcZY0ZOJwDs+4/zRL6koiLMal6uB//iMOt8QK2KCyv5EWbqr2cAul+C7ZeA+ JIvnMf4JMuvzMr7jWK7KDN6jPZDn7PBG4Ba5tV1ZyssNomaYA2K8GuLzvo7Ld4XY/Hy49nMDMAHP m6eMxIJcgzlTBGbl4dltgW7AB8Am4KumRuJBqlbASiHW6XnMR3dgM7ABOCIp7784xmU7S1nrhG8C f8njuI/PvwboxLEfyPUlQ6xoy0/k+iQqd3eeJxVcM7wH6A9MMv1JdLvB9tIFsgs6vIDyNV/yNTru dRDXFqtGrguCLDDnUNglvgHcC3JdYNQN0WqtSnF5D/gyx1gg1hsFlj9q7JcCO4GeyN/fDbEKk0gc DNMe6jBlreFdCdwMvIxK+1aB5pka+8eVtSR0teSfC9zNyPM2Q6z8VQzX5y4Cfgqcup9gNOaboixj vg8LLP/9cPkd0C7Dz7RunUriyYzSEOsAVQoVjbXAAI9R1gHDUEmvFEj+Oc561OO7nwHcjbyvNcTK baUcKYPfDj6jsps5AxXUmOf8d8eFBD/ERzROPqYg72PNrDB3MisAqSgc0M9ExZblOf/f80kqCtUl Vcj7oihp7iNDLLzUb+BSmUUSXJQemediVGQRl13/LLyHIkOscGVgCGn0znMZXssyPm30qw2xwpWS AkkjG1mo9rabDyIjZFZsiBWSbAghjTX5LAAG4LRunZBlMh2BPoZY4cnTyr/ZcboUwu4YbhvL1tqi tSFWeP927li+I8tkarhAneeidA4wM9SFCtQVhljhkos248OVv21etEXn7mjqj4ZxgglyTQQ65WFm +yPpjjmJ2KKsjRV+l3CmRmHZJ3LWDXipdbj0VdaGCbcNDLRpH4Q45wHfxOeLlbXUw6WgVajocUDJ ASDUscAflLVi0Epmh5XI0/lCsgeVtSjtJLQpm4w4Y6JQT5FehEZl9VSWpSgr6CTgUGXtaObmBS6H LE038kOcNsraNPpLGausByYi3FQPz2svXRnf2zrE+chDnMHKWrM81m5xSOx0cx6Eq5CyXCBkO0pa My7ncBPGfMRpjkrdxHaXjocK5/LQfcqyhmDL/S4wGpX3+7Rwx+EyTlm2VEUZWhFu/XoAeEH3XIN4 JAa93lwnt/4J/BBhZiXh/SaWWBoBaFrzM2VZS1C4NWw8CPAifmML8luttXGSt6Tlmy4L5ZyB9pLf aH81Ar+9nZT3mnhiCbmKpDtll1UhLRFdDnFc5nfzA+N1VSmfWfdyNgpSfZ6kd2qItS/JODimoWC2 s8b3gWtBqIVJfI/Fhkr7zDrZwjwWQlJN0q0qQywjtvQPIY1zlaVzM8Qy8n/5Skjp3GOIZUSXf4SU Dv03nGuIZcSWJSGm9R1DLCO21IeYVidDLCP2zHCushauw5CNhlhGdKElwhchpDPTEMuI3mpxPyIX kHdkkczKJB0aYIjlnVxUcNJp2/oA0f8GXJrUd2eI5U4uWmuerCwLBq+t15+AgdLqJVLMWqGvUXh5 B+ker1cpywVbPgVockMLz+VJf1eGWNmRjBp6WqDSzHgtCLXDvBkjRowYMWLEiBEjRozEa1aI2c8x yjJYq1SWnylugTpSfuauXDpn5QlY1Nk8BdQ7nX+M9Hio0dPydYZYbBqJmZQ4EICHDdFQra9DfDoC s3ewkHgjgG2IS+f90/bjuJ/by20d0OKIqhqqVeqE1YvlgAAjTsTCSytX1tnK6Wa1XPOiRnmXtFRs 7cokDW6Tss+r4T06yH/UvF5DLJtUdEvIPXAnabcnSevzlsu/mMse3Jx5E7s6p+7QSIKIJT4MntdI RfPcK2Uh1lUQjs4ufox0uLX9rzF/b3XAi/L5TUMj5xbrIaCffF6vLC/DH/hNEHFejvtLQxnXq2AW D4mRYmmteihrYZXyMTAkCKmMGElvsX6uqR5qgxy+HcJMi16RaTnQW9QaStQY9LYyl74UAqZ7sEwu 2BrTp0I7KSsdePDA8JkH0v+7bOenq8f+Wn7oJedTKetsMdXJ9jmchJ0NdFOWVx1Oumgjtlha3GzS biP57yNaAboh4AI8zzBahPRfK+JJpCplZ9TCSsUPO3P4YqlqWClfn5QxCol9mEtUemu5GXl7yiOZ 6FN9jNrXvCVzFGs7/DyXdKlS+XPa7f5OpBc94NfkKz3WDFPu/iBYQSORbr3Pd8u6vAz4hXLeG7lF 1CWP4RmfeUiX5a6UPyP//N92iVJTovb2nb4wl6TKIFekfd+kLN9WzUJ2ku0SgK6E6GRjBgq5Uzz7 OclAIa0tW0VV0iR/Hgr1aRfKZIUmMM8h7eFI+/GQyzhIZd6yT99aqwCe89NGWi622vSI3IX5RX5u Q37u90iqo3H5jUp5zVFChCYhUlvgRGm9qH+k4eIQxLsQz3Cz7a9UKb2dLi3yp9wj9WMf0NBSIs2l Lc/loTveKSoNkqUxXU2Bgt+uLN/mVXKrWsI6CXfZ8J9Iz3njSVakuz1DZdB90bXAI9I91uLeEwi7 az/prpIu4EZgaMDykvBTMtnCi2M3buIYK/mZhHtzxduym8zWJl90lzQKWK63SEiLXS430NJz8wlS lmnA5T7LMFlZm0QabRs06eJ5ZB7dQq3hjTly6uceafJyPcbopT2vGejoMd48Ld5pHsIf6iNPt2tp n+8h/GSv7wy//0ALO9pjfu7S4tR5CD9GC98gZzY6jpGAFVqcQS7hq7Ww13udFebzaNs1Pg6C1Mc2 rucQehk7aKKfDNYlh+V91WO4h7Vxb2cP4UdoXf41bl2b+OqqSuvqvEqTZ3VDROQ97XNoLrXlIM1y 7VarAtCTbdQmOB1c8t9PujXKUq9+ShFukYxlKafmQt3QEhFi6ZOK0gAEKpUxBdc0u8tAs0wGtG0K sLz24Z1uhwWcqX1u8HlC2EeijuiaC2K9r31vFyclnagd6IKb7rd7OgTdraK7FU4/V2eiwK+0zQWx GkW/ouQfPTMmpOom0++ztNtcVaDrxnUyhmmW8nMcUx8DYgWV1rkg1gLtO5VrN8SAVGUy2LfHJ9Rh 1SjrAPKWDOGPi3BxD9YnHtlq1cOSYtmtu8VuEvGSz4lBg1WrkWoCyjgAaMhEqhiIfhDBMYWSKXtc MUm798CBOAYkx2Ifu8a1sWoVb9EnNQMKjVi09rT1PifL2CTK0k2u7yZgd7Ku3xtcUMTCy6dRH5cA 7OWU4Wi1pgc53BpxTgROz3O5bB+iFTFofR0FdbdMpY4E7oPy3llILRYzOD1tqnoVQLX/dV6OipUT rnh2zCsF0OLZZtQVwG0u+S4VlUSUZaz2mcsv9wGHuJSbf7paOegqdClJY/8deBCXA+6SW1Sc8bQq Hr9Gc+PVMkXnqnmpDBa58MiVbe7msc1B2GoNzeOBRDXaeINnE3LFnwvTPIhpu5SbvkGptab91/ER b7UWoIw0lRknt24FLsc9WvMuF/UKx2JcvuslZT5N6vBfwOs5JZZkcjwyxA0VPEOvh9zuKPA6Y+Re wSV5fNHLUIaRylpzayWk7xvzsRaJxWUvmpiXyZ/+IrW3GU0mOT7nLZZWMdzv1xOVQ2bfIi1XD5Wy t9GFg2NupKDykZsxprkcSMSZ2nDts1dp1OKt9UCuacg/N8ZSL3ee/DvbqdQy1seSd7bET8hYxavQ D5atL3IzaWnQ8u1nkwkJwsMzt3n8M9HUp042s4yU7p1lpp1WuZR1q4w/GZYmQHWIt9pD8gvkfX3u tQy+/GNxHKVSu6A50P8E2BRT/ZCRLOS/AgwAG01541UNsGkAAAAASUVORK5CYII=") + + symbol#svg_nltk(viewBox="0 0 93 28.5") + path(d="M1 .6H5l13.6 22V.6h3.5V28h-4L4.2 5.7v22H1V.6zM28.3.6H32v24h13.7v3.2H28.3V.6zM66.5.6v3.2h-9.2v24h-3.7v-24h-9.2V.6h22zM70 .6h3.5V14L87 .5h5.3l-11.6 11 12 16.3h-5L78 14l-4.4 4.2V28H70V.5z") + + symbol#svg_gensim(viewBox="0 0 100 100") + image(overflow="visible" width="100" height="100" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAFahJREFUeNrsXQdYFNfa/na2scAusPQmIIKIKCKKNfZ4NcYajSVqjCWJ udHEJJp2E/VP+/+oSRTT7HqNoJEYza+5KklQscQCKE0BAemwlIXt/Z4ZBAHZ3ZndWVxMPh8eZ2dn 58w577xfPWeGAXYuiZeLedv3Xppyr1wcg2GMngqlxpvLYXkZDAZ3lVrH1+n07LbHs5iYGn3fBAyo V6m1Ip4Du0qr1d8NDXJPf235iF+eGRSosef+MuzpYj7Yf9Xx1G+3o+oaZCO0Ov0QgwH6KlWacPQ/ h5bOMhhKLod5G8OwHCbGuOrl4Xxu4TMxua9NjVL9Dch92ZdSwNqdeC2ipFw8Xa3WrUJ3tTfZ3zo5 sCDExxF6ePEgyNsRIoME0MvfCdwFHKiTaCCvTAp5pRIoFSmgok4JRZUyqGtStzsHYlA5h8OM7+Hn +vP7q8flT+zjpf9LArJi02/Csxfy31YoNHM1Wl0g2oWR+d3wvkKYMNATooIFCAhHdNcTd35bGrRl RIfOIj2GACmokELG3UY4klIKYmmrBtOzWFgR34mbMHda9OefLh0q+UsAEvfCv0dVVDctUWt0s5Fu 55s7HtkNGB4phGGRbjAyyh283bjtBpoMGAzofL9aa4A7ZRJIzayFczdFcLdcCnpcP7KZ9Ww280d/ H8HeK7sX/vlYAjJk2cE+VTWSdyRS1XPoI9Pc8TwuE+Ii3OD1WT3BV+jw8CBTYAXZ39wqbIRdJwvh Sk4taHUGfJfOVcDb7evN33Rxx4KCxwKQeRtOOV6/WRbf0KhYhDwjtnnDCzBugCesndsLXJ3YnQ+y FawwCd79zw0SNXx7vACSzpcRjEEsVSFV9t38GQPeRqpM1S0BQcaau2HL2VeQa7oOGWofMkBMjvOG OaP8oE8PfueDTBEI0r8xsi1qVEHCb/fgJwSMWKrGVVmRkyNn07efzdyBjL+u2wAy4sVD/shr+kKu UM9CNxjL3PG4V7R8chA8PdQb2CzMNBA0soIs8zIKxLD75F24cKsGZ4vagctOCA5wXZe6Y0GN3QMS NW/Ps9UiyT6d3sAjc/z4mPbqyVpWkAaPQR288zdr4F+7bhJsQQGozM9HMDfj4JKTdgnI5DeSXHPz a7ZJZKrncLVr7ng+jwX/nB4C04b7AsYgP0h0soJ0G2228Thm5y/5kIhUGWpa7ezE3R0e4vHWma2z 5XSMI5OOk4x55XAgAiNBJldPIxNP+CCv6V8Lw+HJWK/WcSB7x7Z8x7j/r+N+OljR2kYn244oGB0R 5YW8QBZkFoqZEpk6Fjks/eImL0kpuvqj9JEzJHbx/mHlVU0HUVzRk8zxOBg710SDpyu3S1xZi9sg oR4LyiXwwv9eIrwyFPFnB/i6zP9zz8LMRwbIgIX7ppZVNu7T6w1CMsf3DxHAFyujwJnHotdWWDCw VMFr57212d8o08D6PRmQfL0SmBijwsuTvyA7cem5LldZCIzhCIyjCAw3Msf3DebDp0sjwY3PMaoW 7udBTKonKgNLqY0Oao8MGPgxDhwmjI3xgbzSJiiqlPIVSs1TwYNnJ4uyT1R1GSD3mYGD4UpWTX29 qj9SUw5Ws8KagSXLik5vBCPt4cJmMWHiYD9Qa/SQllfnpFBqZ4XEzbkmyjp+z+aA9Ju/d0hlddMR smrKw4UDu94cQIBBaWBpMNpUwHsISKDGQuQGw7C+niBXaiGdAEXzZMyERadLbySJqIwvRuVg5E0F iOqkh1CM4U7meB6i89tzw8DbzYE+W2EjVrRtmwwrOtvGE6FvzIuCUQN8QKfT+98rbTiEgmQPmwAy 54P/dykort1L1pvCZflTQTCqv4f1rGhzvK1Y0dFOWWqb8EzD1teGwLhYX8QWTf+SMvG3Sz49w6Nd ZclcnvgWxRkzyXpmeN1izexeBJXNDRIVD8qsuqEAnlH1RFG9dWwPB2UYilWOphSDRK6OKK0UOzfl nzpNG0P6ztszSypTLSJ7vJMDE96ZFw4cFkZKPZljBRl1YQl4xtQTpTjGSBvuLg6w+90n8EASU6q0 L8Us2j+eFkBGvZzoI6qVHiCTJGyR58YHEp6V2Y7awJW1Nq6wlBWdbfcPFcKyp8PBYDDwKqqbEoav +MHNKkCSrpeyi0rrN2t1eieyYESHuiDbEWxZ2oMGo20pKyixkIJKe3lmJMwYFQwajc6zpFz8kVU2 5EZNxEqJTP0mFVuzdm44BPk4WW0rLDXalrKCfhbiv8VQ9I5B3xAhHPm9EFRqXVTQoNmltTknblFm yKpt57jIiK8jU+VrkZherq1elbW2wlJ1YSkraGVhu3MxwM/DCd5/fiCgcMGxtkH+Lj7ThjJDalhD vkRu20QqPvTml/sRxSa6XVlL1QUVV5aegLKZFQ8c0QfnjeophIu3qqFcJPO8fqtMW5/7y3nSDEHB TC+pXP0SFTDwsmt4gPNj68pSApJo++HzvjijD5G+Fzcq1w5e8m8f0oBUVkvW6vUGSrMF18wOe+S1 Cqq2gp5sgHFWdDx+wqAAeHpEEFJder5EqlpJCpChyw4OETcpllEBw8+DBzFhrlanPegw2lRshbXZ ABwIc6zouL1iWmSzSaiTvt/n2d29zQJSWtH4PNWk4xNR7jYN8Cw12rZjYQsrwCwrOm6H+gtg1AA/ wn4rFOolJgH59HCaE6LTs5SSYRgDhka622WtwiYstIAVHdvbsHww8VGt0c09k1vDNArIroRra9Vq nTsVQCIC+RAb5mY3tQpry7emB9YyVnRsL8RPAFGh7qBUaUPWbPxlRdvxbPWHL5c2woylBxZQrY8M RLbDiceizWi3iE5ngPJaBRRXSaG6QQlNci1otfrW2gPfkU2kZwK9nSHE1xkvn1oNROel3w5OCdDT vxemRMCb2y5CvViBA/LdQ2dHxrxnXmFtPtUaycdLo2BynI/Vk9Hw/Wo04LfvNUFqpghu3W2AgnIp iMRKk+3jJeHwQAEM6CWEuEgPGBzhQQBGS22EweiQ3KaPhRrU1xEvJuH908RE+fVI3janqh1DKmsk U6mCgQu+JsNaVuAXd+SPe7DjlwJiEhoVwWd8/JlTS/x9fyKPmEDx0vTesGBCT8LntydWtP2Mp+jH xgbA4eR8dmmFeBLata/VhsSfzGbrdPpXqYKBF/gDvRwtdi2Vaj18fSwPpr57Dj5PyKEMRmciVWhh S2I2TFhzGr48kg1imcamrqw1tmlsrD/xWaXWLcdNRitDEo5lhMkVmhCqnfd1dwAmEzOqkkxdaC5S TV8cyYWruXVgC8GZswMx5lKWCN5fHA0x4e5mGGIbVphS2QMjvABDn5skyqHrt5zFFy2VEqNZXSsd BRZMeAgP4Fvkyv5wthjmbUy1GRhtJauwARZ+dA6+OJxNmytLV6baW+gIowcSLGFWVDWNaFVZGq0u zpLO9uvpSulC8Wky7+28CZsSc6ArBffYdhy/Dau/ukKotM5dWQZpVlicfOzonqN/U4Y3144QS+Ja AUHuZKQlHQ3ydiJ9objh3oJU1MnL5WAwwCOR03+WweaETJDItSbzT7aYzQJGUjy9g5qLiFpdMwYY MiYMFDH2s6SD+JwrssnDr3680zxj/BFLwtm78OGuG4+UFW3PGxkibFm4Gk0AEr/30hN6vcHRks45 ObBIJQ/3/acQDiUXg73IyUslEH802+ZpFiBRoONyWCi45YNCqfHccPBaEJZ6tWiwpR1j4bNKzKQt ymvlyNspINbq2ZN8eywHsosabJJmaQeeiXnJLduBXoRzxDyZfHs4xmYx+1jeLdMXp9Mb4M2v00Cm 1IK9CW7TPj2QTkz9pDPZCSTmJXfc7uHT7K0ib3cAJpWpva3Bw9TFHU8tg5ziRrBXuZpTA/tO3aHV lTWlnoydy9ON15I598cwDISWdkil1hu9A3AFlfj7PbB3SUy+S6xJtxUryKi30IDm4p5UphJibDbL w9LOyFVaoxd68nIF3L7XaPeAVNTKkDtcajNWkAHS39OZ+J/DZrpier35x1sYk6p6pdFaxaGzRdBd 5JP9N2h1Zam6ztX18vtOEtMNQ86Pxauo7pRIOp1gIBKr7Np2dJTqegXqi5g2V5bqbJbbxfUtuzDM mo7ktFFJbS8uLb/O7txcc3Ilq9omrCATp5WLZK2HWQXI3XJJp5PR8AX23U3S7ohswwoS5eV7VU30 AFLToASFSteuYTz2SEmv7naA5JU2gliisirAM+c6GwPvbpn4ASBoh8XPIMQHv6BC0q7hukYVNMrU 3Q6QkioJlFRLrQrwLEmzVNXJiBsBF4PBoMHjEKusb1ahuF3DVchAdkdRIBdeJFbQ5sqSjUMy8h6s CdVq9WJ8dY9VVaLMwvbeCV5v6K7S2KaEzADbr/Ql7G16WetHvd7QgKJ1RoNVxjCvDirqFK2NqTT6 bguIwQasMOVxKdVa+OE/ua27HXnsesyRxym3phNlIjlcyRZ13nC3E/pZYQq8y5mV+ASHNglPXSHG ZDIyre1GSnpV60U481jdFg58kSrdyxVMgXfmcnG79sNCPG5ik8b2voyrL6uyprm1iH7NSAucON0W EBdnrlUBHhXw8MD5j+ul7ZzWyWN7X8TiV43O4HJYYms6IpFr4Nj5EqJhP0/HbgkGvowZT/LRuWjI 1AMS9hzPguLKBw6ukyPn3rrZA0TY/d/dsrZD247mEEGiK7rLevkLuh0geAo82FdgVYBH9kkVODv2 nMjsGNPdao3UWSzMajuCzzq8mNkcoeOPlehu0ruHK3A5THpY0dkxbRyG1IzydtE5LmxmMwYEIHwn 7lU6OvXhrnSCJcP6eXc7QOL6+tiUFW1d61c/T36ofeTyXmkFxEPolIqzxtpONUhUsPdUPsT29kDe FrvbgIHPlh8V40+LK2vuWV8Jp3OJdEk7Z5vBUMb2D7jaCsj7q8eVuPAdMujo3NE/iog0RFykZ7cB JDbCCzxcePQtmzYSXJaLpLD7+MPWAY39mYMfTKptBQR/RQOHw9xOR+cqauWw7ptrMP/J0G4DyCev jKBv2bSJRa9bDl6DzIKHn2fG5TJ3t7K1ZSM4wO1Mbb1cQ+XJDcbkXHolpN2p7RZgDOvnC32ChdY/ PNPMmvzUjDJCXXUUJsaQjR7aMyX3SPPn1nrI6a9mVyCWZNLVUTw2sXdx4LBg8ZRIcrNDrABDLFHC a5t/w+fvPnwNDuyr370xrrVC1a5AJXTl7YS/kDyPwJg+KtSqAM/cUnC93gAbd16CkjZVwTaiR5pp W9sd7Vfhbpr9vQOXVfRXAMOVz4XX58fQ4sqaYtFmZDd++DW702tgs5hZF76f/7NRQIYFuhg4bObB xx0M3CU/uHEyAsW2j609c6UI4g/fMLr8wsmRc6Djvodq6hw26yAdMYm9Cr7Yct3iwRDbx5uSK0vG VrTdn1NYC4s/PImvRe/0OpAxl/t584+YBSTvpxV5Xu7OnzyugMS/NQ5WzOhH2WhTeWzI2T+LYeba Y50a8Rbx8nR+K3XHglKzgBCpFD53O4peGx4nIPCywDdvj4fpo0MtMtpkVdqVrAp49fOzUCc2PreA xcKqvN35hzplTqfBXcYxeUjcHK1Eppr4OIDR098Ftq8dDxOHBpFPHlrwiPNLt8ph+hs/gVxh0uXX 9+whXInYca2zL43WW8/k1mCLVh9O02h10d0ZjFVzY+A19OeEDLkt38CwccdF+O5oOqi1ps0vz4F9 qfzXf44w9r3RiXJ4OsVD6PgxE8O65AWLdJbiccONq6aTX82E95bEgbMjh3aj3bJdUy+H5R/9iryp 62bBYDKxWheBw3qTx5j6UpR9IsczappQrdYNtyUYvu5OcHrrDKKmUteoBJnSsigfjy0mDw+B/Rsm wYJ/RICvhxNtRrszMC6kl8KMN3+CtNvkZmq6Chw+zktaccDkjWnuJJPfSOKnZ1VkqzXE61FtJoMj veGr10dBgLczchnrIe1ODVzKrILkayXtZma0S8pxmDAy2h/GxAYQ9Yw+we6dvuWN7lfsNUpVsOLj X+H3a/dIL/FGhvz23KnRA+JXj1ZZBQguAxfvjy0tb/xDZ8VaEjLi4eIAs8b2gpWz+rcu8yKY2qAA sUxNrAtsUUn4hARPN8eHHstEVzKwMyDwKZ97TtyCnccyCFVFVjCMUTegr9/w5G1z8syqbrIn7fH0 N+ulMvWHYOUEbTKC3/kbVwyFKSNCQChwMDtQtABh4jf4wtBfLxbCO/Ep0CBRUrSNDI27m+NapKq2 kjqedEB1Mpv95Y7U7eImxYtdmY1d9FQErEZeEg4Mg+QDXuhihQy5r9uPpBGMaJkQTdmuufA2fffZ zHfIvhackm+D25ObOZWnlCrtyK5Od0SHeRJxBG4zokI9LLYVpo7HZ/PnFtXC+bQySLlRQtQwkO20 +LodeezjE0aGzd/33kTSM9ApO5sz3j0ecOVGSQq60EdSEsQTg3geKqa3F/EXESyEQG8B8TBOqmDg 03Gq6+QECOnIibiZVwOXM8stZkO7nCCHmRUd6Tv69Jez6ympOEsam7Dqx4ic/OokxJRIsAPB2RLk KyAeURHWQwjhPdzACxn8B7MoGYSnhk8uyCuph6KKRmIaDl6jUKjon62PmJER2y9g5vH/m15MOR6z tNHIZ3eHIXvys72AYi+CwEgLDhDOSt0x36JF+hZ7TDlHluVHhnk/w2Ez8/+G4YGaGhQdMNNSMKwC BJfk+Dm3hwzsMYbHY6f8zQz2cdxm/PzZ9BJrzmP1y4nvpCZKYiYsTtJodAKVWjvIGjXYHQWPM9xc eFvGDgtdlfTJVKvzfrQNHv6Sko+3/v5WY5PiPeQ+8v8KYOAROAr6/if+o+nbycYZXQZIi4x55XBU bkHNz5pH5BZ3oWeX2z/Sd9rZrXMKaAWZ7gtN+WZu1sjBwf1c+A6fMZlY/eMGBOpTDVJR7z07NTqG bjBswpAOrvHkRolyvUKpGdwVOTAbix4Z7guuAt6GrMSlNnNiusQAD3r+wLKScvEnWp3eu1uyAmNU 9O7ltTr1+/lJNncSuqpT/1iT5FZWKZ5XI5Ju1ln40M2uFhYLaxK6Oq4eGOX/06H1k7umctrVnRz5 4qHAKpF0nkSqWqjR6qLsUJXhKwFuODpwfkBxReKxz6Z16YNbHmnM8MRLCTOKyxpWK1XaOB2Ft4na hA1MTMLlsi5EhHp+eXbbnORHFtfYwy358he/C85dKRyjVuueb5IoJ3WVSkMgSAV8h+NcDvPQpDG9 z29ZOVL6yANNe9PbKzYlC89fKRqMWDNMp9f3RZFwf7lCE2QwGLhWBnFKngO7CJ3nFgIii8NhXX7y ibBrX78+psmuIv/uYFx3/ZYnOHMuf9Afl+4OEjhzQ1RqradCqXVBd7YAxQU8BBoBll6vV+r1BiUC U4xc1CYOmyWSyFTFU8ZHXJo0Jjxt3rBgub339b8CDABGIcc4IY8t+AAAAABJRU5ErkJggg==") + + symbol#svg_allennlp(viewBox="0 0 124 22") + path(d="M19.3,0.4h3.8v16c0,0.6,0.1,1,0.4,1.3c0.3,0.3,0.6,0.5,1.1,0.5c0.2,0,0.5,0,0.8-0.1c0.3-0.1,0.5-0.2,0.8-0.3l0.5,2.9 c-0.5,0.2-1.1,0.4-1.8,0.6c-0.7,0.1-1.3,0.2-1.9,0.2c-1.2,0-2.1-0.3-2.8-1c-0.7-0.6-1-1.5-1-2.7V0.4z") + path(d="M27.6,0.4h3.8v16c0,0.6,0.1,1,0.4,1.3c0.3,0.3,0.6,0.5,1.1,0.5c0.2,0,0.5,0,0.8-0.1c0.3-0.1,0.5-0.2,0.8-0.3l0.5,2.9 c-0.5,0.2-1.1,0.4-1.8,0.6c-0.7,0.1-1.3,0.2-1.9,0.2c-1.2,0-2.1-0.3-2.8-1c-0.7-0.6-1-1.5-1-2.7V0.4z") + path(d="M42.9,21.6c-1.2,0-2.3-0.2-3.3-0.6c-1-0.4-1.8-1-2.5-1.7c-0.7-0.7-1.2-1.5-1.6-2.5c-0.4-0.9-0.6-1.9-0.6-2.9 c0-1.1,0.2-2.1,0.5-3c0.4-0.9,0.9-1.8,1.6-2.5c0.7-0.7,1.5-1.3,2.5-1.7c1-0.4,2.1-0.6,3.3-0.6c1.2,0,2.3,0.2,3.3,0.6 c1,0.4,1.8,1,2.5,1.7c0.7,0.7,1.2,1.5,1.5,2.5c0.4,0.9,0.5,1.9,0.5,2.9c0,0.2,0,0.5,0,0.7c0,0.2,0,0.4-0.1,0.6H39.1 c0.1,0.6,0.2,1.1,0.4,1.6c0.2,0.5,0.5,0.8,0.9,1.2c0.4,0.3,0.8,0.6,1.2,0.7c0.5,0.2,0.9,0.3,1.4,0.3c0.8,0,1.5-0.2,2.2-0.6 c0.7-0.4,1.1-0.9,1.4-1.5l3.3,0.9c-0.6,1.1-1.4,2.1-2.6,2.8C46,21.2,44.6,21.6,42.9,21.6z M46.8,12.5c-0.1-1.1-0.5-2-1.2-2.7 c-0.7-0.7-1.6-1-2.7-1c-0.5,0-1,0.1-1.4,0.3c-0.4,0.2-0.8,0.4-1.2,0.8c-0.3,0.3-0.6,0.7-0.8,1.2c-0.2,0.5-0.3,1-0.4,1.5H46.8z") + path(d="M66.3,21.3h-3.8v-8.4c0-1.2-0.2-2.1-0.6-2.6c-0.4-0.6-1-0.8-1.7-0.8c-0.4,0-0.8,0.1-1.2,0.2c-0.4,0.2-0.8,0.4-1.1,0.6 c-0.4,0.3-0.7,0.6-1,1c-0.3,0.4-0.5,0.8-0.6,1.3v8.7h-3.8v-15h3.5v2.8c0.6-1,1.4-1.7,2.4-2.2c1-0.5,2.2-0.8,3.5-0.8 c0.9,0,1.7,0.2,2.3,0.5c0.6,0.3,1,0.8,1.4,1.3c0.3,0.6,0.5,1.2,0.7,1.9c0.1,0.7,0.2,1.4,0.2,2.1V21.3z") + path(d="M72,2.9v18.4h-1V1h0.7l14.9,18.7V1h1v20.3h-1L72,2.9z") + path(d="M92.4,21.3V1h1v19.4h12.4v0.9H92.4z") + path(d="M109.9,21.3V1h8.3c0.8,0,1.6,0.2,2.3,0.5c0.7,0.4,1.3,0.8,1.8,1.4c0.5,0.6,0.9,1.2,1.2,2c0.3,0.7,0.4,1.5,0.4,2.3 c0,0.8-0.1,1.6-0.4,2.3c-0.3,0.8-0.7,1.4-1.2,2c-0.5,0.6-1.1,1-1.8,1.4c-0.7,0.4-1.4,0.5-2.3,0.5h-7.5v7.8H109.9z M110.9,12.5h7.5 c0.7,0,1.4-0.2,1.9-0.5c0.6-0.3,1.1-0.7,1.5-1.2c0.4-0.5,0.7-1.1,0.9-1.7c0.2-0.6,0.3-1.3,0.3-2c0-0.7-0.1-1.3-0.4-2 c-0.3-0.6-0.6-1.2-1-1.7c-0.4-0.5-0.9-0.9-1.5-1.2c-0.6-0.3-1.2-0.4-1.9-0.4h-7.3V12.5z") + path(d="M18.4,4.6c-1.7,0.9-3.3,2-4.9,3.1c0,0,0,0,0,0v0c0,0,0,0,0,0L11,0.4H7.3L0.2,20.8L0,21.5h4.1c0,0,0,0,0.1-0.1 c2-3.2,4.4-6.1,7-8.8l2.9,8.9h4.1L14.2,9.8c1.3-1.2,2.7-2.3,4.2-3.3V4.6z M6.8,13.2l2.3-7.1l1.3,3.9C9.2,11,8,12,6.8,13.2z") + + + //- spaCy users + + symbol#svg_airbnb(viewBox="0 0 320 100") + path(fill="#FF5A5F" d="M168.7 25.1c0 3.6-2.9 6.5-6.5 6.5s-6.5-2.9-6.5-6.5 2.8-6.5 6.5-6.5c3.7.1 6.5 3 6.5 6.5zm-26.8 13.1v1.6s-3.1-4-9.7-4c-10.9 0-19.4 8.3-19.4 19.8 0 11.4 8.4 19.8 19.4 19.8 6.7 0 9.7-4.1 9.7-4.1V73c0 .8.6 1.4 1.4 1.4h8.1V36.8h-8.1c-.8 0-1.4.7-1.4 1.4zm0 24.1c-1.5 2.2-4.5 4.1-8.1 4.1-6.4 0-11.3-4-11.3-10.8s4.9-10.8 11.3-10.8c3.5 0 6.7 2 8.1 4.1v13.4zm15.5-25.5h9.6v37.6h-9.6V36.8zm143.4-1c-6.6 0-9.7 4-9.7 4V18.7h-9.6v55.7h8.1c.8 0 1.4-.7 1.4-1.4v-1.7s3.1 4.1 9.7 4.1c10.9 0 19.4-8.4 19.4-19.8s-8.5-19.8-19.3-19.8zm-1.6 30.5c-3.7 0-6.6-1.9-8.1-4.1V48.8c1.5-2 4.7-4.1 8.1-4.1 6.4 0 11.3 4 11.3 10.8s-4.9 10.8-11.3 10.8zm-22.7-14.2v22.4h-9.6V53.2c0-6.2-2-8.7-7.4-8.7-2.9 0-5.9 1.5-7.8 3.7v26.2h-9.6V36.8h7.6c.8 0 1.4.7 1.4 1.4v1.6c2.8-2.9 6.5-4 10.2-4 4.2 0 7.7 1.2 10.5 3.6 3.4 2.8 4.7 6.4 4.7 12.7zm-57.7-16.3c-6.6 0-9.7 4-9.7 4V18.7h-9.6v55.7h8.1c.8 0 1.4-.7 1.4-1.4v-1.7s3.1 4.1 9.7 4.1c10.9 0 19.4-8.4 19.4-19.8.1-11.4-8.4-19.8-19.3-19.8zm-1.6 30.5c-3.7 0-6.6-1.9-8.1-4.1V48.8c1.5-2 4.7-4.1 8.1-4.1 6.4 0 11.3 4 11.3 10.8s-4.9 10.8-11.3 10.8zm-26-30.5c2.9 0 4.4.5 4.4.5v8.9s-8-2.7-13 3v26.3H173V36.8h8.1c.8 0 1.4.7 1.4 1.4v1.6c1.8-2.1 5.7-4 8.7-4zM91.5 71c-.5-1.2-1-2.5-1.5-3.6-.8-1.8-1.6-3.5-2.3-5.1l-.1-.1C80.7 47.2 73.3 32 65.5 17l-.3-.6c-.8-1.5-1.6-3.1-2.4-4.7-1-1.8-2-3.7-3.6-5.5C56 2.2 51.4 0 46.5 0c-5 0-9.5 2.2-12.8 6-1.5 1.8-2.6 3.7-3.6 5.5-.8 1.6-1.6 3.2-2.4 4.7l-.3.6C19.7 31.8 12.2 47 5.3 62l-.1.2c-.7 1.6-1.5 3.3-2.3 5.1-.5 1.1-1 2.3-1.5 3.6C.1 74.6-.3 78.1.2 81.7c1.1 7.5 6.1 13.8 13 16.6 2.6 1.1 5.3 1.6 8.1 1.6.8 0 1.8-.1 2.6-.2 3.3-.4 6.7-1.5 10-3.4 4.1-2.3 8-5.6 12.4-10.4 4.4 4.8 8.4 8.1 12.4 10.4 3.3 1.9 6.7 3 10 3.4.8.1 1.8.2 2.6.2 2.8 0 5.6-.5 8.1-1.6 7-2.8 11.9-9.2 13-16.6.8-3.5.4-7-.9-10.7zm-45.1 5.2C41 69.4 37.5 63 36.3 57.6c-.5-2.3-.6-4.3-.3-6.1.2-1.6.8-3 1.6-4.2 1.9-2.7 5.1-4.4 8.8-4.4 3.7 0 7 1.6 8.8 4.4.8 1.2 1.4 2.6 1.6 4.2.3 1.8.2 3.9-.3 6.1-1.2 5.3-4.7 11.7-10.1 18.6zm39.9 4.7c-.7 5.2-4.2 9.7-9.1 11.7-2.4 1-5 1.3-7.6 1-2.5-.3-5-1.1-7.6-2.6-3.6-2-7.2-5.1-11.4-9.7 6.6-8.1 10.6-15.5 12.1-22.1.7-3.1.8-5.9.5-8.5-.4-2.5-1.3-4.8-2.7-6.8-3.1-4.5-8.3-7.1-14.1-7.1s-11 2.7-14.1 7.1c-1.4 2-2.3 4.3-2.7 6.8-.4 2.6-.3 5.5.5 8.5 1.5 6.6 5.6 14.1 12.1 22.2-4.1 4.6-7.8 7.7-11.4 9.7-2.6 1.5-5.1 2.3-7.6 2.6-2.7.3-5.3-.1-7.6-1-4.9-2-8.4-6.5-9.1-11.7-.3-2.5-.1-5 .9-7.8.3-1 .8-2 1.3-3.2.7-1.6 1.5-3.3 2.3-5l.1-.2c6.9-14.9 14.3-30.1 22-44.9l.3-.6c.8-1.5 1.6-3.1 2.4-4.6.8-1.6 1.7-3.1 2.8-4.4 2.1-2.4 4.9-3.7 8-3.7 3.1 0 5.9 1.3 8 3.7 1.1 1.3 2 2.8 2.8 4.4.8 1.5 1.6 3.1 2.4 4.6l.3.6c7.6 14.9 15 30.1 21.9 45v.1c.8 1.6 1.5 3.4 2.3 5 .5 1.2 1 2.2 1.3 3.2.8 2.6 1.1 5.1.7 7.7z") + + symbol#svg_retriever(viewBox="0 0 150 33") + image(overflow="visible" width="150" height="33" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAhCAIAAAC0rMV4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAE6xJREFUeNrsW1lwHNd17dfb9Oz7DAY7QBAgSJEUSYkUKcVarGiJLDuL EpWjxM5HqvKTisqpyo/1EX3kx6lKVcpJXEnZKadkKbGqbCk2QyuyrC2UZZqgCIIkSIDYMcDsW/dM T+/9crsbGAIgQIIUFTFVfGxs08u77y7nnntfE/3B9z/wkChIkx6a8nK0x0URFINJFHDRnQGuLeDp jwe9LoaiSOLuuCMHOn5mRtH0qqzxklaQ9bJm5FUt3dQ43YxTRLuHPdYXO9QbH05F7lrxDjUhxhh+ GCYMbJjYxFjVjGpTGc9UToxnck1VJ4iIh/m9fd1PDKY4F3NXZXfaoJ0fFAlj5Q83ywS9XDzgJjB+ 88KypJuCrJ+4nEl5Xff3J++q7E4bV7ERtQ74IjDkv0eHOx8bSCw3VT9F5nnpwxmAWN06Zwfu3XHH mXAdvFpmRB4Xc7AnzhGEZmIGoYIg803lrsr+f5jQiUowpN/NhFlSMYGiEqphyrp5V2V3aC7capiY sEETsBORCJEk2upKvIrG1/6Otn7+9c9ef+A1KeCWB8YbH4HWy397B16vopXpsJO8bu4h+MYmtIyH RUUVNDPopgFL3QzlZanra9OitZZWMEQwdR2D3w7tO55lGCbMA3Pdsgc4YsM/G5SQxevQZxIuV7UE YpsOnq1o6RacRtcNuBWkpbdWLtYMcyJTFU0iTiLZNDvC3iDHrmbKdbLpupmrNhaKwlSxPi/IYPuQ i+4Jefqivh1tYeC3LY3DvZKiTS6XS3XJKTTRGmvCahqK1h0LDLVHGNpyF1XXR6ZzsmrQlDUr1Dg9 Md/O9hhFoXxVHJ0vzFQaXoY+0pfY1RGFJcEU/zO+qBiYsR6OwTYcQx4d6trgTo4kiqbNF/ilSuNS TijJGigy4mYHot7+mH/gqgDGVLa6WBICHAuq100z6nPv6YptVSXLqn5pqVyuSy6aSoW9PfEAy9DO dFC3lYUmaGkyL8zzkmwYPobqC3s6gp57uuNXtWTrAhb+yUyuIeswEdgCXCzgYe/pSXAMXatLI7M5 UDVLUfd2RejWkjb6C8bLlfovF8pwk4aJdj/3QE8EUZQjzVpdiLJ2ejb3xnjmiiDHaPJI0odIarIi nlis+kj0ZF/sD+/vD/ncrVsERfvOxeWTi9VBL+tCBHhj3cAF3ZRMHGbITEH8i/u6diSCjgZZmrqU r/1gqhSkyABFXhTkF/e17UiGp7P86+cXLxcbhG7KJj5TaLz0Ra497APZGJJ45Vy6pJluEi1q5n4f fWSwgySotTKDlgq1xkdTuZ9eyc9I6gEPMxDxQtaYLAqvzpYOBLgnBuJf2t/DgfpJVG3K3xtLZzXc z9I5VesJe/82wEUjgU2zQLkmfvvswicF4fe7gr+7t5u0dWVpDJunp3NvT2TfKzTiJD4c94XdzDIv vbLMGwTx5FL1d/Z19SRCaFW5YLjlmnT8Sl7QTReJeM24L+kH35Xl5r+emhpZFgjDAI2NFgTaWZKJ 17moqGrTef610zOzvESSVNDnevHYwFBH1EHItRLn+Oa/nJz4aKES4pinuyMvHN6RCHkt59X0dy4t /fjc4uuTuY+LwktHdw53xZx7Y17ub35j6KOZ3M+v5OuSDmXKb/dHnxhKuVga3FzTzYDHxbJ0K1a+ emQQQO6D+bIL4xDGfhczU+C/dXIqJ0hhhmIg8hBKC1JVlNtCXrj+2O6epom+e3oOvKYdylxL6HXe CRacyFX+7oPLaV6KuZg/HWr74weHSBuK603lxNj8v51NvzamTFTEr9/X3xX1PzjYkQp6f3hm7myW T9Jkoya+P5V/7kgAbZbLR7O1XLH+pVTwzx7clYz4ndgA2V4dmTk+lcea+WR3+GtHd3ZFA444H15e +smF5fdmS2eXqn/+8NChnoQddmBC6isH+2iG+snFZWwpguAQytfqPzy/NJKuhmgEDJMhybKo0gA1 laacrojMKtQAdID9Ti2UJ6pSkKP3JwPPDrfb9tsI14AMY+nyyflS2O3qDHBHdyQs+9lJFNz3UHcU zlayPF+T3p4p7EgGWdZq7oCIiaA3HHCbCAEuSQjB5x1RP+diN6ttCMjBvXG/sVCRdMvTQM73r+Qk w3i4M5wVlUJDAZ7cE/VGfG643rE6YL6bQk3d1Fdy8zoH1Qzj/cnlpZoc5SD4PI/t7gD7Obr2e1zH dqbem8wtycbFDP/xXPH5qB8eCNh+sCf2SaYGEC1pxpkc/2VFZa8RuCmr0xVRkLXBhD8Z8rQ+Pz1b eGu6qOu428N8YTDVGfa3HPTYjrZL+XqxqZYk9ePZYm/Unwh4CHshDEP3Rf1wkaqbdl1HfDRdmMgL h1NBSdMnyw1Ax64AZzl+plL/3skreVn3gOmhCrSMTtyTDDw1nEoGPINtQfc1sjrely43PpzOUzTt YaldbcE9bUHCdnlkWzrqdfcng2fzddIwMxVxplgf7oisqtE0DTA0tpsJVlfPNPEKP0Qb/RqwCCRw UaSkawmOPrdcM3TzG0f693fHeVEeXa4aprE3FU4GPa0b3SzDUqQIJRDahH8uVervTxchWwOGP7gj 0Rb02pwQOaaOeF27U8HzVwpempwpCKKkeuFxNNUX83eHPQuVJvy+LEjjy5UD/W0bEux8SRjP831B 7lBHmLB0aT1WlhXwcqQZEYqEh/SATzjRYjsowzIHU8GPFsqwwEuF+mS2FvVxNKR6+6zfRcP6QVU0 SRZEeVlUvjiQeO5AL8x1ejYvauZQMkBD1PbGgs/s64JpxrK8345iliRZmtzfGUmEfHgLJglUcKFS h7QMaAZaTvrdHtvSqGVlkvCytJsiIVfVFS0jNIfagiRFrUhPota1CK0E3KbcGk6RdooAHQMl/mCJ f2Fv+57OGCjW7WIeD3pgKidxrrG6deDNyyQ8vlguKEaXhwLG0R7y0tQK/qwCI3gMQ1tKIOpW998y IZyFBe5OBjK8DFdomnkuJxzoS66VWNb06aKQ5aXDnaH+eKD1+UK5XmrIwKdYGqX8nJ9jiHXTgfAW 2QJUVFS9IiqAHK3VkPbaTcJqrSwIyuHOMGQcP8fCp4/u7gS3B+Fpu35nn9zTdaQ38e7lpddGFz00 bRD41FK11Jz4+uF+YHobKIwzFM2AKKxrRoC0pvG4aEXTL8zml2tN8JGqpJQkfbbWFFRDMkyhqS7U IfoNF0XdUjd+xdKyYboRcaQ/6eNYG7ARvZ1yAl9loapmjKZLHpqEEGQoBAptqtqH42nAW0U3apKW a2hXqg03TZYVwxTVYkNqD3th7oCbubczejEnZHgJHjZbbhSEJmSE1iRFQYIshbD5QG/c523RNzxZ qANNBUoCoe51MQCRp69k8oJkYJOX9LKkLfJNXgaUJeqaulyXQAyOoVbXbMMUBAzGkkkc7o2lQj5k AxVUI5Tt3/SKmxMIcslz9w/0R7zf/O/xmJcFUL1YrP/Tycl/eP4BOH9t3lYNo9CQwEMQhRwGBboA kgJAB/QVW26FUhzV6fECUAKva3fRIKVrAxbfTCkErlJVjb0Rd7tFW1oBj26qMpNUPS3IgA14NV4h 1P5zbNHF0C6GBPxiKTTgYwf9LogGn4tmbM4MaqQoajgV3pMsz1VEP0MV6tJEnk8E3FBJrkRbrXmh KHSGvcNOQnE8RjUyogoZlLJMiEm7tHhnKjtXEIJulrT4Mxmi0OGE12EhSTeN8CYtNCgj/RzdHfGR lENyr5Z2dAvKnCUe6E+9+JDy/TMLBsIhhlpsqMdH55890GfD2Dqgg+wFeLKSQawtKh0Kpm88dbBV n+BWg2BVWbdQgG/owoua0RXx2U56iwPAA1IIY0sCosKfQFW+87WHV/ITJvDVns0KuW8pCyYGhHRN FyA5CbI+tlTZnQzFghZtAYCZLAhVSXt8IJkMuNcmSNPuGth7BzC7TjP0S88cskjWBgWtZg1qQ0fE 1jsmzHYP63e7rm2XkNdkHQIo2dGeiGo1LAgoxX46mR2Zzm7q65hYIew6xg3F0A1s2wk5B20dJIA1 Yx+fxn5rSzov51T5tz6cCgqkkQ0MlsB2RoFnUmhVbIpsHWszCPw+nAz2hz0lFe7CF3L8laKwEoIl 4XymGuSYPW0hlmHWRomJV4ibYUK1pmuG1Zdx5qJWVdQ6qGtMZFEt6wGE13p1gtxGmxshSDMP9cWB rarW5AQvaVASyKq2QW+kvVSHQALlrckq4MBnvkNtLf5TPQGciaNJw9IpkkzIRpDxzO1vniUC3M64 HxIqyFJqqvOVuhVnhmkRGUEaiHj7wt4NUWG10OwBk/KyJmu3qCVyi5xBXqsjMMy+rtjjg21NE+oq EyrnqWLj17MFjNdtU4D7WD0nmzUZBi7VpZqk3uG7ibA6yHkxNw1RBO4HAZGuNMAeiCDw9lIpRNgD PbGBANcwDIivyXy9IEjVpgJlNJStR7qjUIKtLWCgOgi6gDTaDUsTL9oXE/iW8sgW1GFzcHOxzIHu 6GDIA47DkAQs8ldzxUylsdZCQIVjAY60szRYFyhWhm8SW1UGmwqFCeIzM/dWD4ZCojfsBe+0nJVA s6WG43nENjzPWVh31L8rFRQVA0AvW5eytUZeaI6XGyEftzcZ4lhm7dVQRHVAEUCRUKNCOFabKhy3 d9nkpoICIHeE/X90Xy/NMQ7M/Gq59qOxRU3THYjHljtTg4lAp5dt6iZlVy0j6TKAKbppAdFt39jB q/RhA1Ow0h5NHtvZBssGwgmc+VShPjJXJG5G5qCXe3BHIu4igWALknpqpjAyX1xoKH3J4GAyQKy2 CFpL2tse9ntdDd0IsFRd0c8sFKu3deec3JrBoz2d0d/qixVlHZbKWvWNMFcSVuiyLSSQw11xX1nR OXAwTEzlhfmycFMeTdip2n756gY2uVl4vloFrbOiZcgdbeHhsFvUgZciN0KfpMumbpAIbT8FdIV9 wO9V3SQJ8mKOP7NY7nUzh2I+2g5BtB4JIkEf5EibmkKhRZ3P1BbX49n1UMTeuXNKQ7wFaF1v197F MI/u6mj3smXV4Cgq31BOXFwisNniWgEP99DOVNBFFVXdx1KLvPTGucVqvXltH2DD1EB8AywN5TO2 2DJRqsuiql2HhZqry7WL3BuHLF41OQiiY7RK31fO+dzsE3s6FIybhumjqctl8d/PTAuijK6xIt6S 1Hju7QgDsdIwLst6uqEOxvwH20Ob5goYjw4ku0KeuqYHWaoo6v8xMjuRqWyYYFMDmWtqDmf7Hd+E Ce1qJBZwP9gXMw2roUkjNJrhz80V1obZQDzw9FAKilhrT4QiR7P8K6en5wo1bQ071Q1TlNWmoq1R EGoPeDwcIxoYKp2FSnMyX9MNw6HgGyISbhIVix0DAaHtBoJ5o3CRNV23+wkQZ5JuOE9eSxEPdscO d4RkE+vY5BB6d6r45thCtlLXVq/EdqEtSvBtE3xws3RvzB/gGM16JQUB3R9a39feMPoTgaeGkmE3 09AM8PgrxfqPzy2Mp8tNRb2qE3ApSWnK6lo3aqo6uDll7QwTTX1z7ky9/PLL1zMisnZBy6I0WW0G GRokuFxu/OZAkmYo53UBlrYyYpyjJvNCQdZgPTlBOZeuzhf5Ci+WeXF8qfzG+fTx6YLfzfSFvC2y 43ez4PijOV4xrCibKTcWCsJSURiZyfk9LJTvLSGWysJb48uzVeBKyCAQ3LU7GYj63Fu9FADme+tC +nRWoOyCJ68Yu8JcImj1QlvB4WHpobjfjfBYnq9pJkUQs5XmaLqyWOSFhpSv1k/PFl8fXRzPVfem gKHQm7YY58v1YkOuakbCz311f3c86NsqXzA01R8PhFh6mRchZMGHSqJyLludztaqgljiG1PZys8m Mj+4sAh0tifqd7byi7z4zmRmotAA34cYqqr6rrAbFr6hIXyDBGBvWhAXl8rf+sVFUcdeitQw8cK+ jq/cP7ChdwzzjUzn3p7MXq7JJQPPqGZD1eH+Pi/7fMr/2FDq6FC7z+3acNdMpvKjs3MjGb6kmXOq sSTpjwSYf/zywT09ceeVEkPT//q/zkKYBly0k9/gG1CDv3xkeG9PnNoEsfG3f/bJqWw9CkTMXhrE ImDC8/d0PnNoYANIgussFmsfT2WPT+QLqlHRzXnVqCmQF4k9Ie5PukIPDaXu39mONuPYiqr/4nL6 zQvLC9Xm40Ntf/XYbpKmb/gqkCgrI1PZE5cylyrNso7TmgEeZhhmn4d5LOp5ZlfbA4Pt4G3AdaEQ //t3L45l+RBDObsAYEXAhKd3p5492O+iqZZU28jhGAMPfvXX0+/N5D0UBXr1+dhvPrKrNxFqvbjj OCn8JSlqqd4EngY1JElaRVjY6wr63Js2o1feMNB0oSnXZWC7Joge8bmDPo5stTZMDKhoy4jXEEsM 0b/BGa/uVyvaekVaKYlCJMfSm76vBU/jRbkqyg1ZczpqbhcT9XGAEwiR10m3AGwgNSQZF+R1lt4+ wwLzl+vNmqjYHQar2xDxu4MeqEfWvlpASJp2dS8erXwIAcox9Fqn2hYNM0wM6e3VM7NjGR7wCNjq sZ7o8wf7okEPXk/ANq0o0I1eesO374Wo21U+blOSm31tadMlf8pVb6tvCcjcGfEf6Y5h+z1E8L6x TO3UXAE4C/oUcqD/c4N97jJ8FtPdRDFUqkv//OHEz+dK/X62aRAcQw7HfPd1Rr6wq93F3v3vMp/b ILcPAWGP69GdSR9JKAaUqNau/S+Xqt+9sCw05Lt6/BzH/wowALWbjrMDkCkwAAAAAElFTkSuQmCC") + + symbol#svg_quora(viewBox="0 0 201 56") + path(fill="#b92b27" d="M29 43.62c-1.93-3.77-4.18-7.6-8.57-7.6-.84 0-1.68.15-2.45.5l-1.5-2.98c1.83-1.56 4.77-2.8 8.54-2.8 5.87 0 8.88 2.83 11.27 6.44 1.42-3.08 2.1-7.24 2.1-12.4 0-12.88-4.04-19.5-13.45-19.5-9.27 0-13.28 6.62-13.28 19.5 0 12.82 4 19.36 13.28 19.36 1.47 0 2.8-.16 4.04-.52zm2.3 4.5c-2.05.54-4.2.85-6.35.85C12.6 48.96.5 39.1.5 24.76.5 10.32 12.6.48 24.96.48c12.56 0 24.53 9.77 24.53 24.3 0 8.1-3.77 14.67-9.26 18.9 1.78 2.67 3.6 4.43 6.14 4.43 2.77 0 3.9-2.14 4.08-3.82h3.6c.22 2.24-.9 11.53-11 11.53-6.1 0-9.33-3.53-11.76-7.68zm26.12-12.3V19.27c0-1.9-.7-2.73-2.86-2.73h-2.3v-4.4H67.3v23.5c0 3.95 2.15 5.7 5.4 5.7 2.7 0 5.37-1.2 6.8-3.9V19.26c0-1.9-.7-2.73-2.85-2.73h-2.45v-4.4h15.2v24.6c0 2.45.92 3.57 3.72 3.57h.5v4.54L80 47v-4.67h-.28c-2.63 3.2-6.34 5.38-11.62 5.38-5.95 0-10.7-3-10.7-11.87m56 7.48c5.36 0 7.4-4.66 7.5-14.04.1-9.2-2.14-13.63-7.5-13.63-4.68 0-7.62 4.45-7.62 13.63 0 9.38 2.9 14.04 7.62 14.04zm0 4.4c-9.7 0-18.43-7.4-18.43-18.44 0-10.84 8.52-18.04 18.42-18.04 10.32 0 18.6 7.34 18.6 18.04 0 11.04-8.28 18.45-18.6 18.45zm18.9-.7v-4.4h1.47c3.62 0 3.97-1.04 3.97-4.2V19.27c0-1.9-.98-2.72-3.2-2.72h-1.97v-4.4h13.82l.7 7.2h.27c1.53-5.18 5.66-7.9 9.52-7.9 3.2 0 5.7 1.8 5.7 5.5 0 2.55-1.25 5.28-4.7 5.28-3.1 0-3.7-2.1-6.26-2.1-2.3 0-4.06 2.17-4.06 5.36V38.4c0 3.16.77 4.2 4.34 4.2h2.02V47h-21.64m46-5.12c4.4 0 6.2-4.17 6.2-8.36v-5.6c-3.2 3.34-10.68 3.46-10.68 9.4 0 2.9 1.72 4.56 4.47 4.56zm6.42-.02c-1.82 3.5-5.55 5.85-10.76 5.85-6.06 0-9.97-3.2-9.97-8.87 0-11.4 15.87-8.36 20.53-15.9v-.83c0-5.8-2.28-6.7-4.8-6.7-7.06 0-3.84 7.6-10.34 7.6-3.14 0-4.35-1.9-4.35-4.02 0-4.3 5.13-7.76 14.75-7.76 9.1 0 14.7 2.52 14.7 11.58v14.47c0 2.24.82 3.45 2.77 3.45.84 0 1.54-.23 2.08-.6l1.16 2.83c-.94 1.47-3.48 4.06-8.3 4.06-4.2 0-6.83-1.95-7.18-5.14h-.28z") + + symbol#svg_stitchfix(viewBox="0 0 224.6 26.6") + path(fill="#2F3237" d="M9.7 11.7l-.3-.1c-4-1.1-5.9-1.9-5.9-5.1 0-2.7 1.6-4.2 4.3-4.2 0 0 5.7 0 7.3 4.7l.1.2H17V0h-1.8l-.7 2.6C12.8 1 10.6 0 8.1 0c-4.7 0-8 3-8 7.3 0 4.8 4 6.2 8.5 7.3 4.5 1.1 6.4 2 6.4 5.3 0 2.9-2.4 4.3-4.5 4.3-3.8 0-6.5-1.5-8.6-4.6l-.1-.2H0v7.2h1.8l.8-3.1c2.2 2.1 4.6 3.1 7.6 3.1 4.8 0 8.2-3.3 8.2-7.7 0-4.9-4-6-8.7-7.2 M22.1 5.5h1.7l.1-.5c.6-2.9.7-2.9 2.7-2.9h4.6v22.3h-2.5v2.1h8.7v-2.1H35V2.1h4.5c2.1 0 2.3 0 2.9 2.9l.1.5h1.7V0H22.1v5.5z M63.2 5.5h1.7L65 5c.6-2.9.7-2.9 2.7-2.9h4.6v22.3h-2.4v2.1h8.7v-2.1h-2.4V2.1h4.5c2.1 0 2.3 0 2.9 2.9l.1.5h1.7V0H63.2v5.5zM49.3 0v2.1h2.5v22.4h-2.5v2.1H58v-2.1h-2.4V2.1H58V0zM132.4 0v2.1h2.5V13h-12.4V2.1h2.4V0h-8.7v2.1h2.6v22.4h-2.5v2.1h8.7v-2.1h-2.5v-9.4h12.4v9.4h-2.5v2.1h8.7v-2.1h-2.4V2.1h2.4V0zM186.4 0v2.1h2.5v22.4h-2.5v2.1h8.7v-2.1h-2.4V2.1h2.4V0zM215.9 0v2.1h2l-5.6 8.1-5.4-8.1h2V0h-8.7v2.1h2.5l7.6 11.3-7.5 11.1h-2.7v2.1h8.7v-2.1H206l5.8-8.7 5.8 8.7h-2.2v2.1h8.7v-2.1h-2.4l-7.8-11.9 7.2-10.5h3.5V0z M161.4 2.1h2.6v22.3h-2.6v2.1h8.7v-2.1h-2.3V15h4c1.5 0 1.6.2 2.1 1.7l.1.2v.2h1.7v-6.6H174v.2c0 .2-.1.3-.2.4-.5 1.2-.7 1.8-2.1 1.8h-4V2.1h9.1c1.7 0 2.1.5 3.1 3v.2h2V0h-20.6l.1 2.1z M108.2 16.1c-.8 5.2-3.6 8.1-7.9 8.1-5.1 0-8.2-4.3-8.2-11.1 0-6.5 3.1-10.7 7.9-10.7 4.6 0 7 2.9 8.1 5.4l.1.2h1.8V0h-2l-.7 2.8C105.4.9 103 0 100.1 0c-6.8 0-12 5.7-12 13.3 0 3.9 1.2 7.2 3.3 9.6 2.1 2.4 5.1 3.6 8.4 3.6 6 0 9.8-3.7 10.6-10.4v-.3h-2.3v.3z") + + symbol#svg_chartbeat(viewBox="0 0 915.7 130.1") + path(fill="#51a4da" d="M157.8 8.6c-8.1 6.8-15.5 13-23 19.1-.8.7-2.2.7-3.4.7H23.3c-.8 0-1.6-.3-2.6-.4V8.6h137.1z") + path(fill="#b3e4fa" d="M0 33.9c2-.1 4.1-.3 6.1-.3H129c-8.7 7.2-16.2 13.5-23.8 19.6-.8.6-2.3.7-3.4.7H2.4c-.8 0-1.7-.3-2.5-.5.1-6.5.1-13 .1-19.5z") + path(fill="#5bc4bf" d="M36 79.2V59.4h63.2C91 66.3 83.6 72.5 76.1 78.7c-.5.4-1.3.5-1.9.5H36z") + path(fill="#657d8c" d="M613.3 49.4c6.5-3.8 12.5-8.7 19.3-10.9 19.6-6.4 39.7 2.9 48 21.8 6.8 15.4 6.3 31-1.3 46-12.1 24.2-47.3 28-66 8-.1 2-.3 3.6-.3 5.2.1 4.3-2 6.4-6.2 6.3-4.2 0-6.2-2.2-6.2-6.4V8.2c0-4.3 2-6.1 6.3-6.1 4.4 0 6.2 2.1 6.2 6.3.2 13.9.2 27.7.2 41zm-.2 30.1c0 2.6-.1 5.1 0 7.7.5 19.7 19.2 33.3 38.2 27.7 13.9-4.1 22.5-18.7 21-35.8-1.2-13.7-6.6-24.9-20.5-29.7-9.8-3.4-19.3-1.6-27.7 4.4-8.7 6.3-13.1 14.7-11 25.7z M561.7 39h27.7c.3 8.4-2.3 11.2-9.9 11.2-5.3 0-10.6 0-15.9.1-.3 0-.6.2-1.3.3-.2 1-.5 2.1-.5 3.2v45.6c0 1.5.1 3.1.2 4.6 1.2 10.6 8.8 15.1 18.7 10.8 3.5-1.5 7-4.1 9.7.8 1.8 3.2-.7 6.9-5.8 9.4-16.6 8-34.1-1.7-34.8-20-.7-16-.2-32.1-.3-48.2v-6.1c-7.6 0-14.6-.6-21.5.2-7.7.9-13.5 5.7-16.1 12.8-2.4 6.6-3.9 13.8-4.4 20.8-.7 11.4-.1 22.9-.2 34.3-.1 5.5-2.7 7.7-7.6 7-4.5-.6-5.2-3.8-5.2-7.5V72.2 45.5c0-4.3 1.1-7.4 6.2-7.5 5.1-.1 6.4 3 6.4 7.3 0 3.1 0 6.1.4 9.9 9-17.9 25.3-17 41.9-16.2 0-5.1.1-9.5 0-13.9s1.6-6.8 6.2-6.7c4.8 0 6.2 2.7 6.1 6.9-.1 4.3 0 8.6 0 13.7z M267.1 127.1c-36.6 0-61.2-28.5-57.6-66.8 4.8-50.7 52.1-62.9 83-48.9 6.3 2.8 11.5 8.2 16.6 13.1 2.6 2.5 3.4 6.6-.4 9.5-3.6 2.8-6.5 1.2-9.3-1.8-12.7-13.6-28.3-17.6-45.8-12.3-17.9 5.4-27 18.9-30.1 36.7-2.4 13.4-.5 26.3 6.5 38.1 14.1 23.7 48.5 28.7 67.2 9.7 2-2 3.8-4.4 5.3-6.9 1.8-2.9 4.4-4 6.9-2.3 1.9 1.3 4 4.7 3.5 6.4-1.1 3.8-3.2 7.6-5.9 10.5-10.8 11-24.7 15-39.9 15z M704.6 85.7c1.5 13.7 7.5 23.6 20 28 13 4.5 25.6 3.4 36.1-6.9 5.2-5.1 7.6-5.9 10.5-3.1 2.8 2.8 1.9 7-2.4 11.7-.6.6-1.2 1.2-1.9 1.8-15.4 11.7-32.5 13.2-49.8 6-16.7-6.9-24.3-20.9-24.9-38.5-.9-24 11.8-42.2 33-46.7 28.6-6.1 50.8 11.2 50.4 43-.1 4.4-2.9 4.8-6.2 4.8h-58.9c-1.9-.1-3.7-.1-5.9-.1zm1.2-11.4h55.9c-.1-15.3-11-26.2-26-26.3-15.6-.2-29.6 12.1-29.9 26.3zM842.8 73.1c1.4-14-5.1-22.5-18.2-24.3-11.1-1.5-20.7 1.6-28 10.3-2.5 2.9-4.9 5.1-8.6 2.4-3.7-2.8-2.7-6.3-.5-9.5 1.5-2.2 3.3-4.5 5.4-6.1 14.4-10.7 30.2-12.1 46.5-5.1 9.5 4.1 15.2 12.3 15.6 22.5.9 18.9.7 37.9.8 56.9 0 3.9-2.3 5.9-6.3 5.8-4-.1-6-2-5.8-6.1.1-1.8 0-3.7 0-6.5-1.6 1.3-2.4 1.9-3.2 2.6-12.4 11.4-26.8 13.7-42.4 8.8-9.1-2.9-14.5-9.4-15.5-19.1-1-9.9 2.6-17.8 11.3-22.9 10.8-6.3 22.9-7.7 35-8.7 4.5-.5 9.1-.7 13.9-1zm-.2 9.7c-9.8 1.2-19.4 2.1-28.9 3.6-3.8.6-7.5 2.2-10.9 4-5.9 3.1-8.4 8.4-7.4 14.4 1 6.2 5.3 9.5 11 10.7 17.7 3.9 40.5-6.1 36.2-32.7z M338.5 50.2c.7-1.1 1.3-2.4 2.2-3.3 10.5-10.7 23.3-12.4 36.9-8.2 13.3 4.1 20 14.6 20.9 27.7 1.2 18 .8 36.2.9 54.3 0 4-2.5 5.4-6.1 5.2-3.9-.1-5.8-2.1-5.8-6.2.1-13.7.1-27.3 0-41 0-3.2-.2-6.5-.7-9.7-1.9-11.5-8.4-18.5-18.2-20-12.1-1.8-23.5 3.1-28.1 13.2-2.1 4.7-3.2 10.1-3.4 15.3-.5 13.7-.1 27.3-.2 41 0 6-3.2 8.7-8.8 7.1-1.8-.5-3.2-2.9-4.5-4.6-.5-.7-.2-2-.2-3V9.9c0-6.2 1.2-7.5 6.3-7.6 5.3-.1 7.1 1.4 7.1 6.9.1 11.8 0 23.6 0 35.4 0 1.6.1 3.3.2 4.9.7.2 1.1.5 1.5.7z M469 73.1c1.3-13.6-5.3-22.3-17.9-24.2-11.3-1.7-21 1.4-28.5 10.2-2.5 2.9-5 5.1-8.6 2.4-3.7-2.8-2.7-6.4-.5-9.6 6.2-9.2 15.4-13.3 25.9-14.6 5.2-.7 10.6-.7 15.8.1 16.6 2.7 26.4 14.3 26.5 31.3.2 16.6.1 33.1 0 49.7 0 5.6-1.6 7.5-6 7.5-5 0-6.4-3.1-6.1-7.5.1-1.4 0-2.7 0-4.8-1.3 1-2.3 1.5-3 2.2-12.1 11.4-26.4 13.7-41.8 9.1-9.8-2.9-15.5-9.9-16.2-20.2-.9-10.1 3.4-17.8 12.4-22.7 10.6-5.7 22.3-7.1 34.1-8.1 4.6-.3 9.2-.5 13.9-.8zm0 9.9c-8.8.9-17.4 1.5-25.9 2.9-4.8.8-9.6 2.4-14 4.6-6.3 3.1-8.8 8.6-7.7 14.7.9 5.3 5.2 9.5 11.7 10.7 18.7 3.1 39.3-7.4 35.9-32.9z M63.9 127.4c-5.1-1.2-8.2-3.2-9.7-7.3-1.7-4.6-.3-8.3 3.2-11.5C68 98.9 78.6 89.2 89.1 79.5c24.2-22.1 48.4-44.3 72.7-66.4.5-.5.9-1.2 1.5-1.3 2-.6 4.1-1 6.1-1.5-.6 2.1-.5 4.7-1.8 6.1-31.8 35.3-63.8 70.4-95.8 105.5-2 2.3-5.2 3.7-7.9 5.5z M873.9 49.4h-8.8c-3.2 0-5.1-2-4.4-4.9.5-2 2.3-4.5 4.2-5.3 2.4-.9 5.3-.2 9-.2 0-4.6-.1-8.8 0-12.9.1-5.9 1.7-7.6 6.5-7.7 5.3-.1 6.1 3.3 6.1 7.4v12.9h27.8c-.2 8.1-2.7 10.6-9.7 10.7h-18.3v12.9l.3 35.9c0 1.5 0 3.1.2 4.6.9 12 8.5 16.6 19.5 11.6 3.3-1.5 6.6-3.2 8.8 1.1 2.1 4-.9 6.4-3.8 8.4-14.4 9.7-34.8 1-36.3-16.2-1.3-14.2-.8-28.7-1-43-.1-4.8-.1-9.6-.1-15.3z") + + symbol#svg_allenai(viewBox="0 0 610 103") + path(fill="#FFE266" d="M87.446 21.648c-.8 0-1.6-.014-2.397.01-.177.006-.42.11-.5.247-.062.104.047.363.152.497.63.803 1.292 1.58 1.917 2.388.115.15.21.452.135.574-.08.13-.38.194-.57.174-1.09-.113-2.173-.263-3.26-.395-.607-.074-.776.146-.548.71.447 1.11.9 2.218 1.35 3.327.09.222.218.49-.05.626-.15.078-.43.04-.593-.052-1.16-.65-2.303-1.333-3.458-1.993-.39-.222-.52-.504-.41-.955.3-1.227.998-2.204 1.893-3.046 1.4-1.317 2.212-2.923 2.533-4.812.756-4.46-2.55-8.847-6.994-9.385-4.702-.57-9.366 3.225-9.05 8.6.128 2.157.943 4.006 2.517 5.508.923.882 1.675 1.868 1.98 3.143.1.42.002.71-.38.93-1.166.67-2.32 1.36-3.495 2.018-.16.09-.398.043-.6.06-.014-.204-.096-.432-.03-.605.422-1.104.877-2.194 1.32-3.29.26-.648.097-.86-.586-.774-1.07.137-2.14.28-3.215.39-.187.02-.49-.062-.56-.19-.068-.13.04-.42.156-.573.607-.783 1.252-1.537 1.86-2.318.12-.155.24-.434.177-.57-.062-.136-.355-.228-.548-.23-1.54-.013-3.078 0-4.617.005-.255 0-.583.026-.59-.296-.006-.18.212-.436.397-.538 1.243-.684 2.508-1.326 3.753-2.007.177-.097.282-.33.42-.498-.18-.127-.342-.323-.54-.373-1.52-.377-3.048-.716-4.567-1.097-.185-.046-.327-.266-.49-.405.163-.14.306-.36.49-.402 1.698-.395 3.405-.752 5.105-1.142.188-.043.345-.224.517-.34-.12-.17-.2-.393-.36-.5-1.32-.874-2.654-1.726-3.983-2.584-.063-.04-.152-.064-.184-.12-.09-.167-.158-.345-.235-.518.174-.076.358-.234.518-.212 1.084.145 2.163.328 3.244.5.467.074.932.172 1.402.212.177.015.43-.053.528-.178.073-.093.003-.37-.087-.51-.944-1.484-1.906-2.958-2.863-4.435-.04-.062-.108-.12-.117-.186-.026-.2-.03-.4-.04-.602.2.002.444-.07.596.018 1.178.683 2.336 1.396 3.5 2.1.494.297.98.613 1.486.885.156.084.44.132.55.047.112-.088.146-.372.105-.545-.45-1.943-.92-3.88-1.392-5.82-.063-.26-.12-.51.176-.65.315-.15.455.108.598.31 1.164 1.642 2.32 3.29 3.494 4.92.12.17.354.26.535.387.12-.2.316-.39.347-.602.45-2.39 1.082-4.377 1.354-5.93.04-.268.08-.543.4-.555.36-.013.39.28.43.557.336 1.762 1.266 3.96 1.33 5.71.043.28.156.69.352.777.387.172.517-.284.694-.53 1.093-1.53 2.174-3.065 3.26-4.6.05-.07.087-.172.157-.21.174-.094.364-.16.547-.237.063.19.214.402.176.57-.366 1.614-.763 3.22-1.15 4.83-.087.36-.197.715-.247 1.08-.026.178 0 .455.11.535.116.083.398.037.548-.052 1.628-.964 3.245-1.95 4.865-2.928.228-.138.5-.353.69-.047.093.15.026.484-.086.66-.93 1.478-1.893 2.932-2.827 4.406-.12.19-.13.45-.19.676.245.045.498.16.73.126 1.448-.21 2.89-.454 4.336-.686.25-.04.522-.102.633.225.107.32-.144.45-.354.587-1.34.868-2.69 1.725-4.02 2.607-.168.11-.25.353-.373.533.174.11.334.28.523.322 1.628.37 3.26.717 4.893 1.073.115.025.25.024.34.088.13.095.323.245.313.355-.013.146-.17.348-.312.4-.372.133-.77.2-1.158.29-1.18.275-2.363.536-3.537.835-.21.053-.378.262-.566.4.146.163.262.383.445.482 1.206.66 2.426 1.292 3.64 1.935.066.035.154.054.192.108.115.164.21.342.313.514-.166.09-.33.252-.5.26-.797.026-1.597.01-2.396.01.002-.003.002-.008.002-.012z") + path(fill="url(#gradient_allenai1)" d="M71.603 33.652c-.09-.64-.137-1.244-.264-1.832-.712-3.286-1.683-6.49-3.134-9.532-.502-1.054-1.07-2.076-1.304-3.233-.475-2.357-.127-4.583 1.133-6.643 1.34-2.192 3.3-3.552 5.795-4.066 2.904-.598 5.526.072 7.798 2.007 1.602 1.365 2.556 3.113 2.95 5.163.406 2.103.066 4.105-.988 5.968-.82 1.452-1.652 2.897-2.143 4.503-.34 1.117-.653 2.24-.99 3.36-.034.11-.138.253-.236.28-2.556.677-4.873 1.887-7.142 3.203-.476.276-.963.537-1.475.822z") + path(fill="#3D3D3D" d="M610.03 87.8v2.818h-13.405v-17.93h13.277v2.817h-10.13v4.663h8.98v2.818h-8.98V87.8zM584.123 75.272c-3.404 0-5.912 2.818-5.912 6.328v.05c0 3.51 2.484 6.354 5.913 6.354 2.2 0 3.607-.87 5.14-2.307l2.024 2.05c-1.866 1.946-3.914 3.177-7.27 3.177-5.217.004-9.104-4.07-9.104-9.22v-.053c0-5.097 3.81-9.27 9.233-9.27 3.303 0 5.298 1.15 7.013 2.792l-2.022 2.327c-1.435-1.332-2.967-2.228-5.015-2.228zM566.425 90.618L556.55 77.86v12.758h-3.1v-17.93h2.919l9.6 12.4v-12.4h3.09v17.93zM547.68 87.8v2.818h-13.406v-17.93h13.28v2.817H537.42v4.663h8.98v2.818h-8.98V87.8zM520.52 83.345V80.6h7.627v7.535c-1.766 1.51-4.298 2.794-7.472 2.794-5.608 0-9.292-4-9.292-9.226v-.052c0-5.02 3.838-9.27 9.236-9.27 3.12 0 5.04.87 6.885 2.433l-1.996 2.382c-1.385-1.178-2.737-1.922-5.015-1.922-3.303 0-5.81 2.896-5.81 6.328v.05c0 3.688 2.434 6.406 6.094 6.406 1.685 0 3.22-.54 4.322-1.36v-3.355h-4.58zM502.203 72.687h3.146V90.62h-3.147zM484.148 90.618v-17.93h3.147v15.06h9.418v2.87zM466.272 90.618v-17.93h3.15v15.06h9.413v2.87zM460.495 87.8v2.818h-13.402v-17.93h13.274v2.817h-10.13v4.663h8.982v2.818h-8.984V87.8zM436.045 75.606v15.012h-3.17V75.606h-5.685v-2.92h14.533v2.92zM419.19 90.618l-9.874-12.758v12.758h-3.097v-17.93h2.915l9.595 12.4v-12.4h3.095v17.93zM396.25 72.687h3.145V90.62h-3.146zM368.475 90.618v-17.93h3.146v15.06h9.415v2.87zM355.488 72.56h-2.92l-7.878 18.06h3.225l1.842-4.33h8.47l1.814 4.33h3.327l-7.88-18.06zm-4.58 10.936l3.068-7.172 3.097 7.172h-6.166zM336.25 72.687h3.145V90.62h-3.144zM323.568 75.272c-3.4 0-5.91 2.818-5.91 6.328v.05c0 3.51 2.484 6.354 5.91 6.354 2.202 0 3.61-.87 5.143-2.307l2.024 2.05c-1.867 1.946-3.916 3.177-7.27 3.177-5.218.004-9.104-4.07-9.104-9.22v-.053c0-5.097 3.81-9.27 9.234-9.27 3.302 0 5.298 1.15 7.01 2.792l-2.02 2.327c-1.434-1.332-2.967-2.228-5.016-2.228zM305.18 72.687h3.143V90.62h-3.144zM289.323 75.557v4.89h9.032v2.87h-9.032v7.3h-3.146v-17.93h13.33v2.87zM276.203 72.687h3.146V90.62h-3.147zM264.98 75.606v15.012h-3.173V75.606h-5.682v-2.92h14.534v2.92zM247.33 83.83c2.483-.718 4.25-2.483 4.25-5.43v-.052c0-1.562-.537-2.896-1.485-3.868-1.148-1.128-2.916-1.794-5.168-1.794h-7.982v17.932h3.146v-6.25h3.94l4.403 6.25h3.734l-4.836-6.788zm-7.237-2.254v-6.02h4.58c2.328 0 3.71 1.05 3.71 2.97v.054c0 1.816-1.434 2.996-3.686 2.996h-4.604zM223.96 72.56h-2.92l-7.883 18.06h3.226l1.842-4.33h8.47l1.816 4.33h3.327l-7.878-18.06zm-4.583 10.936l3.068-7.172 3.098 7.172h-6.166zM199.913 79.702c-.742 0-.972-.485-.972-.947 0-.486.13-.616.13-.744 0-.178-.103-.253-.333-.253-1.202 0-3.326 2.74-3.684 3.945l-1.866 6.353h-1.994l2.966-10.09h-1.767l.102-.412h.948c1.306 0 2.354-.053 3.044-.562l-1.05 3.175.05.053c.694-1.254 2.508-3.074 4.12-3.074 1.126 0 1.636.616 1.636 1.28 0 .845-.69 1.278-1.33 1.278zM184.16 76.99c-3.785 0-6.65 3.69-6.65 6.89 0 2.486 1.33 4.484 4.145 4.484 3.07 0 6.422-3.098 6.422-7.25 0-2.588-2.126-4.124-3.916-4.124zm.025 9.428c-.23.36-1.02 1.538-2.608 1.538-1.46 0-2.226-1-2.226-2.23 0-1.205 1.383-5.635 1.92-6.558.563-.974 1.435-1.768 2.737-1.77 1.458 0 2.226.794 2.226 2.052 0 1.487-1.382 5.842-2.048 6.968zM179.1 71.816c-.743 0-1.23-.538-1.23-1.1 0-.69.41-.82.41-1.05 0-.21-.207-.21-.36-.21-1.535 0-2.915 3.947-3.25 5.18l-.793 2.92h2.688l-.076.41h-2.687c-1.51 5.226-2.662 10.144-3.814 12.474-1.74 3.536-2.765 4.228-4.375 4.228-.87 0-1.538-.77-1.538-1.485 0-.77.566-1.278 1.152-1.278.69 0 1.15.433 1.15 1.05 0 .742-.487.742-.487 1.05 0 .18.156.255.384.255.436 0 1.434-.385 2.124-2.51.897-2.767 2-9.017 3.305-13.782h-2.254l.105-.41h2.252c.742-2.92 1.968-5.204 3.352-6.64 1.253-1.278 2.33-1.866 3.453-1.866.92 0 1.712.64 1.712 1.588 0 .69-.56 1.176-1.226 1.176zM517.48 56.98v2.395h-16.987v-23.3h16.818v2.398h-14.19v7.955h12.698v2.398H503.12v8.154zM484.43 38.508v20.87h-2.66v-20.87h-7.81v-2.434h18.285v2.434zM456.373 59.742c-5.752 0-9.676-3.525-9.676-10.117v-13.55h2.628v13.384c0 5.024 2.69 7.854 7.11 7.854 4.293 0 7.02-2.594 7.02-7.69v-13.55h2.624v13.35c0 6.793-3.892 10.318-9.707 10.318zM431.003 38.508v20.87h-2.656v-20.87h-7.814v-2.434h18.28v2.434zM409.43 36.074h2.623v23.303h-2.624zM393.133 38.508v20.87h-2.656v-20.87h-7.814v-2.434h18.284v2.434zM368.566 46.467c5.185 1.132 7.578 3.027 7.578 6.588v.066c0 3.996-3.32 6.593-7.945 6.593-3.693-.002-6.716-1.232-9.508-3.732l1.63-1.93c2.427 2.196 4.753 3.3 7.98 3.3 3.123 0 5.185-1.67 5.185-3.963v-.068c0-2.163-1.163-3.396-6.052-4.427-5.352-1.164-7.81-2.896-7.81-6.723v-.065c0-3.662 3.224-6.358 7.646-6.358 3.39 0 5.82.967 8.18 2.862l-1.528 2.03c-2.162-1.765-4.324-2.53-6.718-2.53-3.024 0-4.954 1.665-4.954 3.762v.067c0 2.195 1.197 3.426 6.316 4.527zM348.22 59.377L333.19 40.27v19.107h-2.56V36.074h2.46l14.66 18.676V36.074h2.56v23.303zM317.865 36.074h2.626v23.303h-2.625zM292.33 59.377L277.306 40.27v19.107h-2.56V36.074h2.46l14.66 18.676V36.074h2.56v23.303zM266.13 56.98v2.395h-16.987v-23.3h16.822v2.398H251.77v7.955h12.7v2.398h-12.7v8.154zM225.24 59.377V36.074h2.625v20.874h13.1v2.43zM201.335 59.377V36.074h2.626v20.874h13.1v2.43zM182.815 35.908h-2.46l-10.604 23.47h2.693l2.76-6.16h12.664l2.726 6.16h2.828l-10.605-23.47zm-6.582 14.914l5.32-11.848 5.284 11.848h-10.604z") + path(fill="url(#gradient_allenai2)" d="M108.15 90.71l15.184-23.13c5.5-8.402 8.25-15.42 8.25-21.055 0-6.14-2.144-10.94-6.428-14.4-4-3.227-10.812-4.947-17.815-5.163v-.023c-.167 0-.335.008-.503.01-.16-.003-.322-.01-.483-.01l.003.022C86.763 27.352 66 39.38 48.067 53.756L39.15 28.02H25.99L0 103.018h14.627S25.14 88.742 40.887 73.58l9.625 29.437h14.626l-13.546-39.09c5.52-4.648 11.43-9.11 17.588-12.973v52.063h13.16V43.88c8.4-3.722 17.02-5.946 25.504-5.757 6.715 0 10.073 2.802 10.073 8.402 0 4.725-2.346 10.544-7.035 17.46l-23.484 34.57v3.846h48.59V90.71h-27.84zM23.33 76.395l9.237-28.252 4.81 14.715c-5.06 4.56-9.782 9.158-14.048 13.537z") + path(fill="#3181AF" d="M71.614 33.688c.03.13.08.244.14.35 2.87-1.623 5.767-3.1 8.676-4.432.037-.115.08-.228.113-.343.037-.13.072-.26.11-.39H70.58c.25.998.478 2.003.658 3.02.107.602.24 1.2.376 1.795z") + + + //- spaCy features + + symbol#svg_thoughtworks(viewBox="35 20 150 25") + path(fill="#001e2b" d="M175.1 28.47a2 2 0 1 1 2 2 2 2 0 0 1-2-2m3.46 0A1.47 1.47 0 1 0 177.1 30a1.45 1.45 0 0 0 1.46-1.53m-.48 1.1h-.52l-.48-.92h-.36v.92h-.46V27.4h1.05c.57 0 .84.16.84.67 0 .4-.2.56-.58.58zm-.77-1.24c.26 0 .42-.05.42-.32 0-.3-.3-.26-.5-.26h-.5v.6zM49.68 24.5h-4.6v14.74h-3.56V24.5h-4.6v-3h12.76v3M54.4 27.8a6.14 6.14 0 0 1 3.8-1.6c1.4 0 3.36.84 3.36 3.98v9.05h-3.38v-7.68c0-1.02.08-2.64-1.38-2.64a3.5 3.5 0 0 0-2.4 1.4v8.94h-3.37V21.5h3.37v6.3M62.95 32.85c0-3.4 1.87-6.65 5.6-6.65s5.62 3.26 5.62 6.65c0 3.38-1.9 6.66-5.6 6.66s-5.62-3.27-5.62-6.65m7.76 0c0-1.6-.32-4.17-2.14-4.17s-2.14 2.58-2.14 4.17.32 4.17 2.14 4.17 2.14-2.57 2.14-4.17M82.8 37.92a6.16 6.16 0 0 1-3.8 1.6c-1.4 0-3.35-.86-3.35-4v-9.05h3.37v7.68c0 1.03-.06 2.65 1.4 2.65a3.5 3.5 0 0 0 2.4-1.4v-8.93h3.37v12.77h-3.4v-1.32M91.7 35.04a.87.87 0 0 0-.96.8c0 1.66 8.85-1.23 8.85 3.76 0 1.9-1.3 3.9-6.35 3.9-4.4 0-5.9-1.55-5.9-3.2a2.2 2.2 0 0 1 1.4-1.95 2.03 2.03 0 0 1-1-1.62 2.9 2.9 0 0 1 1.65-2.55 4.8 4.8 0 0 1-1.6-3.5c0-2.84 2.4-4.48 5.15-4.48a6.13 6.13 0 0 1 3.15.9 3.13 3.13 0 0 1 2.3-1.06 4.97 4.97 0 0 1 .98.1v2.36a3 3 0 0 0-1.07-.27 1.86 1.86 0 0 0-.9.27 5.1 5.1 0 0 1 .68 2.17c0 2.82-2.37 4.46-5.13 4.46l-1.25-.1m-1.07 4.23a.88.88 0 0 0-.53.8c0 1.18 2.4 1.25 3.2 1.25.57 0 3.53-.06 3.53-1.08 0-.66-.45-.6-2.46-.7zm2.32-6.36c1.42 0 1.83-1.16 1.83-2.37 0-1.17-.55-2.15-1.83-2.15-1.4 0-1.84 1.2-1.84 2.4 0 1.16.55 2.12 1.85 2.12M104.2 27.8a6.14 6.14 0 0 1 3.82-1.6c1.4 0 3.35.84 3.35 3.98v9.05H108v-7.68c0-1.02.07-2.64-1.4-2.64a3.5 3.5 0 0 0-2.4 1.4v8.94h-3.36V21.5h3.37v6.3M117.5 26.47h2.63v2.8h-2.62v6.5c0 .62.2 1.25 1.28 1.25a2.4 2.4 0 0 0 1.35-.47v2.57a7.83 7.83 0 0 1-2.17.4c-2.1 0-3.83-1.2-3.83-3.98v-6.27h-1.57v-2.8h1.57v-3.2h3.38v3.2M134.17 39.24h-1.82l-3-14.5h-.06l-3.18 14.5h-1.82l-3.72-17.74h1.78l2.92 14.32h.05l3.2-14.32h1.74l3.04 14.32h.05l3.12-14.32h1.75l-4.05 17.74M137.46 32.94c0-4.7 2.23-6.65 5.03-6.65s5.03 1.93 5.03 6.64-2.24 6.66-5.04 6.66-5.04-1.94-5.04-6.66m8.3 0c0-2.14-.53-5.15-3.27-5.15s-3.26 3-3.26 5.14.52 5.16 3.25 5.16 3.26-3 3.26-5.16M150.7 29.36h.05c.7-1.5 1.6-2.9 3.48-2.9h.7v1.63c-2.34-.33-3.55 2.18-4.23 4v7.14h-1.78v-12.6h1.78v2.72M158.13 32.5l4.68-5.85h2l-3.48 4.3 4 8.3h-1.92l-3.22-6.85-2.05 2.53v4.3h-1.78V21.5h1.78v11M173.02 29.46a3.26 3.26 0 0 0-2.88-1.67c-1.16 0-2.25.58-2.25 1.86 0 3.08 6.62 1.73 6.62 5.97a3.84 3.84 0 0 1-4.12 3.97 5.17 5.17 0 0 1-4.7-2.64l1.4-.9a3.5 3.5 0 0 0 3.3 2.04 2.2 2.2 0 0 0 2.46-2.14c0-3.17-6.63-1.66-6.63-6.18a3.56 3.56 0 0 1 3.85-3.5 4.83 4.83 0 0 1 4.2 2.2l-1.26.98") + + symbol#svg_wapo(viewBox="0 0 268 206") + path(fill="#111" d="M118.13 17.98v25.04c3.4-1.83 5.76-5 6.9-8.6l.28.14c-.74 8.93-6.83 17.86-16.3 17.86-9.54 0-16.58-7.1-16.58-18.47 0-8.53 5.55-13.88 12.65-18.68-1-.27-2.1-.4-3.18-.4-4.88 0-7.72 3.3-7.72 6.7h-.4c-.08-.48-.08-.95-.08-1.43 0-6.02 3.2-13.33 10.9-13.33 4.94 0 8.73 4.54 14.48 4.54 2.3 0 5.15-1.08 6.3-3.58h.2c-.07 4.4-1.42 8.93-7.45 10.22zm3.66 25.64c-3.4 3.6-7.05 6.64-11.8 6.64-8.78 0-15.55-6.9-15.55-16.92 0-5.9 2.44-9.07 5.14-12.8h-.28c-1.7 1.7-6.16 5.96-6.16 13.2 0 11.1 6.97 17.94 16.1 17.94 6.37 0 10.7-4.4 12.66-8l-.13-.05zm2.7-32.81c-1.16 2.17-3.6 4.94-8.53 4.94-4.94 0-9.48-3.38-13.47-3.38-3.65 0-6.16 2.44-7.1 4.26l.06.14c1.3-1.3 3.25-2.57 6.43-2.57 5.27 0 8.65 3.24 14 3.24 5.7 0 8.26-3.73 8.73-6.57l-.14-.06zm-18.82 4.67c-3.45 3.6-6.63 7.52-6.63 15.16 0 4.2 1.42 8.53 4.6 11.24l1.96-1.02V22.7l-1.8.96-.35-.68 9.47-5.14c-2.57-.54-4.87-1.7-7.24-2.37zm11.7 2.64c-.47.08-.94.08-1.48.08-.95 0-1.83-.07-2.7-.27v19.77l-8.87 4.8c1.83 1.36 4.06 2.17 6.9 2.17 2.3 0 4.33-.48 6.16-1.3V18.12zm-9.74 3.46l-1.28.75v18.14l1.28-.67v-18.2zm38.9 2.58v23.4c0 6.5-5.74 10.9-12.17 12.2l-.13-.28c3.18-1.56 5-4.74 5-8.12V27.1l-3.65-3.3-1.43 1.55v18.88l2.03 1.83v.14l-5.48 5.95-6.3-5.75v-.27l2.44-2.57v-29.9L134.04 6l.13.07V24.2l5.9-6.36 6.15 5.55 1.15-1.23.54.48-1.35 1.5zm-18.93 22.12v-.13l1.43-1.42V12.5L127.6 14v30.03l-2.16 2.17v.13l5.28 4.74.95-1.08-4.06-3.74zm13.8-20.23l-4.4-3.8-.93 1.02 3.92 3.52v24.37c0 1.62-.35 3.3-.96 4.26l.07.07c1.7-1.22 2.3-3.05 2.3-5.42V26.03zm15.9 11.7v3.46l6.58 5.13 3.8-4.06.53.54-8.8 9.42-8.92-7.18-1.36 1.43-.54-.55 1.56-1.62V27.18l12.8-9.34 6.7 10.83-12.33 9.07zm-5 5.96V26.5l-1.42 1.02v16.85l8.4 6.83 1.08-1.14-8.05-6.37zm5.15-20.85l-.14.07V36.8l6.04-4.4-5.9-9.55zm1.76-1.35l-1.2.88 5.95 9.54 1.22-.88-5.96-9.54zM31.74 115.16l-9.4-8.13-7.18 8.13-9.75-8.4V93.5H3.53c-1.7 0-2.57 1.08-2.98 2.37h-.2C.2 95.33 0 94.37 0 93.3c0-1.76.47-6.36 5.4-6.36V75.3c0-2.24-2.63-3.12-2.63-6.1 0-3.85 3.66-7.64 10.36-10l.27.2c-2.44 1.4-3.72 2.77-3.72 5.68 0 4.46 4.33 3.3 4.33 10.35v2.7l7.93-8.32 8.32 8.2 7.85-8.2 7.58 7.46v25.04l-13.94 12.86zm-24.16-9.48V91.4h-3.8c-1.95 0-2.83 1.3-2.97 2.44l.08.07c.68-.74 1.35-1.14 2.9-1.14h2.38v13.67l8.93 7.7 1-1.2-8.52-7.25zm0-31.06c0-2.78-2.44-3.72-2.44-5.48 0-2.44.95-4.47 2.44-6.36l-.14-.07c-2.03 1.57-3.92 4.07-3.92 6.5 0 2.44 2.64 3.6 2.64 5.76v11.98h1.42V74.62zm14.28 6.77l-5.14-5.02-2.7 2.77v23.96l6.15 5.22 1.7-1.9V81.4zm2.16 24.15v-25.1l-5.75-5.7-1.08 1.1 5.4 5.2v25.24l9.14 7.9 1.08-1-8.8-7.65zM37.15 80.5l-4.26-4.05-2.45 2.5v24.1l6.64 5.8.05-.06V80.5zm2.17-.94l-4.94-4.8-1.02 1.08 4.54 4.33v28.3l1.42-1.37V79.56zM68.07 115.16l-6.43-5.82-5.75 5.8-7.05-6.2-.94 1-.53-.54 1.2-1.28V89.98l12.74-9.2 7.3 5.68 1.3-1.35.54.55-1.5 1.56v18.75l3.6 3.32 1.15-1.22.53.47-6.16 6.64zm-17.32-7.52V89.37l-1.42 1.02v17.92l6.5 5.82 1.08-1.08-6.15-5.42zm10.9-17.8l-5.56-4.33-.2.15v19.7l4.6 4 1.14-1.16V89.84zm2.16 18.4v-19.4l-5.74-4.68-1.36.95 5.7 4.48v19.35l5.67 5.14L69.1 113l-5.3-4.75zM87.77 93.1h6.97v14.47l-10.76 7.58c-1.42-1.62-3.45-2.77-5.95-2.77-2.03 0-3.66.68-5.82 2.5l-.34-.13 9.2-13.4h-5.68v-12.6l11.3-7.84c1.35 1.1 2.37 1.7 4.13 1.7 1.36 0 3.32-.27 4.8-1.48l.28.13-8.12 11.84zM80.2 110.4c-1.98 0-3.53.68-4.9 1.62v.14c1.1-.48 2.18-.6 3.2-.6 1.55 0 4 .74 5.6 2.63l1.57-1.14c-1.3-1.5-2.85-2.64-5.48-2.64zm7.22-11.37h-3.8l-7.9 11.44.06.12c1.97-1.42 3.86-2.37 6.16-2.37 2.03 0 4.13.95 5.42 2.57l.06-.06v-11.7zm-9.87 0v-10.9l-1.43 1.02v11.37h5.48l1.1-1.5h-5.16zM91.7 85.78c-1.43 1.02-2.24 1.56-4.6 1.56-1.37 0-3-.6-4.28-1.96l-.13.07v9.88h2.56l6.5-9.48-.07-.06zm-3.26-.6c-1.22 0-2.77-.6-3.8-1.97l-1.68 1.16c1.28 1.56 2.5 2.24 4.4 2.24 1.2 0 2.97-.34 4.8-1.9l.07-.2c-1.15.47-2.57.67-3.8.67zm1.15 11.64h-4.4l-1.02 1.42h4v13.13l1.4-1.02V96.82zm28.48-9.68v23.4c0 6.5-5.75 10.9-12.18 12.2l-.14-.27c3.18-1.56 5-4.74 5-8.13V90.13l-3.64-3.32-1.42 1.56v18.88l2.03 1.82v.14l-5.48 5.96-6.3-5.76v-.27l2.44-2.57v-29.9l7.16-7.66.14.07V87.2l5.9-6.36 6.14 5.55 1.15-1.22.53.47-1.35 1.5zm-18.95 22.13v-.14l1.42-1.42V75.5L99.13 77v30.03l-2.16 2.17v.14l5.27 4.73.95-1.08-4.07-3.73zm13.8-20.24l-4.4-3.8-.94 1.03 3.92 3.52v24.36c0 1.62-.34 3.32-.95 4.26l.07.07c1.7-1.22 2.3-3.05 2.3-5.4V89.02zm17.47 26.13l-5.82-5.35-1.36 1.43-.54-.54 1.56-1.7V89.44l-2.84-2.7-1.1 1.2-.53-.53 6.1-6.62 5.4 4.87 1.36-1.5.6.48-1.7 1.83v19.76l3.26 3.05 1.48-1.56.54.55-6.42 6.9zm-4-6.64V88.36l-3.52-3.25-.94 1.1 3.04 2.9v20.1l5.42 4.87 1-1.08-5-4.48zm2.03-28.28l-5.55-5.08 5.08-5.4 5.55 5.06-5.07 5.42zm-3.45-6.16l-1 1 4.4 4.14 1-1.15-4.4-4zM159 115.16l-5.88-5.35V90.06l-3.6-3.25-1.88 2.03v18.27l2.1 1.96v.27l-5.55 5.82-6.3-5.75v-.2l2.43-2.57V89.57l-3.18-2.9-1.3 1.4-.53-.53 6.16-6.7 6.16 5.5v1.34l6.43-6.84 6.02 5.42 1.34-1.42.6.54-1.6 1.7v19.34l3.03 2.85 1.5-1.63.53.54-6.5 6.97zm-17.86-5.9v-.13c0 .14 1.36-1.35 1.36-1.35V88.56l-3.86-3.52-.95 1 3.38 3.13v17.86l-2.1 2.17v.13l5.2 4.74 1.1-1.15-4.14-3.65zm14.15-.53V88.9l-4.2-3.8-1.1 1.16 3.87 3.45v19.7l5.07 4.74 1.08-1.15-4.73-4.27zm22.8 18.6c-2.24-2.43-3.8-3.45-5.9-3.45-2.23 0-4.8.9-7.44 2.3l-.2-.2 9.34-10.82-6.63-5.28-1.3 1.35-.53-.47 1.5-1.63V89.98l12.84-9.2 7.18 5.68 1.22-1.35.54.55-1.42 1.56v23.15c0 3.52 1.96 3.4 1.96 6.02 0 3.05-4.4 5.9-11.17 10.97zm-9-18.74V89.43l-1.43 1.02v18.74l6.7 5.4 1.02-1.2-6.3-4.8zm4.73 13.53c-2.23 0-4.26.68-6.16 1.96v.13c1.22-.48 2.57-1.1 4.88-1.1 2.1 0 3.85 1.16 5.6 3.2l1.37-1.1c-1.7-1.95-3.73-3.1-5.7-3.1zm8.26-6.5c-1.7-1.08-2.1-2.23-2.1-5.15v-1.22l-11.25 13 .07.07c2.17-1.3 4.13-2.24 7.3-2.24 2.72 0 4.54 1.08 6.64 2.84 1.3-1.1 2.17-2.17 2.17-3.86 0-1.35-1.15-2.37-2.84-3.45zM180 89.85l-5.63-4.4-.13.13v20.78l4.33 3.38 1.42-1.62V89.85zm4.12 24.83c-1.76-1.35-1.97-2.5-1.97-5.4V88.7l-5.68-4.6-1.3.87 5.56 4.4v20.84c0 2.92.14 3.74 1.96 4.95 1.62 1.08 2.9 2.23 2.9 3.8 0 .4-.06 1.07-.06 1.07l.06.07c.34-.35.75-.9.75-1.77 0-1.48-.75-2.5-2.23-3.65zm16.24.47l-6.23-4.87-1.3 1.43-.53-.54 1.5-1.62v-23.7h-3.93l-.14-.12 2.37-3.52h1.7v-4.53l7.16-7.65.14.13V82.2h5.4l.15.13-2.37 3.52h-3.18v20.5l3.72 2.85 1.42-1.56.54.55-6.42 6.95zm-4.4-38.64l-1.42 1.57v4.13h1.42v-5.7zm0 32.36v-23h-1.42v23.8l5.75 4.48 1-1.08-5.34-4.2zm32.96-21.05v18.96l-11.44 8.46-8.6-6.5-1 1.16-.56-.54 1.22-1.36V89.44l11.98-8.6 7.98 6.23 1.3-1.35.53.54-1.4 1.55v.02zm-18.2 19.5V88.84l-1.43 1.02v18.2l8.1 6.23 1.3-.95-8-6.02zm10.9-17.25l-5.7-4.47-.07.07v20.17l5.76 4.33v-20.1zm2.15-1.22l-6.3-4.87-1.28.95 6.15 4.74v21.05l1.42-1.1V88.84zm31 26.33l-5.9-5.35V90.06l-3.58-3.25-1.9 2.03v18.27l2.1 1.96v.27l-5.56 5.82-6.3-5.75v-.2l2.45-2.57V89.57l-3.2-2.9-1.28 1.4-.54-.53 6.16-6.7 6.15 5.5v1.34l6.42-6.84 6.03 5.42 1.35-1.42.6.54-1.62 1.7v19.34l3.05 2.85 1.5-1.63.53.54-6.5 6.97zm-17.87-5.9v-.13c0 .14 1.35-1.35 1.35-1.35V88.56l-3.85-3.52-.95 1 3.4 3.13v17.86l-2.1 2.17v.13l5.2 4.74 1.08-1.15-4.13-3.65zm14.14-.53V88.9l-4.2-3.8-1.07 1.16 3.85 3.45v19.7l5.08 4.74 1.08-1.15-4.74-4.27zM105.56 182.32c-1.9-2.03-2.57-2.7-4.8-3.32v13.27l-.14.06-2.7-2.44-7.86 7.24-.14-.07v-18.2c-2.36.54-4.87 1.76-7.3 4.2l-.14-.07c.47-5.22 3.04-9.07 7.44-10.56v-13.2H88.5c-1.96 0-3.05 1.02-4 2.85h-.2c-.2-.62-.33-1.57-.33-3.12 0-2.85 2.1-5.82 5.55-5.82h.4v-7.32l-2.77-2.5-1.36 1.35-.48-.48 6.83-7.24 6.36 5.82v6.16l1.5-1.63v-7.78h.74v7.1l9-9.67 7.65 6.97v29.44l-11.84 8.92zm-15.63-5.96c-2.78.54-4.74 2.24-6.02 4.47l.07.14c1.9-1.62 3.66-2.37 5.96-2.9v-1.7zm2.16-19.42h-3.73c-2.57 0-3.6 1.63-3.65 3.52l.06.07c.82-1.35 1.63-1.83 3.25-2.03h2.64v36.88l1.42-1.35v-37.1zm0-12.18l-3.4-3.1-1.07 1.14 3.04 2.7v7.65h1.42v-8.4zm7.9 3.86l-1.48 1.55v39.2l1.5 1.34v-42.08zm8.88-1.56l-4-3.65-4.12 4.48v23.82c3.52.34 5.95 1.35 8.05 3.65l.07-.07v-28.22zm-8.12 29.3v1.77c2.3.54 3.24 1.22 4.87 3.1l1.55-1.2c-1.62-2.04-3.24-3.26-6.42-3.67zm10.28-30.38l-4.6-4.27-1.1 1.16 4.28 3.93v31.46l1.42-1.08v-31.2zm29.98 9v18.95l-11.44 8.46-8.6-6.5-1 1.14-.55-.54 1.22-1.36V156.6l11.97-8.6 8 6.24 1.27-1.36.53.54-1.4 1.56zm-18.2 19.5v-18.5l-1.43 1.03v18.2l8.1 6.24 1.3-.94-8-6.03zm10.9-17.27l-5.7-4.46-.06.07V173l5.75 4.33v-20.1zm2.15-1.2l-6.3-4.88-1.27.95 6.15 4.74v21.05l1.42-1.08V156zm20.84 4.26h7v14.48l-10.77 7.58c-1.43-1.63-3.46-2.78-5.96-2.78-2.03 0-3.65.68-5.82 2.5l-.34-.13 9.22-13.38h-5.7v-12.6l11.3-7.85c1.37 1.1 2.38 1.7 4.14 1.7 1.35 0 3.3-.28 4.8-1.5l.28.14-8.13 11.86zm-7.56 17.32c-1.97 0-3.52.68-4.88 1.63v.15c1.1-.48 2.17-.6 3.18-.6 1.56 0 4 .73 5.62 2.63l1.56-1.15c-1.3-1.5-2.85-2.65-5.48-2.65zm7.24-11.37h-3.8l-7.9 11.45.05.14c1.97-1.44 3.86-2.38 6.16-2.38 2.02 0 4.12.94 5.4 2.57l.07-.08v-11.7zm-9.88 0v-10.88l-1.43 1v11.38h5.48l1.1-1.5h-5.15zm14.14-13.25c-1.42 1.02-2.23 1.56-4.6 1.56-1.36 0-2.98-.6-4.27-1.96l-.14.07v9.9h2.57l6.5-9.48-.06-.07zm-3.25-.6c-1.23 0-2.78-.62-3.8-1.97l-1.7 1.15c1.3 1.55 2.52 2.23 4.4 2.23 1.23 0 3-.34 4.8-1.9l.08-.2c-1.15.48-2.57.68-3.8.68zm1.14 11.63h-4.4l-1 1.42h3.98v13.13l1.42-1v-13.55zm16.38 18.34l-6.23-4.87-1.3 1.42-.54-.54 1.5-1.63v-23.68h-3.93l-.14-.14 2.36-3.52h1.7v-4.53l7.16-7.65.14.14v12.04h5.4l.15.14-2.36 3.52h-3.18v20.5l3.72 2.85 1.42-1.56.54.55-6.42 6.97zm-4.4-38.64l-1.42 1.55v4.13h1.42v-5.68zm0 32.35v-23h-1.42v23.8l5.75 4.47 1.02-1.08-5.35-4.2z") + + symbol#svg_venturebeat(viewBox="0 0 1743 222.2") + path(d="M208 0v44.4c-3.5 0-6.5.4-9.4-.1-4.1-.8-5.5.9-6.6 4.5-13.9 45-28 89.9-42 134.8-3.2 10.3-6.3 20.7-9.8 30.9-.5 1.4-2.5 3.3-3.8 3.3-22.5.2-45 .1-67.8.1-.5-1.4-1.1-2.7-1.6-4.1-17.4-55-34.8-110.1-52-165.1-1.2-3.7-2.7-5.1-6.7-4.5-2.6.5-5.5-.1-8.3-.2V0h94v44.3H74.9c10.5 41.1 20.9 81.7 31.3 122.3.3 0 .6.1 1 .1 11.2-40.6 22.4-81.3 33.8-122.5h-18.9V0H208z M356 58.3h63.2c.6 7.4 1.2 14.7 1.9 22.2 3.8-4.4 7-8.9 11-12.4 17.9-15.4 38.5-18.4 60.2-10.4 16.4 6.1 23.4 19.6 23.7 36.5.4 24.1.2 48.3.2 72.5v6.6l12.9.6v43.7h-70.8V212v-92.5c0-8.4-2.9-12.7-9.3-14.8-6.7-2.2-13.6 0-18.2 6-1.1 1.4-1.9 3.1-2.7 4.8-.5 1.2-1 2.6-1 3.8-.1 17.9 0 35.8 0 54.2h9.7v44.1H356v-43.9h12.3v-70.8h-12.2c-.1-15.2-.1-29.7-.1-44.6zM741.9 102.4h-10.8v-44c.8-.1 1.6-.3 2.4-.3h66.6v115.6H813v43.9h-65.5v-16.5c-2.9 3.1-4.9 5.4-7.2 7.5-15.9 14.1-43.9 17.9-62.9 8.3-14.5-7.3-21.7-19.7-22.3-35.4-.9-24.3-.7-48.6-1-72.9v-6.3h-12.7v-44H712v5.6c0 29.3-.1 58.6.1 88 0 4.1.7 8.3 2 12.2 2 5.9 7 8.9 13.2 8.7 6.1-.2 10.5-3.1 12.6-8.8.8-2.2 1.7-4.5 1.7-6.7.4-18.1.3-36.3.3-54.9z M345.7 149h-98.5c-.2 9.1.1 17.6 4.5 25.4 3.6 6.5 9.6 8.9 16.8 8.6 7.2-.3 12.9-3.3 15.9-10.1 1.3-3 2.1-6.2 3.3-9.6h54.6c-2.2 17.5-8.9 32.3-22.9 43.3-9.9 7.8-21.4 12-33.8 13.8-16.7 2.5-33.2 1.8-49.4-3.4-21.7-7-36.3-21.4-43-43-7.3-23.3-7.6-47 .1-70.3 9.4-28.7 30.1-44.2 59.5-48.6 13.2-2 26.3-1.1 39.1 2.4 29.9 8.1 45.9 28.7 50.8 58.4 1.8 10.6 2 21.5 3 33.1zm-96.9-30.8H287c.5-8.5-.7-16.1-8.2-20.9-6.8-4.3-14.3-4.7-21.2-.4-7.7 4.9-8.7 12.8-8.8 21.3zM1114 148.9h-98.2c-.2 9-.2 17.6 4.3 25.4 3.8 6.7 9.9 9.1 17.3 8.7 7.4-.4 13.1-3.8 15.9-10.9 1.1-2.8 1.8-5.7 2.8-8.8h54.7c-3.5 32.1-26 53.9-59.4 57.6-15.6 1.7-30.9 1-46-3.7-22.3-7-37.2-21.7-44-44-6.9-23-7.2-46.3.3-69.3 9.5-28.9 30.3-44.5 59.9-48.8 13.9-2 27.6-.9 41 3.1 27.5 8.3 43 27.6 48.1 55.2 2.1 11.4 2.2 23.1 3.3 35.5zm-96.4-30.8h38c.1-16-7.7-24.9-20.6-23.9-11.9.9-19.2 11-17.4 23.9z M535.6 58h18c0-10.6.4-20.9-.1-31.2-.3-5.4 1.5-7.4 6.8-8.5 15.2-3.1 30.2-6.7 46-10.3v50h25.6v44.7h-25c-.2 1.8-.4 3.3-.4 4.7v51.5c0 1.8.2 3.7.4 5.5 1.3 9.8 8.2 14.9 18 13.3 1.6-.3 3.2-.6 5.6-1v27.7c0 12.9 0 12.9-12.7 14.9-13.6 2.2-27.1 2.9-40.7-.3-19.1-4.6-27.8-15.5-27.9-35.3V103h-13.7c.1-15.3.1-29.8.1-45zM826.2 217.6v-43.9h12.7v-70.9h-12.6V58.3h62.1l1.9 25.3 2-4.4c5.1-12.9 14.4-20.7 28.3-22.2 6.7-.7 13.6-.1 20.3.3 1.2.1 3.4 2 3.4 3.1.2 15.8 0 31.6 0 47.5 0 .3-.3.6-.6 1.1-7.6 0-15.5-1-23.1.2-16.2 2.6-23.8 12-24.5 28.5-.2 5.8-.2 11.7-.3 17.5v18.2h18v44.3c-29.1-.1-58.1-.1-87.6-.1z") + path(fill="#ED1E25" d="M1237 .3c8.5 1.4 17.1 2.2 25.4 4.3 34.3 8.6 51.7 50.6 33.5 80.3-4.4 7.2-10.5 12.4-17.7 16.5-3.2 1.8-6.4 3.5-10.3 5.5 2 .8 3.4 1.6 4.9 2 23.7 6.9 34.2 24.4 35.9 47.6 2.4 31.9-17.7 55.7-49.6 59.6-9.9 1.2-19.9 1.9-29.9 1.9-31.7.2-63.3.1-95 .1h-5.8v-43.8h18.9V44.4H1128V.2c36.3.1 72.7.1 109 .1zm-32.3 128.8c0 14.9-.1 28.5.1 42.2 0 .9 2 2.7 3 2.7 8.3 0 16.7 0 24.9-.7 6.1-.5 11.7-2.8 15.1-8.4 8-13.2.4-31.6-14.7-34.2-9-1.6-18.4-1.1-28.4-1.6zm.2-40.5c8.7-.5 16.9-.2 24.8-1.6 9.6-1.7 16.2-11 16.3-21.2 0-10.2-5.9-19.7-14.7-21.3-8.5-1.5-17.4-1.4-26.4-2v46.1z M1743 103.3c-7.5-.1-15-.4-22.4-.2-1.1 0-3.2 1.9-3.2 3-.2 18.8-.6 37.7.1 56.5.4 12.3 7.9 17.4 20 15.2 1-.2 2-.2 3.2-.3.2 1.2.5 2.3.5 3.4 0 10.8 0 21.7.1 32.5 0 2.4-.3 4.2-3.1 4.7-16.5 2.7-32.9 5.1-49.6 1.2-18.7-4.4-27.7-14.3-28.1-33.4-.5-25.5-.2-51-.3-76.5V103h-6.4c-8.3-.1-7.3.9-7.4-7.6V58.5h18.4c0-10.1-.1-19.8 0-29.4.1-10.6-1.5-8.2 8.7-10.7 14.2-3.4 28.5-6.5 43.5-10v49.9h26v45z M1569.2 119.2c0-5.4.3-10-.1-14.6-.6-8.5-6.1-14.1-13.8-14.3-7.7-.2-14.1 5.5-15.3 13.7-.3 1.8-.3 3.6-.5 5.8h-53.3c-1.9-20.2 8.6-38.7 28.2-47.2 28.5-12.3 57.2-11.2 85.1 2.2 17.1 8.2 25.9 22.7 26.2 41.7.4 20.3.2 40.7.3 61v6.6h12.8v43.8h-66.2c-.5-5.4-1-11-1.6-17.4-1.5 1.7-2.5 2.7-3.4 3.8-17.3 21.3-50.3 21.2-67.2 11.3-13.4-7.9-19.2-20.5-20.1-35.4-2-32.6 15.1-53.7 48.1-58.7 11.6-1.8 23.5-1.6 35.3-2.3 1.6-.1 3.2 0 5.5 0zm.7 28.2c-5.4 0-9.7-.6-13.9.1-12.9 2.1-19.5 11.1-18.1 24.1 1.2 10.7 10.4 16.1 20.3 11.9 5.3-2.2 8.9-6.3 9.7-11.8 1.2-7.9 1.4-16 2-24.3z M1475.6 149.2h-98.5c0 9.7.1 18.9 5.6 27 4.2 6.2 10.6 7.7 17.6 7 6.8-.7 11.9-4.1 14.6-10.5 1.2-2.7 1.8-5.7 2.8-9h54.4c-2.2 17.5-8.9 32.5-23.3 43.3-17 12.8-36.8 15.8-57.3 14.4-8.4-.5-16.9-2-25-4.5-21.4-6.5-36-20.6-42.8-41.9-8-25-8.2-50.2 1.1-74.9 10.3-27.1 31.1-41 59.2-44.8 13.7-1.8 27.3-.7 40.5 3.4 28.2 8.7 43.2 28.8 47.9 57 2.1 10.8 2.3 21.8 3.2 33.5zm-58.1-30.5c.1-9-.9-17.2-9.5-21.8-7.3-3.9-14.9-4-21.6 1.2-6.6 5.1-7.8 12.5-7.3 20.6h38.4z") + + symbol#svg_microsoft(viewBox="0 0 609 130") + path(fill="#737373" d="M213.2 74.3l-3.6 10.2h-.3c-.6-2.3-1.7-5.8-3.5-10L186.5 26h-18.9v77.3h12.5V55.6c0-3 0-6.4-.1-10.6-.1-2.1-.3-3.7-.4-4.9h.3c.6 3 1.3 5.2 1.8 6.6l23.2 56.4h8.8l23-56.9c.5-1.3 1-3.9 1.5-6.1h.3c-.3 5.7-.5 10.8-.6 13.9v49h13.3V25.8H233l-19.8 48.5zm50.6-26.7h13V103h-13zm6.6-23.4c-2.2 0-4 .8-5.5 2.2-1.5 1.4-2.3 3.2-2.3 5.4 0 2.1.8 3.9 2.3 5.3 1.5 1.4 3.3 2.1 5.5 2.1s4.1-.8 5.5-2.1c1.5-1.4 2.3-3.2 2.3-5.3s-.8-3.9-2.3-5.4c-1.3-1.4-3.2-2.2-5.5-2.2m52.5 22.9c-2.4-.5-4.9-.8-7.3-.8-5.9 0-11.3 1.3-15.8 3.9-4.5 2.6-8.1 6.2-10.4 10.7-2.4 4.6-3.6 9.9-3.6 16 0 5.3 1.2 10 3.5 14.3 2.3 4.2 5.5 7.6 9.8 9.9 4.1 2.3 8.9 3.5 14.3 3.5 6.2 0 11.5-1.3 15.7-3.7l.1-.1v-12l-.5.4c-1.9 1.4-4.1 2.6-6.3 3.3-2.3.8-4.4 1.2-6.2 1.2-5.2 0-9.3-1.5-12.2-4.8-3-3.2-4.5-7.6-4.5-13.1 0-5.7 1.5-10.2 4.6-13.5 3.1-3.3 7.2-5 12.2-5 4.2 0 8.5 1.4 12.4 4.2l.5.4V49.2l-.1-.1c-1.7-.7-3.6-1.5-6.2-2m42.9-.4c-3.2 0-6.2 1-8.8 3.1-2.2 1.8-3.7 4.4-5 7.5h-.1v-9.7h-13V103h13V74.7c0-4.8 1-8.8 3.2-11.7 2.2-3 5-4.5 8.4-4.5 1.2 0 2.4.3 3.9.5 1.4.4 2.4.8 3.1 1.3l.5.4v-13l-.3-.1c-.9-.6-2.7-.9-4.9-.9m35.4-.3c-9.1 0-16.4 2.7-21.5 8-5.2 5.3-7.7 12.6-7.7 21.8 0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6M411.6 89c-2.4 3.1-6.2 4.6-10.9 4.6s-8.5-1.5-11.2-4.8c-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.6 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5-.2 6-1.3 10.7-3.8 13.8m46.1-18.4c-4.1-1.7-6.7-3-7.9-4.1-1-1-1.5-2.4-1.5-4.2 0-1.5.6-3 2.1-4s3.2-1.5 5.7-1.5c2.2 0 4.5.4 6.7 1s4.2 1.5 5.8 2.7l.5.4V48.7l-.3-.1c-1.5-.6-3.5-1.2-5.9-1.7-2.4-.4-4.6-.6-6.4-.6-6.2 0-11.3 1.5-15.3 4.8-4 3.1-5.9 7.3-5.9 12.2 0 2.6.4 4.9 1.3 6.8.9 1.9 2.2 3.7 4 5.2 1.8 1.4 4.4 3 8 4.5 3 1.3 5.3 2.3 6.7 3.1 1.4.8 2.3 1.7 3 2.4.5.8.8 1.8.8 3.1 0 3.7-2.8 5.5-8.5 5.5-2.2 0-4.5-.4-7.2-1.3s-5.2-2.2-7.3-3.7l-.5-.4v12.7l.3.1c1.9.9 4.2 1.5 7 2.2 2.8.5 5.3.9 7.5.9 6.7 0 12.2-1.5 16.1-4.8 4-3.2 6.1-7.3 6.1-12.6 0-3.7-1-7-3.2-9.5-2.9-2.4-6.5-4.9-11.7-6.9m49.2-24.2c-9.1 0-16.4 2.7-21.5 8s-7.7 12.6-7.7 21.8c0 8.6 2.6 15.6 7.6 20.7 5 5 11.8 7.6 20.3 7.6 8.9 0 16-2.7 21.1-8.1 5.2-5.4 7.7-12.6 7.7-21.5 0-8.8-2.4-15.8-7.3-20.9-4.7-5.1-11.6-7.6-20.2-7.6M517.2 89c-2.4 3.1-6.2 4.6-10.9 4.6-4.8 0-8.5-1.5-11.2-4.8-2.7-3.1-4-7.6-4-13.3 0-5.9 1.4-10.4 4-13.6 2.7-3.2 6.4-4.8 11.1-4.8 4.5 0 8.2 1.5 10.8 4.6 2.6 3.1 4 7.6 4 13.5 0 6-1.3 10.7-3.8 13.8M603.9 58.3V47.6h-13.1V31.2l-.4.1L578 35l-.3.1v12.5h-19.6v-7c0-3.2.8-5.7 2.2-7.3s3.5-2.4 6.1-2.4c1.8 0 3.7.4 5.8 1.3l.5.3V21.2l-.3-.1c-1.8-.6-4.2-1-7.3-1-3.9 0-7.3.9-10.4 2.4-3.1 1.7-5.4 4-7.1 7.1-1.7 3-2.6 6.4-2.6 10.3v7.7h-9.1v10.6h9.1V103h13.1V58.3h19.6v28.5c0 11.7 5.5 17.6 16.5 17.6 1.8 0 3.7-.3 5.5-.6 1.9-.4 3.3-.9 4.1-1.3l.1-.1V91.7l-.5.4c-.8.5-1.5.9-2.7 1.2-1 .3-1.9.4-2.6.4-2.6 0-4.4-.6-5.7-2.1-1.2-1.4-1.8-3.7-1.8-7.1V58.3h13.3z") + path(fill="#F25022" d="M0 0h61.3v61.3H0z") + path(fill="#7FBA00" d="M67.7 0H129v61.3H67.7z") + path(fill="#00A4EF" d="M0 67.7h61.3V129H0z") + path(fill="#FFB900" d="M67.7 67.7H129V129H67.7z") + + + //- Filters etc. + defs + radialGradient#gradient_allenai1(cx="75.721" cy="20.894" r="11.05" gradientUnits="userSpaceOnUse") + stop(offset=".3" stop-color="#FDEA65") + stop(offset="1" stop-color="#FCB431") + radialGradient#gradient_allenai2(cx="75.4" cy="42.297" r="82.993" gradientUnits="userSpaceOnUse") + stop(offset="0" stop-color="#3FA9D0") + stop(offset="1" stop-color="#183A74") diff --git a/website/_layout.jade b/website/_layout.jade index 482af35fa..49a025d96 100644 --- a/website/_layout.jade +++ b/website/_layout.jade @@ -2,11 +2,16 @@ include _includes/_mixins +- title = IS_MODELS ? LANGUAGES[current.source] || title : title +- social_title = (SECTION == "index") ? SITENAME + " - " + SLOGAN : title + " - " + SITENAME +- social_img = SITE_URL + "/assets/img/social/preview_" + (preview || ALPHA ? "alpha" : "default") + ".jpg" + doctype html html(lang="en") title - if SECTION == "docs" && SUBSECTION && SUBSECTION != "index" - | #{title} | #{SITENAME} #{SUBSECTION == "api" ? "API" : "Usage"} Documentation + if SECTION == "api" || SECTION == "usage" || SECTION == "models" + - var title_section = (SECTION == "api") ? "API" : SECTION.charAt(0).toUpperCase() + SECTION.slice(1) + | #{title} | #{SITENAME} #{title_section} Documentation else if SECTION != "index" | #{title} | #{SITENAME} @@ -22,32 +27,30 @@ html(lang="en") meta(property="og:type" content="website") meta(property="og:site_name" content=sitename) meta(property="og:url" content="#{SITE_URL}/#{current.path.join('/')}") - meta(property="og:title" content="#{title} - spaCy") + meta(property="og:title" content=social_title) meta(property="og:description" content=description) - meta(property="og:image" content=getSocialImg()) + meta(property="og:image" content=social_img) meta(name="twitter:card" content="summary_large_image") meta(name="twitter:site" content="@" + SOCIAL.twitter) - meta(name="twitter:title" content="#{title} - spaCy") + meta(name="twitter:title" content=social_title) meta(name="twitter:description" content=description) - meta(name="twitter:image" content=getSocialImg()) + meta(name="twitter:image" content=social_img) link(rel="shortcut icon" href="/assets/img/favicon.ico") link(rel="icon" type="image/x-icon" href="/assets/img/favicon.ico") - if ALPHA && SECTION == "docs" + if SECTION == "api" link(href="/assets/css/style_green.css?v#{V_CSS}" rel="stylesheet") - else if SUBSECTION == "usage" - link(href="/assets/css/style_red.css?v#{V_CSS}" rel="stylesheet") - else link(href="/assets/css/style.css?v#{V_CSS}" rel="stylesheet") body + include _includes/_svg include _includes/_navigation - if SECTION == "docs" + if !landing include _includes/_page-docs else diff --git a/website/api/_annotation/_biluo.jade b/website/api/_annotation/_biluo.jade new file mode 100644 index 000000000..dc6168732 --- /dev/null +++ b/website/api/_annotation/_biluo.jade @@ -0,0 +1,43 @@ +//- 💫 DOCS > API > ANNOTATION > BILUO + ++table([ "Tag", "Description" ]) + +row + +cell #[code #[span.u-color-theme B] EGIN] + +cell The first token of a multi-token entity. + + +row + +cell #[code #[span.u-color-theme I] N] + +cell An inner token of a multi-token entity. + + +row + +cell #[code #[span.u-color-theme L] AST] + +cell The final token of a multi-token entity. + + +row + +cell #[code #[span.u-color-theme U] NIT] + +cell A single-token entity. + + +row + +cell #[code #[span.u-color-theme O] UT] + +cell A non-entity token. + ++aside("Why BILUO, not IOB?") + | There are several coding schemes for encoding entity annotations as + | token tags. These coding schemes are equally expressive, but not + | necessarily equally learnable. + | #[+a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth] + | showed that the minimal #[strong Begin], #[strong In], #[strong Out] + | scheme was more difficult to learn than the #[strong BILUO] scheme that + | we use, which explicitly marks boundary tokens. + +p + | spaCy translates the character offsets into this scheme, in order to + | decide the cost of each action given the current state of the entity + | recogniser. The costs are then used to calculate the gradient of the + | loss, to train the model. The exact algorithm is a pastiche of + | well-known methods, and is not currently described in any single + | publication. The model is a greedy transition-based parser guided by a + | linear model whose weights are learned using the averaged perceptron + | loss, via the #[+a("http://www.aclweb.org/anthology/C12-1059") dynamic oracle] + | imitation learning strategy. The transition system is equivalent to the + | BILOU tagging scheme. diff --git a/website/docs/api/_annotation/_dep-labels.jade b/website/api/_annotation/_dep-labels.jade similarity index 100% rename from website/docs/api/_annotation/_dep-labels.jade rename to website/api/_annotation/_dep-labels.jade diff --git a/website/docs/api/_annotation/_named-entities.jade b/website/api/_annotation/_named-entities.jade similarity index 100% rename from website/docs/api/_annotation/_named-entities.jade rename to website/api/_annotation/_named-entities.jade diff --git a/website/docs/api/_annotation/_pos-tags.jade b/website/api/_annotation/_pos-tags.jade similarity index 98% rename from website/docs/api/_annotation/_pos-tags.jade rename to website/api/_annotation/_pos-tags.jade index ea3a225bf..51db4f4e2 100644 --- a/website/docs/api/_annotation/_pos-tags.jade +++ b/website/api/_annotation/_pos-tags.jade @@ -21,7 +21,7 @@ p +pos-row("$", "SYM", "SymType=currency", "symbol, currency") +pos-row("ADD", "X", "", "email") +pos-row("AFX", "ADJ", "Hyph=yes", "affix") - +pos-row("BES", "VERB", "", 'auxillary "be"') + +pos-row("BES", "VERB", "", 'auxiliary "be"') +pos-row("CC", "CONJ", "ConjType=coor", "conjunction, coordinating") +pos-row("CD", "NUM", "NumType=card", "cardinal number") +pos-row("DT", "DET", "determiner") @@ -35,7 +35,7 @@ p +pos-row("JJR", "ADJ", "Degree=comp", "adjective, comparative") +pos-row("JJS", "ADJ", "Degree=sup", "adjective, superlative") +pos-row("LS", "PUNCT", "NumType=ord", "list item marker") - +pos-row("MD", "VERB", "VerbType=mod", "verb, modal auxillary") + +pos-row("MD", "VERB", "VerbType=mod", "verb, modal auxiliary") +pos-row("NFP", "PUNCT", "", "superfluous punctuation") +pos-row("NIL", "", "", "missing tag") +pos-row("NN", "NOUN", "Number=sing", "noun, singular or mass") diff --git a/website/api/_architecture/_cython.jade b/website/api/_architecture/_cython.jade new file mode 100644 index 000000000..84b98b824 --- /dev/null +++ b/website/api/_architecture/_cython.jade @@ -0,0 +1,115 @@ +//- 💫 DOCS > API > ARCHITECTURE > CYTHON + ++aside("What's Cython?") + | #[+a("http://cython.org/") Cython] is a language for writing + | C extensions for Python. Most Python code is also valid Cython, but + | you can add type declarations to get efficient memory-managed code + | just like C or C++. + +p + | spaCy's core data structures are implemented as + | #[+a("http://cython.org/") Cython] #[code cdef] classes. Memory is + | managed through the #[+a(gh("cymem")) #[code cymem]] + | #[code cymem.Pool] class, which allows you + | to allocate memory which will be freed when the #[code Pool] object + | is garbage collected. This means you usually don't have to worry + | about freeing memory. You just have to decide which Python object + | owns the memory, and make it own the #[code Pool]. When that object + | goes out of scope, the memory will be freed. You do have to take + | care that no pointers outlive the object that owns them — but this + | is generally quite easy. + +p + | All Cython modules should have the #[code # cython: infer_types=True] + | compiler directive at the top of the file. This makes the code much + | cleaner, as it avoids the need for many type declarations. If + | possible, you should prefer to declare your functions #[code nogil], + | even if you don't especially care about multi-threading. The reason + | is that #[code nogil] functions help the Cython compiler reason about + | your code quite a lot — you're telling the compiler that no Python + | dynamics are possible. This lets many errors be raised, and ensures + | your function will run at C speed. + + +p + | Cython gives you many choices of sequences: you could have a Python + | list, a numpy array, a memory view, a C++ vector, or a pointer. + | Pointers are preferred, because they are fastest, have the most + | explicit semantics, and let the compiler check your code more + | strictly. C++ vectors are also great — but you should only use them + | internally in functions. It's less friendly to accept a vector as an + | argument, because that asks the user to do much more work. Here's + | how to get a pointer from a numpy array, memory view or vector: + ++code. + cdef void get_pointers(np.ndarray[int, mode='c'] numpy_array, vector[int] cpp_vector, int[::1] memory_view) nogil: + pointer1 = <int*>numpy_array.data + pointer2 = cpp_vector.data() + pointer3 = &memory_view[0] + +p + | Both C arrays and C++ vectors reassure the compiler that no Python + | operations are possible on your variable. This is a big advantage: + | it lets the Cython compiler raise many more errors for you. + +p + | When getting a pointer from a numpy array or memoryview, take care + | that the data is actually stored in C-contiguous order — otherwise + | you'll get a pointer to nonsense. The type-declarations in the code + | above should generate runtime errors if buffers with incorrect + | memory layouts are passed in. To iterate over the array, the + | following style is preferred: + ++code. + cdef int c_total(const int* int_array, int length) nogil: + total = 0 + for item in int_array[:length]: + total += item + return total + +p + | If this is confusing, consider that the compiler couldn't deal with + | #[code for item in int_array:] — there's no length attached to a raw + | pointer, so how could we figure out where to stop? The length is + | provided in the slice notation as a solution to this. Note that we + | don't have to declare the type of #[code item] in the code above — + | the compiler can easily infer it. This gives us tidy code that looks + | quite like Python, but is exactly as fast as C — because we've made + | sure the compilation to C is trivial. + +p + | Your functions cannot be declared #[code nogil] if they need to + | create Python objects or call Python functions. This is perfectly + | okay — you shouldn't torture your code just to get #[code nogil] + | functions. However, if your function isn't #[code nogil], you should + | compile your module with #[code cython -a --cplus my_module.pyx] and + | open the resulting #[code my_module.html] file in a browser. This + | will let you see how Cython is compiling your code. Calls into the + | Python run-time will be in bright yellow. This lets you easily see + | whether Cython is able to correctly type your code, or whether there + | are unexpected problems. + +p + | Working in Cython is very rewarding once you're over the initial + | learning curve. As with C and C++, the first way you write something + | in Cython will often be the performance-optimal approach. In + | contrast, Python optimisation generally requires a lot of + | experimentation. Is it faster to have an #[code if item in my_dict] + | check, or to use #[code .get()]? What about + | #[code try]/#[code except]? Does this numpy operation create a copy? + | There's no way to guess the answers to these questions, and you'll + | usually be dissatisfied with your results — so there's no way to + | know when to stop this process. In the worst case, you'll make a + | mess that invites the next reader to try their luck too. This is + | like one of those + | #[+a("http://www.wemjournal.org/article/S1080-6032%2809%2970088-2/abstract") volcanic gas-traps], + | where the rescuers keep passing out from low oxygen, causing + | another rescuer to follow — only to succumb themselves. In short, + | just say no to optimizing your Python. If it's not fast enough the + | first time, just switch to Cython. + ++infobox("Resources") + +list.o-no-block + +item #[+a("http://docs.cython.org/en/latest/") Official Cython documentation] (cython.org) + +item #[+a("https://explosion.ai/blog/writing-c-in-cython", true) Writing C in Cython] (explosion.ai) + +item #[+a("https://explosion.ai/blog/multithreading-with-cython") Multi-threading spaCy’s parser and named entity recogniser] (explosion.ai) diff --git a/website/api/_architecture/_nn-model.jade b/website/api/_architecture/_nn-model.jade new file mode 100644 index 000000000..8080af2ec --- /dev/null +++ b/website/api/_architecture/_nn-model.jade @@ -0,0 +1,141 @@ +//- 💫 DOCS > API > ARCHITECTURE > NN MODEL ARCHITECTURE + +p + | The parsing model is a blend of recent results. The two recent + | inspirations have been the work of Eli Klipperwasser and Yoav Goldberg at + | Bar Ilan#[+fn(1)], and the SyntaxNet team from Google. The foundation of + | the parser is still based on the work of Joakim Nivre#[+fn(2)], who + | introduced the transition-based framework#[+fn(3)], the arc-eager + | transition system, and the imitation learning objective. The model is + | implemented using #[+a(gh("thinc")) Thinc], spaCy's machine learning + | library. We first predict context-sensitive vectors for each word in the + | input: + ++code. + (embed_lower | embed_prefix | embed_suffix | embed_shape) + >> Maxout(token_width) + >> convolution ** 4 + +p + | This convolutional layer is shared between the tagger, parser and NER, + | and will also be shared by the future neural lemmatizer. Because the + | parser shares these layers with the tagger, the parser does not require + | tag features. I got this trick from David Weiss's "Stack Combination" + | paper#[+fn(4)]. + +p + | To boost the representation, the tagger actually predicts a "super tag" + | with POS, morphology and dependency label#[+fn(5)]. The tagger predicts + | these supertags by adding a softmax layer onto the convolutional layer – + | so, we're teaching the convolutional layer to give us a representation + | that's one affine transform from this informative lexical information. + | This is obviously good for the parser (which backprops to the + | convolutions too). The parser model makes a state vector by concatenating + | the vector representations for its context tokens. The current context + | tokens: + ++table + +row + +cell #[code S0], #[code S1], #[code S2] + +cell Top three words on the stack. + + +row + +cell #[code B0], #[code B1] + +cell First two words of the buffer. + + +row + +cell.u-nowrap + | #[code S0L1], #[code S1L1], #[code S2L1], #[code B0L1], + | #[code B1L1]#[br] + | #[code S0L2], #[code S1L2], #[code S2L2], #[code B0L2], + | #[code B1L2] + +cell + | Leftmost and second leftmost children of #[code S0], #[code S1], + | #[code S2], #[code B0] and #[code B1]. + + +row + +cell.u-nowrap + | #[code S0R1], #[code S1R1], #[code S2R1], #[code B0R1], + | #[code B1R1]#[br] + | #[code S0R2], #[code S1R2], #[code S2R2], #[code B0R2], + | #[code B1R2] + +cell + | Rightmost and second rightmost children of #[code S0], #[code S1], + | #[code S2], #[code B0] and #[code B1]. + +p + | This makes the state vector quite long: #[code 13*T], where #[code T] is + | the token vector width (128 is working well). Fortunately, there's a way + | to structure the computation to save some expense (and make it more + | GPU-friendly). + +p + | The parser typically visits #[code 2*N] states for a sentence of length + | #[code N] (although it may visit more, if it back-tracks with a + | non-monotonic transition#[+fn(4)]). A naive implementation would require + | #[code 2*N (B, 13*T) @ (13*T, H)] matrix multiplications for a batch of + | size #[code B]. We can instead perform one #[code (B*N, T) @ (T, 13*H)] + | multiplication, to pre-compute the hidden weights for each positional + | feature with respect to the words in the batch. (Note that our token + | vectors come from the CNN — so we can't play this trick over the + | vocabulary. That's how Stanford's NN parser#[+fn(3)] works — and why its + | model is so big.) + +p + | This pre-computation strategy allows a nice compromise between + | GPU-friendliness and implementation simplicity. The CNN and the wide + | lower layer are computed on the GPU, and then the precomputed hidden + | weights are moved to the CPU, before we start the transition-based + | parsing process. This makes a lot of things much easier. We don't have to + | worry about variable-length batch sizes, and we don't have to implement + | the dynamic oracle in CUDA to train. + +p + | Currently the parser's loss function is multilabel log loss#[+fn(6)], as + | the dynamic oracle allows multiple states to be 0 cost. This is defined + | as follows, where #[code gZ] is the sum of the scores assigned to gold + | classes: + ++code. + (exp(score) / Z) - (exp(score) / gZ) + ++bibliography + +item + | #[+a("https://www.semanticscholar.org/paper/Simple-and-Accurate-Dependency-Parsing-Using-Bidir-Kiperwasser-Goldberg/3cf31ecb2724b5088783d7c96a5fc0d5604cbf41") Simple and Accurate Dependency Parsing Using Bidirectional LSTM Feature Representations] + br + | Eliyahu Kiperwasser, Yoav Goldberg. (2016) + + +item + | #[+a("https://www.semanticscholar.org/paper/A-Dynamic-Oracle-for-Arc-Eager-Dependency-Parsing-Goldberg-Nivre/22697256ec19ecc3e14fcfc63624a44cf9c22df4") A Dynamic Oracle for Arc-Eager Dependency Parsing] + br + | Yoav Goldberg, Joakim Nivre (2012) + + +item + | #[+a("https://explosion.ai/blog/parsing-english-in-python") Parsing English in 500 Lines of Python] + br + | Matthew Honnibal (2013) + + +item + | #[+a("https://www.semanticscholar.org/paper/Stack-propagation-Improved-Representation-Learning-Zhang-Weiss/0c133f79b23e8c680891d2e49a66f0e3d37f1466") Stack-propagation: Improved Representation Learning for Syntax] + br + | Yuan Zhang, David Weiss (2016) + + +item + | #[+a("https://www.semanticscholar.org/paper/Deep-multi-task-learning-with-low-level-tasks-supe-S%C3%B8gaard-Goldberg/03ad06583c9721855ccd82c3d969a01360218d86") Deep multi-task learning with low level tasks supervised at lower layers] + br + | Anders Søgaard, Yoav Goldberg (2016) + + +item + | #[+a("https://www.semanticscholar.org/paper/An-Improved-Non-monotonic-Transition-System-for-De-Honnibal-Johnson/4094cee47ade13b77b5ab4d2e6cb9dd2b8a2917c") An Improved Non-monotonic Transition System for Dependency Parsing] + br + | Matthew Honnibal, Mark Johnson (2015) + + +item + | #[+a("http://cs.stanford.edu/people/danqi/papers/emnlp2014.pdf") A Fast and Accurate Dependency Parser using Neural Networks] + br + | Danqi Cheng, Christopher D. Manning (2014) + + +item + | #[+a("https://www.semanticscholar.org/paper/Parsing-the-Wall-Street-Journal-using-a-Lexical-Fu-Riezler-King/0ad07862a91cd59b7eb5de38267e47725a62b8b2") Parsing the Wall Street Journal using a Lexical-Functional Grammar and Discriminative Estimation Techniques] + br + | Stefan Riezler et al. (2002) diff --git a/website/api/_data.json b/website/api/_data.json new file mode 100644 index 000000000..83b98f1fa --- /dev/null +++ b/website/api/_data.json @@ -0,0 +1,224 @@ +{ + "sidebar": { + "Overview": { + "Architecture": "./", + "Annotation Specs": "annotation", + "Functions": "top-level" + }, + "Containers": { + "Doc": "doc", + "Token": "token", + "Span": "span", + "Lexeme": "lexeme" + }, + + "Pipeline": { + "Language": "language", + "Pipe": "pipe", + "Tensorizer": "tensorizer", + "Tagger": "tagger", + "DependencyParser": "dependencyparser", + "EntityRecognizer": "entityrecognizer", + "TextCategorizer": "textcategorizer", + "Tokenizer": "tokenizer", + "Lemmatizer": "lemmatizer", + "Matcher": "matcher", + "PhraseMatcher": "phrasematcher" + }, + + "Other": { + "Vocab": "vocab", + "StringStore": "stringstore", + "Vectors": "vectors", + "GoldParse": "goldparse", + "GoldCorpus": "goldcorpus", + "Binder": "binder" + } + }, + + "index": { + "title": "Architecture", + "next": "annotation", + "menu": { + "Basics": "basics", + "Neural Network Model": "nn-model", + "Cython Conventions": "cython" + } + }, + + "top-level": { + "title": "Top-level Functions", + "menu": { + "spacy": "spacy", + "displacy": "displacy", + "Utility Functions": "util", + "Compatibility": "compat", + "Command Line": "cli" + } + }, + + "language": { + "title": "Language", + "tag": "class", + "teaser": "A text-processing pipeline.", + "source": "spacy/language.py" + }, + + "doc": { + "title": "Doc", + "tag": "class", + "teaser": "A container for accessing linguistic annotations.", + "source": "spacy/tokens/doc.pyx" + }, + + "token": { + "title": "Token", + "tag": "class", + "source": "spacy/tokens/token.pyx" + }, + + "span": { + "title": "Span", + "tag": "class", + "source": "spacy/tokens/span.pyx" + }, + + "lexeme": { + "title": "Lexeme", + "tag": "class", + "source": "spacy/lexeme.pyx" + }, + + "vocab": { + "title": "Vocab", + "teaser": "A storage class for vocabulary and other data shared across a language.", + "tag": "class", + "source": "spacy/vocab.pyx" + }, + + "stringstore": { + "title": "StringStore", + "tag": "class", + "source": "spacy/strings.pyx" + }, + + "matcher": { + "title": "Matcher", + "teaser": "Match sequences of tokens, based on pattern rules.", + "tag": "class", + "source": "spacy/matcher.pyx" + }, + + "phrasematcher": { + "title": "PhraseMatcher", + "teaser": "Match sequences of tokens, based on documents.", + "tag": "class", + "tag_new": 2, + "source": "spacy/matcher.pyx" + }, + + "pipe": { + "title": "Pipe", + "teaser": "Abstract base class defining the API for pipeline components.", + "tag": "class", + "tag_new": 2, + "source": "spacy/pipeline.pyx" + }, + + "dependenyparser": { + "title": "DependencyParser", + "tag": "class", + "source": "spacy/pipeline.pyx" + }, + + "entityrecognizer": { + "title": "EntityRecognizer", + "teaser": "Annotate named entities on documents.", + "tag": "class", + "source": "spacy/pipeline.pyx" + }, + + "textcategorizer": { + "title": "TextCategorizer", + "teaser": "Add text categorization models to spaCy pipelines.", + "tag": "class", + "tag_new": 2, + "source": "spacy/pipeline.pyx" + }, + + "dependencyparser": { + "title": "DependencyParser", + "teaser": "Annotate syntactic dependencies on documents.", + "tag": "class", + "source": "spacy/pipeline.pyx" + }, + + "tokenizer": { + "title": "Tokenizer", + "tag": "class", + "source": "spacy/tokenizer.pyx" + }, + + "lemmatizer": { + "title": "Lemmatizer", + "tag": "class" + }, + + "tagger": { + "title": "Tagger", + "teaser": "Annotate part-of-speech tags on documents.", + "tag": "class", + "source": "spacy/pipeline.pyx" + }, + + "tensorizer": { + "title": "Tensorizer", + "teaser": "Add a tensor with position-sensitive meaning representations to a document.", + "tag": "class", + "tag_new": 2, + "source": "spacy/pipeline.pyx" + }, + + "goldparse": { + "title": "GoldParse", + "tag": "class", + "source": "spacy/gold.pyx" + }, + + "goldcorpus": { + "title": "GoldCorpus", + "teaser": "An annotated corpus, using the JSON file format.", + "tag": "class", + "tag_new": 2, + "source": "spacy/gold.pyx" + }, + + "binder": { + "title": "Binder", + "tag": "class", + "tag_new": 2, + "source": "spacy/tokens/binder.pyx" + }, + + "vectors": { + "title": "Vectors", + "teaser": "Store, save and load word vectors.", + "tag": "class", + "tag_new": 2, + "source": "spacy/vectors.pyx" + }, + + "annotation": { + "title": "Annotation Specifications", + "teaser": "Schemes used for labels, tags and training data.", + "menu": { + "Tokenization": "tokenization", + "Sentence Boundaries": "sbd", + "POS Tagging": "pos-tagging", + "Lemmatization": "lemmatization", + "Dependencies": "dependency-parsing", + "Named Entities": "named-entities", + "Training Data": "training" + } + } +} diff --git a/website/docs/api/cli.jade b/website/api/_top-level/_cli.jade similarity index 57% rename from website/docs/api/cli.jade rename to website/api/_top-level/_cli.jade index e109e4b66..b2a9c574d 100644 --- a/website/docs/api/cli.jade +++ b/website/api/_top-level/_cli.jade @@ -1,40 +1,22 @@ -//- 💫 DOCS > USAGE > COMMAND LINE INTERFACE - -include ../../_includes/_mixins +//- 💫 DOCS > API > TOP-LEVEL > COMMAND LINE INTERFACE p | As of v1.7.0, spaCy comes with new command line helpers to download and | link models and show useful debugging information. For a list of available - | commands, type #[code python -m spacy]. To make the command even more - | convenient, we recommend - | #[+a("https://askubuntu.com/questions/17536/how-do-i-create-a-permanent-bash-alias/17537#17537") creating an alias] - | mapping #[code python -m spacy] to #[code spacy]. + | commands, type #[code spacy --help]. -+aside("Why python -m?") - | The problem with a global entry point is that it's resolved by looking up - | entries in your #[code PATH] environment variable. This can give you - | unexpected results, like executing the wrong spaCy installation. - | #[code python -m] prevents fallbacks to system modules. - -+infobox("⚠️ Deprecation note") - | As of spaCy 2.0, the #[code model] command to initialise a model data - | directory is deprecated. The command was only necessary because previous - | versions of spaCy expected a model directory to already be set up. This - | has since been changed, so you can use the #[+api("cli#train") #[code train]] - | command straight away. - -+h(2, "download") Download ++h(3, "download") Download p - | Download #[+a("/docs/usage/models") models] for spaCy. The downloader finds the + | Download #[+a("/usage/models") models] for spaCy. The downloader finds the | best-matching compatible version, uses pip to download the model as a | package and automatically creates a - | #[+a("/docs/usage/models#usage") shortcut link] to load the model by name. + | #[+a("/usage/models#usage") shortcut link] to load the model by name. | Direct downloads don't perform any compatibility checks and require the | model name to be specified with its version (e.g., #[code en_core_web_sm-1.2.0]). -+code(false, "bash"). - python -m spacy download [model] [--direct] ++code(false, "bash", "$"). + spacy download [model] [--direct] +table(["Argument", "Type", "Description"]) +row @@ -58,15 +40,15 @@ p | detailed messages in case things go wrong. It's #[strong not recommended] | to use this command as part of an automated process. If you know which | model your project needs, you should consider a - | #[+a("/docs/usage/models#download-pip") direct download via pip], or + | #[+a("/usage/models#download-pip") direct download via pip], or | uploading the model to a local PyPi installation and fetching it straight | from there. This will also allow you to add it as a versioned package | dependency to your project. -+h(2, "link") Link ++h(3, "link") Link p - | Create a #[+a("/docs/usage/models#usage") shortcut link] for a model, + | Create a #[+a("/usage/models#usage") shortcut link] for a model, | either a Python package or a local directory. This will let you load | models from any location using a custom name via | #[+api("spacy#load") #[code spacy.load()]]. @@ -80,8 +62,8 @@ p | or use the #[+api("cli#package") #[code package]] command to create a | model package. -+code(false, "bash"). - python -m spacy link [origin] [link_name] [--force] ++code(false, "bash", "$"). + spacy link [origin] [link_name] [--force] +table(["Argument", "Type", "Description"]) +row @@ -104,7 +86,7 @@ p +cell flag +cell Show help message and available arguments. -+h(2, "info") Info ++h(3, "info") Info p | Print information about your spaCy installation, models and local setup, @@ -112,8 +94,8 @@ p | markup to copy-paste into #[+a(gh("spacy") + "/issues") GitHub issues]. +code(false, "bash"). - python -m spacy info [--markdown] - python -m spacy info [model] [--markdown] + spacy info [--markdown] + spacy info [model] [--markdown] +table(["Argument", "Type", "Description"]) +row @@ -131,16 +113,32 @@ p +cell flag +cell Show help message and available arguments. -+h(2, "convert") Convert ++h(3, "validate") Validate + +tag-new(2) p - | Convert files into spaCy's #[+a("/docs/api/annotation#json-input") JSON format] + | Find all models installed in the current environment (both packages and + | shortcut links) and check whether they are compatible with the currently + | installed version of spaCy. Should be run after upgrading spaCy via + | #[code pip install -U spacy] to ensure that all installed models are + | can be used with the new version. The command is also useful to detect + | out-of-sync model links resulting from links created in different virtual + | environments. Prints a list of models, the installed versions, the latest + | compatible version (if out of date) and the commands for updating. + ++code(false, "bash", "$"). + spacy validate + ++h(3, "convert") Convert + +p + | Convert files into spaCy's #[+a("/api/annotation#json-input") JSON format] | for use with the #[code train] command and other experiment management | functions. The right converter is chosen based on the file extension of | the input file. Currently only supports #[code .conllu]. -+code(false, "bash"). - python -m spacy convert [input_file] [output_dir] [--n-sents] [--morphology] ++code(false, "bash", "$", false, false, true). + spacy convert [input_file] [output_dir] [--n-sents] [--morphology] +table(["Argument", "Type", "Description"]) +row @@ -168,14 +166,18 @@ p +cell flag +cell Show help message and available arguments. -+h(2, "train") Train ++h(3, "train") Train p | Train a model. Expects data in spaCy's - | #[+a("/docs/api/annotation#json-input") JSON format]. + | #[+a("/api/annotation#json-input") JSON format]. On each epoch, a model + | will be saved out to the directory. Accuracy scores and model details + | will be added to a #[+a("/usage/training#models-generating") #[code meta.json]] + | to allow packaging the model using the + | #[+api("cli#package") #[code package]] command. -+code(false, "bash"). - python -m spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--no-tagger] [--no-parser] [--no-entities] ++code(false, "bash", "$", false, false, true). + spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--meta-path] [--vectors] [--no-tagger] [--no-parser] [--no-entities] [--gold-preproc] +table(["Argument", "Type", "Description"]) +row @@ -213,6 +215,27 @@ p +cell option +cell Use GPU. + +row + +cell #[code --vectors], #[code -v] + +cell option + +cell Model to load vectors from. + + +row + +cell #[code --meta-path], #[code -m] + +cell option + +cell + | #[+tag-new(2)] Optional path to model + | #[+a("/usage/training#models-generating") #[code meta.json]]. + | All relevant properties like #[code lang], #[code pipeline] and + | #[code spacy_version] will be overwritten. + + +row + +cell #[code --version], #[code -V] + +cell option + +cell + | Model version. Will be written out to the model's + | #[code meta.json] after training. + +row +cell #[code --no-tagger], #[code -T] +cell flag @@ -228,12 +251,18 @@ p +cell flag +cell Don't train NER. + +row + +cell #[code --gold-preproc], #[code -G] + +cell flag + +cell Use gold preprocessing. + +row +cell #[code --help], #[code -h] +cell flag +cell Show help message and available arguments. -+h(3, "train-hyperparams") Environment variables for hyperparameters ++h(4, "train-hyperparams") Environment variables for hyperparameters + +tag-new(2) p | spaCy lets you set hyperparameters for training via environment variables. @@ -245,98 +274,159 @@ p +code(false, "bash"). parser_hidden_depth=2 parser_maxout_pieces=1 train-parser -+under-construction - +table(["Name", "Description", "Default"]) +row +cell #[code dropout_from] - +cell + +cell Initial dropout rate. +cell #[code 0.2] +row +cell #[code dropout_to] - +cell + +cell Final dropout rate. +cell #[code 0.2] +row +cell #[code dropout_decay] - +cell + +cell Rate of dropout change. +cell #[code 0.0] +row +cell #[code batch_from] - +cell + +cell Initial batch size. +cell #[code 1] +row +cell #[code batch_to] - +cell + +cell Final batch size. +cell #[code 64] +row +cell #[code batch_compound] - +cell + +cell Rate of batch size acceleration. +cell #[code 1.001] +row +cell #[code token_vector_width] - +cell + +cell Width of embedding tables and convolutional layers. +cell #[code 128] +row +cell #[code embed_size] - +cell + +cell Number of rows in embedding tables. +cell #[code 7500] +row +cell #[code parser_maxout_pieces] - +cell + +cell Number of pieces in the parser's and NER's first maxout layer. +cell #[code 2] +row +cell #[code parser_hidden_depth] - +cell + +cell Number of hidden layers in the parser and NER. +cell #[code 1] +row +cell #[code hidden_width] - +cell + +cell Size of the parser's and NER's hidden layers. + +cell #[code 128] + + +row + +cell #[code history_feats] + +cell Number of previous action ID features for parser and NER. + +cell #[code 128] + + +row + +cell #[code history_width] + +cell Number of embedding dimensions for each action ID. +cell #[code 128] +row +cell #[code learn_rate] - +cell + +cell Learning rate. +cell #[code 0.001] +row +cell #[code optimizer_B1] - +cell + +cell Momentum for the Adam solver. +cell #[code 0.9] +row +cell #[code optimizer_B2] - +cell + +cell Adagrad-momentum for the Adam solver. +cell #[code 0.999] +row +cell #[code optimizer_eps] - +cell + +cell Epsylon value for the Adam solver. +cell #[code 1e-08] +row +cell #[code L2_penalty] - +cell + +cell L2 regularisation penalty. +cell #[code 1e-06] +row +cell #[code grad_norm_clip] - +cell + +cell Gradient L2 norm constraint. +cell #[code 1.0] -+h(2, "package") Package ++h(3, "evaluate") Evaluate + +tag-new(2) p - | Generate a #[+a("/docs/usage/saving-loading#generating") model Python package] + | Evaluate a model's accuracy and speed on JSON-formatted annotated data. + | Will print the results and optionally export + | #[+a("/usage/visualizers") displaCy visualizations] of a sample set of + | parses to #[code .html] files. Visualizations for the dependency parse + | and NER will be exported as separate files if the respective component + | is present in the model's pipeline. + ++code(false, "bash", "$", false, false, true). + spacy evaluate [model] [data_path] [--displacy-path] [--displacy-limit] [--gpu-id] [--gold-preproc] + ++table(["Argument", "Type", "Description"]) + +row + +cell #[code model] + +cell positional + +cell + | Model to evaluate. Can be a package or shortcut link name, or a + | path to a model data directory. + + +row + +cell #[code data_path] + +cell positional + +cell Location of JSON-formatted evaluation data. + + +row + +cell #[code --displacy-path], #[code -dp] + +cell option + +cell + | Directory to output rendered parses as HTML. If not set, no + | visualizations will be generated. + + +row + +cell #[code --displacy-limit], #[code -dl] + +cell option + +cell + | Number of parses to generate per file. Defaults to #[code 25]. + | Keep in mind that a significantly higher number might cause the + | #[code .html] files to render slowly. + + +row + +cell #[code --gpu-id], #[code -g] + +cell option + +cell GPU to use, if any. Defaults to #[code -1] for CPU. + + +row + +cell #[code --gold-preproc], #[code -G] + +cell flag + +cell Use gold preprocessing. + + ++h(3, "package") Package + +p + | Generate a #[+a("/usage/training#models-generating") model Python package] | from an existing model data directory. All data files are copied over. | If the path to a meta.json is supplied, or a meta.json is found in the | input directory, this file is used. Otherwise, the data can be entered @@ -345,8 +435,8 @@ p | sure you're always using the latest versions. This means you need to be | connected to the internet to use this command. -+code(false, "bash"). - python -m spacy package [input_dir] [output_dir] [--meta] [--force] ++code(false, "bash", "$", false, false, true). + spacy package [input_dir] [output_dir] [--meta-path] [--create-meta] [--force] +table(["Argument", "Type", "Description"]) +row @@ -360,9 +450,16 @@ p +cell Directory to create package folder in. +row - +cell #[code meta] + +cell #[code --meta-path], #[code -m] +cell option - +cell Path to meta.json file (optional). + +cell #[+tag-new(2)] Path to meta.json file (optional). + + +row + +cell #[code --create-meta], #[code -c] + +cell flag + +cell + | #[+tag-new(2)] Create a meta.json file on the command line, even + | if one already exists in the directory. +row +cell #[code --force], #[code -f] diff --git a/website/api/_top-level/_compat.jade b/website/api/_top-level/_compat.jade new file mode 100644 index 000000000..dfd42c55f --- /dev/null +++ b/website/api/_top-level/_compat.jade @@ -0,0 +1,91 @@ +//- 💫 DOCS > API > TOP-LEVEL > COMPATIBILITY + +p + | All Python code is written in an + | #[strong intersection of Python 2 and Python 3]. This is easy in Cython, + | but somewhat ugly in Python. Logic that deals with Python or platform + | compatibility only lives in #[code spacy.compat]. To distinguish them from + | the builtin functions, replacement functions are suffixed with an + | undersocre, e.e #[code unicode_]. For specific checks, spaCy uses the + | #[code six] and #[code ftfy] packages. + ++aside-code("Example"). + from spacy.compat import unicode_, json_dumps + + compatible_unicode = unicode_('hello world') + compatible_json = json_dumps({'key': 'value'}) + ++table(["Name", "Python 2", "Python 3"]) + +row + +cell #[code compat.bytes_] + +cell #[code str] + +cell #[code bytes] + + +row + +cell #[code compat.unicode_] + +cell #[code unicode] + +cell #[code str] + + +row + +cell #[code compat.basestring_] + +cell #[code basestring] + +cell #[code str] + + +row + +cell #[code compat.input_] + +cell #[code raw_input] + +cell #[code input] + + +row + +cell #[code compat.json_dumps] + +cell #[code ujson.dumps] with #[code .decode('utf8')] + +cell #[code ujson.dumps] + + +row + +cell #[code compat.path2str] + +cell #[code str(path)] with #[code .decode('utf8')] + +cell #[code str(path)] + ++h(3, "is_config") compat.is_config + +tag function + +p + | Check if a specific configuration of Python version and operating system + | matches the user's setup. Mostly used to display targeted error messages. + ++aside-code("Example"). + from spacy.compat import is_config + + if is_config(python2=True, windows=True): + print("You are using Python 2 on Windows.") + ++table(["Name", "Type", "Description"]) + +row + +cell #[code python2] + +cell bool + +cell spaCy is executed with Python 2.x. + + +row + +cell #[code python3] + +cell bool + +cell spaCy is executed with Python 3.x. + + +row + +cell #[code windows] + +cell bool + +cell spaCy is executed on Windows. + + +row + +cell #[code linux] + +cell bool + +cell spaCy is executed on Linux. + + +row + +cell #[code osx] + +cell bool + +cell spaCy is executed on OS X or macOS. + + +row("foot") + +cell returns + +cell bool + +cell Whether the specified configuration matches the user's platform. diff --git a/website/docs/api/displacy.jade b/website/api/_top-level/_displacy.jade similarity index 91% rename from website/docs/api/displacy.jade rename to website/api/_top-level/_displacy.jade index 59fcca3ca..a3d7240d6 100644 --- a/website/docs/api/displacy.jade +++ b/website/api/_top-level/_displacy.jade @@ -1,14 +1,12 @@ -//- 💫 DOCS > API > DISPLACY - -include ../../_includes/_mixins +//- 💫 DOCS > API > TOP-LEVEL > DISPLACY p | As of v2.0, spaCy comes with a built-in visualization suite. For more | info and examples, see the usage guide on - | #[+a("/docs/usage/visualizers") visualizing spaCy]. + | #[+a("/usage/visualizers") visualizing spaCy]. -+h(2, "serve") displacy.serve ++h(3, "displacy.serve") displacy.serve +tag method +tag-new(2) @@ -60,7 +58,7 @@ p +cell bool +cell | Don't parse #[code Doc] and instead, expect a dict or list of - | dicts. #[+a("/docs/usage/visualizers#manual-usage") See here] + | dicts. #[+a("/usage/visualizers#manual-usage") See here] | for formats and examples. +cell #[code False] @@ -70,7 +68,7 @@ p +cell Port to serve visualization. +cell #[code 5000] -+h(2, "render") displacy.render ++h(3, "displacy.render") displacy.render +tag method +tag-new(2) @@ -127,24 +125,24 @@ p Render a dependency parse tree or named entity visualization. +cell bool +cell | Don't parse #[code Doc] and instead, expect a dict or list of - | dicts. #[+a("/docs/usage/visualizers#manual-usage") See here] + | dicts. #[+a("/usage/visualizers#manual-usage") See here] | for formats and examples. +cell #[code False] - +footrow + +row("foot") +cell returns +cell unicode +cell Rendered HTML markup. +cell -+h(2, "options") Visualizer options ++h(3, "displacy_options") Visualizer options p | The #[code options] argument lets you specify additional settings for | each visualizer. If a setting is not present in the options, the default | value will be used. -+h(3, "options-dep") Dependency Visualizer options ++h(4, "options-dep") Dependency Visualizer options +aside-code("Example"). options = {'compact': True, 'color': 'blue'} @@ -219,7 +217,7 @@ p +cell Distance between words in px. +cell #[code 175] / #[code 85] (compact) -+h(3, "options-ent") Named Entity Visualizer options ++h(4, "displacy_options-ent") Named Entity Visualizer options +aside-code("Example"). options = {'ents': ['PERSON', 'ORG', 'PRODUCT'], @@ -244,6 +242,6 @@ p p | By default, displaCy comes with colours for all - | #[+a("/docs/api/annotation#named-entities") entity types supported by spaCy]. + | #[+a("/api/annotation#named-entities") entity types supported by spaCy]. | If you're using custom entity types, you can use the #[code colors] | setting to add your own colours for them. diff --git a/website/docs/api/spacy.jade b/website/api/_top-level/_spacy.jade similarity index 62% rename from website/docs/api/spacy.jade rename to website/api/_top-level/_spacy.jade index a45307378..81ec744ad 100644 --- a/website/docs/api/spacy.jade +++ b/website/api/_top-level/_spacy.jade @@ -1,15 +1,13 @@ -//- 💫 DOCS > API > SPACY +//- 💫 DOCS > API > TOP-LEVEL > SPACY -include ../../_includes/_mixins - -+h(2, "load") spacy.load ++h(3, "spacy.load") spacy.load +tag function +tag-model p - | Load a model via its #[+a("/docs/usage/models#usage") shortcut link], + | Load a model via its #[+a("/usage/models#usage") shortcut link], | the name of an installed - | #[+a("/docs/usage/saving-loading#generating") model package], a unicode + | #[+a("/usage/training#models-generating") model package], a unicode | path or a #[code Path]-like object. spaCy will try resolving the load | argument in this order. If a model is loaded from a shortcut link or | package name, spaCy will assume it's a Python package and import it and @@ -38,25 +36,71 @@ p +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable]. + | #[+a("/usage/processing-pipelines#disabling") disable]. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell A #[code Language] object with the loaded model. -+infobox("⚠️ Deprecation note") +p + | Essentially, #[code spacy.load()] is a convenience wrapper that reads + | the language ID and pipeline components from a model's #[code meta.json], + | initialises the #[code Language] class, loads in the model data and + | returns it. + ++code("Abstract example"). + cls = util.get_lang_class(lang) # get language for ID, e.g. 'en' + nlp = cls() # initialise the language + for name in pipeline: + component = nlp.create_pipe(name) # create each pipeline component + nlp.add_pipe(component) # add component to pipeline + nlp.from_disk(model_data_path) # load in model data + ++infobox("Deprecation note", "⚠️") .o-block | As of spaCy 2.0, the #[code path] keyword argument is deprecated. spaCy | will also raise an error if no model could be loaded and never just | return an empty #[code Language] object. If you need a blank language, - | you need to import it explicitly (#[code from spacy.lang.en import English]) - | or use #[+api("util#get_lang_class") #[code util.get_lang_class]]. + | you can use the new function #[+api("spacy#blank") #[code spacy.blank()]] + | or import the class explicitly, e.g. + | #[code from spacy.lang.en import English]. +code-new nlp = spacy.load('/model') +code-old nlp = spacy.load('en', path='/model') -+h(2, "info") spacy.info ++h(3, "spacy.blank") spacy.blank + +tag function + +tag-new(2) + +p + | Create a blank model of a given language class. This function is the + | twin of #[code spacy.load()]. + ++aside-code("Example"). + nlp_en = spacy.blank('en') + nlp_de = spacy.blank('de') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell ISO code of the language class to load. + + +row + +cell #[code disable] + +cell list + +cell + | Names of pipeline components to + | #[+a("/usage/processing-pipelines#disabling") disable]. + + +row("foot") + +cell returns + +cell #[code Language] + +cell An empty #[code Language] object of the appropriate subclass. + + ++h(4, "spacy.info") spacy.info +tag function p @@ -83,13 +127,13 @@ p +cell Print information as Markdown. -+h(2, "explain") spacy.explain ++h(3, "spacy.explain") spacy.explain +tag function p | Get a description for a given POS tag, dependency label or entity type. | For a list of available terms, see - | #[+src(gh("spacy", "spacy/glossary.py")) glossary.py]. + | #[+src(gh("spacy", "spacy/glossary.py")) #[code glossary.py]]. +aside-code("Example"). spacy.explain('NORP') @@ -107,41 +151,7 @@ p +cell unicode +cell Term to explain. - +footrow + +row("foot") +cell returns +cell unicode +cell The explanation, or #[code None] if not found in the glossary. - -+h(2, "set_factory") spacy.set_factory - +tag function - +tag-new(2) - -p - | Set a factory that returns a custom - | #[+a("/docs/usage/language-processing-pipeline") processing pipeline] - | component. Factories are useful for creating stateful components, especially ones which depend on shared data. - -+aside-code("Example"). - def my_factory(vocab): - def my_component(doc): - return doc - return my_component - - spacy.set_factory('my_factory', my_factory) - nlp = Language(pipeline=['my_factory']) - -+table(["Name", "Type", "Description"]) - +row - +cell #[code factory_id] - +cell unicode - +cell - | Unique name of factory. If added to a new pipeline, spaCy will - | look up the factory for this ID and use it to create the - | component. - - +row - +cell #[code factory] - +cell callable - +cell - | Callable that takes a #[code Vocab] object and returns a pipeline - | component. diff --git a/website/docs/api/util.jade b/website/api/_top-level/_util.jade similarity index 87% rename from website/docs/api/util.jade rename to website/api/_top-level/_util.jade index 2127446df..1770a111e 100644 --- a/website/docs/api/util.jade +++ b/website/api/_top-level/_util.jade @@ -1,10 +1,8 @@ -//- 💫 DOCS > API > UTIL - -include ../../_includes/_mixins +//- 💫 DOCS > API > TOP-LEVEL > UTIL p | spaCy comes with a small collection of utility functions located in - | #[+src(gh("spaCy", "spacy/util.py")) spacy/util.py]. + | #[+src(gh("spaCy", "spacy/util.py")) #[code spacy/util.py]]. | Because utility functions are mostly intended for | #[strong internal use within spaCy], their behaviour may change with | future releases. The functions documented on this page should be safe @@ -12,7 +10,7 @@ p | recommend having additional tests in place if your application depends on | any of spaCy's utilities. -+h(2, "get_data_path") util.get_data_path ++h(3, "util.get_data_path") util.get_data_path +tag function p @@ -25,12 +23,12 @@ p +cell bool +cell Only return path if it exists, otherwise return #[code None]. - +footrow + +row("foot") +cell returns +cell #[code Path] / #[code None] +cell Data path or #[code None]. -+h(2, "set_data_path") util.set_data_path ++h(3, "util.set_data_path") util.set_data_path +tag function p @@ -47,12 +45,12 @@ p +cell unicode or #[code Path] +cell Path to new data directory. -+h(2, "get_lang_class") util.get_lang_class ++h(3, "util.get_lang_class") util.get_lang_class +tag function p | Import and load a #[code Language] class. Allows lazy-loading - | #[+a("/docs/usage/adding-languages") language data] and importing + | #[+a("/usage/adding-languages") language data] and importing | languages using the two-letter language code. +aside-code("Example"). @@ -67,12 +65,12 @@ p +cell unicode +cell Two-letter language code, e.g. #[code 'en']. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell Language class. -+h(2, "load_model") util.load_model ++h(3, "util.load_model") util.load_model +tag function +tag-new(2) @@ -101,12 +99,12 @@ p +cell - +cell Specific overrides, like pipeline components to disable. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell #[code Language] class with the loaded model. -+h(2, "load_model_from_path") util.load_model_from_path ++h(3, "util.load_model_from_path") util.load_model_from_path +tag function +tag-new(2) @@ -139,18 +137,18 @@ p +cell - +cell Specific overrides, like pipeline components to disable. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell #[code Language] class with the loaded model. -+h(2, "load_model_from_init_py") util.load_model_from_init_py ++h(3, "util.load_model_from_init_py") util.load_model_from_init_py +tag function +tag-new(2) p | A helper function to use in the #[code load()] method of a model package's - | #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) __init__.py]. + | #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) #[code __init__.py]]. +aside-code("Example"). from spacy.util import load_model_from_init_py @@ -169,12 +167,12 @@ p +cell - +cell Specific overrides, like pipeline components to disable. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell #[code Language] class with the loaded model. -+h(2, "get_model_meta") util.get_model_meta ++h(3, "util.get_model_meta") util.get_model_meta +tag function +tag-new(2) @@ -190,17 +188,17 @@ p +cell unicode or #[code Path] +cell Path to model directory. - +footrow + +row("foot") +cell returns +cell dict +cell The model's meta data. -+h(2, "is_package") util.is_package ++h(3, "util.is_package") util.is_package +tag function p | Check if string maps to a package installed via pip. Mainly used to - | validate #[+a("/docs/usage/models") model packages]. + | validate #[+a("/usage/models") model packages]. +aside-code("Example"). util.is_package('en_core_web_sm') # True @@ -212,18 +210,18 @@ p +cell unicode +cell Name of package. - +footrow + +row("foot") +cell returns +cell #[code bool] +cell #[code True] if installed package, #[code False] if not. -+h(2, "get_package_path") util.get_package_path ++h(3, "util.get_package_path") util.get_package_path +tag function +tag-new(2) p | Get path to an installed package. Mainly used to resolve the location of - | #[+a("/docs/usage/models") model packages]. Currently imports the package + | #[+a("/usage/models") model packages]. Currently imports the package | to find its path. +aside-code("Example"). @@ -236,12 +234,12 @@ p +cell unicode +cell Name of installed package. - +footrow + +row("foot") +cell returns +cell #[code Path] +cell Path to model package directory. -+h(2, "is_in_jupyter") util.is_in_jupyter ++h(3, "util.is_in_jupyter") util.is_in_jupyter +tag function +tag-new(2) @@ -257,17 +255,17 @@ p return display(HTML(html)) +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bool +cell #[code True] if in Jupyter, #[code False] if not. -+h(2, "update_exc") util.update_exc ++h(3, "util.update_exc") util.update_exc +tag function p | Update, validate and overwrite - | #[+a("/docs/usage/adding-languages#tokenizer-exceptions") tokenizer exceptions]. + | #[+a("/usage/adding-languages#tokenizer-exceptions") tokenizer exceptions]. | Used to combine global exceptions with custom, language-specific | exceptions. Will raise an error if key doesn't match #[code ORTH] values. @@ -288,20 +286,20 @@ p +cell dicts +cell Exception dictionaries to add to the base exceptions, in order. - +footrow + +row("foot") +cell returns +cell dict +cell Combined tokenizer exceptions. -+h(2, "prints") util.prints ++h(3, "util.prints") util.prints +tag function +tag-new(2) p | Print a formatted, text-wrapped message with optional title. If a text | argument is a #[code Path], it's converted to a string. Should only - | be used for interactive components like the #[+api("cli") cli]. + | be used for interactive components like the command-line interface. +aside-code("Example"). data_path = Path('/some/path') diff --git a/website/api/annotation.jade b/website/api/annotation.jade new file mode 100644 index 000000000..efada23d7 --- /dev/null +++ b/website/api/annotation.jade @@ -0,0 +1,131 @@ +//- 💫 DOCS > API > ANNOTATION SPECS + +include ../_includes/_mixins + +p This document describes the target annotations spaCy is trained to predict. + + ++section("tokenization") + +h(2, "tokenization") Tokenization + + p + | Tokenization standards are based on the + | #[+a("https://catalog.ldc.upenn.edu/LDC2013T19") OntoNotes 5] corpus. + | The tokenizer differs from most by including tokens for significant + | whitespace. Any sequence of whitespace characters beyond a single space + | (#[code ' ']) is included as a token. + + +aside-code("Example"). + from spacy.lang.en import English + nlp = English() + tokens = nlp('Some\nspaces and\ttab characters') + tokens_text = [t.text for t in tokens] + assert tokens_text == ['Some', '\n', 'spaces', ' ', 'and', + '\t', 'tab', 'characters'] + + p + | The whitespace tokens are useful for much the same reason punctuation is + | – it's often an important delimiter in the text. By preserving it in the + | token output, we are able to maintain a simple alignment between the + | tokens and the original string, and we ensure that no information is + | lost during processing. + ++section("sbd") + +h(2, "sentence-boundary") Sentence boundary detection + + p + | Sentence boundaries are calculated from the syntactic parse tree, so + | features such as punctuation and capitalisation play an important but + | non-decisive role in determining the sentence boundaries. Usually this + | means that the sentence boundaries will at least coincide with clause + | boundaries, even given poorly punctuated text. + ++section("pos-tagging") + +h(2, "pos-tagging") Part-of-speech Tagging + + +aside("Tip: Understanding tags") + | You can also use #[code spacy.explain()] to get the description for the + | string representation of a tag. For example, + | #[code spacy.explain("RB")] will return "adverb". + + include _annotation/_pos-tags + ++section("lemmatization") + +h(2, "lemmatization") Lemmatization + + p A "lemma" is the uninflected form of a word. In English, this means: + + +list + +item #[strong Adjectives]: The form like "happy", not "happier" or "happiest" + +item #[strong Adverbs]: The form like "badly", not "worse" or "worst" + +item #[strong Nouns]: The form like "dog", not "dogs"; like "child", not "children" + +item #[strong Verbs]: The form like "write", not "writes", "writing", "wrote" or "written" + + p + | The lemmatization data is taken from + | #[+a("https://wordnet.princeton.edu") WordNet]. However, we also add a + | special case for pronouns: all pronouns are lemmatized to the special + | token #[code -PRON-]. + + +infobox("About spaCy's custom pronoun lemma") + | Unlike verbs and common nouns, there's no clear base form of a personal + | pronoun. Should the lemma of "me" be "I", or should we normalize person + | as well, giving "it" — or maybe "he"? spaCy's solution is to introduce a + | novel symbol, #[code -PRON-], which is used as the lemma for + | all personal pronouns. + ++section("dependency-parsing") + +h(2, "dependency-parsing") Syntactic Dependency Parsing + + +aside("Tip: Understanding labels") + | You can also use #[code spacy.explain()] to get the description for the + | string representation of a label. For example, + | #[code spacy.explain("prt")] will return "particle". + + include _annotation/_dep-labels + ++section("named-entities") + +h(2, "named-entities") Named Entity Recognition + + +aside("Tip: Understanding entity types") + | You can also use #[code spacy.explain()] to get the description for the + | string representation of an entity label. For example, + | #[code spacy.explain("LANGUAGE")] will return "any named language". + + include _annotation/_named-entities + + +h(3, "biluo") BILUO Scheme + + include _annotation/_biluo + ++section("training") + +h(2, "json-input") JSON input format for training + + +under-construction + + p spaCy takes training data in the following format: + + +code("Example structure"). + doc: { + id: string, + paragraphs: [{ + raw: string, + sents: [int], + tokens: [{ + start: int, + tag: string, + head: int, + dep: string + }], + ner: [{ + start: int, + end: int, + label: string + }], + brackets: [{ + start: int, + end: int, + label: string + }] + }] + } diff --git a/website/docs/api/binder.jade b/website/api/binder.jade similarity index 79% rename from website/docs/api/binder.jade rename to website/api/binder.jade index 0dea1b339..e47cb597d 100644 --- a/website/docs/api/binder.jade +++ b/website/api/binder.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > BINDER -include ../../_includes/_mixins +include ../_includes/_mixins p A container class for serializing collections of #[code Doc] objects. diff --git a/website/api/dependencyparser.jade b/website/api/dependencyparser.jade new file mode 100644 index 000000000..ca56d6816 --- /dev/null +++ b/website/api/dependencyparser.jade @@ -0,0 +1,5 @@ +//- 💫 DOCS > API > DEPENDENCYPARSER + +include ../_includes/_mixins + +!=partial("pipe", { subclass: "DependencyParser", short: "parser", pipeline_id: "parser" }) diff --git a/website/docs/api/doc.jade b/website/api/doc.jade similarity index 76% rename from website/docs/api/doc.jade rename to website/api/doc.jade index f82a26c9e..dce6b89e0 100644 --- a/website/docs/api/doc.jade +++ b/website/api/doc.jade @@ -1,8 +1,6 @@ //- 💫 DOCS > API > DOC -include ../../_includes/_mixins - -p A container for accessing linguistic annotations. +include ../_includes/_mixins p | A #[code Doc] is a sequence of #[+api("token") #[code Token]] objects. @@ -47,7 +45,7 @@ p | subsequent space. Must have the same length as #[code words], if | specified. Defaults to a sequence of #[code True]. - +footrow + +row("foot") +cell returns +cell #[code Doc] +cell The newly constructed object. @@ -73,7 +71,7 @@ p +cell int +cell The index of the token. - +footrow + +row("foot") +cell returns +cell #[code Token] +cell The token at #[code doc[i]]. @@ -96,7 +94,7 @@ p +cell tuple +cell The slice of the document to get. - +footrow + +row("foot") +cell returns +cell #[code Span] +cell The span at #[code doc[start : end]]. @@ -120,7 +118,7 @@ p | from Cython. +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A #[code Token] object. @@ -135,11 +133,151 @@ p Get the number of tokens in the document. assert len(doc) == 7 +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of tokens in the document. ++h(2, "set_extension") Doc.set_extension + +tag classmethod + +tag-new(2) + +p + | Define a custom attribute on the #[code Doc] which becomes available via + | #[code Doc._]. For details, see the documentation on + | #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes]. + ++aside-code("Example"). + from spacy.tokens import Doc + city_getter = lambda doc: doc.text in ('New York', 'Paris', 'Berlin') + Doc.set_extension('has_city', getter=city_getter) + doc = nlp(u'I like New York') + assert doc._.has_city + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell + | Name of the attribute to set by the extension. For example, + | #[code 'my_attr'] will be available as #[code doc._.my_attr]. + + +row + +cell #[code default] + +cell - + +cell + | Optional default value of the attribute if no getter or method + | is defined. + + +row + +cell #[code method] + +cell callable + +cell + | Set a custom method on the object, for example + | #[code doc._.compare(other_doc)]. + + +row + +cell #[code getter] + +cell callable + +cell + | Getter function that takes the object and returns an attribute + | value. Is called when the user accesses the #[code ._] attribute. + + +row + +cell #[code setter] + +cell callable + +cell + | Setter function that takes the #[code Doc] and a value, and + | modifies the object. Is called when the user writes to the + | #[code Doc._] attribute. + ++h(2, "get_extension") Doc.get_extension + +tag classmethod + +tag-new(2) + +p + | Look up a previously registered extension by name. Returns a 4-tuple + | #[code.u-break (default, method, getter, setter)] if the extension is + | registered. Raises a #[code KeyError] otherwise. + ++aside-code("Example"). + from spacy.tokens import Doc + Doc.set_extension('is_city', default=False) + extension = Doc.get_extension('is_city') + assert extension == (False, None, None, None) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the extension. + + +row("foot") + +cell returns + +cell tuple + +cell + | A #[code.u-break (default, method, getter, setter)] tuple of the + | extension. + ++h(2, "has_extension") Doc.has_extension + +tag classmethod + +tag-new(2) + +p Check whether an extension has been registered on the #[code Doc] class. + ++aside-code("Example"). + from spacy.tokens import Doc + Doc.set_extension('is_city', default=False) + assert Doc.has_extension('is_city') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the extension to check. + + +row("foot") + +cell returns + +cell bool + +cell Whether the extension has been registered. + ++h(2, "char_span") Doc.char_span + +tag method + +tag-new(2) + +p Create a #[code Span] object from the slice #[code doc.text[start : end]]. + ++aside-code("Example"). + doc = nlp(u'I like New York') + span = doc.char_span(7, 15, label=u'GPE') + assert span.text == 'New York' + ++table(["Name", "Type", "Description"]) + +row + +cell #[code start] + +cell int + +cell The index of the first character of the span. + + +row + +cell #[code end] + +cell int + +cell The index of the first character after the span. + + +row + +cell #[code label] + +cell uint64 / unicode + +cell A label to attach to the Span, e.g. for named entities. + + +row + +cell #[code vector] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell A meaning representation of the span. + + +row("foot") + +cell returns + +cell #[code Span] + +cell The newly constructed object. + +h(2, "similarity") Doc.similarity +tag method +tag-model("vectors") @@ -163,7 +301,7 @@ p | The object to compare with. By default, accepts #[code Doc], | #[code Span], #[code Token] and #[code Lexeme] objects. - +footrow + +row("foot") +cell returns +cell float +cell A scalar similarity score. Higher is more similar. @@ -189,7 +327,7 @@ p +cell int +cell The attribute ID - +footrow + +row("foot") +cell returns +cell dict +cell A dictionary mapping attributes to integer counts. @@ -211,12 +349,12 @@ p +table(["Name", "Type", "Description"]) +row +cell #[code attr_ids] - +cell ints + +cell list +cell A list of attribute ID ints. - +footrow + +row("foot") +cell returns - +cell #[code numpy.ndarray[ndim=2, dtype='int32']] + +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']] +cell | The exported attributes as a 2D numpy array, with one row per | token and one column per attribute. @@ -245,10 +383,10 @@ p +row +cell #[code array] - +cell #[code numpy.ndarray[ndim=2, dtype='int32']] + +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']] +cell The attribute values to load. - +footrow + +row("foot") +cell returns +cell #[code Doc] +cell Itself. @@ -289,7 +427,7 @@ p Loads state from a directory. Modifies the object in place and returns it. | A path to a directory. Paths may be either strings or | #[code Path]-like objects. - +footrow + +row("foot") +cell returns +cell #[code Doc] +cell The modified #[code Doc] object. @@ -304,7 +442,7 @@ p Serialize, i.e. export the document contents to a binary string. doc_bytes = doc.to_bytes() +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bytes +cell @@ -330,7 +468,7 @@ p Deserialize, i.e. import the document contents from a binary string. +cell bytes +cell The string to load from. - +footrow + +row("foot") +cell returns +cell #[code Doc] +cell The #[code Doc] object. @@ -341,7 +479,7 @@ p Deserialize, i.e. import the document contents from a binary string. p | Retokenize the document, such that the span at | #[code doc.text[start_idx : end_idx]] is merged into a single token. If - | #[code start_idx] and #[end_idx] do not mark start and end token + | #[code start_idx] and #[code end_idx] do not mark start and end token | boundaries, the document remains unchanged. +aside-code("Example"). @@ -368,7 +506,7 @@ p | attributes are inherited from the syntactic root token of | the span. - +footrow + +row("foot") +cell returns +cell #[code Token] +cell @@ -403,7 +541,7 @@ p +cell bool +cell Don't include arcs or modifiers. - +footrow + +row("foot") +cell returns +cell dict +cell Parse tree as dict. @@ -425,7 +563,7 @@ p assert ents[0].text == 'Mr. Best' +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Span] +cell Entities in the document. @@ -448,7 +586,7 @@ p assert chunks[1].text == "another phrase" +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Span] +cell Noun chunks in the document. @@ -470,7 +608,7 @@ p assert [s.root.text for s in sents] == ["is", "'s"] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Span] +cell Sentences in the document. @@ -488,7 +626,7 @@ p assert doc.has_vector +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bool +cell Whether the document has a vector data attached. @@ -507,9 +645,9 @@ p assert doc.vector.shape == (300,) +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns - +cell #[code numpy.ndarray[ndim=1, dtype='float32']] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] +cell A 1D numpy array representing the document's semantics. +h(2, "vector_norm") Doc.vector_norm @@ -527,7 +665,7 @@ p assert doc1.vector_norm != doc2.vector_norm +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell float +cell The L2 norm of the vector representation. @@ -558,10 +696,20 @@ p +cell The store of lexical types. +row - +cell #[code tensor] + +cell #[code tensor] #[+tag-new(2)] +cell object +cell Container for dense vector representations. + +row + +cell #[code cats] #[+tag-new(2)] + +cell dictionary + +cell + | Maps either a label to a score for categories applied to whole + | document, or #[code (start_char, end_char, label)] to score for + | categories applied to spans. #[code start_char] and #[code end_char] + | should be character offsets, label can be either a string or an + | integer ID, and score should be a float. + +row +cell #[code user_data] +cell - diff --git a/website/api/entityrecognizer.jade b/website/api/entityrecognizer.jade new file mode 100644 index 000000000..aff33bde7 --- /dev/null +++ b/website/api/entityrecognizer.jade @@ -0,0 +1,5 @@ +//- 💫 DOCS > API > ENTITYRECOGNIZER + +include ../_includes/_mixins + +!=partial("pipe", { subclass: "EntityRecognizer", short: "ner", pipeline_id: "ner" }) diff --git a/website/docs/api/goldcorpus.jade b/website/api/goldcorpus.jade similarity index 71% rename from website/docs/api/goldcorpus.jade rename to website/api/goldcorpus.jade index 3b3d92823..0f7105f65 100644 --- a/website/docs/api/goldcorpus.jade +++ b/website/api/goldcorpus.jade @@ -1,14 +1,12 @@ //- 💫 DOCS > API > GOLDCORPUS -include ../../_includes/_mixins +include ../_includes/_mixins p - | An annotated corpus, using the JSON file format. Manages annotations for - | tagging, dependency parsing and NER. + | This class manages annotations for tagging, dependency parsing and NER. +h(2, "init") GoldCorpus.__init__ +tag method - +tag-new(2) p Create a #[code GoldCorpus]. diff --git a/website/docs/api/goldparse.jade b/website/api/goldparse.jade similarity index 89% rename from website/docs/api/goldparse.jade rename to website/api/goldparse.jade index 7818912c3..c27badee9 100644 --- a/website/docs/api/goldparse.jade +++ b/website/api/goldparse.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > GOLDPARSE -include ../../_includes/_mixins +include ../_includes/_mixins p Collection for training annotations. @@ -40,7 +40,7 @@ p Create a #[code GoldParse]. +cell iterable +cell A sequence of named entity annotations, either as BILUO tag strings, or as #[code (start_char, end_char, label)] tuples, representing the entity positions. - +footrow + +row("foot") +cell returns +cell #[code GoldParse] +cell The newly constructed object. @@ -51,7 +51,7 @@ p Create a #[code GoldParse]. p Get the number of gold-standard tokens. +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of gold-standard tokens. @@ -64,7 +64,7 @@ p | tree. +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bool +cell Whether annotations form projective tree. @@ -103,6 +103,14 @@ p +cell list +cell The alignment from gold tokenization to candidate tokenization. + +row + +cell #[code cats] #[+tag-new(2)] + +cell list + +cell + | Entries in the list should be either a label, or a + | #[code (start, end, label)] triple. The tuple form is used for + | categories applied to spans of the document. + +h(2, "util") Utilities @@ -111,7 +119,7 @@ p p | Encode labelled spans into per-token tags, using the - | #[+a("/docs/api/annotation#biluo") BILUO scheme] (Begin/In/Last/Unit/Out). + | #[+a("/api/annotation#biluo") BILUO scheme] (Begin/In/Last/Unit/Out). p | Returns a list of unicode strings, describing the tags. Each tag string @@ -149,11 +157,11 @@ p | and #[code end] should be character-offset integers denoting the | slice into the original string. - +footrow + +row("foot") +cell returns +cell list +cell | Unicode strings, describing the - | #[+a("/docs/api/annotation#biluo") BILUO] tags. + | #[+a("/api/annotation#biluo") BILUO] tags. diff --git a/website/api/index.jade b/website/api/index.jade new file mode 100644 index 000000000..8035c9ff5 --- /dev/null +++ b/website/api/index.jade @@ -0,0 +1,14 @@ +//- 💫 DOCS > API > ARCHITECTURE + +include ../_includes/_mixins + ++section("basics") + include ../usage/_spacy-101/_architecture + ++section("nn-model") + +h(2, "nn-model") Neural network model architecture + include _architecture/_nn-model + ++section("cython") + +h(2, "cython") Cython conventions + include _architecture/_cython diff --git a/website/docs/api/language.jade b/website/api/language.jade similarity index 60% rename from website/docs/api/language.jade rename to website/api/language.jade index 9c26f506c..500d6c411 100644 --- a/website/docs/api/language.jade +++ b/website/api/language.jade @@ -1,10 +1,17 @@ //- 💫 DOCS > API > LANGUAGE -include ../../_includes/_mixins +include ../_includes/_mixins p - | A text-processing pipeline. Usually you'll load this once per process, - | and pass the instance around your application. + | Usually you'll load this once per process as #[code nlp] and pass the + | instance around your application. The #[code Language] class is created + | when you call #[+api("spacy#load") #[code spacy.load()]] and contains + | the shared vocabulary and #[+a("/usage/adding-languages") language data], + | optional model data loaded from a #[+a("/models") model package] or + | a path, and a #[+a("/usage/processing-pipelines") processing pipeline] + | containing components like the tagger or parser that are called on a + | document in order. You can also add your own processing pipeline + | components that take a #[code Doc] object, modify it and return it. +h(2, "init") Language.__init__ +tag method @@ -12,9 +19,9 @@ p p Initialise a #[code Language] object. +aside-code("Example"). + from spacy.vocab import Vocab from spacy.language import Language - nlp = Language(pipeline=['token_vectors', 'tags', - 'dependencies']) + nlp = Language(Vocab()) from spacy.lang.en import English nlp = English() @@ -34,14 +41,6 @@ p Initialise a #[code Language] object. | A function that takes text and returns a #[code Doc] object. | Usually a #[code Tokenizer]. - +row - +cell #[code pipeline] - +cell list - +cell - | A list of annotation processes or IDs of annotation, processes, - | e.g. a #[code Tagger] object, or #[code 'tagger']. IDs are looked - | up in #[code Language.Defaults.factories]. - +row +cell #[code meta] +cell dict @@ -49,7 +48,7 @@ p Initialise a #[code Language] object. | Custom meta data for the #[code Language] class. Is written to by | models to add model meta data. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell The newly constructed object. @@ -77,14 +76,14 @@ p +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable]. + | #[+a("/usage/processing-pipelines#disabling") disable]. - +footrow + +row("foot") +cell returns +cell #[code Doc] +cell A container for accessing the annotations. -+infobox("⚠️ Deprecation note") ++infobox("Deprecation note", "⚠️") .o-block | Pipeline components to prevent from being loaded can now be added as | a list to #[code disable], instead of specifying one keyword argument @@ -111,6 +110,14 @@ p +cell - +cell A sequence of unicode objects. + +row + +cell #[code as_tuples] + +cell bool + +cell + | If set to #[code True], inputs should be a sequence of + | #[code (text, context)] tuples. Output will then be a sequence of + | #[code (doc, context)] tuples. Defaults to #[code False]. + +row +cell #[code n_threads] +cell int @@ -128,9 +135,9 @@ p +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable]. + | #[+a("/usage/processing-pipelines#disabling") disable]. - +footrow + +row("foot") +cell yields +cell #[code Doc] +cell Documents in the order of the original text. @@ -167,7 +174,7 @@ p Update the models in the pipeline. +cell callable +cell An optimizer. - +footrow + +row("foot") +cell returns +cell dict +cell Results from the update. @@ -192,7 +199,7 @@ p +cell - +cell Config parameters. - +footrow + +row("foot") +cell yields +cell tuple +cell An optimizer. @@ -227,18 +234,188 @@ p | Can be called before training to pre-process gold data. By default, it | handles nonprojectivity and adds missing tags to the tag map. - +table(["Name", "Type", "Description"]) +row +cell #[code docs_golds] +cell iterable +cell Tuples of #[code Doc] and #[code GoldParse] objects. - +footrow + +row("foot") +cell yields +cell tuple +cell Tuples of #[code Doc] and #[code GoldParse] objects. ++h(2, "create_pipe") Language.create_pipe + +tag method + +tag-new(2) + +p Create a pipeline component from a factory. + ++aside-code("Example"). + parser = nlp.create_pipe('parser') + nlp.add_pipe(parser) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell + | Factory name to look up in + | #[+api("language#class-attributes") #[code Language.factories]]. + + +row + +cell #[code config] + +cell dict + +cell Configuration parameters to initialise component. + + +row("foot") + +cell returns + +cell callable + +cell The pipeline component. + ++h(2, "add_pipe") Language.add_pipe + +tag method + +tag-new(2) + +p + | Add a component to the processing pipeline. Valid components are + | callables that take a #[code Doc] object, modify it and return it. Only + | one of #[code before], #[code after], #[code first] or #[code last] can + | be set. Default behaviour is #[code last=True]. + ++aside-code("Example"). + def component(doc): + # modify Doc and return it + return doc + + nlp.add_pipe(component, before='ner') + nlp.add_pipe(component, name='custom_name', last=True) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code component] + +cell callable + +cell The pipeline component. + + +row + +cell #[code name] + +cell unicode + +cell + | Name of pipeline component. Overwrites existing + | #[code component.name] attribute if available. If no #[code name] + | is set and the component exposes no name attribute, + | #[code component.__name__] is used. An error is raised if the + | name already exists in the pipeline. + + +row + +cell #[code before] + +cell unicode + +cell Component name to insert component directly before. + + +row + +cell #[code after] + +cell unicode + +cell Component name to insert component directly after: + + +row + +cell #[code first] + +cell bool + +cell Insert component first / not first in the pipeline. + + +row + +cell #[code last] + +cell bool + +cell Insert component last / not last in the pipeline. + ++h(2, "get_pipe") Language.get_pipe + +tag method + +tag-new(2) + +p Get a pipeline component for a given component name. + ++aside-code("Example"). + parser = nlp.get_pipe('parser') + custom_component = nlp.get_pipe('custom_component') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the pipeline component to get. + + +row("foot") + +cell returns + +cell callable + +cell The pipeline component. + ++h(2, "replace_pipe") Language.replace_pipe + +tag method + +tag-new(2) + +p Replace a component in the pipeline. + ++aside-code("Example"). + nlp.replace_pipe('parser', my_custom_parser) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the component to replace. + + +row + +cell #[code component] + +cell callable + +cell The pipeline component to inser. + + ++h(2, "rename_pipe") Language.rename_pipe + +tag method + +tag-new(2) + +p + | Rename a component in the pipeline. Useful to create custom names for + | pre-defined and pre-loaded components. To change the default name of + | a component added to the pipeline, you can also use the #[code name] + | argument on #[+api("language#add_pipe") #[code add_pipe]]. + ++aside-code("Example"). + nlp.rename_pipe('parser', 'spacy_parser') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code old_name] + +cell unicode + +cell Name of the component to rename. + + +row + +cell #[code new_name] + +cell unicode + +cell New name of the component. + ++h(2, "remove_pipe") Language.remove_pipe + +tag method + +tag-new(2) + +p + | Remove a component from the pipeline. Returns the removed component name + | and component function. + ++aside-code("Example"). + name, component = nlp.remove_pipe('parser') + assert name == 'parser' + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the component to remove. + + +row("foot") + +cell returns + +cell tuple + +cell A #[code (name, component)] tuple of the removed component. + +h(2, "to_disk") Language.to_disk +tag method +tag-new(2) @@ -263,7 +440,7 @@ p +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable] + | #[+a("/usage/processing-pipelines#disabling") disable] | and prevent from being saved. +h(2, "from_disk") Language.from_disk @@ -292,14 +469,14 @@ p +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable]. + | #[+a("/usage/processing-pipelines#disabling") disable]. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell The modified #[code Language] object. -+infobox("⚠️ Deprecation note") ++infobox("Deprecation note", "⚠️") .o-block | As of spaCy v2.0, the #[code save_to_directory] method has been | renamed to #[code to_disk], to improve consistency across classes. @@ -324,10 +501,10 @@ p Serialize the current state to a binary string. +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable] + | #[+a("/usage/processing-pipelines#disabling") disable] | and prevent from being serialized. - +footrow + +row("foot") +cell returns +cell bytes +cell The serialized form of the #[code Language] object. @@ -354,14 +531,14 @@ p Load state from a binary string. +cell list +cell | Names of pipeline components to - | #[+a("/docs/usage/language-processing-pipeline#disabling") disable]. + | #[+a("/usage/processing-pipelines#disabling") disable]. - +footrow + +row("foot") +cell returns +cell #[code Language] +cell The #[code Language] object. -+infobox("⚠️ Deprecation note") ++infobox("Deprecation note", "⚠️") .o-block | Pipeline components to prevent from being loaded can now be added as | a list to #[code disable], instead of specifying one keyword argument @@ -391,7 +568,15 @@ p Load state from a binary string. +row +cell #[code pipeline] +cell list - +cell Sequence of annotation functions. + +cell + | List of #[code (name, component)] tuples describing the current + | processing pipeline, in order. + + +row + +cell #[code pipe_names] + +tag-new(2) + +cell list + +cell List of pipeline component names, in order. +row +cell #[code meta] @@ -416,3 +601,12 @@ p Load state from a binary string. +cell | Two-letter language ID, i.e. | #[+a("https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes") ISO code]. + + +row + +cell #[code factories] + +tag-new(2) + +cell dict + +cell + | Factories that create pre-defined pipeline components, e.g. the + | tagger, parser or entity recognizer, keyed by their component + | name. diff --git a/website/api/lemmatizer.jade b/website/api/lemmatizer.jade new file mode 100644 index 000000000..9699395b1 --- /dev/null +++ b/website/api/lemmatizer.jade @@ -0,0 +1,5 @@ +//- 💫 DOCS > API > LEMMATIZER + +include ../_includes/_mixins + ++under-construction diff --git a/website/docs/api/lexeme.jade b/website/api/lexeme.jade similarity index 97% rename from website/docs/api/lexeme.jade rename to website/api/lexeme.jade index a0487be9b..dddefd2d7 100644 --- a/website/docs/api/lexeme.jade +++ b/website/api/lexeme.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > LEXEME -include ../../_includes/_mixins +include ../_includes/_mixins p | An entry in the vocabulary. A #[code Lexeme] has no string context – it's @@ -24,7 +24,7 @@ p Create a #[code Lexeme] object. +cell int +cell The orth id of the lexeme. - +footrow + +row("foot") +cell returns +cell #[code Lexeme] +cell The newly constructed object. @@ -65,7 +65,7 @@ p Check the value of a boolean flag. +cell int +cell The attribute ID of the flag to query. - +footrow + +row("foot") +cell returns +cell bool +cell The value of the flag. @@ -91,7 +91,7 @@ p Compute a semantic similarity estimate. Defaults to cosine over vectors. | The object to compare with. By default, accepts #[code Doc], | #[code Span], #[code Token] and #[code Lexeme] objects. - +footrow + +row("foot") +cell returns +cell float +cell A scalar similarity score. Higher is more similar. @@ -110,7 +110,7 @@ p assert apple.has_vector +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bool +cell Whether the lexeme has a vector data attached. @@ -127,9 +127,9 @@ p A real-valued meaning representation. assert apple.vector.shape == (300,) +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns - +cell #[code numpy.ndarray[ndim=1, dtype='float32']] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] +cell A 1D numpy array representing the lexeme's semantics. +h(2, "vector_norm") Lexeme.vector_norm @@ -146,7 +146,7 @@ p The L2 norm of the lexeme's vector representation. assert apple.vector_norm != pasta.vector_norm +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell float +cell The L2 norm of the vector representation. diff --git a/website/docs/api/matcher.jade b/website/api/matcher.jade similarity index 96% rename from website/docs/api/matcher.jade rename to website/api/matcher.jade index 95819e553..35aba4cba 100644 --- a/website/docs/api/matcher.jade +++ b/website/api/matcher.jade @@ -1,10 +1,8 @@ //- 💫 DOCS > API > MATCHER -include ../../_includes/_mixins +include ../_includes/_mixins -p Match sequences of tokens, based on pattern rules. - -+infobox("⚠️ Deprecation note") ++infobox("Deprecation note", "⚠️") | As of spaCy 2.0, #[code Matcher.add_pattern] and #[code Matcher.add_entity] | are deprecated and have been replaced with a simpler | #[+api("matcher#add") #[code Matcher.add]] that lets you add a list of @@ -39,7 +37,7 @@ p Create the rule-based #[code Matcher]. +cell dict +cell Patterns to add to the matcher, keyed by ID. - +footrow + +row("foot") +cell returns +cell #[code Matcher] +cell The newly constructed object. @@ -64,7 +62,7 @@ p Find all token sequences matching the supplied patterns on the #[code Doc]. +cell #[code Doc] +cell The document to match over. - +footrow + +row("foot") +cell returns +cell list +cell @@ -81,7 +79,7 @@ p Find all token sequences matching the supplied patterns on the #[code Doc]. | actions per pattern within the same matcher. For example, you might only | want to merge some entity types, and set custom flags for other matched | patterns. For more details and examples, see the usage guide on - | #[+a("/docs/usage/rule-based-matching") rule-based matching]. + | #[+a("/usage/linguistic-features#rule-based-matching") rule-based matching]. +h(2, "pipe") Matcher.pipe +tag method @@ -113,7 +111,7 @@ p Match a stream of documents, yielding them in turn. | parallel, if the #[code Matcher] implementation supports | multi-threading. - +footrow + +row("foot") +cell yields +cell #[code Doc] +cell Documents, in order. @@ -134,7 +132,7 @@ p assert len(matcher) == 1 +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of rules. @@ -156,7 +154,8 @@ p Check whether the matcher contains rules for a match ID. +cell #[code key] +cell unicode +cell The match ID. - +footrow + + +row("foot") +cell returns +cell int +cell Whether the matcher contains rules for this match ID. @@ -203,7 +202,7 @@ p | Match pattern. A pattern consists of a list of dicts, where each | dict describes a token. -+infobox("⚠️ Deprecation note") ++infobox("Deprecation note", "⚠️") .o-block | As of spaCy 2.0, #[code Matcher.add_pattern] and #[code Matcher.add_entity] | are deprecated and have been replaced with a simpler @@ -257,7 +256,7 @@ p +cell unicode +cell The ID of the match rule. - +footrow + +row("foot") +cell returns +cell tuple +cell The rule, as an #[code (on_match, patterns)] tuple. diff --git a/website/api/phrasematcher.jade b/website/api/phrasematcher.jade new file mode 100644 index 000000000..223ec11f9 --- /dev/null +++ b/website/api/phrasematcher.jade @@ -0,0 +1,181 @@ +//- 💫 DOCS > API > PHRASEMATCHER + +include ../_includes/_mixins + +p + | The #[code PhraseMatcher] lets you efficiently match large terminology + | lists. While the #[+api("matcher") #[code Matcher]] lets you match + | squences based on lists of token descriptions, the #[code PhraseMatcher] + | accepts match patterns in the form of #[code Doc] objects. + ++h(2, "init") PhraseMatcher.__init__ + +tag method + +p Create the rule-based #[code PhraseMatcher]. + ++aside-code("Example"). + from spacy.matcher import PhraseMatcher + matcher = PhraseMatcher(nlp.vocab, max_length=6) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code vocab] + +cell #[code Vocab] + +cell + | The vocabulary object, which must be shared with the documents + | the matcher will operate on. + + +row + +cell #[code max_length] + +cell int + +cell Mamimum length of a phrase pattern to add. + + +row("foot") + +cell returns + +cell #[code PhraseMatcher] + +cell The newly constructed object. + ++h(2, "call") PhraseMatcher.__call__ + +tag method + +p Find all token sequences matching the supplied patterns on the #[code Doc]. + ++aside-code("Example"). + from spacy.matcher import PhraseMatcher + + matcher = PhraseMatcher(nlp.vocab) + matcher.add('OBAMA', None, nlp(u"Barack Obama")) + doc = nlp(u"Barack Obama lifts America one last time in emotional farewell") + matches = matcher(doc) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code doc] + +cell #[code Doc] + +cell The document to match over. + + +row("foot") + +cell returns + +cell list + +cell + | A list of #[code (match_id, start, end)] tuples, describing the + | matches. A match tuple describes a span #[code doc[start:end]]. + | The #[code match_id] is the ID of the added match pattern. + ++h(2, "pipe") PhraseMatcher.pipe + +tag method + +p Match a stream of documents, yielding them in turn. + ++aside-code("Example"). + from spacy.matcher import PhraseMatcher + matcher = PhraseMatcher(nlp.vocab) + for doc in matcher.pipe(texts, batch_size=50, n_threads=4): + pass + ++table(["Name", "Type", "Description"]) + +row + +cell #[code docs] + +cell iterable + +cell A stream of documents. + + +row + +cell #[code batch_size] + +cell int + +cell The number of documents to accumulate into a working set. + + +row + +cell #[code n_threads] + +cell int + +cell + | The number of threads with which to work on the buffer in + | parallel, if the #[code PhraseMatcher] implementation supports + | multi-threading. + + +row("foot") + +cell yields + +cell #[code Doc] + +cell Documents, in order. + ++h(2, "len") PhraseMatcher.__len__ + +tag method + +p + | Get the number of rules added to the matcher. Note that this only returns + | the number of rules (identical with the number of IDs), not the number + | of individual patterns. + ++aside-code("Example"). + matcher = PhraseMatcher(nlp.vocab) + assert len(matcher) == 0 + matcher.add('OBAMA', None, nlp(u"Barack Obama")) + assert len(matcher) == 1 + ++table(["Name", "Type", "Description"]) + +row("foot") + +cell returns + +cell int + +cell The number of rules. + ++h(2, "contains") PhraseMatcher.__contains__ + +tag method + +p Check whether the matcher contains rules for a match ID. + ++aside-code("Example"). + matcher = PhraseMatcher(nlp.vocab) + assert 'OBAMA' not in matcher + matcher.add('OBAMA', None, nlp(u"Barack Obama")) + assert 'OBAMA' in matcher + ++table(["Name", "Type", "Description"]) + +row + +cell #[code key] + +cell unicode + +cell The match ID. + + +row("foot") + +cell returns + +cell int + +cell Whether the matcher contains rules for this match ID. + ++h(2, "add") PhraseMatcher.add + +tag method + +p + | Add a rule to the matcher, consisting of an ID key, one or more patterns, and + | a callback function to act on the matches. The callback function will + | receive the arguments #[code matcher], #[code doc], #[code i] and + | #[code matches]. If a pattern already exists for the given ID, the + | patterns will be extended. An #[code on_match] callback will be + | overwritten. + ++aside-code("Example"). + def on_match(matcher, doc, id, matches): + print('Matched!', matches) + + matcher = PhraseMatcher(nlp.vocab) + matcher.add('OBAMA', on_match, nlp(u"Barack Obama")) + matcher.add('HEALTH', on_match, nlp(u"health care reform"), + nlp(u"healthcare reform")) + doc = nlp(u"Barack Obama urges Congress to find courage to defend his healthcare reforms") + matches = matcher(doc) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code match_id] + +cell unicode + +cell An ID for the thing you're matching. + + +row + +cell #[code on_match] + +cell callable or #[code None] + +cell + | Callback function to act on matches. Takes the arguments + | #[code matcher], #[code doc], #[code i] and #[code matches]. + + +row + +cell #[code *docs] + +cell list + +cell + | #[code Doc] objects of the phrases to match. diff --git a/website/api/pipe.jade b/website/api/pipe.jade new file mode 100644 index 000000000..66bdbcc62 --- /dev/null +++ b/website/api/pipe.jade @@ -0,0 +1,390 @@ +//- 💫 DOCS > API > PIPE + +include ../_includes/_mixins + +//- This page can be used as a template for all other classes that inherit +//- from `Pipe`. + +if subclass + +infobox + | This class is a subclass of #[+api("pipe") #[code Pipe]] and + | follows the same API. The pipeline component is available in the + | #[+a("/usage/processing-pipelines") processing pipeline] via the ID + | #[code "#{pipeline_id}"]. + +else + p + | This class is not instantiated directly. Components inherit from it, + | and it defines the interface that components should follow to + | function as components in a spaCy analysis pipeline. + +- CLASSNAME = subclass || 'Pipe' +- VARNAME = short || CLASSNAME.toLowerCase() + + ++h(2, "model") #{CLASSNAME}.Model + +tag classmethod + +p + | Initialise a model for the pipe. The model should implement the + | #[code thinc.neural.Model] API. Wrappers are available for + | #[+a("/usage/deep-learning") most major machine learning libraries]. + ++table(["Name", "Type", "Description"]) + +row + +cell #[code **kwargs] + +cell - + +cell Parameters for initialising the model + + +row("foot") + +cell returns + +cell object + +cell The initialised model. + ++h(2, "init") #{CLASSNAME}.__init__ + +tag method + +p Create a new pipeline instance. + ++aside-code("Example"). + from spacy.pipeline import #{CLASSNAME} + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code vocab] + +cell #[code Vocab] + +cell The shared vocabulary. + + +row + +cell #[code model] + +cell #[code thinc.neural.Model] or #[code True] + +cell + | The model powering the pipeline component. If no model is + | supplied, the model is created when you call + | #[code begin_training], #[code from_disk] or #[code from_bytes]. + + +row + +cell #[code **cfg] + +cell - + +cell Configuration parameters. + + +row("foot") + +cell returns + +cell #[code=CLASSNAME] + +cell The newly constructed object. + ++h(2, "call") #{CLASSNAME}.__call__ + +tag method + +p + | Apply the pipe to one document. The document is modified in place, and + | returned. Both #[code #{CLASSNAME}.__call__] and + | #[code #{CLASSNAME}.pipe] should delegate to the + | #[code #{CLASSNAME}.predict] and #[code #{CLASSNAME}.set_annotations] + | methods. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + doc = nlp(u"This is a sentence.") + processed = #{VARNAME}(doc) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code doc] + +cell #[code Doc] + +cell The document to process. + + +row("foot") + +cell returns + +cell #[code Doc] + +cell The processed document. + ++h(2, "pipe") #{CLASSNAME}.pipe + +tag method + +p + | Apply the pipe to a stream of documents. Both + | #[code #{CLASSNAME}.__call__] and #[code #{CLASSNAME}.pipe] should + | delegate to the #[code #{CLASSNAME}.predict] and + | #[code #{CLASSNAME}.set_annotations] methods. + ++aside-code("Example"). + texts = [u'One doc', u'...', u'Lots of docs'] + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + for doc in #{VARNAME}.pipe(texts, batch_size=50): + pass + ++table(["Name", "Type", "Description"]) + +row + +cell #[code stream] + +cell iterable + +cell A stream of documents. + + +row + +cell #[code batch_size] + +cell int + +cell The number of texts to buffer. Defaults to #[code 128]. + + +row + +cell #[code n_threads] + +cell int + +cell + | The number of worker threads to use. If #[code -1], OpenMP will + | decide how many to use at run time. Default is #[code -1]. + + +row("foot") + +cell yields + +cell #[code Doc] + +cell Processed documents in the order of the original text. + ++h(2, "predict") #{CLASSNAME}.predict + +tag method + +p + | Apply the pipeline's model to a batch of docs, without modifying them. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + scores = #{VARNAME}.predict([doc1, doc2]) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code docs] + +cell iterable + +cell The documents to predict. + + +row("foot") + +cell returns + +cell - + +cell Scores from the model. + ++h(2, "set_annotations") #{CLASSNAME}.set_annotations + +tag method + +p + | Modify a batch of documents, using pre-computed scores. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + scores = #{VARNAME}.predict([doc1, doc2]) + #{VARNAME}.set_annotations([doc1, doc2], scores) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code docs] + +cell iterable + +cell The documents to modify. + + +row + +cell #[code scores] + +cell - + +cell The scores to set, produced by #[code #{CLASSNAME}.predict]. + ++h(2, "update") #{CLASSNAME}.update + +tag method + +p + | Learn from a batch of documents and gold-standard information, updating + | the pipe's model. Delegates to #[code #{CLASSNAME}.predict] and + | #[code #{CLASSNAME}.get_loss]. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + losses = {} + optimizer = nlp.begin_training() + #{VARNAME}.update([doc1, doc2], [gold1, gold2], losses=losses, sgd=optimizer) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code docs] + +cell iterable + +cell A batch of documents to learn from. + + +row + +cell #[code golds] + +cell iterable + +cell The gold-standard data. Must have the same length as #[code docs]. + + +row + +cell #[code drop] + +cell int + +cell The dropout rate. + + +row + +cell #[code sgd] + +cell callable + +cell + | The optimizer. Should take two arguments #[code weights] and + | #[code gradient], and an optional ID. + + +row + +cell #[code losses] + +cell dict + +cell + | Optional record of the loss during training. The value keyed by + | the model's name is updated. + ++h(2, "get_loss") #{CLASSNAME}.get_loss + +tag method + +p + | Find the loss and gradient of loss for the batch of documents and their + | predicted scores. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + scores = #{VARNAME}.predict([doc1, doc2]) + loss, d_loss = #{VARNAME}.get_loss([doc1, doc2], [gold1, gold2], scores) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code docs] + +cell iterable + +cell The batch of documents. + + +row + +cell #[code golds] + +cell iterable + +cell The gold-standard data. Must have the same length as #[code docs]. + + +row + +cell #[code scores] + +cell - + +cell Scores representing the model's predictions. + + +row("foot") + +cell returns + +cell tuple + +cell The loss and the gradient, i.e. #[code (loss, gradient)]. + ++h(2, "begin_training") #{CLASSNAME}.begin_training + +tag method + +p + | Initialize the pipe for training, using data exampes if available. If no + | model has been initialized yet, the model is added. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + nlp.pipeline.append(#{VARNAME}) + #{VARNAME}.begin_training(pipeline=nlp.pipeline) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code gold_tuples] + +cell iterable + +cell + | Optional gold-standard annotations from which to construct + | #[+api("goldparse") #[code GoldParse]] objects. + + +row + +cell #[code pipeline] + +cell list + +cell + | Optional list of #[+api("pipe") #[code Pipe]] components that + | this component is part of. + ++h(2, "use_params") #{CLASSNAME}.use_params + +tag method + +tag contextmanager + +p Modify the pipe's model, to use the given parameter values. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + with #{VARNAME}.use_params(): + #{VARNAME}.to_disk('/best_model') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code params] + +cell - + +cell + | The parameter values to use in the model. At the end of the + | context, the original parameters are restored. + ++h(2, "to_disk") #{CLASSNAME}.to_disk + +tag method + +p Serialize the pipe to disk. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + #{VARNAME}.to_disk('/path/to/#{VARNAME}') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code path] + +cell unicode or #[code Path] + +cell + | A path to a directory, which will be created if it doesn't exist. + | Paths may be either strings or #[code Path]-like objects. + ++h(2, "from_disk") #{CLASSNAME}.from_disk + +tag method + +p Load the pipe from disk. Modifies the object in place and returns it. + ++aside-code("Example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + #{VARNAME}.from_disk('/path/to/#{VARNAME}') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code path] + +cell unicode or #[code Path] + +cell + | A path to a directory. Paths may be either strings or + | #[code Path]-like objects. + + +row("foot") + +cell returns + +cell #[code=CLASSNAME] + +cell The modified #[code=CLASSNAME] object. + ++h(2, "to_bytes") #{CLASSNAME}.to_bytes + +tag method + ++aside-code("example"). + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + #{VARNAME}_bytes = #{VARNAME}.to_bytes() + +p Serialize the pipe to a bytestring. + ++table(["Name", "Type", "Description"]) + +row + +cell #[code **exclude] + +cell - + +cell Named attributes to prevent from being serialized. + + +row("foot") + +cell returns + +cell bytes + +cell The serialized form of the #[code=CLASSNAME] object. + ++h(2, "from_bytes") #{CLASSNAME}.from_bytes + +tag method + +p Load the pipe from a bytestring. Modifies the object in place and returns it. + ++aside-code("Example"). + #{VARNAME}_bytes = #{VARNAME}.to_bytes() + #{VARNAME} = #{CLASSNAME}(nlp.vocab) + #{VARNAME}.from_bytes(#{VARNAME}_bytes) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code bytes_data] + +cell bytes + +cell The data to load from. + + +row + +cell #[code **exclude] + +cell - + +cell Named attributes to prevent from being loaded. + + +row("foot") + +cell returns + +cell #[code=CLASSNAME] + +cell The #[code=CLASSNAME] object. diff --git a/website/docs/api/span.jade b/website/api/span.jade similarity index 65% rename from website/docs/api/span.jade rename to website/api/span.jade index 542336714..6bff45a9b 100644 --- a/website/docs/api/span.jade +++ b/website/api/span.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > SPAN -include ../../_includes/_mixins +include ../_includes/_mixins p A slice from a #[+api("doc") #[code Doc]] object. @@ -37,10 +37,10 @@ p Create a Span object from the #[code slice doc[start : end]]. +row +cell #[code vector] - +cell #[code numpy.ndarray[ndim=1, dtype='float32']] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] +cell A meaning representation of the span. - +footrow + +row("foot") +cell returns +cell #[code Span] +cell The newly constructed object. @@ -61,7 +61,7 @@ p Get a #[code Token] object. +cell int +cell The index of the token within the span. - +footrow + +row("foot") +cell returns +cell #[code Token] +cell The token at #[code span[i]]. @@ -79,7 +79,7 @@ p Get a #[code Span] object. +cell tuple +cell The slice of the span to get. - +footrow + +row("foot") +cell returns +cell #[code Span] +cell The span at #[code span[start : end]]. @@ -95,7 +95,7 @@ p Iterate over #[code Token] objects. assert [t.text for t in span] == ['it', 'back', '!'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A #[code Token] object. @@ -111,11 +111,114 @@ p Get the number of tokens in the span. assert len(span) == 3 +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of tokens in the span. ++h(2, "set_extension") Span.set_extension + +tag classmethod + +tag-new(2) + +p + | Define a custom attribute on the #[code Span] which becomes available via + | #[code Span._]. For details, see the documentation on + | #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes]. + ++aside-code("Example"). + from spacy.tokens import Span + city_getter = lambda span: span.text in ('New York', 'Paris', 'Berlin') + Span.set_extension('has_city', getter=city_getter) + doc = nlp(u'I like New York in Autumn') + assert doc[1:4]._.has_city + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell + | Name of the attribute to set by the extension. For example, + | #[code 'my_attr'] will be available as #[code span._.my_attr]. + + +row + +cell #[code default] + +cell - + +cell + | Optional default value of the attribute if no getter or method + | is defined. + + +row + +cell #[code method] + +cell callable + +cell + | Set a custom method on the object, for example + | #[code span._.compare(other_span)]. + + +row + +cell #[code getter] + +cell callable + +cell + | Getter function that takes the object and returns an attribute + | value. Is called when the user accesses the #[code ._] attribute. + + +row + +cell #[code setter] + +cell callable + +cell + | Setter function that takes the #[code Span] and a value, and + | modifies the object. Is called when the user writes to the + | #[code Span._] attribute. + ++h(2, "get_extension") Span.get_extension + +tag classmethod + +tag-new(2) + +p + | Look up a previously registered extension by name. Returns a 4-tuple + | #[code.u-break (default, method, getter, setter)] if the extension is + | registered. Raises a #[code KeyError] otherwise. + ++aside-code("Example"). + from spacy.tokens import Span + Span.set_extension('is_city', default=False) + extension = Span.get_extension('is_city') + assert extension == (False, None, None, None) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the extension. + + +row("foot") + +cell returns + +cell tuple + +cell + | A #[code.u-break (default, method, getter, setter)] tuple of the + | extension. + ++h(2, "has_extension") Span.has_extension + +tag classmethod + +tag-new(2) + +p Check whether an extension has been registered on the #[code Span] class. + ++aside-code("Example"). + from spacy.tokens import Span + Span.set_extension('is_city', default=False) + assert Span.has_extension('is_city') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the extension to check. + + +row("foot") + +cell returns + +cell bool + +cell Whether the extension has been registered. + +h(2, "similarity") Span.similarity +tag method +tag-model("vectors") @@ -140,16 +243,52 @@ p | The object to compare with. By default, accepts #[code Doc], | #[code Span], #[code Token] and #[code Lexeme] objects. - +footrow + +row("foot") +cell returns +cell float +cell A scalar similarity score. Higher is more similar. ++h(2, "to_array") Span.to_array + +tag method + +tag-new(2) + +p + | Given a list of #[code M] attribute IDs, export the tokens to a numpy + | #[code ndarray] of shape #[code (N, M)], where #[code N] is the length of + | the document. The values will be 32-bit integers. + ++aside-code("Example"). + from spacy.attrs import LOWER, POS, ENT_TYPE, IS_ALPHA + doc = nlp(u'I like New York in Autumn.') + span = doc[2:3] + # All strings mapped to integers, for easy export to numpy + np_array = span.to_array([LOWER, POS, ENT_TYPE, IS_ALPHA]) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code attr_ids] + +cell list + +cell A list of attribute ID ints. + + +row("foot") + +cell returns + +cell #[code.u-break numpy.ndarray[long, ndim=2]] + +cell + | A feature matrix, with one row per word, and one column per + | attribute indicated in the input #[code attr_ids]. + +h(2, "merge") Span.merge +tag method p Retokenize the document, such that the span is merged into a single token. ++aside-code("Example"). + doc = nlp(u'I like New York in Autumn.') + span = doc[2:3] + span.merge() + assert len(doc) == 6 + assert doc[2].text == 'New York' + +table(["Name", "Type", "Description"]) +row +cell #[code **attributes] @@ -158,7 +297,7 @@ p Retokenize the document, such that the span is merged into a single token. | Attributes to assign to the merged token. By default, attributes | are inherited from the syntactic root token of the span. - +footrow + +row("foot") +cell returns +cell #[code Token] +cell The newly merged token. @@ -169,7 +308,7 @@ p Retokenize the document, such that the span is merged into a single token. p | The token within the span that's highest in the parse tree. If there's a - | tie, the earlist is prefered. + | tie, the earliest is preferred. +aside-code("Example"). doc = nlp(u'I like New York in Autumn.') @@ -180,7 +319,7 @@ p assert new_york.root.text == 'York' +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell #[code Token] +cell The root token. @@ -197,7 +336,7 @@ p Tokens that are to the left of the span, whose head is within the span. assert lefts == [u'New'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A left-child of a token of the span. @@ -214,7 +353,7 @@ p Tokens that are to the right of the span, whose head is within the span. assert rights == [u'in'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A right-child of a token of the span. @@ -231,7 +370,7 @@ p Tokens that descend from tokens in the span, but fall outside it. assert subtree == [u'Give', u'it', u'back', u'!'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A descendant of a token within the span. @@ -249,7 +388,7 @@ p assert doc[1:].has_vector +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bool +cell Whether the span has a vector data attached. @@ -268,9 +407,9 @@ p assert doc[1:].vector.shape == (300,) +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns - +cell #[code numpy.ndarray[ndim=1, dtype='float32']] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] +cell A 1D numpy array representing the span's semantics. +h(2, "vector_norm") Span.vector_norm @@ -287,7 +426,7 @@ p assert doc[1:].vector_norm != doc[2:].vector_norm +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell float +cell The L2 norm of the vector representation. diff --git a/website/docs/api/stringstore.jade b/website/api/stringstore.jade similarity index 96% rename from website/docs/api/stringstore.jade rename to website/api/stringstore.jade index c17fb1db9..9d03404cc 100644 --- a/website/docs/api/stringstore.jade +++ b/website/api/stringstore.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > STRINGSTORE -include ../../_includes/_mixins +include ../_includes/_mixins p | Look up strings by 64-bit hashes. As of v2.0, spaCy uses hash values @@ -23,7 +23,7 @@ p +cell iterable +cell A sequence of unicode strings to add to the store. - +footrow + +row("foot") +cell returns +cell #[code StringStore] +cell The newly constructed object. @@ -38,7 +38,7 @@ p Get the number of strings in the store. assert len(stringstore) == 2 +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of strings in the store. @@ -60,7 +60,7 @@ p Retrieve a string from a given hash, or vice versa. +cell bytes, unicode or uint64 +cell The value to encode. - +footrow + +row("foot") +cell returns +cell unicode or int +cell The value to be retrieved. @@ -81,7 +81,7 @@ p Check whether a string is in the store. +cell unicode +cell The string to check. - +footrow + +row("foot") +cell returns +cell bool +cell Whether the store contains the string. @@ -100,7 +100,7 @@ p assert all_strings == [u'apple', u'orange'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell unicode +cell A string in the store. @@ -125,7 +125,7 @@ p Add a string to the #[code StringStore]. +cell unicode +cell The string to add. - +footrow + +row("foot") +cell returns +cell uint64 +cell The string's hash value. @@ -166,7 +166,7 @@ p Loads state from a directory. Modifies the object in place and returns it. | A path to a directory. Paths may be either strings or | #[code Path]-like objects. - +footrow + +row("foot") +cell returns +cell #[code StringStore] +cell The modified #[code StringStore] object. @@ -185,7 +185,7 @@ p Serialize the current state to a binary string. +cell - +cell Named attributes to prevent from being serialized. - +footrow + +row("foot") +cell returns +cell bytes +cell The serialized form of the #[code StringStore] object. @@ -211,7 +211,7 @@ p Load state from a binary string. +cell - +cell Named attributes to prevent from being loaded. - +footrow + +row("foot") +cell returns +cell #[code StringStore] +cell The #[code StringStore] object. @@ -233,7 +233,7 @@ p Get a 64-bit hash for a given string. +cell unicode +cell The string to hash. - +footrow + +row("foot") +cell returns +cell uint64 +cell The hash. diff --git a/website/api/tagger.jade b/website/api/tagger.jade new file mode 100644 index 000000000..4c8ce916f --- /dev/null +++ b/website/api/tagger.jade @@ -0,0 +1,5 @@ +//- 💫 DOCS > API > TAGGER + +include ../_includes/_mixins + +!=partial("pipe", { subclass: "Tagger", pipeline_id: "tagger" }) diff --git a/website/api/tensorizer.jade b/website/api/tensorizer.jade new file mode 100644 index 000000000..b54e20514 --- /dev/null +++ b/website/api/tensorizer.jade @@ -0,0 +1,5 @@ +//- 💫 DOCS > API > TENSORIZER + +include ../_includes/_mixins + +!=partial("pipe", { subclass: "Tensorizer", pipeline_id: "tensorizer" }) diff --git a/website/api/textcategorizer.jade b/website/api/textcategorizer.jade new file mode 100644 index 000000000..2d550f699 --- /dev/null +++ b/website/api/textcategorizer.jade @@ -0,0 +1,19 @@ +//- 💫 DOCS > API > TEXTCATEGORIZER + +include ../_includes/_mixins + +p + | The model supports classification with multiple, non-mutually exclusive + | labels. You can change the model architecture rather easily, but by + | default, the #[code TextCategorizer] class uses a convolutional + | neural network to assign position-sensitive vectors to each word in the + | document. This step is similar to the #[+api("tensorizer") #[code Tensorizer]] + | component, but the #[code TextCategorizer] uses its own CNN model, to + | avoid sharing weights with the other pipeline components. The document + | tensor is then + | summarized by concatenating max and mean pooling, and a multilayer + | perceptron is used to predict an output vector of length #[code nr_class], + | before a logistic activation is applied elementwise. The value of each + | output neuron is the probability that some class is present. + +!=partial("pipe", { subclass: "TextCategorizer", short: "textcat", pipeline_id: "textcat" }) diff --git a/website/docs/api/token.jade b/website/api/token.jade similarity index 78% rename from website/docs/api/token.jade rename to website/api/token.jade index 87387e09d..465d44c66 100644 --- a/website/docs/api/token.jade +++ b/website/api/token.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > TOKEN -include ../../_includes/_mixins +include ../_includes/_mixins p An individual token — i.e. a word, punctuation symbol, whitespace, etc. @@ -30,7 +30,7 @@ p Construct a #[code Token] object. +cell int +cell The index of the token within the document. - +footrow + +row("foot") +cell returns +cell #[code Token] +cell The newly constructed object. @@ -46,11 +46,114 @@ p The number of unicode characters in the token, i.e. #[code token.text]. assert len(token) == 4 +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of unicode characters in the token. ++h(2, "set_extension") Token.set_extension + +tag classmethod + +tag-new(2) + +p + | Define a custom attribute on the #[code Token] which becomes available + | via #[code Token._]. For details, see the documentation on + | #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes]. + ++aside-code("Example"). + from spacy.tokens import Token + fruit_getter = lambda token: token.text in ('apple', 'pear', 'banana') + Token.set_extension('is_fruit', getter=fruit_getter) + doc = nlp(u'I have an apple') + assert doc[3]._.is_fruit + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell + | Name of the attribute to set by the extension. For example, + | #[code 'my_attr'] will be available as #[code token._.my_attr]. + + +row + +cell #[code default] + +cell - + +cell + | Optional default value of the attribute if no getter or method + | is defined. + + +row + +cell #[code method] + +cell callable + +cell + | Set a custom method on the object, for example + | #[code token._.compare(other_token)]. + + +row + +cell #[code getter] + +cell callable + +cell + | Getter function that takes the object and returns an attribute + | value. Is called when the user accesses the #[code ._] attribute. + + +row + +cell #[code setter] + +cell callable + +cell + | Setter function that takes the #[code Token] and a value, and + | modifies the object. Is called when the user writes to the + | #[code Token._] attribute. + ++h(2, "get_extension") Token.get_extension + +tag classmethod + +tag-new(2) + +p + | Look up a previously registered extension by name. Returns a 4-tuple + | #[code.u-break (default, method, getter, setter)] if the extension is + | registered. Raises a #[code KeyError] otherwise. + ++aside-code("Example"). + from spacy.tokens import Token + Token.set_extension('is_fruit', default=False) + extension = Token.get_extension('is_fruit') + assert extension == (False, None, None, None) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the extension. + + +row("foot") + +cell returns + +cell tuple + +cell + | A #[code.u-break (default, method, getter, setter)] tuple of the + | extension. + ++h(2, "has_extension") Token.has_extension + +tag classmethod + +tag-new(2) + +p Check whether an extension has been registered on the #[code Token] class. + ++aside-code("Example"). + from spacy.tokens import Token + Token.set_extension('is_fruit', default=False) + assert Token.has_extension('is_fruit') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code name] + +cell unicode + +cell Name of the extension to check. + + +row("foot") + +cell returns + +cell bool + +cell Whether the extension has been registered. + +h(2, "check_flag") Token.check_flag +tag method @@ -68,7 +171,7 @@ p Check the value of a boolean flag. +cell int +cell The attribute ID of the flag to check. - +footrow + +row("foot") +cell returns +cell bool +cell Whether the flag is set. @@ -93,7 +196,7 @@ p Compute a semantic similarity estimate. Defaults to cosine over vectors. | The object to compare with. By default, accepts #[code Doc], | #[code Span], #[code Token] and #[code Lexeme] objects. - +footrow + +row("foot") +cell returns +cell float +cell A scalar similarity score. Higher is more similar. @@ -114,7 +217,7 @@ p Get a neighboring token. +cell int +cell The relative position of the token to get. Defaults to #[code 1]. - +footrow + +row("foot") +cell returns +cell #[code Token] +cell The token at position #[code self.doc[self.i+i]]. @@ -139,7 +242,7 @@ p +cell #[code Token] +cell Another token. - +footrow + +row("foot") +cell returns +cell bool +cell Whether this token is the ancestor of the descendant. @@ -158,7 +261,7 @@ p The rightmost token of this token's syntactic descendants. assert [t.text for t in he_ancestors] == [u'pleaded'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell @@ -177,7 +280,7 @@ p A sequence of coordinated tokens, including the token itself. assert [t.text for t in apples_conjuncts] == [u'oranges'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A coordinated token. @@ -194,7 +297,7 @@ p A sequence of the token's immediate syntactic children. assert [t.text for t in give_children] == [u'it', u'back', u'!'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A child token such that #[code child.head==self]. @@ -211,7 +314,7 @@ p A sequence of all the token's syntactic descendents. assert [t.text for t in give_subtree] == [u'Give', u'it', u'back', u'!'] +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Token] +cell A descendant token such that #[code self.is_ancestor(descendant)]. @@ -230,7 +333,7 @@ p assert apples.has_vector +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell bool +cell Whether the token has a vector data attached. @@ -248,9 +351,9 @@ p A real-valued meaning representation. assert apples.vector.shape == (300,) +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns - +cell #[code numpy.ndarray[ndim=1, dtype='float32']] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] +cell A 1D numpy array representing the token's semantics. +h(2, "vector_norm") Span.vector_norm @@ -268,7 +371,7 @@ p The L2 norm of the token's vector representation. assert apples.vector_norm != pasta.vector_norm +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell float +cell The L2 norm of the vector representation. @@ -280,20 +383,29 @@ p The L2 norm of the token's vector representation. +cell #[code text] +cell unicode +cell Verbatim text content. + +row +cell #[code text_with_ws] +cell unicode +cell Text content, with trailing space character if present. - +row - +cell #[code whitespace] - +cell int - +cell Trailing space character if present. +row +cell #[code whitespace_] +cell unicode +cell Trailing space character if present. + +row + +cell #[code orth] + +cell int + +cell ID of the verbatim text content. + + +row + +cell #[code orth_] + +cell unicode + +cell + | Verbatim text content (identical to #[code Token.text]). Existst + | mostly for consistency with the other attributes. + +row +cell #[code vocab] +cell #[code Vocab] @@ -455,6 +567,13 @@ p The L2 norm of the token's vector representation. | Is the token in lowercase? Equivalent to | #[code token.text.islower()]. + +row + +cell #[code is_upper] + +cell bool + +cell + | Is the token in uppercase? Equivalent to + | #[code token.text.isupper()]. + +row +cell #[code is_title] +cell bool diff --git a/website/docs/api/tokenizer.jade b/website/api/tokenizer.jade similarity index 96% rename from website/docs/api/tokenizer.jade rename to website/api/tokenizer.jade index 196f886b7..7a8a34838 100644 --- a/website/docs/api/tokenizer.jade +++ b/website/api/tokenizer.jade @@ -1,6 +1,6 @@ //- 💫 DOCS > API > TOKENIZER -include ../../_includes/_mixins +include ../_includes/_mixins p | Segment text, and create #[code Doc] objects with the discovered segment @@ -57,7 +57,7 @@ p Create a #[code Tokenizer], to create #[code Doc] objects given unicode text. +cell callable +cell A boolean function matching strings to be recognised as tokens. - +footrow + +row("foot") +cell returns +cell #[code Tokenizer] +cell The newly constructed object. @@ -77,7 +77,7 @@ p Tokenize a string. +cell unicode +cell The string to tokenize. - +footrow + +row("foot") +cell returns +cell #[code Doc] +cell A container for linguistic annotations. @@ -110,7 +110,7 @@ p Tokenize a stream of texts. | The number of threads to use, if the implementation supports | multi-threading. The default tokenizer is single-threaded. - +footrow + +row("foot") +cell yields +cell #[code Doc] +cell A sequence of Doc objects, in order. @@ -126,7 +126,7 @@ p Find internal split points of the string. +cell unicode +cell The string to split. - +footrow + +row("foot") +cell returns +cell list +cell @@ -147,7 +147,7 @@ p +cell unicode +cell The string to segment. - +footrow + +row("foot") +cell returns +cell int +cell The length of the prefix if present, otherwise #[code None]. @@ -165,7 +165,7 @@ p +cell unicode +cell The string to segment. - +footrow + +row("foot") +cell returns +cell int / #[code None] +cell The length of the suffix if present, otherwise #[code None]. @@ -176,7 +176,7 @@ p p | Add a special-case tokenization rule. This mechanism is also used to add | custom tokenizer exceptions to the language data. See the usage guide - | on #[+a("/docs/usage/adding-languages#tokenizer-exceptions") adding languages] + | on #[+a("/usage/adding-languages#tokenizer-exceptions") adding languages] | for more details and examples. +aside-code("Example"). diff --git a/website/api/top-level.jade b/website/api/top-level.jade new file mode 100644 index 000000000..46d2e8750 --- /dev/null +++ b/website/api/top-level.jade @@ -0,0 +1,24 @@ +//- 💫 DOCS > API > TOP-LEVEL + +include ../_includes/_mixins + ++section("spacy") + //-+h(2, "spacy") spaCy + //- spacy/__init__.py + include _top-level/_spacy + ++section("displacy") + +h(2, "displacy", "spacy/displacy") displaCy + include _top-level/_displacy + ++section("util") + +h(2, "util", "spacy/util.py") Utility functions + include _top-level/_util + ++section("compat") + +h(2, "compat", "spacy/compaty.py") Compatibility functions + include _top-level/_compat + ++section("cli", "spacy/cli") + +h(2, "cli") Command line + include _top-level/_cli diff --git a/website/api/vectors.jade b/website/api/vectors.jade new file mode 100644 index 000000000..a58736506 --- /dev/null +++ b/website/api/vectors.jade @@ -0,0 +1,333 @@ +//- 💫 DOCS > API > VECTORS + +include ../_includes/_mixins + +p + | Vectors data is kept in the #[code Vectors.data] attribute, which should + | be an instance of #[code numpy.ndarray] (for CPU vectors) or + | #[code cupy.ndarray] (for GPU vectors). + ++h(2, "init") Vectors.__init__ + +tag method + +p + | Create a new vector store. To keep the vector table empty, pass + | #[code data_or_width=0]. You can also create the vector table and add + | vectors one by one, or set the vector values directly on initialisation. + ++aside-code("Example"). + from spacy.vectors import Vectors + from spacy.strings import StringStore + + empty_vectors = Vectors(StringStore()) + + vectors = Vectors([u'cat'], 300) + vectors[u'cat'] = numpy.random.uniform(-1, 1, (300,)) + + vector_table = numpy.zeros((3, 300), dtype='f') + vectors = Vectors(StringStore(), vector_table) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code strings] + +cell #[code StringStore] or list + +cell + | List of strings, or a #[+api("stringstore") #[code StringStore]] + | that maps strings to hash values, and vice versa. + + +row + +cell #[code data_or_width] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] or int + +cell Vector data or number of dimensions. + + +row("foot") + +cell returns + +cell #[code Vectors] + +cell The newly created object. + ++h(2, "getitem") Vectors.__getitem__ + +tag method + +p + | Get a vector by key. If key is a string, it is hashed to an integer ID + | using the #[code Vectors.strings] table. If the integer key is not found + | in the table, a #[code KeyError] is raised. + ++aside-code("Example"). + vectors = Vectors(StringStore(), 300) + vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,))) + cat_vector = vectors[u'cat'] + ++table(["Name", "Type", "Description"]) + +row + +cell #[code key] + +cell unicode / int + +cell The key to get the vector for. + + +row + +cell returns + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell The vector for the key. + ++h(2, "setitem") Vectors.__setitem__ + +tag method + +p + | Set a vector for the given key. If key is a string, it is hashed to an + | integer ID using the #[code Vectors.strings] table. + ++aside-code("Example"). + vectors = Vectors(StringStore(), 300) + vectors[u'cat'] = numpy.random.uniform(-1, 1, (300,)) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code key] + +cell unicode / int + +cell The key to set the vector for. + + +row + +cell #[code vector] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell The vector to set. + ++h(2, "iter") Vectors.__iter__ + +tag method + +p Yield vectors from the table. + ++aside-code("Example"). + vector_table = numpy.zeros((3, 300), dtype='f') + vectors = Vectors(StringStore(), vector_table) + for vector in vectors: + print(vector) + ++table(["Name", "Type", "Description"]) + +row("foot") + +cell yields + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell A vector from the table. + ++h(2, "len") Vectors.__len__ + +tag method + +p Return the number of vectors that have been assigned. + ++aside-code("Example"). + vector_table = numpy.zeros((3, 300), dtype='f') + vectors = Vectors(StringStore(), vector_table) + assert len(vectors) == 3 + ++table(["Name", "Type", "Description"]) + +row("foot") + +cell returns + +cell int + +cell The number of vectors in the data. + ++h(2, "contains") Vectors.__contains__ + +tag method + +p + | Check whether a key has a vector entry in the table. If key is a string, + | it is hashed to an integer ID using the #[code Vectors.strings] table. + ++aside-code("Example"). + vectors = Vectors(StringStore(), 300) + vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,))) + assert u'cat' in vectors + ++table(["Name", "Type", "Description"]) + +row + +cell #[code key] + +cell unicode / int + +cell The key to check. + + +row("foot") + +cell returns + +cell bool + +cell Whether the key has a vector entry. + ++h(2, "add") Vectors.add + +tag method + +p + | Add a key to the table, optionally setting a vector value as well. If + | key is a string, it is hashed to an integer ID using the + | #[code Vectors.strings] table. + ++aside-code("Example"). + vectors = Vectors(StringStore(), 300) + vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,))) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code key] + +cell unicode / int + +cell The key to add. + + +row + +cell #[code vector] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell An optional vector to add. + ++h(2, "items") Vectors.items + +tag method + +p Iterate over #[code (string key, vector)] pairs, in order. + ++aside-code("Example"). + vectors = Vectors(StringStore(), 300) + vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,))) + for key, vector in vectors.items(): + print(key, vector) + ++table(["Name", "Type", "Description"]) + +row("foot") + +cell yields + +cell tuple + +cell #[code (string key, vector)] pairs, in order. + ++h(2, "shape") Vectors.shape + +tag property + +p + | Get #[code (rows, dims)] tuples of number of rows and number of + | dimensions in the vector table. + ++aside-code("Example"). + vectors = Vectors(StringStore(), 300) + vectors.add(u'cat', numpy.random.uniform(-1, 1, (300,))) + rows, dims = vectors.shape + assert rows == 1 + assert dims == 300 + ++table(["Name", "Type", "Description"]) + +row("foot") + +cell returns + +cell tuple + +cell #[code (rows, dims)] pairs. + ++h(2, "from_glove") Vectors.from_glove + +tag method + +p + | Load #[+a("https://nlp.stanford.edu/projects/glove/") GloVe] vectors from + | a directory. Assumes binary format, that the vocab is in a + | #[code vocab.txt], and that vectors are named + | #[code vectors.{size}.[fd].bin], e.g. #[code vectors.128.f.bin] for 128d + | float32 vectors, #[code vectors.300.d.bin] for 300d float64 (double) + | vectors, etc. By default GloVe outputs 64-bit vectors. + ++table(["Name", "Type", "Description"]) + +row + +cell #[code path] + +cell unicode / #[code Path] + +cell The path to load the GloVe vectors from. + ++h(2, "to_disk") Vectors.to_disk + +tag method + +p Save the current state to a directory. + ++aside-code("Example"). + vectors.to_disk('/path/to/vectors') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code path] + +cell unicode or #[code Path] + +cell + | A path to a directory, which will be created if it doesn't exist. + | Paths may be either strings or #[code Path]-like objects. + ++h(2, "from_disk") Vectors.from_disk + +tag method + +p Loads state from a directory. Modifies the object in place and returns it. + ++aside-code("Example"). + vectors = Vectors(StringStore()) + vectors.from_disk('/path/to/vectors') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code path] + +cell unicode or #[code Path] + +cell + | A path to a directory. Paths may be either strings or + | #[code Path]-like objects. + + +row("foot") + +cell returns + +cell #[code Vectors] + +cell The modified #[code Vectors] object. + ++h(2, "to_bytes") Vectors.to_bytes + +tag method + +p Serialize the current state to a binary string. + ++aside-code("Example"). + vectors_bytes = vectors.to_bytes() + ++table(["Name", "Type", "Description"]) + +row + +cell #[code **exclude] + +cell - + +cell Named attributes to prevent from being serialized. + + +row("foot") + +cell returns + +cell bytes + +cell The serialized form of the #[code Vectors] object. + ++h(2, "from_bytes") Vectors.from_bytes + +tag method + +p Load state from a binary string. + ++aside-code("Example"). + fron spacy.vectors import Vectors + vectors_bytes = vectors.to_bytes() + new_vectors = Vectors(StringStore()) + new_vectors.from_bytes(vectors_bytes) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code bytes_data] + +cell bytes + +cell The data to load from. + + +row + +cell #[code **exclude] + +cell - + +cell Named attributes to prevent from being loaded. + + +row("foot") + +cell returns + +cell #[code Vectors] + +cell The #[code Vectors] object. + ++h(2, "attributes") Attributes + ++table(["Name", "Type", "Description"]) + +row + +cell #[code data] + +cell #[code numpy.ndarray] / #[code cupy.ndarray] + +cell + | Stored vectors data. #[code numpy] is used for CPU vectors, + | #[code cupy] for GPU vectors. + + +row + +cell #[code key2row] + +cell dict + +cell + | Dictionary mapping word hashes to rows in the + | #[code Vectors.data] table. + + +row + +cell #[code keys] + +cell #[code numpy.ndarray] + +cell + | Array keeping the keys in order, such that + | #[code keys[vectors.key2row[key]] == key] diff --git a/website/docs/api/vocab.jade b/website/api/vocab.jade similarity index 66% rename from website/docs/api/vocab.jade rename to website/api/vocab.jade index 4d3e0828a..6faefc064 100644 --- a/website/docs/api/vocab.jade +++ b/website/api/vocab.jade @@ -1,17 +1,22 @@ //- 💫 DOCS > API > VOCAB -include ../../_includes/_mixins +include ../_includes/_mixins p - | A lookup table that allows you to access #[code Lexeme] objects. The - | #[code Vocab] instance also provides access to the #[code StringStore], - | and owns underlying C-data that is shared between #[code Doc] objects. + | The #[code Vocab] object provides a lookup table that allows you to + | access #[+api("lexeme") #[code Lexeme]] objects, as well as the + | #[+api("stringstore") #[code StringStore]]. It also owns underlying + | C-data that is shared between #[code Doc] objects. +h(2, "init") Vocab.__init__ +tag method p Create the vocabulary. ++aside-code("Example"). + from spacy.vocab import Vocab + vocab = Vocab(strings=[u'hello', u'world']) + +table(["Name", "Type", "Description"]) +row +cell #[code lex_attr_getters] @@ -39,7 +44,7 @@ p Create the vocabulary. | A #[+api("stringstore") #[code StringStore]] that maps | strings to hash values, and vice versa, or a list of strings. - +footrow + +row("foot") +cell returns +cell #[code Vocab] +cell The newly constructed object. @@ -54,7 +59,7 @@ p Get the current number of lexemes in the vocabulary. assert len(nlp.vocab) > 0 +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell returns +cell int +cell The number of lexems in the vocabulary. @@ -76,7 +81,7 @@ p +cell int / unicode +cell The hash value of a word, or its unicode string. - +footrow + +row("foot") +cell returns +cell #[code Lexeme] +cell The lexeme indicated by the given ID. @@ -90,7 +95,7 @@ p Iterate over the lexemes in the vocabulary. stop_words = (lex for lex in nlp.vocab if lex.is_stop) +table(["Name", "Type", "Description"]) - +footrow + +row("foot") +cell yields +cell #[code Lexeme] +cell An entry in the vocabulary. @@ -115,7 +120,7 @@ p +cell unicode +cell The ID string. - +footrow + +row("foot") +cell returns +cell bool +cell Whether the string has an entry in the vocabulary. @@ -152,11 +157,100 @@ p | which the flag will be stored. If #[code -1], the lowest | available bit will be chosen. - +footrow + +row("foot") +cell returns +cell int +cell The integer ID by which the flag value can be checked. ++h(2, "add_flag") Vocab.clear_vectors + +tag method + +tag-new(2) + +p + | Drop the current vector table. Because all vectors must be the same + | width, you have to call this to change the size of the vectors. + ++aside-code("Example"). + nlp.vocab.clear_vectors(new_dim=300) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code new_dim] + +cell int + +cell + | Number of dimensions of the new vectors. If #[code None], size + | is not changed. + ++h(2, "add_flag") Vocab.get_vector + +tag method + +tag-new(2) + +p + | Retrieve a vector for a word in the vocabulary. Words can be looked up + | by string or hash value. If no vectors data is loaded, a + | #[code ValueError] is raised. + ++aside-code("Example"). + nlp.vocab.get_vector(u'apple') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code orth] + +cell int / unicode + +cell The hash value of a word, or its unicode string. + + +row("foot") + +cell returns + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell + | A word vector. Size and shape are determined by the + | #[code Vocab.vectors] instance. + ++h(2, "add_flag") Vocab.set_vector + +tag method + +tag-new(2) + +p + | Set a vector for a word in the vocabulary. Words can be referenced by + | by string or hash value. + ++aside-code("Example"). + nlp.vocab.set_vector(u'apple', array([...])) + ++table(["Name", "Type", "Description"]) + +row + +cell #[code orth] + +cell int / unicode + +cell The hash value of a word, or its unicode string. + + +row + +cell #[code vector] + +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']] + +cell The vector to set. + ++h(2, "add_flag") Vocab.has_vector + +tag method + +tag-new(2) + +p + | Check whether a word has a vector. Returns #[code False] if no vectors + | are loaded. Words can be looked up by string or hash value. + ++aside-code("Example"). + if nlp.vocab.has_vector(u'apple'): + vector = nlp.vocab.get_vector(u'apple') + ++table(["Name", "Type", "Description"]) + +row + +cell #[code orth] + +cell int / unicode + +cell The hash value of a word, or its unicode string. + + +row("foot") + +cell returns + +cell bool + +cell Whether the word has a vector. + +h(2, "to_disk") Vocab.to_disk +tag method +tag-new(2) @@ -192,7 +286,7 @@ p Loads state from a directory. Modifies the object in place and returns it. | A path to a directory. Paths may be either strings or | #[code Path]-like objects. - +footrow + +row("foot") +cell returns +cell #[code Vocab] +cell The modified #[code Vocab] object. @@ -211,7 +305,7 @@ p Serialize the current state to a binary string. +cell - +cell Named attributes to prevent from being serialized. - +footrow + +row("foot") +cell returns +cell bytes +cell The serialized form of the #[code Vocab] object. @@ -238,7 +332,7 @@ p Load state from a binary string. +cell - +cell Named attributes to prevent from being loaded. - +footrow + +row("foot") +cell returns +cell #[code Vocab] +cell The #[code Vocab] object. @@ -256,3 +350,14 @@ p Load state from a binary string. +cell #[code strings] +cell #[code StringStore] +cell A table managing the string-to-int mapping. + + +row + +cell #[code vectors] + +tag-new(2) + +cell #[code Vectors] + +cell A table associating word IDs to word vectors. + + +row + +cell #[code vectors_length] + +cell int + +cell Number of dimensions for each word vector. diff --git a/website/assets/css/_base/_animations.sass b/website/assets/css/_base/_animations.sass index 376ac5c2f..5c82a4fcc 100644 --- a/website/assets/css/_base/_animations.sass +++ b/website/assets/css/_base/_animations.sass @@ -19,3 +19,10 @@ to transform: translate3d(0, 0, 0) + + +//- Element rotates + +@keyframes rotate + to + transform: rotate(360deg) diff --git a/website/assets/css/_base/_fonts.sass b/website/assets/css/_base/_fonts.sass index be113798c..c1af115a7 100644 --- a/website/assets/css/_base/_fonts.sass +++ b/website/assets/css/_base/_fonts.sass @@ -1,41 +1,27 @@ //- 💫 CSS > BASE > FONTS -// Source Sans Pro +// HK Grotesk @font-face - font-family: "Source Sans Pro" + font-family: "HK Grotesk" font-style: normal - font-weight: 400 - src: url("/assets/fonts/sourcesanspro-regular.eot") - src: url("/assets/fonts/sourcesanspro-regular.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-regular.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-regular.woff") format("woff"), url("/assets/fonts/sourcesanspro-regular.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-regular.svg#source_sans_proregular") format("svg") + font-weight: 500 + src: url("/assets/fonts/hkgrotesk-semibold.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-semibold.woff") format("woff") @font-face - font-family: "Source Sans Pro" + font-family: "HK Grotesk" font-style: italic - font-weight: 400 - src: url("/assets/fonts/sourcesanspro-italic.eot") - src: url("/assets/fonts/sourcesanspro-italic.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-italic.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-italic.woff") format("woff"), url("/assets/fonts/sourcesanspro-italic.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-italic.svg#source_sans_proitalic") format("svg") + font-weight: 500 + src: url("/assets/fonts/hkgrotesk-semibolditalic.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-semibolditalic.woff") format("woff") @font-face - font-family: "Source Sans Pro" - font-style: normal - font-weight: 700 - src: url("/assets/fonts/sourcesanspro-bold.eot") - src: url("/assets/fonts/sourcesanspro-bold.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-bold.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-bold.woff") format("woff"), url("/assets/fonts/sourcesanspro-bold.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-bold.svg#source_sans_probold") format("svg") - -@font-face - font-family: "Source Sans Pro" - font-style: italic - font-weight: 700 - src: url("/assets/fonts/sourcesanspro-bolditalic.eot") - src: url("/assets/fonts/sourcesanspro-bolditalic.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcesanspro-bolditalic.woff2") format("woff2"), url("/assets/fonts/sourcesanspro-bolditalic.woff") format("woff"), url("/assets/fonts/sourcesanspro-bolditalic.ttf") format("truetype"), url("/assets/fonts/sourcesanspro-bolditalic.svg#source_sans_probold_italic") format("svg") - - -// Source Code Pro - -@font-face - font-family: "Source Code Pro" + font-family: "HK Grotesk" font-style: normal font-weight: 600 - src: url("/assets/fonts/sourcecodepro-semibold.eot") - src: url("/assets/fonts/sourcecodepro-semibold.eot?#iefix") format("embedded-opentype"), url("/assets/fonts/sourcecodepro-semibold.woff") format("woff"), url("/assets/fonts/sourcecodepro-semibold.ttf") format("truetype"), url("/assets/fonts/sourcecodepro-semibold.svg#sourcecodepro_semibold") format("svg") + src: url("/assets/fonts/hkgrotesk-bold.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-bold.woff") format("woff") + +@font-face + font-family: "HK Grotesk" + font-style: italic + font-weight: 600 + src: url("/assets/fonts/hkgrotesk-bolditalic.woff2") format("woff2"), url("/assets/fonts/hkgrotesk-bolditalic.woff") format("woff") diff --git a/website/assets/css/_base/_grid.sass b/website/assets/css/_base/_grid.sass index 3feda696d..536c657db 100644 --- a/website/assets/css/_base/_grid.sass +++ b/website/assets/css/_base/_grid.sass @@ -15,6 +15,15 @@ align-items: center justify-content: center + &.o-grid--vcenter + align-items: center + + &.o-grid--space + justify-content: space-between + + &.o-grid--nowrap + flex-wrap: nowrap + //- Grid column @@ -22,7 +31,6 @@ $grid-gutter: 2rem margin-top: $grid-gutter - overflow: hidden @include breakpoint(min, lg) display: flex diff --git a/website/assets/css/_base/_layout.sass b/website/assets/css/_base/_layout.sass index 8828651c6..1b725fdbf 100644 --- a/website/assets/css/_base/_layout.sass +++ b/website/assets/css/_base/_layout.sass @@ -12,6 +12,7 @@ body animation: fadeIn 0.25s ease background: $color-back color: $color-front + //scroll-behavior: smooth //- Paragraphs @@ -19,6 +20,9 @@ body p @extend .o-block, .u-text +p:empty + margin-bottom: 0 + //- Links diff --git a/website/assets/css/_base/_objects.sass b/website/assets/css/_base/_objects.sass index 635e9cde3..8494ee36a 100644 --- a/website/assets/css/_base/_objects.sass +++ b/website/assets/css/_base/_objects.sass @@ -43,12 +43,25 @@ position: relative padding: 2.5rem 0 overflow: auto + background: $color-subtle-light + + .o-main & + border-top-left-radius: $border-radius //- Blocks +.o-section + width: 100% + max-width: 100% + + &:not(:last-child) + margin-bottom: 7rem + padding-bottom: 4rem + border-bottom: 1px dotted $color-subtle + .o-block - margin-bottom: 3rem + margin-bottom: 4rem .o-block-small margin-bottom: 2rem @@ -58,17 +71,18 @@ .o-card background: $color-back - border-radius: 2px - border: 1px solid $color-subtle - padding: 3rem 2.5% - + border-radius: $border-radius + box-shadow: $box-shadow //- Box .o-box - background: $color-theme-light + background: $color-subtle-light padding: 2rem - border-left: 4px solid $color-theme + border-radius: $border-radius + +.o-box__logos + padding-bottom: 1rem //- Icons @@ -77,7 +91,14 @@ vertical-align: middle &.o-icon--inline - margin: 0 0.5rem 0 0.25rem + margin: 0 0.5rem 0 0.1rem + +.o-emoji + margin-right: 0.75rem + vertical-align: text-bottom + +.o-badge + border-radius: 1em //- SVG @@ -102,3 +123,45 @@ fill: currentColor vertical-align: middle margin: 0 0.5rem + + +//- Embeds + +.o-chart + max-width: 100% + +.cp_embed_iframe + border: 1px solid $color-subtle + border-radius: $border-radius + + +//- Form fields + +.o-field + background: $color-back + padding: 0 0.25em + border-radius: 2em + border: 1px solid $color-subtle + margin-bottom: 0.25rem + +.o-field__input, +.o-field__button + padding: 0 0.35em + +.o-field__input + width: 100% + +.o-field__select + background: transparent + color: $color-dark + height: 1.4em + border: none + text-align-last: center + +.o-empty:empty:before + @include size(1em) + border-radius: 50% + content: "" + display: inline-block + background: $color-red + vertical-align: middle diff --git a/website/assets/css/_base/_reset.sass b/website/assets/css/_base/_reset.sass index 1d9d9ffbe..0ff1432d0 100644 --- a/website/assets/css/_base/_reset.sass +++ b/website/assets/css/_base/_reset.sass @@ -1,6 +1,6 @@ //- 💫 CSS > BASE > RESET -* +*, *:before, *:after box-sizing: border-box padding: 0 margin: 0 @@ -94,7 +94,10 @@ ul, ol input, button appearance: none + background: transparent button - background: transparent cursor: pointer + +progress + appearance: none diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass index 2c40858a8..8c1e82706 100644 --- a/website/assets/css/_base/_utilities.sass +++ b/website/assets/css/_base/_utilities.sass @@ -2,38 +2,53 @@ //- Text +.u-text, +.u-text-small, +.u-text-tiny + font-family: $font-primary + .u-text - font: 1.5rem/#{1.55} $font-primary + font-size: 1.35rem + line-height: 1.5 .u-text-small - font: 1.4rem/#{1.375} $font-primary + font-size: 1.3rem + line-height: 1.375 .u-text-tiny - font: 1.1rem/#{1.375} $font-primary - + font-size: 1.1rem + line-height: 1.375 //- Labels & Tags .u-text-label - font: normal 600 1.4rem/#{1.5} $font-code + font: normal 600 1.4rem/#{1.5} $font-secondary text-transform: uppercase + &.u-text-label--light, &.u-text-label--dark display: inline-block + border-radius: 1em + padding: 0 1rem 0.15rem + + &.u-text-label--dark background: $color-dark box-shadow: inset 1px 1px 1px rgba($color-front, 0.25) color: $color-back - padding: 0 0.75rem margin: 1.5rem 0 0 2rem - border-radius: 2px + + &.u-text-label--light + background: $color-back + color: $color-theme + margin-bottom: 1rem .u-text-tag display: inline-block - font: 600 1.1rem/#{1} $font-code + font: 600 1.1rem/#{1} $font-secondary background: $color-theme color: $color-back - padding: 0.15em 0.25em - border-radius: 2px + padding: 0.15em 0.5em 0.35em + border-radius: 1em text-transform: uppercase vertical-align: middle @@ -45,7 +60,7 @@ //- Headings .u-heading - margin-bottom: 2rem + margin-bottom: 1em @include breakpoint(max, md) word-wrap: break-word @@ -53,12 +68,29 @@ &:not(:first-child) padding-top: 3.5rem + &.u-heading--title:after + content: "" + display: block + width: 10% + min-width: 6rem + height: 6px + background: $color-theme + margin-top: 3rem + .u-heading-0 - font: normal bold 7rem/#{1} $font-primary + font: normal 600 7rem/#{1} $font-secondary + + @include breakpoint(max, sm) + font-size: 6rem + @each $level, $size in $headings .u-heading-#{$level} - font: normal bold #{$size}rem/#{1.25} $font-primary + font: normal 500 #{$size}rem/#{1.1} $font-secondary + +.u-heading__teaser + margin-top: 2rem + font-weight: normal //- Links @@ -66,31 +98,62 @@ .u-link color: $color-theme border-bottom: 1px solid + transition: color 0.2s ease + + &:hover + color: $color-theme-dark + +.u-hide-link.u-hide-link + border: none + color: inherit + + &:hover + color: inherit .u-permalink position: relative + &:before + content: "\00b6" + font-size: 0.9em + font-weight: normal + color: $color-subtle + @include position(absolute, top, left, 0.15em, -2.85rem) + opacity: 0 + transition: opacity 0.2s ease + + &:hover:before + opacity: 1 + + &:active:before + color: $color-theme + &:target display: inline-block - padding-top: $nav-height * 1.25 - & + * - margin-top: $nav-height * 1.25 + &:before + bottom: 0.15em + top: initial -.u-permalink__icon - @include position(absolute, bottom, left, 0.35em, -2.75rem) - @include size(1.5rem) - color: $color-subtle - .u-permalink:hover & - color: $color-subtle-dark +[id]:target + padding-top: $nav-height * 1.25 - .u-permalink:active & - color: $color-theme //- Layout +.u-width-full + width: 100% + +.u-float-left + float: left + margin-right: 1rem + +.u-float-right + float: right + margin-left: 1rem + .u-text-center text-align: center @@ -104,14 +167,30 @@ padding: 0.5em 0.75em .u-padding-medium - padding: 2.5rem + padding: 1.8rem + +.u-padding-top + padding-top: 2rem .u-inline-block display: inline-block +.u-flex-full + flex: 1 + .u-nowrap white-space: nowrap +.u-wrap + white-space: pre-wrap + +.u-break.u-break + word-wrap: break-word + white-space: initial + + &.u-break--all + word-break: break-all + .u-no-border border: none @@ -119,13 +198,10 @@ border: 1px solid $color-subtle border-radius: 2px -.u-border-bottom - border: 1px solid $color-subtle - .u-border-dotted - border-top: 1px dotted $color-subtle + border-bottom: 1px dotted $color-subtle -@each $name, $color in (theme: $color-theme, subtle: $color-subtle-dark, light: $color-back, red: $color-red, green: $color-green, yellow: $color-yellow) +@each $name, $color in (theme: $color-theme, dark: $color-dark, subtle: $color-subtle-dark, light: $color-back, red: $color-red, green: $color-green, yellow: $color-yellow) .u-color-#{$name} color: $color @@ -141,6 +217,32 @@ background: $pattern +//- Loaders + +.u-loading, +[data-loading] + $spinner-size: 75px + $spinner-bar: 8px + + position: relative + + & > * + opacity: 0.35 + + &:before + @include position(absolute, top, left, 0, 0) + @include size($spinner-size) + right: 0 + bottom: 0 + margin: auto + content: "" + border: $spinner-bar solid $color-subtle + border-right: $spinner-bar solid $color-theme + border-radius: 50% + animation: rotate 1s linear infinite + z-index: 10 + + //- Hidden elements .u-hidden diff --git a/website/assets/css/_components/_asides.sass b/website/assets/css/_components/_asides.sass index d5b5c64e3..c59590c29 100644 --- a/website/assets/css/_components/_asides.sass +++ b/website/assets/css/_components/_asides.sass @@ -10,6 +10,8 @@ .c-aside__content background: $color-front + border-top-left-radius: $border-radius + border-bottom-left-radius: $border-radius z-index: 10 @include breakpoint(min, md) @@ -21,12 +23,12 @@ &:after $triangle-size: 2rem - @include position(absolute, bottom, left, -$triangle-size / 2, 0) + @include position(absolute, bottom, left, -$triangle-size / 2, $border-radius / 2) @include size(0) border-color: transparent border-style: solid border-top-color: $color-dark - border-width: $triangle-size / 2 0 0 $triangle-size + border-width: $triangle-size / 2 0 0 calc(#{$triangle-size} - #{$border-radius / 2}) content: "" @include breakpoint(max, sm) diff --git a/website/assets/css/_components/_buttons.sass b/website/assets/css/_components/_buttons.sass index f753e15bf..d3ff4b037 100644 --- a/website/assets/css/_components/_buttons.sass +++ b/website/assets/css/_components/_buttons.sass @@ -3,23 +3,50 @@ .c-button display: inline-block font-weight: bold - padding: 0.75em 1em + padding: 0.8em 1.1em 1em margin-bottom: 1px - border: 2px solid - border-radius: 2px + border: 2px solid $color-theme + border-radius: 2em text-align: center - transition: background 0.25s ease + transition: background-color, color 0.25s ease + + &:hover + border-color: $color-theme-dark + + &.c-button--small + font-size: 1.1rem + padding: 0.65rem 1.1rem 0.825rem &.c-button--primary background: $color-theme color: $color-back - border-color: $color-theme &:hover background: $color-theme-dark - border-color: $color-theme-dark &.c-button--secondary background: $color-back color: $color-theme - border-color: $color-theme + + &:hover + color: $color-theme-dark + + &.c-button--secondary-light + background: transparent + color: $color-back + border-color: $color-back + +.c-icon-button + @include size(35px) + background: $color-subtle-light + color: $color-subtle-dark + border-radius: 50% + padding: 0.5rem + transition: color 0.2s ease + + &:hover + color: $color-theme + + &.c-icon-button--right + float: right + margin-left: 3rem diff --git a/website/assets/css/_components/_chat.sass b/website/assets/css/_components/_chat.sass index 2a1e5cc3d..659f80364 100644 --- a/website/assets/css/_components/_chat.sass +++ b/website/assets/css/_components/_chat.sass @@ -24,9 +24,9 @@ transform: translateX(110%) &:before - @include position(absolute, top, left, 1rem, 2rem) + @include position(absolute, top, left, 1.25rem, 2rem) content: attr(data-title) - font: bold 1.4rem $font-code + font: bold 1.4rem $font-secondary text-transform: uppercase color: $color-back @@ -88,13 +88,18 @@ background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTguOTg0IDYuNDIybC01LjU3OCA1LjU3OCA1LjU3OCA1LjU3OC0xLjQwNiAxLjQwNi01LjU3OC01LjU3OC01LjU3OCA1LjU3OC0xLjQwNi0xLjQwNiA1LjU3OC01LjU3OC01LjU3OC01LjU3OCAxLjQwNi0xLjQwNiA1LjU3OCA1LjU3OCA1LjU3OC01LjU3OHoiPjwvcGF0aD48L3N2Zz4=) .c-chat__button - @include position(fixed, bottom, right, 0, 2rem) - padding: 1rem 1.5rem - background: $color-front + @include position(fixed, bottom, right, 1.5rem, 1.5rem) + z-index: 5 color: $color-back - border-top-left-radius: 4px - border-top-right-radius: 4px - z-index: 20 - border-color: $color-theme - border-style: solid - border-width: 1px 1px 0 1px + background: $color-front + border-radius: 1em + padding: 0.5rem 1.15rem 0.35rem + opacity: 0.7 + transition: opacity 0.2s ease + + &:hover + opacity: 1 + + +.gitter-open-chat-button + display: none diff --git a/website/assets/css/_components/_code.sass b/website/assets/css/_components/_code.sass index 2e1856c0a..f83e96d29 100644 --- a/website/assets/css/_components/_code.sass +++ b/website/assets/css/_components/_code.sass @@ -4,9 +4,9 @@ .c-code-block background: $color-front - color: $color-back + color: darken($color-back, 20) padding: 0.75em 0 - border-radius: 2px + border-radius: $border-radius overflow: auto width: 100% max-width: 100% @@ -16,6 +16,8 @@ &.c-code-block--has-icon padding: 0 display: flex + border-top-left-radius: 0 + border-bottom-left-radius: 0 .c-code-block__icon padding: 0 0 0 1rem @@ -35,18 +37,34 @@ font: normal normal 1.1rem/#{2} $font-code padding: 1em 2em + &[data-prompt]:before, + content: attr(data-prompt) + margin-right: 0.65em + display: inline-block + vertical-align: middle + opacity: 0.5 + + +//- Code + +code + -webkit-font-smoothing: subpixel-antialiased + -moz-osx-font-smoothing: auto + //- Inline code +*:not(a):not(.c-code-block) > code + color: $color-dark + *:not(.c-code-block) > code - font: normal 600 0.8em/#{1} $font-code - background: darken($color-theme-light, 5) - box-shadow: 1px 1px 0 rgba($color-front, 0.05) - text-shadow: 1px 1px 0 rgba($color-back, 0.5) - color: $color-front - padding: 0.1em 0.5em + font-size: 90% + background-color: $color-subtle-light + padding: 0.2rem 0.4rem + border-radius: 0.25rem + font-family: $font-code + white-space: nowrap margin: 0 - border-radius: 1px box-decoration-break: clone white-space: nowrap diff --git a/website/assets/css/_components/_landing.sass b/website/assets/css/_components/_landing.sass index af1521d10..4c15e4a39 100644 --- a/website/assets/css/_components/_landing.sass +++ b/website/assets/css/_components/_landing.sass @@ -2,12 +2,11 @@ .c-landing background: $color-theme - padding-top: 5rem + padding-top: $nav-height * 1.5 width: 100% .c-landing__wrapper background: $pattern - padding-bottom: 6rem width: 100% .c-landing__content @@ -15,9 +14,45 @@ width: 100% min-height: 573px +.c-landing__headlines + position: relative + top: -1.5rem + left: 1rem + .c-landing__title color: $color-back text-align: center + margin-bottom: 0.75rem + +.c-landing__blocks + @include breakpoint(min, sm) + position: relative + top: -25rem + margin-bottom: -25rem + +.c-landing__card + padding: 3rem 2.5rem + +.c-landing__banner + background: $color-theme + +.c-landing__banner__content + @include breakpoint(min, md) + border: 4px solid + padding: 1rem 6.5rem 2rem 4rem + + +.c-landing__banner__text + font-weight: 500 + + strong + font-weight: 800 + + p + font-size: 1.5rem + + @include breakpoint(min, md) + padding-top: 7rem .c-landing__badge transform: rotate(7deg) diff --git a/website/assets/css/_components/_lists.sass b/website/assets/css/_components/_lists.sass index 48a5e92c8..553af6578 100644 --- a/website/assets/css/_components/_lists.sass +++ b/website/assets/css/_components/_lists.sass @@ -9,6 +9,8 @@ .c-list__item:before content: counter(li, #{$counter}) '.' + font-size: 1em + padding-right: 1rem //- List Item @@ -21,13 +23,14 @@ &:before content: '\25CF' display: inline-block - font-size: 1em + font-size: 0.6em font-weight: bold - padding-right: 1.25rem + padding-right: 1em margin-left: -3.75rem text-align: right width: 2.5rem counter-increment: li + box-sizing: content-box //- List icon diff --git a/website/assets/css/_components/_misc.sass b/website/assets/css/_components/_misc.sass index 3bd9bd6b6..8167c94b2 100644 --- a/website/assets/css/_components/_misc.sass +++ b/website/assets/css/_components/_misc.sass @@ -3,9 +3,8 @@ .x-terminal background: $color-subtle-light color: $color-front - padding: 4px - border: 1px dotted $color-subtle - border-radius: 5px + padding: $border-radius + border-radius: 1em width: 100% .x-terminal__icons diff --git a/website/assets/css/_components/_navigation.sass b/website/assets/css/_components/_navigation.sass index 5b7275f92..0e4af8267 100644 --- a/website/assets/css/_components/_navigation.sass +++ b/website/assets/css/_components/_navigation.sass @@ -1,22 +1,21 @@ //- 💫 CSS > COMPONENTS > NAVIGATION .c-nav - @include position(absolute, top, left, 0, 0) + @include position(fixed, top, left, 0, 0) @include size(100%, $nav-height) background: $color-back color: $color-theme align-items: center display: flex justify-content: space-between + flex-flow: row wrap padding: 0 2rem 0 1rem - z-index: 20 + z-index: 30 width: 100% - border-bottom: 1px solid $color-subtle + box-shadow: $box-shadow - &.c-nav--theme - background: $color-theme - color: $color-back - border-bottom: none + //@include breakpoint(min, md) + // position: fixed &.is-fixed animation: slideInDown 0.5s ease-in-out @@ -28,12 +27,21 @@ justify-content: flex-end flex-flow: row nowrap border-color: inherit + flex: 1 .c-nav__menu__item display: flex align-items: center height: 100% text-transform: uppercase + font-family: $font-secondary + font-size: 1.6rem + font-weight: bold + color: $color-theme - &:not(:last-child) - margin-right: 1em + &:not(:first-child) + margin-left: 2em + + &.is-active + color: $color-dark + pointer-events: none diff --git a/website/assets/css/_components/_progress.sass b/website/assets/css/_components/_progress.sass new file mode 100644 index 000000000..bbab0fddd --- /dev/null +++ b/website/assets/css/_components/_progress.sass @@ -0,0 +1,24 @@ +//- 💫 CSS > COMPONENTS > PROGRESS + +.c-progress + display: block + flex: 105% + width: 105% + height: 3px + color: $color-theme + background: transparent + border: none + position: absolute + bottom: 0 + left: -2.5% + + &::-webkit-progress-bar + background: $color-back + border-radius: none + + &::-webkit-progress-value + background: $color-theme + border-radius: none + + &::-moz-progress-bar + background: $color-theme diff --git a/website/assets/css/_components/_quickstart.sass b/website/assets/css/_components/_quickstart.sass index 1e7d0761a..6b02b3128 100644 --- a/website/assets/css/_components/_quickstart.sass +++ b/website/assets/css/_components/_quickstart.sass @@ -1,14 +1,17 @@ //- 💫 CSS > COMPONENTS > QUICKSTART .c-quickstart - border: 1px solid $color-subtle - border-radius: 2px + border-radius: $border-radius display: none background: $color-subtle-light &:not([style]) + .c-quickstart__info display: none + .c-code-block + border-top-left-radius: 0 + border-top-right-radius: 0 + .c-quickstart__content padding: 2rem 3rem @@ -72,7 +75,6 @@ flex: 100% .c-quickstart__legend - color: $color-subtle-dark margin-right: 2rem padding-top: 0.75rem flex: 1 1 35% @@ -95,4 +97,4 @@ padding: 1.5rem 0 .c-quickstart__code - font-size: 1.6rem + font-size: 1.4rem diff --git a/website/assets/css/_components/_sidebar.sass b/website/assets/css/_components/_sidebar.sass index d88588341..be3e34147 100644 --- a/website/assets/css/_components/_sidebar.sass +++ b/website/assets/css/_components/_sidebar.sass @@ -3,16 +3,15 @@ //- Sidebar container .c-sidebar - background: $color-subtle-light overflow-y: auto @include breakpoint(min, md) @include position(fixed, top, left, 0, 0) - @include size($sidebar-width, 100vh) + @include size($sidebar-width, calc(100vh - 3px)) + @include scroll-shadow($color-back, $color-front, $nav-height) flex: 0 0 $sidebar-width padding: calc(#{$nav-height} + 1.5rem) 0 0 z-index: 10 - border-right: 1px solid $color-subtle @include breakpoint(max, sm) flex: 100% @@ -27,7 +26,7 @@ .c-sidebar__section & > * - padding: 0 2rem + padding: 0 2rem 0.35rem @include breakpoint(max, sm) flex: 1 1 0 @@ -38,7 +37,59 @@ &:not(:last-child) border-right: 1px solid $color-subtle - .is-active +.c-sidebar__item + color: $color-theme + + &:hover + color: $color-theme-dark + + & > .is-active font-weight: bold - color: $color-theme - background: rgba($color-subtle, 0.4) + color: $color-dark + margin-top: 1rem + + +//- Sidebar subsections + +$crumb-bullet: 14px +$crumb-bar: 2px + +.c-sidebar__crumb + display: block + padding-top: 1rem + padding-left: 1rem + position: relative + +.c-sidebar__crumb__item + margin-bottom: $crumb-bullet / 2 + position: relative + padding-left: 2rem + color: $color-theme + font-size: 1.2rem + + &:hover + color: $color-theme-dark + + &:after + @include size($crumb-bullet) + @include position(absolute, top, left, $crumb-bullet / 4, 0) + content: "" + border-radius: 50% + background: $color-theme + z-index: 10 + + &:not(:last-child):before + @include size($crumb-bar, 100%) + @include position(absolute, top, left, $crumb-bullet, ($crumb-bullet - $crumb-bar) / 2) + content: "" + background: $color-subtle + + &:first-child:before + height: calc(100% + #{$crumb-bullet * 2}) + top: -$crumb-bullet / 2 + + &.is-active + color: $color-dark + + &:after + background: $color-dark diff --git a/website/assets/css/_components/_tables.sass b/website/assets/css/_components/_tables.sass index cbc861803..1878e2c5e 100644 --- a/website/assets/css/_components/_tables.sass +++ b/website/assets/css/_components/_tables.sass @@ -9,7 +9,7 @@ //- Table row .c-table__row - &:nth-child(odd) + &:nth-child(odd):not(.c-table__row--head) background: rgba($color-subtle-light, 0.35) &.c-table__row--foot @@ -38,7 +38,6 @@ .c-table__head-cell font-weight: bold color: $color-theme - background: $color-back padding: 1rem 0.5rem border-bottom: 2px solid $color-theme diff --git a/website/assets/css/_components/_tooltips.sass b/website/assets/css/_components/_tooltips.sass index e68f2875c..f9284dcdb 100644 --- a/website/assets/css/_components/_tooltips.sass +++ b/website/assets/css/_components/_tooltips.sass @@ -4,24 +4,34 @@ position: relative @include breakpoint(min, sm) + &[data-tooltip-style="code"]:before + -webkit-font-smoothing: subpixel-antialiased + -moz-osx-font-smoothing: auto + padding: 0.35em 0.85em 0.45em + font: normal 1rem/#{1.25} $font-code + white-space: nowrap + min-width: auto + &:before @include position(absolute, top, left, 125%, 50%) display: inline-block content: attr(data-tooltip) background: $color-front - border-radius: 2px + border-radius: $border-radius border: 1px solid rgba($color-subtle-dark, 0.5) color: $color-back - font: normal 1.3rem/#{1.25} $font-primary + font: normal 1.2rem/#{1.25} $font-primary text-transform: none + text-align: left opacity: 0 - padding: 0.5em 0.75em transform: translateX(-50%) translateY(-2px) transition: opacity 0.1s ease-out, transform 0.1s ease-out visibility: hidden - min-width: 200px max-width: 300px + min-width: 200px + padding: 0.75em 1em 1em z-index: 200 + white-space: pre-wrap &:hover:before opacity: 1 diff --git a/website/assets/css/_mixins.sass b/website/assets/css/_mixins.sass index e7e7a3432..641f6e148 100644 --- a/website/assets/css/_mixins.sass +++ b/website/assets/css/_mixins.sass @@ -42,8 +42,8 @@ // $scroll-shadow-side - side to cover shadow (left or right) // $scroll-shadow-background - original background color to match -@mixin scroll-shadow-base($scroll-shadow-color) - background: radial-gradient(left, ellipse, rgba(0,0,0, .2) 0%, rgba(0,0,0, 0) 75%) 0 center, radial-gradient(right, ellipse, rgba(0,0,0, .2) 0%, rgba(0,0,0, 0) 75%) 100% center +@mixin scroll-shadow-base($scroll-shadow-color, $scroll-shadow-intensity: 0.2) + background: radial-gradient(ellipse at 0 50%, rgba($scroll-shadow-color, $scroll-shadow-intensity) 0%, rgba(0,0,0,0) 75%) 0 center, radial-gradient(ellipse at 100% 50%, rgba($scroll-shadow-color, $scroll-shadow-intensity) 0%, transparent 75%) 100% center background-attachment: scroll, scroll background-repeat: no-repeat background-size: 10px 100%, 10px 100% @@ -58,3 +58,16 @@ background-image: linear-gradient(to #{$scroll-gradient-direction}, rgba($scroll-shadow-background, 1) 50%, rgba($scroll-shadow-background, 0) 100%) background-repeat: no-repeat background-size: 20px 100% + + +// Full vertical scroll shadows +// adapted from: https://codepen.io/laustdeleuran/pen/DBaAu + +@mixin scroll-shadow($background-color, $shadow-color, $shadow-offset: 0, $shadow-intensity: 0.4, $cover-size: 40px, $shadow-size: 15px) + background: linear-gradient($background-color 30%, rgba($background-color,0)) 0 $shadow-offset, linear-gradient(rgba($background-color,0), $background-color 70%) 0 100%, radial-gradient(50% 0, farthest-side, rgba($shadow-color,$shadow-intensity), rgba($shadow-color,0)) 0 $shadow-offset, radial-gradient(50% 100%,farthest-side, rgba($shadow-color,$shadow-intensity), rgba($shadow-color,0)) 0 100% + + background: linear-gradient($background-color 30%, rgba($background-color,0)) 0 $shadow-offset, linear-gradient(rgba($background-color,0), $background-color 70%) 0 100%, radial-gradient(farthest-side at 50% 0, rgba($shadow-color,$shadow-intensity), rgba($shadow-color,0)) -20px $shadow-offset, radial-gradient(farthest-side at 50% 100%, rgba($shadow-color, $shadow-intensity), rgba($shadow-color,0)) 0 100% + background-repeat: no-repeat + background-color: $background-color + background-size: 100% $cover-size, 100% $cover-size, 100% $shadow-size, 100% $shadow-size + background-attachment: local, local, scroll, scroll diff --git a/website/assets/css/_variables.sass b/website/assets/css/_variables.sass index 3ccf36f06..fbceb5a6f 100644 --- a/website/assets/css/_variables.sass +++ b/website/assets/css/_variables.sass @@ -4,47 +4,48 @@ $type-base: 11px -$nav-height: 45px +$nav-height: 55px $content-width: 1250px -$sidebar-width: 200px -$aside-width: 30vw +$sidebar-width: 235px +$aside-width: 27.5vw $aside-padding: 25px +$border-radius: 6px $logo-width: 85px $logo-height: 27px $grid: ( quarter: 4, third: 3, half: 2, two-thirds: 1.5, three-quarters: 1.33 ) $breakpoints: ( sm: 768px, md: 992px, lg: 1200px ) -$headings: (1: 3, 2: 2.6, 3: 2, 4: 1.8, 5: 1.5) - +$headings: (1: 4.4, 2: 3.4, 3: 2.6, 4: 2.2, 5: 1.8) // Fonts -$font-primary: "Source Sans Pro", Tahoma, Geneva, sans-serif !default -$font-code: 'Source Code Pro', Consolas, 'Andale Mono', Menlo, Monaco, Courier, monospace !default - +$font-primary: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default +$font-secondary: "HK Grotesk", Roboto, Helvetica, Arial, sans-serif !default +$font-code: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default // Colors -$colors: ( blue: #09a3d5, red: #d9515d, green: #08c35e ) +$colors: ( blue: #09a3d5, green: #05b083 ) $color-back: #fff !default $color-front: #1a1e23 !default $color-dark: lighten($color-front, 20) !default $color-theme: map-get($colors, $theme) -$color-theme-dark: darken(map-get($colors, $theme), 5) +$color-theme-dark: darken(map-get($colors, $theme), 10) $color-theme-light: rgba($color-theme, 0.05) $color-subtle: #ddd !default $color-subtle-light: #f6f6f6 !default $color-subtle-dark: #949e9b !default -$color-red: #d9515d -$color-green: #3ec930 +$color-red: #ef476f +$color-green: #7ddf64 $color-yellow: #f4c025 $syntax-highlighting: ( comment: #949e9b, tag: #b084eb, number: #b084eb, selector: #ffb86c, operator: #ff2c6d, function: #35b3dc, keyword: #ff2c6d, regex: #f4c025 ) $pattern: $color-theme url("/assets/img/pattern_#{$theme}.jpg") center top repeat $pattern-overlay: transparent url("/assets/img/pattern_landing.jpg") center -138px no-repeat +$box-shadow: 0 1px 5px rgba(0, 0, 0, 0.2) diff --git a/website/assets/css/style.sass b/website/assets/css/style.sass index eaf7cdf70..47cf3f1b5 100644 --- a/website/assets/css/style.sass +++ b/website/assets/css/style.sass @@ -30,6 +30,7 @@ $theme: blue !default @import _components/lists @import _components/misc @import _components/navigation +@import _components/progress @import _components/sidebar @import _components/tables @import _components/quickstart diff --git a/website/assets/css/style_red.sass b/website/assets/css/style_red.sass deleted file mode 100644 index 83fe330b9..000000000 --- a/website/assets/css/style_red.sass +++ /dev/null @@ -1,4 +0,0 @@ -//- 💫 STYLESHEET (RED) - -$theme: red -@import style diff --git a/website/assets/fonts/hkgrotesk-bold.woff b/website/assets/fonts/hkgrotesk-bold.woff new file mode 100755 index 000000000..41e8651c3 Binary files /dev/null and b/website/assets/fonts/hkgrotesk-bold.woff differ diff --git a/website/assets/fonts/hkgrotesk-bold.woff2 b/website/assets/fonts/hkgrotesk-bold.woff2 new file mode 100755 index 000000000..1967e7825 Binary files /dev/null and b/website/assets/fonts/hkgrotesk-bold.woff2 differ diff --git a/website/assets/fonts/hkgrotesk-bolditalic.woff b/website/assets/fonts/hkgrotesk-bolditalic.woff new file mode 100755 index 000000000..dbb8e57ee Binary files /dev/null and b/website/assets/fonts/hkgrotesk-bolditalic.woff differ diff --git a/website/assets/fonts/hkgrotesk-bolditalic.woff2 b/website/assets/fonts/hkgrotesk-bolditalic.woff2 new file mode 100755 index 000000000..6e037d731 Binary files /dev/null and b/website/assets/fonts/hkgrotesk-bolditalic.woff2 differ diff --git a/website/assets/fonts/hkgrotesk-semibold.woff b/website/assets/fonts/hkgrotesk-semibold.woff new file mode 100755 index 000000000..ae0ff2dc7 Binary files /dev/null and b/website/assets/fonts/hkgrotesk-semibold.woff differ diff --git a/website/assets/fonts/hkgrotesk-semibold.woff2 b/website/assets/fonts/hkgrotesk-semibold.woff2 new file mode 100755 index 000000000..6c52d9245 Binary files /dev/null and b/website/assets/fonts/hkgrotesk-semibold.woff2 differ diff --git a/website/assets/fonts/hkgrotesk-semibolditalic.woff b/website/assets/fonts/hkgrotesk-semibolditalic.woff new file mode 100755 index 000000000..3fce4cf35 Binary files /dev/null and b/website/assets/fonts/hkgrotesk-semibolditalic.woff differ diff --git a/website/assets/fonts/hkgrotesk-semibolditalic.woff2 b/website/assets/fonts/hkgrotesk-semibolditalic.woff2 new file mode 100755 index 000000000..fc0ed71ee Binary files /dev/null and b/website/assets/fonts/hkgrotesk-semibolditalic.woff2 differ diff --git a/website/assets/fonts/sourcecodepro-semibold.eot b/website/assets/fonts/sourcecodepro-semibold.eot deleted file mode 100644 index 4ad47de2e..000000000 Binary files a/website/assets/fonts/sourcecodepro-semibold.eot and /dev/null differ diff --git a/website/assets/fonts/sourcecodepro-semibold.svg b/website/assets/fonts/sourcecodepro-semibold.svg deleted file mode 100644 index 0515c3ad5..000000000 --- a/website/assets/fonts/sourcecodepro-semibold.svg +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcecodepro-semibold.ttf b/website/assets/fonts/sourcecodepro-semibold.ttf deleted file mode 100644 index ff2206e58..000000000 Binary files a/website/assets/fonts/sourcecodepro-semibold.ttf and /dev/null differ diff --git a/website/assets/fonts/sourcecodepro-semibold.woff b/website/assets/fonts/sourcecodepro-semibold.woff deleted file mode 100644 index 83cd2c3ea..000000000 Binary files a/website/assets/fonts/sourcecodepro-semibold.woff and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bold.eot b/website/assets/fonts/sourcesanspro-bold.eot deleted file mode 100644 index b3b60be2d..000000000 Binary files a/website/assets/fonts/sourcesanspro-bold.eot and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bold.svg b/website/assets/fonts/sourcesanspro-bold.svg deleted file mode 100644 index 94efdcbe5..000000000 --- a/website/assets/fonts/sourcesanspro-bold.svg +++ /dev/null @@ -1,1031 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-bold.ttf b/website/assets/fonts/sourcesanspro-bold.ttf deleted file mode 100644 index 4619eef6b..000000000 Binary files a/website/assets/fonts/sourcesanspro-bold.ttf and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bold.woff b/website/assets/fonts/sourcesanspro-bold.woff deleted file mode 100644 index 3257aeddf..000000000 Binary files a/website/assets/fonts/sourcesanspro-bold.woff and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bold.woff2 b/website/assets/fonts/sourcesanspro-bold.woff2 deleted file mode 100644 index 42b02574f..000000000 Binary files a/website/assets/fonts/sourcesanspro-bold.woff2 and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bolditalic.eot b/website/assets/fonts/sourcesanspro-bolditalic.eot deleted file mode 100644 index da1580939..000000000 Binary files a/website/assets/fonts/sourcesanspro-bolditalic.eot and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bolditalic.svg b/website/assets/fonts/sourcesanspro-bolditalic.svg deleted file mode 100644 index aa37571dd..000000000 --- a/website/assets/fonts/sourcesanspro-bolditalic.svg +++ /dev/null @@ -1,840 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-bolditalic.ttf b/website/assets/fonts/sourcesanspro-bolditalic.ttf deleted file mode 100644 index ae8b08166..000000000 Binary files a/website/assets/fonts/sourcesanspro-bolditalic.ttf and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bolditalic.woff b/website/assets/fonts/sourcesanspro-bolditalic.woff deleted file mode 100644 index 3ac22abd8..000000000 Binary files a/website/assets/fonts/sourcesanspro-bolditalic.woff and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-bolditalic.woff2 b/website/assets/fonts/sourcesanspro-bolditalic.woff2 deleted file mode 100644 index 629413ac6..000000000 Binary files a/website/assets/fonts/sourcesanspro-bolditalic.woff2 and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-italic.eot b/website/assets/fonts/sourcesanspro-italic.eot deleted file mode 100644 index a5d050e75..000000000 Binary files a/website/assets/fonts/sourcesanspro-italic.eot and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-italic.svg b/website/assets/fonts/sourcesanspro-italic.svg deleted file mode 100644 index bf0f85da9..000000000 --- a/website/assets/fonts/sourcesanspro-italic.svg +++ /dev/null @@ -1,852 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-italic.ttf b/website/assets/fonts/sourcesanspro-italic.ttf deleted file mode 100644 index f17a12856..000000000 Binary files a/website/assets/fonts/sourcesanspro-italic.ttf and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-italic.woff b/website/assets/fonts/sourcesanspro-italic.woff deleted file mode 100644 index 32c1e1962..000000000 Binary files a/website/assets/fonts/sourcesanspro-italic.woff and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-italic.woff2 b/website/assets/fonts/sourcesanspro-italic.woff2 deleted file mode 100644 index c3d399f8c..000000000 Binary files a/website/assets/fonts/sourcesanspro-italic.woff2 and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-regular.eot b/website/assets/fonts/sourcesanspro-regular.eot deleted file mode 100644 index 6e98cf79a..000000000 Binary files a/website/assets/fonts/sourcesanspro-regular.eot and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-regular.svg b/website/assets/fonts/sourcesanspro-regular.svg deleted file mode 100644 index 27d435ad9..000000000 --- a/website/assets/fonts/sourcesanspro-regular.svg +++ /dev/null @@ -1,1039 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/website/assets/fonts/sourcesanspro-regular.ttf b/website/assets/fonts/sourcesanspro-regular.ttf deleted file mode 100644 index 0bb505790..000000000 Binary files a/website/assets/fonts/sourcesanspro-regular.ttf and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-regular.woff b/website/assets/fonts/sourcesanspro-regular.woff deleted file mode 100644 index aa0503cac..000000000 Binary files a/website/assets/fonts/sourcesanspro-regular.woff and /dev/null differ diff --git a/website/assets/fonts/sourcesanspro-regular.woff2 b/website/assets/fonts/sourcesanspro-regular.woff2 deleted file mode 100644 index 06206e483..000000000 Binary files a/website/assets/fonts/sourcesanspro-regular.woff2 and /dev/null differ diff --git a/website/assets/img/docs/architecture.svg b/website/assets/img/architecture.svg similarity index 91% rename from website/assets/img/docs/architecture.svg rename to website/assets/img/architecture.svg index c1d12d79b..911aaec60 100644 --- a/website/assets/img/docs/architecture.svg +++ b/website/assets/img/architecture.svg @@ -1,9 +1,13 @@ Language @@ -14,37 +18,37 @@ - nlp.vocab.morphology + nlp.vocab.morphology Vocab - nlp.vocab + nlp.vocab StringStore - nlp.vocab.strings + nlp.vocab.strings - nlp.tokenizer.vocab + nlp.tokenizer.vocab Tokenizer - nlp.make_doc() + nlp.make_doc() - nlp.pipeline + nlp.pipeline - nlp.pipeline[i].vocab + nlp.pipeline[i].vocab pt @@ -80,7 +84,7 @@ - doc.vocab + doc.vocab @@ -94,7 +98,7 @@ - token.doc + token.doc Token @@ -102,7 +106,7 @@ - lexeme.vocab + lexeme.vocab Lexeme @@ -112,7 +116,7 @@ - span.doc + span.doc Dependency Parser diff --git a/website/assets/img/docs/displacy_jupyter.jpg b/website/assets/img/displacy_jupyter.jpg similarity index 100% rename from website/assets/img/docs/displacy_jupyter.jpg rename to website/assets/img/displacy_jupyter.jpg diff --git a/website/assets/img/graphics.svg b/website/assets/img/graphics.svg deleted file mode 100644 index a449c3d04..000000000 --- a/website/assets/img/graphics.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - spaCy v2.0.0 alpha - - - - - - - - - - - spaCy user survey 2017 - - - - - - - - - - - - brain - - - - - - - computer - - - - - - - - - - eye - - - - - - - - - - - - - - bubble - - - - - - - - - - - - spacy - - - - - explosion - - - - - matt-signature - - - - diff --git a/website/assets/img/icons.svg b/website/assets/img/icons.svg deleted file mode 100644 index 104117cc0..000000000 --- a/website/assets/img/icons.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/website/assets/img/docs/language_data.svg b/website/assets/img/language_data.svg similarity index 88% rename from website/assets/img/docs/language_data.svg rename to website/assets/img/language_data.svg index 31e1a1b29..e24bb7809 100644 --- a/website/assets/img/docs/language_data.svg +++ b/website/assets/img/language_data.svg @@ -1,13 +1,16 @@ - Tokenizer + Tokenizer @@ -33,50 +36,50 @@ - Language data + Language data - stop words + stop words - lexical attributes + lexical attributes - tokenizer exceptions + tokenizer exceptions - prefixes, suffixes, infixes + prefixes, suffixes, infixes - lemma data + lemma data - Lemmatizer + Lemmatizer - char classes + char classes Token - morph rules + morph rules - tag map + tag map Morphology diff --git a/website/assets/img/logo.svg b/website/assets/img/logo.svg index fc776fb82..89b61e132 100644 --- a/website/assets/img/logo.svg +++ b/website/assets/img/logo.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/website/assets/img/logos/chartbeat.png b/website/assets/img/logos/chartbeat.png deleted file mode 100644 index 40e644154..000000000 Binary files a/website/assets/img/logos/chartbeat.png and /dev/null differ diff --git a/website/assets/img/logos/chattermill.png b/website/assets/img/logos/chattermill.png deleted file mode 100644 index 6f98359d5..000000000 Binary files a/website/assets/img/logos/chattermill.png and /dev/null differ diff --git a/website/assets/img/logos/cytora.png b/website/assets/img/logos/cytora.png deleted file mode 100644 index 24040dc4f..000000000 Binary files a/website/assets/img/logos/cytora.png and /dev/null differ diff --git a/website/assets/img/logos/duedil.png b/website/assets/img/logos/duedil.png deleted file mode 100644 index 0eb518fb4..000000000 Binary files a/website/assets/img/logos/duedil.png and /dev/null differ diff --git a/website/assets/img/logos/indico.png b/website/assets/img/logos/indico.png deleted file mode 100644 index eb840a431..000000000 Binary files a/website/assets/img/logos/indico.png and /dev/null differ diff --git a/website/assets/img/logos/kip.png b/website/assets/img/logos/kip.png deleted file mode 100644 index e7234b438..000000000 Binary files a/website/assets/img/logos/kip.png and /dev/null differ diff --git a/website/assets/img/logos/quora.png b/website/assets/img/logos/quora.png deleted file mode 100644 index 07c38144c..000000000 Binary files a/website/assets/img/logos/quora.png and /dev/null differ diff --git a/website/assets/img/logos/signaln.png b/website/assets/img/logos/signaln.png deleted file mode 100644 index 078f50380..000000000 Binary files a/website/assets/img/logos/signaln.png and /dev/null differ diff --git a/website/assets/img/logos/socrata.png b/website/assets/img/logos/socrata.png deleted file mode 100644 index 079872c4e..000000000 Binary files a/website/assets/img/logos/socrata.png and /dev/null differ diff --git a/website/assets/img/logos/stitchfix.png b/website/assets/img/logos/stitchfix.png deleted file mode 100644 index 0a97057c5..000000000 Binary files a/website/assets/img/logos/stitchfix.png and /dev/null differ diff --git a/website/assets/img/logos/synapsify.png b/website/assets/img/logos/synapsify.png deleted file mode 100644 index 3c65d9b32..000000000 Binary files a/website/assets/img/logos/synapsify.png and /dev/null differ diff --git a/website/assets/img/logos/turi.png b/website/assets/img/logos/turi.png deleted file mode 100644 index de70d08bd..000000000 Binary files a/website/assets/img/logos/turi.png and /dev/null differ diff --git a/website/assets/img/logos/wayblazer.png b/website/assets/img/logos/wayblazer.png deleted file mode 100644 index 95a0098e4..000000000 Binary files a/website/assets/img/logos/wayblazer.png and /dev/null differ diff --git a/website/assets/img/logos/wonderflow.png b/website/assets/img/logos/wonderflow.png deleted file mode 100644 index d3fec37c0..000000000 Binary files a/website/assets/img/logos/wonderflow.png and /dev/null differ diff --git a/website/assets/img/pattern_green.jpg b/website/assets/img/pattern_green.jpg index d2e341822..172495c38 100644 Binary files a/website/assets/img/pattern_green.jpg and b/website/assets/img/pattern_green.jpg differ diff --git a/website/assets/img/docs/pipeline.svg b/website/assets/img/pipeline.svg similarity index 92% rename from website/assets/img/docs/pipeline.svg rename to website/assets/img/pipeline.svg index 9c34636dc..1ff5923cb 100644 --- a/website/assets/img/docs/pipeline.svg +++ b/website/assets/img/pipeline.svg @@ -1,8 +1,8 @@ diff --git a/website/assets/img/showcase/displacy-ent.jpg b/website/assets/img/resources/displacy-ent.jpg similarity index 100% rename from website/assets/img/showcase/displacy-ent.jpg rename to website/assets/img/resources/displacy-ent.jpg diff --git a/website/assets/img/showcase/displacy.jpg b/website/assets/img/resources/displacy.jpg similarity index 100% rename from website/assets/img/showcase/displacy.jpg rename to website/assets/img/resources/displacy.jpg diff --git a/website/assets/img/resources/neuralcoref.jpg b/website/assets/img/resources/neuralcoref.jpg new file mode 100644 index 000000000..fb8984919 Binary files /dev/null and b/website/assets/img/resources/neuralcoref.jpg differ diff --git a/website/assets/img/showcase/sense2vec.jpg b/website/assets/img/resources/sense2vec.jpg similarity index 100% rename from website/assets/img/showcase/sense2vec.jpg rename to website/assets/img/resources/sense2vec.jpg diff --git a/website/assets/img/showcase/foxtype.jpg b/website/assets/img/showcase/foxtype.jpg deleted file mode 100644 index 91c23d866..000000000 Binary files a/website/assets/img/showcase/foxtype.jpg and /dev/null differ diff --git a/website/assets/img/showcase/indico.jpg b/website/assets/img/showcase/indico.jpg deleted file mode 100644 index 42b3ff13f..000000000 Binary files a/website/assets/img/showcase/indico.jpg and /dev/null differ diff --git a/website/assets/img/showcase/kip.jpg b/website/assets/img/showcase/kip.jpg deleted file mode 100644 index 714d90282..000000000 Binary files a/website/assets/img/showcase/kip.jpg and /dev/null differ diff --git a/website/assets/img/showcase/laice.jpg b/website/assets/img/showcase/laice.jpg deleted file mode 100644 index fb151b1fc..000000000 Binary files a/website/assets/img/showcase/laice.jpg and /dev/null differ diff --git a/website/assets/img/showcase/textanalysis.jpg b/website/assets/img/showcase/textanalysis.jpg deleted file mode 100644 index 162078257..000000000 Binary files a/website/assets/img/showcase/textanalysis.jpg and /dev/null differ diff --git a/website/assets/img/showcase/truthbot.jpg b/website/assets/img/showcase/truthbot.jpg deleted file mode 100644 index 4903f3d17..000000000 Binary files a/website/assets/img/showcase/truthbot.jpg and /dev/null differ diff --git a/website/assets/img/social/preview_101.jpg b/website/assets/img/social/preview_101.jpg index 448c63eaf..f65eaf870 100644 Binary files a/website/assets/img/social/preview_101.jpg and b/website/assets/img/social/preview_101.jpg differ diff --git a/website/assets/img/social/preview_alpha.jpg b/website/assets/img/social/preview_alpha.jpg index 6da622569..821db408a 100644 Binary files a/website/assets/img/social/preview_alpha.jpg and b/website/assets/img/social/preview_alpha.jpg differ diff --git a/website/assets/img/social/preview_docs.jpg b/website/assets/img/social/preview_docs.jpg deleted file mode 100644 index 46805ad7a..000000000 Binary files a/website/assets/img/social/preview_docs.jpg and /dev/null differ diff --git a/website/assets/img/docs/tokenization.svg b/website/assets/img/tokenization.svg similarity index 98% rename from website/assets/img/docs/tokenization.svg rename to website/assets/img/tokenization.svg index f5b164725..9877e1a30 100644 --- a/website/assets/img/docs/tokenization.svg +++ b/website/assets/img/tokenization.svg @@ -1,7 +1,7 @@ diff --git a/website/assets/img/docs/training-loop.svg b/website/assets/img/training-loop.svg similarity index 95% rename from website/assets/img/docs/training-loop.svg rename to website/assets/img/training-loop.svg index e670f816a..e883b36be 100644 --- a/website/assets/img/docs/training-loop.svg +++ b/website/assets/img/training-loop.svg @@ -1,7 +1,7 @@ diff --git a/website/assets/img/docs/training.svg b/website/assets/img/training.svg similarity index 95% rename from website/assets/img/docs/training.svg rename to website/assets/img/training.svg index cd6b74f04..65f6de0b6 100644 --- a/website/assets/img/docs/training.svg +++ b/website/assets/img/training.svg @@ -1,7 +1,7 @@ diff --git a/website/assets/img/docs/vocab_stringstore.svg b/website/assets/img/vocab_stringstore.svg similarity index 94% rename from website/assets/img/docs/vocab_stringstore.svg rename to website/assets/img/vocab_stringstore.svg index 119175247..b604041f2 100644 --- a/website/assets/img/docs/vocab_stringstore.svg +++ b/website/assets/img/vocab_stringstore.svg @@ -1,9 +1,9 @@ diff --git a/website/assets/js/chart.min.js b/website/assets/js/chart.min.js new file mode 100644 index 000000000..184c23440 --- /dev/null +++ b/website/assets/js/chart.min.js @@ -0,0 +1,14 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.6.0 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){return function t(e,n,i){function a(r,l){if(!n[r]){if(!e[r]){var s="function"==typeof require&&require;if(!l&&s)return s(r,!0);if(o)return o(r,!0);var u=new Error("Cannot find module '"+r+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[r]={exports:{}};e[r][0].call(d.exports,function(t){var n=e[r][1][t];return a(n?n:t)},d,d.exports,t,e,n,i)}return n[r].exports}for(var o="function"==typeof require&&require,r=0;rn?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return e<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,o=2*a-1,r=n.alpha()-i.alpha(),l=((o*r===-1?o:(o+r)/(1+o*r))+1)/2,s=1-l;return this.rgb(l*n.red()+s*i.red(),l*n.green()+s*i.green(),l*n.blue()+s*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new o,i=this.values,a=n.values;for(var r in i)i.hasOwnProperty(r)&&(t=i[r],e={}.toString.call(t),"[object Array]"===e?a[r]=t.slice(0):"[object Number]"===e?a[r]=t:console.error("unexpected color value:",t));return n}},o.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},o.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},o.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var a=.4124*e+.3576*n+.1805*i,o=.2126*e+.7152*n+.0722*i,r=.0193*e+.1192*n+.9505*i;return[100*a,100*o,100*r]}function d(t){var e,n,i,a=u(t),o=a[0],r=a[1],l=a[2];return o/=95.047,r/=100,l/=108.883,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,l=l>.008856?Math.pow(l,1/3):7.787*l+16/116,e=116*r-16,n=500*(o-r),i=200*(r-l),[e,n,i]}function c(t){return B(d(t))}function h(t){var e,n,i,a,o,r=t[0]/360,l=t[1]/100,s=t[2]/100;if(0==l)return o=255*s,[o,o,o];n=s<.5?s*(1+l):s+l-s*l,e=2*s-n,a=[0,0,0];for(var u=0;u<3;u++)i=r+1/3*-(u-1),i<0&&i++,i>1&&i--,o=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*o;return a}function f(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return 0===o?[0,0,0]:(o*=2,a*=o<=1?o:2-o,n=(o+a)/2,e=2*a/(o+a),[i,100*e,100*n])}function p(t){return o(h(t))}function m(t){return l(h(t))}function v(t){return s(h(t))}function x(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,o=e-Math.floor(e),r=255*i*(1-n),l=255*i*(1-n*o),s=255*i*(1-n*(1-o)),i=255*i;switch(a){case 0:return[i,s,r];case 1:return[l,i,r];case 2:return[r,i,s];case 3:return[r,l,i];case 4:return[s,r,i];case 5:return[i,r,l]}}function y(t){var e,n,i=t[0],a=t[1]/100,o=t[2]/100;return n=(2-a)*o,e=a*o,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]}function k(t){return o(x(t))}function w(t){return l(x(t))}function M(t){return s(x(t))}function S(t){var e,n,i,a,o=t[0]/360,l=t[1]/100,s=t[2]/100,u=l+s;switch(u>1&&(l/=u,s/=u),e=Math.floor(6*o),n=1-s,i=6*o-e,0!=(1&e)&&(i=1-i),a=l+i*(n-l),e){default:case 6:case 0:r=n,g=a,b=l;break;case 1:r=a,g=n,b=l;break;case 2:r=l,g=n,b=a;break;case 3:r=l,g=a,b=n;break;case 4:r=a,g=l,b=n;break;case 5:r=n,g=l,b=a}return[255*r,255*g,255*b]}function C(t){return i(S(t))}function D(t){return a(S(t))}function I(t){return l(S(t))}function A(t){return s(S(t))}function P(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100,l=t[3]/100;return e=1-Math.min(1,a*(1-l)+l),n=1-Math.min(1,o*(1-l)+l),i=1-Math.min(1,r*(1-l)+l),[255*e,255*n,255*i]}function _(t){return i(P(t))}function T(t){return a(P(t))}function F(t){return o(P(t))}function R(t){return s(P(t))}function L(t){var e,n,i,a=t[0]/100,o=t[1]/100,r=t[2]/100;return e=3.2406*a+o*-1.5372+r*-.4986,n=a*-.9689+1.8758*o+.0415*r,i=.0557*a+o*-.204+1.057*r,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function V(t){var e,n,i,a=t[0],o=t[1],r=t[2];return a/=95.047,o/=100,r/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,e=116*o-16,n=500*(a-o),i=200*(o-r),[e,n,i]}function O(t){return B(V(t))}function z(t){var e,n,i,a,o=t[0],r=t[1],l=t[2];return o<=8?(n=100*o/903.3,a=7.787*(n/100)+16/116):(n=100*Math.pow((o+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(r/500+a-16/116)/7.787:95.047*Math.pow(r/500+a,3),i=i/108.883<=.008859?i=108.883*(a-l/200-16/116)/7.787:108.883*Math.pow(a-l/200,3),[e,n,i]}function B(t){var e,n,i,a=t[0],o=t[1],r=t[2];return e=Math.atan2(r,o),n=360*e/2/Math.PI,n<0&&(n+=360),i=Math.sqrt(o*o+r*r),[a,i,n]}function W(t){return L(z(t))}function N(t){var e,n,i,a=t[0],o=t[1],r=t[2];return i=r/360*2*Math.PI,e=o*Math.cos(i),n=o*Math.sin(i),[a,e,n]}function E(t){return z(N(t))}function H(t){return W(N(t))}function q(t){return J[t]}function j(t){return i(q(t))}function Y(t){return a(q(t))}function U(t){return o(q(t))}function X(t){return l(q(t))}function K(t){return d(q(t))}function G(t){return u(q(t))}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:l,rgb2keyword:s,rgb2xyz:u,rgb2lab:d,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:p,hsl2cmyk:m,hsl2keyword:v,hsv2rgb:x,hsv2hsl:y,hsv2hwb:k,hsv2cmyk:w,hsv2keyword:M,hwb2rgb:S,hwb2hsl:C,hwb2hsv:D,hwb2cmyk:I,hwb2keyword:A,cmyk2rgb:P,cmyk2hsl:_,cmyk2hsv:T,cmyk2hwb:F,cmyk2keyword:R,keyword2rgb:q,keyword2hsl:j,keyword2hsv:Y,keyword2hwb:U,keyword2cmyk:X,keyword2lab:K,keyword2xyz:G,xyz2rgb:L,xyz2lab:V,xyz2lch:O,lab2xyz:z,lab2rgb:W,lab2lch:B,lch2lab:N,lch2xyz:E,lch2rgb:H};var J={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Z={};for(var Q in J)Z[JSON.stringify(J[Q])]=Q},{}],5:[function(t,e,n){var i=t(4),a=function(){return new u};for(var o in i){a[o+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(o);var r=/(\w+)2(\w+)/.exec(o),l=r[1],s=r[2];a[l]=a[l]||{},a[l][s]=a[o]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a=0&&a>0)&&(m+=a));return o=c.getPixelForValue(m),r=c.getPixelForValue(m+f),l=(r-o)/2,{size:l,base:o,head:r,center:r+l/2}},calculateBarIndexPixels:function(t,e,n){var i=this,a=n.scale,o=i.chart.isCombo,r=i.getStackIndex(t),l=a.getPixelForValue(null,e,t,o),s=n.barSize;return l-=o?n.tickSize/2:0,l+=n.fullBarSize*r,l+=n.categorySpacing/2,l+=n.barSpacing/2,{size:s,base:l,head:l+s,center:l+s/2}},draw:function(){var t,n=this,i=n.chart,a=n.getMeta().data,o=n.getDataset(),r=a.length,l=0;for(e.canvas.clipArea(i.ctx,i.chartArea);l0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var o=t.getDatasetMeta(0),r=n.datasets[0],l=o.data[a],s=l&&l.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:u(r.backgroundColor,a,d.backgroundColor),h=s.borderColor?s.borderColor:u(r.borderColor,a,d.borderColor),f=s.borderWidth?s.borderWidth:u(r.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0);var p=g+f,m={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(p),y:Math.sin(p)},b=g<=0&&0<=p||g<=2*Math.PI&&2*Math.PI<=p,x=g<=.5*Math.PI&&.5*Math.PI<=p||g<=2.5*Math.PI&&2.5*Math.PI<=p,y=g<=-Math.PI&&-Math.PI<=p||g<=Math.PI&&Math.PI<=p,k=g<=.5*-Math.PI&&.5*-Math.PI<=p||g<=1.5*Math.PI&&1.5*Math.PI<=p,w=h/100,M={x:y?-1:Math.min(m.x*(m.x<0?1:w),v.x*(v.x<0?1:w)),y:k?-1:Math.min(m.y*(m.y<0?1:w),v.y*(v.y<0?1:w))},S={x:b?1:Math.max(m.x*(m.x>0?1:w),v.x*(v.x>0?1:w)),y:x?1:Math.max(m.y*(m.y>0?1:w),v.y*(v.y>0?1:w))},C={width:.5*(S.x-M.x),height:.5*(S.y-M.y)};u=Math.min(l/C.width,s/C.height),d={x:(S.x+M.x)*-.5,y:(S.y+M.y)*-.5}}i.borderWidth=n.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=n.calculateTotal(),n.outerRadius=i.outerRadius-i.radiusLength*n.getRingIndex(n.index),n.innerRadius=Math.max(n.outerRadius-i.radiusLength,0),e.each(c.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){var a=this,o=a.chart,r=o.chartArea,l=o.options,s=l.animation,u=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=l.rotation,h=l.rotation,f=a.getDataset(),g=i&&s.animateRotate?0:t.hidden?0:a.calculateCircumference(f.data[n])*(l.circumference/(2*Math.PI)),p=i&&s.animateScale?0:a.innerRadius,m=i&&s.animateScale?0:a.outerRadius,v=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:a.index,_index:n,_model:{x:u+o.offsetX,y:d+o.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:m,innerRadius:p,label:v(f.label,n,o.data.labels[n])}});var b=t._model;this.removeHoverStyle(t),i&&s.animateRotate||(0===n?b.startAngle=l.rotation:b.startAngle=a.getMeta().data[n-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,n=this.getDataset(),i=this.getMeta(),a=0;return e.each(i.data,function(e,i){t=n.data[i],isNaN(t)||e.hidden||(a+=Math.abs(t))}),a},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,o=t.length,r=0;ri?e:i,i=n>i?n:i;return i}})}},{}],18:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return n.getValueOrDefault(t.showLine,e.showLines)}var n=t.helpers;t.defaults.line={showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,update:function(t){var i,a,o,r=this,l=r.getMeta(),s=l.dataset,u=l.data||[],d=r.chart.options,c=d.elements.line,h=r.getScaleForId(l.yAxisID),f=r.getDataset(),g=e(f,d);for(g&&(o=s.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),s._scale=h,s._datasetIndex=r.index,s._children=u,s._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:o.tension?o.tension:n.getValueOrDefault(f.lineTension,c.tension),backgroundColor:o.backgroundColor?o.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:f.borderWidth||c.borderWidth,borderColor:o.borderColor?o.borderColor:f.borderColor||c.borderColor,borderCapStyle:o.borderCapStyle?o.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:o.borderDash?o.borderDash:f.borderDash||c.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:o.fill?o.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:o.steppedLine?o.steppedLine:n.getValueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:o.cubicInterpolationMode?o.cubicInterpolationMode:n.getValueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode)},s.pivot()),i=0,a=u.length;i');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var o=0;o'),a[o]&&e.push(a[o]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var o=t.getDatasetMeta(0),r=n.datasets[0],l=o.data[a],s=l.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=s.backgroundColor?s.backgroundColor:u(r.backgroundColor,a,d.backgroundColor),h=s.borderColor?s.borderColor:u(r.borderColor,a,d.borderColor),f=s.borderWidth?s.borderWidth:u(r.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(r.data[a])||o.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,o=e.index,r=this.chart;for(n=0,i=(r.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={aspectRatio:1,scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,update:function(t){var n=this,i=n.getMeta(),a=i.dataset,o=i.data,r=a.custom||{},l=n.getDataset(),s=n.chart.options.elements.line,u=n.chart.scale;void 0!==l.tension&&void 0===l.lineTension&&(l.lineTension=l.tension),e.extend(i.dataset,{_datasetIndex:n.index,_scale:u,_children:o,_loop:!0,_model:{tension:r.tension?r.tension:e.getValueOrDefault(l.lineTension,s.tension),backgroundColor:r.backgroundColor?r.backgroundColor:l.backgroundColor||s.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:l.borderWidth||s.borderWidth,borderColor:r.borderColor?r.borderColor:l.borderColor||s.borderColor,fill:r.fill?r.fill:void 0!==l.fill?l.fill:s.fill,borderCapStyle:r.borderCapStyle?r.borderCapStyle:l.borderCapStyle||s.borderCapStyle,borderDash:r.borderDash?r.borderDash:l.borderDash||s.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:l.borderDashOffset||s.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:l.borderJoinStyle||s.borderJoinStyle}}),i.dataset.pivot(),e.each(o,function(e,i){n.updateElement(e,i,t)},n),n.updateBezierControlPoints()},updateElement:function(t,n,i){var a=this,o=t.custom||{},r=a.getDataset(),l=a.chart.scale,s=a.chart.options.elements.point,u=l.getPointPositionForValue(n,r.data[n]);void 0!==r.radius&&void 0===r.pointRadius&&(r.pointRadius=r.radius),void 0!==r.hitRadius&&void 0===r.pointHitRadius&&(r.pointHitRadius=r.hitRadius),e.extend(t,{_datasetIndex:a.index,_index:n,_scale:l,_model:{x:i?l.xCenter:u.x,y:i?l.yCenter:u.y,tension:o.tension?o.tension:e.getValueOrDefault(r.lineTension,a.chart.options.elements.line.tension),radius:o.radius?o.radius:e.getValueAtIndexOrDefault(r.pointRadius,n,s.radius),backgroundColor:o.backgroundColor?o.backgroundColor:e.getValueAtIndexOrDefault(r.pointBackgroundColor,n,s.backgroundColor),borderColor:o.borderColor?o.borderColor:e.getValueAtIndexOrDefault(r.pointBorderColor,n,s.borderColor),borderWidth:o.borderWidth?o.borderWidth:e.getValueAtIndexOrDefault(r.pointBorderWidth,n,s.borderWidth),pointStyle:o.pointStyle?o.pointStyle:e.getValueAtIndexOrDefault(r.pointStyle,n,s.pointStyle),hitRadius:o.hitRadius?o.hitRadius:e.getValueAtIndexOrDefault(r.pointHitRadius,n,s.hitRadius)}}),t._model.skip=o.skip?o.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,n=this.getMeta();e.each(n.data,function(i,a){var o=i._model,r=e.splineCurve(e.previousItem(n.data,a,!0)._model,o,e.nextItem(n.data,a,!0)._model,o.tension);o.controlPointPreviousX=Math.max(Math.min(r.previous.x,t.right),t.left),o.controlPointPreviousY=Math.max(Math.min(r.previous.y,t.bottom),t.top),o.controlPointNextX=Math.max(Math.min(r.next.x,t.right),t.left),o.controlPointNextY=Math.max(Math.min(r.next.y,t.bottom),t.top),i.pivot()})},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,o=t._model;o.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(n.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),o.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.pointHoverBackgroundColor,a,e.getHoverColor(o.backgroundColor)),o.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(n.pointHoverBorderColor,a,e.getHoverColor(o.borderColor)),o.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(n.pointHoverBorderWidth,a,o.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,o=t._model,r=this.chart.options.elements.point;o.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(n.pointRadius,a,r.radius),o.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(n.pointBackgroundColor,a,r.backgroundColor),o.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(n.pointBorderColor,a,r.borderColor),o.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(n.pointBorderWidth,a,r.borderWidth)}})}},{}],21:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({chart:null,currentStep:0,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a,o,r=this.animations;for(e.chart=t,i||(t.animating=!0),a=0,o=r.length;a1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1),t.advance(1+n);var i=Date.now();t.dropFrames+=(i-e)/t.frameDuration,t.animations.length>0&&t.requestAnimationFrame()},advance:function(t){for(var n,i,a=this.animations,o=0;o=n.numSteps?(e.callback(n.onAnimationComplete,[n],i),i.animating=!1,a.splice(o,1)):++o}},Object.defineProperty(t.Animation.prototype,"animationObject",{get:function(){return this}}),Object.defineProperty(t.Animation.prototype,"chartInstance",{get:function(){return this.chart},set:function(t){this.chart=t}})}},{}],22:[function(t,e,n){"use strict";e.exports=function(t){var e=t.canvasHelpers={};e.drawPoint=function(e,n,i,a,o){var r,l,s,u,d,c;if("object"==typeof n&&(r=n.toString(),"[object HTMLImageElement]"===r||"[object HTMLCanvasElement]"===r))return void e.drawImage(n,a-n.width/2,o-n.height/2,n.width,n.height);if(!(isNaN(i)||i<=0)){switch(n){default:e.beginPath(),e.arc(a,o,i,0,2*Math.PI),e.closePath(),e.fill();break;case"triangle":e.beginPath(),l=3*i/Math.sqrt(3),d=l*Math.sqrt(3)/2,e.moveTo(a-l/2,o+d/3),e.lineTo(a+l/2,o+d/3),e.lineTo(a,o-2*d/3),e.closePath(),e.fill();break;case"rect":c=1/Math.SQRT2*i,e.beginPath(),e.fillRect(a-c,o-c,2*c,2*c),e.strokeRect(a-c,o-c,2*c,2*c);break;case"rectRounded":var h=i/Math.SQRT2,f=a-h,g=o-h,p=Math.SQRT2*i;t.helpers.drawRoundedRectangle(e,f,g,p,p,i/2),e.fill();break;case"rectRot":c=1/Math.SQRT2*i,e.beginPath(),e.moveTo(a-c,o),e.lineTo(a,o+c),e.lineTo(a+c,o),e.lineTo(a,o-c),e.closePath(),e.fill();break;case"cross":e.beginPath(),e.moveTo(a,o+i),e.lineTo(a,o-i),e.moveTo(a-i,o),e.lineTo(a+i,o),e.closePath();break;case"crossRot":e.beginPath(),s=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-s,o-u),e.lineTo(a+s,o+u),e.moveTo(a-s,o+u),e.lineTo(a+s,o-u),e.closePath();break;case"star":e.beginPath(),e.moveTo(a,o+i),e.lineTo(a,o-i),e.moveTo(a-i,o),e.lineTo(a+i,o),s=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-s,o-u),e.lineTo(a+s,o+u),e.moveTo(a-s,o+u),e.lineTo(a+s,o-u),e.closePath();break;case"line":e.beginPath(),e.moveTo(a-i,o),e.lineTo(a+i,o),e.closePath();break;case"dash":e.beginPath(),e.moveTo(a,o),e.lineTo(a+i,o),e.closePath()}e.stroke()}},e.clipArea=function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},e.unclipArea=function(t){t.restore()},e.lineTo=function(t,e,n,i){return n.steppedLine?("after"===n.steppedLine?t.lineTo(e.x,n.y):t.lineTo(n.x,e.y),void t.lineTo(n.x,n.y)):n.tension?void t.bezierCurveTo(i?e.controlPointPreviousX:e.controlPointNextX,i?e.controlPointPreviousY:e.controlPointNextY,i?n.controlPointNextX:n.controlPointPreviousX,i?n.controlPointNextY:n.controlPointPreviousY,n.x,n.y):void t.lineTo(n.x,n.y)},t.helpers.canvas=e}},{}],23:[function(t,e,n){"use strict";e.exports=function(t){function e(e){e=e||{};var n=e.data=e.data||{};return n.datasets=n.datasets||[],n.labels=n.labels||[],e.options=a.configMerge(t.defaults.global,t.defaults[e.type],e.options||{}),e}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}function i(t){return"top"===t||"bottom"===t}var a=t.helpers,o=t.plugins,r=t.platform;t.types={},t.instances={},t.controllers={},a.extend(t.prototype,{construct:function(n,i){var o=this;i=e(i);var l=r.acquireContext(n,i),s=l&&l.canvas,u=s&&s.height,d=s&&s.width;return o.id=a.uid(),o.ctx=l,o.canvas=s,o.config=i,o.width=d,o.height=u,o.aspectRatio=u?d/u:null,o.options=i.options,o._bufferedRender=!1,o.chart=o,o.controller=o,t.instances[o.id]=o,Object.defineProperty(o,"data",{get:function(){return o.config.data},set:function(t){o.config.data=t}}),l&&s?(o.initialize(),void o.update()):void console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return o.notify(t,"beforeInit"),a.retinaScale(t),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),o.notify(t,"afterInit"),t},clear:function(){return a.clear(this),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,r=n.maintainAspectRatio&&e.aspectRatio||null,l=Math.floor(a.getMaximumWidth(i)),s=Math.floor(r?l/r:a.getMaximumHeight(i));if((e.width!==l||e.height!==s)&&(i.width=e.width=l,i.height=e.height=s,i.style.width=l+"px",i.style.height=s+"px",a.retinaScale(e),!t)){var u={width:l,height:s};o.notify(e,"resize",[u]),e.options.onResize&&e.options.onResize(e,u),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;a.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),a.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,o=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category",dposition:"bottom"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear",dposition:"left"}}))),n.scale&&r.push({options:n.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),a.each(r,function(n){var r=n.options,l=a.getValueOrDefault(r.type,n.dtype),s=t.scaleService.getScaleConstructor(l);if(s){i(r.position)!==i(n.dposition)&&(r.position=n.dposition);var u=new s({id:r.id,options:r,ctx:e.ctx,chart:e});o[u.id]=u,n.isDefault&&(e.scale=u)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],i=[];if(a.each(e.data.datasets,function(a,o){var r=e.getDatasetMeta(o);if(r.type||(r.type=a.type||e.config.type),n.push(r.type),r.controller)r.controller.updateIndex(o);else{var l=t.controllers[r.type];if(void 0===l)throw new Error('"'+r.type+'" is not a chart type.');r.controller=new l(e,o),i.push(r.controller)}},e),n.length>1)for(var o=1;o=0;--n)e.isDatasetVisible(n)&&e.drawDataset(n,t);o.notify(e,"afterDatasetsDraw",[t])}},drawDataset:function(t,e){var n=this,i=n.getDatasetMeta(t),a={meta:i,index:t,easingValue:e};o.notify(n,"beforeDatasetDraw",[a])!==!1&&(i.controller.draw(e),o.notify(n,"afterDatasetDraw",[a]))},getElementAtEvent:function(e){return t.Interaction.modes.single(this,e)},getElementsAtEvent:function(e){return t.Interaction.modes.label(this,e,{intersect:!0})},getElementsAtXAxis:function(e){return t.Interaction.modes["x-axis"](this,e,{intersect:!0})},getElementsAtEventForMode:function(e,n,i){var a=t.Interaction.modes[n];return"function"==typeof a?a(this,e,i):[]},getDatasetAtEvent:function(e){return t.Interaction.modes.dataset(this,e,{intersect:!0})},getDatasetMeta:function(t){var e=this,n=e.data.datasets[t];n._meta||(n._meta={});var i=n._meta[e.id];return i||(i=n._meta[e.id]={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null}),i},getVisibleDatasetCount:function(){for(var t=0,e=0,n=this.data.datasets.length;e0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var i=t.helpers,a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],o=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=0;a--)e.call(n,t[a],a);else for(a=0;a=i[n].length||!i[n][a].type?i[n].push(o.configMerge(l,e)):e.type&&e.type!==i[n][a].type?i[n][a]=o.configMerge(i[n][a],l,e):i[n][a]=o.configMerge(i[n][a],e)}):(i[n]=[],o.each(e,function(e){var a=o.getValueOrDefault(e.type,"xAxes"===n?"category":"linear");i[n].push(o.configMerge(t.scaleService.getScaleDefaults(a),e))})):i.hasOwnProperty(n)&&"object"==typeof i[n]&&null!==i[n]&&"object"==typeof e?i[n]=o.configMerge(i[n],e):i[n]=e}),i},o.getValueAtIndexOrDefault=function(t,e,n){return void 0===t||null===t?n:o.isArray(t)?e=0;i--){var a=t[i];if(e(a))return a}},o.inherits=function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=o.inherits,t&&o.extend(n.prototype,t),n.__super__=e.prototype,n},o.noop=function(){},o.uid=function(){var t=0;return function(){return t++}}(),o.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.almostEquals=function(t,e,n){return Math.abs(t-e)t},o.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},o.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},o.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},o.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},o.toRadians=function(t){return t*(Math.PI/180)},o.toDegrees=function(t){return t*(180/Math.PI)},o.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),o=Math.atan2(i,n);return o<-.5*Math.PI&&(o+=2*Math.PI),{angle:o,distance:a}},o.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},o.aliasPixel=function(t){return t%2===0?0:.5},o.splineCurve=function(t,e,n,i){var a=t.skip?e:t,o=e,r=n.skip?e:n,l=Math.sqrt(Math.pow(o.x-a.x,2)+Math.pow(o.y-a.y,2)),s=Math.sqrt(Math.pow(r.x-o.x,2)+Math.pow(r.y-o.y,2)),u=l/(l+s),d=s/(l+s);u=isNaN(u)?0:u,d=isNaN(d)?0:d;var c=i*u,h=i*d;return{previous:{x:o.x-c*(r.x-a.x),y:o.y-c*(r.y-a.y)},next:{x:o.x+h*(r.x-a.x),y:o.y+h*(r.y-a.y)}}},o.EPSILON=Number.EPSILON||1e-14,o.splineCurveMonotone=function(t){var e,n,i,a,r=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),l=r.length;for(e=0;e0?r[e-1]:null,a=e0?r[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},o.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},o.niceNum=function(t,e){var n,i=Math.floor(o.log10(t)),a=t/Math.pow(10,i);return n=e?a<1.5?1:a<3?2:a<7?5:10:a<=1?1:a<=2?2:a<=5?5:10,n*Math.pow(10,i)};var r=o.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i0?(n=s[0].clientX,i=s[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(o.getStyle(r,"padding-left")),d=parseFloat(o.getStyle(r,"padding-top")),c=parseFloat(o.getStyle(r,"padding-right")),h=parseFloat(o.getStyle(r,"padding-bottom")),f=l.right-l.left-u-c,g=l.bottom-l.top-d-h;return n=Math.round((n-l.left-u)/f*r.width/e.currentDevicePixelRatio),i=Math.round((i-l.top-d)/g*r.height/e.currentDevicePixelRatio),{x:n,y:i}},o.addEvent=function(t,e,n){t.addEventListener?t.addEventListener(e,n):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n},o.removeEvent=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent?t.detachEvent("on"+e,n):t["on"+e]=o.noop},o.getConstraintWidth=function(t){return a(t,"max-width","clientWidth")},o.getConstraintHeight=function(t){return a(t,"max-height","clientHeight")},o.getMaximumWidth=function(t){var e=t.parentNode,n=parseInt(o.getStyle(e,"padding-left"),10),i=parseInt(o.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,r=o.getConstraintWidth(t);return isNaN(r)?a:Math.min(a,r)},o.getMaximumHeight=function(t){var e=t.parentNode,n=parseInt(o.getStyle(e,"padding-top"),10),i=parseInt(o.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,r=o.getConstraintHeight(t);return isNaN(r)?a:Math.min(a,r)},o.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},o.retinaScale=function(t){var e=t.currentDevicePixelRatio=window.devicePixelRatio||1;if(1!==e){var n=t.canvas,i=t.height,a=t.width;n.height=i*e,n.width=a*e,t.ctx.scale(e,e),n.style.height=i+"px",n.style.width=a+"px"}},o.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},o.fontString=function(t,e,n){return e+" "+t+"px "+n},o.longestText=function(t,e,n,i){i=i||{};var a=i.data=i.data||{},r=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},r=i.garbageCollect=[],i.font=e),t.font=e;var l=0;o.each(n,function(e){void 0!==e&&null!==e&&o.isArray(e)!==!0?l=o.measureText(t,a,r,l,e):o.isArray(e)&&o.each(e,function(e){void 0===e||null===e||o.isArray(e)||(l=o.measureText(t,a,r,l,e))})});var s=r.length/2;if(s>n.length){for(var u=0;ui&&(i=o),i},o.numberOfLabelLines=function(t){var e=1;return o.each(t,function(t){o.isArray(t)&&t.length>e&&(e=t.length)}),e},o.drawRoundedRectangle=function(t,e,n,i,a,o){t.beginPath(),t.moveTo(e+o,n),t.lineTo(e+i-o,n),t.quadraticCurveTo(e+i,n,e+i,n+o),t.lineTo(e+i,n+a-o),t.quadraticCurveTo(e+i,n+a,e+i-o,n+a),t.lineTo(e+o,n+a),t.quadraticCurveTo(e,n+a,e,n+a-o),t.lineTo(e,n+o),t.quadraticCurveTo(e,n,e+o,n),t.closePath()},o.color=i?function(e){return e instanceof CanvasGradient&&(e=t.defaults.global.defaultColor),i(e)}:function(t){return console.error("Color.js not found!"),t},o.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},o.arrayEquals=function(t,e){var n,i,a,r;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n0&&(l=t.getDatasetMeta(l[0]._datasetIndex).data),l},"x-axis":function(t,e){return o(t,e,!0)},point:function(t,n){var a=e(n,t);return i(t,a)},nearest:function(t,n,i){var o=e(n,t),r=a(t,o,i.intersect);return r.length>1&&r.sort(function(t,e){var n=t.getArea(),i=e.getArea(),a=n-i;return 0===a&&(a=t._datasetIndex-e._datasetIndex),a}),r.slice(0,1)},x:function(t,i,a){var o=e(i,t),r=[],l=!1;return n(t,function(t){t.inXRange(o.x)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),a.intersect&&!l&&(r=[]),r},y:function(t,i,a){var o=e(i,t),r=[],l=!1;return n(t,function(t){t.inYRange(o.y)&&r.push(t),t.inRange(o.x,o.y)&&(l=!0)}),a.intersect&&!l&&(r=[]),r}}}}},{}],28:[function(t,e,n){"use strict";e.exports=function(){var t=function(t,e){return this.construct(t,e),this};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('
    ');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push("
"),e.join("")}}},t.Chart=t,t}},{}],29:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return i.where(t,function(t){return t.position===e})}function n(t,e){t.forEach(function(t,e){return t._tmpIndex_=e,t}),t.sort(function(t,n){var i=e?n:t,a=e?t:n;return i.weight===a.weight?i._tmpIndex_-a._tmpIndex_:i.weight-a.weight}),t.forEach(function(t){delete t._tmpIndex_})}var i=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),e.fullWidth=e.fullWidth||!1,e.position=e.position||"top",e.weight=e.weight||0,t.boxes.push(e)},removeBox:function(t,e){var n=t.boxes?t.boxes.indexOf(e):-1;n!==-1&&t.boxes.splice(n,1)},configure:function(t,e,n){for(var i,a=["fullWidth","position","weight"],o=a.length,r=0;rc&&rt.maxHeight){r--;break}r++,d=l*u}t.labelRotation=r},afterCalculateTickRotation:function(){i.callback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){i.callback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},o=t.options,r=o.ticks,l=o.scaleLabel,s=o.gridLines,u=o.display,d=t.isHorizontal(),c=n(r),h=1.5*n(l).size,f=o.gridLines.tickMarkLength;if(d?a.width=t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:a.width=u&&s.drawTicks?f:0,d?a.height=u&&s.drawTicks?f:0:a.height=t.maxHeight,l.display&&u&&(d?a.height+=h:a.width+=h),r.display&&u){var g=i.longestText(t.ctx,c.font,t.ticks,t.longestTextCache),p=i.numberOfLabelLines(t.ticks),m=.5*c.size;if(d){t.longestLabelWidth=g;var v=i.toRadians(t.labelRotation),b=Math.cos(v),x=Math.sin(v),y=x*g+c.size*p+m*p;a.height=Math.min(t.maxHeight,a.height+y),t.ctx.font=c.font;var k=t.ticks[0],w=e(t.ctx,k,c.font),M=t.ticks[t.ticks.length-1],S=e(t.ctx,M,c.font);0!==t.labelRotation?(t.paddingLeft="bottom"===o.position?b*w+3:b*m+3,t.paddingRight="bottom"===o.position?b*m+3:b*S+3):(t.paddingLeft=w/2+3,t.paddingRight=S/2+3)}else r.mirror?g=0:g+=t.options.ticks.padding,a.width=Math.min(t.maxWidth,a.width+g),t.paddingTop=c.size/2,t.paddingBottom=c.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){i.callback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){return null===t||"undefined"==typeof t?NaN:"number"!=typeof t||isFinite(t)?"object"==typeof t?t instanceof Date||t.isValid?t:this.getRightValue(this.isHorizontal()?t.x:t.y):t:NaN},getLabelForIndex:i.noop,getPixelForValue:i.noop,getValueForPixel:i.noop,getPixelForTick:function(t,e){var n=this;if(n.isHorizontal()){var i=n.width-(n.paddingLeft+n.paddingRight),a=i/Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),o=a*t+n.paddingLeft;e&&(o+=a/2);var r=n.left+Math.round(o);return r+=n.isFullWidth()?n.margins.left:0}var l=n.height-(n.paddingTop+n.paddingBottom);return n.top+t*(l/(n.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=e.width-(e.paddingLeft+e.paddingRight),i=n*t+e.paddingLeft,a=e.left+Math.round(i);return a+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},draw:function(e){var a=this,o=a.options;if(o.display){var r,l,s=a.ctx,u=t.defaults.global,d=o.ticks,c=o.gridLines,h=o.scaleLabel,f=0!==a.labelRotation,g=d.autoSkip,p=a.isHorizontal();d.maxTicksLimit&&(l=d.maxTicksLimit);var m=i.getValueOrDefault(d.fontColor,u.defaultFontColor),v=n(d),b=c.drawTicks?c.tickMarkLength:0,x=i.getValueOrDefault(h.fontColor,u.defaultFontColor),y=n(h),k=i.toRadians(a.labelRotation),w=Math.cos(k),M=a.longestLabelWidth*w;s.fillStyle=m;var S=[];if(p){if(r=!1,(M+d.autoSkipPadding)*a.ticks.length>a.width-(a.paddingLeft+a.paddingRight)&&(r=1+Math.floor((M+d.autoSkipPadding)*a.ticks.length/(a.width-(a.paddingLeft+a.paddingRight)))),l&&a.ticks.length>l)for(;!r||a.ticks.length/(r||1)>l;)r||(r=1),r+=1;g||(r=!1)}var C="right"===o.position?a.left:a.right-b,D="right"===o.position?a.left+b:a.right,I="bottom"===o.position?a.top:a.bottom-b,A="bottom"===o.position?a.top+b:a.bottom;if(i.each(a.ticks,function(t,n){if(void 0!==t&&null!==t){var l=a.ticks.length===n+1,s=r>1&&n%r>0||n%r===0&&n+r>=a.ticks.length;if((!s||l)&&void 0!==t&&null!==t){var h,g,m,v;n===("undefined"!=typeof a.zeroLineIndex?a.zeroLineIndex:0)?(h=c.zeroLineWidth,g=c.zeroLineColor,m=c.zeroLineBorderDash,v=c.zeroLineBorderDashOffset):(h=i.getValueAtIndexOrDefault(c.lineWidth,n),g=i.getValueAtIndexOrDefault(c.color,n),m=i.getValueOrDefault(c.borderDash,u.borderDash),v=i.getValueOrDefault(c.borderDashOffset,u.borderDashOffset));var x,y,w,M,P,_,T,F,R,L,V="middle",O="middle";if(p){"bottom"===o.position?(O=f?"middle":"top",V=f?"right":"center",L=a.top+b):(O=f?"middle":"bottom",V=f?"left":"center",L=a.bottom-b);var z=a.getPixelForTick(n)+i.aliasPixel(h);R=a.getPixelForTick(n,c.offsetGridLines)+d.labelOffset,x=w=P=T=z,y=I,M=A,_=e.top,F=e.bottom}else{var B,W="left"===o.position,N=d.padding;d.mirror?(V=W?"left":"right",B=N):(V=W?"right":"left", +B=b+N),R=W?a.right-B:a.left+B;var E=a.getPixelForTick(n);E+=i.aliasPixel(h),L=a.getPixelForTick(n,c.offsetGridLines),x=C,w=D,P=e.left,T=e.right,y=M=_=F=E}S.push({tx1:x,ty1:y,tx2:w,ty2:M,x1:P,y1:_,x2:T,y2:F,labelX:R,labelY:L,glWidth:h,glColor:g,glBorderDash:m,glBorderDashOffset:v,rotation:-1*k,label:t,textBaseline:O,textAlign:V})}}}),i.each(S,function(t){if(c.display&&(s.save(),s.lineWidth=t.glWidth,s.strokeStyle=t.glColor,s.setLineDash&&(s.setLineDash(t.glBorderDash),s.lineDashOffset=t.glBorderDashOffset),s.beginPath(),c.drawTicks&&(s.moveTo(t.tx1,t.ty1),s.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(s.moveTo(t.x1,t.y1),s.lineTo(t.x2,t.y2)),s.stroke(),s.restore()),d.display){s.save(),s.translate(t.labelX,t.labelY),s.rotate(t.rotation),s.font=v.font,s.textBaseline=t.textBaseline,s.textAlign=t.textAlign;var e=t.label;if(i.isArray(e))for(var n=0,a=0;n0)i=t.stepSize;else{var o=e.niceNum(n.max-n.min,!1);i=e.niceNum(o/(t.maxTicks-1),!0)}var r=Math.floor(n.min/i)*i,l=Math.ceil(n.max/i)*i;t.min&&t.max&&t.stepSize&&e.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(r=t.min,l=t.max);var s=(l-r)/i;s=e.almostEquals(s,Math.round(s),i/1e3)?Math.round(s):Math.ceil(s),a.push(void 0!==t.min?t.min:r);for(var u=1;u3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var o=e.log10(Math.abs(a)),r="";if(0!==t){var l=-1*Math.floor(o);l=Math.max(Math.min(l,20),0),r=t.toFixed(l)}else r="0";return r},logarithmic:function(t,n,i){var a=t/Math.pow(10,Math.floor(e.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===n||n===i.length-1?t.toExponential():""}}}}},{}],34:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=s.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(s.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function i(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):"",yLabel:n?n.getLabelForIndex(i,a):"",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function a(e){var n=t.defaults.global,i=s.getValueOrDefault;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,bodyFontColor:e.bodyFontColor,_bodyFontFamily:i(e.bodyFontFamily,n.defaultFontFamily),_bodyFontStyle:i(e.bodyFontStyle,n.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:i(e.bodyFontSize,n.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:i(e.titleFontFamily,n.defaultFontFamily),_titleFontStyle:i(e.titleFontStyle,n.defaultFontStyle),titleFontSize:i(e.titleFontSize,n.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing,titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:i(e.footerFontFamily,n.defaultFontFamily),_footerFontStyle:i(e.footerFontStyle,n.defaultFontStyle),footerFontSize:i(e.footerFontSize,n.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors,borderColor:e.borderColor,borderWidth:e.borderWidth}}function o(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,o=e.body,r=o.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);r+=e.beforeBody.length+e.afterBody.length;var l=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=l*d,i+=l?(l-1)*e.titleSpacing:0,i+=l?e.titleMarginBottom:0,i+=r*c,i+=r?(r-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=s.fontString(d,e._titleFontStyle,e._titleFontFamily),s.each(e.title,g),n.font=s.fontString(c,e._bodyFontStyle,e._bodyFontFamily),s.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,s.each(o,function(t){s.each(t.before,g),s.each(t.lines,g),s.each(t.after,g)}),f=0,n.font=s.fontString(h,e._footerFontStyle,e._footerFontFamily),s.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function r(t,e){var n=t._model,i=t._chart,a=t._chart.chartArea,o="center",r="center";n.yi.height-e.height&&(r="bottom");var l,s,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===r?(l=function(t){return t<=h},s=function(t){return t>h}):(l=function(t){return t<=e.width/2},s=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},l(n.x)?(o="left",u(n.x)&&(o="center",r=c(n.y))):s(n.x)&&(o="right",d(n.x)&&(o="center",r=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:o,yAlign:g.yAlign?g.yAlign:r}}function l(t,e,n){var i=t.x,a=t.y,o=t.caretSize,r=t.caretPadding,l=t.cornerRadius,s=n.xAlign,u=n.yAlign,d=o+r,c=l+r;return"right"===s?i-=e.width:"center"===s&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===s?i+=d:"right"===s&&(i-=d):"left"===s?i-=c:"right"===s&&(i+=c),{x:i,y:a}}var s=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretPadding:2,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,borderColor:"rgba(0,0,0,0)",borderWidth:0,callbacks:{beforeTitle:s.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var o=t[0];o.xLabel?n=o.xLabel:a>0&&o.index0&&i.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,o=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&o&&(this.drawBackground(i,e,t,n,a),i.x+=e.xPadding,i.y+=e.yPadding,this.drawTitle(i,e,t,a),this.drawBody(i,e,t,a),this.drawFooter(i,e,t,a))}},handleEvent:function(t){var e=this,n=e._options,i=!1;if(e._lastActive=e._lastActive||[],"mouseout"===t.type?e._active=[]:e._active=e._chart.getElementsAtEventForMode(t,n.mode,n),i=!s.arrayEquals(e._active,e._lastActive),!i)return!1;if(e._lastActive=e._active,n.enabled||n.custom){e._eventPosition={x:t.x,y:t.y};var a=e._model;e.update(!0),e.pivot(),i|=a.x!==e._model.x||a.y!==e._model.y}return i}}),t.Tooltip.positioners={average:function(t){if(!t.length)return!1;var e,n,i=0,a=0,o=0;for(e=0,n=t.length;es;)o-=2*Math.PI;for(;o=l&&o<=s,d=r>=i.innerRadius&&r<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],36:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:n.defaultColor,borderWidth:3,borderColor:n.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0},t.elements.Line=t.Element.extend({draw:function(){var t,i,a,o,r=this,l=r._view,s=r._chart.ctx,u=l.spanGaps,d=r._children.slice(),c=n.elements.line,h=-1;for(r._loop&&d.length&&d.push(d[0]),s.save(),s.lineCap=l.borderCapStyle||c.borderCapStyle,s.setLineDash&&s.setLineDash(l.borderDash||c.borderDash),s.lineDashOffset=l.borderDashOffset||c.borderDashOffset,s.lineJoin=l.borderJoinStyle||c.borderJoinStyle,s.lineWidth=l.borderWidth||c.borderWidth,s.strokeStyle=l.borderColor||n.defaultColor,s.beginPath(),h=-1,t=0;te?1:-1,r=1,l=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,a=u.base,o=1,r=a>i?1:-1,l=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a));d=d>c?c:d;var h=d/2,f=e+("left"!==l?h*o:0),g=n+("right"!==l?-h*o:0),p=i+("top"!==l?h*r:0),m=a+("bottom"!==l?-h*r:0);f!==g&&(i=p,a=m),p!==m&&(e=f,n=g)}s.beginPath(),s.fillStyle=u.backgroundColor,s.strokeStyle=u.borderColor,s.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"],x=b.indexOf(l,0);x===-1&&(x=0);var y=t(0);s.moveTo(y[0],y[1]);for(var k=1;k<4;k++)y=t(k),s.lineTo(y[0],y[1]);s.fill(),d&&s.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var a=n(this);i=t>=a.left&&t<=a.right&&e>=a.top&&e<=a.bottom}return i},inLabelRange:function(t,i){var a=this;if(!a._view)return!1;var o=!1,r=n(a);return o=e(a)?t>=r.left&&t<=r.right:i>=r.top&&i<=r.bottom},inXRange:function(t){var e=n(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=n(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,n,i=this._view;return e(this)?(t=i.x,n=(i.y+i.base)/2):(t=(i.x+i.base)/2,n=i.y),{x:t,y:n}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],39:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=s.getStyle(t,e),i=n&&n.match(/^(\d+)(\.\d+)?px$/);return i?Number(i[1]):void 0}function n(t,n){var i=t.style,a=t.getAttribute("height"),o=t.getAttribute("width");if(t._chartjs={initial:{height:a,width:o,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===o||""===o){var r=e(t,"width");void 0!==r&&(t.width=r)}if(null===a||""===a)if(""===t.style.height)t.height=t.width/(n.options.aspectRatio||2);else{var l=e(t,"height");void 0!==r&&(t.height=l)}return t}function i(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function a(t,e){var n=u[t.type]||t.type,a=s.getRelativePosition(t,e);return i(n,e,a.x,a.y,t)}function o(t){var e=document.createElement("iframe");return e.className="chartjs-hidden-iframe",e.style.cssText="display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;",e.tabIndex=-1,s.addEvent(e,"load",function(){s.addEvent(e.contentWindow||e,"resize",t),t()}),e}function r(t,e,n){var a=t._chartjs={ticking:!1},r=function(){a.ticking||(a.ticking=!0,s.requestAnimFrame.call(window,function(){if(a.resizer)return a.ticking=!1,e(i("resize",n))}))};a.resizer=o(r),t.insertBefore(a.resizer,t.firstChild)}function l(t){if(t&&t._chartjs){var e=t._chartjs.resizer;e&&(e.parentNode.removeChild(e),t._chartjs.resizer=null),delete t._chartjs}}var s=t.helpers,u={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};return{acquireContext:function(t,e){"string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas);var i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(n(t,e),i):null},releaseContext:function(t){var e=t.canvas;if(e._chartjs){var n=e._chartjs.initial;["height","width"].forEach(function(t){var i=n[t];void 0===i||null===i?e.removeAttribute(t):e.setAttribute(t,i)}),s.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e._chartjs}},addEventListener:function(t,e,n){var i=t.canvas;if("resize"===e)return void r(i.parentNode,n,t);var o=n._chartjs||(n._chartjs={}),l=o.proxies||(o.proxies={}),u=l[t.id+"_"+e]=function(e){n(a(e,t))};s.addEvent(i,e,u)},removeEventListener:function(t,e,n){var i=t.canvas;if("resize"===e)return void l(i.parentNode,n);var a=n._chartjs||{},o=a.proxies||{},r=o[t.id+"_"+e];r&&s.removeEvent(i,e,r)}}}},{}],40:[function(t,e,n){"use strict";var i=t(39);e.exports=function(t){t.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},t.helpers.extend(t.platform,i(t))}},{39:39}],41:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e,n){var i,a=t._model||{},o=a.fill;if(void 0===o&&(o=!!a.backgroundColor),o===!1||null===o)return!1;if(o===!0)return"origin";if(i=parseFloat(o,10),isFinite(i)&&Math.floor(i)===i)return"-"!==o[0]&&"+"!==o[0]||(i=e+i),!(i===e||i<0||i>=n)&&i;switch(o){case"bottom":return"start";case"top":return"end";case"zero":return"origin";case"origin":case"start":case"end":return o;default:return!1}}function n(t){var e,n=t.el._model||{},i=t.el._scale||{},a=t.fill,o=null;if(isFinite(a))return null;if("start"===a?o=void 0===n.scaleBottom?i.bottom:n.scaleBottom:"end"===a?o=void 0===n.scaleTop?i.top:n.scaleTop:void 0!==n.scaleZero?o=n.scaleZero:i.getBasePosition?o=i.getBasePosition():i.getBasePixel&&(o=i.getBasePixel()),void 0!==o&&null!==o){if(void 0!==o.x&&void 0!==o.y)return o;if("number"==typeof o&&isFinite(o))return e=i.isHorizontal(),{x:e?o:null,y:e?null:o}}return null}function i(t,e,n){var i,a=t[e],o=a.fill,r=[e];if(!n)return o;for(;o!==!1&&r.indexOf(o)===-1;){if(!isFinite(o))return o;if(i=t[o],!i)return!1;if(i.visible)return o;r.push(o),o=i.fill}return!1}function a(t){var e=t.fill,n="dataset";return e===!1?null:(isFinite(e)||(n="boundary"),d[n](t))}function o(t){return t&&!t.skip}function r(t,e,n,i,a){var o;if(i&&a){for(t.moveTo(e[0].x,e[0].y),o=1;o0;--o)u.canvas.lineTo(t,n[o],n[o-1],!0)}}function l(t,e,n,i,a,l){var s,u,d,c,h,f,g,p=e.length,m=i.spanGaps,v=[],b=[],x=0,y=0;for(t.beginPath(),s=0,u=p+!!l;s=n.width&&(b+=d+o.padding,v[v.length]=n.left),g[i]={left:0,top:0,width:r,height:d},v[v.length-1]+=r+o.padding}),p.height+=b}else{var x=o.padding,y=n.columnWidths=[],k=o.padding,w=0,M=0,S=d+x;i.each(n.legendItems,function(t,n){var i=e(o,d),a=i+d/2+l.measureText(t.text).width;M+S>p.height&&(k+=w+o.padding,y.push(w),w=0,M=0),w=Math.max(w,a),M+=S,g[n]={left:0,top:0,width:a,height:d}}),k+=w,y.push(w),p.width+=k}n.width=p.width,n.height=p.height},afterFit:o,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var n=this,a=n.options,o=a.labels,r=t.defaults.global,l=r.elements.line,s=n.width,u=n.lineWidths;if(a.display){var d,c=n.ctx,h=i.getValueOrDefault,f=h(o.fontColor,r.defaultFontColor),g=h(o.fontSize,r.defaultFontSize),p=h(o.fontStyle,r.defaultFontStyle),m=h(o.fontFamily,r.defaultFontFamily),v=i.fontString(g,p,m);c.textAlign="left",c.textBaseline="top",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=e(o,g),x=n.legendHitBoxes,y=function(e,n,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,r.defaultColor),c.lineCap=h(i.lineCap,l.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,l.borderDashOffset),c.lineJoin=h(i.lineJoin,l.borderJoinStyle),c.lineWidth=h(i.lineWidth,l.borderWidth),c.strokeStyle=h(i.strokeStyle,r.defaultColor);var o=0===h(i.lineWidth,l.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,l.borderDash)),a.labels&&a.labels.usePointStyle){var s=g*Math.SQRT2/2,u=s/Math.SQRT2,d=e+u,f=n+u;t.canvasHelpers.drawPoint(c,i.pointStyle,s,d,f)}else o||c.strokeRect(e,n,b,g),c.fillRect(e,n,b,g);c.restore()}},k=function(t,e,n,i){c.fillText(n.text,b+g/2+t,e),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(b+g/2+t,e+g/2),c.lineTo(b+g/2+t+i,e+g/2),c.stroke())},w=n.isHorizontal();d=w?{x:n.left+(s-u[0])/2,y:n.top+o.padding,line:0}:{x:n.left+o.padding,y:n.top+o.padding,line:0};var M=g+o.padding;i.each(n.legendItems,function(t,e){var i=c.measureText(t.text).width,a=b+g/2+i,r=d.x,l=d.y;w?r+a>=s&&(l=d.y+=M,d.line++,r=d.x=n.left+(s-u[d.line])/2):l+M>n.bottom&&(r=d.x=r+n.columnWidths[d.line]+o.padding,l=d.y=n.top+o.padding,d.line++),y(r,l,t),x[e].left=r,x[e].top=l,k(r,l,t,i),w?d.x+=a+o.padding:d.y+=M})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var o=t.x,r=t.y;if(o>=e.left&&o<=e.right&&r>=e.top&&r<=e.bottom)for(var l=e.legendHitBoxes,s=0;s=u.left&&o<=u.left+u.width&&r>=u.top&&r<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[s]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[s]),a=!0;break}}}return a}}),{id:"legend",beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(e){var o=e.options.legend,r=e.legend;o?(o=i.configMerge(t.defaults.global.legend,o),r?(a.configure(e,r,o),r.options=o):n(e,o)):r&&(a.removeBox(e,r),delete e.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}}}},{}],43:[function(t,e,n){"use strict";e.exports=function(t){function e(e,n){var a=new t.Title({ctx:e.ctx,options:n,chart:e});i.configure(e,a,n),i.addBox(e,a),e.titleBlock=a}var n=t.helpers,i=t.layoutService,a=n.noop;return t.defaults.global.title={display:!1,position:"top",fullWidth:!0,weight:2e3,fontStyle:"bold",padding:10,text:""},t.Title=t.Element.extend({initialize:function(t){var e=this;n.extend(e,t),e.legendHitBoxes=[]; +},beforeUpdate:a,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:a,afterBuildLabels:a,beforeFit:a,fit:function(){var e=this,i=n.getValueOrDefault,a=e.options,o=t.defaults.global,r=a.display,l=i(a.fontSize,o.defaultFontSize),s=e.minSize;e.isHorizontal()?(s.width=e.maxWidth,s.height=r?l+2*a.padding:0):(s.width=r?l+2*a.padding:0,s.height=e.maxHeight),e.width=s.width,e.height=s.height},afterFit:a,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var e=this,i=e.ctx,a=n.getValueOrDefault,o=e.options,r=t.defaults.global;if(o.display){var l,s,u,d=a(o.fontSize,r.defaultFontSize),c=a(o.fontStyle,r.defaultFontStyle),h=a(o.fontFamily,r.defaultFontFamily),f=n.fontString(d,c,h),g=0,p=e.top,m=e.left,v=e.bottom,b=e.right;i.fillStyle=a(o.fontColor,r.defaultFontColor),i.font=f,e.isHorizontal()?(l=m+(b-m)/2,s=p+(v-p)/2,u=b-m):(l="left"===o.position?m+d/2:b-d/2,s=p+(v-p)/2,u=v-p,g=Math.PI*("left"===o.position?-.5:.5)),i.save(),i.translate(l,s),i.rotate(g),i.textAlign="center",i.textBaseline="middle",i.fillText(o.text,0,0,u),i.restore()}}}),{id:"title",beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(a){var o=a.options.title,r=a.titleBlock;o?(o=n.configMerge(t.defaults.global.title,o),r?(i.configure(a,r,o),r.options=o):e(a,o)):r&&(t.layoutService.removeBox(a,r),delete a.titleBlock)}}}},{}],44:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"bottom"},i=t.Scale.extend({getLabels:function(){var t=this.chart.data;return(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,n=t.getLabels();t.minIndex=0,t.maxIndex=n.length-1;var i;void 0!==t.options.ticks.min&&(i=e.indexOf(n,t.options.ticks.min),t.minIndex=i!==-1?i:t.minIndex),void 0!==t.options.ticks.max&&(i=e.indexOf(n,t.options.ticks.max),t.maxIndex=i!==-1?i:t.maxIndex),t.min=n[t.minIndex],t.max=n[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e,n,i){var a,o=this,r=Math.max(o.maxIndex+1-o.minIndex-(o.options.gridLines.offsetGridLines?0:1),1);if(void 0!==t&&null!==t&&(a=o.isHorizontal()?t.x:t.y),void 0!==a||void 0!==t&&isNaN(e)){var l=o.getLabels();t=a||t;var s=l.indexOf(t);e=s!==-1?s:e}if(o.isHorizontal()){var u=o.width/r,d=u*(e-o.minIndex);return(o.options.gridLines.offsetGridLines&&i||o.maxIndex===o.minIndex&&i)&&(d+=u/2),o.left+Math.round(d)}var c=o.height/r,h=c*(e-o.minIndex);return o.options.gridLines.offsetGridLines&&i&&(h+=c/2),o.top+Math.round(h)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,n=this,i=Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),a=n.isHorizontal(),o=(a?n.width:n.height)/i;return t-=a?n.left:n.top,n.options.gridLines.offsetGridLines&&(t-=o/2),e=t<=0?0:Math.round(t/o)},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",i,n)}},{}],45:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return l?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=n.chart,o=a.data,r=o.datasets,l=n.isHorizontal(),s=0,u=1;n.min=null,n.max=null;var d=i.stacked;if(void 0===d&&e.each(r,function(e,n){if(!d){var i=a.getDatasetMeta(n);a.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(r,function(o,r){var l=a.getDatasetMeta(r),s=[l.type,void 0===i.stacked&&void 0===l.stack?r:"",l.stack].join(".");void 0===c[s]&&(c[s]={positiveValues:[],negativeValues:[]});var u=c[s].positiveValues,d=c[s].negativeValues;a.isDatasetVisible(r)&&t(l)&&e.each(o.data,function(t,e){var a=+n.getRightValue(t);isNaN(a)||l.data[e].hidden||(u[e]=u[e]||0,d[e]=d[e]||0,i.relativePoints?u[e]=100:a<0?d[e]+=a:u[e]+=a)})}),e.each(c,function(t){var i=t.positiveValues.concat(t.negativeValues),a=e.min(i),o=e.max(i);n.min=null===n.min?a:Math.min(n.min,a),n.max=null===n.max?o:Math.max(n.max,o)})}else e.each(r,function(i,o){var r=a.getDatasetMeta(o);a.isDatasetVisible(o)&&t(r)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===n.min?n.min=i:in.max&&(n.max=i))})});n.min=isFinite(n.min)?n.min:s,n.max=isFinite(n.max)?n.max:u,this.handleTickRangeOptions()},getTickLimit:function(){var n,i=this,a=i.options.ticks;if(i.isHorizontal())n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.width/50));else{var o=e.getValueOrDefault(a.fontSize,t.defaults.global.defaultFontSize);n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.height/(2*o)))}return n},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),o=n.end-i;return n.isHorizontal()?(e=n.left+n.width/o*(a-i),Math.round(e)):(e=n.bottom-n.height/o*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,n)}},{}],46:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,n=t.options,i=n.ticks;if(i.beginAtZero){var a=e.sign(t.min),o=e.sign(t.max);a<0&&o<0?t.max=0:a>0&&o>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(null===t.min?t.min=i.suggestedMin:t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(null===t.max?t.max=i.suggestedMax:t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:n,handleDirectionalChanges:n,buildTicks:function(){var n=this,i=n.options,a=i.ticks,o=n.getTickLimit();o=Math.max(2,o);var r={maxTicks:o,min:a.min,max:a.max,stepSize:e.getValueOrDefault(a.fixedStepSize,a.stepSize)},l=n.ticks=t.Ticks.generators.linear(r,n);n.handleDirectionalChanges(),n.max=e.max(l),n.min=e.min(l),a.reverse?(l.reverse(),n.start=n.max,n.end=n.min):(n.start=n.min,n.end=n.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],47:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return u?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=i.ticks,o=n.chart,r=o.data,l=r.datasets,s=e.getValueOrDefault,u=n.isHorizontal();n.min=null,n.max=null,n.minNotZero=null;var d=i.stacked;if(void 0===d&&e.each(l,function(e,n){if(!d){var i=o.getDatasetMeta(n);o.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(l,function(a,r){var l=o.getDatasetMeta(r),s=[l.type,void 0===i.stacked&&void 0===l.stack?r:"",l.stack].join(".");o.isDatasetVisible(r)&&t(l)&&(void 0===c[s]&&(c[s]=[]),e.each(a.data,function(t,e){var a=c[s],o=+n.getRightValue(t);isNaN(o)||l.data[e].hidden||(a[e]=a[e]||0,i.relativePoints?a[e]=100:a[e]+=o)}))}),e.each(c,function(t){var i=e.min(t),a=e.max(t);n.min=null===n.min?i:Math.min(n.min,i),n.max=null===n.max?a:Math.max(n.max,a)})}else e.each(l,function(i,a){var r=o.getDatasetMeta(a);o.isDatasetVisible(a)&&t(r)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||r.data[e].hidden||(null===n.min?n.min=i:in.max&&(n.max=i),0!==i&&(null===n.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function o(t){var o,r,l,s=n(t),u=Math.min(t.height/2,t.width/2),d={r:t.width,l:0,t:t.height,b:0},c={};t.ctx.font=s.font,t._pointLabelSizes=[];var h=e(t);for(o=0;od.r&&(d.r=m.end,c.r=g),v.startd.b&&(d.b=v.end,c.b=g)}t.setReductions(u,d,c)}function r(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function l(t){return 0===t||180===t?"center":t<180?"left":"right"}function s(t,e,n,i){if(f.isArray(e))for(var a=n.y,o=1.5*i,r=0;r270||t<90)&&(n.y-=e.h)}function d(t){var i=t.ctx,a=f.getValueOrDefault,o=t.options,r=o.angleLines,d=o.pointLabels;i.lineWidth=r.lineWidth,i.strokeStyle=r.color;var c=t.getDistanceFromCenterForValue(o.reverse?t.min:t.max),h=n(t);i.textBaseline="top";for(var p=e(t)-1;p>=0;p--){if(r.display){var m=t.getPointPosition(p,c);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(m.x,m.y),i.stroke(),i.closePath()}if(d.display){var v=t.getPointPosition(p,c+5),b=a(d.fontColor,g.defaultFontColor);i.font=h.font,i.fillStyle=b;var x=t.getIndexAngle(p),y=f.toDegrees(x);i.textAlign=l(y),u(y,t._pointLabelSizes[p],v),s(i,t.pointLabels[p]||"",v,h.size)}}}function c(t,n,i,a){var o=t.ctx;if(o.strokeStyle=f.getValueAtIndexOrDefault(n.color,a-1),o.lineWidth=f.getValueAtIndexOrDefault(n.lineWidth,a-1),t.options.gridLines.circular)o.beginPath(),o.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),o.closePath(),o.stroke();else{var r=e(t);if(0===r)return;o.beginPath();var l=t.getPointPosition(0,i);o.moveTo(l.x,l.y);for(var s=1;s0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,a=f.getValueOrDefault;if(e.display){var o=t.ctx,r=a(i.fontSize,g.defaultFontSize),l=a(i.fontStyle,g.defaultFontStyle),s=a(i.fontFamily,g.defaultFontFamily),u=f.fontString(r,l,s);f.each(t.ticks,function(l,s){if(s>0||e.reverse){var d=t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]),h=t.yCenter-d;if(n.display&&0!==s&&c(t,n,d,s),i.display){var f=a(i.fontColor,g.defaultFontColor);if(o.font=u,i.showLabelBackdrop){var p=o.measureText(l).width;o.fillStyle=i.backdropColor,o.fillRect(t.xCenter-p/2-i.backdropPaddingX,h-r/2-i.backdropPaddingY,p+2*i.backdropPaddingX,r+2*i.backdropPaddingY)}o.textAlign="center",o.textBaseline="middle",o.fillStyle=f,o.fillText(l,t.xCenter,h)}}}),(e.angleLines.display||e.pointLabels.display)&&d(t)}}});t.scaleService.registerScaleType("radialLinear",m,p)}},{}],49:[function(t,e,n){"use strict";var i=t(1);i="function"==typeof i?i:window.moment,e.exports=function(t){function e(t,e){var n=t.options.time;if("string"==typeof n.parser)return i(e,n.parser);if("function"==typeof n.parser)return n.parser(e);if("function"==typeof e.getMonth||"number"==typeof e)return i(e);if(e.isValid&&e.isValid())return e;var a=n.format;return"string"!=typeof a&&a.call?(console.warn("options.time.format is deprecated and replaced by options.time.parser."),a(e)):i(e,a)}function n(t,e,n,i){for(var a,o=Object.keys(l),r=o.length,s=o.indexOf(t);si;c++)s=a.steps[c],r=Math.ceil(u/(o*s));else for(;r>i&&i>0;)++s,r=Math.ceil(u/(o*s));return s}function o(t,e,n){var a=[];if(t.maxTicks){var o=t.stepSize;a.push(void 0!==t.min?t.min:n.min);for(var r=i(n.min);r.add(o,t.unit).valueOf()0&&a.add(1,"week"),a=a.valueOf()):(n=i(e.min).startOf(t.unit).valueOf(),a=i(e.max).startOf(t.unit),e.max-a>0&&a.add(1,t.unit),a=a.valueOf()),o(t,e,{min:n,max:a})};var u=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},determineDataLimits:function(){var t,n=this,i=n.options.time,a=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER,l=n.chart.data,s={labels:[],datasets:[]};r.each(l.labels,function(r,l){var u=e(n,r);u.isValid()&&(i.round&&u.startOf(i.round),t=u.valueOf(),a=Math.min(t,a),o=Math.max(t,o),s.labels[l]=t)}),r.each(l.datasets,function(l,u){var d=[];"object"==typeof l.data[0]&&null!==l.data[0]&&n.chart.isDatasetVisible(u)?r.each(l.data,function(r,l){var s=e(n,n.getRightValue(r));s.isValid()&&(i.round&&s.startOf(i.round),t=s.valueOf(),a=Math.min(t,a),o=Math.max(t,o),d[l]=t)}):d=s.labels.slice(),s.datasets[u]=d}),n.dataMin=a,n.dataMax=o,n._parsedData=s},buildTicks:function(){var i,o,l=this,s=l.options.time,u=l.dataMin,d=l.dataMax;if(s.min){var c=e(l,s.min);s.round&&c.round(s.round),i=c.valueOf()}s.max&&(o=e(l,s.max).valueOf());var h=l.getLabelCapacity(i||u),f=s.unit||n(s.minUnit,i||u,o||d,h);l.displayFormat=s.displayFormats[f];var g=s.stepSize||a(i||u,o||d,f,h);l.ticks=t.Ticks.generators.time({maxTicks:h,min:i,max:o,stepSize:g,unit:f,isoWeekday:s.isoWeekday},{min:u,max:d}),l.max=r.max(l.ticks),l.min=r.min(l.ticks)},getLabelForIndex:function(t,n){var i=this,a=i.chart.data.labels&&t - https://camwiegert.github.io/in-view + * License: MIT + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.inView=e():t.inView=e()}(this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,e),i.loaded=!0,i.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}var i=n(2),o=r(i);t.exports=o["default"]},function(t,e){function n(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}t.exports=n},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(e,"__esModule",{value:!0});var i=n(9),o=r(i),u=n(3),f=r(u),s=n(4),c=function(){if("undefined"!=typeof window){var t=100,e=["scroll","resize","load"],n={history:[]},r={offset:{},threshold:0,test:s.inViewport},i=(0,o["default"])(function(){n.history.forEach(function(t){n[t].check()})},t);e.forEach(function(t){return addEventListener(t,i)}),window.MutationObserver&&addEventListener("DOMContentLoaded",function(){new MutationObserver(i).observe(document.body,{attributes:!0,childList:!0,subtree:!0})});var u=function(t){if("string"==typeof t){var e=[].slice.call(document.querySelectorAll(t));return n.history.indexOf(t)>-1?n[t].elements=e:(n[t]=(0,f["default"])(e,r),n.history.push(t)),n[t]}};return u.offset=function(t){if(void 0===t)return r.offset;var e=function(t){return"number"==typeof t};return["top","right","bottom","left"].forEach(e(t)?function(e){return r.offset[e]=t}:function(n){return e(t[n])?r.offset[n]=t[n]:null}),r.offset},u.threshold=function(t){return"number"==typeof t&&t>=0&&t<=1?r.threshold=t:r.threshold},u.test=function(t){return"function"==typeof t?r.test=t:r.test},u.is=function(t){return r.test(t,r)},u.offset(0),u}};e["default"]=c()},function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n-1,o=n&&!i,u=!n&&i;o&&(t.current.push(e),t.emit("enter",e)),u&&(t.current.splice(r,1),t.emit("exit",e))}),this}},{key:"on",value:function(t,e){return this.handlers[t].push(e),this}},{key:"once",value:function(t,e){return this.singles[t].unshift(e),this}},{key:"emit",value:function(t,e){for(;this.singles[t].length;)this.singles[t].pop()(e);for(var n=this.handlers[t].length;--n>-1;)this.handlers[t][n](e);return this}}]),t}();e["default"]=function(t,e){return new i(t,e)}},function(t,e){"use strict";function n(t,e){var n=t.getBoundingClientRect(),r=n.top,i=n.right,o=n.bottom,u=n.left,f=n.width,s=n.height,c={t:o,r:window.innerWidth-u,b:window.innerHeight-r,l:i},a={x:e.threshold*f,y:e.threshold*s};return c.t>e.offset.top+a.y&&c.r>e.offset.right+a.x&&c.b>e.offset.bottom+a.y&&c.l>e.offset.left+a.x}Object.defineProperty(e,"__esModule",{value:!0}),e.inViewport=n},function(t,e){(function(e){var n="object"==typeof e&&e&&e.Object===Object&&e;t.exports=n}).call(e,function(){return this}())},function(t,e,n){var r=n(5),i="object"==typeof self&&self&&self.Object===Object&&self,o=r||i||Function("return this")();t.exports=o},function(t,e,n){function r(t,e,n){function r(e){var n=x,r=m;return x=m=void 0,E=e,w=t.apply(r,n)}function a(t){return E=t,j=setTimeout(h,e),M?r(t):w}function l(t){var n=t-O,r=t-E,i=e-n;return _?c(i,g-r):i}function d(t){var n=t-O,r=t-E;return void 0===O||n>=e||n<0||_&&r>=g}function h(){var t=o();return d(t)?p(t):void(j=setTimeout(h,l(t)))}function p(t){return j=void 0,T&&x?r(t):(x=m=void 0,w)}function v(){void 0!==j&&clearTimeout(j),E=0,x=O=m=j=void 0}function y(){return void 0===j?w:p(o())}function b(){var t=o(),n=d(t);if(x=arguments,m=this,O=t,n){if(void 0===j)return a(O);if(_)return j=setTimeout(h,e),r(O)}return void 0===j&&(j=setTimeout(h,e)),w}var x,m,g,w,j,O,E=0,M=!1,_=!1,T=!0;if("function"!=typeof t)throw new TypeError(f);return e=u(e)||0,i(n)&&(M=!!n.leading,_="maxWait"in n,g=_?s(u(n.maxWait)||0,e):g,T="trailing"in n?!!n.trailing:T),b.cancel=v,b.flush=y,b}var i=n(1),o=n(8),u=n(10),f="Expected a function",s=Math.max,c=Math.min;t.exports=r},function(t,e,n){var r=n(6),i=function(){return r.Date.now()};t.exports=i},function(t,e,n){function r(t,e,n){var r=!0,f=!0;if("function"!=typeof t)throw new TypeError(u);return o(n)&&(r="leading"in n?!!n.leading:r,f="trailing"in n?!!n.trailing:f),i(t,e,{leading:r,maxWait:e,trailing:f})}var i=n(7),o=n(1),u="Expected a function";t.exports=r},function(t,e){function n(t){return t}t.exports=n}])}); diff --git a/website/assets/js/main.js b/website/assets/js/main.js index 616fbb1df..42199538f 100644 --- a/website/assets/js/main.js +++ b/website/assets/js/main.js @@ -1,23 +1,324 @@ //- 💫 MAIN JAVASCRIPT +//- Note: Will be compiled using Babel before deployment. 'use strict' -{ - const nav = document.querySelector('.js-nav') - const fixedClass = 'is-fixed' - let vh, scrollY = 0, scrollUp = false +const $ = document.querySelector.bind(document); +const $$ = document.querySelectorAll.bind(document); - const updateVh = () => Math.max(document.documentElement.clientHeight, window.innerHeight || 0) - const updateNav = () => { - const vh = updateVh() - const newScrollY = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0) - if (newScrollY != scrollY) scrollUp = newScrollY <= scrollY - scrollY = newScrollY - - if(scrollUp && !(isNaN(scrollY) || scrollY <= vh)) nav.classList.add(fixedClass) - else if (!scrollUp || (isNaN(scrollY) || scrollY <= vh/2)) nav.classList.remove(fixedClass) +class ProgressBar { + /** + * Animated reading progress bar. + * @param {String} selector – CSS selector of progress bar element. + */ + constructor(selector) { + this.el = $(selector); + this.scrollY = 0; + this.sizes = this.updateSizes(); + this.el.setAttribute('max', 100); + this.init(); } - window.addEventListener('scroll', () => requestAnimationFrame(updateNav)) + init() { + window.addEventListener('scroll', () => { + this.scrollY = (window.pageYOffset || document.scrollTop) - (document.clientTop || 0); + requestAnimationFrame(this.update.bind(this)); + }, false); + window.addEventListener('resize', () => { + this.sizes = this.updateSizes(); + requestAnimationFrame(this.update.bind(this)); + }) + } + + update() { + const offset = 100 - ((this.sizes.height - this.scrollY - this.sizes.vh) / this.sizes.height * 100); + this.el.setAttribute('value', (this.scrollY == 0) ? 0 : offset || 0); + } + + updateSizes() { + const body = document.body; + const html = document.documentElement; + return { + height: Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight), + vh: Math.max(html.clientHeight, window.innerHeight || 0) + } + } +} + + +class SectionHighlighter { + /** + * Hightlight section in viewport in sidebar, using in-view library. + * @param {String} sectionAttr - Data attribute of sections. + * @param {String} navAttr - Data attribute of navigation items. + * @param {String} activeClass – Class name of active element. + */ + constructor(sectionAttr, navAttr, activeClass = 'is-active') { + this.sections = [...$$(`[${navAttr}]`)]; + this.navAttr = navAttr; + this.sectionAttr = sectionAttr; + this.activeClass = activeClass; + inView(`[${sectionAttr}]`).on('enter', this.highlightSection.bind(this)); + } + + highlightSection(section) { + const id = section.getAttribute(this.sectionAttr); + const el = $(`[${this.navAttr}="${id}"]`); + if (el) { + this.sections.forEach(el => el.classList.remove(this.activeClass)); + el.classList.add(this.activeClass); + } + } +} + + +class Templater { + /** + * Mini templating engine based on data attributes. Selects elements based + * on a data-tpl and data-tpl-key attribute and can set textContent + * and innterHtml. + * + * @param {String} templateId - Template section, e.g. value of data-tpl. + */ + constructor(templateId) { + this.templateId = templateId; + } + + get(key) { + return $(`[data-tpl="${this.templateId}"][data-tpl-key="${key}"]`); + } + + fill(key, value, html = false) { + const el = this.get(key); + if (html) el.innerHTML = value || ''; + else el.textContent = value || ''; + return el; + } +} + + +class ModelLoader { + /** + * Load model meta from GitHub and update model details on site. Uses the + * Templater mini template engine to update DOM. + * + * @param {String} repo - Path tp GitHub repository containing releases. + * @param {Array} models - List of model IDs, e.g. "en_core_web_sm". + * @param {Object} licenses - License IDs mapped to URLs. + * @param {Object} accKeys - Available accuracy keys mapped to display labels. + */ + constructor(repo, models = [], licenses = {}, accKeys = {}) { + this.url = `https://raw.githubusercontent.com/${repo}/master`; + this.repo = `https://github.com/${repo}`; + this.modelIds = models; + this.licenses = licenses; + this.accKeys = accKeys; + this.chartColor = '#09a3d5'; + this.chartOptions = { + type: 'bar', + options: { responsive: true, scales: { + yAxes: [{ label: 'Accuracy', ticks: { suggestedMin: 70 }}], + xAxes: [{ barPercentage: 0.425 }] + }} + } + Chart.defaults.global.legend.position = 'bottom'; + Chart.defaults.global.defaultFontFamily = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'"; + this.init(); + } + + init() { + this.modelIds.forEach(modelId => + new Templater(modelId).get('table').setAttribute('data-loading', '')); + fetch(`${this.url}/compatibility.json`) + .then(res => this.handleResponse(res)) + .then(json => json.ok ? this.getModels(json['spacy']) : this.modelIds.forEach(modelId => this.showError(modelId))) + } + + handleResponse(res) { + if (res.ok) return res.json().then(json => Object.assign({}, json, { ok: res.ok })) + else return ({ ok: res.ok }) + } + + getModels(compat) { + this.compat = compat; + for (let modelId of this.modelIds) { + const version = this.getLatestVersion(modelId, compat); + if (!version) { + this.showError(modelId); return; + } + fetch(`${this.url}/meta/${modelId}-${version}.json`) + .then(res => this.handleResponse(res)) + .then(json => json.ok ? this.render(json) : this.showError(modelId)) + } + // make sure scroll positions for progress bar etc. are recalculated + window.dispatchEvent(new Event('resize')); + } + + showError(modelId) { + const template = new Templater(modelId); + template.get('table').removeAttribute('data-loading'); + template.get('error').style.display = 'block'; + for (let key of ['sources', 'pipeline', 'author', 'license']) { + template.get(key).parentElement.parentElement.style.display = 'none'; + } + } + + /** + * Update model details in tables. Currently quite hacky :( + */ + render({ lang, name, version, sources, pipeline, url, author, license, accuracy, size, description, notes }) { + const modelId = `${lang}_${name}`; + const model = `${modelId}-${version}`; + const template = new Templater(modelId); + + const getSources = s => (s instanceof Array) ? s.join(', ') : s; + const getPipeline = p => p.map(comp => `${comp}`).join(', '); + const getLink = (t, l) => `${t}`; + + const keys = { version, size, description, notes } + Object.keys(keys).forEach(key => template.fill(key, keys[key])); + + if (sources) template.fill('sources', getSources(sources)); + if (pipeline && pipeline.length) template.fill('pipeline', getPipeline(pipeline), true); + else template.get('pipeline').parentElement.parentElement.style.display = 'none'; + + if (author) template.fill('author', url ? getLink(author, url) : author, true); + if (license) template.fill('license', this.licenses[license] ? getLink(license, this.licenses[license]) : license, true); + + template.get('download').setAttribute('href', `${this.repo}/releases/tag/${model}`); + if (accuracy) this.renderAccuracy(template, accuracy, modelId); + this.renderCompat(template, modelId); + template.get('table').removeAttribute('data-loading'); + } + + renderCompat(template, modelId) { + template.get('compat-wrapper').style.display = 'table-row'; + const options = Object.keys(this.compat).map(v => ``).join(''); + template + .fill('compat', '' + options, true) + .addEventListener('change', ev => { + const result = this.compat[ev.target.value][modelId]; + if (result) template.fill('compat-versions', `${modelId}-${result[0]}`, true); + else template.fill('compat-versions', ''); + }); + } + + renderAccuracy(template, accuracy, modelId, compare=false) { + template.get('accuracy-wrapper').style.display = 'block'; + const metaKeys = Object.keys(this.accKeys).map(k => accuracy[k] ? k : false).filter(k => k); + for (let key of metaKeys) { + template.fill(key, accuracy[key].toFixed(2)).parentElement.style.display = 'table-row'; + } + + this.chartOptions.options.legend = { display: compare } + new Chart(`chart_${modelId}`, Object.assign({}, this.chartOptions, { data: { + datasets: [{ + label: modelId, + data: metaKeys.map(key => accuracy[key].toFixed(2)), + backgroundColor: this.chartColor + }], + labels: metaKeys.map(key => this.accKeys[key]) + }})) + } + + getLatestVersion(model, compat = {}) { + for (let spacy_v of Object.keys(compat)) { + const models = compat[spacy_v]; + if (models[model]) return models[model][0]; + } + } +} + + +class Changelog { + /** + * Fetch and render changelog from GitHub. Clones a template node (table row) + * to avoid doubling templating markup in JavaScript. + * + * @param {String} user - GitHub username. + * @param {String} repo - Repository to fetch releases from. + */ + constructor(user, repo) { + this.url = `https://api.github.com/repos/${user}/${repo}/releases`; + this.template = new Templater('changelog'); + fetch(this.url) + .then(res => this.handleResponse(res)) + .then(json => json.ok ? this.render(json) : false) + } + + /** + * Get template section from template row. Slightly hacky, but does make sense. + */ + $(item, id) { + return item.querySelector(`[data-changelog="${id}"]`); + } + + handleResponse(res) { + if (res.ok) return res.json().then(json => Object.assign({}, json, { ok: res.ok })) + else return ({ ok: res.ok }) + } + + render(json) { + this.template.get('error').style.display = 'none'; + this.template.get('table').style.display = 'block'; + this.row = this.template.get('item'); + this.releases = this.template.get('releases'); + this.prereleases = this.template.get('prereleases'); + Object.values(json) + .filter(release => release.name) + .forEach(release => this.renderRelease(release)); + this.row.remove(); + // make sure scroll positions for progress bar etc. are recalculated + window.dispatchEvent(new Event('resize')); + } + + /** + * Clone the template row and populate with content from API response. + * https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository + * + * @param {String} name - Release title. + * @param {String} tag (tag_name) - Release tag. + * @param {String} url (html_url) - URL to the release page on GitHub. + * @param {String} date (published_at) - Timestamp of release publication. + * @param {Boolean} pre (prerelease) - Whether the release is a prerelease. + */ + renderRelease({ name, tag_name: tag, html_url: url, published_at: date, prerelease: pre }) { + const container = pre ? this.prereleases : this.releases; + const row = this.row.cloneNode(true); + this.$(row, 'date').textContent = date.split('T')[0]; + this.$(row, 'tag').innerHTML = `${tag}`; + this.$(row, 'title').textContent = (name.split(': ').length == 2) ? name.split(': ')[1] : name; + container.appendChild(row); + } +} + + +class GitHubEmbed { + /** + * Embed code from GitHub repositories, similar to Gist embeds. Fetches the + * raw text and places it inside element. + * Usage:
+     *
+     * @param {String} user - GitHub user or organization.
+     * @param {String} attr - Data attribute used to select containers. Attribute
+     *                        value should be path to file relative to user.
+     */
+    constructor(user, attr) {
+        this.url = `https://raw.githubusercontent.com/${user}`;
+        this.attr = attr;
+        this.error = `\nCan't fetch code example from GitHub :(\n\nPlease use the link below to view the example. If you've come across\na broken link, we always appreciate a pull request to the repository,\nor a report on the issue tracker. Thanks!`;
+        [...$$(`[${this.attr}]`)].forEach(el => this.embed(el));
+    }
+
+    embed(el) {
+        el.parentElement.setAttribute('data-loading', '');
+        fetch(`${this.url}/${el.getAttribute(this.attr)}`)
+            .then(res => res.text().then(text => ({ text, ok: res.ok })))
+            .then(({ text, ok }) => {
+                el.textContent = ok ? text : this.error;
+                if (ok && window.Prism) Prism.highlightElement(el);
+            })
+        el.parentElement.removeAttribute('data-loading');
+    }
 }
diff --git a/website/assets/js/prism.js b/website/assets/js/prism.min.js
similarity index 100%
rename from website/assets/js/prism.js
rename to website/assets/js/prism.min.js
diff --git a/website/assets/js/quickstart.js b/website/assets/js/quickstart.min.js
similarity index 100%
rename from website/assets/js/quickstart.js
rename to website/assets/js/quickstart.min.js
diff --git a/website/docs/_data.json b/website/docs/_data.json
deleted file mode 100644
index bc33ebc4c..000000000
--- a/website/docs/_data.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-    "index": {
-        "title" : "Documentation",
-
-        "sections": {
-            "Usage": {
-                "url": "/docs/usage",
-                "svg": "computer",
-                "description": "How to use spaCy and its features."
-            },
-            "API": {
-                "url": "/docs/api",
-                "svg": "brain",
-                "description": "The detailed reference for spaCy's API."
-            },
-            "Tutorials": {
-                "url": "/docs/usage/tutorials",
-                "svg": "eye",
-                "description": "End-to-end examples, with code you can modify and run."
-            },
-            "Showcase & Demos": {
-                "url": "/docs/usage/showcase",
-                "svg": "bubble",
-                "description": "Demos, libraries and products from the spaCy community."
-            }
-        }
-    }
-}
diff --git a/website/docs/api/_data.json b/website/docs/api/_data.json
deleted file mode 100644
index a2e447dc8..000000000
--- a/website/docs/api/_data.json
+++ /dev/null
@@ -1,177 +0,0 @@
-{
-    "sidebar": {
-        "Introduction": {
-            "Facts & Figures": "./",
-            "Languages": "language-models",
-            "Annotation Specs": "annotation"
-        },
-        "Top-level": {
-            "spacy": "spacy",
-            "displacy": "displacy",
-            "Utility Functions": "util",
-            "Command line": "cli"
-        },
-        "Classes": {
-            "Doc": "doc",
-            "Token": "token",
-            "Span": "span",
-            "Language": "language",
-            "Tokenizer": "tokenizer",
-            "Tagger": "tagger",
-            "DependencyParser": "dependencyparser",
-            "EntityRecognizer": "entityrecognizer",
-            "Matcher": "matcher",
-            "Lexeme": "lexeme",
-            "Vocab": "vocab",
-            "StringStore": "stringstore",
-            "Vectors": "vectors",
-            "GoldParse": "goldparse",
-            "GoldCorpus": "goldcorpus",
-            "Binder": "binder"
-        }
-    },
-
-    "index": {
-        "title": "Facts & Figures",
-        "next": "language-models"
-    },
-
-    "language-models": {
-        "title": "Languages",
-        "next": "philosophy"
-    },
-
-    "philosophy": {
-        "title": "Philosophy"
-    },
-
-    "spacy": {
-        "title": "spaCy top-level functions",
-        "source": "spacy/__init__.py",
-        "next": "displacy"
-    },
-
-    "displacy": {
-        "title": "displaCy",
-        "tag": "module",
-        "source": "spacy/displacy",
-        "next": "util"
-    },
-
-    "util": {
-        "title": "Utility Functions",
-        "source": "spacy/util.py",
-        "next": "cli"
-    },
-
-    "cli": {
-        "title": "Command Line Interface",
-        "source": "spacy/cli"
-    },
-
-    "language": {
-        "title": "Language",
-        "tag": "class",
-        "source": "spacy/language.py"
-    },
-
-    "doc": {
-        "title": "Doc",
-        "tag": "class",
-        "source": "spacy/tokens/doc.pyx"
-    },
-
-    "token": {
-        "title": "Token",
-        "tag": "class",
-        "source": "spacy/tokens/token.pyx"
-    },
-
-    "span": {
-        "title": "Span",
-        "tag": "class",
-        "source": "spacy/tokens/span.pyx"
-    },
-
-    "lexeme": {
-        "title": "Lexeme",
-        "tag": "class",
-        "source": "spacy/lexeme.pyx"
-    },
-
-    "vocab": {
-        "title": "Vocab",
-        "tag": "class",
-        "source": "spacy/vocab.pyx"
-    },
-
-    "stringstore": {
-        "title": "StringStore",
-        "tag": "class",
-        "source": "spacy/strings.pyx"
-    },
-
-    "matcher": {
-        "title": "Matcher",
-        "tag": "class",
-        "source": "spacy/matcher.pyx"
-    },
-
-    "dependenyparser": {
-        "title": "DependencyParser",
-        "tag": "class",
-        "source": "spacy/pipeline.pyx"
-    },
-
-    "entityrecognizer": {
-        "title": "EntityRecognizer",
-        "tag": "class",
-        "source": "spacy/pipeline.pyx"
-    },
-
-    "dependencyparser": {
-        "title": "DependencyParser",
-        "tag": "class",
-        "source": "spacy/pipeline.pyx"
-    },
-
-    "tokenizer": {
-        "title": "Tokenizer",
-        "tag": "class",
-        "source": "spacy/tokenizer.pyx"
-    },
-
-    "tagger": {
-        "title": "Tagger",
-        "tag": "class",
-        "source": "spacy/pipeline.pyx"
-    },
-
-    "goldparse": {
-        "title": "GoldParse",
-        "tag": "class",
-        "source": "spacy/gold.pyx"
-    },
-
-    "goldcorpus": {
-        "title": "GoldCorpus",
-        "tag": "class",
-        "source": "spacy/gold.pyx"
-    },
-
-    "binder": {
-        "title": "Binder",
-        "tag": "class",
-        "source": "spacy/tokens/binder.pyx"
-    },
-
-    "vectors": {
-        "title": "Vectors",
-        "tag": "class",
-        "source": "spacy/vectors.pyx"
-    },
-
-    "annotation": {
-        "title": "Annotation Specifications"
-    }
-}
diff --git a/website/docs/api/annotation.jade b/website/docs/api/annotation.jade
deleted file mode 100644
index 048e69897..000000000
--- a/website/docs/api/annotation.jade
+++ /dev/null
@@ -1,156 +0,0 @@
-//- 💫 DOCS > API > ANNOTATION SPECS
-
-include ../../_includes/_mixins
-
-p This document describes the target annotations spaCy is trained to predict.
-
-+h(2, "tokenization") Tokenization
-
-p
-    |  Tokenization standards are based on the
-    |  #[+a("https://catalog.ldc.upenn.edu/LDC2013T19") OntoNotes 5] corpus.
-    |  The tokenizer differs from most by including tokens for significant
-    |  whitespace. Any sequence of whitespace characters beyond a single space
-    |  (#[code ' ']) is included as a token.
-
-+aside-code("Example").
-    from spacy.lang.en import English
-    nlp = English()
-    tokens = nlp('Some\nspaces  and\ttab characters')
-    tokens_text = [t.text for t in tokens]
-    assert tokens_text == ['Some', '\n', 'spaces', ' ', 'and',
-                           '\t', 'tab', 'characters']
-
-p
-    |  The whitespace tokens are useful for much the same reason punctuation is
-    |  – it's often an important delimiter in the text. By preserving it in the
-    |  token output, we are able to maintain a simple alignment between the
-    |  tokens and the original string, and we ensure that no information is
-    |  lost during processing.
-
-+h(2, "sentence-boundary") Sentence boundary detection
-
-p
-    |  Sentence boundaries are calculated from the syntactic parse tree, so
-    |  features such as punctuation and capitalisation play an important but
-    |  non-decisive role in determining the sentence boundaries. Usually this
-    |  means that the sentence boundaries will at least coincide with clause
-    |  boundaries, even given poorly punctuated text.
-
-+h(2, "pos-tagging") Part-of-speech Tagging
-
-+aside("Tip: Understanding tags")
-    |  You can also use #[code spacy.explain()] to get the escription for the
-    |  string representation of a tag. For example,
-    |  #[code spacy.explain("RB")] will return "adverb".
-
-include _annotation/_pos-tags
-
-+h(2, "lemmatization") Lemmatization
-
-p A "lemma" is the uninflected form of a word. In English, this means:
-
-+list
-    +item #[strong Adjectives]: The form like "happy", not "happier" or "happiest"
-    +item #[strong Adverbs]: The form like "badly", not "worse" or "worst"
-    +item #[strong Nouns]: The form like "dog", not "dogs"; like "child", not "children"
-    +item #[strong Verbs]: The form like "write", not "writes", "writing", "wrote" or "written"
-
-p
-    |  The lemmatization data is taken from
-    |  #[+a("https://wordnet.princeton.edu") WordNet]. However, we also add a
-    |  special case for pronouns: all pronouns are lemmatized to the special
-    |  token #[code -PRON-].
-
-+infobox("About spaCy's custom pronoun lemma")
-    |  Unlike verbs and common nouns, there's no clear base form of a personal
-    |  pronoun. Should the lemma of "me" be "I", or should we normalize person
-    |  as well, giving "it" — or maybe "he"? spaCy's solution is to introduce a
-    |  novel symbol, #[code -PRON-], which is used as the lemma for
-    |  all personal pronouns.
-
-+h(2, "dependency-parsing") Syntactic Dependency Parsing
-
-+aside("Tip: Understanding labels")
-    |  You can also use #[code spacy.explain()] to get the description for the
-    |  string representation of a label. For example,
-    |  #[code spacy.explain("prt")] will return "particle".
-
-include _annotation/_dep-labels
-
-+h(2, "named-entities") Named Entity Recognition
-
-+aside("Tip: Understanding entity types")
-    |  You can also use #[code spacy.explain()] to get the description for the
-    |  string representation of an entity label. For example,
-    |  #[code spacy.explain("LANGUAGE")] will return "any named language".
-
-include _annotation/_named-entities
-
-+h(3, "biluo") BILUO Scheme
-
-p
-    |  spaCy translates character offsets into the BILUO scheme, in order to
-    |  decide the cost of each action given the current state of the entity
-    |  recognizer. The costs are then used to calculate the gradient of the
-    |  loss, to train the model.
-
-+aside("Why BILUO, not IOB?")
-    |  There are several coding schemes for encoding entity annotations as
-    |  token tags.  These coding schemes are equally expressive, but not
-    |  necessarily equally learnable.
-    |  #[+a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth]
-    |  showed that the minimal #[strong Begin], #[strong In], #[strong Out]
-    |  scheme was more difficult to learn than the #[strong BILUO] scheme that
-    |  we use, which explicitly marks boundary tokens.
-
-+table([ "Tag", "Description" ])
-    +row
-        +cell #[code #[span.u-color-theme B] EGIN]
-        +cell The first token of a multi-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme I] N]
-        +cell An inner token of a multi-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme L] AST]
-        +cell The final token of a multi-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme U] NIT]
-        +cell A single-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme O] UT]
-        +cell A non-entity token.
-
-+h(2, "json-input") JSON input format for training
-
-p
-    |  spaCy takes training data in the following format:
-
-+code("Example structure").
-    doc: {
-        id: string,
-        paragraphs: [{
-            raw: string,
-            sents: [int],
-            tokens: [{
-                start: int,
-                tag: string,
-                head: int,
-                dep: string
-            }],
-            ner: [{
-                start: int,
-                end: int,
-                label: string
-            }],
-            brackets: [{
-                start: int,
-                end: int,
-                label: string
-            }]
-        }]
-    }
diff --git a/website/docs/api/dependencyparser.jade b/website/docs/api/dependencyparser.jade
deleted file mode 100644
index a1a7e0b36..000000000
--- a/website/docs/api/dependencyparser.jade
+++ /dev/null
@@ -1,111 +0,0 @@
-//- 💫 DOCS > API > DEPENDENCYPARSER
-
-include ../../_includes/_mixins
-
-p Annotate syntactic dependencies on #[code Doc] objects.
-
-+under-construction
-
-+h(2, "init") DependencyParser.__init__
-    +tag method
-
-p Create a #[code DependencyParser].
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code vocab]
-        +cell #[code Vocab]
-        +cell The vocabulary. Must be shared with documents to be processed.
-
-    +row
-        +cell #[code model]
-        +cell #[thinc.linear.AveragedPerceptron]
-        +cell The statistical model.
-
-    +footrow
-        +cell returns
-        +cell #[code DependencyParser]
-        +cell The newly constructed object.
-
-+h(2, "call") DependencyParser.__call__
-    +tag method
-
-p
-    |  Apply the dependency parser, setting the heads and dependency relations
-    |  onto the #[code Doc] object.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The document to be processed.
-
-    +footrow
-        +cell returns
-        +cell #[code None]
-        +cell -
-
-+h(2, "pipe") DependencyParser.pipe
-    +tag method
-
-p Process a stream of documents.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code stream]
-        +cell -
-        +cell The sequence of documents to process.
-
-    +row
-        +cell #[code batch_size]
-        +cell int
-        +cell The number of documents to accumulate into a working set.
-
-    +row
-        +cell #[code n_threads]
-        +cell int
-        +cell
-            |  The number of threads with which to work on the buffer in
-            |  parallel.
-
-    +footrow
-        +cell yields
-        +cell #[code Doc]
-        +cell Documents, in order.
-
-+h(2, "update") DependencyParser.update
-    +tag method
-
-p Update the statistical model.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The example document for the update.
-
-    +row
-        +cell #[code gold]
-        +cell #[code GoldParse]
-        +cell The gold-standard annotations, to calculate the loss.
-
-    +footrow
-        +cell returns
-        +cell int
-        +cell The loss on this example.
-
-+h(2, "step_through") DependencyParser.step_through
-    +tag method
-
-p Set up a stepwise state, to introspect and control the transition sequence.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The document to step through.
-
-    +footrow
-        +cell returns
-        +cell #[code StepwiseState]
-        +cell A state object, to step through the annotation process.
diff --git a/website/docs/api/entityrecognizer.jade b/website/docs/api/entityrecognizer.jade
deleted file mode 100644
index e3775b7f4..000000000
--- a/website/docs/api/entityrecognizer.jade
+++ /dev/null
@@ -1,109 +0,0 @@
-//- 💫 DOCS > API > ENTITYRECOGNIZER
-
-include ../../_includes/_mixins
-
-p Annotate named entities on #[code Doc] objects.
-
-+under-construction
-
-+h(2, "init") EntityRecognizer.__init__
-    +tag method
-
-p Create an #[code EntityRecognizer].
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code vocab]
-        +cell #[code Vocab]
-        +cell The vocabulary. Must be shared with documents to be processed.
-
-    +row
-        +cell #[code model]
-        +cell #[thinc.linear.AveragedPerceptron]
-        +cell The statistical model.
-
-    +footrow
-        +cell returns
-        +cell #[code EntityRecognizer]
-        +cell The newly constructed object.
-
-+h(2, "call") EntityRecognizer.__call__
-    +tag method
-
-p Apply the entity recognizer, setting the NER tags onto the #[code Doc] object.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The document to be processed.
-
-    +footrow
-        +cell returns
-        +cell #[code None]
-        +cell -
-
-+h(2, "pipe") EntityRecognizer.pipe
-    +tag method
-
-p Process a stream of documents.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code stream]
-        +cell -
-        +cell The sequence of documents to process.
-
-    +row
-        +cell #[code batch_size]
-        +cell int
-        +cell The number of documents to accumulate into a working set.
-
-    +row
-        +cell #[code n_threads]
-        +cell int
-        +cell
-            |  The number of threads with which to work on the buffer in
-            |  parallel.
-
-    +footrow
-        +cell yields
-        +cell #[code Doc]
-        +cell Documents, in order.
-
-+h(2, "update") EntityRecognizer.update
-    +tag method
-
-p Update the statistical model.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The example document for the update.
-
-    +row
-        +cell #[code gold]
-        +cell #[code GoldParse]
-        +cell The gold-standard annotations, to calculate the loss.
-
-    +footrow
-        +cell returns
-        +cell int
-        +cell The loss on this example.
-
-+h(2, "step_through") EntityRecognizer.step_through
-    +tag method
-
-p Set up a stepwise state, to introspect and control the transition sequence.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The document to step through.
-
-    +footrow
-        +cell returns
-        +cell #[code StepwiseState]
-        +cell A state object, to step through the annotation process.
diff --git a/website/docs/api/index.jade b/website/docs/api/index.jade
deleted file mode 100644
index f92080975..000000000
--- a/website/docs/api/index.jade
+++ /dev/null
@@ -1,241 +0,0 @@
-//- 💫 DOCS > API > FACTS & FIGURES
-
-include ../../_includes/_mixins
-
-+under-construction
-
-+h(2, "comparison") Feature comparison
-
-p
-    |  Here's a quick comparison of the functionalities offered by spaCy,
-    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet],
-    |  #[+a("http://www.nltk.org/py-modindex.html") NLTK] and
-    |  #[+a("http://stanfordnlp.github.io/CoreNLP/") CoreNLP].
-
-+table([ "", "spaCy", "SyntaxNet", "NLTK", "CoreNLP"])
-    +row
-        +cell Easy installation
-        each icon in [ "pro", "con", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Python API
-        each icon in [ "pro", "con", "pro", "con" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Multi-language support
-        each icon in [ "neutral", "pro", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Tokenization
-        each icon in [ "pro", "pro", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Part-of-speech tagging
-        each icon in [ "pro", "pro", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Sentence segmentation
-        each icon in [ "pro", "pro", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Dependency parsing
-        each icon in [ "pro", "pro", "con", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Entity Recognition
-        each icon in [ "pro", "con", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Integrated word vectors
-        each icon in [ "pro", "con", "con", "con" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Sentiment analysis
-        each icon in [ "pro", "con", "pro", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Coreference resolution
-        each icon in [ "con", "con", "con", "pro" ]
-            +cell.u-text-center #[+procon(icon)]
-
-+h(2, "benchmarks") Benchmarks
-
-p
-    |  Two peer-reviewed papers in 2015 confirm that spaCy offers the
-    |  #[strong fastest syntactic parser in the world] and that
-    |  #[strong its accuracy is within 1% of the best] available. The few
-    |  systems that are more accurate are 20× slower or more.
-
-+aside("About the evaluation")
-    |  The first of the evaluations was published by #[strong Yahoo! Labs] and
-    |  #[strong Emory University], as part of a survey of current parsing
-    |  technologies #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") (Choi et al., 2015)].
-    |  Their results and subsequent discussions helped us develop a novel
-    |  psychologically-motivated technique to improve spaCy's accuracy, which
-    |  we published in joint work with Macquarie University
-    |  #[+a("https://aclweb.org/anthology/D/D15/D15-1162.pdf") (Honnibal and Johnson, 2015)].
-
-+table([ "System", "Language", "Accuracy", "Speed (wps)"])
-    +row
-        each data in [ "spaCy", "Cython", "91.8", "13,963" ]
-            +cell #[strong=data]
-    +row
-        each data in [ "ClearNLP", "Java", "91.7", "10,271" ]
-            +cell=data
-
-    +row
-        each data in [ "CoreNLP", "Java", "89.6", "8,602"]
-            +cell=data
-
-    +row
-        each data in [ "MATE", "Java", "92.5", "550"]
-            +cell=data
-
-    +row
-        each data in [ "Turbo", "C++", "92.4", "349" ]
-            +cell=data
-
-+h(3, "parse-accuracy") Parse accuracy
-
-p
-    |  In 2016, Google released their
-    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet]
-    |  library, setting a new state of the art for syntactic dependency parsing
-    |  accuracy. SyntaxNet's algorithm is very similar to spaCy's. The main
-    |  difference is that SyntaxNet uses a neural network while spaCy uses a
-    |  sparse linear model.
-
-+aside("Methodology")
-    |  #[+a("http://arxiv.org/abs/1603.06042") Andor et al. (2016)] chose
-    |  slightly different experimental conditions from
-    |  #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") Choi et al. (2015)],
-    |  so the two accuracy tables here do not present directly comparable
-    |  figures. We have only evaluated spaCy in the "News" condition following
-    |  the SyntaxNet methodology. We don't yet have benchmark figures for the
-    |  "Web" and "Questions" conditions.
-
-+table([ "System", "News", "Web", "Questions" ])
-    +row
-        +cell spaCy
-        each data in [ 92.8, "n/a", "n/a" ]
-            +cell=data
-
-    +row
-        +cell #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") Parsey McParseface]
-        each data in [ 94.15, 89.08, 94.77 ]
-            +cell=data
-
-    +row
-        +cell #[+a("http://www.cs.cmu.edu/~ark/TurboParser/") Martins et al. (2013)]
-        each data in [ 93.10, 88.23, 94.21 ]
-            +cell=data
-
-    +row
-        +cell #[+a("http://research.google.com/pubs/archive/38148.pdf") Zhang and McDonald (2014)]
-        each data in [ 93.32, 88.65, 93.37 ]
-            +cell=data
-
-    +row
-        +cell #[+a("http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43800.pdf") Weiss et al. (2015)]
-        each data in [ 93.91, 89.29, 94.17 ]
-            +cell=data
-
-    +row
-        +cell #[strong #[+a("http://arxiv.org/abs/1603.06042") Andor et al. (2016)]]
-        each data in [ 94.44, 90.17, 95.40 ]
-            +cell #[strong=data]
-
-+h(3, "speed-comparison") Detailed speed comparison
-
-p
-    |  Here we compare the per-document processing time of various spaCy
-    |  functionalities against other NLP libraries. We show both absolute
-    |  timings (in ms) and relative performance (normalized to spaCy). Lower is
-    |  better.
-
-+aside("Methodology")
-    |  #[strong Set up:] 100,000 plain-text documents were streamed from an
-    |  SQLite3 database, and processed with an NLP library, to one of three
-    |  levels of detail — tokenization, tagging, or parsing. The tasks are
-    |  additive: to parse the text you have to tokenize and tag it. The
-    |  pre-processing was not subtracted from the times — I report the time
-    |  required for the pipeline to complete. I report mean times per document,
-    |  in milliseconds.#[br]#[br]
-    |  #[strong Hardware]: Intel i7-3770 (2012)#[br]
-    |  #[strong Implementation]: #[+src(gh("spacy-benchmarks")) spacy-benchmarks]
-
-+table
-    +row.u-text-label.u-text-center
-        th.c-table__head-cell
-        th.c-table__head-cell(colspan="3") Absolute (ms per doc)
-        th.c-table__head-cell(colspan="3") Relative (to spaCy)
-
-    +row
-        each column in ["System", "Tokenize", "Tag", "Parse", "Tokenize", "Tag", "Parse"]
-            th.c-table__head-cell.u-text-label=column
-
-    +row
-        +cell #[strong spaCy]
-        each data in [ "0.2ms", "1ms", "19ms"]
-            +cell #[strong=data]
-
-        each data in [ "1x", "1x", "1x" ]
-            +cell=data
-
-    +row
-        each data in [ "CoreNLP", "2ms", "10ms", "49ms", "10x", "10x", "2.6x"]
-            +cell=data
-    +row
-        each data in [ "ZPar", "1ms", "8ms", "850ms", "5x", "8x", "44.7x" ]
-            +cell=data
-    +row
-        each data in [ "NLTK", "4ms", "443ms", "n/a", "20x", "443x", "n/a" ]
-            +cell=data
-
-+h(3, "ner") Named entity comparison
-
-p
-    |  #[+a("https://aclweb.org/anthology/W/W16/W16-2703.pdf") Jiang et al. (2016)]
-    |  present several detailed comparisons of the named entity recognition
-    |  models provided by spaCy, CoreNLP, NLTK and LingPipe. Here we show their
-    |  evaluation of person, location and organization accuracy on Wikipedia.
-
-+aside("Methodology")
-    |  Making a meaningful comparison of different named entity recognition
-    |  systems is tricky.  Systems are often trained on different data, which
-    |  usually have slight differences in annotation style. For instance, some
-    |  corpora include titles as part of person names, while others don't.
-    |  These trivial differences in convention can distort comparisons
-    |  significantly. Jiang et al.'s #[em partial overlap] metric goes a long
-    |  way to solving this problem.
-
-+table([ "System", "Precision", "Recall", "F-measure" ])
-    +row
-        +cell spaCy
-        each data in [ 0.7240, 0.6514, 0.6858 ]
-            +cell=data
-
-    +row
-        +cell #[strong CoreNLP]
-        each data in [ 0.7914, 0.7327, 0.7609 ]
-            +cell #[strong=data]
-
-    +row
-        +cell NLTK
-        each data in [ 0.5136, 0.6532, 0.5750 ]
-            +cell=data
-
-    +row
-        +cell LingPipe
-        each data in [ 0.5412, 0.5357, 0.5384 ]
-            +cell=data
diff --git a/website/docs/api/language-models.jade b/website/docs/api/language-models.jade
deleted file mode 100644
index 74007f228..000000000
--- a/website/docs/api/language-models.jade
+++ /dev/null
@@ -1,93 +0,0 @@
-//- 💫 DOCS > API > LANGUAGE MODELS
-
-include ../../_includes/_mixins
-
-p
-    |  spaCy currently provides models for the following languages and
-    |  capabilities:
-
-
-+aside-code("Download language models", "bash").
-    python -m spacy download en
-    python -m spacy download de
-    python -m spacy download fr
-
-+table([ "Language", "Token", "SBD", "Lemma", "POS", "NER", "Dep", "Vector", "Sentiment"])
-    +row
-        +cell English #[code en]
-        each icon in [ "pro", "pro", "pro", "pro", "pro", "pro", "pro", "con" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell German #[code de]
-        each icon in [ "pro", "pro", "con", "pro", "pro", "pro", "pro", "con" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell French #[code fr]
-        each icon in [ "pro", "con", "con", "pro", "con", "pro", "pro", "con" ]
-            +cell.u-text-center #[+procon(icon)]
-
-    +row
-        +cell Spanish #[code es]
-        each icon in [ "pro", "pro", "con", "pro", "pro", "pro", "pro", "con" ]
-            +cell.u-text-center #[+procon(icon)]
-
-p
-    +button("/docs/usage/models", true, "primary") See available models
-
-+h(2, "alpha-support") Alpha tokenization support
-
-p
-    |  Work has started on the following languages. You can help by
-    |  #[+a("/docs/usage/adding-languages#language-data") improving the existing language data]
-    |  and extending the tokenization patterns.
-
-+aside("Usage note")
-    |  Note that the alpha languages don't yet come with a language model. In
-    |  order to use them, you have to import them directly:
-
-    +code.o-no-block.
-        from spacy.lang.fi import Finnish
-        nlp = Finnish()
-        doc = nlp(u'Ilmatyynyalukseni on täynnä ankeriaita')
-
-+infobox("Dependencies")
-    |  Some language tokenizers require external dependencies. To use #[strong Chinese],
-    |  you need to have #[+a("https://github.com/fxsjy/jieba") Jieba] installed.
-    |  The #[strong Japanese] tokenizer requires
-    |  #[+a("https://github.com/mocobeta/janome") Janome].
-
-+table([ "Language", "Code", "Source" ])
-    each language, code in { it: "Italian", pt: "Portuguese", nl: "Dutch", sv: "Swedish", fi: "Finnish", nb: "Norwegian Bokmål", da: "Danish", hu: "Hungarian", pl: "Polish", bn: "Bengali", he: "Hebrew", zh: "Chinese", ja: "Japanese" }
-        +row
-            +cell #{language}
-            +cell #[code=code]
-            +cell
-                +src(gh("spaCy", "spacy/lang/" + code)) lang/#{code}
-
-+h(2, "multi-language") Multi-language support
-    +tag-new(2)
-
-p
-    |  As of v2.0, spaCy supports models trained on more than one language. This
-    |  is especially useful for named entity recognition. The language ID used
-    |  for multi-language or language-neutral models is #[code xx]. The
-    |  language class, a generic subclass containing only the base language data,
-    |  can be found in #[+src(gh("spaCy", "spacy/lang/xx")) lang/xx].
-
-p
-    |  To load your model with the neutral, multi-language class, simply set
-    |  #[code "language": "xx"] in your
-    |  #[+a("/docs/usage/saving-loading#models-generating") model package]'s
-    |  meta.json. You can also import the class directly, or call
-    |  #[+api("util#get_lang_class") #[code util.get_lang_class()]] for
-    |  lazy-loading.
-
-+code("Standard import").
-    from spacy.lang.xx import MultiLanguage
-    nlp = MultiLanguage()
-
-+code("With lazy-loading").
-    from spacy.util import get_lang_class
-    nlp = get_lang_class('xx')
diff --git a/website/docs/api/tagger.jade b/website/docs/api/tagger.jade
deleted file mode 100644
index c41de6a4e..000000000
--- a/website/docs/api/tagger.jade
+++ /dev/null
@@ -1,93 +0,0 @@
-//- 💫 DOCS > API > TAGGER
-
-include ../../_includes/_mixins
-
-p Annotate part-of-speech tags on #[code Doc] objects.
-
-+under-construction
-
-+h(2, "init") Tagger.__init__
-    +tag method
-
-p Create a #[code Tagger].
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code vocab]
-        +cell #[code Vocab]
-        +cell The vocabulary. Must be shared with documents to be processed.
-
-    +row
-        +cell #[code model]
-        +cell #[thinc.linear.AveragedPerceptron]
-        +cell The statistical model.
-
-    +footrow
-        +cell returns
-        +cell #[code Tagger]
-        +cell The newly constructed object.
-
-+h(2, "call") Tagger.__call__
-    +tag method
-
-p Apply the tagger, setting the POS tags onto the #[code Doc] object.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The tokens to be tagged.
-
-    +footrow
-        +cell returns
-        +cell #[code None]
-        +cell -
-
-+h(2, "pipe") Tagger.pipe
-    +tag method
-
-p Tag a stream of documents.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code stream]
-        +cell -
-        +cell The sequence of documents to tag.
-
-    +row
-        +cell #[code batch_size]
-        +cell int
-        +cell The number of documents to accumulate into a working set.
-
-    +row
-        +cell #[code n_threads]
-        +cell int
-        +cell
-            |  The number of threads with which to work on the buffer in
-            |  parallel.
-
-    +footrow
-        +cell yields
-        +cell #[code Doc]
-        +cell Documents, in order.
-
-+h(2, "update") Tagger.update
-    +tag method
-
-p Update the statistical model, with tags supplied for the given document.
-
-+table(["Name", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The example document for the update.
-
-    +row
-        +cell #[code gold]
-        +cell #[code GoldParse]
-        +cell Manager for the gold-standard tags.
-
-    +footrow
-        +cell returns
-        +cell int
-        +cell Number of tags predicted correctly.
diff --git a/website/docs/api/vectors.jade b/website/docs/api/vectors.jade
deleted file mode 100644
index ef9aa2b52..000000000
--- a/website/docs/api/vectors.jade
+++ /dev/null
@@ -1,7 +0,0 @@
-//- 💫 DOCS > API > VECTORS
-
-include ../../_includes/_mixins
-
-p A container class for vector data keyed by string.
-
-+under-construction
diff --git a/website/docs/index.jade b/website/docs/index.jade
deleted file mode 100644
index d5a8c6deb..000000000
--- a/website/docs/index.jade
+++ /dev/null
@@ -1,25 +0,0 @@
-//- 💫 DOCS
-
-include ../_includes/_mixins
-
-+aside("Help us improve the docs")
-    |  Did you spot a mistake or come across explanations that
-    |  are unclear? You can find a "Suggest edits" button at the
-    |  bottom of each page that points you to the source.
-    |  We always appreciate
-    |  #[+a(gh("spaCy") + "/pulls") pull requests].#[br]#[br]
-    |  Have you built something cool with spaCy, or did you
-    |  write a tutorial to help others use spaCy?
-    |  #[a(href="mailto:#{EMAIL}") Let us know!]
-
-+grid
-    each details, title in sections
-        +card(false, false)
-            a(href=details.url)
-                +svg("graphics", details.svg, 300, 150).u-color-theme
-
-            a(href=details.url)
-                +h(3)=title
-
-            p=details.description
-            +button(details.url, true, "primary")(target="_self") View
diff --git a/website/docs/usage/_data.json b/website/docs/usage/_data.json
deleted file mode 100644
index 81deeb402..000000000
--- a/website/docs/usage/_data.json
+++ /dev/null
@@ -1,414 +0,0 @@
-{
-    "sidebar": {
-        "Get started": {
-            "Installation": "./",
-            "Models": "models",
-            "spaCy 101": "spacy-101",
-            "Lightning tour": "lightning-tour",
-            "What's new in v2.0": "v2"
-        },
-        "Guides": {
-            "POS tagging": "pos-tagging",
-            "Using the parse": "dependency-parse",
-            "Entity recognition": "entity-recognition",
-            "Vectors & similarity": "word-vectors-similarities",
-            "Custom tokenization": "customizing-tokenizer",
-            "Rule-based matching": "rule-based-matching",
-            "Adding languages": "adding-languages",
-            "Processing pipelines": "language-processing-pipeline",
-            "Deep learning": "deep-learning",
-            "Production use": "production-use",
-            "Training": "training",
-            "Training NER": "training-ner",
-            "Saving & loading": "saving-loading",
-            "Visualizers": "visualizers"
-        },
-        "Examples": {
-            "Tutorials": "tutorials",
-            "Showcase": "showcase"
-        }
-    },
-
-    "index": {
-        "title": "Install spaCy",
-        "next": "models",
-        "quickstart": true
-    },
-
-    "models": {
-        "title": "Models",
-        "next": "spacy-101",
-        "quickstart": true
-    },
-
-    "spacy-101": {
-        "title": "spaCy 101 – Everything you need to know",
-        "next": "lightning-tour",
-        "quickstart": true,
-        "preview": "101"
-    },
-
-    "lightning-tour": {
-        "title": "Lightning tour",
-        "next": "v2"
-    },
-
-    "visualizers": {
-        "title": "Visualizers"
-    },
-
-    "v2": {
-        "title": "What's new in v2.0"
-    },
-
-    "pos-tagging": {
-        "title": "Part-of-speech tagging",
-        "next": "dependency-parse"
-    },
-
-    "dependency-parse": {
-        "title": "Using the dependency parse",
-        "next": "entity-recognition"
-    },
-
-    "entity-recognition": {
-        "title": "Named Entity Recognition",
-        "next": "training-ner"
-    },
-
-    "word-vectors-similarities": {
-        "title": "Using word vectors and semantic similarities",
-        "next": "customizing-tokenizer"
-    },
-
-    "customizing-tokenizer": {
-        "title": "Customising the tokenizer",
-        "next": "rule-based-matching"
-    },
-
-    "rule-based-matching": {
-        "title": "Rule-based matching",
-        "next": "adding-languages"
-    },
-
-    "adding-languages": {
-        "title": "Adding languages",
-        "next": "training"
-    },
-
-    "language-processing-pipeline": {
-        "title": "Language processing pipelines",
-        "next": "deep-learning"
-    },
-
-    "deep-learning": {
-        "title": "Hooking a deep learning model into spaCy",
-        "next": "production use"
-    },
-
-    "production-use": {
-        "title": "Production use",
-        "next": "training"
-    },
-
-    "training": {
-        "title": "Training spaCy's statistical models",
-        "next": "saving-loading"
-    },
-
-    "training-ner": {
-        "title": "Training the Named Entity Recognizer",
-        "next": "saving-loading"
-    },
-
-    "saving-loading": {
-        "title": "Saving, loading and data serialization"
-    },
-
-    "showcase": {
-        "title": "Showcase",
-
-        "libraries": {
-            "spacy_api": {
-                "url": "https://github.com/kootenpv/spacy_api",
-                "author": "Pascal van Kooten",
-                "description": "Server/client to load models in a separate, dedicated process."
-            },
-            "spacy-nlp": {
-                "url": "https://github.com/kengz/spacy-nlp",
-                "author": "Wah Loon Keng",
-                "description": "Expose spaCy NLP text parsing to Node.js (and other languages) via Socket.IO."
-            },
-            "spacy-api-docker": {
-                "url": "https://github.com/jgontrum/spacy-api-docker",
-                "author": "Johannes Gontrum",
-                "description": "spaCy accessed by a REST API, wrapped in a Docker container."
-            },
-            "spacy-nlp-zeromq": {
-                "url": "https://github.com/pasupulaphani/spacy-nlp-docker",
-                "author": "Phaninder Pasupula",
-                "description": "Docker image exposing spaCy with ZeroMQ bindings."
-            },
-            "textacy": {
-                "url": "https://github.com/chartbeat-labs/textacy",
-                "author": " Burton DeWilde (Chartbeat)",
-                "description": "Higher-level NLP built on spaCy."
-            },
-            "visual-qa": {
-                "url": "https://github.com/avisingh599/visual-qa",
-                "author": "Avi Singh",
-                "description": "Keras-based LSTM/CNN models for Visual Question Answering."
-            },
-            "rasa_nlu": {
-                "url": "https://github.com/golastmile/rasa_nlu",
-                "author": "LASTMILE",
-                "description": "High level APIs for building your own language parser using existing NLP and ML libraries."
-            },
-            "spacyr": {
-                "url": "https://github.com/kbenoit/spacyr",
-                "author": "Kenneth Benoit",
-                "description": "An R wrapper for spaCy."
-            }
-        },
-        "visualizations": {
-            "displaCy": {
-                "url": "https://demos.explosion.ai/displacy",
-                "author": "Ines Montani",
-                "description": "An open-source NLP visualiser for the modern web.",
-                "image": "displacy.jpg"
-            },
-            "displaCy ENT": {
-                "url": "https://demos.explosion.ai/displacy-ent",
-                "author": "Ines Montani",
-                "description": "An open-source named entity visualiser for the modern web.",
-                "image": "displacy-ent.jpg"
-            }
-        },
-        "products": {
-            "sense2vec": {
-                "url": "https://demos.explosion.ai/sense2vec",
-                "author": "Matthew Honnibal and Ines Montani",
-                "description": "Semantic analysis of the Reddit hivemind.",
-                "image": "sense2vec.jpg"
-            },
-            "TruthBot": {
-                "url": "http://summerscope.github.io/govhack/2016/truthbot/",
-                "author": "Team Truthbot",
-                "description": "The world's first artificially intelligent fact checking robot.",
-                "image": "truthbot.jpg"
-            },
-            "Laice": {
-                "url": "https://github.com/kendricktan/laice",
-                "author": "Kendrick Tan",
-                "description": "Train your own Natural Language Processor from a browser.",
-                "image": "laice.jpg"
-            },
-            "FoxType": {
-                "url": "https://foxtype.com",
-                "description": "Smart tools for writers.",
-                "image": "foxtype.jpg"
-            },
-            "Kip": {
-                "url": "https://kipthis.com",
-                "description": "An AI chat assistant for group shopping.",
-                "image": "kip.jpg"
-            },
-            "Indico": {
-                "url": "https://indico.io",
-                "description": "Text and image analysis powered by Machine Learning.",
-                "image": "indico.jpg"
-            },
-            "TextAnalysisOnline": {
-                "url": "http://textanalysisonline.com",
-                "description": "Online tool for spaCy's tokenizer, parser, NER and more.",
-                "image": "textanalysis.jpg"
-            }
-        },
-        "books": {
-            "Introduction to Machine Learning with Python: A Guide for Data Scientists": {
-                "url": "https://books.google.de/books?id=vbQlDQAAQBAJ",
-                "author": "Andreas C. Müller and Sarah Guido (O'Reilly, 2016)",
-                "description": "Andreas is a lead developer of Scikit-Learn, and Sarah is a lead data scientist at Mashable. We're proud to get a mention."
-            },
-
-            "Text Analytics with Python: A Practical Real-World Approach to Gaining Actionable Insights from your Data": {
-                "url": "https://www.amazon.com/Text-Analytics-Python-Real-World-Actionable/dp/148422387X",
-                "author": "Dipanjan Sarkar (Apress / Springer, 2016)",
-                "description": "Derive useful insights from your data using Python. Learn the techniques related to natural language processing and text analytics, and gain the skills to know which technique is best suited to solve a particular problem."
-            }
-        },
-        "research": {
-            "Distributional semantics for understanding spoken meal descriptions": {
-                "url": "https://www.semanticscholar.org/paper/Distributional-semantics-for-understanding-spoken-Korpusik-Huang/5f55c5535e80d3e5ed7f1f0b89531e32725faff5",
-                "author": "Mandy Korpusik et al. (2016)"
-            },
-
-            "Refactoring the Genia Event Extraction Shared Task Toward a General Framework for IE-Driven KB Development": {
-                "url": "https://www.semanticscholar.org/paper/Refactoring-the-Genia-Event-Extraction-Shared-Task-Kim-Wang/06d94b64a7bd2d3433f57caddad5084435d6a91f",
-                "author": "Jin-Dong Kim et al. (2016)"
-            },
-            "Mixing Dirichlet Topic Models and Word Embeddings to Make lda2vec": {
-                "url": "https://www.semanticscholar.org/paper/Mixing-Dirichlet-Topic-Models-and-Word-Embeddings-Moody/bf8116e06f7b498c6abfbf97aeb67d0838c08609",
-                "author": "Christopher E. Moody (2016)"
-            },
-            "Predicting Pre-click Quality for Native Advertisements": {
-                "url": "https://www.semanticscholar.org/paper/Predicting-Pre-click-Quality-for-Native-Zhou-Redi/564985430ff2fbc3a9daa9c2af8997b7f5046da8",
-                "author": "Ke Zhou et al. (2016)"
-            },
-            "Threat detection in online discussions": {
-                "url": "https://www.semanticscholar.org/paper/Threat-detection-in-online-discussions-Wester-%C3%98vrelid/f4150e2fb4d8646ebc2ea84f1a86afa1b593239b",
-                "author": "Aksel Wester et al. (2016)"
-            },
-            "The language of mental health problems in social media": {
-                "url": "https://www.semanticscholar.org/paper/The-language-of-mental-health-problems-in-social-Gkotsis-Oellrich/537db6c2984514d92a754a591841e2e20845985a",
-                "author": "George Gkotsis et al. (2016)"
-            }
-        }
-    },
-
-    "tutorials": {
-        "title": "Tutorials",
-        "next": "showcase",
-
-        "first_steps": {
-            "Setting up an NLP environment with Python": {
-                "url": "https://shirishkadam.com/2016/10/06/setting-up-natural-language-processing-environment-with-python/",
-                "author": "Shirish Kadam"
-            },
-            "NLP with spaCy in 10 lines of code": {
-                "url": "https://github.com/cytora/pycon-nlp-in-10-lines",
-                "author": "Andraz Hribernik et al. (Cytora)",
-                "tags": ["jupyter"]
-            },
-            "Intro to NLP with spaCy": {
-                "url": "https://nicschrading.com/project/Intro-to-NLP-with-spaCy/",
-                "author": "J Nicolas Schrading"
-            },
-            "NLP with spaCy and IPython Notebook": {
-                "url": "http://blog.sharepointexperience.com/2016/01/nlp-and-sharepoint-part-1/",
-                "author": "Dustin Miller (SharePoint)",
-                "tags": ["jupyter"]
-            },
-            "Getting Started with spaCy": {
-                "url": "http://textminingonline.com/getting-started-with-spacy",
-                "author": "TextMiner"
-            },
-            "spaCy – A fast natural language processing library": {
-                "url": "https://bjoernkw.com/2015/11/22/spacy-a-fast-natural-language-processing-library/",
-                "author": "Björn Wilmsmann"
-            },
-            "NLP (almost) From Scratch - POS Network with spaCy": {
-                "url": "http://sujitpal.blogspot.de/2016/07/nlp-almost-from-scratch-implementing.html",
-                "author": "Sujit Pal",
-                "tags": ["gensim", "keras"]
-            },
-            "NLP tasks with various libraries": {
-                "url": "http://clarkgrubb.com/nlp",
-                "author": "Clark Grubb"
-            },
-            "A very (very) short primer on spacy.io": {
-                "url": "http://blog.milonimrod.com/2015/10/a-very-very-short-primer-on-spacyio.html",
-                "author": "Nimrod Milo  "
-            }
-        },
-
-        "deep_dives": {
-            "Modern NLP in Python – What you can learn about food by analyzing a million Yelp reviews": {
-                "url": "http://nbviewer.jupyter.org/github/skipgram/modern-nlp-in-python/blob/master/executable/Modern_NLP_in_Python.ipynb",
-                "author": "Patrick Harrison (S&P Global)",
-                "tags": ["jupyter", "gensim"]
-            },
-            "Deep Learning with custom pipelines and Keras": {
-                "url": "https://explosion.ai/blog/spacy-deep-learning-keras",
-                "author": "Matthew Honnibal",
-                "tags": ["keras", "sentiment"]
-            },
-            "A decomposable attention model for Natural Language Inference": {
-                "url": "https://github.com/explosion/spaCy/tree/master/examples/keras_parikh_entailment",
-                "author": "Matthew Honnibal",
-                "tags": ["keras", "similarity"]
-            },
-
-            "Using the German model": {
-                "url": "https://explosion.ai/blog/german-model",
-                "author": "Wolfgang Seeker",
-                "tags": ["multi-lingual"]
-            },
-            "Sense2vec with spaCy and Gensim": {
-                "url": "https://explosion.ai/blog/sense2vec-with-spacy",
-                "author": "Matthew Honnibal",
-                "tags": ["big data", "gensim"]
-            },
-            "Building your bot's brain with Node.js and spaCy": {
-                "url": "https://explosion.ai/blog/chatbot-node-js-spacy",
-                "author": "Wah Loon Keng",
-                "tags": ["bots", "node.js"]
-            },
-            "An intent classifier with spaCy": {
-                "url": "http://blog.themusio.com/2016/07/18/musios-intent-classifier-2/",
-                "author": "Musio",
-                "tags": ["bots", "keras"]
-            },
-            "Visual Question Answering with spaCy": {
-                "url": "http://iamaaditya.github.io/2016/04/visual_question_answering_demo_notebook",
-                "author": "Aaditya Prakash",
-                "tags": ["vqa", "keras"]
-            },
-            "Extracting time suggestions from emails with spaCy": {
-                "url": "https://medium.com/redsift-outbox/what-time-cc9ce0c2aed2",
-                "author": "Chris Savvopoulos",
-                "tags": ["ner"]
-            },
-
-            "Advanced text analysis with spaCy and Scikit-Learn": {
-                "url": "https://github.com/JonathanReeve/advanced-text-analysis-workshop-2017/blob/master/advanced-text-analysis.ipynb",
-                "author": "Jonathan Reeve",
-                "tags": ["jupyter", "scikit-learn"]
-            }
-        },
-
-        "code": {
-            "Training a new entity type": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/training/train_new_entity_type.py",
-                "author": "Matthew Honnibal",
-                "tags": ["ner", "training"]
-            },
-
-            "Training an NER system from scratch": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/training/train_ner_standalone.py",
-                "author": "Matthew Honnibal",
-                "tags": ["ner", "training"]
-            },
-
-            "Information extraction": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/information_extraction.py",
-                "author": "Matthew Honnibal",
-                "tags": ["snippet"]
-            },
-            "Neural bag of words": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/nn_text_class.py",
-                "author": "Matthew Honnibal",
-                "tags": ["sentiment"]
-            },
-            "Part-of-speech tagging": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/pos_tag.py",
-                "author": "Matthew Honnibal",
-                "tags": ["pos"]
-            },
-            "Parallel parse": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/parallel_parse.py",
-                "author": "Matthew Honnibal",
-                "tags": ["big data"]
-            },
-            "Inventory count": {
-                "url": "https://github.com/explosion/spaCy/tree/master/examples/inventory_count",
-                "author": "Oleg Zd"
-            },
-            "Multi-word matches": {
-                "url": "https://github.com/explosion/spaCy/blob/master/examples/multi_word_matches.py",
-                "author": "Matthew Honnibal",
-                "tags": ["matcher", "out of date"]
-            }
-        }
-    }
-}
diff --git a/website/docs/usage/_models-list.jade b/website/docs/usage/_models-list.jade
deleted file mode 100644
index 195df9f56..000000000
--- a/website/docs/usage/_models-list.jade
+++ /dev/null
@@ -1,24 +0,0 @@
-//- 💫 DOCS > USAGE > MODELS LIST
-
-include ../../_includes/_mixins
-
-p
-    |  Model differences are mostly statistical. In general, we do expect larger
-    |  models to be "better" and more accurate overall. Ultimately, it depends on
-    |  your use case and requirements, and we recommend starting with the default
-    |  models (marked with a star below).
-
-+aside
-    |  Models are now available as #[code .tar.gz] archives #[+a(gh("spacy-models")) from GitHub],
-    |  attached to individual releases. They can be downloaded and loaded manually,
-    |  or using spaCy's #[code download] and #[code link] commands. All models
-    |  follow the naming convention of #[code [language]_[type]_[genre]_[size]].
-    | #[br]#[br]
-
-    +button(gh("spacy-models"), true, "primary").u-text-tag
-        |  View model releases
-
-+table(["Name", "Language", "Voc", "Dep", "Ent", "Vec", "Size", "License"])
-    for models, lang in MODELS
-        for model, i in models
-            +model-row(model.id, model.lang, model.feats, model.size, model.license, model.def || models.length == 1, i == 0)
diff --git a/website/docs/usage/deep-learning.jade b/website/docs/usage/deep-learning.jade
deleted file mode 100644
index 78448e43e..000000000
--- a/website/docs/usage/deep-learning.jade
+++ /dev/null
@@ -1,92 +0,0 @@
-//- 💫 DOCS > USAGE > DEEP LEARNING
-
-include ../../_includes/_mixins
-
-p
-    |  In this example, we'll be using #[+a("https://keras.io/") Keras], as
-    |  it's the most popular deep learning library for Python. Using Keras,
-    |  we will write a custom sentiment analysis model that predicts whether a
-    |  document is positive or negative. Then, we will use it to find which entities
-    |  are commonly associated with positive or negative documents. Here's a
-    |  quick example of how that can look at runtime.
-
-+aside("What's Keras?")
-    |  #[+a("https://keras.io/") Keras] gives you a high-level, declarative
-    |  interface to define neural networks. Models are trained using Google's
-    |  #[+a("https://www.tensorflow.org") TensorFlow] by default.
-    |  #[+a("http://deeplearning.net/software/theano/") Theano] is also
-    |  supported.
-
-+under-construction
-
-p
-    |  For most applications, I it's recommended to use pre-trained word embeddings
-    |  without "fine-tuning". This means that you'll use the same embeddings
-    |  across different models, and avoid learning adjustments to them on your
-    |  training data. The embeddings table is large, and the values provided by
-    |  the pre-trained vectors are already pretty good. Fine-tuning the
-    |  embeddings table is therefore a waste of your "parameter budget". It's
-    |  usually better to make your network larger some other way, e.g. by
-    |  adding another LSTM layer, using attention mechanism, using character
-    |  features, etc.
-
-+h(2, "attribute-hooks") Attribute hooks
-
-+under-construction
-
-p
-    |  Earlier, we saw how to store data in the new generic #[code user_data]
-    |  dict. This generalises well, but it's not terribly satisfying. Ideally,
-    |  we want to let the custom data drive more "native" behaviours. For
-    |  instance, consider the #[code .similarity()] methods provided by spaCy's
-    |  #[+api("doc") #[code Doc]], #[+api("token") #[code Token]] and
-    |  #[+api("span") #[code Span]] objects:
-
-+code("Polymorphic similarity example").
-    span.similarity(doc)
-    token.similarity(span)
-    doc1.similarity(doc2)
-
-p
-    |  By default, this just averages the vectors for each document, and
-    |  computes their cosine. Obviously, spaCy should make it easy for you to
-    |  install your own similarity model. This introduces a tricky design
-    |  challenge. The current solution is to add three more dicts to the
-    |  #[code Doc] object:
-
-+aside("Implementation note")
-    |  The hooks live on the #[code Doc] object because the #[code Span] and
-    |  #[code Token] objects are created lazily, and don't own any data. They
-    |  just proxy to their parent #[code Doc]. This turns out to be convenient
-    |  here — we only have to worry about installing hooks in one place.
-
-+table(["Name", "Description"])
-    +row
-        +cell #[code user_hooks]
-        +cell Customise behaviour of #[code doc.vector], #[code doc.has_vector], #[code doc.vector_norm] or #[code doc.sents]
-
-    +row
-        +cell #[code user_token_hooks]
-        +cell Customise behaviour of #[code token.similarity], #[code token.vector], #[code token.has_vector], #[code token.vector_norm] or #[code token.conjuncts]
-
-    +row
-        +cell #[code user_span_hooks]
-        +cell Customise behaviour of #[code span.similarity], #[code span.vector], #[code span.has_vector], #[code span.vector_norm] or #[code span.root]
-
-p
-    |  To sum up, here's an example of hooking in custom #[code .similarity()]
-    |  methods:
-
-+code("Add custom similarity hooks").
-    class SimilarityModel(object):
-        def __init__(self, model):
-            self._model = model
-
-        def __call__(self, doc):
-            doc.user_hooks['similarity'] = self.similarity
-            doc.user_span_hooks['similarity'] = self.similarity
-            doc.user_token_hooks['similarity'] = self.similarity
-
-        def similarity(self, obj1, obj2):
-            y = self._model([obj1.vector, obj2.vector])
-            return float(y[0])
diff --git a/website/docs/usage/index.jade b/website/docs/usage/index.jade
deleted file mode 100644
index 817b08ba9..000000000
--- a/website/docs/usage/index.jade
+++ /dev/null
@@ -1,351 +0,0 @@
-//- 💫 DOCS > USAGE
-
-include ../../_includes/_mixins
-
-p
-    |  spaCy is compatible with #[strong 64-bit CPython 2.6+∕3.3+] and
-    |  runs on #[strong Unix/Linux], #[strong macOS/OS X] and
-    |  #[strong Windows]. The latest spaCy releases are
-    |  available over #[+a("https://pypi.python.org/pypi/spacy") pip] (source
-    |  packages only) and #[+a("https://anaconda.org/conda-forge/spacy") conda].
-    |  Installation requires a working build environment. See notes on
-    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") macOS/OS X]
-    |  and #[a(href="#source-windows") Windows] for details.
-
-+quickstart(QUICKSTART, "Quickstart")
-    +qs({config: 'venv', python: 2}) python -m pip install -U virtualenv
-    +qs({config: 'venv', python: 3}) python -m pip install -U venv
-    +qs({config: 'venv', python: 2}) virtualenv .env
-    +qs({config: 'venv', python: 3}) venv .env
-    +qs({config: 'venv', os: 'mac'}) source .env/bin/activate
-    +qs({config: 'venv', os: 'linux'}) source .env/bin/activate
-    +qs({config: 'venv', os: 'windows'}) .env\Scripts\activate
-
-    +qs({config: 'gpu', os: 'mac'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
-    +qs({config: 'gpu', os: 'linux'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
-
-    +qs({package: 'pip'}) pip install -U spacy
-    +qs({package: 'conda'}) conda install -c conda-forge spacy
-
-    +qs({package: 'source'}) git clone https://github.com/explosion/spaCy
-    +qs({package: 'source'}) cd spaCy
-    +qs({package: 'source'}) pip install -r requirements.txt
-    +qs({package: 'source'}) pip install -e .
-
-    +qs({model: 'en'}) python -m spacy download en
-    +qs({model: 'de'}) python -m spacy download de
-    +qs({model: 'fr'}) python -m spacy download fr
-    +qs({model: 'es'}) python -m spacy download es
-
-+h(2, "installation") Installation instructions
-
-+h(3, "pip") pip
-    +badge("pipy")
-
-p Using pip, spaCy releases are currently only available as source packages.
-
-+code(false, "bash").
-    pip install -U spacy
-
-+aside("Download models")
-    |  After installation you need to download a language model. For more info
-    |  and available models, see the #[+a("/docs/usage/models") docs on models].
-
-    +code.o-no-block.
-        python -m spacy download en
-
-        >>> import spacy
-        >>> nlp = spacy.load('en')
-
-p
-    |  When using pip it is generally recommended to install packages in a
-    |  #[code virtualenv] to avoid modifying system state:
-
-+code(false, "bash").
-    virtualenv .env
-    source .env/bin/activate
-    pip install spacy
-
-+h(3, "conda") conda
-    +badge("conda")
-
-p
-    |  Thanks to our great community, we've finally re-added conda support. You
-    |  can now install spaCy via #[code conda-forge]:
-
-+code(false, "bash").
-    conda config --add channels conda-forge
-    conda install spacy
-
-p
-    |  For the feedstock including the build recipe and configuration, check out
-    |  #[+a("https://github.com/conda-forge/spacy-feedstock") this repository].
-    |  Improvements and pull requests to the recipe and setup are always appreciated.
-
-+h(2, "gpu") Run spaCy with GPU
-
-p
-    |  As of v2.0, spaCy's comes with neural network models that are implemented
-    |  in our machine learning library, #[+a(gh("thinc")) Thinc]. For GPU
-    |  support, we've been grateful to use the work of
-    |  #[+a("http://chainer.org") Chainer]'s CuPy module, which provides
-    |  a NumPy-compatible interface for GPU arrays.
-
-p
-    |  First, install follows the normal CUDA installation procedure. Next, set
-    |  your environment variables so that the installation will be able to find
-    |  CUDA. Finally, install spaCy.
-
-+code(false, "bash").
-   export CUDA_HOME=/usr/local/cuda-8.0 # Or wherever your CUDA is
-   export PATH=$PATH:$CUDA_HOME/bin
-
-   pip install spacy
-   python -c "import thinc.neural.gpu_ops" # Check the GPU ops were built
-
-+h(2, "source") Compile from source
-
-p
-    |  The other way to install spaCy is to clone its
-    |  #[+a(gh("spaCy")) GitHub repository] and build it from source. That is
-    |  the common way if you want to make changes to the code base. You'll need to
-    |  make sure that you have a development enviroment consisting of a Python
-    |  distribution including header files, a compiler,
-    |  #[+a("https://pip.pypa.io/en/latest/installing/") pip],
-    |  #[+a("https://virtualenv.pypa.io/") virtualenv] and
-    |  #[+a("https://git-scm.com") git] installed. The compiler part is the
-    |  trickiest. How to do that depends on your system. See notes on
-    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") OS X] and
-    |  #[a(href="#source-windows") Windows] for details.
-
-+code(false, "bash").
-    # make sure you are using recent pip/virtualenv versions
-    python -m pip install -U pip virtualenv
-    git clone #{gh("spaCy")}
-    cd spaCy
-
-    virtualenv .env
-    source .env/bin/activate
-    pip install -r requirements.txt
-    pip install -e .
-
-p
-    |  Compared to regular install via pip, #[+a(gh("spaCy", "requirements.txt")) requirements.txt]
-    |  additionally installs developer dependencies such as Cython.
-
-p
-    |  Instead of the above verbose commands, you can also use the following
-    |  #[+a("http://www.fabfile.org/") Fabric] commands:
-
-+table(["Command", "Description"])
-    +row
-        +cell #[code fab env]
-        +cell Create #[code virtualenv] and delete previous one, if it exists.
-
-    +row
-        +cell #[code fab make]
-        +cell Compile the source.
-
-    +row
-        +cell #[code fab clean]
-        +cell Remove compiled objects, including the generated C++.
-
-    +row
-        +cell #[code fab test]
-        +cell Run basic tests, aborting after first failure.
-
-p
-    |  All commands assume that your #[code virtualenv] is located in a
-    |  directory #[code .env]. If you're using a different directory, you can
-    |  change it via the environment variable #[code VENV_DIR], for example:
-
-+code(false, "bash").
-    VENV_DIR=".custom-env" fab clean make
-
-+h(3, "source-ubuntu") Ubuntu
-
-p Install system-level dependencies via #[code apt-get]:
-
-+code(false, "bash").
-    sudo apt-get install build-essential python-dev git
-
-+h(3, "source-osx") macOS / OS X
-
-p
-    |  Install a recent version of #[+a("https://developer.apple.com/xcode/") XCode],
-    |  including the so-called "Command Line Tools". macOS and OS X ship with
-    |  Python and git preinstalled. To compile spaCy with multi-threading support
-    |  on macOS / OS X, #[+a("https://github.com/explosion/spaCy/issues/267") see here].
-
-+h(3, "source-windows") Windows
-
-p
-    |  Install a version of
-    |  #[+a("https://www.visualstudio.com/vs/visual-studio-express/") Visual Studio Express]
-    |  that matches the version that was used to compile your Python
-    |  interpreter. For official distributions these are:
-
-+table([ "Distribution", "Version"])
-    +row
-        +cell Python 2.7
-        +cell Visual Studio 2008
-
-    +row
-        +cell Python 3.4
-        +cell Visual Studio 2010
-
-    +row
-        +cell Python 3.5+
-        +cell Visual Studio 2015
-
-+h(2, "troubleshooting") Troubleshooting guide
-
-p
-    |  This section collects some of the most common errors you may come
-    |  across when installing, loading and using spaCy, as well as their solutions.
-
-+aside("Help us improve this guide")
-    |  Did you come across a problem like the ones listed here and want to
-    |  share the solution? You can find the "Suggest edits" button at the
-    |  bottom of this page that points you to the source. We always
-    |  appreciate #[+a(gh("spaCy") + "/pulls") pull requests]!
-
-+h(3, "compatible-model") No compatible model found
-
-+code(false, "text").
-    No compatible model found for [lang] (spaCy v#{SPACY_VERSION}).
-
-p
-    |  This usually means that the model you're trying to download does not
-    |  exist, or isn't available for your version of spaCy. Check the
-    |  #[+a(gh("spacy-models", "compatibility.json")) compatibility table]
-    |  to see which models are available for your spaCy version. If you're using
-    |  an old version, consider upgrading to the latest release. Note that while
-    |  spaCy supports tokenization for
-    |  #[+a("/docs/api/language-models/#alpha-support") a variety of languages],
-    |  not all of them come with statistical models. To only use the tokenizer,
-    |  import the language's #[code Language] class instead, for example
-    |  #[code from spacy.fr import French].
-
-+h(3, "symlink-privilege") Symbolic link privilege not held
-
-+code(false, "text").
-    OSError: symbolic link privilege not held
-
-p
-    |  To create #[+a("/docs/usage/models/#usage") shortcut links] that let you
-    |  load models by name, spaCy creates a symbolic link in the
-    |  #[code spacy/data] directory. This means your user needs permission to do
-    |  this. The above error mostly occurs when doing a system-wide installation,
-    |  which will create the symlinks in a system directory. Run the
-    |  #[code download] or #[code link] command as administrator, or use a
-    |  #[code virtualenv] to install spaCy in a user directory, instead
-    |  of doing a system-wide installation.
-
-+h(3, "no-cache-dir") No such option: --no-cache-dir
-
-+code(false, "text").
-    no such option: --no-cache-dir
-
-p
-    |  The #[code download] command uses pip to install the models and sets the
-    |  #[code --no-cache-dir] flag to prevent it from requiring too much memory.
-    |  #[+a("https://pip.pypa.io/en/stable/reference/pip_install/#caching") This setting]
-    |  requires pip v6.0 or newer. Run #[code pip install -U pip] to upgrade to
-    |  the latest version of pip. To see which version you have installed,
-    |  run #[code pip --version].
-
-+h(3, "import-error") Import error
-
-+code(false, "text").
-    Import Error: No module named spacy
-
-p
-    |  This error means that the spaCy module can't be located on your system, or in
-    |  your environment. Make sure you have spaCy installed. If you're using a
-    |  #[code virtualenv], make sure it's activated and check that spaCy is
-    |  installed in that environment – otherwise, you're trying to load a system
-    |  installation. You can also run #[code which python] to find out where
-    |  your Python executable is located.
-
-+h(3, "import-error-models") Import error: models
-
-+code(false, "text").
-    ImportError: No module named 'en_core_web_sm'
-
-p
-    |  As of spaCy v1.7, all models can be installed as Python packages. This means
-    |  that they'll become importable modules of your application. When creating
-    |  #[+a("/docs/usage/models/#usage") shortcut links], spaCy will also try
-    |  to import the model to load its meta data. If this fails, it's usually a
-    |  sign that the package is not installed in the current environment.
-    |  Run #[code pip list] or #[code pip freeze] to check which model packages
-    |  you have installed, and install the
-    |  #[+a("/docs/usage/models#available") correct models] if necessary. If you're
-    |  importing a model manually at the top of a file, make sure to use the name
-    |  of the package, not the shortcut link you've created.
-
-+h(3, "vocab-strings") File not found: vocab/strings.json
-
-+code(false, "text").
-    FileNotFoundError: No such file or directory: [...]/vocab/strings.json
-
-p
-    |  This error may occur when using #[code spacy.load()] to load
-    |  a language model – either because you haven't set up a
-    |  #[+a("/docs/usage/models/#usage") shortcut link] for it, or because it
-    |  doesn't actually exist. Set up a
-    |  #[+a("/docs/usage/models/#usage") shortcut link] for the model
-    |  you want to load. This can either be an installed model package, or a
-    |  local directory containing the model data. If you want to use one of the
-    |  #[+a("/docs/api/language-models/#alpha-support") alpha tokenizers] for
-    |  languages that don't yet have a statistical model, you should import its
-    |  #[code Language] class instead, for example
-    |  #[code from spacy.lang.bn import Bengali].
-
-+h(3, "command-not-found") Command not found
-
-+code(false, "text").
-    command not found: spacy
-
-p
-    |  This error may occur when running the #[code spacy] command from the
-    |  command line. spaCy does not currently add an entry to our #[code PATH]
-    |  environment variable, as this can lead to unexpected results, especially
-    |  when using #[code virtualenv]. Run the command with #[code python -m],
-    |  for example #[code python -m spacy download en]. For more info on this,
-    |  see #[+api("cli#download") download].
-
-+h(3, "module-load") 'module' object has no attribute 'load'
-
-+code(false, "text").
-    AttributeError: 'module' object has no attribute 'load'
-
-p
-    |  While this could technically have many causes, including spaCy being
-    |  broken, the most likely one is that your script's file or directory name
-    |  is "shadowing" the module – e.g. your file is called #[code spacy.py],
-    |  or a directory you're importing from is called #[code spacy]. So, when
-    |  using spaCy, never call anything else #[code spacy].
-
-+h(2, "tests") Run tests
-
-p
-    |  spaCy comes with an #[+a(gh("spacy", "spacy/tests")) extensive test suite].
-    |  First, find out where spaCy is installed:
-
-+code(false, "bash").
-    python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))"
-
-p
-    |  Then run #[code pytest] on that directory. The flags #[code --slow] and
-    |  #[code --model] are optional and enable additional tests.
-
-+code(false, "bash").
-    # make sure you are using recent pytest version
-    python -m pip install -U pytest
-
-    python -m pytest <spacy-directory>                 # basic tests
-    python -m pytest <spacy-directory> --slow          # basic and slow tests
-    python -m pytest <spacy-directory> --models --all  # basic and all model tests
-    python -m pytest <spacy-directory> --models --en   # basic and English model tests
diff --git a/website/docs/usage/language-processing-pipeline.jade b/website/docs/usage/language-processing-pipeline.jade
deleted file mode 100644
index 03f6c28f5..000000000
--- a/website/docs/usage/language-processing-pipeline.jade
+++ /dev/null
@@ -1,353 +0,0 @@
-//- 💫 DOCS > USAGE > PIPELINE
-
-include ../../_includes/_mixins
-
-+h(2, "101") Pipelines 101
-
-include _spacy-101/_pipelines
-
-+h(2, "pipelines") How pipelines work
-
-p
-    |  spaCy makes it very easy to create your own pipelines consisting of
-    |  reusable components – this includes spaCy's default tensorizer, tagger,
-    |  parser and entity regcognizer, but also your own custom processing
-    |  functions. A pipeline component can be added to an already existing
-    |  #[code nlp] object, specified when initialising a #[code Language] class,
-    |  or defined within a
-    |  #[+a("/docs/usage/saving-loading#models-generating") model package].
-
-p
-    |  When you load a model, spaCy first consults the model's
-    |  #[+a("/docs/usage/saving-loading#models-generating") meta.json]. The
-    |  meta typically includes the model details, the ID of a language class,
-    |  and an optional list of pipeline components. spaCy then does the
-    |  following:
-
-+aside-code("meta.json (excerpt)", "json").
-    {
-        "name": "example_model",
-        "lang": "en"
-        "description": "Example model for spaCy",
-        "pipeline": ["token_vectors", "tagger"]
-    }
-
-+list("numbers")
-    +item
-        |  Look up #[strong pipeline IDs] in the available
-        |  #[strong pipeline factories].
-    +item
-        |  Initialise the #[strong pipeline components] by calling their
-        |  factories with the #[code Vocab] as an argument. This gives each
-        |  factory and component access to the pipeline's shared data, like
-        |  strings, morphology and annotation scheme.
-    +item
-        |  Load the #[strong language class and data] for the given ID via
-        |  #[+api("util.get_lang_class") #[code get_lang_class]].
-    +item
-        |  Pass the path to the #[strong model data] to the #[code Language]
-        |  class and return it.
-
-p
-    |  So when you call this...
-
-+code.
-    nlp = spacy.load('en')
-
-p
-    | ... the model tells spaCy to use the pipeline
-    |  #[code ["tensorizer", "tagger", "parser", "ner"]]. spaCy will then look
-    |  up each string in its internal factories registry and initialise the
-    |  individual components. It'll then load #[code spacy.lang.en.English],
-    |  pass it the path to the model's data directory, and return it for you
-    |  to use as the #[code nlp] object.
-
-p
-    |  When you call #[code nlp] on a text, spaCy will #[strong tokenize] it and
-    |  then #[strong call each component] on the #[code Doc], in order.
-    |  Components all return the modified document, which is then processed by
-    |  the component next in the pipeline.
-
-+code("The pipeline under the hood").
-    doc = nlp.make_doc(u'This is a sentence')
-    for proc in nlp.pipeline:
-        doc = proc(doc)
-
-+h(2, "creating") Creating pipeline components and factories
-
-p
-    |  spaCy lets you customise the pipeline with your own components. Components
-    |  are functions that receive a #[code Doc] object, modify and return it.
-    |  If your component is stateful, you'll want to create a new one for each
-    |  pipeline. You can do that by defining and registering a factory which
-    |  receives the shared #[code Vocab] object and returns a component.
-
-+h(3, "creating-component") Creating a  component
-
-p
-    |  A component receives a #[code Doc] object and
-    |  #[strong performs the actual processing] – for example, using the current
-    |  weights to make a prediction and set some annotation on the document. By
-    |  adding a component to the pipeline, you'll get access to the #[code Doc]
-    |  at any point #[strong during] processing – instead of only being able to
-    |  modify it afterwards.
-
-+aside-code("Example").
-    def my_component(doc):
-        # do something to the doc here
-        return doc
-
-+table(["Argument", "Type", "Description"])
-    +row
-        +cell #[code doc]
-        +cell #[code Doc]
-        +cell The #[code Doc] object processed by the previous component.
-
-    +footrow
-        +cell returns
-        +cell #[code Doc]
-        +cell The #[code Doc] object processed by this pipeline component.
-
-p
-    |  When creating a new #[code Language] class, you can pass it a list of
-    |  pipeline component functions to execute in that order. You can also
-    |  add it to an existing pipeline by modifying #[code nlp.pipeline] – just
-    |  be careful not to overwrite a pipeline or its components by accident!
-
-+code.
-    # Create a new Language object with a pipeline
-    from spacy.language import Language
-    nlp = Language(pipeline=[my_component])
-
-    # Modify an existing pipeline
-    nlp = spacy.load('en')
-    nlp.pipeline.append(my_component)
-
-+h(3, "creating-factory") Creating a factory
-
-p
-    |  A factory is a #[strong function that returns a pipeline component].
-    |  It's called with the #[code Vocab] object, to give it access to the
-    |  shared data between components – for example, the strings, morphology,
-    |  vectors or annotation scheme. Factories are useful for creating
-    |  #[strong stateful components], especially ones which
-    |  #[strong depend on shared data].
-
-+aside-code("Example").
-    def my_factory(vocab):
-        # load some state
-        def my_component(doc):
-            # process the doc
-            return doc
-        return my_component
-
-+table(["Argument", "Type", "Description"])
-    +row
-        +cell #[code vocab]
-        +cell #[code Vocab]
-        +cell
-            |  Shared data between components, including strings, morphology,
-            |  vectors etc.
-
-    +footrow
-        +cell returns
-        +cell callable
-        +cell The pipeline component.
-
-p
-    |  By creating a factory, you're essentially telling spaCy how to get the
-    |  pipeline component #[strong once the vocab is available]. Factories need to
-    |  be registered via #[+api("spacy#set_factory") #[code set_factory()]] and
-    |  by assigning them a unique ID. This ID can be added to the pipeline as a
-    |  string. When creating a pipeline, you're free to mix strings and
-    |  callable components:
-
-+code.
-    spacy.set_factory('my_factory', my_factory)
-    nlp = Language(pipeline=['my_factory', my_other_component])
-
-p
-    |  If spaCy comes across a string in the pipeline, it will try to resolve it
-    |  by looking it up in the available factories. The factory will then be
-    |  initialised with the #[code Vocab]. Providing factory names instead of
-    |  callables also makes it easy to specify them in the model's
-    |  #[+a("/docs/usage/saving-loading#models-generating") meta.json]. If you're
-    |  training your own model and want to use one of spaCy's default components,
-    |  you won't have to worry about finding and implementing it either – to use
-    |  the default tagger, simply add #[code "tagger"] to the pipeline, and
-    |  #[strong spaCy will know what to do].
-
-
-+infobox("Important note")
-    |  Because factories are #[strong resolved on initialisation] of the
-    |  #[code Language] class, it's #[strong not possible] to add them to the
-    |  pipeline afterwards, e.g. by modifying #[code nlp.pipeline]. This only
-    |  works with individual component functions. To use factories, you need to
-    |  create a new #[code Language] object, or generate a
-    |  #[+a("/docs/usage/saving-loading#models-generating") model package] with
-    |  a custom pipeline.
-
-+aside("Real-world examples")
-    |  To see real-world examples of pipeline factories and components in action,
-    |  you can have a look at the source of spaCy's built-in components, e.g.
-    |  the #[+api("tagger") #[code Tagger]], #[+api("parser") #[code Parser]] or
-    |  #[+api("entityrecognizer") #[code EntityRecongnizer]].
-
-+h(2, "example1") Example: Custom sentence segmentation logic
-
-p
-    |  Let's say you want to implement custom logic to improve spaCy's sentence
-    |  boundary detection. Currently, sentence segmentation is based on the
-    |  dependency parse, which doesn't always produce ideal results. The custom
-    |  logic should therefore be applied #[strong after] tokenization, but
-    |  #[strong before] the dependency parsing – this way, the parser can also
-    |  take advantage of the sentence boundaries.
-
-+code.
-    def sbd_component(doc):
-        for i, token in enumerate(doc[:-2]):
-            # define sentence start if period + titlecase token
-            if token.text == '.' and doc[i+1].is_title:
-                doc[i+1].sent_start = True
-        return doc
-
-p
-    |  In this case, we simply want to add the component to the existing
-    |  pipeline of the English model. We can do this by inserting it at index 0
-    |  of #[code nlp.pipeline]:
-
-+code.
-    nlp = spacy.load('en')
-    nlp.pipeline.insert(0, sbd_component)
-
-p
-    |  When you call #[code nlp] on some text, spaCy will tokenize it to create
-    |  a #[code Doc] object, and first call #[code sbd_component] on it, followed
-    |  by the model's default pipeline.
-
-+h(2, "example2") Example: Sentiment model
-
-p
-    |  Let's say you have trained your own document sentiment model on English
-    |  text. After tokenization, you want spaCy to first execute the
-    |  #[strong default tensorizer], followed by a custom
-    |  #[strong sentiment component] that adds a #[code .sentiment]
-    |  property to the #[code Doc], containing your model's sentiment precition.
-
-p
-    |  Your component class will have a #[code from_disk()] method that spaCy
-    |  calls to load the model data. When called, the component will compute
-    |  the sentiment score, add it to the #[code Doc] and return the modified
-    |  document. Optionally, the component can include an #[code update()] method
-    |  to allow training the model.
-
-+code.
-    import pickle
-    from pathlib import Path
-
-    class SentimentComponent(object):
-        def __init__(self, vocab):
-            self.weights = None
-
-        def __call__(self, doc):
-            doc.sentiment = sum(self.weights*doc.vector) # set sentiment property
-            return doc
-
-        def from_disk(self, path): # path = model path + factory ID ('sentiment')
-            self.weights = pickle.load(Path(path) / 'weights.bin') # load weights
-            return self
-
-        def update(self, doc, gold): # update weights – allows training!
-            prediction = sum(self.weights*doc.vector)
-            self.weights -= 0.001*doc.vector*(prediction-gold.sentiment)
-
-p
-    |  The factory will initialise the component with the #[code Vocab] object.
-    |  To be able to add it to your model's pipeline as #[code 'sentiment'],
-    |  it also needs to be registered via
-    |  #[+api("spacy#set_factory") #[code set_factory()]].
-
-+code.
-    def sentiment_factory(vocab):
-        component = SentimentComponent(vocab) # initialise component
-        return component
-
-    spacy.set_factory('sentiment', sentiment_factory)
-
-p
-    |  The above code should be #[strong shipped with your model]. You can use
-    |  the #[+api("cli#package") #[code package]] command to create all required
-    |  files and directories. The model package will include an
-    |  #[+src(gh("spacy-dev-resources", "templates/model/en_model_name/__init__.py")) __init__.py]
-    |  with a #[code load()] method, that will initialise the language class with
-    |  the model's pipeline and call the #[code from_disk()] method to load
-    |  the model data.
-
-p
-    |  In the model package's meta.json, specify the language class and pipeline
-    |  IDs:
-
-+code("meta.json (excerpt)", "json").
-    {
-        "name": "sentiment_model",
-        "lang": "en",
-        "version": "1.0.0",
-        "spacy_version": ">=2.0.0,<3.0.0",
-        "pipeline": ["tensorizer", "sentiment"]
-    }
-
-p
-    |  When you load your new model, spaCy will call the model's #[code load()]
-    |  method. This will return a #[code Language] object with a pipeline
-    |  containing the default tensorizer, and the sentiment component returned
-    |  by your custom #[code "sentiment"] factory.
-
-+code.
-    nlp = spacy.load('en_sentiment_model')
-    doc = nlp(u'I love pizza')
-    assert doc.sentiment
-
-+infobox("Saving and loading models")
-    |  For more information and a detailed guide on how to package your model,
-    |  see the documentation on
-    |  #[+a("/docs/usage/saving-loading#models") saving and loading models].
-
-+h(2, "disabling") Disabling pipeline components
-
-p
-    |  If you don't need a particular component of the pipeline – for
-    |  example, the tagger or the parser, you can disable loading it. This can
-    |  sometimes make a big difference and improve loading speed. Disabled
-    |  component names can be provided to #[+api("spacy#load") #[code spacy.load()]],
-    |  #[+api("language#from_disk") #[code Language.from_disk()]] or the
-    |  #[code nlp] object itself as a list:
-
-+code.
-    nlp = spacy.load('en', disable['parser', 'tagger'])
-    nlp = English().from_disk('/model', disable=['tensorizer', 'ner'])
-    doc = nlp(u"I don't want parsed", disable=['parser'])
-
-p
-    |  Note that you can't write directly to #[code nlp.pipeline], as this list
-    |  holds the #[em actual components], not the IDs. However, if you know the
-    |  order of the components, you can still slice the list:
-
-+code.
-    nlp = spacy.load('en')
-    nlp.pipeline = nlp.pipeline[:2] # only use the first two components
-
-+infobox("Important note: disabling pipeline components")
-    .o-block
-        |  Since spaCy v2.0 comes with better support for customising the
-        |  processing pipeline components, the #[code parser], #[code tagger]
-        |  and #[code entity] keyword arguments have been replaced with
-        |  #[code disable], which takes a list of pipeline component names.
-        |  This lets you disable both default and custom components when loading
-        |  a model, or initialising a Language class via
-        |  #[+api("language-from_disk") #[code from_disk]].
-    +code-new.
-        nlp = spacy.load('en', disable=['tagger', 'ner'])
-        doc = nlp(u"I don't want parsed", disable=['parser'])
-    +code-old.
-        nlp = spacy.load('en', tagger=False, entity=False)
-        doc = nlp(u"I don't want parsed", parse=False)
diff --git a/website/docs/usage/production-use.jade b/website/docs/usage/production-use.jade
deleted file mode 100644
index 70227e648..000000000
--- a/website/docs/usage/production-use.jade
+++ /dev/null
@@ -1,147 +0,0 @@
-//- 💫 DOCS > USAGE > PROCESSING TEXT
-
-include ../../_includes/_mixins
-
-+under-construction
-
-+h(2, "multithreading") Multi-threading with #[code .pipe()]
-
-p
-    |  If you have a sequence of documents to process, you should use the
-    |  #[+api("language#pipe") #[code Language.pipe()]] method. The method takes
-    |  an iterator of texts, and accumulates an internal buffer,
-    |  which it works on in parallel. It then yields the documents in order,
-    |  one-by-one. After a long and bitter struggle, the global interpreter
-    |  lock was freed around spaCy's main parsing loop in v0.100.3. This means
-    |  that #[code .pipe()] will be significantly faster in most
-    |  practical situations, because it allows shared memory parallelism.
-
-+code.
-    for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
-       pass
-
-p
-    |  To make full use of the #[code .pipe()] function, you might want to
-    |  brush up on #[strong Python generators]. Here are a few quick hints:
-
-+list
-    +item
-        |  Generator comprehensions can be written as
-        |  #[code (item for item in sequence)].
-
-    +item
-        |  The
-        |  #[+a("https://docs.python.org/2/library/itertools.html") #[code itertools] built-in library]
-        |  and the
-        |  #[+a("https://github.com/pytoolz/cytoolz") #[code cytoolz] package]
-        |  provide a lot of handy #[strong generator tools].
-
-    +item
-        |  Often you'll have an input stream that pairs text with some
-        |  important meta data, e.g. a JSON document. To
-        |  #[strong pair up the meta data] with the processed #[code Doc]
-        |  object, you should use the #[code itertools.tee] function to split
-        |  the generator in two, and then #[code izip] the extra stream to the
-        |  document stream.
-
-+h(2, "own-annotations") Bringing your own annotations
-
-p
-    |  spaCy generally assumes by default that your data is raw text. However,
-    |  sometimes your data is partially annotated, e.g. with pre-existing
-    |  tokenization, part-of-speech tags, etc. The most common situation is
-    |  that you have pre-defined tokenization. If you have a list of strings,
-    |  you can create a #[code Doc] object directly. Optionally, you can also
-    |  specify a list of boolean values, indicating whether each word has a
-    |  subsequent space.
-
-+code.
-    doc = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
-
-p
-    |  If provided, the spaces list must be the same length as the words list.
-    |  The spaces list affects the #[code doc.text], #[code span.text],
-    |  #[code token.idx], #[code span.start_char] and #[code span.end_char]
-    |  attributes. If you don't provide a #[code spaces] sequence, spaCy will
-    |  assume that all words are whitespace delimited.
-
-+code.
-    good_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
-    bad_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'])
-    assert bad_spaces.text == u'Hello , world !'
-    assert good_spaces.text == u'Hello, world!'
-
-p
-    |  Once you have a #[+api("doc") #[code Doc]] object, you can write to its
-    |  attributes to set the part-of-speech tags, syntactic dependencies, named
-    |  entities and other attributes. For details, see the respective usage
-    |  pages.
-
-+h(2, "models") Working with models
-
-p
-    |  If your application depends on one or more #[+a("/docs/usage/models") models],
-    |  you'll usually want to integrate them into your continuous integration
-    |  workflow and build process. While spaCy provides a range of useful helpers
-    |  for downloading, linking and loading models, the underlying functionality
-    |  is entirely based on native Python packages. This allows your application
-    |  to handle a model like any other package dependency.
-
-+h(3, "models-download") Downloading and requiring model dependencies
-
-p
-    |  spaCy's built-in #[+api("cli#download") #[code download]] command
-    |  is mostly intended as a convenient, interactive wrapper. It performs
-    |  compatibility checks and prints detailed error messages and warnings.
-    |  However, if you're downloading models as part of an automated build
-    |  process, this only adds an unecessary layer of complexity. If you know
-    |  which models your application needs, you should be specifying them directly.
-
-p
-    |  Because all models are valid Python packages, you can add them to your
-    |  application's #[code requirements.txt]. If you're running your own
-    |  internal PyPi installation, you can simply upload the models there. pip's
-    |  #[+a("https://pip.pypa.io/en/latest/reference/pip_install/#requirements-file-format") requirements file format]
-    |  supports both package names to download via a PyPi server, as well as direct
-    |  URLs.
-
-+code("requirements.txt", "text").
-    spacy>=2.0.0,<3.0.0
-    -e #{gh("spacy-models")}/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz
-
-p
-    |  All models are versioned and specify their spaCy dependency. This ensures
-    |  cross-compatibility and lets you specify exact version requirements for
-    |  each model. If you've trained your own model, you can use the
-    |  #[+api("cli#package") #[code package]] command to generate the required
-    |  meta data and turn it into a loadable package.
-
-+h(3, "models-loading") Loading and testing models
-
-p
-    |  Downloading models directly via pip won't call spaCy's link
-    |  #[+api("cli#link") #[code link]] command, which creates
-    |  symlinks for model shortcuts. This means that you'll have to run this
-    |  command separately, or use the native #[code import] syntax to load the
-    |  models:
-
-+code.
-    import en_core_web_sm
-    nlp = en_core_web_sm.load()
-
-p
-    |  In general, this approach is recommended for larger code bases, as it's
-    |  more "native", and doesn't depend on symlinks or rely on spaCy's loader
-    |  to resolve string names to model packages. If a model can't be
-    |  imported, Python will raise an #[code ImportError] immediately. And if a
-    |  model is imported but not used, any linter will catch that.
-
-p
-    |  Similarly, it'll give you more flexibility when writing tests that
-    |  require loading models. For example, instead of writing your own
-    |  #[code try] and #[code except] logic around spaCy's loader, you can use
-    |  #[+a("http://pytest.readthedocs.io/en/latest/") pytest]'s
-    |  #[code importorskip()] method to only run a test if a specific model or
-    |  model version is installed. Each model package exposes a #[code __version__]
-    |  attribute which you can also use to perform your own version compatibility
-    |  checks before loading a model.
diff --git a/website/docs/usage/showcase.jade b/website/docs/usage/showcase.jade
deleted file mode 100644
index 66b7e6d86..000000000
--- a/website/docs/usage/showcase.jade
+++ /dev/null
@@ -1,44 +0,0 @@
-//- 💫 DOCS > USAGE > SHOWCASE
-
-include ../../_includes/_mixins
-
-p
-    |  On this page, we'll be featuring demos, libraries and products from
-    |  the spaCy community. Have you done something cool with spaCy?
-    |  #[a(href="mailto:#{EMAIL}") Let us know!]
-
-+h(2, "libraries") Third-party libraries
-
-+list
-    each details, title in libraries
-        +card-item(title, details)
-
-+h(2, "visualizations") Visualizations
-
-+grid
-    each details, name in visualizations
-        - details.image = "/assets/img/showcase/" + details.image
-        +card(name, details)
-
-+h(2, "products") Built with spaCy
-
-+grid
-    each details, name in products
-        - details.image = "/assets/img/showcase/" + details.image
-        +card(name, details)
-
-+h(2, "books") Books
-
-p We're excited to see books featuring spaCy already start to appear.
-
-+list
-    each details, title in books
-        +card-item(title, details)
-
-+h(2, "research") Research systems
-
-p Researchers are using spaCy to build ambitious, next-generation text processing technologies. spaCy is particularly popular amongst the biomedical NLP community, who are working on extracting knowledge from the huge volume of literature in their field. For an up-to-date list of the papers citing spaCy, see #[+a("https://www.semanticscholar.org/search?year%5B%5D=2015&year%5B%5D=2020&q=spacy&sort=relevance&ae=false") Semantic Scholar].
-
-+list
-    each details, title in research
-        +card-item(title, details)
diff --git a/website/docs/usage/spacy-101.jade b/website/docs/usage/spacy-101.jade
deleted file mode 100644
index f657ebf11..000000000
--- a/website/docs/usage/spacy-101.jade
+++ /dev/null
@@ -1,425 +0,0 @@
-//- 💫 DOCS > USAGE > SPACY 101
-
-include ../../_includes/_mixins
-
-p
-    |  Whether you're new to spaCy, or just want to brush up on some
-    |  NLP basics and implementation details – this page should have you covered.
-    |  Each section will explain one of spaCy's features in simple terms and
-    |  with examples or illustrations. Some sections will also reappear across
-    |  the usage guides as a quick introcution.
-
-+aside("Help us improve the docs")
-    |  Did you spot a mistake or come across explanations that
-    |  are unclear? We always appreciate improvement
-    |  #[+a(gh("spaCy") + "/issues") suggestions] or
-    |  #[+a(gh("spaCy") + "/pulls") pull requests]. You can find a "Suggest
-    |  edits" link at the bottom of each page that points you to the source.
-
-+h(2, "whats-spacy") What's spaCy?
-
-+grid.o-no-block
-    +grid-col("half")
-        p
-            |  spaCy is a #[strong free, open-source library] for advanced
-            |  #[strong Natural Language Processing] (NLP) in Python.
-
-        p
-            |  If you're working with a lot of text, you'll eventually want to
-            |  know more about it. For example, what's it about? What do the
-            |  words mean in context? Who is doing what to whom? What companies
-            |  and products are mentioned? Which texts are similar to each other?
-
-        p
-            |  spaCy is designed specifically for #[strong production use] and
-            |  helps you build applications that process and "understand"
-            |  large volumes of text. It can be used to build
-            |  #[strong information extraction] or
-            |  #[strong natural language understanding] systems, or to
-            |  pre-process text for #[strong deep learning].
-
-    +table-of-contents
-        +item #[+a("#features") Features]
-        +item #[+a("#annotations") Linguistic annotations]
-        +item #[+a("#annotations-token") Tokenization]
-        +item #[+a("#annotations-pos-deps") POS tags and dependencies]
-        +item #[+a("#annotations-ner") Named entities]
-        +item #[+a("#vectors-similarity") Word vectors and similarity]
-        +item #[+a("#pipelines") Pipelines]
-        +item #[+a("#vocab") Vocab, hashes and lexemes]
-        +item #[+a("#serialization") Serialization]
-        +item #[+a("#training") Training]
-        +item #[+a("#language-data") Language data]
-        +item #[+a("#architecture") Architecture]
-        +item #[+a("#community") Community & FAQ]
-
-+h(3, "what-spacy-isnt") What spaCy isn't
-
-+list
-    +item #[strong spaCy is not a platform or "an API"].
-        |  Unlike a platform, spaCy does not provide a software as a service, or
-        |  a web application. It's an open-source library designed to help you
-        |  build NLP applications, not a consumable service.
-    +item #[strong spaCy is not an out-of-the-box chat bot engine].
-        |  While spaCy can be used to power conversational applications, it's
-        |  not designed specifically for chat bots, and only provides the
-        |  underlying text processing capabilities.
-    +item #[strong spaCy is not research software].
-        |  It's is built on the latest research, but it's designed to get
-        |  things done. This leads to fairly different design decisions than
-        |  #[+a("https://github./nltk/nltk") NLTK]
-        |  or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were
-        |  created as platforms for teaching and research. The main difference
-        |  is that spaCy is integrated and opinionated. spaCy tries to avoid asking
-        |  the user to choose between multiple algorithms that deliver equivalent
-        |  functionality. Keeping the menu small lets spaCy deliver generally better
-        |  performance and developer experience.
-    +item #[strong spaCy is not a company].
-        |  It's an open-source library. Our company publishing spaCy and other
-        |  software is called #[+a(COMPANY_URL, true) Explosion AI].
-
-+h(2, "features") Features
-
-p
-    |  In the documentation, you'll come across mentions of spaCy's
-    |  features and capabilities. Some of them refer to linguistic concepts,
-    |  while others are related to more general machine learning functionality.
-
-+aside
-    |  If one of spaCy's functionalities #[strong needs a model], it means that
-    |  you need to have one our the available
-    |  #[+a("/docs/usage/models") statistical models] installed. Models are used
-    |  to #[strong predict] linguistic annotations – for example, if a word is
-    |  a verb or a noun.
-
-+table(["Name", "Description", "Needs model"])
-    +row
-        +cell #[strong Tokenization]
-        +cell Segmenting text into words, punctuations marks etc.
-        +cell #[+procon("con")]
-
-    +row
-        +cell #[strong Part-of-speech] (POS) #[strong Tagging]
-        +cell Assigning word types to tokens, like verb or noun.
-        +cell #[+procon("pro")]
-
-    +row
-        +cell #[strong Dependency Parsing]
-        +cell
-            |  Assigning syntactic dependency labels, describing the relations
-            |  between individual tokens, like subject or object.
-        +cell #[+procon("pro")]
-
-    +row
-        +cell #[strong Lemmatization]
-        +cell
-            |  Assigning the base forms of words. For example, the lemma of
-            |  "was" is "be", and the lemma of "rats" is "rat".
-        +cell #[+procon("pro")]
-
-    +row
-        +cell #[strong Sentence Boundary Detection] (SBD)
-        +cell Finding and segmenting individual sentences.
-        +cell #[+procon("pro")]
-
-    +row
-        +cell #[strong Named Entity Recongition] (NER)
-        +cell
-            |  Labelling named "real-world" objects, like persons, companies or
-            |  locations.
-        +cell #[+procon("pro")]
-
-    +row
-        +cell #[strong Rule-based Matching]
-        +cell
-            |  Finding sequences of tokens based on their texts and linguistic
-            |  annotations, similar to regular expressions.
-        +cell #[+procon("con")]
-
-    +row
-        +cell #[strong Similarity]
-        +cell
-            |  Comparing words, text spans and documents and how similar they
-            |  are to each other.
-        +cell #[+procon("pro")]
-
-    +row
-        +cell #[strong Training]
-        +cell Updating and improving a statistical model's predictions.
-        +cell #[+procon("neutral")]
-
-    +row
-        +cell #[strong Serialization]
-        +cell Saving objects to files or byte strings.
-        +cell #[+procon("neutral")]
-
-+h(2, "annotations") Linguistic annotations
-
-p
-    |  spaCy provides a variety of linguistic annotations to give you
-    |  #[strong insights into a text's grammatical structure]. This includes the
-    |  word types, like the parts of speech, and how the words are related to
-    |  each other. For example, if you're analysing text, it makes a huge
-    |  difference whether a noun is the subject of a sentence, or the object –
-    |  or whether "google" is used as a verb, or refers to the website or
-    |  company in a specific context.
-
-p
-    |  Once you've downloaded and installed a #[+a("/docs/usage/models") model],
-    |  you can load it via #[+api("spacy#load") #[code spacy.load()]]. This will
-    |  return a #[code Language] object contaning all components and data needed
-    |  to process text. We usually call it #[code nlp]. Calling the #[code nlp]
-    |  object on a string of text will return a processed #[code Doc]:
-
-+code.
-    import spacy
-
-    nlp = spacy.load('en')
-    doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')
-
-p
-    |  Even though a #[code Doc] is processed – e.g. split into individual words
-    |  and annotated – it still holds #[strong all information of the original text],
-    |  like whitespace characters. You can always get the offset of a token into the
-    |  original string, or reconstruct the original by joining the tokens and their
-    |  trailing whitespace. This way, you'll never lose any information
-    |  when processing text with spaCy.
-
-+h(3, "annotations-token") Tokenization
-
-include _spacy-101/_tokenization
-
-+infobox
-    |  To learn more about how spaCy's tokenization rules work in detail,
-    |  how to #[strong customise and replace] the default tokenizer and how to
-    |  #[strong add language-specific data], see the usage guides on
-    |  #[+a("/docs/usage/adding-languages") adding languages] and
-    |  #[+a("/docs/usage/customizing-tokenizer") customising the tokenizer].
-
-+h(3, "annotations-pos-deps") Part-of-speech tags and dependencies
-    +tag-model("dependency parse")
-
-include _spacy-101/_pos-deps
-
-+infobox
-    |  To learn more about #[strong part-of-speech tagging] and rule-based
-    |  morphology, and how to #[strong navigate and use the parse tree]
-    |  effectively, see the usage guides on
-    |  #[+a("/docs/usage/pos-tagging") part-of-speech tagging] and
-    |  #[+a("/docs/usage/dependency-parse") using the dependency parse].
-
-+h(3, "annotations-ner") Named Entities
-    +tag-model("named entities")
-
-include _spacy-101/_named-entities
-
-+infobox
-    |  To learn more about entity recognition in spaCy, how to
-    |  #[strong add your own entities] to a document and how to
-    |  #[strong train and update] the entity predictions of a model, see the
-    |  usage guides on
-    |  #[+a("/docs/usage/entity-recognition") named entity recognition] and
-    |  #[+a("/docs/usage/training-ner") training the named entity recognizer].
-
-+h(2, "vectors-similarity") Word vectors and similarity
-    +tag-model("vectors")
-
-include _spacy-101/_similarity
-
-include _spacy-101/_word-vectors
-
-+infobox
-    |  To learn more about word vectors, how to #[strong customise them] and
-    |  how to load #[strong your own vectors] into spaCy, see the usage
-    |  guide on
-    |  #[+a("/docs/usage/word-vectors-similarities") using word vectors and semantic similarities].
-
-+h(2, "pipelines") Pipelines
-
-include _spacy-101/_pipelines
-
-+infobox
-    |  To learn more about #[strong how processing pipelines work] in detail,
-    |  how to enable and disable their components, and how to
-    |  #[strong create your own], see the usage guide on
-    |  #[+a("/docs/usage/language-processing-pipeline") language processing pipelines].
-
-+h(2, "vocab") Vocab, hashes and lexemes
-
-include _spacy-101/_vocab
-
-+h(2, "serialization") Serialization
-
-include _spacy-101/_serialization
-
-+infobox
-    |  To learn more about #[strong serialization] and how to
-    |  #[strong save and load your own models], see the usage guide on
-    |  #[+a("/docs/usage/saving-loading") saving, loading and data serialization].
-
-+h(2, "training") Training
-
-include _spacy-101/_training
-
-+infobox
-    |  To learn more about #[strong training and updating] models, how to create
-    |  training data and how to improve spaCy's named entity recognition models,
-    |  see the usage guides on #[+a("/docs/usage/training") training] and
-    |  #[+a("/docs/usage/training-ner") training the named entity recognizer].
-
-+h(2, "language-data") Language data
-
-include _spacy-101/_language-data
-
-+infobox
-    |  To learn more about the individual components of the language data and
-    |  how to #[strong add a new language] to spaCy in preparation for training
-    |  a language model, see the usage guide on
-    |  #[+a("/docs/usage/adding-languages") adding languages].
-
-+h(2, "architecture") Architecture
-
-include _spacy-101/_architecture.jade
-
-+h(2, "community") Community & FAQ
-
-p
-    |  We're very happy to see the spaCy community grow and include a mix of
-    |  people from all kinds of different backgrounds – computational
-    |  linguistics, data science, deep learning, research and more. If you'd
-    |  like to get involved, below are some answers to the most important
-    |  questions and resources for further reading.
-
-+h(3, "faq-help-code") Help, my code isn't working!
-
-p
-    |  Bugs suck, and we're doing our best to continuously improve the tests
-    |  and fix bugs as soon as possible. Before you submit an issue, do a
-    |  quick search and check if the problem has already been reported. If
-    |  you're having installation or loading problems, make sure to also check
-    |  out the #[+a("/docs/usage#troubleshooting") troubleshooting guide]. Help
-    |  with spaCy is available via the following platforms:
-
-+aside("How do I know if something is a bug?")
-    |  Of course, it's always hard to know for sure, so don't worry – we're not
-    |  going to be mad if a bug report turns out to be a typo in your
-    |  code. As a simple rule, any C-level error without a Python traceback,
-    |  like a #[strong segmentation fault] or #[strong memory error],
-    |  is #[strong always] a spaCy bug.#[br]#[br]
-
-    |  Because models are statistical, their performance will never be
-    |  #[em perfect]. However, if you come across
-    |  #[strong patterns that might indicate an underlying issue], please do
-    |  file a report. Similarly, we also care about behaviours that
-    |  #[strong contradict our docs].
-
-+table(["Platform", "Purpose"])
-    +row
-        +cell #[+a("https://stackoverflow.com/questions/tagged/spacy") StackOverflow]
-        +cell
-            |  #[strong Usage questions] and everything related to problems with
-            |  your specific code. The StackOverflow community is much larger
-            |  than ours, so if your problem can be solved by others, you'll
-            |  receive help much quicker.
-
-    +row
-        +cell #[+a("https://gitter.im/" + SOCIAL.gitter) Gitter chat]
-        +cell
-            |  #[strong General discussion] about spaCy, meeting other community
-            |  members and exchanging #[strong tips, tricks and best practices].
-            |  If we're working on experimental models and features, we usually
-            |  share them on Gitter first.
-
-    +row
-        +cell #[+a(gh("spaCy") + "/issues") GitHub issue tracker]
-        +cell
-            |  #[strong Bug reports] and #[strong improvement suggestions], i.e.
-            |  everything that's likely spaCy's fault. This also includes
-            |  problems with the models beyond statistical imprecisions, like
-            |  patterns that point to a bug.
-
-+infobox
-    |  Please understand that we won't be able to provide individual support via
-    |  email. We also believe that help is much more valuable if it's shared
-    |  publicly, so that #[strong more people can benefit from it]. If you come
-    |  across an issue and you think you might be able to help, consider posting
-    |  a quick update with your solution. No matter how simple, it can easily
-    |  save someone a lot of time and headache – and the next time you need help,
-    |  they might repay the favour.
-
-+h(3, "faq-contributing") How can I contribute to spaCy?
-
-p
-    |  You don't have to be an NLP expert or Python pro to contribute, and we're
-    |  happy to help you get started. If you're new to spaCy, a good place to
-    |  start is the
-    |  #[+a(gh("spaCy") + '/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted+%28easy%29"') #[code help wanted (easy)] label]
-    |  on GitHub, which we use to tag bugs and feature requests that are easy
-    |  and self-contained. We also appreciate contributions to the docs – whether
-    |  it's fixing a typo, improving an example or adding additional explanations.
-    |  You'll find a "Suggest edits" link at the bottom of each page that points
-    |  you to the source.
-
-p
-    |  Another way of getting involved is to help us improve the
-    |  #[+a("/docs/usage/adding-languages#language-data") language data] –
-    |  especially if you happen to speak one of the languages currently in
-    |  #[+a("/docs/api/language-models#alpha-support") alpha support]. Even
-    |  adding simple tokenizer exceptions, stop words or lemmatizer data
-    |  can make a big difference. It will also make it easier for us to provide
-    |  a statistical model for the language in the future. Submitting a test
-    |  that documents a bug or performance issue, or covers functionality that's
-    |  especially important for your application is also very helpful. This way,
-    |  you'll also make sure we never accidentally introduce regressions to the
-    |  parts of the library that you care about the most.
-
-p
-    strong
-        |  For more details on the types of contributions we're looking for, the
-        |  code conventions and other useful tips, make sure to check out the
-        |  #[+a(gh("spaCy", "CONTRIBUTING.md")) contributing guidelines].
-
-+infobox("Code of Conduct")
-    |  spaCy adheres to the
-    |  #[+a("http://contributor-covenant.org/version/1/4/") Contributor Covenant Code of Conduct].
-    |  By participating, you are expected to uphold this code.
-
-+h(3, "faq-project-with-spacy")
-    |  I've built something cool with spaCy – how can I get the word out?
-
-p
-    |  First, congrats – we'd love to check it out! When you share your
-    |  project on Twitter, don't forget to tag
-    |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}] so we
-    |  don't miss it. If you think your project would be a good fit for the
-    |  #[+a("/docs/usage/showcase") showcase], #[strong feel free to submit it!]
-    |  Tutorials are also incredibly valuable to other users and a great way to
-    |  get exposure. So we strongly encourage #[strong writing up your experiences],
-    |  or sharing your code and some tips and tricks on your blog. Since our
-    |  website is open-source, you can add your project or tutorial by making a
-    |  pull request on GitHub.
-
-+aside("Contributing to spacy.io")
-    |  All showcase and tutorial links are stored in a
-    |  #[+a(gh("spaCy", "website/docs/usage/_data.json")) JSON file], so you
-    |  won't even have to edit any markup. For more info on how to submit
-    |  your project, see the
-    |  #[+a(gh("spaCy", "CONTRIBUTING.md#submitting-a-project-to-the-showcase")) contributing guidelines]
-    |  and our #[+a(gh("spaCy", "website")) website docs].
-
-p
-    |  If you would like to use the spaCy logo on your site, please get in touch
-    |  and ask us first. However, if you want to show support and tell others
-    |  that your project is using spaCy, you can grab one of our
-    |  #[strong spaCy badges] here:
-
-- SPACY_BADGES =  ["built%20with-spaCy-09a3d5.svg", "made%20with%20❤%20and-spaCy-09a3d5.svg", "spaCy-v2-09a3d5.svg"]
-+quickstart([{id: "badge", input_style: "check", options: SPACY_BADGES.map(function(badge, i) { return {id: i, title: "", checked: (i == 0) ? true : false}}) }], false, false, true)
-    .c-code-block(data-qs-results)
-        for badge, i in SPACY_BADGES
-            - var url = "https://img.shields.io/badge/" + badge
-            +code(false, "text", "star").o-no-block(data-qs-badge=i)=url
-            +code(false, "text", "code").o-no-block(data-qs-badge=i).
-                <a href="#{SITE_URL}"><img src="#{url}" height="20"></a>
-            +code(false, "text", "markdown").o-no-block(data-qs-badge=i).
-                [![spaCy](#{url})](#{SITE_URL})
diff --git a/website/docs/usage/training-ner.jade b/website/docs/usage/training-ner.jade
deleted file mode 100644
index 3d732b16d..000000000
--- a/website/docs/usage/training-ner.jade
+++ /dev/null
@@ -1,114 +0,0 @@
-include ../../_includes/_mixins
-
-p
-    |  All #[+a("/docs/usage/models") spaCy models] support online learning, so
-    |  you can update a pre-trained model with new examples. You can even add
-    |  new classes to an existing model, to recognise a new entity type,
-    |  part-of-speech, or syntactic relation. Updating an existing model is
-    |  particularly useful as a "quick and dirty solution", if you have only a
-    |  few corrections or annotations.
-
-+h(2, "improving-accuracy") Improving accuracy on existing entity types
-
-p
-    |  To update the model, you first need to create an instance of
-    |  #[+api("goldparse") #[code GoldParse]], with the entity labels
-    |  you want to learn. You'll usually need to provide many examples to
-    |  meaningfully improve the system — a few hundred is a good start, although
-    |  more is better.
-
-+image
-    include ../../assets/img/docs/training-loop.svg
-    .u-text-right
-        +button("/assets/img/docs/training-loop.svg", false, "secondary").u-text-tag View large graphic
-
-p
-    |  You should avoid iterating over the same few examples multiple times, or
-    |  the model is likely to "forget" how to annotate other examples. If you
-    |  iterate over the same few examples, you're effectively changing the loss
-    |  function. The optimizer will find a way to minimize the loss on your
-    |  examples, without regard for the consequences on the examples it's no
-    |  longer paying attention to.
-
-p
-    |  One way to avoid this "catastrophic forgetting" problem is to "remind"
-    |  the model of other examples by augmenting your annotations with sentences
-    |  annotated with entities automatically recognised by the original model.
-    |  Ultimately, this is an empirical process: you'll need to
-    |  #[strong experiment on your own data] to find a solution that works best
-    |  for you.
-
-+h(2, "example") Example
-
-+under-construction
-
-+code.
-    import random
-    from spacy.lang.en import English
-    from spacy.gold import GoldParse, biluo_tags_from_offsets
-
-    def main(model_dir=None):
-        train_data = [
-            ('Who is Shaka Khan?',
-                [(len('Who is '), len('Who is Shaka Khan'), 'PERSON')]),
-            ('I like London and Berlin.',
-                [(len('I like '), len('I like London'), 'LOC'),
-                (len('I like London and '), len('I like London and Berlin'), 'LOC')])
-        ]
-        nlp = English(pipeline=['tensorizer', 'ner'])
-        get_data = lambda: reformat_train_data(nlp.tokenizer, train_data)
-        optimizer = nlp.begin_training(get_data)
-        for itn in range(100):
-            random.shuffle(train_data)
-            losses = {}
-            for raw_text, entity_offsets in train_data:
-                doc = nlp.make_doc(raw_text)
-                gold = GoldParse(doc, entities=entity_offsets)
-                nlp.update([doc], [gold], drop=0.5, sgd=optimizer, losses=losses)
-        nlp.to_disk(model_dir)
-
-+code.
-    def reformat_train_data(tokenizer, examples):
-        """Reformat data to match JSON format"""
-        output = []
-        for i, (text, entity_offsets) in enumerate(examples):
-            doc = tokenizer(text)
-            ner_tags = biluo_tags_from_offsets(tokenizer(text), entity_offsets)
-            words = [w.text for w in doc]
-            tags = ['-'] * len(doc)
-            heads = [0] * len(doc)
-            deps = [''] * len(doc)
-            sentence = (range(len(doc)), words, tags, heads, deps, ner_tags)
-            output.append((text, [(sentence, [])]))
-        return output
-
-p.u-text-right
-    +button(gh("spaCy", "examples/training/train_ner.py"), false, "secondary").u-text-tag View full example
-
-+h(2, "saving-loading") Saving and loading
-
-p
-    |  After training our model, you'll usually want to save its state, and load
-    |  it back later. You can do this with the
-    |  #[+api("language#to_disk") #[code Language.to_disk()]] method:
-
-+code.
-    nlp.to_disk('/home/me/data/en_technology')
-
-p
-    |  To make the model more convenient to deploy, we recommend wrapping it as
-    |  a Python package, so that you can install it via pip and load it as a
-    |  module. spaCy comes with a handy #[+api("cli#package") #[code package]]
-    |  CLI command to create all required files and directories.
-
-+code(false, "bash").
-    python -m spacy package /home/me/data/en_technology /home/me/my_models
-
-p
-    |  To build the package and create a #[code .tar.gz] archive, run
-    |  #[code python setup.py sdist] from within its directory.
-
-+infobox("Saving and loading models")
-    |  For more information and a detailed guide on how to package your model,
-    |  see the documentation on
-    |  #[+a("/docs/usage/saving-loading#models") saving and loading models].
diff --git a/website/docs/usage/tutorials.jade b/website/docs/usage/tutorials.jade
deleted file mode 100644
index 2b8eddbf1..000000000
--- a/website/docs/usage/tutorials.jade
+++ /dev/null
@@ -1,38 +0,0 @@
-//- 💫 DOCS > USAGE > TUTORIALS
-
-include ../../_includes/_mixins
-
-p
-    |  Have you written a tutorial on spaCy, or did you find one that should be
-    |  featured here? #[a(href="mailto:#{EMAIL}") Let us know!]
-
-+h(2, "first-steps") First steps
-
-p
-    |  These tutorials help you get started. They describe how to set up your
-    |  environment and start using spaCy.
-
-+grid
-    each details, title in first_steps
-        +card(title, details)
-
-+h(2, "features") Deep dives
-
-p
-    |  These tutorials take a closer look at particular features of spaCy, or
-    |  particular types of NLP problems. Most come with more explanatory text,
-    |  to help introduce you to new concepts.
-
-+grid
-    each details, title in deep_dives
-        +card(title, details)
-
-+h(2, "code") Programs and scripts
-
-p
-    |  These tutorials give you all the code and nothing but the code — they're
-    |  Python scripts you can modify and run.
-
-+grid
-    each details, title in code
-        +card(title, details)
diff --git a/website/docs/usage/v2.jade b/website/docs/usage/v2.jade
deleted file mode 100644
index bbcfe865f..000000000
--- a/website/docs/usage/v2.jade
+++ /dev/null
@@ -1,510 +0,0 @@
-//- 💫 DOCS > USAGE > WHAT'S NEW IN V2.0
-
-include ../../_includes/_mixins
-
-p
-    |  We're very excited to finally introduce spaCy v2.0! On this page, you'll
-    |  find a summary of the new features, information on the backwards
-    |  incompatibilities, including a handy overview of what's been renamed or
-    |  deprecated. To help you make the most of v2.0, we also
-    |  #[strong re-wrote almost all of the usage guides and API docs], and added
-    |  more real-world examples. If you're new to spaCy, or just want to brush
-    |  up on some NLP basics and the details of the library, check out
-    |  the #[+a("/docs/usage/spacy-101") spaCy 101 guide] that explains the most
-    |  important concepts with examples and illustrations.
-
-+h(2, "summary") Summary
-
-+grid.o-no-block
-    +grid-col("half")
-
-        p This release features
-            |  entirely new #[strong deep learning-powered models] for spaCy's tagger,
-            |  parser and entity recognizer. The new models are #[strong 20x smaller]
-            |  than the linear models that have powered spaCy until now: from 300 MB to
-            |  only 15 MB.
-
-        p
-            |  We've also made several usability improvements that are
-            |  particularly helpful for #[strong production deployments]. spaCy
-            |  v2 now fully supports the Pickle protocol, making it easy to use
-            |  spaCy with #[+a("https://spark.apache.org/") Apache Spark]. The
-            |  string-to-integer mapping is #[strong no longer stateful], making
-            |  it easy to reconcile annotations made in different processes.
-            |  Models are smaller and use less memory, and the APIs for serialization
-            |  are now much more consistent.
-
-    +table-of-contents
-        +item #[+a("#summary") Summary]
-        +item #[+a("#features") New features]
-        +item #[+a("#features-pipelines") Improved processing pipelines]
-        +item #[+a("#features-hash-ids") Hash values instead of integer IDs]
-        +item #[+a("#features-serializer") Saving, loading and serialization]
-        +item #[+a("#features-displacy") displaCy visualizer]
-        +item #[+a("#features-language") Language data and lazy loading]
-        +item #[+a("#features-matcher") Revised matcher API]
-        +item #[+a("#features-models") Neural network models]
-        +item #[+a("#incompat") Backwards incompatibilities]
-        +item #[+a("#migrating") Migrating from spaCy v1.x]
-        +item #[+a("#benchmarks") Benchmarks]
-
-p
-    |  The main usability improvements you'll notice in spaCy v2.0 are around
-    |  #[strong defining, training and loading your own models] and components.
-    |  The new neural network models make it much easier to train a model from
-    |  scratch, or update an existing model with a few examples. In v1.x, the
-    |  statistical models depended on the state of the #[code Vocab]. If you
-    |  taught the model a new word, you would have to save and load a lot of
-    |  data — otherwise the model wouldn't correctly recall the features of your
-    |  new example. That's no longer the case.
-
-p
-    |  Due to some clever use of hashing, the statistical models
-    |  #[strong never change size], even as they learn new vocabulary items.
-    |  The whole pipeline is also now fully differentiable. Even if you don't
-    |  have explicitly annotated data, you can update spaCy using all the
-    |  #[strong latest deep learning tricks] like adversarial training, noise
-    |  contrastive estimation or reinforcement learning.
-
-+h(2, "features") New features
-
-p
-    |  This section contains an overview of the most important
-    |  #[strong new features and improvements]. The #[+a("/docs/api") API docs]
-    |  include additional  deprecation notes. New methods and functions that
-    |  were introduced in this version are marked with a #[+tag-new(2)] tag.
-
-+h(3, "features-pipelines") Improved processing pipelines
-
-+aside-code("Example").
-    # Modify an existing pipeline
-    nlp = spacy.load('en')
-    nlp.pipeline.append(my_component)
-
-    # Register a factory to create a component
-    spacy.set_factory('my_factory', my_factory)
-    nlp = Language(pipeline=['my_factory', mycomponent])
-
-p
-    |  It's now much easier to #[strong customise the pipeline] with your own
-    |  components, functions that receive a #[code Doc] object, modify and
-    |  return it. If your component is stateful, you can define and register a
-    |  factory which receives the shared #[code Vocab] object and returns a
-    |  component. spaCy's default components can be added to your pipeline by
-    |  using their string IDs. This way, you won't have to worry about finding
-    |  and implementing them – simply add #[code "tagger"] to the pipeline,
-    |  and spaCy will know what to do.
-
-+image
-    include ../../assets/img/docs/pipeline.svg
-
-+infobox
-    |  #[strong API:] #[+api("language") #[code Language]]
-    |  #[strong Usage:] #[+a("/docs/usage/language-processing-pipeline") Processing text]
-
-+h(3, "features-hash-ids") Hash values instead of integer IDs
-
-+aside-code("Example").
-    doc = nlp(u'I love coffee')
-    assert doc.vocab.strings[u'coffee'] == 3197928453018144401
-    assert doc.vocab.strings[3197928453018144401] == u'coffee'
-
-    beer_hash = doc.vocab.strings.add(u'beer')
-    assert doc.vocab.strings[u'beer'] == beer_hash
-    assert doc.vocab.strings[beer_hash] == u'beer'
-
-p
-    |  The #[+api("stringstore") #[code StringStore]] now resolves all strings
-    |  to hash values instead of integer IDs. This means that the string-to-int
-    |  mapping #[strong no longer depends on the vocabulary state], making a lot
-    |  of workflows much simpler, especially during training. Unlike integer IDs
-    |  in spaCy v1.x, hash values will #[strong always match] – even across
-    |  models. Strings can now be added explicitly using the new
-    |  #[+api("stringstore#add") #[code Stringstore.add]] method. A token's hash
-    |  is available via #[code token.orth].
-
-+infobox
-    |  #[strong API:] #[+api("stringstore") #[code StringStore]]
-    |  #[strong Usage:] #[+a("/docs/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
-
-+h(3, "features-serializer") Saving, loading and serialization
-
-+aside-code("Example").
-    nlp = spacy.load('en') # shortcut link
-    nlp = spacy.load('en_core_web_sm') # package
-    nlp = spacy.load('/path/to/en') # unicode path
-    nlp = spacy.load(Path('/path/to/en')) # pathlib Path
-
-    nlp.to_disk('/path/to/nlp')
-    nlp = English().from_disk('/path/to/nlp')
-
-p
-    |  spay's serialization API has been made consistent across classes and
-    |  objects. All container classes, i.e. #[code Language], #[code Doc],
-    |  #[code Vocab] and #[code StringStore] now have a #[code to_bytes()],
-    |  #[code from_bytes()], #[code to_disk()] and #[code from_disk()] method
-    |  that supports the Pickle protocol.
-
-p
-    |  The improved #[code spacy.load] makes loading models easier and more
-    |  transparent. You can load a model by supplying its
-    |  #[+a("/docs/usage/models#usage") shortcut link], the name of an installed
-    |  #[+a("/docs/usage/saving-loading#generating") model package] or a path.
-    |  The #[code Language] class to initialise will be determined based on the
-    |  model's settings. For a blank language, you can import the class directly,
-    |  e.g. #[code from spacy.lang.en import English].
-
-+infobox
-    |  #[strong API:] #[+api("spacy#load") #[code spacy.load]], #[+api("binder") #[code Binder]]
-    |  #[strong Usage:] #[+a("/docs/usage/saving-loading") Saving and loading]
-
-+h(3, "features-displacy") displaCy visualizer with Jupyter support
-
-+aside-code("Example").
-    from spacy import displacy
-    doc = nlp(u'This is a sentence about Facebook.')
-    displacy.serve(doc, style='dep') # run the web server
-    html = displacy.render(doc, style='ent') # generate HTML
-
-p
-    |  Our popular dependency and named entity visualizers are now an official
-    |  part of the spaCy library! displaCy can run a simple web server, or
-    |  generate raw HTML markup or SVG files to be exported. You can pass in one
-    |  or more docs, and customise the style. displaCy also auto-detects whether
-    |  you're running #[+a("https://jupyter.org") Jupyter] and will render the
-    |  visualizations in your notebook.
-
-+infobox
-    |  #[strong API:] #[+api("displacy") #[code displacy]]
-    |  #[strong Usage:] #[+a("/docs/usage/visualizers") Visualizing spaCy]
-
-+h(3, "features-language") Improved language data and lazy loading
-
-p
-    |  Language-specfic data now lives in its own submodule, #[code spacy.lang].
-    |  Languages are lazy-loaded, i.e. only loaded when you import a
-    |  #[code Language] class, or load a model that initialises one. This allows
-    |  languages to contain more custom data, e.g. lemmatizer lookup tables, or
-    |  complex regular expressions. The language data has also been tidied up
-    |  and simplified. spaCy now also supports simple lookup-based lemmatization.
-
-+infobox
-    |  #[strong API:] #[+api("language") #[code Language]]
-    |  #[strong Code:] #[+src(gh("spaCy", "spacy/lang")) spacy/lang]
-    |  #[strong Usage:] #[+a("/docs/usage/adding-languages") Adding languages]
-
-+h(3, "features-matcher") Revised matcher API
-
-+aside-code("Example").
-    from spacy.matcher import Matcher
-    matcher = Matcher(nlp.vocab)
-    matcher.add('HEARTS', None, [{'ORTH': '❤️', 'OP': '+'}])
-    assert len(matcher) == 1
-    assert 'HEARTS' in matcher
-
-p
-    |  Patterns can now be added to the matcher by calling
-    |  #[+api("matcher-add") #[code matcher.add()]] with a match ID, an optional
-    |  callback function to be invoked on each match, and one or more patterns.
-    |  This allows you to write powerful, pattern-specific logic using only one
-    |  matcher. For example, you might only want to merge some entity types,
-    |  and set custom flags for other matched patterns.
-
-+infobox
-    |  #[strong API:] #[+api("matcher") #[code Matcher]]
-    |  #[strong Usage:] #[+a("/docs/usage/rule-based-matching") Rule-based matching]
-
-+h(3, "features-models") Neural network models for English, German, French, Spanish and multi-language NER
-
-+aside-code("Example", "bash").
-    python -m spacy download en # default English model
-    python -m spacy download de # default German model
-    python -m spacy download fr # default French model
-    python -m spacy download es # default Spanish model
-    python -m spacy download xx_ent_wiki_sm # multi-language NER
-
-p
-    |  spaCy v2.0 comes with new and improved neural network models for English,
-    |  German, French and Spanish, as well as a multi-language named entity
-    |  recognition model trained on Wikipedia. #[strong GPU usage] is now
-    |  supported via #[+a("http://chainer.org") Chainer]'s CuPy module.
-
-+infobox
-    |  #[strong Details:] #[+a("/docs/api/language-models") Languages],
-    |  #[+src(gh("spacy-models")) spacy-models]
-    |  #[strong Usage:] #[+a("/docs/usage/models") Models],
-    |  #[+a("/docs/usage#gpu") Using spaCy with GPU]
-
-+h(2, "incompat") Backwards incompatibilities
-
-+table(["Old", "New"])
-    +row
-        +cell
-            |  #[code spacy.en]
-            |  #[code spacy.xx]
-        +cell
-            |  #[code spacy.lang.en]
-            |  #[code spacy.lang.xx]
-
-    +row
-        +cell #[code orth]
-        +cell #[code lang.xx.lex_attrs]
-
-    +row
-        +cell #[code syntax.iterators]
-        +cell #[code lang.xx.syntax_iterators]
-
-    +row
-        +cell #[code Language.save_to_directory]
-        +cell #[+api("language#to_disk") #[code Language.to_disk]]
-
-    +row
-        +cell #[code Language.create_make_doc]
-        +cell #[+api("language#attributes") #[code Language.tokenizer]]
-
-    +row
-        +cell
-            |  #[code Vocab.load]
-            |  #[code Vocab.load_lexemes]
-        +cell
-            |  #[+api("vocab#from_disk") #[code Vocab.from_disk]]
-            |  #[+api("vocab#from_bytes") #[code Vocab.from_bytes]]
-
-    +row
-        +cell
-            |  #[code Vocab.dump]
-        +cell
-            |  #[+api("vocab#to_disk") #[code Vocab.to_disk]]#[br]
-            |  #[+api("vocab#to_bytes") #[code Vocab.to_bytes]]
-
-    +row
-        +cell
-            |  #[code Vocab.load_vectors]
-            |  #[code Vocab.load_vectors_from_bin_loc]
-        +cell
-            |  #[+api("vectors#from_disk") #[code Vectors.from_disk]]
-            |  #[+api("vectors#from_bytes") #[code Vectors.from_bytes]]
-
-    +row
-        +cell
-            |  #[code Vocab.dump_vectors]
-        +cell
-            |  #[+api("vectors#to_disk") #[code Vectors.to_disk]]
-            |  #[+api("vectors#to_bytes") #[code Vectors.to_bytes]]
-
-    +row
-        +cell
-            |  #[code StringStore.load]
-        +cell
-            |  #[+api("stringstore#from_disk") #[code StringStore.from_disk]]
-            |  #[+api("stringstore#from_bytes") #[code StringStore.from_bytes]]
-
-    +row
-        +cell
-            |  #[code StringStore.dump]
-        +cell
-            |  #[+api("stringstore#to_disk") #[code StringStore.to_disk]]
-            |  #[+api("stringstore#to_bytes") #[code StringStore.to_bytes]]
-
-    +row
-        +cell #[code Tokenizer.load]
-        +cell
-            |  #[+api("tokenizer#from_disk") #[code Tokenizer.from_disk]]
-            |  #[+api("tokenizer#from_bytes") #[code Tokenizer.from_bytes]]
-
-    +row
-        +cell #[code Tagger.load]
-        +cell
-            |  #[+api("tagger#from_disk") #[code Tagger.from_disk]]
-            |  #[+api("tagger#from_bytes") #[code Tagger.from_bytes]]
-
-    +row
-        +cell #[code DependencyParser.load]
-        +cell
-            |  #[+api("dependencyparser#from_disk") #[code DependencyParser.from_disk]]
-            |  #[+api("dependencyparser#from_bytes") #[code DependencyParser.from_bytes]]
-
-    +row
-        +cell #[code EntityRecognizer.load]
-        +cell
-            |  #[+api("entityrecognizer#from_disk") #[code EntityRecognizer.from_disk]]
-            |  #[+api("entityrecognizer#from_bytes") #[code EntityRecognizer.from_bytes]]
-
-    +row
-        +cell #[code Matcher.load]
-        +cell -
-
-    +row
-        +cell
-            |  #[code Matcher.add_pattern]
-            |  #[code Matcher.add_entity]
-        +cell #[+api("matcher#add") #[code Matcher.add]]
-
-    +row
-        +cell #[code Matcher.get_entity]
-        +cell #[+api("matcher#get") #[code Matcher.get]]
-
-    +row
-        +cell #[code Matcher.has_entity]
-        +cell #[+api("matcher#contains") #[code Matcher.__contains__]]
-
-    +row
-        +cell #[code Doc.read_bytes]
-        +cell #[+api("binder") #[code Binder]]
-
-    +row
-        +cell #[code Token.is_ancestor_of]
-        +cell #[+api("token#is_ancestor") #[code Token.is_ancestor]]
-
-    +row
-        +cell #[code cli.model]
-        +cell -
-
-+h(2, "migrating") Migrating from spaCy 1.x
-
-p
-    |  Because we'e made so many architectural changes to the library, we've
-    |  tried to #[strong keep breaking changes to a minimum]. A lot of projects
-    |  follow the philosophy that if you're going to break anything, you may as
-    |  well break everything. We think migration is easier if there's a logic to
-    |  what has changed.
-
-p
-    |  We've therefore followed a policy of avoiding breaking changes to the
-    |  #[code Doc], #[code Span] and #[code Token] objects. This way, you can
-    |  focus on only migrating the code that does training, loading and
-    |  serialization — in other words, code that works with the #[code nlp]
-    |  object directly. Code that uses the annotations should continue to work.
-
-+infobox("Important note")
-    |  If you've trained your own models, keep in mind that your train and
-    |  runtime inputs must match. This means you'll have to
-    |  #[strong retrain your models] with spaCy v2.0.
-
-+h(3, "migrating-saving-loading") Saving, loading and serialization
-
-p
-    |  Double-check all calls to #[code spacy.load()] and make sure they don't
-    |  use the #[code path] keyword argument. If you're only loading in binary
-    |  data and not a model package that can construct its own #[code Language]
-    |  class and pipeline, you should now use the
-    |  #[+api("language#from_disk") #[code Language.from_disk()]] method.
-
-+code-new.
-    nlp = spacy.load('/model')
-    nlp = English().from_disk('/model/data')
-+code-old nlp = spacy.load('en', path='/model')
-
-p
-    |  Review all other code that writes state to disk or bytes.
-    |  All containers, now share the same, consistent API for saving and
-    |  loading. Replace saving with #[code to_disk()] or #[code to_bytes()], and
-    |  loading with #[code from_disk()] and #[code from_bytes()].
-
-+code-new.
-    nlp.to_disk('/model')
-    nlp.vocab.to_disk('/vocab')
-
-+code-old.
-    nlp.save_to_directory('/model')
-    nlp.vocab.dump('/vocab')
-
-p
-    |  If you've trained models with input from v1.x, you'll need to
-    |  #[strong retrain them] with spaCy v2.0. All previous models will not
-    |  be compatible with the new version.
-
-+h(3, "migrating-strings") Strings and hash values
-
-p
-    |  The change from integer IDs to hash values may not actually affect your
-    |  code very much. However, if you're adding strings to the vocab manually,
-    |  you now need to call #[+api("stringstore#add") #[code StringStore.add()]]
-    |  explicitly. You can also now be sure that the string-to-hash mapping will
-    |  always match across vocabularies.
-
-+code-new.
-    nlp.vocab.strings.add(u'coffee')
-    nlp.vocab.strings[u'coffee']       # 3197928453018144401
-    other_nlp.vocab.strings[u'coffee'] # 3197928453018144401
-
-+code-old.
-    nlp.vocab.strings[u'coffee']       # 3672
-    other_nlp.vocab.strings[u'coffee'] # 40259
-
-+h(3, "migrating-languages") Processing pipelines and language data
-
-p
-    |  If you're importing language data or #[code Language] classes, make sure
-    |  to change your import statements to import from #[code spacy.lang]. If
-    |  you've added your own custom language, it needs to be moved to
-    |  #[code spacy/lang/xx] and adjusted accordingly.
-
-+code-new from spacy.lang.en import English
-+code-old from spacy.en import English
-
-p
-    |  If you've been using custom pipeline components, check out the new
-    |  guide on #[+a("/docs/usage/language-processing-pipelines") processing pipelines].
-    |  Appending functions to the pipeline still works – but you might be able
-    |  to make this more convenient by registering "component factories".
-    |  Components of the processing pipeline can now be disabled by passing a
-    |  list of their names to the #[code disable] keyword argument on loading
-    |  or processing.
-
-+code-new.
-    nlp = spacy.load('en', disable=['tagger', 'ner'])
-    doc = nlp(u"I don't want parsed", disable=['parser'])
-+code-old.
-    nlp = spacy.load('en', tagger=False, entity=False)
-    doc = nlp(u"I don't want parsed", parse=False)
-
-+h(3, "migrating-matcher") Adding patterns and callbacks to the matcher
-
-p
-    |  If you're using the matcher, you can now add patterns in one step. This
-    |  should be easy to update – simply merge the ID, callback and patterns
-    |  into one call to #[+api("matcher#add") #[code Matcher.add()]].
-
-+code-new.
-    matcher.add('GoogleNow', merge_phrases, [{ORTH: 'Google'}, {ORTH: 'Now'}])
-
-+code-old.
-    matcher.add_entity('GoogleNow', on_match=merge_phrases)
-    matcher.add_pattern('GoogleNow', [{ORTH: 'Google'}, {ORTH: 'Now'}])
-
-p
-    |  If you've been using #[strong acceptor functions], you'll need to move
-    |  this logic into the
-    |  #[+a("/docs/usage/rule-based-matching#on_match") #[code on_match] callbacks].
-    |  The callback function is invoked on every match and will give you access to
-    |  the doc, the index of the current match and all total matches. This lets
-    |  you both accept or reject the match, and define the actions to be
-    |  triggered.
-
-+h(2, "benchmarks") Benchmarks
-
-+under-construction
-
-+aside("Data sources")
-    |  #[strong Parser, tagger, NER:] #[+a("https://www.gabormelli.com/RKB/OntoNotes_Corpus") OntoNotes 5]#[br]
-    |  #[strong Word vectors:] #[+a("http://commoncrawl.org") Common Crawl]#[br]
-
-p The evaluation was conducted on raw text with no gold standard information.
-
-+table(["Model", "Version", "Type", "UAS", "LAS", "NER F", "POS", "w/s"])
-    mixin benchmark-row(name, details, values, highlight, style)
-        +row(style)
-            +cell #[code=name]
-            for cell in details
-                +cell=cell
-            for cell, i in values
-                +cell.u-text-right
-                    if highlight && highlight[i]
-                        strong=cell
-                    else
-                        !=cell
-
-    +benchmark-row("en_core_web_sm", ["2.0.0", "neural"], ["91.2", "89.2", "82.6", "96.6", "10,300"], [1, 1, 1, 0, 0])
-    +benchmark-row("en_core_web_sm", ["1.2.0", "linear"], ["86.6", "83.8", "78.5", "96.6", "25,700"], [0, 0, 0, 0, 1], "divider")
-    +benchmark-row("en_core_web_md", ["1.2.1", "linear"], ["90.6", "88.5", "81.4", "96.7", "18,800"], [0, 0, 0, 1, 0])
diff --git a/website/docs/usage/visualizers.jade b/website/docs/usage/visualizers.jade
deleted file mode 100644
index b3cbd3b46..000000000
--- a/website/docs/usage/visualizers.jade
+++ /dev/null
@@ -1,384 +0,0 @@
-//- 💫 DOCS > USAGE > VISUALIZERS
-
-include ../../_includes/_mixins
-
-p
-    |  As of v2.0, our popular visualizers, #[+a(DEMOS_URL + "/displacy") displaCy]
-    |  and #[+a(DEMOS_URL + "/displacy-ent") displaCy #[sup ENT]] are finally an
-    |  official part of the library. Visualizing a dependency parse or named
-    |  entities in a text is not only a fun NLP demo – it can also be incredibly
-    |  helpful in speeding up development and debugging your code and training
-    |  process. Instead of printing a list of dependency labels or entity spans,
-    |  you can simply pass your #[code Doc] objects to #[code displacy] and view
-    |  the visualizations in your browser, or export them as HTML files or
-    |  vector graphics.
-
-p
-    |  If you're running a #[+a("https://jupyter.org") Jupyter] notebook,
-    |  displaCy will detect this and return the markup in a format
-    |  #[+a("#jupyter") ready to be rendered and exported].
-
-+aside("What about the old visualizers?")
-    |  Our JavaScript-based visualizers #[+src(gh("displacy")) displacy.js] and
-    |  #[+src(gh("displacy-ent")) displacy-ent.js] will still be available on
-    |  GitHub. If you're looking to implement web-based visualizations, we
-    |  generally recommend using those instead of spaCy's built-in
-    |  #[code displacy] module. It'll allow your application to perform all
-    |  rendering on the client and only rely on the server for the text
-    |  processing. The generated markup is also more compatible with modern web
-    |  standards.
-
-+h(2, "getting-started") Getting started
-    +tag-new(2)
-
-p
-    |  The quickest way visualize  #[code Doc] is to use
-    |  #[+api("displacy#serve") #[code displacy.serve]]. This will spin up a
-    |  simple web server and let you view the result straight from your browser.
-    |  displaCy can either take a single #[code Doc] or a list of #[code Doc]
-    |  objects as its first argument. This lets you construct them however you
-    |  like – using any model or modifications you like.
-
-+h(3, "dep") Visualizing the dependency parse
-
-p
-    |  The dependency visualizer, #[code dep], shows part-of-speech tags
-    |  and syntactic dependencies.
-
-+code("Dependency example").
-    import spacy
-    from spacy import displacy
-
-    nlp = spacy.load('en')
-    doc = nlp(u'This is a sentence.')
-    displacy.serve(doc, style='dep')
-
-+codepen("f0e85b64d469d6617251d8241716d55f", 370)
-
-p
-    |  The argument #[code options] lets you specify a dictionary of settings
-    |  to customise the layout, for example:
-
-+aside("Important note")
-    |  There's currently a known issue with the #[code compact] mode for
-    |  sentences with short arrows and long dependency labels, that causes labels
-    |  longer than the arrow to wrap. So if you come across this problem,
-    |  especially when using custom labels, you'll have to increase the
-    |  #[code distance] setting in the #[code options] to allow longer arcs.
-
-+table(["Name", "Type", "Description", "Default"])
-    +row
-        +cell #[code compact]
-        +cell bool
-        +cell "Compact mode" with square arrows that takes up less space.
-        +cell #[code False]
-
-    +row
-        +cell #[code color]
-        +cell unicode
-        +cell Text color (HEX, RGB or color names).
-        +cell #[code '#000000']
-
-    +row
-        +cell #[code bg]
-        +cell unicode
-        +cell Background color (HEX, RGB or color names).
-        +cell #[code '#ffffff']
-
-    +row
-        +cell #[code font]
-        +cell unicode
-        +cell Font name or font family for all text.
-        +cell #[code 'Arial']
-
-p
-    |  For a list of all available options, see the
-    |  #[+api("displacy#options") #[code displacy] API documentation].
-
-+aside-code("Options example").
-    options = {'compact': True, 'bg': '#09a3d5',
-               'color': 'white', 'font': 'Source Sans Pro'}
-    displacy.serve(doc, style='dep', options=options)
-
-+codepen("39c02c893a84794353de77a605d817fd", 360)
-
-+h(3, "ent") Visualizing the entity recognizer
-
-p
-    |  The entity visualizer, #[code ent], highlights named entities and
-    |  their labels in a text.
-
-+code("Named Entity example").
-    import spacy
-    from spacy import displacy
-
-    text = """But Google is starting from behind. The company made a late push
-    into hardware, and Apple’s Siri, available on iPhones, and Amazon’s Alexa
-    software, which runs on its Echo and Dot devices, have clear leads in
-    consumer adoption."""
-
-    nlp = spacy.load('custom_ner_model')
-    doc = nlp(text)
-    displacy.serve(doc, style='ent')
-
-+codepen("a73f8b68f9af3157855962b283b364e4", 345)
-
-p The entity visualizer lets you customise the following #[code options]:
-
-+table(["Name", "Type", "Description", "Default"])
-    +row
-        +cell #[code ents]
-        +cell list
-        +cell
-            |  Entity types to highlight (#[code None] for all types).
-        +cell #[code None]
-
-    +row
-        +cell #[code colors]
-        +cell dict
-        +cell
-            |  Color overrides. Entity types in lowercase should be mapped to
-            |  color names or values.
-        +cell #[code {}]
-
-p
-    |  If you specify a list of #[code ents], only those entity types will be
-    |  rendered – for example, you can choose to display #[code PERSON] entities.
-    |  Internally, the visualizer knows nothing about available entity types and
-    |  will render whichever spans and labels it receives. This makes it
-    |  especially easy to work with custom entity types. By default, displaCy
-    |  comes with colours for all
-    |  #[+a("/docs/api/annotation#named-entities") entity types supported by spaCy].
-    |  If you're using custom entity types, you can use the #[code colors]
-    |  setting to add your own colours for them.
-
-+aside-code("Options example").
-    colors = {'ORG': 'linear-gradient(90deg, #aa9cfc, #fc9ce7)'}
-    options = {'ents': ['ORG'], 'colors': colors}
-    displacy.serve(doc, style='ent', options=options)
-
-+codepen("f42ec690762b6f007022a7acd6d0c7d4", 300)
-
-p
-    |  The above example uses a little trick: Since the background colour values
-    |  are added as the #[code background] style attribute, you can use any
-    |  #[+a("https://tympanus.net/codrops/css_reference/background/") valid background value]
-    |  or shorthand — including gradients and even images!
-
-+h(3, "ent-titles") Adding titles to documents
-
-p
-    |  Rendering several large documents on one page can easily become confusing.
-    |  To add a headline to each visualization, you can add a #[code title] to
-    |  its #[code user_data]. User data is never touched or modified by spaCy.
-
-+code.
-    doc = nlp(u'This is a sentence about Google.')
-    doc.user_data['title'] = 'This is a title'
-    displacy.serve(doc, style='ent')
-
-p
-    |  This feature is espeically handy if you're using displaCy to compare
-    |  performance at different stages of a process, e.g. during training. Here
-    |  you could use the title for a brief description of the text example and
-    |  the number of iterations.
-
-+h(2, "render") Rendering visualizations
-
-p
-    |  If you don't need the web server and just want to generate the markup
-    |  – for example, to export it to a file or serve it in a custom
-    |  way – you can use #[+api("displacy#render") #[code displacy.render]].
-    |  It works the same way, but returns a string containing the markup.
-
-+code("Example").
-    import spacy
-    from spacy import displacy
-
-    nlp = spacy.load('en')
-    doc1 = nlp(u'This is a sentence.')
-    doc2 = nlp(u'This is another sentence.')
-    html = displacy.render([doc1, doc2], style='dep', page=True)
-
-p
-    |  #[code page=True] renders the markup wrapped as a full HTML page.
-    |  For minified and more compact HTML markup, you can set #[code minify=True].
-    |  If you're rendering a dependency parse, you can also export it as an
-    |  #[code .svg] file.
-
-+aside("What's SVG?")
-    |  Unlike other image formats, the SVG (Scalable Vector Graphics) uses XML
-    |  markup that's easy to manipulate
-    |  #[+a("https://www.smashingmagazine.com/2014/11/styling-and-animating-svgs-with-css/") using CSS] or
-    |  #[+a("https://css-tricks.com/smil-is-dead-long-live-smil-a-guide-to-alternatives-to-smil-features/") JavaScript].
-    |  Essentially, SVG lets you design with code, which makes it a perfect fit
-    |  for visualizing dependency trees. SVGs can be embedded online in an
-    |  #[code <img>] tag, or inlined in an HTML document. They're also
-    |  pretty easy to #[+a("https://convertio.co/image-converter/") convert].
-
-+code.
-    svg = displacy.render(doc, style='dep')
-    output_path = Path('/images/sentence.svg')
-    output_path.open('w', encoding='utf-8').write(svg)
-
-+infobox("Important note")
-    |  Since each visualization is generated as a separate SVG, exporting
-    |  #[code .svg] files only works if you're rendering #[strong one single doc]
-    |  at a time. (This makes sense – after all, each visualization should be
-    |  a standalone graphic.) So instead of rendering all #[code Doc]s at one,
-    |  loop over them and export them separately.
-
-
-+h(3, "examples-export-svg") Example: Export SVG graphics of dependency parses
-
-+code("Example").
-    import spacy
-    from spacy import displacy
-    from pathlib import Path
-
-    nlp = spacy.load('en')
-    sentences = ["This is an example.", "This is another one."]
-    for sent in sentences:
-        doc = nlp(sentence)
-        svg = displacy.render(doc, style='dep')
-        file_name = '-'.join([w.text for w in doc if not w.is_punct]) + '.svg'
-        output_path = Path('/images/' + file_name)
-        output_path.open('w', encoding='utf-8').write(svg)
-
-p
-    |  The above code will generate the dependency visualizations and them to
-    |  two files, #[code This-is-an-example.svg] and #[code This-is-another-one.svg].
-
-
-+h(2, "jupyter") Using displaCy in Jupyter notebooks
-
-p
-    |  displaCy is able to detect whether you're working in a
-    |  #[+a("https://jupyter.org") Jupyter] notebook, and will return markup
-    |  that can be rendered in a cell straight away. When you export your
-    |  notebook, the visualizations will be included as HTML.
-
-+code("Jupyter Example").
-    # don't forget to install a model, e.g.: python -m spacy download en
-    import spacy
-    from spacy import displacy
-
-    doc = nlp(u'Rats are various medium-sized, long-tailed rodents.')
-    displacy.render(doc, style='dep')
-
-    doc2 = nlp(LONG_NEWS_ARTICLE)
-    displacy.render(doc2, style='ent')
-
-+aside("Enabling or disabling Jupyter mode")
-    |  To explicitly enable or disable "Jupyter mode", you can use the
-    |  #[code jupyter] keyword argument – e.g. to return raw HTML in a notebook,
-    |  or to force Jupyter rendering if auto-detection fails.
-
-+image("/assets/img/docs/displacy_jupyter.jpg", 700, false, "Example of using the displaCy dependency and named entity visualizer in a Jupyter notebook")
-
-p
-    |  Internally, displaCy imports #[code display] and #[code HTML] from
-    |  #[code IPython.core.display] and returns a Jupyter HTML object. If you
-    |  were doing it manually, it'd look like this:
-
-+code.
-    from IPython.core.display import display, HTML
-
-    html = displacy.render(doc, style='dep')
-    return display(HTML(html))
-
-+h(2, "manual-usage") Rendering data manually
-
-p
-    |  You can also use displaCy to manually render data. This can be useful if
-    |  you want to visualize output from other libraries, like
-    |  #[+a("http://www.nltk.org") NLTK] or
-    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet].
-    |  Simply convert the dependency parse or recognised entities to displaCy's
-    |  format and set #[code manual=True] on either #[code render()] or
-    |  #[code serve()].
-
-+aside-code("Example").
-    ex = [{'text': 'But Google is starting from behind.',
-           'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
-           'title': None}]
-    html = displacy.render(ex, style='ent', manual=True)
-
-+code("DEP input").
-    {
-        'words': [
-            {'text': 'This', 'tag': 'DT'},
-            {'text': 'is', 'tag': 'VBZ'},
-            {'text': 'a', 'tag': 'DT'},
-            {'text': 'sentence', 'tag': 'NN'}],
-        'arcs': [
-            {'start': 0, 'end': 1, 'label': 'nsubj', 'dir': 'left'},
-            {'start': 2, 'end': 3, 'label': 'det', 'dir': 'left'},
-            {'start': 1, 'end': 3, 'label': 'attr', 'dir': 'right'}]
-    }
-
-+code("ENT input").
-    {
-        'text': 'But Google is starting from behind.',
-        'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
-        'title': None
-    }
-
-+h(2, "webapp") Using displaCy in a web application
-
-p
-    |  If you want to use the visualizers as part of a web application, for
-    |  example to create something like our
-    |  #[+a(DEMOS_URL + "/displacy") online demo], it's not recommended to
-    |  simply wrap and serve the displaCy renderer. Instead, you should only
-    |  rely on the server to perform spaCy's processing capabilities, and use
-    |  #[+a(gh("displacy")) displaCy.js] to render the JSON-formatted output.
-
-+aside("Why not return the HTML by the server?")
-    |  It's certainly possible to just have your server return the markup.
-    |  But outputting raw, unsanitised HTML is risky and makes your app vulnerable to
-    |  #[+a("https://en.wikipedia.org/wiki/Cross-site_scripting") cross-site scripting]
-    |  (XSS). All your user needs to do is find a way to make spaCy return text
-    |  like #[code <script src="malicious-code.js"><script>], which
-    |  is pretty easy in NER mode. Instead of relying on the server to render
-    |  and sanitise HTML, you can do this on the client in JavaScript.
-    |  displaCy.js creates the markup as DOM nodes and will never insert raw
-    |  HTML.
-
-p
-    |  The #[code parse_deps] function takes a #[code Doc] object and returns
-    |  a dictionary in a format that can be rendered by displaCy.
-
-+code("Example").
-    import spacy
-    from spacy import displacy
-
-    nlp = spacy.load('en')
-
-    def displacy_service(text):
-        doc = nlp(text)
-        return displacy.parse_deps(doc)
-
-p
-    |  Using a library like #[+a("https://falconframework.org/") Falcon] or
-    |  #[+a("http://www.hug.rest/") Hug], you can easily turn the above code
-    |  into a simple REST API that receives a text and returns a JSON-formatted
-    |  parse. In your front-end, include #[+a(gh("displacy")) displacy.js] and
-    |  initialise it with the API URL and the ID or query selector of the
-    |  container to render the visualisation in, e.g. #[code '#displacy'] for
-    |  #[code <div id="displacy">].
-
-+code("script.js", "javascript").
-    var displacy = new displaCy('http://localhost:8080', {
-        container: '#displacy'
-    })
-
-    function parse(text) {
-        displacy.parse(text);
-    }
-
-p
-    |  When you call #[code parse()], it will make a request to your API,
-    |  receive the JSON-formatted parse and render it in your container. To
-    |  create an interactive experience, you could trigger this function by
-    |  a button and read the text from an #[code <input>] field.
diff --git a/website/index.jade b/website/index.jade
index 741db53cf..0155ab295 100644
--- a/website/index.jade
+++ b/website/index.jade
@@ -8,67 +8,54 @@ include _includes/_mixins
         | Natural Language#[br]
         | Processing
 
-    h2.c-landing__title.o-block.u-heading-1
-        | in Python
+    h2.c-landing__title.o-block.u-heading-3
+        span.u-text-label.u-text-label--light in Python
 
-    +landing-badge(gh("spaCy") + "/releases/tag/v2.0.0-alpha", "v2alpha", "Try spaCy v2.0.0 alpha!")
++grid.o-content.c-landing__blocks
+    +grid-col("third").c-landing__card.o-card.o-grid.o-grid--space
+        +h(3) Fastest in the world
+        p
+            |  spaCy excels at large-scale information extraction tasks.
+            |  It's written from the ground up in carefully memory-managed
+            |  Cython. Independent research has confirmed that spaCy is
+            |  the fastest in the world.  If your application needs to
+            |  process entire web dumps, spaCy is the library you want to
+            |  be using.
 
-    +grid.o-content
-        +grid-col("third").o-card
-            +h(2) Fastest in the world
-            p
-                |  spaCy excels at large-scale information extraction tasks.
-                |  It's written from the ground up in carefully memory-managed
-                |  Cython. Independent research has confirmed that spaCy is
-                |  the fastest in the world.  If your application needs to
-                |  process entire web dumps, spaCy is the library you want to
-                |  be using.
+        +button("/usage/facts-figures", true, "primary")
+            |  Facts & figures
 
-            +button("/docs/api", true, "primary")
-                |  Facts & figures
+    +grid-col("third").c-landing__card.o-card.o-grid.o-grid--space
+        +h(3) Get things done
+        p
+            |  spaCy is designed to help you do real work — to build real
+            |  products, or gather real insights. The library respects
+            |  your time, and tries to avoid wasting it. It's easy to
+            |  install, and its API is simple and productive. We like to
+            |  think of spaCy as the Ruby on Rails of Natural Language
+            |  Processing.
 
-        +grid-col("third").o-card
-            +h(2) Get things done
-            p
-                |  spaCy is designed to help you do real work — to build real
-                |  products, or gather real insights. The library respects
-                |  your time, and tries to avoid wasting it. It's easy to
-                |  install, and its API is simple and productive. I like to
-                |  think of spaCy as the Ruby on Rails of Natural Language
-                |  Processing.
+        +button("/usage", true, "primary")
+            |  Get started
 
-            +button("/docs/usage", true, "primary")
-                |  Get started
+    +grid-col("third").c-landing__card.o-card.o-grid.o-grid--space
+        +h(3) Deep learning
+        p
+            |  spaCy is the best way to prepare text for deep learning.
+            |  It interoperates seamlessly with TensorFlow, PyTorch,
+            |  scikit-learn, Gensim and the
+            |  rest of Python's awesome AI ecosystem. spaCy helps you
+            |  connect the statistical models trained by these libraries
+            |  to the rest of your application.
 
-        +grid-col("third").o-card
-            +h(2) Deep learning
-            p
-                |  spaCy is the best way to prepare text for deep learning.
-                |  It interoperates seamlessly with
-                |  #[+a("https://www.tensorflow.org") TensorFlow],
-                |  #[+a("https://keras.io") Keras],
-                |  #[+a("http://scikit-learn.org") Scikit-Learn],
-                |  #[+a("https://radimrehurek.com/gensim") Gensim] and the
-                |  rest of Python's awesome AI ecosystem. spaCy helps you
-                |  connect the statistical models trained by these libraries
-                |  to the rest of your application.
-
-            +button("/docs/usage/deep-learning", true, "primary")
-                |  Read more
-
-.o-inline-list.o-block.u-border-bottom.u-text-small.u-text-center.u-padding-small
-    +a(gh("spaCy") + "/releases")
-        strong.u-text-label.u-color-subtle #[+icon("code", 18)] Latest release:
-        |  v#{SPACY_VERSION}
-
-    if LATEST_NEWS
-        +a(LATEST_NEWS.url) #[+tag.o-icon New!] #{LATEST_NEWS.title}
+        +button("/usage/deep-learning", true, "primary")
+            |  Read more
 
 .o-content
     +grid
         +grid-col("two-thirds")
             +terminal("lightning_tour.py").
-                # Install: pip install spacy && python -m spacy download en
+                # Install: pip install spacy && spacy download en
                 import spacy
 
                 # Load English tokenizer, tagger, parser, NER and word vectors
@@ -92,67 +79,77 @@ include _includes/_mixins
             +h(2) Features
             +list
                 +item Non-destructive #[strong tokenization]
-                +item Syntax-driven sentence segmentation
+                +item Support for #[strong #{LANG_COUNT}+ languages]
+                +item #[strong #{MODEL_COUNT} statistical models] for #{MODEL_LANG_COUNT} languages
                 +item Pre-trained #[strong word vectors]
+                +item Easy #[strong deep learning] integration
                 +item Part-of-speech tagging
                 +item #[strong Named entity] recognition
                 +item Labelled dependency parsing
+                +item Syntax-driven sentence segmentation
+                +item Built in #[strong visualizers] for syntax and NER
                 +item Convenient string-to-hash mapping
                 +item Export to numpy data arrays
-                +item GIL-free #[strong multi-threading]
                 +item Efficient binary serialization
-                +item Easy #[strong deep learning] integration
-                +item Statistical models for #[strong English] and #[strong German]
+                +item Easy #[strong model packaging] and deployment
                 +item State-of-the-art speed
                 +item Robust, rigorously evaluated accuracy
 
++landing-banner("Convolutional neural network models", "New in v2.0")
+    p
+        |  spaCy v2.0 features new neural models for #[strong tagging],
+        |  #[strong parsing] and #[strong entity recognition]. The models have
+        |  been designed and implemented from scratch specifically for spaCy, to
+        |  give you an unmatched balance of speed, size and accuracy. A novel
+        |  bloom embedding strategy with subword features is used to support
+        |  huge vocabularies in tiny tables. Convolutional layers with residual
+        |  connections, layer normalization and maxout non-linearity are used,
+        |  giving much better efficiency than the standard BiLSTM solution.
+        |  Finally, the parser and NER use an imitation learning objective to
+        |  deliver accuracy in-line with the latest research systems,
+        |  even when  evaluated from raw text. With these innovations, spaCy
+        |  v2.0's models are #[strong 10× smaller],
+        |  #[strong 20% more accurate], and #[strong just as fast] as the
+        |  previous generation.
+
+    .o-block-small.u-text-right
+        +button("/models", true, "secondary-light") Download models
+
++landing-logos("spaCy is trusted by", logos)
+    +button(gh("spacy") + "/stargazers", false, "secondary", "small")
+        |  and many more
+
++landing-logos("Featured on", features).o-block-small
+
++landing-banner("Prodigy: Radically efficient machine teaching", "From the makers of spaCy")
+    p
+        |  Prodigy is an #[strong annotation tool] so efficient that data scientists can
+        |  do the annotation themselves, enabling a new level of rapid
+        |  iteration. Whether you're working on entity recognition, intent
+        |  detection or image classification, Prodigy can help you
+        |  #[strong train and evaluate] your models faster. Stream in your own examples or
+        |  real-world data from live APIs, update your model in real-time and
+        |  chain models together to build more complex systems.
+
+    .o-block-small.u-text-right
+        +button("https://prodi.gy", true, "secondary-light") Try it out
+
+.o-content
+    +grid
+        +grid-col("half")
+            +h(2) Benchmarks
+
+            p
+                |  In 2015, independent researchers from Emory University and
+                |  Yahoo! Labs showed that spaCy offered the
+                |  #[strong fastest syntactic parser in the world] and that its
+                |  accuracy was #[strong within 1% of the best] available
+                |  (#[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") Choi et al., 2015]).
+                |  spaCy v2.0, released in 2017, is more accurate than any of
+                |  the systems Choi et al. evaluated.
+
             .o-inline-list
-                +button("/docs/usage/lightning-tour", true, "secondary")
-                    | See examples
+                +button("/usage/facts-figures#benchmarks", true, "secondary") See details
 
-    .o-block.u-text-center.u-padding
-        h3.u-text-label.u-color-subtle.o-block spaCy is trusted by
-
-        each row in logos
-            +grid("center").o-inline-list
-                each details, name in row
-                    +a(details[0])
-                        img(src="/assets/img/logos/#{name}.png" alt=name width=(details[1] || 150)).u-padding-small
-
-.u-pattern.u-padding
-    +grid.o-card.o-content
-        +grid-col("quarter")
-            img(src="/assets/img/profile_matt.png" width="280")
-
-        +grid-col("three-quarters")
-            +h(2) What's spaCy all about?
-
-            p
-                |  By 2014, I'd been publishing NLP research for about 10
-                |  years. During that time, I saw a huge gap open between the
-                |  technology that Google-sized companies could take to market,
-                |  and what was available to everyone else. This was especially
-                |  clear when companies started trying to use my research. Like
-                |  most researchers, my work was free to read, but expensive to
-                |  apply. You could run my code, but its requirements were
-                |  narrow. My code's mission in life was to print results
-                |  tables for my papers — it was good at this job, and bad at
-                |  all others.
-
-            p
-                |  spaCy's #[+a("/docs/api/philosophy") mission] is to make
-                |  cutting-edge NLP practical and commonly available.  That's
-                |  why I left academia in 2014, to build a production-quality
-                |  open-source NLP library. It's why
-                |  #[+a("https://twitter.com/_inesmontani") Ines] joined the
-                |  project in 2015, to build visualisations, demos and
-                |  annotation tools that make NLP technologies less abstract
-                |  and easier to use. Together, we've founded
-                |  #[+a(COMPANY_URL, true) Explosion AI], to develop data packs
-                |  you can drop into spaCy to extend its capabilities. If
-                |  you're processing Hindi insurance claims, you need a model
-                |  for that. We can build it for you.
-
-            .o-block
-                +a("https://twitter.com/honnibal")
-                    +svg("graphics", "matt-signature", 60, 45).u-color-theme
+        +grid-col("half")
+            include usage/_facts-figures/_benchmarks-choi-2015
diff --git a/website/models/_data.json b/website/models/_data.json
new file mode 100644
index 000000000..f7ba16c9f
--- /dev/null
+++ b/website/models/_data.json
@@ -0,0 +1,100 @@
+{
+    "sidebar": {
+        "Models": {
+            "Overview": "./"
+        },
+
+        "Language models": {
+            "English": "en",
+            "German": "de",
+            "Spanish": "es",
+            "French": "fr",
+            "Multi-Language": "xx"
+        }
+    },
+
+    "index": {
+        "title": "Models Overview",
+        "teaser": "Downloadable statistical models for spaCy to predict and assign linguistic features.",
+        "quickstart": true,
+        "menu": {
+            "Quickstart": "quickstart",
+            "Installation": "install",
+            "Naming Conventions": "conventions"
+        }
+    },
+
+    "MODELS": {
+        "en": ["en_core_web_sm", "en_core_web_lg", "en_vectors_web_lg"],
+        "de": ["de_dep_news_sm"],
+        "es": ["es_core_web_sm"],
+        "fr": [],
+        "xx": ["xx_ent_wiki_sm"]
+    },
+
+    "MODEL_META": {
+        "core": "Vocabulary, syntax, entities, vectors",
+        "dep": "Vocabulary, syntax",
+        "ent": "Named entities",
+        "vectors": "Word vectors",
+        "web": "written text (blogs, news, comments)",
+        "news": "written text (news, media)",
+        "wiki": "Wikipedia",
+        "uas": "Unlabelled dependencies",
+        "las": "Labelled dependencies",
+        "tags_acc": "Part-of-speech tags",
+        "ents_f": "Entities (F-score)",
+        "ents_p": "Entities (precision)",
+        "ents_r": "Entities (recall)",
+        "pipeline": "Processing pipeline components in order",
+        "sources": "Sources of training data"
+    },
+
+    "MODEL_LICENSES": {
+        "CC BY-SA": "https://creativecommons.org/licenses/by-sa/3.0/",
+        "CC BY-SA 3.0": "https://creativecommons.org/licenses/by-sa/3.0/",
+        "CC BY-NC": "https://creativecommons.org/licenses/by-nc/3.0/",
+        "CC BY-NC 3.0": "https://creativecommons.org/licenses/by-nc/3.0/"
+    },
+
+    "MODEL_ACCURACY": {
+        "uas": "UAS",
+        "las": "LAS",
+        "tags_acc": "POS",
+        "ents_f": "NER F",
+        "ents_p": "NER P",
+        "ents_r": "NER R"
+    },
+
+    "LANGUAGES": {
+        "en": "English",
+        "de": "German",
+        "fr": "French",
+        "es": "Spanish",
+        "it": "Italian",
+        "pt": "Portuguese",
+        "nl": "Dutch",
+        "sv": "Swedish",
+        "fi": "Finnish",
+        "nb": "Norwegian Bokmål",
+        "da": "Danish",
+        "hu": "Hungarian",
+        "pl": "Polish",
+        "ru": "Russian",
+        "he": "Hebrew",
+        "bn": "Bengali",
+        "id": "Indonesian",
+        "th": "Thai",
+        "zh": "Chinese",
+        "ja": "Japanese",
+        "xx": "Multi-language"
+    },
+
+    "EXAMPLE_SENTENCES": {
+        "en": "This is a sentence.",
+        "de": "Dies ist ein Satz.",
+        "fr": "C'est une phrase.",
+        "es": "Esto es una frase.",
+        "xx": "This is a sentence about Facebook."
+    }
+}
diff --git a/website/models/de.jade b/website/models/de.jade
new file mode 100644
index 000000000..113290b7a
--- /dev/null
+++ b/website/models/de.jade
@@ -0,0 +1,6 @@
+//- 💫 DOCS > MODELS > DE
+
+include ../_includes/_mixins
+
+//- This is a placeholder. The page is rendered via the template at
+//- /_includes/_page-model.jade.
diff --git a/website/models/en.jade b/website/models/en.jade
new file mode 100644
index 000000000..4f400662b
--- /dev/null
+++ b/website/models/en.jade
@@ -0,0 +1,6 @@
+//- 💫 DOCS > MODELS > EN
+
+include ../_includes/_mixins
+
+//- This is a placeholder. The page is rendered via the template at
+//- /_includes/_page-model.jade.
diff --git a/website/models/es.jade b/website/models/es.jade
new file mode 100644
index 000000000..7aad72e81
--- /dev/null
+++ b/website/models/es.jade
@@ -0,0 +1,6 @@
+//- 💫 DOCS > MODELS > ES
+
+include ../_includes/_mixins
+
+//- This is a placeholder. The page is rendered via the template at
+//- /_includes/_page-model.jade.
diff --git a/website/models/fr.jade b/website/models/fr.jade
new file mode 100644
index 000000000..1b3cc3fde
--- /dev/null
+++ b/website/models/fr.jade
@@ -0,0 +1,6 @@
+//- 💫 DOCS > MODELS > FR
+
+include ../_includes/_mixins
+
+//- This is a placeholder. The page is rendered via the template at
+//- /_includes/_page-model.jade.
diff --git a/website/models/index.jade b/website/models/index.jade
new file mode 100644
index 000000000..8f9aae739
--- /dev/null
+++ b/website/models/index.jade
@@ -0,0 +1,98 @@
+//- 💫 DOCS > MODELS
+
+include ../_includes/_mixins
+
++section("quickstart")
+    p
+        |  spaCy v2.0 features new neural models for #[strong tagging],
+        |  #[strong parsing] and #[strong entity recognition]. The models have
+        |  been designed and implemented from scratch specifically for spaCy, to
+        |  give you an unmatched balance of speed, size and accuracy. A novel
+        |  bloom embedding strategy with subword features is used to support
+        |  huge vocabularies in tiny tables. Convolutional layers with residual
+        |  connections, layer normalization and maxout non-linearity are used,
+        |  giving much better efficiency than the standard BiLSTM solution. For
+        |  more details, see the notes on the
+        |  #[+a("/api/#nn-models") model architecture].
+
+    p
+        |  The parser and NER use an imitation learning objective to
+        |  deliver #[strong accuracy in-line with the latest research systems],
+        |  even when  evaluated from raw text. With these innovations, spaCy
+        |  v2.0's models are #[strong 10× smaller],
+        |  #[strong 20% more accurate], and #[strong just as fast] as the
+        |  previous generation.
+
+    include ../usage/_models/_quickstart
+
++section("install")
+    +h(2, "install") Installation & Usage
+
+    include ../usage/_models/_install-basics
+
+    +infobox
+        |  For more details on how to use models with spaCy, see the
+        |  #[+a("/usage/models") usage guide on models].
+
++section("conventions")
+    +h(2, "model-naming") Model naming conventions
+
+    p
+        |  In general, spaCy expects all model packages to follow the naming
+        |  convention of #[code [lang]_[name]]. For spaCy's models, we also
+        |  chose to divide the name into three components:
+
+    +table
+        +row
+            +cell #[+label Type]
+            +cell
+                |  Model capabilities (e.g. #[code core] for general-purpose
+                |  model with vocabulary, syntax, entities and word vectors, or
+                |  #[code depent] for only vocab, syntax and entities).
+        +row
+            +cell #[+label Genre]
+            +cell
+                |  Type of text the model is trained on, e.g. #[code web] or
+                |  #[code news].
+        +row
+            +cell #[+label Size]
+            +cell Model size indicator, #[code sm], #[code md] or #[code lg].
+
+    p
+        |  For example, #[code en_core_web_sm] is a small English model trained
+        |  on written web text (blogs, news, comments), that includes
+        |  vocabulary, vectors, syntax and entities.
+
+    +h(3, "model-versioning") Model versioning
+
+    p
+        |  Additionally, the model versioning reflects both the compatibility
+        |  with spaCy, as well as the major and minor model version. A model
+        |  version #[code a.b.c] translates to:
+
+    +table
+        +row
+            +cell #[code a]
+            +cell
+                |  #[strong spaCy major version]. For example, #[code 2] for
+                |  spaCy v2.x.
+        +row
+            +cell #[code b]
+            +cell
+                |  #[strong Model major version]. Models with a different major
+                |  version can't be loaded by the same code. For example,
+                |  changing the width of the model, adding hidden layers or
+                |  changing the activation changes the model major version.
+        +row
+            +cell #[code c]
+            +cell
+                |  #[strong Model minor version]. Same model structure, but
+                |  different parameter values, e.g. from being trained on
+                |  different data, for different numbers of iterations, etc.
+
+    p
+        |  For a detailed compatibility overview, see the
+        |  #[+a(gh("spacy-models", "compatibility.json")) #[code compatibility.json]]
+        |  in the models repository. This is also the source of spaCy's internal
+        |  compatibility check, performed when you run the
+        |  #[+api("cli#download") #[code download]] command.
diff --git a/website/models/xx.jade b/website/models/xx.jade
new file mode 100644
index 000000000..8967f38fa
--- /dev/null
+++ b/website/models/xx.jade
@@ -0,0 +1,6 @@
+//- 💫 DOCS > MODELS > XX
+
+include ../_includes/_mixins
+
+//- This is a placeholder. The page is rendered via the template at
+//- /_includes/_page-model.jade.
diff --git a/website/package.json b/website/package.json
new file mode 100644
index 000000000..c86aca222
--- /dev/null
+++ b/website/package.json
@@ -0,0 +1,20 @@
+{
+  "name": "spacy.io",
+  "private": true,
+  "version": "2.0.0",
+  "description": "spacy.io website",
+  "author": "Explosion AI",
+  "license": "MIT",
+  "devDependencies": {
+    "babel-cli": "^6.14.0",
+    "harp": "^0.24.0",
+    "uglify-js": "^2.7.3"
+  },
+  "dependencies": {},
+  "scripts": {
+    "compile": "NODE_ENV=deploy harp compile",
+    "compile_js": "babel www/assets/js/main.js --out-file www/assets/js/main.js --presets=es2015",
+    "uglify": "uglifyjs www/assets/js/main.js --output www/assets/js/main.js",
+    "build": "npm run compile && npm run compile_js && npm run uglify"
+  }
+}
diff --git a/website/styleguide.jade b/website/styleguide.jade
new file mode 100644
index 000000000..42e70ed73
--- /dev/null
+++ b/website/styleguide.jade
@@ -0,0 +1,623 @@
+//- 💫 STYLEGUIDE
+
+include _includes/_mixins
+
++section("intro")
+    p
+        |  This styleguide is loosely based on the concept and principles of
+        |  #[+a("http://bradfrost.com/blog/post/atomic-web-design/") Atomic Design].
+        |  The templates consist of small elements (atoms) which are combined
+        |  and connected to form larger molecules and full components. The site
+        |  is compiled using #[+a("http://harpjs.com/") Harp], a static web
+        |  server with built-in preprocessing. Templates are written entirely in
+        |  #[+a("http://jade-lang.com") Jade] (aka. Pug), a clean,
+        |  whitespace-sensitive templating  language that compiles to HTML.
+        |  CSS is written in #[+a("http://sass-lang.com") Sass] and preprocessed
+        |  via Harp, JavaScript is written in ES6 syntax and compiled using
+        |  #[+a("https://babeljs.io") Babel].
+
++section("logo")
+    +h(2, "logo", "website/assets/img/logo.svg") Logo
+
+    p
+        |  If you would like to use the spaCy logo on your site, please get in
+        |  touch and ask us first. However, if you want to show support and tell
+        |  others that your project is using spaCy, you can grab one of our
+        |  #[+a("/usage/spacy-101#faq-project-with-spacy") spaCy badges].
+
+    +grid
+        each color in [["#09a3d5", "#fff"], ["#fff", "#09a3d5"]]
+            +grid-col("half").o-box.u-text-center.u-padding-medium(style="background: #{color[1]}; color: #{color[0]}")
+                +icon("spacy", 338, 108)(style="max-width: 100%")
+
++section("colors")
+    +h(2, "colors", "website/assets/css/_variables.sass") Colors
+
+    +grid
+        each color, label in {"dark": "#1a1e23", "medium": "#45505e", "light": "#dddddd", "faint": "#f6f6f6", "blue": "#09a3d5", "dark blue": "#077ea4", "green": "#05b083", "dark green": "#047e5e"}
+            +grid-col("quarter").u-text-small.o-card
+                div(style="height: 75px; background: #{color}; border-top-left-radius: 6px; border-top-right-radius: 6px")
+                .u-text-center.u-padding-medium
+                    +label=label
+                    code=color
+
+        each pattern in ["blue", "green"]
+            +grid-col("half").u-text-small.o-card
+                div(style="background: url('/assets/img/pattern_#{pattern}.jpg') center/100% repeat; height: 125px; border-top-left-radius: 6px; border-top-right-radius: 6px")
+                .u-text-center.u-padding-medium
+                    +label #{pattern} pattern
+                    .u-text-tiny.u-color-subtle by #[+a("https://dribbble.com/kemal").u-color-dark Kemal Şanlı]
+
++section("typography")
+    +h(2, "typography") Typography
+
+    +aside-code("Usage", "jade").
+        +h(2) Headline two
+        +h(3, "some-id") Headline three
+
+    p
+        |  Headlines are set in
+        |  #[+a("http://cargocollective.com/hanken/HK-Grotesk-Open-Source-Font") HK Grotesk]
+        |  by Hanken Design. All other body text and code uses the best-matching
+        |  default system font to provide a "native" reading experience.
+
+    each heading in [0, 1, 2, 3, 4, 5]
+        .o-block-small(class="u-heading-" + heading) Heading #{heading}
+    +label Label
+
++section("elements")
+    +h(2, "elements", "website/_includes/_mixins.jade") Elements
+
+    p
+        |  The site comes with a collection of simple content elements,
+        |  implemented as mixins. These elements can be used individually, or as
+        |  part of larger components.
+
+    +h(3, "text-links") Special text & links
+
+    +aside-code("Usage", "jade").
+        +api("token") #[code Token]
+        +src("https://github.com") GitHub source
+        +help("Help text here")
+        +fn(1, "bibliography")
+
+    p
+        |  Special link styles are implemented as mixins and can be used to
+        |  mark links to the API documentation, or links to source code.
+        |  Additionally a "help" icon can be added to provide more information
+        |  via a tooltip.
+
+    p.o-inline-list
+        +a("#") Link
+        code Inline Code
+        +api("token") #[code Token]
+        +src(gh("spacy")) Source
+        span.u-color-dark.u-nowrap Help #[+help("Help text here")]
+        span Footnote#[+fn(1, "", "This marks a footnote and can link to a section")]
+
+    +h(3, "buttons") Buttons
+
+    +aside-code("Usage", "jade").
+        +button("https://spacy.io", true, "secondary")
+        +button("https://spacy.io", true, "primary", "small")
+
+    p
+        |  Link buttons come in two variants, #[code primary] and
+        |  #[code secondary] and two sizes, with an optional #[code small] size
+        |  modifier.Since they're mostly used as enhanced links, the buttons are
+        |  implemented as styled links instead of native button elements.
+
+    p.o-inline-list
+        +button("#", false, "primary") Primary
+        +button("#", false, "secondary") Secondary
+        +button("#", false, "primary", "small") Primary small
+        +button("#", false, "secondary", "small") Secondary small
+
+    +h(3, "tags") Tags
+
+    +aside-code("Usage", "jade").
+        +tag I'm a tag
+        +tag-new(2)
+        +tag-model("Named entities")
+
+    p
+        |  Tags can be used together with headlines, or next to properties
+        |  across the documentation, and combined with tooltips to provide
+        |  additional information. The #[code +tag-new] mixin takes a version
+        |  number and can mark new features. Using the mixin, visibility of this
+        |  tag can be toggled once the feature isn't considered new anymore.
+        |  The #[code +tag-model] mixin takes a description of model
+        |  capabilities and can be used to mark features that require a
+        |  respective model to be installed.
+
+    p.o-inline-list
+        +tag I'm a tag
+        +tag-new(2)
+        +tag-model("Named entities")
+
+    +h(3, "icons", "website/_includes/_svg.jade") Icons
+
+    +aside-code("Usage", "jade").
+        +icon("github", 18)
+
+    p
+        |  Icons are implemented via an SVG sprite and can be included as a
+        |  mixin, using their name and an optional size value in #[code px].
+
+    +infobox.u-text-center
+        each icon in ["code", "arrow-right", "book", "circle", "chat", "star", "help", "accept", "reject", "markdown", "course", "github", "jupyter"]
+            .u-inline-block.u-padding-small.u-color-dark(data-tooltip=icon data-tooltip-style="code" aria-label=icon)
+                +icon(icon, 20)
+
++section("components")
+    +h(2, "components", "website/_includes/_mixins.jade") Components
+
+    p
+        |  The site uses a collection of Jade mixins to make it easy to use
+        |  complex content elements across templates and blog posts. To read
+        |  more about the concept of modular markup components, check out our
+        |  #[+a("https://explosion.ai/blog/modular-markup", true) blog post] on
+        |  the subject.
+
+    +h(3, "grid") Grid
+
+    +aside-code("Usage", "jade").
+        +grid
+            +grid-col("half") Half
+            +grid-col("half") Half
+
+    p
+        |  For now, the grid is still implemented as a standard #[code flexbox]
+        |  grid, although it may be refactored to use CSS #[code grid] going
+        |  forward. The grid supports up to four columns and collapses on
+        |  small screens.
+
+    +grid
+        each count, label in {"full": 1, "half": 2, "third": 3, "quarter": 4}
+            each _ in Array(count)
+                +grid-col(label).o-box.u-text-center.u-text-label.u-color-dark=label
+
+    +h(3, "table") Table
+
+    +aside-code("Usage", "jade").
+        +table(["Header 1", "Header 2"])
+            +row
+                +cell Cell
+                +cell Cell
+
+    p
+        |  Tables are used to present data and API documentation. If a list of
+        |  headings is specified, those will be rendered as the table header.
+        |  An optional #[code +row("foot")] can be used to mark a footer row
+        |  with a distinct style, for example to visualise the return values
+        |  of a documented function.
+
+    - var table_cols = ["Header 1", "Header 2", "Header 3"]
+    +table(table_cols)
+        each row, i in Array(4)
+            +row((i == 3) ? "foot" : null)
+                each col, j in table_cols
+                    +cell
+                        if i == 3 && j == 0
+                            |  Footer
+
+                        else
+                            |  Row #{i + 1}, cell #{j + 1}
+
+    +h(3, "list") List
+
+    +aside-code("Usage", "jade").
+        +list("numbers", 3)
+            +item List item
+            +item List item
+
+    p
+        |  Lists are available as bulleted, numbered, lettered and lower roman.
+        |  Optionally, a start index can be defined as the second argument
+        |  on ordered lists.
+
+    +grid
+        +list
+            +item I am a bulleted list
+            +item I have nice bullets
+            +item Lorem ipsum dolor
+            +item consectetur adipiscing elit
+
+        +list("numbers")
+            +item I am an ordered list
+            +item I have nice numbers
+            +item Lorem ipsum dolor
+            +item consectetur adipiscing elit
+
+        +list("numbers", 10)
+            +item I am an numbered list
+            +item with a custom start number
+            +item Lorem ipsum dolor
+            +item consectetur adipiscing elit
+
+        +list("letters")
+            +item I am an ordered list
+            +item I have uppercase letters
+            +item Lorem ipsum dolor
+            +item consectetur adipiscing elit
+
+        +list("letters", 18)
+            +item I am an ordered list
+            +item with a custom start letter
+            +item Lorem ipsum dolor
+            +item consectetur adipiscing elit
+
+        +list("roman")
+            +item I am an ordered list
+            +item I have roman numerals
+            +item Lorem ipsum dolor
+            +item consectetur adipiscing elit
+
+    +h(3, "code") Code
+
+    +aside-code("Usage", "jade").
+        +code("Label", "python").
+            import spacy
+            nlp = spacy.load('en')
+            doc = nlp(u"This is a sentence.")
+
+    p
+        |  Code blocks use the #[+a("http://prismjs.com/") Prism] syntax
+        |  highlighter with a custom theme. The language can be set individually
+        |  on each block, and defaults to Python. An optional label can be
+        |  added as the first argument, which is displayed above the block.
+        |  When using the #[code +code] mixin, don't forget to append a period
+        |  #[code .] to the mixin call. This tells Jade to interpret the
+        |  indented block as plain text and preserve whitespace.
+
+    +code("Using spaCy").
+        import spacy
+        nlp = spacy.load('en')
+        doc = nlp(u"This is a sentence.")
+
+    +h(3, "aside") Aside
+
+    +aside-code("Usage", "jade").
+        +aside("Title") This is an aside
+        +aside-code("Title", "python").
+            nlp = spacy.load('en')
+
+    p
+        |  Asides can be used to display additional notes and content in the
+        |  right-hand column. Two mixins are available: #[code +aside] for
+        |  regular text with an optional title, #[code +aside-code], which
+        |  roughly mimicks the #[code +code] component. Visually, asides are
+        |  moved to the side on the X-axis, and displayed at the same level
+        |  they were inserted. On small screens, they collapse and are rendered
+        |  in their original position, in between the text.
+
+    +h(3, "infobox") Infobox
+
+    +aside-code("Usage", "jade").
+        +infobox("Label") This is text.
+        +infobox("Label", "⚠️") This is text.
+
+    p
+        |  Infoboxes can be used to add notes, updates, warnings or additional
+        |  information to a page or section. Semantically, they're implemented
+        |  and interpreted as an #[code aside] element. Since infobox titles
+        |  are especially nice with emoji, an emoji can be specified as the
+        |  second argument for optimal rendering and spacing.
+
+    +infobox("Infobox label") Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque enim ante, pretium a orci eget, varius dignissim augue. Nam eu dictum mauris, id tincidunt nisi. Integer commodo pellentesque tincidunt.
+
+    +infobox("Infobox label with emoji", "⚠️") Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque enim ante, pretium a orci eget, varius dignissim augue. Nam eu dictum mauris, id tincidunt nisi. Integer commodo pellentesque tincidunt.
+
+    +h(3, "card") Card
+
+    +aside-code("Usage", "jade").
+        +grid
+            +card("Title", "https://", "Author", "github")
+                |  Card content goes here
+    p
+        |  Cards can be used to present external content and links, like GitHub
+        |  projects, websites, books or articles. They can take an optional
+        |  value for the content author and icon, which is displayed in the
+        |  corner. The content supplied via an indented block can also include
+        |  formatting or other elements like images. Under the hood, cards are
+        |  styled grid columns and should therefore always be used as children
+        |  of #[code +grid].
+
+    +grid
+        +card("spaCy", "https://github.com/explosion/spaCy", "Explosion AI", "github")
+            |  An open-source library for industrial-strength Natural Language
+            |  Processing in Python.
+
+        +card("Prodigy", "https://prodi.gy", "Explosion AI", "star")
+            |  A new annotation tool for radically efficient machine teaching,
+            |  powered by active learning.
+
++section("embeds")
+    +h(2, "embeds") Embeds
+
+    p
+        |  The framework also allows embedding content from selected sites via
+        |  mixins, usually styled wrappers for the respective embed codes.
+
+    +h(3, "codepen") CodePen
+
+    p
+        |  #[+a("https://codepen.io") CodePen] is a platform to share and
+        |  collaborate on front-end code. It comes with a powerful live editor,
+        |  and is mostly used on this site to present visualizations created by
+        |  spaCy's built-in visualizers. Embeds use a
+        |  #[+a("https://blog.codepen.io/documentation/pro-features/unlimited-embed-themes/") custom theme]
+        |  and are included using a mixin that takes the pen ID, and an optional
+        |  height to prevent content reflow on load.
+
+    +aside-code("Usage", "jade").
+        +codepen("2f2ad1408ff79fc6a326ea3aedbb353b", 160)
+
+    +codepen("2f2ad1408ff79fc6a326ea3aedbb353b", 160)
+
+    +h(3, "github") GitHub
+
+    p
+        |  GitHub only allows native embedding of Gists, but Gists are only
+        |  available for users, not organisations. So in order to be able to
+        |  embed examples from spaCy's #[+src(gh("spacy", "examples")) examples],
+        |  we ended up developing our own micro library. A #[code data-gh-embed]
+        |  attribute on the code block, set via the mixin, specifies the file
+        |  to load. The script then fetches the raw text via the GitHub API and
+        |  renders it in the container. This way, the example previews on the
+        |  site are always in sync with the examples in the repository.
+
+    +aside-code("Usage", "jade").
+        +github("spacy", "examples/training/train_textcat.py")
+
+    +github("spacy", "examples/training/train_textcat.py")
+
++section("markup")
+    +h(2, "markup") Markup reference
+
+    p
+        |  The spaCy website is implemented
+        |  in #[+a("https://www.jade-lang.org") Jade (aka Pug)], and is built or
+        |  served by #[+a("(https://harpjs.com") Harp]. Jade is an extensible
+        |  templating language with a readable syntax, that compiles to HTML.
+        |  The website source makes extensive use of Jade mixins, so that the
+        |  design system is abstracted away from the content you're writing. You
+        |  can read more about our approach in our blog post,
+        |  #[+a("https://explosion.ai/blog/modular-markup", true) "Rebuilding a Website with Modular Markup"].
+
+    +code("Viewing the site locally", "bash").
+        sudo npm install --global harp
+        git clone #{gh("spacy")}
+        cd spacy/website
+        harp server --port 9000
+
+    +h(3, "jade") Jade conventions
+
+    p
+        |  Jade/Pug is a whitespace-sensitive markup language that compiles to
+        |  HTML. Indentation is used to nest elements, and for template logic,
+        |  like #[code if], #[code else] or #[code for], mainly used to iterate
+        |  over objects and arrays in the meta data. It also allows inline
+        |  JavaScript expressions.
+
+    +grid.o-no-block
+        +grid-col("half")
+            +code("Input", "jade").
+                ul#some-id
+                    for item in ['a', 'b', 'c']
+                        li.test=item.toUpperCase()
+                            if item == 'a'
+                                |  🎉
+
+        +grid-col("half")
+            +code("Output", "markup").
+                <ul id="some-id">
+                    <li class="test">A 🎉<li>
+                    <li class="test">B<li>
+                    <li class="test">C<li>
+                </ul>
+
+    p
+        |  For an overview of Harp and Jade, see
+        |  #[+a("https://ines.io/blog/the-ultimate-guide-static-websites-harp-jade") this blog post].
+        |  For more info on the Jade/Pug syntax, check out their
+        |  #[+a("https://pugjs.org") documentation]. In the spacy.io source, we
+        |  use 4 spaces to indent and hard-wrap at 80 characters.
+
+    +code(false, "jade").
+        p This is a very short paragraph. It stays inline.
+
+        p
+            |  This is a much longer paragraph. It's hard-wrapped at 80 characters to
+            |  make it easier to read on GitHub and in editors that do not have soft
+            |  wrapping enabled. To prevent Jade from interpreting each line as a new
+            |  element, it's prefixed with a pipe and two spaces. This ensures that no
+            |  spaces are dropped – for example, if your editor strips out trailing
+            |  whitespace by default. Inline links are added using the inline syntax,
+            |  like this: #[+a("https://google.com") Google].
+
+    +aside("Plain HTML elements used")
+        +list.o-no-block
+            +item #[code p]: Regular paragraph.
+            +item #[code code]: Inline #[code code].
+            +item #[code em]: #[em Italicized] text.
+            +item #[code strong]: #[strong Bold] text.
+
+    p
+        |  Note that for external links, #[code +a("...")] is used instead
+        |  of #[code a(href="...")] – it's a mixin that takes care of adding all
+        |  required attributes. If possible, always use a mixin instead of
+        |  regular HTML elements. With a few exceptions for practical reasons,
+        |  class names and other HTML attributes should
+        |  #[strong only live in mixins] and not in the site content.
+
+    +infobox("Mixins documentation")
+        |  For a more detailed overview and API documentation of the available
+        |  mixins and their arguments, see the source of the
+        |  #[+src(gh("spacy", "website/_includes/_mixins.jade")) #[code _includes/_mixins.jade]]
+        |  file.
+
+    +h(3, "directory-structure") Directory structure
+
+    p
+        |  Each section is represented by its own subdirectory, containing a
+        |  #[code _data.json] to store its meta information. All #[code .jade]
+        |  files that are not prefixed with an underscore are later converted to
+        |  #[code .html]. Site assets like images, styles, fonts and scripts are
+        |  loaded from a directory #[code assets]. Global variables like titles,
+        |  navigations, URLs and other settings are defined in the global
+        |  #[code _harp.json].
+
+    +code("website", "yaml").
+        ├── _includes         # layout partials, shared mixins, functions
+        ├── api
+        |   ├── _data.json    # meta data for API section
+        |   └── ...           # other pages and partials
+        ├── assets
+        |   ├── css           # Sass styles, will be converted to CSS
+        |   ├── fonts         # web fonts
+        |   ├── img           # images and icons
+        |   └── js            # scripts, custom and third-party
+        ├── models
+        |   ├── _data.json    # model meta data and meta for models section
+        |   └── ...           # other pages and partials
+        ├── usage
+        |   ├── _data.json    # meta data for usage section
+        |   └── ...           # other pages and partials
+        ├── _data.json        # meta data for pages in the root
+        ├── _harp.json        # global site configuration and variables
+        ├── _layout.jade      # global layout
+        ├── 404.jade          # 404 page
+        └── index.jade        # landing page
+
+    +h(3, "data-structure") Data structure
+
+    p
+        |  While all page content lives in the #[code .jade] files, article meta
+        |  (page titles, sidebars etc.) is stored as JSON. Each folder contains
+        |  a #[code _data.json] with all required meta for its files. Meta
+        |  information is keyed by the page's filename or slug, and becomes
+        |  available to the templates as variables. The #[code menu] specifies
+        |  the sub-navigation in the sidebar and maps titles to section IDs.
+
+    +code(false, "json").
+        "resources": {
+            "title": "Resources",
+            "teaser": "Libraries, demos, books, courses and research systems featuring spaCy.",
+            "menu": {
+                "Third-party libraries": "libraries",
+                "Demos & Visualizations": "demos",
+                "Books & Courses": "books",
+                "Jupyter Notebooks": "notebooks",
+                "Research": "research"
+            }
+        }
+
+    p
+        |  Long pages with multiple sections are often split into separate
+        |  partials that live in their own subdirectory. Those partials can be
+        |  included on the page, and if needed, across the site to avoid content
+        |  duplication. Partials and partial directories are prefixed with an
+        |  underscore #[code _] to prevent Harp from building them as separate
+        |  files.
+
+    +code("spacy-101.jade", "jade").
+        +section("architecture")
+            +h(2, "architecture") Architecture
+            include _spacy-101/_architecture
+
+    +h(3, "model-data", "website/models/_data.json") Model data
+
+    p
+        |  The new #[+a("/models") models directory] uses the GitHub API to
+        |  fetch meta information from the latest
+        |  #[+a(gh("spacy-models") + "/releases") model releases]. This ensures
+        |  that the website is always up to date. However, some details, like
+        |  human-readable descriptions and the list of available models and
+        |  languages, is stored in the static CMS and used across the site.
+        |  This info only lives in one place, #[code models/_data.json].
+        |  Wherever possible, the model info is generated dynamically – for
+        |  example, in installation examples, quickstart widgets and even in the
+        |  total model and language count on the landing page.
+
+    p
+        |  The following data is stored and made available in the global scope:
+
+    +table(["Variable", "Description", "Example"])
+        +row
+            +cell #[code LANGUAGES]
+            +cell All languages supported by spaCy, code mapped to name.
+            +cell
+                +code(false, "json").o-no-block "en": "English"
+
+        +row
+            +cell #[code MODELS]
+            +cell Model names (without version). Language codes mapped to list of names.
+            +cell
+                +code(false, "json").o-no-block "xx": ["xx_ent_wiki_sm"]
+
+        +row
+            +cell #[code MODEL_META]
+            +cell Description for model name components and meta data, ID mapped to string.
+            +cell
+                +code(false, "json").o-no-block "vectors": "Word vectors"
+
+        +row
+            +cell #[code MODEL_LICENSES]
+            +cell License types mapped to license URL.
+            +cell
+                +code(false, "json").o-no-block "CC BY-SA 3.0": "http://..."
+
+        +row
+            +cell #[code MODEL_ACCURACY]
+            +cell Display labels for accuracy keys.
+            +cell
+                +code(false, "json").o-no-block "ents_f": "NER F"
+
+        +row
+            +cell #[code EXAMPLE_SENTENCES]
+            +cell Example sentences for different languages.
+            +cell
+                +code(false, "json").o-no-block "es": "Esto es una frase."
+
+    +h(3, "functions", "website/_includes/_functions.jade") Template functions
+
+    p
+        |  Jade allows you to implement any custom logic as inline JavaScript
+        |  expressions. Reusable functions are organised in a
+        |  #[code _functions.jade], which is included via the mixins file and
+        |  makes them accessible on each page. However, most functions deal
+        |  with internals only, e.g. prefixing class names in mixins or
+        |  converting paths and links.
+
+    +h(4, "gh") gh
+        +tag function
+
+    p
+        |  Since GitHub links can be long and tricky, this function takes care
+        |  generating them automatically for spaCy and all repositories owned
+        |  by the #[+a(gh())=SOCIAL.github] organisation.
+
+    +aside-code("Example", "jade").
+        +a(gh("spacy", "spacy/language.py")) This is a link
+
+    +table(["Name", "Type", "Description"])
+        +row
+            +cell #[code repo]
+            +cell String
+            +cell Name of the repository, e.g. #[code "spacy"].
+
+        +row
+            +cell #[code filepath]
+            +cell String
+            +cell Logical path to the file, relative to the repository root.
+
+        +row
+            +cell #[code branch]
+            +cell String
+            +cell Optional branch. Defaults to #[code "master"].
+
+        +row("foot")
+            +cell returns
+            +cell String
+            +cell The full GitHub link to the file.
diff --git a/website/docs/usage/adding-languages.jade b/website/usage/_adding-languages/_language-data.jade
similarity index 60%
rename from website/docs/usage/adding-languages.jade
rename to website/usage/_adding-languages/_language-data.jade
index a0b77ad17..dc86b7a03 100644
--- a/website/docs/usage/adding-languages.jade
+++ b/website/usage/_adding-languages/_language-data.jade
@@ -1,58 +1,4 @@
-//- 💫 DOCS > USAGE > ADDING LANGUAGES
-
-include ../../_includes/_mixins
-
-p
-        |  Adding full support for a language touches many different parts of the
-        |  spaCy library. This guide explains how to fit everything together, and
-        |  points you to the specific workflows for each component.
-
-+aside("Working on spaCy's source")
-    |  To add a new language to spaCy, you'll need to
-    |  #[strong modify the library's code]. The easiest way to do this is to
-    |  clone the #[+src(gh("spaCy")) repository] and #[strong build spaCy from source].
-    |  For more information on this, see the #[+a("/docs/usage") installation guide].
-    |  Unlike spaCy's core, which is mostly written in Cython, all language
-    |  data is stored in regular Python files. This means that you won't have to
-    |  rebuild anything in between – you can simply make edits and reload spaCy
-    |  to test them.
-
-+grid.o-no-block
-    +grid-col("half")
-        p
-            |  Obviously, there are lots of ways you can organise your code when
-            |  you implement your own language data. This guide will focus on
-            |  how it's done within spaCy. For full language support, you'll
-            |  need to create a #[code Language] subclass, define custom
-            |  #[strong language data], like a stop list and tokenizer
-            |  exceptions and test the new tokenizer. Once the language is set
-            |  up, you can #[strong build the vocabulary], including word
-            |  frequencies, Brown clusters and word vectors. Finally, you can
-            |  #[strong train the tagger and parser], and save the model to a
-            |  directory.
-
-        p
-            |  For some languages, you may also want to develop a solution for
-            |  lemmatization and morphological analysis.
-
-    +table-of-contents
-        +item #[+a("#101") Language data 101]
-        +item #[+a("#language-subclass") The Language subclass]
-        +item #[+a("#stop-words") Stop words]
-        +item #[+a("#tokenizer-exceptions") Tokenizer exceptions]
-        +item #[+a("#norm-exceptions") Norm exceptions]
-        +item #[+a("#lex-attrs") Lexical attributes]
-        +item #[+a("#syntax-iterators") Syntax iterators]
-        +item #[+a("#lemmatizer") Lemmatizer]
-        +item #[+a("#tag-map") Tag map]
-        +item #[+a("#morph-rules") Morph rules]
-        +item #[+a("#testing") Testing the tokenizer]
-        +item #[+a("#vocabulary") Building the vocabulary]
-        +item #[+a("#training") Training]
-
-+h(2, "101") Language data 101
-
-include _spacy-101/_language-data
+//- 💫 DOCS > USAGE > ADDING LANGUAGES > LANGUAGE DATA
 
 p
     |  The individual components #[strong expose variables] that can be imported
@@ -137,7 +83,7 @@ p
 
 +aside("Should I ever update the global data?")
     |  Reuseable language data is collected as atomic pieces in the root of the
-    |  #[+src(gh("spaCy", "lang")) spacy.lang] package. Often, when a new
+    |  #[+src(gh("spaCy", "lang")) #[code spacy.lang]] package. Often, when a new
     |  language is added, you'll find a pattern or symbol that's missing. Even
     |  if it isn't common in other languages, it might be best to add it to the
     |  shared language data, unless it has some conflicting interpretation. For
@@ -150,14 +96,14 @@ p
     |  needs to know the language's character set. If the language you're adding
     |  uses non-latin characters, you might need to add the required character
     |  classes to the global
-    |  #[+src(gh("spacy", "spacy/lang/char_classes.py")) char_classes.py].
+    |  #[+src(gh("spacy", "spacy/lang/char_classes.py")) #[code char_classes.py]].
     |  spaCy uses the #[+a("https://pypi.python.org/pypi/regex/") #[code regex] library]
     |  to keep this simple and readable. If the language requires very specific
     |  punctuation rules, you should consider overwriting the default regular
     |  expressions with your own in the language's #[code Defaults].
 
 
-+h(2, "language-subclass") Creating a #[code Language] subclass
++h(3, "language-subclass") Creating a #[code Language] subclass
 
 p
     |  Language-specific code and resources should be organised into a
@@ -205,7 +151,7 @@ p
 
 +infobox("Why lazy-loading?")
     |  Some languages contain large volumes of custom data, like lemmatizer
-    |  loopup tables, or complex regular expression that are expensive to
+    |  lookup tables, or complex regular expression that are expensive to
     |  compute. As of spaCy v2.0, #[code Language] classes are not imported on
     |  initialisation and are only loaded when you import them directly, or load
     |  a model that requires a language to be loaded. To lazy-load languages in
@@ -250,7 +196,7 @@ p
 +h(3, "tokenizer-exceptions") Tokenizer exceptions
 
 p
-    |  spaCy's #[+a("/docs/usage/customizing-tokenizer#how-tokenizer-works") tokenization algorithm]
+    |  spaCy's #[+a("/usage/linguistic-features#how-tokenizer-works") tokenization algorithm]
     |  lets you deal with whitespace-delimited chunks separately. This makes it
     |  easy to define special-case rules, without worrying about how they
     |  interact with the rest of the tokenizer. Whenever the key string is
@@ -284,7 +230,7 @@ p
     |  efficiently and make your data less verbose. How you do this ultimately
     |  depends on the language. Here's an example of how exceptions for time
     |  formats like "1a.m." and "1am" are generated in the English
-    |  #[+src(gh("spaCy", "spacy/en/lang/tokenizer_exceptions.py")) tokenizer_exceptions.py]:
+    |  #[+src(gh("spaCy", "spacy/en/lang/tokenizer_exceptions.py")) #[code tokenizer_exceptions.py]]:
 
 +code("tokenizer_exceptions.py (excerpt)").
     # use short, internal variable for readability
@@ -376,7 +322,7 @@ p
 p
     |  Norm exceptions can be provided as a simple dictionary. For more examples,
     |  see the English
-    |  #[+src(gh("spaCy", "spacy/lang/en/norm_exceptions.py")) norm_exceptions.py].
+    |  #[+src(gh("spaCy", "spacy/lang/en/norm_exceptions.py")) #[code norm_exceptions.py]].
 
 +code("Example").
     NORM_EXCEPTIONS = {
@@ -428,7 +374,7 @@ p
 
 p
     |  Here's an example from the English
-    |  #[+src(gh("spaCy", "spacy/en/lang/lex_attrs.py")) lex_attrs.py]:
+    |  #[+src(gh("spaCy", "spacy/en/lang/lex_attrs.py")) #[code lex_attrs.py]]:
 
 +code("lex_attrs.py").
     _num_words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
@@ -466,7 +412,7 @@ p
     |  Syntax iterators are functions that compute views of a #[code Doc]
     |  object based on its syntax. At the moment, this data is only used for
     |  extracting
-    |  #[+a("/docs/usage/dependency-parse#noun-chunks") noun chunks], which
+    |  #[+a("/usage/linguistic-features#noun-chunks") noun chunks], which
     |  are available as the #[+api("doc#noun_chunks") #[code Doc.noun_chunks]]
     |  property. Because base noun phrases work differently across languages,
     |  the rules to compute them are part of the individual language's data. If
@@ -479,13 +425,14 @@ p
     assert chunks[0].text == "A phrase"
     assert chunks[1].text == "another phrase"
 
-+table(["Language", "Source"])
-    for lang, lang_id in {en: "English", de: "German", es: "Spanish"}
++table(["Language", "Code", "Source"])
+    for lang in ["en", "de", "fr", "es"]
         +row
-            +cell=lang
+            +cell=LANGUAGES[lang]
+            +cell #[code=lang]
             +cell
-                +src(gh("spaCy", "spacy/lang/" + lang_id + "/syntax_iterators.py"))
-                    |  lang/#{lang_id}/syntax_iterators.py
+                +src(gh("spaCy", "spacy/lang/" + lang + "/syntax_iterators.py"))
+                    code lang/#{lang}/syntax_iterators.py
 
 +h(3, "lemmatizer") Lemmatizer
 
@@ -509,24 +456,11 @@ p
     }
 
 p
-    |  To add a lookup lemmatizer to your language, import the #[code LOOKUP]
-    |  table and #[code Lemmatizer], and create a new classmethod:
+    |  To provide a lookup lemmatizer for your language, import the lookup table
+    |  and add it to the #[code Language] class as #[code lemma_lookup]:
 
-
-+code("__init__py (excerpt)").
-    # other imports here, plus lookup table and lookup lemmatizer
-    from .lemmatizer import LOOKUP
-    from ...lemmatizerlookup import Lemmatizer
-
-    class Xxxxx(Language):
-        lang = 'xx'
-
-        class Defaults(Language.Defaults):
-            # other language defaults here
-
-            @classmethod
-            def create_lemmatizer(cls, nlp=None):
-                return Lemmatizer(LOOKUP)
++code.
+    lemma_lookup = dict(LOOKUP)
 
 +h(3, "tag-map") Tag map
 
@@ -547,7 +481,7 @@ p
     |  #[+a("http://universaldependencies.org/u/pos/all.html") Universal Dependencies]
     |  tags. Optionally, you can also include morphological features or other
     |  token attributes in the tag map as well. This allows you to do simple
-    |  #[+a("/docs/usage/pos-tagging#rule-based-morphology") rule-based morphological analysis].
+    |  #[+a("/usage/linguistic-features#rule-based-morphology") rule-based morphological analysis].
 
 +code("Example").
     from ..symbols import POS, NOUN, VERB, DET
@@ -560,233 +494,62 @@ p
 
 +h(3, "morph-rules") Morph rules
 
-+under-construction
+p
+    |  The morphology rules let you set token attributes such as lemmas, keyed
+    |  by the extended part-of-speech tag and token text. The morphological
+    |  features and their possible values are language-specific and based on the
+    |  #[+a("http://universaldependencies.org") Universal Dependencies scheme].
 
-+h(2, "testing") Testing the new language tokenizer
+
++code("Example").
+    from ..symbols import LEMMA
+
+    MORPH_RULES = {
+        "VBZ": {
+            "am": {LEMMA: "be", "VerbForm": "Fin", "Person": "One", "Tense": "Pres", "Mood": "Ind"},
+            "are": {LEMMA: "be", "VerbForm": "Fin", "Person": "Two", "Tense": "Pres", "Mood": "Ind"},
+            "is": {LEMMA: "be", "VerbForm": "Fin", "Person": "Three", "Tense": "Pres", "Mood": "Ind"},
+            "'re": {LEMMA: "be", "VerbForm": "Fin", "Person": "Two", "Tense": "Pres", "Mood": "Ind"},
+            "'s": {LEMMA: "be", "VerbForm": "Fin", "Person": "Three", "Tense": "Pres", "Mood": "Ind"}
+        }
+    }
 
 p
-    |  Before using the new language or submitting a
-    |  #[+a(gh("spaCy") + "/pulls") pull request] to spaCy, you should make sure
-    |  it works as expected. This is especially important if you've added custom
-    |  regular expressions for token matching or punctuation – you don't want to
-    |  be causing regressions.
+    |  In the example of #[code "am"], the attributes look like this:
 
-+aside("spaCy's test suite")
-    |  spaCy uses the #[+a("https://docs.pytest.org/en/latest/") pytest framework]
-    |  for testing. For more details on how the tests are structured and best
-    |  practices for writing your own tests, see our
-    |  #[+a(gh("spaCy", "spacy/tests")) tests documentation].
++table(["Attribute", "Description"])
+    +row
+        +cell #[code LEMMA: "be"]
+        +cell Base form, e.g. "to be".
 
-+h(3, "testing-tokenizer") Testing the basic tokenizer
+    +row
+        +cell #[code "VerbForm": "Fin"]
+        +cell
+            |  Finite verb. Finite verbs have a subject and can be the root of
+            |  an independent clause – "I am." is a valid, complete
+            |  sentence.
 
-p
-    |  The easiest way to test your new tokenizer is to run the
-    |  language-independent "tokenizer sanity" tests located in
-    |  #[+src(gh("spaCy", "spacy/tests/tokenizer")) tests/tokenizer]. This will
-    |  test for basic behaviours like punctuation splitting, URL matching and
-    |  correct handling of whitespace. In the
-    |  #[+src(gh("spaCy", "spacy/tests/conftest.py")) conftest.py], add the new
-    |  language ID to the list of #[code _languages]:
+    +row
+        +cell #[code "Person": "One"]
+        +cell First person, i.e. "#[strong I] am".
 
-+code.
-    _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'it', 'nb',
-                  'nl', 'pl', 'pt', 'sv', 'xx'] # new language here
+    +row
+        +cell #[code "Tense": "Pres"]
+        +cell
+            |  Present tense, i.e. actions that are happening right now or
+            |  actions that usually happen.
 
-+aside-code("Global tokenizer test example").
-    # use fixture by adding it as an argument
-    def test_with_all_languages(tokenizer):
-        # will be performed on ALL language tokenizers
-        tokens = tokenizer(u'Some text here.')
+    +row
+        +cell #[code "Mood": "Ind"]
+        +cell
+            |  Indicative, i.e. something happens, has happened or will happen
+            |  (as opposed to imperative or conditional).
 
-p
-    |  The language will now be included in the #[code tokenizer] test fixture,
-    |  which is used by the basic tokenizer tests. If you want to add your own
-    |  tests that should be run over all languages, you can use this fixture as
-    |  an argument of your test function.
 
-+h(3, "testing-custom") Writing language-specific tests
-
-p
-    |  It's recommended to always add at least some tests with examples specific
-    |  to the language. Language tests should be located in
-    |  #[+src(gh("spaCy", "spacy/tests/lang")) tests/lang] in a directory named
-    |  after the language ID. You'll also need to create a fixture for your
-    |  tokenizer in the #[+src(gh("spaCy", "spacy/tests/conftest.py")) conftest.py].
-    |  Always use the #[code get_lang_class()] helper function within the fixture,
-    |  instead of importing the class at the top of the file. This will load the
-    |  language data only when it's needed. (Otherwise, #[em all data] would be
-    |  loaded every time you run a test.)
-
-+code.
-    @pytest.fixture
-    def en_tokenizer():
-        return util.get_lang_class('en').Defaults.create_tokenizer()
-
-p
-    |  When adding test cases, always
-    |  #[+a(gh("spaCy", "spacy/tests#parameters")) #[code parametrize]] them –
-    |  this will make it easier for others to add more test cases without having
-    |  to modify the test itself. You can also add parameter tuples, for example,
-    |  a test sentence and its expected length, or a list of expected tokens.
-    |  Here's an example of an English tokenizer test for combinations of
-    |  punctuation and abbreviations:
-
-+code("Example test").
-    @pytest.mark.parametrize('text,length', [
-        ("The U.S. Army likes Shock and Awe.", 8),
-        ("U.N. regulations are not a part of their concern.", 10),
-        ("“Isn't it?”", 6)])
-    def test_en_tokenizer_handles_punct_abbrev(en_tokenizer, text, length):
-        tokens = en_tokenizer(text)
-        assert len(tokens) == length
-
-+h(2, "vocabulary") Building the vocabulary
-
-+under-construction
-
-p
-    |  spaCy expects that common words will be cached in a
-    |  #[+api("vocab") #[code Vocab]] instance. The vocabulary caches lexical
-    |  features, and makes it easy to use information from unlabelled text
-    |  samples in your models. Specifically, you'll usually want to collect
-    |  word frequencies, and train two types of distributional similarity model:
-    |  Brown clusters, and word vectors. The Brown clusters are used as features
-    |  by linear models, while the word vectors are useful for lexical
-    |  similarity models and deep learning.
-
-+h(3, "word-frequencies") Word frequencies
-
-p
-    |  To generate the word frequencies from a large, raw corpus, you can use the
-    |  #[+src(gh("spacy-dev-resources", "training/word_freqs.py")) word_freqs.py]
-    |  script from the spaCy developer resources. Note that your corpus should
-    |  not be preprocessed (i.e. you need punctuation for example). The
-    |  #[+api("cli#model") #[code model]] command expects a tab-separated word
-    |  frequencies file with three columns:
-
-+list("numbers")
-    +item The number of times the word occurred in your language sample.
-    +item The number of distinct documents the word occurred in.
-    +item The word itself.
-
-p
-    |  An example word frequencies file could look like this:
-
-+code("es_word_freqs.txt", "text").
-    6361109	111	Aunque
-    23598543	111	aunque
-    10097056	111	claro
-    193454	111	aro
-    7711123	111	viene
-    12812323	111	mal
-    23414636	111	momento
-    2014580	111	felicidad
-    233865	111	repleto
-    15527	111	eto
-    235565	111	deliciosos
-    17259079	111	buena
-    71155	111	Anímate
-    37705	111	anímate
-    33155	111	cuéntanos
-    2389171	111	cuál
-    961576	111	típico
-
-p
-    |  You should make sure you use the spaCy tokenizer for your
-    |  language to segment the text for your word frequencies. This will ensure
-    |  that the frequencies refer to the same segmentation standards you'll be
-    |  using at run-time. For instance, spaCy's English tokenizer segments
-    |  "can't" into two tokens. If we segmented the text by whitespace to
-    |  produce the frequency counts, we'll have incorrect frequency counts for
-    |  the tokens "ca" and "n't".
-
-+h(3, "brown-clusters") Training the Brown clusters
-
-p
-    |  spaCy's tagger, parser and entity recognizer are designed to use
-    |  distributional similarity features provided by the
-    |  #[+a("https://github.com/percyliang/brown-cluster") Brown clustering algorithm].
-    |  You should train a model with between 500 and 1000 clusters. A minimum
-    |  frequency threshold of 10 usually works well.
-
-p
-    |  An example clusters file could look like this:
-
-+code("es_clusters.data", "text").
-    0000	Vestigial	1
-    0000	Vesturland	1
-    0000	Veyreau	1
-    0000	Veynes	1
-    0000	Vexilografía	1
-    0000	Vetrigne	1
-    0000	Vetónica	1
-    0000	Asunden	1
-    0000	Villalambrús	1
-    0000	Vichuquén	1
-    0000	Vichtis	1
-    0000	Vichigasta	1
-    0000	VAAH	1
-    0000	Viciebsk	1
-    0000	Vicovaro	1
-    0000	Villardeveyo	1
-    0000	Vidala	1
-    0000	Videoguard	1
-    0000	Vedás	1
-    0000	Videocomunicado	1
-    0000	VideoCrypt	1
-
-+h(3, "word-vectors") Training the word vectors
-
-+under-construction
-
-p
-    |  #[+a("https://en.wikipedia.org/wiki/Word2vec") Word2vec] and related
-    |  algorithms let you train useful word similarity models from unlabelled
-    |  text. This is a key part of using
-    |  #[+a("/docs/usage/deep-learning") deep learning] for NLP with limited
-    |  labelled data. The vectors are also useful by themselves – they power
-    |  the #[code .similarity()] methods in spaCy. For best results, you should
-    |  pre-process the text with spaCy before training the Word2vec model. This
-    |  ensures your tokenization will match.
-
-p
-    | You can use our
-    |  #[+src(gh("spacy-dev-resources", "training/word_vectors.py")) word vectors training script],
-    |  which pre-processes the text with your language-specific tokenizer and
-    |  trains the model using #[+a("https://radimrehurek.com/gensim/") Gensim].
-    |  The #[code vectors.bin] file should consist of one word and vector per line.
-
-//-+aside-code("your_data_directory", "yaml").
-    ├── vocab/
-    |   ├── lexemes.bin
-    |   ├── strings.json
-    |   └── oov_prob
-    ├── pos/
-    |   ├── model
-    |   └── config.json
-    ├── deps/
-    |   ├── model
-    |   └── config.json
-    └── ner/
-        ├── model
-        └── config.json
-
-+h(2, "train-tagger-parser") Training the tagger and parser
-
-+under-construction
-
-p
-    |  You can now train the model using a corpus for your language annotated
-    |  with #[+a("http://universaldependencies.org/") Universal Dependencies].
-    |  If your corpus uses the
-    |  #[+a("http://universaldependencies.org/docs/format.html") CoNLL-U] format,
-    |  i.e. files with the extension #[code .conllu], you can use the
-    |  #[+api("cli#convert") #[code convert]] command to convert it to spaCy's
-    |  #[+a("/docs/api/annotation#json-input") JSON format] for training.
-
-p
-    |  Once you have your UD corpus transformed into JSON, you can train your
-    |  model use the using spaCy's #[+api("cli#train") #[code train]] command:
-
-+code(false, "bash").
-    python -m spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--no-tagger] [--no-parser] [--no-entities]
++infobox("Important note", "⚠️")
+    |  The morphological attributes are currently #[strong not all used by spaCy].
+    |  Full integration is still being developed. In the meantime, it can still
+    |  be useful to add them, especially if the language you're adding includes
+    |  important distinctions and special cases. This ensures that as soon as
+    |  full support is introduced, your language will be able to assign all
+    |  possible attributes.
diff --git a/website/usage/_adding-languages/_testing.jade b/website/usage/_adding-languages/_testing.jade
new file mode 100644
index 000000000..825d8db6f
--- /dev/null
+++ b/website/usage/_adding-languages/_testing.jade
@@ -0,0 +1,76 @@
+//- 💫 DOCS > USAGE > ADDING LANGUAGES > TESTING
+
+p
+    |  Before using the new language or submitting a
+    |  #[+a(gh("spaCy") + "/pulls") pull request] to spaCy, you should make sure
+    |  it works as expected. This is especially important if you've added custom
+    |  regular expressions for token matching or punctuation – you don't want to
+    |  be causing regressions.
+
++infobox("spaCy's test suite")
+    |  spaCy uses the #[+a("https://docs.pytest.org/en/latest/") pytest framework]
+    |  for testing. For more details on how the tests are structured and best
+    |  practices for writing your own tests, see our
+    |  #[+a(gh("spaCy", "spacy/tests")) tests documentation].
+
+p
+    |  The easiest way to test your new tokenizer is to run the
+    |  language-independent "tokenizer sanity" tests located in
+    |  #[+src(gh("spaCy", "spacy/tests/tokenizer")) #[code tests/tokenizer]].
+    |  This will test for basic behaviours like punctuation splitting, URL
+    |  matching and correct handling of whitespace. In the
+    |  #[+src(gh("spaCy", "spacy/tests/conftest.py")) #[code conftest.py]], add
+    |  the new language ID to the list of #[code _languages]:
+
++code.
+    _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'it', 'nb',
+                  'nl', 'pl', 'pt', 'sv', 'xx'] # new language here
+
++aside-code("Global tokenizer test example").
+    # use fixture by adding it as an argument
+    def test_with_all_languages(tokenizer):
+        # will be performed on ALL language tokenizers
+        tokens = tokenizer(u'Some text here.')
+
+p
+    |  The language will now be included in the #[code tokenizer] test fixture,
+    |  which is used by the basic tokenizer tests. If you want to add your own
+    |  tests that should be run over all languages, you can use this fixture as
+    |  an argument of your test function.
+
++h(3, "testing-custom") Writing language-specific tests
+
+p
+    |  It's recommended to always add at least some tests with examples specific
+    |  to the language. Language tests should be located in
+    |  #[+src(gh("spaCy", "spacy/tests/lang")) #[code tests/lang]] in a
+    |  directory named after the language ID. You'll also need to create a
+    |  fixture for your tokenizer in the
+    |  #[+src(gh("spaCy", "spacy/tests/conftest.py")) #[code conftest.py]].
+    |  Always use the #[+api("util#get_lang_class") #[code get_lang_class()]]
+    |  helper function within the fixture, instead of importing the class at the
+    |  top of the file. This will load the language data only when it's needed.
+    |  (Otherwise, #[em all data] would be loaded every time you run a test.)
+
++code.
+    @pytest.fixture
+    def en_tokenizer():
+        return util.get_lang_class('en').Defaults.create_tokenizer()
+
+p
+    |  When adding test cases, always
+    |  #[+a(gh("spaCy", "spacy/tests#parameters")) #[code parametrize]] them –
+    |  this will make it easier for others to add more test cases without having
+    |  to modify the test itself. You can also add parameter tuples, for example,
+    |  a test sentence and its expected length, or a list of expected tokens.
+    |  Here's an example of an English tokenizer test for combinations of
+    |  punctuation and abbreviations:
+
++code("Example test").
+    @pytest.mark.parametrize('text,length', [
+        ("The U.S. Army likes Shock and Awe.", 8),
+        ("U.N. regulations are not a part of their concern.", 10),
+        ("“Isn't it?”", 6)])
+    def test_en_tokenizer_handles_punct_abbrev(en_tokenizer, text, length):
+        tokens = en_tokenizer(text)
+        assert len(tokens) == length
diff --git a/website/usage/_adding-languages/_training.jade b/website/usage/_adding-languages/_training.jade
new file mode 100644
index 000000000..054f2a460
--- /dev/null
+++ b/website/usage/_adding-languages/_training.jade
@@ -0,0 +1,93 @@
+//- 💫 DOCS > USAGE > ADDING LANGUAGES > TRAINING
+
+p
+    |  spaCy expects that common words will be cached in a
+    |  #[+api("vocab") #[code Vocab]] instance. The vocabulary caches lexical
+    |  features, and makes it easy to use information from unlabelled text
+    |  samples in your models. Specifically, you'll usually want to collect
+    |  word frequencies, and train word vectors. To generate the word frequencies
+    |  from a large, raw corpus, you can use the
+    |  #[+src(gh("spacy-dev-resources", "training/word_freqs.py")) #[code word_freqs.py]]
+    |  script from the spaCy developer resources.
+
++github("spacy-dev-resources", "training/word_freqs.py")
+
+p
+    |  Note that your corpus should not be preprocessed (i.e. you need
+    |  punctuation for example). The word frequencies should be generated as a
+    |  tab-separated file with three columns:
+
++list("numbers")
+    +item The number of times the word occurred in your language sample.
+    +item The number of distinct documents the word occurred in.
+    +item The word itself.
+
++code("es_word_freqs.txt", "text").
+    6361109	111	Aunque
+    23598543	111	aunque
+    10097056	111	claro
+    193454	111	aro
+    7711123	111	viene
+    12812323	111	mal
+    23414636	111	momento
+    2014580	111	felicidad
+    233865	111	repleto
+    15527	111	eto
+    235565	111	deliciosos
+    17259079	111	buena
+    71155	111	Anímate
+    37705	111	anímate
+    33155	111	cuéntanos
+    2389171	111	cuál
+    961576	111	típico
+
++aside("Brown Clusters")
+    |  Additionally, you can use distributional similarity features provided by the
+    |  #[+a("https://github.com/percyliang/brown-cluster") Brown clustering algorithm].
+    |  You should train a model with between 500 and 1000 clusters. A minimum
+    |  frequency threshold of 10 usually works well.
+
+p
+    |  You should make sure you use the spaCy tokenizer for your
+    |  language to segment the text for your word frequencies. This will ensure
+    |  that the frequencies refer to the same segmentation standards you'll be
+    |  using at run-time. For instance, spaCy's English tokenizer segments
+    |  "can't" into two tokens. If we segmented the text by whitespace to
+    |  produce the frequency counts, we'll have incorrect frequency counts for
+    |  the tokens "ca" and "n't".
+
++h(4, "word-vectors") Training the word vectors
+
+p
+    |  #[+a("https://en.wikipedia.org/wiki/Word2vec") Word2vec] and related
+    |  algorithms let you train useful word similarity models from unlabelled
+    |  text. This is a key part of using
+    |  #[+a("/usage/deep-learning") deep learning] for NLP with limited
+    |  labelled data. The vectors are also useful by themselves – they power
+    |  the #[code .similarity()] methods in spaCy. For best results, you should
+    |  pre-process the text with spaCy before training the Word2vec model. This
+    |  ensures your tokenization will match. You can use our
+    |  #[+src(gh("spacy-dev-resources", "training/word_vectors.py")) word vectors training script],
+    |  which pre-processes the text with your language-specific tokenizer and
+    |  trains the model using #[+a("https://radimrehurek.com/gensim/") Gensim].
+    |  The #[code vectors.bin] file should consist of one word and vector per line.
+
++github("spacy-dev-resources", "training/word_vectors.py")
+
++h(3, "train-tagger-parser") Training the tagger and parser
+
+p
+    |  You can now train the model using a corpus for your language annotated
+    |  with #[+a("http://universaldependencies.org/") Universal Dependencies].
+    |  If your corpus uses the
+    |  #[+a("http://universaldependencies.org/docs/format.html") CoNLL-U] format,
+    |  i.e. files with the extension #[code .conllu], you can use the
+    |  #[+api("cli#convert") #[code convert]] command to convert it to spaCy's
+    |  #[+a("/api/annotation#json-input") JSON format] for training.
+    |  Once you have your UD corpus transformed into JSON, you can train your
+    |  model use the using spaCy's #[+api("cli#train") #[code train]] command.
+
++infobox
+    |  For more details and examples of how to
+    |  #[strong train the tagger and dependency parser], see the
+    |  #[+a("/usage/training#tagger-parser") usage guide on training].
diff --git a/website/usage/_data.json b/website/usage/_data.json
new file mode 100644
index 000000000..cc9918631
--- /dev/null
+++ b/website/usage/_data.json
@@ -0,0 +1,205 @@
+{
+    "sidebar": {
+        "Get started": {
+            "Installation": "./",
+            "Models & Languages": "models",
+            "Facts & Figures": "facts-figures",
+            "spaCy 101": "spacy-101",
+            "New in v2.0": "v2"
+        },
+        "Guides": {
+            "Linguistic Features": "linguistic-features",
+            "Processing Pipelines": "processing-pipelines",
+            "Vectors & Similarity": "vectors-similarity",
+            "Text Classification": "text-classification",
+            "Deep Learning": "deep-learning",
+            "Training Models": "training",
+            "Adding Languages": "adding-languages",
+            "Visualizers": "visualizers"
+        },
+        "In-depth": {
+            "Code Examples": "examples",
+            "Resources": "resources"
+        }
+    },
+
+    "index": {
+        "title": "Install spaCy",
+        "next": "models",
+        "quickstart": true,
+        "changelog": true,
+        "menu": {
+            "Quickstart": "quickstart",
+            "Instructions": "instructions",
+            "Troubleshooting": "troubleshooting",
+            "Changelog": "changelog"
+        }
+    },
+
+    "models": {
+        "title": "Models & Languages",
+        "next": "facts-figures",
+        "quickstart": true,
+        "menu": {
+            "Quickstart": "quickstart",
+            "Available Models": "available",
+            "Installation & Usage": "install",
+            "Language Support": "languages",
+            "Production Use": "production"
+        }
+    },
+
+    "facts-figures": {
+        "title": "Facts & Figures",
+        "teaser": "The hard numbers for spaCy and how it compares to other libraries and tools.",
+        "next": "spacy-101",
+        "menu": {
+            "Feature comparison": "comparison",
+            "Benchmarks": "benchmarks",
+            "Powered by spaCy": "powered-by",
+            "Other Libraries": "other-libraries"
+        }
+    },
+
+    "spacy-101": {
+        "title": "spaCy 101: Everything you need to know",
+        "teaser": "The most important concepts, explained in simple terms.",
+        "next": "index",
+        "quickstart": true,
+        "preview": "101",
+        "menu": {
+            "Features": "features",
+            "Lightning tour": "lightning-tour",
+            "Architecture": "architecture",
+            "Community & FAQ": "community-faq"
+        }
+    },
+
+    "v2": {
+        "title": "What's New in v2.0",
+        "teaser": "New features, backwards incompatibilities and migration guide.",
+        "menu": {
+            "New features": "features",
+            "Backwards Incompatibilities": "incompat",
+            "Migrating from v1.x": "migrating",
+            "Benchmarks": "benchmarks"
+        }
+    },
+
+    "linguistic-features": {
+        "title": "Linguistic Features",
+        "teaser": "Using spaCy to extract linguistic features like part-of-speech tags, dependency labels and named entities, customising the tokenizer and working with the rule-based matcher.",
+        "next": "processing-pipelines",
+        "menu": {
+            "POS Tagging": "pos-tagging",
+            "Dependency Parse": "dependency-parse",
+            "Named Entities": "named-entities",
+            "Tokenization": "tokenization",
+            "Rule-based Matching": "rule-based-matching"
+        }
+    },
+
+    "processing-pipelines": {
+        "title": "Language Processing Pipelines",
+        "next": "vectors-similarity",
+        "menu": {
+            "How Pipelines Work": "pipelines",
+            "Custom Components": "custom-components",
+            "Developing Extensions": "extensions",
+            "Multi-threading": "multithreading",
+            "Serialization": "serialization"
+        }
+    },
+
+    "vectors-similarity": {
+        "title": "Word Vectors and Semantic Similarity",
+        "next": "text-classification",
+        "menu": {
+            "Basics": "basics",
+            "Similarity in Context": "in-context",
+            "Custom Vectors": "custom",
+            "GPU Usage": "gpu"
+        }
+    },
+
+    "deep-learning": {
+        "title": "Deep Learning",
+        "teaser": "Using spaCy to pre-process text for deep learning, and how to plug in your own machine learning models.",
+        "next": "training",
+        "menu": {
+            "Pre-processing Text": "pre-processing",
+            "spaCy and Thinc": "thinc",
+            "TensorFlow / Keras": "tensorflow-keras",
+            "scikit-learn": "scikit-learn",
+            "PyTorch": "pytorch",
+            "DyNet": "dynet"
+        }
+    },
+
+    "text-classification": {
+        "title": "Text Classification",
+        "next": "training"
+    },
+
+    "training": {
+        "title": "Training spaCy's Statistical Models",
+        "next": "adding-languages",
+        "menu": {
+            "Basics": "basics",
+            "NER": "ner",
+            "Tagger & Parser": "tagger-parser",
+            "Similarity": "similarity",
+            "Text Classification": "textcat",
+            "Saving & Loading": "saving-loading"
+        }
+    },
+
+    "adding-languages": {
+        "title": "Adding Languages",
+        "teaser": "Adding full support for a language touches many different parts of the spaCy library. This guide explains how to fit everything together, and points you to the specific workflows for each component.",
+        "next": "training",
+        "menu": {
+            "Language data": "language-data",
+            "Testing": "testing",
+            "Training": "training"
+        }
+    },
+
+    "visualizers": {
+        "title": "Visualizers",
+        "tag_new": 2,
+        "teaser": "Visualize dependencies and entities in your browser and notebook, or export HTML.",
+        "next": "resources",
+        "menu": {
+            "Dependencies": "dep",
+            "Entities": "ent",
+            "Jupyter Notebooks": "jupyter",
+            "Rendering HTML": "html"
+        }
+    },
+
+    "resources": {
+        "title": "Resources",
+        "teaser": "Libraries, demos, books, courses and research systems featuring spaCy.",
+        "menu": {
+            "Third-party libraries": "libraries",
+            "Extensions": "extensions",
+            "Demos & Visualizations": "demos",
+            "Books & Courses": "books",
+            "Jupyter Notebooks": "notebooks",
+            "Research": "research"
+        }
+    },
+
+    "examples": {
+        "title": "Code Examples",
+        "teaser": "Full code examples you can modify and run.",
+        "next": "resources",
+        "menu": {
+            "Pipeline": "pipeline",
+            "Matching": "matching",
+            "Training": "training",
+            "Deep Learning": "deep-learning"
+        }
+    }
+}
diff --git a/website/usage/_deep-learning/_dynet.jade b/website/usage/_deep-learning/_dynet.jade
new file mode 100644
index 000000000..81aa4e066
--- /dev/null
+++ b/website/usage/_deep-learning/_dynet.jade
@@ -0,0 +1,11 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING > DYNET
+
++infobox
+    +infobox-logos(["dynet", 80, 34, "http://dynet.readthedocs.io/"])
+    |  #[strong DyNet] is a dynamic neural network library, which can be much
+    |  easier to work with for NLP. Outside of Google, there's a general shift
+    |  among NLP researchers to both DyNet and Pytorch. You can use DyNet to
+    |  create spaCy pipeline components, to add annotations to the #[code Doc]
+    |  object.
+
++under-construction
diff --git a/website/usage/_deep-learning/_pre-processing.jade b/website/usage/_deep-learning/_pre-processing.jade
new file mode 100644
index 000000000..ca87cee7b
--- /dev/null
+++ b/website/usage/_deep-learning/_pre-processing.jade
@@ -0,0 +1,3 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING > PRE-PROCESSING
+
++under-construction
diff --git a/website/usage/_deep-learning/_pytorch.jade b/website/usage/_deep-learning/_pytorch.jade
new file mode 100644
index 000000000..cf0f692f9
--- /dev/null
+++ b/website/usage/_deep-learning/_pytorch.jade
@@ -0,0 +1,91 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING > PYTORCH
+
++infobox
+    +infobox-logos(["pytorch", 100, 48, "http://pytorch.org"])
+    |  #[strong PyTorch] is a dynamic neural network library, which can be much
+    |  easier to work with for NLP. Outside of Google, there's a general shift
+    |  among NLP researchers to both Pytorch and DyNet. spaCy is the front-end
+    |  of choice for PyTorch's #[code torch.text] extension. You can use PyTorch
+    |  to create spaCy pipeline components, to add annotations to the
+    |  #[code Doc] object.
+
++under-construction
+
+p
+    |  Here's how a #[code begin_update] function that wraps an arbitrary
+    |  PyTorch model would look:
+
++code.
+    class PytorchWrapper(thinc.neural.Model):
+        def __init__(self, pytorch_model):
+            self.pytorch_model = pytorch_model
+
+        def begin_update(self, x_data, drop=0.):
+            x_var = Variable(x_data)
+            # Make prediction
+            y_var = pytorch_model.forward(x_var)
+            def backward(dy_data, sgd=None):
+                dy_var = Variable(dy_data)
+                dx_var = torch.autograd.backward(x_var, dy_var)
+                return dx_var
+            return y_var.data, backward
+
+p
+    |  PyTorch requires data to be wrapped in a container, #[code Variable],
+    |  that tracks the operations performed on the data. This "tape" of
+    |  operations is then used by #[code torch.autograd.backward] to compute the
+    |  gradient with respect to the input. For example, the following code
+    |  constructs a PyTorch Linear layer that takes a vector of shape
+    |  #[code (length, 2)], multiples it by a #[code (2, 2)] matrix of weights,
+    |  adds a #[code (2,)] bias, and returns the resulting #[code (length, 2)]
+    |  vector:
+
++code("PyTorch Linear").
+    from torch import autograd
+    from torch import nn
+    import torch
+    import numpy
+
+    pt_model = nn.Linear(2, 2)
+    length = 5
+
+    input_data = numpy.ones((5, 2), dtype='f')
+    input_var = autograd.Variable(torch.Tensor(input_data))
+
+    output_var = pt_model(input_var)
+    output_data = output_var.data.numpy()
+
+p
+    |  Given target values we would like the output data to approximate, we can
+    |  then "learn" values of the parameters within #[code pt_model], to give us
+    |  output that's closer to our target. As a trivial example, let's make the
+    |  linear layer compute the negative inverse of the input:
+
++code.
+    def get_target(input_data):
+        return -(1 / input_data)
+
+p
+    |  To update the PyTorch model, we create an optimizer and give it
+    |  references to the model's parameters. We'll then randomly generate input
+    |  data and get the target result we'd like the function to produce. We then
+    |  compute the #[strong gradient of the error] between the current output
+    |  and the target. Using the most popular definition of "error", this is
+    |  simply the average difference:
+
++code.
+    from torch import optim
+
+    optimizer = optim.SGD(pt_model.parameters(), lr = 0.01)
+    for i in range(10):
+        input_data = numpy.random.uniform(-1., 1., (length, 2))
+        target = -(1 / input_data)
+
+        output_var = pt_model(autograd.Variable(torch.Tensor(input_data)))
+        output_data = output_var.data.numpy()
+
+        d_output_data = (output_data - target) / length
+        d_output_var = autograd.Variable(torch.Tensor(d_output_data))
+
+        d_input_var = torch.autograg.backward(output_var, d_output_var)
+        optimizer.step()
diff --git a/website/usage/_deep-learning/_scikit-learn.jade b/website/usage/_deep-learning/_scikit-learn.jade
new file mode 100644
index 000000000..3d0f30397
--- /dev/null
+++ b/website/usage/_deep-learning/_scikit-learn.jade
@@ -0,0 +1,15 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING > SCIKIT-LEARN
+
++infobox
+    +infobox-logos(["scikitlearn", 70, 34, "http://scikit-learn.org"])
+    |  #[strong scikit-learn] features a number of useful NLP functions,
+    |  especially for solving text classification problems using linear models
+    |  with bag-of-words features. If you know you need exactly that, it might
+    |  be better to use scikit-learn's built-in pipeline directly. However, if
+    |  you want to extract more detailed features, using part-of-speech tags,
+    |  named entity labels, or string transformations, you can use spaCy as a
+    |  pre-process in your classification system. scikit-learn also provides a
+    |  lot of experiment management and evaluation utilities that people use
+    |  alongside spaCy.
+
++under-construction
diff --git a/website/usage/_deep-learning/_tensorflow-keras.jade b/website/usage/_deep-learning/_tensorflow-keras.jade
new file mode 100644
index 000000000..3efb2e2a6
--- /dev/null
+++ b/website/usage/_deep-learning/_tensorflow-keras.jade
@@ -0,0 +1,11 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING > TENSORFLOW / KERAS
+
++infobox
+    +infobox-logos(["tensorflow", 35, 42, "https://www.tensorflow.org"], ["keras", 45, 45, "https://www.keras.io"])
+    |  #[strong Tensorflow / Keras] is the most popular deep learning library.
+    |  spaCy provides efficient and powerful feature extraction functionality,
+    |  that can be used as a pre-process to any deep learning library. You can
+    |  also use Tensorflow and Keras to create spaCy pipeline components, to add
+    |  annotations to the #[code Doc] object.
+
++under-construction
diff --git a/website/usage/_deep-learning/_thinc.jade b/website/usage/_deep-learning/_thinc.jade
new file mode 100644
index 000000000..6c354f708
--- /dev/null
+++ b/website/usage/_deep-learning/_thinc.jade
@@ -0,0 +1,66 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING > THINC
+
+p
+    |  #[+a(gh("thinc")) Thinc] is the machine learning library powering spaCy.
+    |  It's a practical toolkit for implementing models that follow the
+    |  #[+a("https://explosion.ai/blog/deep-learning-formula-nlp", true) "Embed, encode, attend, predict"]
+    |  architecture. It's designed to be easy to install, efficient for CPU
+    |  usage and optimised for NLP and deep learning with text – in particular,
+    |  hierarchically structured input and variable-length sequences.
+
+p
+    |  spaCy's built-in pipeline components can all be powered by any object
+    |  that follows Thinc's #[code Model] API. If a wrapper is not yet available
+    |  for the library you're using, you should create a
+    |  #[code thinc.neural.Model] subclass that implements a #[code begin_update]
+    |  method. You'll also want to implement #[code to_bytes], #[code from_bytes],
+    |  #[code to_disk] and #[code from_disk] methods, to save and load your
+    |  model. Here's the tempate you'll need to fill in:
+
+    +code("Thinc Model API").
+        class ThincModel(thinc.neural.Model):
+            def __init__(self, *args, **kwargs):
+                pass
+
+            def begin_update(self, X, drop=0.):
+                def backprop(dY, sgd=None):
+                    return dX
+                return Y, backprop
+
+            def to_disk(self, path, **exclude):
+                return None
+
+            def from_disk(self, path, **exclude):
+                return self
+
+            def to_bytes(self, **exclude):
+                return bytes
+
+            def from_bytes(self, msgpacked_bytes, **exclude):
+                return self
+
+p
+    |  The #[code begin_update] method should return a callback, that takes the
+    |  gradient with respect to the output, and returns the gradient with
+    |  respect to the input.  It's usually convenient to implement the callback
+    |  as a nested function, so you can refer to any intermediate variables from
+    |  the forward computation in the enclosing scope.
+
++h(3, "how-thinc-works") How Thinc works
+
+p
+    |  Neural networks are all about composing small functions that we know how
+    |  to differentiate into larger functions that we know how to differentiate.
+    |  To differentiate a function efficiently, you usually need to store
+    |  intermediate results, computed during the "forward pass", to reuse them
+    |  during the backward pass. Most libraries require the data passed through
+    |  the network to accumulate these intermediate result. This is the "tape"
+    |  in tape-based differentiation.
+
+p
+    |  In Thinc, a model that computes #[code y = f(x)] is required to also
+    |  return a callback that computes #[code dx = f'(dy)]. The same
+    |  intermediate state needs to be tracked, but this becomes an
+    |  implementation detail for the model to take care of – usually, the
+    |  callback is implemented as a closure, so the intermediate results can be
+    |  read from the enclosing scope.
diff --git a/website/usage/_facts-figures/_benchmarks-choi-2015.jade b/website/usage/_facts-figures/_benchmarks-choi-2015.jade
new file mode 100644
index 000000000..5c3386ce6
--- /dev/null
+++ b/website/usage/_facts-figures/_benchmarks-choi-2015.jade
@@ -0,0 +1,45 @@
+//- 💫 DOCS > USAGE > FACTS & FIGURES > BENCHMARKS > CHOI ET AL. (2015)
+
++table(["System", "Year", "Language", "Accuracy", "Speed (wps)"])
+    +row
+        +cell #[strong spaCy v2.x]
+        +cell 2017
+        +cell Python / Cython
+        +cell.u-text-right #[strong 92.6]
+        +cell.u-text-right #[em n/a]
+            |  #[+help("This table shows speed as benchmarked by Choi et al. We therefore can't provide comparable figures, as we'd be running the benchmark on different hardware.").u-color-dark]
+
+    +row
+        +cell #[strong spaCy v1.x]
+        +cell 2015
+        +cell Python / Cython
+        +cell.u-text-right 91.8
+        +cell.u-text-right 13,963
+
+    +row
+        +cell ClearNLP
+        +cell 2015
+        +cell Java
+        +cell.u-text-right 91.7
+        +cell.u-text-right 10,271
+
+    +row
+        +cell CoreNLP
+        +cell 2015
+        +cell Java
+        +cell.u-text-right 89.6
+        +cell.u-text-right 8,602
+
+    +row
+        +cell MATE
+        +cell 2015
+        +cell Java
+        +cell.u-text-right 92.5
+        +cell.u-text-right 550
+
+    +row
+        +cell Turbo
+        +cell 2015
+        +cell C++
+        +cell.u-text-right 92.4
+        +cell.u-text-right 349
diff --git a/website/usage/_facts-figures/_benchmarks-models.jade b/website/usage/_facts-figures/_benchmarks-models.jade
new file mode 100644
index 000000000..d8f9713b2
--- /dev/null
+++ b/website/usage/_facts-figures/_benchmarks-models.jade
@@ -0,0 +1,70 @@
+//- 💫 DOCS > USAGE > FACTS & FIGURES > BENCHMARKS > MODEL COMPARISON
+
+p
+    |  In this section, we provide benchmark accuracies for the pre-trained
+    |  model pipelines we distribute with spaCy. Evaluations are conducted
+    |  end-to-end from raw text, with no "gold standard" pre-processing, over
+    |  text from a mix of genres where possible.
+
++aside("Methodology")
+    |  The evaluation was conducted on raw text with no gold standard
+    |  information. The parser, tagger and entity recognizer were trained on the
+    |  #[+a("https://www.gabormelli.com/RKB/OntoNotes_Corpus") OntoNotes 5]
+    |  corpus, the word vectors on #[+a("http://commoncrawl.org") Common Crawl].
+
++h(4, "benchmarks-models-english") English
+
++table(["Model", "spaCy", "Type", "UAS", "NER F", "POS", "WPS", "Size"])
+    +row
+        +cell #[+a("/models/en#en_core_web_sm") #[code en_core_web_sm]] 2.0.0a5
+        each data in ["2.x", "neural"]
+            +cell.u-text-right=data
+        +cell.u-text-right 91.4
+        +cell.u-text-right 85.5
+        +cell.u-text-right 97.0
+        +cell.u-text-right 8.2k
+        +cell.u-text-right #[strong 36 MB]
+
+    +row
+        +cell #[+a("/models/en#en_core_web_lg") #[code en_core_web_lg]] 2.0.0a0
+        each data in ["2.x", "neural"]
+            +cell.u-text-right=data
+        +cell.u-text-right #[strong 91.9]
+        +cell.u-text-right #[strong 86.4]
+        +cell.u-text-right #[strong 97.2]
+        +cell.u-text-right #[em n/a]
+        +cell.u-text-right 667 MB
+
+    +row("divider")
+        +cell #[code en_core_web_sm] 1.2.0
+        each data in ["1.x", "linear", 86.6, 78.5, 96.6]
+            +cell.u-text-right=data
+        +cell.u-text-right #[strong 25.7k]
+        +cell.u-text-right 50 MB
+
+    +row
+        +cell #[code en_core_web_md] 1.2.1
+        each data in ["1.x", "linear", 90.6, 81.4, 96.7, "18.8k", "1 GB"]
+            +cell.u-text-right=data
+
++h(4, "benchmarks-models-spanish") Spanish
+
++table(["Model", "spaCy", "Type", "UAS", "NER F", "POS", "WPS", "Size"])
+    +row
+        +cell #[+a("/models/es#es_core_web_sm") #[code es_core_web_sm]] 2.0.0a0
+        +cell.u-text-right 2.x
+        +cell.u-text-right neural
+        +cell.u-text-right #[strong 90.1]
+        +cell.u-text-right 89.0
+        +cell.u-text-right #[strong 96.7]
+        +cell.u-text-right #[em n/a]
+        +cell.u-text-right #[strong 36 MB]
+
+    +row("divider")
+        +cell #[code es_core_web_md] 1.1.0
+        each data in ["1.x", "linear", 87.5]
+            +cell.u-text-right=data
+        +cell #[strong 94.2]
+        +cell #[strong 96.7]
+        +cell.u-text-right #[em n/a]
+        +cell.u-text-right 377 MB
diff --git a/website/usage/_facts-figures/_benchmarks.jade b/website/usage/_facts-figures/_benchmarks.jade
new file mode 100644
index 000000000..f69eb5406
--- /dev/null
+++ b/website/usage/_facts-figures/_benchmarks.jade
@@ -0,0 +1,206 @@
+//- 💫 DOCS > USAGE > FACTS & FIGURES > BENCHMARKS
+
+p
+    |  Two peer-reviewed papers in 2015 confirm that spaCy offers the
+    |  #[strong fastest syntactic parser in the world] and that
+    |  #[strong its accuracy is within 1% of the best] available. The few
+    |  systems that are more accurate are 20× slower or more.
+
++aside("About the evaluation")
+    |  The first of the evaluations was published by #[strong Yahoo! Labs] and
+    |  #[strong Emory University], as part of a survey of current parsing
+    |  technologies #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") (Choi et al., 2015)].
+    |  Their results and subsequent discussions helped us develop a novel
+    |  psychologically-motivated technique to improve spaCy's accuracy, which
+    |  we published in joint work with Macquarie University
+    |  #[+a("https://aclweb.org/anthology/D/D15/D15-1162.pdf") (Honnibal and Johnson, 2015)].
+
+include _benchmarks-choi-2015
+
++h(3, "algorithm") Algorithm comparison
+
+p
+    |  In this section, we compare spaCy's algorithms to recently published
+    |  systems, using some of the most popular benchmarks. These benchmarks are
+    |  designed to help isolate the contributions of specific algorithmic
+    |  decisions, so they promote slightly "idealised" conditions. Specifically,
+    |  the text comes pre-processed with "gold standard" token and sentence
+    |  boundaries. The data sets also tend to be fairly small, to help
+    |  researchers iterate quickly. These conditions mean the models trained on
+    |  these data sets are not always useful for practical purposes.
+
++h(4, "parse-accuracy-penn") Parse accuracy (Penn Treebank / Wall Street Journal)
+
+p
+    |  This is the "classic" evaluation, so it's the number parsing researchers
+    |  are most easily able to put in context. However, it's quite far removed
+    |  from actual usage: it uses sentences with gold-standard segmentation and
+    |  tokenization, from a pretty specific type of text (articles from a single
+    |  newspaper, 1984-1989).
+
++aside("Methodology")
+    |  #[+a("http://arxiv.org/abs/1603.06042") Andor et al. (2016)] chose
+    |  slightly different experimental conditions from
+    |  #[+a("https://aclweb.org/anthology/P/P15/P15-1038.pdf") Choi et al. (2015)],
+    |  so the two accuracy tables here do not present directly comparable
+    |  figures.
+
++table(["System", "Year", "Type", "Accuracy"])
+    +row
+        +cell spaCy v2.0.0
+        +cell 2017
+        +cell neural
+        +cell.u-text-right 94.48
+
+    +row
+        +cell spaCy v1.1.0
+        +cell 2016
+        +cell linear
+        +cell.u-text-right 92.80
+
+    +row("divider")
+        +cell
+            +a("https://arxiv.org/pdf/1611.01734.pdf") Dozat and Manning
+            +cell 2017
+            +cell neural
+            +cell.u-text-right #[strong 95.75]
+
+    +row
+        +cell
+            +a("http://arxiv.org/abs/1603.06042") Andor et al.
+        +cell 2016
+        +cell neural
+        +cell.u-text-right 94.44
+
+    +row
+        +cell
+            +a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet Parsey McParseface
+        +cell 2016
+        +cell neural
+        +cell.u-text-right 94.15
+
+    +row
+        +cell
+            +a("http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43800.pdf") Weiss et al.
+        +cell 2015
+        +cell neural
+        +cell.u-text-right 93.91
+
+    +row
+        +cell
+            +a("http://research.google.com/pubs/archive/38148.pdf") Zhang and McDonald
+        +cell 2014
+        +cell linear
+        +cell.u-text-right 93.32
+
+    +row
+        +cell
+            +a("http://www.cs.cmu.edu/~ark/TurboParser/") Martins et al.
+        +cell 2013
+        +cell linear
+        +cell.u-text-right 93.10
+
++h(4, "ner-accuracy-ontonotes5") NER accuracy (OntoNotes 5, no pre-process)
+
+p
+    |  This is the evaluation we use to tune spaCy's parameters are decide which
+    |  algorithms are better than others. It's reasonably close to actual usage,
+    |  because it requires the parses to be produced from raw text, without any
+    |  pre-processing.
+
++table(["System", "Year", "Type", "Accuracy"])
+    +row
+        +cell spaCy #[+a("/models/en#en_core_web_lg") #[code en_core_web_lg]] v2.0.0
+        +cell 2017
+        +cell neural
+        +cell.u-text-right 86.45
+
+    +row("divider")
+        +cell
+            +a("https://arxiv.org/pdf/1702.02098.pdf") Strubell et al.
+        +cell 2017
+        +cell neural
+        +cell.u-text-right #[strong 86.81]
+
+    +row
+        +cell
+            +a("https://www.semanticscholar.org/paper/Named-Entity-Recognition-with-Bidirectional-LSTM-C-Chiu-Nichols/10a4db59e81d26b2e0e896d3186ef81b4458b93f") Chiu and Nichols
+        +cell 2016
+        +cell neural
+        +cell.u-text-right 86.19
+
+    +row
+        +cell
+            +a("https://www.semanticscholar.org/paper/A-Joint-Model-for-Entity-Analysis-Coreference-Typi-Durrett-Klein/28eb033eee5f51c5e5389cbb6b777779203a6778") Durrett and Klein
+        +cell 2014
+        +cell neural
+        +cell.u-text-right 84.04
+
+    +row
+        +cell
+            +a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth
+        +cell 2009
+        +cell linear
+        +cell.u-text-right 83.45
+
++h(3, "spacy-models") Model comparison
+
+include _benchmarks-models
+
++h(3, "speed-comparison") Detailed speed comparison
+
+p
+    |  Here we compare the per-document processing time of various spaCy
+    |  functionalities against other NLP libraries. We show both absolute
+    |  timings (in ms) and relative performance (normalized to spaCy). Lower is
+    |  better.
+
++infobox("Important note", "⚠️")
+    |  This evaluation was conducted in 2015. We're working on benchmarks on
+    |  current CPU and GPU hardware.
+
++aside("Methodology")
+    |  #[strong Set up:] 100,000 plain-text documents were streamed from an
+    |  SQLite3 database, and processed with an NLP library, to one of three
+    |  levels of detail — tokenization, tagging, or parsing. The tasks are
+    |  additive: to parse the text you have to tokenize and tag it. The
+    |  pre-processing was not subtracted from the times — we report the time
+    |  required for the pipeline to complete. We report mean times per document,
+    |  in milliseconds.#[br]#[br]
+    |  #[strong Hardware]: Intel i7-3770 (2012)#[br]
+    |  #[strong Implementation]: #[+src(gh("spacy-benchmarks")) #[code spacy-benchmarks]]
+
++table
+    +row.u-text-label.u-text-center
+        +head-cell
+        +head-cell(colspan="3") Absolute (ms per doc)
+        +head-cell(colspan="3") Relative (to spaCy)
+
+    +row
+        each column in ["System", "Tokenize", "Tag", "Parse", "Tokenize", "Tag", "Parse"]
+            +head-cell=column
+
+    +row
+        +cell #[strong spaCy]
+        each data in [ "0.2ms", "1ms", "19ms"]
+            +cell.u-text-right #[strong=data]
+
+        each data in ["1x", "1x", "1x"]
+            +cell.u-text-right=data
+
+    +row
+        +cell CoreNLP
+        each data in ["2ms", "10ms", "49ms", "10x", "10x", "2.6x"]
+            +cell.u-text-right=data
+    +row
+        +cell ZPar
+        each data in ["1ms", "8ms", "850ms", "5x", "8x", "44.7x"]
+            +cell.u-text-right=data
+    +row
+        +cell NLTK
+        each data in ["4ms", "443ms"]
+            +cell.u-text-right=data
+        +cell.u-text-right #[em n/a]
+        each data in ["20x", "443x"]
+            +cell.u-text-right=data
+        +cell.u-text-right #[em n/a]
diff --git a/website/usage/_facts-figures/_feature-comparison.jade b/website/usage/_facts-figures/_feature-comparison.jade
new file mode 100644
index 000000000..c8fa5ffbe
--- /dev/null
+++ b/website/usage/_facts-figures/_feature-comparison.jade
@@ -0,0 +1,58 @@
+//- 💫 DOCS > USAGE > FACTS & FIGURES > FEATURE COMPARISON
+
+p
+    |  Here's a quick comparison of the functionalities offered by spaCy,
+    |  #[+a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet],
+    |  #[+a("http://www.nltk.org/py-modindex.html") NLTK] and
+    |  #[+a("http://stanfordnlp.github.io/CoreNLP/") CoreNLP].
+
++table(["", "spaCy", "SyntaxNet", "NLTK", "CoreNLP"])
+    +row
+        +cell Programming language
+        each lang in ["Python", "C++", "Python", "Java"]
+            +cell.u-text-small.u-text-center=lang
+
+    +row
+        +cell Neural network models
+            each icon in ["pro", "pro", "con", "pro"]
+                +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Integrated word vectors
+        each icon in ["pro", "con", "con", "con"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Multi-language support
+        each icon in ["pro", "pro", "pro", "pro"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Tokenization
+        each icon in ["pro", "pro", "pro", "pro"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Part-of-speech tagging
+        each icon in ["pro", "pro", "pro", "pro"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Sentence segmentation
+        each icon in ["pro", "pro", "pro", "pro"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Dependency parsing
+        each icon in ["pro", "pro", "con", "pro"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Entity recognition
+        each icon in ["pro", "con", "pro", "pro"]
+            +cell.u-text-center #[+procon(icon)]
+
+    +row
+        +cell Coreference resolution
+        each icon in ["con", "con", "con", "pro"]
+            +cell.u-text-center #[+procon(icon)]
diff --git a/website/usage/_facts-figures/_other-libraries.jade b/website/usage/_facts-figures/_other-libraries.jade
new file mode 100644
index 000000000..427debb27
--- /dev/null
+++ b/website/usage/_facts-figures/_other-libraries.jade
@@ -0,0 +1,70 @@
+//- 💫 DOCS > USAGE > FACTS & FIGURES > OTHER LIBRARIES
+
+p
+    |  Data scientists, researchers and machine learning engineers have
+    |  converged on Python as the language for AI. This gives developers a rich
+    |  ecosystem of NLP libraries to work with. Here's how we think the pieces
+    |  fit together.
+
++aside("Using spaCy with other libraries")
+    |  For details on how to use spaCy together with popular machine learning
+    |  libraries like TensorFlow, Keras or PyTorch, see the
+    |  #[+a("/usage/deep-learning") usage guide on deep learning].
+
++infobox
+    +infobox-logos(["nltk", 80, 25, "http://nltk.org"])
+    |  #[+label-inline NLTK] offers some of the same functionality as spaCy.
+    |  Although originally developed for teaching and research, its longevity
+    |  and stability has resulted in a large number of industrial users. It's
+    |  the main alternative to spaCy for tokenization and sentence segmentation.
+    |  In comparison to spaCy, NLTK takes a much more "broad church" approach –
+    |  so it has some functions that spaCy doesn't provide, at the expense of a
+    |  bit more clutter to sift through. spaCy is also much more
+    |  performance-focussed than NLTK: where the two libraries provide the same
+    |  functionality, spaCy's implementation will usually be faster and more
+    |  accurate.
+
++infobox
+    +infobox-logos(["gensim", 40, 40, "https://radimrehurek.com/gensim/"])
+    |  #[+label-inline Gensim] provides unsupervised text modelling algorithms.
+    |  Although Gensim isn't a runtime dependency of spaCy, we use it to train
+    |  word vectors. There's almost no overlap between the libraries – the two
+    |  work together.
+
++infobox
+    +infobox-logos(["tensorflow", 35, 42, "https://www.tensorflow.org"], ["keras", 45, 45, "https://www.keras.io"])
+    |  #[+label-inline Tensorflow / Keras] is the most popular deep learning library.
+    |  spaCy provides efficient and powerful feature extraction functionality,
+    |  that can be used as a pre-process to any deep learning library. You can
+    |  also use Tensorflow and Keras to create spaCy pipeline components, to add
+    |  annotations to the #[code Doc] object.
+
++infobox
+    +infobox-logos(["scikitlearn", 90, 44, "http://scikit-learn.org"])
+    |  #[+label-inline scikit-learn] features a number of useful NLP functions,
+    |  especially for solving text classification problems using linear models
+    |  with bag-of-words features. If you know you need exactly that, it might
+    |  be better to use scikit-learn's built-in pipeline directly. However, if
+    |  you want to extract more detailed features, using part-of-speech tags,
+    |  named entity labels, or string transformations, you can use spaCy as a
+    |  pre-process in your classification system. scikit-learn also provides a
+    |  lot of experiment management and evaluation utilities that people use
+    |  alongside spaCy.
+
++infobox
+    +infobox-logos(["pytorch", 100, 48, "http://pytorch.org"], ["dynet", 80, 34, "http://dynet.readthedocs.io/"], ["chainer", 80, 43, "http://chainer.org"])
+    |  #[+label-inline PyTorch, DyNet and Chainer] are dynamic neural network
+    |  libraries, which can be much easier to work with for NLP. Outside of
+    |  Google, there's a general shift among NLP researchers to both DyNet and
+    |  Pytorch. spaCy is the front-end of choice for PyTorch's
+    |  #[code torch.text] extension. You can use any of these libraries to
+    |  create spaCy pipeline components, to add annotations to the #[code Doc]
+    |  object.
+
++infobox
+    +infobox-logos(["allennlp", 124, 22, "http://allennlp.org"])
+    |  #[+label-inline AllenNLP] is a new library designed to accelerate NLP
+    |  research, by providing a framework that supports modern deep learning
+    |  workflows for cutting-edge language understanding problems. AllenNLP uses
+    |  spaCy as a preprocessing component. You can also use AllenNLP to develop
+    |  spaCy pipeline components, to add annotations to the #[code Doc] object.
diff --git a/website/usage/_install/_changelog.jade b/website/usage/_install/_changelog.jade
new file mode 100644
index 000000000..e966b6695
--- /dev/null
+++ b/website/usage/_install/_changelog.jade
@@ -0,0 +1,31 @@
+//- 💫 DOCS > USAGE > INSTALL > CHANGELOG
+
++h(2, "changelog") Changelog
+    +button(gh("spacy") + "/releases", false, "secondary", "small").u-float-right.u-nowrap View releases
+
+div(data-tpl="changelog" data-tpl-key="error")
+    +infobox
+        |  Unable to load changelog from GitHub. Please see the
+        |  #[+a(gh("spacy") + "/releases") releases page] instead.
+
+section(data-tpl="changelog" data-tpl-key="table" style="display: none")
+    +table(["Date", "Version", "Title"])
+        tbody(data-tpl="changelog" data-tpl-key="releases")
+            +row(data-tpl="changelog" data-tpl-key="item")
+                +cell.u-nowrap
+                    +label(data-changelog="date")
+                +cell(data-changelog="tag")
+                +cell.u-text-small(data-changelog="title")
+
+    +h(3) Pre-releases
+
+    +aside("About pre-releases")
+        .o-block-small
+            |  Pre-releases include alpha and beta versions, as well as release
+            |  candidates. They are not intended for production use. You can
+            |  download spaCy pre-releases via the #[code spacy-nightly] package
+            |  on pip.
+        +badge("https://img.shields.io/pypi/v/spacy-nightly.svg?style=flat-square", "https://pypi.python.org/pypi/spacy-nightly")
+
+    +table(["Date", "Version", "Title"])
+        tbody(data-tpl="changelog" data-tpl-key="prereleases")
diff --git a/website/usage/_install/_instructions.jade b/website/usage/_install/_instructions.jade
new file mode 100644
index 000000000..fa4f8b29f
--- /dev/null
+++ b/website/usage/_install/_instructions.jade
@@ -0,0 +1,219 @@
+//- 💫 DOCS > USAGE > INSTALL > INSTRUCTIONS
+
++h(3, "pip") pip
+    +badge("https://img.shields.io/pypi/v/spacy.svg?style=flat-square", "https://pypi.python.org/pypi/spacy")
+
+p Using pip, spaCy releases are currently only available as source packages.
+
++code(false, "bash").
+    pip install -U spacy
+
++aside("Download models")
+    |  After installation you need to download a language model. For more info
+    |  and available models, see the #[+a("/usage/models") docs on models].
+
+    +code.o-no-block.
+        spacy download en
+
+        >>> import spacy
+        >>> nlp = spacy.load('en')
+
+p
+    |  When using pip it is generally recommended to install packages in a
+    |  #[code virtualenv] to avoid modifying system state:
+
++code(false, "bash").
+    virtualenv .env
+    source .env/bin/activate
+    pip install spacy
+
++h(3, "conda") conda
+    +badge("https://anaconda.org/conda-forge/spacy/badges/version.svg", "https://anaconda.org/conda-forge/spacy")
+
+p
+    |  Thanks to our great community, we've finally re-added conda support. You
+    |  can now install spaCy via #[code conda-forge]:
+
++code(false, "bash").
+    conda config --add channels conda-forge
+    conda install spacy
+
+p
+    |  For the feedstock including the build recipe and configuration, check out
+    |  #[+a("https://github.com/conda-forge/spacy-feedstock") this repository].
+    |  Improvements and pull requests to the recipe and setup are always
+    |  appreciated.
+
++h(3, "upgrading") Upgrading spaCy
+
++aside("Upgrading from v1 to v2")
+    |  Although we've tried to keep breaking changes to a minimum, upgrading
+    |  from spaCy v1.x to v2.x may still require some changes to your code base.
+    |  For details see the sections on
+    |  #[+a("/usage/v2#incompat") backwards incompatibilities] and
+    |  #[+a("/usage/v2#migrating") migrating]. Also remember to download the new
+    |  models, and retrain your own models.
+
+p
+    |  When updating to a newer version of spaCy, it's generally recommended to
+    |  start with a clean virtual environment. If you're upgrading to a new
+    |  major version, make sure you have the latest #[strong compatible models]
+    |  installed, and that there are no old shortcut links or incompatible model
+    |  packages left over in your environment, as this can often lead to unexpected
+    |  results and errors.  If you've trained your own models, keep in mind that
+    |  your train and runtime inputs must match. This means you'll have to
+    |  #[strong retrain your models] with the new version.
+
+p
+    |  As of v2.0, spaCy also provides a #[+api("cli#validate") #[code validate]]
+    |  command, which lets you verify that all installed models are compatible
+    |  with your spaCy version. If incompatible models are found, tips and
+    |  installation instructions are printed. The command is also useful to
+    |  detect out-of-sync model links resulting from links created in different
+    |  virtual environments. It's recommended to run the command with
+    |  #[code python -m] to make sure you're executing the correct version of
+    |  spaCy.
+
++code(false, "bash").
+    pip install -U spacy
+    python -m spacy validate
+
++h(3, "gpu") Run spaCy with GPU
+
+p
+    |  As of v2.0, spaCy's comes with neural network models that are implemented
+    |  in our machine learning library, #[+a(gh("thinc")) Thinc]. For GPU
+    |  support, we've been grateful to use the work of
+    |  #[+a("http://chainer.org") Chainer]'s CuPy module, which provides
+    |  a NumPy-compatible interface for GPU arrays.
+
+p
+    |  First, install follows the normal CUDA installation procedure. Next, set
+    |  your environment variables so that the installation will be able to find
+    |  CUDA. Finally, install spaCy.
+
++code(false, "bash").
+    export CUDA_HOME=/usr/local/cuda-8.0 # Or wherever your CUDA is
+    export PATH=$PATH:$CUDA_HOME/bin
+
+    pip install spacy
+    python -c "import thinc.neural.gpu_ops" # Check the GPU ops were built
+
++h(3, "source") Compile from source
+
+p
+    |  The other way to install spaCy is to clone its
+    |  #[+a(gh("spaCy")) GitHub repository] and build it from source. That is
+    |  the common way if you want to make changes to the code base. You'll need
+    |  to make sure that you have a development environment consisting of a
+    |  Python distribution including header files, a compiler,
+    |  #[+a("https://pip.pypa.io/en/latest/installing/") pip],
+    |  #[+a("https://virtualenv.pypa.io/") virtualenv] and
+    |  #[+a("https://git-scm.com") git] installed. The compiler part is the
+    |  trickiest. How to do that depends on your system. See notes on
+    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") OS X] and
+    |  #[a(href="#source-windows") Windows] for details.
+
++code(false, "bash").
+    # make sure you are using recent pip/virtualenv versions
+    python -m pip install -U pip virtualenv
+    git clone #{gh("spaCy")}
+    cd spaCy
+
+    virtualenv .env
+    source .env/bin/activate
+    pip install -r requirements.txt
+    pip install -e .
+
+p
+    |  Compared to regular install via pip,
+    |  #[+a(gh("spaCy", "requirements.txt")) requirements.txt]
+    |  additionally installs developer dependencies such as Cython.
+
+p
+    |  Instead of the above verbose commands, you can also use the following
+    |  #[+a("http://www.fabfile.org/") Fabric] commands:
+
++table(["Command", "Description"])
+    +row
+        +cell #[code fab env]
+        +cell Create #[code virtualenv] and delete previous one, if it exists.
+
+    +row
+        +cell #[code fab make]
+        +cell Compile the source.
+
+    +row
+        +cell #[code fab clean]
+        +cell Remove compiled objects, including the generated C++.
+
+    +row
+        +cell #[code fab test]
+        +cell Run basic tests, aborting after first failure.
+
+p
+    |  All commands assume that your #[code virtualenv] is located in a
+    |  directory #[code .env]. If you're using a different directory, you can
+    |  change it via the environment variable #[code VENV_DIR], for example:
+
++code(false, "bash").
+    VENV_DIR=".custom-env" fab clean make
+
++h(4, "source-ubuntu") Ubuntu
+
+p Install system-level dependencies via #[code apt-get]:
+
++code(false, "bash").
+    sudo apt-get install build-essential python-dev git
+
++h(4, "source-osx") macOS / OS X
+
+p
+    |  Install a recent version of
+    |  #[+a("https://developer.apple.com/xcode/") XCode], including the
+    |  so-called "Command Line Tools". macOS and OS X ship with Python and git
+    |  preinstalled. To compile spaCy with multi-threading support on macOS / OS X,
+    |  #[+a("https://github.com/explosion/spaCy/issues/267") see here].
+
++h(4, "source-windows") Windows
+
+p
+    |  Install a version of
+    |  #[+a("https://www.visualstudio.com/vs/visual-studio-express/") Visual Studio Express]
+    |  that matches the version that was used to compile your Python
+    |  interpreter. For official distributions these are:
+
++table([ "Distribution", "Version"])
+    +row
+        +cell Python 2.7
+        +cell Visual Studio 2008
+
+    +row
+        +cell Python 3.4
+        +cell Visual Studio 2010
+
+    +row
+        +cell Python 3.5+
+        +cell Visual Studio 2015
+
++h(3, "tests") Run tests
+
+p
+    |  spaCy comes with an #[+a(gh("spacy", "spacy/tests")) extensive test suite].
+    |  First, find out where spaCy is installed:
+
++code(false, "bash").
+    python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))"
+
+p
+    |  Then run #[code pytest] on that directory. The flags #[code --slow] and
+    |  #[code --model] are optional and enable additional tests.
+
++code(false, "bash").
+    # make sure you are using recent pytest version
+    python -m pip install -U pytest
+
+    python -m pytest <spacy-directory>                 # basic tests
+    python -m pytest <spacy-directory> --slow          # basic and slow tests
+    python -m pytest <spacy-directory> --models --all  # basic and all model tests
+    python -m pytest <spacy-directory> --models --en   # basic and English model tests
diff --git a/website/usage/_install/_quickstart.jade b/website/usage/_install/_quickstart.jade
new file mode 100644
index 000000000..8e581994c
--- /dev/null
+++ b/website/usage/_install/_quickstart.jade
@@ -0,0 +1,26 @@
+//- 💫 DOCS > USAGE > INSTALL > QUICKSTART
+
+- QUICKSTART[QUICKSTART.length - 1].options = Object.keys(MODELS).map(m => ({ id: m, title: LANGUAGES[m] }))
+
++quickstart(QUICKSTART, "Quickstart")
+    +qs({config: 'venv', python: 2}) python -m pip install -U virtualenv
+    +qs({config: 'venv', python: 3}) python -m pip install -U venv
+    +qs({config: 'venv', python: 2}) virtualenv .env
+    +qs({config: 'venv', python: 3}) venv .env
+    +qs({config: 'venv', os: 'mac'}) source .env/bin/activate
+    +qs({config: 'venv', os: 'linux'}) source .env/bin/activate
+    +qs({config: 'venv', os: 'windows'}) .env\Scripts\activate
+
+    +qs({config: 'gpu', os: 'mac'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
+    +qs({config: 'gpu', os: 'linux'}) export PATH=$PATH:/usr/local/cuda-8.0/bin
+
+    +qs({package: 'pip'}) pip install -U spacy
+    +qs({package: 'conda'}) conda install -c conda-forge spacy
+
+    +qs({package: 'source'}) git clone https://github.com/explosion/spaCy
+    +qs({package: 'source'}) cd spaCy
+    +qs({package: 'source'}) pip install -r requirements.txt
+    +qs({package: 'source'}) pip install -e .
+
+    for _, model in MODELS
+        +qs({model: model}) spacy download #{model}
diff --git a/website/usage/_install/_troubleshooting.jade b/website/usage/_install/_troubleshooting.jade
new file mode 100644
index 000000000..9fb92f17b
--- /dev/null
+++ b/website/usage/_install/_troubleshooting.jade
@@ -0,0 +1,147 @@
+//- 💫 DOCS > USAGE > INSTALL > TROUBLESHOOTING
+
+p
+    |  This section collects some of the most common errors you may come
+    |  across when installing, loading and using spaCy, as well as their solutions.
+
++aside("Help us improve this guide")
+    |  Did you come across a problem like the ones listed here and want to
+    |  share the solution? You can find the "Suggest edits" button at the
+    |  bottom of this page that points you to the source. We always
+    |  appreciate #[+a(gh("spaCy") + "/pulls") pull requests]!
+
++h(3, "compatible-model") No compatible model found
+
++code(false, "text").
+    No compatible model found for [lang] (spaCy v#{SPACY_VERSION}).
+
+p
+    |  This usually means that the model you're trying to download does not
+    |  exist, or isn't available for your version of spaCy. Check the
+    |  #[+a(gh("spacy-models", "compatibility.json")) compatibility table]
+    |  to see which models are available for your spaCy version. If you're using
+    |  an old version, consider upgrading to the latest release. Note that while
+    |  spaCy supports tokenization for
+    |  #[+a("/usage/models/#languages") a variety of languages],
+    |  not all of them come with statistical models. To only use the tokenizer,
+    |  import the language's #[code Language] class instead, for example
+    |  #[code from spacy.fr import French].
+
++h(3, "symlink-privilege") Symbolic link privilege not held
+
++code(false, "text").
+    OSError: symbolic link privilege not held
+
+p
+    |  To create #[+a("/usage/models/#usage") shortcut links] that let you
+    |  load models by name, spaCy creates a symbolic link in the
+    |  #[code spacy/data] directory. This means your user needs permission to do
+    |  this. The above error mostly occurs when doing a system-wide installation,
+    |  which will create the symlinks in a system directory. Run the
+    |  #[code download] or #[code link] command as administrator, or use a
+    |  #[code virtualenv] to install spaCy in a user directory, instead
+    |  of doing a system-wide installation.
+
++h(3, "no-cache-dir") No such option: --no-cache-dir
+
++code(false, "text").
+    no such option: --no-cache-dir
+
+p
+    |  The #[code download] command uses pip to install the models and sets the
+    |  #[code --no-cache-dir] flag to prevent it from requiring too much memory.
+    |  #[+a("https://pip.pypa.io/en/stable/reference/pip_install/#caching") This setting]
+    |  requires pip v6.0 or newer. Run #[code pip install -U pip] to upgrade to
+    |  the latest version of pip. To see which version you have installed,
+    |  run #[code pip --version].
+
++h(3, "import-error") Import error
+
++code(false, "text").
+    Import Error: No module named spacy
+
+p
+    |  This error means that the spaCy module can't be located on your system, or in
+    |  your environment. Make sure you have spaCy installed. If you're using a
+    |  #[code virtualenv], make sure it's activated and check that spaCy is
+    |  installed in that environment – otherwise, you're trying to load a system
+    |  installation. You can also run #[code which python] to find out where
+    |  your Python executable is located.
+
++h(3, "import-error-models") Import error: models
+
++code(false, "text").
+    ImportError: No module named 'en_core_web_sm'
+
+p
+    |  As of spaCy v1.7, all models can be installed as Python packages. This means
+    |  that they'll become importable modules of your application. When creating
+    |  #[+a("/usage/models/#usage") shortcut links], spaCy will also try
+    |  to import the model to load its meta data. If this fails, it's usually a
+    |  sign that the package is not installed in the current environment.
+    |  Run #[code pip list] or #[code pip freeze] to check which model packages
+    |  you have installed, and install the
+    |  #[+a("/models") correct models] if necessary. If you're
+    |  importing a model manually at the top of a file, make sure to use the name
+    |  of the package, not the shortcut link you've created.
+
++h(3, "vocab-strings") File not found: vocab/strings.json
+
++code(false, "text").
+    FileNotFoundError: No such file or directory: [...]/vocab/strings.json
+
+p
+    |  This error may occur when using #[code spacy.load()] to load
+    |  a language model – either because you haven't set up a
+    |  #[+a("/usage/models/#usage") shortcut link] for it, or because it
+    |  doesn't actually exist. Set up a
+    |  #[+a("/usage/models/#usage") shortcut link] for the model
+    |  you want to load. This can either be an installed model package, or a
+    |  local directory containing the model data. If you want to use one of the
+    |  #[+a("/usage/models#languages") alpha tokenizers] for
+    |  languages that don't yet have a statistical model, you should import its
+    |  #[code Language] class instead, for example
+    |  #[code from spacy.lang.bn import Bengali].
+
++h(3, "command-not-found") Command not found
+
++code(false, "text").
+    command not found: spacy
+
+p
+    |  This error may occur when running the #[code spacy] command from the
+    |  command line. spaCy does not currently add an entry to our #[code PATH]
+    |  environment variable, as this can lead to unexpected results, especially
+    |  when using #[code virtualenv]. Instead, spaCy adds an auto-alias that
+    |  maps #[code spacy] to #[code python -m spacy]. If this is not working as
+    |  expected, run the command with #[code python -m], yourself –
+    |  for example #[code python -m spacy download en]. For more info on this,
+    |  see #[+api("cli#download") download].
+
++h(3, "module-load") 'module' object has no attribute 'load'
+
++code(false, "text").
+    AttributeError: 'module' object has no attribute 'load'
+
+p
+    |  While this could technically have many causes, including spaCy being
+    |  broken, the most likely one is that your script's file or directory name
+    |  is "shadowing" the module – e.g. your file is called #[code spacy.py],
+    |  or a directory you're importing from is called #[code spacy]. So, when
+    |  using spaCy, never call anything else #[code spacy].
+
++h(3, "pron-lemma") Pronoun lemma is returned as #[code -PRON-]
+
++code.
+    doc = nlp(u'They are')
+    print(doc[0].lemma_)
+    # -PRON-
+
+p
+    |  This is in fact expected behaviour and not a bug.
+    |  Unlike verbs and common nouns, there's no clear base form of a personal
+    |  pronoun. Should the lemma of "me" be "I", or should we normalize person
+    |  as well, giving "it" — or maybe "he"? spaCy's solution is to introduce a
+    |  novel symbol, #[code -PRON-], which is used as the lemma for
+    |  all personal pronouns. For more info on this, see the
+    |  #[+api("annotation#lemmatization") annotation specs] on lemmatization.
diff --git a/website/docs/usage/dependency-parse.jade b/website/usage/_linguistic-features/_dependency-parse.jade
similarity index 93%
rename from website/docs/usage/dependency-parse.jade
rename to website/usage/_linguistic-features/_dependency-parse.jade
index beae36578..85d9179df 100644
--- a/website/docs/usage/dependency-parse.jade
+++ b/website/usage/_linguistic-features/_dependency-parse.jade
@@ -1,6 +1,4 @@
-//- 💫 DOCS > USAGE > DEPENDENCY PARSE
-
-include ../../_includes/_mixins
+//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > DEPENDENCY PARSE
 
 p
     |  spaCy features a fast and accurate syntactic dependency parser, and has
@@ -11,8 +9,7 @@ p
     |  boolean value. If this attribute is #[code False], the default sentence
     |  iterator will raise an exception.
 
-+h(2, "noun-chunks") Noun chunks
-    +tag-model("dependency parse")
++h(3, "noun-chunks") Noun chunks
 
 p
     |  Noun chunks are "base noun phrases" – flat phrases that have a noun as
@@ -41,7 +38,7 @@ p
     +annotation-row(["insurance liability", "liability", "dobj", "shift"], style)
     +annotation-row(["manufacturers", "manufacturers", "pobj", "toward"], style)
 
-+h(2, "navigating") Navigating the parse tree
++h(3, "navigating") Navigating the parse tree
 
 p
     |  spaCy uses the terms #[strong head] and #[strong child] to describe the words
@@ -110,7 +107,7 @@ p
     |  attribute, which provides a sequence of #[+api("token") #[code Token]]
     |  objects.
 
-+h(3, "navigating-around") Iterating around the local tree
++h(4, "navigating-around") Iterating around the local tree
 
 p
     |  A few more convenience attributes are provided for iterating around the
@@ -135,7 +132,7 @@ p
     |  method.
 
 +aside("Projective vs. non-projective")
-    |  For the #[+a("/docs/usage/models#available") default English model], the
+    |  For the #[+a("/models/en") default English model], the
     |  parse tree is #[strong projective], which means that there are no crossing
     |  brackets. The tokens returned by #[code .subtree] are therefore guaranteed
     |  to be contiguous. This is not true for the German model, which has many
@@ -181,7 +178,7 @@ p
     +annotation-row(["their", "ADJ", "poss", "requests"], style)
     +annotation-row(["requests", "NOUN", "dobj", "submit"], style)
 
-+h(2, "displacy") Visualizing dependencies
++h(3, "displacy") Visualizing dependencies
 
 p
     |  The best way to understand spaCy's dependency parser is interactively.
@@ -201,14 +198,14 @@ p
 
 +infobox
     |  For more details and examples, see the
-    |  #[+a("/docs/usage/visualizers") usage guide on visualizing spaCy]. You
+    |  #[+a("/usage/visualizers") usage guide on visualizing spaCy]. You
     |  can also test displaCy in our #[+a(DEMOS_URL + "/displacy", true) online demo].
 
-+h(2, "disabling") Disabling the parser
++h(3, "disabling") Disabling the parser
 
 p
-    |  In the #[+a("/docs/usage/models/available") default models], the parser
-    |  is loaded and enabled as part of the
+    |  In the #[+a("/models") default models], the parser is loaded and enabled
+    |  as part of the
     |  #[+a("docs/usage/language-processing-pipelines") standard processing pipeline].
     |  If you don't need any of the syntactic information, you should disable
     |  the parser. Disabling the parser will make spaCy load and run much faster.
@@ -225,7 +222,7 @@ p
         |  Since spaCy v2.0 comes with better support for customising the
         |  processing pipeline components, the #[code parser] keyword argument
         |  has been replaced with #[code disable], which takes a list of
-        |  #[+a("/docs/usage/language-processing-pipeline") pipeline component names].
+        |  #[+a("/usage/processing-pipelines") pipeline component names].
         |  This lets you disable both default and custom components when loading
         |  a model, or initialising a Language class via
         |  #[+api("language-from_disk") #[code from_disk]].
diff --git a/website/docs/usage/entity-recognition.jade b/website/usage/_linguistic-features/_named-entities.jade
similarity index 74%
rename from website/docs/usage/entity-recognition.jade
rename to website/usage/_linguistic-features/_named-entities.jade
index 826de1543..f42df3342 100644
--- a/website/docs/usage/entity-recognition.jade
+++ b/website/usage/_linguistic-features/_named-entities.jade
@@ -1,6 +1,4 @@
-//- 💫 DOCS > USAGE > NAMED ENTITY RECOGNITION
-
-include ../../_includes/_mixins
+//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > NAMED ENTITY RECOGNITION
 
 p
     |  spaCy features an extremely fast statistical entity recognition system,
@@ -9,12 +7,11 @@ p
     |  locations, organizations and products. You can add arbitrary classes to
     |  the entity recognition system, and update the model with new examples.
 
-+h(2, "101") Named Entity Recognition 101
-    +tag-model("named entities")
++h(3, "101") Named Entity Recognition 101
 
-include _spacy-101/_named-entities
+include ../_spacy-101/_named-entities
 
-+h(2, "accessing") Accessing entity annotations
++h(3, "accessing") Accessing entity annotations
 
 p
     |  The standard way to access entity annotations is the
@@ -62,7 +59,7 @@ p
     +annotation-row(["delivery", 2, "O", '""', "outside an entity"], style)
     +annotation-row(["robots", 2, "O", '""', "outside an entity"], style)
 
-+h(2, "setting") Setting entity annotations
++h(3, "setting") Setting entity annotations
 
 p
     |  To ensure that the sequence of token annotations remains consistent, you
@@ -92,7 +89,7 @@ p
     |  but at the document level, the entity will have the start and end
     |  indices #[code (0, 7)].
 
-+h(3, "setting-from-array") Setting entity annotations from array
++h(4, "setting-from-array") Setting entity annotations from array
 
 p
     |  You can also assign entity annotations using the
@@ -114,7 +111,7 @@ p
     doc.from_array(header, attr_array)
     assert list(doc.ents)[0].text == u'London'
 
-+h(3, "setting-cython") Setting entity annotations in Cython
++h(4, "setting-cython") Setting entity annotations in Cython
 
 p
     |  Finally, you can always write to the underlying struct, if you compile
@@ -137,18 +134,16 @@ p
     |  you'll have responsibility for ensuring that the data is left in a
     |  consistent state.
 
-+h(2, "entity-types") Built-in entity types
++h(3, "entity-types") Built-in entity types
 
 +aside("Tip: Understanding entity types")
     |  You can also use #[code spacy.explain()] to get the description for the
     |  string representation of an entity label. For example,
     |  #[code spacy.explain("LANGUAGE")] will return "any named language".
 
-include ../api/_annotation/_named-entities
+include ../../api/_annotation/_named-entities
 
-+h(2, "updating") Training and updating
-
-+under-construction
++h(3, "updating") Training and updating
 
 p
     |  To provide training examples to the entity recogniser, you'll first need
@@ -166,65 +161,24 @@ p
 
 +code.
     doc = Doc(nlp.vocab, [u'rats', u'make', u'good', u'pets'])
-    gold = GoldParse(doc, [u'U-ANIMAL', u'O', u'O', u'O'])
+    gold = GoldParse(doc, entities=[u'U-ANIMAL', u'O', u'O', u'O'])
 
 +infobox
     |  For more details on #[strong training and updating] the named entity
-    |  recognizer, see the usage guides on #[+a("/docs/usage/training") training]
-    |  and #[+a("/docs/usage/training-ner") training the named entity recognizer],
+    |  recognizer, see the usage guides on #[+a("/usage/training") training]
     |  or check out the runnable
     |  #[+src(gh("spaCy", "examples/training/train_ner.py")) training script]
     |  on GitHub.
 
-+h(3, "updating-biluo") The BILUO Scheme
++h(4, "updating-biluo") The BILUO Scheme
 
 p
     |  You can also provide token-level entity annotation, using the
     |  following tagging scheme to describe the entity boundaries:
 
-+table([ "Tag", "Description" ])
-    +row
-        +cell #[code #[span.u-color-theme B] EGIN]
-        +cell The first token of a multi-token entity.
+include ../../api/_annotation/_biluo
 
-    +row
-        +cell #[code #[span.u-color-theme I] N]
-        +cell An inner token of a multi-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme L] AST]
-        +cell The final token of a multi-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme U] NIT]
-        +cell A single-token entity.
-
-    +row
-        +cell #[code #[span.u-color-theme O] UT]
-        +cell A non-entity token.
-
-+aside("Why BILUO, not IOB?")
-    |  There are several coding schemes for encoding entity annotations as
-    |  token tags.  These coding schemes are equally expressive, but not
-    |  necessarily equally learnable.
-    |  #[+a("http://www.aclweb.org/anthology/W09-1119") Ratinov and Roth]
-    |  showed that the minimal #[strong Begin], #[strong In], #[strong Out]
-    |  scheme was more difficult to learn than the #[strong BILUO] scheme that
-    |  we use, which explicitly marks boundary tokens.
-
-p
-    |  spaCy translates the character offsets into this scheme, in order to
-    |  decide the cost of each action given the current state of the entity
-    |  recogniser. The costs are then used to calculate the gradient of the
-    |  loss, to train the model. The exact algorithm is a pastiche of
-    |  well-known methods, and is not currently described in any single
-    |  publication. The model is a greedy transition-based parser guided by a
-    |  linear model whose weights are learned using the averaged perceptron
-    |  loss, via the #[+a("http://www.aclweb.org/anthology/C12-1059") dynamic oracle]
-    |  imitation learning strategy. The transition system is equivalent to the
-    |  BILOU tagging scheme.
-
-+h(2, "displacy") Visualizing named entities
++h(3, "displacy") Visualizing named entities
 
 p
     |  The #[+a(DEMOS_URL + "/displacy-ent/") displaCy #[sup ENT] visualizer]
@@ -238,7 +192,7 @@ p
 
 p
     |  For more details and examples, see the
-    |  #[+a("/docs/usage/visualizers") usage guide on visualizing spaCy].
+    |  #[+a("/usage/visualizers") usage guide on visualizing spaCy].
 
 +code("Named Entity example").
     import spacy
diff --git a/website/docs/usage/pos-tagging.jade b/website/usage/_linguistic-features/_pos-tagging.jade
similarity index 74%
rename from website/docs/usage/pos-tagging.jade
rename to website/usage/_linguistic-features/_pos-tagging.jade
index dd72efeba..4e845cdaf 100644
--- a/website/docs/usage/pos-tagging.jade
+++ b/website/usage/_linguistic-features/_pos-tagging.jade
@@ -1,20 +1,10 @@
-//- 💫 DOCS > USAGE > PART-OF-SPEECH TAGGING
+//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > PART-OF-SPEECH TAGGING
 
-include ../../_includes/_mixins
+include ../_spacy-101/_pos-deps
 
-p
-    |  Part-of-speech tags are labels like noun, verb, adjective etc that are
-    |  assigned to each token in the document. They're useful in rule-based
-    |  processes. They can also be useful features in some statistical models.
+//-+aside("Help – spaCy's output is wrong!")
 
-+h(2, "101") Part-of-speech tagging 101
-    +tag-model("tagger", "dependency parse")
-
-include _spacy-101/_pos-deps
-
-+aside("Help – spaCy's output is wrong!")
-
-+h(2, "rule-based-morphology") Rule-based morphology
++h(3, "rule-based-morphology") Rule-based morphology
 
 p
     |  Inflectional morphology is the process by which a root form of a word is
@@ -40,7 +30,7 @@ p
         +cell #[code VerbForm=Fin], #[code Mood=Ind], #[code Tense=Pres]
 
     +row
-        +cell I read the paper yesteday
+        +cell I read the paper yesterday
         +cell read
         +cell read
         +cell verb
@@ -54,7 +44,7 @@ p
 +list("numbers")
     +item
         |  The tokenizer consults a
-        |  #[+a("/docs/usage/adding-languages#tokenizer-exceptions") mapping table]
+        |  #[+a("/usage/adding-languages#tokenizer-exceptions") mapping table]
         |  #[code TOKENIZER_EXCEPTIONS], which allows sequences of characters
         |  to be mapped to multiple tokens. Each token may be assigned a part
         |  of speech and one or more morphological features.
@@ -68,7 +58,7 @@ p
 
     +item
         |  For words whose POS is not set by a prior process, a
-        |  #[+a("/docs/usage/adding-languages#tag-map") mapping table]
+        |  #[+a("/usage/adding-languages#tag-map") mapping table]
         |  #[code TAG_MAP] maps the tags to a part-of-speech and a set of
         |  morphological features.
 
@@ -80,6 +70,4 @@ p
         |  list-based exception files, acquired from
         |  #[+a("https://wordnet.princeton.edu/") WordNet].
 
-+h(2, "pos-schemes") Part-of-speech tag schemes
-
-include ../api/_annotation/_pos-tags
+include ../../api/_annotation/_pos-tags
diff --git a/website/docs/usage/rule-based-matching.jade b/website/usage/_linguistic-features/_rule-based-matching.jade
similarity index 81%
rename from website/docs/usage/rule-based-matching.jade
rename to website/usage/_linguistic-features/_rule-based-matching.jade
index 71400ea55..c006f43c9 100644
--- a/website/docs/usage/rule-based-matching.jade
+++ b/website/usage/_linguistic-features/_rule-based-matching.jade
@@ -1,19 +1,18 @@
 //- 💫 DOCS > USAGE > RULE-BASED MATCHING
 
-include ../../_includes/_mixins
-
 p
-    |  spaCy features a rule-matching engine that operates over tokens, similar
+    |  spaCy features a rule-matching engine, the #[+api("matcher") #[code Matcher]],
+    |  that operates over tokens, similar
     |  to regular expressions. The rules can refer to token annotations (e.g.
     |  the token #[code text] or #[code tag_], and flags (e.g. #[code IS_PUNCT]).
     |  The rule matcher also lets you pass in a custom callback
     |  to act on matches – for example, to merge entities and apply custom labels.
     |  You can also associate patterns with entity IDs, to allow some basic
-    |  entity linking or disambiguation.
+    |  entity linking or disambiguation. To match large terminology lists,
+    |  you can use the #[+api("phrasematcher") #[code PhraseMatcher]], which
+    |  accepts #[code Doc] objects as match patterns.
 
-//-+aside("What about \"real\" regular expressions?")
-
-+h(2, "adding-patterns") Adding patterns
++h(3, "adding-patterns") Adding patterns
 
 p
     |  Let's say we want to enable spaCy to find a combination of three tokens:
@@ -76,7 +75,132 @@ p
     |  other pattern types. You shouldn't have to create different matchers for
     |  each of those processes.
 
-+h(2, "on_match") Adding #[code on_match] rules
++h(4, "adding-patterns-attributes") Available token attributes
+
+p
+    |  The available token pattern keys are uppercase versions of the
+    |  #[+api("token#attributes") #[code Token] attributes]. The most relevant
+    |  ones for rule-based matching are:
+
++table(["Attribute", "Description"])
+    +row
+        +cell #[code ORTH]
+        +cell The exact verbatim text of a token.
+
+    +row
+        +cell.u-nowrap #[code LOWER], #[code UPPER]
+        +cell The lowercase, uppercase form of the token text.
+
+    +row
+        +cell.u-nowrap #[code IS_ALPHA], #[code IS_ASCII], #[code IS_DIGIT]
+        +cell
+            |  Token text consists of alphanumeric characters, ASCII characters,
+            |  digits.
+
+    +row
+        +cell.u-nowrap #[code IS_LOWER], #[code IS_UPPER], #[code IS_TITLE]
+        +cell Token text is in lowercase, uppercase, titlecase.
+
+    +row
+        +cell.u-nowrap #[code IS_PUNCT], #[code IS_SPACE], #[code IS_STOP]
+        +cell Token is punctuation, whitespace, stop word.
+
+    +row
+        +cell.u-nowrap #[code LIKE_NUM], #[code LIKE_URL], #[code LIKE_EMAIL]
+        +cell Token text resembles a number, URL, email.
+
+    +row
+        +cell.u-nowrap
+            |  #[code POS], #[code TAG], #[code DEP], #[code LEMMA],
+            |  #[code SHAPE]
+        +cell
+            |  The token's simple and extended part-of-speech tag, dependency
+            |  label, lemma, shape.
+
++h(4, "adding-patterns-wildcard") Using wildcard token patterns
+    +tag-new(2)
+
+p
+    |  While the token attributes offer many options to write highly specific
+    |  patterns, you can also use an empty dictionary, #[code {}] as a wildcard
+    |  representing #[strong any token]. This is useful if you know the context
+    |  of what you're trying to match, but very little about the specific token
+    |  and its characters. For example, let's say you're trying to extract
+    |  people's user names from your data. All you know is that they are listed
+    |  as "User name: {username}". The name itself may contain any character,
+    |  but no whitespace – so you'll know it will be handled as one token.
+
++code.
+    [{'ORTH': 'User'}, {'ORTH': 'name'}, {'ORTH': ':'}, {}]
+
++h(4, "quantifiers") Using operators and quantifiers
+
+p
+    |  The matcher also lets you use quantifiers, specified as the #[code 'OP']
+    |  key. Quantifiers let you define sequences of tokens to be mached, e.g.
+    |  one or more punctuation marks, or specify optional tokens. Note that there
+    |  are no nested or scoped quantifiers – instead, you can build those
+    |  behaviours with #[code on_match] callbacks.
+
++aside("Problems with quantifiers")
+    |  Using quantifiers may lead to unexpected results when matching
+    |  variable-length patterns, for example if the next token would also be
+    |  matched by the previous token. This problem should be resolved in a future
+    |  release. For more information, see
+    |  #[+a(gh("spaCy") + "/issues/864") this issue].
+
++table([ "OP", "Description", "Example"])
+    +row
+        +cell #[code !]
+        +cell match exactly 0 times
+        +cell negation
+
+    +row
+        +cell #[code *]
+        +cell match 0 or more times
+        +cell optional, variable number
+
+    +row
+        +cell #[code +]
+        +cell match 1 or more times
+        +cell mandatory, variable number
+
+    +row
+        +cell #[code ?]
+        +cell match 0 or 1 times
+        +cell optional, max one
+
++h(3, "adding-phrase-patterns") Adding phrase patterns
+
+p
+    |  If you need to match large terminology lists, you can also use the
+    |  #[+api("phrasematcher") #[code PhraseMatcher]] and create
+    |  #[+api("doc") #[code Doc]] objects instead of token patterns, which is
+    |  much more efficient overall. The #[code Doc] patterns can contain single
+    |  or multiple tokens.
+
++code.
+    import spacy
+    from spacy.matcher import PhraseMatcher
+
+    nlp = spacy.load('en')
+    matcher = PhraseMatcher(nlp.vocab)
+    terminology_list = ['Barack Obama', 'Angela Merkel', 'Washington, D.C.']
+    patterns = [nlp(text) for text in terminology_list]
+    matcher.add('TerminologyList', None, *patterns)
+
+    doc = nlp(u"German Chancellor Angela Merkel and US President Barack Obama "
+              u"converse in the Oval Office inside the White House in Washington, D.C.")
+    matches = matcher(doc)
+
+p
+    |  Since spaCy is used for processing both the patterns and the text to be
+    |  matched, you won't have to worry about specific tokenization – for
+    |  example, you can simply pass in #[code nlp(u"Washington, D.C.")] and
+    |  won't have to write a complex token pattern covering the exact
+    |  tokenization of the term.
+
++h(3, "on_match") Adding #[code on_match] rules
 
 p
     |  To move on to a more realistic example, let's say you're working with a
@@ -142,7 +266,7 @@ p
                                options={'ents': ['EVENT']})
 
     |  For more info and examples, see the usage guide on
-    |  #[+a("/docs/usage/visualizers") visualizing spaCy].
+    |  #[+a("/usage/visualizers") visualizing spaCy].
 
 p
     |  We can now call the matcher on our documents. The patterns will be
@@ -184,44 +308,7 @@ p
             |  A list of #[code (match_id, start, end)] tuples, describing the
             |  matches. A match tuple describes a span #[code doc[start:end]].
 
-+h(2, "quantifiers") Using operators and quantifiers
-
-p
-    |  The matcher also lets you use quantifiers, specified as the #[code 'OP']
-    |  key. Quantifiers let you define sequences of tokens to be mached, e.g.
-    |  one or more punctuation marks, or specify optional tokens. Note that there
-    |  are no nested or scoped quantifiers – instead, you can build those
-    |  behaviours with #[code on_match] callbacks.
-
-+aside("Problems with quantifiers")
-    |  Using quantifiers may lead to unexpected results when matching
-    |  variable-length patterns, for example if the next token would also be
-    |  matched by the previous token. This problem should be resolved in a future
-    |  release. For more information, see
-    |  #[+a(gh("spaCy") + "/issues/864") this issue].
-
-+table([ "OP", "Description", "Example"])
-    +row
-        +cell #[code !]
-        +cell match exactly 0 times
-        +cell negation
-
-    +row
-        +cell #[code *]
-        +cell match 0 or more times
-        +cell optional, variable number
-
-    +row
-        +cell #[code +]
-        +cell match 1 or more times
-        +cell mandatory, variable number
-
-    +row
-        +cell #[code ?]
-        +cell match 0 or 1 times
-        +cell optional, max one
-
-+h(2, "example1") Example: Using linguistic annotations
++h(3, "example1") Example: Using linguistic annotations
 
 p
     |  Let's say you're analysing user comments and you want to find out what
@@ -246,13 +333,13 @@ p
 p
     |  To get a quick overview of the results, you could collect all sentences
     |  containing a match and render them with the
-    |  #[+a("/docs/usage/visualizers") displaCy visualizer].
+    |  #[+a("/usage/visualizers") displaCy visualizer].
     |  In the callback function, you'll have access to the #[code start] and
     |  #[code end] of each match, as well as the parent #[code Doc]. This lets
     |  you determine the sentence containing the match,
     |  #[code doc[start : end].sent], and calculate the start and end of the
     |  matched span within the sentence. Using displaCy in
-    |  #[+a("/docs/usage/visualizers#manual-usage") "manual" mode] lets you
+    |  #[+a("/usage/visualizers#manual-usage") "manual" mode] lets you
     |  pass in a list of dictionaries containing the text and entities to render.
 
 +code.
@@ -283,7 +370,7 @@ p
     # set manual=True to make displaCy render straight from a dictionary
     displacy.serve(matched_sents, style='ent', manual=True)
 
-+h(2, "example2") Example: Phone numbers
++h(3, "example2") Example: Phone numbers
 
 p
     |  Phone numbers can have many different formats and matching them is often
@@ -321,7 +408,7 @@ p
     |  extend, and doesn't require any training data – only a set of
     |  test cases.
 
-+h(2, "example3") Example: Hashtags and emoji on social media
++h(3, "example3") Example: Hashtags and emoji on social media
 
 p
     |  Social media posts, especially tweets, can be difficult to work with.
diff --git a/website/docs/usage/customizing-tokenizer.jade b/website/usage/_linguistic-features/_tokenization.jade
similarity index 76%
rename from website/docs/usage/customizing-tokenizer.jade
rename to website/usage/_linguistic-features/_tokenization.jade
index f56ce9fb1..182bc31e9 100644
--- a/website/docs/usage/customizing-tokenizer.jade
+++ b/website/usage/_linguistic-features/_tokenization.jade
@@ -1,6 +1,4 @@
-//- 💫 DOCS > USAGE > TOKENIZER
-
-include ../../_includes/_mixins
+//- 💫 DOCS > USAGE > LINGUISTIC FEATURES > TOKENIZATION
 
 p
     |  Tokenization is the task of splitting a text into meaningful segments,
@@ -11,15 +9,14 @@ p
     |  #[code spaces] booleans, which allow you to maintain alignment of the
     |  tokens into the original string.
 
-+h(2, "101") Tokenizer 101
+include ../_spacy-101/_tokenization
 
-include _spacy-101/_tokenization
-
-+h(3, "101-data") Tokenizer data
++h(4, "101-data") Tokenizer data
 
 p
     |  #[strong Global] and #[strong language-specific] tokenizer data is
-    |  supplied via the language data in #[+src(gh("spaCy", "spacy/lang")) spacy/lang].
+    |  supplied via the language data in
+    |  #[+src(gh("spaCy", "spacy/lang")) #[code spacy/lang]].
     |  The tokenizer exceptions define special cases like "don't" in English,
     |  which needs to be split into two tokens: #[code {ORTH: "do"}] and
     |  #[code {ORTH: "n't", LEMMA: "not"}]. The prefixes, suffixes and infixes
@@ -27,26 +24,24 @@ p
     |  (at the end of a sentence), and when to leave token containing periods
     |  intact (abbreviations like "U.S.").
 
-+image
-    include ../../assets/img/docs/language_data.svg
-    .u-text-right
-        +button("/assets/img/docs/language_data.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/language_data.svg")
+    include ../../assets/img/language_data.svg
 
 +infobox
     |  For more details on the language-specific data, see the
-    |  usage guide on #[+a("/docs/usage/adding-languages") adding languages].
+    |  usage guide on #[+a("/usage/adding-languages") adding languages].
 
-+h(2, "special-cases") Adding special case tokenization rules
++h(3, "special-cases") Adding special case tokenization rules
 
 p
-    |  Most domains have at least some idiosyncracies that require custom
+    |  Most domains have at least some idiosyncrasies that require custom
     |  tokenization rules. This could be very certain expressions, or
     |  abbreviations only used in this specific field.
 
 +aside("Language data vs. custom tokenization")
     |  Tokenization rules that are specific to one language, but can be
     |  #[strong generalised across that language] should ideally live in the
-    |  language data in #[+src(gh("spaCy", "spacy/lang")) spacy/lang] – we
+    |  language data in #[+src(gh("spaCy", "spacy/lang")) #[code spacy/lang]] – we
     |  always appreciate pull requests! Anything that's specific to a domain or
     |  text type – like financial trading abbreviations, or Bavarian youth slang
     |  – should be added as a special case rule to your tokenizer instance. If
@@ -69,9 +64,12 @@ p
     special_case = [{ORTH: u'gim', LEMMA: u'give', POS: u'VERB'}, {ORTH: u'me'}]
     nlp.tokenizer.add_special_case(u'gimme', special_case)
     assert [w.text for w in nlp(u'gimme that')] == [u'gim', u'me', u'that']
-    assert [w.lemma_ for w in nlp(u'gimme that')] == [u'give', u'me', u'that']
+    # Pronoun lemma is returned as -PRON-!
+    assert [w.lemma_ for w in nlp(u'gimme that')] == [u'give', u'-PRON-', u'that']
 
 p
+    |  For details on spaCy's custom pronoun lemma #[code -PRON-],
+    |  #[+a("/usage/#pron-lemma") see here].
     |  The special case doesn't have to match an entire whitespace-delimited
     |  substring. The tokenizer will incrementally split off punctuation, and
     |  keep looking up the remaining substring:
@@ -97,7 +95,7 @@ p
     |  #[+api("language") #[code Language]] class itself.
 
 
-+h(2, "how-tokenizer-works") How spaCy's tokenizer works
++h(3, "how-tokenizer-works") How spaCy's tokenizer works
 
 p
     |  spaCy introduces a novel tokenization algorithm, that gives a better
@@ -113,8 +111,8 @@ p
     |  algorithm in Python, optimized for readability rather than performance:
 
 +code.
-    def tokenizer_pseudo_code(text, find_prefix, find_suffix,
-                              find_infixes, special_cases):
+    def tokenizer_pseudo_code(text, special_cases,
+                              find_prefix, find_suffix, find_infixes):
         tokens = []
         for substring in text.split(' '):
             suffixes = []
@@ -162,11 +160,11 @@ p
         |  like hyphens etc.
     +item Once we can't consume any more of the string, handle it as a single token.
 
-+h(2, "native-tokenizers") Customizing spaCy's Tokenizer class
++h(3, "native-tokenizers") Customizing spaCy's Tokenizer class
 
 p
     |  Let's imagine you wanted to create a tokenizer for a new language or
-    |  specific domain. There are four things you would need to define:
+    |  specific domain. There are five things you would need to define:
 
 +list("numbers")
     +item
@@ -188,6 +186,11 @@ p
         |  A function #[code infixes_finditer], to handle non-whitespace
         |  separators, such as hyphens etc.
 
+    +item
+        |  An optional boolean function #[code token_match] matching strings
+        |  that should never be split, overriding the previous rules.
+        |  Useful for things like URLs or numbers.
+
 p
     |  You shouldn't usually need to create a #[code Tokenizer] subclass.
     |  Standard usage is to use #[code re.compile()] to build a regular
@@ -200,10 +203,14 @@ p
 
     prefix_re = re.compile(r'''[\[\("']''')
     suffix_re = re.compile(r'''[\]\)"']''')
+    infix_re = re.compile(r'''[-~]''')
+    simple_url_re = re.compile(r'''^https?://''')
 
     def custom_tokenizer(nlp):
         return Tokenizer(nlp.vocab, prefix_search=prefix_re.search,
-                                    suffix_search=suffix_re.search)
+                                    suffix_search=suffix_re.search,
+                                    infix_finditer=infix_re.finditer,
+                                    token_match=simple_url_re.match)
 
     nlp = spacy.load('en')
     nlp.tokenizer = custom_tokenizer(nlp)
@@ -213,7 +220,7 @@ p
     |  specialize are #[code find_prefix], #[code find_suffix] and
     |  #[code find_infix].
 
-+h(2, "custom-tokenizer") Hooking an arbitrary tokenizer into the pipeline
++h(3, "custom-tokenizer") Hooking an arbitrary tokenizer into the pipeline
 
 p
     |  The tokenizer is the first component of the processing pipeline and the
@@ -222,11 +229,8 @@ p
     |  it takes a text and returns a #[code Doc], whereas all other components
     |  expect to already receive a tokenized #[code Doc].
 
-+image
-    include ../../assets/img/docs/pipeline.svg
-    .u-text-right
-        +button("/assets/img/docs/pipeline.svg", false, "secondary").u-text-tag View large graphic
-
++graphic("/assets/img/pipeline.svg")
+    include ../../assets/img/pipeline.svg
 
 p
     |  To overwrite the existing tokenizer, you need to replace
@@ -243,7 +247,7 @@ p
         +cell unicode
         +cell The raw text to tokenize.
 
-    +footrow
+    +row("foot")
         +cell returns
         +cell #[code Doc]
         +cell The tokenized document.
@@ -282,7 +286,7 @@ p
         def __call__(self, text):
             words = text.split(' ')
             # All tokens 'own' a subsequent space character in this tokenizer
-            spaces = [True] * len(word)
+            spaces = [True] * len(words)
             return Doc(self.vocab, words=words, spaces=spaces)
 
 p
@@ -295,3 +299,36 @@ p
 +code.
     nlp = spacy.load('en')
     nlp.tokenizer = WhitespaceTokenizer(nlp.vocab)
+
++h(3, "own-annotations") Bringing your own annotations
+
+p
+    |  spaCy generally assumes by default that your data is raw text. However,
+    |  sometimes your data is partially annotated, e.g. with pre-existing
+    |  tokenization, part-of-speech tags, etc. The most common situation is
+    |  that you have pre-defined tokenization. If you have a list of strings,
+    |  you can create a #[code Doc] object directly. Optionally, you can also
+    |  specify a list of boolean values, indicating whether each word has a
+    |  subsequent space.
+
++code.
+    doc = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
+
+p
+    |  If provided, the spaces list must be the same length as the words list.
+    |  The spaces list affects the #[code doc.text], #[code span.text],
+    |  #[code token.idx], #[code span.start_char] and #[code span.end_char]
+    |  attributes. If you don't provide a #[code spaces] sequence, spaCy will
+    |  assume that all words are whitespace delimited.
+
++code.
+    good_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'], spaces=[False, True, False, False])
+    bad_spaces = Doc(nlp.vocab, words=[u'Hello', u',', u'world', u'!'])
+    assert bad_spaces.text == u'Hello , world !'
+    assert good_spaces.text == u'Hello, world!'
+
+p
+    |  Once you have a #[+api("doc") #[code Doc]] object, you can write to its
+    |  attributes to set the part-of-speech tags, syntactic dependencies, named
+    |  entities and other attributes. For details, see the respective usage
+    |  pages.
diff --git a/website/usage/_models/_available-models.jade b/website/usage/_models/_available-models.jade
new file mode 100644
index 000000000..b4fa1fc90
--- /dev/null
+++ b/website/usage/_models/_available-models.jade
@@ -0,0 +1,22 @@
+//- 💫 DOCS > USAGE > MODELS > AVAILABE MODELS
+
+p
+    |  Model differences are mostly statistical. In general, we do expect larger
+    |  models to be "better" and more accurate overall. Ultimately, it depends on
+    |  your use case and requirements, and we recommend starting with the default
+    |  models (marked with a star below). For a more detailed overview, see the
+    |  #[+a("/models") models directory].
+
++table(["Name", "Language", "Type"])
+    for models, lang in MODELS
+        for model, i in models
+            - var comps = getModelComponents(model)
+            +row
+                +cell #[+a("/models/" + lang + "#" + model) #[code=model]]
+                    if i == 0
+                        +icon("star", 16).o-icon--inline.u-color-theme
+                +cell #{LANGUAGES[comps.lang]}
+                +cell #{MODEL_META[comps.type]}
+
+.u-text-right
+    +button("/models", true, "primary", "small") View models directory
diff --git a/website/usage/_models/_install-basics.jade b/website/usage/_models/_install-basics.jade
new file mode 100644
index 000000000..a8029cc10
--- /dev/null
+++ b/website/usage/_models/_install-basics.jade
@@ -0,0 +1,33 @@
+//- 💫 DOCS > USAGE > MODELS > INSTALLATION BASICS
+
+p
+    |  The easiest way to download a model is via spaCy's
+    |  #[+api("cli#download") #[code download]] command. It takes care of
+    |  finding the best-matching model compatible with your spaCy installation.
+
+- var models = Object.keys(MODELS).map(function(lang) { return "spacy download " + lang })
++code(false, "bash").
+    # out-of-the-box: download best-matching default model
+    #{Object.keys(MODELS).map(function(l) {return "spacy download " + l}).join('\n')}
+
+    # download best-matching version of specific model for your spaCy installation
+    spacy download en_core_web_sm
+
+    # download exact model version (doesn't create shortcut link)
+    spacy download en_core_web_sm-2.0.0 --direct
+
+p
+    |  The download command will #[+a("/usage/models#download-pip") install the model] via
+    |  pip, place the package in your #[code site-packages] directory and create
+    |  a #[+a("/usage/models#usage") shortcut link] that lets you load the model by a custom
+    |  name. The shortcut link will be the same as the model name used in
+    |  #[code spacy download].
+
++code(false, "bash").
+    pip install spacy
+    spacy download en
+
++code.
+    import spacy
+    nlp = spacy.load('en')
+    doc = nlp(u'This is a sentence.')
diff --git a/website/docs/usage/models.jade b/website/usage/_models/_install.jade
similarity index 65%
rename from website/docs/usage/models.jade
rename to website/usage/_models/_install.jade
index 39c37a816..1d15199a2 100644
--- a/website/docs/usage/models.jade
+++ b/website/usage/_models/_install.jade
@@ -1,38 +1,4 @@
-//- 💫 DOCS > USAGE > MODELS
-
-include ../../_includes/_mixins
-
-p
-    |  As of v1.7.0, models for spaCy can be installed as #[strong Python packages].
-    |  This means that they're a component of your application, just like any
-    |  other module. They're versioned and can be defined as a dependency in your
-    |  #[code requirements.txt]. Models can be installed from a download URL or
-    |  a local directory, manually or via #[+a("https://pypi.python.org/pypi/pip") pip].
-    |  Their data can be located anywhere on your file system.
-
-+aside("Important note")
-    |  If you're upgrading to spaCy v1.7.x or v2.x, you need to
-    |  #[strong download the new models]. If you've trained statistical models
-    |  that use spaCy's annotations, you should #[strong retrain your models]
-    |  after updating spaCy. If you don't retrain, you may suffer train/test
-    |  skew, which might decrease your accuracy.
-
-+quickstart(QUICKSTART_MODELS, "Quickstart", "Install a default model, get the code to load it from within spaCy and an example to test it. For more options, see the section on available models below.")
-    for models, lang in MODELS
-        - var package = (models.length == 1) ? models[0] : models.find(function(m) { return m.def })
-        +qs({lang: lang}) python -m spacy download #{lang}
-        +qs({lang: lang}, "divider")
-        +qs({lang: lang, load: "module"}, "python") import #{package.id}
-        +qs({lang: lang, load: "module"}, "python") nlp = #{package.id}.load()
-        +qs({lang: lang, load: "spacy"}, "python") nlp = spacy.load('#{lang}')
-        +qs({lang: lang, config: "example"}, "python") doc = nlp(u"#{EXAMPLE_SENTENCES[lang]}")
-        +qs({lang: lang, config: "example"}, "python") print([(w.text, w.pos_) for w in doc])
-
-+h(2, "available") Available models
-
-include _models-list
-
-+h(2, "download") Downloading models
+//- 💫 DOCS > USAGE > MODELS > INSTALLATION
 
 +aside("Downloading models in spaCy < v1.7")
     |  In older versions of spaCy, you can still use the old download commands.
@@ -47,37 +13,8 @@ include _models-list
     |  The old models are also #[+a(gh("spacy") + "/tree/v1.6.0") attached to the v1.6.0 release].
     |  To download and install them manually, unpack the archive, drop the
     |  contained directory into #[code spacy/data].
-p
-    |  The easiest way to download a model is via spaCy's
-    |  #[+api("cli#download") #[code download]] command. It takes care of
-    |  finding the best-matching model compatible with your spaCy installation.
 
-- var models = Object.keys(MODELS).map(function(lang) { return "python -m spacy download " + lang })
-+code(false, "bash").
-    # out-of-the-box: download best-matching default model
-    #{Object.keys(MODELS).map(function(l) {return "python -m spacy download " + l}).join('\n')}
-
-    # download best-matching version of specific model for your spaCy installation
-    python -m spacy download en_core_web_md
-
-    # download exact model version (doesn't create shortcut link)
-    python -m spacy download en_core_web_md-1.2.0 --direct
-
-p
-    |  The download command will #[+a("#download-pip") install the model] via
-    |  pip, place the package in your #[code site-packages] directory and create
-    |  a #[+a("#usage") shortcut link] that lets you load the model by a custom
-    |  name. The shortcut link will be the same as the model name used in
-    |  #[code spacy.download].
-
-+code(false, "bash").
-    pip install spacy
-    python -m spacy download en
-
-+code.
-    import spacy
-    nlp = spacy.load('en')
-    doc = nlp(u'This is a sentence.')
+include _install-basics
 
 +h(3, "download-pip") Installation via pip
 
@@ -107,8 +44,8 @@ p
 +infobox
     |  You can also add the direct download link to your application's
     |  #[code requirements.txt]. For more details,
-    |  see the usage guide on
-    |  #[+a("/docs/usage/production-use#models") working with models in production].
+    |  see the section on
+    |  #[+a("/models/#production") working with models in production].
 
 
 +h(3, "download-manual") Manual download and installation
@@ -135,7 +72,7 @@ p
     |  local file system. To use it with spaCy, simply assign it a name by
     |  creating a #[+a("#usage") shortcut link] for the data directory.
 
-+h(2, "usage") Using models with spaCy
++h(3, "usage") Using models with spaCy
 
 p
     |  To load a model, use #[+api("spacy#load") #[code spacy.load()]] with the
@@ -179,8 +116,8 @@ p
     |  model names or IDs. And your system already comes with a native solution
     |  to mapping unicode aliases to file paths: symbolic links.
 
-+code(false, "bash").
-    python -m spacy link [package name or path] [shortcut] [--force]
++code(false, "bash", "$").
+    spacy link [package name or path] [shortcut] [--force]
 
 p
     |  The first argument is the #[strong package name] (if the model was
@@ -190,10 +127,10 @@ p
 
 +code("Examples", "bash").
     # set up shortcut link to load installed package as "en_default"
-    python -m spacy link en_core_web_md en_default
+    spacy link en_core_web_md en_default
 
     # set up shortcut link to load local model as "my_amazing_model"
-    python -m spacy link /Users/you/model my_amazing_model
+    spacy link /Users/you/model my_amazing_model
 
 +infobox("Important note")
     |  In order to create a symlink, your user needs the #[strong required permissions].
@@ -201,7 +138,7 @@ p
     |  privileges, the #[code spacy link] command may fail. The easiest solution
     |  is to re-run the command as admin, or use a #[code virtualenv]. For more
     |  info on this, see the
-    |  #[+a("/docs/usage/#symlink-privilege") troubleshooting guide].
+    |  #[+a("/usage/#symlink-privilege") troubleshooting guide].
 
 +h(3, "usage-import") Importing models as modules
 
@@ -227,15 +164,15 @@ p
     |  #[code spacy.load()].
 
 +infobox
-    |  For more details, see the usage guide on
-    |  #[+a("/docs/usage/production-use#models") working with models in production].
+    |  For more details, see the section on
+    |  #[+a("/models/#production") working with models in production].
 
-+h(2, "own-models") Using your own models
++h(3, "own-models") Using your own models
 
 p
     |  If you've trained your own model, for example for
-    |  #[+a("/docs/usage/adding-languages") additional languages] or
-    |  #[+a("/docs/usage/train-ner") custom named entities], you can save its
+    |  #[+a("/usage/adding-languages") additional languages] or
+    |  #[+a("/usage/training#ner") custom named entities], you can save its
     |  state using the #[+api("language#to_disk") #[code Language.to_disk()]]
     |  method. To make the model more convenient to deploy, we recommend
     |  wrapping it as a Python package.
@@ -243,4 +180,4 @@ p
 +infobox("Saving and loading models")
     |  For more information and a detailed guide on how to package your model,
     |  see the documentation on
-    |  #[+a("/docs/usage/saving-loading#models") saving and loading models].
+    |  #[+a("/usage/training#saving-loading") saving and loading models].
diff --git a/website/usage/_models/_languages.jade b/website/usage/_models/_languages.jade
new file mode 100644
index 000000000..4337b5b99
--- /dev/null
+++ b/website/usage/_models/_languages.jade
@@ -0,0 +1,75 @@
+//- 💫 DOCS > USAGE > MODELS > LANGUAGE SUPPORT
+
+p spaCy currently provides models for the following languages:
+
++table(["Language", "Code", "Language data", "Models"])
+    for models, code in MODELS
+        - var count = Object.keys(models).length
+        +row
+            +cell=LANGUAGES[code]
+            +cell #[code=code]
+            +cell
+                +src(gh("spaCy", "spacy/lang/" + code)) #[code lang/#{code}]
+            +cell
+                +a("/models/" + code) #{count} #{(count == 1) ? "model" : "models"}
+
++h(3, "alpha-support") Alpha tokenization support
+
+p
+    |  Work has started on the following languages. You can help by
+    |  #[+a("/usage/adding-languages#language-data") improving the existing language data]
+    |  and extending the tokenization patterns.
+
++aside("Usage note")
+    |  Note that the alpha languages don't yet come with a language model. In
+    |  order to use them, you have to import them directly, or use
+    |  #[+api("spacy#blank") #[code spacy.blank]]:
+
+    +code.o-no-block.
+        from spacy.lang.fi import Finnish
+        nlp = Finnish()  # use directly
+        nlp = spacy.blank('fi')  # blank instance
+
++table(["Language", "Code", "Language data"])
+    for lang, code in LANGUAGES
+        if !Object.keys(MODELS).includes(code)
+            +row
+                +cell #{LANGUAGES[code]}
+                +cell #[code=code]
+                +cell
+                    +src(gh("spaCy", "spacy/lang/" + code)) #[code lang/#{code}]
+
++infobox("Dependencies")
+    .o-block-small Some language tokenizers require external dependencies.
+
+    +list.o-no-block
+        +item #[strong Chinese]: #[+a("https://github.com/fxsjy/jieba") Jieba]
+        +item #[strong Japanese]: #[+a("https://github.com/mocobeta/janome") Janome]
+        +item #[strong Thai]: #[+a("https://github.com/wannaphongcom/pythainlp") pythainlp]
+        +item #[strong Russian]: #[+a("https://github.com/kmike/pymorphy2") pymorphy2]
+
++h(3, "multi-language") Multi-language support
+    +tag-new(2)
+
+p
+    |  As of v2.0, spaCy supports models trained on more than one language. This
+    |  is especially useful for named entity recognition. The language ID used
+    |  for multi-language or language-neutral models is #[code xx]. The
+    |  language class, a generic subclass containing only the base language data,
+    |  can be found in #[+src(gh("spaCy", "spacy/lang/xx")) #[code lang/xx]].
+
+p
+    |  To load your model with the neutral, multi-language class, simply set
+    |  #[code "language": "xx"] in your
+    |  #[+a("/usage/training#models-generating") model package]'s
+    |  meta.json. You can also import the class directly, or call
+    |  #[+api("util#get_lang_class") #[code util.get_lang_class()]] for
+    |  lazy-loading.
+
++code("Standard import").
+    from spacy.lang.xx import MultiLanguage
+    nlp = MultiLanguage()
+
++code("With lazy-loading").
+    from spacy.util import get_lang_class
+    nlp = get_lang_class('xx')
diff --git a/website/usage/_models/_production.jade b/website/usage/_models/_production.jade
new file mode 100644
index 000000000..43f4b1ba9
--- /dev/null
+++ b/website/usage/_models/_production.jade
@@ -0,0 +1,81 @@
+//- 💫 DOCS > USAGE > MODELS > PRODUCTION USE
+
+p
+    |  If your application depends on one or more models,
+    |  you'll usually want to integrate them into your continuous integration
+    |  workflow and build process. While spaCy provides a range of useful helpers
+    |  for downloading, linking and loading models, the underlying functionality
+    |  is entirely based on native Python packages. This allows your application
+    |  to handle a model like any other package dependency.
+
++infobox("Training models for production")
+    |  For an example of an automated model training and build process, see
+    |  #[+a("/usage/training#example-training-spacy") this example] of how
+    |  we're training and packaging our models for spaCy.
+
++h(3, "models-download") Downloading and requiring model dependencies
+
+p
+    |  spaCy's built-in #[+api("cli#download") #[code download]] command
+    |  is mostly intended as a convenient, interactive wrapper. It performs
+    |  compatibility checks and prints detailed error messages and warnings.
+    |  However, if you're downloading models as part of an automated build
+    |  process, this only adds an unnecessary layer of complexity. If you know
+    |  which models your application needs, you should be specifying them directly.
+
+p
+    |  Because all models are valid Python packages, you can add them to your
+    |  application's #[code requirements.txt]. If you're running your own
+    |  internal PyPi installation, you can simply upload the models there. pip's
+    |  #[+a("https://pip.pypa.io/en/latest/reference/pip_install/#requirements-file-format") requirements file format]
+    |  supports both package names to download via a PyPi server, as well as direct
+    |  URLs.
+
++code("requirements.txt", "text").
+    spacy>=2.0.0,<3.0.0
+    -e #{gh("spacy-models")}/releases/download/en_core_web_sm-2.0.0/en_core_web_sm-2.0.0.tar.gz#en_core_web_sm
+
+p
+    |  Specifying #[code #egg=] with the package name tells pip
+    |  which package to expect from the download URL. This way, the
+    |  package won't be re-downloaded and overwritten if it's already
+    |  installed - just like when you're downloading a package from PyPi.
+
+p
+    |  All models are versioned and specify their spaCy dependency. This ensures
+    |  cross-compatibility and lets you specify exact version requirements for
+    |  each model. If you've trained your own model, you can use the
+    |  #[+api("cli#package") #[code package]] command to generate the required
+    |  meta data and turn it into a loadable package.
+
+
++h(3, "models-loading") Loading and testing models
+
+p
+    |  Downloading models directly via pip won't call spaCy's link
+    |  #[+api("cli#link") #[code link]] command, which creates
+    |  symlinks for model shortcuts. This means that you'll have to run this
+    |  command separately, or use the native #[code import] syntax to load the
+    |  models:
+
++code.
+    import en_core_web_sm
+    nlp = en_core_web_sm.load()
+
+p
+    |  In general, this approach is recommended for larger code bases, as it's
+    |  more "native", and doesn't depend on symlinks or rely on spaCy's loader
+    |  to resolve string names to model packages. If a model can't be
+    |  imported, Python will raise an #[code ImportError] immediately. And if a
+    |  model is imported but not used, any linter will catch that.
+
+p
+    |  Similarly, it'll give you more flexibility when writing tests that
+    |  require loading models. For example, instead of writing your own
+    |  #[code try] and #[code except] logic around spaCy's loader, you can use
+    |  #[+a("http://pytest.readthedocs.io/en/latest/") pytest]'s
+    |  #[+a("https://docs.pytest.org/en/latest/builtin.html#_pytest.outcomes.importorskip") #[code importorskip()]]
+    |  method to only run a test if a specific model or model version is
+    |  installed. Each model package exposes a #[code __version__] attribute
+    |  which you can also use to perform your own version compatibility checks
+    |  before loading a model.
diff --git a/website/usage/_models/_quickstart.jade b/website/usage/_models/_quickstart.jade
new file mode 100644
index 000000000..c8f702cb4
--- /dev/null
+++ b/website/usage/_models/_quickstart.jade
@@ -0,0 +1,17 @@
+//- 💫 DOCS > USAGE > MODELS > QUICKSTART
+
+- QUICKSTART_MODELS[0].options = Object.keys(MODELS).map(m => ({ id: m, title: LANGUAGES[m], checked: m == 'en'}))
++quickstart(QUICKSTART_MODELS, "Quickstart", "Install a default model, get the code to load it from within spaCy and an example to test it. For more options, see the section on available models below.")
+    for models, lang in MODELS
+        - var package = models[0]
+        +qs({lang: lang}) spacy download #{lang}
+        +qs({lang: lang}, "divider")
+        +qs({lang: lang, load: "module"}, "python") import #{package}
+        +qs({lang: lang, load: "module"}, "python") nlp = #{package}.load()
+        +qs({lang: lang, load: "spacy"}, "python") nlp = spacy.load('#{lang}')
+        +qs({lang: lang, config: "example"}, "python") doc = nlp(u"#{EXAMPLE_SENTENCES[lang]}")
+
+        if lang != "xx"
+            +qs({lang: lang, config: "example"}, "python") print([(w.text, w.pos_) for w in doc])
+        else
+            +qs({lang: lang, config: "example"}, "python") print([(ent.text, ent.label) for ent in doc.ents])
diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
new file mode 100644
index 000000000..ea3ea9b97
--- /dev/null
+++ b/website/usage/_processing-pipelines/_custom-components.jade
@@ -0,0 +1,369 @@
+//- 💫 DOCS > USAGE > PROCESSING PIPELINES > CUSTOM COMPONENTS
+
+p
+    |  A component receives a #[code Doc] object and can modify it – for example,
+    |  by using the current weights to make a prediction and set some annotation
+    |  on the document. By adding a component to the pipeline, you'll get access
+    |  to the #[code Doc] at any point #[strong during processing] – instead of
+    |  only being able to modify it afterwards.
+
++aside-code("Example").
+    def my_component(doc):
+        # do something to the doc here
+        return doc
+
++table(["Argument", "Type", "Description"])
+    +row
+        +cell #[code doc]
+        +cell #[code Doc]
+        +cell The #[code Doc] object processed by the previous component.
+
+    +row("foot")
+        +cell returns
+        +cell #[code Doc]
+        +cell The #[code Doc] object processed by this pipeline component.
+
+p
+    |  Custom components can be added to the pipeline using the
+    |  #[+api("language#add_pipe") #[code add_pipe]] method. Optionally, you
+    |  can either specify a component to add it #[strong before or after], tell
+    |  spaCy to add it #[strong first or last] in the pipeline, or define a
+    |  #[strong custom name]. If no name is set and no #[code name] attribute
+    |  is present on your component, the function name is used.
+
++code("Adding pipeline components").
+    def my_component(doc):
+        print("After tokenization, this doc has %s tokens." % len(doc))
+        if len(doc) < 10:
+            print("This is a pretty short document.")
+        return doc
+
+    nlp = spacy.load('en')
+    nlp.pipeline.add_pipe(my_component, name='print_info', first=True)
+    print(nlp.pipe_names) # ['print_info', 'tagger', 'parser', 'ner']
+    doc = nlp(u"This is a sentence.")
+
+p
+    |  Of course, you can also wrap your component as a class to allow
+    |  initialising it with custom settings and hold state within the component.
+    |  This is useful for #[strong stateful components], especially ones which
+    |  #[strong depend on shared data].
+
++code.
+    class MyComponent(object):
+        name = 'print_info'
+
+        def __init__(vocab, short_limit=10):
+            self.vocab = nlp.vocab
+            self.short_limit = short_limit
+
+        def __call__(doc):
+            if len(doc) < self.short_limit:
+                print("This is a pretty short document.")
+            return doc
+
+    my_component = MyComponent(nlp.vocab, short_limit=25)
+    nlp.add_pipe(my_component, first=True)
+
++h(3, "custom-components-attributes")
+    |  Extension attributes on #[code Doc], #[code Span] and #[code Token]
+    +tag-new(2)
+
+p
+    |  As of v2.0, spaCy allows you to set any custom attributes and methods
+    |  on the #[code Doc], #[code Span] and #[code Token], which become
+    |  available as #[code Doc._], #[code Span._] and #[code Token._] – for
+    |  example, #[code Token._.my_attr]. This lets you store additional
+    |  information relevant to your application, add new features and
+    |  functionality to spaCy, and implement your own models trained with other
+    |  machine learning libraries. It also lets you take advantage of spaCy's
+    |  data structures and the #[code Doc] object as the "single source of
+    |  truth".
+
++aside("Why ._?")
+    |  Writing to a #[code ._] attribute instead of to the #[code Doc] directly
+    |  keeps a clearer separation and makes it easier to ensure backwards
+    |  compatibility. For example, if you've implemented your own #[code .coref]
+    |  property and spaCy claims it one day, it'll break your code. Similarly,
+    |  just by looking at the code, you'll immediately know what's built-in and
+    |  what's custom – for example, #[code doc.sentiment] is spaCy, while
+    |  #[code doc._.sent_score] isn't.
+
+p
+    |  There are three main types of extensions, which can be defined using the
+    |  #[+api("doc#set_extension") #[code Doc.set_extension]],
+    |  #[+api("span#set_extension") #[code Span.set_extension]] and
+    |  #[+api("token#set_extension") #[code Token.set_extension]] methods.
+
++list("numbers")
+    +item #[strong Attribute extensions].
+        |  Set a default value for an attribute, which can be overwritten
+        |  manually at any time. Attribute extensions work like "normal"
+        |  variables and are the quickest way to store arbitrary information
+        |  on a #[code Doc], #[code Span] or #[code Token].
+
+        +code-wrapper
+            +code.
+                Doc.set_extension('hello', default=True)
+                assert doc._.hello
+                doc._.hello = False
+
+    +item #[strong Property extensions].
+        |  Define a getter and an optional setter function. If no setter is
+        |  provided, the extension is immutable. Since the getter and setter
+        |  functions are only called when you #[em retrieve] the attribute,
+        |  you can also access values of previously added attribute extensions.
+        |  For example, a #[code Doc] getter can average over #[code Token]
+        |   attributes. For #[code Span] extensions, you'll almost always want
+        |  to use a property – otherwise, you'd have to write to
+        |  #[em every possible] #[code Span] in the #[code Doc] to set up the
+        |  values correctly.
+
+        +code-wrapper
+            +code.
+                Doc.set_extension('hello', getter=get_hello_value, setter=set_hello_value)
+                assert doc._.hello
+                doc._.hello = 'Hi!'
+
+    +item #[strong Method extensions].
+        |  Assign a function that becomes available as an object method. Method
+        |  extensions are always immutable. For more details and implementation
+        |  ideas, see
+        |  #[+a("/usage/examples#custom-components-attr-methods") these examples].
+
+        +code-wrapper
+            +code.o-no-block.
+                Doc.set_extension('hello', method=lambda doc, name: 'Hi {}!'.format(name))
+                assert doc._.hello('Bob') == 'Hi Bob!'
+
+p
+    |  Before you can access a custom extension, you need to register it using
+    |  the #[code set_extension] method on the object you want
+    |  to add it to, e.g. the #[code Doc]. Keep in mind that extensions are
+    |  always #[strong added globally] and not just on a particular instance.
+    |  If an attribute of the same name
+    |  already exists, or if you're trying to access an attribute that hasn't
+    |  been registered, spaCy will raise an #[code AttributeError].
+
++code("Example").
+    from spacy.tokens import Doc, Span, Token
+
+    fruits = ['apple', 'pear', 'banana', 'orange', 'strawberry']
+    is_fruit_getter = lambda token: token.text in fruits
+    has_fruit_getter = lambda obj: any([t.text in fruits for t in obj])
+
+    Token.set_extension('is_fruit', getter=is_fruit_getter)
+    Doc.set_extension('has_fruit', getter=has_fruit_getter)
+    Span.set_extension('has_fruit', getter=has_fruit_getter)
+
++aside-code("Usage example").
+    doc = nlp(u"I have an apple and a melon")
+    assert doc[3]._.is_fruit      # get Token attributes
+    assert not doc[0]._.is_fruit
+    assert doc._.has_fruit        # get Doc attributes
+    assert doc[1:4]._.has_fruit   # get Span attributes
+
+p
+    |  Once you've registered your custom attribute, you can also use the
+    |  built-in #[code set], #[code get] and #[code has] methods to modify and
+    |  retrieve the attributes. This is especially useful it you want to pass in
+    |  a string instead of calling #[code doc._.my_attr].
+
++table(["Method", "Description", "Valid for", "Example"])
+    +row
+        +cell #[code ._.set()]
+        +cell Set a value for an attribute.
+        +cell Attributes, mutable properties.
+        +cell #[code.u-break token._.set('my_attr', True)]
+
+    +row
+        +cell #[code ._.get()]
+        +cell Get the value of an attribute.
+        +cell Attributes, mutable properties, immutable properties, methods.
+        +cell #[code.u-break my_attr = span._.get('my_attr')]
+
+    +row
+        +cell #[code ._.has()]
+        +cell Check if an attribute exists.
+        +cell Attributes, mutable properties, immutable properties, methods.
+        +cell #[code.u-break doc._.has('my_attr')]
+
++infobox("How the ._ is implemented")
+    |  Extension definitions – the defaults, methods, getters and setters you
+    |  pass in to #[code set_extension] are stored in class attributes on the
+    |  #[code Underscore] class. If you write to an extension attribute, e.g.
+    |  #[code doc._.hello = True], the data is stored within the
+    |  #[+api("doc#attributes") #[code Doc.user_data]] dictionary. To keep the
+    |  underscore data separate from your other dictionary entries, the string
+    |  #[code "._."] is placed before the name, in a tuple.
+
++h(4, "component-example1") Example: Custom sentence segmentation logic
+
+p
+    |  Let's say you want to implement custom logic to improve spaCy's sentence
+    |  boundary detection. Currently, sentence segmentation is based on the
+    |  dependency parse, which doesn't always produce ideal results. The custom
+    |  logic should therefore be applied #[strong after] tokenization, but
+    |  #[strong before] the dependency parsing – this way, the parser can also
+    |  take advantage of the sentence boundaries.
+
++code.
+    def sbd_component(doc):
+        for i, token in enumerate(doc[:-2]):
+            # define sentence start if period + titlecase token
+            if token.text == '.' and doc[i+1].is_title:
+                doc[i+1].sent_start = True
+        return doc
+
+    nlp = spacy.load('en')
+    nlp.add_pipe(sbd_component, before='parser')  # insert before the parser
+
++h(4, "component-example2")
+    |  Example: Pipeline component for entity matching and tagging with
+    |  custom attributes
+
+p
+    |  This example shows how to create a spaCy extension that takes a
+    |  terminology list (in this case, single- and multi-word company names),
+    |  matches the occurences in a document, labels them as #[code ORG] entities,
+    |  merges the tokens and sets custom #[code is_tech_org] and
+    |  #[code has_tech_org] attributes. For efficient matching, the example uses
+    |  the #[+api("phrasematcher") #[code PhraseMatcher]] which accepts
+    |  #[code Doc] objects as match patterns and works well for large
+    |  terminology lists. It also ensures your patterns will always match, even
+    |  when you customise spaCy's tokenization rules. When you call #[code nlp]
+    |  on a text, the custom pipeline component is applied to the #[code Doc]
+
++github("spacy", "examples/pipeline/custom_component_entities.py", false, 500)
+
+p
+    |  Wrapping this functionality in a
+    |  pipeline component allows you to reuse the module with different
+    |  settings, and have all pre-processing taken care of when you call
+    |  #[code nlp] on your text and receive a #[code Doc] object.
+
++h(4, "component-example3")
+    |  Example: Pipeline component for GPE entities and country meta data via a
+    |  REST API
+
+p
+    |  This example shows the implementation of a pipeline component
+    |  that fetches country meta data via the
+    |  #[+a("https://restcountries.eu") REST Countries API] sets entity
+    |  annotations for countries, merges entities into one token and
+    |  sets custom attributes on the #[code Doc], #[code Span] and
+    |  #[code Token] – for example, the capital, latitude/longitude coordinates
+    |  and even the country flag.
+
++github("spacy", "examples/pipeline/custom_component_countries_api.py", false, 500)
+
+p
+    |  In this case, all data can be fetched on initialisation in one request.
+    |  However, if you're working with text that contains incomplete country
+    |  names, spelling mistakes or foreign-language versions, you could also
+    |  implement a #[code like_country]-style getter function that makes a
+    |  request to the search API endpoint and returns the best-matching
+    |  result.
+
++h(4, "custom-components-usage-ideas") Other usage ideas
+
++list
+    +item
+        |  #[strong Adding new features and hooking in models]. For example,
+        |  a sentiment analysis model, or your preferred solution for
+        |  lemmatization or sentiment analysis. spaCy's built-in tagger,
+        |  parser and entity recognizer respect annotations that were already
+        |  set on the #[code Doc] in a previous step of the pipeline.
+    +item
+        |  #[strong Integrating other libraries and APIs]. For example, your
+        |  pipeline component can write additional information and data
+        |  directly to the #[code Doc] or #[code Token] as custom attributes,
+        |  while making sure no information is lost in the process. This can
+        |  be output generated by other libraries and models, or an external
+        |  service with a REST API.
+    +item
+        |  #[strong Debugging and logging]. For example, a component which
+        |  stores and/or exports relevant information about the current state
+        |  of the processed document, and insert it at any point of your
+        |  pipeline.
+
++infobox("Developing third-party extensions")
+    |  The new pipeline management and custom attributes finally make it easy
+    |  to develop your own spaCy extensions and plugins and share them with
+    |  others. Extensions can claim their own #[code ._] namespace and exist as
+    |  standalone packages. If you're developing a tool or library and want to
+    |  make it easy for others to use it with spaCy and add it to their
+    |  pipeline, all you have to do is expose a function that takes a
+    |  #[code Doc], modifies it and returns it. For more details and
+    |  #[strong best practices], see the section on
+    |  #[+a("#extensions") developing spaCy extensions].
+
++h(3, "custom-components-user-hooks") User hooks
+
+p
+    |  While it's generally recommended to use the #[code Doc._], #[code Span._]
+    |  and #[code Token._] proxies to add your own custom attributes, spaCy
+    |  offers a few exceptions to allow #[strong customising the built-in methods]
+    |  like #[+api("doc#similarity") #[code Doc.similarity]] or
+    |  #[+api("doc#vector") #[code Doc.vector]]. with your own hooks, which can
+    |  rely on statistical models you train yourself. For instance, you can
+    |  provide your own on-the-fly sentence segmentation algorithm or document
+    |  similarity method.
+
+p
+    |  Hooks let you customize some of the behaviours of the #[code Doc],
+    |  #[code Span] or #[code Token] objects by adding a component to the
+    |  pipeline. For instance, to customize the
+    |  #[+api("doc#similarity") #[code Doc.similarity]] method, you can add a
+    |  component that sets a custom function to
+    |  #[code doc.user_hooks['similarity']]. The built-in #[code Doc.similarity]
+    |  method will check the #[code user_hooks] dict, and delegate to your
+    |  function if you've set one. Similar results can be achieved by setting
+    |  functions to #[code Doc.user_span_hooks] and #[code Doc.user_token_hooks].
+
++aside("Implementation note")
+    |  The hooks live on the #[code Doc] object because the #[code Span] and
+    |  #[code Token] objects are created lazily, and don't own any data. They
+    |  just proxy to their parent #[code Doc]. This turns out to be convenient
+    |  here — we only have to worry about installing hooks in one place.
+
++table(["Name", "Customises"])
+    +row
+        +cell #[code user_hooks]
+        +cell
+            +api("doc#vector") #[code Doc.vector]
+            +api("doc#has_vector") #[code Doc.has_vector]
+            +api("doc#vector_norm") #[code Doc.vector_norm]
+            +api("doc#sents") #[code Doc.sents]
+
+    +row
+        +cell #[code user_token_hooks]
+        +cell
+            +api("token#similarity") #[code Token.similarity]
+            +api("token#vector") #[code Token.vector]
+            +api("token#has_vector") #[code Token.has_vector]
+            +api("token#vector_norm") #[code Token.vector_norm]
+            +api("token#conjuncts") #[code Token.conjuncts]
+
+    +row
+        +cell #[code user_span_hooks]
+        +cell
+            +api("span#similarity") #[code Span.similarity]
+            +api("span#vector") #[code Span.vector]
+            +api("span#has_vector") #[code Span.has_vector]
+            +api("span#vector_norm") #[code Span.vector_norm]
+            +api("span#root") #[code Span.root]
+
++code("Add custom similarity hooks").
+    class SimilarityModel(object):
+        def __init__(self, model):
+            self._model = model
+
+        def __call__(self, doc):
+            doc.user_hooks['similarity'] = self.similarity
+            doc.user_span_hooks['similarity'] = self.similarity
+            doc.user_token_hooks['similarity'] = self.similarity
+
+        def similarity(self, obj1, obj2):
+            y = self._model([obj1.vector, obj2.vector])
+            return float(y[0])
diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
new file mode 100644
index 000000000..795d2d7c5
--- /dev/null
+++ b/website/usage/_processing-pipelines/_extensions.jade
@@ -0,0 +1,111 @@
+//- 💫 DOCS > USAGE > PROCESSING PIPELINES > DEVELOPING EXTENSIONS
+
+p
+    |  We're very excited about all the new possibilities for community
+    |  extensions and plugins in spaCy v2.0, and we can't wait to see what
+    |  you build with it! To get you started, here are a few tips, tricks and
+    |  best practices. For examples of other spaCy extensions, see the
+    |  #[+a("/usage/resources#extensions") resources].
+
++list
+    +item
+        |  Make sure to choose a #[strong descriptive and specific name] for
+        |  your pipeline component class, and set it as its #[code name]
+        |  attribute. Avoid names that are too common or likely to clash with
+        |  built-in or a user's other custom components. While it's fine to call
+        |  your package "spacy_my_extension", avoid component names including
+        |  "spacy", since this can easily lead to confusion.
+
+        +code-wrapper
+            +code-new name = 'myapp_lemmatizer'
+            +code-old name = 'lemmatizer'
+
+    +item
+        |  When writing to #[code Doc], #[code Token] or #[code Span] objects,
+        |  #[strong use getter functions] wherever possible, and avoid setting
+        |  values explicitly. Tokens and spans don't own any data themselves,
+        |  so you should provide a function that allows them to compute the
+        |  values instead of writing static properties to individual objects.
+
+        +code-wrapper
+            +code-new.
+                is_fruit = lambda token: token.text in ('apple', 'orange')
+                Token.set_extension('is_fruit', getter=is_fruit)
+            +code-old.
+                token._.set_extension('is_fruit', default=False)
+                if token.text in ('apple', 'orange'):
+                    token._.set('is_fruit', True)
+
+    +item
+        |  Always add your custom attributes to the #[strong global] #[code Doc]
+        |  #[code Token] or #[code Span] objects, not a particular instance of
+        |  them. Add the attributes #[strong as early as possible], e.g. in
+        |  your extension's #[code __init__] method or in the global scope of
+        |  your module. This means that in the case of namespace collisions,
+        |  the user will see an error immediately, not just when they run their
+        |  pipeline.
+
+        +code-wrapper
+            +code-new.
+                from spacy.tokens import Doc
+                def __init__(attr='my_attr'):
+                    Doc.set_extension(attr, getter=self.get_doc_attr)
+            +code-old.
+                def __call__(doc):
+                    doc.set_extension('my_attr', getter=self.get_doc_attr)
+
+    +item
+        |  If your extension is setting properties on the #[code Doc],
+        |  #[code Token] or #[code Span], include an option to
+        |  #[strong let the user to change those attribute names]. This makes
+        |  it easier to avoid namespace collisions and accommodate users with
+        |  different naming preferences. We recommend adding an #[code attrs]
+        |  argument to the #[code __init__] method of your class so you can
+        |  write the names to class attributes and reuse them across your
+        |  component.
+
+        +code-wrapper
+            +code-new Doc.set_extension(self.doc_attr, default='some value')
+            +code-old Doc.set_extension('my_doc_attr', default='some value')
+
+    +item
+        |  Ideally, extensions should be #[strong standalone packages] with
+        |  spaCy and optionally, other packages specified as a dependency. They
+        |  can freely assign to their own #[code ._] namespace, but should stick
+        |  to that. If your extension's only job is to provide a better
+        |  #[code .similarity] implementation, and your docs state this
+        |  explicitly, there's no problem with writing to the
+        |  #[+a("#custom-components-user-hooks") #[code user_hooks]], and
+        |  overwriting spaCy's built-in method. However, a third-party
+        |  extension should #[strong never silently overwrite built-ins], or
+        |  attributes set by other extensions.
+
+    +item
+        |  If you're looking to publish a model that depends on a custom
+        |  pipeline component, you can either #[strong require it] in the model
+        |  package's dependencies, or – if the component is specific and
+        |  lightweight – choose to #[strong ship it with your model package]
+        |  and add it to the #[code Language] instance returned by the
+        |  model's #[code load()] method. For examples of this, check out the
+        |  implementations of spaCy's
+        |  #[+api("util#load_model_from_init_py") #[code load_model_from_init_py()]]
+        |  and  #[+api("util#load_model_from_path") #[code load_model_from_path()]]
+        |  utility functions.
+
+        +code-wrapper
+            +code-new.
+                nlp.add_pipe(my_custom_component)
+                return nlp.from_disk(model_path)
+
+    +item
+        |  Once you're ready to share your extension with others, make sure to
+        |  #[strong add docs and installation instructions] (you can
+        |  always link to this page for more info). Make it easy for others to
+        |  install and use your extension, for example by uploading it to
+        |  #[+a("https://pypi.python.org") PyPi]. If you're sharing your code on
+        |  GitHub, don't forget to tag it
+        |  with #[+a("https://github.com/search?q=topic%3Aspacy") #[code spacy]]
+        |  and #[+a("https://github.com/search?q=topic%3Aspacy-extensions") #[code spacy-extensions]]
+        |  to help people find it. If you post it on Twitter, feel free to tag
+        |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}]
+        |  so we can check it out.
diff --git a/website/usage/_processing-pipelines/_multithreading.jade b/website/usage/_processing-pipelines/_multithreading.jade
new file mode 100644
index 000000000..1e08508b8
--- /dev/null
+++ b/website/usage/_processing-pipelines/_multithreading.jade
@@ -0,0 +1,40 @@
+//- 💫 DOCS > USAGE > PROCESSING PIPELINES > MULTI-THREADING
+
+p
+    |  If you have a sequence of documents to process, you should use the
+    |  #[+api("language#pipe") #[code Language.pipe()]] method. The method takes
+    |  an iterator of texts, and accumulates an internal buffer,
+    |  which it works on in parallel. It then yields the documents in order,
+    |  one-by-one. After a long and bitter struggle, the global interpreter
+    |  lock was freed around spaCy's main parsing loop in v0.100.3. This means
+    |  that #[code .pipe()] will be significantly faster in most
+    |  practical situations, because it allows shared memory parallelism.
+
++code.
+    for doc in nlp.pipe(texts, batch_size=10000, n_threads=3):
+       pass
+
+p
+    |  To make full use of the #[code .pipe()] function, you might want to
+    |  brush up on #[strong Python generators]. Here are a few quick hints:
+
++list
+    +item
+        |  Generator comprehensions can be written as
+        |  #[code (item for item in sequence)].
+
+    +item
+        |  The
+        |  #[+a("https://docs.python.org/2/library/itertools.html") #[code itertools] built-in library]
+        |  and the
+        |  #[+a("https://github.com/pytoolz/cytoolz") #[code cytoolz] package]
+        |  provide a lot of handy #[strong generator tools].
+
+    +item
+        |  Often you'll have an input stream that pairs text with some
+        |  important meta data, e.g. a JSON document. To
+        |  #[strong pair up the meta data] with the processed #[code Doc]
+        |  object, you should use the #[code itertools.tee] function to split
+        |  the generator in two, and then #[code izip] the extra stream to the
+        |  document stream. Here's
+        |  #[+a(gh("spacy") + "/issues/172#issuecomment-183963403") an example].
diff --git a/website/usage/_processing-pipelines/_pipelines.jade b/website/usage/_processing-pipelines/_pipelines.jade
new file mode 100644
index 000000000..3c1c28af1
--- /dev/null
+++ b/website/usage/_processing-pipelines/_pipelines.jade
@@ -0,0 +1,154 @@
+//- 💫 DOCS > USAGE > PROCESSING PIPELINES > PIPELINES
+
+p
+    |  spaCy makes it very easy to create your own pipelines consisting of
+    |  reusable components – this includes spaCy's default tensorizer, tagger,
+    |  parser and entity regcognizer, but also your own custom processing
+    |  functions. A pipeline component can be added to an already existing
+    |  #[code nlp] object, specified when initialising a #[code Language] class,
+    |  or defined within a
+    |  #[+a("/usage/saving-loading#models-generating") model package].
+
+p
+    |  When you load a model, spaCy first consults the model's
+    |  #[+a("/usage/saving-loading#models-generating") #[code meta.json]]. The
+    |  meta typically includes the model details, the ID of a language class,
+    |  and an optional list of pipeline components. spaCy then does the
+    |  following:
+
++aside-code("meta.json (excerpt)", "json").
+    {
+        "name": "example_model",
+        "lang": "en"
+        "description": "Example model for spaCy",
+        "pipeline": ["tagger", "parser"]
+    }
+
++list("numbers")
+    +item
+        |  Load the #[strong language class and data] for the given ID via
+        |  #[+api("util.get_lang_class") #[code get_lang_class]] and initialise
+        |  it. The #[code Language] class contains the shared vocabulary,
+        |  tokenization rules and the language-specific annotation scheme.
+    +item
+        |  Iterate over the #[strong pipeline names] and create each component
+        |  using #[+api("language#create_pipe") #[code create_pipe]], which
+        |  looks them up in #[code Language.factories].
+    +item
+        |  Add each pipeline component to the pipeline in order, using
+        |  #[+api("language#add_pipe") #[code add_pipe]].
+    +item
+        |  Make the #[strong model data] available to the #[code Language] class
+        |  by calling #[+api("language#from_disk") #[code from_disk]] with the
+        |  path to the model data ditectory.
+
+p
+    |  So when you call this...
+
++code.
+    nlp = spacy.load('en')
+
+p
+    | ... the model tells spaCy to use the language #[code "en"] and the pipeline
+    |  #[code.u-break ["tensorizer", "tagger", "parser", "ner"]]. spaCy will
+    |  then initialise #[code spacy.lang.en.English], and create each pipeline
+    |  component and add it to the processing pipeline. It'll then load in the
+    |  model's data from its data ditectory and return the modified
+    |  #[code Language] class for you to use as the #[code nlp] object.
+
+p
+    |  Fundamentally, a #[+a("/models") spaCy model] consists of three
+    |  components: #[strong the weights], i.e. binary data loaded in from a
+    |  directory, a #[strong pipeline] of functions called in order,
+    |  and #[strong language data] like the tokenization rules and annotation
+    |  scheme. All of this is specific to each model, and defined in the
+    |  model's #[code meta.json] – for example, a Spanish NER model requires
+    |  different weights, language data and pipeline components than an English
+    |  parsing and tagging model. This is also why the pipeline state is always
+    |  held by the #[code Language] class.
+    |  #[+api("spacy#load") #[code spacy.load]] puts this all together and
+    |  returns an instance of #[code Language]  with a pipeline set and access
+    |  to the binary data:
+
++code("spacy.load under the hood").
+    lang = 'en'
+    pipeline = ['tensorizer', 'tagger', 'parser', 'ner']
+    data_path = 'path/to/en_core_web_sm/en_core_web_sm-2.0.0'
+
+    cls = spacy.util.get_lang_class(lang)   # 1. get Language instance, e.g. English()
+    nlp = cls()                             # 2. initialise it
+    for name in pipeline:
+        component = nlp.create_pipe(name)   # 3. create the pipeline components
+        nlp.add_pipe(component)             # 4. add the component to the pipeline
+    nlp.from_disk(model_data_path)          # 5. load in the binary data
+
+p
+    |  When you call #[code nlp] on a text, spaCy will #[strong tokenize] it and
+    |  then #[strong call each component] on the #[code Doc], in order.
+    |  Since the model data is loaded, the components can access it to assign
+    |  annotations to the #[code Doc] object, and subsequently to the
+    |  #[code Token] and #[code Span] which are only views of the #[code Doc],
+    |  and don't own any data themselves. All components return the modified
+    |  document, which is then processed by the component next in the pipeline.
+
++code("The pipeline under the hood").
+    doc = nlp.make_doc(u'This is a sentence')   # create a Doc from raw text
+    for name, proc in nlp.pipeline:             # iterate over components in order
+        doc = proc(doc)                         # apply each component
+
+p
+    |  The current processing pipeline is available as #[code nlp.pipeline],
+    |  which returns a list of #[code (name, component)] tuples, or
+    |  #[code nlp.pipe_names], which only returns a list of human-readable
+    |  component names.
+
++code.
+    nlp.pipeline
+    # [('tagger', <spacy.pipeline.Tagger>), ('parser', <spacy.pipeline.DependencyParser>), ('ner', <spacy.pipeline.EntityRecognizer>)]
+    nlp.pipe_names
+    # ['tagger', 'parser', 'ner']
+
++h(3, "disabling") Disabling and modifying pipeline components
+
+p
+    |  If you don't need a particular component of the pipeline – for
+    |  example, the tagger or the parser, you can disable loading it. This can
+    |  sometimes make a big difference and improve loading speed. Disabled
+    |  component names can be provided to #[+api("spacy#load") #[code spacy.load()]],
+    |  #[+api("language#from_disk") #[code Language.from_disk()]] or the
+    |  #[code nlp] object itself as a list:
+
++code.
+    nlp = spacy.load('en', disable['parser', 'tagger'])
+    nlp = English().from_disk('/model', disable=['tensorizer', 'ner'])
+
+p
+    |  You can also use the #[+api("language#remove_pipe") #[code remove_pipe]]
+    |  method to remove pipeline components from an existing pipeline, the
+    |  #[+api("language#rename_pipe") #[code rename_pipe]] method to rename them,
+    |  or the #[+api("language#replace_pipe") #[code replace_pipe]] method
+    |  to replace them with a custom component entirely (more details on this
+    |  in the section on #[+a("#custom-components") custom components].
+
++code.
+    nlp.remove_pipe('parser')
+    nlp.rename_pipe('ner', 'entityrecognizer')
+    nlp.replace_pipe('tagger', my_custom_tagger)
+
++infobox("Important note: disabling pipeline components")
+    .o-block
+        |  Since spaCy v2.0 comes with better support for customising the
+        |  processing pipeline components, the #[code parser], #[code tagger]
+        |  and #[code entity] keyword arguments have been replaced with
+        |  #[code disable], which takes a list of pipeline component names.
+        |  This lets you disable pre-defined components when loading
+        |  a model, or initialising a Language class via
+        |  #[+api("language-from_disk") #[code from_disk]].
+
+    +code-new.
+        nlp = spacy.load('en', disable=['ner'])
+        nlp.remove_pipe('parser')
+        doc = nlp(u"I don't want parsed")
+    +code-old.
+        nlp = spacy.load('en', tagger=False, entity=False)
+        doc = nlp(u"I don't want parsed", parse=False)
diff --git a/website/usage/_processing-pipelines/_serialization.jade b/website/usage/_processing-pipelines/_serialization.jade
new file mode 100644
index 000000000..e29cbc558
--- /dev/null
+++ b/website/usage/_processing-pipelines/_serialization.jade
@@ -0,0 +1,38 @@
+//- 💫 DOCS > USAGE > PROCESSING PIPELINES > SERIALIZATION
+
+include ../_spacy-101/_serialization
+
++infobox("Important note")
+    |  In spaCy v2.0, the API for saving and loading has changed to only use the
+    |  four methods listed above consistently across objects and classes. For an
+    |  overview of the changes, see #[+a("/usage/v2#incompat") this table]
+    |  and the notes on #[+a("/usage/v2#migrating-saving-loading") migrating].
+
++h(3, "example-doc") Example: Saving and loading a document
+
+p
+    |  For simplicity, let's assume you've
+    |  #[+a("/usage/entity-recognition#setting") added custom entities] to
+    |  a #[code Doc], either manually, or by using a
+    |  #[+a("/usage/rule-based-matching#on_match") match pattern]. You can
+    |  save it locally by calling #[+api("doc#to_disk") #[code Doc.to_disk()]],
+    |  and load it again via #[+api("doc#from_disk") #[code Doc.from_disk()]].
+    |  This will overwrite the existing object and return it.
+
++code.
+    import spacy
+    from spacy.tokens import Span
+
+    text = u'Netflix is hiring a new VP of global policy'
+
+    nlp = spacy.load('en')
+    doc = nlp(text)
+    assert len(doc.ents) == 0 # Doc has no entities
+    doc.ents += ((Span(doc, 0, 1, label=doc.vocab.strings[u'ORG'])) # add entity
+    doc.to_disk('/path/to/doc') # save Doc to disk
+
+    new_doc = nlp(text)
+    assert len(new_doc.ents) == 0 # new Doc has no entities
+    new_doc = new_doc.from_disk('path/to/doc') # load from disk and overwrite
+    assert len(new_doc.ents) == 1 # entity is now recognised!
+    assert [(ent.text, ent.label_) for ent in new_doc.ents] == [(u'Netflix', u'ORG')]
diff --git a/website/docs/usage/_spacy-101/_architecture.jade b/website/usage/_spacy-101/_architecture.jade
similarity index 83%
rename from website/docs/usage/_spacy-101/_architecture.jade
rename to website/usage/_spacy-101/_architecture.jade
index c5a85f0b0..c9b299036 100644
--- a/website/docs/usage/_spacy-101/_architecture.jade
+++ b/website/usage/_spacy-101/_architecture.jade
@@ -20,18 +20,12 @@ p
     |  returning an #[strong annotated document]. It also orchestrates training
     |  and serialization.
 
-+image
-    include ../../../assets/img/docs/architecture.svg
-    .u-text-right
-        +button("/assets/img/docs/architecture.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/architecture.svg")
+    include ../../assets/img/architecture.svg
+
++h(3, "architecture-containers") Container objects
 
 +table(["Name", "Description"])
-    +row
-        +cell #[+api("language") #[code Language]]
-        +cell
-            |  A text-processing pipeline. Usually you'll load this once per
-            |  process as #[code nlp] and pass the instance around your application.
-
     +row
         +cell #[+api("doc") #[code Doc]]
         +cell A container for accessing linguistic annotations.
@@ -53,43 +47,25 @@ p
             |  opposed to a word token. It therefore has no part-of-speech tag,
             |  dependency parse etc.
 
-    +row
-        +cell #[+api("vocab") #[code Vocab]]
-        +cell
-            |  A lookup table for the vocabulary that allows you to access
-            |  #[code Lexeme] objects.
-
-    +row
-        +cell #[code Morphology]
-        +cell
-            |  Assign linguistic features like lemmas, noun case, verb tense etc.
-            |  based on the word and its part-of-speech tag.
-
-    +row
-        +cell #[+api("stringstore") #[code StringStore]]
-        +cell Map strings to and from hash values.
-
-    +row
-        +cell #[+api("tokenizer") #[code Tokenizer]]
-        +cell
-            |  Segment text, and create #[code Doc] objects with the discovered
-            |  segment boundaries.
-
-    +row
-        +cell #[code Lemmatizer]
-        +cell
-            |  Determine the base forms of words.
-
-    +row
-        +cell #[+api("matcher") #[code Matcher]]
-        +cell
-            |  Match sequences of tokens, based on pattern rules, similar to
-            |  regular expressions.
-
-
-+h(3, "architecture-pipeline") Pipeline components
++h(3, "architecture-pipeline") Processing pipeline
 
 +table(["Name", "Description"])
+    +row
+        +cell #[+api("language") #[code Language]]
+        +cell
+            |  A text-processing pipeline. Usually you'll load this once per
+            |  process as #[code nlp] and pass the instance around your application.
+
+    +row
+        +cell #[+api("pipe") #[code Pipe]]
+        +cell Base class for processing pipeline components.
+
+    +row
+        +cell #[+api("tensorizer") #[code Tensorizer]]
+        +cell
+            |  Add tensors with position-sensitive meaning representations to
+            |  #[code Doc] objects.
+
     +row
         +cell #[+api("tagger") #[code Tagger]]
         +cell Annotate part-of-speech tags on #[code Doc] objects.
@@ -104,16 +80,54 @@ p
             |  Annotate named entities, e.g. persons or products, on #[code Doc]
             |  objects.
 
+    +row
+        +cell #[+api("textcategorizer") #[code TextCategorizer]]
+        +cell  Assigning categories or labels to #[code Doc] objects.
+
+    +row
+        +cell #[+api("tokenizer") #[code Tokenizer]]
+        +cell
+            |  Segment text, and create #[code Doc] objects with the discovered
+            |  segment boundaries.
+
+    +row
+        +cell #[+api("lemmatizer") #[code Lemmatizer]]
+        +cell
+            |  Determine the base forms of words.
+
+    +row
+        +cell #[code Morphology]
+        +cell
+            |  Assign linguistic features like lemmas, noun case, verb tense etc.
+            |  based on the word and its part-of-speech tag.
+
+    +row
+        +cell #[+api("matcher") #[code Matcher]]
+        +cell
+            |  Match sequences of tokens, based on pattern rules, similar to
+            |  regular expressions.
+
+    +row
+        +cell #[+api("phrasematcher") #[code PhraseMatcher]]
+        +cell Match sequences of tokens based on phrases.
+
+
 +h(3, "architecture-other") Other classes
 
 +table(["Name", "Description"])
     +row
-        +cell #[+api("vectors") #[code Vectors]]
-        +cell Container class for vector data keyed by string.
+        +cell #[+api("vocab") #[code Vocab]]
+        +cell
+            |  A lookup table for the vocabulary that allows you to access
+            |  #[code Lexeme] objects.
 
     +row
-        +cell #[+api("binder") #[code Binder]]
-        +cell Container class for serializing collections of #[code Doc] objects.
+        +cell #[+api("stringstore") #[code StringStore]]
+        +cell Map strings to and from hash values.
+
+    +row
+        +cell #[+api("vectors") #[code Vectors]]
+        +cell Container class for vector data keyed by string.
 
     +row
         +cell #[+api("goldparse") #[code GoldParse]]
@@ -124,3 +138,7 @@ p
         +cell
             |  An annotated corpus, using the JSON file format. Manages
             |  annotations for tagging, dependency parsing and NER.
+
+    +row
+        +cell #[+api("binder") #[code Binder]]
+        +cell Container class for serializing collections of #[code Doc] objects.
diff --git a/website/usage/_spacy-101/_community-faq.jade b/website/usage/_spacy-101/_community-faq.jade
new file mode 100644
index 000000000..a3a04647d
--- /dev/null
+++ b/website/usage/_spacy-101/_community-faq.jade
@@ -0,0 +1,133 @@
+//- 💫 DOCS > USAGE > SPACY 101 > COMMUNITY & FAQ
+
+p
+    |  We're very happy to see the spaCy community grow and include a mix of
+    |  people from all kinds of different backgrounds – computational
+    |  linguistics, data science, deep learning, research and more. If you'd
+    |  like to get involved, below are some answers to the most important
+    |  questions and resources for further reading.
+
++h(3, "faq-help-code") Help, my code isn't working!
+
+p
+    |  Bugs suck, and we're doing our best to continuously improve the tests
+    |  and fix bugs as soon as possible. Before you submit an issue, do a
+    |  quick search and check if the problem has already been reported. If
+    |  you're having installation or loading problems, make sure to also check
+    |  out the #[+a("/usage/#troubleshooting") troubleshooting guide]. Help
+    |  with spaCy is available via the following platforms:
+
++aside("How do I know if something is a bug?")
+    |  Of course, it's always hard to know for sure, so don't worry – we're not
+    |  going to be mad if a bug report turns out to be a typo in your
+    |  code. As a simple rule, any C-level error without a Python traceback,
+    |  like a #[strong segmentation fault] or #[strong memory error],
+    |  is #[strong always] a spaCy bug.#[br]#[br]
+    |  Because models are statistical, their performance will never be
+    |  #[em perfect]. However, if you come across
+    |  #[strong patterns that might indicate an underlying issue], please do
+    |  file a report. Similarly, we also care about behaviours that
+    |  #[strong contradict our docs].
+
++table(["Platform", "Purpose"])
+    +row
+        +cell #[+a("https://stackoverflow.com/questions/tagged/spacy") StackOverflow]
+        +cell
+            |  #[strong Usage questions] and everything related to problems with
+            |  your specific code. The StackOverflow community is much larger
+            |  than ours, so if your problem can be solved by others, you'll
+            |  receive help much quicker.
+
+    +row
+        +cell #[+a("https://gitter.im/" + SOCIAL.gitter) Gitter chat]
+        +cell
+            |  #[strong General discussion] about spaCy, meeting other community
+            |  members and exchanging #[strong tips, tricks and best practices].
+            |  If we're working on experimental models and features, we usually
+            |  share them on Gitter first.
+
+    +row
+        +cell #[+a(gh("spaCy") + "/issues") GitHub issue tracker]
+        +cell
+            |  #[strong Bug reports] and #[strong improvement suggestions], i.e.
+            |  everything that's likely spaCy's fault. This also includes
+            |  problems with the models beyond statistical imprecisions, like
+            |  patterns that point to a bug.
+
++infobox
+    |  Please understand that we won't be able to provide individual support via
+    |  email. We also believe that help is much more valuable if it's shared
+    |  publicly, so that #[strong more people can benefit from it]. If you come
+    |  across an issue and you think you might be able to help, consider posting
+    |  a quick update with your solution. No matter how simple, it can easily
+    |  save someone a lot of time and headache – and the next time you need help,
+    |  they might repay the favour.
+
++h(3, "faq-contributing") How can I contribute to spaCy?
+
+p
+    |  You don't have to be an NLP expert or Python pro to contribute, and we're
+    |  happy to help you get started. If you're new to spaCy, a good place to
+    |  start is the
+    |  #[+a(gh("spaCy") + '/issues?q=is%3Aissue+is%3Aopen+label%3A"help+wanted+%28easy%29"') #[code help wanted (easy)] label]
+    |  on GitHub, which we use to tag bugs and feature requests that are easy
+    |  and self-contained. We also appreciate contributions to the docs – whether
+    |  it's fixing a typo, improving an example or adding additional explanations.
+    |  You'll find a "Suggest edits" link at the bottom of each page that points
+    |  you to the source.
+
+p
+    |  Another way of getting involved is to help us improve the
+    |  #[+a("/usage/adding-languages#language-data") language data] –
+    |  especially if you happen to speak one of the languages currently in
+    |  #[+a("/usage/models#languages") alpha support]. Even
+    |  adding simple tokenizer exceptions, stop words or lemmatizer data
+    |  can make a big difference. It will also make it easier for us to provide
+    |  a statistical model for the language in the future. Submitting a test
+    |  that documents a bug or performance issue, or covers functionality that's
+    |  especially important for your application is also very helpful. This way,
+    |  you'll also make sure we never accidentally introduce regressions to the
+    |  parts of the library that you care about the most.
+
+p
+    strong
+        |  For more details on the types of contributions we're looking for, the
+        |  code conventions and other useful tips, make sure to check out the
+        |  #[+a(gh("spaCy", "CONTRIBUTING.md")) contributing guidelines].
+
++infobox("Code of Conduct")
+    |  spaCy adheres to the
+    |  #[+a("http://contributor-covenant.org/version/1/4/") Contributor Covenant Code of Conduct].
+    |  By participating, you are expected to uphold this code.
+
++h(3, "faq-project-with-spacy")
+    |  I've built something cool with spaCy – how can I get the word out?
+
+p
+    |  First, congrats – we'd love to check it out! When you share your
+    |  project on Twitter, don't forget to tag
+    |  #[+a("https://twitter.com/" + SOCIAL.twitter) @#{SOCIAL.twitter}] so we
+    |  don't miss it. If you think your project would be a good fit for the
+    |  #[+a("/usage/resources") resources], #[strong feel free to submit it!]
+    |  Tutorials are also incredibly valuable to other users and a great way to
+    |  get exposure. So we strongly encourage #[strong writing up your experiences],
+    |  or sharing your code and some tips and tricks on your blog. Since our
+    |  website is open-source, you can add your project or tutorial by making a
+    |  pull request on GitHub.
+
+p
+    |  If you would like to use the spaCy logo on your site, please get in touch
+    |  and ask us first. However, if you want to show support and tell others
+    |  that your project is using spaCy, you can grab one of our
+    |  #[strong spaCy badges] here:
+
+- SPACY_BADGES =  ["built%20with-spaCy-09a3d5.svg", "made%20with%20❤%20and-spaCy-09a3d5.svg", "spaCy-v2-09a3d5.svg"]
++quickstart([{id: "badge", input_style: "check", options: SPACY_BADGES.map(function(badge, i) { return {id: i, title: "", checked: (i == 0) ? true : false}}) }], false, false, true)
+    .c-code-block(data-qs-results)
+        for badge, i in SPACY_BADGES
+            - var url = "https://img.shields.io/badge/" + badge
+            +code(false, "text", false, false, "star").o-no-block(data-qs-badge=i)=url
+            +code(false, "text", false, false, "code").o-no-block(data-qs-badge=i).
+                <a href="#{SITE_URL}"><img src="#{url}" height="20"></a>
+            +code(false, "text", false, false, "markdown").o-no-block(data-qs-badge=i).
+                [![spaCy](#{url})](#{SITE_URL})
diff --git a/website/docs/usage/_spacy-101/_language-data.jade b/website/usage/_spacy-101/_language-data.jade
similarity index 85%
rename from website/docs/usage/_spacy-101/_language-data.jade
rename to website/usage/_spacy-101/_language-data.jade
index aaca10ebb..628152524 100644
--- a/website/docs/usage/_spacy-101/_language-data.jade
+++ b/website/usage/_spacy-101/_language-data.jade
@@ -5,7 +5,7 @@ p
     |  #[strong exceptions and special cases], especially amongst the most
     |  common words. Some of these exceptions are shared across languages, while
     |  others are #[strong entirely specific] – usually so specific that they need
-    |  to be hard-coded. The #[+src(gh("spaCy", "spacy/lang")) lang] module
+    |  to be hard-coded. The #[+src(gh("spaCy", "spacy/lang")) #[code lang]] module
     |  contains all language-specific data, organised in simple Python files.
     |  This makes the data easy to update and extend.
 
@@ -22,20 +22,18 @@ p
 
 +aside-code.
     from spacy.lang.en import English
-    from spacy.lang.en import German
+    from spacy.lang.de import German
 
     nlp_en = English() # includes English data
     nlp_de = German() # includes German data
 
-+image
-    include ../../../assets/img/docs/language_data.svg
-    .u-text-right
-        +button("/assets/img/docs/language_data.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/language_data.svg")
+    include ../../assets/img/language_data.svg
 
 +table(["Name", "Description"])
     +row
         +cell #[strong Stop words]#[br]
-            |  #[+src(gh("spacy-dev-resources", "templates/new_language/stop_words.py")) stop_words.py]
+            |  #[+src(gh("spacy-dev-resources", "templates/new_language/stop_words.py")) #[code stop_words.py]]
         +cell
             |  List of most common words of a language that are often useful to
             |  filter out, for example "and" or "I". Matching tokens will
@@ -43,21 +41,21 @@ p
 
     +row
         +cell #[strong Tokenizer exceptions]#[br]
-            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tokenizer_exceptions.py")) tokenizer_exceptions.py]
+            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tokenizer_exceptions.py")) #[code tokenizer_exceptions.py]]
         +cell
             |  Special-case rules for the tokenizer, for example, contractions
             |  like "can't" and abbreviations with punctuation, like "U.K.".
 
     +row
         +cell #[strong Norm exceptions]
-            |  #[+src(gh("spaCy", "spacy/lang/norm_exceptions.py")) norm_exceptions.py]
+            |  #[+src(gh("spaCy", "spacy/lang/norm_exceptions.py")) #[code norm_exceptions.py]]
         +cell
             |  Special-case rules for normalising tokens to improve the model's
             |  predictions, for example on American vs. British spelling.
 
     +row
         +cell #[strong Punctuation rules]
-            |  #[+src(gh("spaCy", "spacy/lang/punctuation.py")) punctuation.py]
+            |  #[+src(gh("spaCy", "spacy/lang/punctuation.py")) #[code punctuation.py]]
         +cell
             |  Regular expressions for splitting tokens, e.g. on punctuation or
             |  special characters like emoji. Includes rules for prefixes,
@@ -65,14 +63,14 @@ p
 
     +row
         +cell #[strong Character classes]
-            |  #[+src(gh("spaCy", "spacy/lang/char_classes.py")) char_classes.py]
+            |  #[+src(gh("spaCy", "spacy/lang/char_classes.py")) #[code char_classes.py]]
         +cell
             |  Character classes to be used in regular expressions, for example,
             |  latin characters, quotes, hyphens or icons.
 
     +row
         +cell #[strong Lexical attributes]
-            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lex_attrs.py")) lex_attrs.py]
+            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lex_attrs.py")) #[code lex_attrs.py]]
         +cell
             |  Custom functions for setting lexical attributes on tokens, e.g.
             |  #[code like_num], which includes language-specific words like "ten"
@@ -80,22 +78,22 @@ p
 
     +row
         +cell #[strong Syntax iterators]
-            |  #[+src(gh("spaCy", "spacy/lang/en/syntax_iterators.py")) syntax_iterators.py]
+            |  #[+src(gh("spaCy", "spacy/lang/en/syntax_iterators.py")) #[code syntax_iterators.py]]
         +cell
             |  Functions that compute views of a #[code Doc] object based on its
             |  syntax. At the moment, only used for
-            |  #[+a("/docs/usage/dependency-parse#noun-chunks") noun chunks].
+            |  #[+a("/usage/linguistic-features#noun-chunks") noun chunks].
 
     +row
         +cell #[strong Lemmatizer]
-            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lemmatizer.py")) lemmatizer.py]
+            |  #[+src(gh("spacy-dev-resources", "templates/new_language/lemmatizer.py")) #[code lemmatizer.py]]
         +cell
             |  Lemmatization rules or a lookup-based lemmatization table to
             |  assign base forms, for example "be" for "was".
 
     +row
         +cell #[strong Tag map]#[br]
-            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tag_map.py")) tag_map.py]
+            |  #[+src(gh("spacy-dev-resources", "templates/new_language/tag_map.py")) #[code tag_map.py]]
         +cell
             |  Dictionary mapping strings in your tag set to
             |  #[+a("http://universaldependencies.org/u/pos/all.html") Universal Dependencies]
@@ -103,7 +101,7 @@ p
 
     +row
         +cell #[strong Morph rules]
-            |  #[+src(gh("spaCy", "spacy/lang/en/morph_rules.py")) morph_rules.py]
+            |  #[+src(gh("spaCy", "spacy/lang/en/morph_rules.py")) #[code morph_rules.py]]
         +cell
             |  Exception rules for morphological analysis of irregular words like
             |  personal pronouns.
diff --git a/website/docs/usage/lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
similarity index 82%
rename from website/docs/usage/lightning-tour.jade
rename to website/usage/_spacy-101/_lightning-tour.jade
index 0be3a55be..ecf57fbc2 100644
--- a/website/docs/usage/lightning-tour.jade
+++ b/website/usage/_spacy-101/_lightning-tour.jade
@@ -1,17 +1,15 @@
-//- 💫 DOCS > USAGE > LIGHTNING TOUR
-
-include ../../_includes/_mixins
+//- 💫 DOCS > USAGE > SPACY 101 > LIGHTNING TOUR
 
 p
     |  The following examples and code snippets give you an overview of spaCy's
     |  functionality and its usage. If you're new to spaCy, make sure to check
-    |  out the #[+a("/docs/usage/spacy-101") spaCy 101 guide].
+    |  out the #[+a("/usage/spacy-101") spaCy 101 guide].
 
-+h(2, "models") Install models and process text
++h(3, "lightning-tour-models") Install models and process text
 
 +code(false, "bash").
-    python -m spacy download en
-    python -m spacy download de
+    spacy download en
+    spacy download de
 
 +code.
     import spacy
@@ -23,10 +21,10 @@ p
 
 +infobox
     |  #[strong API:] #[+api("spacy#load") #[code spacy.load()]]
-    |  #[strong Usage:] #[+a("/docs/usage/models") Models],
-    |  #[+a("/docs/usage/spacy-101") spaCy 101]
+    |  #[strong Usage:] #[+a("/usage/models") Models],
+    |  #[+a("/usage/spacy-101") spaCy 101]
 
-+h(2, "examples-tokens-sentences") Get tokens, noun chunks & sentences
++h(3, "lightning-tour-tokens-sentences") Get tokens, noun chunks & sentences
     +tag-model("dependency parse")
 
 +code.
@@ -45,9 +43,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("doc") #[code Doc]], #[+api("token") #[code Token]]
-    |  #[strong Usage:] #[+a("/docs/usage/spacy-101") spaCy 101]
+    |  #[strong Usage:] #[+a("/usage/spacy-101") spaCy 101]
 
-+h(2, "examples-pos-tags") Get part-of-speech tags and flags
++h(3, "lightning-tour-pos-tags") Get part-of-speech tags and flags
     +tag-model("tagger")
 
 +code.
@@ -66,9 +64,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("token") #[code Token]]
-    |  #[strong Usage:] #[+a("/docs/usage/pos-tagging") Part-of-speech tagging]
+    |  #[strong Usage:] #[+a("/usage/linguistic-features#pos-tagging") Part-of-speech tagging]
 
-+h(2, "examples-hashes") Use hash values for any string
++h(3, "lightning-tour-hashes") Use hash values for any string
 
 +code.
     doc = nlp(u'I love coffee')
@@ -86,9 +84,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("stringstore") #[code stringstore]]
-    |  #[strong Usage:] #[+a("/docs/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
+    |  #[strong Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
 
-+h(2, "examples-entities") Recongnise and update named entities
++h(3, "lightning-tour-entities") Recongnise and update named entities
     +tag-model("NER")
 
 +code.
@@ -103,9 +101,9 @@ p
     assert ents == [(0, 7, u'ORG')]
 
 +infobox
-    |  #[strong Usage:] #[+a("/docs/usage/entity-recognition") Named entity recognition]
+    |  #[strong Usage:] #[+a("/usage/linguistic-features#named-entities") Named entity recognition]
 
-+h(2, "displacy") Visualize a dependency parse and named entities in your browser
++h(3, "lightning-tour-displacy") Visualize a dependency parse and named entities in your browser
     +tag-model("dependency parse", "NER")
 
 +aside
@@ -156,9 +154,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("displacy") #[code displacy]]
-    |  #[strong Usage:] #[+a("/docs/usage/visualizers") Visualizers]
+    |  #[strong Usage:] #[+a("/usage/visualizers") Visualizers]
 
-+h(2, "examples-word-vectors") Get word vectors and similarity
++h(3, "lightning-tour-word-vectors") Get word vectors and similarity
     +tag-model("word vectors")
 
 +code.
@@ -171,13 +169,13 @@ p
     assert apple.has_vector, banana.has_vector, pasta.has_vector, hippo.has_vector
 
 +infobox
-    |  #[strong Usage:] #[+a("/docs/usage/word-vectors-similarities") Word vectors and similarity]
+    |  #[strong Usage:] #[+a("/usage/vectors-similarity") Word vectors and similarity]
 
-+h(2, "examples-serialization") Simple and efficient serialization
++h(3, "lightning-tour-serialization") Simple and efficient serialization
 
 +code.
     import spacy
-    from spacy.tokens.doc import Doc
+    from spacy.tokens import Doc
     from spacy.vocab import Vocab
 
     nlp = spacy.load('en')
@@ -190,9 +188,9 @@ p
 +infobox
     |  #[strong API:] #[+api("language") #[code Language]],
     |  #[+api("doc") #[code Doc]]
-    |  #[strong Usage:] #[+a("/docs/usage/saving-loading") Saving and loading]
+    |  #[strong Usage:] #[+a("/usage/models#saving-loading") Saving and loading models]
 
-+h(2, "rule-matcher") Match text with token rules
++h(3, "lightning-tour-rule-matcher") Match text with token rules
 
 +code.
     import spacy
@@ -212,9 +210,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("matcher") #[code Matcher]]
-    |  #[strong Usage:] #[+a("/docs/usage/rule-based-matching") Rule-based matching]
+    |  #[strong Usage:] #[+a("/usage/linguistic-features#rule-based-matching") Rule-based matching]
 
-+h(2, "multi-threaded") Multi-threaded generator
++h(3, "lightning-tour-multi-threaded") Multi-threaded generator
 
 +code.
     texts = [u'One document.', u'...', u'Lots of documents']
@@ -227,9 +225,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("doc") #[code Doc]]
-    |  #[strong Usage:] #[+a("/docs/usage/production-usage") Production usage]
+    |  #[strong Usage:] #[+a("/usage/processing-pipelines#multithreading") Processing pipelines]
 
-+h(2, "examples-dependencies") Get syntactic dependencies
++h(3, "lightning-tour-dependencies") Get syntactic dependencies
     +tag-model("dependency parse")
 
 +code.
@@ -243,9 +241,9 @@ p
 
 +infobox
     |  #[strong API:] #[+api("token") #[code Token]]
-    |  #[strong Usage:] #[+a("/docs/usage/dependency-parse") Using the dependency parse]
+    |  #[strong Usage:] #[+a("/usage/linguistic-features#dependency-parse") Using the dependency parse]
 
-+h(2, "examples-numpy-arrays") Export to numpy arrays
++h(3, "lightning-tour-numpy-arrays") Export to numpy arrays
 
 +code.
     from spacy.attrs import ORTH, LIKE_URL, IS_OOV
@@ -258,7 +256,7 @@ p
     assert doc[0].like_url == doc_array[0, 1]
     assert list(doc_array[:, 1]) == [t.like_url for t in doc]
 
-+h(2, "examples-inline") Calculate inline markup on original string
++h(3, "lightning-tour-inline") Calculate inline markup on original string
 
 +code.
     def put_spans_around_tokens(doc, get_classes):
diff --git a/website/docs/usage/_spacy-101/_named-entities.jade b/website/usage/_spacy-101/_named-entities.jade
similarity index 90%
rename from website/docs/usage/_spacy-101/_named-entities.jade
rename to website/usage/_spacy-101/_named-entities.jade
index a3c539564..d9c595e6a 100644
--- a/website/docs/usage/_spacy-101/_named-entities.jade
+++ b/website/usage/_spacy-101/_named-entities.jade
@@ -3,7 +3,7 @@
 p
     |  A named entity is a "real-world object" that's assigned a name – for
     |  example, a person, a country, a product or a book title. spaCy can
-    |  #[strong recognise] #[+a("/docs/api/annotation#named-entities") various types]
+    |  #[strong recognise] #[+a("/api/annotation#named-entities") various types]
     |  of named entities in a document, by asking the model for a
     |  #[strong prediction]. Because models are statistical and strongly depend
     |  on the examples they were trained on, this doesn't always work
@@ -32,7 +32,7 @@ p
     +annotation-row(["$1 billion", 44, 54, "MONEY", "Monetary values, including unit."], style)
 
 p
-    |  Using spaCy's built-in #[+a("/docs/usage/visualizers") displaCy visualizer],
+    |  Using spaCy's built-in #[+a("/usage/visualizers") displaCy visualizer],
     |  here's what our example sentence and its named entities look like:
 
 +codepen("2f2ad1408ff79fc6a326ea3aedbb353b", 160)
diff --git a/website/docs/usage/_spacy-101/_pipelines.jade b/website/usage/_spacy-101/_pipelines.jade
similarity index 89%
rename from website/docs/usage/_spacy-101/_pipelines.jade
rename to website/usage/_spacy-101/_pipelines.jade
index c21c9f97c..4e9cd8aeb 100644
--- a/website/docs/usage/_spacy-101/_pipelines.jade
+++ b/website/usage/_spacy-101/_pipelines.jade
@@ -5,15 +5,13 @@ p
     |  produce a #[code Doc] object. The #[code Doc] is then processed in several
     |  different steps – this is also referred to as the
     |  #[strong processing pipeline]. The pipeline used by the
-    |  #[+a("/docs/usage/models") default models] consists of a
+    |  #[+a("/models") default models] consists of a
     |  tensorizer, a tagger, a parser and an entity recognizer. Each pipeline
     |  component returns the processed #[code Doc], which is then passed on to
     |  the next component.
 
-+image
-    include ../../../assets/img/docs/pipeline.svg
-    .u-text-right
-        +button("/assets/img/docs/pipeline.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/pipeline.svg")
+    include ../../assets/img/pipeline.svg
 
 +aside
     |  #[strong Name:] ID of the pipeline component.#[br]
@@ -30,7 +28,7 @@ p
 
     +row("divider")
         +cell tensorizer
-        +cell #[code TokenVectorEncoder]
+        +cell #[+api("tensorizer") Tensorizer]
         +cell #[code Doc.tensor]
         +cell Create feature representation tensor for #[code Doc].
 
@@ -54,6 +52,12 @@ p
         +cell #[code Doc.ents], #[code Doc[i].ent_iob], #[code Doc[i].ent_type]
         +cell Detect and label named entities.
 
+    +row
+        +cell textcat
+        +cell #[+api("textcategorizer") #[code TextCategorizer]]
+        +cell #[code Doc.cats]
+        +cell Assign document labels.
+
 p
     |  The processing pipeline always #[strong depends on the statistical model]
     |  and its capabilities. For example, a pipeline can only include an entity
diff --git a/website/docs/usage/_spacy-101/_pos-deps.jade b/website/usage/_spacy-101/_pos-deps.jade
similarity index 95%
rename from website/docs/usage/_spacy-101/_pos-deps.jade
rename to website/usage/_spacy-101/_pos-deps.jade
index 52a7fdd3c..a8f7f04b5 100644
--- a/website/docs/usage/_spacy-101/_pos-deps.jade
+++ b/website/usage/_spacy-101/_pos-deps.jade
@@ -1,7 +1,7 @@
 //- 💫 DOCS > USAGE > SPACY 101 > POS TAGGING AND DEPENDENCY PARSING
 
 p
-    |  After tokenization, spaCy can also #[strong parse] and #[strong tag] a
+    |  After tokenization, spaCy can #[strong parse] and #[strong tag] a
     |  given #[code Doc]. This is where the statistical model comes in, which
     |  enables spaCy to #[strong make a prediction] of which tag or label most
     |  likely applies in this context. A model consists of binary data and is
@@ -56,7 +56,7 @@ p
     |  singular present".
 
 p
-    |  Using spaCy's built-in #[+a("/docs/usage/visualizers") displaCy visualizer],
+    |  Using spaCy's built-in #[+a("/usage/visualizers") displaCy visualizer],
     |  here's what our example sentence and its dependencies look like:
 
 +codepen("030d1e4dfa6256cad8fdd59e6aefecbe", 460)
diff --git a/website/docs/usage/_spacy-101/_serialization.jade b/website/usage/_spacy-101/_serialization.jade
similarity index 100%
rename from website/docs/usage/_spacy-101/_serialization.jade
rename to website/usage/_spacy-101/_serialization.jade
diff --git a/website/docs/usage/_spacy-101/_similarity.jade b/website/usage/_spacy-101/_similarity.jade
similarity index 100%
rename from website/docs/usage/_spacy-101/_similarity.jade
rename to website/usage/_spacy-101/_similarity.jade
diff --git a/website/docs/usage/_spacy-101/_tokenization.jade b/website/usage/_spacy-101/_tokenization.jade
similarity index 87%
rename from website/docs/usage/_spacy-101/_tokenization.jade
rename to website/usage/_spacy-101/_tokenization.jade
index 10b29ef76..602209ec8 100644
--- a/website/docs/usage/_spacy-101/_tokenization.jade
+++ b/website/usage/_spacy-101/_tokenization.jade
@@ -18,7 +18,7 @@ p
             +cell=cell
 
 p
-    |  Fist, the raw text is split on whitespace characters, similar to
+    |  First, the raw text is split on whitespace characters, similar to
     |  #[code text.split(' ')]. Then, the tokenizer processes the text from
     |  left to right. On each substring, it performs two checks:
 
@@ -49,14 +49,12 @@ p
     |  #[strong Infix:] Character(s) in between, e.g.
     |  #[code -], #[code --], #[code /], #[code …].#[br]
 
-+image
-    include ../../../assets/img/docs/tokenization.svg
-    .u-text-right
-        +button("/assets/img/docs/tokenization.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/tokenization.svg")
+    include ../../assets/img/tokenization.svg
 
 p
     |  While punctuation rules are usually pretty general, tokenizer exceptions
     |  strongly depend on the specifics of the individual language. This is
-    |  why each #[+a("/docs/api/language-models") available language] has its
+    |  why each #[+a("/models/#languages") available language] has its
     |  own subclass like #[code English] or #[code German], that loads in lists
     |  of hard-coded data and exception rules.
diff --git a/website/docs/usage/_spacy-101/_training.jade b/website/usage/_spacy-101/_training.jade
similarity index 94%
rename from website/docs/usage/_spacy-101/_training.jade
rename to website/usage/_spacy-101/_training.jade
index 9b283c0eb..5d97a86df 100644
--- a/website/docs/usage/_spacy-101/_training.jade
+++ b/website/usage/_spacy-101/_training.jade
@@ -24,10 +24,8 @@ p
     |  #[strong Gradient:] Gradient of the loss function calculating the
     |  difference between input and expected output.
 
-+image
-    include ../../../assets/img/docs/training.svg
-    .u-text-right
-        +button("/assets/img/docs/training.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/training.svg")
+    include ../../assets/img/training.svg
 
 p
     |  When training a model, we don't just want it to memorise our examples –
diff --git a/website/docs/usage/_spacy-101/_vocab.jade b/website/usage/_spacy-101/_vocab.jade
similarity index 95%
rename from website/docs/usage/_spacy-101/_vocab.jade
rename to website/usage/_spacy-101/_vocab.jade
index cff0b106e..185e634fe 100644
--- a/website/docs/usage/_spacy-101/_vocab.jade
+++ b/website/usage/_spacy-101/_vocab.jade
@@ -19,10 +19,8 @@ p
     |  #[strong StringStore]: The dictionary mapping hash values to strings, for
     |  example #[code 3197928453018144401] → "coffee".
 
-+image
-    include ../../../assets/img/docs/vocab_stringstore.svg
-    .u-text-right
-        +button("/assets/img/docs/vocab_stringstore.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/vocab_stringstore.svg")
+    include ../../assets/img/vocab_stringstore.svg
 
 p
     |  If you process lots of documents containing the word "coffee" in all
@@ -112,4 +110,4 @@ p
     |  only works if you actually #[em know] that the document contains that
     |  word. To prevent this problem, spaCy will also export the #[code Vocab]
     |  when you save a #[code Doc] or #[code nlp] object. This will give you
-    |  the object and its encoded annotations, plus they "key" to decode it.
+    |  the object and its encoded annotations, plus the "key" to decode it.
diff --git a/website/docs/usage/_spacy-101/_word-vectors.jade b/website/usage/_spacy-101/_word-vectors.jade
similarity index 98%
rename from website/docs/usage/_spacy-101/_word-vectors.jade
rename to website/usage/_spacy-101/_word-vectors.jade
index cbb9d06f2..bb9add8a6 100644
--- a/website/docs/usage/_spacy-101/_word-vectors.jade
+++ b/website/usage/_spacy-101/_word-vectors.jade
@@ -5,7 +5,7 @@ p
     |  embeddings", multi-dimensional meaning representations of a word. Word
     |  vectors can be generated using an algorithm like
     |  #[+a("https://en.wikipedia.org/wiki/Word2vec") word2vec]. Most of spaCy's
-    |  #[+a("/docs/usage/models") default models] come with
+    |  #[+a("/models") default models] come with
     |  #[strong 300-dimensional vectors] that look like this:
 
 +code("banana.vector", false, false, 250).
@@ -148,5 +148,5 @@ p
 p
     |  If your application will benefit from a large vocabulary with more
     |  vectors, you should consider using one of the
-    |  #[+a("/docs/usage/models#available") larger models] instead of the default,
+    |  #[+a("/models") larger models] instead of the default,
     |  smaller ones, which usually come with a clipped vocabulary.
diff --git a/website/docs/usage/training.jade b/website/usage/_training/_basics.jade
similarity index 89%
rename from website/docs/usage/training.jade
rename to website/usage/_training/_basics.jade
index c1a7c1835..05e67c2c1 100644
--- a/website/docs/usage/training.jade
+++ b/website/usage/_training/_basics.jade
@@ -1,14 +1,6 @@
-include ../../_includes/_mixins
+//- 💫 DOCS > USAGE > TRAINING > BASICS
 
-p
-    |  This guide describes how to train new statistical models for spaCy's
-    |  part-of-speech tagger, named entity recognizer and dependency parser.
-    |  Once the model is trained, you can then
-    |  #[+a("/docs/usage/saving-loading") save and load] it.
-
-+h(2, "101") Training 101
-
-include _spacy-101/_training
+include ../_spacy-101/_training
 
 +h(3, "training-data") How do I get training data?
 
@@ -50,7 +42,7 @@ p
 
 p
     |  Alternatively, the
-    |  #[+a("/docs/usage/rule-based-matching#example3") rule-based matcher]
+    |  #[+a("/usage/linguistic-features#rule-based-matching") rule-based matcher]
     |  can be a useful tool to extract tokens or combinations of tokens, as
     |  well as their start and end index in a document. In this case, we'll
     |  extract mentions of Google and assume they're an #[code ORG].
@@ -73,7 +65,7 @@ p
     |  #[strong what you want the model to learn]. While there are some entity
     |  annotations that are more or less universally correct – like Canada being
     |  a geopolitical entity – your application may have its very own definition
-    |  of the #[+a("/docs/api/annotation#named-entities") NER annotation scheme].
+    |  of the #[+a("/api/annotation#named-entities") NER annotation scheme].
 
 +code.
     train_data = [
@@ -84,7 +76,7 @@ p
         ("Google rebrands its business apps", [(0, 6, "ORG")]),
         ("look what i found on google! 😂", [(21, 27, "PRODUCT")])]
 
-+h(2) Training with annotations
++h(3, "annotations") Training with annotations
 
 p
     |  The #[+api("goldparse") #[code GoldParse]] object collects the annotated
@@ -103,7 +95,7 @@ p
 p
     |  Using the #[code Doc] and its gold-standard annotations, the model can be
     |  updated to learn a sentence of three words with their assigned
-    |  part-of-speech tags. The #[+a("/docs/usage/adding-languages#tag-map") tag map]
+    |  part-of-speech tags. The #[+a("/usage/adding-languages#tag-map") tag map]
     |  is part of the vocabulary and defines the annotation scheme. If you're
     |  training a new language model, this will let you map the tags present in
     |  the treebank you train on to spaCy's tag scheme.
@@ -115,7 +107,7 @@ p
 p
     |  The same goes for named entities. The letters added before the labels
     |  refer to the tags of the
-    |  #[+a("/docs/usage/entity-recognition#updating-biluo") BILUO scheme] –
+    |  #[+a("/usage/linguistic-features#updating-biluo") BILUO scheme] –
     |  #[code O] is a token outside an entity, #[code U] an single entity unit,
     |  #[code B] the beginning of an entity, #[code I] a token inside an entity
     |  and #[code L] the last token of an entity.
@@ -130,10 +122,8 @@ p
     |  #[strong Update]: Update the model's weights.#[br]
     |  #[strong ]
 
-+image
-    include ../../assets/img/docs/training-loop.svg
-    .u-text-right
-        +button("/assets/img/docs/training-loop.svg", false, "secondary").u-text-tag View large graphic
++graphic("/assets/img/training-loop.svg")
+    include ../../assets/img/training-loop.svg
 
 p
     |  Of course, it's not enough to only show a model a single example once.
@@ -192,11 +182,7 @@ p
 
 +infobox
     |  For the #[strong full example and more details], see the usage guide on
-    |  #[+a("/docs/usage/training-ner") training the named entity recognizer],
+    |  #[+a("/usage/training#ner") training the named entity recognizer],
     |  or the runnable
     |  #[+src(gh("spaCy", "examples/training/train_ner.py")) training script]
     |  on GitHub.
-
-+h(2) Examples
-
-+under-construction
diff --git a/website/usage/_training/_ner.jade b/website/usage/_training/_ner.jade
new file mode 100644
index 000000000..ff3101c8f
--- /dev/null
+++ b/website/usage/_training/_ner.jade
@@ -0,0 +1,61 @@
+//- 💫 DOCS > USAGE > TRAINING > NER
+
+p
+    |  All #[+a("/models") spaCy models] support online learning, so
+    |  you can update a pre-trained model with new examples. To update the
+    |  model, you first need to create an instance of
+    |  #[+api("goldparse") #[code GoldParse]], with the entity labels
+    |  you want to learn. You'll usually need to provide many examples to
+    |  meaningfully improve the system — a few hundred is a good start, although
+    |  more is better.
+
+p
+    |  You should avoid iterating over the same few examples multiple times, or
+    |  the model is likely to "forget" how to annotate other examples. If you
+    |  iterate over the same few examples, you're effectively changing the loss
+    |  function. The optimizer will find a way to minimize the loss on your
+    |  examples, without regard for the consequences on the examples it's no
+    |  longer paying attention to. One way to avoid this
+    |  #[+a("https://explosion.ai/blog/pseudo-rehearsal-catastrophic-forgetting", true) "catastrophic forgetting" problem]
+    |  is to "remind"
+    |  the model of other examples by augmenting your annotations with sentences
+    |  annotated with entities automatically recognised by the original model.
+    |  Ultimately, this is an empirical process: you'll need to
+    |  #[strong experiment on your own data] to find a solution that works best
+    |  for you.
+
++h(3, "example-new-entity-type") Example: Training an additional entity type
+
+p
+    |  This script shows how to add a new entity type to an existing pre-trained
+    |  NER model. To keep the example short and simple, only a few sentences are
+    |  provided as examples. In practice, you'll need many more — a few hundred
+    |  would be a good start. You will also likely need to mix in examples of
+    |  other entity types, which might be obtained by running the entity
+    |  recognizer over unlabelled sentences, and adding their annotations to the
+    |  training set.
+
+p
+    |  The actual training is performed by looping over the examples, and
+    |  calling #[+api("language#update") #[code nlp.update()]]. The
+    |  #[code update] method steps through the words of the input. At each word,
+    |  it makes a prediction. It then consults the annotations provided on the
+    |  #[+api("goldparse") #[code GoldParse]] instance, to see whether it was
+    |  right. If it was wrong, it adjusts its weights so that the correct
+    |  action will score higher next time.
+
++github("spacy", "examples/training/train_new_entity_type.py")
+
++h(3, "example-ner-from-scratch") Example: Training an NER system from scratch
+
+p
+    |  This example is written to be self-contained and reasonably transparent.
+    |  To achieve that, it duplicates some of spaCy's internal functionality.
+    |  Specifically, in this example, we don't use spaCy's built-in
+    |  #[+api("language") #[code Language]] class to wire together the
+    |  #[+api("vocab") #[code Vocab]], #[+api("tokenizer") #[code Tokenizer]]
+    |  and #[+api("entityrecognizer") #[code EntityRecognizer]]. Instead, we
+    |  write our own simle #[code Pipeline] class, so that it's easier to see
+    |  how the pieces interact.
+
++github("spacy", "examples/training/train_ner_standalone.py")
diff --git a/website/docs/usage/saving-loading.jade b/website/usage/_training/_saving-loading.jade
similarity index 69%
rename from website/docs/usage/saving-loading.jade
rename to website/usage/_training/_saving-loading.jade
index 827b54748..e6e54385c 100644
--- a/website/docs/usage/saving-loading.jade
+++ b/website/usage/_training/_saving-loading.jade
@@ -1,45 +1,4 @@
-include ../../_includes/_mixins
-
-+h(2, "101") Serialization 101
-
-include _spacy-101/_serialization
-
-+infobox("Important note")
-    |  In spaCy v2.0, the API for saving and loading has changed to only use the
-    |  four methods listed above consistently across objects and classes. For an
-    |  overview of the changes, see #[+a("/docs/usage/v2#incompat") this table]
-    |  and the notes on #[+a("/docs/usage/v2#migrating-saving-loading") migrating].
-
-+h(3, "example-doc") Example: Saving and loading a document
-
-p
-    |  For simplicity, let's assume you've
-    |  #[+a("/docs/usage/entity-recognition#setting") added custom entities] to
-    |  a #[code Doc], either manually, or by using a
-    |  #[+a("/docs/usage/rule-based-matching#on_match") match pattern]. You can
-    |  save it locally by calling #[+api("doc#to_disk") #[code Doc.to_disk()]],
-    |  and load it again via #[+api("doc#from_disk") #[code Doc.from_disk()]].
-    |  This will overwrite the existing object and return it.
-
-+code.
-    import spacy
-    from spacy.tokens import Span
-
-    text = u'Netflix is hiring a new VP of global policy'
-
-    nlp = spacy.load('en')
-    doc = nlp(text)
-    assert len(doc.ents) == 0 # Doc has no entities
-    doc.ents += ((Span(doc, 0, 1, label=doc.vocab.strings[u'ORG'])) # add entity
-    doc.to_disk('/path/to/doc') # save Doc to disk
-
-    new_doc = nlp(text)
-    assert len(new_doc.ents) == 0 # new Doc has no entities
-    new_doc = new_doc.from_disk('path/to/doc') # load from disk and overwrite
-    assert len(new_doc.ents) == 1 # entity is now recognised!
-    assert [(ent.text, ent.label_) for ent in new_doc.ents] == [(u'Netflix', u'ORG')]
-
-+h(2, "models") Saving models
+//- 💫 DOCS > USAGE > TRAINING > SAVING & LOADING
 
 p
     |  After training your model, you'll usually want to save its state, and load
@@ -55,6 +14,7 @@ p
     |  will be written out. To make the model more convenient to deploy, we
     |  recommend wrapping it as a Python package.
 
+
 +h(3, "models-generating") Generating a model package
 
 +infobox("Important note")
@@ -85,7 +45,7 @@ p
     }
 
 +code(false, "bash").
-    python -m spacy package /home/me/data/en_example_model /home/me/my_models
+    spacy package /home/me/data/en_example_model /home/me/my_models
 
 p This command will create a model package directory that should look like this:
 
@@ -105,13 +65,14 @@ p
     |  need to be named according to the naming conventions of
     |  #[code lang_name] and #[code lang_name-version].
 
+
 +h(3, "models-custom") Customising the model setup
 
 p
     |  The meta.json includes the model details, like name, requirements and
     |  license, and lets you customise how the model should be initialised and
     |  loaded. You can define the language data to be loaded and the
-    |  #[+a("/docs/usage/language-processing-pipeline") processing pipeline] to
+    |  #[+a("/usage/processing-pipelines") processing pipeline] to
     |  execute.
 
 +table(["Setting", "Type", "Description"])
@@ -126,7 +87,7 @@ p
         +cell
             |  A list of strings mapping to the IDs of pipeline factories to
             |  apply in that order. If not set, spaCy's
-            |  #[+a("/docs/usage/language-processing/pipelines") default pipeline]
+            |  #[+a("/usage/processing-pipelines") default pipeline]
             |  will be used.
 
 p
@@ -135,7 +96,7 @@ p
     |  #[code Language] object with the loaded pipeline and data. If your model
     |  requires custom pipeline components, you should
     |  #[strong ship then with your model] and register their
-    |  #[+a("/docs/usage/language-processing-pipeline#creating-factory") factories]
+    |  #[+a("/usage/processing-pipelines#creating-factory") factories]
     |  via  #[+api("spacy#set_factory") #[code set_factory()]].
 
 +aside-code("Factory example").
@@ -152,7 +113,7 @@ p
 +infobox("Custom models with pipeline components")
     |  For more details and an example of how to package a sentiment model
     |  with a custom pipeline component, see the usage guide on
-    |  #[+a("/docs/usage/language-processing-pipeline#example2") language processing pipelines].
+    |  #[+a("/usage/processing-pipelines#example2") language processing pipelines].
 
 +h(3, "models-building") Building the model package
 
@@ -176,7 +137,7 @@ p
     |  You can then load the model via its name, #[code en_example_model], or
     |  import it directly as a module and then call its #[code load()] method.
 
-+h(2, "loading") Loading a custom model package
++h(3, "loading") Loading a custom model package
 
 p
     |  To load a model from a data directory, you can use
@@ -209,3 +170,38 @@ p
 
     +code-new nlp = English().from_disk('/path/to/data')
     +code-old nlp = spacy.load('en', path='/path/to/data')
+
++h(3, "example-training-spacy") Example: How we're training and packaging models for spaCy
+
+p
+    |  Publishing a new version of spaCy often means re-training all available
+    |  models – currently, that's #{MODEL_COUNT} models for #{MODEL_LANG_COUNT}
+    |  languages. To make this run smoothly, we're using an automated build
+    |  process and a #[+api("cli#train") #[code spacy train]] template that
+    |  looks like this:
+
++code(false, "bash", "$", false, false, true).
+    spacy train {lang} {models_dir}/{name} {train_data} {dev_data} -m meta/{name}.json -V {version} -g {gpu_id} -n {n_epoch} -ns {n_sents}
+
++aside-code("meta.json template", "json").
+    {
+        "lang": "en",
+        "name": "core_web_sm",
+        "license":"CC BY-SA 3.0",
+        "author":"Explosion AI",
+        "url":"https://explosion.ai",
+        "email":"contact@explosion.ai",
+        "sources": ["OntoNotes 5", "Common Crawl"],
+        "description":"English multi-task CNN trained on OntoNotes, with GloVe vectors trained on common crawl. Assigns word vectors, context-specific token vectors, POS tags, dependency parse and named entities."
+    }
+
+p In a directory #[code meta], we keep #[code meta.json] templates for the individual models, containing all relevant information that doesn't change across versions, like the name, description, author info and training data sources. When we train the model, we pass in the file to the meta template as the #[code --meta] argument, and specify the current model version as the #[code --version] argument.
+
+p On each epoch, the model is saved out with a #[code meta.json] using our template and added properties, like the #[code pipeline], #[code accuracy] scores and the #[code spacy_version] used to train the model. After training completion, the best model is selected automatically and packaged using the #[+api("cli#package") #[code package]] command. Since a full meta file is already present on the trained model, no further setup is required to build a valid model package.
+
++code(false, "bash").
+    spacy package -f {best_model} dist/
+    cd dist/{model_name}
+    python setup.py sdist
+
+p This process allows us to quickly trigger the model training and build process for all available models and languages, and generate the correct meta data automatically.
diff --git a/website/usage/_training/_similarity.jade b/website/usage/_training/_similarity.jade
new file mode 100644
index 000000000..eb7991c37
--- /dev/null
+++ b/website/usage/_training/_similarity.jade
@@ -0,0 +1,3 @@
+//- 💫 DOCS > USAGE > TRAINING > SIMILARITY
+
++under-construction
diff --git a/website/usage/_training/_tagger-parser.jade b/website/usage/_training/_tagger-parser.jade
new file mode 100644
index 000000000..4011464c7
--- /dev/null
+++ b/website/usage/_training/_tagger-parser.jade
@@ -0,0 +1,3 @@
+//- 💫 DOCS > USAGE > TRAINING > TAGGER & PARSER
+
++under-construction
diff --git a/website/usage/_training/_textcat.jade b/website/usage/_training/_textcat.jade
new file mode 100644
index 000000000..5c90519db
--- /dev/null
+++ b/website/usage/_training/_textcat.jade
@@ -0,0 +1,13 @@
+//- 💫 DOCS > USAGE > TRAINING > TEXT CLASSIFICATION
+
++under-construction
+
++h(3, "example-textcat") Example: Training spaCy's text classifier
+    +tag-new(2)
+
+p
+    |  This example shows how to use and train spaCy's new
+    |  #[+api("textcategorizer") #[code TextCategorizer]] pipeline component
+    |  on IMDB movie reviews.
+
++github("spacy", "examples/training/train_textcat.py")
diff --git a/website/usage/_vectors-similarity/_basics.jade b/website/usage/_vectors-similarity/_basics.jade
new file mode 100644
index 000000000..b8f8d834c
--- /dev/null
+++ b/website/usage/_vectors-similarity/_basics.jade
@@ -0,0 +1,15 @@
+//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > BASICS
+
++aside("Training word vectors")
+    |  Dense, real valued vectors representing distributional similarity
+    |  information are now a cornerstone of practical NLP. The most common way
+    |  to train these vectors is the #[+a("https://en.wikipedia.org/wiki/Word2vec") word2vec]
+    |  family of algorithms. The default
+    |  #[+a("/models/en") English model] installs
+    |  300-dimensional vectors trained on the
+    |  #[+a("http://commoncrawl.org") Common Crawl] corpus.
+    |  If you need to train a word2vec model, we recommend the implementation in
+    |  the Python library #[+a("https://radimrehurek.com/gensim/") Gensim].
+
+include ../_spacy-101/_similarity
+include ../_spacy-101/_word-vectors
diff --git a/website/usage/_vectors-similarity/_custom.jade b/website/usage/_vectors-similarity/_custom.jade
new file mode 100644
index 000000000..da4be39fd
--- /dev/null
+++ b/website/usage/_vectors-similarity/_custom.jade
@@ -0,0 +1,91 @@
+//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > CUSTOM VECTORS
+
+p
+    |  By default, #[+api("token#vector") #[code Token.vector]] returns the
+    |  vector for its underlying #[+api("lexeme") #[code Lexeme]], while
+    |  #[+api("doc#vector") #[code Doc.vector]] and
+    |  #[+api("span#vector") #[code Span.vector]] return an average of the
+    |  vectors of their tokens. You can customize these
+    |  behaviours by modifying the #[code doc.user_hooks],
+    |  #[code doc.user_span_hooks] and #[code doc.user_token_hooks]
+    |  dictionaries.
+
++infobox
+    |  For more details on #[strong adding hooks] and #[strong overwriting] the
+    |  built-in #[code Doc], #[code Span] and #[code Token] methods, see the
+    |  usage guide on #[+a("/usage/processing-pipelines#user-hooks") user hooks].
+
++h(3, "custom-vectors-add") Adding vectors
+    +tag-new(2)
+
+p
+    |  The new #[+api("vectors") #[code Vectors]] class makes it easy to add
+    |  your own vectors to spaCy. Just like the #[+api("vocab") #[code Vocab]],
+    |  it is initialised with a #[+api("stringstore") #[code StringStore]] or
+    |  a list of strings.
+
++code("Adding vectors one-by-one").
+    from spacy.strings import StringStore
+    from spacy.vectors import Vectors
+
+    vector_data = {'dog': numpy.random.uniform(-1, 1, (300,)),
+                   'cat': numpy.random.uniform(-1, 1, (300,)),
+                   'orange': numpy.random.uniform(-1, 1, (300,))}
+
+    vectors = Vectors(StringStore(), 300)
+    for word, vector in vector_data.items():
+        vectors.add(word, vector)
+
+p
+    |  You can also add the vector values directly on initialisation:
+
++code("Adding vectors on initialisation").
+    from spacy.vectors import Vectors
+
+    vector_table = numpy.zeros((3, 300), dtype='f')
+    vectors = Vectors([u'dog', u'cat', u'orange'], vector_table)
+
++h(3, "custom-loading-glove") Loading GloVe vectors
+    +tag-new(2)
+
+p
+    |  spaCy comes with built-in support for loading
+    |  #[+a("https://nlp.stanford.edu/projects/glove/") GloVe] vectors from
+    |  a directory. The #[+api("vectors#from_glove") #[code Vectors.from_glove]]
+    |  method assumes a binary format, the vocab provided in a
+    |  #[code vocab.txt], and the naming scheme of
+    |  #[code vectors.{size}.[fd].bin]. For example:
+
++aside-code("Directory structure", "yaml").
+    └── vectors
+        ├── vectors.128.f.bin  # vectors file
+        └── vocab.txt          # vocabulary
+
++table(["File name", "Dimensions", "Data type"])
+    +row
+        +cell #[code vectors.128.f.bin]
+        +cell 128
+        +cell float32
+
+    +row
+        +cell #[code vectors.300.d.bin]
+        +cell 300
+        +cell float64 (double)
+
++code.
+    from spacy.vectors import Vectors
+
+    vectors = Vectors([], 128)
+    vectors.from_glove('/path/to/vectors')
+
++h(3, "custom-loading-other") Loading other vectors
+    +tag-new(2)
+
+p
+    |  You can also choose to load in vectors from other sources, like the
+    |  #[+a("https://github.com/facebookresearch/fastText/blob/master/pretrained-vectors.md") fastText vectors]
+    |  for 294 languages, trained on Wikipedia. After reading in the file,
+    |  the vectors are added to the #[code Vocab] using the
+    |  #[+api("vocab#set_vector") #[code set_vector]] method.
+
++github("spacy", "examples/vectors_fast_text.py")
diff --git a/website/usage/_vectors-similarity/_gpu.jade b/website/usage/_vectors-similarity/_gpu.jade
new file mode 100644
index 000000000..9f1201da9
--- /dev/null
+++ b/website/usage/_vectors-similarity/_gpu.jade
@@ -0,0 +1,30 @@
+//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > GPU
+
+p
+    |  If you're using a GPU, it's much more efficient to keep the word vectors
+    |  on the device. You can do that by setting the
+    |  #[+api("vectors#attributes") #[code Vectors.data]] attribute to a
+    |  #[code cupy.ndarray] object if you're using spaCy
+    |  or #[+a("https://chainer.org") Chainer], or a
+    |  #[code torch.Tensor] object if you're using
+    |  #[+a("http://pytorch.org") PyTorch]. The #[code data] object just needs
+    |  to support #[code __iter__] and #[code __getitem__], so if you're using
+    |  another library such as #[+a("https://www.tensorflow.org") TensorFlow],
+    |  you could also create a wrapper for your vectors data.
+
++code("spaCy, Thinc or Chainer").
+    import cupy.cuda
+    from spacy.vectors import Vectors
+
+    vector_table = numpy.zeros((3, 300), dtype='f')
+    vectors = Vectors([u'dog', u'cat', u'orange'], vector_table)
+    with cupy.cuda.Device(0):
+        vectors.data = cupy.asarray(vectors.data)
+
++code("PyTorch").
+    import torch
+    from spacy.vectors import Vectors
+
+    vector_table = numpy.zeros((3, 300), dtype='f')
+    vectors = Vectors([u'dog', u'cat', u'orange'], vector_table)
+    vectors.data = torch.Tensor(vectors.data).cuda(0)
diff --git a/website/docs/usage/word-vectors-similarities.jade b/website/usage/_vectors-similarity/_in-context.jade
similarity index 66%
rename from website/docs/usage/word-vectors-similarities.jade
rename to website/usage/_vectors-similarity/_in-context.jade
index 63ed01776..d8e864d9d 100644
--- a/website/docs/usage/word-vectors-similarities.jade
+++ b/website/usage/_vectors-similarity/_in-context.jade
@@ -1,34 +1,11 @@
-//- 💫 DOCS > USAGE > WORD VECTORS & SIMILARITIES
-
-include ../../_includes/_mixins
-
-p
-    |  Dense, real valued vectors representing distributional similarity
-    |  information are now a cornerstone of practical NLP. The most common way
-    |  to train these vectors is the #[+a("https://en.wikipedia.org/wiki/Word2vec") word2vec]
-    |  family of algorithms. The default
-    |  #[+a("/docs/usage/models#available") English model] installs
-    |  300-dimensional vectors trained on the
-    |  #[+a("http://commoncrawl.org") Common Crawl] corpus.
-
-+aside("Tip: Training a word2vec model")
-    |  If you need to train a word2vec model, we recommend the implementation in
-    |  the Python library #[+a("https://radimrehurek.com/gensim/") Gensim].
-
-+h(2, "101") Similarity and word vectors 101
-    +tag-model("vectors")
-
-include _spacy-101/_similarity
-include _spacy-101/_word-vectors
-
-+h(2, "similarity-context") Similarities in context
+//- 💫 DOCS > USAGE > VECTORS & SIMILARITY > IN CONTEXT
 
 p
     |  Aside from spaCy's built-in word vectors, which were trained on a lot of
     |  text with a wide vocabulary, the parsing, tagging and NER models also
     |  rely on vector representations of the #[strong meanings of words in context].
     |  As the first component of the
-    |  #[+a("/docs/usage/language-processing-pipeline") processing pipeline], the
+    |  #[+a("/usage/processing-pipelines") processing pipeline], the
     |  tensorizer encodes a document's internal meaning representations as an
     |  array of floats, also called a tensor. This allows spaCy to make a
     |  reasonable guess at a word's meaning, based on its surrounding words.
@@ -77,7 +54,7 @@ p
 
 +code.
     doc1 = nlp(u"Paris is the largest city in France.")
-    doc2 = nlp(u"Ljubljana is the capital of Lithuania.")
+    doc2 = nlp(u"Vilnius is the capital of Lithuania.")
     doc3 = nlp(u"An emu is a large bird.")
 
     for doc in [doc1, doc2, doc3]:
@@ -85,13 +62,13 @@ p
             print(doc.similarity(other_doc))
 
 p
-    |  Even though the sentences about Paris and Ljubljana consist of different
+    |  Even though the sentences about Paris and Vilnius consist of different
     |  words and entities, they both describe the same concept and are seen as
     |  more similar than the sentence about emus. In this case, even a misspelled
-    |  version of "Ljubljana" would still produce very similar results.
+    |  version of "Vilnius" would still produce very similar results.
 
 +table
-    - var examples = {"Paris is the largest city in France.": [1, 0.84, 0.65], "Ljubljana is the capital of Lithuania.": [0.84, 1, 0.52], "An emu is a large bird.": [0.65, 0.52, 1]}
+    - var examples = {"Paris is the largest city in France.": [1, 0.85, 0.65], "Vilnius is the capital of Lithuania.": [0.85, 1, 0.55], "An emu is a large bird.": [0.65, 0.55, 1]}
     - var counter = 0
 
     +row
@@ -117,8 +94,8 @@ p
             nlp(u"man dog bites"), nlp(u"dog man bites")]
 
     for doc in docs:
-    for other_doc in docs:
-        print(doc.similarity(other_doc))
+        for other_doc in docs:
+            print(doc.similarity(other_doc))
 
 p
     |  Interestingly, "man bites dog" and "man dog bites" are seen as slightly
@@ -143,17 +120,3 @@ p
                 +cell.u-text-center #[code=cell.toFixed(2)]
                     |  #[+procon(cell < 0.7 ? "con" : cell != 1 ? "pro" : "neutral")]
         - counter++
-
-+h(2, "custom") Customising word vectors
-
-+under-construction
-
-p
-    |  By default, #[+api("token#vector") #[code Token.vector]] returns the
-    |  vector for its underlying #[+api("lexeme") #[code Lexeme]], while
-    |  #[+api("doc#vector") #[code Doc.vector]] and
-    |  #[+api("span#vector") #[code Span.vector]] return an average of the
-    |  vectors of their tokens. You can customize these
-    |  behaviours by modifying the #[code doc.user_hooks],
-    |  #[code doc.user_span_hooks] and #[code doc.user_token_hooks]
-    |  dictionaries.
diff --git a/website/usage/_visualizers/_dep.jade b/website/usage/_visualizers/_dep.jade
new file mode 100644
index 000000000..b028ba4cf
--- /dev/null
+++ b/website/usage/_visualizers/_dep.jade
@@ -0,0 +1,62 @@
+//- 💫 DOCS > USAGE > VISUALIZERS > DEPENDENCIES
+
+p
+    |  The dependency visualizer, #[code dep], shows part-of-speech tags
+    |  and syntactic dependencies.
+
++code("Dependency example").
+    import spacy
+    from spacy import displacy
+
+    nlp = spacy.load('en')
+    doc = nlp(u'This is a sentence.')
+    displacy.serve(doc, style='dep')
+
++codepen("f0e85b64d469d6617251d8241716d55f", 370)
+
+p
+    |  The argument #[code options] lets you specify a dictionary of settings
+    |  to customise the layout, for example:
+
++aside("Important note")
+    |  There's currently a known issue with the #[code compact] mode for
+    |  sentences with short arrows and long dependency labels, that causes labels
+    |  longer than the arrow to wrap. So if you come across this problem,
+    |  especially when using custom labels, you'll have to increase the
+    |  #[code distance] setting in the #[code options] to allow longer arcs.
+
++table(["Name", "Type", "Description", "Default"])
+    +row
+        +cell #[code compact]
+        +cell bool
+        +cell "Compact mode" with square arrows that takes up less space.
+        +cell #[code False]
+
+    +row
+        +cell #[code color]
+        +cell unicode
+        +cell Text color (HEX, RGB or color names).
+        +cell #[code '#000000']
+
+    +row
+        +cell #[code bg]
+        +cell unicode
+        +cell Background color (HEX, RGB or color names).
+        +cell #[code '#ffffff']
+
+    +row
+        +cell #[code font]
+        +cell unicode
+        +cell Font name or font family for all text.
+        +cell #[code 'Arial']
+
+p
+    |  For a list of all available options, see the
+    |  #[+api("displacy#options") #[code displacy] API documentation].
+
++aside-code("Options example").
+    options = {'compact': True, 'bg': '#09a3d5',
+               'color': 'white', 'font': 'Source Sans Pro'}
+    displacy.serve(doc, style='dep', options=options)
+
++codepen("39c02c893a84794353de77a605d817fd", 360)
diff --git a/website/usage/_visualizers/_ent.jade b/website/usage/_visualizers/_ent.jade
new file mode 100644
index 000000000..e9174cc55
--- /dev/null
+++ b/website/usage/_visualizers/_ent.jade
@@ -0,0 +1,80 @@
+//- 💫 DOCS > USAGE > VISUALIZERS > ENTITIES
+
+p
+    |  The entity visualizer, #[code ent], highlights named entities and
+    |  their labels in a text.
+
++code("Named Entity example").
+    import spacy
+    from spacy import displacy
+
+    text = """But Google is starting from behind. The company made a late push
+    into hardware, and Apple’s Siri, available on iPhones, and Amazon’s Alexa
+    software, which runs on its Echo and Dot devices, have clear leads in
+    consumer adoption."""
+
+    nlp = spacy.load('custom_ner_model')
+    doc = nlp(text)
+    displacy.serve(doc, style='ent')
+
++codepen("a73f8b68f9af3157855962b283b364e4", 345)
+
+p The entity visualizer lets you customise the following #[code options]:
+
++table(["Name", "Type", "Description", "Default"])
+    +row
+        +cell #[code ents]
+        +cell list
+        +cell
+            |  Entity types to highlight (#[code None] for all types).
+        +cell #[code None]
+
+    +row
+        +cell #[code colors]
+        +cell dict
+        +cell
+            |  Color overrides. Entity types in lowercase should be mapped to
+            |  color names or values.
+        +cell #[code {}]
+
+p
+    |  If you specify a list of #[code ents], only those entity types will be
+    |  rendered – for example, you can choose to display #[code PERSON] entities.
+    |  Internally, the visualizer knows nothing about available entity types and
+    |  will render whichever spans and labels it receives. This makes it
+    |  especially easy to work with custom entity types. By default, displaCy
+    |  comes with colours for all
+    |  #[+a("/api/annotation#named-entities") entity types supported by spaCy].
+    |  If you're using custom entity types, you can use the #[code colors]
+    |  setting to add your own colours for them.
+
++aside-code("Options example").
+    colors = {'ORG': 'linear-gradient(90deg, #aa9cfc, #fc9ce7)'}
+    options = {'ents': ['ORG'], 'colors': colors}
+    displacy.serve(doc, style='ent', options=options)
+
++codepen("f42ec690762b6f007022a7acd6d0c7d4", 300)
+
+p
+    |  The above example uses a little trick: Since the background colour values
+    |  are added as the #[code background] style attribute, you can use any
+    |  #[+a("https://tympanus.net/codrops/css_reference/background/") valid background value]
+    |  or shorthand — including gradients and even images!
+
++h(3, "ent-titles") Adding titles to documents
+
+p
+    |  Rendering several large documents on one page can easily become confusing.
+    |  To add a headline to each visualization, you can add a #[code title] to
+    |  its #[code user_data]. User data is never touched or modified by spaCy.
+
++code.
+    doc = nlp(u'This is a sentence about Google.')
+    doc.user_data['title'] = 'This is a title'
+    displacy.serve(doc, style='ent')
+
+p
+    |  This feature is espeically handy if you're using displaCy to compare
+    |  performance at different stages of a process, e.g. during training. Here
+    |  you could use the title for a brief description of the text example and
+    |  the number of iterations.
diff --git a/website/usage/_visualizers/_html.jade b/website/usage/_visualizers/_html.jade
new file mode 100644
index 000000000..648a6de80
--- /dev/null
+++ b/website/usage/_visualizers/_html.jade
@@ -0,0 +1,162 @@
+//- 💫 DOCS > USAGE > VISUALIZERS > HTML
+
+p
+    |  If you don't need the web server and just want to generate the markup
+    |  – for example, to export it to a file or serve it in a custom
+    |  way – you can use #[+api("displacy#render") #[code displacy.render]].
+    |  It works the same way, but returns a string containing the markup.
+
++code("Example").
+    import spacy
+    from spacy import displacy
+
+    nlp = spacy.load('en')
+    doc1 = nlp(u'This is a sentence.')
+    doc2 = nlp(u'This is another sentence.')
+    html = displacy.render([doc1, doc2], style='dep', page=True)
+
+p
+    |  #[code page=True] renders the markup wrapped as a full HTML page.
+    |  For minified and more compact HTML markup, you can set #[code minify=True].
+    |  If you're rendering a dependency parse, you can also export it as an
+    |  #[code .svg] file.
+
++aside("What's SVG?")
+    |  Unlike other image formats, the SVG (Scalable Vector Graphics) uses XML
+    |  markup that's easy to manipulate
+    |  #[+a("https://www.smashingmagazine.com/2014/11/styling-and-animating-svgs-with-css/") using CSS] or
+    |  #[+a("https://css-tricks.com/smil-is-dead-long-live-smil-a-guide-to-alternatives-to-smil-features/") JavaScript].
+    |  Essentially, SVG lets you design with code, which makes it a perfect fit
+    |  for visualizing dependency trees. SVGs can be embedded online in an
+    |  #[code <img>] tag, or inlined in an HTML document. They're also
+    |  pretty easy to #[+a("https://convertio.co/image-converter/") convert].
+
++code.
+    svg = displacy.render(doc, style='dep')
+    output_path = Path('/images/sentence.svg')
+    output_path.open('w', encoding='utf-8').write(svg)
+
++infobox("Important note")
+    |  Since each visualization is generated as a separate SVG, exporting
+    |  #[code .svg] files only works if you're rendering #[strong one single doc]
+    |  at a time. (This makes sense – after all, each visualization should be
+    |  a standalone graphic.) So instead of rendering all #[code Doc]s at one,
+    |  loop over them and export them separately.
+
+
++h(3, "examples-export-svg") Example: Export SVG graphics of dependency parses
+
++code("Example").
+    import spacy
+    from spacy import displacy
+    from pathlib import Path
+
+    nlp = spacy.load('en')
+    sentences = ["This is an example.", "This is another one."]
+    for sent in sentences:
+        doc = nlp(sentence)
+        svg = displacy.render(doc, style='dep')
+        file_name = '-'.join([w.text for w in doc if not w.is_punct]) + '.svg'
+        output_path = Path('/images/' + file_name)
+        output_path.open('w', encoding='utf-8').write(svg)
+
+p
+    |  The above code will generate the dependency visualizations as to
+    |  two files, #[code This-is-an-example.svg] and #[code This-is-another-one.svg].
+
+
++h(3, "manual-usage") Rendering data manually
+
+p
+    |  You can also use displaCy to manually render data. This can be useful if
+    |  you want to visualize output from other libraries, like
+    |  #[+a("http://www.nltk.org") NLTK] or
+    |  #[+a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet].
+    |  Simply convert the dependency parse or recognised entities to displaCy's
+    |  format and set #[code manual=True] on either #[code render()] or
+    |  #[code serve()].
+
++aside-code("Example").
+    ex = [{'text': 'But Google is starting from behind.',
+           'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
+           'title': None}]
+    html = displacy.render(ex, style='ent', manual=True)
+
++code("DEP input").
+    {
+        'words': [
+            {'text': 'This', 'tag': 'DT'},
+            {'text': 'is', 'tag': 'VBZ'},
+            {'text': 'a', 'tag': 'DT'},
+            {'text': 'sentence', 'tag': 'NN'}],
+        'arcs': [
+            {'start': 0, 'end': 1, 'label': 'nsubj', 'dir': 'left'},
+            {'start': 2, 'end': 3, 'label': 'det', 'dir': 'left'},
+            {'start': 1, 'end': 3, 'label': 'attr', 'dir': 'right'}]
+    }
+
++code("ENT input").
+    {
+        'text': 'But Google is starting from behind.',
+        'ents': [{'start': 4, 'end': 10, 'label': 'ORG'}],
+        'title': None
+    }
+
++h(3, "webapp") Using displaCy in a web application
+
+p
+    |  If you want to use the visualizers as part of a web application, for
+    |  example to create something like our
+    |  #[+a(DEMOS_URL + "/displacy") online demo], it's not recommended to
+    |  simply wrap and serve the displaCy renderer. Instead, you should only
+    |  rely on the server to perform spaCy's processing capabilities, and use
+    |  #[+a(gh("displacy")) displaCy.js] to render the JSON-formatted output.
+
++aside("Why not return the HTML by the server?")
+    |  It's certainly possible to just have your server return the markup.
+    |  But outputting raw, unsanitised HTML is risky and makes your app vulnerable to
+    |  #[+a("https://en.wikipedia.org/wiki/Cross-site_scripting") cross-site scripting]
+    |  (XSS). All your user needs to do is find a way to make spaCy return text
+    |  like #[code <script src="malicious-code.js"><script>], which
+    |  is pretty easy in NER mode. Instead of relying on the server to render
+    |  and sanitise HTML, you can do this on the client in JavaScript.
+    |  displaCy.js creates the markup as DOM nodes and will never insert raw
+    |  HTML.
+
+p
+    |  The #[code parse_deps] function takes a #[code Doc] object and returns
+    |  a dictionary in a format that can be rendered by displaCy.
+
++code("Example").
+    import spacy
+    from spacy import displacy
+
+    nlp = spacy.load('en')
+
+    def displacy_service(text):
+        doc = nlp(text)
+        return displacy.parse_deps(doc)
+
+p
+    |  Using a library like #[+a("https://falconframework.org/") Falcon] or
+    |  #[+a("http://www.hug.rest/") Hug], you can easily turn the above code
+    |  into a simple REST API that receives a text and returns a JSON-formatted
+    |  parse. In your front-end, include #[+a(gh("displacy")) displacy.js] and
+    |  initialise it with the API URL and the ID or query selector of the
+    |  container to render the visualisation in, e.g. #[code '#displacy'] for
+    |  #[code <div id="displacy">].
+
++code("script.js", "javascript").
+    var displacy = new displaCy('http://localhost:8080', {
+        container: '#displacy'
+    })
+
+    function parse(text) {
+        displacy.parse(text);
+    }
+
+p
+    |  When you call #[code parse()], it will make a request to your API,
+    |  receive the JSON-formatted parse and render it in your container. To
+    |  create an interactive experience, you could trigger this function by
+    |  a button and read the text from an #[code <input>] field.
diff --git a/website/usage/_visualizers/_jupyter.jade b/website/usage/_visualizers/_jupyter.jade
new file mode 100644
index 000000000..f7227e4d1
--- /dev/null
+++ b/website/usage/_visualizers/_jupyter.jade
@@ -0,0 +1,36 @@
+//- 💫 DOCS > USAGE > VISUALIZERS > JUPYTER
+
+p
+    |  displaCy is able to detect whether you're working in a
+    |  #[+a("https://jupyter.org") Jupyter] notebook, and will return markup
+    |  that can be rendered in a cell straight away. When you export your
+    |  notebook, the visualizations will be included as HTML.
+
++code("Jupyter Example").
+    # don't forget to install a model, e.g.: spacy download en
+    import spacy
+    from spacy import displacy
+
+    doc = nlp(u'Rats are various medium-sized, long-tailed rodents.')
+    displacy.render(doc, style='dep')
+
+    doc2 = nlp(LONG_NEWS_ARTICLE)
+    displacy.render(doc2, style='ent')
+
++aside("Enabling or disabling Jupyter mode")
+    |  To explicitly enable or disable "Jupyter mode", you can use the
+    |  #[code jupyter] keyword argument – e.g. to return raw HTML in a notebook,
+    |  or to force Jupyter rendering if auto-detection fails.
+
++image("/assets/img/displacy_jupyter.jpg", 700, false, "Example of using the displaCy dependency and named entity visualizer in a Jupyter notebook")
+
+p
+    |  Internally, displaCy imports #[code display] and #[code HTML] from
+    |  #[code IPython.core.display] and returns a Jupyter HTML object. If you
+    |  were doing it manually, it'd look like this:
+
++code.
+    from IPython.core.display import display, HTML
+
+    html = displacy.render(doc, style='dep')
+    return display(HTML(html))
diff --git a/website/usage/adding-languages.jade b/website/usage/adding-languages.jade
new file mode 100644
index 000000000..0690c8738
--- /dev/null
+++ b/website/usage/adding-languages.jade
@@ -0,0 +1,59 @@
+//- 💫 DOCS > USAGE > ADDING LANGUAGES
+
+include ../_includes/_mixins
+
++aside("Working on spaCy's source")
+    |  To add a new language to spaCy, you'll need to
+    |  #[strong modify the library's code]. The easiest way to do this is to
+    |  clone the #[+src(gh("spaCy")) repository] and #[strong build spaCy from source].
+    |  For more information on this, see the #[+a("/usage") installation guide].
+    |  Unlike spaCy's core, which is mostly written in Cython, all language
+    |  data is stored in regular Python files. This means that you won't have to
+    |  rebuild anything in between – you can simply make edits and reload spaCy
+    |  to test them.
+
++grid.o-no-block
+    +grid-col("half")
+        p
+            |  Obviously, there are lots of ways you can organise your code when
+            |  you implement your own language data. This guide will focus on
+            |  how it's done within spaCy. For full language support, you'll
+            |  need to create a #[code Language] subclass, define custom
+            |  #[strong language data], like a stop list and tokenizer
+            |  exceptions and test the new tokenizer. Once the language is set
+            |  up, you can #[strong build the vocabulary], including word
+            |  frequencies, Brown clusters and word vectors. Finally, you can
+            |  #[strong train the tagger and parser], and save the model to a
+            |  directory.
+
+        p
+            |  For some languages, you may also want to develop a solution for
+            |  lemmatization and morphological analysis.
+
+    +table-of-contents
+        +item #[+a("#101") Language data 101]
+        +item #[+a("#language-subclass") The Language subclass]
+        +item #[+a("#stop-words") Stop words]
+        +item #[+a("#tokenizer-exceptions") Tokenizer exceptions]
+        +item #[+a("#norm-exceptions") Norm exceptions]
+        +item #[+a("#lex-attrs") Lexical attributes]
+        +item #[+a("#syntax-iterators") Syntax iterators]
+        +item #[+a("#lemmatizer") Lemmatizer]
+        +item #[+a("#tag-map") Tag map]
+        +item #[+a("#morph-rules") Morph rules]
+        +item #[+a("#testing") Testing the language]
+        +item #[+a("#vocabulary") Building the vocabulary]
+        +item #[+a("#training") Training]
+
++section("language-data")
+    +h(2, "language-data") Language data
+    include _spacy-101/_language-data
+    include _adding-languages/_language-data
+
++section("testing")
+    +h(2, "testing") Testing the new language
+    include _adding-languages/_testing
+
++section("training")
+    +h(2, "training") Training a language model
+    include _adding-languages/_training
diff --git a/website/usage/deep-learning.jade b/website/usage/deep-learning.jade
new file mode 100644
index 000000000..4c33c0572
--- /dev/null
+++ b/website/usage/deep-learning.jade
@@ -0,0 +1,29 @@
+//- 💫 DOCS > USAGE > DEEP LEARNING
+
+include ../_includes/_mixins
++section
+    +under-construction
+
++section("pre-processing")
+    +h(2, "pre-processing") Pre-processing text for deep learning
+    include _deep-learning/_pre-processing
+
++section("thinc")
+    +h(2, "thinc") spaCy and Thinc
+    include _deep-learning/_thinc
+
++section("tensorflow-keras")
+    +h(2, "tensorflow-keras") Using spaCy with TensorFlow / Keras
+    include _deep-learning/_tensorflow-keras
+
++section("scikit-learn")
+    +h(2, "scikit-learn") Using spaCy with scikit-learn
+    include _deep-learning/_scikit-learn
+
++section("pytorch")
+    +h(2, "pytorch") Using spaCy with PyTorch
+    include _deep-learning/_pytorch
+
++section("dynet")
+    +h(2, "dynet") Using spaCy with DyNet
+    include _deep-learning/_dynet
diff --git a/website/usage/examples.jade b/website/usage/examples.jade
new file mode 100644
index 000000000..5dfeaf2a7
--- /dev/null
+++ b/website/usage/examples.jade
@@ -0,0 +1,111 @@
+//- 💫 DOCS > USAGE > EXAMPLES
+
+include ../_includes/_mixins
+
++section("pipeline")
+    +h(3, "custom-components-entities") Custom pipeline components and attribute extensions
+        +tag-new(2)
+
+    p
+        |  This example shows the implementation of a pipeline component
+        |  that sets entity annotations based on a list of single or
+        |  multiple-word company names, merges entities into one token and
+        |  sets custom attributes on the #[code Doc], #[code Span] and
+        |  #[code Token].
+
+    +github("spacy", "examples/pipeline/custom_component_entities.py")
+
+    +h(3, "custom-components-api")
+        |  Custom pipeline components and attribute extensions via a REST API
+        +tag-new(2)
+
+    p
+        |  This example shows the implementation of a pipeline component
+        |  that fetches country meta data via the
+        |  #[+a("https://restcountries.eu") REST Countries API] sets entity
+        |  annotations for countries, merges entities into one token and
+        |  sets custom attributes on the #[code Doc], #[code Span] and
+        |  #[code Token] – for example, the capital, latitude/longitude
+        |  coordinates and the country flag.
+
+    +github("spacy", "examples/pipeline/custom_component_countries_api.py")
+
+    +h(3, "custom-components-attr-methods") Custom method extensions
+        +tag-new(2)
+
+    p
+        |  A collection of snippets showing examples of extensions adding
+        |  custom methods to the #[code Doc], #[code Token] and
+        |  #[code Span].
+
+    +github("spacy", "examples/pipeline/custom_attr_methods.py")
+
++section("matching")
+    +h(3, "matcher") Using spaCy's rule-based matcher
+
+    p
+        |  This example shows how to use spaCy's rule-based
+        |  #[+api("matcher") #[code Matcher]] to find and label entities across
+        |  documents.
+
+    +github("spacy", "examples/matcher_example.py")
+
+    +h(3, "phrase-matcher") Using spaCy's phrase matcher
+        +tag-new(2)
+
+    p
+        |  This example shows how to use the new
+        |  #[+api("phrasematcher") #[code PhraseMatcher]] to efficiently find
+        |  entities from a large terminology list.
+
+    +github("spacy", "examples/phrase_matcher.py")
+
++section("training")
+    +h(3, "new-entity-type") Training an additional entity type
+
+    p
+        |  This script shows how to add a new entity type to an existing
+        |  pre-trained NER model. To keep the example short and simple, only
+        |  four sentences are provided as examples. In practice, you'll need
+        |  many more — a few hundred would be a good start.
+
+    +github("spacy", "examples/training/train_new_entity_type.py")
+
+    +h(3, "ner-standalone") Training an NER system from scratch
+
+    p
+        |  This example is written to be self-contained and reasonably
+        |  transparent. To achieve that, it duplicates some of spaCy's internal
+        |  functionality.
+
+    +github("spacy", "examples/training/train_ner_standalone.py")
+
+    +h(3, "textcat") Training spaCy's text classifier
+        +tag-new(2)
+
+    p
+        |  This example shows how to use and train spaCy's new
+        |  #[+api("textcategorizer") #[code TextCategorizer]] pipeline component
+        |  on IMDB movie reviews.
+
+    +github("spacy", "examples/training/train_textcat.py")
+
++section("deep-learning")
+    +h(3, "keras") Text classification with Keras
+
+    p
+        |  In this example, we're using spaCy to pre-process text for use with
+        |  a #[+a("https://keras.io") Keras] text classification model.
+
+    +github("spacy", "examples/deep_learning_keras.py")
+
+    +h(3, "keras-parikh-entailment") A decomposable attention model for Natural Language Inference
+
+    p
+        |  This example contains an implementation of the entailment prediction
+        |  model described by #[+a("https://arxiv.org/pdf/1606.01933.pdf") Parikh et al. (2016)].
+        |  The model is notable for its competitive performance with very few
+        |  parameters, and was implemented using #[+a("https://keras.io") Keras]
+        |  and spaCy.
+
+    +github("spacy", "examples/keras_parikh_entailment/__main__.py", "examples/keras_parikh_entailment")
diff --git a/website/usage/facts-figures.jade b/website/usage/facts-figures.jade
new file mode 100644
index 000000000..b6a548121
--- /dev/null
+++ b/website/usage/facts-figures.jade
@@ -0,0 +1,32 @@
+//- 💫 DOCS > USAGE > FACTS & FIGURES
+
+include ../_includes/_mixins
+
++section("comparison")
+    +h(2, "comparison") Feature comparison
+    include _facts-figures/_feature-comparison
+
++section("benchmarks")
+    +h(2, "benchmarks") Benchmarks
+    include _facts-figures/_benchmarks
+
+
++section("powered-by")
+    +h(2, "powered-by") Powered by spaCy
+
+    p
+        |  Here's an overview of other tools and libraries that are using spaCy
+        |  behind the scenes.
+
+    +grid
+        +card("torchtext", "https://github.com/pytorch/text", "PyTorch", "github")
+            |  PyTorch's NLP datasets and loaders use spaCy for pre-processing
+            |  and tokenization.
+
+        +card("allennlp", "https://github.com/allenai/allennlp", "Allen Institute for Artificial Intelligence", "github")
+            |  The open-source NLP research library based on PyTorch uses spaCy
+            |  for pre-processing and tokenization.
+
++section("other-libraries")
+    +h(2, "other-libraries") spaCy and other libraries
+    include _facts-figures/_other-libraries
diff --git a/website/usage/index.jade b/website/usage/index.jade
new file mode 100644
index 000000000..495a9863b
--- /dev/null
+++ b/website/usage/index.jade
@@ -0,0 +1,27 @@
+//- 💫 DOCS > USAGE
+
+include ../_includes/_mixins
+
+p
+    |  spaCy is compatible with #[strong 64-bit CPython 2.6+∕3.3+] and
+    |  runs on #[strong Unix/Linux], #[strong macOS/OS X] and
+    |  #[strong Windows]. The latest spaCy releases are
+    |  available over #[+a("https://pypi.python.org/pypi/spacy") pip] (source
+    |  packages only) and #[+a("https://anaconda.org/conda-forge/spacy") conda].
+    |  Installation requires a working build environment. See notes on
+    |  #[a(href="#source-ubuntu") Ubuntu], #[a(href="#source-osx") macOS/OS X]
+    |  and #[a(href="#source-windows") Windows] for details.
+
++section("quickstart")
+    include _install/_quickstart
+
++section("instructions")
+    +h(2, "installation") Installation instructions
+    include _install/_instructions
+
++section("troubleshooting")
+    +h(2, "troubleshooting") Troubleshooting guide
+    include _install/_troubleshooting
+
++section("changelog")
+    include _install/_changelog
diff --git a/website/usage/linguistic-features.jade b/website/usage/linguistic-features.jade
new file mode 100644
index 000000000..ef8783471
--- /dev/null
+++ b/website/usage/linguistic-features.jade
@@ -0,0 +1,38 @@
+//- 💫 DOCS > USAGE > LINGUISTIC FEATURES
+
+include ../_includes/_mixins
+
+p
+    |  Processing raw text intelligently is difficult: most words are rare, and
+    |  it's common for words that look completely different to mean almost the
+    |  same thing. The same words in a different order can mean something
+    |  completely different. Even splitting text into useful word-like units can
+    |  be difficult in many languages. While it's possible to solve some
+    |  problems starting from only the raw characters, it's usually better to
+    |  use linguistic knowledge to add useful information. That's exactly what
+    |  spaCy is designed to do: you put in raw text, and get back a
+    |  #[+api("doc") #[code Doc]] object, that comes with a variety of
+    |  annotations.
+
++section("pos-tagging")
+    +h(2, "pos-tagging") Part-of-speech tagging
+        +tag-model("tagger", "dependency parse")
+    include _linguistic-features/_pos-tagging
+
++section("dependency-parse")
+    +h(2, "dependency-parse") Dependency parsing
+        +tag-model("dependency parse")
+    include _linguistic-features/_dependency-parse
+
++section("named-entities")
+    +h(2, "named-entities") Named Entities
+        +tag-model("named entities")
+    include _linguistic-features/_named-entities
+
++section("tokenization")
+    +h(2, "tokenization") Tokenization
+    include _linguistic-features/_tokenization
+
++section("rule-based-matching")
+    +h(2, "rule-based-matching") Rule-based matching
+    include _linguistic-features/_rule-based-matching
diff --git a/website/usage/models.jade b/website/usage/models.jade
new file mode 100644
index 000000000..11a0901f4
--- /dev/null
+++ b/website/usage/models.jade
@@ -0,0 +1,37 @@
+//- 💫 DOCS > USAGE > MODELS
+
+include ../_includes/_mixins
+
+p
+    |  As of v1.7.0, models for spaCy can be installed as #[strong Python packages].
+    |  This means that they're a component of your application, just like any
+    |  other module. They're versioned and can be defined as a dependency in your
+    |  #[code requirements.txt]. Models can be installed from a download URL or
+    |  a local directory, manually or via #[+a("https://pypi.python.org/pypi/pip") pip].
+    |  Their data can be located anywhere on your file system.
+
++aside("Important note")
+    |  If you're upgrading to spaCy v1.7.x or v2.x, you need to
+    |  #[strong download the new models]. If you've trained statistical models
+    |  that use spaCy's annotations, you should #[strong retrain your models]
+    |  after updating spaCy. If you don't retrain, you may suffer train/test
+    |  skew, which might decrease your accuracy.
+
++section("quickstart")
+    include _models/_quickstart
+
++section("available")
+    +h(2, "available") Available models
+    include _models/_available-models
+
++section("install")
+    +h(2, "download") Installing and using models
+    include _models/_install
+
++section("languages")
+    +h(2, "languages") Language support
+    include _models/_languages
+
++section("production")
+    +h(2, "production") Using models in production
+    include _models/_production
diff --git a/website/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
new file mode 100644
index 000000000..045a32ddb
--- /dev/null
+++ b/website/usage/processing-pipelines.jade
@@ -0,0 +1,25 @@
+//- 💫 DOCS > USAGE > PIPELINE
+
+include ../_includes/_mixins
+
+include _spacy-101/_pipelines
+
++section("pipelines")
+    +h(2, "pipelines") How pipelines work
+    include _processing-pipelines/_pipelines
+
++section("custom-components")
+    +h(2, "custom-components") Creating custom pipeline components
+    include _processing-pipelines/_custom-components
+
++section("extensions")
+    +h(2, "extensions") Developing spaCy extensions
+    include _processing-pipelines/_extensions
+
++section("multithreading")
+    +h(2, "multithreading") Multi-threading
+    include _processing-pipelines/_multithreading
+
++section("serialization")
+    +h(2, "serialization") Serialization
+    include _processing-pipelines/_serialization
diff --git a/website/usage/resources.jade b/website/usage/resources.jade
new file mode 100644
index 000000000..285c211e8
--- /dev/null
+++ b/website/usage/resources.jade
@@ -0,0 +1,142 @@
+//- 💫 DOCS > USAGE > RESOURCES
+
+include ../_includes/_mixins
+
++aside("Contribute to this page")
+    |  Have you built something cool with spaCy or come across a paper, book or
+    |  course that should be featured here?
+    |  #[a(href="mailto:#{EMAIL}") Let us know!]
+
++section("libraries")
+    +h(2, "libraries") Third-party libraries
+
+    +grid
+        +card("neuralcoref", "https://github.com/huggingface/neuralcoref", "Hugging Face", "github")
+            |  State-of-the-art coreference resolution based on neural nets
+            |  and spaCy
+
+        +card("rasa_nlu", "https://github.com/golastmile/rasa_nlu", "LastMile", "github")
+            |  High level APIs for building your own language parser using
+            |  existing NLP and ML libraries.
+
+        +card("textacy", "https://github.com/chartbeat-labs/textacy", "Burton DeWilde", "github")
+            |  Higher-level NLP built on spaCy.
+
+        +card("spacyr", "https://github.com/kbenoit/spacyr", "Kenneth Benoit", "github")
+            |  An R wrapper for spaCy.
+
+        +card("spacy_api", "https://github.com/kootenpv/spacy_api", "Pascal van Kooten", "github")
+            |  Server/client to load models in a separate, dedicated process.
+
+        +card("spacy-api-docker", "https://github.com/jgontrum/spacy-api-docker", "Johannes Gontrum", "github")
+            |  spaCy accessed by a REST API, wrapped in a Docker container.
+
+        +card("spacy-nlp-zeromq", "https://github.com/pasupulaphani/spacy-nlp-docker", "Phaninder Pasupula", "github")
+            |  Docker image exposing spaCy with ZeroMQ bindings.
+
+        +card("spacy-nlp", "https://github.com/kengz/spacy-nlp", "Wah Loon Keng", "github")
+            |  Expose spaCy NLP text parsing to Node.js (and other languages)
+            |  via Socket.IO.
+
+    .u-text-right
+        +button("https://github.com/search?o=desc&q=spacy&s=stars&type=Repositories&utf8=%E2%9C%93", false, "primary", "small") See more projects on GitHub
+
++section("extensions")
+    +h(2, "extensions") Extensions & Pipeline Components
+
+    p
+        |  This section lists spaCy extensions and components you can plug into
+        |  your processing pipeline. For more details, see the docs on
+        |  #[+a("/usage/processing-pipelines#custom-components") custom components]
+        |  and #[+a("/usage/processing-pipelines#extensions") extensions].
+
+    +grid
+        +card("spacymoji", "https://github.com/ines/spacymoji", "Ines Montani", "github")
+            |  Pipeline component for emoji handling and adding emoji meta data
+            |  to #[code Doc], #[code Token] and #[code Span] attributes.
+
+    .u-text-right
+        +button("https://github.com/search?o=desc&q=spacy-extensions&s=stars&type=Repositories&utf8=%E2%9C%93", false, "primary", "small") See more extensions on GitHub
+
++section("demos")
+    +h(2, "demos") Demos & Visualizations
+
+    +grid
+        +card("Neural coref", "https://huggingface.co/coref/", "Hugging Face")
+            +image("/assets/img/resources/neuralcoref.jpg").o-block-small
+            |  State-of-the-art coreference resolution based on neural nets
+            |  and spaCy.
+
+        +card("sense2vec", "https://demos.explosion.ai/sense2vec", "Matthew Honnibal and Ines Montani")
+            +image("/assets/img/resources/sense2vec.jpg").o-block-small
+            |  Semantic analysis of the Reddit hivemind using sense2vec and spaCy.
+
+        +card("displaCy", "https://demos.explosion.ai/displacy", "Ines Montani")
+            +image("/assets/img/resources/displacy.jpg").o-block-small
+            |  An open-source NLP visualiser for the modern web.
+
+        +card("displaCy ENT", "https://demos.explosion.ai/displacy-ent", "Ines Montani")
+            +image("/assets/img/resources/displacy-ent.jpg").o-block-small
+            |  An open-source named entity visualiser for the modern web.
+
++section("books")
+    +h(2, "books") Books & Courses
+
+    +grid
+        +card("Natural Language Processing Fundamentals in Python", "https://www.datacamp.com/courses/natural-language-processing-fundamentals-in-python", "Katharine Jarmul (Datacamp, 2017)", "course")
+            |  An interactive online course on everything you need to know about
+            |  Natural Language Processing in Python, featuring spaCy and NLTK.
+
+        +card("Introduction to Machine Learning with Python: A Guide for Data Scientists", "https://books.google.com/books?id=vbQlDQAAQBAJ", "Andreas C. Müller and Sarah Guido (O'Reilly, 2016)", "book")
+            |  Andreas is a lead developer of Scikit-Learn, and Sarah is a lead
+            |  data scientist at Mashable. We're proud to get a mention.
+
+        +card("Text Analytics with Python", "https://www.amazon.com/Text-Analytics-Python-Real-World-Actionable/dp/148422387X", "Dipanjan Sarkar (Apress / Springer, 2016)", "book")
+            |  A Practical Real-World Approach to Gaining Actionable Insights
+            |  from your Data
+
++section("notebooks")
+    +h(2, "notebooks") Jupyter notebooks
+
+    +grid
+        +card("Modern NLP in Python", gh("spacy-notebooks", "notebooks/conference_notebooks/modern_nlp_in_python.ipynb"), "Patrick Harrison", "jupyter")
+            |  Introduction to NLP in Python using spaCy and Gensim. Presented
+            |  at PyData DC 2016.
+
+        +card("Advanced Text Analysis", gh("spacy-notebooks", "notebooks/conference_notebooks/advanced_text_analysis.ipynb"), "Jonathan Reeve", "jupyter")
+            |  Advanced Text Analysis with spaCy and Scikit-Learn. Presented at
+            |  NYU during NYCDH Week 2017.
+
+    .u-text-right
+        +button(gh("spacy-notebooks"), false, "primary", "small") See more notebooks on GitHub
+
++section("research")
+    +h(2, "research") Research systems
+
+    p Researchers are using spaCy to build ambitious, next-generation text processing technologies. spaCy is particularly popular amongst the biomedical NLP community, who are working on extracting knowledge from the huge volume of literature in their field.
+
+    +grid
+        +card(false, "https://www.semanticscholar.org/paper/Choosing-an-NLP-Library-for-Analyzing-Software-Doc-Omran-Treude/72f280e47e91b30af24205fa24d53247605aa591", "Fouad Nasser A. Al Omran et al. (2017)", "book", "third")
+            |  Choosing an NLP Library for Analyzing Software Documentation: A
+            |  Systematic Literature Review and a Series of Experiments
+
+        +card(false, "https://www.semanticscholar.org/paper/Mixing-Dirichlet-Topic-Models-and-Word-Embeddings-Moody/bf8116e06f7b498c6abfbf97aeb67d0838c08609", "Christopher E. Moody (2016)", "book", "third")
+            |  Mixing Dirichlet Topic Models and Word Embeddings to Make lda2vec
+
+        +card(false, "https://www.semanticscholar.org/paper/Refactoring-the-Genia-Event-Extraction-Shared-Task-Kim-Wang/06d94b64a7bd2d3433f57caddad5084435d6a91f", "Jin-Dong Kim et al. (2016)", "book", "third")
+            |  Refactoring the Genia Event Extraction Shared Task Toward a
+            |  General Framework for IE-Driven KB Development
+
+        +card(false, "https://www.semanticscholar.org/paper/Predicting-Pre-click-Quality-for-Native-Zhou-Redi/564985430ff2fbc3a9daa9c2af8997b7f5046da8", "Ke Zhou et al. (2016)", "book", "third")
+            |  Predicting Pre-click Quality for Native Advertisements
+
+        +card(false, "https://www.semanticscholar.org/paper/Threat-detection-in-online-discussions-Wester-%C3%98vrelid/f4150e2fb4d8646ebc2ea84f1a86afa1b593239b", "Aksel Wester et al. (2016)", "book", "third")
+            |  Threat detection in online discussions
+
+        +card(false, "https://www.semanticscholar.org/paper/Distributional-semantics-for-understanding-spoken-Korpusik-Huang/5f55c5535e80d3e5ed7f1f0b89531e32725faff5", "Mandy Korpusik et al. (2016)", "book", "third")
+            |  Distributional semantics for understanding spoken meal
+            |  descriptions
+
+    .u-text-right
+        +button("https://scholar.google.com/scholar?scisbd=2&q=spacy&hl=en&as_sdt=1,5&as_vis=1", false, "primary", "small")
+            |  See 200+ papers on Google Scholar
diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade
new file mode 100644
index 000000000..3b75202f7
--- /dev/null
+++ b/website/usage/spacy-101.jade
@@ -0,0 +1,300 @@
+//- 💫 DOCS > USAGE > SPACY 101
+
+include ../_includes/_mixins
+
+p
+    |  Whether you're new to spaCy, or just want to brush up on some
+    |  NLP basics and implementation details – this page should have you covered.
+    |  Each section will explain one of spaCy's features in simple terms and
+    |  with examples or illustrations. Some sections will also reappear across
+    |  the usage guides as a quick introduction.
+
++aside("Help us improve the docs")
+    |  Did you spot a mistake or come across explanations that
+    |  are unclear? We always appreciate improvement
+    |  #[+a(gh("spaCy") + "/issues") suggestions] or
+    |  #[+a(gh("spaCy") + "/pulls") pull requests]. You can find a "Suggest
+    |  edits" link at the bottom of each page that points you to the source.
+
++h(2, "whats-spacy") What's spaCy?
+
++grid.o-no-block
+    +grid-col("half")
+        p
+            |  spaCy is a #[strong free, open-source library] for advanced
+            |  #[strong Natural Language Processing] (NLP) in Python.
+
+        p
+            |  If you're working with a lot of text, you'll eventually want to
+            |  know more about it. For example, what's it about? What do the
+            |  words mean in context? Who is doing what to whom? What companies
+            |  and products are mentioned? Which texts are similar to each other?
+
+        p
+            |  spaCy is designed specifically for #[strong production use] and
+            |  helps you build applications that process and "understand"
+            |  large volumes of text. It can be used to build
+            |  #[strong information extraction] or
+            |  #[strong natural language understanding] systems, or to
+            |  pre-process text for #[strong deep learning].
+
+    +table-of-contents
+        +item #[+a("#features") Features]
+        +item #[+a("#annotations") Linguistic annotations]
+        +item #[+a("#annotations-token") Tokenization]
+        +item #[+a("#annotations-pos-deps") POS tags and dependencies]
+        +item #[+a("#annotations-ner") Named entities]
+        +item #[+a("#vectors-similarity") Word vectors and similarity]
+        +item #[+a("#pipelines") Pipelines]
+        +item #[+a("#vocab") Vocab, hashes and lexemes]
+        +item #[+a("#serialization") Serialization]
+        +item #[+a("#training") Training]
+        +item #[+a("#language-data") Language data]
+        +item #[+a("#lightning-tour") Lightning tour]
+        +item #[+a("#architecture") Architecture]
+        +item #[+a("#community") Community & FAQ]
+
++h(3, "what-spacy-isnt") What spaCy isn't
+
++list
+    +item #[strong spaCy is not a platform or "an API"].
+        |  Unlike a platform, spaCy does not provide a software as a service, or
+        |  a web application. It's an open-source library designed to help you
+        |  build NLP applications, not a consumable service.
+    +item #[strong spaCy is not an out-of-the-box chat bot engine].
+        |  While spaCy can be used to power conversational applications, it's
+        |  not designed specifically for chat bots, and only provides the
+        |  underlying text processing capabilities.
+    +item #[strong spaCy is not research software].
+        |  It's built on the latest research, but it's designed to get
+        |  things done. This leads to fairly different design decisions than
+        |  #[+a("https://github./nltk/nltk") NLTK]
+        |  or #[+a("https://stanfordnlp.github.io/CoreNLP/") CoreNLP], which were
+        |  created as platforms for teaching and research. The main difference
+        |  is that spaCy is integrated and opinionated. spaCy tries to avoid asking
+        |  the user to choose between multiple algorithms that deliver equivalent
+        |  functionality. Keeping the menu small lets spaCy deliver generally better
+        |  performance and developer experience.
+    +item #[strong spaCy is not a company].
+        |  It's an open-source library. Our company publishing spaCy and other
+        |  software is called #[+a(COMPANY_URL, true) Explosion AI].
+
++section("features")
+    +h(2, "features") Features
+
+    p
+        |  In the documentation, you'll come across mentions of spaCy's
+        |  features and capabilities. Some of them refer to linguistic concepts,
+        |  while others are related to more general machine learning
+        |  functionality.
+
+    +aside
+        |  If one of spaCy's functionalities #[strong needs a model], it means
+        |  that you need to have one of the available
+        |  #[+a("/models") statistical models] installed. Models are used
+        |  to #[strong predict] linguistic annotations – for example, if a word
+        |  is a verb or a noun.
+
+    +table(["Name", "Description", "Needs model"])
+        +row
+            +cell #[strong Tokenization]
+            +cell Segmenting text into words, punctuations marks etc.
+            +cell #[+procon("con")]
+
+        +row
+            +cell #[strong Part-of-speech] (POS) #[strong Tagging]
+            +cell Assigning word types to tokens, like verb or noun.
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Dependency Parsing]
+            +cell
+                |  Assigning syntactic dependency labels, describing the
+                |  relations between individual tokens, like subject or object.
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Lemmatization]
+            +cell
+                |  Assigning the base forms of words. For example, the lemma of
+                |  "was" is "be", and the lemma of "rats" is "rat".
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Sentence Boundary Detection] (SBD)
+            +cell Finding and segmenting individual sentences.
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Named Entity Recongition] (NER)
+            +cell
+                |  Labelling named "real-world" objects, like persons, companies
+                |  or locations.
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Similarity]
+            +cell
+                |  Comparing words, text spans and documents and how similar
+                |  they are to each other.
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Text Classification]
+            +cell
+                |  Assigning categories or labels to a whole document, or parts
+                |  of a document.
+            +cell #[+procon("pro")]
+
+        +row
+            +cell #[strong Rule-based Matching]
+            +cell
+                |  Finding sequences of tokens based on their texts and
+                |  linguistic annotations, similar to regular expressions.
+            +cell #[+procon("con")]
+
+        +row
+            +cell #[strong Training]
+            +cell Updating and improving a statistical model's predictions.
+            +cell #[+procon("neutral")]
+
+        +row
+            +cell #[strong Serialization]
+            +cell Saving objects to files or byte strings.
+            +cell #[+procon("neutral")]
+
+    +h(2, "annotations") Linguistic annotations
+
+    p
+        |  spaCy provides a variety of linguistic annotations to give you
+        |  #[strong insights into a text's grammatical structure]. This
+        |  includes the word types, like the parts of speech, and how the words
+        |  are related to each other. For example, if you're analysing text, it
+        |  makes a huge difference whether a noun is the subject of a sentence,
+        |  or the object – or whether "google" is used as a verb, or refers to
+        |  the website or company in a specific context.
+
+    p
+        |  Once you've downloaded and installed a #[+a("/usage/models") model],
+        |  you can load it via #[+api("spacy#load") #[code spacy.load()]]. This will
+        |  return a #[code Language] object contaning all components and data needed
+        |  to process text. We usually call it #[code nlp]. Calling the #[code nlp]
+        |  object on a string of text will return a processed #[code Doc]:
+
+    +code.
+        import spacy
+
+        nlp = spacy.load('en')
+        doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')
+
+    p
+        |  Even though a #[code Doc] is processed – e.g. split into individual words
+        |  and annotated – it still holds #[strong all information of the original text],
+        |  like whitespace characters. You can always get the offset of a token into the
+        |  original string, or reconstruct the original by joining the tokens and their
+        |  trailing whitespace. This way, you'll never lose any information
+        |  when processing text with spaCy.
+
+    +h(3, "annotations-token") Tokenization
+
+    include _spacy-101/_tokenization
+
+    +infobox
+        |  To learn more about how spaCy's tokenization rules work in detail,
+        |  how to #[strong customise and replace] the default tokenizer and how to
+        |  #[strong add language-specific data], see the usage guides on
+        |  #[+a("/usage/adding-languages") adding languages] and
+        |  #[+a("/usage/linguistic-features#tokenization") customising the tokenizer].
+
+    +h(3, "annotations-pos-deps") Part-of-speech tags and dependencies
+        +tag-model("dependency parse")
+
+    include _spacy-101/_pos-deps
+
+    +infobox
+        |  To learn more about #[strong part-of-speech tagging] and rule-based
+        |  morphology, and how to #[strong navigate and use the parse tree]
+        |  effectively, see the usage guides on
+        |  #[+a("/usage/linguistic-features#pos-tagging") part-of-speech tagging] and
+        |  #[+a("/usage/linguistic-features#dependency-parse") using the dependency parse].
+
+    +h(3, "annotations-ner") Named Entities
+        +tag-model("named entities")
+
+    include _spacy-101/_named-entities
+
+    +infobox
+        |  To learn more about entity recognition in spaCy, how to
+        |  #[strong add your own entities] to a document and how to
+        |  #[strong train and update] the entity predictions of a model, see the
+        |  usage guides on
+        |  #[+a("/usage/linguistic-features#named-entities") named entity recognition] and
+        |  #[+a("/usage/training#ner") training the named entity recognizer].
+
+    +h(2, "vectors-similarity") Word vectors and similarity
+        +tag-model("vectors")
+
+    include _spacy-101/_similarity
+
+    include _spacy-101/_word-vectors
+
+    +infobox
+        |  To learn more about word vectors, how to #[strong customise them] and
+        |  how to load #[strong your own vectors] into spaCy, see the usage
+        |  guide on
+        |  #[+a("/usage/vectors-similarity") using word vectors and semantic similarities].
+
+    +h(2, "pipelines") Pipelines
+
+    include _spacy-101/_pipelines
+
+    +infobox
+        |  To learn more about #[strong how processing pipelines work] in detail,
+        |  how to enable and disable their components, and how to
+        |  #[strong create your own], see the usage guide on
+        |  #[+a("/usage/processing-pipelines") language processing pipelines].
+
+    +h(2, "vocab") Vocab, hashes and lexemes
+
+    include _spacy-101/_vocab
+
+    +h(2, "serialization") Serialization
+
+    include _spacy-101/_serialization
+
+    +infobox
+        |  To learn more about how to #[strong save and load your own models],
+        |  see the usage guide on
+        |  #[+a("/usage/training#saving-loading") saving and loading].
+
+    +h(2, "training") Training
+
+    include _spacy-101/_training
+
+    +infobox
+        |  To learn more about #[strong training and updating] models, how to create
+        |  training data and how to improve spaCy's named entity recognition models,
+        |  see the usage guides on #[+a("/usage/training") training].
+
+    +h(2, "language-data") Language data
+
+    include _spacy-101/_language-data
+
+    +infobox
+        |  To learn more about the individual components of the language data and
+        |  how to #[strong add a new language] to spaCy in preparation for training
+        |  a language model, see the usage guide on
+        |  #[+a("/usage/adding-languages") adding languages].
+
+
++section("lightning-tour")
+    +h(2, "lightning-tour") Lightning tour
+    include _spacy-101/_lightning-tour
+
++section("architecture")
+    +h(2, "architecture") Architecture
+    include _spacy-101/_architecture
+
++section("community-faq")
+    +h(2, "community") Community & FAQ
+    include _spacy-101/_community-faq
diff --git a/website/usage/text-classification.jade b/website/usage/text-classification.jade
new file mode 100644
index 000000000..8a0e93450
--- /dev/null
+++ b/website/usage/text-classification.jade
@@ -0,0 +1,9 @@
+//- 💫 DOCS > USAGE > TEXT CLASSIFICATION
+
+include ../_includes/_mixins
+
++under-construction
+
++h(2, "example") Example
+
++github("spacy", "examples/training/train_textcat.py")
diff --git a/website/usage/training.jade b/website/usage/training.jade
new file mode 100644
index 000000000..8f15668c4
--- /dev/null
+++ b/website/usage/training.jade
@@ -0,0 +1,33 @@
+//- 💫 DOCS > USAGE > TRAINING
+
+include ../_includes/_mixins
+
+p
+    |  This guide describes how to train new statistical models for spaCy's
+    |  part-of-speech tagger, named entity recognizer and dependency parser.
+    |  Once the model is trained, you can then
+    |  #[+a("/usage/models#saving-loading") save and load] it.
+
++section("basics")
+    +h(2, "basics") Training basics
+    include _training/_basics
+
++section("ner")
+    +h(2, "ner") Training the named entity recognizer
+    include _training/_ner
+
++section("tagger-parser")
+    +h(2, "tagger-parser") Training the tagger and parser
+    include _training/_tagger-parser
+
++section("similarity")
+    +h(2, "similarity") Training a similarity model
+    include _training/_similarity
+
++section("textcat")
+    +h(2, "textcat") Training a text classification model
+    include _training/_textcat
+
++section("saving-loading")
+    +h(2, "saving-loading") Saving and loading models
+    include _training/_saving-loading
diff --git a/website/usage/v2.jade b/website/usage/v2.jade
new file mode 100644
index 000000000..66304c860
--- /dev/null
+++ b/website/usage/v2.jade
@@ -0,0 +1,527 @@
+//- 💫 DOCS > USAGE > WHAT'S NEW IN V2.0
+
+include ../_includes/_mixins
+
+p
+    |  We're very excited to finally introduce spaCy v2.0! On this page, you'll
+    |  find a summary of the new features, information on the backwards
+    |  incompatibilities, including a handy overview of what's been renamed or
+    |  deprecated. To help you make the most of v2.0, we also
+    |  #[strong re-wrote almost all of the usage guides and API docs], and added
+    |  more real-world examples. If you're new to spaCy, or just want to brush
+    |  up on some NLP basics and the details of the library, check out
+    |  the #[+a("/usage/spacy-101") spaCy 101 guide] that explains the most
+    |  important concepts with examples and illustrations.
+
++h(2, "summary") Summary
+
++grid.o-no-block
+    +grid-col("half")
+
+        p This release features
+            |  entirely new #[strong deep learning-powered models] for spaCy's tagger,
+            |  parser and entity recognizer. The new models are #[strong 20x smaller]
+            |  than the linear models that have powered spaCy until now: from 300 MB to
+            |  only 15 MB.
+
+        p
+            |  We've also made several usability improvements that are
+            |  particularly helpful for #[strong production deployments]. spaCy
+            |  v2 now fully supports the Pickle protocol, making it easy to use
+            |  spaCy with #[+a("https://spark.apache.org/") Apache Spark]. The
+            |  string-to-integer mapping is #[strong no longer stateful], making
+            |  it easy to reconcile annotations made in different processes.
+            |  Models are smaller and use less memory, and the APIs for serialization
+            |  are now much more consistent.
+
+    +table-of-contents
+        +item #[+a("#summary") Summary]
+        +item #[+a("#features") New features]
+        +item #[+a("#features-models") Neural network models]
+        +item #[+a("#features-pipelines") Improved processing pipelines]
+        +item #[+a("#features-text-classification") Text classification]
+        +item #[+a("#features-hash-ids") Hash values instead of integer IDs]
+        +item #[+a("#features-serializer") Saving, loading and serialization]
+        +item #[+a("#features-displacy") displaCy visualizer]
+        +item #[+a("#features-language") Language data and lazy loading]
+        +item #[+a("#features-matcher") Revised matcher API and phrase matcher]
+        +item #[+a("#incompat") Backwards incompatibilities]
+        +item #[+a("#migrating") Migrating from spaCy v1.x]
+        +item #[+a("#benchmarks") Benchmarks]
+
+p
+    |  The main usability improvements you'll notice in spaCy v2.0 are around
+    |  #[strong defining, training and loading your own models] and components.
+    |  The new neural network models make it much easier to train a model from
+    |  scratch, or update an existing model with a few examples. In v1.x, the
+    |  statistical models depended on the state of the #[code Vocab]. If you
+    |  taught the model a new word, you would have to save and load a lot of
+    |  data — otherwise the model wouldn't correctly recall the features of your
+    |  new example. That's no longer the case.
+
+p
+    |  Due to some clever use of hashing, the statistical models
+    |  #[strong never change size], even as they learn new vocabulary items.
+    |  The whole pipeline is also now fully differentiable. Even if you don't
+    |  have explicitly annotated data, you can update spaCy using all the
+    |  #[strong latest deep learning tricks] like adversarial training, noise
+    |  contrastive estimation or reinforcement learning.
+
++section("features")
+    +h(2, "features") New features
+
+    p
+        |  This section contains an overview of the most important
+        |  #[strong new features and improvements]. The #[+a("/api") API docs]
+        |  include additional  deprecation notes. New methods and functions that
+        |  were introduced in this version are marked with a #[+tag-new(2)] tag.
+
+    +h(3, "features-models") Convolutional neural network models
+
+    +aside-code("Example", "bash").
+        spacy download en # default English model
+        spacy download de # default German model
+        spacy download fr # default French model
+        spacy download es # default Spanish model
+        spacy download xx_ent_wiki_sm # multi-language NER
+
+    p
+        |  spaCy v2.0 features new neural models for tagging,
+        |  parsing and entity recognition. The models have
+        |  been designed and implemented from scratch specifically for spaCy, to
+        |  give you an unmatched balance of speed, size and accuracy. The new
+        |  models are #[strong 10× smaller], #[strong 20% more accurate],
+        |  and #[strong just as fast] as the previous generation.
+        |  #[strong GPU usage] is now supported via
+        |  #[+a("http://chainer.org") Chainer]'s CuPy module.
+
+    +infobox
+        |  #[+label-inline Usage:] #[+a("/models") Models directory],
+        |  #[+a("/usage/#gpu") Using spaCy with GPU]
+
+    +h(3, "features-pipelines") Improved processing pipelines
+
+    +aside-code("Example").
+        # Set custom attributes
+        Doc.set_extension('my_attr', default=False)
+        Token.set_extension('my_attr', getter=my_token_getter)
+        assert doc._.my_attr, token._.my_attr
+
+        # Add components to the pipeline
+        my_component = lambda doc: doc
+        nlp.add_pipe(my_component)
+
+    p
+        |  It's now much easier to #[strong customise the pipeline] with your own
+        |  components: functions that receive a #[code Doc] object, modify and
+        |  return it. Extensions let you write any
+        |  #[strong attributes, properties and methods] to the #[code Doc],
+        |  #[code Token] and #[code Span]. You can add data, implement new
+        |  features, integrate other libraries with spaCy or plug in your own
+        |  machine learning models.
+
+    +image
+        include ../assets/img/pipeline.svg
+
+    +infobox
+        |  #[+label-inline API:] #[+api("language") #[code Language]],
+        |  #[+api("doc#set_extension") #[code Doc.set_extension]],
+        |  #[+api("span#set_extension") #[code Span.set_extension]],
+        |  #[+api("token#set_extension") #[code Token.set_extension]]
+        |  #[+label-inline Usage:]
+        |  #[+a("/usage/processing-pipelines") Processing pipelines]
+        |  #[+label-inline Code:]
+        |  #[+src("/usage/examples#section-pipeline") Pipeline examples]
+
+    +h(3, "features-text-classification") Text classification
+
+    +aside-code("Example").
+        from spacy.lang.en import English
+        nlp = English(pipeline=['tensorizer', 'tagger', 'textcat'])
+
+    p
+        |  spaCy v2.0 lets you add text categorization models to spaCy pipelines.
+        |  The model supports classification with multiple, non-mutually exclusive
+        |  labels – so multiple labels can apply at once. You can change the model
+        |  architecture rather easily, but by default, the #[code TextCategorizer]
+        |  class uses a convolutional neural network to assign position-sensitive
+        |  vectors to each word in the document.
+
+    +infobox
+        |  #[+label-inline API:] #[+api("textcategorizer") #[code TextCategorizer]],
+        |  #[+api("doc#attributes") #[code Doc.cats]],
+        |  #[+api("goldparse#attributes") #[code GoldParse.cats]]#[br]
+        |  #[+label-inline Usage:] #[+a("/usage/text-classification") Text classification]
+
+    +h(3, "features-hash-ids") Hash values instead of integer IDs
+
+    +aside-code("Example").
+        doc = nlp(u'I love coffee')
+        assert doc.vocab.strings[u'coffee'] == 3197928453018144401
+        assert doc.vocab.strings[3197928453018144401] == u'coffee'
+
+        beer_hash = doc.vocab.strings.add(u'beer')
+        assert doc.vocab.strings[u'beer'] == beer_hash
+        assert doc.vocab.strings[beer_hash] == u'beer'
+
+    p
+        |  The #[+api("stringstore") #[code StringStore]] now resolves all strings
+        |  to hash values instead of integer IDs. This means that the string-to-int
+        |  mapping #[strong no longer depends on the vocabulary state], making a lot
+        |  of workflows much simpler, especially during training. Unlike integer IDs
+        |  in spaCy v1.x, hash values will #[strong always match] – even across
+        |  models. Strings can now be added explicitly using the new
+        |  #[+api("stringstore#add") #[code Stringstore.add]] method. A token's hash
+        |  is available via #[code token.orth].
+
+    +infobox
+        |  #[+label-inline API:] #[+api("stringstore") #[code StringStore]]
+        |  #[+label-inline Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
+
+    +h(3, "features-serializer") Saving, loading and serialization
+
+    +aside-code("Example").
+        nlp = spacy.load('en') # shortcut link
+        nlp = spacy.load('en_core_web_sm') # package
+        nlp = spacy.load('/path/to/en') # unicode path
+        nlp = spacy.load(Path('/path/to/en')) # pathlib Path
+
+        nlp.to_disk('/path/to/nlp')
+        nlp = English().from_disk('/path/to/nlp')
+
+    p
+        |  spay's serialization API has been made consistent across classes and
+        |  objects. All container classes, i.e. #[code Language], #[code Doc],
+        |  #[code Vocab] and #[code StringStore] now have a #[code to_bytes()],
+        |  #[code from_bytes()], #[code to_disk()] and #[code from_disk()] method
+        |  that supports the Pickle protocol.
+
+    p
+        |  The improved #[code spacy.load] makes loading models easier and more
+        |  transparent. You can load a model by supplying its
+        |  #[+a("/usage/models#usage") shortcut link], the name of an installed
+        |  #[+a("/usage/saving-loading#generating") model package] or a path.
+        |  The #[code Language] class to initialise will be determined based on the
+        |  model's settings. For a blank language, you can import the class directly,
+        |  e.g. #[code from spacy.lang.en import English].
+
+    +infobox
+        |  #[+label-inline API:] #[+api("spacy#load") #[code spacy.load]], #[+api("binder") #[code Binder]]
+        |  #[+label-inline Usage:] #[+a("/usage/saving-loading") Saving and loading]
+
+    +h(3, "features-displacy") displaCy visualizer with Jupyter support
+
+    +aside-code("Example").
+        from spacy import displacy
+        doc = nlp(u'This is a sentence about Facebook.')
+        displacy.serve(doc, style='dep') # run the web server
+        html = displacy.render(doc, style='ent') # generate HTML
+
+    p
+        |  Our popular dependency and named entity visualizers are now an official
+        |  part of the spaCy library. displaCy can run a simple web server, or
+        |  generate raw HTML markup or SVG files to be exported. You can pass in one
+        |  or more docs, and customise the style. displaCy also auto-detects whether
+        |  you're running #[+a("https://jupyter.org") Jupyter] and will render the
+        |  visualizations in your notebook.
+
+    +infobox
+        |  #[+label-inline API:] #[+api("displacy") #[code displacy]]
+        |  #[+label-inline Usage:] #[+a("/usage/visualizers") Visualizing spaCy]
+
+    +h(3, "features-language") Improved language data and lazy loading
+
+    p
+        |  Language-specfic data now lives in its own submodule, #[code spacy.lang].
+        |  Languages are lazy-loaded, i.e. only loaded when you import a
+        |  #[code Language] class, or load a model that initialises one. This allows
+        |  languages to contain more custom data, e.g. lemmatizer lookup tables, or
+        |  complex regular expressions. The language data has also been tidied up
+        |  and simplified. spaCy now also supports simple lookup-based lemmatization.
+
+    +infobox
+        |  #[+label-inline API:] #[+api("language") #[code Language]]
+        |  #[+label-inline Code:] #[+src(gh("spaCy", "spacy/lang")) #[code spacy/lang]]
+        |  #[+label-inline Usage:] #[+a("/usage/adding-languages") Adding languages]
+
+    +h(3, "features-matcher") Revised matcher API and phrase matcher
+
+    +aside-code("Example").
+        from spacy.matcher import Matcher, PhraseMatcher
+
+        matcher = Matcher(nlp.vocab)
+        matcher.add('HEARTS', None, [{'ORTH': '❤️', 'OP': '+'}])
+
+        phrasematcher = PhraseMatcher(nlp.vocab)
+        phrasematcher.add('OBAMA', None, nlp(u"Barack Obama"))
+
+    p
+        |  Patterns can now be added to the matcher by calling
+        |  #[+api("matcher-add") #[code matcher.add()]] with a match ID, an optional
+        |  callback function to be invoked on each match, and one or more patterns.
+        |  This allows you to write powerful, pattern-specific logic using only one
+        |  matcher. For example, you might only want to merge some entity types,
+        |  and set custom flags for other matched patterns. The new
+        |  #[+api("phrasematcher") #[code PhraseMatcher]] lets you efficiently
+        |  match very large terminology lists using #[code Doc] objects as match
+        |  patterns.
+
+    +infobox
+        |  #[+label-inline API:] #[+api("matcher") #[code Matcher]],
+        |  #[+api("phrasematcher") #[code PhraseMatcher]]
+        |  #[+label-inline Usage:] #[+a("/usage/rule-based-matching") Rule-based matching]
+
++section("incompat")
+    +h(2, "incompat") Backwards incompatibilities
+
+    +table(["Old", "New"])
+        +row
+            +cell
+                |  #[code spacy.en]
+                |  #[code spacy.xx]
+            +cell
+                |  #[code spacy.lang.en]
+                |  #[code spacy.lang.xx]
+
+        +row
+            +cell #[code orth]
+            +cell #[code lang.xx.lex_attrs]
+
+        +row
+            +cell #[code syntax.iterators]
+            +cell #[code lang.xx.syntax_iterators]
+
+        +row
+            +cell #[code Language.save_to_directory]
+            +cell #[+api("language#to_disk") #[code Language.to_disk]]
+
+        +row
+            +cell #[code Language.create_make_doc]
+            +cell #[+api("language#attributes") #[code Language.tokenizer]]
+
+        +row
+            +cell
+                |  #[code Vocab.load]
+                |  #[code Vocab.load_lexemes]
+            +cell
+                |  #[+api("vocab#from_disk") #[code Vocab.from_disk]]
+                |  #[+api("vocab#from_bytes") #[code Vocab.from_bytes]]
+
+        +row
+            +cell
+                |  #[code Vocab.dump]
+            +cell
+                |  #[+api("vocab#to_disk") #[code Vocab.to_disk]]#[br]
+                |  #[+api("vocab#to_bytes") #[code Vocab.to_bytes]]
+
+        +row
+            +cell
+                |  #[code Vocab.load_vectors]
+                |  #[code Vocab.load_vectors_from_bin_loc]
+            +cell
+                |  #[+api("vectors#from_disk") #[code Vectors.from_disk]]
+                |  #[+api("vectors#from_bytes") #[code Vectors.from_bytes]]
+
+        +row
+            +cell
+                |  #[code Vocab.dump_vectors]
+            +cell
+                |  #[+api("vectors#to_disk") #[code Vectors.to_disk]]
+                |  #[+api("vectors#to_bytes") #[code Vectors.to_bytes]]
+
+        +row
+            +cell
+                |  #[code StringStore.load]
+            +cell
+                |  #[+api("stringstore#from_disk") #[code StringStore.from_disk]]
+                |  #[+api("stringstore#from_bytes") #[code StringStore.from_bytes]]
+
+        +row
+            +cell
+                |  #[code StringStore.dump]
+            +cell
+                |  #[+api("stringstore#to_disk") #[code StringStore.to_disk]]
+                |  #[+api("stringstore#to_bytes") #[code StringStore.to_bytes]]
+
+        +row
+            +cell #[code Tokenizer.load]
+            +cell
+                |  #[+api("tokenizer#from_disk") #[code Tokenizer.from_disk]]
+                |  #[+api("tokenizer#from_bytes") #[code Tokenizer.from_bytes]]
+
+        +row
+            +cell #[code Tagger.load]
+            +cell
+                |  #[+api("tagger#from_disk") #[code Tagger.from_disk]]
+                |  #[+api("tagger#from_bytes") #[code Tagger.from_bytes]]
+
+        +row
+            +cell #[code DependencyParser.load]
+            +cell
+                |  #[+api("dependencyparser#from_disk") #[code DependencyParser.from_disk]]
+                |  #[+api("dependencyparser#from_bytes") #[code DependencyParser.from_bytes]]
+
+        +row
+            +cell #[code EntityRecognizer.load]
+            +cell
+                |  #[+api("entityrecognizer#from_disk") #[code EntityRecognizer.from_disk]]
+                |  #[+api("entityrecognizer#from_bytes") #[code EntityRecognizer.from_bytes]]
+
+        +row
+            +cell #[code Matcher.load]
+            +cell -
+
+        +row
+            +cell
+                |  #[code Matcher.add_pattern]
+                |  #[code Matcher.add_entity]
+            +cell #[+api("matcher#add") #[code Matcher.add]]
+
+        +row
+            +cell #[code Matcher.get_entity]
+            +cell #[+api("matcher#get") #[code Matcher.get]]
+
+        +row
+            +cell #[code Matcher.has_entity]
+            +cell #[+api("matcher#contains") #[code Matcher.__contains__]]
+
+        +row
+            +cell #[code Doc.read_bytes]
+            +cell #[+api("binder") #[code Binder]]
+
+        +row
+            +cell #[code Token.is_ancestor_of]
+            +cell #[+api("token#is_ancestor") #[code Token.is_ancestor]]
+
+        +row
+            +cell #[code cli.model]
+            +cell -
+
++section("migrating")
+    +h(2, "migrating") Migrating from spaCy 1.x
+
+    p
+        |  Because we'e made so many architectural changes to the library, we've
+        |  tried to #[strong keep breaking changes to a minimum]. A lot of projects
+        |  follow the philosophy that if you're going to break anything, you may as
+        |  well break everything. We think migration is easier if there's a logic to
+        |  what has changed.
+
+    p
+        |  We've therefore followed a policy of avoiding breaking changes to the
+        |  #[code Doc], #[code Span] and #[code Token] objects. This way, you can
+        |  focus on only migrating the code that does training, loading and
+        |  serialization — in other words, code that works with the #[code nlp]
+        |  object directly. Code that uses the annotations should continue to work.
+
+    +infobox("Important note")
+        |  If you've trained your own models, keep in mind that your train and
+        |  runtime inputs must match. This means you'll have to
+        |  #[strong retrain your models] with spaCy v2.0.
+
+    +h(3, "migrating-saving-loading") Saving, loading and serialization
+
+    p
+        |  Double-check all calls to #[code spacy.load()] and make sure they don't
+        |  use the #[code path] keyword argument. If you're only loading in binary
+        |  data and not a model package that can construct its own #[code Language]
+        |  class and pipeline, you should now use the
+        |  #[+api("language#from_disk") #[code Language.from_disk()]] method.
+
+    +code-new.
+        nlp = spacy.load('/model')
+        nlp = English().from_disk('/model/data')
+    +code-old nlp = spacy.load('en', path='/model')
+
+    p
+        |  Review all other code that writes state to disk or bytes.
+        |  All containers, now share the same, consistent API for saving and
+        |  loading. Replace saving with #[code to_disk()] or #[code to_bytes()], and
+        |  loading with #[code from_disk()] and #[code from_bytes()].
+
+    +code-new.
+        nlp.to_disk('/model')
+        nlp.vocab.to_disk('/vocab')
+
+    +code-old.
+        nlp.save_to_directory('/model')
+        nlp.vocab.dump('/vocab')
+
+    p
+        |  If you've trained models with input from v1.x, you'll need to
+        |  #[strong retrain them] with spaCy v2.0. All previous models will not
+        |  be compatible with the new version.
+
+    +h(3, "migrating-strings") Strings and hash values
+
+    p
+        |  The change from integer IDs to hash values may not actually affect your
+        |  code very much. However, if you're adding strings to the vocab manually,
+        |  you now need to call #[+api("stringstore#add") #[code StringStore.add()]]
+        |  explicitly. You can also now be sure that the string-to-hash mapping will
+        |  always match across vocabularies.
+
+    +code-new.
+        nlp.vocab.strings.add(u'coffee')
+        nlp.vocab.strings[u'coffee']       # 3197928453018144401
+        other_nlp.vocab.strings[u'coffee'] # 3197928453018144401
+
+    +code-old.
+        nlp.vocab.strings[u'coffee']       # 3672
+        other_nlp.vocab.strings[u'coffee'] # 40259
+
+    +h(3, "migrating-languages") Processing pipelines and language data
+
+    p
+        |  If you're importing language data or #[code Language] classes, make sure
+        |  to change your import statements to import from #[code spacy.lang]. If
+        |  you've added your own custom language, it needs to be moved to
+        |  #[code spacy/lang/xx] and adjusted accordingly.
+
+    +code-new from spacy.lang.en import English
+    +code-old from spacy.en import English
+
+    p
+        |  If you've been using custom pipeline components, check out the new
+        |  guide on #[+a("/usage/language-processing-pipelines") processing pipelines].
+        |  Appending functions to the pipeline still works – but the
+        |  #[+api("language#add_pipe") #[code add_pipe]] methods now makes this
+        |  much more convenient. Components of the processing pipeline can now
+        |  be disabled by passing a list of their names to the #[code disable]
+        |  keyword argument on load, or by simply demoving them from the
+        |  pipeline alltogether.
+
+    +code-new.
+        nlp = spacy.load('en', disable=['tagger', 'ner'])
+        nlp.remove_pipe('parser')
+    +code-old.
+        nlp = spacy.load('en', tagger=False, entity=False)
+        doc = nlp(u"I don't want parsed", parse=False)
+
+    +h(3, "migrating-matcher") Adding patterns and callbacks to the matcher
+
+    p
+        |  If you're using the matcher, you can now add patterns in one step. This
+        |  should be easy to update – simply merge the ID, callback and patterns
+        |  into one call to #[+api("matcher#add") #[code Matcher.add()]].
+
+    +code-new.
+        matcher.add('GoogleNow', merge_phrases, [{ORTH: 'Google'}, {ORTH: 'Now'}])
+
+    +code-old.
+        matcher.add_entity('GoogleNow', on_match=merge_phrases)
+        matcher.add_pattern('GoogleNow', [{ORTH: 'Google'}, {ORTH: 'Now'}])
+
+    p
+        |  If you've been using #[strong acceptor functions], you'll need to move
+        |  this logic into the
+        |  #[+a("/usage/rule-based-matching#on_match") #[code on_match] callbacks].
+        |  The callback function is invoked on every match and will give you access to
+        |  the doc, the index of the current match and all total matches. This lets
+        |  you both accept or reject the match, and define the actions to be
+        |  triggered.
+
++section("benchmarks")
+    +h(2, "benchmarks") Benchmarks
+
+    include _facts-figures/_benchmarks-models
diff --git a/website/usage/vectors-similarity.jade b/website/usage/vectors-similarity.jade
new file mode 100644
index 000000000..1e1139b20
--- /dev/null
+++ b/website/usage/vectors-similarity.jade
@@ -0,0 +1,18 @@
+//- 💫 DOCS > USAGE > WORD VECTORS & SIMILARITIES
+
+include ../_includes/_mixins
+
++section("basics")
+    include _vectors-similarity/_basics
+
++section("in-context")
+    +h(2, "in-context") Similarities in context
+    include _vectors-similarity/_in-context
+
++section("custom")
+    +h(2, "custom") Customising word vectors
+    include _vectors-similarity/_custom
+
++section("gpu")
+    +h(2, "gpu") Storing vectors on a GPU
+    include _vectors-similarity/_gpu
diff --git a/website/usage/visualizers.jade b/website/usage/visualizers.jade
new file mode 100644
index 000000000..a092404ac
--- /dev/null
+++ b/website/usage/visualizers.jade
@@ -0,0 +1,48 @@
+//- 💫 DOCS > USAGE > VISUALIZERS
+
+include ../_includes/_mixins
+
++section
+    p
+        |  As of v2.0, our popular visualizers, #[+a(DEMOS_URL + "/displacy") displaCy]
+        |  and #[+a(DEMOS_URL + "/displacy-ent") displaCy #[sup ENT]] are finally an
+        |  official part of the library. Visualizing a dependency parse or named
+        |  entities in a text is not only a fun NLP demo – it can also be incredibly
+        |  helpful in speeding up development and debugging your code and training
+        |  process. If you're running a #[+a("https://jupyter.org") Jupyter] notebook,
+        |  displaCy will detect this and return the markup in a format
+        |  #[+a("#jupyter") ready to be rendered and exported].
+
+    +aside("What about the old visualizers?")
+        |  Our JavaScript-based visualizers #[+src(gh("displacy")) #[code displacy.js]] and
+        |  #[+src(gh("displacy-ent")) #[code displacy-ent.js]] will still be available on
+        |  GitHub. If you're looking to implement web-based visualizations, we
+        |  generally recommend using those instead of spaCy's built-in
+        |  #[code displacy] module. It'll allow your application to perform all
+        |  rendering on the client and only rely on the server for the text
+        |  processing. The generated markup is also more compatible with modern web
+        |  standards.
+
+    p
+        |  The quickest way visualize  #[code Doc] is to use
+        |  #[+api("displacy#serve") #[code displacy.serve]]. This will spin up a
+        |  simple web server and let you view the result straight from your browser.
+        |  displaCy can either take a single #[code Doc] or a list of #[code Doc]
+        |  objects as its first argument. This lets you construct them however you
+        |  like – using any model or modifications you like.
+
++section("dep")
+    +h(2, "dep") Visualizing the dependency parse
+    include _visualizers/_dep
+
++section("ent")
+    +h(2, "ent") Visualizing the entity recognizer
+    include _visualizers/_ent
+
++section("jupyter")
+    +h(2, "jupyter") Using displaCy in Jupyter notebooks
+    include _visualizers/_jupyter
+
++section("html")
+    +h(2, "html") Rendering HTML
+    include _visualizers/_html