From 4c1b6a4c812402ea8087da75f127f723ef070349 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 8 Jun 2017 15:24:37 -0500 Subject: [PATCH 001/739] Set data augmentation by default --- spacy/cli/train.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index af028dae5..984096d8c 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -68,6 +68,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, batch_sizes = util.compounding(util.env_opt('batch_from', 1), util.env_opt('batch_to', 64), util.env_opt('batch_compound', 1.001)) + gold_preproc = util.env_opt('gold_preproc', False) + noise_level = util.env_opt('noise_level', 0.25) if resume: prints(output_path / 'model19.pickle', title="Resuming training") @@ -86,7 +88,9 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, 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) + gold_preproc=gold_preproc, + noise_level=noise_level, + max_length=0) losses = {} for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) @@ -105,7 +109,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, scorer = nlp_loaded.evaluate( corpus.dev_docs( nlp_loaded, - gold_preproc=False)) + gold_preproc=gold_preproc)) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: file_.write(json_dumps(scorer.scores)) From c91642efd5dc0d5424af7b3095392bd9d441451a Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Sat, 1 Jul 2017 11:43:54 +0200 Subject: [PATCH 002/739] Port over changes from #1168 --- spacy/lang/zh/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py index d63323b4e..3f68336f8 100644 --- a/spacy/lang/zh/__init__.py +++ b/spacy/lang/zh/__init__.py @@ -15,6 +15,7 @@ class Chinese(Language): raise ImportError("The Chinese tokenizer requires the Jieba library: " "https://github.com/fxsjy/jieba") words = list(jieba.cut(text, cut_all=True)) + words=[x for x in words if x] return Doc(self.vocab, words=words, spaces=[False]*len(words)) From f014138c1110e7dedef40ae9887a6589f0a06156 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 00:16:52 +0200 Subject: [PATCH 003/739] Fix parser tests --- spacy/tests/parser/test_neural_parser.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 1fa9a838b..4173acef5 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -36,7 +36,7 @@ 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)[0] @pytest.fixture def doc(vocab): @@ -45,29 +45,29 @@ 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)[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): parser.model = model tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) - d_tokvecs = parser.update((doc, tokvecs), gold) - assert d_tokvecs.shape == tokvecs.shape + d_tokvecs = parser.update(([doc], tokvecs), [gold]) + assert d_tokvecs[0].shape == tokvecs[0].shape def optimize(weights, gradient, key=None): weights -= 0.001 * gradient bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs.sum() == 0. + assert d_tokvecs[0].sum() == 0. From 727481377e1a7052cc025353f29044387043e44f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 00:17:17 +0200 Subject: [PATCH 004/739] Add text-classifer thinc models --- spacy/_ml.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index 6d02dfd27..6b260e287 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -130,6 +130,7 @@ 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}): @@ -282,3 +283,62 @@ 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 build_text_classifier(nr_class, width=64, **cfg): + with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): + embed_lower = HashEmbed(width, 300, column=1) + embed_prefix = HashEmbed(width//2, 300, column=2) + embed_suffix = HashEmbed(width//2, 300, column=3) + embed_shape = HashEmbed(width//2, 300, column=4) + + model = ( + FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE]) + >> _flatten_add_lengths + >> with_getitem(0, + (embed_lower | embed_prefix | embed_suffix | embed_shape) + >> Maxout(width, width+(width//2)*3) + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) + ) + >> Pooling(mean_pool, max_pool) + >> Residual(ReLu(width*2, width*2)) + >> zero_init(Affine(nr_class, width*2, drop_factor=0.0)) + >> logistic + ) + model.lsuv = False + return model + From 7ea50182a57f5804a55b68689a026e415e027ea8 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 00:17:47 +0200 Subject: [PATCH 005/739] Add support for text-classification labels to GoldParse --- spacy/gold.pxd | 1 + spacy/gold.pyx | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spacy/gold.pxd b/spacy/gold.pxd index 364e083fb..5873b23ac 100644 --- a/spacy/gold.pxd +++ b/spacy/gold.pxd @@ -29,6 +29,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..8260cdd02 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -381,7 +381,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=tuple()): """Create a GoldParse. doc (Doc): The document the annotations refer to. @@ -392,6 +393,12 @@ 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 (iterable): A sequence of labels for text classification. Each + label 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. RETURNS (GoldParse): The newly constructed object. """ if words is None: @@ -421,6 +428,17 @@ cdef class GoldParse: self.c.has_dep = self.mem.alloc(len(doc), sizeof(int)) self.c.ner = self.mem.alloc(len(doc), sizeof(Transition)) + self.cats = [] + for item in cats: + if isinstance(item, int): + self.cats.append((0, len(doc.text), self.vocab.strings[item])) + elif isinstance(item, str): + self.cats.append((0, len(doc.text), item)) + elif hasattr(item, '__len__') and len(item) == 3: + start_char, end_char, label = item + if isinstance(label, int): + label = self.vocab.strings[label] + self.cats.append((start_char, end_char, label)) self.words = [None] * len(doc) self.tags = [None] * len(doc) self.heads = [None] * len(doc) From a231b56d404f41a73b6ee7157ec786631faa54b1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 00:18:15 +0200 Subject: [PATCH 006/739] Add text-classification hook to pipeline --- spacy/pipeline.pyx | 230 ++++++++++++++++++++++++++++----------------- 1 file changed, 145 insertions(+), 85 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 9137dc58e..556d97e5a 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -42,10 +42,89 @@ 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 build_text_classifier from .parts_of_speech import X -class TokenVectorEncoder(object): +class BaseThincComponent(object): + name = None + + @classmethod + def Model(cls, *shape, **kwargs): + raise NotImplementedError + + def __init__(self, vocab, model=True, **cfg): + raise NotImplementedError + + 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): + raise NotImplementedError + + def set_annotations(self, docs, scores): + raise NotImplementedError + + def update(self, docs_tensors, golds, state=None, drop=0., sgd=None, losses=None): + raise NotImplementedError + + def get_loss(self, docs, golds, scores): + raise NotImplementedError + + def begin_training(self, gold_tuples, pipeline=None): + token_vector_width = pipeline[0].model.nO + if self.model is True: + self.model = self.Model(1, token_vector_width) + + 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()) + )) + 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 + + +class TokenVectorEncoder(BaseThincComponent): """Assign position-sensitive vectors to tokens, using a CNN or RNN.""" name = 'tensorizer' @@ -155,51 +234,8 @@ class TokenVectorEncoder(object): 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 - - -class NeuralTagger(object): +class NeuralTagger(BaseThincComponent): name = 'tagger' def __init__(self, vocab, model=True): self.vocab = vocab @@ -252,7 +288,6 @@ class NeuralTagger(object): loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) - return d_tokvecs def get_loss(self, docs, golds, scores): @@ -423,7 +458,7 @@ class NeuralLabeller(NeuralTagger): return float(loss), d_scores -class SimilarityHook(object): +class SimilarityHook(BaseThincComponent): """ Experimental @@ -477,48 +512,65 @@ class SimilarityHook(object): if self.model is True: self.model = self.Model(pipeline[0].model.nO) - 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 TextClassifier(BaseThincComponent): + name = 'text-classifier' - 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, 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.labels = cfg.get('labels', ['LABEL']) + + 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 self.labels: + doc.cats[label] = float(scores[i, j]) + + def update(self, docs_tensors, golds, state=None, drop=0., sgd=None, losses=None): + docs, tensors = docs_tensors + scores, bp_scores = self.model.begin_update(docs, drop=drop) + loss, d_scores = self.get_loss(docs, golds, scores) + d_tensors = bp_scores(d_scores, sgd=sgd) + if losses is not None: + losses.setdefault(self.name, 0.0) + losses[self.name] += loss + return d_tensors + + def get_loss(self, docs, golds, scores): + truths = numpy.zeros((len(golds), len(self.labels)), dtype='f') + for i, gold in enumerate(golds): + for j, label in enumerate(self.labels): + truths[i, j] = label in gold.cats + truths = self.model.ops.asarray(truths) + d_scores = (scores-truths) / scores.shape[0] + mean_square_error = ((scores-truths)**2).sum(axis=1).mean() + return mean_square_error, d_scores + + def begin_training(self, gold_tuples, pipeline=None): + token_vector_width = pipeline[0].model.nO 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.model = self.Model(len(self.labels), token_vector_width) cdef class EntityRecognizer(LinearParser): @@ -569,6 +621,14 @@ cdef class NeuralEntityRecognizer(NeuralParser): nr_feature = 6 + def predict_confidences(self, docs): + tensors = [d.tensor for d in docs] + samples = [] + for i in range(10): + states = self.parse_batch(docs, tensors, drop=0.3) + for state in states: + samples.append(self._get_entities(state)) + def __reduce__(self): return (NeuralEntityRecognizer, (self.vocab, self.moves, self.model), None, None) From 0ca58324271aeb56e949be8afacac4a78634bcd7 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 00:18:49 +0200 Subject: [PATCH 007/739] Improve negative example handling in NER oracle --- spacy/syntax/ner.pyx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 93d98a8cd..656c84e4c 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -127,6 +127,8 @@ cdef class BiluoPushDown(TransitionSystem): if name == '-' or name == None: move_str = 'M' label = 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' @@ -308,6 +310,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 +355,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 +426,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 From 3da1063b36c118c71d3332ca178afdf09f544e16 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 15:02:55 +0200 Subject: [PATCH 008/739] Add beam decoding to parser, to allow NER uncertainties --- spacy/syntax/arc_eager.pyx | 22 ++++++ spacy/syntax/ner.pyx | 19 ++++++ spacy/syntax/nn_parser.pyx | 105 ++++++++++++++++++++++++++--- spacy/syntax/transition_system.pyx | 4 ++ 4 files changed, 140 insertions(+), 10 deletions(-) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 7df5fe081..d4367c6df 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 @@ -510,3 +512,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/ner.pyx b/spacy/syntax/ner.pyx index 656c84e4c..023707aaa 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 @@ -122,6 +125,22 @@ 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 + cdef Transition lookup_transition(self, object name) except *: cdef attr_t label if name == '-' or name == None: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 91a651200..0b39e2216 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -29,6 +29,7 @@ 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 @@ -110,7 +111,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 +127,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() @@ -305,7 +304,7 @@ cdef class Parser: 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 +313,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.001) + cdef Beam beam + if beam_width == 1: + states = self.parse_batch([doc], [doc.tensor]) + self.set_annotations([doc], states) + return doc + else: + beam = self.beam_parse([doc], [doc.tensor], + 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=1000, int n_threads=2, + beam_width=1, beam_density=0.001): """ Process a stream of documents. @@ -336,7 +350,11 @@ cdef class Parser: 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, tokvecs) + else: + parse_states = self.beam_parse(docs, tokvecs, + beam_width=beam_width, beam_density=beam_density) self.set_annotations(docs, parse_states) yield from docs @@ -404,6 +422,45 @@ cdef class Parser: next_step.push_back(st) return states + def beam_parse(self, docs, tokvecses, int beam_width=8, 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 + tokvecs = self.model[0].ops.flatten(tokvecses) + cuda_stream = get_cuda_stream() + state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, + cuda_stream, 0.0) + beams = [] + cdef int offset = 0 + 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) + states.append(stcls) + token_ids = self.get_token_ids(states) + vectors = state2vec(token_ids) + scores = vec2scores(vectors) + 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 j in range(nr_class): + beam.scores[i][j] = scores[i, j] + 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: @@ -560,7 +617,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 @@ -762,3 +820,30 @@ 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) + + +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/transition_system.pyx b/spacy/syntax/transition_system.pyx index e33a29ac2..27b375bba 100644 --- a/spacy/syntax/transition_system.pyx +++ b/spacy/syntax/transition_system.pyx @@ -137,6 +137,10 @@ 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): From 289f23df515c168ef7d2ae57e6054fefa07def3c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 20 Jul 2017 15:03:10 +0200 Subject: [PATCH 009/739] Test beam parsing --- spacy/tests/parser/test_neural_parser.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 4173acef5..85ceabbc5 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -71,3 +71,11 @@ def test_update_doc(parser, tok2vec, model, doc, gold): weights -= 0.001 * gradient bp_tokvecs(d_tokvecs, sgd=optimize) assert d_tokvecs[0].sum() == 0. + + +def test_predict_doc_beam(parser, tok2vec, model, doc): + doc.tensor = tok2vec([doc])[0] + parser.model = model + parser(doc, beam_width=32, beam_density=0.001) + for word in doc: + print(word.text, word.head, word.dep_) From 374ab3ecfbda663bcdc6df95ba40e257c6a2dfe4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 00:32:49 +0200 Subject: [PATCH 010/739] Increment alpha version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 8364dcfc9..cd4f6f832 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a1' +__version__ = '2.0.0a2' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From a6a21599698c815b30e80edc1e6f3af7ca20f415 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 00:34:15 +0200 Subject: [PATCH 011/739] Add slot for text categories to Doc --- spacy/tokens/doc.pxd | 1 + spacy/tokens/doc.pyx | 1 + 2 files changed, 2 insertions(+) diff --git a/spacy/tokens/doc.pxd b/spacy/tokens/doc.pxd index ef1f85ea7..d0c83e0f8 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 diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index 1eceab00d..822a0152d 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -117,6 +117,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 = {} From baa3d81c3518e9e81bd6bc89382fca1d6c727f33 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 01:13:36 +0200 Subject: [PATCH 012/739] Add text categorizer to Language --- spacy/language.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index bd90fa395..dcdfd7847 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -22,6 +22,7 @@ from .pipeline import NeuralDependencyParser, EntityRecognizer from .pipeline import TokenVectorEncoder, NeuralTagger, NeuralEntityRecognizer from .pipeline import NeuralLabeller from .pipeline import SimilarityHook +from .pipeline import TextCategorizer from .compat import json_dumps from .attrs import IS_STOP @@ -107,6 +108,8 @@ class BaseDefaults(object): NeuralDependencyParser(nlp.vocab, **cfg), nonproj.deprojectivize], 'ner': lambda nlp, **cfg: [NeuralEntityRecognizer(nlp.vocab, **cfg)], + 'similarity': lambda nlp, **cfg: [SimilarityHook(nlp.vocab, **cfg)], + 'textcat': lambda nlp, **cfg: [TextCategorizer(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)], @@ -115,7 +118,6 @@ class BaseDefaults(object): nonproj.deprojectivize, ], 'entities': lambda nlp, **cfg: [NeuralEntityRecognizer(nlp.vocab, **cfg)], - 'similarity': lambda nlp, **cfg: [SimilarityHook(nlp.vocab, **cfg)] } token_match = TOKEN_MATCH From 24244939700a061f206db148786a4611040d57b8 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 01:13:54 +0200 Subject: [PATCH 013/739] Remove unnecessary import of Mock --- spacy/tests/parser/test_neural_parser.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 85ceabbc5..42b55745f 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 From b3a749610efd5b7c63b639bc21694dca37319cc5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 01:14:07 +0200 Subject: [PATCH 014/739] Fix name of TextCategorizer --- spacy/pipeline.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 556d97e5a..1b2e913c3 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -513,8 +513,8 @@ class SimilarityHook(BaseThincComponent): self.model = self.Model(pipeline[0].model.nO) -class TextClassifier(BaseThincComponent): - name = 'text-classifier' +class TextCategorizer(BaseThincComponent): + name = 'textcat' @classmethod def Model(cls, nr_class, width=64, **cfg): From 28244df4dafa8b83ea617349c479925663a8d173 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 01:48:35 +0200 Subject: [PATCH 015/739] Add test for beam parsing --- spacy/tests/parser/test_beam_parse.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 spacy/tests/parser/test_beam_parse.py diff --git a/spacy/tests/parser/test_beam_parse.py b/spacy/tests/parser/test_beam_parse.py new file mode 100644 index 000000000..da5f43d5e --- /dev/null +++ b/spacy/tests/parser/test_beam_parse.py @@ -0,0 +1,10 @@ +import spacy +import pytest + +@pytest.mark.models +def test_beam_parse(): + nlp = spacy.load('en_core_web_sm') + doc = nlp(u'Australia is a country', disable=['ner']) + ents = nlp.entity(doc, beam_width=2) + print(ents) + From d6a5c2c85aeeaf66813b861f54933f5554d75493 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 01:48:58 +0200 Subject: [PATCH 016/739] Add test for NER --- spacy/tests/parser/test_ner.py | 73 ++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 spacy/tests/parser/test_ner.py 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] From 1ddbeddca2df65947b900f63ccc04ce4dad152ae Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Sat, 22 Jul 2017 15:00:58 +0200 Subject: [PATCH 017/739] Fix typo --- website/docs/api/annotation.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/api/annotation.jade b/website/docs/api/annotation.jade index 048e69897..ce18878b7 100644 --- a/website/docs/api/annotation.jade +++ b/website/docs/api/annotation.jade @@ -40,7 +40,7 @@ p +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 + | 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". From 23d976ed00abb0d04ef1a35a7d42db0ef3e1942b Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:55:14 +0200 Subject: [PATCH 018/739] Add Doc.cats attribute and missing v2 tag --- website/docs/api/doc.jade | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/website/docs/api/doc.jade b/website/docs/api/doc.jade index f82a26c9e..929985144 100644 --- a/website/docs/api/doc.jade +++ b/website/docs/api/doc.jade @@ -558,10 +558,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 - From d2a7e5b8e52ae8d90d365225ddc3eca918cf316a Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:55:35 +0200 Subject: [PATCH 019/739] Add GoldParse.cats attribute --- website/docs/api/goldparse.jade | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/website/docs/api/goldparse.jade b/website/docs/api/goldparse.jade index 7818912c3..03118343d 100644 --- a/website/docs/api/goldparse.jade +++ b/website/docs/api/goldparse.jade @@ -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 From d05ab1b3a0f7ac4e586b4a295d7be8cccd49fa2c Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:55:53 +0200 Subject: [PATCH 020/739] Add text classification to 101 overview and change order --- website/docs/usage/spacy-101.jade | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/website/docs/usage/spacy-101.jade b/website/docs/usage/spacy-101.jade index f657ebf11..a54e5cf66 100644 --- a/website/docs/usage/spacy-101.jade +++ b/website/docs/usage/spacy-101.jade @@ -129,13 +129,6 @@ p | 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 @@ -143,6 +136,18 @@ p | 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. From 0fb89dd204a4caec3d48bff3b8d0ec5868415759 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:56:07 +0200 Subject: [PATCH 021/739] Add text classification usage guide template --- website/docs/usage/_data.json | 6 ++++++ website/docs/usage/text-classification.jade | 5 +++++ 2 files changed, 11 insertions(+) create mode 100644 website/docs/usage/text-classification.jade diff --git a/website/docs/usage/_data.json b/website/docs/usage/_data.json index 81deeb402..c8373a095 100644 --- a/website/docs/usage/_data.json +++ b/website/docs/usage/_data.json @@ -16,6 +16,7 @@ "Rule-based matching": "rule-based-matching", "Adding languages": "adding-languages", "Processing pipelines": "language-processing-pipeline", + "Text classification": "text-classification", "Deep learning": "deep-learning", "Production use": "production-use", "Training": "training", @@ -106,6 +107,11 @@ "next": "production use" }, + "text-classification": { + "title": "Text classification", + "next": "training" + }, + "production-use": { "title": "Production use", "next": "training" diff --git a/website/docs/usage/text-classification.jade b/website/docs/usage/text-classification.jade new file mode 100644 index 000000000..33e384dbd --- /dev/null +++ b/website/docs/usage/text-classification.jade @@ -0,0 +1,5 @@ +//- 💫 DOCS > USAGE > TEXT CLASSIFICATION + +include ../../_includes/_mixins + ++under-construction From ab1a4e8b3c2426289ce0d0cb549e95494a53dfca Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:56:25 +0200 Subject: [PATCH 022/739] Add Tensorizer API docs stub --- website/docs/api/_data.json | 7 +++++++ website/docs/api/tensorizer.jade | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 website/docs/api/tensorizer.jade diff --git a/website/docs/api/_data.json b/website/docs/api/_data.json index a2e447dc8..1102c679a 100644 --- a/website/docs/api/_data.json +++ b/website/docs/api/_data.json @@ -17,6 +17,7 @@ "Span": "span", "Language": "language", "Tokenizer": "tokenizer", + "Tensorizer": "tensorizer", "Tagger": "tagger", "DependencyParser": "dependencyparser", "EntityRecognizer": "entityrecognizer", @@ -147,6 +148,12 @@ "source": "spacy/pipeline.pyx" }, + "tensorizer": { + "title": "Tensorizer", + "tag": "class", + "source": "spacy/pipeline.pyx" + }, + "goldparse": { "title": "GoldParse", "tag": "class", diff --git a/website/docs/api/tensorizer.jade b/website/docs/api/tensorizer.jade new file mode 100644 index 000000000..9abd6793b --- /dev/null +++ b/website/docs/api/tensorizer.jade @@ -0,0 +1,7 @@ +//- 💫 DOCS > API > TENSORIZER + +include ../../_includes/_mixins + +p Add a tensor with position-sensitive meaning representations to a #[code Doc]. + ++under-construction From f085b88f9d61f701f4b7d937b584dfe6ef4fc35d Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:56:33 +0200 Subject: [PATCH 023/739] Add TextCategorizer API docs stub --- website/docs/api/_data.json | 7 +++++++ website/docs/api/textcategorizer.jade | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 website/docs/api/textcategorizer.jade diff --git a/website/docs/api/_data.json b/website/docs/api/_data.json index 1102c679a..e413f200c 100644 --- a/website/docs/api/_data.json +++ b/website/docs/api/_data.json @@ -21,6 +21,7 @@ "Tagger": "tagger", "DependencyParser": "dependencyparser", "EntityRecognizer": "entityrecognizer", + "TextCategorizer": "textcategorizer", "Matcher": "matcher", "Lexeme": "lexeme", "Vocab": "vocab", @@ -130,6 +131,12 @@ "source": "spacy/pipeline.pyx" }, + "textcategorizer": { + "title": "TextCategorizer", + "tag": "class", + "source": "spacy/pipeline.pyx" + }, + "dependencyparser": { "title": "DependencyParser", "tag": "class", diff --git a/website/docs/api/textcategorizer.jade b/website/docs/api/textcategorizer.jade new file mode 100644 index 000000000..926d957f7 --- /dev/null +++ b/website/docs/api/textcategorizer.jade @@ -0,0 +1,21 @@ +//- 💫 DOCS > API > TEXTCATEGORIZER + +include ../../_includes/_mixins + +p + | Add text categorization models to spaCy pipelines. The model supports + | classification with multiple, non-mutually exclusive labels. + +p + | 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. + ++under-construction From ab8ffbaab7f01524c6633e94d3c485704dbd4b2d Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 22 Jul 2017 17:56:51 +0200 Subject: [PATCH 024/739] Add text classification to v2 overview --- website/docs/usage/v2.jade | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/website/docs/usage/v2.jade b/website/docs/usage/v2.jade index bbcfe865f..d9727c62b 100644 --- a/website/docs/usage/v2.jade +++ b/website/docs/usage/v2.jade @@ -38,6 +38,7 @@ p +item #[+a("#summary") Summary] +item #[+a("#features") New features] +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] @@ -102,6 +103,26 @@ p | #[strong API:] #[+api("language") #[code Language]] | #[strong Usage:] #[+a("/docs/usage/language-processing-pipeline") Processing text] ++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 + | #[strong API:] #[+api("textcategorizer") #[code TextCategorizer]], + | #[+api("doc#attributes") #[code Doc.cats]], + | #[+api("goldparse#attributes") #[code GoldParse.cats]]#[br] + | #[strong Usage:] #[+a("/docs/usage/text-classification") Text classification] + +h(3, "features-hash-ids") Hash values instead of integer IDs +aside-code("Example"). From 6ffec9dfea21142ce425f7052ebd3090316404f2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:03:40 +0200 Subject: [PATCH 025/739] Update _ml, for textcat model --- spacy/_ml.py | 109 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 102 insertions(+), 7 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 6b260e287..50deaeb1d 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -3,6 +3,7 @@ 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.neural.util import get_array_module from thinc.neural._classes.convolution import ExtractWindow from thinc.neural._classes.static_vectors import StaticVectors @@ -12,14 +13,61 @@ 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 +from thinc.api import FeatureExtracter, with_getitem +from thinc.neural.pooling import Pooling, max_pool, mean_pool -from .attrs import ID, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP +from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc import numpy import io +@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 + + +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.: return @@ -317,19 +365,66 @@ def preprocess_doc(docs, drop=0.): return (keys, vals, lengths), None +# This belongs in thinc +def wrap(func, *child_layers): + model = layerize(func) + model._layers.extend(child_layers) + def on_data(self, X, y): + for child in self._layers: + for hook in child.on_data_hooks: + hook(child, X, y) + model.on_data_hooks.append(on_data) + return model + +# This belongs in thinc +def uniqued(layer, column=0): + '''Group inputs to a layer, so that the layer only has to compute + for the unique values. The data is transformed back before output, and the same + transformation is applied for the gradient. Effectively, this is a cache + local to each minibatch. + + The uniqued wrapper is useful for word inputs, because common words are + seen often, but we may want to compute complicated features for the words, + using e.g. character LSTM. + ''' + def uniqued_fwd(X, drop=0.): + keys = X[:, column] + if not isinstance(keys, numpy.ndarray): + keys = keys.get() + uniq_keys, ind, inv, counts = numpy.unique(keys, return_index=True, + return_inverse=True, + return_counts=True) + Y_uniq, bp_Y_uniq = layer.begin_update(X[ind], drop=drop) + Y = Y_uniq[inv].reshape((X.shape[0],) + Y_uniq.shape[1:]) + def uniqued_bwd(dY, sgd=None): + dY_uniq = layer.ops.allocate(Y_uniq.shape, dtype='f') + layer.ops.scatter_add(dY_uniq, inv, dY) + d_uniques = bp_Y_uniq(dY_uniq, sgd=sgd) + if d_uniques is not None: + dX = (d_uniques / counts)[inv] + return dX + else: + return None + return Y, uniqued_bwd + model = wrap(uniqued_fwd, layer) + return model + + def build_text_classifier(nr_class, width=64, **cfg): with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): - embed_lower = HashEmbed(width, 300, column=1) - embed_prefix = HashEmbed(width//2, 300, column=2) - embed_suffix = HashEmbed(width//2, 300, column=3) - embed_shape = HashEmbed(width//2, 300, column=4) + embed_lower = HashEmbed(width, 1000, column=1) + embed_prefix = HashEmbed(width//2, 1000, column=2) + embed_suffix = HashEmbed(width//2, 1000, column=3) + embed_shape = HashEmbed(width//2, 1000, column=4) model = ( FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE]) >> _flatten_add_lengths >> with_getitem(0, - (embed_lower | embed_prefix | embed_suffix | embed_shape) - >> Maxout(width, width+(width//2)*3) + uniqued( + (embed_lower | embed_prefix | embed_suffix | embed_shape) + >> Maxout(width, width+(width//2)*3) + ) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) From ed6c85fa3ce72e09486d510047a4049ab7bac85c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:04:03 +0200 Subject: [PATCH 026/739] Fix loading of text categories in GoldParse --- spacy/gold.pyx | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/spacy/gold.pyx b/spacy/gold.pyx index 8260cdd02..001e19504 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -148,7 +148,7 @@ def minibatch(items, size=8): ''' items = iter(items) while True: - batch_size = next(size) #if hasattr(size, '__next__') else size + batch_size = next(size) if hasattr(size, '__next__') else size batch = list(cytoolz.take(int(batch_size), items)) if len(batch) == 0: break @@ -428,17 +428,7 @@ cdef class GoldParse: self.c.has_dep = self.mem.alloc(len(doc), sizeof(int)) self.c.ner = self.mem.alloc(len(doc), sizeof(Transition)) - self.cats = [] - for item in cats: - if isinstance(item, int): - self.cats.append((0, len(doc.text), self.vocab.strings[item])) - elif isinstance(item, str): - self.cats.append((0, len(doc.text), item)) - elif hasattr(item, '__len__') and len(item) == 3: - start_char, end_char, label = item - if isinstance(label, int): - label = self.vocab.strings[label] - self.cats.append((start_char, end_char, label)) + self.cats = list(cats) self.words = [None] * len(doc) self.tags = [None] * len(doc) self.heads = [None] * len(doc) From b55714d5d1043c15b3eb69d17e2f094aeb276efc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:04:43 +0200 Subject: [PATCH 027/739] Make gold_tuples arg optional in begin_training --- spacy/pipeline.pyx | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 1b2e913c3..e7e6dcdfc 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -80,7 +80,7 @@ class BaseThincComponent(object): def get_loss(self, docs, golds, scores): raise NotImplementedError - def begin_training(self, gold_tuples, pipeline=None): + def begin_training(self, gold_tuples=tuple(), pipeline=None): token_vector_width = pipeline[0].model.nO if self.model is True: self.model = self.Model(1, token_vector_width) @@ -223,7 +223,7 @@ class TokenVectorEncoder(BaseThincComponent): # 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. @@ -311,7 +311,7 @@ class NeuralTagger(BaseThincComponent): 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: @@ -420,7 +420,7 @@ class NeuralLabeller(NeuralTagger): 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): gold_tuples = nonproj.preprocess_training_data(gold_tuples) for raw_text, annots_brackets in gold_tuples: for annots, brackets in annots_brackets: @@ -502,7 +502,7 @@ class SimilarityHook(BaseThincComponent): 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. @@ -517,7 +517,7 @@ class TextCategorizer(BaseThincComponent): name = 'textcat' @classmethod - def Model(cls, nr_class, width=64, **cfg): + def Model(cls, nr_class=1, width=64, **cfg): return build_text_classifier(nr_class, width, **cfg) def __init__(self, vocab, model=True, **cfg): @@ -544,7 +544,7 @@ class TextCategorizer(BaseThincComponent): def set_annotations(self, docs, scores): for i, doc in enumerate(docs): - for j, label in self.labels: + for j, label in enumerate(self.labels): doc.cats[label] = float(scores[i, j]) def update(self, docs_tensors, golds, state=None, drop=0., sgd=None, losses=None): @@ -567,8 +567,11 @@ class TextCategorizer(BaseThincComponent): mean_square_error = ((scores-truths)**2).sum(axis=1).mean() return mean_square_error, d_scores - def begin_training(self, gold_tuples, pipeline=None): - token_vector_width = pipeline[0].model.nO + def begin_training(self, gold_tuples=tuple(), pipeline=None): + if pipeline: + token_vector_width = pipeline[0].model.nO + else: + token_vector_width = 64 if self.model is True: self.model = self.Model(len(self.labels), token_vector_width) From f5de8deeecd4416d8ded99bef400630e30840c16 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:04:53 +0200 Subject: [PATCH 028/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index cd4f6f832..8f6fbaa1e 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a2' +__version__ = '2.0.0a3' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From ded0df5e2f718d0ee3d9f013f3c90d3c867bf97a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:14:37 +0200 Subject: [PATCH 029/739] Expose hyper-param as keyword arg --- spacy/_ml.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 50deaeb1d..f3cfe069f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -411,11 +411,12 @@ def uniqued(layer, column=0): def build_text_classifier(nr_class, width=64, **cfg): + nr_vector = cfg.get('nr_vector', 1000) with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): - embed_lower = HashEmbed(width, 1000, column=1) - embed_prefix = HashEmbed(width//2, 1000, column=2) - embed_suffix = HashEmbed(width//2, 1000, column=3) - embed_shape = HashEmbed(width//2, 1000, column=4) + embed_lower = HashEmbed(width, nr_vector, column=1) + embed_prefix = HashEmbed(width//2, nr_vector, column=2) + embed_suffix = HashEmbed(width//2, nr_vector, column=3) + embed_shape = HashEmbed(width//2, nr_vector, column=4) model = ( FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE]) From 9bae0ddc5006c1aa1e0db6e23ad81e045d078332 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:14:49 +0200 Subject: [PATCH 030/739] Fix minibatching --- spacy/gold.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/gold.pyx b/spacy/gold.pyx index 001e19504..aa5daa41d 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -148,7 +148,7 @@ def minibatch(items, size=8): ''' items = iter(items) while True: - batch_size = next(size) if hasattr(size, '__next__') else size + batch_size = next(size) #if hasattr(size, '__next__') else size batch = list(cytoolz.take(int(batch_size), items)) if len(batch) == 0: break From 2bc7d87c705b038d699309b25eec7ab3df4e9308 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 22 Jul 2017 20:15:32 +0200 Subject: [PATCH 031/739] Add example for training text classifier --- examples/training/train_textcat.py | 101 +++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 examples/training/train_textcat.py diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py new file mode 100644 index 000000000..fa6e4f6ad --- /dev/null +++ b/examples/training/train_textcat.py @@ -0,0 +1,101 @@ +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 + + +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 = zip(train_docs, train_gold) + batch_sizes = compounding(4., 128., 1.001) + for i in range(n_iter): + losses = {} + for batch in minibatch(tqdm.tqdm(train_data, leave=False), + size=batch_sizes): + docs, golds = zip(*batch) + textcat.update((docs, None), 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 score >= 0.5 and label in gold: + tp += 1. + elif score >= 0.5 and label not in gold: + fp += 1. + elif score < 0.5 and label not in gold: + tn += 1 + if score < 0.5 and label in gold: + 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(): + # Partition off part of the train data --- avoid running experiments + # against test. + train_data, _ = thinc.extra.datasets.imdb() + + random.shuffle(train_data) + + texts, labels = zip(*train_data) + cats = [(['POSITIVE'] if y else []) 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(): + 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() + + 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)) + + +if __name__ == '__main__': + plac.call(main) From a88a7deffed5fcfd95bcbd10efd35c0a95c01a30 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 00:33:43 +0200 Subject: [PATCH 032/739] Five save/load of textcat config --- spacy/pipeline.pyx | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index e7e6dcdfc..8c3ecacd6 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -109,7 +109,8 @@ class BaseThincComponent(object): 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)) + ('vocab', lambda p: self.vocab.to_disk(p)), + ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))) )) util.to_disk(path, serialize, exclude) @@ -118,7 +119,8 @@ class BaseThincComponent(object): 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)) + ('vocab', lambda p: self.vocab.from_disk(p)), + ('cfg', lambda p: self.cfg.update(ujson.load(p.open()))), )) util.from_disk(path, deserialize, exclude) return self @@ -383,6 +385,7 @@ class NeuralTagger(BaseThincComponent): 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) @@ -405,6 +408,7 @@ class NeuralTagger(BaseThincComponent): ('vocab', lambda p: self.vocab.from_disk(p)), ('tag_map', load_tag_map), ('model', load_model), + ('cfg', lambda p: self.cfg.update(ujson.load(p.open()))), )) util.from_disk(path, deserialize, exclude) return self @@ -523,7 +527,15 @@ class TextCategorizer(BaseThincComponent): def __init__(self, vocab, model=True, **cfg): self.vocab = vocab self.model = model - self.labels = cfg.get('labels', ['LABEL']) + self.cfg = 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]) From 54a539a113d9a57406a970c09f5906df5a0dc97c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 00:34:12 +0200 Subject: [PATCH 033/739] Finish text classifier example --- examples/training/train_textcat.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py index fa6e4f6ad..033cc50a9 100644 --- a/examples/training/train_textcat.py +++ b/examples/training/train_textcat.py @@ -80,14 +80,14 @@ def load_data(): return (train_texts, train_cats), (dev_texts, dev_cats) -def main(): +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() - + print("Itn.\tLoss\tP\tR\tF") progress = '{i:d} {loss:.3f} {textcat_p:.3f} {textcat_r:.3f} {textcat_f:.3f}' @@ -95,6 +95,15 @@ def main(): 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__': From d8aa721664d30d2776d2e63a660cf372cc73f2b1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 00:50:18 +0200 Subject: [PATCH 034/739] Compute Language.meta with a property --- spacy/language.py | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index dcdfd7847..de25157fb 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -23,6 +23,7 @@ from .pipeline import TokenVectorEncoder, NeuralTagger, NeuralEntityRecognizer from .pipeline import NeuralLabeller from .pipeline import SimilarityHook from .pipeline import TextCategorizer +from . import about from .compat import json_dumps from .attrs import IS_STOP @@ -149,8 +150,8 @@ class Language(object): Defaults = BaseDefaults lang = None - def __init__(self, vocab=True, make_doc=True, pipeline=None, meta={}, - disable=tuple(), **kwargs): + def __init__(self, vocab=True, make_doc=True, pipeline=None, + meta={}, disable=tuple(), **kwargs): """Initialise a Language object. vocab (Vocab): A `Vocab` object. If `True`, a vocab is created via @@ -167,7 +168,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', {})) @@ -199,6 +200,28 @@ class Language(object): flat_list.append(pipe) self.pipeline = flat_list + @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', '') + pipeline = [] + for component in self.pipeline: + if hasattr(component, 'name'): + pipeline.append(component.name) + self._meta['pipeline'] = pipeline + return self._meta + + @meta.setter + def meta(self, value): + self._meta = value + # Conveniences to access pipeline components @property def tensorizer(self): From 4fe77bced289531e8bf15a36c89c2c7578f1d7fd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 00:52:47 +0200 Subject: [PATCH 035/739] Add cfg attr to pipeline components --- spacy/pipeline.pyx | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 8c3ecacd6..41aefdd59 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -160,6 +160,7 @@ class TokenVectorEncoder(BaseThincComponent): self.vocab = vocab self.doc2feats = doc2feats() self.model = model + self.cfg = dict(cfg) def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -239,9 +240,10 @@ class TokenVectorEncoder(BaseThincComponent): 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) def __call__(self, doc): tags = self.predict([doc.tensor]) @@ -416,10 +418,18 @@ class NeuralTagger(BaseThincComponent): class NeuralLabeller(NeuralTagger): name = 'nn_labeller' - def __init__(self, vocab, model=True): + def __init__(self, vocab, model=True, **cfg): self.vocab = vocab self.model = model - self.labels = {} + self.cfg = dict(cfg) + + @property + def labels(self): + return self.cfg.get('labels', {}) + + @labels.setter + def labels(self, value): + self.cfg['labels'] = value def set_annotations(self, docs, dep_ids): pass @@ -478,9 +488,10 @@ class SimilarityHook(BaseThincComponent): 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): @@ -527,7 +538,7 @@ class TextCategorizer(BaseThincComponent): def __init__(self, vocab, model=True, **cfg): self.vocab = vocab self.model = model - self.cfg = cfg + self.cfg = dict(cfg) @property def labels(self): From 2df563ad24d7df2f6368b5ff66657abd6cc0f9d3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 14:10:51 +0200 Subject: [PATCH 036/739] Remove optimization for textcat that caused loading problem --- spacy/_ml.py | 67 +++++++++++++--------------------------------------- 1 file changed, 16 insertions(+), 51 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index f3cfe069f..2d0910a53 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -15,6 +15,7 @@ from thinc.describe import Dimension, Synapses, Biases, Gradient from thinc.neural._classes.affine import _set_dimensions_if_needed from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool +from thinc.linear.linear import LinearModel from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc @@ -365,51 +366,6 @@ def preprocess_doc(docs, drop=0.): return (keys, vals, lengths), None -# This belongs in thinc -def wrap(func, *child_layers): - model = layerize(func) - model._layers.extend(child_layers) - def on_data(self, X, y): - for child in self._layers: - for hook in child.on_data_hooks: - hook(child, X, y) - model.on_data_hooks.append(on_data) - return model - -# This belongs in thinc -def uniqued(layer, column=0): - '''Group inputs to a layer, so that the layer only has to compute - for the unique values. The data is transformed back before output, and the same - transformation is applied for the gradient. Effectively, this is a cache - local to each minibatch. - - The uniqued wrapper is useful for word inputs, because common words are - seen often, but we may want to compute complicated features for the words, - using e.g. character LSTM. - ''' - def uniqued_fwd(X, drop=0.): - keys = X[:, column] - if not isinstance(keys, numpy.ndarray): - keys = keys.get() - uniq_keys, ind, inv, counts = numpy.unique(keys, return_index=True, - return_inverse=True, - return_counts=True) - Y_uniq, bp_Y_uniq = layer.begin_update(X[ind], drop=drop) - Y = Y_uniq[inv].reshape((X.shape[0],) + Y_uniq.shape[1:]) - def uniqued_bwd(dY, sgd=None): - dY_uniq = layer.ops.allocate(Y_uniq.shape, dtype='f') - layer.ops.scatter_add(dY_uniq, inv, dY) - d_uniques = bp_Y_uniq(dY_uniq, sgd=sgd) - if d_uniques is not None: - dX = (d_uniques / counts)[inv] - return dX - else: - return None - return Y, uniqued_bwd - model = wrap(uniqued_fwd, layer) - return model - - def build_text_classifier(nr_class, width=64, **cfg): nr_vector = cfg.get('nr_vector', 1000) with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): @@ -418,23 +374,32 @@ def build_text_classifier(nr_class, width=64, **cfg): embed_suffix = HashEmbed(width//2, nr_vector, column=3) embed_shape = HashEmbed(width//2, nr_vector, column=4) - model = ( + cnn_model = ( FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE]) >> _flatten_add_lengths >> with_getitem(0, - uniqued( - (embed_lower | embed_prefix | embed_suffix | embed_shape) - >> Maxout(width, width+(width//2)*3) - ) + (embed_lower | embed_prefix | embed_suffix | embed_shape) + >> Maxout(width, width+(width//2)*3) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) ) >> Pooling(mean_pool, max_pool) >> Residual(ReLu(width*2, width*2)) - >> zero_init(Affine(nr_class, width*2, drop_factor=0.0)) + ) + linear_model = ( + _preprocess_doc + >> LinearModel(nr_class) >> logistic ) + + model = ( + #(linear_model | cnn_model) + cnn_model + >> zero_init(Affine(nr_class, width*2+nr_class, drop_factor=0.0)) + >> logistic + ) + model.lsuv = False return model From c4a81a47a484ed3db7e2feb892cf9f2e21f29378 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 14:11:07 +0200 Subject: [PATCH 037/739] Fix deserialization --- spacy/pipeline.pyx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 41aefdd59..d48cae26d 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -120,12 +120,19 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('model', lambda p: self.model.from_bytes(p.open('rb').read())), ('vocab', lambda p: self.vocab.from_disk(p)), - ('cfg', lambda p: self.cfg.update(ujson.load(p.open()))), + ('cfg', lambda p: self.cfg.update(_load_cfg(p))) )) 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' From 5771bd1ff8a841a568980d1d48da6d8c06c20cb6 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 23 Jul 2017 14:18:38 +0200 Subject: [PATCH 038/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 8f6fbaa1e..7cee56422 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a3' +__version__ = '2.0.0a4' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From c2b4dd78098d606314bb2d731a751777a42ca023 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 20:50:56 +0700 Subject: [PATCH 039/739] start working on Indonesian language --- spacy/lang/id/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 spacy/lang/id/__init__.py diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py new file mode 100644 index 000000000..e69de29bb From da9867683984c3ab436d1441f26e572312e6cc63 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 20:51:31 +0700 Subject: [PATCH 040/739] use template --- spacy/lang/id/__init__.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index e69de29bb..e4dc1954c 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -0,0 +1,29 @@ +# coding: utf8 +from __future__ import unicode_literals + +from .stop_words import STOP_WORDS +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .lex_attrs import LEX_ATTRS + +from ..tokenizer_exceptions import BASE_EXCEPTIONS +from ..language import Language +from ..attrs import LANG +from ..util import uptade_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 = uptade_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + stop_words = set(STOP_WORDS) + + +class Indonesian(Language): + lang = 'id' + Defaults = IndonesianDefaults + + +__all__ = ['Indonesian'] From e2efeb186e4845e6b24cc191e06ca2e003a6da8a Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 20:52:37 +0700 Subject: [PATCH 041/739] added stopwords --- spacy/lang/id/stop_words.py | 763 ++++++++++++++++++++++++++++++++++++ 1 file changed, 763 insertions(+) create mode 100644 spacy/lang/id/stop_words.py 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 From 082e9ade46db81d6ba9f178b39efd508d54df7d3 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 21:30:34 +0700 Subject: [PATCH 042/739] fixed typo --- spacy/lang/id/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index e4dc1954c..6d901ec1c 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -6,9 +6,9 @@ from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .lex_attrs import LEX_ATTRS from ..tokenizer_exceptions import BASE_EXCEPTIONS -from ..language import Language -from ..attrs import LANG -from ..util import uptade_exc +from ...language import Language +from ...attrs import LANG +from ...util import update_exc class IndonesianDefaults(Language.Defaults): @@ -17,7 +17,7 @@ class IndonesianDefaults(Language.Defaults): lex_attr_getters.update(LEX_ATTRS) - tokenizer_exceptions = uptade_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) stop_words = set(STOP_WORDS) From b5de329ea3cfa482cafecc81e3fedf03e17ad61c Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 22:54:19 +0700 Subject: [PATCH 043/739] added norm_exceptions --- spacy/lang/id/norm_exceptions.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 spacy/lang/id/norm_exceptions.py diff --git a/spacy/lang/id/norm_exceptions.py b/spacy/lang/id/norm_exceptions.py new file mode 100644 index 000000000..7c2a2e827 --- /dev/null +++ b/spacy/lang/id/norm_exceptions.py @@ -0,0 +1,4 @@ +# coding: utf8 +from __future__ import unicode_literals + +NORM_EXCEPTIONS = {} From b80c35bc9afd050948afb31c91f7505ac4c355de Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 22:54:49 +0700 Subject: [PATCH 044/739] added norm_exceptions --- spacy/lang/id/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index 6d901ec1c..685972006 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals from .stop_words import STOP_WORDS from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS +from .norm_exceptions import NORM_EXCEPTIONS from .lex_attrs import LEX_ATTRS from ..tokenizer_exceptions import BASE_EXCEPTIONS From bed8162d00c0628332e02d485bc6b2200d4bcede Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 22:55:05 +0700 Subject: [PATCH 045/739] added tokenizer_exceptions --- spacy/lang/id/tokenizer_exceptions.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 spacy/lang/id/tokenizer_exceptions.py diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py new file mode 100644 index 000000000..339f5a54c --- /dev/null +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -0,0 +1,4 @@ +# coding: utf8 +from __future__ import unicode_literals + +TOKENIZER_EXCEPTIONS = {} \ No newline at end of file From f6f15678fbd802326584d9c631ef5601195b1124 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 22:55:22 +0700 Subject: [PATCH 046/739] added lex_attrs --- spacy/lang/id/lex_attrs.py | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 spacy/lang/id/lex_attrs.py diff --git a/spacy/lang/id/lex_attrs.py b/spacy/lang/id/lex_attrs.py new file mode 100644 index 000000000..ef9e8f897 --- /dev/null +++ b/spacy/lang/id/lex_attrs.py @@ -0,0 +1,4 @@ +# coding: utf8 +from __future__ import unicode_literals + +LEX_ATTRS = {} \ No newline at end of file From d5fd32a5721d2a767fd583f05cd52d842ae2151e Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 22:56:48 +0700 Subject: [PATCH 047/739] added known currencies --- spacy/lang/id/norm_exceptions.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/spacy/lang/id/norm_exceptions.py b/spacy/lang/id/norm_exceptions.py index 7c2a2e827..758d9c389 100644 --- a/spacy/lang/id/norm_exceptions.py +++ b/spacy/lang/id/norm_exceptions.py @@ -1,4 +1,13 @@ # coding: utf8 from __future__ import unicode_literals +_exc = { + "Rp": "$", + "RMB": "$", +} + NORM_EXCEPTIONS = {} + +for string, norm in _exc.items(): + NORM_EXCEPTIONS[string] = norm + NORM_EXCEPTIONS[string.title()] = norm From 3b17eba27b84e70a84101117e63b080db09b61be Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 23:10:52 +0700 Subject: [PATCH 048/739] added frequency units --- spacy/lang/char_classes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index bec685646..f4b21b233 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -27,6 +27,7 @@ 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 ' + 'kHz MHz GHz ' 'TB T G M K') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' _punct = r'… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' From ba922e30e8abb7403f4ad05f18d719a1d175f535 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 23:46:18 +0700 Subject: [PATCH 049/739] added ampere hour unit --- spacy/lang/char_classes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index f4b21b233..cb04f77ff 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -27,7 +27,7 @@ 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 ' - 'kHz MHz GHz ' + 'kHz MHz GHz mAh ' 'TB T G M K') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' _punct = r'… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' From 0e590c711f0b2e610964a72a856574598ce4a810 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 23 Jul 2017 23:46:40 +0700 Subject: [PATCH 050/739] added prefix & suffix rules --- spacy/lang/id/__init__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index 685972006..71f42d712 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from .stop_words import STOP_WORDS +from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_PREFIXES from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .norm_exceptions import NORM_EXCEPTIONS from .lex_attrs import LEX_ATTRS @@ -20,6 +21,8 @@ class IndonesianDefaults(Language.Defaults): tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) stop_words = set(STOP_WORDS) + prefixes = tuple(TOKENIZER_PREFIXES) + suffixes = tuple(TOKENIZER_SUFFIXES) class Indonesian(Language): From d0ec484725886d643a63080faeafade94479dade Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 06:16:29 +0700 Subject: [PATCH 051/739] reverted --- spacy/lang/char_classes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index cb04f77ff..bec685646 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -27,7 +27,6 @@ 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 ' - 'kHz MHz GHz mAh ' 'TB T G M K') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' _punct = r'… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' From 082e94ac1c1f886d7f50a64448fa81f2cdc3bf93 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 06:17:07 +0700 Subject: [PATCH 052/739] added inflix rules --- spacy/lang/id/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index 71f42d712..1b4cd1225 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals from .stop_words import STOP_WORDS -from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_PREFIXES +from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_PREFIXES, TOKENIZER_INFIXES from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .norm_exceptions import NORM_EXCEPTIONS from .lex_attrs import LEX_ATTRS @@ -23,6 +23,7 @@ class IndonesianDefaults(Language.Defaults): stop_words = set(STOP_WORDS) prefixes = tuple(TOKENIZER_PREFIXES) suffixes = tuple(TOKENIZER_SUFFIXES) + infixes = tuple(TOKENIZER_INFIXES) class Indonesian(Language): From 37fa2c8c808d5185ea5b3336d7aae5e7acb2b677 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 06:17:18 +0700 Subject: [PATCH 053/739] punctution rules --- spacy/lang/id/punctuation.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 spacy/lang/id/punctuation.py diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py new file mode 100644 index 000000000..68af3e126 --- /dev/null +++ b/spacy/lang/id/punctuation.py @@ -0,0 +1,36 @@ +# 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 +from ..char_classes import LIST_PUNCT, LIST_ELLIPSES, LIST_QUOTES +from ..char_classes import QUOTES, UNITS, ALPHA, ALPHA_LOWER, ALPHA_UPPER + +_units = ('s bit Gbps Mbps mbps Kbps kbps ƒ ' + 'kHz MHz GHz mAh ') +_currency = r'Rp IDR RMB SGD S\$' + _currency + +UNITS = merge_chars(_units) +CURRENCY = merge_chars(_currency) +HTML_PREFIX = r'<(b|strong|i|em|p|span|div|br)\s?/>' +HTML_SUFFIX = r'' + +_prefixes = TOKENIZER_PREFIXES + split_chars(_currency) + [HTML_PREFIX] + ['ke-'] + +_suffixes = TOKENIZER_SUFFIXES + [ + r'(?<=[0-9])(?:{})'.format(CURRENCY), + r'(?<=[0-9])(?:{})'.format(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'(?<=[0-9]{u})\/(?=[0-9])'.format(u=UNITS), +] + +TOKENIZER_PREFIXES = _prefixes +TOKENIZER_SUFFIXES = _suffixes +TOKENIZER_INFIXES = _infixes From c1f3fe99feeb926b2b8a502110cb9e83cc593ca8 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 13:57:21 +0700 Subject: [PATCH 054/739] updated punctuation rules --- spacy/lang/id/punctuation.py | 40 +++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py index 68af3e126..85da34074 100644 --- a/spacy/lang/id/punctuation.py +++ b/spacy/lang/id/punctuation.py @@ -2,33 +2,49 @@ from __future__ import unicode_literals from ..punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES -from ..char_classes import merge_chars, split_chars, _currency +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 +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'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 = ('s bit Gbps Mbps mbps Kbps kbps ƒ ' - 'kHz MHz GHz mAh ') -_currency = r'Rp IDR RMB SGD S\$' + _currency 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) -_prefixes = TOKENIZER_PREFIXES + split_chars(_currency) + [HTML_PREFIX] + ['ke-'] -_suffixes = TOKENIZER_SUFFIXES + [ - r'(?<=[0-9])(?:{})'.format(CURRENCY), - r'(?<=[0-9])(?:{})'.format(UNITS), +_prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['[Kk]e-', '/', '—'] + +_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '—'] + [ + r'(?<=[0-9])(?:{c})'.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'(?<=[0-9]{u})\/(?=[0-9])'.format(u=UNITS), + 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 From ad56c9179a37b1f3c217feae5b81a3e609d388fa Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 14:10:16 +0700 Subject: [PATCH 055/739] added tokenizer exceptions list --- spacy/lang/id/_tokenizer_exceptions_list.py | 506 ++++++++++++++++++++ 1 file changed, 506 insertions(+) create mode 100644 spacy/lang/id/_tokenizer_exceptions_list.py diff --git a/spacy/lang/id/_tokenizer_exceptions_list.py b/spacy/lang/id/_tokenizer_exceptions_list.py new file mode 100644 index 000000000..a675dbcf7 --- /dev/null +++ b/spacy/lang/id/_tokenizer_exceptions_list.py @@ -0,0 +1,506 @@ +# coding: utf8 +from __future__ import unicode_literals + +ID_BASE_EXCEPTIONS = """ +Oedipus-kompleks +Zend-Avesta +aba-aba +abah-abah +abong-abong +abrit-abrit +abu-abu +abuk-abuk +abun-abun +acang-acang +aci-aci +adang-adang +agak-agih +agar-agar +agut-agut +ajar-ajar +aji-aji +alai-belai +alan-alan +alang-alang +alap-alap +ali-ali +alih-alih +alu-alu +alu-aluan +alun-alun +alur-alur +ambah-ambah +ambai-ambai +ambreng-ambrengan +ambu-ambu +ambung-ambung +amin-amin +amit-amit +ampai-ampai +anai-anai +ancak-ancak +ancar-ancar +andang-andang +andeng-andeng +anggung-anggip +angkal-angkal +angkul-angkul +angkut-angkut +ani-ani +aning-aning +anjang-anjang +anjing-anjing +antah-berantah +antar-antar +anter-anter +antung-antung +anyang-anyang +api-api +apit-apit +apu-apu +arem-arem +ari-ari +asuh-asuh +awar-awar +awat-awat +awik-awik +ayak-ayak +ayang-ayang +ba-bi-bu +bajang-bajang +baji-baji +balai-balai +bangun-bangun +barat-barat +barau-barau +bare-bare +bari-bari +barung-barung +basa-basi +bata-bata +batir-batir +bayan-bayan +begana-begini +belat-belit +belu-belai +bengang-bengut +benggal-benggil +bengkal-bengkil +bengkang-bengkok +bengkang-bengkong +bengkang-bengkung +berang-berang +beras-beras +berek-berek +bereng-bereng +beri-beri +bering-bering +berkali-kali +bermacam-macam +bersama-sama +bersiap-siap +bertanya-tanya +berturut-turut +betak-betak +beti-beti +biar-biar +bilang-bilang +bincang-bincut +biri-biri +bolak-balik +bolang-baling +bongkar-bangkir +boro-boro +boyo-boyo +buaya-buaya +bugi-bugi +bulang-baling +buli-buli +bulu-bulu +bulus-bulus +caci-maki +cawe-cawe +celam-celum +celangak-celinguk +celas-celus +celedang-celedok +celengkak-celengkok +cenal-cenil +cengar-cengir +cengir-cengir +cengis-cengis +ceplas-ceplos +cerai-berai +cobak-cabik +cobar-cabir +cola-cala +colang-caling +comat-comot +compang-camping +conggah-canggih +congkah-cangkih +congkah-mangkih +copak-capik +crat-crit +cumi-cumi +dag-dag +dag-dig-dug +dali-dali +dapur-dapur +dari-dari +daru-daru +dawai-dawai +dekak-dekak +desas-desus +dewi-dewi +dinul-Islam +dog-dog +dokok-dokok +dolak-dalik +dulang-dulang +engap-engap +engket-engket +erek-erek +flip-plop +gaba-gaba +gada-gada +gading-gading +gado-gado +gala-gala +galing-galing +galu-galu +gana-gini +gapah-gopoh +gara-gara +gayang-gayang +gebyah-uyah +gedana-gedini +gedebak-gedebuk +gedebar-gedebur +geli-geli +gembar-gembor +gembrang-gembreng +gempul-gempul +genjang-genjot +gerbas-gerbus +gereng-gereng +gerot-gerot +getak-getuk +getem-getem +geti-geti +gili-gili +girap-girap +giring-giring +golak-galik +gondas-gandes +gonta-ganti +gorong-gorong +gresek-gresek +gudu-gudu +gulang-gulang +halai-balai +hasta-wara +hila-hila +hiru-biru +hiru-hara +hubar-habir +hubaya-hubaya +hula-hula +hura-hura +huru-hara +ibar-ibar +icak-icak +ikan-ikan +ilam-ilam +ilat-ilatan +iming-iming +imut-imut +incang-incut +ingat-ingat +inggang-inggung +ira-ira +irah-irahan +isak-isak +jali-jali +jarum-jarum +jegal-jegalan +jelur-jelir +jentik-jentik +jongkar-jangkir +jongkat-jangkit +kabang-kabang +kabu-kabu +kacang-kacang +kacang-kacangan +kala-kala +kalau-kalau +kalut-malut +kanak-kanak +kareseh-peseh +kasak-kusuk +katang-katang +kawa-kawa +kecuh-kecah +kelak-kelik +kelak-keluk +kelang-kelok +kelap-kelip +kelemak-kelemek +kelik-kelik +kelontang-kelantung +kelusuh-kelasah +kencrang-kencring +kerang-keroh +kercap-kercip +kercap-kercup +keriang-keriut +kernyat-kernyut +keropas-kerapis +keruntang-pungkang +kesap-kesip +kesu-kesi +kesuh-kesih +kesuk-kesik +ketakar-keteker +ketap-ketap +ketir-ketir +kiang-kiut +kibang-kibut +kicang-kecoh +kicang-kicu +kida-kida +kijang-kijang +kira-kira +kiu-kiu +kluntang-klantung +kocah-kacih +kocar-kacir +kodok-kodok +kolang-kaling +kole-kole +koleh-koleh +komat-kamit +kontal-kantil +kontang-kanting +kopat-kapit +kosak-kasik +kotak-katik +kucar-kacir +kuda-kuda +kulik-kulik +kunang-kunang +kunar-kunar +kupat-kapit +kupu-kupu +kura-kura +kusat-mesat +kutat-kutet +kuwung-kuwung +laba-laba +labi-labi +laguh-lagah +lalu-lalang +lamat-lamat +lancar-lancar +langak-longok +langit-langit +lapat-lapat +legak-legok +legup-legup +leha-leha +lekak-lekuk +lekap-lekup +lekuh-lekih +lekum-lekum +lekup-lekap +lenggak-lenggok +lentam-lentum +lentang-lentok +lete-lete +lidah-lidah +liuk-liuk +liung-liung +lobi-lobi +longak-longok +lontang-lanting +lontang-lantung +lumba-lumba +lumi-lumi +luntang-lantung +lupa-lupa +mahi-mahi +mali-mali +masing-masing +mata-mata +megal-megol +megap-megap +megrek-megrek +melak-melak +menanti-nanti +mencla-mencle +mentul-mentul +mercak-mercik +mondar-mandir +morat-marit +nasi-nasi +neka-neka +nong-nong +ogah-agih +ogah-ogah +ogak-agik +ogak-ogak +olak-alik +olak-olak +olang-aling +oleh-oleh +olong-olong +ombang-ambing +onde-onde +ondel-ondel +oneng-oneng +ongol-ongol +ontran-ontran +onyah-anyih +onyak-anyik +opak-apik +orak-arik +orang-aring +orat-oret +orok-orok +orong-orong +otak-atik +otak-otak +palas-palas +palato-alveolar +pao-pao +parang-parang +pasu-pasu +paya-paya +perak-perak +peras-perus +pertama-tama +petantang-petenteng +petatang-peteteng +pete-pete +pina-pina +plintat-plintut +plonga-plongo +pontang-panting +porak-parik +porak-peranda +porak-poranda +pukang-pukang +pungak-pinguk +pura-pura +puruk-parak +puvi-puvi +raba-rubu +rama-rama +randa-rondo +rango-rango +rep-repan +riang-riang +ribu-ribu +rigi-rigi +rintik-rintik +robak-rabik +robat-rabit +rombang-rambing +romol-romol +rondah-rondih +ropak-rapik +ruba-ruba +rumbai-rumbai +rundu-rundu +runggu-rangga +runtang-runtung +sabu-sabu +sama-sama +samo-samo +sampai-sampai +sarit-sarit +sebaik-baiknya +segan-segan +sekali-kali +sekonyong-konyong +sekurang-kurangnya +selak-seluk +selama-lamanya +selang-seli +selang-seling +selentang-selenting +seluk-beluk +sema-sema +semang-semang +semata-mata +sengar-sengir +seolah-olah +sepala-pala +serbah-serbih +serembah-serembih +serta-merta +setidak-tidaknya +sia-sia +slintat-slintut +sorak-sorai +sudu-sudu +sulat-sulit +sumpah-sumpah +tabar-tabar +takang-takik +tawa-tawa +tawak-tawak +tawang-tawang +tawar-tawar +teka-teki +temut-temut +teringat-ingat +tiba-tiba +timah-timah +timu-timu +tuang-tuang +tuli-tuli +tumpang-tindih +tupai-tupai +ubrak-abrik +ubun-ubun +ubur-ubur +uci-uci +ugal-ugalan +uget-uget +uir-uir +ula-ula +ulang-alik +ulang-aling +ulap-ulap +ular-ular +ular-ularan +ulu-ulu +ulung-ulung +umang-umang +umbang-ambing +umbul-umbul +umbut-umbut +uncang-uncit +unduk-unduk +undung-undung +undur-undur +unek-unek +ungah-angih +unggang-anggit +unggat-unggit +untang-anting +ura-ura +uran-uran +user-user +utak-atik +utar-utar +uter-uter +wanti-wanti +wara-wiri +warna-warni +wira-wiri +wora-wari +yang-yang +zig-zag +""".split() From 7aad6718bc461c963dc47aabd9e9b80181e775b5 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 14:11:10 +0700 Subject: [PATCH 056/739] enable tokenizer exceptions --- spacy/lang/id/tokenizer_exceptions.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 339f5a54c..915197cd8 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -1,4 +1,11 @@ # coding: utf8 from __future__ import unicode_literals -TOKENIZER_EXCEPTIONS = {} \ No newline at end of file +from ._tokenizer_exceptions_list import FR_BASE_EXCEPTIONS + +_exc = {} + +for orth in FR_BASE_EXCEPTIONS + ["etc."]: + _exc[orth] = [{ORTH: orth}] + +TOKENIZER_EXCEPTIONS = dict(_exc) \ No newline at end of file From eaf9cbd708be25013df93192c8fdd0b515fd6538 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 14:11:51 +0700 Subject: [PATCH 057/739] cursed of copy & paste --- spacy/lang/id/tokenizer_exceptions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 915197cd8..4762dd26c 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -1,11 +1,11 @@ # coding: utf8 from __future__ import unicode_literals -from ._tokenizer_exceptions_list import FR_BASE_EXCEPTIONS +from ._tokenizer_exceptions_list import ID_BASE_EXCEPTIONS _exc = {} -for orth in FR_BASE_EXCEPTIONS + ["etc."]: +for orth in ID_BASE_EXCEPTIONS + ["etc."]: _exc[orth] = [{ORTH: orth}] TOKENIZER_EXCEPTIONS = dict(_exc) \ No newline at end of file From 68454c40bf3a8b6a70a8fed307dd2ea6c3f2edb9 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 14:12:34 +0700 Subject: [PATCH 058/739] added missing import --- spacy/lang/id/tokenizer_exceptions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 4762dd26c..2f0b97567 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from ._tokenizer_exceptions_list import ID_BASE_EXCEPTIONS +from ...symbols import ORTH _exc = {} From 73f6ac9d9b0291662111984308be4293894d141d Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Mon, 24 Jul 2017 15:56:31 +0700 Subject: [PATCH 059/739] added hyhen --- spacy/lang/id/punctuation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py index 85da34074..794d6a39e 100644 --- a/spacy/lang/id/punctuation.py +++ b/spacy/lang/id/punctuation.py @@ -27,7 +27,7 @@ LIST_CURRENCY = split_chars(_currency) _prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['[Kk]e-', '/', '—'] -_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '—'] + [ +_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '—', '-'] + [ r'(?<=[0-9])(?:{c})'.format(c=CURRENCY), r'(?<=[0-9])(?:{u})'.format(u=UNITS), r'(?<=[0-9])%', From 7c7fac93372eb30445d2e36fa21631ce4937f046 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 25 Jul 2017 18:56:37 +0200 Subject: [PATCH 060/739] Add spacy.blank() loading function --- spacy/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spacy/__init__.py b/spacy/__init__.py index 068282b1a..1cb7c0cbd 100644 --- a/spacy/__init__.py +++ b/spacy/__init__.py @@ -13,5 +13,10 @@ def load(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) From 523b0df2c93bd8555b2d0c687d3d475c6ee8e75c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 25 Jul 2017 18:57:59 +0200 Subject: [PATCH 061/739] Update text classification model --- spacy/_ml.py | 27 ++++++++++++++++----------- spacy/compat.py | 2 ++ spacy/language.py | 15 ++++++++++++--- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2d0910a53..f1ded666e 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -4,18 +4,22 @@ 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.neural.util import get_array_module +import random 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.neural._classes.selu import SELU from thinc import describe from thinc.describe import Dimension, Synapses, Biases, Gradient from thinc.neural._classes.affine import _set_dimensions_if_needed from thinc.api import FeatureExtracter, with_getitem -from thinc.neural.pooling import Pooling, max_pool, mean_pool +from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool +from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel +from thinc.api import uniqued, wrap from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc @@ -367,7 +371,7 @@ def preprocess_doc(docs, drop=0.): def build_text_classifier(nr_class, width=64, **cfg): - nr_vector = cfg.get('nr_vector', 1000) + nr_vector = cfg.get('nr_vector', 200) with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): embed_lower = HashEmbed(width, nr_vector, column=1) embed_prefix = HashEmbed(width//2, nr_vector, column=2) @@ -378,25 +382,26 @@ def build_text_classifier(nr_class, width=64, **cfg): FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE]) >> _flatten_add_lengths >> with_getitem(0, - (embed_lower | embed_prefix | embed_suffix | embed_shape) - >> Maxout(width, width+(width//2)*3) + uniqued( + (embed_lower | embed_prefix | embed_suffix | embed_shape) + >> Maxout(width, width+(width//2)*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) ) - >> Pooling(mean_pool, max_pool) - >> Residual(ReLu(width*2, width*2)) + >> ParametricAttention(width,) + >> Pooling(sum_pool) + >> ReLu(width, width) + >> zero_init(Affine(nr_class, width, drop_factor=0.0)) ) linear_model = ( _preprocess_doc - >> LinearModel(nr_class) - >> logistic + >> LinearModel(nr_class, drop_factor=0.) ) model = ( - #(linear_model | cnn_model) - cnn_model - >> zero_init(Affine(nr_class, width*2+nr_class, drop_factor=0.0)) + (linear_model | cnn_model) + >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0)) >> logistic ) diff --git a/spacy/compat.py b/spacy/compat.py index 848ea816a..c2ab27d7e 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -5,6 +5,7 @@ import six import ftfy import sys import ujson +import itertools from thinc.neural.util import copy_array @@ -35,6 +36,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 diff --git a/spacy/language.py b/spacy/language.py index de25157fb..fad2e2119 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -10,6 +10,7 @@ from thinc.neural.optimizers import Adam, SGD import random import ujson from collections import OrderedDict +import itertools from .tokenizer import Tokenizer from .vocab import Vocab @@ -25,7 +26,7 @@ from .pipeline import SimilarityHook from .pipeline import TextCategorizer from . import about -from .compat import json_dumps +from .compat import json_dumps, izip from .attrs import IS_STOP from .lang.punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES, TOKENIZER_INFIXES from .lang.tokenizer_exceptions import TOKEN_MATCH @@ -411,7 +412,7 @@ class Language(object): except StopIteration: pass - def pipe(self, texts, n_threads=2, batch_size=1000, disable=[]): + def pipe(self, texts, 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. @@ -427,8 +428,16 @@ class Language(object): >>> for doc in nlp.pipe(texts, batch_size=50, n_threads=4): >>> assert doc.is_parsed """ + if 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) if name in disable: From ff7418b0d9d84b5d6d1c1b121e71f0d4d56e1a90 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 25 Jul 2017 18:58:15 +0200 Subject: [PATCH 062/739] Update requirements --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 37259e747..aae0f9388 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ 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.8.0,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index df6afdb2c..ecdf15536 100755 --- a/setup.py +++ b/setup.py @@ -192,7 +192,7 @@ def setup_package(): '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.8.0,<6.9.0', 'plac<1.0.0,>=0.9.6', 'pip>=9.0.0,<10.0.0', 'six', From fd20a4af55bf905fe5137a4a3449d3d3a66ae782 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 25 Jul 2017 18:58:34 +0200 Subject: [PATCH 063/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 7cee56422..7d486f46f 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a4' +__version__ = '2.0.0a5' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 67801328219ecebc38d6bc762eafc72c865a0bfd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 25 Jul 2017 19:41:11 +0200 Subject: [PATCH 064/739] Fix tagger loading --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index d48cae26d..947f0a1f1 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -417,7 +417,7 @@ class NeuralTagger(BaseThincComponent): ('vocab', lambda p: self.vocab.from_disk(p)), ('tag_map', load_tag_map), ('model', load_model), - ('cfg', lambda p: self.cfg.update(ujson.load(p.open()))), + ('cfg', lambda p: self.cfg.update(_load_cfg(p))) )) util.from_disk(path, deserialize, exclude) return self From aff325b7e07df9a12c9ea8068c12034a455d1d72 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 25 Jul 2017 19:41:20 +0200 Subject: [PATCH 065/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 7d486f46f..4bac17503 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a5' +__version__ = '2.0.0a6' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From c97f5ae0bb74d2562d2ff1ba90592843c345bf33 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 19:12:52 +0700 Subject: [PATCH 066/739] updated tokenizer exceptions --- spacy/lang/id/_tokenizer_exceptions_list.py | 1187 ++++++++++++++++++- 1 file changed, 1183 insertions(+), 4 deletions(-) diff --git a/spacy/lang/id/_tokenizer_exceptions_list.py b/spacy/lang/id/_tokenizer_exceptions_list.py index a675dbcf7..779273bb6 100644 --- a/spacy/lang/id/_tokenizer_exceptions_list.py +++ b/spacy/lang/id/_tokenizer_exceptions_list.py @@ -1,34 +1,63 @@ # coding: utf8 from __future__ import unicode_literals -ID_BASE_EXCEPTIONS = """ -Oedipus-kompleks -Zend-Avesta +ID_BASE_EXCEPTIONS = set(""" aba-aba abah-abah +abal-abal +abang-abang abong-abong abrit-abrit +bangsa-bangsa +alih-alih +pertama-tama abu-abu abuk-abuk abun-abun +acak-acak acang-acang aci-aci +ad-blocker +ad-interim adang-adang +add-on +add-ons +adik-adik +after-sales agak-agih +agama-agama agar-agar +age-related agut-agut +air-air +air-cooled +air-to-air +ajak-ajak ajar-ajar aji-aji +akal-akalan +akar-akar +akhir-akhir +aksi-aksi alai-belai alan-alan alang-alang alap-alap +alat-alat ali-ali alih-alih +all-electric +all-in-one +all-out +all-time +alon-alon +alt-right +alt-text alu-alu alu-aluan alun-alun alur-alur +always-on ambah-ambah ambai-ambai ambreng-ambrengan @@ -38,11 +67,19 @@ amin-amin amit-amit ampai-ampai anai-anai +anak-anak +anak-cucu +anak-istri ancak-ancak +ancang-ancang ancar-ancar andang-andang andeng-andeng +anggaran-red +anggota-anggota anggung-anggip +angin-angin +angin-anginan angkal-angkal angkul-angkul angkut-angkut @@ -52,74 +89,240 @@ anjang-anjang anjing-anjing antah-berantah antar-antar +ante-mortem +antek-antek anter-anter +antihuru-hara antung-antung anyang-anyang +apa-apa +apel-apel api-api apit-apit +aplikasi-aplikasi +apotek-apotek apu-apu +arak-arak +arak-arakan +arek-arek arem-arem ari-ari +artis-artis +asal-asalan +asal-muasal +asal-usul +asas-asas +aset-aset +asmaul-husna +asosiasi-asosiasi asuh-asuh +aturan-aturan +audio-video +audio-visual +auto-brightness +auto-complete +auto-focus +auto-play +auto-update +avant-garde +awan-awan +awang-awang awar-awar awat-awat awik-awik +ayah-anak ayak-ayak +ayam-ayam ayang-ayang +ayat-ayat ba-bi-bu +back-to-back +back-up +badan-badan +badut-badut +bagi-bagi +bahan-bahan +bahu-membahu +baik-baik +bail-out bajang-bajang baji-baji balai-balai +bale-bale +baling-baling +ball-playing +balon-balon +band-band +bandara-bandara bangun-bangun +bangunan-bangunan +bank-bank +bantahan-bantahan +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 +baru-baru +baru-batu barung-barung basa-basi bata-bata +batalyon-batalyon +batang-batang +batas-batas batir-batir +batu-batu +bawa-bawa bayan-bayan +bayang-bayang +bayi-bayi +bea-cukai +bedeng-bedeng begana-begini +bek-bek +belang-belang belat-belit +beliau-beliau belu-belai +benar-benar +benda-benda bengang-bengut benggal-benggil bengkal-bengkil bengkang-bengkok bengkang-bengkong bengkang-bengkung +benteng-benteng +bentuk-bentuk +benua-benua +ber-selfie +beramai-ramai berang-berang beras-beras +berbeda-beda +berbelit-belit +bercita-cita berek-berek bereng-bereng +berganti-ganti +bergotong-royong +berhari-hari +berhati-hati +berhati-hatilah beri-beri bering-bering +berita-berita +berjalan-jalan berkali-kali +berlari-lari +berliku-liku bermacam-macam +bermalas-malasan +berpindah-pindah +berpura-pura bersama-sama +bersenang-senang bersiap-siap +bersih-bersih +bertahun-tahun bertanya-tanya +berteriak-teriak +bertubi-tubi berturut-turut +berubah-ubah +berulang-ulang +besar-besar +besar-besaran betak-betak beti-beti biar-biar +biaya-biaya +bidadari-bidadari +bidang-bidang +bijak-bijaklah +biji-bijian bilang-bilang +bincang-bincang bincang-bincut +bintang-bintang +bintik-bintik +bio-oil biri-biri +biru-biru +biru-hitam +biru-kuning +bisik-bisik +blak-blakan +blok-blok +bocah-bocah +bohong-bohong +bola-bola bolak-balik bolang-baling +boleh-boleh +bom-bom +bomber-bomber +bonek-bonek bongkar-bangkir +bongkar-pasang boro-boro +bos-bos +bottom-up +box-to-box boyo-boyo +buah-buahan +buang-buang buaya-buaya bugi-bugi +build-up +built-in +built-up +buka-buka +buka-bukaan +buka-tutup +bukti-bukti +buku-buku +bulan-bulan bulang-baling +bulat-bulat buli-buli bulu-bulu bulus-bulus +bunga-bunga +bupati-bupati +bupati-wakil +buru-buru +burung-burung +bus-bus +business-to-business +butir-butir +by-pass +bye-bye +cabang-cabang +cabup-cawabup caci-maki +cagub-cawagub +caleg-caleg +calo-calo +calon-calon +campur-campur +capres-cawapres +cara-cara +cari-cari +carut-marut +catch-up +cawali-cawawali cawe-cawe +celah-celah celam-celum celangak-celinguk celas-celus @@ -129,182 +332,559 @@ cenal-cenil cengar-cengir cengir-cengir cengis-cengis +cepat-cepat ceplas-ceplos cerai-berai +cerita-cerita +cetak-biru +check-in +check-ins +check-up +chit-chat +choki-choki +cipika-cipiki +ciri-ciri +ciri-cirinya +cita-cita +cita-citaku +close-up +closed-circuit +coba-coba cobak-cabik cobar-cabir cola-cala colang-caling comat-comot compang-camping +computer-aided +computer-generated conggah-canggih congkah-cangkih congkah-mangkih copak-capik +copy-paste +corat-coret crat-crit +cross-border +cross-dressing +crypto-ransomware +cublak-cublak +cuma-cuma cumi-cumi +dabu-dabu +daerah-daerah dag-dag dag-dig-dug +dalam-dalam dali-dali +danau-danau +dapil-dapil dapur-dapur dari-dari daru-daru +dasar-dasar +daun-daun dawai-dawai +debu-debu +deca-core +decision-making +deep-lying +deg-degan dekak-dekak +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 +dorong-mendorong +dosa-dosa +dress-up +drive-in +dua-duanya +dubes-dubes +duduk-duduk +dugaan-dugaan dulang-dulang +duri-duri +duta-duta +dwi-kewarganegaraan +eco-friendly +eco-park +editor-editor +editor-in-chief +efek-efek +ekonomi-ekonomi +eksekutif-legislatif +ekspor-impor +elang-elang +elemen-elemen +emak-emak +empek-empek +enak-enak +end-to-end +end-user engap-engap engket-engket +entry-level +equity-linked erek-erek +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 gada-gada gading-gading +gadis-gadis gado-gado +gajah-gajah gala-gala +galeri-galeri +gali-gali galing-galing galu-galu +gambar-gambar gana-gini +ganjil-genap +ganteng-ganteng +gantung-gantung gapah-gopoh gara-gara +garis-garis +gatal-gatal +gaun-gaun gayang-gayang +ge-er gebyah-uyah gedana-gedini gedebak-gedebuk gedebar-gedebur +gedung-gedung +gelang-gelang +gelar-gelar +gelas-gelas +geleng-geleng geli-geli gembar-gembor gembrang-gembreng gempul-gempul genjang-genjot +genome-wide +geo-politik +gerak-gerik +gerak-geriknya +gerakan-gerakan gerbas-gerbus +gereja-gereja gereng-gereng gerot-gerot getak-getuk getem-getem geti-geti +gila-gilaan gili-gili girap-girap giring-giring +go-kart +go-to-market +goal-line +gol-gol golak-galik gondas-gandes +gonjang-ganjing gonta-ganti gorong-gorong +gotong-royong gresek-gresek +gua-gua +gubernur-gubernur gudu-gudu +gula-gula gulang-gulang +guru-guru +habis-habisan +hak-hak +hak-hal +hakim-hakim +hal-hal halai-balai +half-time +hama-hama +hands-free +hands-on +hang-out +hantu-hantu +happy-happy +harap-harap +hard-disk +harga-harga +hari-hari +harimau-harimau +hasil-hasil hasta-wara +hat-trick +hati-hati +hati-hatilah +head-mounted +head-to-head +head-up +heads-up +heavy-duty +hewan-hewan +hexa-core +hidup-hidup +hidup-mati hila-hila +hip-hop hiru-biru hiru-hara +hiruk-pikuk +hitam-putih +hitung-hitung +hitung-hitungan +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 +ide-ide ikan-ikan ilam-ilam ilat-ilatan +ilmu-ilmu iming-iming imut-imut incang-incut +industri-industri ingat-ingat inggang-inggung +input-output +instansi-instansi +instant-on +instrumen-instrumen +inter-governmental ira-ira irah-irahan +iring-iringan isak-isak +isat-bb +istana-istana +istri-istri +isu-isu +iya-iya +jabatan-jabatan +jadi-jadian +jagoan-jagoan +jaksa-jaksa +jalan-jalan jali-jali +jam-jam +jampi-jampi +janda-janda +jangan-jangan +janji-janji +jari-jari +jaring-jaring jarum-jarum +jasa-jasa +jatuh-bangun +jauh-dekat +jauh-jauh jegal-jegalan +jejak-jejak +jelas-jelas jelur-jelir +jembatan-jembatan +jenazah-jenazah +jenderal-jenderal +jenis-jenis +jenis-jenisnya jentik-jentik +jiwa-jiwa jongkar-jangkir jongkat-jangkit +jor-joran +jual-beli +julung-julung kabang-kabang +kabar-kabari kabu-kabu +kabupaten-kabupaten +kabupaten-kota +kaca-kaca kacang-kacang kacang-kacangan +kacau-balau +kadang-kadang +kader-kader +kades-kades +kadis-kadis +kain-kain +kait-kait +kakak-adik +kakak-beradik +kakak-kakak +kakek-nenek +kaki-kaki kala-kala kalau-kalau +kalimat-kalimat +kalung-kalung kalut-malut +kambing-kambing +kampung-kampung +kampus-kampus kanak-kanak +kanak-kanan +kanan-kanak +kanan-kiri +kanwil-kanwil +kapal-kapal +kapolda-kapolda +kapolres-kapolres +kapolsek-kapolsek kareseh-peseh +karut-marut +karya-karya kasak-kusuk +kasus-kasus +kata-kata katang-katang +kava-kava kawa-kawa +kawan-kawan +kawin-cerai +kebiasaan-kebiasaan +kebijakan-kebijakan +kebun-kebun +kebut-kebutan +kecamatan-kecamatan +kecil-kecil +kecil-kecilan kecuh-kecah +kedubes-kedubes +kedutaan-kedutaan +kegiatan-kegiatan +kehati-hatian +kejahatan-kejahatan +kejang-kejang +kejar-kejar +kejar-kejaran +kejutan-kejutan +kekuasaan-kekuasaan kelak-kelik kelak-keluk kelang-kelok kelap-kelip kelemak-kelemek kelik-kelik +kelompok-kelompok kelontang-kelantung +keluar-masuk +kelurahan-kelurahan kelusuh-kelasah +kemana-mana +kembang-kembang +kementerian-kementerian +kenang-kenangan kencrang-kencring +kepala-kepala +keping-keping kerang-keroh kercap-kercip kercap-kercup keriang-keriut +kerja-kerja kernyat-kernyut keropas-kerapis keruntang-pungkang +kesalahan-kesalahan kesap-kesip kesu-kesi kesuh-kesih kesuk-kesik ketakar-keteker +ketakutan-ketakutan ketap-ketap +ketar-ketir +ketentuan-ketentuan ketir-ketir +ketua-ketua +ki-ka +kiai-kiai kiang-kiut +kiat-kiat kibang-kibut kicang-kecoh kicang-kicu +kick-off kida-kida kijang-kijang +kincir-kincir +kios-kios kira-kira +kiri-kanan +kisah-kisah +kisi-kisi +kitab-kitab kiu-kiu +klaim-klaim +klip-klip +klub-klub kluntang-klantung +knock-knock +knock-on +knock-out +ko-as +ko-pilot kocah-kacih kocar-kacir +kodam-kodam +kode-kode +kodim-kodim kodok-kodok kolang-kaling kole-kole koleh-koleh komat-kamit +komisaris-komisaris +komisi-komisi +komite-komite +komoditas-komoditas +konsulat-konsulat +konsultan-konsultan kontal-kantil kontang-kanting +kontra-terorisme +kontrak-kontrak +konvensi-konvensi kopat-kapit +koperasi-koperasi +kopi-kopi +koran-koran +kos-kosan kosak-kasik +kota-kota +kota-wakil kotak-katik +kotak-kotak +kubu-kubuan kucar-kacir +kucing-kucingan kuda-kuda +kue-kue kulik-kulik +kumpul-kumpul kunang-kunang kunar-kunar +kung-fu +kuning-hitam kupat-kapit kupu-kupu kura-kura kusat-mesat kutat-kutet kuwung-kuwung +kyai-kyai laba-laba labi-labi +laga-laga +lagi-lagi +lagu-lagu laguh-lagah +lain-lain +laki-laki lalu-lalang +lalu-lintas lamat-lamat +lampion-lampion +lampu-lampu lancar-lancar langak-longok langit-langit +langkah-langka +langkah-langkah +lapas-lapas lapat-lapat +laporan-laporan +laptop-tablet +large-scale +lari-larian +laskar-laskar +lauk-pauk +laut-timur +lawan-lawan +layang-layang +lecet-lecet legak-legok legup-legup leha-leha @@ -313,162 +893,716 @@ lekap-lekup lekuh-lekih lekum-lekum lekup-lekap +lembaga-lembaga lenggak-lenggok lentam-lentum lentang-lentok +lese-majeste lete-lete +leyeh-leyeh +liar-liar lidah-lidah +life-toxins +liga-liga +light-emitting +lika-liku +lil-alamin +lilin-lilin +line-up +lintas-selat +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 +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 +lurah-camat +machine-to-machine +mafia-mafia +mahasiswa-mahasiswi mahi-mahi +main-main +main-mainlah +majelis-majelis +maju-mundur +makam-makam +makanan-red +make-up +maki-maki +mal-mal +malam-malam mali-mali +malu-malu +mama-mama +man-in-the-middle +mana-mana +manajer-manajer +manis-manis +marah-marah +mark-up +mas-mas +masa-masa +masalah-masalah +mash-up masing-masing +masjid-masjid +masuk-keluar mata-mata +match-fixing +mati-mati +mayat-mayat +mayday-mayday +media-media +mega-bintang +mega-tsunami megal-megol megap-megap megrek-megrek melak-melak +memata-matai +membuang-buang +men-tweet +menang-kalah menanti-nanti +menari-nari mencla-mencle +mengada-ngada +mengolok-olok +mengubah-ubah +menit-menit +menko-menko +menlu-menlu +mentah-mentah +menteri-menteri mentul-mentul +merah-hitam +merah-merah mercak-mercik +merek-merek +mereka-mereka +meta-analysis +metode-metode +mid-range +mid-size +mikro-kecil +mimpi-mimpi +minggu-minggu +minuman-minuman +mixed-use +mobil-mobil +mobile-first +mobile-friendly +mola-mola +momen-momen mondar-mandir +monyet-monyet morat-marit +move-on +muda-muda +muda-mudi +mudah-mudahan +muka-muka +multiple-output +muluk-muluk +mumi-mumi +mundur-mundur +muntah-muntah +murid-muridnya +musda-musda +museum-museum +muslim-muslimah +musuh-musuh +musuh-musuhnya +nabi-nabi +naik-naik +naik-turun +nama-nama +nanya-nanya nasi-nasi +near-field +negara-negara +negera-negara +negeri-negeri +negeri-red neka-neka +neko-neko +nenek-nenek +neo-liberalisme +next-gen +next-generation +ngeri-ngeri +nggak-nggak +ngobrol-ngobrol +ngumpul-ngumpul +nilai-nilai +nine-dash +nipa-nipa nong-nong +norma-norma +novel-novel +ob-gyn +obat-obat +obat-obatan +objek-objek +obok-obok +obrak-abrik +octa-core +odong-odong +oedipus-kompleks +off-road ogah-agih ogah-ogah ogak-agik ogak-ogak +ogoh-ogoh olak-alik olak-olak olang-aling +ole-ole oleh-oleh +olok-olok 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 +one-click +one-to-one +one-touch +one-two oneng-oneng ongol-ongol +online-to-offline ontran-ontran onyah-anyih onyak-anyik opak-apik +opsi-opsi +opt-in orak-arik orang-aring +orang-orang orat-oret +organisasi-organisasi +ormas-ormas orok-orok orong-orong +oseng-oseng otak-atik otak-otak +over-heating +over-the-air +over-the-top +pa-pa +pabrik-pabrik +pagi-pagi +pagi-sore +pajak-pajak +paket-paket palas-palas palato-alveolar +palu-arit +panas-dingin +pandai-pandai +panel-panel +pangeran-pangeran +panggung-panggung +pangkalan-pangkalan +panja-panja +panji-panji +pansus-pansus +pantai-pantai pao-pao parang-parang +parpol-parpol +partai-partai +paru-paru +pas-pasan +pasal-pasal +pasang-surut +pasar-pasar pasu-pasu +paus-paus +pay-per-click paya-paya +pecah-pecah +pecat-pecatan +peer-to-peer +pejabat-pejabat +pelabuhan-pelabuhan +pelacur-pelacur +pelajar-pelajar +pelan-pelan +pelangi-pelangi +pem-bully +pemain-pemain +pemda-pemda +pemeluk-pemeluknya +pemerintah-pemerintah +pemerintah-red +pemerintah-swasta +pemilu-pemilu +pemimpin-pemimpin +pemuda-pemuda +pemuda-pemudi +penanggung-jawab +pengaturan-pengaturan +pengusaha-pengusaha +penyakit-penyakit perak-perak +perang-perangan peras-perus +peraturan-peraturan +perda-perda +perempat-final +perempuan-perempuan +pergi-pergi +pergi-pulang +perkereta-apian +perlahan-lahan +permen-permen +pernak-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 petantang-petenteng petatang-peteteng pete-pete +piala-piala +pick-up +picture-in-picture +pihak-pihak +pikir-pikir +pil-pil +pilah-pilih +pilih-pilih +pilihan-pilihan +pilkada-pilkada pina-pina +pindah-pindah +ping-pong +pinjam-meminjam +pintar-pintarlah +planet-planet +play-off +plin-plan plintat-plintut plonga-plongo +plug-in +plus-minus +plus-plus +poco-poco +poin-poin +point-of-sale +point-of-sales +pokemon-pokemon +pokja-pokja +pokok-pokok +polda-polda +polres-polres +polsek-polsek +polwan-polwan +pondok-pondok +ponpes-ponpes pontang-panting +pop-up porak-parik porak-peranda porak-poranda +pos-pos +posko-posko +praktek-praktek +praktik-praktik +produk-produk +program-program +promosi-degradasi +provinsi-provinsi +proyek-proyek +puing-puing +puisi-puisi pukang-pukang +pulang-pergi +pulau-pulai +pulau-pulau +pull-up +pundi-pundi pungak-pinguk pura-pura puruk-parak +pusat-pusat +push-to-talk +push-up +push-ups +puskesmas-puskesmas +putera-puteri +putih-hitam +putih-putih +putra-putra +putra-putri +putri-putri +putus-putus +putusan-putusan puvi-puvi +quad-core raba-rubu +radio-frequency +ragu-ragu +raja-raja rama-rama +ramai-ramai +ramalan-ramalan +rambu-rambu +rame-rame randa-rondo rango-rango +rap-rap +rata-rata +read-only +real-life +real-time +red-eye +rehab-rekon +rekan-rekan +rekan-rekannya +rekor-rekor +relief-relief +remang-remang +rempah-rempah +rencana-rencana rep-repan +restoran-restoran riang-riang ribu-ribu +ribut-ribut +rica-rica +ride-sharing rigi-rigi rintik-rintik +ritual-ritual robak-rabik robat-rabit +robot-robot +role-play +role-playing +roll-on rombang-rambing romol-romol rondah-rondih ropak-rapik +royo-royo ruba-ruba +rudal-rudal +rumah-rumah rumbai-rumbai rundu-rundu runggu-rangga +runner-up runtang-runtung +rupa-rupa +rusun-rusun +rute-rute +saat-saat sabu-sabu +sah-sah +sahabat-sahabat +saham-saham +saksi-saksi sama-sama samo-samo sampai-sampai +sana-sini +sandi-sandi +sapi-sapi +saran-saran +sarana-prasarana sarit-sarit +satu-dua +satu-satu +satu-satunya +satuan-satuan +saudara-saudara +sayang-sayang +sayap-sayap +sayur-mayur +sci-fi sebaik-baiknya +sebesar-besarnya +sedang-sedang segan-segan +sehari-hari +sehari-harinya sekali-kali +sekolah-sekolah sekonyong-konyong +sektor-sektor sekurang-kurangnya +sel-sel selak-seluk selama-lamanya +selambat-lambatnya selang-seli selang-seling +selatan-tenggara selentang-selenting +self-driving +self-esteem +self-healing +self-help seluk-beluk sema-sema semang-semang semata-mata +sembunyi-sembunyi +semena-mena +semi-final +semi-permanen +sendiri-sendiri sengar-sengir +senior-junior +senjata-senjata +senyum-senyum seolah-olah sepala-pala +serangan-serangan +serba-serbi serbah-serbih serembah-serembih +serigala-serigala serta-merta +seru-seruan +service-oriented +sesi-sesi +set-piece +setengah-setengah setidak-tidaknya +setinggi-tingginya +sewa-menyewa +sewenang-wenang +shabu-shabu +short-term +short-throw sia-sia +siang-siang +siap-siap +siapa-siapa +side-by-side +sign-in +simbol-simbol +simpan-pinjam +singa-singa +single-core +sipil-militer +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 +sok-sokan +solid-state sorak-sorai +sorak-sorak +sore-sore +sosio-ekonomi +soya-soya +spill-resistant +split-screen +sponsor-sponsor +srikandi-srikandi +staf-staf +stand-by +stand-up +start-up +stasiun-stasiun +state-owned +striker-striker +studi-studi +suami-isteri +suami-istri +suami-suami +suara-suara +sudin-sudin sudu-sudu +suka-suka +suku-suku sulat-sulit +sum-sum +sumber-sumber sumpah-sumpah +sungai-sungai +sungguh-sungguh +super-damai +super-rahasia +super-sub +supply-demand +supply-side +surat-surat +susul-menyusul +syarat-syarat +system-on-chip +t-shirt +t-shirts tabar-tabar +tahun-tahun takang-takik +take-off +taman-taman +tanda-tanda +tangan-tangan +tangga-tangga +tanggal-tanggal +tanggul-tanggul +tank-tank +tanya-jawab +tarik-menarik +tarik-ulur +tata-tertib +tau-tau tawa-tawa tawak-tawak tawang-tawang tawar-tawar +tebak-tebakan +tek-tek teka-teki +teknik-teknik +teman-teman +teman-temanku +tempat-tempat temut-temut +tenang-tenang +tengah-tengah +teori-teori +terang-terangan +terbahak-bahak +terbirit-birit +terburu-buru +tergesa-gesa +tergila-gila teringat-ingat +terkatung-katung +terlunta-lunta +terombang-ambing +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 +tie-dye +tie-in +tiki-taka +tikus-tikus +tim-tim timah-timah +time-lapse timu-timu +timur-barat +timur-laut +timur-tenggara +tip-off +tipu-tipu +titik-titik +titik-titiknya +to-do +toko-toko +tokoh-tokoh +tong-tong +top-level +top-up +touch-screen +trade-in +training-camp +trans-nasional +treble-winner +tri-band +trik-trik +triple-core +truk-truk +tua-tua +tuan-tuan tuang-tuang +tubuh-tubuh +tujuan-tujuan +tuk-tuk +tulang-belulang tuli-tuli tumpang-tindih +tune-up tupai-tupai +turn-based +turnamen-turnamen +turun-temurun +twin-cam +twin-turbocharged +two-state +two-step +two-tone +u-shape ubrak-abrik ubun-ubun ubur-ubur uci-uci +udang-undang ugal-ugalan uget-uget uir-uir +uji-coba +ujung-ujung +ujung-ujungnya +uka-uka ula-ula ulang-alik ulang-aling @@ -479,9 +1613,12 @@ ulu-ulu ulung-ulung umang-umang umbang-ambing +umbi-umbian umbul-umbul umbut-umbut uncang-uncit +undang-undang +undang-undangnya unduk-unduk undung-undung undur-undur @@ -489,18 +1626,60 @@ unek-unek ungah-angih unggang-anggit unggat-unggit +unit-unit +universitas-universitas +unsur-unsur untang-anting +upside-down ura-ura uran-uran +urat-urat +usaha-usaha user-user 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 +wanita-wanita wanti-wanti 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() +""".split()) From 62443d495a877ecadcdbe28e368a2a70adc79728 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 19:13:14 +0700 Subject: [PATCH 067/739] enable token match --- spacy/lang/id/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index 1b4cd1225..f8d90903f 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -3,7 +3,7 @@ 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 .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH from .norm_exceptions import NORM_EXCEPTIONS from .lex_attrs import LEX_ATTRS @@ -21,6 +21,7 @@ class IndonesianDefaults(Language.Defaults): tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) stop_words = set(STOP_WORDS) + token_match = TOKEN_MATCH prefixes = tuple(TOKENIZER_PREFIXES) suffixes = tuple(TOKENIZER_SUFFIXES) infixes = tuple(TOKENIZER_INFIXES) From edec51b1b1999b09ccbbea6c836d47db498a40ef Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 19:13:36 +0700 Subject: [PATCH 068/739] update punctuation rules --- spacy/lang/id/punctuation.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py index 794d6a39e..d8623eaca 100644 --- a/spacy/lang/id/punctuation.py +++ b/spacy/lang/id/punctuation.py @@ -19,15 +19,15 @@ _months = ('Januari Februari Maret April Mei Juni Juli Agustus September Oktober UNITS = merge_chars(_units) CURRENCY = merge_chars(_currency) -HTML_PREFIX = r'<(b|strong|i|em|p|span|div|br)\s?/>' -HTML_SUFFIX = r'' +HTML_PREFIX = r'<(b|strong|i|em|p|span|div|br)\s?/>|]+)>' +HTML_SUFFIX = r'' MONTHS = merge_chars(_months) LIST_CURRENCY = split_chars(_currency) -_prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['[Kk]e-', '/', '—'] +_prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['/', '—'] -_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '—', '-'] + [ +_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '-[KkMm]u' '-el', '[—-]'] + [ r'(?<=[0-9])(?:{c})'.format(c=CURRENCY), r'(?<=[0-9])(?:{u})'.format(u=UNITS), r'(?<=[0-9])%', From 6eee7a74118f6e33b1a993d9b611ee89b09604e3 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 19:13:47 +0700 Subject: [PATCH 069/739] updated tokenizer exceptions --- spacy/lang/id/tokenizer_exceptions.py | 43 +++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 2f0b97567..c8f0de8c4 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -1,12 +1,51 @@ # 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 ..char_classes import ALPHA from ...symbols import ORTH + _exc = {} -for orth in ID_BASE_EXCEPTIONS + ["etc."]: +for orth in ID_BASE_EXCEPTIONS: _exc[orth] = [{ORTH: orth}] -TOKENIZER_EXCEPTIONS = dict(_exc) \ No newline at end of file + 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}] + + +_hyphen_prefix = """Abdur Abdus Abou Aboul Abror Abshar Abu Abubakar Abul +Aero Agri Agro Ahmadi Ahmed Air abd abdel abdul ad adz afro al ala ali all +amir an antar anti ar as ash asy at ath az bekas ber best bi co di double +dual duo e eco eks el era ex full hi high i in inter intra ke kontra korona +kuartal lintas m macro makro me mem meng micro mid mikro mini multi neo nge +no non on pan pasca pe pem poli poly post pra pre pro re se self serba seri +sub super t trans ultra un x """.split() + +_hyphen_infix = """me-kan me-kannya men-kan men-kannya meng-kannya ke-an +ke-annya di-kan di-kannya de-isasi ber-an berke-an""".split() + +_regular_exp = ['^{p}-*$'.format(p=prefix) for prefix in _hyphen_prefix] +_regular_exp += ['^{0}-*-{1}$'.format(*infix.split('-')) for infix in _hyphen_infix] +_regular_exp.append(URL_PATTERN) + + +TOKENIZER_EXCEPTIONS = dict(_exc) +TOKEN_MATCH = re.compile('|'.join('(?:{})'.format(m) for m in _regular_exp), re.IGNORECASE).match From f2889644412c310de780a0f5a3d4a865bdbae9e0 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 19:28:38 +0700 Subject: [PATCH 070/739] removed -el from suffix rules --- spacy/lang/id/punctuation.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py index d8623eaca..b72109ba6 100644 --- a/spacy/lang/id/punctuation.py +++ b/spacy/lang/id/punctuation.py @@ -12,9 +12,10 @@ _units = (_units + 's bit Gbps Mbps mbps Kbps kbps ƒ ppi px ' 'juta jt jutaan mill?iar million bil[l]?iun bilyun billion ' ) _currency = (_currency + r'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 ') +_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) @@ -27,7 +28,7 @@ LIST_CURRENCY = split_chars(_currency) _prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['/', '—'] -_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '-[KkMm]u' '-el', '[—-]'] + [ +_suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '-[KkMm]u', '[—-]'] + [ r'(?<=[0-9])(?:{c})'.format(c=CURRENCY), r'(?<=[0-9])(?:{u})'.format(u=UNITS), r'(?<=[0-9])%', From 63f14ba46bef5991f17939232788f5c40dd67afd Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 19:28:57 +0700 Subject: [PATCH 071/739] added hyphen-suffix rules --- spacy/lang/id/tokenizer_exceptions.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index c8f0de8c4..84464c31c 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -31,19 +31,23 @@ for orth in ID_BASE_EXCEPTIONS: _exc[orth_caps] = [{ORTH: orth_caps}] -_hyphen_prefix = """Abdur Abdus Abou Aboul Abror Abshar Abu Abubakar Abul -Aero Agri Agro Ahmadi Ahmed Air abd abdel abdul ad adz afro al ala ali all +_hyphen_prefix = """abdur abdus abou aboul abror abshar abu abubakar abul +aero agri agro ahmadi ahmed air abd abdel abdul ad adz afro al ala ali all amir an antar anti ar as ash asy at ath az bekas ber best bi co di double dual duo e eco eks el era ex full hi high i in inter intra ke kontra korona kuartal lintas m macro makro me mem meng micro mid mikro mini multi neo nge no non on pan pasca pe pem poli poly post pra pre pro re se self serba seri -sub super t trans ultra un x """.split() +sub super t trans ultra un x""".split() _hyphen_infix = """me-kan me-kannya men-kan men-kannya meng-kannya ke-an ke-annya di-kan di-kannya de-isasi ber-an berke-an""".split() +_hyphen_suffix = """el""" + _regular_exp = ['^{p}-*$'.format(p=prefix) for prefix in _hyphen_prefix] -_regular_exp += ['^{0}-*-{1}$'.format(*infix.split('-')) for infix in _hyphen_infix] +_regular_exp = ['^{p}-*$'.format(p=prefix.title()) for prefix in _hyphen_prefix] +_regular_exp += ['^{0}-*-{1}$'.format(*infix.title().split('-')) for infix in _hyphen_infix] +_regular_exp = ['^*-{s}$'.format(s=suffix) for suffix in _hyphen_suffix] _regular_exp.append(URL_PATTERN) From 24a8c8bf2899f1c9cae59f3ff69c1fff5da75688 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 26 Jul 2017 21:39:54 +0700 Subject: [PATCH 072/739] added wip lemma dict --- spacy/lang/id/lemmatizer.py | 27095 ++++++++++++++++++++++++++++++++++ 1 file changed, 27095 insertions(+) create mode 100644 spacy/lang/id/lemmatizer.py diff --git a/spacy/lang/id/lemmatizer.py b/spacy/lang/id/lemmatizer.py new file mode 100644 index 000000000..f644122ea --- /dev/null +++ b/spacy/lang/id/lemmatizer.py @@ -0,0 +1,27095 @@ +# coding: utf8 +from __future__ import unicode_literals + +ID_BASE_LEMMA = """ +aba peraba +aba perabaan +abad berabad +abad perabadan +abad seabad +abadi diabadikan +abadi diabadikannya +abadi keabadian +abadi mengabadikan +abadi mengabadikannya +abadi pengabadian +abadi terabadikan +abai diabaikan +abai diabaikannya +abai mengabaikan +abai mengabaikannya +abai pengabaian +abai terabaikan +abai terabaikannya +abdi diabdikan +abdi mengabdi +abdi mengabdikan +abdi pengabdi +abdi pengabdian +aben pengabenan +abnormal keabnormalan +aborsi diaborsi +aborsi mengaborsi +abrek seabrek +absah diabsahkan +absah keabsahan +absah mengabsahkan +absah pengabsahan +absen diabsen +absen mengabsen +absen mengabsenkan +abu keabuan +abu pengabuan +abu perabuan +abu-abu keabu-abuan +acak diacak +acak mengacak +acak pelacak +acak pengacak +acak pengacakan +acara beracara +acara diacara +acara seacara +acu beracuan +acu diacu +acu mengacu +acu mengacukan +acu mengacunya +acuh diacuhkan +acuh diacuhkannya +acuh keacuhan +acuh mengacuhkan +acuh mengacuhkannya +acung diacungi +acung diacungkan +acung mengacung +acung mengacungi +acung mengacungkan +acung mengacungkannya +acung teracung +ada berada +ada beradanya +ada diadakan +ada diadakanlah +ada diadakannya +ada keadaan +ada memadai +ada menadakan +ada mengadakan +ada mengadakannya +ada pengadaan +ada seadanya +adab beradab +adab beradap +adab keadaban +adab peradaban +adab peradapan +adab teradap +adang diadang +adang memadang +adang mengadang +adang mengadangnya +adang menyadang +adang pengadangan +adang penyadang +adaptasi beradaptasi +adaptasi beradaptasinya +adaptasi diadaptasi +adaptasi diadaptasikan +adaptasi mengadaptasi +adaptasi mengadaptasikan +adaptasi mengadaptasinya +adat beradat +adegan beradegan +adik beradik +adik pengadikan +adil diadili +adil keadilan +adil mengadili +adil pengadil +adil pengadilan +adil peradilan +adil seadil +adil seadilnya +administrasi diadministrasikan +administrasi keadministrasian +administrasi mengadministrasi +administrasi mengadministrasikan +administrasi pengadministrasi +administrasi pengadministrasian +adopsi diadopsi +adopsi diadopsinya +adopsi mengadopsi +adopsi mengadopsinya +adopsi pengadopsi +adopsi pengadopsian +adu beradu +adu diadu +adu diadukan +adu diadukannya +adu mengadu +adu mengadukan +adu mengadukannya +adu pengadu +adu pengaduan +adu pengadukan +adu peraduan +adu teradu +aduh mengaduh +aduk diaduk +aduk diadukan +aduk memadukan +aduk mengaduk +aduk mengadukan +aduk mengaduknya +aduk pengaduk +aduk pengadukan +advokasi diadvokasi +advokasi mengadvokasi +advokasi mengadvokasikan +afiliasi berafiliasi +afiliasi terafiliasi +afirmasi diafirmasi +afirmasi mengafirmasi +agama beragama +agama beragamanya +agama keagamaan +agama seagama +agen diageni +agen keagenan +agen mengageni +agenda beragenda +agenda beragendakan +agenda diagendakan +agenda mengagendakan +agenda mengagendakannya +agenda teragendakan +tagih menagih +tagih menagihkan +tagih menagihnya +tagih penagih +tagih penagihan +agregasi mengagregasi +agresi mengagresi +agresif keagresifan +agresif seagresif +agun beragun +agun beragunan +agun diagunkan +agun mengagunkan +agung diagungkan +agung keagungan +agung mengagungkan +ahli keahlian +air berair +air diairi +air keairan +air mengairi +air pengairan +syair penyair +air perairan +air terairi +ajaib keajaiban +ajak diajak +ajak diajaklah +ajak diajaknya +pajak memajaki +ajak mengajak +ajak mengajakan +ajak mengajaknya +pajak pemajakan +ajar belajar +ajar belajarlah +ajar belajarnya +ajar diajar +ajar diajari +ajar diajarkan +ajar diajarkannya +ajar diajarnya +ajar mengajar +ajar mengajari +ajar mengajarkan +ajar mengajarkannya +ajar mengajarnya +ajar pelajar +ajar pelajaran +ajar pelajari +ajar pelajarnya +ajar pengajar +ajar pengajaran +ajar pengajarnya +aji mengaji +aji mengajinya +aji menyajikan +aji menyajikannya +ngaji pengajian +saji penyaji +saji penyajian +aju diajukan +aju diajukannya +aju memajukan +aju memajukannya +aju mengaju +aju mengajuan +aju mengajukan +aju mengajukannya +aju pelaju +maju pemajuan +aju pengaju +aju pengajuan +aju pengajukan +ajur diajurkan +ajur mengajurkan +akal berakal +akal diakal +akal diakali +akal mengakali +makan memakan +makan memakannya +makan pemakan +makan pemakanan +makan pemakannya +akan seakan +belakang belakangan +belakang belakangi +belakang belakangnya +akar berakar +takar menakar +akar mengakar +akar mengakarnya +takar penakar +takar penakaran +akar perakaran +akas berakas +akbar terakbar +akhir berakhir +akhir berakhiran +akhir berakhirlah +akhir berakhirnya +akhir diakhir +akhir diakhiri +akhir diakhirnya +akhir mengakhir +akhir mengakhiri +akhir mengakhirnya +akhir pengakhir +akhir pengakhiran +akhir terakhir +akhir terakhirlah +akhir terakhirnya +akhlak berakhlak +maki memaki +maki memakinya +maki pemakian +akibat berakibat +akibat berakibatkan +akibat diakibat +akibat diakibatkan +akibat diakibatkannya +akibat mengakibat +akibat mengakibatan +akibat mengakibatkan +akibat mengakibatkannya +akibat mengakibatnya +akidah seakidah +aklamasi diaklamasi +akomodasi diakomodasi +akomodasi diakomodasikan +akomodasi diakomodasinya +akomodasi mengakomodasi +akomodasi mengakomodasikan +akomodasi mengakomodasinya +akomodasi terakomodasi +akomodasi terakomodasinya +akrab diakrab +akrab diakrabi +akrab keakraban +akrab mengakrabi +akrab mengakrabkan +akreditasi berakreditasi +akreditasi diakreditasi +akreditasi mengakreditasi +akreditasi terakreditasi +akrobat berakrobat +akrobatik berakrobatik +paksa memaksa +paksa memaksaan +paksa memaksakan +paksa memaksakannya +paksa memaksanya +paksa pelaksa +paksa pelaksaan +paksa pemaksa +paksa pemaksaan +aksara beraksara +aksara keaksaraan +akselerasi berakselerasi +akselerasi diakselerasi +akselerasi diakselerasikan +akselerasi mengakselerasi +akselerasi mengakselerasikan +akselerasi terakselerasi +aksen beraksen +akses berakses +akses diakses +akses diaksesi +akses diaksesnya +akses mengakses +akses mengaksesi +akses mengaksesnya +akses pengakses +akses pengaksesan +akses pengaksesnya +akses terakses +akta diaktakan +aktif diaktifkan +aktif diaktifkannya +aktif keaktifan +aktif mengaktifkan +aktif mengaktifkannya +aktif pengaktifan +aktif pengaktifkan +aktif seaktif +aktif teraktif +aktivitas beraktivitas +aktivitas beraktivitasnya +aktual teraktual +aktualisasi diaktualisasikan +aktualisasi mengaktualisasi +aktualisasi mengaktualisasikan +aku belaku +aku diaku +aku diakui +aku diakukan +aku diakunya +aku keakuan +aku meakukan +aku memaku +aku memakukan +aku mengaku +aku mengakui +aku mengakukan +aku mengakunya +aku pelaku +aku pelakuan +aku pelakukan +aku pelakunya +aku pengaku +aku pengakuan +aku peraku +akua pengakuanya +akuan keakuan +akuan pelakuan +akuan pengakuan +akuan pengakuannya +akuisisi diakuisisi +akuisisi diakuisisinya +akuisisi mengakuisisi +akuisisi mengakuisisinya +akuisisi pengakuisisian +akuk diakukan +akuk meakukan +akuk memakukan +akuk mengakukan +akuk pelakukan +akuk pelakuknya +akumulasi berakumulasi +akumulasi diakumulasi +akumulasi diakumulasikan +akumulasi mengakumulasi +akumulasi mengakumulasikan +akumulasi terakumulasi +akumulasi terakumulasinya +akun berakun +akun diakun +akur mengakurkan +akurasi keakurasian +akurat keakuratan +akurat seakurat +akurat terakurat +akut menakut +akut menakuti +akut menakutkan +akut menakutkannya +akut mengakut +akut menyakut +akut penakut +akut pengakut +akut pengakutan +al beal +al dial +al meal +al menalan +al mengali +al pemali +al penal +al penali +al pengali +al seal +al terali +ala belalai +ala mengalai +ala mengalakan +ala menyala +ala menyalakan +ala menyalakannya +ala menyalanya +ala pemalakan +ala penyala +ala penyalaan +ala seala +alah dialah +alah mengalah +alah mengalahan +alah mengalahkan +alah mengalahkannya +alah menyalah +alah menyalahi +alah menyalahkan +alah menyalahkannya +alah penyalah +alah penyalahan +alai belalai +alai belalainya +alai mengalai +alak memalak +alak memalaknya +alak mengalakan +alak mengalakkan +alak menyalak +alak menyalakan +alak pemalak +alak pemalakan +alam dialam +alam dialami +alam menalami +alam mengalam +alam mengalami +alam menyalami +alam pengalam +alam pengalaman +alam pengalami +alam sealami +alamat beralamat +alamat beralamatkan +alamat dialamatkan +alamat mengalamatkan +alamat menyalamatkan +alamat pengalamatan +alamat penyalamat +alamat penyalamatan +alami dialami +alami dialaminya +alami kealamian +alami menalami +alami mengalami +alami mengalamii +alami mengalaminya +alami menyalami +alami menyalaminya +alami pengalami +alami sealami +alamin mengalamin +alang belalang +alang memalang +alang memalangkan +alang menalangi +alang mengalang +alang mengalangi +alang pemalang +alang pemalangan +alang penalangan +alang pengalangan +alas beralas +alas beralasan +alas beralaskan +alas dialasi +alas pemalas +alat menyalati +alat menyalatkan +alat peralat +alat peralatan +alfa kealfaan +ali mengali +ali mengalikan +ali pemali +ali penali +ali pengali +ali pengalian +ali terali +aliansi beraliansi +alibi beralibi +alienasi teralienasi +alih beralih +alih beralihlah +alih beralihnya +alih dialih +alih dialihkan +alih dialihkannya +alih mengalih +alih mengalihan +alih mengalihkan +alih mengalihkannya +alih pengalih +alih pengalihan +alih peralihan +alih teralih +alih teralihkan +alin menyalin +alin menyalinnya +alin penyalinan +alin sealin +aling dialing +aling memalingkan +aling sealing +alip menyalip +alip menyalipnya +alir beraliran +alir dialiran +alir dialiri +alir dialirkan +alir mengalir +alir mengaliri +alir mengalirkan +alir mengalirkannya +alir mengalirlah +alir mengalirnya +alir pengalir +alir pengaliran +alir sealiran +alir teraliri +alir teralirkan +alis beralis +alis teralis +alkohol beralkohol +alku dialkukan +alokasi dialokasi +alokasi dialokasikan +alokasi dialokasikannya +alokasi mengalokasi +alokasi mengalokasikan +alokasi mengalokasikannya +alokasi pengalokasian +alokasi pengalokasikan +alokasi teralokasi +alokasi teralokasikan +alon menyalonkan +alon peralon +alpa kealpaan +alu mealui +alu memalu +alu memalui +alu memalukan +alu memalukannya +alu pelalu +alu pemalu +alu sealu +alu teralu +alum mengalum +alun mengalun +alun mengalunkan +alung mengalungi +alung mengalungkan +alung pengalungan +alur beralur +alur menyaluran +alur menyalurkan +alur menyalurkannya +alur penyalur +alur penyaluran +alur penyalurkan +alur penyalurnya +am beam +am beaman +am beram +am diam +am diaman +am diami +am diamkan +am diamlah +am diamnya +am keaman +am menaman +am menamkan +am mengaman +am mengami +am mengamkan +am menyamkan +am penaman +am pengaman +am seam +am seaman +am teraman +ama berama +ama beramai +ama diamakan +ama keamaan +ama menamai +ama menamakan +ama menamakannya +ama mengamakan +ama menyama +ama menyamai +ama menyamakan +ama menyamakannya +ama penamaan +ama pengamaan +ama penyama +ama penyamaan +ama penyamakan +ama perama +ama seama +ama teramai +amah beramah +amah memamah +amah pelamahan +amah pemamah +amai beramai +amai menamai +amai menamainya +amai menyamai +amai menyamainya +amai teramai +amal beramal +amal diamalkan +amal mengamali +amal mengamalkan +amal mengamalkannya +amal pengamal +amal pengamalan +amal peramal +amal peramalan +aman beaman +aman diaman +aman diamankan +aman diamankannya +aman keaman +aman keamanan +aman menaman +aman menamankan +aman mengaman +aman mengamanan +aman mengamankan +aman mengamankannya +aman menyamankan +aman penaman +aman penamanan +aman pengaman +aman pengamanan +aman pengamankan +aman pengamannya +aman seaman +aman teraman +amanah diamanahi +amanah diamanahkan +amanah mengamanahkan +amanat diamanati +amanat diamanatkan +amanat mengamanatkan +amang teramang +amar menyamar +amar menyamarkan +amar menyamarkannya +amar pelamar +amar pelamaran +amar pelamarnya +amar penyamar +amar penyamaran +amat diamati +amat keamatan +amat menamatkan +amat mengamati +amat mengamatkan +amat pengamat +amat pengamatan +amat pengamatnya +amat teramat +amat teramati +ambah menambah +ambah menambahan +ambah menambahi +ambah menambahkan +ambah menambahkannya +ambah menambahnya +ambah penambah +ambah penambahan +ambah penambahkan +ambah perambah +ambah perambahan +ambak menambak +ambak menambakan +ambak penambak +ambak penambakan +ambal menambal +ambal menambalnya +ambal penambal +ambal penambalan +ambang belambang +ambang belambangan +ambang diambang +ambang diambangkan +ambang menambang +ambang menambangnya +ambang mengambang +ambang mengambangkan +ambang mengambangnya +ambang menyambangi +ambang pelambang +ambang penambang +ambang penambangan +ambang penambangnya +ambang pengambang +ambang pengambangan +ambar mengambar +ambar mengambarkan +ambar menyambar +ambar menyambarnya +ambek mengambek +ambet menyambet +ambil diambil +ambil diambilkan +ambil diambillah +ambil diambilnya +ambil menambil +ambil mengambil +ambil mengambilan +ambil mengambili +ambil mengambilkan +ambil mengambilnya +ambil penambilan +ambil pengambil +ambil pengambilan +ambil terambil +ambisi berambisi +ambruk keambrukan +ambul mengambulkan +ambung menambung +ambung menyambung +ambung menyambungkan +ambung menyambungkannya +ambung menyambungnya +ambung pelambungan +ambung penyambung +ambung penyambungan +amen mengamen +amen pengamen +amendemen diamendemen +amendemen mengamendemen +ami diami +ami mengami +amil mengamil +amil penamilan +amin beramin +amin diamin +amin diamini +amin diaminkan +amin mengamini +amin mengaminkan +amin peamin +amin pelaminan +amir keamiran +amonia pelamonia +ampai diampaikan +ampai menyampai +ampai menyampaian +ampai menyampaikan +ampai menyampaikannya +ampai penyampai +ampai penyampaian +ampai penyampaikan +ampang memampang +ampang memampangkan +ampang penampang +ampang penampangnya +ampas perampas +ampas perampasan +ampas terampas +ampat memampatkan +ampat menampati +ampat menampatkan +amplifikasi mengamplifikasi +amplitudo beramplitudo +amplop beramplop +ampo perampokan +ampo perampokannya +ampu diampu +ampu memampukan +ampu mengampu +ampu pengampu +ampu pengampuan +ampu perampuan +ampuh keampuhan +ampuh seampuh +ampuh terampuh +ampuk memampukan +ampuk menampuk +ampun diampuni +ampun diampunkan +ampun menampun +ampun mengampuni +ampun pengampun +ampun pengampunan +ampun terampuni +amputasi diamputasi +amputasi mengamputasi +amputasi teramputasi +amuk diamuk +amuk mengamuk +amuk mengamuknya +amunisi beramunisi +ana diana +ana menganai +ana menganakan +ana pelana +ana pengana +ana peranakan +anak belanak +anak beranak +anak dianak +anak menanak +anak menganak +anak menganakan +anak penanak +anak peranakan +anal beanal +anal menganal +analis dianalis +analis menganalis +analis menganalisi +analisis dianalisis +analisis menganalisis +analisis menganalisisnya +analisis penganalisis +analog beranalogi +analogi beranalogi +analogi dianalogikan +analogi menganalogikan +analogi menganalogikannya +anang memanangkan +anang menanangi +anang pemanang +anang penanangan +anani menganani +ancak perancak +ancam diancam +ancam diancaman +ancam diancamkan +ancam mengancam +ancam mengancaman +ancam mengancamnya +ancam pengancam +ancam pengancaman +ancam terancam +ancam terancaman +ancam terancamnya +ancang memancang +ancang memancangkan +ancang pemancang +ancang pemancangan +ancang perancang +ancang perancangan +ancang perancangnya +ancang terancang +andai berandai +andai diandaikan +andai menandai +andai menandainya +andai mengandaikan +andai pengandaian +andai seandainya +andak menandakan +andak mengandakan +andal berandal +andal berandalan +andal diandalkan +andal diandalkannya +andal keandalan +andal mengandalkan +andal mengandalkannya +andam terandam +andan belandan +andan berandan +andang memandang +andang memandangi +andang memandangnya +andang menandang +andang mengandangkan +andang menyandang +andang menyandangnya +andang pemandangan +andang pengandangan +andang penyandang +andang penyandangnya +andar menyandar +andar menyandarkan +andar pengandaran +andil berandil +andil pengandilan +andung menandung +andung mengandung +andung mengandungnya +andung menyandung +aneh keanehan +aneh seaneh +aneh teraneh +aneka beraneka +aneka keaneka +aneksasi dianeksasi +aneksasi menganeksasi +aneksasi menganeksasinya +angah menangah +angan belangan +angan berangan +angan menangan +angan menangani +angan mengangani +angan mengangankan +angan pelangan +angan pelangannya +angan penangan +angan penanganan +angan penangannya +angan pengangan +angan penganganan +angan perangan +angan terangan +angga diangga +angga menanggai +angga mengangga +angga menyangga +angga menyangganya +angga pelangga +angga pelanggaan +angga pelangganya +angga penyangga +angga penyangganya +anggai menanggai +anggal dianggal +anggal menanggal +anggal menanggalkan +anggal menanggalkannya +anggal penanggalan +anggan menanggani +anggan pelanggan +anggan pelanggannya +anggan penangganan +anggap beranggapan +anggap dianggap +anggap dianggapnya +anggap menanggap +anggap menanggapi +anggap menanggapnya +anggap menganggap +anggap menganggapi +anggap menganggapnya +anggap penanggap +anggar beranggaran +anggar dianggaran +anggar dianggarkan +anggar dianggarkannya +anggar menganggarkan +anggar menganggarkannya +anggar pelanggar +anggar pelanggaran +anggar pelanggarnya +anggar penanggaran +anggar penganggaran +anggar teranggarkan +anggara dianggarakan +anggara pelanggara +anggara pelanggaraan +anggota beranggota +anggota beranggotakan +anggota dianggotai +anggota keanggota +anggota keanggotaan +angguh menangguhkan +angguh menangguhkannya +angguh penangguhan +angguh pengangguhan +angguk menangguk +angguk mengangguk +angguk menganggukan +angguk menganggukkan +anggul memanggul +anggul menanggul +anggul menyanggul +anggul penanggulan +anggun keanggunan +anggung beranggung +anggung memanggungkan +anggung menanggung +anggung menanggungnya +anggung menganggung +anggung penanggung +anggung penanggungan +anggur dianggurkan +anggur menanggur +anggur menganggur +anggur menganggurnya +anggur penangguran +anggur penganggur +anggur pengangguran +angin berangin +angin menangin +angin perangin +angin peranginan +angin seangin +angka berangka +angka berangkai +angka diangka +angka diangkakan +angka menyangka +angka menyangkakan +angka menyangkanya +angka penangkaan +angka perangka +angka perangkai +angka terangka +angka terangkai +angkak diangkakan +angkak menyangkakan +angkasa mengangkasa +angker keangkeran +angket diangket +angket diangketkan +angku memangku +angku memangkunya +angku pemangku +angku pemangkuan +angkuh keangkuhan +angkup menangkupkan +angkup menyangkup +angkut berangkutan +angkut diangkut +angkut diangkutnya +angkut menangkut +angkut mengangkut +angkut mengangkuti +angkut mengangkutnya +angkut menyangkut +angkut menyangkutkan +angkut pengangkut +angkut pengangkutan +angkut pengangkutnya +angkut terangkut +angsa memangsa +angsa memangsanya +angsa pemangsa +angsa pemangsaan +angsa pemangsanya +angsa pengangsaan +angsur berangsur +angsur diangsur +angsur mengangsur +angur penganguran +angut mengangut +ani belani +ani berani +ani beranikan +ani beranilah +ani beraninya +ani diani +ani meani +ani mengani +ani pelani +aniaya dianiaya +aniaya menganiaya +aniaya menganiayanya +aniaya penaniayaan +aniaya penganiaya +aniaya penganiayaan +aniaya teraniaya +anis dianis +anis pemanis +anis pemanisnya +anja belanja +anja belanjaan +anja belanjakan +anja belanjalah +anja belanjanya +anja memanjakan +anja memanjakannya +anja pemanjaan +anja penanjakan +anjak belanjakan +anjak beranjak +anjak beranjaklah +anjak memanjakan +anjak menanjak +anjak menanjaknya +anjak penanjakan +anjal menganjal +anjang beranjang +anjang memanjang +anjang memanjangkan +anjang memanjangnya +anjang pemanjangan +anjangsana beranjangsana +anjar menganjar +anjat memanjat +anjat memanjatkan +anjat memanjatnya +anjat pemanjat +anjat pemanjatan +anjung menyanjung +anjung menyanjungnya +anjung penanjung +anjur dianjurkan +anjur dianjurkannya +anjur menganjurkan +anjur menganjurkannya +anjur penganjur +anjur penganjuran +anta berantai +anta berantakan +anta berantakannya +anta dianta +anta diantanya +anta memantai +anta mengantakan +antah berantah +antap memantapkan +antap menantap +antap menyantap +antap menyantapnya +antap pemantapan +antap penyantap +antap penyantapnya +antar diantar +antar diantaran +antar diantarkan +antar diantarkannya +antar diantarnya +antar mengantar +antar mengantarkan +antar mengantarkannya +antar mengantarnya +antar pelantar +antar pelantaran +antar pengantar +antar pengantaran +antar pengantarnya +antariksa keantariksaan +antarpulau diantarpulaukan +antem berantem +antero seantero +anti belanti +anti menanti +anti menantikan +anti menantikannya +anti menantinya +anti menganti +anti mengantikan +anti mengantikannya +anti mengantinya +anti pelantikan +anti pelantikannya +anti penanti +anti penantian +anti penganti +anti pengantian +anti pengantinya +anti peranti +anti perantinya +anting belanting +anting beranting +antisipasi diantisipasi +antisipasi diantisipasinya +antisipasi mengantisipasi +antisipasi mengantisipasinya +antisipasi pengantisipasian +antisipasi terantisipasi +antuk mengantuk +antuk mengantuknya +antuk terantuk +antul memantul +antul memantulkan +antul memantulkannya +antul pemantul +antun menyantuni +antun pelantun +antun penyantun +antun penyantunan +antusias berantusias +antusias seantusias +anu keanu +anugerah dianugerahi +anugerah dianugerahkan +anugerah menganugerahi +anugerah menganugerahkan +anugerah penganugerahan +anulir dianulir +anulir dianulirnya +anulir menganulir +anulir menganulirnya +anulir penganuliran +anus teranus +anut dianut +anut dianutnya +anut menganut +anut peanut +anut penganut +anut penganutnya +anyam dianyam +anyam menganyam +anyang menanyangkan +anyang menyanyangi +anyang menyanyangkan +anyang penanyangan +anyang penyanyang +anyar teranyar +anyar teranyarnya +apa berapa +apa berapanya +apa diapa +apa diapakan +apa menapai +apa menapakan +apa mengapa +apa mengapai +apa menyapa +apa menyapai +apa menyapanya +apak diapakan +apak menapak +apak menapakan +apak menapaki +apak menapakkan +apak pelapak +apakah berapakah +apakah mengapakah +apar memapar +apar memaparkan +apar memaparkannya +apar pemaparan +apas memapas +apas penapasan +apel diapelkan +api berapi +api menapikan +api pengapian +api perapi +api perapian +api terapi +api terapinya +api-api berapi-api +apik menapik +apik menapikan +apik seapik +apit diapit +apit mengapit +apit mengapitnya +apit pengapit +aplikasi beraplikasi +aplikasi diaplikasi +aplikasi diaplikasikan +aplikasi diaplikasikannya +aplikasi mengaplikasi +aplikasi mengaplikasikan +aplikasi mengaplikasikannya +aplikasi pengaplikasian +aplikasi teraplikasi +apresiasi berapresiasi +apresiasi diapresiasi +apresiasi diapresiasikan +apresiasi mengapresiasi +apresiasi mengapresiasikan +apresiasi mengapresiasinya +apresiasi terapresiasi +apresiasi terapresiasinya +apu memapu +apu menyapu +apu menyapukan +apu menyapunya +apu pelapukan +apu penyapu +apu penyapuan +apung diapungkan +apung mengapung +apung mengapungkan +apung pengapung +apung pengapungan +apung terapung +apuran pengapuran +ara diara +ara menara +ara menaranya +ara mengarakan +ara menyarakan +ara penara +ara pengarakan +ara perarakan +ara seara +arah berarah +arah diarah +arah diarahkan +arah diarahkannya +arah kearah +arah memarahi +arah mengarah +arah mengarahan +arah mengarahkan +arah mengarahkannya +arah mengarahnya +arah menyarahkan +arah pemarah +arah pengarah +arah pengarahan +arah pengarahnya +arah searah +arah terarah +arah terarahnya +arai pengaraian +arak berarak +arak diarak +arak memarakkan +arak mengarak +arak mengarakan +arak mengaraknya +arak menyarakan +arak pengarakan +arak perarakan +aram mengaramkan +arang mengarang +arang menyarang +arang menyarangkan +arang menyarangkannya +arang pelarang +arang pelarangan +arang pemarangan +arang pengarang +arang pengarangnya +arang penyarang +aransemen diaransemen +aransemen mengaransemen +ardi belardi +ardi berardi +ardi diardi +are diare +are diarenya +area diarea +argumen berargumen +argumentasi berargumentasi +ari belari +ari berari +ari diari +ari meari +ari menari +ari menarikan +ari menarilah +ari menarinya +ari menyarikan +ari pelari +ari pelarian +ari penari +ari penarikan +ari penarikannya +ari penarinya +ari penyarikan +ari perarian +aria menaria +arif kearifan +arif penarifan +arih mearih +arik menarik +arik menarikan +arik menariknya +arik menyarikan +arik penarik +arik penarikan +arik penariknya +arik penyarikan +aring bearing +aring menyaring +aring menyaringnya +aring penyaring +aring penyaringan +aris pelaris +arogan kearoganan +aroma beraroma +aron pemaron +aron pengaron +arsip diarsipkan +arsip kearsipan +arsip mengarsip +arsip mengarsipkan +arsip pengarsipan +arsip terarsip +arsir mengarsir +arsitek diarsiteki +arsitek mengarsiteki +arsitektur berarsitektur +arti bearti +arti berarti +arti berartikan +arti berartinya +arti diartikan +arti mengartikan +arti mengartikannya +artikulasi diartikulasikan +artikulasi mengartikulasikan +artis keartisan +artisan keartisan +artisan keartisannya +aru menyaru +aru penarukan +aruk penarukan +arung berarung +arung diarungi +arung mengarungi +arung pelarungan +arung pengarungan +arus belarus +arus berarus +arus mengaruskan +arus pengarus +as beas +as belas +as belasan +as beras +as berasan +as berasnya +as dias +as meas +as memasan +as menas +as mengaskan +as peas +as pelasan +as pemasan +as penas +as peras +as perasan +as perasi +as seas +as teras +as terasi +as terasnya +asa belasa +asa berasa +asa berasalah +asa memasakan +asa mengasai +asa pemasakan +asa pemasakannya +asa perasa +asa perasaan +asa seasa +asa terasa +asa terasakan +asa terasanya +asah diasah +asah menasah +asah mengasah +asah mengasahnya +asah pengasah +asah pengasahan +asah terasah +asak memasak +asak memasakan +asak memasakkan +asak memasaknya +asak mengasak +asak pemasak +asak pemasakan +asak terasakan +asal berasal +asal berasalan +asan belasan +asan berasan +asan memasan +asan pelasan +asan pemasan +asan pemasanan +asan perasan +asan perasannya +asana pelasana +asana pelasanaan +asap berasap +asap diasap +asap diasapi +asap mengasapi +asap pengasapan +asar berasar +asar berasarkan +asar memasarkan +asar memasarkannya +asar mengasari +asar menyasar +asar menyasarkan +asar menyasarnya +asar pemasar +asar pemasaran +asar pemasarnya +asar penasaran +asas berasas +asas berasaskan +ase pease +aset beraset +asi keasikan +asi memasikan +asi menyasikan +asi perasi +asi terasi +asih measih +asih mengasih +asih mengasihi +asih penasihan +asih pengasih +asih pengasihan +asil berasil +asil diasil +asil mengasilkan +asil pengasilan +asil terasil +asimilasi berasimilasi +asin diasinkan +asin keasinan +asin pengasinan +asing diasingkan +asing mengasing +asing mengasingkan +asing pengasingan +asing terasing +asing terasingkan +asisten mengasisteni +asli keaslian +aso pemasokan +aso teraso +asong pengasong +asosiasi berasosiasi +asosiasi diasosiasikan +asosiasi mengasosiasikan +asosiasi mengasosiasikannya +asosiasi terasosiasi +aspal beraspal +aspal diaspal +aspal mengaspal +aspal pengaspalan +aspal teraspal +aspirasi beraspirasi +aspirasi diaspirasikan +aspirasi mengaspirasikan +asrama berasrama +asrama diasramakan +asri keasrian +asu memasukan +asu memasukannya +asu pemasukan +asu pemasukannya +asuh diasuh +asuh diasuhnya +asuh mengasuh +asuh mengasuhnya +asuh pengasuh +asuh pengasuhan +asuh pengasuhnya +asumsi berasumsi +asumsi diasumsikan +asumsi mengasumsikan +asung memasung +asung memasungnya +asung pemasungan +asuransi berasuransi +asuransi diasuransi +asuransi diasuransikan +asuransi mengasuransikan +asuransi perasuransian +asyik berasyik +asyik keasyikan +asyik mengasyikan +asyik mengasyikkan +atak menatakan +atak mengatak +atak mengatakan +atak mengatakkan +atak menyatakan +atak teratak +atap beratap +atap beratapkan +atap diatap +atap menatap +atap menatapkan +atap menatapnya +atap menyatap +atap penatapan +atap seatap +atar mengatar +atar mengatarkan +atar pelataran +atar penataran +atar pengatar +atas diatas +atas diatasi +atas diatasnya +atas keatas +atas mengatas +atas mengatasi +atas teratas +atas teratasi +atas teratasnya +atau mematau +ati belati +ati berati +ati mematikan +ati mematikannya +ati pelati +ati pelatikan +ati pemati +ati penati +atok mematok +atok mematoknya +atok pematokan +atraksi beratraksi +atribut beratribut +atung belatung +atung belatungnya +atung mematung +atung pematung +atur beraturan +atur diatur +atur diaturan +atur diaturlah +atur diaturnya +atur mengatur +atur mengaturkan +atur mengaturnya +atur pengatur +atur pengaturan +atur peraturan +atur teratur +atur teraturnya +atus beatus +atus beratus +atus meatus +atus mengatus +atus mengatuskan +atus pematusan +au beau +au belau +au berau +au mengau +au pelau +au pelaukan +audiensi beraudiensi +audit diaudit +audit mengaudit +audit mengauditnya +audit pengaudit +audit pengauditan +audit teraudit +auk pelaukan +aum mengaum +aung keaungan +aung menaungi +aung mengaung +aung pelaung +aung penaung +aura beraura +aus keausan +autopsi diautopsi +autopsi mengautopsi +awa belawa +awa berawa +awa memawa +awa menawakan +awa mengawai +awa pelawa +awa pengawa +awa pengawai +awa pengawakan +awa perawakan +awa perawakannya +awah berawah +awai mengawai +awai pengawai +awak berawak +awak berawaknya +awak diawaki +awak menawakan +awak mengawaki +awak pelawak +awak pengawak +awak pengawakan +awak perawakan +awal berawal +awal berawalan +awal berawalnya +awal diawal +awal diawali +awal mengawal +awal mengawali +awal mengawalnya +awal pengawal +awal pengawalan +awal pengawalnya +awal seawal +awal terawal +awan belawan +awan berawan +awan menawan +awan menawannya +awan pelawan +awan pelawanan +awan penawan +awan penawanan +awan pengawan +awan perawan +awan perawannya +awan terawan +awang mengawang +awang pelawangan +awang penawangan +awang perawang +awang terawang +awang terawangan +awar menawar +awar menawaran +awar menawari +awar menawarkan +awar menawarkannya +awar menawarnya +awar penawar +awar penawaran +awar penawarnya +awar perawaran +awas diawasi +awas menawaskan +awas mengawas +awas mengawasi +awas pengawas +awas pengawasan +awas pengawasnya +awas terawas +awas terawasi +awat belawati +awat mengawati +awat peawat +awat pelawat +awat perawat +awat perawatan +awat perawatnya +awat terawat +awat terawatnya +awet diawetkan +awet keawetan +awet mengawetkan +awet mengawetkannya +awet pengawet +awet pengawetan +awet pengawetnya +awet terawetkan +awin mengawini +awin mengawinkan +awin mengawinkannya +ayah berayah +ayah berayahkan +ayah seayah +ayak diayak +ayak menayakan +ayak mengayak +ayak mengayakan +ayan belayan +ayan pelayan +ayan pelayanan +ayan pelayannya +ayan perayan +ayar belayar +ayar pelayar +ayar pelayaran +ayat menyayat +ayat menyayatnya +ayat pelayat +ayat penyayat +ayat penyayatan +ayom diayomi +ayom mengayomi +ayom pengayom +ayom pengayoman +ayom terayomi +ayu memayu +ayu perayu +ayun berayun +ayun diayun +ayun diayunkan +ayun mengayun +ayun mengayunkan +ayun mengayunkannya +ayun pemayun +ayun terayun +ba berba +ba diba +ba pemba +ba perbakan +ba seba +ba sebai +ba sebalah +ba sebanya +ba terbai +ba terbanya +bab kebab +bab membabi +bab sebab +bab sebabkan +bab sebabnya +baba dibaba +baba sebabai +babak dibabak +babak kebabak +babas kebabasan +babas pembabasan +babat dibabat +babat membabat +babat pembabatan +babatan pembabatan +babi membabi +bablas kebablasan +baca dibaca +baca dibacakan +baca dibacakannya +baca dibacanya +baca kebaca +baca membaca +baca membacakan +baca membacakannya +baca membacanya +baca pembaca +baca pembacaan +baca pembacanya +baca terbaca +baca terbacanya +bacak dibacakan +bacak membacakan +baco membacokan +baco pembacokan +bacok dibacok +bacok membacok +bacok membacokan +bacok membacokkan +bacok membacoknya +bacok pembacok +bacok pembacokan +bad berbadan +bad dibadan +bada berbada +badal dibadalkan +badan berbadan +badan dibadan +badan dibadannya +bagai bebagai +bagai berbagai +bagai pelbagai +bagai pembagaian +bagai perbagai +bagai sebagai +bagai sebagaian +bagai sebagaii +bagai sebagainya +bagai terbagai +bagaimana sebagaimana +bagak sebagak +bagal sebagal +bagan sebagan +bagat sebagat +bagau berbagau +bagau sebagau +bagau sebagaui +bagi bebagi +bagi berbagi +bagi berbagilah +bagi dibagi +bagi dibagian +bagi dibagikan +bagi dibagikannya +bagi dibaginya +bagi kebagian +bagi membagi +bagi membagikan +bagi membagikannya +bagi membaginya +bagi pembagi +bagi pembagian +bagi pembaginya +bagi sebagi +bagi sebagian +bagi sebaginya +bagi terbagi +bagi terbaginya +bagus kebagusan +bagus sebagus +bagus terbagus +bah berbah +bah berbahan +bah pembahan +bah perbahan +bah sebah +bahak terbahak +bahan berbahan +bahan pembahan +bahan perbahan +bahana membahana +bahari kebaharian +baharu membaharui +baharu pembaharu +baharu pembaharuan +baharu perbaharuan +baharu perbaharui +baharu terbaharui +baharu terbaharukan +bahas dibahas +bahas dibahasnya +bahas mebahas +bahas membahas +bahas membahasan +bahas membahasi +bahas membahasnya +bahas pembahas +bahas pembahasan +bahas terbahas +bahasa berbahasa +bahasa berbahasanya +bahasa dibahasa +bahasa dibahasakan +bahasa kebahasaan +bahasa membahasa +bahasa membahasakan +bahasa pembahasa +bahasa pembahasaan +bahasa pembahasanya +bahaya bebahaya +bahaya berbahaya +bahaya berbahayanya +bahaya mebahayakan +bahaya membahayakan +bahaya membahayakannya +bahaya sebahaya +bahu dibahu +bahu membahu +bahu sebahu +bahu sebahunya +baiat berbaiat +baiat dibaiat +baiat membaiat +baiat pembaiatan +baik berbaik +baik berbaikan +baik kebaikan +baik kebaikkan +baik membaik +baik membaiknya +baik pebaikan +baik perbaikan +baik perbaiki +baik perbaikkan +baik sebaik +baik sebaiknya +baik terbaik +baik terbaikan +baik terbaiklah +baik terbaiknya +bais berbais +bait sebait +baja pembajakan +baja pembajakannya +bajak dibajak +bajak dibajaknya +bajak membajak +bajak membajaknya +bajak pembajak +bajak pembajakan +bajak pembajaknya +bajak terbajak +baji kebajikan +baji perbaji +bajik kebajikan +baju berbaju +bak bebak +bak berbak +bak kebak +bak perbakan +bak sebak +bak terbak +baka kebakaan +bakar dibakar +bakar dibakarnya +bakar kebakar +bakar kebakaran +bakar membakar +bakar membakari +bakar membakarnya +bakar pembakar +bakar pembakaran +bakar terbakar +bakar terbakarnya +bakat berbakat +bakat berbakatnya +bakat kebakatan +bakat terbakat +bakteri berbakteri +bakti berbakti +bakti kebaktian +bakti membaktikan +baku dibakukan +baku membakukan +baku pembakuan +bakul sebakul +bakung sebakung +bal bebal +bal bebali +bal kebal +bal kebali +bal kebalnya +bal membal +bal membali +bal pembali +bal perbalan +bal sebal +bala membala +bala pembala +bala pembalakan +bala sebalai +balah sebalah +balai sebalai +balak pembalak +balak pembalakan +balak pembalakkan +balan perbalan +balang sebalang +balap dibalap +balap dibalapan +balap membalap +balap membalapnya +balap pebalap +balap pebalapnya +balap pembalap +balap pembalapnya +balas berbalas +balas berbalasan +balas dibalas +balas dibalasnya +balas membalas +balas membalaskan +balas membalasnya +balas pembalas +balas pembalasan +balas terbalas +balas terbalaskan +balen kebalen +balet pebalet +balian pembalian +balong membalong +balsam pembalsaman +balur berbalur +balur dibalur +balur dibaluri +balur dibalurkan +balur membaluri +balur membalurkan +balut berbalut +balut berbalutkan +balut dibalut +balut dibaluti +balut dibalutkan +balut membalut +balut membalutnya +balut pembalut +balut pembalutnya +balut terbalut +bambang sebambangan +ban beban +ban bebani +ban bebankan +ban bebannya +ban keban +ban memban +ban perban +ban perbankan +ban perbankannya +ban terban +banar sebanarnya +bandar perbandaran +bandara dibandara +bandara kebandaraan +bandel kebandelan +bandel membandel +bandel membandelnya +banderol berbanderol +banderol dibanderol +banderol dibanderoli +banderol dibanderolnya +banderol membanderol +banderol membanderolnya +banding berbanding +banding dibanding +banding dibandingan +banding dibandingkan +banding dibandingkannya +banding membanding +banding membandingan +banding membandingkan +banding membandingkannya +banding pembanding +banding pembandingan +banding pembandingnya +banding perbandingan +banding perbandingkan +banding sebanding +banding sebandingnya +banding terbanding +bandung dibandung +bandung dibandungkan +bang membangan +bang membangkan +bang pembangan +bang perbangan +bang perbangkan +bang terbang +bang terbangi +bang terbangkan +bang terbanglah +bang terbangnya +bangai sebangai +bangan membangan +bangan pembangan +bangan perbangan +bangau sebangau +banget kebangetan +bangga berbangga +bangga berbanggalah +bangga dibanggakan +bangga dibanggakannya +bangga kebanggaan +bangga membanggakan +bangga membanggakannya +banggan kebanggan +banggan kebanggannya +bangkang membangkang +bangkang pembangkang +bangkang pembangkangan +bangkit dibangkitkan +bangkit kebangkitan +bangkit kebangkitkan +bangkit membangkit +bangkit membangkitan +bangkit membangkitkan +bangkit membangkitkannya +bangkit pembangkit +bangkit pembangkitan +bangkit pembangkitnya +bangkrut dibangkrutkan +bangkrut kebangkrutan +bangkrut membangkrutkan +bangku dibangku +bangku membangku +bangku sebangku +bangku sebangkunya +bangsa berbangsa +bangsa kebangsaan +bangsa perbangsa +bangsa sebangsa +bangsa sebangsanya +bangsawan kebangsawanan +bangun dibangun +bangun dibangunan +bangun dibangunkan +bangun dibangunlah +bangun dibangunnya +bangun kebangun +bangun kebangunan +bangun mebangun +bangun membangun +bangun membangunan +bangun membangunkan +bangun membangunkannya +bangun membangunnya +bangun menbangun +bangun pebangunan +bangun pembangun +bangun pembangunan +bangun pembangunnya +bangun penbangunan +bangun sebangun +bangun terbangun +bangun terbangunnya +bani bebani +banjir dibanjiri +banjir kebanjiran +banjir membanjir +banjir membanjiri +banjir membanjirnya +bank bebankan +bank berbank +bank perbankan +bank perbankkan +bantah berbantahan +bantah dibantah +bantah dibantahkan +bantah dibantahnya +bantah mebantah +bantah membantah +bantah membantahkan +bantah membantahnya +bantah menbantah +bantah pembantahan +bantah perbantahan +bantah terbantah +bantah terbantahkan +bantai dibantai +bantai membantai +bantai pembantai +bantai pembantaian +bantal membantalkan +bantal pembantalan +bantar dibantar +bantar dibantaran +bantar dibantarkan +bantar membantarkan +bantar pembantaran +bantaran dibantaran +bantaran pembantaran +banting dibanting +banting kebanting +banting membanting +banting membantingkan +banting membantingnya +banting terbanting +bantu berbantu +bantu dibantu +bantu dibantukan +bantu dibantulah +bantu dibantunya +bantu kebantu +bantu mebantu +bantu membantu +bantu membantunya +bantu menbantu +bantu pembantu +bantu pembantuan +bantu pembantunya +bantu perbantuan +bantu perbantukan +bantu terbantu +bantu terbantukan +bantun membantun +banyak dibanyak +banyak kebanyak +banyak kebanyakan +banyak kebanyakkan +banyak perbanyak +banyak perbanyakan +banyak perbanyaklah +banyak sebanyak +banyak sebanyaknya +banyak terbanyak +banyak terbanyaknya +bapa kebapakan +bapak kebapakan +baptis dibaptis +baptis membaptis +baptis pembaptis +baptis pembaptisan +bar kebar +bar kebaran +bar membari +bar sebar +bar sebaran +bar sebarkan +bar terbar +bar terbari +bara kebarakan +bara membara +bara membaranya +barak kebarakan +barak mebarak +baran kebaran +baran sebaran +baran sebarannya +barang sebarang +barap pembarap +barat kebaratan +barat sebarat +barat-barat kebarat-baratan +barel perbarel +bareng bebarengan +bareng berbarengan +bareng dibarengi +bareng dibarengkan +bareng membarengi +baret berbaret +baret pembaretan +bari membari +bari membarikan +bari terbari +barik membarikan +barik terbarik +barikade dibarikade +barikade membarikade +baring berbaring +baring berbaringlah +baring dibaringkan +baring membaringkan +baring pembaringan +baring terbaring +baring terbaringnya +baringan pembaringan +baringan pembaringannya +baris berbaris +baris dibaris +baris dibarisan +baris dibariskan +baris membariskan +baris sebaris +barter dibarter +barter membarter +barter membarternya +baru kebaruan +baru membarui +baru pembaru +baru pembaruan +baru perbaruan +baru perbarui +baru terbaru +baru terbarui +baru terbarukan +baru terbarunya +bas bebas +bas bebasan +bas bebaskan +bas bebasnya +bas berbasi +bas kebas +bas membaskan +bas pembasan +bas perbasi +basa berbasa +basa-basi berbasa-basi +basah dibasahi +basah dibasahkan +basah kebasahan +basah membasahi +basah pembasahan +basah terbasah +basi berbasi +basi perbasi +basil berbasil +basin bebasin +basis bebasis +basis berbasis +basis berbasisi +basis berbasiskan +basket pebasket +basmi dibasmi +basmi membasmi +basmi membasminya +basmi pembasmi +basmi pembasmian +basuh dibasuh +basuh membasuh +basuh membasuhnya +basuh pembasuh +basuh pembasuhan +bata membatakan +bata perbata +bata perbataan +bata terbata +bata-bata terbata-bata +batai pembataian +batak membatakan +batal dibatalkan +batal dibatalkannya +batal membatalkan +batal membatalkannya +batal pembatalan +batang berbatang +batang perbatang +batang sebatang +batas berbatas +batas berbatasan +batas dibatas +batas dibatasi +batas membatas +batas membatasi +batas pebatasan +batas pembatas +batas pembatasan +batas pembatasnya +batas perbatas +batas perbatasan +batas sebatas +batas terbatas +batas terbatasi +batas terbatasnya +baterai berbaterai +bati pembatikan +bati perbatikan +bati sebatian +batik berbatik +batik dibatik +batik membatik +batik pembatik +batik pembatikan +batik perbatikan +batik sebatik +batil kebatilan +batin kebatinan +batin membatin +batu bebatuan +batu berbatu +batu berbatuan +batu membatu +batu pembatu +batu pembatuan +batuk terbatuk +bau bebauan +bau berbau +bau kebau +bau membaui +bau pembau +baung perbaungan +baur berbaur +baur berbaurnya +baur dibaurkan +baur membaur +baur membaurkan +baur pembauran +baut dibaut +baut membaut +bawa dibawa +bawa dibawakan +bawa dibawakannya +bawa dibawalah +bawa dibawanya +bawa kebawa +bawa mebawa +bawa membawa +bawa membawakan +bawa membawakannya +bawa membawanya +bawa menbawa +bawa pembawa +bawa pembawaan +bawa pembawanya +bawa perbawa +bawa terbawa +bawa terbawanya +bawah dibawah +bawah dibawahi +bawah dibawahnya +bawah kebawah +bawah membawah +bawah membawahi +bawah membawahkan +bawah terbawah +bawah terbawahnya +bawak dibawakan +bawak membawakan +bawat perbawati +baya berbaya +baya dibayai +baya kebaya +baya kebayakan +baya kebayanya +baya membaya +baya membayakan +baya pembayaan +baya sebaya +baya sebayanya +bayak kebayakan +bayak membayakan +bayak sebayak +bayak terbayak +bayang berbayang +bayang dibayang +bayang dibayangi +bayang dibayangkan +bayang dibayangkannya +bayang kebayang +bayang membayang +bayang membayangi +bayang membayangkan +bayang membayangkannya +bayang sebayang +bayang terbayang +bayang terbayangkan +bayar berbayar +bayar berbayaran +bayar berbayarnya +bayar dibayar +bayar dibayari +bayar dibayarkan +bayar dibayarkannya +bayar dibayarnya +bayar mebayar +bayar membayar +bayar membayari +bayar membayarkan +bayar membayarkannya +bayar membayarnya +bayar menbayar +bayar pembayar +bayar pembayaran +bayar terbayar +bayar terbayarkan +bayar terbayarkannya +bayar terbayarnya +bayun kebayunan +bayun pembayun +bayur pebayuran +beban berbeban +beban dibebani +beban dibebankan +beban dibebankannya +beban membebani +beban membebankan +beban membebankannya +beban pembebanan +beban terbeban +beban terbebani +beban terbebankan +bebar membebarkan +bebar sebebarnya +bebas dibebas +bebas dibebaskan +bebas dibebaskannya +bebas kebebasan +bebas membebas +bebas membebasan +bebas membebaskan +bebas membebaskannya +bebas pembebas +bebas pembebasan +bebas sebebas +bebas sebebasnya +bebas terbebas +bebas terbebaskan +bebas terbebasnya +bebat dibebat +bebat membebat +bebat membebatnya +bebat terbebat +bebek membebek +beber dibeber +beber dibeberkan +beber dibeberkannya +beber mebeberkan +beber membeber +beber membeberkan +beber membeberkannya +beber pembeberan +beberapa bebeberapa +beberapa dibeberapa +beberapa kebeberapa +beda bebeda +beda berbeda +beda berbedaan +beda berbedanya +beda dibedakan +beda membedakan +beda membedakannya +beda pebedaan +beda pembeda +beda pembedaan +beda pembedanya +beda perbedaan +bedah bebedahan +bedah dibedah +bedah membedah +bedah membedahnya +bedah pembedah +bedah pembedahan +bedak dibedakan +bedak dibedaki +bedak membedakan +bedan berbedan +bedan perbedan +bedan perbedannya +bedaya pembedayaan +bega berbegai +bega sebegai +begal dibegal +begal membegal +begal pembegal +begal pembegalan +begini dibeginikan +begini sebegini +begitu dibegitukan +begitu sebegitu +begitu sebegitunya +bejat kebejatan +bek bebek +bek bebekan +bek bebeknya +bek belbek +bek berbek +beka pembekakan +bekal berbekal +bekal berbekalkan +bekal dibekali +bekal dibekalkan +bekal membekali +bekal pembekalan +bekal perbekalan +bekam dibekam +bekap dibekap +bekap membekap +bekap membekapnya +bekap terbekap +bekas berbekas +bekas dibekas +bekas membekas +bekas membekaskan +bekel perbekel +beku dibekukan +beku dibekukannya +beku kebekuan +beku membeku +beku membekukan +beku membekukannya +beku membekunya +beku pembeku +beku pembekuan +beku pembekukan +bekuk dibekuk +bekuk dibekukan +bekuk dibekuknya +bekuk membekuk +bekuk membekukan +bekuk membekuknya +bekuk pembekukan +bel bebel +bel dibeli +bel kebeli +bel mebel +bel mebeli +bel mebelnya +bel membel +bel membeli +bel pembeli +bel sebel +bel terbeli +bela berbela +bela dibela +bela dibelai +bela dibelanya +bela mebela +bela membela +bela membelai +bela membelanya +bela pembela +bela pembelaan +bela pembelanya +belah berbelah +belah berbelahan +belah dibelah +belah dibelahan +belah membelah +belah membelahnya +belah pembelah +belah pembelahan +belah sebelah +belah sebelahan +belah sebelahnya +belah terbelah +belah terbelahnya +belai dibelai +belai membelai +belai membelainya +belakang dibelakang +belakang dibelakangnya +belakang kebelakang +belakang membelakangi +belakang terbelakang +belalai berbelalai +belalak membelalak +belalak membelalakkan +belalak terbelalak +belanga sebelanga +belanja berbelanja +belanja berbelanjaan +belanja berbelanjalah +belanja dibelanjakan +belanja membelanjakan +belanja membelanjakannya +belanja pebelanja +belanja pembelanja +belanja pembelanjaan +belanja perbelanjaan +belas berbelas +belas membelas +belas pembelas +belas sebelas +belasungkawa berbelasungkawa +belat sebelat +belatung berbelatung +belenggu dibelenggu +belenggu membelenggu +belenggu membelenggunya +belenggu terbelenggu +beli dibeli +beli dibelikan +beli dibelikannya +beli dibelinya +beli kebeli +beli mebeli +beli membeli +beli membelikan +beli membelikannya +beli membelinya +beli pembeli +beli pembelian +beli pembelinya +beli terbeli +belia pembelia +belia pembeliaan +belian pembelian +belian pembeliannya +belik dibelikan +belik membelikan +belikan dibelikan +belikan dibelikannya +belikan membelikan +belikan membelikannya +beliku membeliku +belimbing sebelimbingan +belit berbelit +belit berbelitnya +belit dibelit +belit membelit +belit membelitnya +belit terbelit +belo dibelokan +belo membelokan +belo pembelokan +belok berbelok +belok dibelokan +belok dibelokkan +belok membelok +belok membelokan +belok membelokkan +belok membelokkannya +belok pembelokan +belok pembelokkan +belok terbelokkan +belot membelot +belot membelotnya +belot pembelot +belot pembelotan +belu sebelu +belu sebelunya +beludak membeludak +beludak membeludaknya +belum sebelum +belum sebelumnya +bena bebena +bena sebenanya +benah bebenah +benah berbenah +benah dibenahi +benah membenah +benah membenahi +benah pembenahan +benah terbenahi +benak dibenak +benak dibenaknya +benam dibenami +benam dibenamkan +benam dibenamkannya +benam membenam +benam membenamkan +benam membenamkannya +benam terbenam +benam terbenamnya +benar dibenarkan +benar dibenarkannya +benar kebenaran +benar mebenarkan +benar membenar +benar membenarkan +benar membenarkannya +benar membenarnya +benar pembenar +benar pembenaran +benar sebenar +benar sebenarnya +benara kebenaraan +benara kebenaranya +benara sebenaranya +bencana kebencanaan +benci dibenci +benci dibencinya +benci kebencian +benci membenci +benci membencinya +benci pembenci +benci pembencinya +benda kebendaan +benda perbendaan +bendahara kebendaharaan +bendahara pembendaharaan +bendahara perbendaharaan +bendara berbendara +bendera berbendera +bendung dibendung +bendung dibendungnya +bendung membendung +bendung membendungnya +bendung pembendungan +bendung terbendung +bendung terbendungnya +bengal kebengalan +bengis kebengisan +bengkak membengkak +bengkak membengkakkan +bengkak membengkaknya +bengkak pembengkakan +bengkak pembengkakkan +bengkalai terbengkalai +bengkalai terbengkalainya +bengkel perbengkelan +bengkelai terbengkelai +bengkok dibengkokkan +bengkok kebengkokan +bengkok membengkok +bengkok membengkokkan +bengkok pembengkokan +bengkok sebengkok +bengong terbengong +benih pembenihan +benih perbenihan +bening kebeningan +bening sebening +bentak dibentak +bentak membentak +bentak membentaknya +bentang berbentang +bentang dibentang +bentang dibentangkan +bentang membentang +bentang membentangkan +bentang membentangkannya +bentang pembentang +bentang pembentangan +bentang terbentang +bentangkan dibentangkan +bentangkan membentangkan +bentangkan membentangkannya +bentar sebentar +bentara sebentara +benteng berbenteng +benteng dibentengi +benteng membentengi +benteng perbentengan +bentrok berbentrokan +bentuk bebentuk +bentuk berbentuk +bentuk dibentuk +bentuk dibentuklah +bentuk dibentuknya +bentuk kebentuk +bentuk mebentuk +bentuk membentuk +bentuk membentukan +bentuk membentuknya +bentuk pembentuk +bentuk pembentukan +bentuk pembentukkan +bentuk pembentukkannya +bentuk pembentuknya +bentuk sebentuk +bentuk terbentuk +bentuk terbentuklah +bentuk terbentuknya +bentur bebenturan +bentur berbenturan +bentur dibenturkan +bentur kebentur +bentur membentur +bentur membenturkan +bentur membenturkannya +bentur pembenturan +bentur perbenturan +bentur terbentur +bentur terbenturnya +beo membeo +bera bebera +bera sebera +berang keberangkan +berang seberang +berang seberangi +berang seberangnya +berangkat diberangkat +berangkat diberangkatan +berangkat diberangkatkan +berangkat diberangkatkannya +berangkat keberangkatan +berangkat memberangkat +berangkat memberangkatan +berangkat memberangkatkan +berangkat memberangkatkannya +berangkat pemberangkatan +berangus diberangus +berangus memberangus +berangus memberangusnya +berangus pemberangusan +berani keberanian +berani memberanikan +berani pemberani +berani seberani +beranta pemberantaan +berantas diberantas +berantas diberantasnya +berantas meberantas +berantas memberantas +berantas memberantasan +berantas memberantasnya +berantas peberantasan +berantas pemberantas +berantas pemberantasan +berantas penberantasan +berapa beberapa +berapa beberapanya +berapa berberapa +berapa keberapa +berapa seberapa +beras perberasan +berat berberat +berat diberatkan +berat keberatan +berat memberat +berat memberati +berat memberatkan +berat memberatkannya +berat pemberat +berat pemberatan +berat pemberatnya +berat perberat +berat seberat +berat seberatnya +berat terberat +berat terberatnya +berdikari keberdikarian +beredel diberedel +beredel memberedel +beredel pemberedelan +beres beberes +beres diberesi +beres dibereskan +beres memberesi +beres membereskan +beres membereskannya +beres pemberesan +beri diberi +beri diberikan +beri diberikannya +beri diberinya +beri meberi +beri meberikan +beri memberi +beri memberian +beri memberikan +beri memberikannya +beri memberinya +beri menberikan +beri pemberi +beri pemberian +beri pemberikan +beri pemberinya +berida seberida +berik diberik +berik diberikan +berik meberikan +berik memberik +berik memberikan +berik menberikan +berik pemberikan +beril memberilan +beringas keberingasan +berita diberita +berita diberitakan +berita memberitakan +berita memberitakannya +berita pemberita +berita pemberitaan +berita terberitakan +berkah diberkahi +berkah keberkahan +berkah memberkahi +berkas diberkas +berkas diberkaskan +berkas memberkas +berkas memberkaskan +berkas pemberkasan +berkas seberkas +berkat diberkati +berkat memberkati +berkat pemberkatan +berkat terberkati +berondong diberondong +berondong diberondongkan +berondong memberondong +berondong memberondongkan +berondong memberondongnya +berondong pemberondongan +berontak memberontak +berontak pemberontak +berontak pemberontakan +bersih bebersih +bersih dibersihkan +bersih dibersihkannya +bersih kebersihan +bersih membersih +bersih membersihan +bersih membersihkan +bersih membersihkannya +bersih pembersih +bersih pembersihan +bersih pembersihkan +bersih pembersihnya +bersih sebersih +bersih terbersih +bersit membersitkan +bersit sebersit +bersit terbersit +beruk memberukan +besar berbesar +besar dibesar +besar dibesarkan +besar dibesarkannya +besar kebesaran +besar membesar +besar membesarkan +besar membesarkannya +besar membesarnya +besar pembesar +besar pembesaran +besar perbesar +besar perbesaran +besar sebesar +besar sebesari +besar sebesarnya +besar terbesar +besar terbesarnya +besaran kebesaran +besaran kebesarannya +besaran pembesaran +besaran pembesarannya +besaran perbesaran +besi pembesian +besi sebesi +besit terbesit +besuk dibesuk +besuk membesuk +besuk membesuknya +besuk pembesuk +besuk pembesukan +besuk pembesuknya +besut dibesut +besut dibesutnya +besut membesut +besut membesutnya +besut pembesut +besut pembesutnya +bet bebet +bet perbet +betik terbetik +betis sebetis +beton dibeton +beton membeton +beton pembetonan +betonisasi dibetonisasi +betot membetot +betot pembetot +betul dibetulkan +betul kebetulan +betul membetulkan +betul membetulkannya +betul pembetulan +betul sebetulnya +biadab kebiadaban +biah sebiah +biak berbiak +biak dibiakkan +biak membiakan +biak membiakkan +biak pembiak +biak pembiakan +biak pembiakkan +biar dibiarkan +biar dibiarkannya +biar membiarkan +biar membiarkannya +biar pembiaran +biar terbiarkan +biara pembiaraan +bias dibiaskan +bias kebiasan +bias membias +bias membiaskan +bias pembiasan +biasa dibiasakan +biasa kebiasaan +biasa membiasakan +biasa membiasakannya +biasa pembiasaan +biasa terbiasa +biasa terbiasanya +biaya berbiaya +biaya dibiaya +biaya dibiayai +biaya mebiayai +biaya membiaya +biaya membiayai +biaya pembiayaan +bibir berbibir +bibir dibibir +bibit pembibit +bibit pembibitan +bibit perbibitan +bidan dibidani +bidan kebidanan +bidan membidani +bidang dibidang +bidang dibidangnya +bidang mebidang +bidang membidangi +bidang pembidangan +bidang sebidang +bidik dibidik +bidik dibidikkan +bidik dibidiknya +bidik membidik +bidik membidikan +bidik membidikkan +bidik membidiknya +bidik pembidik +bidik pembidikan +bidik terbidik +bija kebijakan +bija kebijakannya +bijak kebijakan +bijak kebijakkan +bijak sebijak +bijaksana kebijaksanaan +bijaksana sebijaksana +biji berbiji +biji sebiji +bikin berbikini +bikin dibikin +bikin dibikinkan +bikin dibikinlah +bikin dibikinnya +bikin membikin +bikini berbikini +biksu kebiksuan +bilah sebilah +bilang berbilang +bilang dibilang +bilang dibilangan +bilang dibilangi +bilang dibilangnya +bilang terbilang +bilas dibilas +bilas membilas +bilas membilasnya +bilas pembilas +bilas pembilasan +bilas terbilas +biliar pebiliar +bimbang kebimbangan +bimbing dibimbing +bimbing dibimbingnya +bimbing membimbing +bimbing membimbingnya +bimbing pembimbing +bimbing pembimbingan +bimbing pembimbingnya +bina dibina +bina dibinanya +bina membina +bina membinanya +bina pembina +bina pembinaan +bina pembinanya +bina terbina +bina terbinanya +binar berbinar +binasa dibinasakan +binasa kebinasaan +binasa membinasakan +binasa pembinasaan +binatang kebinatangan +bincang bebincang +bincang berbincang +bincang berbincangan +bincang dibincangi +bincang dibincangkan +bincang membincang +bincang membincangkan +bincang perbincangan +bincang perbincangkan +bineka berbineka +bineka kebinekaan +bingka berbingkai +bingka dibingkai +bingka membingkai +bingka terbingkai +bingkai berbingkai +bingkai dibingkai +bingkai membingkai +bingkai membingkainya +bingkai pembingkaian +bingkai terbingkai +bingung dibingungkan +bingung kebingungan +bingung membingungkan +bintang berbintang +bintang dibintang +bintang dibintangi +bintang kebintangan +bintang membintangi +bintang pembintangan +bintang perbintangan +bintik berbintik +biopsi dibiopsi +bir kebiri +biru kebiruan +biru membiru +biru membirukan +bis dibis +bisa berbisa +bisa dibisa +bisa kebisaan +bisa sebisa +bisa sebisanya +bisa terbisa +bisik berbisik +bisik berbisiklah +bisik dibisiki +bisik dibisikkan +bisik membisikan +bisik membisiki +bisik membisikkan +bisik pembisik +bisik pembisiknya +bising kebisingan +bisnis berbisnis +bisnis berbisnisnya +bisnis dibisniskan +bisnis membisniskan +bisnis pebisnis +bisnis pebisnisnya +bisnis pembisnis +bisu kebisuan +bisu membisu +bisu membisukan +bit terbit +bit terbitan +bit terbitkan +bit terbitlah +bit terbitnya +bius dibius +bius membius +bius membiusnya +bius pembius +bius pembiusan +bius terbius +blender diblender +blender memblender +blok diblok +blok memblok +blok membloknya +blok terblok +blokade diblokade +blokade memblokade +blokade memblokadenya +blokade pemblokadean +blokade terblokade +blokir diblokir +blokir diblokirnya +blokir memblokir +blokir memblokirnya +blokir pemblokir +blokir pemblokiran +blokir terblokir +blokir terblokirnya +bobok dibobok +bobok membobok +bobol dibobol +bobol dibobolnya +bobol kebobolan +bobol mebobol +bobol membobol +bobol membobolkan +bobol membobolnya +bobol pembobol +bobol pembobolan +bobol terbobol +bobot berbobot +bobot pembobotan +bobrok kebobrokan +bocor dibocorkan +bocor dibocorkannya +bocor kebocoran +bocor membocorkan +bocor membocorkannya +bocor pembocor +bocor pembocoran +bocor pembocornya +bodi berbodi +bodoh dibodohi +bodoh kebodohan +bodoh membodohi +bodoh membodohkan +bodoh pembodohan +bodoh sebodoh +bodoh terbodoh +bogem dibogem +bohong berbohong +bohong dibohongi +bohong kebohongan +bohong membohongi +bohong pembohong +bohong pembohongan +boikot diboikot +boikot memboikot +boikot memboikotnya +boikot pemboikotan +bokar pembokaran +bokong berbokong +bola pebola +bolak membolak +boleh diboleh +boleh dibolehkan +boleh dibolehkannya +boleh kebolehan +boleh membolehkan +boleh membolehkannya +boleh pembolehan +boleh perbolehkan +boling peboling +bolong dibolongi +bolong membolongi +bolos membolos +bolos pembolos +bom dibom +bom membom +bom membomi +bom pembom +bom pemboman +bombardir dibombardir +bombardir membombardir +bombardir pembombardiran +bon dibon +bon kebon +bon kebonan +bonceng berboncengan +bonceng dibonceng +bonceng diboncengi +bonceng diboncengkan +bonceng diboncengnya +bonceng membonceng +bonceng memboncengi +bonceng memboncengkan +bonceng memboncengnya +bonceng pembonceng +bondong berbondong +bongkah sebongkah +bongkar dibongkar +bongkar dibongkarnya +bongkar kebongkar +bongkar membongkar +bongkar membongkarnya +bongkar pembongkar +bongkar pembongkaran +bongkar terbongkar +bongkar terbongkarlah +bongkar terbongkarnya +bonsai dibonsai +bonsai membonsai +bonsai pembonsaian +bonus berbonus +bopong dibopong +bopong membopong +bopong membopongnya +bor dibor +bor membor +bor pemboran +bordir dibordir +bordir membordir +borgol diborgol +borgol diborgolnya +borgol memborgol +borgol memborgolnya +borgol pemborgolan +borgol terborgol +borok keborokan +borong diborong +borong diborongnya +borong memborong +borong memborongnya +borong pemborong +borong pemborongan +borong pemborongnya +boros keborosan +boros memboroskan +boros pemboros +boros pemborosan +boros terboros +bos terbosan +bosan kebosanan +bosan membosankan +bosan membosankannya +bosan terbosan +bot kebot +botak dibotaki +botak kebotakan +botak membotaki +botak pembotakan +botol pembotolan +botol sebotol +bowo perbowo +boyong diboyong +boyong diboyongnya +boyong meboyong +boyong memboyong +boyong memboyongnya +brutal kebrutalan +bu dibui +bu dibukan +bu dibukannya +bu membukan +bu pembukan +bu pembukannya +bu sebu +bu sebuan +bu terbukan +buah berbuah +buah berbuahkan +buah dibuah +buah dibuahi +buah mebuahkan +buah membuah +buah membuahi +buah membuahkan +buah pembuahan +buah perbuah +buah perbuahan +buah sebuah +buai dibuai +buai membuai +buai terbuai +buak membuak +bual membual +bual pembual +buang dibuang +buang dibuangnya +buang kebuang +buang membuang +buang membuangnya +buang pembuang +buang pembuangan +buang terbuang +buang terbuangnya +buar membuar +buar membuarkan +buas kebuasan +buas terbuas +buat berbuat +buat berbuatan +buat berbuatlah +buat dibuat +buat dibuatkan +buat dibuatkannya +buat dibuatlah +buat dibuatnya +buat mebuat +buat membuat +buat membuatkan +buat membuatkannya +buat membuatnya +buat menbuat +buat pebuatan +buat pembuat +buat pembuatan +buat pembuatnya +buat perbuat +buat perbuatan +buat sebuat +buat sebuatan +buat terbuat +bubar dibubarkan +bubar dibubarkannya +bubar membubarkan +bubar membubarkannya +bubar pembubaran +bubuh dibubuhi +bubuh dibubuhkan +bubuh membubuhi +bubuh membubuhkan +bubuh membubuhkannya +bubuh pembubuhan +bubuhan pembubuhan +bubung membubung +budak perbudakan +budaya berbudaya +budaya dibudayakan +budaya kebudayaan +budaya membudaya +budaya membudayakan +budaya pembudayaan +budi berbudi +budi pembudi +budi sebudi +bugar kebugaran +bugar membugarkan +bugar pembugaran +bugar sebugar +bugil berbugil +bui dibui +buih berbuih +bujang membujang +bujet berbujet +bujuk dibujuk +bujuk membujuk +bujuk membujuknya +bujuk pembujukan +bujuk terbujuk +bujur membujur +bujur terbujur +buk dibukan +buk membukan +buk pembukan +buk terbukan +buk terbuki +buka berbuka +buka berbukaan +buka berbukalah +buka dibuka +buka dibukakan +buka dibukalah +buka dibukanya +buka kebuka +buka mebuka +buka membuka +buka membukakan +buka membukanya +buka menbuka +buka pembuka +buka pembukaan +buka pembukanya +buka terbuka +buka terbukalah +buka terbukanya +buket sebuket +bukit bebukitan +bukit berbukit +bukit kebukit +bukit pebukitan +bukit perbukitan +bukti berbukti +bukti dibuktikan +bukti dibuktikannya +bukti mebuktikan +bukti membuktikan +bukti membuktikannya +bukti pembuktian +bukti pembuktikan +bukti terbukti +bukti terbuktilah +bukti terbuktinya +buku dibuku +buku dibukukan +buku dibukukannya +buku mebukukan +buku membukukan +buku membukukannya +buku pembukuan +buku perbukuan +buku sebuku +buku terbukukan +bulan berbulan +bulan dibulan +bulan kebulan +bulan perbulan +bulan perbulannya +bulan sebulan +bulan sebulanan +bulan sebulannya +bulat berbulat +bulat dibulatkan +bulat kebulatan +bulat membulat +bulat membulatkan +bulat pembulatan +buldoser dibuldoser +buldoser membuldoser +bulu berbulu +bulu berbulunya +bulu pebulu +bulu pembulu +bulu sebulu +buluh pembuluh +bum dibumi +bum membumi +bum sebum +bumbu berbumbu +bumbu dibumbui +bumbu membumbui +bumbung membumbung +bumbung membumbungkan +bumbung membumbungnya +bumi dibumi +bumi dibumikan +bumi kebumian +bumi kebumikan +bumi membumi +bumi membumikan +bumi pembumian +bun kebun +bun kebunnya +buncah membuncah +buncah membuncahkan +buncit membuncit +buncit terbuncit +bundel dibundel +bundel membundel +bundel sebundel +bung kebung +bung membungkan +bung pembungan +bunga bebungaan +bunga berbunga +bunga pembungaan +bunga perbungaan +bungkam dibungkam +bungkam kebungkaman +bungkam membungkam +bungkam membungkamnya +bungkam pembungkam +bungkam pembungkaman +bungkam terbungkam +bungkuk membungkuk +bungkuk membungkukan +bungkuk membungkukkan +bungkus berbungkus +bungkus dibungkus +bungkus dibungkusnya +bungkus membungkus +bungkus membungkusnya +bungkus pembungkus +bungkus pembungkusan +bungkus pembungkusnya +bungkus perbungkus +bungkus sebungkus +bungkus terbungkus +bunting kebuntingan +buntu kebuntuan +buntut berbuntut +buntut dibuntuti +buntut membuntut +buntut membuntuti +buntut pembuntutan +bunuh dibunuh +bunuh dibunuhnya +bunuh membunuh +bunuh membunuhi +bunuh membunuhnya +bunuh pembunuh +bunuh pembunuhan +bunuh pembunuhnya +bunuh terbunuh +bunuh terbunuhnya +bunyi bebunyian +bunyi berbunyi +bunyi dibunyikan +bunyi dibunyikannya +bunyi membunyikan +bunyi membunyikannya +bunyi pembunyian +bur kebur +bur perburan +bura terburai +burai terburai +buram diburamkan +buram keburaman +buram memburamkan +bursa dibursa +buru berburu +buru berburunya +buru diburu +buru diburunya +buru keburu +buru keburukan +buru keburukannya +buru memburu +buru memburunya +buru pemburu +buru pemburuan +buru pemburukan +buru pemburunya +buru perburuan +buru perburukan +buru terburu +buruh keburuhan +buruh memburuh +buruh pemburuh +buruh perburuhan +buruk berburuk +buruk keburukan +buruk memburuk +buruk memburukkan +buruk memburuknya +buruk pemburukan +buruk perburuk +buruk perburukan +buruk seburuk +buruk terburuk +buruk terburuknya +bus terbus +busa berbusa +busana berbusana +busana berbusananya +busuk kebusukan +busuk membusuk +busuk membusukkan +busuk membusuknya +busuk pembusuk +busuk pembusukan +busung membusung +busung membusungkan +buta dibutakan +buta kebutaan +buta membuta +buta membutakan +butik membutikan +butir perbutir +butir sebutir +butuh dibutuh +butuh dibutuhan +butuh dibutuhkan +butuh dibutuhkannya +butuh kebutuhan +butuh kebutuhkan +butuh mebutuhkan +butuh membutuh +butuh membutuhan +butuh membutuhkan +butuh membutuhkannya +butuh menbutuhkan +butul kebutulan +butul perbutulan +butut membututi +buyar dibuyarkan +buyar membuyarkan +buyut bebuyutan +ca beca +ca berca +ca dica +ca mencai +ca menya +ca menyakan +ca menyalah +ca penca +ca penyalah +ca perca +ca seca +caba secaba +cabang bercabang +cabang kecabangan +cabang penyabangan +cabang percabangan +cabar menyabar +cabar penyabar +cabik dicabik +cabik mencabik +cabik tercabik +cabul dicabuli +cabul kecabulan +cabul mencabuli +cabul pencabul +cabul pencabulan +cabul percabulan +cabut dicabut +cabut dicabuti +cabut dicabutnya +cabut mecabut +cabut mencabut +cabut mencabuti +cabut mencabutnya +cabut menyabut +cabut menyabutkan +cabut pecabutan +cabut pencabut +cabut pencabutan +cabut tercabut +cacah dicacah +cacah mencacah +cacah pencacah +cacah pencacahan +cacat kecacatan +cacat mencacat +cacat mencacatkan +cacat tercacat +caci dicaci +caci mencaci +caci mencacinya +caci-maki dicaci-maki +caci-maki mencaci-maki +cacing bercacing +cacing kecacingan +cadai menyadai +cadang dicadangkan +cadang dicadangkannya +cadang mencadangkan +cadang mencadangkannya +cadang menyadang +cadang pencadangan +cadang penyadang +cadar bercadar +cadar menyadari +cadar menyadarkan +cadar menyadarkannya +cadar penyadaran +cah memcah +cah memcahkan +cah pecah +cah pecahan +cah pecahkan +cah pecahlah +cah pecahnya +cahar pencahar +cahari pencaharian +cahaya bercahaya +cahaya pencahayaan +caing menyaingi +cair dicairkan +cair dicairkannya +cair mencair +cair mencairkan +cair mencairkannya +cair mencairnya +cair pencair +cair pencairan +cair penyair +cair tercairkan +cak becak +cak becaknya +cak bercak +cak kecak +cak menyakan +cak pecak +cak pencak +cak penyaki +cakap bercakap +cakap kecakapan +cakap pecakapan +cakap percakapan +cakar bercakar +cakar dicakar +cakar mencakar +cakar pencakar +cakar pencakaran +caki penyaki +cako pencakokan +cakup dicakup +cakup mencakup +cakup mencakupi +cakup tercakup +cal becali +calak menyalak +calak menyalakan +calang pecalang +calo mencalokan +calo pencaloan +calo percaloan +calon dicalonkan +calon dicalonkannya +calon mencalon +calon mencalonkan +calon mencalonkannya +calon menyalonkan +calon pecalonan +calon pencalon +calon pencalonan +calon percalonan +cam dicamkan +cam kecam +cam kecaman +cam kecamnya +cam mencamkan +cam menyamkan +camar kecamaran +camar menyamar +camar menyamarkan +camar menyamarkannya +camar pencamaran +camar penyamar +camar penyamaran +camat kecamatan +cambang bercambang +cambang menyambangi +cambuk dicambuk +cambuk mencambuk +cambuk pencambukan +cambung menyambung +cambung menyambungkan +cambung menyambungkannya +cambung menyambungnya +cambung penyambung +cambung penyambungan +camil mencamil +campa dicampakan +campa mencampai +campa mencampakan +campa menyampai +campa menyampakan +campa penyampai +campak dicampakan +campak dicampakkan +campak mencampakan +campak mencampakkan +campak mencampakkannya +campak menyampakan +campak penyampak +camping menyamping +camping menyampingkan +campur bercampur +campur bercampurnya +campur dicampur +campur dicampuri +campur dicampurkan +campur mencampur +campur mencampuri +campur mencampurkan +campur mencampurkannya +campur mencampurnya +campur menyampuri +campur menyampurkan +campur pencampur +campur pencampuran +campur percampuran +campur tercampur +campur tercampurnya +camuk kecamuk +canang dicanangkan +canang dicanangkannya +canang mencanangkan +canang pencanangan +canda becanda +canda becandaan +canda becandanya +canda bercanda +canda bercandaan +canda bercandanya +canda mencandai +candai mencandai +candi penyandian +candi percandian +candra menyandra +candra penyandraan +candu kecanduan +candu mencandu +candu pecandu +candu pecandunya +candu pencandu +candu pencandunya +candung menyandung +cang kecang +cang mencangkan +cang menyangi +cang menyangkan +cang pencangan +cang penyang +cang secang +cang secangan +canggah menyanggah +canggah menyanggahnya +canggah penyanggah +canggah penyanggahan +canggih kecanggihan +canggih secanggih +canggih tercanggih +canggih tercanggihnya +canggung kecanggungan +cangkang bercangkang +cangkir secangkir +cangkul dicangkul +cangkul mencangkul +cangkul pencangkulan +cangkup mencangkup +cangkup menyangkup +cantik kecantikan +cantik kecantikkan +cantik percantik +cantik secantik +cantik tercantik +canting mencanting +cantol dicantolkan +cantol kecantol +cantum dicantum +cantum dicantumkan +cantum dicantumkannya +cantum mencantum +cantum mencantumkan +cantum mencantumkannya +cantum menyantumkan +cantum pencantuman +cantum penyantuman +cantum tercantum +cantum tercantumkan +cantum tercantumnya +cap bercap +cap dicap +cap dicapnya +cap kecap +cap kecapi +cap kecapnya +cap mencap +cap mencapi +cap mencapnya +cap pengcap +capa dicapai +capa kecapai +capa kecapakan +capa mecapai +capa memcapai +capa mencapa +capa mencapai +capa menyapa +capa menyapai +capa menyapanya +capa pencapai +capa percapakan +capa secapa +capa tercapai +capai dicapai +capai dicapainya +capai kecapai +capai kecapaian +capai mecapai +capai memcapai +capai mencapai +capai mencapainya +capai menyapai +capai menyapaikan +capai pencapai +capai pencapaian +capai tercapai +capai tercapailah +capai tercapainya +capak kecapakan +capak percapakan +cape kecapean +cape kecapekan +capek kecapekan +capit bercapit +caplok dicaplok +caplok dicaploknya +caplok mencaplok +caplok mencaploknya +caplok menyaplok +caplok pencaplok +caplok pencaplokan +capuk menyapukan +cara mencara +cara mencarai +cara menyarakan +cara pencara +cara pengcara +cara percara +cara secara +carah menyarahkan +carak menyarakan +caran menyarankan +caran menyarankannya +carang menyarang +carang menyarangkan +carang menyarangkannya +carang penyarang +cari dicari +cari dicarikan +cari dicarilah +cari dicarinya +cari mecari +cari memcari +cari mencari +cari mencarian +cari mencarikan +cari mencarikannya +cari mencarinya +cari menyarikan +cari pecarian +cari pencari +cari pencarian +cari pencarinya +cari penyarikan +cari percarian +carik dicarikan +carik mencarikan +carik menyarikan +carik penyarikan +carik secarik +caring menyaring +caring menyaringnya +caring penyaring +caring penyaringan +carter dicarter +carter mencarter +cas dicas +cas percasi +cat bercat +cat dicat +cat mecat +cat mencat +cat menyatan +cat menyatkan +cat pecat +cat pecatan +catat dicatat +catat dicatatkan +catat dicatatkannya +catat dicatatnya +catat kecatatan +catat mecatat +catat mecatatkan +catat mencatat +catat mencatatan +catat mencatatkan +catat mencatatkannya +catat mencatatnya +catat pencatat +catat pencatatan +catat tercatat +catat tercatatkan +catat tercatatnya +catu menyatu +catu menyatukan +catu menyatukannya +catu menyatunya +catu pecatu +catu pencatu +catu penyatu +catu penyatuan +catuk menyatukan +catur pecatur +catur percaturan +catut dicatut +catut mencatut +catut menyatut +catut pencatut +catut pencatutan +catut tercatut +ce bercelah +ce dice +ce kece +ce menyelah +ce pence +cebak menyebakan +ceban menyebankan +cebok menceboki +cebong kecebong +cebur diceburkan +cebur kecebur +cebur mencebur +cebur menceburkan +cebur menyebur +cebur menyeburkan +cebur tercebur +cebur terceburnya +cecap mencecap +cecar dicecar +cecar mencecar +cecar mencecarnya +cecar menyecar +cedera dicederai +cedera kecederaan +cedera mencederai +cedera pencederaan +cedera tercederai +cegah dicegah +cegah dicegahnya +cegah mecegah +cegah mencegah +cegah mencegahnya +cegah pecegahan +cegah pencegah +cegah pencegahan +cegah tercegah +cegak mencegak +cegar menyegarkan +cegar penyegar +cegar penyegaran +cegat dicegat +cegat mencegat +cegat mencegatnya +cegat menyegat +cegat pencegat +cegat pencegatan +cek becek +cek dicek +cek mencek +cek mengcek +cek pecek +cekal dicekal +cekal dicekalnya +cekal mencekal +cekal mencekalnya +cekal pencekalan +cekam dicekam +cekam mencekam +cekam mencekamnya +cekam tercekam +cekat kecekatan +cekat menyekat +cekat penyekat +cekat penyekatan +cekat tercekat +cekcok percekcokan +cekcok percekcokkan +ceki pencekikan +cekik dicekik +cekik dicekiknya +cekik mencekik +cekik mencekiknya +cekik pencekikan +cekik tercekik +cekok dicekoki +cekok mencekoki +cela bercela +cela dicela +cela kecelaan +cela kecelakan +cela mencela +cela mencelanya +cela menyela +cela pencela +cela pencelaan +cela tercela +cela tercelanya +celah bercelah +celah menyelah +celak kecelakan +celak menyelak +celaka kecelakaan +celaka mencelakai +celaka mencelakakan +celaka mencelakakannya +celana bercelana +celat mencelat +cele kecele +celetuk berceletuk +celetuk menyeletuk +celoteh berceloteh +celup dicelup +celup dicelupkan +celup mencelup +celup mencelupkan +celup mencelupkannya +celup menyelupkan +celup pencelup +celup pencelupan +celup tercelup +celurit bercelurit +celurit dicelurit +celurit penceluritan +cema menyemai +cema penyemai +cemar dicemari +cemar dicemarkan +cemar mencemari +cemar mencemarkan +cemar pecemaran +cemar pencemar +cemar pencemaran +cemar tercemar +cemar tercemari +cemar tercemarkan +cemar tercemarnya +cemara menyemarakan +cemara pencemaraan +cemas dicemaskan +cemas kecemasan +cemas mencemaskan +cemas mencemaskannya +cemas pencemas +cemat kecematan +cemat menyemat +cemat menyematkan +cemat menyematkannya +cemat penyematan +cembul menyembul +cembul menyembulkan +cemburu dicemburui +cemburu kecemburuan +cemburu pencemburu +cemerlang kecemerlangan +cemerlang secemerlang +cemooh dicemooh +cemooh mencemooh +cemooh mencemoohkan +cemooh mencemoohnya +cempal menyempal +cemplung dicemplungkan +cemplung kecemplung +cemplung mencemplungkan +cemplung menyemplungkan +cemplung tercemplung +cendera menyendera +cendera penyenderaan +cenderung kecenderung +cenderung kecenderungan +cendok menyendok +cendok menyendokkan +ceng keceng +ceng menceng +cengang mencengangkan +cengang mencengangkannya +cengang tercengang +cengkeram dicengkeram +cengkeram mencengkeram +cengkerama bercengkerama +centang dicentang +centang mencentang +centil menyentil +centil penyentilan +cenung tercenung +cepak menyepak +cepak menyepaknya +cepat dicepat +cepat dicepatkan +cepat kecepatan +cepat menyepati +cepat pecepatan +cepat pencepatan +cepat percepat +cepat percepatan +cepat secepat +cepat secepatnya +cepat secepatnyalah +cepat tercepat +cepat tercepatnya +cepek kecepek +ceplos diceploskan +ceplos diceploskannya +ceplos keceplosan +ceplos menceploskan +ceplos menceploskannya +ceplos menyeploskan +cerabut dicerabut +cerabut mencerabut +cerabut tercerabut +cerah dicerahkan +cerah kecerahan +cerah mencerahkan +cerah menyerah +cerah menyerahan +cerah menyerahkan +cerah menyerahkannya +cerah menyerahlah +cerah menyerahnya +cerah pencerah +cerah pencerahan +cerah penyerah +cerah penyerahan +cerah penyerahkan +cerah secerah +cerah tercerah +cerah tercerahkan +cerai bercerai +cerai dicerai +cerai diceraikan +cerai diceraikannya +cerai menceraikan +cerai menceraikannya +cerai penceraian +cerai perceraian +cerai tercerai +cerai-berai bercerai-berai +cerai-berai mencerai-beraikan +cerai-berai tercerai-berai +cerak menyerakan +ceramah berceramah +ceramah diceramahi +ceramah menceramahi +ceramah penceramah +cerang menyerang +cerang menyerangan +cerang menyerangkan +cerang menyerangnya +cerang penyerang +cerang penyerangan +cerang penyerangnya +cerap menyerap +cerap menyerapnya +cerap penyerap +cerap penyerapan +cerat menyerat +cerbak menyerbak +cerca dicerca +cerca mencerca +cerca mencercanya +cerca secerca +cercah secercah +cerdas dicerdaskan +cerdas kecerdasan +cerdas mencerdaskan +cerdas pencerdasan +cerdas secerdas +cerdas tercerdas +cerdik kecerdikan +cerewet kecerewetan +ceria keceriaan +ceria menceriakan +cerita becerita +cerita bercerita +cerita diceritakan +cerita diceritakannya +cerita meceritakan +cerita menceritakan +cerita menceritakannya +cerita menyeritakan +cerita pencerita +cerita penceritaan +cerlang kecerlangan +cermat dicermati +cermat kecermatan +cermat mencermati +cermat pencermatan +cermat secermat +cermin becermin +cermin bercermin +cermin bercerminlah +cermin dicerminkan +cermin mencerminkan +cermin pencerminan +cermin tercermin +cermin tercerminkan +cerna dicerna +cerna mencerna +cerna mencernanya +cerna pencernaan +cerna percernaan +cerna tercerna +ceroboh kecerobohan +ceruk menyerukan +cetak dicetak +cetak dicetaknya +cetak mecetak +cetak memcetak +cetak mencetak +cetak mencetakkan +cetak mencetaknya +cetak menyetak +cetak menyetakan +cetak pecetak +cetak pencetak +cetak pencetakan +cetak pencetakkan +cetak pencetaknya +cetak penyetakan +cetak percetakan +cetak percetakkan +cetak tercetak +cetak tercetaknya +cetok menyetok +cetus dicetus +cetus dicetuskan +cetus dicetuskannya +cetus mencetus +cetus mencetuskan +cetus pencetus +cetus pencetusnya +cetus tercetus +cetus tercetuslah +cetus tercetusnya +ci keci +ci menci +ci peci +ci pecinya +ci percikan +ci percikannya +ciak menyiakan +ciap menyiapan +ciap menyiapkan +ciap menyiapkannya +ciap penyiap +ciap penyiapan +ciar menyiarkan +ciar menyiarkannya +ciar penyiar +ciar penyiaran +ciar penyiarnya +cibir dicibir +cibir mencibir +cibir mencibirnya +cibuk menyibukan +cibuk menyibukkan +cicil dicicil +cicil mencicil +cicil mencicilnya +cicil menyicil +cicil pecicilan +cicil pencicilan +cicip dicicip +cicip dicicipi +cicip mencicip +cicip mencicipi +cicip menyicip +cicip menyicipi +cicip pencicip +cicit mencicit +ciduk diciduk +ciduk diciduknya +ciduk menciduk +ciduk menciduknya +ciduk menyiduk +ciduk pencidukan +ciduk terciduk +cik becik +cik kecik +cik percik +cik percikan +cik perciki +cik percikkan +cikut menyikut +cikut menyikutnya +cincang dicincang +cincang mencincang +cincin bercincin +cing kecing +cingkat menyingkat +cingkat penyingkat +cingkat penyingkatan +cinta bercinta +cinta bercintalah +cinta bercintanya +cinta dicinta +cinta dicintai +cinta kecintaan +cinta mencinta +cinta mencintai +cinta menyintai +cinta pecinta +cinta pecintanya +cinta pencinta +cinta pencintanya +cinta percintaan +cinta tercinta +cinta tercintanya +ciprat kecipratan +ciprat mencipratkan +ciprat terciprat +cipta dicipta +cipta diciptakan +cipta diciptakannya +cipta meciptakan +cipta memciptakan +cipta mencipta +cipta menciptaan +cipta menciptakan +cipta menciptakannya +cipta menyiptakan +cipta pencipta +cipta penciptaan +cipta penciptanya +cipta tercipta +cipta terciptakan +cipta terciptalah +cipta terciptanya +cir berciri +ciri berciri +ciri bercirikan +ciri dicirikan +ciri mencirikan +cit mencit +cita bercita +cita dicitakan +cita mencitai +cita mencitakan +cita menyita +cita menyitanya +cita pencita +cita penyitaan +citra bercitra +citra dicitrakan +citra mencitrakan +citra pencitraan +citra tercitrakan +cium berciuman +cium dicium +cium diciumi +cium diciumnya +cium kecium +cium mencium +cium menciumi +cium menciumnya +cium menyium +cium pencium +cium penciuman +cium tercium +cium terciumnya +ciut diciutkan +ciut menciut +ciut menciutkan +ciut menciutnya +ciut menyiutkan +ciut penciutan +coak kecoak +cobek menyobek +cobek penyobekan +coblos dicoblos +coblos mencoblos +coblos mencoblosnya +coblos menyoblos +coblos pencoblos +coblos pencoblosan +coblos tercoblos +cocok bercocok +cocok dicocok +cocok dicocokan +cocok dicocokkan +cocok kecocokan +cocok kecocokkan +cocok mencocokan +cocok mencocokkan +cocok mencocokkannya +cocok menyocokkan +cocok pencocokan +cocok pencocokkan +cocol dicocol +cocor dicocor +cocor mencocor +cocor mencocorkan +cocor mencocornya +codet menyodet +codet penyodetan +cogok menyogok +cogok menyogoknya +cogok penyogok +cogok penyogokan +cok penyok +cokelat kecokelatan +cokelat mencokelatkan +cokelat pencokelatan +cokok dicokok +cokok mencokok +cokok mencokoknya +cokol bercokol +cokol bercokolnya +cokol mencokol +colek dicolek +colek mencolek +colek menyolek +coleng pencoleng +colok dicolok +colok dicolokan +colok dicolokkan +colok mecolok +colok mencolok +colok mencolokan +colok mencolokkan +colok mencoloknya +colok menyolok +colok tercolok +colong dicolong +colong kecolongan +colong mencolong +colong menyolong +combong menyombongkan +comot dicomot +comot mencomot +comot mencomotnya +congkak kecongkakan +contoh dicontoh +contoh dicontohkan +contoh dicontohkannya +contoh mecontohkan +contoh mencontoh +contoh mencontohkan +contoh mencontohkannya +contoh mencontohnya +contoh menyontoh +contoh menyontohkan +contoh pencontohan +contoh percontohan +copet dicopet +copet kecopetan +copet mencopet +copet pencopet +copet pencopetan +copot dicopot +copot dicopoti +copot dicopotnya +copot mencopot +copot mencopoti +copot mencopotnya +copot pencopotan +cor dicor +cor mencor +corak bercorak +corak menyoraki +corak menyorakkan +coreng dicoreng +coreng mencoreng +coreng tercoreng +coreng tercorengnya +coret dicoret +coret dicoreti +coret dicoretnya +coret mencoret +coret mencoreti +coret mencoretkan +coret mencoretnya +coret pencoretan +coret tercoret +coret tercoretnya +corong mencorong +corong menyorongkan +corot menyorot +corot menyoroti +corot menyorotkan +corot menyorotnya +cuaca bercuaca +cual kecuali +cuat dicuatkan +cuat mencuat +cuat mencuatkan +cuat mencuatnya +cuat tercuat +cubit dicubit +cubit mencubit +cubit mencubitnya +cubung kecubung +cuci dicuci +cuci dicucinya +cuci mencuci +cuci mencucikan +cuci mencucinya +cuci menyuci +cuci menyucikan +cuci pencuci +cuci pencucian +cuci penyucian +cuci tercuci +cucu bercucu +cucu mencucui +cucur bercucur +cucur bercucuran +cucur mencucurkan +cudang pecudangi +cuek dicueki +cuil mencuil +cuil secuil +cuit bercuit +cuit dicuit +cuit dicuitkan +cuit mencuit +cuit mencuitkan +cuk kecuk +cuk pecuk +cuka bercukai +cuka menyukai +cuka penyuka +cuka penyukanya +cukai bercukai +cukai menyukai +cukai menyukainya +cukur bercukur +cukur dicukur +cukur mencukur +cukur mencukurnya +cukur menyukur +cukur menyukuri +cukur pencukur +cukur pencukuran +cukur tercukur +cula bercula +culas keculasan +culik diculik +culik diculiknya +culik menculik +culik menculiknya +culik peculikan +culik penculik +culik penculikan +culik penculikkan +culik penculiknya +cuma percuma +cumbu bercumbu +cumbu dicumbu +cumbu mencumbu +cumbu mencumbunya +cumbu percumbuan +cundang kecundang +cundang mencundangi +cundang pecundang +cundang pecundangi +cundang pencundang +cungkil dicungkil +cungkil mencungkil +cungkil mencungkilnya +cunia secunia +cup kecup +cup kecupan +cuplik dicuplik +cuplik mencuplik +cuplik pencuplikan +cuplik secuplik +cur dicuri +cur mecuri +cur mencuri +cur pencuran +cur pencuri +cur tercuri +cura securai +curah dicurahkan +curah mencurahkan +curah mencurahkannya +curah tercurah +curah tercurahkan +curai securai +curam kecuraman +curang dicurangi +curang kecurangan +curang mencurangi +curat menyurat +curat menyurati +curat menyuratkan +curat menyuratnya +curi dicuri +curi dicurinya +curi kecurian +curi mecuri +curi mencuri +curi mencurikan +curi mencurinya +curi pecurian +curi pencuri +curi pencurian +curi pencurinya +curi tercuri +curiga dicurigai +curiga dicurigakan +curiga kecurigaan +curiga mecurigakan +curiga mencurigaan +curiga mencurigai +curiga mencurigakan +curik mencurikan +cus becus +cus becusnya +cus menyusi +cut kecut +cut pecut +cut pecutan +cut percut +da beda +da bedakan +da bedalah +da bedanya +da berda +da dida +da didakan +da keda +da kedaan +da kedai +da meda +da medai +da menda +da mengdakan +da peda +da pelda +da pemda +da pemdanya +da penda +da pendaan +da pengda +da perda +da perdanya +da seda +da sedakan +dab perdaban +dad sedadi +dada berdada +dada didada +dada pedada +dada sedada +dadak mendadak +dadak mendadaknya +dadar pendadaran +dadi sedadi +dadung bedadung +daeng medaeng +daerah didaerah +daerah didaerahnya +daerah kedaerah +daerah kedaerahan +daerah sedaerah +daftar didaftar +daftar didaftarkan +daftar didaftarkannya +daftar mendaftar +daftar mendaftaran +daftar mendaftarkan +daftar mendaftarkannya +daftar mendaftarnya +daftar pedaftaran +daftar pendaftar +daftar pendaftaran +daftar pendaftarnya +daftar perdaftaran +daftar terdaftar +daftar terdaftarkan +daftar terdaftarnya +daga bedagai +dagang berdagang +dagang berdagangan +dagang berdagangnya +dagang didagangkan +dagang mendagangkan +dagang pedagang +dagang pedagangan +dagang pedagangnya +dagang pendagang +dagang perdagang +dagang perdagangan +dagang perdagangkan +daging berdaging +daging pedaging +dah bedah +dah bedahan +dah bedahnya +dah didah +dah kedah +dah medah +dah sedah +dah sedahan +dahak berdahak +dahan bedahan +dahan sedahan +dahar pendaharan +dahsyat kedahsyatan +dahsyat sedahsyat +dahsyat terdahsyat +dahulu didahului +dahulu didahulukan +dahulu kedahuluan +dahulu mendahului +dahulu mendahulukan +dahulu pendahulu +dahulu pendahuluan +dahulu pendahulunya +dahulu terdahulu +dahulu terdahulunya +dai kedai +dai kedainya +dai medai +daki didaki +daki mendaki +daki mendakinya +daki pendaki +daki pendakian +daku didaku +daku mendaku +dakwa berdakwa +dakwa didakwa +dakwa didakwaan +dakwa didakwakan +dakwa mendakwa +dakwa mendakwakan +dakwa mendakwanya +dakwa pendakwa +dakwa pendakwaan +dakwa terdakwa +dakwa terdakwanya +dakwah berdakwah +dakwah didakwahi +dakwah mendakwahkan +dakwah pendakwah +dakwah terdakwah +dal bedali +dal medal +dal medali +dal mendalan +dal mendali +dal pedal +dal pedalnya +dalam didalam +dalam didalami +dalam didalamkan +dalam didalamnya +dalam kedalam +dalam kedalaman +dalam kedalamnya +dalam mendalam +dalam mendalami +dalam mendalamnya +dalam pedalaman +dalam pendalam +dalam pendalaman +dalam perdalam +dalam perdalaman +dalam sedalam +dalam sedalamnya +dalam terdalam +dalam terdalamnya +dalang didalangi +dalang mendalang +dalang mendalangi +dalang pedalangan +dalih berdalih +dalil berdalil +dalil didalilkan +dalil mendalilkan +dam memdamkan +dam pemdam +dam pemdaman +dam pendam +dam perdami +damai berdamai +damai berdamailah +damai berdamainya +damai didamaikan +damai kedamaian +damai mendamaikan +damai pedamaian +damai pendamai +damai pendamaian +damai perdamaian +damai terdamai +daman pemdaman +damar pedamaran +damba didamba +damba didambakan +damba didambakannya +damba mendamba +damba mendambakan +damba mendambakannya +dame kedamean +dame perdamean +dami perdami +dami perdamian +dampak bedampak +dampak berdampak +dampak berdampaknya +dampak terdampak +dampar mendamparkan +dampar terdampar +dampar terdamparnya +damping berdampingan +damping didamping +damping didampingi +damping mendamping +damping mendampingi +damping mendampingnya +damping pedamping +damping pedampingan +damping pendamping +damping pendampingan +damping pendampingnya +damprat didamprat +damprat mendamprat +dan bedan +dan medan +dan medannya +dan mendan +dan pedan +dan pendanan +dan perdan +dan perdanan +dan sedan +dan sedankan +dan sedannya +dana berdana +dana didanai +dana medana +dana mendanai +dana pedana +dana pedanaan +dana pendana +dana pendanaan +dana perdana +dana perdananya +dana sedana +dana terdanai +danda pedanda +dandan berdandan +dandan didandani +dandan mendandani +dang kedang +dang medang +dang mendang +dang pedang +dang pedangan +dang pedangnya +dang pendang +dang pendangan +dang perdangan +dang sedang +dang sedangan +dang sedangkan +dang sedangnya +dangdut pedangdut +dangdut pendangdut +dangka sedangka +dangka terdangka +dangkal kedangkalan +dangkal mendangkal +dangkal mendangkalkan +dangkal pedangkalan +dangkal pendangkalan +dansa berdansa +dansa pedansa +danyang kedanyang +dap kedap +dap kedapan +dap pendapan +dap pendapi +dap sedap +dap sedapnya +dapa kedapa +dapa mendapa +dapa mendapai +dapa mendapakan +dapa pendapa +dapa terdapa +dapat didapat +dapat didapati +dapat didapatkan +dapat didapatkannya +dapat didapatlah +dapat didapatnya +dapat kedapatan +dapat medapat +dapat medapatkan +dapat memdapat +dapat memdapatkan +dapat mendapat +dapat mendapatan +dapat mendapati +dapat mendapatkan +dapat mendapatkannya +dapat mendapatnya +dapat pedapat +dapat pedapatan +dapat pendapat +dapat pendapatan +dapat pendapatkan +dapat pendapatnya +dapat perdapatan +dapat sedapat +dapat sedapatnya +dapat terdapat +dapat terdapatnya +dapur didapur +dar bedar +dar berdar +dar berdarkan +dar kedar +dar medari +dar pendar +dar pendaran +dar perdaran +dar sedar +dar sedari +dar terdari +dara berdara +dara kedaraan +darah bedarah +darah berdarah +darah berdarahnya +darah mendarah +darah pendarahan +darah perdarahan +darah sedarah +darat didarat +darat didaratan +darat didarati +darat didaratkan +darat mendarat +darat mendaratkan +darat mendaratkannya +darat mendaratnya +darat pendarat +darat pendaratan +dari medari +dari sedari +dari terdari +darmabakti mendarmabaktikan +darmawisata berdarmawisata +darurat kedaruratan +das berdasi +das pedas +das pedasnya +das sedasi +dasar bedasar +dasar bedasarkan +dasar berdasar +dasar berdasaran +dasar berdasarkan +dasar didasar +dasar didasari +dasar didasarkan +dasar mendasar +dasar mendasari +dasar mendasarkan +dasar mendasarkannya +dasar mendasarnya +dasawarsa berdasawarsa +dasawarsa sedasawarsa +dasi berdasi +dasi sedasi +daster berdaster +data didata +data mendata +data mendatanya +data pendata +data pendataan +data perdata +data perdatanya +data terdata +data terdatanya +datar didataran +datar mendatar +datar mendatarnya +datar pendataran +dati kedati +dati pedati +dati sedati +datif sedatif +daulat berdaulat +daulat berdaulatnya +daulat didaulat +daulat didaulatnya +daulat kedaulatan +daulat mendaulat +daulat mendaulatkan +daulat mendaulatnya +daulat pendaulatan +daun berdaun +daur didaur +daur mendaur +daur pendaur +dawai mendawai +daya bedaya +daya berdaya +daya berdayakan +daya berdayanya +daya pendayaan +daya perdaya +daya sedaya +dayu sedayu +dayung mendayung +dayung pedayung +dayung pendayung +de bede +de dide +de mede +de mende +de mendekan +de pede +de sede +debah bedebah +debar berdebar +debar mendebarkan +debat berdebat +debat berdebatan +debat berdebatlah +debat didebat +debat didebatkan +debat mendebat +debat mendebatkan +debat mendebatnya +debat pedebatan +debat perdebatan +debat perdebatkan +debit berdebit +debu berdebu +debum berdebum +debut berdebut +debut terdebut +decak berdecak +decit berdecit +dedah mendedahkan +dedikasi berdedikasi +dedikasi didedikasikan +dedikasi didedikasikannya +dedikasi mendedikasikan +dedikasi mendedikasikannya +dedikasi terdedikasi +definisi berdefinisi +definisi didefinisikan +definisi mendefinisi +definisi mendefinisikan +definisi mendefinisikannya +definisi pendefinisian +definisi terdefinisi +definitif didefinitifkan +definitif mendefinitifkan +defleksi terdefleksi +degar mendegar +degar mendegarkan +degar terdegar +degradasi didegradasi +degradasi mendegradasi +degradasi mendegradasikan +degradasi terdegradasi +degradasi terdegradasinya +degup berdegup +dehem berdehem +dek mendekan +dek pedek +dek pendek +dek pendeknya +dek sedek +dekade berdekade +dekade sedekade +dekah sedekah +dekah sedekahkan +dekah sedekahnya +dekam mendekam +dekan mendekan +dekap didekap +dekap mendekap +dekap mendekapnya +dekar pendekar +dekat berdekat +dekat berdekatan +dekat didekat +dekat didekati +dekat didekatkan +dekat didekatnya +dekat kedekatan +dekat medekati +dekat mendekat +dekat mendekati +dekat mendekatkan +dekat mendekatkannya +dekat mendekatlah +dekat mendekatnya +dekat pedekatan +dekat pendekat +dekat pendekatan +dekat sedekat +dekat terdekat +dekat terdekatnya +deklarasi berdeklarasi +deklarasi dideklarasi +deklarasi dideklarasikan +deklarasi dideklarasikannya +deklarasi medeklarasikan +deklarasi mendeklarasi +deklarasi mendeklarasikan +deklarasi mendeklarasikannya +deklarasi pendeklarasian +dekomposisi terdekomposisi +dekor didekor +dekor mendekor +dekorasi berdekorasi +dekorasi didekorasi +dekorasi mendekorasi +dekriminalisasi mendekriminalisasi +delap berdelapan +delap kedelapan +delap perdelapan +delapan berdelapan +delapan kedelapan +delapan kedelapannya +delapan perdelapan +delegasi didelegasikan +delegasi mendelegasikan +delegasi mendelegasikannya +delegasi pendelegasian +delegitimasi mendelegitimasi +delik mendelik +delusi terdelusi +demi pendemi +demi sedemikan +demik sedemikan +demikian sedemikian +demisioner didemisionerkan +demisioner mendemisionerkan +demo berdemo +demo didemo +demo didemokan +demo mendemo +demo mendemokan +demo mendemonya +demo pedemo +demo pendemo +demo pendemonya +demokrasi berdemokrasi +demokratisasi mendemokratisasi +demonstran pendemonstran +demonstrasi berdemonstrasi +demonstrasi didemonstrasi +demonstrasi didemonstrasikan +demonstrasi mendemonstrasikan +demonstrasi mendemonstrasikannya +demoralisasi mendemoralisasi +demosi didemosi +dempet berdempet +dempet berdempetan +den belden +den diden +den peden +denda didenda +denda mendenda +denda mendendanya +dendam mendendam +dendam pendendam +dendang berdendang +dendang didendangkan +dendang mendendangkan +dengan bedengan +dengan mendengan +dengan terdengan +dengar didengar +dengar didengarkan +dengar didengarkannya +dengar didengarnya +dengar kedengaran +dengar medengar +dengar medengarkan +dengar mendengar +dengar mendengarkan +dengar mendengarkannya +dengar mendengarnya +dengar pendengar +dengar pendengaran +dengar pendengarnya +dengar perdengarkan +dengar terdengar +dengar terdengarlah +dengar terdengarnya +denging berdenging +dengki kedengkian +dengkur mendengkur +dengkur pendengkur +dengung berdengung +dengung didengungkan +dengung mendengung +dengung mendengungkan +dengus mendengus +denominasi berdenominasi +dentang berdentang +denting berdenting +dentum berdentum +denyut berdenyut +dep didepan +dep kedepan +dep terdepan +depa kedepanya +depa pendepakan +depak didepak +depak didepaknya +depak mendepak +depak mendepaknya +depak pendepakan +depak terdepak +depak terdepaknya +depan didepan +depan didepannya +depan kedepan +depan kedepankan +depan kedepannya +depan mendepankan +depan terdepan +depan terdepannya +deponir dideponir +deponir mendeponir +deportasi dideportasi +deportasi dideportasinya +deportasi mendeportasi +deportasi mendeportasinya +deportasi pendeportasian +deposit didepositkan +deposit mendepositkan +deposito didepositokan +deposito mendepositokan +depresiasi mendepresiasi +depresiasi terdepresiasi +depresiasi terdepresiasinya +deputi kedeputian +dera bedera +dera berderai +dera didera +dera dideranya +dera mendera +dera menderanya +derai berderai +derajat sederajat +derajat sederajatnya +derak berderak +derang menderang +derap berderap +deras menderas +deras sederas +deras terderas +deregulasi dideregulasi +deregulasi menderegulasi +derek diderek +derek menderek +derek penderek +derek penderekan +deres menderes +deres penderes +deret berderet +deret berderetan +deret sederet +deret sederetan +derik berderik +dering berdering +derit berderit +derit menderit +derit penderitan +derita diderita +derita dideritanya +derita mederita +derita menderita +derita menderitanya +derita penderita +derita penderitaan +derita penderitanya +derma berderma +derma mendermakan +derma penderma +dermawan kedermawanan +deru menderu +desa berdesakan +desa didesa +desa didesanya +desa mendesa +desa mendesakan +desa pedesaan +desa pendesaan +desa perdesaan +desah mendesah +desain berdesain +desain didesain +desain didesainnya +desain mendesain +desain mendesainnya +desain pendesain +desain pendesainan +desak berdesak +desak berdesakan +desak berdesakkan +desak didesak +desak didesakkan +desak didesaknya +desak medesak +desak mendesak +desak mendesakan +desak mendesakkan +desak mendesaknya +desak terdesak +desak terdesaknya +desar mendesar +desas-desus didesas-desuskan +desentralisasi didesentralisasikan +desentralisasi terdesentralisasi +desinfeksi didesinfeksi +desing berdesing +desing mendesing +desir berdesir +desis berdesis +desis mendesis +deskripsi dideskripsikan +deskripsi mendeskripsi +deskripsi mendeskripsikan +deskripsi mendeskripsikannya +destabilisasi mendestabilisasi +detail berdetail +detail didetailkan +detail mendetail +detail mendetailkan +detail pendetailan +detail sedetail +detak berdetak +deteksi dideteksi +deteksi dideteksinya +deteksi medeteksi +deteksi mendeteksi +deteksi mendeteksinya +deteksi pendeteksi +deteksi pendeteksian +deteksi terdeteksi +deteksi terdeteksinya +detensi pendetensian +determinasi berdeterminasi +determinasi terdeterminasi +detik berdetik +detik perdetik +detik sedetik +detoksifikasi mendetoksifikasi +devaluasi mendevaluasi +dewa didewakan +dewa mendewakan +dewan kedewan +dewan kedewanan +dewasa kedewasaan +dewasa mendewasakan +dewasa pendewasaan +di bedi +di bedian +di berdi +di didi +di didikan +di didikannya +di kedi +di medi +di median +di mendi +di pedi +di pendi +di pendikan +di penydikan +di perdi +dia kedia +dia media +dia medialah +dia medianya +dia mendia +dia menydiakan +dia pedia +dia sedia +dia sediaan +dia sediakan +dia sedianya +diagnosis didiagnosis +diagnosis mendiagnosis +diagnosis mendiagnosisnya +diagnosis terdiagnosis +diagonal berdiagonal +dialek berdialek +dialektika berdialektika +dialog berdialog +dialog didialogkan +dialog mendialogkan +diam berdiam +diam berdiamnya +diam didiami +diam didiamkan +diam kediaman +diam mendiami +diam mendiamkan +diam mendiamkannya +diam pendiam +diam terdiam +diameter berdiameter +dian bedian +dian median +diang mediang +diang mendiang +dias medias +dias mediasi +diaspora berdiaspora +didih mendidih +didih mendidihkan +didik dididik +didik dididiknya +didik mendidik +didik mendidikan +didik mendidiknya +didik pedidikan +didik pendidik +didik pendidikan +didik pendidikkan +didik pendidiknya +didik terdidik +diet berdiet +diet didiet +diet pediet +diferensiasi berdiferensiasi +diferensiasi terdiferensiasi +digdaya kedigdayaan +digit berdigit +digital didigitalkan +digital mendigitalkan +digitalisasi didigitalisasi +digitalisasi mendigitalisasi +digitalisasi mendigitalisasikan +digitalisasi terdigitalisasi +dik didik +dik didikan +dik didiknya +dik medik +dik mediknya +dik pendikan +dik penydik +dik penydikan +dik sediki +dikit sedikit +dikit sedikitlah +dikit sedikitnya +dikotomi didikotomikan +dikotomi mendikotomi +dikotomi mendikotomikan +diktator kediktatoran +dikte didikte +dikte didiktekan +dikte mendikte +dikte mendiktekan +dikte mendiktenya +dikte pendiktean +dil bedil +dil bedilan +dil kedilan +dil pengdilan +dil sedili +dimensi berdimensi +din beldin +din didin +din medin +din medini +din mendini +din sedini +dinamika berdinamika +dinamis kedinamisan +dinding berdinding +dinding berdindingkan +dinding didinding +dinding kedinding +dingin bedingin +dingin didinginkan +dingin kedinginan +dingin mendingin +dingin mendinginkan +dingin mendinginkannya +dingin mendinginnya +dingin pendingin +dingin pendinginan +dingin pendinginnya +dingin sedingin +dingin terdingin +dini medini +dini mendini +dini sedini +dipan kedipan +diplomasi berdiplomasi +dirgantara kedirgantaraan +diri bediri +diri berdiri +diri berdirikan +diri berdirilah +diri berdirinya +diri didirikan +diri didirikannya +diri kediri +diri mendiri +diri mendirikan +diri mendirikannya +diri pendiri +diri pendirian +diri pendirinya +diri sediri +diri terdiri +disiplin berdisiplin +disiplin didisiplinkan +disiplin kedisiplinan +disiplin mendisiplinkan +disiplin pendisiplinan +disko berdisko +diskon berdiskon +diskon didiskon +diskon mendiskon +diskon terdiskon +diskredit didiskreditkan +diskredit mendiskreditkan +diskredit mendiskreditkannya +diskredit pendiskreditan +diskriminasi didiskriminasi +diskriminasi didiskriminasikan +diskriminasi mendiskriminasi +diskriminasi mendiskriminasikan +diskriminasi terdiskriminasi +diskualifikasi didiskualifikasi +diskualifikasi didiskualifikasinya +diskualifikasi mendiskualifikasi +diskualifikasi pendiskualifikasian +diskus berdiskusi +diskusi berdiskusi +diskusi berdiskusilah +diskusi didiskusikan +diskusi didiskusikannya +diskusi mendiskusikan +diskusi mendiskusikannya +diskusi pendiskusian +disposisi didisposisi +disposisi didisposisikan +disposisi mendisposisi +disposisi mendisposisikan +disrupsi mendisrupsi +disrupsi terdisrupsi +distorsi didistorsi +distorsi mendistorsi +distorsi terdistorsi +distribusi didistribusi +distribusi didistribusikan +distribusi didistribusikannya +distribusi mendistribusi +distribusi mendistribusikan +distribusi mendistribusikannya +distribusi pendistribusi +distribusi pendistribusian +distribusi terdistribusi +distribusi terdistribusikan +distribusi terdistribusinya +diversifikasi mendiversifikasi +diversifikasi mendiversifikasikan +diversifikasi terdiversifikasi +divestasi didivestasi +divestasi didivestasikan +divestasi mendivestasi +divestasi mendivestasikan +do dido +do kedokan +do medo +do medokan +do mendo +do mendoan +do mendokan +do sedo +doa berdoa +doa berdoalah +doa berdoanya +doa didoakan +doa mendoakan +doa mendoakannya +doa pendoa +doa sedoa +dobrak didobrak +dobrak mendobrak +dobrak mendobraknya +dobrak pendobrak +dobrak pendobrakan +dodor kedodoran +dok bedok +dok kedok +dok kedokan +dok kedoknya +dok medok +dok medokan +dok mendokan +dok sedok +dokter kedokter +dokter kedokteran +doktrin didoktrin +doktrin mendoktrin +doktrin pendoktrinan +doktrin terdoktrin +dokumen berdokumen +dokumentasi didokumentasi +dokumentasi didokumentasikan +dokumentasi mendokumentasi +dokumentasi mendokumentasikan +dokumentasi mendokumentasikannya +dokumentasi pendokumentasian +dokumentasi terdokumentasi +dokumentasi terdokumentasikan +dol bedol +dol didol +dol sedol +dom pedoman +dom pendoman +domain berdomain +dominan sedominan +dominasi berdominasi +dominasi didominasi +dominasi medominasi +dominasi mendominasi +dominasi mendominasinya +domisili berdomisili +dompet berdompet +dompleng didompleng +dompleng didomplengi +dompleng mendompleng +dompleng pendompleng +dompleng pendomplengan +donasi berdonasi +donasi didonasikan +donasi mendonasi +donasi mendonasikan +donasi mendonasikannya +dong bedong +dong didong +dong mendong +dong sedong +dongak mendongak +dongak mendongakkan +dongan kedonganan +dongeng didongengi +dongeng mendongeng +dongeng mendongengkan +dongeng pendongeng +dongkel didongkel +dongkel mendongkel +dongkel mendongkelnya +dongkel pedongkelan +dongkel pendongkelan +dongkol kedongkolan +dongkrak didongkrak +dongkrak mendongkrak +dongkrak mendongkraknya +dongkrak mengdongkrak +dongkrak pendongkrak +dongkrak terdongkrak +dongkrak terdongkraknya +donor berdonor +donor didonorkan +donor mendonor +donor mendonorkan +donor pedonor +donor pendonor +donor pendonoran +donor pendonornya +dor bedor +dor didor +dorong didorong +dorong didorongnya +dorong kedorong +dorong medorong +dorong memdorong +dorong mendorong +dorong mendorongnya +dorong pendorong +dorong pendorongan +dorong pendorongnya +dorong terdorong +dorong terdorongnya +dosa berdosa +dosa pendosa +dosis berdosis +dot sedot +dot sedotan +doyo bedoyo +doyo mendoyo +dram pedram +dramatis sedramatis +dramatisasi didramatisasi +dramatisasi mendramatisasi +drastis sedrastis +dribel mendribel +drop didrop +drop mendrop +dua bedua +dua beduai +dua berdua +dua berduaan +dua berdualah +dua didua +dua diduakan +dua kedua +dua keduanya +dua keduanyalah +dua medua +dua mendua +dua menduakan +duai beduai +dubes kedubes +dubes kedubesnya +duda diduda +duda menduda +dudu didudukan +dudu kedudukan +dudu kedudukannya +dudu mendudukan +dudu mendudukannya +dudu pendudukan +dudu pendudukannya +duduk diduduk +duduk didudukan +duduk diduduki +duduk didudukkan +duduk kedudukan +duduk meduduki +duduk menduduk +duduk mendudukan +duduk menduduki +duduk mendudukkan +duduk mendudukkannya +duduk peduduk +duduk penduduk +duduk pendudukan +duduk penduduknya +duduk terduduk +duel berduel +duet beduet +duet berduet +duet diduetkan +duet menduetkan +duet menduetkannya +duga diduga +duga didugakan +duga diduganya +duga meduga +duga menduga +duga menduganya +duga pendugaan +duga terduga +duga terduganya +duh seduh +duh seduhan +duh seduhlah +duit berduit +duk beduk +duk diduki +duk kedukan +duka berduka +duka kedukaan +duka menduka +dukacita berdukacita +dukan kedukan +duku pendukunya +dukuh pedukuhan +dukun mendukun +dukun perdukunan +dukung didukung +dukung didukungan +dukung didukungnya +dukung medukung +dukung memdukung +dukung mendukung +dukung mendukungan +dukung mendukungnya +dukung pedukung +dukung pedukungnya +dukung pendukung +dukung pendukungan +dukung pendukungnya +dukung terdukung +dula medula +dulang didulang +dulang mendulang +dulang pendulang +dulang pendulangan +dulang sedulang +duli peduli +duli pedulian +duli pedulikan +duli pedulinya +duli perduli +dulur sedulur +dum bedum +dung bedungan +dung kedung +dung mendung +dung pedungan +dung pendung +dunia didunia +dunia kedunia +dunia keduniaan +dunia mendunia +dunia menduniakan +dunia sedunia +duniawi keduniawian +duplikasi diduplikasi +duplikasi menduplikasi +duplikasi menduplikasikan +duplikasi terduplikasi +duplikat diduplikat +duplikat menduplikat +dur berduri +dur mendur +durasi bedurasi +durasi berdurasi +duri berduri +dusta berdusta +dusta kedustaan +dusta mendustakan +dusta pendusta +duta kedutaan +duyun berduyun +eban menyebankan +ecek mengecek +ecek mengecekan +ecek mengeceknya +ecek pengecek +ecek pengecekan +ecek pengecekkan +ecer diecer +ecer mengecer +ecer mengecerkan +ecer pengecer +ecer pengecernya +edan mengedan +edar beredar +edar beredarlah +edar beredarnya +edar diedar +edar diedarkan +edar diedarkannya +edar mengedar +edar mengedarkan +edar mengedarkannya +edar pengedar +edar pengedaran +edar pengedarnya +edar peredar +edar peredaran +edit diedit +edit mengedit +edit mengeditnya +edit pengedit +edit pengeditan +edukasi diedukasi +edukasi mengedukasi +edukasi mengedukasikan +edukasi teredukasi +ef beef +efek berefek +efektif diefektifkan +efektif keefektifan +efektif mengefektifkan +efektif pengefektifan +efektif seefektif +efektif terefektif +efektivitas keefektivitasan +efisien diefisienkan +efisien keefisienan +efisien mengefisienkan +efisien seefisien +efisiensi diefisiensi +efisiensi diefisiensikan +efisiensi mengefisiensi +efisiensi mengefisiensikan +egah menegah +egah penegah +egah penegahan +egat menyegat +ego diego +ego meego +ego menego +egois keegoisan +egol mengegolkan +eh meehan +eh meneh +eja dieja +eja mengeja +eja mengejanya +eja pengejaan +ejakulasi berejakulasi +ejan mengejan +ejawantah diejawantahkan +ejawantah mengejawantah +ejawantah mengejawantahkan +ejawantah pengejawantahan +ejek diejek +ejek mengejek +ejek mengejeknya +ekang belekang +ekang mengekang +ekang mengekangnya +ekang pengekang +ekang pengekangan +ekonom berekonomi +ekonom perekonoman +ekonom perekonomi +ekonomi berekonomi +ekonomi keekonomian +ekonomi perekonomi +ekonomi perekonomian +ekonomis keekonomisan +ekor berekor +ekor mengekor +ekor mengekornya +ekor pengekor +ekor perekor +ekor seekor +eks bereksi +eks meeks +eks seeks +eksaminasi dieksaminasi +eksaminasi mengeksaminasi +eksekusi dieksekusi +eksekusi dieksekusinya +eksekusi mengeksekusi +eksekusi mengeksekusinya +eksekusi pengeksekusi +eksekusi pengeksekusian +eksekusi tereksekusi +ekses berekses +eksfoliasi mengeksfoliasi +ekskavasi diekskavasi +ekskavasi mengekskavasi +eksklusif mengeksklusifkan +ekskresi diekskresikan +eksotis keeksotisan +ekspansi berekspansi +ekspansi diekspansi +ekspansi mengekspansi +eksperimen bereksperimen +eksperimen bereksperimenlah +eksploitasi dieksploitasi +eksploitasi mengeksploitasi +eksploitasi mengeksploitasinya +eksploitasi pengeksploitasi +eksploitasi pengeksploitasian +eksploitasi tereksploitasi +ekspor diekspor +ekspor diekspornya +ekspor mengekspor +ekspor mengekspornya +ekspor pengekspor +ekspor pengeksporan +ekspos diekspos +ekspos mengekspos +ekspos mengeksposnya +ekspos terekspos +ekspos tereksposnya +ekspose diekspose +ekspose mengekspose +ekspose terekspose +ekspres berekspresi +ekspres terekspresi +ekspresi berekspresi +ekspresi diekspresikan +ekspresi mengekspresikan +ekspresi mengekspresikannya +ekspresi pengekspresian +ekspresi terekspresi +ekstensi berekstensi +ekstradisi diekstradisi +ekstradisi mengekstradisi +ekstradisi mengekstradisinya +ekstradisi pengekstradisian +ekstrak diekstrak +ekstrak mengekstrak +ekstraksi diekstraksi +ekstraksi mengekstraksi +ekstrem seekstrem +ekstrem terekstrem +el belel +el keel +el meel +el menelan +el peel +el perel +el pereli +elaborasi dielaborasi +elaborasi mengelaborasi +elak dielak +elak dielakan +elak dielakkan +elak mengelak +elak mengelakkan +elak mengelaknya +elak menyelak +elak pengelak +elak pengelakan +elak terelakan +elak terelakkan +elan memelankan +elan menelan +elan menelannya +elang pelelang +elang pelelangan +elastisitas keelastisitasan +elemen berelemen +eliminasi dieliminasi +eliminasi mengeliminasi +eliminasi tereliminasi +elite terelite +elo keelokan +elo mengelolah +elo pengelolah +elok keelokan +elu dielukan +elu memelukan +elu mengelukan +elung keelung +elus dielus +elus mengelus +elus mengelusnya +em belem +em berem +em diem +em menem +em pelem +em pereman +em seem +email diemail +emang mememangi +emang mememangkan +emang pememang +emas beremas +emas keemasan +emas mengemas +emas mengemasi +emas mengemaskan +emas mengemasnya +emas pelemasan +emas pengemas +emas pengemasan +emat menemati +emat mengemat +emat menyemat +emat menyematkan +emat menyematkannya +emat pengematan +emat penyematan +embah menembah +embah menembahkan +embah menyembah +embah menyembahnya +embah penembahan +embah penyembah +embah penyembahan +embak menembak +embak menembakan +embak menembaki +embak menembakkan +embak menembakkannya +embak menembaknya +embak mengembakan +embak penembak +embak penembakan +embak penembakkan +embak penembaknya +emban diemban +emban diembankan +emban diembannya +emban mengemban +emban mengembankan +emban mengembannya +emban pengemban +emban pengembanan +embara mengembara +embara pengembara +embara pengembaraan +embargo diembargo +embargo mengembargo +embat diembat +ember seember +embik mengembik +embok menembok +embok penembokan +embuh menembuh +embuh menyembuh +embuh menyembuhkan +embuh menyembuhkannya +embuh penyembuh +embuh penyembuhan +embun berembun +embun mengembun +embun pengembunan +embung mengembung +embus berembus +embus berembusnya +embus diembuskan +embus menembus +embus menembuskan +embus menembusnya +embus mengembuskan +embus penembus +embus penembusan +embut menyembut +embut menyembutkan +embut pelembut +emigrasi beremigrasi +emir keemiran +emir menyemir +emir penyemir +emis beremisi +emis mengemis +emis mengemisnya +emis pengemis +emisi beremisi +emong mengemong +empal menyempal +empar keempar +empar mengemparkan +empar pelempar +empar pelemparan +empas diempas +empas diempaskan +empas mengempas +empas mengempaskan +empas terempas +empat berempat +empat berempati +empat diempat +empat keempat +empat keempatan +empat keempatnya +empat menempat +empat menempatan +empat menempati +empat menempatkan +empat menempatkannya +empat menyempatkan +empat penempat +empat penempatan +empat perempat +empat perempatan +empat perempatnya +empati berempati +empati menempati +empati menempatinya +empu keempukan +empu perempuan +empuan perempuan +empuan perempuanlah +empuan perempuannya +empuk keempukan +empuk mengempukkan +emulsi pengemulsi +emut mengemut +emut menyemut +emut menyemuti +en been +en belen +en dien +en keen +en keenan +en memen +en mengeni +en peen +en penen +en pengen +en pengennya +en peren +en seen +enak keenakan +enak mengenak +enak mengenakan +enak mengenakkan +enak seenak +enak seenaknya +enak terenak +enam berenam +enam dienam +enam keenam +enam keenamnya +enas mengenasi +enas mengenaskan +encang mengencang +encang mengencangkan +encang mengencangkannya +encang pengencang +encang pengencangan +encer diencerkan +encer mengencerkan +encer pengencer +encer pengenceran +endal pengendali +endang menendang +endang menendangi +endang menendangkan +endang menendangnya +endang penendang +endang penendangan +endang penendangnya +endap diendapkan +endap mengendap +endap mengendapkan +endap mengendapnya +endap pengendapan +endap terendap +endong mengendong +endus diendus +endus mengendus +endus mengendusnya +endus pengendus +endus pengendusan +endus terendus +endus terendusnya +energi berenergi +engah menengah +engah menengahi +engah menengahkan +engah menengahnya +engah mengengah +engah penengah +engah penengahan +engah penengahnya +engah terengah +engas menengaskan +enggak menenggak +enggak menenggaknya +enggak penenggak +enggak seenggaknya +enggan keengganan +enggang menenggang +enggang perenggangan +engsel berengsel +enkripsi dienkripsi +enkripsi mengenkripsi +enkripsi terenkripsi +entah mementahkan +entah mementahkannya +entak mengentak +entak menyentak +entak menyentakkan +entak perentak +entas dientas +entas dientaskan +entas mementaskan +entas mengentas +entas mengentaskan +entas pementasan +entas pengentasan +entas perentas +entas terentaskan +enteng menenteng +enteng mengentengkan +enyah dienyahkan +enyah mengenyahkan +enyak terenyak +epak mengepak +epak mengepakan +epak mengepakkan +epak menyepak +epak menyepaknya +epak pengepakan +epik menepikan +epos mengepos +epos mengeposkan +er beer +er beeri +er beler +er dier +er meer +er memerkan +er meneri +er mengeri +er peer +er pemeran +er pener +er pengeran +er penyeran +er seer +era diera +era keera +era menerakan +era mengerakan +era menyerakan +era peneraan +era perera +erak menerakan +erak mengerak +erak mengerakan +erak mengerakkan +erak menyerakan +erak pengerak +eram mengeram +eram mengerami +eram menyeramkan +eram pengeraman +erang belerang +erang belerangnya +erang memerangi +erang menerangan +erang menerangi +erang menerangkan +erang menerangkannya +erang mengerang +erang menyerang +erang menyerangan +erang menyerangkan +erang menyerangnya +erang pemerangan +erang penerang +erang penerangan +erang pengerang +erang penyerang +erang penyerangan +erang penyerangnya +erat keeratan +erat mengerat +erat mengeratkan +erat menyerat +erat pemeratan +erat pengerat +erat pererat +erata memeratakan +erata pemerataan +ereksi berereksi +eret menyeret +eret menyeretnya +eret penyeret +eret penyeretan +erik memerikan +erik menerikan +erik menerikkan +erik mengerik +erik mengerikan +ering mengering +ering mengeringkan +ering mengeringkannya +ering mengeringnya +ering peering +ering pengering +ering pengeringan +erong menyerong +eror meneror +eror menerornya +eror peneror +eror peneroran +erosi mengerosi +erosi tererosi +erpak menerpakan +erti mengerti +erti mengertilah +erti mengertinya +erti pengertian +erti seerti +eru menyeru +eru menyerukan +eru menyerukannya +eru pengerukan +eru pengerukannya +eru penyeru +erupsi bererupsi +es bees +es beres +es beresi +es bereskan +es beresnya +es dies +es kees +es mees +es memes +es memesan +es menes +es pemesan +es peres +es sees +esa keesaan +esa mengesakan +esa menyesakan +esa teresa +esai menyesaikan +esai penyesaian +esak mengesakan +esak menyesak +esak menyesakan +esak menyesaki +esak menyesakkan +eskalasi bereskalasi +eskalasi dieskalasi +eskalasi mengeskalasi +esok keesokan +esok keesokkan +estafet diestafetkan +ester meester +estetika berestetika +estimasi diestimasi +estimasi diestimasikan +estimasi mengestimasi +estimasi mengestimasikan +eta keeta +eta memetakan +eta memetakannya +eta mengetakan +eta menyetakan +eta peletakan +eta peletakannya +eta pemetaan +eta penyetakan +etek menetek +eter dieter +eter meneteri +eter peeter +etik memetik +etik memetiknya +etik mengetik +etik mengetikan +etik mengetikkan +etik mengetiknya +etik pemetik +etik pemetikan +etik pengetik +etik pengetikan +etika beretika +etika memetika +etnik beretnik +etnis beretnis +etos beretos +euforia bereuforia +eutanasia dieutanasia +evakuasi dievakuasi +evakuasi dievakuasinya +evakuasi mengevakuasi +evakuasi mengevakuasikan +evakuasi mengevakuasinya +evakuasi pengevakuasi +evakuasi pengevakuasian +evakuasi terevakuasi +evaluasi dievaluasi +evaluasi mengevaluasi +evaluasi mengevaluasinya +evaluasi pengevaluasian +evaluasi terevaluasi +evolusi berevolusi +evolusi mengevolusi +fa befa +fa difa +fa kefa +fa sefa +fabel difabel +faedah berfaedah +faktor memfaktorkan +falsafah berfalsafah +fanatik kefanatikan +fantasi berfantasi +fantastis sefantastis +farmasi kefarmasian +fasih kefasihan +fasilitas berfasilitas +fasilitas difasilitas +fasilitas difasilitasi +fasilitas memfasilitas +fasilitas memfasilitasi +fasilitas menfasilitasi +fasilitas mengfasilitasi +fasilitas terfasilitasi +fatal kefatalan +fatwa berfatwa +fatwa difatwa +fatwa difatwakan +fatwa memfatwakan +favorit difavoritkan +favorit difavoritkannya +favorit memfavoritkan +favorit terfavorit +favorit terfavoritnya +fenomenal sefenomenal +fermentasi berfermentasi +fermentasi difermentasi +fermentasi difermentasikan +fermentasi memfermentasi +fermentasi terfermentasi +festival difestivalkan +fi difi +fi kefi +fi sefi +fiksasi difiksasi +film difilmkan +film memfilmkan +film memfilmkannya +film perfilman +filosofi berfilosofi +filter berfilter +filter difilter +filter memfilter +filter pemfilteran +final difinal +final difinalkan +final kefinal +final memfinalkan +firasat berfirasat +firman berfirman +fisik berfisik +fitnah difitnah +fitnah memfitnah +fitnah memfitnahnya +fitnah menfitnah +fitnah pemfitnah +fitnah pemfitnahan +fitnah terfitnah +fleksibel sefleksibel +fluktuasi berfluktuasi +fluktuasi berfluktuasinya +fluktuatif berfluktuatif +fokus berfokus +fokus berfokuslah +fokus difokuskan +fokus memfokuskan +fokus menfokuskan +fokus mengfokuskan +fokus pemfokusan +fokus terfokus +fokus terfokusnya +formal diformalkan +formal memformalkan +formalin berformalin +formalin diformalin +forman performan +forman performannya +format berformat +format diformat +format memformat +formulasi diformulasi +formulasi diformulasikan +formulasi memformulasi +formulasi memformulasikan +forsir diforsir +forsir memforsir +fortifikasi difortifikasi +foto berfoto +foto difoto +foto difotonya +foto memfoto +foto memfotonya +foto terfoto +fotokopi difotokopi +fotokopi memfotokopi +fotosintesis berfotosintesis +fragmentasi terfragmentasi +fraksi difraksi +fraksi sefraksinya +frekuensi berfrekuensi +frustrasi kefrustrasian +fundamental berfundamental +fungi berfungi +fungsi befungsi +fungsi berfungsi +fungsi berfungsinya +fungsi difungsi +fungsi difungsikan +fungsi difungsikannya +fungsi memfungsikan +fungsi memfungsikannya +fungsi mengfungsikan +fungsional difungsionalkan +fusi berfusi +fusi difusi +gabai mengabaikan +gabai mengabaikannya +gabai pengabaian +gabung begabung +gabung bergabung +gabung bergabunglah +gabung bergabungnya +gabung digabung +gabung digabungkan +gabung digabungkannya +gabung digabungnya +gabung mengabungkan +gabung menggabung +gabung menggabungan +gabung menggabungkan +gabung menggabungkannya +gabung pengabungan +gabung penggabung +gabung penggabungan +gabung tergabung +gabung tergabungnya +gada digadai +gada megadakan +gada mengada +gada mengadakan +gada mengadakannya +gada menggadai +gada menggadakan +gada pengada +gada pengadaan +gada penggadaan +gada penggadai +gada tergadai +gadai digadai +gadai digadaikan +gadai digadaikannya +gadai mengadaikan +gadai menggadai +gadai menggadaikan +gadai menggadaikannya +gadai pegadaian +gadai pengadaian +gadai penggadai +gadai penggadaian +gadai pergadaian +gadai tergadai +gadai tergadaikan +gadang begadang +gadang bergadang +gadang digadang +gadang digadangkan +gadang mengadang +gadang mengadangnya +gadang menggadang +gadang pegadang +gadang pengadang +gadang pengadangan +gadang pergadangan +gading bergading +gadis kegadisan +gaduh kegaduhan +gaduh mengaduh +gaduh penggaduh +gaduk mengaduk +gaduk mengadukan +gaduk mengaduknya +gaduk pengaduk +gaduk pengadukan +gadung mengadung +gadung pegadungan +gadungan pegadungan +gaet digaet +gaet digaetnya +gaet mengaet +gaet menggaet +gaet menggaetnya +gaga mengaga +gagah digagahi +gagah kegagahan +gagah menggagahi +gagah segagah +gagal digagalkan +gagal digagalkannya +gagal kegagalan +gagal mengagalkan +gagal menggagalkan +gagal menggagalkannya +gagal penggagalan +gagang bergagang +gagap kegagapan +gagap menggagap +gagap tergagap +gagas digagas +gagas digagasnya +gagas mengagas +gagas menggagas +gagas pengagas +gagas penggagas +gagas penggagasnya +gagu menggagu +gah begah +gah megah +gah megahnya +gah mengah +gahar kegaharan +gahar segahar +gaib kegaiban +gail mengail +gain megain +gairah bergairah +gairah bergairahnya +gairah kegairahan +gairah mengairahkan +gairah menggairahkan +gajak mengajak +gajak mengajakan +gajak mengajaknya +gaji bergaji +gaji digaji +gaji digajinya +gaji mengaji +gaji mengajinya +gaji menggaji +gaji menggajinya +gaji pengajian +gaji penggajian +gala digalakan +gala mengalai +gala mengalakan +gala menggala +gala menggalakan +gala penggalakan +gala segala +gala segalanya +gala-gala segala-galanya +galah megalahkan +galah mengalah +galah mengalahan +galah mengalahkan +galah mengalahkannya +galah menggalahkan +galai mengalai +galak digalakan +galak digalakkan +galak digalakkannya +galak mengalakan +galak mengalakkan +galak menggalakan +galak menggalakkan +galak penggalakan +galak penggalakkan +galak segalak +galan mengalani +galan menggalan +galan penggalan +galan penggalannya +galang digalang +galang digalangkan +galang digalangnya +galang mengalang +galang mengalangi +galang menggalang +galang menggalangkan +galang pengalangan +galang penggalang +galang penggalangan +galang tergalang +galar menggalar +galau kegalauan +galau mengalau +galeng pengalengan +gali digali +gali digalinya +gali mengali +gali mengalikan +gali menggali +gali menggalinya +gali pengali +gali pengalian +gali penggali +gali penggalian +gali tergali +galih mengalih +galih mengalihan +galih mengalihkan +galih mengalihkannya +galih pengalih +galih pengalihan +galir mengalir +galir mengaliri +galir mengalirkan +galir mengalirkannya +galir mengalirlah +galir mengalirnya +galir pengalir +galir pengaliran +galon segalon +galuh megaluh +gam megaman +gam megami +gam mengaman +gam mengami +gam mengamkan +gam pengaman +gama bergama +gama kegamaan +gama mengamakan +gama pengamaan +gama segamai +gamak mengamakan +gamal mengamali +gamal mengamalkan +gamal mengamalkannya +gamal pengamal +gamal pengamalan +gamam pengamaman +gaman megaman +gaman megamankan +gaman mengaman +gaman mengamanan +gaman mengamankan +gaman mengamankannya +gaman pegamanan +gaman pengaman +gaman pengamanan +gaman pengamankan +gaman pengamannya +gamang kegamangan +gamat mengamati +gamat mengamatkan +gamat pengamat +gamat pengamatan +gamat pengamatnya +gambang mengambang +gambang mengambangkan +gambang mengambangnya +gambang pengambang +gambang pengambangan +gambar bergambar +gambar bergambarkan +gambar digambar +gambar digambari +gambar digambarkan +gambar digambarkannya +gambar digambarnya +gambar mengambar +gambar mengambarkan +gambar menggambar +gambar menggambari +gambar menggambarkan +gambar menggambarkannya +gambar menggambarnya +gambar penggambar +gambar penggambaran +gambar tergambar +gambar tergambarkan +gambir pegambiran +gambir pengambiran +gamblang segamblang +gambut bergambut +gamis bergamis +gamit menggamit +gampang menggampangkan +gampang segampang +gampar digampar +gampar menggampar +gana menganai +gana menganakan +gana pengana +ganal menganal +ganas keganasan +ganas mengganas +ganas mengganasnya +ganas seganas +ganas terganas +ganda berganda +ganda digandakan +ganda kegandaan +ganda mengandakan +ganda mengganda +ganda menggandakan +ganda menggandakannya +ganda pengandaan +ganda pengganda +ganda penggandaan +gandal mengandalkan +gandal mengandalkannya +gandal menggandalkan +gandar pengandaran +gandeng bergandeng +gandeng bergandengan +gandeng digandeng +gandeng digandengkan +gandeng digandengnya +gandeng mengandeng +gandeng menggandeng +gandeng menggandengan +gandeng menggandengkan +gandeng menggandengnya +gandi pegandikan +gandik pegandikan +gandrung digandrungi +gandrung kegandrungan +gandrung mengandrungi +gandrung menggandrungi +gandung megandung +gandung mengandung +gandung mengandungnya +gandung menggandung +gang megang +gang memgang +gang pegang +gang pegangan +gang peganglah +gang pegangnya +gang pemgang +gang pengang +gang pengangan +ganggu diganggu +ganggu keganggu +ganggu menganggu +ganggu menganggukan +ganggu menganggunya +ganggu mengganggu +ganggu mengganggunya +ganggu penganggu +ganggu pengganggu +ganggu terganggu +ganggu terganggunya +gangsa pegangsaan +gangsa pengangsaan +gani mengani +gani segani +ganjal diganjal +ganjal keganjalan +ganjal menganjal +ganjal mengganjal +ganjal mengganjalnya +ganjal pengganjal +ganjal pengganjalan +ganjal terganjal +ganjal terganjalnya +ganjar diganjar +ganjar diganjarkan +ganjar menganjar +ganjar mengganjar +ganjar mengganjarnya +ganjil keganjilan +ganjur menganjurkan +ganjur menganjurkannya +ganjur penganjur +ganjur penganjuran +gantang menggantang +gantar mengantar +gantar mengantarkan +gantar mengantarkannya +gantar mengantarnya +gantar pengantar +gantar pengantaran +gantar pengantarnya +ganteng kegantengan +ganteng seganteng +ganteng terganteng +gantung bergantung +gantung bergantungan +gantung bergantungnya +gantung digantung +gantung digantungi +gantung digantungkan +gantung digantungnya +gantung mengantung +gantung mengantungi +gantung mengantungkan +gantung menggantung +gantung menggantungkan +gantung menggantungkannya +gantung menggantungnya +gantung pegantungan +gantung penggantung +gantung penggantungan +gantung tergantung +gantung tergantungnya +ganyang diganyang +ganyang mengganyang +ganyang pengganyangan +gap menggap +gap menggapi +gap pengap +gap pengapnya +gapai digapai +gapai digapainya +gapai mengapai +gapai menggapai +gapai menggapainya +gapai tergapai +gapit mengapit +gapit mengapitnya +gapit pengapit +gar megar +gar menggarkan +gar penggaran +gar segar +gar segaran +gar segarkan +gar segarnya +garah megarah +garah mengarah +garah mengarahan +garah mengarahkan +garah mengarahkannya +garah mengarahnya +garah pengarah +garah pengarahan +garah pengarahnya +garai pengaraian +garam bergaram +garam digarami +garam mengaramkan +garam menggarami +garam pegaraman +garam penggaraman +garam segaram +garan penggaran +garan segaran +garang kegarangan +garang mengarang +garang pengarang +garang pengarangnya +garang segarang +garangan kegarangan +garangan kegarangannya +garansi bergaransi +garansi digaransi +garansi menggaransi +garap bergarap +garap digarap +garap digarapnya +garap mengarap +garap mengarapkan +garap menggarap +garap menggarapnya +garap penggarap +garap penggarapan +garap tergarap +garis bergaris +garis digaris +garis digariskan +garis menggaris +garis menggariskan +garis pegaris +garis penggaris +garis segaris +garong digarong +garong menggarong +garong penggarongan +garuk digaruk +garuk menggaruk +garuk menggaruknya +garuk penggaruk +garung mengarungi +garung pengarungan +gas bergas +gas digas +gas mengaskan +gas pegas +gas tergas +gasak digasak +gasak mengasak +gasak menggasak +gasing mengasing +gasing mengasingkan +gasing pegasing +gasing pengasingan +gatal kegatalan +gatal mengatalan +gaul bergaul +gaul bergaullah +gaul bergaulnya +gaul digauli +gaul menggauli +gaul pergaulan +gaun bergaun +gaun menggauni +gaung bergaung +gaung digaungkan +gaung mengaung +gaung menggaung +gaung menggaungkan +gawai megawai +gawai mengawai +gawai pegawai +gawai pegawainya +gawai pengawai +gawal mengawal +gawal mengawali +gawal mengawalnya +gawal pengawal +gawal pengawalan +gawal pengawalnya +gawan begawan +gawan pegawan +gawan pengawan +gawang digawang +gawang digawangi +gawang kegawang +gawang megawangi +gawang mengawang +gawang menggawangi +gawat kegawat +gawat kegawatan +gawat megawat +gawat megawati +gawat mengawati +gaya bergaya +gaya mengayakan +gaya pengaya +gaya pengayaan +gayam pegayaman +gayuh mengayuh +gayuh mengayuhkan +gayuh pengayuh +gayun mengayun +gayun mengayunkan +gayun mengayunkannya +ge berge +ge menge +ge menggelah +ge pege +gebang mengebangkan +geber digeber +geber mengeber +geber menggeber +geblok mengeblok +gebrak digebrak +gebrak mengebrak +gebrak menggebrak +gebrak penggebrak +gebu menggebu +gebuk digebuk +gebuk digebuki +gebuk menggebuk +gebuk menggebuki +gebuk penggebuk +gecek mengecek +gecek mengecekan +gecek mengeceknya +gecek pengecek +gecek pengecekan +gecek pengecekkan +gecer mengecer +gecer mengecerkan +gecer pengecer +gecer pengecernya +gede kegedean +gede segede +gedok digedok +gedor digedor +gedor mengedor +gedor menggedor +gedor penggedor +gedung digedung +gegabah segegabah +gegas bergegas +gegas bergegaslah +gegas mengegaskan +geger digegerkan +geger kegegeran +geger mengegerkan +geger menggegerkan +gejala bergejala +gejala menggejala +gejolak bergejolak +gejolak bergejolaknya +gel kegel +gel megel +gel pegel +gel segel +gel segelnya +gela menggela +gela pengelakan +gela segela +gelak mengelak +gelak mengelakkan +gelak mengelaknya +gelak pengelak +gelak pengelakan +gelak tergelak +gelam mengelami +gelam pengelaman +gelambir bergelambir +gelambir menggelambir +gelandang digelandang +gelandang menggelandang +gelandang menggelandangnya +gelang bergelang +gelang pegelangan +gelang pergelangan +gelantung bergelantung +gelantung bergelantungan +gelantung menggelantung +gelantung tergelantung +gelap digelapkan +gelap digelapkannya +gelap kegelapan +gelap mengelap +gelap mengelapkan +gelap mengelapnya +gelap menggelap +gelap menggelapkan +gelap pengelap +gelap pengelapan +gelap penggelap +gelap penggelapan +gelap segelap +gelap tergelap +gelar bergelar +gelar digelar +gelar digelaran +gelar digelari +gelar digelarkan +gelar digelarlah +gelar digelarnya +gelar mengelar +gelar mengelarkan +gelar menggelar +gelar menggelarkan +gelar menggelarnya +gelar pegelaran +gelar penggelar +gelar penggelaran +gelar pergelaran +gelar tergelar +gelar tergelarnya +gelas digelas +gelas mengelas +gelas pengelasan +gelas segelas +gelatak tergelatak +gelayut bergelayut +gelayut bergelayutan +gelayut digelayuti +gelayut menggelayut +gelayut menggelayuti +geledah digeledah +geledah mengeledah +geledah menggeledah +geledah menggeledahan +geledah menggeledahnya +geledah pengeledahan +geledah penggeledah +geledah penggeledahan +gelegak menggelegak +gelegar menggelegar +gelembung bergelembung +gelembung digelembungkan +gelembung menggelembung +gelembung menggelembungkan +gelembung menggelembungnya +gelembung pengelembungan +gelembung penggelembungan +geleng menggeleng +geleng menggelengkan +gelepar menggelepar +geleta bergeletakan +geletak bergeletakan +geletak bergeletakkan +geletak digeletakkan +geletak menggeletakkan +geletak tergeletak +geletak tergeletaknya +geli kegelian +geli menggelikan +geliat bergeliat +geliat bergeliatnya +geliat mengeliat +geliat menggeliat +geliat menggeliatkan +geliat menggeliatnya +gelimang bergelimang +gelimang bergelimangan +gelimpang bergelimpangan +gelincir menggelincir +gelincir menggelincirkan +gelincir tergelincir +gelincir tergelincirnya +gelinding digelindingkan +gelinding menggelinding +gelinding menggelindingkan +gelinjang menggelinjang +gelintir segelintir +gelisah kegelisahan +gelisah menggelisahkan +gelitik digelitik +gelitik mengelitik +gelitik menggelitik +gelitik menggelitiki +gelitik menggelitiknya +gelitik tergelitik +gelo mengelolah +gelo pengelolah +gelombang bergelombang +gelontor digelontor +gelontor digelontorkan +gelontor digelontorkannya +gelontor mengelontorkan +gelontor menggelontor +gelontor menggelontorkan +gelontor menggelontorkannya +gelontor penggelontoran +gelora bergelora +gelora digelorakan +gelora menggelora +gelora menggelorakan +geluk mengelukan +gelung bergelung +gelung digelung +gelut bergelut +gelut digeluti +gelut mengeluti +gelut menggeluti +gelut penggelut +gelut pergelutan +gema bergema +gema digemakan +gema menggema +gema menggemakan +gemak digemakan +gemak menggemakan +gemar digemari +gemar kegemaran +gemar menggemari +gemar pengemar +gemar pengemarnya +gemar penggemar +gemar penggemarnya +gemas mengemas +gemas mengemasi +gemas mengemaskan +gemas mengemasnya +gemas menggemaskan +gemas menggemaskannya +gemas pengemas +gemas pengemasan +gembak mengembakan +gembala digembalakan +gembala mengembala +gembala mengembalakan +gembala menggembala +gembala menggembalakan +gembala pengembala +gembala pengembalaan +gembala penggembala +gembala penggembalaan +gembar-gembor digembar-gembor +gembar-gembor digembar-gemborkan +gembar-gembor mengembar-gemborkan +gembar-gembor menggembar-gemborkan +gembil mengembil +gembira bergembira +gembira bergembiralah +gembira kegembiraan +gembira mengembirakan +gembira menggembirakan +gembira menggembirakannya +gembira pengembira +gembira penggembira +gembleng digembleng +gembleng mengembleng +gembleng menggembleng +gembleng penggemblengan +gembok digembok +gembok menggembok +gembok penggembokan +gembok tergembok +gembor digemborkan +gembor menggemborkan +gembos digembosi +gembos digemboskan +gembos mengembosi +gembos menggembosi +gembos menggemboskan +gembos pengembosan +gembos penggembos +gembos penggembosan +gembung digembungkan +gembung mengembung +gembung menggembung +gembung menggembungkan +gembung penggembungan +gembur menggemburkan +gembus mengembuskan +gemerlap segemerlap +gemilang kegemilangan +gemilang segemilang +geming bergeming +gempa kegempaan +gempar digemparkan +gempar kegemparan +gempar mengemparkan +gempar menggemparkan +gempur digempur +gempur mengempur +gempur menggempur +gempur penggempur +gempur penggempuran +gemuk digemukkan +gemuk kegemukan +gemuk kegemukkan +gemuk mengemukan +gemuk menggemuk +gemuk menggemukan +gemuk menggemukkan +gemuk penggemuk +gemuk penggemukan +gemuk penggemukkan +gemuk segemuk +gemuk tergemuk +gemuruh bergemuruh +gemuruh menggemuruh +gen bergen +gen mengeni +gen pengen +gen pengennya +gen segen +gena megenai +gena memgenai +gena mengena +gena mengenai +gena mengenakan +gena mengenakannya +gena menggenai +gena menggenakan +gena pengenaan +gena pengenai +genah mengenah +genang digenang +genang digenangi +genang mengenang +genang mengenangi +genang mengenangkan +genang mengenangnya +genang menggenang +genang menggenangi +genang penggenangan +genang tergenang +genang tergenangi +genang tergenangnya +genap digenapi +genap digenapkan +genap menggenapi +genap menggenapkan +genap menggenapkannya +genap penggenapan +genap segenap +gencar digencarkan +gencar digencarkannya +gencar mengencarkan +gencar menggencarkan +gencar segencar +gencet digencet +gencet menggencet +gencet tergencet +gendak mengendaki +gendang segendang +gendar mengendari +gendar pengendar +gendar pengendaran +gendong digendong +gendong digendongnya +gendong mengendong +gendong menggendong +gendong menggendongnya +gendut kegendutan +generalisasi digeneralisasi +generalisasi digeneralisasikan +generalisasi mengeneralisasi +generalisasi mengeneralisasikan +generalisasi menggeneralisasi +generalisasi menggeneralisasikan +generasi bergenerasi +generasi segenerasi +generasi segenerasinya +geng begeng +geng megengan +genggam digenggam +genggam digenggaman +genggam digenggamnya +genggam mengenggam +genggam menggenggam +genggam menggenggamnya +genggam segenggam +genggam tergenggam +gengsi bergengsi +gengsi bergengsinya +genit kegenitan +genius kegeniusan +genjot digenjot +genjot digenjotnya +genjot mengenjot +genjot menggenjot +genjot menggenjotnya +genjot penggenjot +genjot penggenjotan +genre bergenre +gentar kegentaran +gentar menggentarkan +gentas mengentas +gentas mengentaskan +gentas pengentasan +gentayang bergentayangan +gentian pengentian +genting kegentingan +genting segenting +gepok segepok +gera bergera +gera bergerakan +gera digerai +gera digerakan +gera mengerakan +gera menggerai +gera menggerakan +gera menggerakannya +gera pegerakan +gera penggerakan +gera pergerakan +gera pergerakannya +gera segera +gera segerakan +gera segeralah +gera segeranya +gera tergerai +gerah kegerahan +gerah mengerah +gerah mengerahkan +gerah mengerahkannya +gerah menggerahkan +gerah pengerah +gerah pengerahan +gerai digerai +gerai menggerai +gerai tergerai +gerak begerak +gerak bergerak +gerak bergerakan +gerak bergeraklah +gerak bergeraknya +gerak digerakan +gerak digerakkan +gerak mengerak +gerak mengerakan +gerak mengerakkan +gerak menggerak +gerak menggerakan +gerak menggerakkan +gerak menggerakkannya +gerak pegerakan +gerak pengerak +gerak penggerak +gerak penggerakan +gerak penggeraknya +gerak pergerakan +gerak pergerakkan +gerak pergerakkannya +gerak segerakan +gerak tergerak +geram kegeraman +geram mengeram +geram mengerami +geram menggeram +geram pengeraman +geraman kegeraman +geraman kegeramannya +geraman pengeraman +gerang mengerang +gerang pengerang +gerat mengerat +gerat mengeratkan +gerat pengerat +gerayang digerayangi +gerayang menggerayangi +gerebek digerebek +gerebek digerebeknya +gerebek mengerebek +gerebek menggerebek +gerebek menggerebeknya +gerebek pengerebekan +gerebek penggerebekan +gerebek penggerebekkan +gerek mengerek +gerek menggerek +gerek pengerek +gerek penggerek +gerek penggerekan +gerek pergerekan +geret digeret +geret menggeret +gergaji digergaji +gergaji mengergaji +gergaji menggergaji +gergaji penggergajian +gerigi bergerigi +gerilya bergerilya +gerinda digerinda +gering mengering +gering mengeringkan +gering mengeringkannya +gering mengeringnya +gering pengering +gering pengeringan +gerobak segerobak +gerogot digerogoti +gerogot mengerogoti +gerogot menggerogoti +gerogot penggerogotan +gerogot tergerogoti +gerombol bergerombol +gerombol bergerombolan +gerombol segerombol +gerombol segerombolan +geros mengerosi +gersang kegersangan +gertak digertak +gertak menggertak +gertak menggertakkan +gertak penggertak +geru pengerukan +geru pengerukannya +geruh mengeruh +geruh mengeruhkan +gerupuk pengerupukan +gerus digerus +gerus mengerus +gerus menggerus +gerus penggerus +gerus penggerusan +gerus tergerus +gerus tergerusnya +gerut mengerut +gerut mengerutkan +gerut pengerutan +gerutu menggerutu +gerutu penggerutu +gesa mengesakan +gesa tergesa +gesek bergesek +gesek bergesekan +gesek bergesekkan +gesek digesek +gesek menggesek +gesek menggesekan +gesek menggesekkan +gesek penggesek +gesek pergesekan +gesek tergesek +geser bergeser +geser bergesernya +geser digeser +geser digesernya +geser mengeser +geser menggeser +geser menggeserkan +geser menggesernya +geser pegeseran +geser penggeseran +geser pergeseran +geser tergeser +geser tergeserkan +geser tergesernya +gesit kegesitan +gesit segesit +geta mengetakan +getah bergetah +getah mengetahi +getar bergetar +getar bergetarnya +getar digetarkan +getar mengetarkan +getar menggetarkan +getar penggetar +getar tergetar +getas pengetasan +getik mengetik +getik mengetikan +getik mengetikkan +getik mengetiknya +getik pengetik +getik pengetikan +getir kegetiran +getok digetok +getok mengetok +getok menggetok +getok pengetokan +getu mengetukan +getuk mengetuk +getuk mengetukan +getuk mengetukkan +getuk mengetuknya +getuk pengetuk +gi begi +gi begian +gi belgi +gi belgian +gi digi +gi megi +gi mengi +gi pegi +gi pergi +gi pergilah +gi perginya +gi segi +gi seginya +giat bergiat +giat digiatkan +giat kegiatan +giat menggiatkan +giat mengiatkan +giat pegiat +giat pegiatnya +giat penggiat +giat penggiatnya +giat pengiat +gidik bergidik +gigi bergigi +gigih kegigihan +gigil menggigil +gigil mengigil +gigit digigit +gigit digigiti +gigit digigitnya +gigit menggigit +gigit menggigiti +gigit menggigitnya +gigit mengigit +gigit mengigitnya +gigit penggigit +gigit penggigitan +gigit tergigit +gilang mengilang +gilang mengilangkan +gilang penggilangan +gilang pengilangan +gilap mengilap +gilap mengilapnya +gilas digilas +gilas menggilas +gilas mengilas +gilas tergilas +giling digiling +giling menggiling +giling menggilingnya +giling penggiling +giling penggilingan +gilir bergilir +gilir bergiliran +gilir digilir +gilir menggilir +gilir penggiliran +gilir pergiliran +gin begin +gin begini +gin menginkan +gin pengin +gin penginnya +gin segini +gincu bergincu +gips digips +gir mengiri +gir pengiran +gir segiri +girang kegirangan +giri mengiri +giri mengirikan +giri pegirian +giri pegirikan +giri segiri +girik mengirikan +girik pegirikan +girikan mengirikan +girikan pegirikan +giring digiring +giring digiringnya +giring menggiring +giring menggiringnya +giring mengiring +giring mengiringi +giring penggiring +giring penggiringan +giring pengiring +giring pengiringan +giring pengiringnya +giring tergiring +giris mengiris +giris mengirisnya +giris pengiris +gisik mengisikan +gitar bergitar +gitar mengitari +giur menggiurkan +giur mengiur +giur mengiurkan +giur tergiur +gizi bergizi +gizi mengizikan +gizi pergizi +glamor keglamoran +global mengglobal +global mengglobalkan +global menglobal +gobar mengobarkan +gobar pengobar +gocek menggocek +gocek mengocek +goda digoda +goda menggoda +goda menggodanya +goda mengoda +goda penggoda +goda tergoda +godok digodok +godok menggodok +godok menggodoknya +godok mengodok +godok penggodok +godok penggodokan +goel digoel +gojek mengojek +gojek pengojek +gojlok digojlok +gokar pegokar +golak bergolak +golak bergolaknya +golak pergolakan +golek tergolek +golf pegolf +golok mengolok +golok mengoloknya +golong bergolongan +golong digolongkan +golong menggolongkan +golong menggolongkannya +golong mengolongi +golong penggolongan +golong segolongan +golong tergolong +gom bergomi +gondol digondol +gondol menggondol +gondol mengondol +gondol penggondol +gong digong +gonggong menggonggong +gonta-ganti bergonta-ganti +gonta-ganti digonta-ganti +gonta-ganti menggonta-ganti +gorek mengorek +gorek mengoreknya +gorek pengorek +gorek pengorekan +goreng bergoreng +goreng digoreng +goreng menggoreng +goreng menggorengnya +goreng penggorengan +gores digores +gores digoreskan +gores menggores +gores menggoreskan +gores tergores +gorok digorok +gorok menggorok +gorok mengorok +gorok penggorokan +gorok tergorok +gosip bergosip +gosip digosipkan +gosip menggosip +gosip menggosipkan +gosip penggosip +gosong mengosongi +gosong mengosongkan +gosong mengosongkannya +gosong pengosongan +gotong bergotong +gotong digotong +gotong menggotong +gotong menggotongnya +goyah digoyahkan +goyah kegoyahan +goyah menggoyah +goyah menggoyahkan +goyah mengoyahkan +goyah tergoyah +goyah tergoyahkan +goyak mengoyak +goyang bergoyang +goyang digoyang +goyang digoyangkan +goyang kegoyangan +goyang menggoyang +goyang menggoyangkan +goyang menggoyangkannya +goyang menggoyangnya +goyang mengoyang +goyang tergoyang +grad belgrad +gradasi bergradasi +granat digranat +granat penggranatan +gratis digratiskan +gratis digratiskannya +gratis menggratiskan +gratis menggratiskannya +gratis mengratiskan +gratis penggratisan +gravitas bergravitasi +gravitasi bergravitasi +grup segrup +gu begu +gu megu +gu menggu +gu menggukan +gu pengguan +gu penggunya +gu segui +gua diguakan +gua mengguakan +gua penggua +gua pengguaan +gua penguakan +guar menguar +guar menguarkan +gubah digubah +gubah megubah +gubah menggubah +gubah mengubah +gubah mengubahnya +gubah penggubah +gubah pengubah +gubah pengubahan +gubernur kegubernuran +gubris digubris +gubris digubrisnya +gubris menggubris +gubris menggubrisnya +gubris mengubris +gubuk digubuk +gudang digudang +gudang digudangkan +gudang menggudangkan +gudang mengudang +gudang pegudang +gudang penggudangan +gudang pergudangan +gudang segudang +gudangan penggudangan +gudangan pergudangan +gue begue +gugah digugah +gugah menggugah +gugah mengugah +gugah penggugah +gugah tergugah +gugat digugat +gugat digugatnya +gugat menggugat +gugat menggugatnya +gugat mengugat +gugat penggugat +gugat penggugatan +gugat penggugatnya +gugat pengugat +gugat tergugat +gugat tergugatnya +gugu digugu +gugup kegugupan +gugur berguguran +gugur digugurkan +gugur digugurkannya +gugur keguguran +gugur menggugurkan +gugur menggugurkannya +gugur mengugurkan +gugur penggugur +gugur pengguguran +gul digul +gul mengguli +gula bergula +gula pergulaan +gulat bergulat +gulat pegulat +gulat pergulatan +guli mengguli +guling berguling +guling bergulingan +guling digulingkan +guling digulingkannya +guling mengguling +guling menggulingan +guling menggulingkan +guling menggulingkannya +guling mengulingkan +guling pengguling +guling penggulingan +guling terguling +guling tergulingnya +gulir begulir +gulir bergulir +gulir bergulirnya +gulir digulir +gulir digulirkan +gulir digulirkannya +gulir digulirnya +gulir menggulir +gulir menggulirkan +gulir menggulirkannya +gulir mengulirkan +gulir pengguliran +gulir perguliran +gulung bergulung +gulung digulung +gulung menggulung +gulung menggulungnya +gulung penggulung +gulung segulung +gulung tergulung +gum begum +gum megumi +gum mengumkan +gum penguman +gumam bergumam +gumam menggumam +gumam menggumamkan +gumam pengumaman +gumbar mengumbar +gumbar mengumbarnya +gumpal bergumpal +gumpal menggumpal +gumpal menggumpalkan +gumpal penggumpalan +gumpal segumpal +gumuk mengumukan +gumul bergumul +gumul mengumulkan +gumul pergumulan +gumun mengumunkan +gumun pengumunan +gun begun +gun digunkan +gun menggunan +gun menggunkan +gun penggun +gun penggunan +gun penguni +gun segun +gun seguni +guna beguna +guna berguna +guna bergunanya +guna diguna +guna digunaan +guna digunakan +guna digunakannya +guna kegunaan +guna mengguna +guna menggunaan +guna menggunakan +guna menggunakannya +guna mengunakan +guna mengunakannya +guna pengguna +guna penggunaan +guna penggunakan +guna penggunanya +guna penguna +guna pengunaan +guna pengunanya +guna pergunakan +guncang berguncang +guncang diguncang +guncang keguncangan +guncang mengguncang +guncang mengguncangkan +guncang mengguncangnya +guncang menguncang +guncang terguncang +guncang terguncangnya +gunci mengunci +gunci menguncinya +gunci pengunci +gunci penguncian +gundah kegundahan +gundah mengundah +gundal begundal +gundang menggundang +gundang mengundang +gundang mengundangkan +gundang mengundangnya +gundang pengundang +gundang pengundangan +gundang pengundangnya +gundi mengundi +gundi pengundian +gundi pergundikan +gundik pergundikan +gundu mengundukan +gunduk mengundukan +gundul digunduli +gundul kegundulan +gundul menggunduli +gundul penggundulan +gung menggung +gung mengungkan +gung penggung +gung pengungi +gung pergung +gunjing bergunjing +gunjing digunjingkan +gunjing menggunjing +gunjing menggunjingkan +gunjing pergunjingan +gunting digunting +gunting menggunting +gunting mengguntingnya +gunting pengguntingan +guntung mengguntungkan +guntung menguntung +guntung menguntungan +guntung menguntungkan +guntung menguntungkannya +gunung bergunung +gunung menggunung +gunung menggunungnya +gunung pegunungan +gunung penggunungan +gunung pengunung +gunung pengunungan +gunung pergunungan +gunung segunung +gurat diguratkan +gurat mengguratkan +gurat tergurat +gurau bergurau +gurita menggurita +gurita mengguritanya +guru berguru +guru digurui +guru keguruan +guru menggurui +guru peguruan +guru pengurukan +guru perguruan +guruk menguruk +guruk pengurukan +gurun mengurunkan +gurung mengurung +gurung mengurungi +gurung mengurungkan +gurung mengurungkannya +gurung mengurungnya +gurung pengurungan +gusah pengusah +gusah pengusahan +gusar kegusaran +gusar menggusarkan +gusi pengusian +gusul mengusul +gusul mengusulan +gusul mengusulkan +gusul mengusulkannya +gusul pengusul +gusul pengusulan +gusul pengusulnya +gusur digusur +gusur digusurnya +gusur menggusur +gusur menggusurnya +gusur mengusur +gusur penggusur +gusur penggusuran +gusur pengusuran +gusur pergusuran +gusur tergusur +gusur tergusurnya +gutuk mengutuk +gutuk mengutuknya +gutuk pengutukan +guyon berguyon +guyub keguyuban +guyub peguyuban +guyur diguyur +guyur diguyurkan +guyur mengguyur +guyur mengguyuri +guyur mengguyurkan +guyur mengguyurnya +guyur menguyur +guyur terguyur +ha beha +ha meha +ha penha +ha seha +habis dihabisi +habis dihabiskan +habis dihabiskannya +habis kehabisan +habis mengabiskan +habis menghabisi +habis menghabiskan +habis menghabiskannya +habis penghabisan +habis sehabis +habitat berhabitat +habitat kehabitatnya +had berhad +had terhadan +had terhadi +hadap berhadap +hadap berhadapan +hadap dihadap +hadap dihadapan +hadap dihadapi +hadap dihadapkan +hadap kehadapan +hadap mengadapi +hadap menghadap +hadap menghadapi +hadap menghadapkan +hadap menghadapkannya +hadap menghadapnya +hadap menhadapi +hadap terhadap +hadap terhadapan +hadap terhadapi +hadap terhadapnya +hadiah berhadiah +hadiah dihadiahi +hadiah dihadiahkan +hadiah menghadiahi +hadiah menghadiahkan +hadiah menghadiahkannya +hadir dihadir +hadir dihadiri +hadir dihadirkan +hadir dihadirkannya +hadir kehadiran +hadir menghadir +hadir menghadiri +hadir menghadirkan +hadir menghadirkannya +hadir menhadiri +hadir menhadirkan +hadir penghadiran +hadirat kehadirat +hafal dihafal +hafal dihafalkan +hafal menghafal +hafal menghafalkan +hafal menghafalnya +hafal penghafal +hail berhail +haj belhaj +haj berhaji +hajar dihajar +hajar menghajar +hajar menghajarnya +hajat dihajat +hajat dihajatkan +haji berhaji +haji menghajikan +haji perhajian +hak berhak +hak sehak +hakim dihakimi +hakim kehakiman +hakim menghakimi +hakim penghakiman +hal berhal +hal menhali +hala berhala +halal berhalal +halal dihalalkan +halal kehalalan +halal menghalalkan +halaman berhalaman +halaman dihalaman +halaman sehalaman +halang berhalangan +halang dihalang +halang dihalangi +halang menghalang +halang menghalangi +halang penghalang +halang penghalangan +halang penghalangnya +halang terhalang +halang terhalangi +halang terhalangnya +halau berhalauan +halau dihalau +halau dihalaunya +halau menghalau +halau menghalaunya +halau penghalau +halau penghalauan +halau terhalau +haluan berhaluan +haluan sehaluan +halus dihaluskan +halus kehalusan +halus menghaluskan +halus penghalus +halus penghalusan +halus sehalus +halus terhalus +halusinasi berhalusinasi +ham memhami +hamba menghamba +hamba penghambaan +hambar menghambar +hambat dihambat +hambat menghambat +hambat menghambatnya +hambat penghambat +hambat penghambatan +hambat penghambatnya +hambat terhambat +hambat terhambatnya +hambur berhambur +hambur berhamburan +hambur dihamburkan +hambur menghambur +hambur menghamburkan +hambur menghamburkannya +hambur penghamburan +hambur terhambur +hamil dihamili +hamil kehamilan +hamil menghamili +hampa kehampaan +hampar dihampar +hampar dihamparkan +hampar menghampar +hampar menghamparkan +hampar terhampar +hampir dihampir +hampir dihampiri +hampir menghampir +hampir menghampiri +hancur dihancurkan +hancur dihancurkannya +hancur kehancuran +hancur menghancur +hancur menghancuran +hancur menghancurkan +hancur menghancurkannya +hancur menhancurkan +hancur penghancur +hancur penghancuran +hancur penghancurkan +hang mehang +hangat dihangatkan +hangat kehangatan +hangat menghangat +hangat menghangatkan +hangat menghangatkannya +hangat menghangatnya +hangat penghangat +hangat penghangatan +hangat sehangat +hangat terhangat +hangus dihanguskan +hangus menghanguskan +hangus penghangusan +hantam dihantam +hantam dihantamkan +hantam dihantamnya +hantam menghantam +hantam menghantamkan +hantam menghantamkannya +hantam menghantamnya +hantam terhantam +hantar dihantar +hantar dihantarkan +hantar menghantar +hantar menghantarkan +hantar menghantarkannya +hantar penghantar +hantar penghantaran +hantu berhantu +hantu dihantui +hantu menghantui +hanyut dihanyutkan +hanyut menghanyutkan +hanyut menghanyutkannya +hanyut terhanyut +hap berhap +hap menghapi +hap perhapi +hap terhap +hapus dihapus +hapus dihapuskan +hapus dihapuskannya +hapus dihapusnya +hapus menghapus +hapus menghapuskan +hapus menghapuskannya +hapus menghapusnya +hapus penghapus +hapus penghapusan +hapus terhapus +hapus terhapuskan +hapus terhapusnya +hara berhara +hara diharakan +hara pengharaan +harak diharakan +haram diharamkan +haram diharamkannya +haram keharaman +haram mengharamkan +haram mengharamkannya +haram pengharaman +hardik dihardik +hardik menghardik +hardik menghardiknya +harga beharga +harga berharga +harga berharganya +harga diharga +harga dihargai +harga dihargakan +harga menghargai +harga penghargaan +harga perhargaan +harga seharga +hari behari +hari berhari +hari dihari +hari kehari +hari perhari +hari perharian +hari perharinya +hari sehari +hari seharian +hari seharinya +harmoni mengharmonikan +harmonik mengharmonikan +harmonis diharmoniskan +harmonis keharmonisan +harmonis mengharmoniskan +harmonisasi diharmonisasi +harmonisasi diharmonisasikan +harmonisasi mengharmonisasi +harmonisasi mengharmonisasikan +harpa diharpakan +harta berharta +haru keharuan +haru mengharu +haru mengharukan +haru seharunya +haru terharu +haruan keharuan +haruan keharuannya +harum keharuman +harum mengharumkan +harum pengharum +harum seharum +harus diharus +harus diharuskan +harus diharuskannya +harus diharusnya +harus keharusan +harus mengharuskan +harus mengharuskannya +harus mengharusnya +harus seharus +harus seharusnya +harus seharusnyalah +has berhasi +hasrat berhasrat +hasta sehasta +hasut dihasut +hasut menghasut +hasut penghasut +hasut penghasutan +hasut terhasut +hati behati +hati berhati +hati dihati +hati dihatinya +hati kehati +hati pehatian +hati perhatian +hati perhatikan +hati sehati +hati sehatinya +haus kehausan +hawa berhawa +hawa penghawaan +hayat dihayati +hayat menghayati +hayat penghayat +hayat penghayatan +hayati dihayati +hayati menghayati +hebat kehebatan +hebat menghebat +hebat sehebat +hebat terhebat +hebat terhebatnya +heboh dihebohkan +heboh kehebohan +heboh menghebohkan +heboh seheboh +heboh terheboh +hegemoni menghegemoni +hektare perhektare +hektare sehektare +hela dihela +hela menghela +hela penghela +hela sehelai +helai sehelai +helat dihelat +helat dihelatkan +helat dihelatnya +helat menghelat +helat pehelatan +helat penghelatan +helat perhelatan +helm berhelm +hemat berhemat +hemat berhematlah +hemat dihemat +hemat kehematan +hemat menghemat +hemat menghematnya +hemat penghemat +hemat penghematan +hemat sehemat +hemat terhemat +hempas dihempas +hempas dihempaskan +hempas menghempas +hempas menghempaskan +hempas terhempas +hempas terhempasnya +hendak dihendaki +hendak kehendak +hendak kehendaki +hendak kehendaknya +hendak menghendaki +hening keheningan +hening mengheningkan +hening pengheningan +henti behenti +henti berhenti +henti berhentikan +henti berhentilah +henti berhentinya +henti dihentikan +henti dihentikannya +henti menghentian +henti menghentikan +henti menghentikannya +henti menhentikan +henti penghenti +henti penghentian +henti penghentikan +henti perhentian +henti terhenti +henti terhentikan +henti terhentinya +heran diherankan +heran keheranan +heran mengherankan +heran terheran +hewan kehewanan +hias berhias +hias berhiaskan +hias dihias +hias dihiasi +hias menghias +hias menghiasi +hias menghiasnya +hias penghias +hias perhiasan +hibah dihibahkan +hibah menghibahkan +hibah penghibahan +hibernasi berhibernasi +hibur dihibur +hibur menghibur +hibur menghiburnya +hibur penghibur +hibur penghiburan +hibur terhibur +hidang dihidangkan +hidang menghidangkan +hidang menghidangkannya +hidang terhidang +hidrasi menghidrasi +hidrasi terhidrasi +hidrogenasi terhidrogenasi +hidung berhidung +hidup dihidupi +hidup dihidupkan +hidup dihidupkannya +hidup kehidupan +hidup menghidup +hidup menghidupi +hidup menghidupkan +hidup menghidupkannya +hidup penghidupan +hidup sehidup +higienis kehigienisan +hijab berhijab +hijau dihijaukan +hijau kehijauan +hijau menghijau +hijau menghijaukan +hijau menghijaunya +hijau penghijauan +hijrah berhijrah +hikmat menghikmati +hilang dihilangkan +hilang dihilangkannya +hilang kehilang +hilang kehilangan +hilang menghilang +hilang menghilangan +hilang menghilangkan +hilang menghilangkannya +hilang menghilangnya +hilang penghilang +hilang penghilangan +hilir dihilir +himpun berhimpun +himpun berhimpunnya +himpun dihimpun +himpun dihimpunnya +himpun menghimpun +himpun penghimpun +himpun penghimpunan +himpun perhimpunan +himpun terhimpun +hina dihina +hina dihinakan +hina kehinaan +hina menghina +hina menghinakan +hina menghinanya +hina penghina +hina penghinaan +hina terhina +hindar dihindari +hindar dihindarkan +hindar menghindar +hindar menghindari +hindar menghindarkan +hindar menghindarkannya +hindar menhindari +hindar penghindar +hindar penghindaran +hindar terhindar +hindar terhindari +hindar terhindarkan +hindar terhindarnya +hinggap dihinggapi +hinggap menghinggap +hinggap menghinggapi +hipnosis dihipnosis +hipnosis menghipnosis +hipnotis dihipnotis +hipnotis menghipnotis +hipnotis penghipnotis +hipnotis terhipnotis +hipotesis berhipotesis +hirau dihiraukan +hirau dihiraukannya +hirau menghiraukan +hirau menghiraukannya +hirup dihirup +hirup dihirupnya +hirup menghirup +hirup menghirupnya +hirup terhirup +hirup terhirupnya +hitam dihitamkan +hitam kehitaman +hitam menghitam +hitam menghitamkan +hitam menghitamnya +hitam penghitam +hitam sehitam +hitung berhitung +hitung berhitungnya +hitung dihitung +hitung dihitungnya +hitung kehitung +hitung menghitung +hitung menghitungnya +hitung penghitung +hitung penghitungan +hitung perhitungan +hitung perhitungkan +hitung terhitung +hobi pehobi +hobi penghobi +hologram berhologram +hormat dihormati +hormat kehormatan +hormat menghormat +hormat menghormati +hormat penghormatan +hormat perhormatan +hormat terhormat +hormat terhormatnya +hot terhot +hotel belhotel +hotel dihotel +hotel perhotelan +hubung behubungan +hubung berhubung +hubung berhubungan +hubung dihubung +hubung dihubungan +hubung dihubungi +hubung dihubungkan +hubung dihubungkannya +hubung menghubung +hubung menghubungan +hubung menghubungi +hubung menghubungkan +hubung menghubungkannya +hubung pehubungan +hubung penghubung +hubung penghubungan +hubung penghubungnya +hubung perhubungan +hubung sehubungan +hubung terhubung +hubung terhubungan +hubung terhubungkan +hubung terhubungnya +hujan berhujan +hujan dihujani +hujan dihujankan +hujan kehujanan +hujan menghujani +hujan menghujankan +hujan penghujan +hujat dihujat +hujat menghujat +hujat menghujatnya +hujat penghujat +hujat penghujatan +hujung penghujung +hukum berhukum +hukum dihukum +hukum dihukuman +hukum dihukumi +hukum dihukumnya +hukum menghukum +hukum menghukumi +hukum menghukumnya +hukum penghukum +hukum penghukuman +hukum terhukum +hulu berhulu +hulu dihulu +hulu penghulu +hulu penghulunya +hun berhuni +hun dihuni +hun menghuni +hun penghuni +hun sehun +huni berhuni +huni dihuni +huni dihuninya +huni menghuni +huni menghuninya +huni penghuni +huni penghunian +huni penghuninya +hunjam menghunjam +hunjam menghunjamkan +hunus dihunuskan +hunus menghunus +hunus menghunuskan +hunus terhunus +hura-hura berhura-hura +huruf berhuruf +hutan berhutan +hutan dihutan +hutan dihutankan +hutan kehutan +hutan kehutanan +hutan menghutankan +hutan penghutanan +hutan perhutanan +hutan perhutani +huyung terhuyung +ia belia +ia belianya +ia beria +ia diia +ia meniai +ia menyiakan +ia penia +ia peria +ia seia +ia teriakan +ia teriakannya +iba mengiba +ibadah beribadah +ibadah peribadahan +ibadat beribadat +ibadat peribadatan +ibu beribu +ibu keibuan +ibu menyibukan +ibu seibu +ibul mengibuli +id meidi +id penyidkan +id seid +idah memidahkan +idah pemidahan +idam diidamkan +idam diidamkannya +idam mengidam +idam mengidamkan +idap diidap +idap diidapnya +idap mengidap +idap mengidapnya +idap pengidap +idap pengidapnya +ide peride +ide seide +ideal mengidealkan +ideal seideal +identifikasi diidentifikasi +identifikasi diidentifikasikan +identifikasi diidentifikasinya +identifikasi mengidentifikasi +identifikasi mengidentifikasikan +identifikasi mengidentifikasikannya +identifikasi mengidentifikasinya +identifikasi menidentifikasi +identifikasi pengidentifikasi +identifikasi pengidentifikasian +identifikasi teridentifikasi +identifikasi teridentifikasinya +identik diidentikan +identik diidentikkan +identik keidentikan +identik mengidentikan +identik mengidentikkan +identitas beridentitas +ideologi berideologi +ideologi berideologikan +ideologi seideologi +idola diidolai +idola diidolakan +idola diidolakannya +idola mengidolai +idola mengidolakan +idola mengidolakannya +idola pengidola +idola pengidolaan +iga meiga +igau mengigau +ih pemihan +ih perih +ih perihnya +ijas seijas +ijazah berijazah +ijon diijon +ijon mengijon +ijon pengijon +ijtihad berijtihad +ikan belikan +ikan berikan +ikan berikanlah +ikan pelikan +ikan perikan +ikan perikanan +ikan seikan +ikan terikan +ikat belikat +ikat berikat +ikat berikatan +ikat diikat +ikat diikatkan +ikat memikat +ikat memikatnya +ikat mengikat +ikat mengikatkan +ikat mengikatkannya +ikat mengikatnya +ikat menyikat +ikat menyikatnya +ikat pemikat +ikat pengikat +ikat pengikatan +ikat pengikatnya +ikat penyikatan +ikat perikatan +ikat seikat +ikat terikat +ikhlas diikhlaskan +ikhlas keikhlasan +ikhlas mengikhlaskan +ikhlas mengikhlaskannya +ikhlas seikhlasnya +ikhtiar berikhtiar +ikhtiar diikhtiarkan +ikhtiar mengikhtiarkan +iklan beriklan +iklan diiklankan +iklan mengiklan +iklan mengiklankan +iklan mengiklankannya +iklan pengiklan +iklan pengiklanan +iklan periklanan +iklim beriklim +ikon berikon +ikrar berikrar +ikrar diikrarkan +ikrar mengikrarkan +iktikad beriktikad +iktikaf beriktikaf +ikut beikut +ikut berikut +ikut berikuti +ikut berikutnya +ikut diikut +ikut diikuti +ikut diikutkan +ikut keikut +ikut mengikut +ikut mengikuti +ikut mengikutkan +ikut menyikut +ikut menyikutnya +ikut pengikut +ikut pengikuti +ikut pengikutnya +ikut terikut +ilah belilah +ilah berilah +ilah memilah +ilah memilahkan +ilah memilahnya +ilah menilah +ilah menyilahkan +ilah pemilahan +ilah perilah +ilai meilai +ilai memilai +ilai menilai +ilai menilainya +ilai penilai +ilai penilaian +ilai penilainya +ilak menilak +ilak menyilakan +ilas belilas +ilas mengilas +ilegal mengilegalkan +iler seiler +ilham diilhami +ilham mengilhami +ilham terilhami +ili meili +ili memili +ili memilii +ili pemili +ili pemilian +ili pemilikan +ili pemilikannya +ili penilian +ilian pemilian +ilian penilian +iling meiling +ilmiah keilmiahan +ilmu berilmu +ilmu keilmuan +ilmuwan keilmuwan +ilu memilukan +ilu pemilu +ilu pemilunya +ilusi berilusi +ilustrasi diilustrasikan +ilustrasi mengilustrasikan +imajinasi berimajinasi +imajinasi diimajinasikan +imajinasi mengimajinasikan +imak menyimak +imak menyimaknya +imak terimakan +imam diimami +imam mengimami +iman beriman +iman diimani +iman keimanan +iman mengimani +iman seiman +imani diimani +imani mengimani +imbal berimbal +imbang berimbang +imbang berimbangnya +imbang diimbangi +imbang mengimbang +imbang mengimbangi +imbang mengimbangkan +imbang menimbang +imbang menimbangkan +imbang menimbangnya +imbang menyimbangkan +imbang pengimbang +imbang penimbang +imbang penimbangan +imbang penyimbang +imbang penyimbangan +imbang perimbangan +imbang seimbang +imbang seimbangan +imbang seimbangkan +imbang seimbangnya +imbang terimbang +imbas berimbas +imbas mengimbas +imbas terimbas +imbau diimbau +imbau diimbaunya +imbau mengimbau +imbau mengimbaunya +imbau menimbau +imbau pengimbauan +imbuh diimbuhi +imbuh diimbuhkan +imbuh mengimbuhi +imbuh mengimbuhkan +imigrasi berimigrasi +imigrasi keimigrasian +iming-iming diiming-iming +iming-iming diiming-imingi +iming-iming diiming-imingkan +iming-iming mengiming-iming +iming-iming mengiming-imingi +iming-iming mengiming-imingkan +imitasi mengimitasi +impak menimpakan +impas pelimpas +impas pelimpasan +impi diimpikan +impi diimpikannya +impi memimpi +impi memimpikan +impi memimpikannya +impi mengimpikan +impi pemimpi +impi pemimpian +impi pemimpinya +impit berimpitan +impit diimpit +impit mengimpit +impit terimpit +implan diimplan +implan mengimplan +implementasi diimplementasi +implementasi diimplementasikan +implementasi diimplementasikannya +implementasi mengimplementasi +implementasi mengimplementasikan +implementasi mengimplementasikannya +implementasi pengimplementasian +implementasi terimplementasi +implementasi terimplementasikan +implikasi berimplikasi +implikasi diimplikasikan +implikasi mengimplikasikan +impor diimpor +impor diimpornya +impor mengimpor +impor mengimpornya +impor pengimpor +impor pengimporan +impresif seimpresif +improvisasi berimprovisasi +improvisasi diimprovisasi +improvisasi mengimprovisasi +imunisasi diimunisasi +imunisasi mengimunisasi +ina belina +ina memina +ina mengina +inang meminang +inang meminangnya +inang peminang +inang peminangan +inap diinapi +inap diinapkan +inap menginap +inap menginapkan +inap menginapnya +inap penginap +inap penginapan +incar diincar +incar diincarnya +incar mengincar +incar mengincari +incar mengincarnya +incar pengincar +inci perinci +inci perincian +inci terinci +incut memincut +indah diindahkan +indah diindahkannya +indah keindahan +indah memindah +indah memindahan +indah memindahkan +indah memindahkannya +indah mengindahkan +indah mengindahkannya +indah pemindah +indah pemindahan +indah pemindahkan +indah seindah +indah terindah +indah terindahnya +indang keindangan +indang pemindangan +indang perindang +indap mengindap +indeks berindeks +indeks diindeks +indeks mengindeks +indeks pengindeksan +indeks terindeks +indik menindik +indik penindikan +indikan penindikan +indikasi berindikasi +indikasi berindikasikan +indikasi diindikasi +indikasi diindikasikan +indikasi mengindikasi +indikasi mengindikasikan +indikasi terindikasi +indikasi terindikasikan +indoktrinasi diindoktrinasi +indoktrinasi mengindoktrinasi +indra pengindra +indra pengindraan +indu perindu +indu perindukan +induk berinduk +induk menginduk +induk perindukan +induksi diinduksi +induksi menginduksi +induksi terinduksi +indung pelindung +indung pelindungan +indung pelindungnya +indung perindungan +industri diindustri +industri perindustri +industri perindustrian +infak berinfak +infak menginfakkan +infeksi diinfeksi +infeksi menginfeksi +infeksi menginfeksinya +infeksi terinfeksi +infeksi terinfeksinya +infiltrasi diinfiltrasi +infiltrasi menginfiltrasi +info diinfo +info diinfokan +info menginfokan +info terinfo +informasi berinformasi +informasi diinformasi +informasi diinformasikan +informasi menginformasi +informasi menginformasikan +informasi menginformasikannya +informasi terinformasi +informasi terinformasikan +infus diinfus +infus menginfus +ingar peringaran +ingat diingat +ingat diingatan +ingat diingatkan +ingat diingatkannya +ingat diingatnya +ingat mengingat +ingat mengingatkan +ingat mengingatkannya +ingat mengingatnya +ingat meningat +ingat meningatkan +ingat pengingat +ingat pengingatan +ingat peningatan +ingat peringat +ingat peringatan +ingat peringati +ingat peringatkan +ingat seingat +ingat seingatnya +ingat teringat +inggu meninggu +inggung menyinggung +inggung menyinggungnya +ingin beringin +ingin diingin +ingin diingini +ingin diinginkan +ingin diinginkannya +ingin keingin +ingin keinginan +ingin keinginnya +ingin menginginan +ingin mengingini +ingin menginginkan +ingin menginginkannya +ingin meninginkan +ingkar diingkari +ingkar mengingkari +ingkar pengingkaran +ingkir menyingkir +ingkir menyingkirkan +ingkir menyingkirkannya +ingkir penyingkiran +ingsut beringsut +ini diinikan +inisial beinisial +inisial berinisial +inisial diinisialkan +inisiasi berinisiasi +inisiasi diinisiasi +inisiasi diinisiasikan +inisiasi diinisiasinya +inisiasi menginisiasi +inisiasi menginisiasikan +inisiatif berinisiatif +injak diinjak +injak diinjaknya +injak menginjak +injak menginjakan +injak menginjakkan +injak menginjaknya +injak penginjak +injak penginjakan +injak terinjak +injeksi diinjeksi +injeksi diinjeksikan +injeksi menginjeksi +injeksi menginjeksikan +inkubasi diinkubasi +inkubasi menginkubasi +inovasi berinovasi +inovasi diinovasi +inovasi menginovasi +inovatif terinovatif +insektisida berinsektisida +inseminasi diinseminasi +insinyur keinsinyuran +inspeksi diinspeksi +inspeksi menginspeksi +inspirasi berinspirasi +inspirasi diinspirasi +inspirasi menginspirasi +inspirasi menginspirasikan +inspirasi menginspirasinya +inspirasi terinspirasi +instalasi diinstalasi +instalasi menginstalasi +instalasi terinstalasi +instruksi diinstruksi +instruksi diinstruksikan +instruksi diinstruksikannya +instruksi menginstruksi +instruksi menginstruksikan +instruksi menginstruksikannya +intai diintai +intai memintai +intai mengintai +intai mengintainya +intai menyintai +intai pengintai +intai pengintaian +intai pengintainya +intan memintan +integrasi berintegrasi +integrasi diintegrasi +integrasi diintegrasikan +integrasi diintegrasikannya +integrasi mengintegrasi +integrasi mengintegrasikan +integrasi mengintegrasikannya +integrasi pengintegrasian +integrasi terintegrasi +integrasi terintegrasikan +integrasi terintegrasinya +integritas berintegritas +integritas terintegritas +intens seintens +intensif diintensifkan +intensif mengintensifkan +intensif pengintensifan +intensif seintensif +intensitas berintensitas +interaksi berinteraksi +interaksi berinteraksilah +interkoneksi berinterkoneksi +interkoneksi terinterkoneksi +internal diinternal +internalisasi diinternalisasikan +internalisasi menginternalisasi +internalisasi menginternalisasikan +internalisasi terinternalisasi +internasional menginternasionalkan +internasionalisasi menginternasionalisasi +interogasi diinterogasi +interogasi menginterogasi +interogasi menginterogasinya +interogasi penginterogasi +interpelasi diinterpelasi +interpelasi menginterpelasi +interpretasi diinterpretasi +interpretasi diinterpretasikan +interpretasi menginterpretasi +interpretasi menginterpretasikan +interpretasi menginterpretasikannya +intersepsi diintersepsi +intersepsi mengintersepsi +interupsi diinterupsi +interupsi menginterupsi +interupsi terinterupsi +intervensi diintervensi +intervensi mengintervensi +intervensi mengintervensinya +intervensi terintervensi +inti berinti +inti berintikan +intim keintiman +intimidasi diintimidasi +intimidasi mengintimidasi +intimidasi mengintimidasinya +intimidasi pengintimidasi +intimidasi terintimidasi +intip diintip +intip mengintip +intip mengintipnya +intip pengintip +intip pengintipan +introduksi diintroduksi +introspeksi berintrospeksi +introspeksi mengintrospeksi +intrusi terintrusi +invasi diinvasi +invasi menginvasi +inventaris diinventaris +inventaris menginventaris +inventarisasi diinventarisasi +inventarisasi menginventarisasi +investasi berinvestasi +investasi berinvestasilah +investasi diinvestasi +investasi diinvestasikan +investasi diinvestasikannya +investasi menginvestasi +investasi menginvestasikan +investasi menginvestasikannya +investigasi diinvestigasi +investigasi menginvestigasi +investigasi menginvestigasinya +ion pengion +ionisasi terionisasi +ipis menipis +ipis menipiskan +ipis menipisnya +ipis pelipis +ipis pelipisnya +ipis penipisan +ira beira +ira keira +ira meira +ira mengira +ira mengiranya +ira pemira +iradiasi diiradiasi +iram menyiram +iram menyirami +iram menyiramkan +iram menyiramkannya +iram menyiramnya +iram penyiram +iram penyiraman +irama berirama +irama seirama +iri beriri +iri diirinya +iri keirian +iri mengiri +iri mengirikan +irigasi beririgasi +irik mengirikan +iring beriring +iring beriringan +iring diiring +iring diiringi +iring memiringkan +iring mengiring +iring mengiringi +iring pengiring +iring pengiringan +iring pengiringnya +iring seiring +iring seiringan +iring seiringnya +iring teriring +iris beririsan +iris diiris +iris memiriskan +iris mengiris +iris mengirisnya +iris meniriskan +iris peiris +iris pengiris +iris seiris +iris teriris +irit keiritan +irit mengirit +irit pengiritan +irit teririt +iritasi mengiritasi +iritasi teriritasi +irus meniruskan +isak menyisakan +isak menyisakkan +isak perisakan +isak terisak +isak-isak terisak-isak +isap diisap +isap diisapnya +isap mengisap +isap mengisapnya +isap pengisap +isap pengisapan +isap perisapan +isap terisap +iseng keisengan +iseng mengisengi +isi berisi +isi berisikan +isi diisi +isi diisikan +isi diisinya +isi mengisi +isi mengisikan +isi mengisinya +isi menyisikan +isi pengisi +isi pengisian +isi pengisinya +isi penyisian +isi seisi +isi seisinya +isi terisi +isi terisinya +isis berisis +isis mengisis +isis mengisisi +isis pengisisan +islah berislah +islah diislahkan +islah mengislahkan +isolasi diisolasi +isolasi mengisolasi +isolasi mengisolasikan +isolasi mengisolasinya +isolasi pengisolasian +isolasi terisolasi +isolasi terisolasinya +istigfar beristigfar +istilah diistilahkan +istilah mengistilahkan +istilah mengistilahkannya +istimewa diistimewakan +istimewa keistimewaan +istimewa mengistimewakan +istimewa pengistimewaan +istimewa seistimewa +istimewa teristimewa +istirahat beristirahat +istirahat beristirahatlah +istirahat diistirahatkan +istirahat diistirahatkannya +istirahat mengistirahatkan +istirahat mengistirahatkannya +istirahat pengistirahatan +istirahat peristirahatan +istiwa peristiwa +istiwa peristiwanya +istri beristri +istri beristrikan +istri pelistrikan +isu diisukan +isu mengisukan +isya keisya +isya meisya +isyarat diisyaratkan +isyarat mengisyaratkan +isyarat mengisyaratkannya +itik menitik +itik menitikan +itik menitikkan +itu beitu +itu meitu +itu seituan +iur mengiur +iur mengiurkan +iya diiyakan +iya mengiyakan +iya mengiyakannya +iya seiya +izin berizin +izin diizinkan +izin diizinkannya +izin mengizinkan +izin mengizinkannya +izin perizinan +izin seizin +izin seizinnya +jabar dijabarkan +jabar dijabarkannya +jabar menjabar +jabar menjabarkan +jabar menjabarkannya +jabar pejabar +jabar penjabaran +jabar terjabarkan +jabat berjabat +jabat berjabatan +jabat dijabat +jabat dijabatnya +jabat mejabat +jabat menjabat +jabat menjabatnya +jabat pejabat +jabat pejabatan +jabat pejabatnya +jabat penjabat +jabat perjabat +jadi dijadikan +jadi dijadikannya +jadi kejadi +jadi kejadian +jadi kejadikan +jadi mejadi +jadi mejadikan +jadi memjadi +jadi menjadi +jadi menjadii +jadi menjadikan +jadi menjadikannya +jadi penjadi +jadi sejadinya +jadi terjadi +jadi terjadilah +jadi terjadinya +jadwal berjadwal +jadwal dijadwal +jadwal dijadwalkan +jadwal dijadwalkannya +jadwal menjadwal +jadwal menjadwalkan +jadwal menjadwalkannya +jadwal penjadwalan +jadwal terjadwal +jadwal terjadwalkan +jaga berjaga +jaga dijaga +jaga dijaganya +jaga mejaga +jaga menjaga +jaga menjagai +jaga menjaganya +jaga pejaga +jaga pejagaan +jaga penjaga +jaga penjagaan +jaga penjaganya +jaga terjaga +jaga terjaganya +jagal dijagal +jagal menjagal +jagal pejagal +jagal pejagalan +jagal penjagal +jagal penjagalan +jagat sejagat +jago dijagokan +jago dijagokannya +jago menjagokan +jago menjagokannya +jago sejago +jagung kejagung +jah dijah +jah sejah +jahat dijahati +jahat kejahatan +jahat pejahat +jahat penjahat +jahat penjahatnya +jahat sejahat +jahat terjahat +jahil dijahili +jahil kejahilan +jahil menjahili +jahit dijahit +jahit dijahitkan +jahit menjahit +jahit menjahitkan +jahit menjahitnya +jahit penjahit +jahit penjahitan +jahit penjahitnya +jahit terjahit +jail menjaili +jaja dijajakan +jaja dijajakannya +jaja menjajakan +jaja menjajakannya +jaja penjaja +jaja penjajakan +jajah dijajah +jajah menjajah +jajah pejajahan +jajah penjajah +jajah penjajahan +jajah penjajahnya +jajah terjajah +jajak dijajakan +jajak dijajaki +jajak menjajakan +jajak menjajaki +jajak menjajakkan +jajak penjajakan +jajal dijajal +jajal dijajalnya +jajal menjajal +jajal menjajalnya +jajal penjajalan +jajar berjajar +jajar dijajaran +jajar dijajarkan +jajar kejajar +jajar menjajarkan +jajar penjajaran +jajar sejajar +jajar sejajaran +jajar sejajarkan +jajar sejajarnya +jaka kejakaan +jaka perjaka +jaka sejaka +jaket berjaket +jaksa kejaksaan +jala berjala +jala berjalanya +jala dijalakan +jala menjala +jala menjalai +jala menjalakan +jalak dijalakan +jalak menjalakan +jalang menjalang +jalar bejalar +jalar menjalar +jalar menjalari +jalar menjalarnya +jalar penjalaran +jali menjali +jalin dijalin +jalin dijalinnya +jalin mejalin +jalin menjalin +jalin penjalin +jalin terjalin +jalin terjalinnya +jalur berjalur +jalur dijalur +jalur sejalur +jam berjam +jam dijaman +jam kejam +jam kejamnya +jam menjami +jam pejamkan +jam perjam +jam perjamnya +jam sejam +jamah berjamah +jamah dijamah +jamah menjamah +jamah terjamah +jambak dijambak +jambak menjambak +jambon kejambon +jambon pejambon +jambret dijambret +jambret menjambret +jambret pejambret +jambret penjambret +jambret penjambretan +jambul berjambul +jamin bejamin +jamin berjamin +jamin berjaminan +jamin dijamin +jamin dijaminkan +jamin dijaminnya +jamin mejamin +jamin menjamin +jamin menjaminan +jamin menjaminkan +jamin menjaminnya +jamin penjamin +jamin penjaminan +jamin penjaminnya +jamin terjamin +jamin terjaminnya +jamu dijamu +jamu mejamu +jamu menjamu +jamu menjamunya +jamu penjamuan +jamu perjamuan +jamur berjamur +jamur berjamuran +jamur menjamur +jamur menjamurnya +janda menjanda +jangan menjangan +jangan terjangan +jangan terjangannya +janggal kejanggalan +janggut berjanggut +jangka berjangka +jangka terjangka +jangkau berjangkauan +jangkau dijangkau +jangkau dijangkaunya +jangkau mengjangkau +jangkau menjangkau +jangkau menjangkaunya +jangkau penjangkau +jangkau penjangkauan +jangkau terjangkau +jangkau terjangkaunya +jangkit berjangkit +jangkit berjangkitnya +jangkit dijangkiti +jangkit menjangkit +jangkit menjangkiti +jangkit menjangkitnya +jangkit penjangkitan +jangkit terjangkit +jangkit terjangkiti +jangkit terjangkitnya +jangkung terjangkung +jani berjani +jani menjani +jani perjanian +janji berjanji +janji berjanjian +janji berjanjilah +janji dijanji +janji dijanjikan +janji dijanjikannya +janji menjanjikan +janji menjanjikannya +janji pejanjian +janji penjanjian +janji perjanjian +jantan kejantanan +jantan pejantan +jantan pejantannya +jantung berjantung +jantung dijantung +jara pejara +jara pejarakan +jara penjara +jara penjarakan +jara penjaranya +jara sejara +jarah dijarah +jarah menjarah +jarah penjarah +jarah penjarahan +jarah sejarah +jarah sejarahnya +jarak berjarak +jarak pejarakan +jarak penjarakan +jarak sejarak +jaran kejaran +jaran penjaran +jaran sejaran +jarang menjarangkan +jarang sejarang +jargon berjargon +jari berjari +jari kejari +jari menjari +jaring berjaring +jaring berjaringan +jaring dijaring +jaring dijaringan +jaring dijaringkan +jaring dijaringkannya +jaring menjaring +jaring menjaringkan +jaring menjaringnya +jaring pejaringan +jaring penjaring +jaring penjaringan +jaring terjaring +jaring terjaringnya +jas berjas +jas menjasi +jas penjas +jas terjasi +jasa berjasa +jasa kejasaan +jatah dijatah +jatah dijatahi +jatah dijatahkan +jatah kejatahan +jatah menjatah +jatah menjatahkan +jatah penjatahan +jati berjati +jati kejati +jati sejati +jati sejatinya +jatuh berjatuhan +jatuh dijatuh +jatuh dijatuhi +jatuh dijatuhkan +jatuh dijatuhkannya +jatuh kejatuhan +jatuh mejatuhkan +jatuh menjatuh +jatuh menjatuhan +jatuh menjatuhi +jatuh menjatuhkan +jatuh menjatuhkannya +jatuh penjatuhan +jatuh terjatuh +jatuh terjatuhnya +jauh berjauhan +jauh dijauhi +jauh dijauhkan +jauh kejauhan +jauh menjauh +jauh menjauhi +jauh menjauhkan +jauh menjauhkannya +jauh menjauhlah +jauh menjauhnya +jauh sejauh +jauh terjauh +jauh terjauhnya +jawab berjawab +jawab dijawab +jawab dijawabnya +jawab mejawab +jawab menjawab +jawab menjawabnya +jawab penjawab +jawab terjawab +jawab terjawablah +jawara menjawarai +jawat pejawat +jawat sejawat +jawat sejawatnya +jawi berjawi +jaya berjaya +jaya berjayanya +jaya dijaya +jaya kejaya +jaya kejayaan +jaya menjayakan +je terje +jebak dijebak +jebak kejebak +jebak menjebak +jebak menjebaknya +jebak penjebak +jebak penjebakan +jebak terjebak +jebak terjebaknya +jebat pejebat +jeblos dijebloskan +jeblos dijebloskannya +jeblos kejeblos +jeblos menjebloskan +jeblos menjebloskannya +jeblos penjeblosan +jeblos terjeblos +jebol dijebol +jebol kejebolan +jebol mejebol +jebol menjebol +jebol menjebolkan +jebol menjebolnya +jebol penjebol +jebol penjebolan +jebur terjebur +jeda berjeda +jeda dijeda +jegal dijegal +jegal menjegal +jegal menjegalnya +jegal penjegal +jegal penjegalan +jegal terjegal +jejak berjejak +jejak dijejaki +jejak menjejak +jejak menjejakan +jejak menjejaki +jejak menjejakkan +jejak penjejak +jejak penjejakan +jejal berjejal +jejal berjejalan +jejal dijejali +jejal dijejalkan +jejal menjejali +jejal menjejalkan +jejer berjejer +jejer berjejeran +jejer dijejer +jejer dijejerkan +jejer menjejerkan +jela dijelakan +jela menjelakan +jelah penjelahan +jelajah berjelajah +jelajah dijelajah +jelajah dijelajahi +jelajah menjelajah +jelajah menjelajahi +jelajah penjelajah +jelajah penjelajahan +jelak dijelakan +jelak menjelakan +jelang dijelang +jelang mejelang +jelang menjelang +jelas dijelas +jelas dijelaskan +jelas dijelaskannya +jelas kejelasan +jelas mejelaskan +jelas menjelas +jelas menjelasan +jelas menjelaskan +jelas menjelaskannya +jelas pejelasan +jelas penjelas +jelas penjelasan +jelas penjelaskan +jelas perjelas +jelas sejelas +jelas terjelas +jelas terjelaskan +jelek dijelekkan +jelek kejelekan +jelek menjelekan +jelek menjelekkan +jelek sejelek +jelek terjelek +jeli kejelian +jelma menjelma +jelma menjelmakan +jelma penjelmaan +jemaah berjemaah +jembatan dijembatani +jembatan menjembatani +jembatan penjembatan +jembatan terjembatani +jemput dijemput +jemput dijemputnya +jemput menjemput +jemput menjemputnya +jemput penjemput +jemput penjemputan +jemput penjemputnya +jemu kejemuan +jemu menjemukan +jemur berjemur +jemur dijemur +jemur menjemur +jemur menjemurnya +jemur penjemur +jemur penjemuran +jemur terjemur +jenak sejenak +jenaka kejenakaan +jendela berjendela +jeng mejeng +jeng pejeng +jengah kejengahan +jenggot berjenggot +jengguk menjengguk +jengkal sejengkal +jengkang terjengkang +jengkel kejengkelan +jengkel menjengkelkan +jenguk dijenguk +jenguk menjenguk +jenguk menjenguknya +jenguk penjenguk +jenis berjenis +jenis berjeniskan +jenis sejenis +jenis sejenisnya +jenjang berjenjang +jenjang penjenjangan +jentik menjentikkan +jenuh kejenuhan +jenuh menjenuhkan +jepit dijepit +jepit dijepitkan +jepit kejepit +jepit menjepit +jepit menjepitkan +jepit menjepitnya +jepit penjepit +jepit penjepitan +jepit terjepit +jepit terjepitnya +jepret dijepret +jepret menjepret +jepret menjepretkan +jepret menjepretnya +jepret terjepret +jera menjerakan +jera penjeraan +jerat dijerat +jerat dijeratkan +jerat dijeratnya +jerat mejerat +jerat menjerat +jerat menjeratkan +jerat menjeratnya +jerat penjerat +jerat penjeratan +jerat terjerat +jerat terjeratnya +jerawat berjerawat +jerembap terjerembap +jerit menjerit +jernih dijernihkan +jernih kejernihan +jernih menjernihkan +jernih penjernih +jernih penjernihan +jernih sejernih +jeruji berjeruji +jerumus dijerumuskan +jerumus menjerumus +jerumus menjerumuskan +jerumus menjerumuskannya +jerumus terjerumus +jerumus terjerumusnya +jewer dijewer +jewer menjewer +ji beji +ji keji +ji kejinya +ji meji +jibaku bejibaku +jibaku berjibaku +jibun bejibun +jibun bejibunnya +jibun berjibun +jihad berjihad +jihad pejihad +jijik menjijikan +jijik menjijikkan +jil sejil +jilat dijilat +jilat dijilati +jilat menjilat +jilat menjilati +jilat menjilatnya +jilat penjilat +jilat terjilat +jilbab berjilbab +jilid berjilid +jilid dijilid +jilid penjilidan +jin dijinkan +jinak dijinakan +jinak dijinakkan +jinak menjinakan +jinak menjinakkan +jinak menjinakkannya +jinak penjinak +jinak penjinakan +jinak penjinakkan +jingkrak berjingkrak +jinjing dijinjing +jinjing menjinjing +jinjit berjinjit +jiplak dijiplak +jiplak menjiplak +jiplak menjiplaknya +jiplak penjiplak +jiplak penjiplakan +jir berjiran +jiran berjiran +jiwa berjiwa +jiwa dijiwai +jiwa kejiwaan +jiwa menjiwai +jiwa penjiwaan +jiwa perjiwa +jiwa sejiwa +jobong kejobong +joget berjoget +joging berjoging +joki perjokian +joli sejoli +jongkok berjongkok +jorok menjorok +jorok terjorok +jorong kejorongan +jotos menjotos +jua penjuakan +juak penjuakan +jual berjual +jual berjualan +jual dijual +jual dijualkan +jual dijualnya +jual kejual +jual mejual +jual menjual +jual menjualan +jual menjualkan +jual menjualnya +jual pejual +jual pejualan +jual penjual +jual penjualan +jual penjualnya +jual perjualan +jual terjual +jual terjualnya +juang bejuang +juang berjuang +juang berjuangan +juang berjuanglah +juang berjuangnya +juang kejuangan +juang pejuang +juang pejuangan +juang pejuangnya +juang penjuang +juang perjuang +juang perjuangan +juang perjuangkan +juar kejuaran +juar menjuari +juara dijuarai +juara kejuaraan +juara mejuarai +juara menjuara +juara menjuarai +jubah berjubah +jubel bejubel +jubel berjubel +jubel berjubelnya +jubel dijubeli +judi berjudi +judi pejudi +judi penjudi +judi penjudian +judi perjudian +judo pejudo +judul berjudul +juju menjuju +jujur kejujuran +jujur sejujur +jujur sejujurnya +jujuran kejujuran +jujuran kejujurannya +julang menjulang +julang menjulangkan +julang menjulangnya +juluk bejuluk +juluk berjuluk +juluk berjulukan +juluk dijuluki +juluk menjuluki +julur dijulurkan +julur menjulur +julur menjulurkan +julur terjulur +jumbai berjumbai +jumlah bejumlah +jumlah berjumlah +jumlah dijumlah +jumlah dijumlahkan +jumlah menjumlah +jumlah menjumlahkan +jumlah penjumlahan +jumlah sejumlah +jumpa berjumpa +jumpa dijumpai +jumpa menjumpai +jumpa perjumpaan +jumput menjumput +jumput sejumput +jumud kejumudan +jun sejunlah +jun terjun +jun terjunkan +jun terjunnya +jung perjungan +jung terjung +jungkal dijungkalkan +jungkal menjungkal +jungkal menjungkalkan +jungkal terjungkal +jungkal terjungkalnya +jungkir menjungkir +jungkir menjungkirkan +jungkir terjungkir +junjung dijunjung +junjung menjunjung +junjung penjunjung +junta menjuntai +junta terjuntai +juntai menjuntai +juntai terjuntai +jura kejuraan +jura menjurai +jurai menjurai +juri penjurian +juru kejuruan +juru penjuru +juru penjurunya +jurus dijuruskan +jurus kejurusan +jurus menjurus +jurus menjuruskan +jurus penjurusan +jurus sejurus +jus dijus +justifikasi dijustifikasi +justifikasi menjustifikasi +juta berjuta +juta sejuta +juta sejutaan +ka beka +ka belka +ka dika +ka kekalah +ka meka +ka menga +ka mengakan +ka mengalah +ka peka +ka pekanya +ka pengakan +ka perka +ka seka +ka sekaan +ka sekai +ka terka +ka terkaan +ka terkai +ka terkanya +kaba dikabakan +kabak dikabakan +kabar berkabar +kabar dikabar +kabar dikabaran +kabar dikabari +kabar dikabarkan +kabar dikabarnya +kabar mengabari +kabar mengabarkan +kabar mengabarkannya +kabar pekabaran +kabar terkabar +kabel berkabel +kabel perkabelan +kabil mengabil +kabin berkabin +kabinet dikabinet +kabul dikabulkan +kabul dikabulkannya +kabul mengabulkan +kabul mengabulkannya +kabul pengabulan +kabul terkabul +kabul terkabulkan +kabul terkabulnya +kabung berkabung +kabung berkabungnya +kabung mengabungkan +kabung pengabungan +kabung perkabungan +kabupaten dikabupaten +kabupaten sekabupaten +kabur dikaburkan +kabur kekaburan +kabur mengabur +kabur mengaburkan +kabur pengaburan +kabut berkabut +kabut pengabut +kabut pengabutan +kaca berkaca +kaca mengaca +kaca pengaca +kaca pengacakan +kacak berkacak +kacak mengacak +kacak pengacak +kacak pengacakan +kacam mengacam +kacamata berkacamata +kacar pengacar +kacau dikacaukan +kacau kekacauan +kacau mengacau +kacau mengacaukan +kacau mengacaukannya +kacau pengacau +kacau pengacauan +kacu kekacuan +kacu mengacu +kacu mengacukan +kacu mengacunya +kacuk mengacukan +kacukan mengacukan +kacung mengacung +kacung mengacungi +kacung mengacungkan +kacung mengacungkannya +kad menkadi +kad pengadan +kad terkadi +kada mengada +kada mengadakan +kada mengadakannya +kada pengada +kada pengadaan +kada perkada +kadal dikadali +kadal mengadalan +kadal mengadalkan +kadang mengadang +kadang mengadangnya +kadang pengadang +kadang pengadangan +kadang terkadang +kadar berkadar +kadar sekadar +kadar sekadarnya +kader dikader +kader mengkader +kader pengaderan +kader pengkaderan +kader perkaderan +kadi menkadi +kadi pengadian +kadi pengadikan +kadi terkadi +kadir mengadiri +kadir mengadirkan +kadung mengadung +kadung terkadung +kafan dikafani +kafan dikafankan +kafan mengafani +kafan mengkafani +kafir dikafirkan +kafir kekafiran +kafir mengafirkan +kafir mengkafirkan +kafir pengkafiran +kaget dikagetkan +kaget kekagetan +kaget mengagetkan +kaget mengagetkannya +kaget terkaget +kagum dikagumi +kagum kekaguman +kagum mengagumi +kagum mengagumkan +kagum mengagumkannya +kagum pengagum +kagum pengagumnya +kagum terkagum +kail mengail +kain berkain +kain terkain +kais mengais +kais pengais +kaisar kekaisaran +kait bekaitan +kait berkait +kait berkaitan +kait berkaitkan +kait dikait +kait dikaitan +kait dikaitkan +kait dikaitkannya +kait mengait +kait mengaitkan +kait mengaitkannya +kait mengkait +kait mengkaitkan +kait mengkaitkannya +kait pengait +kait pengaitan +kait pengaitnya +kait sekaitan +kait terkait +kait terkaitan +kait terkaitnya +kajang pekajangan +kajangan pekajangan +kaji dikaji +kaji dikajinya +kaji mengaji +kaji mengajinya +kaji mengkaji +kaji mengkajinya +kaji menkaji +kaji pengajian +kaji pengkaji +kaji pengkajian +kak berkaki +kak dikaki +kak mekaki +kak mengakan +kak mengaki +kak pekak +kak pengak +kak pengakan +kak sekaki +kakap pengakap +kakap pengakapan +kakas perkakas +kaki berkaki +kaki dikaki +kaki dikakinya +kaki mekaki +kaki mengaki +kaki sekaki +kaku dikakukan +kaku kekakuan +kaku mekakukan +kaku mengaku +kaku mengakui +kaku mengakukan +kaku mengakunya +kaku pekaku +kaku pengaku +kaku pengakuan +kaku sekaku +kal bekal +kal bekali +kal bekalnya +kal berkali +kal dikali +kal kekal +kal kekalan +kal mengali +kal mengkal +kal mengkali +kal pengali +kal pengkalan +kal sekal +kal sekali +kala bekala +kala berkala +kala berkalanya +kala dikala +kala mengalai +kala mengalakan +kala sekala +kalah dikalahan +kalah dikalahkan +kalah dikalahkannya +kalah kekalah +kalah kekalahan +kalah mengalah +kalah mengalahan +kalah mengalahkan +kalah mengalahkannya +kalah terkalahan +kalah terkalahkan +kalah terkalahkannya +kalai mengalai +kalam mengalam +kalam mengalami +kalam pengalam +kalam pengalaman +kalam pengalami +kalamin mengalamin +kalang bekalang +kalang bekalangan +kalang berkalang +kalang dikalangan +kalang mengalang +kalang mengalangi +kalang pekalangan +kalang pengalangan +kalau mengalau +kaleng dikalengkan +kaleng pengalengan +kaleng sekaleng +kali bekali +kali berkali +kali dikali +kali dikalikan +kali mengali +kali mengalikan +kali mengkali +kali pengali +kali pengalian +kali perkalian +kali sekali +kali sekalian +kali sekalinya +kalian pengalian +kalian perkalian +kalian sekalian +kaliber berkaliber +kaliber sekaliber +kaliber sekalibernya +kalibrasi dikalibrasi +kalibrasi mengkalibrasi +kalih mengalih +kalih mengalihan +kalih mengalihkan +kalih mengalihkannya +kalih pengalih +kalih pengalihan +kalkulasi berkalkulasi +kalkulasi dikalkulasi +kalkulasi dikalkulasikan +kalkulasi mengalkulasi +kalkulasi mengalkulasikan +kalkulasi mengkalkulasi +kalkulasi mengkalkulasikan +kalkulasi terkalkulasi +kalong pekalongan +kalor berkalori +kalori berkalori +kalsium berkalsium +kalung berkalung +kalung dikalungi +kalung dikalungkan +kalung mengalungi +kalung mengalungkan +kalung pengalungan +kalut kekalutan +kam bekam +kam mengaman +kam mengami +kam mengamkan +kam pengaman +kam sekam +kam terkam +kam terkaman +kama mengamakan +kama pengamaan +kamal mengamali +kamal mengamalkan +kamal mengamalkannya +kamal pengamal +kamal pengamalan +kamar berkamar +kamar dikamar +kamar dikamarnya +kamar sekamar +kamar sekamarnya +kamat mengamati +kamat mengamatkan +kamat pengamat +kamat pengamatan +kamat pengamatnya +kambang mengambang +kambang mengambangkan +kambang mengambangnya +kambang pengambang +kambang pengambangan +kambang perkambangan +kambar mengambar +kambar mengambarkan +kambi mengambi +kambing dikambing +kambuh kekambuhan +kamera berkamera +kami mengami +kamil mengamil +kamil perkamil +kampanye berkampanye +kampanye dikampanyekan +kampanye dikampanyekannya +kampanye mengampanyekan +kampanye mengkampanyekan +kampanye mengkampanyekannya +kampanye pengkampanye +kampil mengampil +kampus dikampus +kampus sekampus +kampus sekampusnya +kamuflase berkamuflase +kamuflase dikamuflase +kamuflase dikamuflasekan +kamuflase mengkamuflase +kan dikanan +kan kekanan +kan mekan +kan mengani +kan pekan +kan pekanan +kan pekannya +kan pemkan +kan pengan +kan penganan +kan sekan +kan terkan +kan terkanan +kana kekanakan +kana menganai +kana menganakan +kana pengana +kana terkana +kanak-kanak kekanak-kanakan +kanak-kanak kekanak-kanakkan +kanal menganal +kanalisasi dikanalisasi +kanalisasi menganalisasi +kanan dikanan +kanan kekanan +kanan menganani +kanan pekanan +kanan penganan +kanan pengananan +kanan terkanan +kancah berkancah +kancah dikancah +kancing berkancing +kancing dikancing +kancing dikancingkan +kancing kekancingan +kancing mengancingkan +kancung mengancungkan +kanda mengandakan +kanda pengandaan +kandang berkandang +kandang dikandang +kandang dikandangi +kandang dikandangkan +kandang dikandangnya +kandang mengandangkan +kandang mengkandangkan +kandang pekandangan +kandang pengandangan +kandang terkandang +kandar pengandaran +kandas dikandaskan +kandas mengandaskan +kandas mengkandaskan +kandidat dikandidatkan +kandil pengandilan +kandung berkandungan +kandung dikandung +kandung dikandungnya +kandung mengandung +kandung mengandungnya +kandung sekandung +kandung terkandung +kang bekang +kang kekang +kang kekangan +kang pengang +kang pengangan +kang sekang +kangar mengangarkan +kangkang dikangkangi +kangkang mengangkang +kangkang mengangkangi +kangkang pengangkangan +kangsa pengangsaan +kanibal dikanibal +kanibal mengkanibal +kanjal menganjal +kanjar menganjar +kanopi berkanopi +kanta mengantakan +kantan bekantan +kantar mengantar +kantar mengantarkan +kantar mengantarkannya +kantar mengantarnya +kantar pengantar +kantar pengantaran +kantar pengantarnya +kanti menganti +kanti mengantikan +kanti mengantikannya +kanti mengantinya +kanti penganti +kanti pengantian +kanti pengantinya +kantin pengantin +kantin pengantinnya +kantong berkantong +kantong dikantong +kantong dikantongi +kantong mengantong +kantong mengantongi +kantong pengantongan +kantong sekantong +kantor berkantor +kantor berkantornya +kantor dikantor +kantor dikantornya +kantor kekantor +kantor mengantor +kantor perkantoran +kantor sekantor +kantor sekantornya +kantuk mengantuk +kantuk mengantuknya +kantuk terkantuk +kantung berkantung +kantung dikantungi +kantung mengantung +kantung mengantungi +kantung mengantungkan +kantung sekantung +kanvas dikanvaskan +kanvas menganvaskan +kanvas mengkanvaskan +kanya pekanya +kanya terkanya +kaos berkaos +kap bekap +kap bekapan +kap mengkap +kap pengap +kap pengapnya +kap pengkapan +kap perkap +kap perkapnya +kap sekap +kap sekapan +kapa bekapai +kapa mengapa +kapa mengapai +kapai bekapai +kapai mengapai +kapal dikapal +kapal dikapalkan +kapal mengapalkan +kapal mengkapalkan +kapal pengapalan +kapal pengkapalan +kapal perkapalan +kapan bekapan +kapan pengkapan +kapan sekapan +kapar terkapar +kapar terkaparnya +kapasitas bekapasitas +kapasitas berkapasitas +kapat sekapat +kapi pengapian +kapit mengapit +kapit mengapitnya +kapit pengapit +kapita perkapita +kapita perkapitanya +kapon pengapon +kapten dikapteni +kapten mengapteni +kapung mengapung +kapung mengapungkan +kapung pengapung +kapung pengapungan +kapur berkapur +kapur pekapuran +kapur pengapuran +kapur perkapuran +kapur sekapur +kara mengarakan +kara mengkara +kara pekara +kara pengarakan +kara perkara +kara perkarakan +kara perkaranya +karam dikaramkan +karam mengaramkan +karang berkarang +karang dikarang +karang mengarang +karang pekarangan +karang pengarang +karang pengarangnya +karang perkarangan +karang sekarang +karang sekarangkan +karang sekaranglah +karang sekarangnya +karantina dikarantina +karantina dikarantinakan +karantina kekarantinaan +karantina mengarantina +karantina mengkarantina +karantina perkarantinaan +karaoke berkaraoke +karap mengarap +karap mengarapkan +karas kekarasan +karat berkarat +karat sekarat +karbohidrat berkarbohidrat +karbon berkarbon +karbonat berkarbonat +kardus sekardus +karena dikarena +karena dikarenakan +karier berkarier +karisma berkarisma +karpet berkarpet +karti mengartikan +karti mengartikannya +kartu berkartu +kartu dikartu +kartu mengartu +kartu mengkartu +karung mengarungi +karung pekarungan +karung pengarungan +karung perkarung +karung sekarung +karunia dikarunia +karunia dikaruniai +karunia dikaruniakan +karya bekarya +karya berkarya +karya dikaryakan +karya kekaryaan +karyawan kekaryawanan +kas bekas +kas bekasi +kas bekasnya +kas berkas +kas berkasi +kas berkasnya +kas dikasi +kas mengaskan +kas pekas +kasa mengasai +kasa perkasa +kasa perkasanya +kasah mengasah +kasah mengasahnya +kasah pengasah +kasah pengasahan +kasai mengasai +kasam pengasaman +kasap mengasapi +kasap pengasapan +kasar dikasari +kasar kekasaran +kasar mengasari +kasar mengkasari +kasar sekasar +kasasi dikasasi +kasasi dikasasikan +kasi bekasi +kasi berkasi +kasi dikasi +kasih berkasih +kasih dikasih +kasih dikasihi +kasih dikasihkan +kasih dikasihnya +kasih kekasih +kasih kekasihnya +kasih mengasih +kasih mengasihi +kasih pengasih +kasih pengasihan +kasih terkasih +kasih terkasihnya +kasir pekasiran +kasta berkasta +kasus berkasus +kasus dikasuskan +kasus perkasus +kata berkata +kata berkatalah +kata dikata +kata dikatai +kata dikatakan +kata dikatakannya +kata mengataan +kata mengatai +kata mengatakan +kata mengatakannya +kata perkata +kata perkataan +kata sekata +kata terkatakan +katai dikatai +katai mengatai +katak dikatakan +katak mengatak +katak mengatakan +katak mengatakkan +katak sekatak +katak terkatakan +kataka dikataka +kataka dikatakanya +kataka mengataka +kataka mengatakaan +kataka mengatakakan +katakana mengatakana +katalisasi mengkatalisasi +katar mengatar +katar mengatarkan +katar pengatar +kategori berkategori +kategori dikategori +kategori dikategorikan +kategori mengategorikan +kategori mengategorikannya +kategori mengkategorikan +kategori mengkategorikannya +kategori pengategorian +kategori pengkategorian +kategori terkategori +kategori terkategorikan +kategorisasi dikategorisasi +kati berkati +kati dikatikan +kati sekati +kati terkati +katik dikatikan +katrol dikatrol +katrol mengatrol +katrol mengkatrol +katrol terkatrol +katul bekatul +katung sekatung +katung terkatung +katup mengatup +katup mengatupkan +katup terkatup +kau dikau +kau mengau +kau mengkau +kau mengkaui +kaum mengaum +kaum pekauman +kaus berkaus +kaut kekautan +kaut mengaut +kaver mengkaver +kaver terkaver +kawak mengawaki +kawak pengawak +kawak pengawakan +kawal dikawal +kawal dikawalnya +kawal mengawal +kawal mengawali +kawal mengawalnya +kawal mengkawal +kawal pengawal +kawal pengawalan +kawal pengawalnya +kawal terkawal +kawan berkawan +kawan dikawan +kawan pengawan +kawan perkawanan +kawan sekawan +kawan sekawanan +kawang mengawang +kawasan dikawasan +kawasan pengawasan +kawasan pengawasannya +kawasan sekawasan +kawat berkawat +kawat mengawati +kawin dikawin +kawin dikawini +kawin dikawinkan +kawin mengawini +kawin mengawinkan +kawin mengawinkannya +kawin perkawinan +kaya dikayakan +kaya kekayaan +kaya mengayakan +kaya pengaya +kaya pengayaan +kaya pengkayaan +kaya perkaya +kaya sekaya +kaya terkaya +kayak dikayakan +kayak mengayak +kayak mengayakan +kayan kekayan +kayan kekayannya +kayu berkayu +kayu perkayuan +kayu sekayu +kayuh dikayuh +kayuh mengayuh +kayuh mengayuhkan +kayuh pengayuh +kayun mengayun +kayun mengayunkan +kayun mengayunkannya +ke berke +ke dike +ke keke +ke menge +ke menke +ke seke +kebal kekebalan +kebas kekebasan +kebaya berkebaya +kebiri dikebiri +kebiri mengebiri +kebiri mengkebiri +kebiri pengebirian +kebul mengebul +kebun berkebun +kebun dikebun +kebun pekebun +kebun pekebunan +kebun perkebunan +kebut dikebut +kebut mengebut +kecak pengecakan +kecam dikecam +kecam dikecamnya +kecam mengecam +kecam mengecamnya +kecam pengecam +kecam pengecaman +kecam pengecamnya +kecambah berkecambah +kecambah perkecambahan +kecamuk berkecamuk +kecamuk berkecamuknya +kecap dikecap +kecap mengecap +kecap pengecap +kecap pengecapan +kece mengecekan +kece pengecekan +kece pengecekannya +kecek mengecek +kecek mengecekan +kecek mengeceknya +kecek pengecek +kecek pengecekan +kecek pengecekkan +kecer mengecer +kecer mengecerkan +kecer pengecer +kecer pengecernya +kecewa dikecewakan +kecewa kekecewaan +kecewa mengecewakan +kecewa mengecewakannya +kecil berkecil +kecil dikecilkan +kecil kekecilan +kecil mengecil +kecil mengecilkan +kecil mengecilkannya +kecil mengecilnya +kecil pengecil +kecil pengecilan +kecil perkecil +kecil sekecil +kecil terkecil +kecil terkecilnya +kecimpung bekecimpung +kecimpung berkecimpung +kecoh dikecoh +kecoh mengecoh +kecoh mengecohkan +kecoh mengecohnya +kecoh pengecoh +kecoh terkecoh +kecuali dikecualikan +kecuali kekecualian +kecuali mengecualikan +kecuali pengecualian +kecuali perkecualian +kecuali terkecuali +kecup mengecup +kecut pengecut +kedal pengedali +kedip berkedip +kedip mengedip +kedip mengedipkan +kedok berkedok +keduduk berkedudukan +keduk mengeduk +kedut berkedut +kejam kekejaman +kejam sekejam +kejam terkejam +kejan mengejan +kejang kekejangan +kejang mengejang +kejap sekejap +kejar berkejaran +kejar dikejar +kejar dikejarnya +kejar kekejar +kejar mengejar +kejar mengejarkan +kejar mengejarnya +kejar pengejar +kejar pengejaran +kejar pengejarnya +kejar terkejar +keji kekejian +keji sekeji +keju mengejukan +kejut dikejutkan +kejut mengejutan +kejut mengejutkan +kejut mengejutkannya +kejut pengejut +kejut terkejut +kejut terkejutlah +kejut terkejutnya +kek kekek +kekal kekekalan +kekal mengekalkan +kekang dikekang +kekang mengekang +kekang mengekangnya +kekang pengekang +kekang pengekangan +kekang terkekang +kekeh terkekeh +kelabu dikelabui +kelabu mengelabui +kelabu pengelabuan +kelabu terkelabui +kelah berkelahi +kelah kekelahan +kelah mengelahkan +kelahi berkelahi +kelahi perkelahian +kelak mengelak +kelak mengelakkan +kelak mengelaknya +kelak pengelak +kelak pengelakan +kelakar berkelakar +kelam kekelaman +kelam mengelami +kelam pengelaman +kelam terkelam +kelamin berkelamin +kelana berkelana +kelana pengelana +kelap mengelap +kelap mengelapkan +kelap mengelapnya +kelap pengelap +kelap pengelapan +kelap-kelip berkelap-kelip +kelar mengelar +kelar mengelarkan +kelas berkelas +kelas berkelasnya +kelas dikelas +kelas dikelasnya +kelas mengelas +kelas pengelasan +kelas sekelas +kelas sekelasnya +kelebat berkelebat +kelebat sekelebat +keler dikeler +keliar bekeliaran +keliar berkeliaran +keliling bekeliling +keliling berkeliling +keliling dikeliling +keliling dikelilingi +keliling mengeliling +keliling mengelilingi +keliling sekeliling +keliling sekelilingnya +kelindan berkelindan +kelip berkelip +kelir berkelir +kelir dikelir +keliru kekeliruan +kelit berkelit +kelitik mengelitik +kelok berkelok +kelola dikelola +kelola dikelolanya +kelola mengelola +kelola mengelolaan +kelola mengelolanya +kelola pengelola +kelola pengelolaan +kelola pengelolanya +kelola terkelola +kelompok berkelompok +kelompok dikelompokan +kelompok dikelompokkan +kelompok mengelompok +kelompok mengelompokan +kelompok mengelompokkan +kelompok mengelompokkannya +kelompok pengelompokan +kelompok pengelompokkan +kelompok perkelompok +kelompok sekelompok +kelopak berkelopak +kelu mengelukan +kelua mengeluakan +keluak mengeluakan +keluar dikeluar +keluar dikeluaran +keluar dikeluarkan +keluar dikeluarkannya +keluar mengeluar +keluar mengeluaran +keluar mengeluarkan +keluar mengeluarkannya +keluar pengeluar +keluar pengeluaran +keluar pengeluarkan +keluar sekeluar +keluar sekeluarnya +keluarga bekeluarga +keluarga berkeluarga +keluarga dikeluarga +keluarga kekeluargaan +keluarga sekeluarga +keluh berkeluh +keluh dikeluhkan +keluh dikeluhkannya +keluh mengeluh +keluh mengeluhkan +keluh mengeluhkannya +keluh pengeluh +keluk mengelukan +kelumit sekelumit +kelupas dikelupas +kelupas mengelupas +kelupas mengelupaskan +kelupas pengelupas +kelupas pengelupasan +kelupas terkelupas +kelupas terkelupasnya +kelus mengelus +kelus mengelusnya +kelut mengeluti +keluyur berkeluyuran +kemah berkemah +kemah perkemahan +kemas berkemas +kemas berkemasan +kemas dikemas +kemas dikemasi +kemas dikemasnya +kemas mengemas +kemas mengemasi +kemas mengemaskan +kemas mengemasnya +kemas pengemas +kemas pengemasan +kemas terkemas +kemat mengemat +kemat pengematan +kembal dikembali +kembal sekembali +kembali dikembali +kembali dikembalikan +kembali dikembalikannya +kembali mengembalikan +kembali mengembalikannya +kembali pengembalian +kembali pengembalikan +kembali sekembali +kembali sekembalinya +kemban mengemban +kemban mengembankan +kemban mengembannya +kemban pengemban +kemban pengembanan +kembang bekembang +kembang berkembang +kembang berkembangan +kembang berkembangkan +kembang berkembanglah +kembang berkembangnya +kembang dikembang +kembang dikembangan +kembang dikembangkan +kembang dikembangkannya +kembang mengembang +kembang mengembangan +kembang mengembangkan +kembang mengembangkannya +kembang mengembangnya +kembang pekembangan +kembang pengembang +kembang pengembangan +kembang pengembangkan +kembang pengembangnya +kembang perkembang +kembang perkembangan +kembang perkembangkan +kembang perkembangnya +kembang terkembang +kembung mengembung +kemeja berkemeja +kemi perkemi +kemih berkemih +kemoterapi dikemoterapi +kempas mengempas +kempas mengempaskan +kempis dikempiskan +kempis mengempis +kempis mengempiskan +kempis pengempisan +kempit mengempit +kemplang dikemplang +kemplang mengemplang +kemplang pengemplang +kemplang pengemplangan +kemu dikemukan +kemu mengemukan +kemu terkemukan +kemudi berkemudi +kemudi dikemudian +kemudi dikemudikan +kemudi dikemudikannya +kemudi mengemudi +kemudi mengemudikan +kemudi mengemudikannya +kemudi mengemudilah +kemudi mengemudinya +kemudi pengemudi +kemudi pengemudian +kemudi pengemudinya +kemudian dikemudian +kemudian pengemudian +kemut mengemut +ken beken +ken bekennya +ken berkenan +ken keken +ken mengeni +ken peken +ken pengen +ken pengennya +ken perkenan +ken perkeni +ken seken +ken terkenan +kena berkenaan +kena dikena +kena dikenai +kena dikenakan +kena dikenakannya +kena mengena +kena mengenai +kena mengenakan +kena mengenakannya +kena pengenaan +kena pengenai +kena sekenanya +kena terkena +kena terkenanya +kenal berkenalan +kenal dikenal +kenal dikenalan +kenal dikenali +kenal dikenalkan +kenal dikenalkannya +kenal dikenalnya +kenal mengenal +kenal mengenali +kenal mengenalkan +kenal mengenalkannya +kenal mengenalnya +kenal pengenal +kenal pengenalan +kenal pengenalnya +kenal perkenalan +kenal perkenalkan +kenal terkenal +kenal terkenali +kenal terkenalnya +kenan berkenan +kenan dikenankan +kenan mengenani +kenan perkenan +kenan perkenankan +kenan terkenan +kenang dikenang +kenang dikenangnya +kenang mengenang +kenang mengenangi +kenang mengenangkan +kenang mengenangnya +kenang terkenang +kenas mengenasi +kenas mengenaskan +kencan berkencan +kencan dikencani +kencan mengencani +kencan perkencanan +kencang dikencangkan +kencang kekencangan +kencang mengencang +kencang mengencangkan +kencang mengencangkannya +kencang pengencang +kencang pengencangan +kencang sekencang +kencang terkencang +kencar mengencarkan +kencing dikencingi +kencing mengencingi +kendal berkendali +kendal dikendali +kendal pengendali +kendal terkendal +kendal terkendali +kendala berkendala +kendala terkendala +kendala terkendalanya +kendali berkendali +kendali dikendali +kendali dikendalikan +kendali dikendalikannya +kendali mengendalikan +kendali mengendalikannya +kendali pengendali +kendali pengendalian +kendali pengendalinya +kendali terkendali +kendali terkendalikan +kendali terkendalinya +kendara bekendara +kendara berkendara +kendara berkendaraan +kendara berkendaralah +kendara berkendaranya +kendara dikendaraan +kendara dikendarai +kendara mengendara +kendara mengendarai +kendara mengendarakan +kendara pengendara +kendara pengendaraan +kendara pengendaranya +kendong mengendong +kendur dikendurkan +kendur kekenduran +kendur mengendur +kendur mengendurkan +kendur mengendurnya +kendur pengenduran +keng mekeng +kental kekentalan +kental mengental +kental mengentalkan +kental pengental +kental pengentalan +kenteng mengentengkan +kenyal kekenyalan +kenyal mengenyalkan +kenyam mengenyam +kenyang kekenyangan +kenyang mengenyangkan +keong mengeong +kepak mengepak +kepak mengepakan +kepak mengepakkan +kepak pengepakan +kepal mengepal +kepal mengepalkan +kepal sekepal +kepal sekepalan +kepal terkepal +kepala berkepala +kepala dikepala +kepala dikepalai +kepala dikepalanya +kepala mengepalai +kepang dikepang +kepang mengepang +kepel mengepel +keping berkeping +keping sekeping +kepret dikepret +kepret mengepret +kepruk dikepruk +kepul mengepul +kepul mengepulkan +kepul pengepul +kepul pengepulan +kepul pengepulnya +kepung dikepung +kepung mengepung +kepung mengepungnya +kepung pengepungan +kepung terkepung +kera bekera +kera kekeraan +kera mengerakan +kera pekera +kerabat berkerabat +kerabat kekerabatan +kerah bekerah +kerah berkerah +kerah dikerahkan +kerah dikerahkannya +kerah mengerah +kerah mengerahkan +kerah mengerahkannya +kerah pengerah +kerah pengerahan +kerak berkerak +kerak mengerak +kerak mengerakan +kerak mengerakkan +kerak pengerak +keram mengeram +keram mengerami +keram pengeraman +keraman pengeraman +keramas berkeramas +keramas dikeramas +keramat dikeramatkan +keramat mengeramatkan +keramat mengkeramatkan +keramik dikeramik +keran kekeran +keran pengeran +kerang kekerangan +kerang mengerang +kerang pengerang +kerang sekerang +kerangka berkerangka +kerangkeng dikerangkeng +keranjang sekeranjang +kerap dikerap +kerap kekerapan +kerap pengerapan +keras berkeras +keras dikerasi +keras dikeraskan +keras kekerasan +keras mengeras +keras mengeraskan +keras mengerasnya +keras pengeras +keras pengerasan +keras perkerasan +keras sekeras +keras terkeras +kerasan kekerasan +kerasan kekerasannya +kerasan pengerasan +kerasan perkerasan +kerat mengerat +kerat mengeratkan +kerat pengerat +kerat sekerat +kerdil dikerdilkan +kerdil kekerdilan +kerdil mengerdilkan +kerdil mengkerdilkan +kerdil pengerdilan +kerdil pengkerdilan +kerek dikerek +kerek mengerek +kerek pengerek +kerek terkerek +kerek terkereknya +keren sekeren +keren terkeren +kereta berkereta +kereta perkereta +keri mengeri +keri mengerikan +keri mengerikannya +kerik dikerik +kerik mengerik +kerik mengerikan +kerikil berkerikil +kering dikeringkan +kering kekeringan +kering mengering +kering mengeringkan +kering mengeringkannya +kering mengeringnya +kering pengering +kering pengeringan +kering sekering +kering terkering +keringat berkeringat +keriput berkeriput +keriput mengeriput +keritik mengeritik +keritik pengeritik +keritik pengeritiknya +keriting dikeriting +keriting mengeriting +keriting pengeriting +keriting pengeritingan +kerja bekerja +kerja bekerjalah +kerja bekerjanya +kerja berkerja +kerja dikerja +kerja dikerjaan +kerja dikerjai +kerja dikerjakan +kerja dikerjakannya +kerja mengerjai +kerja mengerjakan +kerja mengerjakannya +kerja pekerja +kerja pekerjaan +kerja pekerjakan +kerja pekerjanya +kerja pengerja +kerja pengerjaan +kerja perkerja +kerja perkerjaan +kerja sekerja +kerja sekerjanya +kernyit mengernyit +kernyit mengernyitkan +kerok dikerok +kerok dikeroki +kerok mengerok +keropos kekeroposan +keropos pengeroposan +kerosi mengerosi +keroyok dikeroyok +keroyok mengeroyok +keroyok mengeroyoknya +keroyok pengeroyok +keroyok pengeroyokan +keroyok pengeroyokkan +keroyok pengeroyoknya +kers kekersan +kerubung dikerubungi +kerubung mengerubung +kerubung mengerubungi +kerubut dikerubuti +kerubut mengerubuti +kerucut dikerucutkan +kerucut mengerucut +kerucut mengerucutkan +kerucut mengerucutnya +kerucut mengkerucut +kerucut pengerucutan +kerudung berkerudung +keruh berkeruh +keruh kekeruhan +keruh mengeruh +keruh mengeruhkan +keruh perkeruh +keruk dikeruk +keruk mengeruk +keruk pengeruk +keruk pengerukan +keruk pengerukkan +keruk terkeruk +kerumun berkerumun +kerumun berkerumunan +kerumun dikerumunan +kerumun dikerumuni +kerumun mengerumuni +kerumun sekerumunan +kerupuk pengerupukan +kerut berkerut +kerut mengerut +kerut mengerutkan +kerut mengkerut +kerut pengerutan +kes berkesan +kes mekes +kes menkes +kes terkes +kes terkesan +kesah mengesahan +kesah mengesahkan +kesah mengesahkannya +kesah pengesahan +kesak mengesakan +kesal kekesalan +kesal mengesalkan +kesan berkesan +kesan berkesannya +kesan dikesankan +kesan mengesankan +kesan mengesankannya +kesan terkesan +kesan terkesannya +keset mengeset +keset pengesetan +kesiap terkesiap +kesima terkesima +keta mengetakan +ketak mengetakan +ketar mengetarkan +ketat diketatkan +ketat keketatan +ketat mengetat +ketat mengetatkan +ketat mengetatnya +ketat pengetatan +ketat perketat +ketat perketatan +ketat seketat +ketat terketat +ketemu diketemukan +ketemu diketemukannya +keteng seketeng +ketes mengetes +ketes mengetesnya +ketes pengetes +ketes pengetesan +keti mengetikan +keti pengetikan +keti seketi +ketik diketik +ketik diketikkan +ketik mengetik +ketik mengetikan +ketik mengetikkan +ketik mengetiknya +ketik pengetik +ketik pengetikan +ketok diketok +ketok mengetok +ketok pengetokan +ketombe berketombe +ketu diketui +ketu mengetukan +ketua diketua +ketua diketuai +ketua keketuaan +ketua mengetuai +ketuk diketuk +ketuk mengetuk +ketuk mengetukan +ketuk mengetukkan +ketuk mengetuknya +ketuk pengetuk +ketuk terketuk +kewuh pekewuh +khabis menghabisi +khabis menghabiskan +khabis menghabiskannya +khabis penghabisan +khalifah kekhalifahan +khalwat berkhalwat +khas kekhasan +khasi menghasikan +khasiat berkhasiat +khatam menghatam +khatam mengkhatamkan +khawatir dikhawatir +khawatir dikhawatirkan +khawatir dikhawatirkannya +khawatir kekhawatiran +khawatir kekhawatirkan +khawatir menghawatirkan +khawatir mengkhawatir +khawatir mengkhawatiran +khawatir mengkhawatirkan +khawatir mengkhawatirkannya +khawatir menkhawatirkan +khayal berkhayal +khayal menghayal +khayal mengkhayal +khayal mengkhayalkan +khianat berkhianat +khianat dikhianati +khianat menghianati +khianat mengkhianati +khianat penghianat +khianat penghianatan +khianat pengkhianat +khianat pengkhianatan +khianat terkhianati +khidmat berkhidmat +khidmat kekhidmatan +khilaf kekhilafan +khitan dikhitan +khitan mengkhitan +khotbah berkhotbah +khotbah pengkhotbah +khusus dikhususkan +khusus dikhususnya +khusus kekhususan +khusus mengkhususkan +khusus pengkhususan +khusus terkhusus +khusyuk kekhusyukan +ki beki +ki berkilah +ki diki +ki keki +ki meki +ki mengi +ki pekikan +ki pengki +ki perki +ki seki +ki sekian +kian sekian +kiar sekiar +kiat berkiatan +kiat mengiatkan +kiat pengiat +kiat sekiat +kiat terkiat +kibar berkibar +kibar berkibarlah +kibar berkibarnya +kibar dikibarkan +kibar dikibarkannya +kibar mengibarkan +kibar mengibarkannya +kibar pengibar +kibar pengibaran +kibas dikibaskan +kibas mengibas +kibas mengibaskan +kiblat berkiblat +kibul dikibuli +kibul mengibuli +kicau berkicau +kicau dikicaukan +kicau dikicaukannya +kicau mengicau +kicau mengicaukan +kicau pengicau +kici perkici +kidam mengidam +kidam mengidamkan +kijang sekijang +kik pekik +kik pekikan +kik pekiknya +kikir dikikir +kikir mengikir +kikir pekikir +kikis dikikis +kikis mengikis +kikis mengikisnya +kikis mengkikis +kikis pengikis +kikis pengikisan +kikis terkikis +kikis terkikisnya +kikuk kekikukan +kilah berkilah +kilang mengilang +kilang mengilangkan +kilang pengilangan +kilap berkilap +kilap mengilap +kilap mengilapnya +kilap mengkilap +kilap mengkilapnya +kilas mengilas +kilas sekilas +kilat berkilat +kilat mengilat +kilat mengkilat +kilau berkilau +kilau berkilauan +kilau mengkilau +kili dikili +kilir terkilir +kilo perkilo +kilo perkilonya +kilo sekilo +kilo sekilonya +kilogram perkilogram +kilogram perkilogramnya +kilogram sekilogram +kilometer berkilometer +kilometer perkilometer +kilometer perkilometernya +kim bekim +kim perkim +kimbang mengimbang +kimbang mengimbangi +kimbang mengimbangkan +kimbang pengimbang +kina mengina +kincau sekincau +kindap mengindap +kinerja berkinerja +kini kekinian +kini pengkinian +kini terkini +kini terkininya +kinja menginjakan +kinja penginjakan +kipas dikipas +kipas dikipasi +kipas mengipas +kipas mengipasi +kiprah berkiprah +kir bekir +kir dikir +kir dikiri +kir kekiri +kir mengiri +kir mengkir +kir pengiran +kir perkiran +kir sekir +kira dikira +kira dikiranya +kira mengira +kira mengiranya +kira perkiraan +kira perkirakan +kira sekira +kira sekiranya +kira terkira +kirab dikirab +kiri dikiri +kiri kekiri +kiri mengiri +kiri mengirikan +kirik mengirikan +kirim berkirim +kirim dikirim +kirim dikirimi +kirim dikirimkan +kirim dikirimkannya +kirim dikirimlah +kirim dikirimnya +kirim mengirim +kirim mengiriman +kirim mengirimi +kirim mengirimkan +kirim mengirimkannya +kirim mengirimnya +kirim pengirim +kirim pengiriman +kirim pengirimkan +kirim pengirimnya +kirim terkirim +kirim terkirimnya +kiris mengiris +kiris mengirisnya +kiris pengiris +kisah berkisah +kisah dikisahkan +kisah dikisahkannya +kisah mengisahkan +kisah mengkisahkan +kisar bekisar +kisar berkisar +kisar berkisaran +kisar dikisaran +kisar dikisarkan +kisar sekisar +kisi mengisi +kisi mengisikan +kisi mengisinya +kisi pengisi +kisi pengisian +kisi pengisinya +kisik mengisikan +kisruh kekisruhan +kit berkitan +kit dikit +kit dikitlah +kit terkit +kita dikita +kita sekita +kita sekitanya +kitar dikitari +kitar mengitari +kitar sekitar +kitar sekitaran +kitar sekitarnya +kitir pengkitiran +klaim diklaim +klaim diklaimkan +klaim diklaimnya +klaim mengklaim +klaim mengklaimnya +klaim menglaim +klaim menklaim +klaim pengklaim +klaim pengklaiman +klakson diklakson +klakson mengklakson +klarifikasi diklarifikasi +klarifikasi diklarifikasikan +klarifikasi mengklarifikasi +klarifikasi mengklarifikasikan +klarifikasi mengklarifikasinya +klarifikasi menglarifikasi +klarifikasi terklarifikasi +klasemen diklasemen +klasifikasi berklasifikasi +klasifikasi diklasifikasi +klasifikasi diklasifikasikan +klasifikasi mengklasifikasi +klasifikasi mengklasifikasikan +klasifikasi mengklasifikasikannya +klasifikasi pengklasifikasian +klasifikasi terklasifikasi +klik diklik +klik mengklik +klik mengkliknya +kloning dikloning +kloning mengkloning +kloning pengkloningan +klorat perklorat +klorin berklorin +klub diklub +klub diklubnya +klub seklub +klub seklubnya +knalpot berknalpot +koalisi berkoalisi +koar berkoar +kobar berkobar +kobar berkobarnya +kobar dikobarkan +kobar mengobarkan +kobar pengobar +kocek berkocek +kocek mengocek +koci sekoci +koci sekocinya +kocok dikocok +kocok mengocok +kocok mengocoknya +kocok pengocokan +koda mengoda +kode berkode +kode dikodekan +kode mengkodekan +kode pengkodean +kode pengodean +kodifikasi dikodifikasi +kodok mengodok +koh berkoh +kok pengkok +kok pengok +kokah sekokah +kokang dikokang +kokang mengokang +kokok berkokok +kol pengkol +kol pengkolan +kol sekolan +kola mengola +kola pengola +kola pengolaan +kola sekola +kolaborasi berkolaborasi +kolaborasi dikolaborasi +kolaborasi dikolaborasikan +kolaborasi mengkolaborasi +kolaborasi mengkolaborasikan +kolaborasi mengolaborasi +kolaborasi mengolaborasikan +koleksi dikoleksi +koleksi dikoleksinya +koleksi mengkoleksi +koleksi mengoleksi +koleksi mengoleksinya +koleksi pengkoleksi +koleksi pengoleksi +kolesterol berkolesterol +kolok mengolok +kolok mengoloknya +kolon berkoloni +kolong mengolongi +kolong sekolong +koloni berkoloni +kolonisasi mengkolonisasi +kolusi berkolusi +komandan dikomandani +komandan mengomandani +komando dikomando +komando dikomandoi +komando mengkomando +komando mengkomandoi +komando mengomando +komando mengomandoi +kombinasi berkombinasi +kombinasi dikombinasi +kombinasi dikombinasikan +kombinasi mengkombinasi +kombinasi mengkombinasikan +kombinasi mengkombinasikannya +kombinasi mengombinasi +kombinasi mengombinasikan +kombinasi mengombinasikannya +komentar bekomentar +komentar berkomentar +komentar dikomentari +komentar mengkomentari +komentar mengomentar +komentar mengomentari +komersial dikomersialkan +komersial mengkomersialkan +komersial mengomersialkan +komersialisasi dikomersialisasi +komersialisasi dikomersialisasikan +komersialisasi mengkomersialisasikan +komersialisasi mengomersialisasikan +komitmen berkomitmen +komitmen dikomitmenkan +kompak kekompakan +kompak kekompakkan +kompak sekompak +komparasi dikomparasi +komparasi dikomparasikan +komparasi mengkomparasi +komparasi mengkomparasikan +komparasi mengomparasi +komparasi mengomparasikan +kompatriot sekompatriotnya +kompensasi dikompensasi +kompensasi dikompensasikan +kompensasi mengkompensasi +kompensasi mengompensasi +kompensasi terkompensasi +kompeten berkompeten +kompetensi berkompetensi +kompetisi berkompetisi +kompetisi dikompetisi +kompetisi dikompetisikan +kompetitif berkompetitif +kompetitif sekompetitif +kompilasi dikompilasi +kompilasi dikompilasikan +kompilasi mengkompilasi +kompilasi mengkompilasikan +kompilasi mengompilasi +komplain dikomplain +komplain mengkomplain +kompleks sekompleks +komplikasi berkomplikasi +komplot berkomplot +kompon berkompon +komponen berkomponen +kompor dikompori +kompor mengompori +kompos pengomposan +komposisi berkomposisi +kompres berkompresi +kompres dikompres +kompres dikompresi +kompres mengkompres +kompres mengkompresi +kompres mengompres +kompres mengompresi +kompres mengompresnya +kompres pengompresan +kompres terkompresi +kompresi berkompresi +kompresi dikompresi +kompresi mengkompresi +kompresi mengompresi +kompresi terkompresi +kompromi berkompromi +kompromi dikompromi +kompromi dikompromikan +kompromi mengkompromikan +kompromi mengompromikan +komputer berkomputer +komputer memkomputer +komputerisasi dikomputerisasi +komputerisasi terkomputerisasi +komunikasi bekomunikasi +komunikasi berkomunikasi +komunikasi berkomunikasilah +komunikasi berkomunikasinya +komunikasi dikomunikasi +komunikasi dikomunikasikan +komunikasi mengkomunikasi +komunikasi mengkomunikasikan +komunikasi mengkomunikasikannya +komunikasi mengomunikasikan +komunikasi mengomunikasikannya +komunikasi terkomunikasi +komunikasi terkomunikasikan +komunitas berkomunitas +konco perkoncoan +kondensasi terkondensasi +kondisi berkondisi +kondisi dikondisikan +kondisi mengkondisikan +kondisi mengondisikan +kondisi pengkondisian +kondisi pengondisian +kondisi terkondisi +kondisi terkondisikan +kondusif kekondusifan +kondusif mengkondusifkan +kondusif sekondusif +koneksi berkoneksi +koneksi dikoneksi +koneksi dikoneksikan +koneksi mengkoneksi +koneksi mengkoneksikan +koneksi mengoneksikan +koneksi terkoneksi +koneksi terkoneksinya +konfigurasi berkonfigurasi +konfigurasi dikonfigurasi +konfigurasi dikonfigurasikan +konfigurasi mengkonfigurasi +konfigurasi mengonfigurasi +konfigurasi terkonfigurasi +konfirmasi dikonfirmasi +konfirmasi dikonfirmasikan +konfirmasi mengkonfirmasi +konfirmasi mengkonfirmasikan +konfirmasi mengkonfirmasikannya +konfirmasi mengkonfirmasinya +konfirmasi mengonfirmasi +konfirmasi mengonfirmasikan +konfirmasi mengonfirmasikannya +konfirmasi mengonfirmasinya +konfirmasi menkonfirmasi +konfirmasi terkonfirmasi +konflik berkonflik +konfrontasi berkonfrontasi +konfrontasi dikonfrontasi +konfrontasi dikonfrontasikan +konfrontasi mengkonfrontasi +konfrontasi mengkonfrontasikan +konfrontasi mengonfrontasi +kongres berkongres +kongsi berkongsi +kongsi perkongsian +konkret dikonkretkan +konkret mengkonkretkan +konotasi berkonotasi +konotasi dikonotasikan +konsekuensi berkonsekuensi +konsentrasi berkonsentrasi +konsentrasi berkonsentrasilah +konsentrasi dikonsentrasikan +konsentrasi mengkonsentrasikan +konsentrasi mengonsentrasikan +konsentrasi terkonsentrasi +konsentrasi terkonsentrasinya +konsep berkonsep +konsep dikonsep +konsep dikonsepkan +konsep mengkonsep +konsep mengonsep +konsep mengonsepkan +konsep pengonsep +konsep terkonsep +konservasi dikonservasi +konservasi mengkonservasi +konservasi mengonservasi +konsinyasi dikonsinyasi +konsisten kekonsistenan +konsisten sekonsisten +konsolidasi berkonsolidasi +konsolidasi dikonsolidasi +konsolidasi dikonsolidasikan +konsolidasi mengkonsolidasi +konsolidasi mengkonsolidasikan +konsolidasi mengonsolidasi +konsolidasi mengonsolidasikan +konsolidasi menkonsolidasikan +konsolidasi terkonsolidasi +konsolidasi terkonsolidasikan +konsolidasi terkonsolidasinya +konsorsium berkonsorsium +konspirasi berkonspirasi +konstitusi berkonstitusi +konstruksi berkonstruksi +konstruksi dikonstruksi +konstruksi dikonstruksikan +konstruksi mengkonstruksi +konstruksi mengkonstruksikan +konstruksi mengonstruksi +konstruksi mengonstruksikan +konstruksi terkonstruksi +konsultasi berkonsultasi +konsultasi berkonsultasilah +konsultasi dikonsultasikan +konsultasi mengkonsultasikan +konsultasi mengkonsultasikannya +konsultasi mengonsultasikan +konsultasi mengonsultasikannya +konsumsi berkonsumsi +konsumsi dikonsumsi +konsumsi dikonsumsinya +konsumsi mengkonsumsi +konsumsi mengkonsumsinya +konsumsi mengonsumsi +konsumsi mengonsumsinya +konsumsi menkonsumsi +konsumsi pengkonsumsi +konsumsi pengkonsumsian +konsumsi pengkonsumsinya +konsumsi pengonsumsi +konsumsi pengonsumsian +konsumsi pengonsumsinya +konsumsi terkonsumsi +kontak berkontak +kontak dikontak +kontak mengkontak +kontak mengontak +kontak mengontaknya +kontak terkontak +kontaminasi mengkontaminasi +kontaminasi mengontaminasi +kontaminasi terkontaminasi +kontaminasi terkontaminasinya +konteks berkonteks +kontemplasi berkontemplasi +konter dikonter +konter mengkonter +kontes berkontes +kontes dikonteskan +kontol mengontol +kontradiksi berkontradiksi +kontrak berkontrak +kontrak dikontrak +kontrak dikontrakan +kontrak dikontrakkan +kontrak dikontraknya +kontrak mengkontrak +kontrak mengontrak +kontrak mengontrakkan +kontrak mengontraknya +kontrak pengontrak +kontrak terkontrak +kontraksi berkontraksi +kontraksi terkontraksi +kontraksi terkontraksinya +kontras dikontraskan +kontras kekontrasan +kontras mengontraskan +kontribusi bekontribusi +kontribusi berkontribusi +kontribusi dikontribusi +kontribusi dikontribusikan +kontribusi mengkontribusi +kontribusi mengkontribusikan +kontribusi mengontribusi +kontribusi mengontribusikan +kontrol dikontrol +kontrol dikontrolnya +kontrol mengkontrol +kontrol mengontrol +kontrol mengontrolnya +kontrol pengontrol +kontrol pengontrolan +kontrol pengontrolnya +kontrol terkontrol +kontrol terkontrolnya +kontur berkontur +konvergensi berkonvergensi +konvergensi terkonvergensi +konversi dikonversi +konversi dikonversikan +konversi mengkonversi +konversi mengkonversikan +konversi mengkonversikannya +konversi mengkonversinya +konversi mengonversi +konversi mengonversikan +konversi mengonversikannya +konversi mengonversinya +konversi menkonversi +konversi terkonversi +konvoi berkonvoi +konyol kekonyolan +kooperasi berkooperasi +kooptasi dikooptasi +kooptasi mengkooptasi +kooptasi terkooptasi +koordinasi bekoordinasi +koordinasi berkoordinasi +koordinasi berkoordinasikan +koordinasi dikoordinasi +koordinasi dikoordinasikan +koordinasi mengkoordinasi +koordinasi mengkoordinasikan +koordinasi mengkoordinasikannya +koordinasi mengoordinasi +koordinasi mengoordinasikan +koordinasi mengoordinasikannya +koordinasi pengkoordinasian +koordinasi terkoordinasi +koordinasi terkoordinasikan +koordinasi terkoordinasinya +koordinator dikoordinatori +kop berkop +kop dikopi +kop mengkopi +kop mengopi +kop menkop +kop sekop +koper mengoper +koper mengoperkan +koper mengoperkannya +koper mengopernya +koper pengoper +koper pengoperan +koper sekoper +koperasi berkoperasi +koperasi mengoperasi +koperasi mengoperasikan +koperasi mengoperasikannya +koperasi mengoperasinya +koperasi pengoperasi +koperasi pengoperasian +koperasi pengoperasikan +koperasi perkoperasian +kopi dikopi +kopi mengkopi +kopi mengopi +kopi perkopian +kopiah berkopiah +kor sekor +koral mengoral +korban berkorban +korban dikorbankan +korban mengorbankan +korban mengorbankannya +korban pengorbanan +korban terkorbankan +korek dikorek +korek mengorek +korek mengoreknya +korek pengorek +korek pengorekan +koreksi dikoreksi +koreksi mengkoreksi +koreksi mengoreksi +koreksi mengoreksinya +koreksi pengoreksi +koreksi pengoreksian +koreksi terkoreksi +koreksi terkoreksinya +korelasi berkorelasi +korelasi dikorelasikan +korelasi mengkorelasikan +korelasi terkorelasi +korespondensi berkorespondensi +korok mengorok +korting dikorting +korting mengkorting +korting mengorting +korup dikorup +korup terkorup +korupsi berkorupsi +korupsi dikorupsi +korupsi dikorupsinya +korupsi mengkorupsi +korupsi mengorupsi +kosong dikosongi +kosong dikosongkan +kosong kekosongan +kosong mengosongi +kosong mengosongkan +kosong mengosongkannya +kosong pengosongan +kostum berkostum +kota dikota +kota pemkota +kota pengkotakan +kota perkota +kota perkotaan +kota sekota +kota sekotanya +kotak dikotak +kotak mengkotak +kotak mengotak +kotak mengotaki +kotak pengkotakan +kotak sekotak +kotak terkotak +koteng sekoteng +kotong sekotong +kotor dikotori +kotor kekotoran +kotor mengotori +kotor pengotor +kotor sekotor +kotor terkotor +kotor terkotori +kover dikover +kover mengkover +kover mengover +kover terkover +koyak dikoyak +koyak mengoyak +koyak terkoyak +koyak terkoyaknya +kram pekraman +kreasi berkreasi +kreasi dikreasi +kreasi dikreasikan +kreasi mengkreasi +kreasi mengkreasikan +kreasi mengkreasikannya +kreatif sekreatif +kreativitas berkreativitas +kredit dikredit +kredit dikreditkan +kredit mengkredit +kredit mengkreditkan +kredit pengkreditan +kredit perkreditan +kremasi dikremasi +kremasi dikremasikan +kremasi mengkremasi +krim mengrim +krim mengrimkan +kriminal dikriminalkan +kriminal mengkriminalkan +kriminalisasi dikriminalisasi +kriminalisasi dikriminalisasikan +kriminalisasi mengkriminalisasi +kriminalisasi mengkriminalisasikan +kriminalisasi mengkriminalisasinya +kring sekring +kristal mengkristal +kristal mengkristalkan +kristal pengkristalan +kristalisasi mengkristalisasi +kristalisasi terkristalisasi +kritik dikritik +kritik dikritiknya +kritik mengkritik +kritik mengkritiki +kritik mengkritiknya +kritik mengritik +kritik menkritik +kritik pengkritik +kritik pengkritiknya +kritik pengritik +kritik pengritiknya +kritis dikritisi +kritis kekritisan +kritis mengkritis +kritis mengkritisi +kritis mengritisi +kritisi dikritisi +kritisi mengkritisi +kritisi mengkritisinya +kritisi mengritisi +kromo dikromo +ksi beksi +ksi diksi +ksi meksi +ksi seksi +ksi seksinya +ku beku +ku bekuan +ku bekukan +ku bekunya +ku mengku +ku mengkui +ku pengkuan +ku perku +kuah berkuah +kuak berkuak +kuak dikuak +kuak menguak +kuak menguaknya +kuak penguak +kuak penguakan +kuak terkuak +kuak terkuaklah +kuak terkuaknya +kualifikasi berkualifikasi +kualifikasi dikualifikasi +kualifikasi dikualifikasikan +kualifikasi mengkualifikasi +kualifikasi mengkualifikasikan +kualifikasi terkualifikasi +kualitas berkualitas +kualitas berkualitasnya +kualitas sekualitas +kuang kekuangan +kuang mengkuang +kuang menguangkan +kuang penguangan +kuantifikasi dikuantifikasi +kuap menguap +kuap menguapi +kuap menguapkan +kuap menguapnya +kuap penguapan +kuar kekuaran +kuar menguar +kuar menguarkan +kuark menguarkan +kuartal dikuartal +kuartal perkuartal +kuarter dikuarter +kuas dikuasi +kuas kekuasan +kuas menguasi +kuas penguasan +kuasa bekuasa +kuasa berkuasa +kuasa berkuasanya +kuasa dikuasai +kuasa dikuasakan +kuasa kekuasaan +kuasa menguasa +kuasa menguasai +kuasa menguasakan +kuasa penguasa +kuasa penguasaan +kuasa penguasai +kuasa penguasanya +kuasa terkuasai +kuasi dikuasi +kuasi menguasi +kuat berkuatan +kuat dikuatkan +kuat kekuatan +kuat menguat +kuat menguatan +kuat menguatkan +kuat menguatkannya +kuat menguatnya +kuat penguat +kuat penguatan +kuat penguatnya +kuat perkuat +kuat perkuatan +kuat perkuatlah +kuat sekuat +kuat sekuatnya +kuat terkuat +kuat terkuatnya +kubah berkubah +kubah mengubah +kubah mengubahnya +kubah pengubah +kubah pengubahan +kubang berkubang +kubu berkubu +kubu dikubu +kubu pekubuan +kubu pengkubuan +kubung mengubungi +kubung mengubungkan +kubung pengubung +kubur dikubur +kubur dikuburkan +kubur dikuburnya +kubur mengubur +kubur menguburkan +kubur menguburkannya +kubur menguburnya +kubur pekuburan +kubur pengubur +kubur penguburan +kubur perkuburan +kubur terkubur +kubur terkuburnya +kucek dikucek +kucek mengucek +kucur dikucuri +kucur dikucurkan +kucur dikucurkannya +kucur mengucur +kucur mengucuri +kucur mengucurkan +kucur mengucurnya +kucur pengucuran +kuda berkuda +kudang mengudang +kudap dikudap +kudap mengudap +kudeta dikudeta +kudeta mengkudeta +kudeta mengkudetanya +kudeta mengudeta +kudeta pengkudeta +kudeta terkudeta +kudu mengkudu +kufur kekufuran +kui mengkui +kuin penguin +kujung berkujung +kujung mengujungi +kujung pengujung +kujur sekujur +kuk bekuk +kuk bekukan +kuku berkuku +kukuh berkukuh +kukuh dikukuhkan +kukuh dikukuhkannya +kukuh kekukuhan +kukuh mengkukuhkan +kukuh mengukuhkan +kukuh mengukuhkannya +kukuh pengukuh +kukuh pengukuhan +kukur mengukur +kukur mengukurnya +kukur pengukur +kukur pengukuran +kukus dikukus +kukus mengukus +kukus pengukus +kukus pengukusan +kulai terkulai +kulak perkulakan +kuliah berkuliah +kuliah dikuliahi +kuliah dikuliahkan +kuliah menguliahi +kuliah menguliahkan +kuliah perkuliahan +kulir mengulirkan +kulit berkulit +kulit dikulit +kulit dikuliti +kulit menguliti +kultur berkultur +kultus dikultuskan +kultus mengkultuskan +kultus pengkultusan +kulum mengulum +kulur mengulur +kulur mengulurkan +kulur penguluran +kuman berkuman +kuman penguman +kumandang berkumandang +kumandang berkumandangnya +kumandang dikumandangan +kumandang dikumandangkan +kumandang dikumandangkannya +kumandang mengumandang +kumandang mengumandangkan +kumandang pengumandangan +kumbar mengumbar +kumbar mengumbarnya +kumis berkumis +kumpul bekumpul +kumpul berkumpul +kumpul berkumpulnya +kumpul dikumpul +kumpul dikumpulkan +kumpul dikumpulkannya +kumpul kekumpul +kumpul mengumpul +kumpul mengumpulan +kumpul mengumpulkan +kumpul mengumpulkannya +kumpul pengumpul +kumpul pengumpulan +kumpul pengumpulkan +kumpul perkumpulan +kumpul sekumpul +kumpul sekumpulan +kumpul terkumpul +kumpul terkumpulkan +kumpul terkumpullah +kumpul terkumpulnya +kumuh kekumuhan +kumur berkumur +kumur berkumurlah +kunang-kunang berkunang-kunang +kuncen pekuncen +kunci dikunci +kunci mengunci +kunci menguncinya +kunci pengunci +kunci penguncian +kunci terkunci +kunci terkuncinya +kundang mengundang +kundang mengundangkan +kundang mengundangnya +kundang pengundang +kundang pengundangan +kundang pengundangnya +kundi mengundi +kundi pengundian +kundur mengundur +kundur mengunduran +kundur mengundurkan +kundur mengundurnya +kundur pengunduran +kundur pengundurkan +kunduran mengunduran +kunduran pengunduran +kunduran pengundurannya +kung dikungan +kung mengungkan +kung pengungi +kungkung dikungkung +kungkung mengungkung +kungkung mengungkungnya +kungkung terkungkung +kuning kekuningan +kuning menguning +kuning menguningkan +kuning menguningnya +kuning sekuning +kunjung bekunjung +kunjung berkunjung +kunjung berkunjungan +kunjung berkunjunglah +kunjung berkunjungnya +kunjung dikunjung +kunjung dikunjungi +kunjung mengunjung +kunjung mengunjungi +kunjung pengunjung +kunjung pengunjungnya +kuntit dikuntit +kuntit menguntit +kuntit menguntitnya +kuntit penguntit +kuntit penguntitan +kuntit penguntitnya +kuntum sekuntum +kuntung menguntung +kuntung menguntungan +kuntung menguntungkan +kuntung menguntungkannya +kunyah dikunyah +kunyah dikunyahnya +kunyah mengunyah +kunyah mengunyahnya +kunyah pengunyah +kunyah pengunyahan +kuota berkuota +kup bekup +kupahan pengupahan +kupang sekupang +kupas dikupas +kupas mengupas +kupas mengupasnya +kupas pengupas +kupas pengupasan +kupas terkupas +kupil mengupil +kuping berkuping +kuping menguping +kupon berkupon +kur berkuran +kur mengkur +kura mengurai +kura pengurai +kura sekura +kurai mengurai +kurai menguraikan +kurai menguraikannya +kurai mengurainya +kurai pengurai +kurai penguraian +kurang bekurang +kurang berkurang +kurang berkuranglah +kurang berkurangnya +kurang dikurang +kurang dikurangi +kurang dikurangkan +kurang kekurang +kurang kekurangan +kurang mengurang +kurang mengurangi +kurang mengurangkan +kurang pengurang +kurang pengurangan +kurang pengurangi +kurang sekurang +kurang sekurangnya +kurang terkurangi +kuras dikuras +kuras dikurasi +kuras mengkurasi +kuras menguras +kuras mengurasi +kuras mengurasnya +kuras penguras +kuras pengurasan +kuras terkuras +kuras terkurasi +kuras terkurasnya +kurator dikuratori +kurban berkurban +kurban dikurbankan +kurban mengurbankan +kurban pekurban +kuret dikuret +kurs berkursi +kurs dikurs +kurs dikursi +kurs dikurskan +kurs pengurs +kursi berkursi +kursi dikursi +kurun mengurunkan +kurung dikurung +kurung mengurung +kurung mengurungi +kurung mengurungkan +kurung mengurungkannya +kurung mengurungnya +kurung pengurungan +kurung terkurung +kurus mengurus +kurus mengurusi +kurus menguruskan +kurus mengurusnya +kurus pengurus +kurus pengurusan +kurus pengurusnya +kurus sekurus +kusa dikusai +kusa kekusaan +kusa mengusai +kusa pengusa +kusa pengusaan +kusam kekusaman +kusik mengusik +kusik mengusiknya +kusir mengusir +kusir mengusirnya +kusir pengusir +kusir pengusiran +kusut kekusutan +kusut mengusut +kusut mengusutnya +kusut pengusut +kusut pengusutan +kuta mengutakan +kutak mengutak +kutak mengutakan +kutang mengutang +kutang mengutangi +kutang pengutang +kutat berkutat +kutat pekutatan +kuti dikuti +kuti mengkuti +kuti menguti +kutik berkutik +kutil mengutil +kutil pengutil +kutil pengutilan +kutip dikutip +kutip dikutipnya +kutip mengutip +kutip mengutipkan +kutip mengutipnya +kutip pengutip +kutip pengutipan +kutu berkutu +kutu pengutukan +kutu sekutu +kutu sekutunya +kutuk dikutuk +kutuk mengutuk +kutuk mengutuknya +kutuk pengutukan +kutuk terkutuk +kutuk terkutuklah +kutung mengutungkan +kutut perkutut +la bela +la belai +la belakan +la belanya +la bella +la dila +la dilakan +la kela +la kelakan +la mela +la melakan +la menlai +la pela +la perla +la sela +la selai +la selanya +laba kelabakan +labak kelabakan +labang kelabang +label berlabel +label berlabelkan +label dilabel +label dilabeli +label dilabelkan +label melabel +label melabeli +label melabelkan +label pelabelan +labil kelabilan +labrak dilabrak +labrak melabrak +labu kelabu +labu kelabui +labu pelabuan +labuh berlabuh +labuh berlabuhnya +labuh dilabuh +labuh dilabuhi +labuh dilabuhkan +labuh melabuh +labuh melabuhkan +labuh melabuhkannya +labuh pelabuan +labuh pelabuhan +labuh perlabuhan +labun pelabunan +labur dilabur +labur melabur +lacak dilacak +lacak melacak +lacak melacaknya +lacak pelacak +lacak pelacakan +lacak terlacak +lacak terlacaknya +laci berlaci +lacur dilacurkan +lacur melacur +lacur melacurkan +lacur pelacur +lacur pelacuran +lada belada +lada kelada +lada selada +ladang berladang +ladang peladang +ladang perladangan +laden diladeni +laden meladeni +laden peladen +ladi keladi +ladi keladinya +ladi seladi +lafal berlafal +lafal dilafalkan +lafal melafalkan +lafal melafalkannya +lafal pelafalan +laga belaga +laga berlaga +laga berlaganya +laga dilaga +laga pelaga +lagak belagak +lagak berlagak +lagan selagan +lagi pelagian +lagi selagi +lago dilago +lagu belagu +lagu dilagukan +lagu melagukan +lah belah +lah belahan +lah belahnya +lah berlahan +lah dilah +lah dilahan +lah kelah +lah kelahan +lah kelahi +lah melah +lah menglahkan +lah pelahan +lah perlahan +lah selah +lah terlah +lahan belahan +lahan berlahan +lahan dilahan +lahan kelahan +lahan pelahan +lahan perlahan +lahap dilahap +lahap dilahapnya +lahap melahap +lahap melahapnya +lahap pelahap +lahir dilahirkan +lahir dilahirkannya +lahir kelahiran +lahir melahirkan +lahir melahirkannya +lahir terlahir +lahir terlahirnya +lai belai +lai belaian +lai belailah +lai kelaikan +lai kelaikannya +lai melaikan +lai menlai +lai selai +lai selaian +laik kelaikan +laik melaikan +laik selaiknya +lailah belailah +lain belain +lain berlainan +lain dilain +lain kelainan +lain melain +lain melainkan +lain selain +lain selaini +lain selainnya +laja belaja +lajang melajang +laju dilajukan +laju melaju +laju melajukan +laju melajunya +laju pelaju +laju penglaju +laju selaju +lajur terlajur +lak belak +lak belakan +lak dilakan +lak dilakkan +lak kelak +lak kelakan +lak melak +lak melakan +lak melakkan +lak pelak +lak pelaki +lak perlak +lak selak +lakar kelakar +lakar kelakarnya +laki dilakikan +laki melakikan +laki pelaki +laknat dilaknat +laknat melaknat +lakon berlakon +lakon dilakoni +lakon kelakon +lakon melakoni +lakon melakonkan +lakon pelakon +lakon pelakonnya +laksa dilaksakan +laksa melaksakan +laksa pelaksa +laksa pelaksaan +laksa selaksa +laksana dilaksana +laksana dilaksanaan +laksana dilaksanakan +laksana dilaksanakannya +laksana melaksana +laksana melaksanaan +laksana melaksanakan +laksana melaksanakannya +laksana pelaksana +laksana pelaksanaan +laksana pelaksanakan +laksana pelaksananya +laksana perlaksanaan +laksana terlaksana +laksana terlaksanakan +laksana terlaksananya +laku belaku +laku berlaku +laku berlakukan +laku berlakulah +laku berlakunya +laku dilakuan +laku dilakui +laku dilakukan +laku dilakukannya +laku kelakuan +laku kelakukan +laku kelakukannya +laku melaku +laku melakuan +laku melakui +laku melakukan +laku melakukannya +laku menlakukan +laku pelaku +laku pelakuan +laku pelakukan +laku pelakunya +laku perlaku +laku perlakuan +laku perlakukan +laku perlakukannya +laku selaku +laku terlaku +lala belalai +lalah kelalahan +lalai belalai +lalai belalainya +lalai dilalaikan +lalai kelalaian +lalai melalaikan +lalang belalang +lalang melalang +lalang selalang +lalap dilalap +lalap melalap +lalap terlalap +lalau melalaui +lalau selalau +lalau terlalau +lali kelalian +lali melali +lali selali +lalu berlalu +lalu berlalunya +lalu dilalui +lalu dilalukan +lalu melalu +lalu melalui +lalu melalukan +lalu melalukannya +lalu memlalui +lalu pelalu +lalu selalu +lalu selalui +lalu selalulah +lalu terlalu +lalu terlalui +lalu-lalang berlalu-lalang +lam dilam +lam dilaman +lam dilami +lam kelam +lam kelamnya +lam menglami +lam penglaman +lam selam +lam selaman +lam selami +lam selamnya +lama berlama +lama kelamaan +lama selama +lama selamanya +lama terlama +lama terlamanya +lamar dilamar +lamar dilamarnya +lamar melamar +lamar melamarnya +lamar pelamar +lamar pelamaran +lamar pelamarnya +lambai melambai +lambai melambaikan +lamban kelambanan +lamban melamban +lamban melambankan +lamban melambannya +lambang belambang +lambang belambangan +lambang berlambang +lambang berlambangkan +lambang dilambangkan +lambang melambangkan +lambang pelambang +lambang perlambang +lambat dilambatkan +lambat kelambatan +lambat melambat +lambat melambatkan +lambat melambatnya +lambat pelambatan +lambat perlambat +lambat perlambatan +lambat selambat +lambat selambatnya +lambat terlambat +lambat terlambatnya +lambu kelambu +lambung berlambung +lambung dilambungkan +lambung melambung +lambung melambungkan +lambung melambungnya +lambung pelambungan +lamin kelamin +lamin kelaminnya +lamin melamin +lamin pelaminan +laminasi dilaminasi +laminating dilaminating +lampai melampai +lampau dilampaui +lampau melampau +lampau melampaui +lampau pelampauan +lampau terlampau +lampau terlampaui +lampias dilampiaskan +lampias melampiaskan +lampias melampiaskannya +lampias pelampiasan +lampias terlampiaskan +lampir dilampiri +lampir dilampirkan +lampir melampirkan +lampir pelampiran +lampir terlampir +lampok kelampok +lampu berlampu +lampu melampui +lampu perlampuan +lampu terlampu +lampung pelampung +lampung pelampungnya +lamun melamun +lamun pelamun +lamun selamun +lana kelana +lana pelana +lancar dilancarkan +lancar dilancarkannya +lancar kelancaran +lancar melancar +lancar melancarkan +lancar melancarkannya +lancar pelancar +lancar pelancaran +lancar perlancar +lancar selancar +lancar selancarnya +lancong melancong +lancong pelancong +lancong pelancongan +landa belanda +landa belandanya +landa dilanda +landa melanda +landa melandai +landa melandanya +landa terlanda +landai melandai +landai melandainya +landas berlandas +landas berlandasan +landas berlandaskan +landas dilandasi +landas dilandaskan +landas melandasi +landas melandaskan +landuk pelanduk +lang belang +lang belangan +lang belangnya +lang kelang +lang kelangan +lang melangkan +lang pelang +lang pelangan +lang pelangi +lang selang +lang selangnya +langgam berlanggam +langgan berlanggan +langgan berlangganan +langgan melanggan +langgan pelanggan +langgan pelanggannya +langgar dilanggar +langgar dilanggarnya +langgar melanggar +langgar melanggaran +langgar melanggarnya +langgar pelanggar +langgar pelanggaran +langgar pelanggarnya +langgar perlanggaran +langgar terlanggar +langgar terlanggarnya +langgeng dilanggengkan +langgeng kelanggengan +langgeng melanggeng +langgeng melanggengkan +langgeng pelanggengan +langi pelangi +langir pelangiran +langit dilangit +langit melangit +langit selangit +langka kelangkaan +langka selangka +langka selangkanya +langka terlangka +langkah dilangkahi +langkah melangkah +langkah melangkahi +langkah melangkahkan +langkah melangkahlah +langkah selangkah +langkan melangkan +langkang selangkang +langkang selangkangan +langkap dilangkapi +langkap kelangkapan +langkap melangkapi +langkap pelangkap +langkap perlangkapan +langkap selangkapnya +langlang melanglang +langsi pelangsian +langsing kelangsingan +langsing melangsingkan +langsing pelangsing +langsing pelangsingan +langsir dilangsir +langsir melangsir +langsir pelangsir +langu terlangu +lanja belanja +lanja belanjaan +lanja belanjakan +lanja belanjalah +lanja belanjanya +lanjak belanjakan +lanjuk dilanjukan +lanjuk melanjukan +lanjur terlanjur +lanjut belanjut +lanjut berlanjut +lanjut berlanjutan +lanjut berlanjutnya +lanjut dilanjut +lanjut dilanjutan +lanjut dilanjuti +lanjut dilanjutkan +lanjut dilanjutkannya +lanjut dilanjutnya +lanjut kelanjutan +lanjut kelanjutkan +lanjut melanjut +lanjut melanjutan +lanjut melanjuti +lanjut melanjutkan +lanjut melanjutkannya +lanjut melanjutnya +lanjut menlanjutkan +lanjut pelanjut +lanjut pelanjutan +lanjut selanjut +lanjut selanjutkan +lanjut selanjutnya +lanjut terlanjut +lansir dilansir +lansir dilansirnya +lansir melansir +lansir pelansir +lansir terlansir +lantai berlantai +lantai berlantaikan +lantai dilantai +lantai melantai +lantan kelantan +lantang dilantangkan +lantang melantangkan +lantang pelantang +lantar pelantar +lantar pelantaran +lantar terlantar +lantar terlantarkan +lantar terlantarnya +lantik dilantik +lantik dilantiknya +lantik melantik +lantik melantiknya +lantik pelantikan +lantik pelantikkan +lantik terlantik +lanting belanting +lantun dilantunkan +lantun dilantunkannya +lantun melantun +lantun melantunkan +lantun pelantun +lantun terlantun +lantur melantur +lap belapan +lap dilap +lap kelap +lap melap +lap selap +lap selapan +lapak pelapak +lapang berlapang +lapang dilapangan +lapang dilapangkan +lapang kelapangan +lapang melapangkan +lapar kelaparan +lapar melaparkan +lapar selaparan +lapis berlapis +lapis berlapiskan +lapis dilapis +lapis dilapisi +lapis melapis +lapis melapisi +lapis pelapis +lapis pelapisan +lapis pelapisnya +lapis selapis +lapis terlapisi +lapor dilapor +lapor dilaporan +lapor dilapori +lapor dilaporkan +lapor dilaporkannya +lapor melapor +lapor melaporan +lapor melaporkan +lapor melaporkannya +lapor melapornya +lapor pelapor +lapor pelaporan +lapor pelapornya +lapor terlapor +lapor terlaporkan +lapor terlapornya +lapuk melapuk +lapuk pelapukan +lara kelara +lara melara +larang dilarang +larang dilarangan +larang dilarangnya +larang melarang +larang melarangan +larang melarangnya +larang pelarang +larang pelarangan +larang selarang +larang terlarang +larang terlarangnya +laras berlaras +laras selaras +laras selaraskan +larat melarat +lari belari +lari berlari +lari berlarian +lari berlarilah +lari berlarinya +lari dilarikan +lari dilarikannya +lari melarikan +lari melarikannya +lari pelari +lari pelarian +larik dilarikan +larik melarikan +laris pelaris +laris penglaris +laris selaris +laris terlaris +laris terlarisnya +laron selaron +laru selaru +larung dilarung +larung melarung +larung pelarungan +larut berlarut +larut berlarutnya +larut dilarutkan +larut kelarutan +larut melarutkan +larut melarutkannya +larut pelarut +larut pelarutan +larut terlarut +las belas +las belasan +las berlasan +las dilas +las dilasi +las kelas +las kelasi +las kelasnya +las melas +las pelasan +las selas +las selasan +las selasi +lasa belasa +lasa selasa +lasa selasai +lasa selasanya +lasana melasanakan +lasana pelasana +lasana pelasanaan +laser dilaser +lasi dilasi +lasi kelasi +lasi selasi +laskar kelaskaran +lat belat +lat belati +lat melati +lat pelat +lat pelati +lat pelatnya +lat perlatan +lat selat +lat selatan +lata melata +lata selata +latah selatah +latam selatam +latar berlatar +latar berlatarkan +latar dilatar +latar dilatari +latar melatar +latar melatari +latar pelataran +latas dilatasi +latif pelatif +latih belatih +latih berlatih +latih berlatihlah +latih berlatihnya +latih dilatih +latih dilatihkan +latih dilatihnya +latih melatih +latih melatihnya +latih pelatih +latih pelatihan +latih pelatihlah +latih pelatihnya +latih terlatih +latih terlatihnya +latuh pelatuh +latuk pelatuk +latuk pelatuknya +latung belatung +latung belatungnya +lauk berlauk +lauk dilaukan +lauk melaukan +lauk pelaukan +laung pelaung +laur kelaur +laut dilaut +laut dilautan +laut kelaut +laut kelautan +laut melaut +laut melautnya +laut pelaut +laut pelautnya +lava kelava +lawa belawa +lawa melawa +lawa melawaan +lawa melawai +lawa pelawa +lawai melawai +lawak melawak +lawak pelawak +lawan belawan +lawan berlawan +lawan berlawanan +lawan dilawan +lawan dilawannya +lawan melawan +lawan melawannya +lawan pelawan +lawan pelawanan +lawan perlawan +lawan perlawanan +lawan terlawan +lawang melawang +lawang pelawangan +lawar dilawar +lawat belawati +lawat melawat +lawat melawati +lawat pelawat +lawat selawat +lawi melawi +lawi pelawi +layak kelayakan +layak selayak +layak selayaknya +layak selayaknyalah +layan belayan +layan dilayanan +layan dilayani +layan kelayan +layan kelayanan +layan melayan +layan melayanan +layan melayani +layan pelayan +layan pelayanan +layan pelayannya +layan selayan +layan terlayani +layang dilayang +layang dilayangkan +layang dilayangkannya +layang kelayang +layang melayang +layang melayangkan +layang melayangnya +layang pelayang +layang pelayangan +layang selayang +layap kelayapan +layar belayar +layar berlayar +layar berlayarnya +layar dilayar +layar dilayari +layar dilayarkan +layar melayari +layar melayarkan +layar pelayar +layar pelayaran +layar perlayaran +layar selayar +layat melayat +layat pelayat +layu melayu +layu melayunya +lazim kelaziman +lazim selazimnya +lebah perlebahan +lebah selebah +lebat kelebatan +lebat selebat +lebat terlebat +lebih belebihan +lebih berlebih +lebih berlebihan +lebih berlebihnya +lebih dilebih +lebih dilebihi +lebih dilebihkan +lebih kelebihan +lebih melebih +lebih melebihi +lebih melebihkan +lebih selebihnya +lebih terlebih +lebuh terlebuh +lebur dilebur +lebur dileburkan +lebur dileburnya +lebur melebur +lebur meleburkan +lebur meleburnya +lebur pelebur +lebur peleburan +lecah melecahkan +lecah pelecahan +leceh dilecehkan +leceh melecehkan +leceh melecehkannya +leceh peleceh +leceh pelecehan +leceh terlecehkan +lecut dilecut +lecut melecut +lecut melecutkan +lecut pelecut +lecut terlecut +ledak diledakan +ledak diledakkan +ledak diledakkannya +ledak meledak +ledak meledakan +ledak meledakkan +ledak meledakkannya +ledak meledaklah +ledak meledaknya +ledak peledak +ledak peledakan +ledak peledakkan +ledak peledaknya +ledek diledek +ledek meledek +ledek meledeknya +leduk meleduk +lega berlega +lega kelegaan +lega melegakan +lega pelega +legal dilegalkan +legal dilegalkannya +legal kelegalan +legal melegalkan +legal melegalkannya +legal pelegalan +legalisasi dilegalisasi +legalisasi melegalisasi +legalisasi melegalisasikan +legenda melegenda +legitimas berlegitimasi +legitimas dilegitimasi +legitimas melegitimasi +legitimas terlegitimasi +legitimasi berlegitimasi +legitimasi dilegitimasi +legitimasi melegitimasi +legitimasi terlegitimasi +lego dilego +lego dilegonya +lego melego +lego melegonya +leha-leha berleha-leha +leher berleher +leher dileher +leher dilehernya +leher seleher +lejit melejit +lejit melejitkan +lejit melejitnya +leka seleka +lekang belekang +lekar kelekar +lekas selekas +lekas selekasnya +lekat dilekati +lekat dilekatkan +lekat kelekatan +lekat melekat +lekat melekatkan +lekat melekatnya +lekat pelekat +lekat pelekatan +lekat perlekatan +lekat terlekat +leku melekukan +lekuk berlekuk +lekuk melekuk +lekuk melekukan +lelah kelelahan +lelah melelahkan +lelah selelah +lelaki kelelakian +lelang dilelang +lelang dilelangkan +lelang dilelangnya +lelang melelang +lelang melelangnya +lelang pelelang +lelang pelelangan +lelang terlelang +lelap melelapkan +lelap terlelap +leleh dilelehkan +leleh meleleh +leleh melelehkan +leleh melelehnya +leleh pelelehan +lelep kelelep +leler keleler +leler keleleran +leluasa keleluasaan +leluasa seleluasa +lem belem +lem dilem +lem pelem +lem seleman +lema dilema +lema dilemanya +lema perlemakan +lema selema +lemah dilemahkan +lemah kelemahan +lemah melemah +lemah melemahkan +lemah melemahkannya +lemah melemahnya +lemah pelemah +lemah pelemahan +lemah perlemah +lemah perlemahan +lemah selemah +lemah terlemah +lemah terlemahnya +lemak berlemak +lemak perlemakan +lemas melemas +lemas melemaskan +lemas pelemasan +lembaga dilembaga +lembaga dilembagakan +lembaga kelembagaan +lembaga melembaga +lembaga melembagakan +lembaga pelembagaan +lembaga perlembagaan +lembaga terlembaga +lembaga terlembagakan +lembam kelembaman +lembang pelembang +lembap kelembapan +lembap melembapkan +lembap pelembap +lembar perlembar +lembar selembar +lembar selembaran +lembek melembek +lembung melembung +lembut dilembutkan +lembut kelembutan +lembut melembut +lembut melembutkan +lembut pelembut +lembut selembut +lempang melempangkan +lempang selempang +lempar dilempar +lempar dilempari +lempar dilemparkan +lempar dilemparkannya +lempar dilemparnya +lempar melempar +lempar melempari +lempar melemparkan +lempar melemparkannya +lempar melemparnya +lempar pelempar +lempar pelemparan +lempar selemparan +lempar terlempar +lempar terlemparnya +lempari dilempari +lempari melempari +lempari melemparinya +lempem melempem +lempem melempemnya +lena melena +lena melenakan +lena selena +lena terlena +lendir berlendir +lendir perlendiran +lendung belendung +leng berlengan +leng meleng +lengan berlengan +lengang kelengangan +lengang melengang +lenggak berlenggak +lenggang berlenggang +lenggang melenggang +lenggang melenggangkan +lenggok berlenggok +lengkap dilengkap +lengkap dilengkapi +lengkap dilengkapkan +lengkap kelengkapan +lengkap melengkap +lengkap melengkapi +lengkap melengkapkan +lengkap pelengkap +lengkap pelengkapan +lengkap pelengkapnya +lengkap perlengkapan +lengkap selengkap +lengkap selengkapnya +lengkap terlengkap +lengkap terlengkapi +lengkeng kelengkeng +lengket perlengketan +lengking melengking +lengkung dilengkungkan +lengkung kelengkungan +lengkung melengkung +lengkung melengkungkan +lengkung melengkungnya +lengos melengos +lengseng pelengsengan +lengser dilengserkan +lengser dilengserkannya +lengser melengserkan +lengser melengserkannya +lengser pelengseran +lenguh melenguh +lensa berlensa +lentang terlentang +lenteng kelenteng +lentik melentikkan +lentik pelentik +lenting melenting +lenting selentingan +lentur kelenturan +lentur melentur +lentur melenturkan +lenyap dilenyapkan +lenyap melenyapkan +lenyap melenyapkannya +lenyap pelenyapan +lepa melepakan +lepak melepakan +lepas berlepas +lepas dilepas +lepas dilepaskan +lepas dilepaskannya +lepas dilepasnya +lepas kelepasan +lepas melepas +lepas melepasan +lepas melepaskan +lepas melepaskannya +lepas melepasnya +lepas pelepas +lepas pelepasan +lepas selepas +lepas selepasnya +lepas terlepas +lepas terlepaskan +lepas terlepasnya +lepat pelepat +lepot belepotan +lepot berlepotan +lepuh melepuh +lerai dilerai +lerai melerai +lerai meleraikan +lerai melerainya +lerang belerang +lerang belerangnya +lereng berlereng +lereng kelereng +lereng kelerengan +leri belleri +les belles +les keles +les meles +les seles +les selesi +lesa dilesakan +lesa dilesakannya +lesa melesakan +lesa selesa +lesa selesai +lesak dilesakan +lesak dilesakkan +lesak dilesakkannya +lesak melesak +lesak melesakan +lesak melesakkan +lesak melesakkannya +lesi selesi +lesir pelesir +lesir pelesiran +lestari dilestarikan +lestari kelestarian +lestari melestarikan +lestari melestarikannya +lestari pelestari +lestari pelestarian +lestari terlestarikan +lesu kelesuan +lesu melesu +lesu melesunya +lesung berlesung +leta diletakan +leta diletakannya +leta meletakan +leta meletakannya +leta peletakan +leta peletakannya +letak berletak +letak diletakan +letak diletakkan +letak diletakkannya +letak meletakan +letak meletakkan +letak meletakkannya +letak peletak +letak peletakan +letak peletakkan +letak terletak +letih keletihan +letih meletihkan +letup diletupkan +letup meletup +letup meletupkan +letup meletupnya +letus diletuskan +letus meletus +letus meletuskan +letus meletusnya +level berlevel +level dilevel +level kelevel +level selevel +lewa melewai +lezat kelezatan +lezat melezatkan +lezat selezat +lezat terlezat +lian belian +lian berlian +lian berliannya +lian kelian +lian meliani +lian selian +liana berliana +liana diliana +liana meliana +liar diliarkan +liar keliaran +liar meliarkan +liar seliar +liar terliar +liat diliat +liat keliat +liat keliatan +liat meliat +liat terliat +liau beliau +liau beliaulah +liau beliaunya +liau meliau +libas dilibas +libas melibas +libas terlibas +libat dilibatkan +libat dilibatkannya +libat melibat +libat melibatan +libat melibatkan +libat melibatkannya +libat pelibatan +libat perlibatan +libat selibat +libat terlibat +libat terlibatlah +libat terlibatnya +liberal meliberalkan +liberalisasi diliberalisasi +liberalisasi meliberalisasi +libur belibur +libur berlibur +libur berliburan +libur berliburlah +libur berliburnya +libur diliburkan +libur diliburkannya +libur melibur +libur meliburkan +libur peliburan +lici kelicikan +licik kelicikan +licin melicinkan +licin pelicin +licin selicin +lidah berlidah +liga diliga +lihai kelihaian +lihai selihai +lihat dilihat +lihat dilihatkan +lihat dilihatlah +lihat dilihatnya +lihat kelihatan +lihat melihat +lihat melihatkan +lihat melihatnya +lihat penglihatan +lihat perlihatkan +lihat terlihat +lihat terlihatlah +lihat terlihatnya +lik belik +lik belikan +lik kelik +lik melik +lik meliki +lik memliki +lik pelik +lik pelikan +lik peliknya +lik pemlik +likat belikat +liku berliku +likuidasi dilikuidasi +likuidasi melikuidasi +lilah belilah +lilit dililit +lilit dililitkan +lilit melilit +lilit melilitkan +lilit melilitkannya +lilit melilitnya +lilit terlilit +lima berlima +lima kelima +lima kelimanya +lima penglima +lima perlima +limbah pelimbahan +limbing belimbing +limpah berlimpah +limpah berlimpahnya +limpah dilimpah +limpah dilimpahi +limpah dilimpahkan +limpah dilimpahkannya +limpah kelimpahan +limpah melimpah +limpah melimpahi +limpah melimpahkan +limpah melimpahkannya +limpah melimpahnya +limpah pelimpah +limpah pelimpahan +limpas melimpas +limpas pelimpas +limpas pelimpasan +limpung kelimpungan +limut selimut +limut selimuti +limut selimutnya +lin belin +lin bellin +lin bellini +lin berlin +lin dilini +lin kelin +lin melin +lin perlini +lin selin +linang berlinang +linang berlinangan +lincah kelincahan +lincah selincah +lindang kelindang +lindang perlindangan +lindas dilindas +lindas melindas +lindas melindasnya +lindas terlindas +lindung berlindung +lindung dilindung +lindung dilindungi +lindung melindung +lindung melindungan +lindung melindungi +lindung pelindung +lindung pelindungan +lindung pelindungnya +lindung perlindung +lindung perlindungan +lindung terlindung +lindung terlindungi +ling beling +ling keling +ling kelingi +ling peling +ling seling +ling selingan +ling selingi +lingkar dilingkaran +lingkar dilingkari +lingkar dilingkarkan +lingkar melingkar +lingkar melingkari +lingkar melingkarkan +lingkung dilingkungan +lingkup dilingkup +lingkup dilingkupi +lingkup melingkupi +lingsir penglingsir +lini bellini +lini dilini +lini perlini +lintang melintang +lintang melintangi +lintang melintangkan +lintas dilintas +lintas dilintasan +lintas dilintasi +lintas melintas +lintas melintasi +lintas melintaslah +lintas melintasnya +lintas pelintas +lintas pelintasan +lintas perlintas +lintas perlintasan +lintas selintas +lintas terlintas +lintas terlintasi +linting dilinting +linting melinting +linting selinting +linting selintingan +lintir melintir +lintir pelintir +lintir pelintiran +lipan selipan +lipat berlipat +lipat dilipat +lipat dilipatkan +lipat kelipatan +lipat melipat +lipat melipatkan +lipat melipatnya +lipat pelipat +lipat pelipatan +lipat terlipat +lipur pelipur +lipur penglipuran +liput diliput +liput diliputi +liput meliput +liput meliputi +liput meliputnya +liput peliput +liput peliputan +lir kelir +lir keliran +lir pelir +lir selir +lir selirnya +lirih selirih +lirik berlirik +lirik dilirik +lirik diliriknya +lirik melirik +lirik meliriknya +liris diliris +liris meliris +lis belis +lis bellis +lis melis +lis perlis +lis selis +lis selisi +lisensi berlisensi +lisensi dilisensi +lisensi dilisensikan +lisensi melisensi +lisensi melisensikan +lisensi terlisensi +listrik berlistrik +listrik dilistriki +listrik kelistrikan +listrik kelistrikkan +listrik melistriki +listrik pelistrikan +listrik terlistriki +liter meliter +liter perliter +liter perliternya +liter seliter +liuk meliuk +liuk meliukkan +liuk-liuk meliuk-liuk +liuk-liuk meliuk-liukkan +lob dilobi +lob melobi +lob pelobi +lobi dilobi +lobi melobi +lobi melobinya +lobi pelobi +lobi-lobi melobi-lobi +log belog +log selogan +logat berlogat +logika berlogika +logo berlogo +logo berlogokan +lok belok +lok belokan +lok belokkan +lok beloknya +lok kelok +lok kelokan +lok penlok +lok selok +lok selokan +lokalisasi dilokalisasi +lokalisasi dilokalisasikan +lokalisasi melokalisasi +lokalisasi terlokalisasi +lokan belokan +lokan kelokan +lokan selokan +lokan selokannya +lokasi belokasi +lokasi berlokasi +lokasi dilokasi +lokasi dilokasikan +lokasi kelokasi +loket diloket +lolong melolong +lolos diloloskan +lolos diloloskannya +lolos kelolosan +lolos meloloskan +lolos meloloskannya +lolos pelolosan +lomba berlomba +lomba dilombakan +lomba melombakan +lomba perlombaan +lompat berlompatan +lompat dilompati +lompat melompat +lompat melompati +lompat melompatnya +lompat pelompat +lompok kelompok +lompok kelompokan +lompok kelompokkan +lompok kelompoknya +lompong melompong +loncat berloncatan +loncat meloncat +loncat meloncati +loncat peloncat +lonco pelonco +long belong +long kelong +long melong +long selong +longgar dilonggarkan +longgar kelonggaran +longgar melonggar +longgar melonggarkan +longgar melonggarnya +longgar pelonggaran +longgar perlonggar +longo melongo +longok melongok +longsor kelongsoran +longsor melongsorkan +lonjak kelonjakan +lonjak melonjak +lonjak melonjakkan +lonjak melonjaknya +lonjak pelonjakan +lonjor selonjor +lonjor selonjoran +lonsong selonsong +lontar dilontarkan +lontar dilontarkannya +lontar melontar +lontar melontarkan +lontar melontarkannya +lontar pelontar +lontar pelontaran +lontar pelontarnya +lontar terlontar +lontar terlontarkan +lontar terlontarlah +lontar terlontarnya +lontong kelontong +lontong kelontongan +lontong kelontongnya +lop selop +lopak kelopak +lopak kelopaknya +lopor pelopor +lopor pelopori +lopor pelopornya +lor kelor +lor melor +lor pelor +lor selor +lorong berlorong +lorot melorot +lorot melorotkan +lorot melorotnya +los pelosi +lot belloti +lot selot +lota pelota +loyang seloyang +lu belu +lu kelu +lu melu +lu melui +lu melukan +lu menlu +lu menlunya +lu pellu +lu pelu +lu peluan +lu pelukan +lu pelukannya +lu perlu +lu perlukan +lu perlulah +lu perlunya +lu terlukan +luah keluahan +luang diluangkan +luang keluang +luang meluangkan +luang peluang +luang peluangan +luang peluangnya +luang perluang +luang seluang +luang terluang +luap diluapkan +luap meluap +luap meluapkan +luap meluapkannya +luap meluapnya +luap terluapkan +luar diluar +luar keluar +luar keluaran +luar keluarkan +luar keluarlah +luar keluarnya +luar mengluarkan +luar seluar +luar terluar +luar terluarnya +luas berluas +luas diluaskan +luas keluasan +luas meluas +luas meluaskan +luas meluasnya +luas peluasan +luas perluas +luas perluasan +luas perluaslah +luas seluas +luas seluasnya +luas terluas +luat keluat +luat keluatan +lubang berlubang +lubang dilubangi +lubang melubangi +lubang pelubang +lubang pelubangan +luber meluber +luber melubernya +lucu kelucuan +lucu melucu +lucu selucu +lucu terlucu +lucut dilucuti +lucut melucuti +lucut pelucutan +lucut perlucutan +ludah diludahi +ludah meludah +ludah meludahi +ludah meludahkan +ludah meludahkannya +ludah peludahan +ludes meludeskan +lugas kelugasan +lugu keluguan +luhur keluhuran +luk beluk +luk beluknya +luk meluk +luk melukan +luk peluk +luk pelukan +luk peluklah +luk perlukan +luk seluk +luk terlukan +luka dilukai +luka melukai +luka perlukaan +luka terluka +luka terlukai +luka terlukanya +lukah perlukah +lukat melukat +lukis berlukiskan +lukis dilukis +lukis dilukiskan +lukis melukis +lukis melukiskan +lukis melukiskannya +lukis melukisnya +lukis pelukis +lukis pelukisan +lukis pelukisnya +lukis terlukis +lukis terlukiskan +luluh meluluh +luluh meluluhkan +lulus diluluskan +lulus diluluskannya +lulus kelulusan +lulus meluluskan +lulus meluluskannya +lumai belumai +lumas dilumasi +lumas melumasi +lumas pelumas +lumas pelumasan +lumas pelumasnya +lumas terlumasi +lumat dilumat +lumat dilumatkan +lumat melumat +lumat melumatkan +lumer melumerkan +lumpang kelumpang +lumpang pelumpang +lumpuh dilumpuhkan +lumpuh dilumpuhkannya +lumpuh kelumpuhan +lumpuh melumpuhkan +lumpuh melumpuhkannya +lumpuh pelumpuh +lumpuh pelumpuhan +lumpuk melumpukan +lumpur berlumpur +lumpur pelumpuran +lumur berlumur +lumur berlumuran +lumur dilumuri +lumur melumuri +lumut berlumut +lunak dilunakkan +lunak melunak +lunak melunakan +lunak melunakkan +lunak melunaknya +lunak pelunak +lunak pelunakan +lunas dilunasi +lunas dilunaskan +lunas melunasi +lunas melunaskan +lunas pelunasan +lunas terlunasi +luncur diluncuran +luncur diluncurkan +luncur diluncurkannya +luncur meluncur +luncur meluncuran +luncur meluncurkan +luncur meluncurkannya +luncur meluncurlah +luncur meluncurnya +luncur menluncurkan +luncur peluncur +luncur peluncuran +luncur peluncurkan +luncur peluncurnya +luncur seluncur +luncur seluncuran +luncur seluncurnya +lung melung +lung pelung +lunta terlunta +luntas beluntas +luntur meluntur +luntur melunturkan +luntur melunturnya +lupa dilupakan +lupa dilupakannya +lupa kelupaan +lupa melupakan +lupa melupakannya +lupa pelupa +lupa terlupa +lupa terlupakan +lupuk pelupuk +luput meluputkan +luput terluput +lurah kelurahan +luru peluru +luru pelurunya +luru perluru +luru seluru +luru selurunya +luruh keluruhan +luruh meluruh +luruh meluruhkan +luruh peluruh +luruh peluruhan +luruh seluruh +luruh seluruhan +luruh seluruhnya +lurus diluruskan +lurus kelurusan +lurus meluruskan +lurus meluruskannya +lurus pelurus +lurus pelurusan +lurus selurus +lus dilusi +lus pelus +lusa pelusa +lusin selusin +lusuh kelusuhan +lut belut +lut berluti +lut kelutan +luti berluti +lutu belutu +lutut berlutut +lutut berlututlah +lutut selutut +luwes keluwesan +maaf bermaafan +maaf dimaafkan +maaf memaafkan +maaf memaafkannya +maaf pemaaf +maaf pemaafan +maaf permaafan +maaf termaafkan +mabrur kemabruran +mabuk dimabuk +mabuk memabukan +mabuk memabukkan +mabuk pemabuk +macam bermacam +macam semacam +macam semacamnya +macan semacan +macet bermacet +macet kemacetan +macet memacetkan +macet semacet +macet termacet +mad belmadi +mad pemadan +mad permadi +mad semadi +madah memadahi +madam memadam +madam memadamkan +madam memadamkannya +madam pemadam +madam pemadaman +madam pemadamnya +madam semadam +madang kemadang +madang memadang +madang pemadangan +madani permadani +madat memadat +madat memadati +madat memadatkan +madat memadatkannya +madat pemadat +madat pemadatan +madi belmadi +madi permadi +madi semadi +madu dimadu +madu memadu +madu memadukan +madu memadukannya +madu pemadu +mag memag +magang dimagangkan +magang memagang +magang pemagang +magang pemagangan +magnet bermagnet +magnitudo bermagnitudo +mah dimah +mah kemah +mah pemahan +mah permah +mah permahi +mah semah +mahal dimahalkan +mahal kemahalan +mahal pemahalan +mahal semahal +mahal termahal +mahal termahalnya +mahasiswa kemahasiswaan +mahir kemahiran +mahir pemahiran +mahkota bermahkota +mahkota dimahkotai +mahkota memahkotai +main bemain +main bermain +main bermainan +main bermainlah +main bermainnya +main dimainkan +main dimainkannya +main kemain +main memain +main memainkan +main memainkannya +main pemain +main pemainan +main pemainlah +main pemainnya +main permain +main permainan +main permainkan +main permainnya +main semain +maja kemaja +maja pemajakan +majemuk kemajemukan +maju dimajukan +maju dimajukannya +maju kemajuan +maju kemajukan +maju memajukan +maju memajukannya +maju pemajuan +maju semaju +maju termaju +mak dimakan +mak dimaki +mak kemakan +mak memakan +mak memaki +mak pemakan +mak permak +mak semak +mak semaki +mak termakan +maka memakai +maka pemakai +maka pemakalah +maka semaka +makalah pemakalah +makam dimakam +makam dimakaman +makam dimakamkan +makam dimakamkannya +makam memakamkan +makam memakamkannya +makam pemakaman +makam permakaman +makan dimakan +makan dimakankan +makan dimakannya +makan kemakan +makan memakan +makan memakannya +makan pemakan +makan pemakanan +makan pemakannya +makan permakanan +makan termakan +maket memaketkan +maket pemaketan +maki dimaki +maki memaki +maki memakinya +maki pemakian +maki semaki +maki semakian +makin semakin +maklum dimaklumi +maklum dimaklumkan +maklum memaklumi +maklum memaklumkan +maklum pemakluman +maklum permakluman +maklumat memaklumatkan +makmur dimakmurkan +makmur kemakmuran +makmur memakmurkan +makmur semakmur +makmur termakmur +makna bermakna +makna dimaknai +makna dimaknakan +makna memaknai +makna pemaknaan +maksiat kemaksiatan +maksimal dimaksimalkan +maksimal dimaksimalkannya +maksimal memaksimal +maksimal memaksimalkan +maksimal memaksimalkannya +maksimal pemaksimalan +maksimal semaksimal +maksimal semaksimalkan +maksimal semaksimalnya +maksimal termaksimalkan +maksimum memaksimumkan +maksimum semaksimum +maksud bermaksud +maksud dimaksud +maksud dimaksudkan +maksud dimaksudkannya +maksud dimaksudnya +maksud memaksudkan +maksud termaksud +maktub termaktub +makzul dimakzulkan +makzul memakzulkan +makzul memakzulkannya +makzul pemakzulan +mal kemal +mal kemali +mal pemali +mal semal +mal termal +mala kemala +mala pemalakan +mala semala +malah permalahan +malam bermalam +malam dimalam +malam kemalaman +malam permalam +malam semalam +malam semalaman +malam semalamnya +malang kemalang +malang kemalangan +malang memalang +malang memalangkan +malang pemalang +malang pemalangan +malas kemalasan +malas pemalas +malas termalas +maling dimaling +maling kemalingan +maling memalingkan +malu kemaluan +malu memalu +malu memalui +malu memalukan +malu memalukannya +malu pemalu +malu permalukan +mam dimam +mam kemaman +mama bermama +mamah memamah +mamah pemamah +maman kemaman +mambu semambu +mambung semambung +mampai semampai +mampir semampir +mampu kemampuan +mampu memampukan +mampu semampu +mampu semampunya +man belman +man berman +man bermani +man diman +man dimankan +man keman +man kemanan +man meman +man peman +man perman +man permanan +man seman +man semanan +man terman +mana bermana +mana dimana +mana dimanakan +mana dimananya +mana kemana +mana kemanaan +mana kemanakan +mana permana +mana semana +manah memanah +manah pemanah +manah pemanahan +manah pemanahnya +manajemen dimanajemen +manajemen memanajemen +manajer dimanajeri +manajer memanajeri +manakan dimanakan +manakan kemanakan +mancung memancung +mancung memancungkan +mancung pemancungan +manda bermanda +mandat dimandatkan +mandat memandatkan +mandek kemandekan +mandi bermandi +mandi bermandikan +mandi dimandikan +mandi memandikan +mandi memandikannya +mandi pemandi +mandi pemandian +mandi permandian +mandir kemandiran +mandiri kemandirian +mandiri memandirikan +mandor kemandoran +mandu memandu +mandu memandunya +mandu pemandu +mandu pemanduan +mandu pemandunya +mandul dimandulkan +mandul kemandulan +mandul memandulkan +mandul pemandulan +manfaat bemanfaat +manfaat bermanfaat +manfaat bermanfaatkan +manfaat bermanfaatnya +manfaat dimanfaat +manfaat dimanfaatkan +manfaat dimanfaatkannya +manfaat kemanfaatan +manfaat memanfaat +manfaat memanfaatan +manfaat memanfaatkan +manfaat memanfaatkannya +manfaat pemanfaat +manfaat pemanfaatan +manfaat pemanfaatkan +manfaat termanfaatkan +mang kemang +mang kemangan +mang kemangi +mang memang +mang memangkan +mang memanglah +mang memangnya +mang semang +mang semangan +mang semangnya +mangan kemangan +mangan semangan +manggis kemanggisan +manggung kemanggungan +manggung memanggungkan +mangkas memangkas +mangkas memangkasnya +mangkas pemangkas +mangkas pemangkasan +mangkat pemangkat +mangkir pemangkiran +mangkok semangkok +mangkuk semangkuk +mangsa dimangsa +mangsa dimangsanya +mangsa memangsa +mangsa memangsanya +mangsa pemangsa +mangsa pemangsaan +mangsa pemangsanya +mangu termangu +mangun pemangunan +mani bermani +manifestasi bermanifestasi +manifestasi dimanifestasikan +manifestasi memanifestasikan +manifestasi termanifestasi +manifestasi termanifestasikan +manipulasi dimanipulasi +manipulasi memanipulasi +manipulasi memanipulasinya +manis kemanis +manis kemanisan +manis pemanis +manis pemanisnya +manis semanis +manis termanis +manja bermanja +manja dimanja +manja dimanjakan +manja kemanjaan +manja memanjakan +manja memanjakannya +manja pemanjaan +manja termanjakan +manjung semanjung +manjur kemanjuran +manta memantai +mantan kemantan +mantap dimantapkan +mantap kemantapan +mantap memantapkan +mantap pemantapan +mantel bermantel +mantik memantik +mantik pemantik +mantik pemantiknya +mantik semantik +manunggal kemanunggalan +manusia dimanusiakan +manusia kemanusia +manusia kemanusiaan +manusia memanusiakan +manuver bermanuver +map semapan +mapan kemapanan +mapan memapankan +mapan semapan +mar belmar +mar kemar +mar kemari +mar memar +mar memarkan +mar memarnya +mar semar +mara dimara +mara semara +marah dimarahi +marah kemarahan +marah memarahi +marah pemarah +marah semarah +marak memarakkan +marak semarak +marak semarakkan +marak semaraknya +mare semare +marga bermarga +marginal dimarginalkan +marginal memarginalkan +marginal termarginalkan +mari kemari +mari kemarian +mari kemarilah +maritim kemaritiman +mark memarkan +markas bermarkas +markas bermarkasi +markas dimarkas +maro dimaro +maro kemaro +martabat bermartabat +martabat kemartabatan +martabat memartabatkan +mas bermaslah +mas dimas +mas kemas +mas kemasan +mas kemasi +mas memasan +mas pemasan +mas penmas +mas permas +mas termas +masa bemasalah +masa bermasa +masa bermasalah +masa dimasa +masa dimasanya +masa memasakan +masa pemasakan +masa pemasakannya +masa permasalah +masa semasa +masak dimasak +masak dimasakkan +masak dimasaknya +masak memasak +masak memasakan +masak memasakkan +masak memasaknya +masak pemasak +masak pemasakan +masalah bemasalah +masalah bermasalah +masalah bermasalahan +masalah bermasalahnya +masalah dimasalahkan +masalah memasalahkan +masalah pemasalahan +masalah permasalah +masalah permasalahan +masalah permasalahkan +masalah permasalahnya +masif dimasifkan +masif memasifkan +masif semasif +masih semasih +masinis dimasinisi +masjid kemasjidan +masker bermasker +masker dimasker +maskulin kemaskulinan +maslahat kemaslahatan +mason kemasonan +massa bermassa +massa dimassa +massal pemassalan +mastik memastikan +masturbasi bermasturbasi +masuk dimasuk +masuk dimasukan +masuk dimasuki +masuk dimasukkan +masuk dimasukkannya +masuk kemasukan +masuk kemasukkan +masuk memasuk +masuk memasukan +masuk memasuki +masuk memasukkan +masuk memasukkannya +masuk pemasuk +masuk pemasukan +masuk pemasukkan +masuk termasuk +masuk termasuki +masuk termasuknya +masyarakat bermasyarakat +masyarakat dimasyarakat +masyarakat dimasyarakatkan +masyarakat kemasyarakat +masyarakat kemasyarakatan +masyarakat memasyarakat +masyarakat memasyarakatkan +masyarakat memasyarakatnya +masyarakat pemasyarakat +masyarakat pemasyarakatan +masyarakat permasyarakat +masyarakat permasyarakatan +masyhur kemasyhuran +masyhur termasyhur +mat kemat +mat kematan +mat pemati +mat semat +mat sematan +mat semati +mat sematkan +mata bermata +mata dimata +mata dimatanya +mata memata +mata mematai +mata permata +mata permatanya +mata semata +mata-mata dimata-matai +mata-mata memata-matai +mata-mata semata-mata +matan kematan +matan sematan +matang dimatangkan +matang kematangan +matang mematangkan +matang mematangkannya +matang pematang +matang pematangan +matang permatang +matang sematang +materi bermateri +materi bermaterikan +materi pemateri +materi pematerinya +material bermaterial +material bermaterialkan +mati dimatikan +mati dimatikannya +mati kematian +mati mematikan +mati mematikannya +mati pemati +mati semati +mau dimau +mau dimaui +mau kemauan +mau semau +mau semaunya +maya semaya +mayam semayamkan +mayang semayang +mayor kemayoran +mayoritas bermayoritas +mayoritas bermayoritaskan +mayung memayungi +mayung pemayung +mazhab bermazhab +mbah menmbahkan +mbah pembahan +mbah sembah +mebel permebelan +medan bermedan +media bermedia +media dimedia +mediasi bermediasi +mediasi dimediasi +mediasi dimediasikan +mediasi memediasi +mediator dimediatori +meditasi bermeditasi +megah kemegahan +megah semegah +megah termegah +megan memegan +megan pemegan +meja dimeja +meja kemeja +meja kemejanya +meja semeja +mejam memejamkan +mejeng memejeng +mek semekan +mekar bermekaran +mekar dimekarkan +mekar memekarkan +mekar pemekaran +mel semel +melamin bermelamin +melarat kemelaratan +melas memelas +melik memeliki +memang kememangan +memang mememangi +memang mememangkan +memang pememang +memar dimemarkan +memori bermemori +menak kemenakan +menang dimenangi +menang dimenangkan +menang dimenangkannya +menang kemenang +menang kemenangan +menang memenang +menang memenangan +menang memenangi +menang memenangkan +menang memenangkannya +menang pemenang +menang pemenangan +menang pemenangnya +menara semenara +menit dimenit +menit permenit +menit semenit +mentah dimentahkan +mentah dimentahkannya +mentah mementahkan +mentah mementahkannya +mentah termentahkan +mental bermental +mental mementalkan +mentari kementarian +mentas mementaskan +mentas pementasan +mentereng sementereng +menteri kementeri +menteri kementerian +mentor dimentori +menu memenui +menung termenung +mepet memepet +mepet memepetkan +mepet memepetnya +meraga memeragakan +meraga memeragakannya +merah kemerahan +merah memerah +merah memerahkan +merah memerahnya +merah pemerah +merah pemerahan +merah semerah +merang memerangi +merang pemerangan +merat pemeratan +merawan memerawani +merdeka dimerdekakan +merdeka kemerdekaan +merdeka memerdekaan +merdeka memerdekakan +merek bermerek +merger dimerger +meri memerikan +meri pemerian +meriam bermeriam +merih memerihkan +merih pemerihan +merik memerikan +merikan memerikan +merosot kemerosotan +merosot memerosotkan +merosot pemerosotan +meru semeru +mes dimes +mes dimesi +mes memes +mes memesan +mes pemesan +mesan memesan +mesan memesankan +mesan memesannya +mesan pemesan +mesan pemesanan +mesan pemesannya +mesin bermesin +mesin dimesin +mesin permesinan +mesra bermesraan +mesra kemesraan +mesti kemestian +mesti semestinya +mesum bermesum +meta memetakan +meta memetakannya +meta pemetaan +metabolisme dimetabolisme +metabolisme memetabolisme +metah memetahkan +metamorfosis bermetamorfosis +metastasis bermetastasis +meter permeter +meter permeternya +meter semeter +meterai bermeterai +meterai memeteraikan +metil dimetil +metrologi kemetrologian +mewah kemewahan +mewah semewah +mewah termewah +mi bermian +mi dimi +mi kemi +mi memi +mi memilah +mi meminya +mi pemian +mi permi +mi permian +mi semi +mi seminya +migrasi bermigrasi +migrasi dimigrasi +migrasi dimigrasikan +migrasi kemigrasian +migrasi memigrasi +migrasi memigrasikan +mik memiki +mikat memikat +mikat memikatnya +mikat pemikat +mil memili +mil pemili +mil permil +miliar semiliar +milik dimilik +milik dimiliki +milik dimiliknya +milik memilik +milik memiliki +milik memiliknya +milik memmiliki +milik pemilik +milik pemilikan +milik pemiliki +milik pemiliknya +milir semilir +militer kemiliteran +milu memilukan +milu pemilu +milu pemilunya +mimpi bermimpi +mimpi bermimpilah +mimpi dimimpikan +mimpi memimpi +mimpi memimpikan +mimpi memimpikannya +mimpi pemimpi +mimpi pemimpian +mimpi pemimpinya +minat berminat +minat berminatnya +minat diminat +minat diminati +minat meminat +minat meminati +minat peminat +minat peminatan +minat peminatnya +minat seminat +minggir meminggirkan +minggir meminggirkannya +minggir peminggiran +minim keminiman +minim meminimkan +minim seminim +minim terminim +minimal diminimalkan +minimal meminimalkan +minimal seminimal +minimum meminimumkan +mintak dimintakan +mintak memintak +mintak memintakan +minum diminum +minum diminumkan +minum diminumnya +minum meminum +minum meminumkan +minum meminumnya +minum peminum +minum peminumnya +minum terminum +minus terminus +minyak berminyak +minyak diminyaki +minyak meminyaki +minyak perminyakan +minyak seminyak +miring dimiringkan +miring kemiringan +miring memiringkan +mirip dimiripkan +mirip kemiripan +mirip semirip +miris memiriskan +misal dimisalkan +misal memisalkan +misal semisal +misal semisalnya +misan permisan +misi bermisi +misi permisi +miskin dimiskinkan +miskin kemiskinan +miskin memiskinkan +miskin pemiskinan +miskin semiskin +miskin termiskin +misterius kemisteriusan +mitra bermitra +mitra kemitraan +mobil bermobil +mobil dimobil +mobil semobil +mobilisasi bermobilisasi +mobilisasi dimobilisasi +mobilisasi dimobilisasikan +mobilisasi memobilisasi +mobilisasi termobilisasi +mobilitas bermobilitas +modal bermodal +modal bermodalkan +modal dimodali +modal memodali +modal pemodal +modal pemodalan +modal pemodalnya +modal permodalan +model bermodel +model bermodelkan +model dimodelkan +model memodelkan +model pemodelan +model permodelan +model semodel +moderator dimoderatori +moderator memoderatori +modernisasi dimodernisasi +modernisasi memodernisasi +modernisasi memodernisasikan +modifikasi dimodifikasi +modifikasi memodifikasi +modifikasi memodifikasinya +modifikasi pemodifikasian +modifikasi termodifikasi +modulasi memodulasi +modus bermodus +modus bermoduskan +moga semoga +mogok pemogok +mogok pemogokan +mogok pemogokkan +mohon bermohon +mohon dimohon +mohon dimohonkan +mohon memohon +mohon memohonkan +mohon pemohon +mohon pemohonan +mohon pemohonnya +mohon permohon +mohon permohonan +mohon termohon +mohon termohonnya +mok semok +mole kemolekan +mole kemolekannya +molek kemolekan +moles memoles +moles memoleskan +moles memolesnya +moles pemoles +moles pemolesan +molor memolorkan +moncong bermoncong +mondok pemondokan +mono permono +monopoli dimonopoli +monopoli memonopoli +monyong memonyongkan +moral bermoral +moratorium dimoratorium +moratorium memoratorium +mori memori +mori memorinya +motif bermotif +motif bermotifkan +motivasi bermotivasi +motivasi dimotivasi +motivasi memotivasi +motivasi memotivasinya +motivasi termotivasi +moto bermoto +moto memoto +motor bemotor +motor bermotor +motor bermotornya +motor dimotori +motor memotori +motor pemotor +mu memukan +mu permukan +mu permukannya +mu semu +mu semuan +mu semunya +mu termuan +mua dimuai +mua kemuakan +mua memuai +mua semua +mua semualah +mua semuanya +mua semuanyalah +muai dimuai +muai memuai +muai pemuaian +muak kemuakan +muak memuakkan +mual dimuali +mual semual +muamalah bermuamalah +muara bermuara +muara bermuaranya +muas memuaskan +muas memuaskannya +muas pemuas +muas pemuasan +muat bermuatan +muat dimuat +muat dimuati +muat dimuatnya +muat memuat +muat memuatnya +muat pemuat +muat pemuatan +muat semuat +muat termuat +mud kemudan +mud kemudi +mud pemudan +mud pemudi +mud pengmudi +muda bermuda +muda kemudaan +muda memuda +muda memudakan +muda pemuda +muda pemudanya +muda semuda +muda termuda +muda termudanya +mudah dimudahkan +mudah dimudahkannya +mudah kemudahan +mudah memudah +mudah memudahan +mudah memudahkan +mudah memudahkannya +mudah permudah +mudah semudah +mudah termudah +mudah termudahkan +mudah termudahnya +mudarat kemudaratan +mudik bermudik +mudik kemudikan +mudik pemudik +mudik pemudiknya +mufakat bermufakat +mufakat kemufakatan +mufakat pemufakatan +mufakat permufakatan +muhasabah bermuhasabah +mujur kemujuran +mujur semujur +muka bermuka +muka dimuka +muka kemuka +muka kemukakan +muka kemukanya +muka memuka +muka memukai +muka pemuka +muka pemukaan +muka permukaan +muka termuka +mukim bermukim +mukim bermukimnya +mukim dimukimi +mukim dimukimkan +mukim kemukiman +mukim memukimkan +mukim pemukim +mukim pemukiman +mukim pemukimnya +mukim permukim +mukim permukiman +muktamar bermuktamar +mula bemula +mula bermula +mula bermulai +mula bermulanya +mula dimulai +mula memulai +mula pemula +mula permulaan +mula semula +mula semulai +mula semulanya +mulai bermulai +mulai dimulai +mulai dimulailah +mulai dimulainya +mulai memulai +mulai memulainya +mulai semulai +mulas memulas +mulas memulaskan +mulas memulasnya +mulas pemulas +mulia dimuliakan +mulia kemuliaan +mulia memulia +mulia memuliakan +mulia memuliakannya +mulia pemulia +mulia pemuliaan +mulus dimuluskan +mulus kemulusan +mulus memuluskan +mulus memuluskannya +mulus pemulus +mulus pemulusan +mulus semulus +mulut bermulut +mulut dimulut +mulut kemulut +mulut pemulutan +mumi dimumikan +mumi memumikan +mumpuni memumpuni +mumut pemumutan +munafik kemunafikan +munajat bermunajat +muncul bermunculan +muncul dimunculkan +muncul dimunculkannya +muncul kemunculan +muncul memunculkan +muncul memunculkannya +muncul pemunculan +mundur dimundurkan +mundur dimundurkannya +mundur kemunduran +mundur memundurkan +mundur memundurkannya +mundur pemunduran +mungil termungil +mungkar kemungkaran +mungkin dimungkin +mungkin dimungkinan +mungkin dimungkinkan +mungkin dimungkinkannya +mungkin kemungkin +mungkin kemungkinan +mungkin kemungkinkan +mungkin memungkin +mungkin memungkinan +mungkin memungkinkan +mungkin memungkinkannya +mungkir dimungkiri +mungkir memungkiri +mungut memungut +mungut memunguti +mungut memungutnya +mungut pemungut +mungut pemungutan +mupus memupus +mupus memupuskan +mur semur +murah bermurah +murah dimurahkan +murah kemurahan +murah memurahkan +murah pemurah +murah semurah +murah termurah +murah termurahnya +muram bermuram +muram kemuraman +murka dimurkai +murka kemurkaan +murni dimurnikan +murni kemurnian +murni memurnikan +murni pemurni +murni pemurnian +murni permurnian +murtad kemurtadan +murtad pemurtadan +murung kemurungan +murung pemurung +murus pemurus +mus permusi +museum dimuseumkan +museum permuseuman +musik bermusik +musik bermusiknya +musik pemusik +musik permusikan +musim dimusim +musim permusim +musim permusimnya +musim semusim +musim semusimnya +musnah dimusnahkan +musnah dimusnahkannya +musnah kemusnahan +musnah memusnahkan +musnah memusnahkannya +musnah pemusnah +musnah pemusnahan +mustahil kemustahilan +mustaka pemustaka +musuh bermusuhan +musuh dimusuhi +musuh memusuhi +musuh permusuhan +musyawarah bermusyawarah +musyawarah dimusyawarahkan +musyawarah memusyawarahkan +musyawarah permusyawarahan +musyrik kemusyrikan +mutakhir dimutakhirkan +mutakhir kemutakhiran +mutakhir memutakhirkan +mutakhir pemutakhiran +mutakhir termutakhir +mutakhir termutakhirnya +mutasi bermutasi +mutasi dimutasi +mutasi dimutasikan +mutasi memutasi +mutasi memutasikan +mutasi pemutasian +mutasi permutasi +mutih memutih +mutih memutihkan +mutih memutihkannya +mutih pemutih +mutih pemutihan +mutilasi dimutilasi +mutilasi memutilasi +mutilasi memutilasinya +mutilasi pemutilasi +mutilasi pemutilasian +mutilasi termutilasi +mutlak kemutlakan +mutu bermutu +mutu memutukan +nabi kenabian +nabu menabukan +nada bernada +nada menadakan +nada senada +nadi bernadi +nadi menadi +naf kenaf +nafkah dinafkahi +nafkah menafkahi +nafsu bernafsu +naga penagakan +naga senagai +nagari kenagarian +nah benah +nah benahi +nah bernah +nah dinah +nah menahan +nah penah +nah penahan +nah pernah +nah pernahkan +nah pernahnya +nah senah +nah ternah +nahas kenahasan +nahi benahi +nahu menahu +naif kenaifan +naik dinaikan +naik dinaiki +naik dinaikkan +naik dinaikkannya +naik kenaikan +naik kenaikkan +naik kenaikkannya +naik menaik +naik menaikan +naik menaiki +naik menaikkan +naik menaikkannya +naik menaiknya +naik penaikan +naik penaikkan +najam menajam +najam menajamkan +najam menajamnya +najam penajam +najam penajaman +nak benak +nak benaknya +nak kenak +nak kenakan +nak menak +nak menakan +nak penak +nak pernak +nak ternak +nak ternakan +nak ternaknya +naka menaka +nakal kenakalan +nakhoda dinakhodai +nakhoda menakhodai +nal benali +nal bernal +nal dinal +nal kenal +nal kenalan +nal kenali +nal kenalkan +nal kenalnya +nal menalan +nal penal +nal penali +nalam menalami +nalar bernalar +nalar dinalar +nalar menalar +nalar penalaran +nali benali +nali kenali +nali kenalilah +nali penali +naluri bernaluri +nama benama +nama bernama +nama bernamakan +nama dinama +nama dinamai +nama dinamakan +nama dinamakannya +nama kenamaan +nama menamai +nama menamakan +nama menamakannya +nama penamaan +nama pernama +nama ternama +nan benan +nan bernan +nan dinan +nan kenan +nan menan +nan pernanan +nan senan +nanah bernanah +nanah penanahan +nanang menanangi +nanang penanangan +nandu menandu +nandu menandunya +nandung menandung +nandung senandung +nang benang +nang benangnya +nang kenang +nang kenangan +nang kenangnya +nang memnangkan +nang menang +nang menangan +nang menangi +nang menangkan +nang menanglah +nang menangnya +nang penang +nang penangan +nang penangkan +nang senang +nang senangan +nang senangi +nang senangkan +nang senanglah +nang senangnya +nangka penangkaan +naning senaning +nanti dinanti +nanti dinantikan +nanti dinantikannya +nanti dinantinya +nanti menanti +nanti menantikan +nanti menantikannya +nanti menantinya +nanti penanti +nanti penantian +napas bernapas +napas bernapaskan +napas bernapaslah +napas bernapasnya +napas penapasan +napas pernapasan +napas senapas +nara dinara +nara menara +nara menaranya +nara penara +narasi dinarasikan +narasi menarasikan +narsis bernarsis +narsis kenarsisan +nas belnas +nas benas +nas bernas +nas dinas +nas dinasi +nas dinasnya +nas kenas +nas menas +nas penas +nasar penasaran +nasi dinasi +nasib bernasib +nasib senasib +nasihat dinasihati +nasihat menasihati +nasihat menasihatkan +nasihat penasihat +nasihat penasihatan +nasihat penasihatnya +nasional dinasionalkan +nasional menasional +nasionalisasi dinasionalisasi +nasionalisasi dinasionalisasikan +nasionalisasi menasionalisasi +nasionalisasi menasionalisasikan +nasti dinasti +nasti dinastinya +natang menatang +natar penataran +natural senatural +naturalisasi dinaturalisasi +naturalisasi menaturalisasi +naung bernaung +naung bernaungnya +naung dinaungi +naung menaungi +naung penaung +naung ternaungi +navigasi bernavigasi +navigasi dinavigasi +navigasi dinavigasikan +navigasi kenavigasian +navigasi menavigasi +navigasi menavigasikan +nawa benawa +nawa bernawa +nawa menawakan +nazar bernazar +nazir benazir +nazir kenaziran +ndoro bendoro +nebeng menebeng +negara bernegara +negara dinegara +negara dinegaranya +negara kenegara +negara kenegaraan +negara menegarai +negara senegara +negara senegaranya +negarawan kenegarawan +negarawan kenegarawanan +negasi dinegasikan +negasi menegasikan +negeri dinegeri +negeri dinegerikan +negeri kenegerian +negeri penegerian +negosiasi bernegosiasi +negosiasi dinegosiasi +negosiasi dinegosiasikan +negosiasi menegosiasi +negosiasi menegosiasikan +negosiasi menegosiasikannya +nek kenek +nek keneknya +nek menekan +nek penekan +nekat kenekatan +nekat senekat +neng meneng +neng menengan +neng peneng +neng seneng +neng senengnya +nestapa kenestapaan +net benet +net penet +netral dinetralkan +netral kenetralan +netral menetralkan +netral menetralkannya +netral penetral +netral penetralan +netralisasi dinetralisasi +netralisasi menetralisasi +ngaben pengabenan +ngalau mengalau +nganga menganga +nganga ternganga +ngarai pengaraian +ngebut mengebut +ngenas mengenasi +ngenas mengenaskan +ngeong mengeong +ngeri kengerian +ngeri mengeri +ngeri mengerikan +ngeri mengerikannya +ngiang terngiang +ngung mengungkan +ngung pengungi +ni beni +ni berni +ni dini +ni dinilah +ni dininya +ni keni +ni kenikan +ni meni +ni menilah +ni pelni +ni peni +ni seni +ni senilah +ni seninya +ni terni +nia dinia +nia diniai +nia kenia +nia keniakan +nia meniai +nia penia +nia pernia +nia senia +nia seniai +niaga berniaga +niaga diniagakan +niaga meniagakan +niaga perniagaan +niat beniat +niat berniat +niat diniati +niat diniatkan +niat meniatkan +nih benih +nih benihnya +nihil dinihilkan +nihil menihilkan +nik benik +nik kenikan +nik menik +nik menikkan +nik pernik +nik perniknya +nikah dinikah +nikah dinikahi +nikah dinikahkan +nikah menikah +nikah menikahi +nikah menikahkan +nikah menikahkannya +nikah menikahlah +nikah menikahnya +nikah penikahan +nikah pernikah +nikah pernikahan +nila benilai +nila bernilai +nila dinila +nila dinilai +nila menila +nila menilai +nila penilai +nila senila +nila senilai +nila ternilai +nilai benilai +nilai bernilai +nilai bernilainya +nilai dinilai +nilai dinilainya +nilai menilai +nilai menilainya +nilai penilai +nilai penilaian +nilai penilainya +nilai pernilaian +nilai senilai +nilai ternilai +ninabobo dininabobokan +ninabobo meninabobokan +ning bening +ning beningnya +ning dining +ning kening +ning keningnya +ning mening +ning pening +ning perning +ningrat diningrat +nipah senipah +nipis menipis +nipis menipiskan +nipis menipisnya +nipis penipisan +nisan bernisan +nisbah dinisbahkan +niscaya diniscayakan +niscaya keniscayaan +niscaya meniscayakan +nista dinista +nista dinistakan +nista kenistaan +nista menista +nista menistai +nista menistakan +nista penista +nista penistaan +noa benoa +nobat dinobatkan +nobat dinobatkannya +nobat menobatkan +nobat menobatkannya +nobat penobatan +noda bernoda +noda dinodai +noda menoda +noda menodai +noda menodakan +noda penoda +noda penodaan +noda ternoda +noda ternodai +nol dinolkan +nol senol +nominal bernominal +nominal dinominalkan +nominasi dinominasi +nominasi dinominasikan +nominasi menominasikan +nominasi penominasian +nomor benomor +nomor bernomor +nomor dinomor +nomor dinomori +nomor menomor +nomor penomoran +non dinon +non menon +nonaktif dinonaktifkan +nonaktif dinonaktifkannya +nonaktif mengnonaktifkan +nonaktif menonaktifkan +nonaktif menonaktifkannya +nonaktif penonaktifan +nonaktif penonaktifkan +normal dinormalkan +normal kenormalan +normal menormalkan +normal penormalan +normal senormal +normalisasi dinormalisasi +normalisasi dinormalisasikan +normalisasi menormalisasi +normalisasi menormalisasikan +nostalgia bernostalgia +notariat kenotariatan +notifikasi dinotifikasi +notifikasi menotifikasi +nrima menrima +nu benu +nu dinu +nu menu +nu menui +nu menukan +nu menunya +nu penuan +nuansa bernuansa +nuansa bernuansakan +nukil dinukil +nukil menukil +nunut menunut +nunut penunut +nur benur +nur menur +nus dinus +nus menus +nus penus +nusantara kenusantaraan +nusantara senusantara +nutrisi bernutrisi +nutrisi menutrisi +nutrisi ternutrisi +nyai benyai +nyak benyak +nyak dinyakan +nyak menyakan +nyak penyaki +nyala dinyalakan +nyala dinyalakannya +nyala menyala +nyala menyalakan +nyala menyalakannya +nyala menyalanya +nyala penyala +nyala penyalaan +nyali bernyali +nyaman kenyaman +nyaman kenyamanan +nyaman menyamankan +nyaman senyaman +nyaman ternyaman +nyana dinyana +nyang kenyang +nyang kenyangnya +nyang menyangi +nyang menyangkan +nyang penyang +nyanyang menyanyangi +nyanyang menyanyangkan +nyanyang penyanyang +nyanyi bernyanyi +nyanyi bernyanyilah +nyanyi dinyanyikan +nyanyi dinyanyikannya +nyanyi menyanyi +nyanyi menyanyikan +nyanyi menyanyikannya +nyanyi menyanyinya +nyanyi penyanyi +nyanyi penyanyinya +nyarang menyarang +nyarang menyarangkan +nyarang menyarangkannya +nyarang penyarang +nyarik menyarikan +nyarik penyarikan +nyaring kenyaringan +nyaring menyaring +nyaring menyaringnya +nyaring penyaring +nyaring penyaringan +nyata dinyataan +nyata dinyatakan +nyata dinyatakannya +nyata kenyataan +nyata mennyatakan +nyata menyataan +nyata menyatakan +nyata menyatakannya +nyata penyataan +nyata pernyataan +nyata pernyatakan +nyata senyata +nyata senyatanya +nyata ternyata +nyawa bernyawa +nyawa dinyawai +nyawa senyawa +nyawa senyawanya +nyeri kenyeri +nyiur senyiur +obar mengobarkan +obar pengobar +obat berobat +obat berobatlah +obat berobatnya +obat diobati +obat mengobat +obat mengobati +obat menobatkan +obat menobatkannya +obat pengobat +obat pengobatan +obat penobatan +obat perobatan +obat terobati +obi pelobi +objektif keobjektifan +objektif seobjektif +obral diobral +obral mengobral +obrol diobrolkan +obrol mengobrol +obrol mengobrolkan +observasi diobservasi +observasi mengobservasi +obsesi berobsesi +obsesi terobsesi +obsesi terobsesinya +oceh mengoceh +odalan pemodalan +ode diode +ode pengodean +ode perode +ogok menyogok +ogok menyogoknya +ogok pemogok +ogok pemogokan +ogok pemogokkan +ogok penyogok +ogok penyogokan +ojek mengojek +ojek pengojek +ojok memojokan +ojok memojokkan +ojok memojokkannya +okok perokok +okok perokoknya +oksida dioksida +oksida peroksida +oksidasi dioksidasi +oksidasi mengoksidasi +oksidasi teroksidasi +oksigen beroksigen +okupasi diokupasi +okupasi mengokupasi +olah berolah +olah diolah +olah diolahnya +olah mengolah +olah mengolahnya +olah menolah +olah pengolah +olah pengolahan +olah pengolahnya +olah perolahan +olah seolah +olah terolah +olahraga berolahraga +olahraga berolahragalah +olahraga berolahraganya +olahraga keolahragaan +olahraga mengolahragakan +olak menolak +olak menolakan +olak menolaknya +olak meolak +olak penolak +olak penolakan +olak penolakkan +oleh beroleh +oleh dioleh +oleh menoleh +oleh menolehkan +oleh peroleh +oleh perolehan +olek menyolek +oles dioles +oles diolesi +oles dioleskan +oles memoles +oles memoleskan +oles memolesnya +oles mengoles +oles mengolesi +oles mengoleskan +oles mengoleskannya +oles pemoles +oles pemolesan +oles pengolesan +olok diolok +olok mengolok +olok mengoloknya +olok menyolok +om belom +om beom +om keoman +ombak berombak +ombak menombak +ombak perombakan +ombak perombakkan +ombang-ambing diombang-ambing +ombang-ambing diombang-ambingkan +ombang-ambing mengombang-ambingkan +ombang-ambing terombang-ambing +omel diomeli +omel mengomel +omel mengomeli +omong diomongkan +ompol mengompol +omzet beromzet +onar keonaran +oncat peloncat +ondo pemondokan +ondo pemondokannya +ondok pemondokan +ong belong +ong keong +ong menong +ong meong +ong meongan +ong seong +ong terong +onggok seonggok +onggok teronggok +ongkos diongkos +ongkos diongkosi +ongkos mengongkosi +opa belopa +oper dioper +oper dioperkan +oper mengoper +oper mengoperkan +oper mengoperkannya +oper mengopernya +oper pengoper +oper pengoperan +opera beroperai +operasi beoperasi +operasi beroperasi +operasi beroperasinya +operasi dioperasi +operasi dioperasikan +operasi dioperasikannya +operasi mengoperasi +operasi mengoperasikan +operasi mengoperasikannya +operasi mengoperasinya +operasi pengoperasi +operasi pengoperasian +operasi pengoperasikan +operasional beroperasional +operasional dioperasionalkan +operasional dioperasionalkannya +operasional mengoperasionalkan +operasional mengoperasionalkannya +operasional pengoperasionalan +operasionalisasi dioperasionalisasikan +operator dioperatori +operator mengoperatori +operator mengoperatorkan +opini beropini +opini diopinikan +oplah beroplah +oplos dioplos +oplos mengoplos +oplos mengoplosnya +oplos pengoplos +oplos pengoplosan +opname diopname +opor pelopor +opor pelopori +opor pelopornya +oposisi beroposisi +optimal dioptimalkan +optimal mengoptimalkan +optimal mengoptimalkannya +optimal pengoptimalan +optimal seoptimal +optimis keoptimisan +orak menyoraki +orak menyorakkan +oral dioral +oral mengoral +orang peorangan +orang perorang +orang perorangan +orang seorang +orang seorangan +orang seorangnya +orasi berorasi +oratorium memoratorium +orbit diorbitkan +orbit diorbitkannya +orbit diorbitnya +orbit mengorbit +orbit mengorbiti +orbit mengorbitkan +orbit mengorbitkannya +orbit mengorbitnya +orbit pengorbit +orbit pengorbitan +order diorder +order mengorder +ordinasi mengordinasi +ordinasi mengordinasikan +organisasi berorganisasi +organisasi diorganisasi +organisasi diorganisasikan +organisasi keorganisasian +organisasi mengorganisasi +organisasi mengorganisasikan +organisasi pengorganisasi +organisasi pengorganisasian +organisasi terorganisasi +organisasi terorganisasikan +orgasme berorgasme +orientasi beorientasi +orientasi berorientasi +orientasi diorientasikan +orientasi mengorientasikan +orkestrasi mengorkestrasi +ornamen berornamen +orok mengorok +otak berotak +otak diotak +otak diotaki +otak mengotak +otak mengotaki +otak-atik diotak-atik +otak-atik mengotak-atik +oto memoto +otomatisasi diotomatisasi +otomatisasi mengotomatisasi +otomatisasi mengotomatisasikan +otomatisasi terotomatisasi +otonom berotonomi +otonomi berotonomi +otorisasi diotorisasi +otorisasi mengotorisasi +otot berotot +otot mengotot +otot pelototi +oven dioven +ovulasi berovulasi +oyak mengoyak +pabean kepabean +pabean kepabeanan +pabrik dipabrik +pacar berpacaran +pacar dipacari +pacar memacari +pacet memacetkan +pacu berpacu +pacu dipacu +pacu dipacunya +pacu memacu +pacu memacunya +pacu pemacu +pacu terpacu +pada kepada +pada kepadanya +pada memadai +pada sepada +pada terpada +padah memadahi +padam dipadamkan +padam memadam +padam memadamkan +padam memadamkannya +padam pemadam +padam pemadaman +padam pemadamnya +padan dipadankan +padan kepadan +padan kepadannya +padan memadankan +padan memadankannya +padan pemadan +padan pemadanan +padan sepadan +padang dipadang +padang memadang +padang pemadangan +padat dipadati +padat dipadatkan +padat kepadatan +padat memadat +padat memadati +padat memadatkan +padat memadatkannya +padat pemadat +padat pemadatan +padat sepadat +padat terpadat +padi pepadi +padi perpadi +padi terpadi +padu memadu +padu memadukan +padu memadukannya +padu pemadu +paduk dipadukan +paduk memadukan +pagar berpagar +pagar dipagar +pagar dipagari +pagar memagar +pagar memagari +pagar pemagaran +pagi dipagi +pagi kepagian +pagi sepagi +pagu dipagukan +paha sepaha +pahala berpahala +pahat dipahat +pahat memahat +pahat pemahat +pahat pemahatan +pahat terpahat +pahit kepahitan +pahit sepahit +pahit terpahit +pahlawan kepahlawan +pahlawan kepahlawanan +pai memaikan +pai pemai +pai pemaian +pai pemainya +pailit dipailitkan +pailit kepailitan +pailit memailitkan +pailit mempailitkan +pailit pemailitan +paja pemajakan +paja perpajakan +paja perpajakannya +pajak dipajaki +pajak memajaki +pajak pemajakan +pajak perpajakan +pajak perpajakkan +pajan terpajan +pajang dipajang +pajang dipajangkan +pajang dipajangnya +pajang memajang +pajang memajangkan +pajang memajangnya +pajang pemajangan +pajang perpajangan +pajang sepajang +pajang terpajang +pajuan pemajuan +pak dipak +pak kepak +pak kepakan +pak memakan +pak memaki +pak pemakan +pak sepak +pak sepakan +pak sepakkan +pakai berpakaian +pakai dipakai +pakai dipakaikan +pakai dipakailah +pakai dipakainya +pakai kepakai +pakai memakai +pakai memakaikan +pakai memakaikannya +pakai memakainya +pakai pemakai +pakai pemakaian +pakai pemakainya +pakai terpakai +pakai terpakainya +pakan kepakan +pakan memakan +pakan memakannya +pakan pemakan +pakan pemakanan +pakan pemakannya +pakan sepakan +pakan sepakannya +pakar kepakaran +pakat kepakatan +pakat sepakat +pakat sepakatan +pakat sepakati +pakat sepakatnya +paket dipaket +paket dipaketkan +paket memaketkan +paket pemaketan +paket perpaket +paket sepaket +pakis kepakisan +paksa dipaksa +paksa dipaksakan +paksa dipaksanya +paksa memaksa +paksa memaksaan +paksa memaksakan +paksa memaksakannya +paksa memaksanya +paksa pemaksa +paksa pemaksaan +paksa terpaksa +paksa terpaksalah +paku berpaku +paku dipaku +paku dipakukan +paku memaku +paku memakukan +paku sepaku +paku terpaku +pakuk dipakukan +pakuk memakukan +pal kepal +pal kepalan +pal kepalkan +pal pemali +pal terpal +pala kepala +pala kepalai +pala kepalanya +pala pemalakan +palai kepalai +palak dipalak +palak memalak +palak memalaknya +palak pemalak +palak pemalakan +palang berpalang +palang dipalang +palang kepalang +palang memalang +palang memalangkan +palang pemalang +palang pemalangan +palas pemalas +palet berpalet +paling berpaling +paling berpalingnya +paling memalingkan +palsu dipalsu +palsu dipalsukan +palsu dipalsukannya +palsu kepalsuan +palsu memalsu +palsu memalsukan +palsu memalsukannya +palsu pemalsu +palsu pemalsuan +palu dipalu +palu memalu +palu memalui +palu memalukan +palu memalukannya +palu pemalu +pamah memamah +pamah pemamah +pamer berpameran +pamer dipamerkan +pamer dipamerkannya +pamer memamerkan +pamer memamerkannya +pamit berpamitan +pampang dipampang +pampang dipampangkan +pampang memampang +pampang memampangkan +pampang terpampang +pampang terpampangnya +pampat memampatkan +pan dipan +pan meman +pan mempan +pan menpan +pan peman +pan perpani +pan sepan +pana terpana +panah dipanah +panah memanah +panah pemanah +panah pemanahan +panah pemanahnya +pancang dipancang +pancang dipancangkan +pancang memancang +pancang memancangkan +pancang pemancang +pancang pemancangan +pancang terpancang +pancar dipancarkan +pancar dipancarkannya +pancar memancar +pancar memancarkan +pancar pemancar +pancar pemancaran +pancar pemancarnya +pancar terpancar +pancing dipancing +pancing kepancing +pancing memancing +pancing memancingnya +pancing pemancing +pancing pemancingan +pancing terpancing +pancung dipancung +pancung dipancungnya +pancung memancung +pancung memancungkan +pancung pemancungan +pandai kepandaian +pandai sepandai +pandai terpandai +pandan sepandan +pandang berpandangan +pandang dipandang +pandang dipandangi +pandang dipandangnya +pandang memandang +pandang memandangi +pandang memandangnya +pandang pemandangan +pandang sepandangan +pandang terpandang +pandu berpandu +pandu berpanduan +pandu dipandu +pandu dipandunya +pandu kepanduan +pandu memandu +pandu memandunya +pandu pemandu +pandu pemanduan +pandu pemandunya +pandu terpandu +panel berpanel +pangan kepangan +pangeran kepangeranan +panggang dipanggang +panggang memanggang +panggang memanggangnya +panggang pemanggang +panggang pemanggangan +panggang terpanggang +panggil dipanggil +panggil dipanggilan +panggil dipanggilkan +panggil dipanggilnya +panggil memanggil +panggil memanggilkan +panggil memanggilnya +panggil pemanggil +panggil pemanggilan +panggil terpanggil +panggul dipanggul +panggul memanggul +panggung dipanggung +panggung dipanggungkan +panggung memanggungkan +panggung sepanggung +pangkal berpangkal +pangkal berpangkalan +pangkal memangkal +pangkas dipangkas +pangkas dipangkasnya +pangkas memangkas +pangkas memangkasnya +pangkas pemangkas +pangkas pemangkasan +pangkas terpangkas +pangkas terpangkasnya +pangkat berpangkat +pangkat kepangkatan +pangkat pemangkat +pangku berpangku +pangku dipangku +pangku dipangkuan +pangku dipangkunya +pangku kepangkuan +pangku memangku +pangku memangkunya +pangku pemangku +pangku pemangkuan +pangsa memangsa +pangsa memangsanya +pangsa pemangsa +pangsa pemangsaan +pangsa pemangsanya +panik kepanikan +panik sepanik +panitera kepaniteraan +panitia kepanitiaan +panja memanjakan +panja memanjakannya +panja pemanjaan +panjak memanjakan +panjang berpanjang +panjang dipanjang +panjang dipanjangkan +panjang kepanjangan +panjang memanjang +panjang memanjangkan +panjang memanjangnya +panjang pemanjangan +panjang perpanjang +panjang perpanjangan +panjang sepanjang +panjang sepanjangan +panjang terpanjang +panjang terpanjangnya +panjat dipanjat +panjat dipanjatkan +panjat dipanjatnya +panjat memanjat +panjat memanjatkan +panjat memanjatnya +panjat pemanjat +panjat pemanjatan +panorama berpanorama +pantai dipantai +pantai memantai +pantai terpantai +pantar sepantaran +pantas kepantasan +pantas memantaskan +pantas sepantasnya +pantas sepantasnyalah +pantau dipantau +pantau dipantaunya +pantau memantau +pantau memantaunya +pantau pemantau +pantau pemantauan +pantau pemantaunya +pantau terpantau +pantau terpantaunya +pantik dipantik +pantik memantik +pantik pemantik +pantik pemantiknya +pantik terpantik +panting kepantingan +pantul dipantulkan +pantul memantul +pantul memantulkan +pantul memantulkannya +pantul pemantul +pantul terpantul +pantun berpantun +papah dipapah +papah memapah +papah memapahnya +papan berpapan +papan dipapan +papan memapankan +papar dipapar +papar dipaparkan +papar dipaparkannya +papar memapar +papar memaparkan +papar memaparkannya +papar pemaparan +papar terpapar +papar terpaparnya +papas berpapasan +papas dipapas +papas memapas +par memar +par memarkan +par memarnya +par memparkan +par menpar +para kepara +para keparakan +parade berparade +paradigma berparadigma +paraf diparaf +paraf memaraf +paraf memparaf +parah keparahan +parah memarahi +parah pemarah +parah perparah +parah separah +parah terparah +parah terparahnya +parak keparakan +parak memarakkan +parang diparang +parang pemarangan +paras berparas +paras separasi +paring diparingi +paripurna diparipurnakan +paripurna memparipurnakan +pariwisata kepariwisataan +parkir diparkir +parkir diparkiran +parkir diparkiri +parkir diparkirkan +parkir diparkirnya +parkir memarkir +parkir memarkirkan +parkir memarkirkannya +parkir memarkirnya +parkir pemarkir +parkir pemarkiran +parkir perparkiran +parkir terparkir +parlemen berparlemen +parlemen diparlemen +parlemen keparlemenan +parodi diparodikan +parodi memparodikan +paron pemaron +partai berpartai +partai dipartai +partai kepartaian +partai separtai +partai separtainya +partisi berpartisi +partisipasi bepartisipasi +partisipasi berpartisipasi +partner berpartner +paruh berparuh +paruh diparuh +paruh separuh +paruh separuhnya +parut diparut +parut memarut +parut pemarut +pas kepas +pas memasan +pas pemasan +pasak memasak +pasak memasakan +pasak memasakkan +pasak memasaknya +pasak pemasak +pasak pemasakan +pasang berpasangan +pasang dipasang +pasang dipasangan +pasang dipasangi +pasang dipasangkan +pasang dipasangkannya +pasang dipasangnya +pasang memasang +pasang memasangi +pasang memasangkan +pasang memasangkannya +pasang memasangnya +pasang pemasang +pasang pemasangan +pasang pemasangnya +pasang perpasangan +pasang sepasang +pasang terpasang +pasang terpasangnya +pasar dipasar +pasar dipasaran +pasar dipasarkan +pasar dipasarkannya +pasar kepasar +pasar kepasaran +pasar memasarkan +pasar memasarkannya +pasar pemasar +pasar pemasaran +pasar pemasarnya +pasar perpasaran +pasara dipasarakan +pasif memasifkan +pasir berpasir +pasok dipasok +pasok dipasoknya +pasok memasok +pasok memasoknya +pasok pemasok +pasok pemasokan +pasok pemasoknya +paspor berpaspor +pasrah berpasrah +pasrah dipasrahi +pasrah dipasrahkan +pasrah kepasrahan +pasrah memasrahkan +pasteurisasi dipasteurisasi +pasti dipastikan +pasti dipastikannya +pasti kepastian +pasti kepastikan +pasti memastian +pasti memastikan +pasti memastikannya +pasti pemasti +pasti pemastian +pastor kepastoran +pasu memasukan +pasu memasukannya +pasu pemasukan +pasu pemasukannya +pasu sepasukan +pasuk memasuk +pasuk memasukan +pasuk memasuki +pasuk memasukkan +pasuk memasukkannya +pasuk pemasuk +pasuk pemasukan +pasuk pemasukkan +pasuk sepasukan +pasung dipasung +pasung memasung +pasung memasungnya +pasung pemasungan +pasung terpasung +patah dipatahkan +patah mematahkan +patah mematahkannya +patah pepatah +patah sepatah +patah terpatahkan +patang mematangkan +patang mematangkannya +patang pematang +patang pematangan +paten dipatenkan +paten dipatenkannya +paten mematenkan +paten mematenkannya +paten mempatenkan +paten pematenan +pater pemateri +pati berpati +pati dipati +pati dipatikan +pati kepatian +pati mematikan +pati mematikannya +pati pemati +pati sepati +patih kepatihan +patik dipatikan +patik mematik +patik mematikan +patik pematik +patok berpatok +patok berpatokan +patok dipatok +patok dipatoknya +patok mematok +patok mematoknya +patok pematokan +patok terpatok +patri dipatri +patri dipatrikan +patri mematri +patri mematrikan +patri terpatri +patroli berpatroli +patroli dipatroli +patroli mematroli +patuh dipatuhi +patuh kepatuhan +patuh mematuhi +patuk dipatuk +patuk mematuk +patung berpatungan +patung mematung +patung pematung +patungan berpatungan +patut kepatutan +patut mematut +patut sepatutnya +paus kepausan +paut terpaut +pawai berpawai +paya pepaya +payah kepayahan +payang kepayang +payet berpayet +payu memayu +payudara berpayudara +payung berpayung +payung dipayungi +payung memayungi +payung pemayung +pe bepe +pe dipekan +pe meme +pe memei +pe pepe +pe perpekan +pe perpekannya +pe sepe +pe sepekan +pe sepekannya +pecah berpecah +pecah dipecah +pecah dipecahkan +pecah dipecahkannya +pecah kepecahan +pecah memecah +pecah memecahan +pecah memecahkan +pecah memecahkannya +pecah memecahnya +pecah pemecah +pecah pemecahan +pecah perpecahan +pecah terpecah +pecah terpecahkan +pecah terpecahkannya +pecah terpecahnya +pecat dipecat +pecat dipecatnya +pecat memecat +pecat memecatnya +pecat pemecatan +peci berpeci +pecut dipecut +pecut memecut +pecut pemecut +pecut pemecutan +pecut terpecut +peda kepeda +peda sepeda +peda sepedaan +peda sepedanya +pedang berpedang +pedih kepedihan +pedoman berpedoman +pedoman dipedomani +pedoman memedomani +pedoman mempedomani +peduli dipedulikan +peduli dipedulikannya +peduli kepedulian +peduli memedulikan +peduli memedulikannya +peduli mempedulikan +peduli mempedulikannya +pegah terpegah +pegan memegan +pegan pemegan +pegang berpegang +pegang berpegangan +pegang berpeganglah +pegang dipegang +pegang dipegangi +pegang dipegangnya +pegang kepegang +pegang memegang +pegang memegangi +pegang memegangnya +pegang pemegang +pegang pemegangan +pegang pemegangnya +pegang terpegang +pegawai kepegawaian +pei memei +pejam memejamkan +pejam terpejam +pek dipekan +pek kepek +pek pempek +pek perpekan +pek sepekan +peka kepekaan +peka memekakan +pekak memekakan +pekak memekakkan +pekan dipekan +pekan perpekan +pekan perpekannya +pekan sepekan +pekan sepekannya +pekat kepekatan +pekat sepekat +pekik dipekikkan +pekik memekik +pekik memekikkan +pel dipel +pel kepel +pel penpel +pel sepel +pelan memelankan +pelancar mempelancar +pelanting terpelanting +pelas memelas +pelat berpelat +pelek sepelekan +peleset dipelesetkan +peleset kepeleset +peleset memelesetkan +peleset mempelesetkan +peleset terpeleset +peleset terpelesetnya +pelesir berpelesir +pelesir berpelesiran +pelihara dipelihara +pelihara dipeliharanya +pelihara memelihara +pelihara memeliharanya +pelihara pemelihara +pelihara pemeliharaan +pelihara pemeliharanya +pelihara terpelihara +pelihara terpeliharanya +pelik kepelikan +pelik memeliki +pelik sepelik +pelikan kepelikan +pelintir dipelintir +pelintir memelintir +pelintir pemelintiran +pelintir terpelintir +pelopor dipelopori +pelopor kepeloporan +pelopor memelopori +pelopor mempelopori +pelorot memelorotkan +pelosok dipelosok +pelosok kepelosok +pelosok terpelosok +pelotot dipelototi +pelotot memelototi +peluang berpeluang +peluh berpeluh +peluk berpelukan +peluk dipeluk +peluk dipelukan +peluk dipeluknya +peluk kepelukan +peluk memeluk +peluk memelukan +peluk memeluknya +peluk pemeluk +peluk pemeluknya +peluru berpeluru +pemuda kepemudaan +pen memen +pen menpen +pen pepen +penak kepenak +penalti dipenalti +penampang berpenampang +penasaran kepenasaran +penat kepenatan +pencar berpencar +pencar dipencar +pencar memencar +pencar terpencar +pencet dipencet +pencet kepencet +pencet memencet +pencet memencetnya +pencet pemencetan +pencil terpencil +pencil terpencilnya +penda dipenda +pendam dipendam +pendam dipendamnya +pendam memendam +pendam memendamnya +pendam terpendam +pendam terpendamnya +pendar berpendar +pendar memendar +pendar memendarkan +pendek dipendekkan +pendek kependekan +pendek memendek +pendek memendekkan +pendek pemendek +pendek pemendekan +pendek perpendek +pendek perpendekan +pendek sependek +pendek terpendek +pendeta kependetaan +pending dipending +penduk kependukan +penetrasi berpenetrasi +penetrasi dipenetrasi +penetrasi mempenetrasi +pengacara pengacaranya +pengang dipengang +pengang memengang +pengang pemengang +pengaruh bepengaruh +pengaruh berpengaruh +pengaruh berpengaruhnya +pengaruh dipengaruh +pengaruh dipengaruhi +pengaruh memengaruhi +pengaruh mempengaruh +pengaruh mempengaruhi +pengaruh terpengaruh +pengaruh terpengaruhi +pengaruh terpengaruhnya +penggal dipenggal +penggal memenggal +penggal memenggalnya +penggal pemenggal +penggal pemenggalan +penggal sepenggal +penggal terpenggal +penghulu kepenghuluan +pengin kepengin +penis berpenis +penjara dipenjara +penjara dipenjarakan +penjara dipenjarakannya +penjara dipenjaranya +penjara kepenjaraan +penjara memenjara +penjara memenjarakan +penjara memenjarakannya +penjara pemenjaraan +penjara terpenjara +pental mementalkan +pental terpental +pental terpentalnya +pentas berpentas +pentas dipentas +pentas dipentaskan +pentas mementaskan +pentas pementasan +penting dipentingkan +penting kepenting +penting kepentingan +penting mementingkan +penting sepenting +penting terpenting +penting terpentingnya +penuh dipenuh +penuh dipenuhi +penuh kepenuhan +penuh memenuh +penuh memenuhi +penuh pemenuh +penuh pemenuhan +penuh sepenuh +penuh sepenuhnya +penuh terpenuh +penuh terpenuhi +pepes dipepes +pepet dipepet +pepet dipepetkan +pepet kepepet +pepet memepet +pepet memepetkan +pepet memepetnya +pepet terpepet +per beperan +per berperan +per berperi +per memerkan +per pemeran +per peper +per seper +per seperi +per terperi +pera keperakan +pera menpera +pera pepera +perah diperah +perah memerah +perah memerahkan +perah memerahnya +perah pemerah +perah pemerahan +perahu berperahu +perak keperakan +perak seperak +peran beperan +peran berperan +peran berperanan +peran berperannya +peran diperankan +peran diperankannya +peran memerankan +peran memerankannya +peran pemeran +peran pemerannya +perang beperang +perang berperang +perang diperangi +perang memerangi +perang pemerangan +perang peperangan +perang perperangan +perangah terperangah +perangai berperangai +perangai memerangai +perangkap diperangkap +perangkap memerangkap +perangkap terperangkap +perangkap terperangkapnya +perangkat berperangkat +perangkat diperangkat +perangkat seperangkat +perangkat terperangkat +peranjat terperanjat +peras berperasi +peras diperas +peras diperasnya +peras memeras +peras memerasnya +peras pemeras +peras pemerasan +perat memperat +perat pemeratan +perata memeratakan +perata pemerataan +perban diperban +perban diperbankan +perca kepercaan +percaya dipercaya +percaya dipercayai +percaya dipercayakan +percaya dipercayanya +percaya kepercaya +percaya kepercayaan +percaya memercayai +percaya memercayakan +percaya memercayakannya +percaya mempercaya +percaya mempercayai +percaya mempercayakan +percaya mempercayakannya +percaya terpercaya +percaya terpercayanya +percik diperciki +percik dipercikkan +percik memercik +percik memercikan +percik memercikkan +percik sepercik +percik terpercik +perdata keperdataan +perempuan keperempuanan +peretel dipereteli +peretel memereteli +peretel mempereteli +performa berperforma +pergi bepergian +pergi berpergian +pergi kepergian +pergok dipergoki +pergok kepergok +pergok memergoki +pergok terpergok +perhati diperhatian +perhati diperhatikan +perhati diperhatikannya +perhati memerhatikan +perhati memerhatikannya +perhati memperhatian +perhati memperhatikan +perhati memperhatikannya +perhati meperhatikan +perhati pemerhati +perhati terperhatikan +peri berperi +peri diperikan +peri memerikan +peri memperikan +peri pemerian +peri seperi +peri terperi +peri terperikan +perian pemerian +perih keperihan +perih memerihkan +perih pemerihan +perikemanusiaan berperikemanusiaan +periksa diperiksa +periksa diperiksakan +periksa diperiksanya +periksa memeriksa +periksa memeriksaan +periksa memeriksakan +periksa memeriksakannya +periksa memeriksanya +periksa pemeriksa +periksa pemeriksaan +periksa pemeriksanya +periksa terperiksa +perilaku berperilaku +perin menperin +perinci diperinci +perinci memerinci +perinci memperinci +perinci terperinci +pering diperingan +pering memperingan +peringkat berperingkat +peringkat diperingkat +peringkat diperingkatkan +peringkat keperingkat +peringkat memeringkat +peringkat memeringkatkan +peringkat memperingkatkan +peringkat pemeringkat +peringkat pemeringkatan +perintah diperintah +perintah diperintahkan +perintah diperintahkannya +perintah memerintah +perintah memerintahan +perintah memerintahkan +perintah memerintahkannya +perintah memerintahnya +perintah memperintahkan +perintah pemerintah +perintah pemerintahan +perintah pemerintahkan +perintah pemerintahlah +perintah pemerintahnya +periode diperiode +perisa berperisa +perisa diperisa +perisa pemerisa +perisa pemerisaan +perit seperit +perjaka keperjakaan +perkara beperkara +perkara berperkara +perkara diperkarakan +perkara memerkarakan +perkara memperkarakan +perkara memperkarakannya +perkasa keperkasaan +perkosa diperkosa +perkosa diperkosanya +perkosa memerkosa +perkosa memerkosanya +perkosa memperkosa +perkosa memperkosanya +perkosa pemerkosa +perkosa pemerkosaan +perkosa pemerkosanya +permai mempermaikan +permak dipermak +permak memermak +permak mempermak +permanen dipermanenkan +permanen memermanenkan +permanen memermanenkannya +permanen mempermanenkan +permanen mempermanenkannya +peron peperoni +perosok terperosok +perosok terperosoknya +perosot memerosotkan +perosot pemerosotan +perosot terperosot +pers pempers +pers perpers +persekusi dipersekusi +persen sepersen +persentase dipersentase +persentase dipersentasekan +persepsi berpersepsi +persepsi dipersepsi +persepsi dipersepsikan +persepsi memersepsikan +persepsi mempersepsi +persepsi mempersepsikan +persepsi mempersepsikannya +personifikasi dipersonifikasikan +perspektif berperspektif +persuasi mempersuasi +perut berperut +perut diperut +perut diperutnya +pes berpesan +pes dipesan +pes memes +pes memesan +pes pemesan +pes pepes +pes pepesan +pes perpes +pes terpesan +pesan berpesan +pesan dipesan +pesan dipesankan +pesan dipesannya +pesan memesan +pesan memesankan +pesan memesannya +pesan pemesan +pesan pemesanan +pesan pemesannya +pesan pepesan +pesan perpesanan +pesan terpesan +pesat sepesat +pesat terpesat +pesawat dipesawat +peser sepeser +pesiar berpesiar +pesisir dipesisir +pesona memesona +pesona mempesona +pesona terpesona +pesona terpesonanya +pesta berpesta +pestisida berpestisida +pet memet +pet mepet +pet mepetnya +pet pepet +pet sepet +pet sepeti +peta dipetakan +peta memetakan +peta memetakannya +peta mempetakan +peta pemetaan +peta perpetaan +peta terpetakan +petah memetahkan +petak dipetakan +petak memetakan +petak mempetakan +petak sepetak +petak terpetakan +peti dipetikan +peti pemetikan +peti sepeti +peti sepetinya +petik dipetik +petik dipetikan +petik dipetiknya +petik memetik +petik memetiknya +petik pemetik +petik pemetikan +petik terpetik +peting kepetingan +peting memetingkan +petis dipetisi +petisi dipetisi +petisi dipetisikan +pi dipi +pi dipilah +pi kepi +pi memi +pi memilah +pi meminya +pi pemian +pi pepi +pi sepi +pi sepinya +pi terpilah +piala dipiala +piawai kepiawaian +picik kepicikan +picing memicingkan +picu dipicu +picu dipicunya +picu memicu +picu memicunya +picu pemicu +picu pemicuan +picu pemicunya +picu terpicu +picu terpicunya +pidana dipidana +pidana dipidanakan +pidana dipidanakannya +pidana memidana +pidana memidanakan +pidana memidanakannya +pidana mempidana +pidana mempidanakan +pidana mempidanakannya +pidana pemidanaan +pidana terpidana +pidana terpidananya +pidato berpidato +pidato dipidatokan +pigmen berpigmen +pihak berpihak +pihak berpihaknya +pihak dipihak +pihak dipihaknya +pihak kepihak +pihak memihak +pihak memihaknya +pihak pemihakan +pihak sepihak +pihak sepihaknya +pijah memijah +pijah pemijahan +pijak berpijak +pijak dipijak +pijak dipijaknya +pijak memijak +pijak memijakkan +pijar berpijar +pijar memijarkan +pijat dipijat +pijat memijat +pijat memijatnya +pijat pemijat +pijat pemijatan +pijit dipijit +pijit memijit +pikat dipikat +pikat memikat +pikat memikatnya +pikat pemikat +pikat terpikat +pikir bepikir +pikir berpikir +pikir berpikiran +pikir berpikirlah +pikir berpikirnya +pikir dipikir +pikir dipikiran +pikir dipikirkan +pikir dipikirkannya +pikir dipikirnya +pikir kepikir +pikir kepikiran +pikir memikir +pikir memikiran +pikir memikirkan +pikir memikirkannya +pikir pemikir +pikir pemikiran +pikir perpikir +pikir terpikir +pikir terpikirkan +piknik berpiknik +pikul dipikul +pikul dipikulnya +pikul memikul +pikul memikulnya +pikul pemikul +pikun kepikunan +pil kepil +pil memili +pil pemili +pilah dipilah +pilah memilah +pilah memilahkan +pilah memilahnya +pilah pemilahan +pilah terpilah +pilar berpilar +pilih dipilih +pilih dipilihan +pilih dipilihkan +pilih dipilihlah +pilih dipilihnya +pilih kepilih +pilih memilih +pilih memilihi +pilih memilihkan +pilih memilihnya +pilih pemilih +pilih pemilihan +pilih pemilihnya +pilih terpilih +pilih terpilihlah +pilih terpilihnya +pilin berpilin +pilin dipilin +pilin memilin +pilin terpilin +pilot dipiloti +pilu kepiluan +pilu memilukan +pilu pemilu +pilu pemilunya +pimpin dipimpin +pimpin dipimpinan +pimpin dipimpinnya +pimpin kepimpinan +pimpin memimpin +pimpin memimpinnya +pimpin mempimpin +pimpin pemimpin +pimpin pemimpinan +pimpin pemimpinnya +pimpin pempimpin +pimpin terpimpin +pimping dipimping +pin mempin +pin pemin +pin pempinan +pin pepin +pinang dipinang +pinang meminang +pinang meminangnya +pinang peminang +pinang peminangan +pincang kepincangan +pincang terpincang +pincut kepincut +pincut memincut +pincut terpincut +pinda dipindai +pinda dipindakan +pinda memindai +pinda pemindai +pindah berpindah +pindah berpindahnya +pindah dipindah +pindah dipindahkan +pindah dipindahkannya +pindah dipindahnya +pindah kepindahan +pindah memindah +pindah memindahan +pindah memindahkan +pindah memindahkannya +pindah pemindah +pindah pemindahan +pindah pemindahkan +pindah perpindahan +pindai dipindai +pindai memindai +pindai memindainya +pindai pemindai +pindai pemindaian +pindang pemindangan +pinggan sepinggan +pinggang berpinggang +pinggang dipinggang +pinggang dipinggangnya +pinggang sepinggang +pinggir dipinggir +pinggir dipinggiran +pinggir dipinggirkan +pinggir kepinggir +pinggir meminggirkan +pinggir meminggirkannya +pinggir peminggiran +pinggir terpinggir +pinggir terpinggirkan +pinggir terpinggirkannya +pinggul berpinggul +pingit dipingit +pingkal terpingkal +pingpong dipingpong +pinjam dipinjam +pinjam dipinjami +pinjam dipinjamkan +pinjam dipinjamkannya +pinjam dipinjamnya +pinjam meminjam +pinjam meminjami +pinjam meminjamkan +pinjam meminjamkannya +pinjam meminjamnya +pinjam peminjam +pinjam peminjaman +pinjam peminjamnya +pinta dipinta +pinta meminta +pinta memintai +pinta memintakan +pinta memintanya +pinta peminta +pinta pemintaan +pintal dipintal +pintal memintal +pintal pemintal +pintal pemintalan +pintan memintan +pintar kepintaran +pintar sepintar +pintar terpintar +pintas memintas +pintas pemintas +pintas sepintas +pintu berpintu +pintu dipintu +pipa berpipa +pipa pemipaan +pipa perpipaan +pipi berpipi +pipih dipipihkan +pipil pemipil +piring memiringkan +piring sepiring +pirsa pemirsa +pirsa pemirsanya +pisah berpisah +pisah berpisahnya +pisah dipisah +pisah dipisahkan +pisah dipisahkannya +pisah memisah +pisah memisahkan +pisah memisahkannya +pisah pemisah +pisah pemisahan +pisah perpisahan +pisah terpisah +pisah terpisahkan +pisah terpisahnya +pisau berpisau +pistol berpistol +pita berpita +pita memita +pita pepita +piting dipiting +piting kepiting +piting kepitingnya +piting memiting +planet keplanetan +plastik seplastik +platform berplatform +pleno diplenokan +pleno memplenokan +plester diplester +plester memplester +plonco perploncoan +plot diplot +plot diplotkan +plot memplot +plot memplotnya +po dipo +po kepo +po memo +po memonya +po mepo +po pepo +po sepoi +pohon berpohon +pohon memohon +pohon memohonkan +pohon pemohon +pohon pemohonan +pohon pemohonnya +pohon pepohonan +poin kepoin +pojok dipojok +pojok dipojokan +pojok dipojokkan +pojok memojokan +pojok memojokkan +pojok memojokkannya +pojok terpojok +pojok terpojokkan +pok kepok +pola berpola +pola terpola +polarisasi mempolarisasi +polarisasi terpolarisasi +polemik berpolemik +polemik dipolemikan +polemik dipolemikkan +poles dipoles +poles dipolesnya +poles memoles +poles memoleskan +poles memolesnya +poles pemoles +poles pemolesan +poles terpoles +poligam berpoligami +poligam dipoligami +poligami berpoligami +poligami dipoligami +polis kepolisan +polis kepolisi +polisi dipolisikan +polisi kepolisi +polisi kepolisian +polisi mempolisikan +polisi pemolisian +polisi perpolisian +politik berpolitik +politik berpolitiknya +politik dipolitikkan +politik kepolitikan +politik perpolitikan +politis dipolitisi +politisasi dipolitisasi +politisasi memolitisasi +politisasi mempolitisasi +politisasi terpolitisasi +polos kepolosan +polusi berpolusi +polusi terpolusi +pompa dipompa +pompa dipompakan +pompa memompa +pompa memompakan +pompa memompanya +pompa mempompa +pompa pemompa +pompa pemompaan +pompa perpompaan +pompa terpompa +pompong kepompong +pompong kepompongan +pon berponi +pon memon +ponakan keponakan +ponakan keponakannya +pondok pemondokan +pongah kepongahan +poni berponi +popor dipopor +popularitas kepopularitasan +populasi berpopulasi +populer dipopulerkan +populer dipopulerkannya +populer kepopuleran +populer memopulerkan +populer mempopulerkan +populer mempopulerkannya +populer sepopuler +populer terpopuler +porak-poranda diporak-porandakan +porak-poranda memorak-porandakan +porak-poranda memporak-porandakan +pori berpori +pori memori +pori memorinya +poros berporos +porsi berporsi +porsi perporsi +porsi seporsi +portal diportal +portal pemortalan +pos dipos +pos diposkan +pos memos +pos perposan +pose berpose +posisi berposisi +posisi diposisi +posisi diposisikan +posisi diposisinya +posisi keposisi +posisi memosisikan +posisi memosisikannya +posisi memposisikan +posisi memposisikannya +posisi pemosisian +postur berpostur +potensi bepotensi +potensi berpotensi +potensi berpotensinya +potensial berpotensial +potret dipotret +potret dipotretnya +potret memotret +potret memotretnya +potret pemotret +potret pemotretan +potret terpotret +praduga berpraduga +prajurit keprajuritan +prakarsa diprakarsai +prakarsa memprakarsai +prakarsa pemprakarsa +prakarsa pemrakarsa +prakarsa pemrakarsanya +prakira diprakirakan +prakira memprakirakan +praktik berpraktik +praktik dipraktikan +praktik dipraktikkan +praktik dipraktikkannya +praktik mempraktikan +praktik mempraktikkan +praktik mempraktikkannya +praktikan dipraktikan +praktikan mempraktikan +praktikan mempraktikannya +praktis kepraktisan +praktis sepraktis +pramuka kepramukaan +praperadilan dipraperadilan +praperadilan dipraperadilankan +praperadilan mempraperadilankan +prasangka berprasangka +predikat berpredikat +prediksi berprediksi +prediksi diprediksi +prediksi diprediksikan +prediksi diprediksinya +prediksi memprediksi +prediksi memprediksikan +prediksi memprediksinya +prediksi memrediksi +prediksi meprediksi +prediksi terprediksi +prediksi terprediksikan +prei seprei +pres dipres +pres kepres +pres kepresnya +pres pepres +pres perpres +pres perpresnya +presentasi dipresentasikan +presentasi mempresentasikan +presentasi mempresentasikannya +presiden kepresiden +presiden kepresidenan +presiden kepresidennya +presisi berpresisi +prestasi beprestasi +prestasi berprestasi +presto dipresto +pretel dipreteli +pretel mempreteli +pretensi berpretensi +pribadi kepribadian +prihatin diprihatinkan +prihatin keprihatin +prihatin keprihatinan +prihatin keprihatinnya +prihatin memprihatinkan +prihatin memprihatinkannya +prihatin memrihatinkan +prima seprima +prinsip berprinsip +prioritas diprioritas +prioritas diprioritaskan +prioritas memprioritas +prioritas memprioritaskan +prioritas memprioritaskannya +prioritas memrioritaskan +prit sepriti +privatisasi diprivatisasi +privatisasi memprivatisasi +pro pempro +produk diproduk +produk memproduk +produksi berproduksi +produksi berproduksinya +produksi diproduksi +produksi diproduksikan +produksi diproduksinya +produksi memproduksi +produksi memproduksikan +produksi memproduksinya +produksi memroduksi +produksi meproduksi +produksi pemroduksi +produksi terproduksi +produktif seproduktif +produktif terproduktif +produktivitas berproduktivitas +produser diproduseri +produser memproduseri +profesi beprofesi +profesi berprofesi +profesi keprofesian +profesi seprofesi +profesi seprofesinya +profesional keprofesionalan +profesional seprofesional +profil berprofil +program diprogram +program diprogramkan +program memprogram +program memprogramkan +program memprogramnya +program memrogram +program memrogramkan +program pemprograman +program pemrogram +program pemrograman +program terprogram +proklamasi diproklamasikan +proklamasi memproklamasikan +promosi berpromosi +promosi dipromosi +promosi dipromosikan +promosi dipromosikannya +promosi mempromosi +promosi mempromosikan +promosi mempromosikannya +promosi memromosikan +promosi terpromosi +promosi terpromosikan +promotor dipromotori +promotor mempromotori +prop pemprop +propaganda dipropagandakan +propaganda mempropagandakan +proses berproses +proses diproses +proses diprosesnya +proses memproses +proses memprosesnya +proses memroses +proses memrosesnya +proses pemprosesan +proses pemroses +proses pemrosesan +proses terproses +prosesor berprosesor +prospek berprospek +prospek diprospek +protein berprotein +proteksi diproteksi +proteksi memproteksi +proteksi terproteksi +protes diprotes +protes memprotes +protes memprotesnya +protes memrotes +protes pemprotes +protes pemrotes +protokol keprotokolan +protokoler keprotokoleran +provinsi diprovinsi +provinsi seprovinsi +provokasi diprovokasi +provokasi memprovokasi +provokasi memprovokasinya +provokasi memrovokasi +provokasi terprovokasi +proyek diproyekkan +proyeksi diproyeksi +proyeksi diproyeksikan +proyeksi memproyeksi +proyeksi memproyeksikan +proyeksi memproyeksikannya +proyeksi memroyeksikan +proyeksi terproyeksi +psi pepsi +puak memuakkan +puas berpuas +puas dipuaskan +puas kepuasan +puas memuaskan +puas memuaskannya +puas pemuas +puas pemuasan +puas sepuas +puas sepuasnya +puas terpuaskan +publik dipublik +publikasi dipublikasi +publikasi dipublikasikan +publikasi dipublikasikannya +publikasi mempublikasi +publikasi mempublikasikan +publikasi mempublikasikannya +publikasi memublikasi +publikasi memublikasikan +publikasi memublikasikannya +publikasi terpublikasi +publikasi terpublikasikan +pucat memucat +pucuk sepucuk +pudar memudar +pudar memudarkan +pudar memudarnya +pudar pemudaran +pudi pemudi +pugar dipugar +pugar memugar +pugar pemugaran +puisi berpuisi +puja dipuja +puja memuja +puja memujanya +puja pemuja +puja pemujaan +puja pemujanya +puji dipuji +puji dipujinya +puji memuji +puji memujinya +puji terpuji +puji terpujilah +puji terpujinya +pukat pemukatan +pukau memukau +pukau memukaunya +pukau terpukau +pukul dipukul +pukul dipukuli +pukul dipukulkan +pukul dipukulnya +pukul memukul +pukul memukuli +pukul memukulkan +pukul memukulkannya +pukul memukulnya +pukul pemukul +pukul pemukulan +pukul terpukul +pukul terpukulnya +pul kepulan +pul kepulkan +pul sepul +pula memulai +pula pemula +pulai memulai +pulai memulainya +pulan kepulan +pulang berpulang +pulang berpulangnya +pulang dipulang +pulang dipulangkan +pulang dipulangkannya +pulang kepulangan +pulang memulangkan +pulang memulangkannya +pulang pemulang +pulang pemulangan +pulang sepulang +pulang sepulangnya +pulang terpulang +pulas dipulas +pulas memulas +pulas memulaskan +pulas memulasnya +pulas pemulas +pulau dipulau +pulau kepulau +pulau kepulauan +pulih dipulihkan +pulih dipulihkannya +pulih kepulihan +pulih memulih +pulih memulihan +pulih memulihkan +pulih memulihkannya +pulih pemulih +pulih pemulihan +pulih terpulihkan +pulik memuliki +pulsa sepulsa +puluh berpuluh +puluh sepuluh +puluh sepuluhan +puluh sepuluhnya +pulung memulung +pulung pemulung +pulut pemulutan +pumpun memumpuni +pun mempuni +punah kepunahan +puncak berpuncak +puncak dipuncak +puncak dipuncaki +puncak memuncak +puncak memuncaki +puncak memuncaknya +puncak pemuncak +pundak dipundak +pundak dipundaknya +pung kepung +pung kepungan +punggung dipunggung +punggung dipunggungnya +punggung memunggungi +punggung sepunggung +pungkas dipungkasi +pungkas memungkas +pungkas memungkasi +pungkas pemungkas +pungkur dipungkuri +pungut dipungut +pungut dipunguti +pungut dipungutnya +pungut kepungut +pungut memungut +pungut memunguti +pungut memungutnya +pungut pemungut +pungut pemungutan +pungut terpungut +puntir memuntir +puntir terpuntir +puntung sepuntung +punuk berpunuk +pupu pemupukan +pupu sepupu +pupu sepupunya +pupuk dipupuk +pupuk memupuk +pupuk memupuknya +pupuk pemupukan +pupuk terpupuk +pupus dipupuskan +pupus memupus +pupus memupuskan +pura berpura +pura mempura +pura-pura berpura-pura +pura-pura berpura-puralah +pura-pura kepura-puraan +purbakala kepurbakalaan +puruk terpuruk +puruk terpuruknya +purus pemurus +purut memurut +pus pempus +pus perpus +pusar berpusar +pusat berpusat +pusat dipusat +pusat dipusatkan +pusat kepusat +pusat memusat +pusat memusatkan +pusat memusatkannya +pusat pemusatan +pusat terpusat +pusat terpusatkan +pusat terpusatnya +pusing dipusingkan +pusing kepusingan +pusing memusingkan +pusing memusingkannya +pusta perpustaan +pusta perpustakan +pustaka kepustakaan +pustaka pemustaka +pustaka perpustakaan +putar berputar +putar berputarnya +putar diputar +putar diputaran +putar diputarkan +putar diputarnya +putar keputaran +putar memutar +putar memutari +putar memutarkan +putar memutarnya +putar pemutar +putar pemutaran +putar pemutarnya +putar perputaran +putar seputar +putar seputaran +putar seputarnya +putar terputar +puter pemuteran +putih diputihkan +putih keputih +putih keputihan +putih memutih +putih memutihkan +putih memutihkannya +putih pemutih +putih pemutihan +putih seputih +putra berputra +putra diputra +putra seputra +putu keputuan +putu memutukan +putus berputus +putus diputus +putus diputusan +putus diputusi +putus diputuskan +putus diputuskannya +putus diputusnya +putus keputus +putus keputusan +putus memutus +putus memutusan +putus memutuskan +putus memutuskannya +putus memutusnya +putus pemutus +putus pemutusan +putus terputus +putus terputusnya +ra bera +ra berai +ra berra +ra dira +ra kera +ra kerai +ra mera +ra merai +ra pelra +ra pemra +ra pera +ra perai +ra peranya +ra sera +ra serai +ra serakan +ra terra +raba diraba +raba meraba +raba merabanya +raba peraba +raba perabaan +raban beraban +rabat kerabat +rabat kerabatnya +rabet merabet +rabi serabi +rabung berabung +rabut serabut +rabut serabutan +rabut serabutnya +racau meracau +raci peracikan +racik diracik +racik diraciknya +racik meracik +racik meraciknya +racik peracik +racik peracikan +racun beracun +racun beracunnya +racun diracun +racun diracuni +racun keracunan +racun meracun +racun meracuni +racun peracunan +rad berad +rad beradi +rad penrad +rad peradi +rad serad +rada berada +rada beradaan +rada beradai +rada beradanya +rada merada +rada perada +radah peradah +radai beradai +radang meradang +radang peradangan +radang teradang +radar beradar +radar peradaran +raden keradenan +radi beradi +radi peradi +radiasi diradiasi +radiasi meradiasi +radikalisasi diradikalisasi +radikalisasi meradikalisasi +radin peradin +radius beradius +radu beradu +radu peraduan +raga beraga +raga beragai +raga peraga +raga peragaan +raga peragakan +raga peraganya +ragam beragam +ragam beragaman +ragam beragamnya +ragam keragaman +ragam meragamkan +ragam seragam +ragam seragamkan +ragam seragamnya +ragi peragi +ragi peragian +ragil keragilan +ragu diragukan +ragu diragukannya +ragu keraguan +ragu meragu +ragu meragukan +ragu meragukannya +ragu peragu +raguk diragukan +raguk meragukan +rahang berahang +rahap berahap +rahasia berahasia +rahasia dirahasiakan +rahasia dirahasiakannya +rahasia kerahasiaan +rahasia merahasiakan +rahasia merahasiakannya +rahim kerahiman +rahmat dirahmati +rahmat kerahmatan +rahmat merahmati +rahu perahu +rahu perahunya +rai berai +rai kerai +rai merai +rai perai +rai peraian +rai serai +raih beraih +raih diraih +raih diraihnya +raih meraih +raih meraihnya +raih peraih +raih peraihan +raih peraihnya +raja diraja +raja dirajai +raja kerajaan +raja meraja +raja merajai +rajah dirajah +rajah merajah +rajalela merajalela +rajalela merajalelanya +rajam dirajam +rajam merajam +rajang dirajang +rajang merajang +rajang perajang +rajin kerajinan +rajin pengrajin +rajin pengrajinnya +rajin perajin +rajin perajinnya +rajuk merajuk +rajut dirajut +rajut merajut +rajut merajutnya +rajut perajut +rak berak +rak kerak +rak keraknya +rak merak +rak perak +rak peraknya +rak serak +rak serakan +raka meraka +raka merakai +rakah serakah +rakit berakit +rakit dirakit +rakit dirakitnya +rakit merakit +rakit merakitnya +rakit perakit +rakit perakitan +rakit perakitnya +raksasa meraksasa +raksi beraksi +raksi beraksilah +raksi beraksinya +rakus kerakusan +rakyat kerakyatan +rakyat merakyat +ralat diralat +ralat diralatnya +ralat meralat +ralat meralatnya +ralat peralat +ralat peralatan +ram beram +ram keram +ram meram +ram seram +ram seramnya +rama berama +rama beramai +rama perama +rama serama +rama seramai +ramah beramah +ramah keramah +ramah keramahan +ramah seramah +ramal beramal +ramal diramal +ramal diramalkan +ramal meramal +ramal meramalkan +ramal peramal +ramal peramalan +rambah dirambah +rambah kerambah +rambah merambah +rambah merambahnya +rambah perambah +rambah perambahan +ramban peramban +ramban perambannya +rambat merambat +rambat merambatnya +rambat perambatan +rambu perambuan +rambut berambut +rambut berrambut +ramin beramin +rampak berampak +rampang serampang +rampang serampangan +rampas dirampas +rampas dirampasnya +rampas merampas +rampas merampasnya +rampas perampas +rampas perampasan +rampas serampas +ramping dirampingkan +ramping kerampingan +ramping merampingkan +ramping perampingan +ramping seramping +rampok dirampok +rampok dirampoknya +rampok kerampokan +rampok merampok +rampok merampoknya +rampok perampok +rampok perampokan +rampok perampokkan +rampok perampoknya +rampung dirampungkan +rampung dirampungkannya +rampung merampung +rampung merampungkan +rampung merampungkannya +rampung perampungan +ramu diramu +ramu meramu +ramu meramunya +ramu peramu +rana kerana +rana merana +rana peranakan +rana seranai +ranah diranah +ranah keranah +ranap peranap +rancah perancah +rancak perancak +rancang dirancang +rancang dirancangkan +rancang dirancanglah +rancang dirancangnya +rancang merancang +rancang merancangnya +rancang perancang +rancang perancangan +rancang perancangnya +rancu kerancuan +rancu merancukan +randa beranda +randa berandai +randa berandanya +randa keranda +randai berandai +rang berang +rang berangan +rang berangkan +rang berangnya +rang kerang +rang kerangan +rang kerangkan +rang kerangnya +rang merang +rang merangkan +rang penyrang +rang perang +rang perangan +rang perangi +rang perangkan +rang perangnya +rang serang +rang serangan +rang serangkan +rang serangnya +rangai perangai +rangai perangainya +rangai serangai +rangam serangam +rangas berangas +rangas berangasan +rangga serangga +ranggas meranggas +ranggung beranggung +rangin berangin +rangin merangin +rangin perangin +rangin peranginan +rangka berangka +rangka berangkai +rangka dirangkai +rangka kerangka +rangka kerangkanya +rangka merangka +rangka merangkai +rangka perangka +rangka perangkai +rangka serangkai +rangkai berangkai +rangkai dirangkai +rangkai dirangkaian +rangkai dirangkaikan +rangkai merangkai +rangkai merangkaikan +rangkai merangkainya +rangkai perangkai +rangkai perangkaian +rangkai serangkai +rangkai serangkaian +rangkak merangkak +rangkak merangkaknya +rangkap dirangkap +rangkap merangkap +rangkap perangkap +rangkap perangkapan +rangkap perangkapnya +rangking dirangking +rangking merangking +rangkul berangkulan +rangkul dirangkul +rangkul dirangkulnya +rangkul merangkul +rangkul merangkulkan +rangkul merangkulnya +rangkum dirangkum +rangkum merangkum +rangkum merangkumkan +rangkum merangkumnya +rangkut berangkutan +rangsang dirangsang +rangsang merangsang +rangsang merangsangnya +rangsang perangsang +rangsang perangsangan +rani berani +rani beranikan +rani beranilah +rani beraninya +rani dirani +rani merani +ranjang beranjang +ranjang diranjang +ranjang keranjang +ranjang keranjangnya +ranjang seranjang +ranji keranji +ranjing keranjingan +rantai berantai +rantai berantainya +rantai dirantai +rantai merantai +rantai merantainya +rantam berantam +rantas berantas +rantau merantau +rantau perantau +rantau perantauan +rantau serantau +ranti meranti +ranti peranti +ranti perantinya +ranting beranting +rap berap +rap berapi +rap kerap +rap kerapnya +rap merapi +rap perapi +rap serap +rap serapan +rap serapi +rap serapnya +rapah serapah +rapah serapahnya +rapal dirapalkan +rapal merapal +rapal merapalkan +rapat dirapat +rapat dirapatkan +rapat kerapatan +rapat merapat +rapat merapatkan +rapat merapatkannya +rapat merapatnya +rapat perapat +rapat perapatan +rapat serapat +rapel dirapel +rapel merapel +rapi berapi +rapi dirapikan +rapi kerapian +rapi merapi +rapi merapikan +rapi merapikannya +rapi perapi +rapi perapian +rapi serapi +rapik dirapikan +rapik merapikan +rapor berapor +rapu kerapu +rapu merapu +rapuh kerapuh +rapuh kerapuhan +rapuh merapuhkan +rapuh serapuh +rapun berapun +rapung serapung +rarak berarak +rarak perarakan +ras beras +ras berasan +ras berasnya +ras keras +ras kerasan +ras keraslah +ras kerasnya +ras meras +ras meraskan +ras peras +ras perasan +ras perasi +ras serasan +ras serasi +rasa berasa +rasa berasalah +rasa dirasa +rasa dirasakan +rasa dirasakannya +rasa dirasanya +rasa kerasa +rasa kerasaan +rasa kerasanya +rasa merasa +rasa merasai +rasa merasakan +rasa merasakannya +rasa perasa +rasa perasaan +rasa serasa +rasai merasai +rasam berasam +rasan berasan +rasan kerasan +rasan perasan +rasan perasannya +rasan serasan +rasi perasi +rasi serasi +rasional dirasionalkan +rasional merasionalkan +rasionalisasi dirasionalisasi +rasionalisasi dirasionalisasikan +rasionalisasi merasionalisasi +rasionalisasi merasionalisasikan +rasuk dirasuki +rasuk kerasukan +rasuk merasuk +rasuk merasuki +rasul kerasulan +rat berat +rat beratan +rat berati +rat beratkan +rat beratlah +rat beratnya +rat kerat +rat merat +rat serat +rat seratnya +rata berata +rata diratakan +rata kerata +rata kerataan +rata merata +rata meratakan +rata meratakannya +rata meratanya +rata perataan +rata serata +ratah beratahan +ratap beratap +ratap beratapkan +ratap diratapi +ratap meratap +ratap meratapi +ratifikasi diratifikasi +ratifikasi diratifikasinya +ratifikasi meratifikasi +ratifikasi meratifikasinya +ratu peratuan +ratus beratus +ratus meratus +ratus seratus +ratus seratusan +rau berau +raung meraung +raup diraup +raup diraupnya +raup meraup +raup peraup +raut diraut +rawa berawa +rawa merawa +rawa perawakan +rawa perawakannya +rawah berawah +rawak berawak +rawak berawaknya +rawak perawakan +rawak serawak +rawan berawan +rawan kerawanan +rawan perawan +rawan perawannya +rawang kerawang +rawang merawang +rawang perawang +rawat dirawat +rawat dirawatnya +rawat merawat +rawat merawatnya +rawat perawat +rawat perawatan +rawat perawatnya +rawi berawi +rawi merawikan +rawit pengrawit +raya dirayakan +raya dirayakannya +raya merayakan +raya merayakannya +raya peraya +raya perayaan +raya seraya +rayah berayah +rayah berayahkan +rayah dirayah +rayap merayap +rayap merayapi +rayu dirayu +rayu merayu +rayu merayunya +rayu perayu +rayu serayu +razia dirazia +razia merazia +re bere +re dire +re kere +re mere +re merekan +re pere +re sere +re serei +re serelah +re terre +reak mereak +reaksi bereaksi +reaksi direaksi +reaksi mereaksi +reaksi pereaksi +real sereal +realisasi direalisasi +realisasi direalisasikan +realisasi direalisasikannya +realisasi merealisasi +realisasi merealisasikan +realisasi merealisasikannya +realisasi perealisasian +realisasi terrealisasi +realisasi terrealisasikan +realistis serealistis +realokasi direalokasi +realokasi direalokasikan +realokasi merealokasi +realokasi merealokasikan +reba perebakan +rebah direbahkan +rebah merebah +rebah merebahkan +rebak merebak +rebak merebakkan +rebak merebaknya +rebak perebakan +rebek pengrebekan +rebes berebes +reboisasi direboisasi +reboisasi mereboisasi +rebus direbus +rebus merebus +rebus merebusnya +rebus perebusan +rebut berebut +rebut berebutan +rebut direbut +rebut direbutkan +rebut direbutnya +rebut merebut +rebut merebutkan +rebut merebutnya +rebut perebut +rebut perebutan +rebut perebutkan +recok direcoki +recok merecoki +reda bereda +reda direda +reda diredakan +reda diredakannya +reda mereda +reda meredakan +reda meredakannya +reda meredanya +reda pereda +reda peredaan +redaksi keredaksian +redam diredam +redam meredam +redam meredamkan +redam meredamnya +redam peredam +redam peredaman +redefinisi meredefinisi +reduksi direduksi +reduksi mereduksi +reduksi mereduksinya +redup diredupkan +redup meredup +redup meredupkan +redup meredupnya +redup peredupan +redusir meredusir +reekspor direekspor +referensi direferensikan +referensi mereferensi +referensi mereferensikan +refleks berefleksi +refleks merefleksi +refleksi berefleksi +refleksi direfleksikan +refleksi merefleksi +refleksi merefleksikan +refleksi merefleksikannya +reformasi bereformasi +reformasi direformasi +reformasi mereformasi +regang diregangkan +regang keregangan +regang meregang +regang meregangkan +regang meregangnya +regang peregangan +regenerasi beregenerasi +regenerasi diregenerasi +regenerasi meregenerasi +register beregister +register diregister +registrasi beregistrasi +registrasi diregistrasi +registrasi diregistrasikan +registrasi meregistrasi +registrasi meregistrasikan +regu beregu +reguk direguk +reguk mereguk +regulasi diregulasi +regulasi meregulasi +rehab direhab +rehab merehab +rehabilitasi direhabilitasi +rehabilitasi merehabilitasi +rehabilitasi merehabilitasinya +reinkarnasi bereinkarnasi +reja direja +reja mereja +rek berek +rek kerek +rek merek +rek merekan +rek mereknya +reka direka +reka mereka +reka merekakan +reka merekalah +reka merekanya +rekah merekah +rekah merekahnya +rekam direkam +rekam direkaman +rekam direkamnya +rekam merekam +rekam merekamnya +rekam perekam +rekam perekaman +rekam perekamnya +rekam terrekam +rekan merekan +rekapitalisasi merekapitalisasi +rekapitulasi direkapitulasi +rekapitulasi merekapitulasi +rekat direkat +rekat direkatkan +rekat kerekatan +rekat merekat +rekat merekatkan +rekat perekat +rekat perekatnya +rekayasa direkayasa +rekayasa kerekayasaan +rekayasa merekayasa +rekayasa perekayasa +rekayasa perekayasaan +rekening berekening +rekening direkening +rekening direkeningnya +reklamasi direklamasi +reklamasi mereklamasi +rekomendasi direkomendasi +rekomendasi direkomendasikan +rekomendasi direkomendasikannya +rekomendasi merekomendasi +rekomendasi merekomendasikan +rekomendasi merekomendasikannya +rekonsiliasi berekonsiliasi +rekonsiliasi direkonsiliasi +rekonsiliasi merekonsiliasi +rekonstruksi direkonstruksi +rekonstruksi direkonstruksikan +rekonstruksi merekonstruksi +rekonstruksi merekonstruksikan +rekor berekor +rekor perekor +rekreasi berekreasi +rekrut direkrut +rekrut direkrutnya +rekrut merekrut +rekrut merekrutnya +rekrut pengrekrutan +rekrut perekrut +rekrut perekrutan +rekrut perekrutnya +rektor direktor +rektor direktoran +rektor direktori +rel mereli +rel perel +rel pereli +rel terrel +rela direlai +rela direlakan +rela kerelaan +rela merela +rela merelai +rela merelakan +rela merelakannya +rela serela +relai direlai +relai merelai +relaksasi berelaksasi +relaksasi direlaksasi +relaksasi merelaksasi +relaksasi merelaksasikan +relas berelasi +relasi berelasi +reli mereli +reli pereli +religius kereligiusan +relokasi direlokasi +relokasi direlokasikan +relokasi merelokasi +relokasi merelokasikan +relokasi merelokasinya +rem berem +rem direm +rem kerem +rem merem +rem pereman +rem serem +remah meremahkan +remaja diremajakan +remaja keremajaan +remaja meremajakan +remaja peremajaan +remang keremangan +remas beremas +remas diremas +remas meremas +remas meremasnya +rembes merembes +rembes merembeskan +rembes merembesnya +rembes perembesan +rembet merembet +rembet merembetnya +rembuk berembuk +rembuk dirembuk +rembuk dirembukkan +rembuk merembuk +rembuk merembukkan +rembuk perembukan +remeh diremehkan +remeh meremehkan +remeh meremehkannya +remis beremisi +remisi beremisi +rempah berempah +rempah serempah +rempak serempak +remuk diremukkan +remuk meremukkan +renang berenang +renang berenangnya +renang merenangi +renang perenang +rencak direncakan +rencak merencakan +rencana berencana +rencana berencananya +rencana berrencana +rencana direncana +rencana direncanakan +rencana direncanakannya +rencana merencana +rencana merencanakan +rencana merencanakannya +rencana perencana +rencana perencanaan +renda berenda +renda merenda +rendah direndahkan +rendah kerendahan +rendah merendah +rendah merendahkan +rendah merendahkannya +rendah perendahan +rendah serendah +rendah terrendah +rendam berendam +rendam berendamlah +rendam direndam +rendam kerendam +rendam merendam +rendam merendamkan +rendam merendamnya +rendam perendam +rendam perendaman +rendam terrendam +renegosiasi direnegosiasi +renegosiasi merenegosiasi +reng bereng +reng kereng +reng pereng +reng serengan +rengek merengek +renggang direnggangkan +renggang kerenggangan +renggang merenggang +renggang merenggangkan +renggang merenggangnya +renggang perenggangan +renggut direnggut +renggut merenggut +renggut merenggutnya +renggut perenggut +rengkuh direngkuh +rengkuh direngkuhnya +rengkuh merengkuh +rengkuh merengkuhnya +rengkuh perengkuh +rengut merengut +renovasi direnovasi +renovasi direnovasinya +renovasi merenovasi +renovasi merenovasinya +renovasi perenovasian +rentak perentak +rentak serentak +rentak serentaknya +rental dirental +rental merental +rental merentalkan +rentan kerentanan +rentang direntang +rentang direntangkan +rentang merentang +rentang merentangkan +rentas merentas +rentas perentas +rentet berentetan +rentet serentet +rentet serentetan +renti berenti +renung direnungi +renung direnungkan +renung merenung +renung merenungi +renung merenungkan +renung merenungkannya +renung perenungan +renyah kerenyahan +reorganisasi mereorganisasi +reparasi direparasi +reparasi mereparasi +repatriasi direpatriasi +repatriasi direpatriasikan +repatriasi merepatriasi +replika mereplika +replika pereplika +reposisi direposisi +reposisi mereposisi +repot direpotkan +repot kerepotan +repot merepotkan +repot merepotkannya +representasi direpresentasikan +representasi merepresentasi +representasi merepresentasikan +represi direpresi +represi merepresi +reproduksi bereproduksi +reproduksi direproduksi +reproduksi mereproduksi +reputasi bereputasi +resa meresa +resa meresakan +resah diresahkan +resah keresahan +resah meresahkan +resak meresakan +resap diresapi +resap diresapkan +resap meresap +resap meresapi +resap meresapkan +resap peresapan +resek keresek +resep diresepkan +resep meresepkan +resep peresepan +resi beresi +residen keresidenan +residen peresiden +resin beresin +resmi diresmikan +resmi diresmikannya +resmi meresmikan +resmi meresmikannya +resmi pengresmian +resmi peresmian +resolusi beresolusi +resolusi berresolusi +resonansi beresonansi +respons direspons +respons merespons +respons meresponsnya +restitusi direstitusi +restoran direstoran +restorasi direstorasi +restorasi merestorasi +restorasi merestorasinya +restrukturisasi direstrukturisasi +restrukturisasi merestrukturisasi +restu direstui +restu merestui +ret keret +ret meret +ret perret +ret seret +ret seretan +ret seretnya +reta berreta +reta kereta +reta keretakan +reta keretakannya +reta keretanya +retak keretakan +retak meretakkan +retak seretak +retas diretas +retas diretasnya +retas meretas +retas meretasnya +retas peretas +retas peretasan +retas peretasnya +retek keretek +retorika beretorika +retur diretur +reuni bereuni +revaluasi direvaluasi +revaluasi merevaluasi +revisi direvisi +revisi direvisinya +revisi merevisi +revisi merevisinya +revisi perevisian +revitalisasi direvitalisasi +revitalisasi merevitalisasi +revolusi berevolusi +revolusi direvolusi +revolusi merevolusi +rewel kerewelan +ria beria +ria keriaan +ria meria +ria peria +ria seria +riah meriah +riah meriahkan +riah meriahnya +riah periah +riak beriak +rial merial +rial serial +rial serialnya +riam meriam +rian merian +rian serian +riang keriangan +riang meriang +riang periang +riang periangan +riap seriap +rias berias +rias dirias +rias merias +rias perias +ribu beribu +ribu seribu +ribu seribuan +ribu-ribu beribu-ribu +ribut diributkan +ribut keributan +ribut meributkan +ribut meributkannya +rica merica +rica mericanya +rica perica +ricuh kericuhan +rida diridai +rida merida +rida perida +ridi meridian +rileks merilekskan +rilis dirilis +rilis dirilisnya +rilis merilis +rilis merilisi +rilis meriliskan +rilis merilisnya +rilis perilis +rilis perilisan +rim beriman +rim kerim +rim mengrim +rim mengrimkan +rima berima +rima menrima +rima merima +rimbas berimbas +rimbun kerimbunan +rimpi serimpi +rindang perindang +rinding merinding +rindu dirindukan +rindu dirindukannya +rindu kerinduan +rindu merindu +rindu merindukan +rindu merindukannya +rindu perindu +rindu perindukan +ring bering +ring beringan +ring diringi +ring kering +ring keringan +ring keringkan +ring keringnya +ring mering +ring meringan +ring meringkan +ring pering +ring peringan +ring sering +ring seringan +ring seringlah +ring seringnya +ringan beringan +ringan diringankan +ringan keringan +ringan keringanan +ringan meringan +ringan meringankan +ringan meringankannya +ringan peringan +ringan peringanan +ringan seringan +ringgit seringgit +ringin beringin +ringis meringis +ringkas diringkas +ringkas keringkasan +ringkas meringkas +ringkas peringkas +ringkuk meringkuk +ringkus diringkus +ringkus diringkusnya +ringkus meringkus +ringkus meringkusnya +ringkus peringkus +ringkus peringkusan +ringsek meringsek +rintang dirintangi +rintang merintang +rintang merintangi +rintang perintang +rintang perintangan +rintih merintih +rintik berintikan +rintis dirintis +rintis dirintisnya +rintis merintis +rintis merintisnya +rintis perintis +rintis perintisan +rintis perintisnya +ririt seririt +risa perisa +risa perisai +risa perisakan +risa perisalah +risak dirisak +risak merisak +risak perisakan +risalah perisalah +risau dirisaukan +risau kerisauan +risau merisaukan +risau merisaukannya +riset diriset +riset meriset +riset periset +risi berisi +risi berisikan +risi merisi +risik berisik +risik berisikan +risik berisiknya +risiko berisiko +risiko berisikonya +risiko berrisiko +risiko merisikokan +rit berit +rit merit +rit serit +ritus meritus +riuh keriuhan +riuh meriuhkan +riuk periuk +riung meriung +riwayat diriwayatkan +riwayat meriwayatkan +ro bero +ro berolah +ro diro +ro kerokan +ro mero +ro pero +ro perro +ro sero +ro serokan +robek dirobek +robek merobek +robek merobeknya +robek perobek +robek perobekan +roboh dirobohkan +roboh merobohkan +roboh merobohkannya +roboh perobohan +robok kerobokan +robot serobot +robot serobotan +roda beroda +rogoh dirogoh +rogoh merogoh +rogok merogok +rohani kerohanian +rok berok +rok kerok +rok kerokan +rok keroknya +rok serok +rok serokan +roket diroket +roket meroket +roket meroketkan +roket meroketnya +roket peroketan +rokok merokok +rokok merokoklah +rokok merokoknya +rokok perokok +rokok perokoknya +romantis keromantisan +romantis seromantis +rombak berombak +rombak dirombak +rombak dirombaknya +rombak merombak +rombak merombaknya +rombak perombakan +rombak perombakkan +rombong berombongan +rombong serombongan +romong keromong +rompak dirompak +rompak merompak +rompak perompak +rompak perompakan +rompi berompi +rona merona +rona perona +ronda meronda +rong serong +rongga berongga +rongga serongga +rongkong kerongkongan +rongrong dirongrong +rongrong merongrong +ronta meronta +rontgen dirontgen +rontok dirontokkan +rontok kerontokan +rontok merontokan +rontok merontokkan +rontok perontok +ros perosi +rosin kerosin +rosok merosok +rosot merosot +rosot merosotnya +rosot perosotan +rotasi berotasi +rotasi dirotasi +rotasi merotasi +rotasi merotasinya +rotasi perotasian +rua meruakan +rua serua +rua seruakan +ruak keruak +ruak meruak +ruak meruakan +ruak meruaknya +ruak seruak +ruak seruakan +ruang beruang +ruang beruangnya +ruang diruang +ruang diruangan +ruang keruang +ruang keruangan +ruang seruang +ruang seruangan +ruap beruap +ruap meruap +ruap meruapkan +ruas beruas +ruas diruas +ruaya beruaya +rubah berubah +rubah berubahan +rubah berubahlah +rubah berubahnya +rubah dirubah +rubah merubah +rubah merubahnya +rubah perubah +rubah perubahan +ruban beruban +rubung dirubung +rudal dirudal +rudal merudal +rudu berudu +rudu serudukan +ruh keruh +ruh keruhnya +ruh peruh +ruing keruing +ruit seruit +ruji beruji +rujuk berujuk +rujuk dirujuk +rujuk dirujuknya +rujuk merujuk +rujuk merujukkan +rujuk merujuknya +rujuk perujukan +rukun kerukunan +rukun merukunkan +rukyat dirukyat +rukyat perukyat +rum dirum +rum perum +rum serum +rumah berumah +rumah dirumah +rumah dirumahkan +rumah dirumahkannya +rumah dirumahnya +rumah kerumah +rumah kerumahnya +rumah merumahkan +rumah perumah +rumah perumahan +rumah serumah +rumah serumahnya +rumba berumbai +rumbai berumbai +rumen serumen +rumit kerumitan +rumit merumitkan +rumit serumit +rumor dirumorkan +rumor merumorkan +rumpun serumpun +rumput berumput +rumput merumput +rumput merumputnya +rumus dirumuskan +rumus dirumuskannya +rumus merumuskan +rumus merumuskannya +rumus perumus +rumus perumusan +runcing diruncingkan +runcing meruncing +runcing meruncingkan +runcing meruncingnya +runcing peruncingan +runding berunding +runding dirundingkan +runding merundingan +runding merundingkan +runding merundingkannya +runding perunding +runding perundingan +runding perundingnya +runduk merunduk +rundung dirundung +rundung merundung +rundung merundungnya +rundung perundung +rundung perundungan +runggas perunggasan +rungu perungu +runjung berunjung +runtuh diruntuhkan +runtuh keruntuhan +runtuh meruntuhkan +runtuh meruntuhkannya +runtuh peruntuhan +runtun beruntun +runtun beruntunnya +runtut beruntut +runut dirunut +runut merunut +rupa berupa +rupa berupakan +rupa merupa +rupa merupaan +rupa merupakan +rupa perupa +rupa perupakan +rupa serupa +rupa serupanya +rupiah dirupiahkan +rupiah serupiah +rurut berurut +rurut berurutan +rusa berusa +rusa berusai +rusa kerusakan +rusa kerusakannya +rusa merusakan +rusa pengrusakan +rusa penrusakan +rusa perusaan +rusa perusakan +rusak dirusak +rusak dirusaki +rusak dirusaknya +rusak kerusakan +rusak kerusakkan +rusak merusak +rusak merusakan +rusak merusakkan +rusak merusaknya +rusak pengrusak +rusak pengrusakan +rusak pengrusakkan +rusak penrusakan +rusak perusak +rusak perusakan +rusak perusakkan +rusak perusaknya +rusuh dirusuhi +rusuh kerusuhan +rusuh perusuh +rusuk kerusukan +rute berute +rutin dirutinkan +rutin merutinkan +rutin serutin +ruwat diruwat +ruwat meruwat +ruwet keruwetan +ruyak meruyak +ruyung meruyung +sa bersa +sa bersalah +sa besa +sa besalah +sa disa +sa disalah +sa kesalah +sa kesanya +sa mensa +sa menya +sa menyakan +sa menyalah +sa mesa +sa penyalah +sa persaan +sa pesa +sa sesa +sa sesai +saat disaat +saat pesaat +saat sesaat +saat sesaatnya +sabang penyabangan +sabar bersabar +sabar bersabarlah +sabar kesabaran +sabar menyabar +sabar penyabar +sabat persabatan +sabda bersabda +sabda disabdakan +sabel disabel +sabet disabet +sabet disabetkan +sabet disabetnya +sabet menyabet +sabet menyabetkan +sabet menyabetkannya +sabet menyabetnya +sabet penyabet +sabit menyabit +sablon disablon +sablon menyablon +sablon penyablonan +sabot menyabot +sabot penyabot +sabotase disabotase +sabotase mensabotase +sabotase menyabotase +sabotase penyabotase +sabun bersabun +sabun menyabuni +sabun penyabunan +sabung menyabung +sabung penyabung +sabung penyabungan +sabut menyabut +sabut menyabutkan +sabut tersabut +sad persad +sadai menyadai +sadang menyadang +sadang penyadang +sadap disadap +sadap menyadap +sadap menyadapnya +sadap penyadap +sadap penyadapan +sadap tersadap +sadar bersadarkan +sadar disadari +sadar disadarkan +sadar kesadaran +sadar menyadari +sadar menyadarkan +sadar menyadarkannya +sadar penyadaran +sadar tersadar +sadar tersadarkan +sadur disadur +sadur menyadur +safari bersafari +sahabat bersahabat +sahabat bersahabatan +sahabat bersahabatlah +sahabat bersahabatnya +sahabat persahabat +sahabat persahabatan +sahaja bersahaja +sahaja kesahajaan +saham persaham +sahan pensahan +sahih kesahihan +sahut bersahutan +sahut disahut +sahut disahuti +sahut menyahut +sahut menyahuti +sai sesai +saing bersaing +saing bersaingan +saing bersaingnya +saing besaing +saing disaingi +saing menyaingi +saing persaing +saing persaingan +saing pesaing +saing pesaingan +saing pesaingnya +saing tersaingi +sair penyair +sajen sesajen +saji disajikan +saji disajikannya +saji menyajikan +saji menyajikannya +saji penyaji +saji penyajian +saji sesaji +saji sesajian +saji tersaji +saji tersajikan +sak besak +sak menyakan +sak mesak +sak penyaki +sak sesak +sak sesaki +sak sesaknya +sakat menyakatan +saki penyaki +saki sesaki +sakit disakiti +sakit kesakitan +sakit menyakit +sakit menyakiti +sakit menyakitkan +sakit menyakitkannya +sakit penyakit +sakit penyakitan +sakit penyakitnya +sakit pesakitan +sakit sesakit +sakit tersakiti +sakral disakralkan +sakral kesakralan +sakral mensakralkan +saksi bersaksi +saksi disaksikan +saksi disaksikannya +saksi kesaksian +saksi kesaksikan +saksi menyaksikan +saksi menyaksikannya +saksi persaksian +sakti kesaktian +sakti penyakti +saku disaku +sal bersal +sal kesal +sal kesalnya +sal persal +sal sesal +sal sesali +sal sesalkan +sal sesalnya +sala bersala +sala menyala +sala menyalakan +sala menyalakannya +sala menyalanya +sala penyala +sala penyalaan +salah bersalah +salah bersalahnya +salah besalah +salah disalah +salah disalahi +salah disalahkan +salah kesalah +salah kesalahan +salah menyalah +salah menyalahi +salah menyalahkan +salah menyalahkannya +salah penyalah +salah penyalahan +salah persalahkan +salak menyalak +salak menyalakan +salam bersalam +salam bersalaman +salam disalami +salam menyalami +salat disalati +salat disalatkan +salat mensalati +salat mensalatkan +salat menyalati +salat menyalatkan +saldo bersaldo +saleh kesalehan +sali sesali +salib disalib +salib disalibkan +salib menyalib +salib menyalibkan +salib penyaliban +salin bersalin +salin disalin +salin menyalin +salin menyalinnya +salin penyalinan +salin persalinan +salina bersalina +salip disalip +salip disalipnya +salip menyalip +salip menyalipnya +salip tersalip +salju bersalju +salon menyalonkan +salto bersalto +salur disaluran +salur disalurkan +salur disalurkannya +salur menyaluran +salur menyalurkan +salur menyalurkannya +salur penyalur +salur penyaluran +salur penyalurkan +salur penyalurnya +salur tersalur +salur tersalurkan +salur tersalurkannya +salut bersalut +sama bersama +sama bersamaan +sama bersamalah +sama bersamanya +sama besama +sama besamaan +sama disama +sama disamai +sama disamakan +sama kesamaan +sama menyama +sama menyamai +sama menyamakan +sama menyamakannya +sama penyama +sama penyamaan +sama penyamakan +sama persama +sama persamaan +sama sesama +sama sesamanya +samak disamakan +samak menyamakan +samak penyamak +samak penyamakan +saman bersaman +saman menyamankan +samapta kesamaptaan +samar disamarkan +samar menyamar +samar menyamarkan +samar menyamarkannya +samar penyamar +samar penyamaran +samar tersamar +samar tersamarkan +sambang disambangi +sambang menyambangi +sambar disambar +sambar disambarnya +sambar kesambar +sambar menyambar +sambar menyambarnya +sambar tersambar +samben kesamben +sambi disambi +sambi kesambi +sambi menyambi +sambit menyambit +sambung bersambung +sambung bersambungan +sambung disambung +sambung disambungkan +sambung menyambung +sambung menyambungkan +sambung menyambungkannya +sambung menyambungnya +sambung penyambung +sambung penyambungan +sambung persambungan +sambung tersambung +sambung tersambungkan +sambung tersambungnya +sambut bersambut +sambut disambut +sambut disambutnya +sambut menyambut +sambut menyambutnya +sambut penyambut +sambut penyambutan +sambut penyambutnya +sami persami +sampa disampai +sampa disampakan +sampa menyampai +sampa menyampakan +sampa penyampai +sampa sesampai +sampah persampahan +sampai disampai +sampai disampaian +sampai disampaikan +sampai disampaikannya +sampai kesampaian +sampai menyampai +sampai menyampaian +sampai menyampaikan +sampai menyampaikannya +sampai penyampai +sampai penyampaian +sampai penyampaikan +sampai sesampai +sampai sesampainya +sampai tersampaikan +sampai tersampaikannya +sampak disampakan +sampak menyampakan +sampak penyampak +sampakan disampakan +sampakan menyampakan +samping bersampingan +samping disamping +samping disampingi +samping disampingnya +samping kesamping +samping kesampingkan +samping menyamping +samping menyampingkan +sampir disampirkan +sampir menyampirkan +sampir tersampir +sampul bersampul +sampur menyampuri +sampur menyampurkan +samun penyamun +samurai bersamurai +sana bersana +sana besana +sana disana +sana disanalah +sana kesana +sana persana +sana sesana +sana tersana +sanak mensanak +sandal bersandal +sandang disandang +sandang disandangkan +sandang disandangnya +sandang menyandang +sandang menyandangnya +sandang penyandang +sandang penyandangnya +sandang tersandang +sandar bersandar +sandar bersandarkan +sandar bersandarlah +sandar bersandarnya +sandar disandari +sandar disandarkan +sandar menyandar +sandar menyandarkan +sandar tersandar +sandera disandera +sandera disanderanya +sandera menyandera +sandera menyanderanya +sandera penyandera +sandera penyanderaan +sandera penyanderanya +sandera tersandera +sandera tersanderanya +sandi bersandi +sandi bersandikan +sandi disandikan +sandi penyandian +sandi persandian +sanding bersanding +sanding bersandingan +sanding disandingkan +sanding menyandingkan +sanding menyandingkannya +sanding penyandingan +sandiwara bersandiwara +sandung kesandung +sandung menyandung +sandung tersandung +sandung tersandungnya +sang disangkan +sang menyangi +sang menyangkan +sang mesang +sang penyang +sang pesang +sang pesangan +sang tersang +sang tersangkan +sanga kesanga +sanga tersanga +sangan pesangan +sangga disangga +sangga menyangga +sangga menyangganya +sangga penyangga +sangga penyangganya +sanggah disanggah +sanggah menyanggah +sanggah menyanggahnya +sanggah penyanggah +sanggah penyanggahan +sanggama bersanggama +sanggar pesanggaran +sanggerah pesanggerahan +sanggrah pesanggrahan +sanggul bersanggul +sanggul disanggul +sanggul menyanggul +sanggup disanggupi +sanggup kesanggupan +sanggup menyanggupi +sangka disangka +sangka disangkakan +sangka disangkakannya +sangka disangkanya +sangka menyangka +sangka menyangkakan +sangka menyangkanya +sangka persangkaan +sangka tersangka +sangka tersangkakan +sangka tersangkalah +sangka tersangkanya +sangkak disangkakan +sangkak menyangkakan +sangkak tersangkakan +sangkal disangkal +sangkal disangkalnya +sangkal menyangkal +sangkal menyangkalnya +sangkal penyangkal +sangkal penyangkalan +sangkan disangkan +sangkan menyangkan +sangkan tersangkan +sangkut bersangkut +sangkut bersangkutan +sangkut besangkutan +sangkut disangkut +sangkut disangkutkan +sangkut menyangkut +sangkut menyangkutkan +sangkut tersangkut +sangkut tersangkutnya +sangon pesangon +sangon pesangonnya +sangrai disangrai +sangrai menyangrai +sangsi disangsikan +sangsi kesangsian +sangsi menyangsikan +sangsi menyangsikannya +sani bersani +sani persani +sanjung disanjung +sanjung menyanjung +sanjung menyanjungnya +sanjung tersanjung +sanksi disanksi +sanksi disanksikan +santa bersantai +santa sesantai +santai bersantai +santai bersantailah +santai sesantai +santan bersantan +santap bersantap +santap disantap +santap disantapnya +santap menyantap +santap menyantapnya +santap penyantap +santap penyantapnya +santet disantet +santet menyantet +santri kesantrian +santun disantuni +santun kesantunan +santun menyantuni +santun penyantun +santun penyantunan +santun pesantunan +sap disap +sap persap +sapa bersapa +sapa disapa +sapa disapai +sapa disapanya +sapa menyapa +sapa menyapai +sapa menyapanya +sapai disapai +sapai menyapai +sapai menyapaikan +sapi persapian +sapih disapih +sapih menyapih +sapih penyapihan +sapu disapu +sapu disapukan +sapu menyapu +sapu menyapukan +sapu menyapunya +sapu penyapu +sapu penyapuan +sapu tersapu +saput tersaput +sar bersar +sar besar +sar besaran +sar besari +sar besarkan +sar besarlah +sar besarnya +sar kesar +sar pensaran +sar pesar +sar sesar +sar sesarnya +sara besara +sara besaranya +sara disarakan +sara menyarakan +saraf persarafan +sarak disarakan +sarak menyarakan +saran besaran +saran besarannya +saran disarankan +saran disarankannya +saran menyarankan +saran menyarankannya +saran pensaran +sarang bersarang +sarang bersarangnya +sarang disarangkan +sarang disarangkannya +sarang menyarang +sarang menyarangkan +sarang menyarangkannya +sarang penyarang +sarat kesarat +sarat menyaratkan +sarat persaratan +sarean pesarean +sari besari +sari disarikan +sari menyarikan +sari penyarikan +sarik disarikan +sarik menyarikan +sarik penyarikan +saring disaring +saring menyaring +saring menyaringnya +saring penyaring +saring penyaringan +saring tersaring +sarjana kesarjanaan +saru menyaru +sarung bersarung +sasak disasak +sasar bersasarkan +sasar disasar +sasar disasarkan +sasar disasarnya +sasar kesasar +sasar mensasar +sasar menyasar +sasar menyasarkan +sasar menyasarnya +sasar tersasar +sasi menyasikan +sastra kesastraan +sat besat +sat kesat +sat menyatan +sat menyatkan +sat mesat +sat pesat +sat pesatnya +sat sesat +sat sesatnya +satak menyatakan +satron disatroni +satron menyatroni +satu bersatu +satu bersatulah +satu bersatunya +satu besatu +satu disatu +satu disatukan +satu disatukannya +satu kesatu +satu kesatuan +satu menyatu +satu menyatukan +satu menyatukannya +satu menyatunya +satu penyatu +satu penyatuan +satu persatu +satu persatuan +satu persatukan +satu pesatuan +satu sesatu +saudara bersaudara +saudara persaudaraan +saudari bersaudari +sawah bersawah +sawah persawahan +sawah pesawahan +sawan kesawan +sawan pesawan +sawar pesawar +sawar pesawaran +sawat persawat +sawat pesawat +sawat pesawatnya +saya kesaya +sayang disayang +sayang disayangi +sayang disayangkan +sayang disayangkannya +sayang kesayangan +sayang menyayangi +sayang menyayangkan +sayang menyayangkannya +sayang penyayang +sayang tersayang +sayang tersayangnya +sayap bersayap +sayat disayat +sayat menyayat +sayat menyayatnya +sayat penyayat +sayat penyayatan +sayat tersayat +sayembara disayembarakan +seba disebakan +seba menyebakan +seba penyebanya +seba perseba +sebak disebakan +sebak menyebakan +sebak pesebak +sebal menyebalkan +sebal menyebalkannya +sebar disebar +sebar disebarkan +sebar disebarkannya +sebar disebarnya +sebar menyebar +sebar menyebaran +sebar menyebarkan +sebar menyebarkannya +sebar menyebarnya +sebar penyebar +sebar penyebaran +sebar penyebarnya +sebar persebaran +sebar pesebaran +sebar tersebar +sebar tersebarnya +sebat tersebat +seberang berseberangan +seberang diseberang +seberang diseberangi +seberang diseberangkan +seberang menyeberang +seberang menyeberangi +seberang menyeberangkan +seberang menyeberangkannya +seberang menyeberangnya +seberang penyeberang +seberang penyeberangan +sebit tersebit +sebu disebukan +sebu menyebu +sebu menyebukan +sebu tersebu +sebuk disebukan +sebuk menyebukan +sebut bersebut +sebut disebut +sebut disebutkan +sebut disebutkannya +sebut disebutlah +sebut disebutnya +sebut menyebut +sebut menyebutan +sebut menyebutkan +sebut menyebutkannya +sebut menyebutnya +sebut penyebut +sebut penyebutan +sebut penyebutkan +sebut persebut +sebut tersebut +sebut tersebuti +sebut tersebutkan +sebut tersebutlah +sebut tersebutnya +sedak tersedak +sedap menyedapkan +sedap penyedap +sedat tersedat +sedekah bersedekah +sedekah disedekahkan +sedekah menyedekahkan +sederhana disederhanakan +sederhana kesederhanaan +sederhana menyederhanakan +sederhana menyederhanakannya +sederhana penyederhanaan +sederhana sesederhana +sedia bersedia +sedia bersedianya +sedia besedia +sedia disediakan +sedia disediakannya +sedia kesediaan +sedia menyedia +sedia menyediaan +sedia menyediakan +sedia menyediakannya +sedia penyedia +sedia penyediaan +sedia penyediakan +sedia penyedianya +sedia persediaan +sedia tersedia +sedia tersedianya +sedih bersedih +sedih kesedihan +sedih menyedihkan +sedih menyedihkannya +sedih tersedih +sedikit sesedikit +sedikit tersedikit +sedot disedot +sedot kesedot +sedot menyedot +sedot menyedotnya +sedot penyedot +sedot penyedotan +sedot tersedot +sedu tersedu +seduh diseduh +seduh menyeduh +seduh menyeduhnya +seduh penyeduhan +segala disegala +segan disegani +segan keseganan +segani disegani +segar disegarkan +segar kesegaran +segar menyegarkan +segar penyegar +segar penyegaran +segar sesegar +segara sesegara +segel bersegel +segel disegel +segel disegelnya +segel menyegel +segel menyegelnya +segel penyegelan +segel tersegel +segera bersegera +segera disegerakan +segera kesegeraan +segera menyegerakan +segera sesegera +segi bersegi +segi persegi +segi perseginya +segi pesegi +segmen bersegmen +segmen disegmen +segmen tersegmen +segmentasi disegmentasikan +segmentasi tersegmentasi +sehat bersehati +sehat disehatkan +sehat kesehatan +sehat menyehatkan +sehat pensehat +sehat penyehat +sehat penyehatan +sehat sesehat +sehat tersehat +sejahtera disejahterakan +sejahtera kesejahteraan +sejahtera mensejahterakan +sejahtera menyejahterakan +sejahtera penyejahteraan +sejarah bersejarah +sejarah bersejarahnya +sejarah kesejarahan +sejarah menyejarah +sejat kesejatan +sejuk kesejukan +sejuk menyejukan +sejuk menyejukkan +sejuk penyejuk +seka diseka +seka menyeka +seka menyekanya +seka penyeka +seka perseka +sekal sesekali +sekala bersekala +sekali sesekali +sekam persekam +sekap disekap +sekap disekapnya +sekap menyekap +sekap menyekapnya +sekap penyekap +sekap penyekapan +sekap persekap +sekap tersekap +sekar menyekar +sekat bersekat +sekat disekat +sekat menyekat +sekat penyekat +sekat penyekatan +sekat persekat +sekat tersekat +seko bersekolah +seko disekolah +seko kesekolah +sekolah bersekolah +sekolah disekolah +sekolah disekolahkan +sekolah disekolahnya +sekolah kesekolah +sekolah menyekolahkan +sekolah menyekolahkannya +sekolah persekolahan +sekongkol bersekongkol +sekongkol persekongkolan +sekop menyekop +sekresi disekresi +sekresi disekresikan +sekresi mensekresi +sekretariat kesekretariatan +seks diseksi +seks seseksi +seks terseksi +seksi diseksi +seksi keseksian +seksi seseksi +seksi terseksi +sektor disektor +sekutu bersekutu +sekutu menyekutukan +sekutu persekutuan +sel bersel +sel disel +sel kesel +sela disela +sela menyela +sela persela +sela sesela +selak menyelak +selamat diselamat +selamat diselamatkan +selamat diselamatkannya +selamat keselamatan +selamat menyelamat +selamat menyelamatan +selamat menyelamati +selamat menyelamatkan +selamat menyelamatkannya +selamat penyelamat +selamat penyelamatan +selamat penyelamatkan +selamat penyelamatnya +selamat terselamatkan +selancar berselancar +selancar beselancar +selancar peselancar +selang berselang +selang beselang +selang-seling berselang-seling +selang-seling diselang-seling +selaput berselaput +selat keselatan +selat terselatan +seleksi diseleksi +seleksi diseleksinya +seleksi menseleksi +seleksi menyeleksi +seleksi menyeleksinya +seleksi penyeleksi +seleksi penyeleksian +seleksi terseleksi +selempang berselempang +selempang diselempangkan +selenggara diselenggaraan +selenggara diselenggarakan +selenggara diselenggarakannya +selenggara menyelenggaraan +selenggara menyelenggarakan +selenggara menyelenggarakannya +selenggara penyelenggara +selenggara penyelenggaraan +selenggara penyelenggarakan +selenggara penyelenggaranya +selenggara terselenggara +selenggara terselenggaranya +selera berselera +selesai diselesai +selesai diselesaian +selesai diselesaikan +selesai diselesaikannya +selesai menyelesaian +selesai menyelesaikan +selesai menyelesaikannya +selesai penyelesai +selesai penyelesaian +selesai penyelesaikan +selesai seselesainya +selesai terselesaikan +selesai terselesaikannya +seletuk menyeletuk +seleweng diselewengkan +seleweng menyeleweng +seleweng menyelewengkan +seleweng penyeleweng +seleweng penyelewengan +selia penyelia +selia penyeliaan +selidik diselidik +selidik diselidiki +selidik menyelidik +selidik menyelidikan +selidik menyelidiki +selidik penyelidik +selidik penyelidikan +selidik penyelidiki +selidik penyelidikkan +selidik penyelidiknya +selimut berselimut +selimut berselimutkan +selimut diselimut +selimut diselimuti +selimut menyelimuti +selimut terselimuti +selinap menyelinap +selinap menyelinapkan +seling berseling +seling diseling +seling diselingi +seling menyelingi +selingkuh berselingkuh +selingkuh diselingkuhi +selingkuh menyelingkuhi +selingkuh perselingkuhan +selingkuh peselingkuh +selip diselipi +selip diselipkan +selip menyelip +selip menyelipkan +selip menyelipkannya +selip terselip +selip terselipnya +selisih berselisih +selisih beselisih +selisih perselisihan +selisih peselisihan +selisik menyelisik +seliwer berseliweran +selonjor berselonjor +selonong menyelonong +seloroh berseloroh +selubung berselubung +selubung diselubungi +selubung menyelubungi +selubung terselubung +seludup diseludupkan +seludup menyeludupkan +seludup penyeludup +seludup penyeludupan +seluncur berseluncur +seluncur peseluncur +selundup diselundupkan +selundup diselundupkannya +selundup menyelundup +selundup menyelundupan +selundup menyelundupkan +selundup menyelundupkannya +selundup penyelundup +selundup penyelundupan +selundup penyelundupkan +selup menyelupkan +selurah keselurahan +seluru keseluruan +seluruh diseluruh +seluruh keseluruh +seluruh keseluruhan +seluruh menyeluruh +selusup menyelusup +selusur menyelusuri +sema bersemai +sema disemai +sema menyemai +sema penyemai +sema persema +semah besemah +semai bersemai +semai disemai +semai disemaikan +semai menyemai +semai menyemaikan +semai penyemai +semai penyemaian +semai persemaian +semak bersemak +seman perseman +semangat bersemangat +semangat bersemangatnya +semangat disemangati +semangat menyemangati +semangat penyemangat +semangat penyemangatnya +semara disemarakan +semara kesemarakan +semara menyemarakan +semarak disemarakan +semarak disemarakkan +semarak kesemarakan +semarak menyemarakan +semarak menyemarakkan +semarak penyemarak +semat disemat +semat disemati +semat disematkan +semat disematkannya +semat kesematan +semat menyemat +semat menyematkan +semat menyematkannya +semat penyematan +semat tersemat +semat tersematkan +semayam bersemayam +semayam bersemayamnya +semayam disemayamkan +semayam disemayamkannya +semayam menyemayamkan +semayam penyemayaman +semayam persemayaman +sembah disembah +sembah menyembah +sembah menyembahnya +sembah penyembah +sembah penyembahan +sembah persembahan +sembah persembahkan +sembah sesembahan +sembahyang bersembahyang +sembahyang persembahyangan +sembarang disembarang +sembelih disembelih +sembelih disembelihnya +sembelih menyembelih +sembelih menyembelihnya +sembelih penyembelih +sembelih penyembelihan +sembilan bersembilan +sembilan kesembilan +sembilan kesembilannya +semboyan bersemboyan +sembrono kesembronoan +sembuh disembuhkan +sembuh kesembuhan +sembuh menyembuh +sembuh menyembuhkan +sembuh menyembuhkannya +sembuh penyembuh +sembuh penyembuhan +sembuh tersembuhkan +sembul menyembul +sembul menyembulkan +sembul tersembul +sembunyi bersembunyi +sembunyi bersembunyinya +sembunyi disembunyikan +sembunyi disembunyikannya +sembunyi menyembunyikan +sembunyi menyembunyikannya +sembunyi penyembunyian +sembunyi persembunyian +sembunyi tersembunyi +sembunyi tersembunyinya +sembur disembur +sembur disemburkan +sembur menyembur +sembur menyemburkan +sembur penyembur +sembur tersembur +semen disemen +semen menyemen +semen penyemenan +semi bersemi +semi persemian +semifinal disemifinal +semifinal kesemifinal +seminar diseminarkan +semir disemir +semir menyemir +semir penyemir +sempal menyempal +sempat disempatkan +sempat kesempat +sempat kesempatan +sempat menyempatkan +sempil menyempil +sempit disempitkan +sempit kesempitan +sempit menyempit +sempit menyempitkan +sempit menyempitnya +sempit penyempitan +sempit persempit +sempit sesempit +sempit tersempit +semprit disemprit +semprit menyemprit +semprot disemprot +semprot disemprotkan +semprot menyemprot +semprot menyemprotkan +semprot menyemprotkannya +semprot menyemprotnya +semprot penyemprot +semprot penyemprotan +semprot tersemprot +sempur menyempurkan +sempurna disempurnakan +sempurna disempurnakannya +sempurna kesempurnaan +sempurna menyempurnakan +sempurna menyempurnakannya +sempurna penyempurna +sempurna penyempurnaan +sempurna sesempurna +semrawut kesemrawutan +semu bersemu +semua disemua +semua kesemua +semua kesemuanya +semut disemuti +semut kesemutan +semut menyemut +semut menyemuti +senam bersenam +senam pesenam +senandung bersenandung +senandung disenandungkan +senandung menyenandungkan +senang bersenang +senang disenangi +senang disenangkan +senang kesenangan +senang menyenangi +senang menyenangkan +senang menyenangkannya +senang sesenang +senda bersenda +sendar persendari +sendat tersendat +sendat tersendatnya +sendawa bersendawa +sender bersender +sender menyender +sender menyenderkan +sendi bersendi +sendi bersendikan +sendi persendi +sendi persendian +sendiri disendirikan +sendiri kesendirian +sendiri menyendiri +sendiri penyendiri +sendiri tersendiri +sendok menyendok +sendok menyendokkan +sendok sesendok +sengaja disengaja +sengaja kesengajaan +sengaja menyengaja +sengal tersengal +sengat disengat +sengat menyengat +sengat menyengatnya +sengat penyengat +sengat tersengat +senggol bersenggolan +senggol disenggol +senggol kesenggol +senggol menyenggol +senggol menyenggolnya +senggol tersenggol +sengguk sesenggukan +sengit kesengitan +sengit sesengit +sengit tersengit +sengketa bersengketa +sengketa disengketakan +sengketa menyengketakan +sengketa persengketaan +sengsara disengsarakan +sengsara kesengsaraan +sengsara menyengsarakan +sengsem kesengsem +seni berseni +seni kesenian +senjang kesenjangan +senjata bersenjata +senjata bersenjatakan +senjata bersenjatanya +senjata besenjata +senjata disenjatai +senjata kesenjataan +senjata persenjataan +senjata persenjatai +sensitif kesensitifan +sensor bersensor +sensor disensor +sensor mensensor +sensor menyensor +sensor penyensoran +sensus disensus +sentak menyentak +sentak menyentakkan +sentak tersentak +senter disenter +sentil disentil +sentil menyentil +sentil penyentilan +sentil persentil +sentil tersentil +senting disenting +sentralisasi disentralisasi +sentralisasi tersentralisasi +sentuh bersentuhan +sentuh disentuh +sentuh disentuhnya +sentuh menyentuh +sentuh menyentuhkan +sentuh menyentuhnya +sentuh persentuhan +sentuh tersentuh +sentuh tersentuhnya +sentuk menyentuk +senyap kesenyapan +senyum tersenyum +senyum tersenyumlah +seok terseok +sep menyepi +sep persepi +sepak bersepak +sepak disepak +sepak disepaknya +sepak kesepakan +sepak menyepak +sepak menyepaknya +sepak persepak +sepak pesepak +sepakat bersepakat +sepakat disepakat +sepakat disepakati +sepakat kesepakat +sepakat kesepakatan +sepakat mensepakati +sepakat menyepakati +sepam persepam +sepat kesepatan +sepat menyepati +sepatu bersepatu +sepatu persepatuan +sepeda bersepeda +sepeda pesepeda +sepele disepelekan +sepele menyepelekan +sepele menyepelekannya +sepi kesepian +sepi menyepi +sepi penyepian +sepi persepi +sepuh bersepuh +sepuh disepuh +sepuh kesepuhan +sepuh penyepuhan +sepuh sesepuh +sepuh sesepuhnya +sera berserakan +sera diserakan +sera menyerakan +sera pesera +serabut berserabut +seragam berseragam +seragam berseragamkan +seragam diseragamkan +seragam keseragaman +seragam menyeragamkan +seragam penyeragaman +serah berserah +serah diserah +serah diserahan +serah diserahi +serah diserahkan +serah diserahkannya +serah menyerah +serah menyerahan +serah menyerahkan +serah menyerahkannya +serah menyerahlah +serah menyerahnya +serah penyerah +serah penyerahan +serah penyerahkan +serah seserahan +serah terserah +serah terserahlah +serahi diserahi +serak berserak +serak berserakan +serak berserakkan +serak diserakan +serak menyerakan +serak terserak +serakah keserakahan +seram menyeramkan +seram seseram +seram terseram +seran menyerankan +seran penyeran +serang diserang +serang diserangnya +serang keserang +serang menyerang +serang menyerangan +serang menyerangkan +serang menyerangnya +serang penyerang +serang penyerangan +serang penyerangnya +serang perserang +serang seserang +serang terserang +serang terserangnya +serap diserap +serap diserapnya +serap menyerap +serap menyerapnya +serap penyerap +serap penyerapan +serap terserap +serap terserapnya +serasi diserasikan +serasi keserasian +serasi menyerasikan +serasi penyerasian +serat berserat +serat menyerat +serat terserat +serbak menyerbak +serban berserban +serbu diserbu +serbu menyerbu +serbu menyerbunya +serbu penyerbu +serbu penyerbuan +serbu penyerbukan +serbuk penyerbuk +serbuk penyerbukan +serempet diserempet +serempet keserempet +serempet menyerempet +serempet terserempet +serenta keserentakan +serentak keserentakan +seret diseret +seret diseretnya +seret keseret +seret menyeret +seret menyeretnya +seret penyeret +seret penyeretan +seret terseret +seret terseretnya +sergam bersergam +sergap disergap +sergap menyergap +sergap menyergapnya +sergap penyergap +sergap penyergapan +seri berseri +serikat berserikat +serikat perserikat +serikat perserikatan +sering disering +sering keseringan +sering sesering +sering tersering +seringai menyeringai +serius diseriusi +serius diseriuskan +serius keseriusan +serius menseriusi +serius menyeriusi +serius seserius +sero persero +sero perseroan +sero pesero +sero peseroan +serobot diserobot +serobot menyerobot +serobot penyerobot +serobot penyerobotan +serok menyerok +serong menyerong +sersi disersi +serta berserta +serta beserta +serta diserta +serta disertai +serta disertakan +serta disertakannya +serta kesertaan +serta menyertai +serta menyertakan +serta menyertakannya +serta penyerta +serta penyertaan +serta penyertanya +serta perserta +serta peserta +serta pesertanya +sertifikasi bersertifikasi +sertifikasi disertifikasi +sertifikasi mensertifikasi +sertifikasi menyertifikasi +sertifikasi tersertifikasi +sertifikat bersertifikat +sertifikat besertifikat +sertifikat disertifikat +sertifikat disertifikatkan +sertifikat mensertifikatkan +sertifikat pensertifikatan +sertifikat penyertifikatan +sertifikat tersertifikat +seru berseru +seru diseru +seru diserukan +seru diserukannya +seru keseru +seru keseruan +seru menyeru +seru menyerukan +seru menyerukannya +seru penyeru +seru perseru +seru perserui +seru terseru +seruak menyeruak +seruak menyeruakan +seruak menyeruaknya +seruduk diseruduk +seruduk menyeruduk +seruduk terseruduk +serui perserui +seruk diserukan +seruk menyerukan +seruput diseruput +seruput diseruputnya +seruput menyeruput +seruput menyeruputnya +serut diserut +servis diservis +servis menservis +servis menyervis +sesah disesah +sesah penyesahan +sesak bersesakan +sesak disesaki +sesak kesesakan +sesak menyesak +sesak menyesakan +sesak menyesaki +sesak menyesakkan +sesal disesali +sesal disesalkan +sesal disesalkannya +sesal menyesal +sesal menyesali +sesal menyesalkan +sesal menyesalkannya +sesal menyesalnya +sesal penyesalan +sesap menyesap +sesar penyesaran +sesat disesatkan +sesat kesesatan +sesat menyesatkan +sesat penyesatan +sesat tersesat +sesat tersesatnya +sesi disesi +sesi kesesi +set diset +set keset +set penyet +set penyetan +set persetan +set sesetan +seta menyetakan +seta penyetakan +seta perseta +seta peseta +setan kesetanan +setan penyetan +setan persetan +setan sesetan +setel disetel +setel menyetel +setel menyetelnya +setel penyetel +setel penyetelan +seteru berseteru +seteru perseteruan +seteru peseteruan +seti kesetian +setia kesetiaan +setir disetir +setir menyetir +setir menyetirnya +setir penyetir +setop disetop +setop disetopnya +setop mensetop +setop menyetop +setop menyetopnya +setop penyetopan +setor disetor +setor disetorkan +setor disetorkannya +setor disetornya +setor menyetor +setor menyetorkan +setor menyetorkannya +setor penyetor +setor penyetoran +setrika disetrika +setrika menyetrika +setrum disetrum +setrum kesetrum +setrum menyetrum +setrum menyetrumnya +setrum penyetrum +setrum penyetruman +setrum tersetrum +setu menyetui +setu persetuan +seturu perseturuan +sewa disewa +sewa disewakan +sewa disewakannya +sewa disewanya +sewa menyewa +sewa menyewakan +sewa menyewakannya +sewa menyewanya +sewa penyewa +sewa penyewaan +sewa penyewanya +sewa persewaan +sewa tersewa +sewar persewar +si bersi +si besi +si besinya +si disi +si mesi +si mesinya +si pensi +si persi +si persian +si persinya +si sesi +si sesinya +sia bersia +sia disiakan +sia menyiakan +sia mesia +sia persia +sia tersia +sia-sia disia-siakan +sia-sia disia-siakannya +sia-sia kesia-siaan +sia-sia mensia-siakan +sia-sia menyia-siakan +sia-sia tersia-siakan +siaga bersiaga +siaga disiagakan +siaga disiagakannya +siaga kesiagaan +siaga mensiagakan +siaga menyiagakan +siaga penyiagaan +siah mesiah +siak disiakan +siak menyiakan +sial kesialan +sian persian +siang bersiang +siang disiang +siang kesiangan +siang menyiangi +siang penyiangan +siang persiangan +sianida bersianida +siap bersiap +siap bersiaplah +siap disiap +siap disiapkan +siap disiapkannya +siap kesiap +siap kesiapan +siap menyiapan +siap menyiapkan +siap menyiapkannya +siap penyiap +siap penyiapan +siap persiapan +siap persiapkan +siap pesiapan +siap sesiap +siapa disiapakan +siapa kesiapanya +siapa menyiapakan +siapa persiapa +siapa persiapaan +siapa persiapakan +siapa persiapanya +siar bersiaran +siar disiarkan +siar disiarkannya +siar menyiarkan +siar menyiarkannya +siar penyiar +siar penyiaran +siar penyiarnya +siar pesiar +siar pesiarnya +siar tersiar +siar tersiarnya +siasat bersiasat +siasat disiasati +siasat mensiasati +siasat menyiasati +siasat penyiasat +siasat penyiasatan +sibak disibak +sibak menyibak +sibak menyibakkan +sibak tersibak +sibuk disibukan +sibuk disibukkan +sibuk kesibukan +sibuk kesibukkan +sibuk kesibukkannya +sibuk menyibukan +sibuk menyibukkan +sibuk sesibuk +sibuk tersibuk +sida penyidakan +sida persida +sidang bersidang +sidang disidang +sidang disidangkan +sidang disidangkannya +sidang menyidang +sidang menyidangkan +sidang menyidangkannya +sidang penyidangan +sidang persidang +sidang persidangan +sidang persidangkan +sidang pesidangan +sidi menyidikan +sidi penyidikan +sidi penyidikannya +sidik disidik +sidik menyidik +sidik menyidikan +sidik menyidiki +sidik menyidiknya +sidik penyidik +sidik penyidikan +sidik penyidikkan +sidik penyidiklah +sidik penyidiknya +siduk menyiduk +sifat bersifat +sifat besifat +sigap kesigapan +sigar persigar +signifikan sesignifikan +sih bersih +sih bersihkan +sih bersihlah +sih bersihnya +sih besih +sih mesih +sih penysihan +sih persih +sihir disihir +sihir menyihir +sihir penyihir +sihir tersihir +sikap bersikap +sikap bersikaplah +sikap besikap +sikap disikapi +sikap mensikapi +sikap menyikap +sikap menyikapi +sikap penyikapan +sikap persikap +sikas persikas +sikas persikasi +siklus bersiklus +siksa disiksa +siksa menyiksa +siksa menyiksanya +siksa penyiksa +siksa penyiksaan +siksa tersiksa +siku persiku +sikut disikut +sikut menyikut +sikut menyikutnya +sikut tersikut +sil pensil +sil persil +sil sesil +sila bersila +sila disilakan +sila menyilakan +sila persilakan +silang bersilang +silang bersilangan +silang disilang +silang disilangkan +silang menyilang +silang menyilangkan +silang menyilangnya +silang penyilangan +silang persilangan +silat bersilat +silat persilat +silat persilatan +silat pesilat +silaturahmi bersilaturahmi +silau menyilaukan +silet disilet +silet menyilet +silet penyilet +silet penyiletan +silinder bersilinder +siluet bersiluet +simak disimak +simak menyimak +simak menyimaknya +simbah bersimbah +simbang kesimbangan +simbang menyimbangkan +simbang penyimbang +simbang penyimbangan +simbiosis bersimbiosis +simbol bersimbol +simbol disimbolkan +simbol menyimbolkan +simpan disimpan +simpan disimpannya +simpan menyimpan +simpan menyimpanan +simpan menyimpannya +simpan penyimpan +simpan penyimpanan +simpan penyimpannya +simpan tersimpan +simpan tersimpannya +simpang bersimpangan +simpang disimpang +simpang disimpangi +simpang disimpangkan +simpang kesimpang +simpang menyimpang +simpang menyimpangi +simpang menyimpangkan +simpang menyimpangnya +simpang penyimpang +simpang penyimpangan +simpang persimpangan +simpang tersimpang +simpat bersimpati +simpati bersimpati +simpatik bersimpatik +simpel sesimpel +simpuh bersimpuh +simpuh bersimpuhlah +simpul disimpulkan +simpul disimpulkannya +simpul kesimpulan +simpul menyimpulkan +simpul menyimpulkannya +simpul penyimpulan +simpul tersimpul +simulasi disimulasi +simulasi disimulasikan +simulasi mensimulasi +simulasi mensimulasikan +simulasi menyimulasikan +sin bersin +sin besin +sin disini +sin kesini +sin mensin +sin mesin +sin mesinnya +sin persin +sinambung bersinambungan +sinambung kesinambungan +sinar bersinar +sinar bersinarnya +sinar disinar +sinar disinari +sinar menyinari +sinar penyinaran +sinden pesinden +sindir disindir +sindir menyindir +sindir menyindirnya +sindir tersindir +sinergi bersinergi +sinergi bersinerginya +sinergi besinergi +sinergi disinergikan +sinergi mensinergikan +sinergi menyinergikan +sinergi tersinergi +sinergis bersinergis +sinergis disinergiskan +sinergis mensinergiskan +sinetron pesinetron +sing bersing +sing mesing +sing pesing +singa persinga +singgah bersinggah +singgah disinggahi +singgah menyinggahi +singgah persinggahan +singgung bersinggungan +singgung disinggung +singgung disinggungnya +singgung menyinggung +singgung menyinggungnya +singgung persinggungan +singgung tersinggung +singgung tersinggungnya +singkap disingkap +singkap menyingkap +singkap menyingkapi +singkap menyingkapkan +singkap penyingkapan +singkap tersingkap +singkat disingkat +singkat menyingkat +singkat penyingkat +singkat penyingkatan +singkat persingkat +singkat sesingkat +singkat tersingkat +singkir disingkirkan +singkir disingkirkannya +singkir menyingkir +singkir menyingkirkan +singkir menyingkirkannya +singkir penyingkiran +singkir tersingkir +singkir tersingkirkan +singkir tersingkirnya +singsing menyingsing +singsing menyingsingkan +sini disini +sini disinilah +sini kesini +sinis kesinisan +sinkron disinkronkan +sinkron mensinkronkan +sinkron menyinkronkan +sinkron tersinkron +sinkronisasi bersinkronisasi +sinkronisasi disinkronisasi +sinkronisasi disinkronisasikan +sinkronisasi mensinkronisasi +sinkronisasi mensinkronisasikan +sinkronisasi menyinkronisasi +sinkronisasi menyinkronisasikan +sinkronisasi tersinkronisasi +sinonim bersinonim +sintas menyintas +sintas penyintas +sintas penyintasan +sintesis disintesis +sintesis mensintesis +sinyal bersinyal +sinyal disinyalkan +sinyal mensinyalkan +sinyal pensinyalan +sinyal persinyalan +sinyalir disinyalir +sinyalir mensinyalir +sinyalir menyinyalir +sip disipkan +sip persip +sip persipan +sipat bersipat +sipit menyipit +sipit menyipitkan +sipu tersipu +sir besir +sir mesir +sir mesirnya +sira kesira +siram disiram +siram disirami +siram disiramkan +siram menyiram +siram menyirami +siram menyiramkan +siram menyiramkannya +siram menyiramnya +siram penyiram +siram penyiraman +siram persiram +siram tersiram +sirat disiratkan +sirat menyiratkan +sirat tersirat +sirep menyirep +sirip bersirip +sirkuit disirkuit +sirkulasi bersirkulasi +sirkulasi disirkulasikan +sirkulasi tersirkulasi +sis bersisi +sis disisi +sis persis +sis persisi +sis persisnya +sis pesisi +sis tersisi +sisa bersisa +sisa disisa +sisa disisakan +sisa menyisa +sisa menyisakan +sisa tersisa +sisa tersisanya +sisi bersisi +sisi bersisian +sisi disisi +sisi disisinya +sisi menyisikan +sisi penyisian +sisi persisi +sisi persisinya +sisi pesisi +sisi tersisi +sisih disisihkan +sisih disisihkannya +sisih menyisihkan +sisih menyisihkannya +sisih penyisihan +sisih tersisih +sisih tersisihkan +sisih tersisihnya +sisik bersisik +sisik menyisikan +sisip disisipi +sisip disisipkan +sisip disisipkannya +sisip menyisipkan +sisip penyisipan +sisip tersisip +sisir disisir +sisir menyisir +sisir menyisiri +sisir menyisirnya +sisir penyisir +sisir penyisiran +sisir pesisir +sisir pesisiran +sisir pesisirnya +sisir tersisir +sistem bersistem +sistem kesisteman +sistem tersistem +sistematis tersistematis +siswa kesiswaan +sit kesit +sit mesit +sit persit +sita disita +sita disitanya +sita menyita +sita menyitanya +sita penyitaan +sita persita +sita tersita +sitat disitat +siter persiter +sitir disitir +sitir menyitir +situ disitu +situ disitulah +situ kesitu +situs disitus +siul bersiul +siul disiuli +siul menyiuli +siut menyiutkan +skala berskala +skala beskala +skala penskalaan +skema berskema +skema terskema +skenario diskenario +skenario diskenariokan +skenario menskenariokan +ski berski +ski diski +ski meski +ski meskinya +ski seski +skop diskop +skor berskor +skor diskor +skor menskor +skors diskors +skors menskors +skors penskorsan +skripsi diskripsi +slah keslahan +slogan berslogan +soal disoal +soal menyoal +soal menyoalkan +soal persoalan +soal persoalkan +soal pesoalan +soba menyoba +sobek disobek +sobek menyobek +sobek penyobekan +soda bersoda +sodet disodet +sodet menyodet +sodet penyodetan +sodok disodok +sodok menyodok +sodomi disodomi +sodomi menyodomi +sodor disodori +sodor disodorkan +sodor disodorkannya +sodor menyodori +sodor menyodorkan +sodor menyodorkannya +soe menyoe +sogo penyogokan +sogok disogok +sogok menyogok +sogok menyogoknya +sogok penyogok +sogok penyogokan +sohor kesohor +sohor pesohor +sohor tersohor +sok besok +sok besoklah +sok besoknya +sok kesokan +sok penyok +sokong disokong +sokong menyokong +sokong menyokongnya +sokong penyokong +sokong penyokongnya +sol bersol +sol persolan +solder disolder +solder menyolder +solid disolidkan +solid kesolidan +solid mensolidkan +solid menyolidkan +solid sesolid +solidaritas bersolidaritas +solo bersolo +solok menyolok +solusi bersolusi +solusi disolusikan +solusi mensolusi +somasi disomasi +somasi mensomasi +somasi menyomasi +sombong disombongkan +sombong kesombongan +sombong menyombongkan +songsong disongsong +songsong menyongsong +sono tersono +sontek disontek +sontek mensontek +sontek menyontek +sontek menyonteknya +sop bersopan +sop mesop +sopan bersopan +sopan kesopanan +sopir disopiri +sopir menyopir +sopir menyopiri +sorak bersorak +sorak disoraki +sorak menyoraki +sorak menyorakkan +sorak-sorai bersorak-sorai +sorang sesorang +sore kesorean +sorot disorot +sorot disoroti +sorot disorotkan +sorot menyorot +sorot menyoroti +sorot menyorotkan +sorot menyorotnya +sorot tersorot +sortir disortir +sortir mensortir +sortir menyortir +sortir menyortirnya +sortir penyortir +sortir penyortiran +sosial bersosial +sosialis bersosialisi +sosialisasi bersosialisasi +sosialisasi disosialisasi +sosialisasi disosialisasikan +sosialisasi disosialisasikannya +sosialisasi mensosialisasi +sosialisasi mensosialisasikan +sosialisasi mensosialisasikannya +sosialisasi menyosialisasi +sosialisasi menyosialisasikan +sosialisasi menyosialisasikannya +sosialisasi tersosialisasi +sosialisasi tersosialisasikan +sosoh disosoh +sosok bersosok +sosok sesosok +sosor menyosor +span sespan +spektakuler sespektakuler +spekulasi berspekulasi +spekulasi dispekulasi +spekulasi dispekulasikan +spesial dispesialkan +spesialisasi berspesialisasi +spesialisasi terspesialisasi +spesifikasi berspesifikasi +sponsor bersponsor +sponsor disponsori +sponsor mensponsori +spora dispora +sri mesri +stabil distabilkan +stabil kestabilan +stabil menstabilkan +stabil menstabilkannya +stabil penstabil +stabil penstabilan +stabilisasi menstabilisasi +stabilitas distabilitas +stadion distadion +staf distafkan +staf menstafkan +stamina berstamina +stan distan +stan distankan +standar berstandar +standar distandarkan +standar menstandarkan +standar terstandar +standardisasi distandardisasi +standardisasi terstandardisasi +stapler distapler +staples distaples +starter distarter +stasi perstasi +stasiun distasiun +statistik perstatistikan +status berstatus +status berstatuskan +status bestatus +stempel berstempel +stempel distempel +steril disteril +steril disterilkan +steril kesterilan +steril mensterilkan +steril pensterilan +sterilisasi disterilisasi +sterilisasi mensterilisasi +sterilisasi mensterilisasikan +stigma distigma +stigma distigmakan +stigma menstigma +stigma terstigma +stik distik +stik memstikan +stiker berstiker +stimulan distimulan +stimulasi distimulasi +stimulasi menstimulasi +stimulasi menstimulasikan +stimulasi menstimulasinya +stimulasi terstimulasi +stimulus distimulus +stimulus menstimulus +stok distok +stok menstok +strategi berstrategi +stres distres +struktur berstruktur +struktur distruktur +struktur terstruktur +sua bersua +sua bersuai +sua disua +sua sesua +sua sesuai +suai bersuai +suai sesuai +suai sesuaian +suai sesuaikan +suai sesuainya +suam bersuami +suami bersuami +suami bersuamikan +suap disuap +suap disuapi +suap disuapkan +suap menyuap +suap menyuapi +suap menyuapkan +suap menyuapnya +suap penyuap +suap penyuapan +suap penyuapnya +suap sesuap +suara bersuara +suara disuarakan +suara disuarakannya +suara menyuarakan +suara menyuarakannya +suara penyuara +suasana bersuasana +suat besuatan +suat sesuat +suat sesuati +suatu disuatu +suatu sesuatu +suatu sesuatunya +subordinasi tersubordinasi +subsidi bersubsidi +subsidi bersubsidinya +subsidi besubsidi +subsidi disubsidi +subsidi disubsidikan +subsidi mensubsidi +subsidi menyubsidi +substitusi disubstitusi +substitusi mensubstitusi +subur disuburkan +subur kesuburan +subur menyuburkan +subur penyubur +subur penyuburan +subur sesubur +subur tersubur +subur tersuburnya +suci bersuci +suci disucikan +suci kesucian +suci mensucikan +suci menyuci +suci menyucikan +suci pensucian +suci penyucian +suci tersuci +sudah disudah +sudah disudahi +sudah kesudahan +sudah menyudahi +sudah sesudah +sudah sesudahnya +sudut bersudut +sudut besudut +sudut disudut +sudut disudutkan +sudut menyudut +sudut menyudutkan +sudut menyudutkannya +sudut penyudutan +sudut tersudut +sudut tersudutkan +sugesti mensugesti +sugesti tersugesti +sugih kesugihan +sugih pesugihan +suguh disuguhi +suguh disuguhkan +suguh disuguhkannya +suguh menyuguhi +suguh menyuguhkan +suguh menyuguhkannya +suhu bersuhu +suji mesuji +sujud bersujud +suka bersuka +suka disuka +suka disukai +suka disukanya +suka kesukaan +suka menyukai +suka penyuka +suka penyukanya +suka sesuka +suka sesukanya +sukacita bersukacita +sukan besukan +sukan kesukannya +sukar kesukaran +sukar tersukar +sukarela kesukarelaan +sukarelawan kesukarelawanan +sukaria bersukaria +suki besuki +suki memsuki +sukses disukseskan +sukses kesuksesan +sukses kesukseskan +sukses mensukseskan +sukses mensukseskannya +sukses menyukseskan +sukses menyukseskannya +sukses penyuksesan +sukses sesukses +sukses tersukses +sukses tersuksesnya +suku bersuku +suku kesukuan +sulam bersulam +sulam disulam +sulam menyulam +sulam penyulam +sulam penyulaman +sulang bersulang +sulang penyulang +sulap disulap +sulap disulapnya +sulap menyulap +sulap menyulapnya +sulap pesulap +suling disuling +suling menyuling +suling penyuling +suling penyulingan +sulit disulitkan +sulit kesulitan +sulit menyulitkan +sulit menyulitkannya +sulit penyulit +sulit persulit +sulit sesulit +sulit tersulit +sulit tersulitnya +sultan kesultan +sultan kesultanan +suluh penyuluh +suluh penyuluhan +suluh penyuluhnya +sulut disulut +sulut disulutnya +sulut menyulut +sulut menyulutkan +sulut menyulutnya +sulut penyulut +sulut penyulutan +sulut tersulut +sulut tersulutnya +sum mesum +sum mesumnya +sumah kesumah +sumbang disumbang +sumbang disumbangkan +sumbang disumbangkannya +sumbang menyumbang +sumbang menyumbangan +sumbang menyumbangkan +sumbang menyumbangkannya +sumbang penyumbang +sumbang penyumbangnya +sumbangsih bersumbangsih +sumbar sesumbar +sumbar sesumbarnya +sumbat disumbat +sumbat menyumbat +sumbat menyumbatnya +sumbat penyumbat +sumbat penyumbatan +sumbat tersumbat +sumbat tersumbatnya +sumber bersumber +sumber bersumberkan +sumbu bersumbu +sumo pesumo +sumpah bersumpah +sumpah disumpah +sumpah menyumpah +sumpah menyumpahi +sumpah penyumpahan +sumpah tersumpah +sumpal disumpal +sumpal menyumpal +sumpal tersumpal +sunah disunahkan +sunan kesunanan +sunat bersunat +sunat disunat +sunat menyunat +sunat menyunatkan +sunat penyunatan +sundul disundul +sundul disundulnya +sundul menyundul +sundul menyundulnya +sundul penyundul +sundut disundut +sundut menyundut +sundut tersundut +sungai disungai +sungging menyungging +sungging menyunggingkan +sungging tersungging +sungguh bersungguh +sungguh kesungguhan +sungguh sesungguh +sungguh sesungguhnya +sungkur menyungkurkan +sungkur tersungkur +sungkur tersungkurnya +sungut bersungut +sunti disuntikan +sunti menyuntikan +sunti menyuntikannya +sunti penyuntikan +suntik disuntik +suntik disuntikan +suntik disuntikkan +suntik menyuntik +suntik menyuntikan +suntik menyuntikkan +suntik menyuntikkannya +suntik menyuntiknya +suntik penyuntik +suntik penyuntikan +suntik penyuntikkan +sunting disunting +sunting menyunting +sunting penyunting +sunting penyuntingan +sunyi kesunyian +super tersuper +supervisi disupervisi +supervisi mensupervisi +suplai disuplai +suplai mensuplai +suplai menyuplai +suplai menyuplainya +suplai pensuplai +suplai penyuplai +suplai penyuplaian +suplai penyuplainya +suplai tersuplai +suram kesuraman +suram sesuram +surat bersurat +surat disurat +surat disurati +surat disuratkan +surat menyurat +surat menyurati +surat menyuratkan +surat menyuratnya +surat persuratan +surat tersurat +surati disurati +surati menyurati +suruh disuruh +suruh disuruhnya +suruh menyuruh +suruh menyuruhnya +suruh penyuruh +suruh pesuruh +surup kesurupan +surut menyurut +surut menyurutkan +surut penyurutan +survei disurvei +survei mensurvei +survei menyurvei +survei penyurvei +sus menyusi +sus pelsus +susah bersusah +susah disusahkan +susah kesusahan +susah menyusahkan +susah sesusah +susastra kesusastraan +suspensi disuspensi +suspensi mensuspensi +suspensi menyuspensi +suspensi tersuspensi +susu besusu +susu disusui +susu kesusu +susu menyusu +susu menyusui +susu menyusunya +susu penyusuan +susu persusuan +susuk menyusuk +susul disusul +susul disusuli +susul disusulkan +susul kesusul +susul menyusul +susul menyusulkan +susul menyusulnya +susul tersusul +susun bersusun +susun disusun +susun disusunlah +susun disusunnya +susun menyusun +susun menyusunnya +susun penyusun +susun penyusunan +susun penyusunnya +susun tersusun +susun tersusunnya +susung disusung +susup disusupi +susup disusupkan +susup menyusup +susup menyusupi +susup menyusupkan +susup menyusupnya +susup penyusup +susup penyusupan +susup tersusupi +susur disusuri +susur menyusur +susur menyusuri +susur penyusuran +susut disusutkan +susut menyusut +susut menyusutkan +susut menyusutnya +susut penyusutan +sut besut +sut besutan +sut mesut +sut pesut +sutan besutan +sutan besutannya +sutradara disutradarai +sutradara menyutradarai +sutradara penyutradaraan +suwir disuwir +swadaya berswadaya +swadaya keswadayaan +swasembada berswasembada +swasta diswastakan +swasta menswastakan +syah disyahkan +syah mensyahkan +syahadat bersyahadat +syahbandar kesyahbandaran +syahid kesyahidan +syair penyair +syala menyala +syala menyalakan +syala menyalakannya +syala menyalanya +syala penyala +syala penyalaan +syaman menyamankan +syarah menyarahkan +syarak menyarakan +syarat bersyarat +syarat bersyaratnya +syarat disyaratkan +syarat mensyaratkan +syarat menyaratkan +syarat persyarat +syarat persyaratan +syarat persyaratkan +syarat pesyaratan +syariat bersyariat +syariat disyariatkan +syarik menyarikan +syarik penyarikan +syarikat persyarikatan +syiar mensyiarkan +syiar menyiarkan +syiar menyiarkannya +syiar penyiar +syiar penyiaran +syiar penyiarnya +syirik kesyirikan +syok penyok +ta berta +ta bertanya +ta bertanyalah +ta beta +ta betanya +ta dita +ta ditanya +ta keta +ta mena +ta menakan +ta menanya +ta mengtakan +ta menta +ta mentakan +ta menytakan +ta meta +ta pelta +ta pena +ta penanya +ta penta +ta perta +ta pertai +ta peta +ta petai +ta petakan +ta petanya +ta seta +ta setalah +taat ditaati +taat ketaatan +taat menaati +taat mentaati +taat penaatan +tabah ketabahan +tabah menabahkan +tabal ditabalkan +tabal menabalkan +tabarak bertabarakan +tabarak menabarak +tabayun bertabayun +tabiat bertabiat +tabrak bertabrakan +tabrak bertabrakkan +tabrak ditabrak +tabrak ditabrakan +tabrak ditabrakkan +tabrak ditabraknya +tabrak ketabrak +tabrak menabrak +tabrak menabrakan +tabrak menabraki +tabrak menabrakkan +tabrak menabrakkannya +tabrak menabraknya +tabrak penabrak +tabrak penabrakan +tabrak penabraknya +tabrak tertabrak +tabrak tertabraknya +tabu ditabukan +tabu ketabuan +tabu menabukan +tabuh ditabuh +tabuh ditabuhkan +tabuh menabuh +tabuh menabuhkan +tabuh penabuh +tabuh penabuhan +tabuhan penabuhan +tabung bertabung +tabung ditabung +tabung ditabungkan +tabung ditabungnya +tabung menabung +tabung menabungkan +tabung menabunglah +tabung menabungnya +tabung penabung +tabung pertabung +tabur bertabur +tabur bertaburan +tabur bertaburkan +tabur bertaburnya +tabur ditabur +tabur ditaburi +tabur ditaburkan +tabur menabur +tabur menaburi +tabur menaburkan +tabur menaburkannya +tabur mengabur +tabur mengaburkan +tabur penabur +tabur penaburan +tadah ditadah +tadah menadah +tadah menadahkan +tadah penadah +tadah penadahan +tadah penadahnya +tadarus bertadarus +tadi menadi +tafakur bertafakur +tafsir ditafsir +tafsir ditafsirkan +tafsir menafsir +tafsir menafsirkan +tafsir menafsirkannya +tafsir penafsir +tafsir penafsiran +tagak penagak +tagak penagakan +tagan menagani +tagan penagan +tagan penaganan +tagar bertagar +tagih ditagih +tagih ditagihkan +tagih ketagihan +tagih menagih +tagih menagihkan +tagih menagihnya +tagih penagih +tagih penagihan +tagih tertagih +tah bertahan +tah bertahi +tah betah +tah betahan +tah betahnya +tah ditahan +tah ketahan +tah menahan +tah mentah +tah mentahan +tah mentahkan +tah mentahnya +tah penah +tah penahan +tah pertahan +tah petah +tah petahan +tah setah +tah tertahan +tahan bertahan +tahan bertahanan +tahan bertahanlah +tahan bertahannya +tahan betahan +tahan ditahan +tahan ditahanan +tahan ditahannya +tahan ketahan +tahan ketahanan +tahan menahan +tahan menahanan +tahan menahannya +tahan mentahan +tahan penahan +tahan penahanan +tahan penahannya +tahan pertahan +tahan pertahanan +tahan pertahankan +tahan pertahannya +tahan petahan +tahan petahanan +tahan tertahan +tahan tertahankan +tahan tertahannya +tahana penahana +tahana penahananya +tahana pertahana +tahana petahana +tahap bertahap +tahap bertahaplah +tahap ditahap +tahap ketahap +tahap penahapan +tahap pentahapan +tahap setahap +tahbis ditahbiskan +tahbis menahbiskan +tahbis mentahbiskan +tahbis penahbisan +tahbis pentahbisan +tahi bertahi +tahu ditahui +tahu ketahuan +tahu ketahui +tahu menahu +tahu mengtahui +tahu setahu +tahu setahunya +tahun bertahun +tahun ditahun +tahun ketahun +tahun menahun +tahun pertahun +tahun pertahunnya +tahun setahun +tahun setahunan +tahun setahunnya +tais bertais +taja ditaja +taja menaja +taja penaja +tajam ditajamkan +tajam ketajaman +tajam menajam +tajam menajamkan +tajam menajamnya +tajam penajam +tajam penajaman +tajam pertajam +tajam setajam +tajam tertajam +taji beltaji +taji bertaji +tajuk bertajuk +tak ketak +tak menak +tak menakan +tak mengtakan +tak mentak +tak mentakan +tak menytakan +tak penak +tak petak +tak petakan +takar ditakar +takar menakar +takar penakar +takar penakaran +takat setakat +takbir bertakbir +takdir ditakdirkan +takdir menakdirkan +takdir mentakdirkan +takhta bertakhta +takhta bertakhtakan +takjub ketakjuban +takjub menakjubkan +takjub menakjubkannya +takluk ditaklukan +takluk ditaklukkan +takluk ditaklukkannya +takluk menaklukan +takluk menaklukkan +takluk menaklukkannya +takluk penakluk +takluk penaklukan +takluk penaklukkan +taksi ditaksi +taksir ditaksir +taksir ditaksirnya +taksir menaksir +taksir mentaksir +taksir penaksir +taksir penaksiran +takuk ketakukan +takut ditakuti +takut ditakutkan +takut ditakutkannya +takut ketakutan +takut ketakutkan +takut menakut +takut menakuti +takut menakutkan +takut menakutkannya +takut penakut +takut setakut +takwa bertakwa +takwa bertakwalah +takwa ketakwaan +takziah bertakziah +takziah petakziah +tal bertali +tal ditali +tal menalan +tal mental +tal mentalnya +tal metal +tal metalnya +tal penal +tal penali +tal pentalan +tal pertal +tal petal +tal setali +tala petala +talah setalah +talam menalami +talang ditalangi +talang menalangi +talang penalangan +talang petalangan +talar menalar +talar penalaran +talenta bertalenta +tali bertali +tali bertalian +tali ditali +tali penali +tali pertalian +tali setali +talu tertalu +tam bertam +tam ditaman +tam ketam +tam menaman +tam menamkan +tam metaman +tam penaman +tam pertam +tam pertaman +tam pertamnya +tam setaman +tamak ketamakan +tamak menamakan +tamam menamam +taman ditaman +taman menaman +taman menamankan +taman metaman +taman penaman +taman penamanan +taman pertaman +taman pertamanan +taman pertamannya +taman setaman +tamasya bertamasya +tamat ditamatkan +tamat menamatkan +tamat setamat +tambah bertambah +tambah bertambahnya +tambah betambah +tambah ditambah +tambah ditambahan +tambah ditambahi +tambah ditambahkan +tambah ditambahkannya +tambah ditambahnya +tambah ketambahan +tambah menambah +tambah menambahan +tambah menambahi +tambah menambahkan +tambah menambahkannya +tambah menambahnya +tambah penambah +tambah penambahan +tambah penambahkan +tambah pertambahan +tambah tertambah +tambak ditambakan +tambak menambak +tambak menambakan +tambak penambak +tambak penambakan +tambak pertambakan +tambak petambak +tambakan ditambakan +tambakan menambakan +tambakan penambakan +tambakan pertambakan +tambal ditambal +tambal menambal +tambal menambalnya +tambal penambal +tambal penambalan +tambang bertambang +tambang ditambang +tambang menambang +tambang menambangnya +tambang penambang +tambang penambangan +tambang penambangnya +tambang pertambang +tambang pertambangan +tambang petambang +tambat ditambat +tambat ditambatkan +tambat menambatkan +tambat penambat +tambat penambatan +tambat tertambat +tambung menambung +tambur pertamburan +tambur petamburan +tameng bertameng +tampah penampahan +tampak ditampakkan +tampak menampakan +tampak menampakkan +tampak penampakan +tampak penampakkan +tampan ketampanan +tampan setampan +tampan tertampan +tampang bertampang +tampang penampang +tampang penampangnya +tampang tertampang +tampar ditampar +tampar menampar +tampar menamparnya +tampar penampar +tampar penamparan +tampar tertampar +tampi ditampikan +tampi menampikan +tampi penampian +tampi penampikan +tampik ditampik +tampik ditampikan +tampik ditampiknya +tampik menampik +tampik menampikan +tampik menampikkan +tampik menampiknya +tampik penampikan +tampil bertampilan +tampil ditampil +tampil ditampilan +tampil ditampilkan +tampil ditampilkannya +tampil menampil +tampil menampilan +tampil menampilkan +tampil menampilkannya +tampil penampil +tampil penampilan +tampil tertampil +tamping penamping +tampuk menampuk +tampung ditampung +tampung ditampungnya +tampung ketampung +tampung menampung +tampung menampungnya +tampung penampung +tampung penampungan +tampung penampungnya +tampung tertampung +tamu bertamu +tamu pertamuan +tan bertani +tan betan +tan ketan +tan menan +tan mentan +tan metan +tan pertani +tan petan +tan petani +tan setan +tan setannya +tanah bertanah +tanah ditanah +tanah ketanah +tanah penanahan +tanah pertanahan +tanah petanahan +tanah setanah +tanak ditanak +tanak menanak +tanak penanak +tanam bertanam +tanam ditanam +tanam ditanaman +tanam ditanami +tanam ditanamkan +tanam ditanamkannya +tanam ditanamnya +tanam menanam +tanam menanaman +tanam menanami +tanam menanamkan +tanam menanamkannya +tanam menanamnya +tanam penanam +tanam penanaman +tanam pertanaman +tanam tertanam +tanam tertanamnya +tanang menanangi +tanang penanangan +tanang petanang +tancap ditancap +tancap ditancapkan +tancap menancap +tancap menancapkan +tancap menancapkannya +tancap penancapan +tancap tertancap +tanda bertanda +tanda ditanda +tanda ditandai +tanda ditandakan +tanda menanda +tanda menandai +tanda menandakan +tanda penanda +tanda penandaan +tanda penandanya +tanda pertanda +tanda petanda +tanda petandakan +tanda tertanda +tandak ditandakan +tandak menandakan +tandak petandakan +tandan bertandan +tandan ketandan +tandan setandan +tandang bertandang +tandang bertandangan +tandang menandang +tandas ditandaskan +tandas menandaskan +tandem bertandem +tandem ditandem +tandem ditandemkan +tandem menandemkan +tanding bertanding +tanding bertandingan +tanding bertandingnya +tanding ditandingi +tanding ditandingkan +tanding menandingi +tanding pentandingan +tanding pertanding +tanding pertandingan +tanding pertandingkan +tanding petandingan +tanding setanding +tanding tertandingi +tandu ditandu +tandu menandu +tandu menandunya +tanduk bertanduk +tanduk ditanduk +tanduk menanduk +tanduk menandukkan +tanduk menanduknya +tang bertangan +tang betang +tang ditangan +tang ditangkan +tang ketang +tang ketangan +tang ketangi +tang menang +tang menangan +tang menangi +tang menangkan +tang menanglah +tang menangnya +tang mentang +tang penang +tang penangan +tang penangkan +tang petang +tang petangnya +tang setang +tang setangnya +tangan bertangan +tangan ditangan +tangan ditangani +tangan ditangannya +tangan ketangan +tangan menangan +tangan menangani +tangan penangan +tangan penanganan +tangan penangannya +tangan tertangani +tangap ditangap +tangap ditangapi +tangap menangap +tangap menangapi +tangga bertangga +tangga menanggai +tangga tertangga +tanggal bertanggal +tanggal ditanggal +tanggal ditanggalkan +tanggal menanggal +tanggal menanggalkan +tanggal menanggalkannya +tanggal penanggalan +tanggal pertanggal +tanggal tertanggal +tanggap ditanggap +tanggap ditanggapi +tanggap ketanggapan +tanggap menanggap +tanggap menanggapi +tanggap menanggapnya +tanggap penanggap +tanggap petanggap +tanggap tertanggap +tanggar penanggaran +tangguh ditangguhkan +tangguh ditangguhkannya +tangguh ketangguhan +tangguh menangguhkan +tangguh menangguhkannya +tangguh penangguhan +tangguh setangguh +tangguh tertangguh +tangguk menangguk +tanggul ditanggul +tanggul menanggul +tanggul penanggulan +tanggulang ditanggulangi +tanggulang menanggulangi +tanggulang penanggulang +tanggulang penanggulangan +tanggulang tertanggulangi +tanggung bertanggung +tanggung betanggung +tanggung ditanggung +tanggung ditanggungkan +tanggung ditanggungnya +tanggung ketanggung +tanggung ketanggungan +tanggung menanggung +tanggung menanggungnya +tanggung penanggung +tanggung penanggungan +tanggung pertanggung +tanggung pertanggungan +tanggung tertanggung +tangis ditangisi +tangis menangis +tangis menangisi +tangis menangislah +tangis menangisnya +tangkai bertangkai +tangkai setangkai +tangkal ditangkal +tangkal menangkal +tangkal menangkalnya +tangkal penangkal +tangkal penangkalan +tangkal penangkalnya +tangkap ditangkap +tangkap ditangkapi +tangkap ditangkaplah +tangkap ditangkapnya +tangkap ketangkap +tangkap menangkap +tangkap menangkapan +tangkap menangkapi +tangkap menangkapnya +tangkap penangkap +tangkap penangkapan +tangkap penangkapkan +tangkap penangkapnya +tangkap tertangkap +tangkap tertangkaplah +tangkap tertangkapnya +tangkar ditangkar +tangkar ditangkarkan +tangkar menangkar +tangkar menangkarkan +tangkar penangkar +tangkar penangkaran +tangkas ketangkasan +tangki bertangki +tangkis ditangkis +tangkis menangkis +tangkis menangkisnya +tangkis penangkis +tangkup menangkupkan +tangkup setangkup +tani bertani +tani pertani +tani pertanian +tani petani +tani petanian +tani petaninya +tania betania +tania pertania +tanin betanin +tanin pertaninan +tanjak ditanjakan +tanjak menanjak +tanjak menanjaknya +tanjak penanjakan +tanjung penanjung +tantang ditantang +tantang ditantangnya +tantang menantang +tantang menantangnya +tantang penantang +tantang penantangnya +tantang tertantang +tanti menanti +tanti menantikan +tanti menantikannya +tanti menantinya +tanti penanti +tanti penantian +tanya bertanya +tanya bertanyalah +tanya betanya +tanya ditanya +tanya ditanyai +tanya ditanyakan +tanya ditanyakannya +tanya menanya +tanya menanyai +tanya menanyakan +tanya menanyakannya +tanya penanya +tanya pertanyaan +tanya pertanyakan +tanya petanya +tanya petanyaan +tap betap +tap mentap +tap mentapkan +tap pentapan +tap petapan +tap setap +tap tertap +tap tertapi +tapa bertapa +tapa betapa +tapa menapai +tapa menapakan +tapa pertapa +tapa pertapaan +tapa petapa +tapai menapai +tapak ditapaki +tapak menapak +tapak menapakan +tapak menapaki +tapak menapakkan +tapak setapak +tapang ketapang +tapi menapikan +tapi tertapi +tapis ditapis +tapis menapis +tapis penapis +tapis penapisan +tar betar +tar ketar +tar menari +tar mentari +tar penari +tar petar +tar setar +tar tertari +tara betara +tara betarai +tara ketara +tara menara +tara menaranya +tara penara +tara setara +tara setarakan +tara setaranya +taraf bertaraf +taraf setaraf +tarak setarakan +tarang ketarangan +tarang mentarang +target bertarget +target ditarget +target ditargetkan +target ditargetkannya +target ditargetnya +target menarget +target menargetkan +target menargetkannya +target menargetnya +target mentarget +target mentargetkan +target penargetan +target tertarget +tari ditarikan +tari menari +tari menarikan +tari menarilah +tari menarinya +tari mentari +tari penari +tari penarikan +tari penarikannya +tari penarinya +tari tertari +tarif bertarif +tarif ditarif +tarif penarifan +tarif pentarifan +tarik ditarik +tarik ditarikan +tarik ditariknya +tarik ketarik +tarik menarik +tarik menarikan +tarik menariknya +tarik penarik +tarik penarikan +tarik penariknya +tarik tertarik +tarik tertariknya +tarikh bertarikh +taring bertaring +taruh bertaruh +taruh ditaruh +taruh ditaruhnya +taruh menaruh +taruh menaruhkan +taruh menaruhnya +taruh penaruh +taruh pertaruhan +taruh pertaruhkan +taruh petaruh +taruk penarukan +taruk petarukan +tarung bertarung +tarung bertarunglah +tarung bertarungnya +tarung betarung +tarung pertarung +tarung pertarungan +tarung petarung +tarung petarungan +tarung petarungnya +tas ditas +tas ketas +tas menas +tas mengtasi +tas mentas +tas penas +tas pentas +tas pentaskan +tas petasan +tas setasi +tas tertas +tasbih bertasbih +tasbih ditasbihkan +tasbih menasbihkan +tasbih mentasbihkan +tasbih penasbihan +tashih pentashihan +tata bertata +tata ditata +tata ditatanya +tata ketata +tata menata +tata menatakan +tata menatanya +tata mengtatakan +tata mentatakan +tata penata +tata penataan +tata tertata +tata tertatanya +tatah bertatahkan +tatah petatah +tatak menatakan +tatak mengtatakan +tatak mentatakan +tatang menatang +tatap bertatap +tatap bertatapan +tatap ditatap +tatap menatap +tatap menatapkan +tatap menatapnya +tatap penatapan +tatar ditatar +tatar ditataran +tatar penataran +tatih penatih +tatih tertatih +tato bertato +tato ditato +tato menato +tato mentato +tato penatoi +tau ketau +tau ketauan +tau pentauan +tau setau +tauhid ketauhidan +taung menaungi +taung penaung +taur pertauran +taut bertaut +taut bertautan +taut ditautkan +taut menautkan +taut mentautkan +taut pertautan +taut tertaut +tawa ditawakan +tawa ketawa +tawa ketawanya +tawa menawakan +tawa mentawa +tawa mentawai +tawa tertawa +tawa tertawaan +tawa tertawai +tawa tertawakan +tawa tertawalah +tawa tertawanya +tawa-tawa ketawa-tawa +tawa-tawa tertawa-tawa +tawak ditawakan +tawak menawakan +tawak tertawakan +tawakal bertawakal +tawan ditawan +tawan menawan +tawan menawannya +tawan penawan +tawan penawanan +tawan tertawan +tawang ketawang +tawang penawangan +tawar ditawar +tawar ditawari +tawar ditawarkan +tawar ditawarkannya +tawar menawar +tawar menawaran +tawar menawari +tawar menawarkan +tawar menawarkannya +tawar menawarnya +tawar penawar +tawar penawaran +tawar penawarnya +tawar-tawar ditawar-tawar +tawas menawaskan +tayamum bertayamum +tayang ditayang +tayang ditayangan +tayang ditayangkan +tayang ditayangkannya +tayang menayang +tayang menayangkan +tayang menayangkannya +tayang penayang +tayang penayangan +tayang tertayang +te bete +te dite +te ditekan +te ditekannya +te ditelah +te kete +te ketekan +te mene +te menekan +te menekannya +te menelah +te mente +te mete +te penekan +te pete +te sete +te setelah +te tertekan +te tertekannya +teater berteater +tebak ditebak +tebak ketebak +tebak menebak +tebak menebaknya +tebak penebak +tebak penebakan +tebak tertebak +tebal ditebalkan +tebal ketebalan +tebal menebal +tebal menebalkan +tebal menebalnya +tebal penebalan +tebal pertebal +tebal setebal +tebang bertebangan +tebang ditebang +tebang ditebangi +tebang menebang +tebang menebangi +tebang menebangnya +tebang penebang +tebang penebangan +tebar bertebaran +tebar betebaran +tebar ditebar +tebar ditebarkan +tebar menebar +tebar menebarkan +tebar penebar +tebar penebaran +tebas ditebas +tebas menebas +tebas menebaskan +tebeng menebeng +tebing bertebing +tebus ditebus +tebus ditebuskan +tebus ditebusnya +tebus menebus +tebus menebusnya +tebus penebus +tebus penebusan +teduh berteduh +teduh keteduhan +teduh meneduh +teduh meneduhkan +teduh peneduh +tega ditegakan +tega menegakan +tega mentega +tega penegakan +tega penegakannya +tega setega +tegah ditegah +tegah menegah +tegah penegah +tegah penegahan +tegah pertegahan +tegah setegah +tegak ditegakan +tegak ditegakkan +tegak ditegakkannya +tegak menegak +tegak menegakan +tegak menegakkan +tegak menegakkannya +tegak penegak +tegak penegakan +tegak penegakkan +tegak penegakkannya +tegak penegaknya +tegang bertegangan +tegang ketegangan +tegang menegang +tegang menegangkan +tegang menegangnya +tegang setegang +tegar ketegaran +tegas ditegaskan +tegas ditegaskannya +tegas ketegasan +tegas menegas +tegas menegasan +tegas menegaskan +tegas menegaskannya +tegas penegas +tegas penegasan +tegas pertegas +tegas setegas +teguh beteguh +teguh diteguhkan +teguh keteguhan +teguh meneguhkan +teguh peneguhan +teguk diteguk +teguk diteguknya +teguk meneguk +teguk meneguknya +teguk seteguk +tegun tertegun +tegur bertegur +tegur ditegur +tegur menegur +tegur menegurnya +tegur peneguran +teh meneh +teka-teki berteka-teki +tekad bertekad +tekah setekah +tekak menekakan +tekan bertekanan +tekan ditekan +tekan ditekankan +tekan ditekankannya +tekan ditekannya +tekan ketekan +tekan menekan +tekan menekanan +tekan menekankan +tekan menekannya +tekan penekan +tekan penekanan +tekan tertekan +tekan tertekannya +tekat bertekat +tekel ditekel +tekel menekel +tekel menekelnya +tekel mentekel +teken diteken +teken ditekennya +teken meneken +teken menekennya +teken penekenan +teknik berteknik +teknik keteknikan +teknologi berteknologi +teks diteksi +tekstil pertekstilan +tekstur bertekstur +tekuk bertekuk +tekuk ditekuk +tekuk menekuk +tekuk tertekuk +tekun ditekuni +tekun ketekunan +tekun menekuni +tel betel +tel ditelan +tel ketel +tel ketelan +tel menelan +tel petel +tel setel +tel setelan +tel tertelan +tela ketela +tela penelaan +tela pertelaan +tela setela +telaah ditelaah +telaah menelaah +telaah menelaahnya +telaah penelaah +telaah penelaahan +teladan diteladani +teladan keteladan +teladan keteladanan +teladan meneladani +telah ditelah +telah menelah +telah setelah +telah setelahnya +telak tertelak +telan ditelan +telan ditelannya +telan ketelan +telan menelan +telan menelannya +telan setelan +telan setelannya +telan tertelan +telan tertelannya +telanjang bertelanjang +telanjang ditelanjangi +telanjang ketelanjangan +telanjang menelanjangi +telanjang penelanjangan +telantar ditelantarkan +telantar ketelantaran +telantar menelantarkan +telantar menelantarkannya +telantar mentelantarkan +telantar penelantar +telantar penelantaran +telapak ditelapak +telaten ketelatenan +tele bertele +teledor keteledoran +telefon bertelefon +telefon ditelefon +telefon menelefon +telefon menelefonnya +telefon penelefon +telekomunikasi pertelekomunikasian +telepon bertelepon +telepon ditelepon +telepon menelepon +telepon meneleponnya +telepon penelepon +telepon peneleponnya +telepon pertelepon +televisi ditelevisi +televisi pertelevisian +telikung ditelikung +telikung menelikung +telinga bertelinga +telinga ditelinga +teliti diteliti +teliti ditelitinya +teliti ketelitian +teliti meneliti +teliti menelitinya +teliti peneliti +teliti penelitian +teliti penelitinya +teliti seteliti +teluk seteluk +telungkup menelungkup +telungkup menelungkupkan +telungkup tertelungkup +telur bertelur +telur bertelurnya +telur ditelurkan +telur ditelurkannya +telur menelurkan +telur peneluran +telur petelur +telusur ditelusur +telusur ditelusuri +telusur ketelusuran +telusur menelusur +telusur menelusuri +telusur penelusur +telusur penelusuran +tem berteman +tem menem +tem perteman +tema bertema +tema bertemakan +tema ditemai +tema menemai +tema pertema +temak bertemakan +teman berteman +teman bertemanlah +teman ditemani +teman menemani +teman perteman +teman pertemanan +tembak ditembak +tembak ditembakan +tembak ditembaki +tembak ditembakkan +tembak ditembakkannya +tembak ditembaknya +tembak ketembak +tembak menembak +tembak menembakan +tembak menembaki +tembak menembakkan +tembak menembakkannya +tembak menembaknya +tembak penembak +tembak penembakan +tembak penembakkan +tembak penembaknya +tembak petembak +tembak tertembak +tembak tertembaknya +tembakau pertembakauan +tembang menembang +tembang menembangkan +tembang penembang +tembang penembangan +tembok bertembok +tembok ditembok +tembok menembok +tembok penembokan +tembus ditembus +tembus ditembuskan +tembus ditembusnya +tembus menembus +tembus menembuskan +tembus menembusnya +tembus penembus +tembus penembusan +tembus tertembus +tempa ditempa +tempa ditempakan +tempa menempa +tempa menempai +tempa menempakan +tempa menempanya +tempa penempaan +tempa setempa +tempa tertempa +tempat bertempat +tempat ditempat +tempat ditempati +tempat ditempatkan +tempat ditempatkannya +tempat ditempatnya +tempat ketempat +tempat ketempatan +tempat menempat +tempat menempatan +tempat menempati +tempat menempatkan +tempat menempatkannya +tempat penempat +tempat penempatan +tempat setempat +tempat setempatnya +tempel ditempel +tempel ditempeli +tempel ditempelkan +tempel menempel +tempel menempeli +tempel menempelkan +tempel menempelkannya +tempel menempelnya +tempel penempelan +tempel setempel +tempel tertempel +tempeleng ditempeleng +tempeleng menempeleng +temperamen bertemperamen +temperatur bertemperatur +tempo bertempo +tempuh ditempuh +tempuh ditempuhnya +tempuh menempuh +tempuh menempuhnya +tempuh penempuh +tempur bertempur +tempur penempur +tempur pertempuran +tempur petempur +tempur petempuran +tempur petempurnya +tempurung bertempurung +temu bertemu +temu bertemulah +temu bertemunya +temu betemu +temu ditemu +temu ditemuan +temu ditemui +temu ditemukan +temu ditemukannya +temu ketemu +temu ketemuan +temu ketemukan +temu ketemulah +temu ketemunya +temu menemu +temu menemuan +temu menemui +temu menemukan +temu menemukannya +temu penemu +temu penemuan +temu penemukan +temu penemunya +temu pertemu +temu pertemuan +temu pertemukan +temu petemuan +tenaga bertenaga +tenaga bertenagakan +tenaga ditenagai +tenaga ketenaga +tenaga ketenagaan +tenaga mentenagai +tenak pertenakan +tenak petenak +tenang ditenangkan +tenang ketenangan +tenang menenangi +tenang menenangkan +tenang menenangkannya +tenang penenang +tenang penenangan +tenang setenang +tenar ketenaran +tenar setenar +tenda ditenda +tendang ditendang +tendang ditendangi +tendang ditendangnya +tendang menendang +tendang menendangi +tendang menendangkan +tendang menendangnya +tendang penendang +tendang penendangan +tendang penendangnya +tendang tertendang +tendensi bertendensi +tender ditender +tender ditenderkan +tender menenderkan +teng beteng +teng keteng +teng ketengan +teng meneng +teng menengan +teng menteng +teng peneng +teng pertengan +teng setengan +tengadah menengadah +tengadah menengadahkan +tengah ditengah +tengah ditengahi +tengah ditengahnya +tengah ketengah +tengah menengah +tengah menengahi +tengah menengahkan +tengah menengahnya +tengah penengah +tengah penengahan +tengah penengahnya +tengah pertengah +tengah pertengahan +tengah petengahan +tengah setengah +tengah setengahnya +tengak menengak +tengak penengak +tengak penengakan +tengar ditengari +tengara ditengarai +tengara menengarai +tengas menengaskan +tenggak ditenggak +tenggak ditenggaknya +tenggak menenggak +tenggak menenggaknya +tenggak penenggak +tenggang bertenggang +tenggang menenggang +tenggara ditenggarai +tenggara menenggarai +tenggat ditenggat +tenggelam ditenggelamkan +tenggelam ditenggelamkannya +tenggelam menenggelamkan +tenggelam menenggelamkannya +tenggelam penenggelaman +tengger bertengger +tengger bertenggernya +tengkar bertengkar +tengkar pertengkaran +tengok ditengok +tengok menengok +tengok menengoknya +tenis petenis +tenis petenisnya +tenor bertenor +tensi bertensi +tensi ditensi +tensi petensi +tentakel bertentakel +tentang bertentang +tentang bertentangan +tentang ditentang +tentang ditentangnya +tentang menentang +tentang menentangnya +tentang penentang +tentang penentangan +tentang penentangnya +tentang pertentangan +tentara ketentaraan +tenteng ditenteng +tenteng menenteng +tenteram ketenteraman +tenteram menenteramkan +tenuk menenukan +tenun ditenun +tenun menenun +tenun penenun +tenun penenunan +tenun pertenunan +tenun petenun +teori berteori +tepat bertepatan +tepat ditepati +tepat ketepatan +tepat menepati +tepat menepatkan +tepat penepatan +tepat setepat +tepi bertepi +tepi ditepi +tepi ditepian +tepi ditepikan +tepi menepi +tepi menepikan +tepi menepilah +tepi menepinya +tepi penepi +tepik ditepikan +tepik menepikan +tepis ditepis +tepis ditepisnya +tepis menepis +tepis menepiskan +tepis menepisnya +tepis tertepis +tepuk bertepuk +tepuk ditepuk +tepuk menepuk +tepuk menepukkan +tepung bertepung +ter keteran +ter meneri +ter menter +ter menteri +ter meter +ter meteran +ter meteri +ter meternya +ter pener +ter peter +tera beterai +tera ditera +tera diterakan +tera ketera +tera menerakan +tera meterai +tera peneraan +tera setera +tera tertera +terak diterakan +terak menerakan +teral meneral +terampil keterampilan +teran keteran +teran keteranan +teran meteran +teran meterannya +terang diterangi +terang diterangkan +terang diterangkannya +terang keterang +terang keterangan +terang keterangnya +terang menerangan +terang menerangi +terang menerangkan +terang menerangkannya +terang menterang +terang penerang +terang penerangan +terang seterang +terap diterapi +terap diterapkan +terap diterapkannya +terap menerap +terap menerapan +terap menerapi +terap menerapkan +terap menerapkannya +terap penerap +terap penerapan +terap penerapkan +terapi diterapi +terapi menerapi +teras diteras +teras penterasi +terasi penterasi +terawang diterawang +terawang menerawang +terawang penerawangan +terbang berterbangan +terbang beterbangan +terbang diterbangi +terbang diterbangkan +terbang diterbangkannya +terbang menerbangan +terbang menerbangi +terbang menerbangkan +terbang menerbangkannya +terbang penerbang +terbang penerbangan +terbang penerbangnya +terbit diterbitkan +terbit diterbitkannya +terbit menerbitan +terbit menerbitkan +terbit menerbitkannya +terbit penerbit +terbit penerbitan +terbit penerbitkan +terbit penerbitnya +teri meneri +teri menerikan +teri menteri +teri menterian +teri menterilah +teri menterinya +teri meteri +teriak berteriak +teriak beteriak +teriak diteriakan +teriak diteriaki +teriak diteriakkan +teriak meneriakan +teriak meneriaki +teriak meneriakkan +terik menerikan +terik menerikkan +terik meterik +terika menerika +terika seterika +terima berterima +terima diterima +terima diterimakan +terima diterimanya +terima keterima +terima menerima +terima menerimanya +terima penerima +terima penerimaan +terima penerimanya +terin menterin +tering metering +terjang diterjang +terjang menerjang +terjang menerjangnya +terjemah diterjemahkan +terjemah diterjemahkannya +terjemah menerjemah +terjemah menerjemahkan +terjemah menerjemahkannya +terjemah menterjemahkan +terjemah menterjemahkannya +terjemah penerjemah +terjemah penerjemahan +terjemah penerjemahnya +terjemah penterjemah +terjemah penterjemahan +terjun diterjunkan +terjun diterjunkannya +terjun menerjuni +terjun menerjunkan +terjun penerjun +terjun penerjunan +terjun peterjun +terka diterka +terka menerka +terkam diterkam +terkam diterkamnya +terkam menerkam +terkam menerkamnya +terkam penerkaman +terlalu keterlaluan +terminal diterminal +terminasi diterminasi +terna diternakan +terna perternakan +terna peternakan +terna peternakannya +ternak berternak +ternak beternak +ternak diternak +ternak diternakan +ternak diternakkan +ternak perternak +ternak perternakan +ternak peternak +ternak peternakan +ternak peternaknya +terobos diterobos +terobos menerobos +terobos menerobosnya +terobos penerobos +terobos penerobosan +teropong diteropong +teropong meneropong +teropong peneropongan +teror diteror +teror meneror +teror menerornya +teror menteror +teror meteror +teror peneror +teror peneroran +teror terteror +terpa diterpa +terpa diterpakan +terpa menerpa +terpa menerpakan +terpa menerpanya +tertib ditertibkan +tertib ditertibkannya +tertib ketertiban +tertib menertiban +tertib menertibkan +tertib menertibkannya +tertib mentertibkan +tertib penertib +tertib penertiban +tertib penertibkan +teruk diterukan +terus berterus +terus diteruskan +terus diteruskannya +terus keterusan +terus menerus +terus meneruskan +terus meneruskannya +terus penerus +terus penerusan +terus penerusnya +terus seterusnya +tes dites +tes menes +tes mentes +tetak menetak +tetak penetak +tetangga bertetangga +tetangga bertetanggaan +tetap bertetapan +tetap ditetap +tetap ditetapan +tetap ditetapkan +tetap ditetapkannya +tetap ketetapan +tetap menetap +tetap menetapan +tetap menetapi +tetap menetapkan +tetap menetapkannya +tetap menetapnya +tetap mentetapkan +tetap penetap +tetap penetapan +tetap penetapkan +tetapi menetapi +tetas ditetaskan +tetas menetas +tetas menetaskan +tetas menetasnya +tetas penetas +tetas penetasan +tetek menetek +teter keteter +teter keteteran +teter meneteri +tetes ditetesi +tetes diteteskan +tetes menetes +tetes meneteskan +tetes penetesan +tetes setetes +tewas ditewaskan +tewas menewaskan +tewas menewaskannya +tiada ditiadakan +tiada ditiadakannya +tiada ketiadaan +tiada meniadakan +tiada meniadakannya +tiada peniadaan +tiaga meniagakan +tiam setiaman +tian setian +tian setiani +tiang bertiang +tiap ditiap +tiap setiap +tib ditiban +tib ketiban +tib tertib +tib tertiban +tib tertibkan +tib tertibnya +tiba ketibaan +tiba setiba +tiba setibanya +tiban ditiban +tiban ketiban +tiban tertiban +tidak bertidak +tidak ketidak +tidak menidak +tidak penidakan +tidak setidak +tidak setidaknya +tidur ditiduri +tidur ditidurkan +tidur ketiduran +tidur meniduri +tidur menidurkan +tidur menidurkannya +tidur tertidur +tiga bertiga +tiga ditiga +tiga ketiga +tiga ketiganya +tiga pertiga +tiga pertigaan +tiga pertiganya +tigas ketigas +tigas petigas +tik betik +tik ketik +tik ketikan +tik ketikkan +tik ketiknya +tik menik +tik menikkan +tik mentik +tik metik +tik petik +tik petikan +tika bertikai +tika ketika +tika petikai +tikai bertikai +tikai pertikaian +tikai petikai +tikam ditikam +tikam ditikamnya +tikam menikam +tikam menikamkan +tikam menikamnya +tikam penikam +tikam penikaman +tikam tertikam +tiket bertiket +tikung ditikung +tikung ditikungan +tikung menikung +tilang ditilang +tilang menilang +tilang menilangnya +tilang penilangan +tilang tertilang +tilap ditilap +tilap menilap +tilap penilapan +tilas metilasi +tilas petilasan +tilik ditilik +tilik menilik +tilik penilik +tim beltim +tim ditim +tim setim +tim setimnya +timah pertimahan +timang ditimang +timang menimang +timba ditimba +timba menimba +timba tertimba +timbal bertimbal +timbang ditimbang +timbang ketimbang +timbang ketimbangan +timbang menimbang +timbang menimbangkan +timbang menimbangnya +timbang penimbang +timbang penimbangan +timbang pertimbang +timbang pertimbangan +timbang pertimbangkan +timbang pertimbangnya +timbang petimbangan +timbang setimbang +timbang tertimbang +timbau menimbau +timbel bertimbel +timbil menimbilkan +timbuk menimbukan +timbul ditimbulkan +timbul ditimbulkannya +timbul menimbul +timbul menimbulan +timbul menimbulkan +timbun ditimbun +timbun ditimbuni +timbun menimbun +timbun menimbunnya +timbun penimbun +timbun penimbunan +timbun tertimbun +timbun tertimbunnya +timpa ditimpa +timpa ditimpakan +timpa ketimpa +timpa menimpa +timpa menimpakan +timpa menimpanya +timpa tertimpa +timpal ditimpali +timpal menimpali +timpal setimpal +timpang ketimpangan +timpuk ditimpuk +timpuk ditimpuki +timpuk menimpuk +timpuk menimpuki +timpuk penimpukan +timun ketimun +timun mentimun +timur ditimur +timur ketimuran +timur tertimur +tin bertin +tin bertini +tin metin +tin pentin +tindak bertindak +tindak bertindakan +tindak bertindaklah +tindak bertindaknya +tindak betindak +tindak ditindak +tindak ditindaki +tindak menindak +tindak menindaki +tindak menindaknya +tindak penindak +tindak penindakan +tindak penindakkan +tindas ditindas +tindas menindas +tindas menindasnya +tindas penindas +tindas penindasan +tindas tertindas +tindih ditindih +tindih ketindihan +tindih menindih +tindih menindihnya +tindih tertindih +tindik bertindik +tindik ditindik +tindik menindik +tindik penindikan +ting belting +ting beting +ting keting +ting mening +ting pening +ting penting +ting pentingan +ting pentingkan +ting pentinglah +ting pentingnya +ting peting +ting petingi +ting seting +ting setingan +ting setingi +ting tertingi +tinggal ditinggal +tinggal ditinggali +tinggal ditinggalkan +tinggal ditinggalkannya +tinggal ditinggalnya +tinggal ketinggal +tinggal ketinggalan +tinggal ketinggalkan +tinggal meninggal +tinggal meninggalan +tinggal meninggali +tinggal meninggalkan +tinggal meninggalkannya +tinggal meninggalnya +tinggal peninggalan +tinggal tertinggal +tinggal tertinggalnya +tinggi bertinggi +tinggi ditinggikan +tinggi ketinggi +tinggi ketinggian +tinggi meninggi +tinggi meninggikan +tinggi meningginya +tinggi peninggi +tinggi peninggian +tinggi pentinggi +tinggi pertinggi +tinggi petinggi +tinggi petingginya +tinggi setinggi +tinggi setingginya +tinggi tertinggi +tinggi tertingginya +tingi ketingian +tingi petingi +tingi setingi +tingi tertingi +tingkah bertingkah +tingkah ditingkahi +tingkah pentingkah +tingkat bertingkat +tingkat ditingkat +tingkat ditingkatan +tingkat ditingkatkan +tingkat ditingkatkannya +tingkat ketingkat +tingkat meningkat +tingkat meningkatan +tingkat meningkatkan +tingkat meningkatkannya +tingkat meningkatnya +tingkat peningkat +tingkat peningkatan +tingkat peningkatkan +tingkat pertingkat +tingkat setingkat +tingkat setingkatnya +tinjau ditinjau +tinjau meninjau +tinjau meninjaunya +tinjau peninjau +tinjau peninjauan +tinju bertinju +tinju bertinjunya +tinju ditinju +tinju meninju +tinju meninjunya +tinju peninjuan +tinju petinju +tinju petinjunya +tinta bertinta +tinta meninta +tinting ketinting +tinting meninting +tip ditip +tip ditipkan +tip mentip +tip setip +tipe bertipe +tipe setipe +tipikal bertipikal +tipis ditipiskan +tipis ketipisan +tipis menipis +tipis menipiskan +tipis menipisnya +tipis penipisan +tipis setipis +tipis tertipis +tipis tertipisnya +tipu ditipu +tipu ditipunya +tipu ketipu +tipu menipu +tipu menipunya +tipu penipu +tipu penipuan +tipu tertipu +tir betiri +tir ketir +tir menir +tir meniran +tir petir +tir petirnya +tir setir +tir setirnya +tiran meniran +tiri betiri +tiris ditiriskan +tiris meniriskan +tirta petirtaan +tiru ditiru +tiru ditirukan +tiru ditirunya +tiru meniru +tiru menirukan +tiru menirukannya +tiru menirunya +tiru peniru +tiru peniruan +tirus meniruskan +tis betis +tis betisnya +tis menis +tis penis +tis penisnya +tis petis +tis petisi +titah bertitah +titah dititahkan +titah menitahkan +titel bertitel +titi meniti +titi menitikan +titi peniti +titik bertitik +titik dititik +titik ketitik +titik menitik +titik menitikan +titik menitikkan +titik setitik +titip dititip +titip dititipi +titip dititipkan +titip dititipkannya +titip menitip +titip menitipkan +titip menitipkannya +titip penitip +titip penitipan +tiup bertiup +tiup bertiupnya +tiup ditiup +tiup ditiupkan +tiup ditiupnya +tiup meniup +tiup meniupkan +tiup meniupnya +tiup peniup +tiup peniupan +tiup tertiup +to berto +to beto +to dito +to ditolah +to keto +to ketokan +to meno +to menolah +to meto +to peno +to peto +to seto +todak menodakan +todong ditodong +todong ditodongkan +todong menodong +todong menodongkan +todong menodongkannya +todong menodongnya +todong penodong +todong penodongan +togok petogokan +tohok menohok +tohok tertohok +tok betok +tok ketok +tok ketokan +tok menok +tok mentok +tok mentoknya +tok petok +tok setok +toko ditoko +toko pertokoan +tokoh ditokohkan +tokoh ketokohan +tokoh menokohkan +tokoh penokohan +tol ketol +tol mentol +tol pentol +tol pentolan +tolak bertolak +tolak bertolaknya +tolak ditolak +tolak ditolaknya +tolak menolak +tolak menolakan +tolak menolaknya +tolak penolak +tolak penolakan +tolak penolakkan +tolak tertolak +tolan pentolan +tolan pentolannya +toleh menoleh +toleh menolehkan +toleransi bertoleransi +toleransi ditoleransi +toleransi menoleransi +toleransi menoleransinya +toleransi mentoleransi +tolol ketololan +tolong ditolong +tolong ditolongnya +tolong ketolong +tolong menolong +tolong menolongnya +tolong penolong +tolong penolongnya +tolong pertolongan +tolong petolongan +tolong tertolong +tombak ditombak +tombak ditombaki +tombak menombak +tombok ditomboki +tombok menombok +tombok menomboki +ton belton +ton berton +ton bertoni +ton beton +ton betonnya +ton keton +ton menon +ton menton +ton pelton +ton perton +ton seton +tonase bertonase +tong betong +tong menong +tong petong +tongkat bertongkat +tongkrong ditongkrongi +tonjok ditonjok +tonjok menonjok +tonjol ditonjolkan +tonjol menonjol +tonjol menonjolkan +tonjol menonjolnya +tonjol penonjolan +tonton ditonton +tonton ditontonkan +tonton ditontonnya +tonton menonton +tonton menontonnya +tonton penonton +tonton penontonnya +tonton pentonton +tonton pertontonkan +top bertopi +top setop +topang bertopang +topang ditopang +topang menopang +topang menopangkan +topang menopangnya +topang penopang +topang penopangnya +topang tertopang +topeng bertopeng +topi bertopi +topik bertopik +toreh ditoreh +toreh ditorehkan +toreh ditorehkannya +toreh ditorehnya +toreh menoreh +toreh menorehkan +toreh menorehkannya +toreh penoreh +toreh tertoreh +torpedo ditorpedo +torpedo menorpedo +torpedo mentorpedo +tos bertos +tos menos +tos mentos +toyor ditoyor +toyor menoyor +tra metra +tra petra +tra setra +tradisi bertradisi +tradisi ditradisikan +tradisi mentradisi +tradisi mentradisikan +tragis setragis +traktir ditraktir +traktir menraktir +traktir mentraktir +transaksi bertransaksi +transaksi ditransaksi +transaksi ditransaksikan +transaksi mentransaksikan +transfer ditransfer +transfer ditransferkan +transfer ditransfernya +transfer menransfer +transfer mentransfer +transfer mentransferkan +transfer mentransfernya +transfer pentransferan +transformasi bertransformasi +transformasi ditransformasi +transformasi ditransformasikan +transformasi mentransformasi +transformasi mentransformasikan +transfusi ditransfusi +transfusi ditransfusikan +transisi bertransisi +transkrip ditranskrip +transkrip mentranskrip +translasi mentranslasikan +transmigrasi bertransmigrasi +transmigrasi ditransmigrasikan +transmigrasi ketransmigrasian +transmisi bertransmisi +transmisi ditransmisi +transmisi ditransmisikan +transmisi mentransmisi +transmisi mentransmisikan +transparan setransparan +transplantasi ditransplantasi +transplantasi ditransplantasikan +transplantasi mentransplantasi +transplantasi mentransplantasikan +transportasi bertransportasi +transportasi ditransportasikan +transportasi mentransportasikan +trayek bertrayek +tres ditres +tres metres +trik metrik +trip setrip +tros petros +truk petruk +truk setruk +trusa penrusakan +tsar pensaran +tua dituai +tua dituakan +tua ketua +tua ketuaan +tua ketuai +tua ketuanya +tua menua +tua menuai +tua menuanya +tua penuaan +tua penuai +tua setua +tua tertua +tua tertuanya +tuah bertuah +tuah betuah +tuah petuah +tuah petuahnya +tuai dituai +tuai ketuai +tuai menuai +tuai menuaikan +tuai penuai +tuak dituakan +tualang bertualang +tualang pertualangan +tualang petualang +tualang petualangan +tuam ketuam +tuan bertuan +tuan ketuan +tuan penuan +tuang dituang +tuang dituangi +tuang dituangkan +tuang dituangkannya +tuang menuang +tuang menuangkan +tuang menuangkannya +tuang penuangan +tuang tertuang +tuas petuas +tuban ketuban +tuban ketubannya +tube metube +tubi bertubi +tubruk bertubrukan +tubruk ditubruk +tubruk menubruk +tubruk menubrukkan +tubuh bertubuh +tubuh ditubuh +tubuh ditubuhnya +tubuh pertubuhan +tubuh setubuhi +tuding dituding +tuding ditudingkan +tuding ditudingnya +tuding menuding +tuding menudingkan +tuding menudingnya +tuding penuding +tuduh dituduh +tuduh dituduhkan +tuduh dituduhkannya +tuduh dituduhnya +tuduh menuduh +tuduh menuduhkan +tuduh menuduhnya +tuduh penuduh +tuduh penuduhan +tuduh penuduhnya +tuduh tertuduh +tudung bertudung +tugas bertugas +tugas bertugasnya +tugas betugas +tugas ditugas +tugas ditugasi +tugas ditugaskan +tugas ditugaskannya +tugas menugasi +tugas menugaskan +tugas menugaskannya +tugas penugas +tugas penugasan +tugas pertugas +tugas petugas +tugas petugasnya +tuhu setuhu +tui menui +tui setui +tuji menuji +tuju bertujuan +tuju betujuan +tuju dituju +tuju ditujuan +tuju ditujukan +tuju ditujukannya +tuju ditujunya +tuju menuju +tuju menujukan +tuju penujukan +tuju pertujukan +tuju setuju +tuju setujuan +tuju setujui +tuju setujulah +tuju setujunya +tuju tertuju +tujuh bertujuh +tujuh ditujuh +tujuh ketujuh +tujuh ketujuhnya +tuk betuk +tuk ketuk +tuk ketukan +tuk mentukan +tuk menuk +tuk menukan +tuk pentuk +tukal penukal +tukang bertukang +tukang ditukangi +tukang menukangi +tukang pertukangan +tukang petukangan +tukar bertukar +tukar bertukaran +tukar ditukar +tukar ditukarkan +tukar ditukarnya +tukar menukar +tukar menukarkan +tukar menukarkannya +tukar menukarnya +tukar penukar +tukar penukaran +tukar pertukaran +tukar petukaran +tukar tertukar +tukar tertukarnya +tukas menukas +tukik menukik +tukik menukiknya +tukil menukil +tukung menukung +tulang bertulang +tulang petulangan +tulang setulang +tular ditulari +tular ditularkan +tular ditularkannya +tular ketularan +tular menular +tular menulari +tular menularkan +tular menularkannya +tular menularnya +tular penular +tular penularan +tular tertular +tular tertulari +tular tertularnya +tuli ketulian +tulis bertulis +tulis bertulisan +tulis bertuliskan +tulis betuliskan +tulis ditulis +tulis ditulisi +tulis dituliskan +tulis dituliskannya +tulis ditulisnya +tulis menulis +tulis menulisi +tulis menuliskan +tulis menuliskannya +tulis menulisnya +tulis penulis +tulis penulisan +tulis penulisnya +tulis tertulis +tulis tertuliskan +tulis tertulisnya +tulus ketulusan +tulus setulus +tulus setulusnya +tum ketum +tum ketumnya +tum menuman +tum penum +tuman menuman +tumang penumang +tumbal ditumbalkan +tumbal menumbalkan +tumbang bertumbangan +tumbang ditumbangkan +tumbang menumbang +tumbang menumbangkan +tumbang menumbangkannya +tumbang penumbang +tumbang penumbangan +tumbu bertumbukan +tumbu menumbukan +tumbu pertumbuan +tumbu setumbu +tumbuh bertumbuh +tumbuh bertumbuhan +tumbuh bertumbuhnya +tumbuh ditumbuh +tumbuh ditumbuhi +tumbuh ditumbuhkan +tumbuh menumbuh +tumbuh menumbuhan +tumbuh menumbuhkan +tumbuh menumbuhkannya +tumbuh penumbuh +tumbuh penumbuhan +tumbuh pertumbuh +tumbuh pertumbuhan +tumbuh petumbuhan +tumbuk bertumbukan +tumbuk ditumbuk +tumbuk menumbuk +tumbuk menumbukan +tumbuk menumbuknya +tumbuk penumbuk +tumbuk tertumbuk +tumbung pertumbungan +tumis ditumis +tumis menumis +tumit bertumit +tumpah bertumpah +tumpah ditumpahkan +tumpah ketumpahan +tumpah menumpahkan +tumpah menumpahkannya +tumpah penumpahan +tumpah pertumpahan +tumpah tertumpah +tumpal betumpal +tumpang bertumpang +tumpang ditumpang +tumpang ditumpangi +tumpang ditumpangkan +tumpang menumpang +tumpang menumpangi +tumpang menumpangkan +tumpang penumpang +tumpang penumpangan +tumpang penumpangnya +tumpas ditumpas +tumpas menumpas +tumpas menumpaskan +tumpas menumpasnya +tumpas penumpas +tumpas penumpasan +tumpu bertumpu +tumpu bertumpukan +tumpu ditumpukan +tumpu menumpu +tumpu menumpukan +tumpu penumpukan +tumpu setumpukan +tumpu tertumpu +tumpuk bertumpuk +tumpuk bertumpukan +tumpuk bertumpuknya +tumpuk ditumpuk +tumpuk ditumpukan +tumpuk ditumpuki +tumpuk menumpuk +tumpuk menumpukan +tumpuk menumpukkan +tumpuk menumpuknya +tumpuk penumpukan +tumpuk penumpukkan +tumpuk setumpuk +tumpuk setumpukan +tumpuk tertumpuk +tumpul ketumpulan +tumpul menumpul +tumpul menumpulkan +tumu menumukan +tun betun +tun pertuni +tuna ketunaan +tuna menunai +tunai ditunaikan +tunai ditunaikannya +tunai menunai +tunai menunaikan +tunai menunaikannya +tunang bertunangan +tunang pertunangan +tunang petunang +tunas bertunas +tunda ditunda +tunda ditundanya +tunda menunda +tunda menundanya +tunda penunda +tunda penundaan +tunda tertunda +tunda tertundanya +tundang menundang +tunduk ditundukan +tunduk ditundukkan +tunduk ketundukan +tunduk menunduk +tunduk menundukan +tunduk menundukkan +tunduk tertunduk +tung betung +tung betungan +tung pentung +tung pentungan +tung petung +tungau ketungau +tunggak ditunggak +tunggak menunggak +tunggak menunggaknya +tunggak penunggak +tunggak penunggakan +tunggak tertunggak +tunggak tertunggaknya +tunggal ketunggalan +tunggang ditunggangi +tunggang menunggang +tunggang menunggangi +tunggang penunggang +tunggang penunggangan +tunggang penunggangnya +tungging menungging +tunggu ditunggu +tunggu ditunggui +tunggu ditunggunya +tunggu menunggu +tunggu menunggui +tunggu menunggunya +tunggu penunggu +tunggu penunggunya +tunggul menunggul +tunggul menungguli +tungkap menungkap +tungkap menungkapkan +tungkap penungkapan +tungkul penungkulan +tunjam menunjam +tunjam penunjaman +tunjang ditunjang +tunjang menunjang +tunjang menunjangnya +tunjang penunjang +tunjang penunjangnya +tunjuk ditunjuk +tunjuk ditunjukan +tunjuk ditunjukkan +tunjuk ditunjukkannya +tunjuk ditunjuklah +tunjuk ditunjuknya +tunjuk menunjuk +tunjuk menunjukan +tunjuk menunjukkan +tunjuk menunjukkannya +tunjuk menunjuknya +tunjuk pentunjuk +tunjuk penunjuk +tunjuk penunjukan +tunjuk penunjukkan +tunjuk penunjukkannya +tunjuk pertunjukan +tunjuk pertunjukkan +tunjuk pertunjukkannya +tunjuk petunjuk +tunjuk petunjukan +tunjuk petunjuknya +tunjung menunjung +tunjung menunjungi +tunjung penunjung +tuntas dituntaskan +tuntas dituntaskannya +tuntas ketuntasan +tuntas mentuntaskan +tuntas menuntas +tuntas menuntaskan +tuntas menuntaskannya +tuntas penuntas +tuntas penuntasan +tuntas tertuntaskan +tuntun dituntun +tuntun menuntun +tuntun menuntunnya +tuntun penuntun +tuntun penuntunan +tuntut dituntut +tuntut dituntutkan +tuntut dituntutnya +tuntut menuntut +tuntut menuntutnya +tuntut penuntut +tuntut penuntutan +tuntut penuntutnya +tunu menunu +tunu menunukan +tur menturkan +tur menur +tur perturan +tur seturan +turap diturap +turap penurapan +turas peturasan +turnamen diturnamen +turun diturun +turun diturunan +turun dituruni +turun diturunkan +turun diturunkannya +turun keturunan +turun menurun +turun menurunan +turun menuruni +turun menurunkan +turun menurunkannya +turun menurunnya +turun penurun +turun penurunan +turun penurunkan +turus menurus +turus menuruskan +turut berturut +turut berturutan +turut dituruti +turut menurut +turut menuruti +turut menurutkan +turut menurutnya +turut penurut +turut seturut +tus bertus +tus ketus +tus ketusnya +tus memtuskan +tus menus +tus pentus +tus penus +tusuk ditusuk +tusuk ditusukkan +tusuk menusuk +tusuk menusukan +tusuk menusukkan +tusuk menusukkannya +tusuk menusuknya +tusuk penusuk +tusuk penusukan +tusuk tertusuk +tutu betutu +tutu menutu +tutu menutukan +tutuk menutukan +tutur bertutur +tutur dituturkan +tutur dituturkannya +tutur menutur +tutur menuturkan +tutur menuturkannya +tutur menuturnya +tutur penutur +tutur penuturan +tutur penuturnya +tutut ditutut +tutut menutut +tutut penutut +tutut penututan +ua keua +ua memuai +ua menua +ua menuai +ua menuanya +ua penguakan +ua penuaan +ua penuai +ua seuai +ua terua +uai memuai +uai menuai +uai menuaikan +uai pemuaian +uai penuai +uai seuai +uak memuakkan +uak menguak +uak menguaknya +uak penguak +uak penguakan +uan peluan +uan penuan +uang beruang +uang beruangnya +uang diuangkan +uang keuangan +uang menguangkan +uang menuang +uang menuangkan +uang menuangkannya +uang peluang +uang peluangan +uang peluangnya +uang penguangan +uang penuangan +uang peuang +uap beruap +uap diuapkan +uap menguap +uap menguapi +uap menguapkan +uap menguapnya +uap menyuap +uap menyuapi +uap menyuapkan +uap menyuapnya +uap penguapan +uap penyuap +uap penyuapan +uap penyuapnya +uar keuar +uar menguar +uar menguarkan +uba beruba +uba perubaan +ubah berubah +ubah berubahan +ubah berubahlah +ubah berubahnya +ubah beubah +ubah diubah +ubah diubahnya +ubah mengubah +ubah mengubahnya +ubah pengubah +ubah pengubahan +ubah perubah +ubah perubahan +ubah peubahan +uban beruban +ubang diubang +ubang pelubang +ubang pelubangan +ubar mengubar +ubel meubel +uber diuber +uber menguber +ubrak-abrik mengubrak-abrik +ubung mengubungi +ubung mengubungkan +ubung pengubung +ucap berucap +ucap diucap +ucap diucapkan +ucap diucapkannya +ucap mengucap +ucap mengucapan +ucap mengucapkan +ucap mengucapkannya +ucap pengucapan +ucap terucap +ucap terucapkan +ucek mengucek +uda keuda +uda memuda +uda memudakan +uda menuda +uda pemuda +uda pemudanya +uda penudaan +udak memudakan +udang diudang +udang mengudang +udang perudangan +udap mengudap +udar memudar +udar memudarkan +udar memudarnya +udar pemudaran +udara berudara +udara diudara +udara diudarakan +udara keudara +udara mengudara +udara mengudarakan +ude keude +udi pemudi +udik pemudik +udik pemudiknya +udu berudu +uduh menguduh +uduh menuduh +uduh menuduhkan +uduh menuduhnya +uduh penuduh +uduh penuduhan +uduh penuduhnya +uduk menudukkan +udut menyudut +udut menyudutkan +udut menyudutkannya +udut penyudutan +ugut pemugutan +uh memuhi +uh menuhi +uh peluh +uh penuh +uh penuhi +uh penuhlah +uh penuhnya +uh peruh +uit peluit +uit peluitnya +ujang menujang +ujar berujar +ujar diujarkan +ujar pengujaran +uji beruji +uji diuji +uji diujikan +uji diujinya +uji memuji +uji memujinya +uji menguji +uji mengujikan +uji mengujinya +uji menuji +uji penguji +uji pengujian +uji pengujinya +uji teruji +uju berujuan +uju memuju +uju menuju +uju menujukan +uju meuju +uju pengujuan +uju penujukan +uju perujukan +ujud berujud +ujud memujudkan +ujuk berujuk +ujuk menujuk +ujuk menujukan +ujuk menujukkan +ujuk pengujuk +ujuk penujukan +ujuk penujukkan +ujuk perujukan +ujung berujung +ujung diujung +ujung diujungnya +ujung mengujungi +ujung pengujung +ujung seujung +ujung terujung +ukas menukas +ukik menukik +ukik menukiknya +ukir berukir +ukir berukiran +ukir diukir +ukir diukirkan +ukir diukirnya +ukir mengukir +ukir mengukirkan +ukir mengukirnya +ukir pengukir +ukir pengukiran +ukir terukir +ukup menyukupi +ukur berukuran +ukur diukur +ukur diukurnya +ukur mengukur +ukur mengukurnya +ukur menyukur +ukur menyukuri +ukur pengukur +ukur pengukuran +ukur seukuran +ukur terukur +ukur terukurnya +ulah berulah +ulam menyulam +ulam penyulam +ulam penyulaman +ulama keulamaan +ulang belulang +ulang belulangnya +ulang berulang +ulang berulangnya +ulang diulang +ulang diulangi +ulang diulangnya +ulang memulangkan +ulang memulangkannya +ulang mengulang +ulang mengulangi +ulang mengulangnya +ulang pemulang +ulang pemulangan +ulang pengulangan +ulang penyulang +ulang perulangan +ulang terulang +ulang terulangi +ulang terulangnya +ular mengular +ular mengularnya +ular menular +ular menulari +ular menularkan +ular menularkannya +ular menularnya +ular penular +ular penularan +ulas diulas +ulas memulas +ulas memulaskan +ulas memulasnya +ulas mengulas +ulas mengulasnya +ulas pemulas +ulas pengulas +ulas pengulasan +ulas seulas +ulat berulat +ulek diulek +ulek mengulek +ulen diuleni +ulen menguleni +ulet keuletan +ulik diulik +ulik memuliki +ulik mengulik +ulik menguliknya +uling mengulingkan +uling menyuling +uling penyuling +uling penyulingan +ulir berulir +ulir mengulirkan +ulit menguliti +ulit menyulitkan +ulit menyulitkannya +ulit penyulit +ultimatum diultimatum +ultimatum mengultimatum +ulung memulung +ulung pemulung +ulur diulur +ulur diulurkan +ulur mengulur +ulur mengulurkan +ulur menulurkan +ulur penguluran +ulur terulur +um belum +um belumlah +um belumnya +um beum +um beumi +um keum +um mengumkan +um menuman +um penguman +um penum +um perum +um seumlah +uma beluma +uma belumai +uma seuma +uma teruma +uman menuman +uman penguman +umat keumatan +umbai berumbai +umbang menumbang +umbang menumbangkan +umbang menumbangkannya +umbang menyumbang +umbang menyumbangan +umbang menyumbangkan +umbang menyumbangkannya +umbang penumbang +umbang penumbangan +umbang penyumbang +umbang penyumbangnya +umbar diumbar +umbar diumbarnya +umbar mengumbar +umbar mengumbarnya +umbar terumbar +umbra penumbra +umbu menumbukan +umbu terumbu +umbuk menumbuk +umbuk menumbukan +umbuk menumbuknya +umbuk penumbuk +umbul menumbulkan +umi beumi +umi memumikan +umpak mengumpakan +umpama diumpamakan +umpama mengumpamakan +umpama mengumpamakannya +umpama perumpamaan +umpama seumpama +umpama seumpamanya +umpan diumpan +umpan diumpankan +umpan mengumpan +umpan mengumpankan +umpan mengumpankannya +umpan mengumpannya +umpan pengumpan +umpan penumpan +umpat mengumpat +umpuk mengumpukan +umpuk menumpuk +umpuk menumpukan +umpuk menumpukkan +umpuk menumpuknya +umpuk penumpukan +umpuk penumpukkan +umput berumput +umrah berumrah +umu diumukan +umu mengumukan +umu menumukan +umu pengumuan +umuk diumukan +umuk mengumukan +umuk menumukan +umum diumumkan +umum diumumkannya +umum mengumuman +umum mengumumkan +umum mengumumkannya +umum menumumkan +umum pengumuman +umum pengumumkan +umun diumunkan +umun mengumunkan +umun pengumunan +umur berumur +umur diumur +umur seumur +umur seumuran +umur seumurnya +uncang menguncang +unda menunda +unda menundanya +unda penunda +unda penundaan +undak berundak +undan penundan +undang diundang +undang diundangan +undang diundangkan +undang diundangkannya +undang diundangnya +undang mengundang +undang mengundangkan +undang mengundangnya +undang menundang +undang pengundang +undang pengundangan +undang pengundangnya +undang perundang +undang perundangan +undi diundi +undi mengundi +undi pengundian +undi terundi +unduh diunduh +unduh diunduhnya +unduh mengunduh +unduh mengunduhnya +unduh menunduh +unduh pengunduh +unduh pengunduhan +unduh pengunduhnya +unduh terunduh +undur diundur +undur diundurkan +undur diundurnya +undur memundurkan +undur memundurkannya +undur mengundur +undur mengunduran +undur mengundurkan +undur mengundurnya +undur pemunduran +undur pengunduran +undur pengundurkan +undur-undur diundur-undur +undur-undur mengundur-undur +unggal diunggal +unggal keunggalan +unggas perunggasan +unggul diunggulan +unggul diungguli +unggul diunggulkan +unggul diunggulkannya +unggul keunggulan +unggul mengungguli +unggul mengunggulkan +unggul menunggul +unggul menungguli +unggul terunggul +unggut memunggut +unggut pemunggutan +ungka mengungkakan +ungkak mengungkakan +ungkal berungkali +ungkal penungkal +ungkap diungkap +ungkap diungkapan +ungkap diungkapkan +ungkap diungkapkannya +ungkap diungkapnya +ungkap mengungkap +ungkap mengungkapan +ungkap mengungkapkan +ungkap mengungkapkannya +ungkap mengungkapnya +ungkap menungkap +ungkap menungkapkan +ungkap pengungkap +ungkap pengungkapan +ungkap pengungkapkan +ungkap penungkapan +ungkap terungkap +ungkap terungkapkan +ungkap terungkaplah +ungkap terungkapnya +ungkit diungkit +ungkit mengungkit +ungkit mengungkitnya +ungkit pengungkit +ungkul penungkulan +ungkur menyungkurkan +ungsi diungsikan +ungsi mengungsi +ungsi mengungsikan +ungsi mengungsinya +ungsi pengungsi +ungsi pengungsian +ungsi pengungsinya +ungu keunguan +ungu menungu +ungu perungu +uni keunikan +uni keunikannya +uni penguni +unik keunikan +unik keunikkan +unik seunik +unik terunik +unit perunit +unit seunit +unjuk berunjuk +unjuk memunjukkan +unjuk menunjuk +unjuk menunjukan +unjuk menunjukkan +unjuk menunjukkannya +unjuk menunjuknya +unjuk meunjukkan +unjuk pengunjuk +unjuk penunjuk +unjuk penunjukan +unjuk penunjukkan +unjuk penunjukkannya +unjung berunjung +unjung mengunjung +unjung mengunjungi +unjung menunjung +unjung menunjungi +unjung pengunjung +unjung pengunjungnya +unjung penunjung +unsur berunsur +unta seuntai +untai seuntai +unti menyuntikan +unti menyuntikannya +unti penyuntikan +unting menyunting +unting penyunting +unting penyuntingan +untir memuntir +untuk beruntuk +untuk menuntuk +untuk peruntukan +untuk peruntukkan +untuk peruntukkannya +untuk teruntuk +untun beruntun +untun beruntunnya +untun menuntun +untun menuntunnya +untun penuntun +untun penuntunan +untut beruntut +untut menuntut +untut menuntutnya +untut penuntut +untut penuntutan +untut penuntutnya +unyai memunyai +upa berupa +upa berupakan +upa meupakan +upa pelupa +upa perupa +upa perupakan +upacara diupacarai +upah berupah +upah diupah +upah diupahi +upah mengupah +upah pengupahan +upak berupakan +upak meupakan +upak perupakan +upas mengupas +upas mengupasnya +upas pengupas +upas pengupasan +upaya berupaya +upaya diupayakan +upaya diupayakannya +upaya mengupayakan +upaya mengupayakannya +upaya pengupayaan +upil mengupil +urah memurahkan +urah meurah +urah pemurah +urai berurai +urai diurai +urai diuraikan +urai diuraikannya +urai mengurai +urai menguraikan +urai menguraikannya +urai mengurainya +urai pengurai +urai penguraian +urai terurai +urai terurainya +urang mengurang +urang mengurangi +urang mengurangkan +urang pengurang +urang pengurangan +urang pengurangi +urap penurapan +uras menguras +uras mengurasi +uras mengurasnya +uras penguras +uras pengurasan +urat berurat +urat menyurat +urat menyurati +urat menyuratkan +urat menyuratnya +uri peruri +uruk diuruk +uruk menguruk +uruk menurukan +uruk pengurukan +urun mengurunkan +urun menurun +urun menurunan +urun menuruni +urun menurunkan +urun menurunkannya +urun menurunnya +urun meurunkan +urun penurun +urun penurunan +urun penurunkan +urung diurungkan +urung diurungkannya +urung mengurung +urung mengurungi +urung mengurungkan +urung mengurungkannya +urung mengurungnya +urung menurung +urung pemurung +urung pengurungan +urus berurusan +urus diurus +urus diurusi +urus diuruskan +urus diurusnya +urus keurus +urus mengurus +urus mengurusi +urus menguruskan +urus mengurusnya +urus menurus +urus menuruskan +urus pelurus +urus pelurusan +urus pemurus +urus pengurus +urus pengurusan +urus pengurusnya +urus terurus +urut berurut +urut berurutan +urut diurut +urut diurutan +urut diurutkan +urut keurutan +urut memurut +urut mengurut +urut mengurutkan +urut mengurutkannya +urut menurut +urut menuruti +urut menurutkan +urut menurutnya +urut menyurut +urut menyurutkan +urut meurut +urut pengurutan +urut penurut +urut penyurutan +usah berusah +usah berusahan +usah diusahkan +usah menyusahkan +usah pengusah +usah pengusahan +usah perusahan +usaha berusaha +usaha berusahaan +usaha berusahalah +usaha diusahakan +usaha diusahakannya +usaha mengusaha +usaha mengusahakan +usaha mengusahakannya +usaha pengusaha +usaha pengusahaan +usaha pengusahanya +usaha perusaha +usaha perusahaan +usaha peusahaan +usai berusai +usai mengusai +usai seusai +usai seusainya +usak perusak +usak perusakan +usak perusakkan +usak perusaknya +usang peusangan +usap diusap +usap diusapkan +usap mengusap +usap mengusapkan +usap mengusapkannya +usap mengusapnya +usar peusar +usat memusat +usat memusatkan +usat memusatkannya +usat pemusatan +usia berusia +usia beusia +usia diusia +usia diusianya +usia menusia +usia seusia +usia seusianya +usik diusik +usik mengusik +usik mengusiknya +usik pemusik +usik terusik +usik terusiknya +usil diusili +usil keusilan +usil mengusili +usir diusir +usir diusirnya +usir mengusir +usir mengusirnya +usir pengusir +usir pengusiran +usir terusir +usir terusirnya +uskup keuskupan +usuk menusuk +usuk menusukan +usuk menusukkan +usuk menusukkannya +usuk menusuknya +usuk menyusuk +usuk penusuk +usuk penusukan +usul diusul +usul diusulkan +usul diusulkannya +usul mengusul +usul mengusulan +usul mengusulkan +usul mengusulkannya +usul menyusul +usul menyusulkan +usul menyusulnya +usul pengusul +usul pengusulan +usul pengusulnya +usung diusung +usung diusungkan +usung diusungnya +usung mengusung +usung mengusungkan +usung mengusungnya +usung pengusung +usung pengusungan +usung pengusungnya +usur mengusur +usur menyusur +usur menyusuri +usur pengusuran +usur penyusuran +usus berususan +usut diusut +usut diusutnya +usut mengusut +usut mengusutnya +usut menyusut +usut menyusutkan +usut menyusutnya +usut pengusut +usut pengusutan +usut penyusutan +utak-atik diutak-atik +utak-atik mengutak-atik +utak-atik mengutak-atiknya +utama diutamakan +utama diutamakannya +utama keutamaan +utama mengutamakan +utama pengutamaan +utama terutama +utama terutamanya +utang berutang +utang diutangi +utang mengutang +utang mengutangi +utang pengutang +utang terutang +utang terutangnya +utara diutarakan +utara diutarakannya +utara mengutarakan +utara mengutarakannya +utas memutasi +utas menutaskan +utas seutas +utik beutik +utuh keutuhan +utuh memutuhkan +utuh seutuhnya +utus diutus +utus diutusnya +utus memutus +utus memutusan +utus memutuskan +utus memutuskannya +utus memutusnya +utus mengutus +utus mengutusnya +utus menutuskan +utus pemutus +utus pemutusan +utus pengutusan +utus perutusan +vak pervak +vaksin divaksin +vaksin memvaksin +vaksin memvaksinkan +vaksinasi divaksinasi +vaksinasi memvaksinasi +vakum kevakuman +valid kevalidan +variasi bervariasi +variasi bervariasinya +variasi divariasikan +variasi memvariasikan +variatif bervariatif +vas divas +vas kevas +vasektomi divasektomi +ve dive +ve seve +vegetasi bervegetasi +ventilasi berventilasi +verifikasi diverifikasi +verifikasi memverifikasi +verifikasi memverifikasinya +verifikasi menverifikasi +verifikasi meverifikasi +verifikasi terverifikasi +versi diversi +veto diveto +veto memveto +veto memvetonya +vide divide +video bervideo +video divideokan +video memvideokan +vila sevila +virus bervirus +visi bervisi +visi divisi +visi divisinya +visi sevisi +visual memvisualkan +visualisasi divisualisasikan +visualisasi memvisualisasi +visualisasi memvisualisasikan +visualisasi memvisualisasikannya +visum divisum +visum memvisum +vitamin bervitamin +voli pevoli +voltase bervoltase +volume bervolume +vonis divonis +vonis divonisnya +vonis memvonis +vonis memvonisnya +vonis menvonis +vonis tervonis +wa diwa +wa menwa +wa mewa +wa perwa +wa sewa +wa sewaan +wa sewakan +wa sewanya +wabah mewabah +wabah mewabahnya +wacana berwacana +wacana diwacanakan +wacana mewacanakan +wadah berwadah +wadah diwadahi +wadah mewadahi +wadah terwadahi +wah mewah +wah mewahnya +wahid terwahid +wajah berwajah +wajah diwajah +wajah diwajahnya +wajah perwajahan +wajar diwajarkan +wajar kewajaran +wajar mewajari +wajar mewajarkan +wajar sewajar +wajar sewajarnya +wajib berwajib +wajib diwajibkan +wajib diwajibkannya +wajib kewajiban +wajib mewajibkan +wajib mewajibkannya +wajib sewajibnya +wak diwak +wak sewakan +wakaf berwakaf +wakaf diwakafkan +wakaf mewakafkan +wakil diwakil +wakil diwakili +wakil diwakilkan +wakil mewakil +wakil mewakili +wakil mewakilkan +wakil mewakilkannya +wakil perwakilan +wakil pewakilan +wakil terwakili +wakil terwakilkan +walah kewalahan +wali diwali +wali perwali +wali perwalian +wan diwan +wan sewan +wana berwana +wang mewangi +wang pewangi +wang sewangi +wangi mewangi +wangi pewangi +wangi sewangi +wanita kewanitaan +wanti-wanti diwanti-wanti +wanti-wanti mewanti-wanti +wara perwara +waralaba diwaralabakan +waralaba mewaralabakan +waralaba pewaralaba +waras kewarasan +warga berwarga +warga kewarga +warga kewargaan +waris diwarisi +waris diwariskan +waris diwariskannya +waris mewarisi +waris mewariskan +waris mewariskannya +waris pewaris +waris pewarisan +waris pewarisnya +warna berwarna +warna bewarna +warna diwarna +warna diwarnai +warna mewarna +warna mewarnai +warna perwarna +warna pewarna +warna pewarnaan +warna pewarnanya +warna sewarna +warna-warni berwarna-warni +warta diwartakan +warta mewartakan +warta pewarta +warta pewartaan +wartawan kewartawanan +wasiat berwasiat +wasiat diwasiatkan +wasiat mewasiatkan +wasit diwasiti +wasit mewasiti +wasit perwasitan +waspada berwaspada +waspada diwaspadai +waspada kewaspadaan +waspada mewaspada +waspada mewaspadai +watak berwatak +watan perwatan +watt perwatt +wawancara diwawancara +wawancara diwawancarai +wawancara mewawancara +wawancara mewawancarai +wawancara pewawancara +wawas berwawasan +wayang perwayangan +wayang pewayangan +we sewe +wenang berwenang +wenang berwenangan +wenang bewenang +wenang kewenang +wenang kewenangan +wenang sewenang +wibawa berwibawa +wibawa kewibawaan +wilayah berwilayah +wilayah diwilayah +wilayah diwilayahnya +wilayah kewilayah +wilayah kewilayahan +wilayah perwilayah +wilayah perwilayahan +wilayah sewilayah +windu sewindu +wing sewing +wira berwira +wira perwira +wira perwiranya +wiraswasta berwiraswasta +wiraswasta kewiraswastaan +wisata berwisata +wisuda diwisuda +wisuda mewisuda +wol sewol +wosi perwosi +wudu berwudu +wujud berwujud +wujud diwujudkan +wujud diwujudkannya +wujud menwujudkan +wujud mewujud +wujud mewujudkan +wujud mewujudkannya +wujud perwujudan +wujud pewujudan +wujud terwujud +wujud terwujudkan +wujud terwujudlah +wujud terwujudnya +wulan sewulan +ya diya +ya keya +ya menya +ya menyakan +ya menyalah +ya penyalah +ya peryaan +yakin diyakin +yakin diyakini +yakin diyakinkan +yakin keyakinan +yakin menyakini +yakin menyakinkan +yakin meyakin +yakin meyakinan +yakin meyakini +yakin meyakinkan +yakin meyakinkannya +yakin penyakin +yakin seyakin +yakin teryakinkan +yakis menyakiskan +yakni diyakni +yakni meyakni +yakut menyakut +yang menyangi +yang menyangkan +yang penyang +yang peyang +ye beye +ye menyelah +yodium beryodium +yoga beryoga +yoga peyoga +yogia seyogianya +yosong menyosong +zakat berzakat +zalim dizalimi +zalim kezaliman +zalim menzalimi +zalim penzaliman +zalim terzalimi +zaman sezaman +ziarah berziarah +ziarah diziarahi +ziarah menziarahi +ziarah penziarah +ziarah peziarah +ziarah peziarahan +zikir berzikir +zina berzina +zina perzinaan +zina pezina +zodiak berzodiak +""" + +LOOKUP = {} +for line in ID_BASE_LEMMA.strip().split('\n'): + lemma, word = line.strip().split() + LOOKUP[word] = lemma From bbc75da38d4b3d7e65f992c18be0d55983f74d49 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 27 Jul 2017 10:51:15 +0700 Subject: [PATCH 073/739] enable syntax iterator and lemma lookup --- spacy/lang/id/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index f8d90903f..a65a5b24f 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -5,10 +5,13 @@ from .stop_words import STOP_WORDS from .punctuation import TOKENIZER_SUFFIXES, TOKENIZER_PREFIXES, TOKENIZER_INFIXES from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH 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 ...lemmatizerlookup import Lemmatizer from ...attrs import LANG from ...util import update_exc @@ -25,6 +28,11 @@ class IndonesianDefaults(Language.Defaults): prefixes = tuple(TOKENIZER_PREFIXES) suffixes = tuple(TOKENIZER_SUFFIXES) infixes = tuple(TOKENIZER_INFIXES) + syntax_iterators = dict(SYNTAX_ITERATORS) + + @classmethod + def create_lemmatizer(cls, nlp=None): + return Lemmatizer(LOOKUP) class Indonesian(Language): From 547973b92a43c0244c7e0ed7268c8b0dffc93988 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 27 Jul 2017 10:51:34 +0700 Subject: [PATCH 074/739] wip syntax iterators --- spacy/lang/id/syntax_iterators.py | 42 +++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 spacy/lang/id/syntax_iterators.py 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 +} From 6c725e8dcf5f4cd647df0451889f6b1557dfe807 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 27 Jul 2017 19:46:21 +0700 Subject: [PATCH 075/739] updated lemma --- spacy/lang/id/lemmatizer.py | 63972 ++++++++++++++++++++-------------- 1 file changed, 36882 insertions(+), 27090 deletions(-) diff --git a/spacy/lang/id/lemmatizer.py b/spacy/lang/id/lemmatizer.py index f644122ea..ae13a53ad 100644 --- a/spacy/lang/id/lemmatizer.py +++ b/spacy/lang/id/lemmatizer.py @@ -1,27095 +1,36887 @@ # coding: utf8 from __future__ import unicode_literals -ID_BASE_LEMMA = """ -aba peraba -aba perabaan -abad berabad -abad perabadan -abad seabad -abadi diabadikan -abadi diabadikannya -abadi keabadian -abadi mengabadikan -abadi mengabadikannya -abadi pengabadian -abadi terabadikan -abai diabaikan -abai diabaikannya -abai mengabaikan -abai mengabaikannya -abai pengabaian -abai terabaikan -abai terabaikannya -abdi diabdikan -abdi mengabdi -abdi mengabdikan -abdi pengabdi -abdi pengabdian -aben pengabenan -abnormal keabnormalan -aborsi diaborsi -aborsi mengaborsi -abrek seabrek -absah diabsahkan -absah keabsahan -absah mengabsahkan -absah pengabsahan -absen diabsen -absen mengabsen -absen mengabsenkan -abu keabuan -abu pengabuan -abu perabuan -abu-abu keabu-abuan -acak diacak -acak mengacak -acak pelacak -acak pengacak -acak pengacakan -acara beracara -acara diacara -acara seacara -acu beracuan -acu diacu -acu mengacu -acu mengacukan -acu mengacunya -acuh diacuhkan -acuh diacuhkannya -acuh keacuhan -acuh mengacuhkan -acuh mengacuhkannya -acung diacungi -acung diacungkan -acung mengacung -acung mengacungi -acung mengacungkan -acung mengacungkannya -acung teracung -ada berada -ada beradanya -ada diadakan -ada diadakanlah -ada diadakannya -ada keadaan -ada memadai -ada menadakan -ada mengadakan -ada mengadakannya -ada pengadaan -ada seadanya -adab beradab -adab beradap -adab keadaban -adab peradaban -adab peradapan -adab teradap -adang diadang -adang memadang -adang mengadang -adang mengadangnya -adang menyadang -adang pengadangan -adang penyadang -adaptasi beradaptasi -adaptasi beradaptasinya -adaptasi diadaptasi -adaptasi diadaptasikan -adaptasi mengadaptasi -adaptasi mengadaptasikan -adaptasi mengadaptasinya -adat beradat -adegan beradegan -adik beradik -adik pengadikan -adil diadili -adil keadilan -adil mengadili -adil pengadil -adil pengadilan -adil peradilan -adil seadil -adil seadilnya -administrasi diadministrasikan -administrasi keadministrasian -administrasi mengadministrasi -administrasi mengadministrasikan -administrasi pengadministrasi -administrasi pengadministrasian -adopsi diadopsi -adopsi diadopsinya -adopsi mengadopsi -adopsi mengadopsinya -adopsi pengadopsi -adopsi pengadopsian -adu beradu -adu diadu -adu diadukan -adu diadukannya -adu mengadu -adu mengadukan -adu mengadukannya -adu pengadu -adu pengaduan -adu pengadukan -adu peraduan -adu teradu -aduh mengaduh -aduk diaduk -aduk diadukan -aduk memadukan -aduk mengaduk -aduk mengadukan -aduk mengaduknya -aduk pengaduk -aduk pengadukan -advokasi diadvokasi -advokasi mengadvokasi -advokasi mengadvokasikan -afiliasi berafiliasi -afiliasi terafiliasi -afirmasi diafirmasi -afirmasi mengafirmasi -agama beragama -agama beragamanya -agama keagamaan -agama seagama -agen diageni -agen keagenan -agen mengageni -agenda beragenda -agenda beragendakan -agenda diagendakan -agenda mengagendakan -agenda mengagendakannya -agenda teragendakan -tagih menagih -tagih menagihkan -tagih menagihnya -tagih penagih -tagih penagihan -agregasi mengagregasi -agresi mengagresi -agresif keagresifan -agresif seagresif -agun beragun -agun beragunan -agun diagunkan -agun mengagunkan -agung diagungkan -agung keagungan -agung mengagungkan -ahli keahlian -air berair -air diairi -air keairan -air mengairi -air pengairan -syair penyair -air perairan -air terairi -ajaib keajaiban -ajak diajak -ajak diajaklah -ajak diajaknya -pajak memajaki -ajak mengajak -ajak mengajakan -ajak mengajaknya -pajak pemajakan -ajar belajar -ajar belajarlah -ajar belajarnya -ajar diajar -ajar diajari -ajar diajarkan -ajar diajarkannya -ajar diajarnya -ajar mengajar -ajar mengajari -ajar mengajarkan -ajar mengajarkannya -ajar mengajarnya -ajar pelajar -ajar pelajaran -ajar pelajari -ajar pelajarnya -ajar pengajar -ajar pengajaran -ajar pengajarnya -aji mengaji -aji mengajinya -aji menyajikan -aji menyajikannya -ngaji pengajian -saji penyaji -saji penyajian -aju diajukan -aju diajukannya -aju memajukan -aju memajukannya -aju mengaju -aju mengajuan -aju mengajukan -aju mengajukannya -aju pelaju -maju pemajuan -aju pengaju -aju pengajuan -aju pengajukan -ajur diajurkan -ajur mengajurkan -akal berakal -akal diakal -akal diakali -akal mengakali -makan memakan -makan memakannya -makan pemakan -makan pemakanan -makan pemakannya -akan seakan -belakang belakangan -belakang belakangi -belakang belakangnya -akar berakar -takar menakar -akar mengakar -akar mengakarnya -takar penakar -takar penakaran -akar perakaran -akas berakas -akbar terakbar -akhir berakhir -akhir berakhiran -akhir berakhirlah -akhir berakhirnya -akhir diakhir -akhir diakhiri -akhir diakhirnya -akhir mengakhir -akhir mengakhiri -akhir mengakhirnya -akhir pengakhir -akhir pengakhiran -akhir terakhir -akhir terakhirlah -akhir terakhirnya -akhlak berakhlak -maki memaki -maki memakinya -maki pemakian -akibat berakibat -akibat berakibatkan -akibat diakibat -akibat diakibatkan -akibat diakibatkannya -akibat mengakibat -akibat mengakibatan -akibat mengakibatkan -akibat mengakibatkannya -akibat mengakibatnya -akidah seakidah -aklamasi diaklamasi -akomodasi diakomodasi -akomodasi diakomodasikan -akomodasi diakomodasinya -akomodasi mengakomodasi -akomodasi mengakomodasikan -akomodasi mengakomodasinya -akomodasi terakomodasi -akomodasi terakomodasinya -akrab diakrab -akrab diakrabi -akrab keakraban -akrab mengakrabi -akrab mengakrabkan -akreditasi berakreditasi -akreditasi diakreditasi -akreditasi mengakreditasi -akreditasi terakreditasi -akrobat berakrobat -akrobatik berakrobatik -paksa memaksa -paksa memaksaan -paksa memaksakan -paksa memaksakannya -paksa memaksanya -paksa pelaksa -paksa pelaksaan -paksa pemaksa -paksa pemaksaan -aksara beraksara -aksara keaksaraan -akselerasi berakselerasi -akselerasi diakselerasi -akselerasi diakselerasikan -akselerasi mengakselerasi -akselerasi mengakselerasikan -akselerasi terakselerasi -aksen beraksen -akses berakses -akses diakses -akses diaksesi -akses diaksesnya -akses mengakses -akses mengaksesi -akses mengaksesnya -akses pengakses -akses pengaksesan -akses pengaksesnya -akses terakses -akta diaktakan -aktif diaktifkan -aktif diaktifkannya -aktif keaktifan -aktif mengaktifkan -aktif mengaktifkannya -aktif pengaktifan -aktif pengaktifkan -aktif seaktif -aktif teraktif -aktivitas beraktivitas -aktivitas beraktivitasnya -aktual teraktual -aktualisasi diaktualisasikan -aktualisasi mengaktualisasi -aktualisasi mengaktualisasikan -aku belaku -aku diaku -aku diakui -aku diakukan -aku diakunya -aku keakuan -aku meakukan -aku memaku -aku memakukan -aku mengaku -aku mengakui -aku mengakukan -aku mengakunya -aku pelaku -aku pelakuan -aku pelakukan -aku pelakunya -aku pengaku -aku pengakuan -aku peraku -akua pengakuanya -akuan keakuan -akuan pelakuan -akuan pengakuan -akuan pengakuannya -akuisisi diakuisisi -akuisisi diakuisisinya -akuisisi mengakuisisi -akuisisi mengakuisisinya -akuisisi pengakuisisian -akuk diakukan -akuk meakukan -akuk memakukan -akuk mengakukan -akuk pelakukan -akuk pelakuknya -akumulasi berakumulasi -akumulasi diakumulasi -akumulasi diakumulasikan -akumulasi mengakumulasi -akumulasi mengakumulasikan -akumulasi terakumulasi -akumulasi terakumulasinya -akun berakun -akun diakun -akur mengakurkan -akurasi keakurasian -akurat keakuratan -akurat seakurat -akurat terakurat -akut menakut -akut menakuti -akut menakutkan -akut menakutkannya -akut mengakut -akut menyakut -akut penakut -akut pengakut -akut pengakutan -al beal -al dial -al meal -al menalan -al mengali -al pemali -al penal -al penali -al pengali -al seal -al terali -ala belalai -ala mengalai -ala mengalakan -ala menyala -ala menyalakan -ala menyalakannya -ala menyalanya -ala pemalakan -ala penyala -ala penyalaan -ala seala -alah dialah -alah mengalah -alah mengalahan -alah mengalahkan -alah mengalahkannya -alah menyalah -alah menyalahi -alah menyalahkan -alah menyalahkannya -alah penyalah -alah penyalahan -alai belalai -alai belalainya -alai mengalai -alak memalak -alak memalaknya -alak mengalakan -alak mengalakkan -alak menyalak -alak menyalakan -alak pemalak -alak pemalakan -alam dialam -alam dialami -alam menalami -alam mengalam -alam mengalami -alam menyalami -alam pengalam -alam pengalaman -alam pengalami -alam sealami -alamat beralamat -alamat beralamatkan -alamat dialamatkan -alamat mengalamatkan -alamat menyalamatkan -alamat pengalamatan -alamat penyalamat -alamat penyalamatan -alami dialami -alami dialaminya -alami kealamian -alami menalami -alami mengalami -alami mengalamii -alami mengalaminya -alami menyalami -alami menyalaminya -alami pengalami -alami sealami -alamin mengalamin -alang belalang -alang memalang -alang memalangkan -alang menalangi -alang mengalang -alang mengalangi -alang pemalang -alang pemalangan -alang penalangan -alang pengalangan -alas beralas -alas beralasan -alas beralaskan -alas dialasi -alas pemalas -alat menyalati -alat menyalatkan -alat peralat -alat peralatan -alfa kealfaan -ali mengali -ali mengalikan -ali pemali -ali penali -ali pengali -ali pengalian -ali terali -aliansi beraliansi -alibi beralibi -alienasi teralienasi -alih beralih -alih beralihlah -alih beralihnya -alih dialih -alih dialihkan -alih dialihkannya -alih mengalih -alih mengalihan -alih mengalihkan -alih mengalihkannya -alih pengalih -alih pengalihan -alih peralihan -alih teralih -alih teralihkan -alin menyalin -alin menyalinnya -alin penyalinan -alin sealin -aling dialing -aling memalingkan -aling sealing -alip menyalip -alip menyalipnya -alir beraliran -alir dialiran -alir dialiri -alir dialirkan -alir mengalir -alir mengaliri -alir mengalirkan -alir mengalirkannya -alir mengalirlah -alir mengalirnya -alir pengalir -alir pengaliran -alir sealiran -alir teraliri -alir teralirkan -alis beralis -alis teralis -alkohol beralkohol -alku dialkukan -alokasi dialokasi -alokasi dialokasikan -alokasi dialokasikannya -alokasi mengalokasi -alokasi mengalokasikan -alokasi mengalokasikannya -alokasi pengalokasian -alokasi pengalokasikan -alokasi teralokasi -alokasi teralokasikan -alon menyalonkan -alon peralon -alpa kealpaan -alu mealui -alu memalu -alu memalui -alu memalukan -alu memalukannya -alu pelalu -alu pemalu -alu sealu -alu teralu -alum mengalum -alun mengalun -alun mengalunkan -alung mengalungi -alung mengalungkan -alung pengalungan -alur beralur -alur menyaluran -alur menyalurkan -alur menyalurkannya -alur penyalur -alur penyaluran -alur penyalurkan -alur penyalurnya -am beam -am beaman -am beram -am diam -am diaman -am diami -am diamkan -am diamlah -am diamnya -am keaman -am menaman -am menamkan -am mengaman -am mengami -am mengamkan -am menyamkan -am penaman -am pengaman -am seam -am seaman -am teraman -ama berama -ama beramai -ama diamakan -ama keamaan -ama menamai -ama menamakan -ama menamakannya -ama mengamakan -ama menyama -ama menyamai -ama menyamakan -ama menyamakannya -ama penamaan -ama pengamaan -ama penyama -ama penyamaan -ama penyamakan -ama perama -ama seama -ama teramai -amah beramah -amah memamah -amah pelamahan -amah pemamah -amai beramai -amai menamai -amai menamainya -amai menyamai -amai menyamainya -amai teramai -amal beramal -amal diamalkan -amal mengamali -amal mengamalkan -amal mengamalkannya -amal pengamal -amal pengamalan -amal peramal -amal peramalan -aman beaman -aman diaman -aman diamankan -aman diamankannya -aman keaman -aman keamanan -aman menaman -aman menamankan -aman mengaman -aman mengamanan -aman mengamankan -aman mengamankannya -aman menyamankan -aman penaman -aman penamanan -aman pengaman -aman pengamanan -aman pengamankan -aman pengamannya -aman seaman -aman teraman -amanah diamanahi -amanah diamanahkan -amanah mengamanahkan -amanat diamanati -amanat diamanatkan -amanat mengamanatkan -amang teramang -amar menyamar -amar menyamarkan -amar menyamarkannya -amar pelamar -amar pelamaran -amar pelamarnya -amar penyamar -amar penyamaran -amat diamati -amat keamatan -amat menamatkan -amat mengamati -amat mengamatkan -amat pengamat -amat pengamatan -amat pengamatnya -amat teramat -amat teramati -ambah menambah -ambah menambahan -ambah menambahi -ambah menambahkan -ambah menambahkannya -ambah menambahnya -ambah penambah -ambah penambahan -ambah penambahkan -ambah perambah -ambah perambahan -ambak menambak -ambak menambakan -ambak penambak -ambak penambakan -ambal menambal -ambal menambalnya -ambal penambal -ambal penambalan -ambang belambang -ambang belambangan -ambang diambang -ambang diambangkan -ambang menambang -ambang menambangnya -ambang mengambang -ambang mengambangkan -ambang mengambangnya -ambang menyambangi -ambang pelambang -ambang penambang -ambang penambangan -ambang penambangnya -ambang pengambang -ambang pengambangan -ambar mengambar -ambar mengambarkan -ambar menyambar -ambar menyambarnya -ambek mengambek -ambet menyambet -ambil diambil -ambil diambilkan -ambil diambillah -ambil diambilnya -ambil menambil -ambil mengambil -ambil mengambilan -ambil mengambili -ambil mengambilkan -ambil mengambilnya -ambil penambilan -ambil pengambil -ambil pengambilan -ambil terambil -ambisi berambisi -ambruk keambrukan -ambul mengambulkan -ambung menambung -ambung menyambung -ambung menyambungkan -ambung menyambungkannya -ambung menyambungnya -ambung pelambungan -ambung penyambung -ambung penyambungan -amen mengamen -amen pengamen -amendemen diamendemen -amendemen mengamendemen -ami diami -ami mengami -amil mengamil -amil penamilan -amin beramin -amin diamin -amin diamini -amin diaminkan -amin mengamini -amin mengaminkan -amin peamin -amin pelaminan -amir keamiran -amonia pelamonia -ampai diampaikan -ampai menyampai -ampai menyampaian -ampai menyampaikan -ampai menyampaikannya -ampai penyampai -ampai penyampaian -ampai penyampaikan -ampang memampang -ampang memampangkan -ampang penampang -ampang penampangnya -ampas perampas -ampas perampasan -ampas terampas -ampat memampatkan -ampat menampati -ampat menampatkan -amplifikasi mengamplifikasi -amplitudo beramplitudo -amplop beramplop -ampo perampokan -ampo perampokannya -ampu diampu -ampu memampukan -ampu mengampu -ampu pengampu -ampu pengampuan -ampu perampuan -ampuh keampuhan -ampuh seampuh -ampuh terampuh -ampuk memampukan -ampuk menampuk -ampun diampuni -ampun diampunkan -ampun menampun -ampun mengampuni -ampun pengampun -ampun pengampunan -ampun terampuni -amputasi diamputasi -amputasi mengamputasi -amputasi teramputasi -amuk diamuk -amuk mengamuk -amuk mengamuknya -amunisi beramunisi -ana diana -ana menganai -ana menganakan -ana pelana -ana pengana -ana peranakan -anak belanak -anak beranak -anak dianak -anak menanak -anak menganak -anak menganakan -anak penanak -anak peranakan -anal beanal -anal menganal -analis dianalis -analis menganalis -analis menganalisi -analisis dianalisis -analisis menganalisis -analisis menganalisisnya -analisis penganalisis -analog beranalogi -analogi beranalogi -analogi dianalogikan -analogi menganalogikan -analogi menganalogikannya -anang memanangkan -anang menanangi -anang pemanang -anang penanangan -anani menganani -ancak perancak -ancam diancam -ancam diancaman -ancam diancamkan -ancam mengancam -ancam mengancaman -ancam mengancamnya -ancam pengancam -ancam pengancaman -ancam terancam -ancam terancaman -ancam terancamnya -ancang memancang -ancang memancangkan -ancang pemancang -ancang pemancangan -ancang perancang -ancang perancangan -ancang perancangnya -ancang terancang -andai berandai -andai diandaikan -andai menandai -andai menandainya -andai mengandaikan -andai pengandaian -andai seandainya -andak menandakan -andak mengandakan -andal berandal -andal berandalan -andal diandalkan -andal diandalkannya -andal keandalan -andal mengandalkan -andal mengandalkannya -andam terandam -andan belandan -andan berandan -andang memandang -andang memandangi -andang memandangnya -andang menandang -andang mengandangkan -andang menyandang -andang menyandangnya -andang pemandangan -andang pengandangan -andang penyandang -andang penyandangnya -andar menyandar -andar menyandarkan -andar pengandaran -andil berandil -andil pengandilan -andung menandung -andung mengandung -andung mengandungnya -andung menyandung -aneh keanehan -aneh seaneh -aneh teraneh -aneka beraneka -aneka keaneka -aneksasi dianeksasi -aneksasi menganeksasi -aneksasi menganeksasinya -angah menangah -angan belangan -angan berangan -angan menangan -angan menangani -angan mengangani -angan mengangankan -angan pelangan -angan pelangannya -angan penangan -angan penanganan -angan penangannya -angan pengangan -angan penganganan -angan perangan -angan terangan -angga diangga -angga menanggai -angga mengangga -angga menyangga -angga menyangganya -angga pelangga -angga pelanggaan -angga pelangganya -angga penyangga -angga penyangganya -anggai menanggai -anggal dianggal -anggal menanggal -anggal menanggalkan -anggal menanggalkannya -anggal penanggalan -anggan menanggani -anggan pelanggan -anggan pelanggannya -anggan penangganan -anggap beranggapan -anggap dianggap -anggap dianggapnya -anggap menanggap -anggap menanggapi -anggap menanggapnya -anggap menganggap -anggap menganggapi -anggap menganggapnya -anggap penanggap -anggar beranggaran -anggar dianggaran -anggar dianggarkan -anggar dianggarkannya -anggar menganggarkan -anggar menganggarkannya -anggar pelanggar -anggar pelanggaran -anggar pelanggarnya -anggar penanggaran -anggar penganggaran -anggar teranggarkan -anggara dianggarakan -anggara pelanggara -anggara pelanggaraan -anggota beranggota -anggota beranggotakan -anggota dianggotai -anggota keanggota -anggota keanggotaan -angguh menangguhkan -angguh menangguhkannya -angguh penangguhan -angguh pengangguhan -angguk menangguk -angguk mengangguk -angguk menganggukan -angguk menganggukkan -anggul memanggul -anggul menanggul -anggul menyanggul -anggul penanggulan -anggun keanggunan -anggung beranggung -anggung memanggungkan -anggung menanggung -anggung menanggungnya -anggung menganggung -anggung penanggung -anggung penanggungan -anggur dianggurkan -anggur menanggur -anggur menganggur -anggur menganggurnya -anggur penangguran -anggur penganggur -anggur pengangguran -angin berangin -angin menangin -angin perangin -angin peranginan -angin seangin -angka berangka -angka berangkai -angka diangka -angka diangkakan -angka menyangka -angka menyangkakan -angka menyangkanya -angka penangkaan -angka perangka -angka perangkai -angka terangka -angka terangkai -angkak diangkakan -angkak menyangkakan -angkasa mengangkasa -angker keangkeran -angket diangket -angket diangketkan -angku memangku -angku memangkunya -angku pemangku -angku pemangkuan -angkuh keangkuhan -angkup menangkupkan -angkup menyangkup -angkut berangkutan -angkut diangkut -angkut diangkutnya -angkut menangkut -angkut mengangkut -angkut mengangkuti -angkut mengangkutnya -angkut menyangkut -angkut menyangkutkan -angkut pengangkut -angkut pengangkutan -angkut pengangkutnya -angkut terangkut -angsa memangsa -angsa memangsanya -angsa pemangsa -angsa pemangsaan -angsa pemangsanya -angsa pengangsaan -angsur berangsur -angsur diangsur -angsur mengangsur -angur penganguran -angut mengangut -ani belani -ani berani -ani beranikan -ani beranilah -ani beraninya -ani diani -ani meani -ani mengani -ani pelani -aniaya dianiaya -aniaya menganiaya -aniaya menganiayanya -aniaya penaniayaan -aniaya penganiaya -aniaya penganiayaan -aniaya teraniaya -anis dianis -anis pemanis -anis pemanisnya -anja belanja -anja belanjaan -anja belanjakan -anja belanjalah -anja belanjanya -anja memanjakan -anja memanjakannya -anja pemanjaan -anja penanjakan -anjak belanjakan -anjak beranjak -anjak beranjaklah -anjak memanjakan -anjak menanjak -anjak menanjaknya -anjak penanjakan -anjal menganjal -anjang beranjang -anjang memanjang -anjang memanjangkan -anjang memanjangnya -anjang pemanjangan -anjangsana beranjangsana -anjar menganjar -anjat memanjat -anjat memanjatkan -anjat memanjatnya -anjat pemanjat -anjat pemanjatan -anjung menyanjung -anjung menyanjungnya -anjung penanjung -anjur dianjurkan -anjur dianjurkannya -anjur menganjurkan -anjur menganjurkannya -anjur penganjur -anjur penganjuran -anta berantai -anta berantakan -anta berantakannya -anta dianta -anta diantanya -anta memantai -anta mengantakan -antah berantah -antap memantapkan -antap menantap -antap menyantap -antap menyantapnya -antap pemantapan -antap penyantap -antap penyantapnya -antar diantar -antar diantaran -antar diantarkan -antar diantarkannya -antar diantarnya -antar mengantar -antar mengantarkan -antar mengantarkannya -antar mengantarnya -antar pelantar -antar pelantaran -antar pengantar -antar pengantaran -antar pengantarnya -antariksa keantariksaan -antarpulau diantarpulaukan -antem berantem -antero seantero -anti belanti -anti menanti -anti menantikan -anti menantikannya -anti menantinya -anti menganti -anti mengantikan -anti mengantikannya -anti mengantinya -anti pelantikan -anti pelantikannya -anti penanti -anti penantian -anti penganti -anti pengantian -anti pengantinya -anti peranti -anti perantinya -anting belanting -anting beranting -antisipasi diantisipasi -antisipasi diantisipasinya -antisipasi mengantisipasi -antisipasi mengantisipasinya -antisipasi pengantisipasian -antisipasi terantisipasi -antuk mengantuk -antuk mengantuknya -antuk terantuk -antul memantul -antul memantulkan -antul memantulkannya -antul pemantul -antun menyantuni -antun pelantun -antun penyantun -antun penyantunan -antusias berantusias -antusias seantusias -anu keanu -anugerah dianugerahi -anugerah dianugerahkan -anugerah menganugerahi -anugerah menganugerahkan -anugerah penganugerahan -anulir dianulir -anulir dianulirnya -anulir menganulir -anulir menganulirnya -anulir penganuliran -anus teranus -anut dianut -anut dianutnya -anut menganut -anut peanut -anut penganut -anut penganutnya -anyam dianyam -anyam menganyam -anyang menanyangkan -anyang menyanyangi -anyang menyanyangkan -anyang penanyangan -anyang penyanyang -anyar teranyar -anyar teranyarnya -apa berapa -apa berapanya -apa diapa -apa diapakan -apa menapai -apa menapakan -apa mengapa -apa mengapai -apa menyapa -apa menyapai -apa menyapanya -apak diapakan -apak menapak -apak menapakan -apak menapaki -apak menapakkan -apak pelapak -apakah berapakah -apakah mengapakah -apar memapar -apar memaparkan -apar memaparkannya -apar pemaparan -apas memapas -apas penapasan -apel diapelkan -api berapi -api menapikan -api pengapian -api perapi -api perapian -api terapi -api terapinya -api-api berapi-api -apik menapik -apik menapikan -apik seapik -apit diapit -apit mengapit -apit mengapitnya -apit pengapit -aplikasi beraplikasi -aplikasi diaplikasi -aplikasi diaplikasikan -aplikasi diaplikasikannya -aplikasi mengaplikasi -aplikasi mengaplikasikan -aplikasi mengaplikasikannya -aplikasi pengaplikasian -aplikasi teraplikasi -apresiasi berapresiasi -apresiasi diapresiasi -apresiasi diapresiasikan -apresiasi mengapresiasi -apresiasi mengapresiasikan -apresiasi mengapresiasinya -apresiasi terapresiasi -apresiasi terapresiasinya -apu memapu -apu menyapu -apu menyapukan -apu menyapunya -apu pelapukan -apu penyapu -apu penyapuan -apung diapungkan -apung mengapung -apung mengapungkan -apung pengapung -apung pengapungan -apung terapung -apuran pengapuran -ara diara -ara menara -ara menaranya -ara mengarakan -ara menyarakan -ara penara -ara pengarakan -ara perarakan -ara seara -arah berarah -arah diarah -arah diarahkan -arah diarahkannya -arah kearah -arah memarahi -arah mengarah -arah mengarahan -arah mengarahkan -arah mengarahkannya -arah mengarahnya -arah menyarahkan -arah pemarah -arah pengarah -arah pengarahan -arah pengarahnya -arah searah -arah terarah -arah terarahnya -arai pengaraian -arak berarak -arak diarak -arak memarakkan -arak mengarak -arak mengarakan -arak mengaraknya -arak menyarakan -arak pengarakan -arak perarakan -aram mengaramkan -arang mengarang -arang menyarang -arang menyarangkan -arang menyarangkannya -arang pelarang -arang pelarangan -arang pemarangan -arang pengarang -arang pengarangnya -arang penyarang -aransemen diaransemen -aransemen mengaransemen -ardi belardi -ardi berardi -ardi diardi -are diare -are diarenya -area diarea -argumen berargumen -argumentasi berargumentasi -ari belari -ari berari -ari diari -ari meari -ari menari -ari menarikan -ari menarilah -ari menarinya -ari menyarikan -ari pelari -ari pelarian -ari penari -ari penarikan -ari penarikannya -ari penarinya -ari penyarikan -ari perarian -aria menaria -arif kearifan -arif penarifan -arih mearih -arik menarik -arik menarikan -arik menariknya -arik menyarikan -arik penarik -arik penarikan -arik penariknya -arik penyarikan -aring bearing -aring menyaring -aring menyaringnya -aring penyaring -aring penyaringan -aris pelaris -arogan kearoganan -aroma beraroma -aron pemaron -aron pengaron -arsip diarsipkan -arsip kearsipan -arsip mengarsip -arsip mengarsipkan -arsip pengarsipan -arsip terarsip -arsir mengarsir -arsitek diarsiteki -arsitek mengarsiteki -arsitektur berarsitektur -arti bearti -arti berarti -arti berartikan -arti berartinya -arti diartikan -arti mengartikan -arti mengartikannya -artikulasi diartikulasikan -artikulasi mengartikulasikan -artis keartisan -artisan keartisan -artisan keartisannya -aru menyaru -aru penarukan -aruk penarukan -arung berarung -arung diarungi -arung mengarungi -arung pelarungan -arung pengarungan -arus belarus -arus berarus -arus mengaruskan -arus pengarus -as beas -as belas -as belasan -as beras -as berasan -as berasnya -as dias -as meas -as memasan -as menas -as mengaskan -as peas -as pelasan -as pemasan -as penas -as peras -as perasan -as perasi -as seas -as teras -as terasi -as terasnya -asa belasa -asa berasa -asa berasalah -asa memasakan -asa mengasai -asa pemasakan -asa pemasakannya -asa perasa -asa perasaan -asa seasa -asa terasa -asa terasakan -asa terasanya -asah diasah -asah menasah -asah mengasah -asah mengasahnya -asah pengasah -asah pengasahan -asah terasah -asak memasak -asak memasakan -asak memasakkan -asak memasaknya -asak mengasak -asak pemasak -asak pemasakan -asak terasakan -asal berasal -asal berasalan -asan belasan -asan berasan -asan memasan -asan pelasan -asan pemasan -asan pemasanan -asan perasan -asan perasannya -asana pelasana -asana pelasanaan -asap berasap -asap diasap -asap diasapi -asap mengasapi -asap pengasapan -asar berasar -asar berasarkan -asar memasarkan -asar memasarkannya -asar mengasari -asar menyasar -asar menyasarkan -asar menyasarnya -asar pemasar -asar pemasaran -asar pemasarnya -asar penasaran -asas berasas -asas berasaskan -ase pease -aset beraset -asi keasikan -asi memasikan -asi menyasikan -asi perasi -asi terasi -asih measih -asih mengasih -asih mengasihi -asih penasihan -asih pengasih -asih pengasihan -asil berasil -asil diasil -asil mengasilkan -asil pengasilan -asil terasil -asimilasi berasimilasi -asin diasinkan -asin keasinan -asin pengasinan -asing diasingkan -asing mengasing -asing mengasingkan -asing pengasingan -asing terasing -asing terasingkan -asisten mengasisteni -asli keaslian -aso pemasokan -aso teraso -asong pengasong -asosiasi berasosiasi -asosiasi diasosiasikan -asosiasi mengasosiasikan -asosiasi mengasosiasikannya -asosiasi terasosiasi -aspal beraspal -aspal diaspal -aspal mengaspal -aspal pengaspalan -aspal teraspal -aspirasi beraspirasi -aspirasi diaspirasikan -aspirasi mengaspirasikan -asrama berasrama -asrama diasramakan -asri keasrian -asu memasukan -asu memasukannya -asu pemasukan -asu pemasukannya -asuh diasuh -asuh diasuhnya -asuh mengasuh -asuh mengasuhnya -asuh pengasuh -asuh pengasuhan -asuh pengasuhnya -asumsi berasumsi -asumsi diasumsikan -asumsi mengasumsikan -asung memasung -asung memasungnya -asung pemasungan -asuransi berasuransi -asuransi diasuransi -asuransi diasuransikan -asuransi mengasuransikan -asuransi perasuransian -asyik berasyik -asyik keasyikan -asyik mengasyikan -asyik mengasyikkan -atak menatakan -atak mengatak -atak mengatakan -atak mengatakkan -atak menyatakan -atak teratak -atap beratap -atap beratapkan -atap diatap -atap menatap -atap menatapkan -atap menatapnya -atap menyatap -atap penatapan -atap seatap -atar mengatar -atar mengatarkan -atar pelataran -atar penataran -atar pengatar -atas diatas -atas diatasi -atas diatasnya -atas keatas -atas mengatas -atas mengatasi -atas teratas -atas teratasi -atas teratasnya -atau mematau -ati belati -ati berati -ati mematikan -ati mematikannya -ati pelati -ati pelatikan -ati pemati -ati penati -atok mematok -atok mematoknya -atok pematokan -atraksi beratraksi -atribut beratribut -atung belatung -atung belatungnya -atung mematung -atung pematung -atur beraturan -atur diatur -atur diaturan -atur diaturlah -atur diaturnya -atur mengatur -atur mengaturkan -atur mengaturnya -atur pengatur -atur pengaturan -atur peraturan -atur teratur -atur teraturnya -atus beatus -atus beratus -atus meatus -atus mengatus -atus mengatuskan -atus pematusan -au beau -au belau -au berau -au mengau -au pelau -au pelaukan -audiensi beraudiensi -audit diaudit -audit mengaudit -audit mengauditnya -audit pengaudit -audit pengauditan -audit teraudit -auk pelaukan -aum mengaum -aung keaungan -aung menaungi -aung mengaung -aung pelaung -aung penaung -aura beraura -aus keausan -autopsi diautopsi -autopsi mengautopsi -awa belawa -awa berawa -awa memawa -awa menawakan -awa mengawai -awa pelawa -awa pengawa -awa pengawai -awa pengawakan -awa perawakan -awa perawakannya -awah berawah -awai mengawai -awai pengawai -awak berawak -awak berawaknya -awak diawaki -awak menawakan -awak mengawaki -awak pelawak -awak pengawak -awak pengawakan -awak perawakan -awal berawal -awal berawalan -awal berawalnya -awal diawal -awal diawali -awal mengawal -awal mengawali -awal mengawalnya -awal pengawal -awal pengawalan -awal pengawalnya -awal seawal -awal terawal -awan belawan -awan berawan -awan menawan -awan menawannya -awan pelawan -awan pelawanan -awan penawan -awan penawanan -awan pengawan -awan perawan -awan perawannya -awan terawan -awang mengawang -awang pelawangan -awang penawangan -awang perawang -awang terawang -awang terawangan -awar menawar -awar menawaran -awar menawari -awar menawarkan -awar menawarkannya -awar menawarnya -awar penawar -awar penawaran -awar penawarnya -awar perawaran -awas diawasi -awas menawaskan -awas mengawas -awas mengawasi -awas pengawas -awas pengawasan -awas pengawasnya -awas terawas -awas terawasi -awat belawati -awat mengawati -awat peawat -awat pelawat -awat perawat -awat perawatan -awat perawatnya -awat terawat -awat terawatnya -awet diawetkan -awet keawetan -awet mengawetkan -awet mengawetkannya -awet pengawet -awet pengawetan -awet pengawetnya -awet terawetkan -awin mengawini -awin mengawinkan -awin mengawinkannya -ayah berayah -ayah berayahkan -ayah seayah -ayak diayak -ayak menayakan -ayak mengayak -ayak mengayakan -ayan belayan -ayan pelayan -ayan pelayanan -ayan pelayannya -ayan perayan -ayar belayar -ayar pelayar -ayar pelayaran -ayat menyayat -ayat menyayatnya -ayat pelayat -ayat penyayat -ayat penyayatan -ayom diayomi -ayom mengayomi -ayom pengayom -ayom pengayoman -ayom terayomi -ayu memayu -ayu perayu -ayun berayun -ayun diayun -ayun diayunkan -ayun mengayun -ayun mengayunkan -ayun mengayunkannya -ayun pemayun -ayun terayun -ba berba -ba diba -ba pemba -ba perbakan -ba seba -ba sebai -ba sebalah -ba sebanya -ba terbai -ba terbanya -bab kebab -bab membabi -bab sebab -bab sebabkan -bab sebabnya -baba dibaba -baba sebabai -babak dibabak -babak kebabak -babas kebabasan -babas pembabasan -babat dibabat -babat membabat -babat pembabatan -babatan pembabatan -babi membabi -bablas kebablasan -baca dibaca -baca dibacakan -baca dibacakannya -baca dibacanya -baca kebaca -baca membaca -baca membacakan -baca membacakannya -baca membacanya -baca pembaca -baca pembacaan -baca pembacanya -baca terbaca -baca terbacanya -bacak dibacakan -bacak membacakan -baco membacokan -baco pembacokan -bacok dibacok -bacok membacok -bacok membacokan -bacok membacokkan -bacok membacoknya -bacok pembacok -bacok pembacokan -bad berbadan -bad dibadan -bada berbada -badal dibadalkan -badan berbadan -badan dibadan -badan dibadannya -bagai bebagai -bagai berbagai -bagai pelbagai -bagai pembagaian -bagai perbagai -bagai sebagai -bagai sebagaian -bagai sebagaii -bagai sebagainya -bagai terbagai -bagaimana sebagaimana -bagak sebagak -bagal sebagal -bagan sebagan -bagat sebagat -bagau berbagau -bagau sebagau -bagau sebagaui -bagi bebagi -bagi berbagi -bagi berbagilah -bagi dibagi -bagi dibagian -bagi dibagikan -bagi dibagikannya -bagi dibaginya -bagi kebagian -bagi membagi -bagi membagikan -bagi membagikannya -bagi membaginya -bagi pembagi -bagi pembagian -bagi pembaginya -bagi sebagi -bagi sebagian -bagi sebaginya -bagi terbagi -bagi terbaginya -bagus kebagusan -bagus sebagus -bagus terbagus -bah berbah -bah berbahan -bah pembahan -bah perbahan -bah sebah -bahak terbahak -bahan berbahan -bahan pembahan -bahan perbahan -bahana membahana -bahari kebaharian -baharu membaharui -baharu pembaharu -baharu pembaharuan -baharu perbaharuan -baharu perbaharui -baharu terbaharui -baharu terbaharukan -bahas dibahas -bahas dibahasnya -bahas mebahas -bahas membahas -bahas membahasan -bahas membahasi -bahas membahasnya -bahas pembahas -bahas pembahasan -bahas terbahas -bahasa berbahasa -bahasa berbahasanya -bahasa dibahasa -bahasa dibahasakan -bahasa kebahasaan -bahasa membahasa -bahasa membahasakan -bahasa pembahasa -bahasa pembahasaan -bahasa pembahasanya -bahaya bebahaya -bahaya berbahaya -bahaya berbahayanya -bahaya mebahayakan -bahaya membahayakan -bahaya membahayakannya -bahaya sebahaya -bahu dibahu -bahu membahu -bahu sebahu -bahu sebahunya -baiat berbaiat -baiat dibaiat -baiat membaiat -baiat pembaiatan -baik berbaik -baik berbaikan -baik kebaikan -baik kebaikkan -baik membaik -baik membaiknya -baik pebaikan -baik perbaikan -baik perbaiki -baik perbaikkan -baik sebaik -baik sebaiknya -baik terbaik -baik terbaikan -baik terbaiklah -baik terbaiknya -bais berbais -bait sebait -baja pembajakan -baja pembajakannya -bajak dibajak -bajak dibajaknya -bajak membajak -bajak membajaknya -bajak pembajak -bajak pembajakan -bajak pembajaknya -bajak terbajak -baji kebajikan -baji perbaji -bajik kebajikan -baju berbaju -bak bebak -bak berbak -bak kebak -bak perbakan -bak sebak -bak terbak -baka kebakaan -bakar dibakar -bakar dibakarnya -bakar kebakar -bakar kebakaran -bakar membakar -bakar membakari -bakar membakarnya -bakar pembakar -bakar pembakaran -bakar terbakar -bakar terbakarnya -bakat berbakat -bakat berbakatnya -bakat kebakatan -bakat terbakat -bakteri berbakteri -bakti berbakti -bakti kebaktian -bakti membaktikan -baku dibakukan -baku membakukan -baku pembakuan -bakul sebakul -bakung sebakung -bal bebal -bal bebali -bal kebal -bal kebali -bal kebalnya -bal membal -bal membali -bal pembali -bal perbalan -bal sebal -bala membala -bala pembala -bala pembalakan -bala sebalai -balah sebalah -balai sebalai -balak pembalak -balak pembalakan -balak pembalakkan -balan perbalan -balang sebalang -balap dibalap -balap dibalapan -balap membalap -balap membalapnya -balap pebalap -balap pebalapnya -balap pembalap -balap pembalapnya -balas berbalas -balas berbalasan -balas dibalas -balas dibalasnya -balas membalas -balas membalaskan -balas membalasnya -balas pembalas -balas pembalasan -balas terbalas -balas terbalaskan -balen kebalen -balet pebalet -balian pembalian -balong membalong -balsam pembalsaman -balur berbalur -balur dibalur -balur dibaluri -balur dibalurkan -balur membaluri -balur membalurkan -balut berbalut -balut berbalutkan -balut dibalut -balut dibaluti -balut dibalutkan -balut membalut -balut membalutnya -balut pembalut -balut pembalutnya -balut terbalut -bambang sebambangan -ban beban -ban bebani -ban bebankan -ban bebannya -ban keban -ban memban -ban perban -ban perbankan -ban perbankannya -ban terban -banar sebanarnya -bandar perbandaran -bandara dibandara -bandara kebandaraan -bandel kebandelan -bandel membandel -bandel membandelnya -banderol berbanderol -banderol dibanderol -banderol dibanderoli -banderol dibanderolnya -banderol membanderol -banderol membanderolnya -banding berbanding -banding dibanding -banding dibandingan -banding dibandingkan -banding dibandingkannya -banding membanding -banding membandingan -banding membandingkan -banding membandingkannya -banding pembanding -banding pembandingan -banding pembandingnya -banding perbandingan -banding perbandingkan -banding sebanding -banding sebandingnya -banding terbanding -bandung dibandung -bandung dibandungkan -bang membangan -bang membangkan -bang pembangan -bang perbangan -bang perbangkan -bang terbang -bang terbangi -bang terbangkan -bang terbanglah -bang terbangnya -bangai sebangai -bangan membangan -bangan pembangan -bangan perbangan -bangau sebangau -banget kebangetan -bangga berbangga -bangga berbanggalah -bangga dibanggakan -bangga dibanggakannya -bangga kebanggaan -bangga membanggakan -bangga membanggakannya -banggan kebanggan -banggan kebanggannya -bangkang membangkang -bangkang pembangkang -bangkang pembangkangan -bangkit dibangkitkan -bangkit kebangkitan -bangkit kebangkitkan -bangkit membangkit -bangkit membangkitan -bangkit membangkitkan -bangkit membangkitkannya -bangkit pembangkit -bangkit pembangkitan -bangkit pembangkitnya -bangkrut dibangkrutkan -bangkrut kebangkrutan -bangkrut membangkrutkan -bangku dibangku -bangku membangku -bangku sebangku -bangku sebangkunya -bangsa berbangsa -bangsa kebangsaan -bangsa perbangsa -bangsa sebangsa -bangsa sebangsanya -bangsawan kebangsawanan -bangun dibangun -bangun dibangunan -bangun dibangunkan -bangun dibangunlah -bangun dibangunnya -bangun kebangun -bangun kebangunan -bangun mebangun -bangun membangun -bangun membangunan -bangun membangunkan -bangun membangunkannya -bangun membangunnya -bangun menbangun -bangun pebangunan -bangun pembangun -bangun pembangunan -bangun pembangunnya -bangun penbangunan -bangun sebangun -bangun terbangun -bangun terbangunnya -bani bebani -banjir dibanjiri -banjir kebanjiran -banjir membanjir -banjir membanjiri -banjir membanjirnya -bank bebankan -bank berbank -bank perbankan -bank perbankkan -bantah berbantahan -bantah dibantah -bantah dibantahkan -bantah dibantahnya -bantah mebantah -bantah membantah -bantah membantahkan -bantah membantahnya -bantah menbantah -bantah pembantahan -bantah perbantahan -bantah terbantah -bantah terbantahkan -bantai dibantai -bantai membantai -bantai pembantai -bantai pembantaian -bantal membantalkan -bantal pembantalan -bantar dibantar -bantar dibantaran -bantar dibantarkan -bantar membantarkan -bantar pembantaran -bantaran dibantaran -bantaran pembantaran -banting dibanting -banting kebanting -banting membanting -banting membantingkan -banting membantingnya -banting terbanting -bantu berbantu -bantu dibantu -bantu dibantukan -bantu dibantulah -bantu dibantunya -bantu kebantu -bantu mebantu -bantu membantu -bantu membantunya -bantu menbantu -bantu pembantu -bantu pembantuan -bantu pembantunya -bantu perbantuan -bantu perbantukan -bantu terbantu -bantu terbantukan -bantun membantun -banyak dibanyak -banyak kebanyak -banyak kebanyakan -banyak kebanyakkan -banyak perbanyak -banyak perbanyakan -banyak perbanyaklah -banyak sebanyak -banyak sebanyaknya -banyak terbanyak -banyak terbanyaknya -bapa kebapakan -bapak kebapakan -baptis dibaptis -baptis membaptis -baptis pembaptis -baptis pembaptisan -bar kebar -bar kebaran -bar membari -bar sebar -bar sebaran -bar sebarkan -bar terbar -bar terbari -bara kebarakan -bara membara -bara membaranya -barak kebarakan -barak mebarak -baran kebaran -baran sebaran -baran sebarannya -barang sebarang -barap pembarap -barat kebaratan -barat sebarat -barat-barat kebarat-baratan -barel perbarel -bareng bebarengan -bareng berbarengan -bareng dibarengi -bareng dibarengkan -bareng membarengi -baret berbaret -baret pembaretan -bari membari -bari membarikan -bari terbari -barik membarikan -barik terbarik -barikade dibarikade -barikade membarikade -baring berbaring -baring berbaringlah -baring dibaringkan -baring membaringkan -baring pembaringan -baring terbaring -baring terbaringnya -baringan pembaringan -baringan pembaringannya -baris berbaris -baris dibaris -baris dibarisan -baris dibariskan -baris membariskan -baris sebaris -barter dibarter -barter membarter -barter membarternya -baru kebaruan -baru membarui -baru pembaru -baru pembaruan -baru perbaruan -baru perbarui -baru terbaru -baru terbarui -baru terbarukan -baru terbarunya -bas bebas -bas bebasan -bas bebaskan -bas bebasnya -bas berbasi -bas kebas -bas membaskan -bas pembasan -bas perbasi -basa berbasa -basa-basi berbasa-basi -basah dibasahi -basah dibasahkan -basah kebasahan -basah membasahi -basah pembasahan -basah terbasah -basi berbasi -basi perbasi -basil berbasil -basin bebasin -basis bebasis -basis berbasis -basis berbasisi -basis berbasiskan -basket pebasket -basmi dibasmi -basmi membasmi -basmi membasminya -basmi pembasmi -basmi pembasmian -basuh dibasuh -basuh membasuh -basuh membasuhnya -basuh pembasuh -basuh pembasuhan -bata membatakan -bata perbata -bata perbataan -bata terbata -bata-bata terbata-bata -batai pembataian -batak membatakan -batal dibatalkan -batal dibatalkannya -batal membatalkan -batal membatalkannya -batal pembatalan -batang berbatang -batang perbatang -batang sebatang -batas berbatas -batas berbatasan -batas dibatas -batas dibatasi -batas membatas -batas membatasi -batas pebatasan -batas pembatas -batas pembatasan -batas pembatasnya -batas perbatas -batas perbatasan -batas sebatas -batas terbatas -batas terbatasi -batas terbatasnya -baterai berbaterai -bati pembatikan -bati perbatikan -bati sebatian -batik berbatik -batik dibatik -batik membatik -batik pembatik -batik pembatikan -batik perbatikan -batik sebatik -batil kebatilan -batin kebatinan -batin membatin -batu bebatuan -batu berbatu -batu berbatuan -batu membatu -batu pembatu -batu pembatuan -batuk terbatuk -bau bebauan -bau berbau -bau kebau -bau membaui -bau pembau -baung perbaungan -baur berbaur -baur berbaurnya -baur dibaurkan -baur membaur -baur membaurkan -baur pembauran -baut dibaut -baut membaut -bawa dibawa -bawa dibawakan -bawa dibawakannya -bawa dibawalah -bawa dibawanya -bawa kebawa -bawa mebawa -bawa membawa -bawa membawakan -bawa membawakannya -bawa membawanya -bawa menbawa -bawa pembawa -bawa pembawaan -bawa pembawanya -bawa perbawa -bawa terbawa -bawa terbawanya -bawah dibawah -bawah dibawahi -bawah dibawahnya -bawah kebawah -bawah membawah -bawah membawahi -bawah membawahkan -bawah terbawah -bawah terbawahnya -bawak dibawakan -bawak membawakan -bawat perbawati -baya berbaya -baya dibayai -baya kebaya -baya kebayakan -baya kebayanya -baya membaya -baya membayakan -baya pembayaan -baya sebaya -baya sebayanya -bayak kebayakan -bayak membayakan -bayak sebayak -bayak terbayak -bayang berbayang -bayang dibayang -bayang dibayangi -bayang dibayangkan -bayang dibayangkannya -bayang kebayang -bayang membayang -bayang membayangi -bayang membayangkan -bayang membayangkannya -bayang sebayang -bayang terbayang -bayang terbayangkan -bayar berbayar -bayar berbayaran -bayar berbayarnya -bayar dibayar -bayar dibayari -bayar dibayarkan -bayar dibayarkannya -bayar dibayarnya -bayar mebayar -bayar membayar -bayar membayari -bayar membayarkan -bayar membayarkannya -bayar membayarnya -bayar menbayar -bayar pembayar -bayar pembayaran -bayar terbayar -bayar terbayarkan -bayar terbayarkannya -bayar terbayarnya -bayun kebayunan -bayun pembayun -bayur pebayuran -beban berbeban -beban dibebani -beban dibebankan -beban dibebankannya -beban membebani -beban membebankan -beban membebankannya -beban pembebanan -beban terbeban -beban terbebani -beban terbebankan -bebar membebarkan -bebar sebebarnya -bebas dibebas -bebas dibebaskan -bebas dibebaskannya -bebas kebebasan -bebas membebas -bebas membebasan -bebas membebaskan -bebas membebaskannya -bebas pembebas -bebas pembebasan -bebas sebebas -bebas sebebasnya -bebas terbebas -bebas terbebaskan -bebas terbebasnya -bebat dibebat -bebat membebat -bebat membebatnya -bebat terbebat -bebek membebek -beber dibeber -beber dibeberkan -beber dibeberkannya -beber mebeberkan -beber membeber -beber membeberkan -beber membeberkannya -beber pembeberan -beberapa bebeberapa -beberapa dibeberapa -beberapa kebeberapa -beda bebeda -beda berbeda -beda berbedaan -beda berbedanya -beda dibedakan -beda membedakan -beda membedakannya -beda pebedaan -beda pembeda -beda pembedaan -beda pembedanya -beda perbedaan -bedah bebedahan -bedah dibedah -bedah membedah -bedah membedahnya -bedah pembedah -bedah pembedahan -bedak dibedakan -bedak dibedaki -bedak membedakan -bedan berbedan -bedan perbedan -bedan perbedannya -bedaya pembedayaan -bega berbegai -bega sebegai -begal dibegal -begal membegal -begal pembegal -begal pembegalan -begini dibeginikan -begini sebegini -begitu dibegitukan -begitu sebegitu -begitu sebegitunya -bejat kebejatan -bek bebek -bek bebekan -bek bebeknya -bek belbek -bek berbek -beka pembekakan -bekal berbekal -bekal berbekalkan -bekal dibekali -bekal dibekalkan -bekal membekali -bekal pembekalan -bekal perbekalan -bekam dibekam -bekap dibekap -bekap membekap -bekap membekapnya -bekap terbekap -bekas berbekas -bekas dibekas -bekas membekas -bekas membekaskan -bekel perbekel -beku dibekukan -beku dibekukannya -beku kebekuan -beku membeku -beku membekukan -beku membekukannya -beku membekunya -beku pembeku -beku pembekuan -beku pembekukan -bekuk dibekuk -bekuk dibekukan -bekuk dibekuknya -bekuk membekuk -bekuk membekukan -bekuk membekuknya -bekuk pembekukan -bel bebel -bel dibeli -bel kebeli -bel mebel -bel mebeli -bel mebelnya -bel membel -bel membeli -bel pembeli -bel sebel -bel terbeli -bela berbela -bela dibela -bela dibelai -bela dibelanya -bela mebela -bela membela -bela membelai -bela membelanya -bela pembela -bela pembelaan -bela pembelanya -belah berbelah -belah berbelahan -belah dibelah -belah dibelahan -belah membelah -belah membelahnya -belah pembelah -belah pembelahan -belah sebelah -belah sebelahan -belah sebelahnya -belah terbelah -belah terbelahnya -belai dibelai -belai membelai -belai membelainya -belakang dibelakang -belakang dibelakangnya -belakang kebelakang -belakang membelakangi -belakang terbelakang -belalai berbelalai -belalak membelalak -belalak membelalakkan -belalak terbelalak -belanga sebelanga -belanja berbelanja -belanja berbelanjaan -belanja berbelanjalah -belanja dibelanjakan -belanja membelanjakan -belanja membelanjakannya -belanja pebelanja -belanja pembelanja -belanja pembelanjaan -belanja perbelanjaan -belas berbelas -belas membelas -belas pembelas -belas sebelas -belasungkawa berbelasungkawa -belat sebelat -belatung berbelatung -belenggu dibelenggu -belenggu membelenggu -belenggu membelenggunya -belenggu terbelenggu -beli dibeli -beli dibelikan -beli dibelikannya -beli dibelinya -beli kebeli -beli mebeli -beli membeli -beli membelikan -beli membelikannya -beli membelinya -beli pembeli -beli pembelian -beli pembelinya -beli terbeli -belia pembelia -belia pembeliaan -belian pembelian -belian pembeliannya -belik dibelikan -belik membelikan -belikan dibelikan -belikan dibelikannya -belikan membelikan -belikan membelikannya -beliku membeliku -belimbing sebelimbingan -belit berbelit -belit berbelitnya -belit dibelit -belit membelit -belit membelitnya -belit terbelit -belo dibelokan -belo membelokan -belo pembelokan -belok berbelok -belok dibelokan -belok dibelokkan -belok membelok -belok membelokan -belok membelokkan -belok membelokkannya -belok pembelokan -belok pembelokkan -belok terbelokkan -belot membelot -belot membelotnya -belot pembelot -belot pembelotan -belu sebelu -belu sebelunya -beludak membeludak -beludak membeludaknya -belum sebelum -belum sebelumnya -bena bebena -bena sebenanya -benah bebenah -benah berbenah -benah dibenahi -benah membenah -benah membenahi -benah pembenahan -benah terbenahi -benak dibenak -benak dibenaknya -benam dibenami -benam dibenamkan -benam dibenamkannya -benam membenam -benam membenamkan -benam membenamkannya -benam terbenam -benam terbenamnya -benar dibenarkan -benar dibenarkannya -benar kebenaran -benar mebenarkan -benar membenar -benar membenarkan -benar membenarkannya -benar membenarnya -benar pembenar -benar pembenaran -benar sebenar -benar sebenarnya -benara kebenaraan -benara kebenaranya -benara sebenaranya -bencana kebencanaan -benci dibenci -benci dibencinya -benci kebencian -benci membenci -benci membencinya -benci pembenci -benci pembencinya -benda kebendaan -benda perbendaan -bendahara kebendaharaan -bendahara pembendaharaan -bendahara perbendaharaan -bendara berbendara -bendera berbendera -bendung dibendung -bendung dibendungnya -bendung membendung -bendung membendungnya -bendung pembendungan -bendung terbendung -bendung terbendungnya -bengal kebengalan -bengis kebengisan -bengkak membengkak -bengkak membengkakkan -bengkak membengkaknya -bengkak pembengkakan -bengkak pembengkakkan -bengkalai terbengkalai -bengkalai terbengkalainya -bengkel perbengkelan -bengkelai terbengkelai -bengkok dibengkokkan -bengkok kebengkokan -bengkok membengkok -bengkok membengkokkan -bengkok pembengkokan -bengkok sebengkok -bengong terbengong -benih pembenihan -benih perbenihan -bening kebeningan -bening sebening -bentak dibentak -bentak membentak -bentak membentaknya -bentang berbentang -bentang dibentang -bentang dibentangkan -bentang membentang -bentang membentangkan -bentang membentangkannya -bentang pembentang -bentang pembentangan -bentang terbentang -bentangkan dibentangkan -bentangkan membentangkan -bentangkan membentangkannya -bentar sebentar -bentara sebentara -benteng berbenteng -benteng dibentengi -benteng membentengi -benteng perbentengan -bentrok berbentrokan -bentuk bebentuk -bentuk berbentuk -bentuk dibentuk -bentuk dibentuklah -bentuk dibentuknya -bentuk kebentuk -bentuk mebentuk -bentuk membentuk -bentuk membentukan -bentuk membentuknya -bentuk pembentuk -bentuk pembentukan -bentuk pembentukkan -bentuk pembentukkannya -bentuk pembentuknya -bentuk sebentuk -bentuk terbentuk -bentuk terbentuklah -bentuk terbentuknya -bentur bebenturan -bentur berbenturan -bentur dibenturkan -bentur kebentur -bentur membentur -bentur membenturkan -bentur membenturkannya -bentur pembenturan -bentur perbenturan -bentur terbentur -bentur terbenturnya -beo membeo -bera bebera -bera sebera -berang keberangkan -berang seberang -berang seberangi -berang seberangnya -berangkat diberangkat -berangkat diberangkatan -berangkat diberangkatkan -berangkat diberangkatkannya -berangkat keberangkatan -berangkat memberangkat -berangkat memberangkatan -berangkat memberangkatkan -berangkat memberangkatkannya -berangkat pemberangkatan -berangus diberangus -berangus memberangus -berangus memberangusnya -berangus pemberangusan -berani keberanian -berani memberanikan -berani pemberani -berani seberani -beranta pemberantaan -berantas diberantas -berantas diberantasnya -berantas meberantas -berantas memberantas -berantas memberantasan -berantas memberantasnya -berantas peberantasan -berantas pemberantas -berantas pemberantasan -berantas penberantasan -berapa beberapa -berapa beberapanya -berapa berberapa -berapa keberapa -berapa seberapa -beras perberasan -berat berberat -berat diberatkan -berat keberatan -berat memberat -berat memberati -berat memberatkan -berat memberatkannya -berat pemberat -berat pemberatan -berat pemberatnya -berat perberat -berat seberat -berat seberatnya -berat terberat -berat terberatnya -berdikari keberdikarian -beredel diberedel -beredel memberedel -beredel pemberedelan -beres beberes -beres diberesi -beres dibereskan -beres memberesi -beres membereskan -beres membereskannya -beres pemberesan -beri diberi -beri diberikan -beri diberikannya -beri diberinya -beri meberi -beri meberikan -beri memberi -beri memberian -beri memberikan -beri memberikannya -beri memberinya -beri menberikan -beri pemberi -beri pemberian -beri pemberikan -beri pemberinya -berida seberida -berik diberik -berik diberikan -berik meberikan -berik memberik -berik memberikan -berik menberikan -berik pemberikan -beril memberilan -beringas keberingasan -berita diberita -berita diberitakan -berita memberitakan -berita memberitakannya -berita pemberita -berita pemberitaan -berita terberitakan -berkah diberkahi -berkah keberkahan -berkah memberkahi -berkas diberkas -berkas diberkaskan -berkas memberkas -berkas memberkaskan -berkas pemberkasan -berkas seberkas -berkat diberkati -berkat memberkati -berkat pemberkatan -berkat terberkati -berondong diberondong -berondong diberondongkan -berondong memberondong -berondong memberondongkan -berondong memberondongnya -berondong pemberondongan -berontak memberontak -berontak pemberontak -berontak pemberontakan -bersih bebersih -bersih dibersihkan -bersih dibersihkannya -bersih kebersihan -bersih membersih -bersih membersihan -bersih membersihkan -bersih membersihkannya -bersih pembersih -bersih pembersihan -bersih pembersihkan -bersih pembersihnya -bersih sebersih -bersih terbersih -bersit membersitkan -bersit sebersit -bersit terbersit -beruk memberukan -besar berbesar -besar dibesar -besar dibesarkan -besar dibesarkannya -besar kebesaran -besar membesar -besar membesarkan -besar membesarkannya -besar membesarnya -besar pembesar -besar pembesaran -besar perbesar -besar perbesaran -besar sebesar -besar sebesari -besar sebesarnya -besar terbesar -besar terbesarnya -besaran kebesaran -besaran kebesarannya -besaran pembesaran -besaran pembesarannya -besaran perbesaran -besi pembesian -besi sebesi -besit terbesit -besuk dibesuk -besuk membesuk -besuk membesuknya -besuk pembesuk -besuk pembesukan -besuk pembesuknya -besut dibesut -besut dibesutnya -besut membesut -besut membesutnya -besut pembesut -besut pembesutnya -bet bebet -bet perbet -betik terbetik -betis sebetis -beton dibeton -beton membeton -beton pembetonan -betonisasi dibetonisasi -betot membetot -betot pembetot -betul dibetulkan -betul kebetulan -betul membetulkan -betul membetulkannya -betul pembetulan -betul sebetulnya -biadab kebiadaban -biah sebiah -biak berbiak -biak dibiakkan -biak membiakan -biak membiakkan -biak pembiak -biak pembiakan -biak pembiakkan -biar dibiarkan -biar dibiarkannya -biar membiarkan -biar membiarkannya -biar pembiaran -biar terbiarkan -biara pembiaraan -bias dibiaskan -bias kebiasan -bias membias -bias membiaskan -bias pembiasan -biasa dibiasakan -biasa kebiasaan -biasa membiasakan -biasa membiasakannya -biasa pembiasaan -biasa terbiasa -biasa terbiasanya -biaya berbiaya -biaya dibiaya -biaya dibiayai -biaya mebiayai -biaya membiaya -biaya membiayai -biaya pembiayaan -bibir berbibir -bibir dibibir -bibit pembibit -bibit pembibitan -bibit perbibitan -bidan dibidani -bidan kebidanan -bidan membidani -bidang dibidang -bidang dibidangnya -bidang mebidang -bidang membidangi -bidang pembidangan -bidang sebidang -bidik dibidik -bidik dibidikkan -bidik dibidiknya -bidik membidik -bidik membidikan -bidik membidikkan -bidik membidiknya -bidik pembidik -bidik pembidikan -bidik terbidik -bija kebijakan -bija kebijakannya -bijak kebijakan -bijak kebijakkan -bijak sebijak -bijaksana kebijaksanaan -bijaksana sebijaksana -biji berbiji -biji sebiji -bikin berbikini -bikin dibikin -bikin dibikinkan -bikin dibikinlah -bikin dibikinnya -bikin membikin -bikini berbikini -biksu kebiksuan -bilah sebilah -bilang berbilang -bilang dibilang -bilang dibilangan -bilang dibilangi -bilang dibilangnya -bilang terbilang -bilas dibilas -bilas membilas -bilas membilasnya -bilas pembilas -bilas pembilasan -bilas terbilas -biliar pebiliar -bimbang kebimbangan -bimbing dibimbing -bimbing dibimbingnya -bimbing membimbing -bimbing membimbingnya -bimbing pembimbing -bimbing pembimbingan -bimbing pembimbingnya -bina dibina -bina dibinanya -bina membina -bina membinanya -bina pembina -bina pembinaan -bina pembinanya -bina terbina -bina terbinanya -binar berbinar -binasa dibinasakan -binasa kebinasaan -binasa membinasakan -binasa pembinasaan -binatang kebinatangan -bincang bebincang -bincang berbincang -bincang berbincangan -bincang dibincangi -bincang dibincangkan -bincang membincang -bincang membincangkan -bincang perbincangan -bincang perbincangkan -bineka berbineka -bineka kebinekaan -bingka berbingkai -bingka dibingkai -bingka membingkai -bingka terbingkai -bingkai berbingkai -bingkai dibingkai -bingkai membingkai -bingkai membingkainya -bingkai pembingkaian -bingkai terbingkai -bingung dibingungkan -bingung kebingungan -bingung membingungkan -bintang berbintang -bintang dibintang -bintang dibintangi -bintang kebintangan -bintang membintangi -bintang pembintangan -bintang perbintangan -bintik berbintik -biopsi dibiopsi -bir kebiri -biru kebiruan -biru membiru -biru membirukan -bis dibis -bisa berbisa -bisa dibisa -bisa kebisaan -bisa sebisa -bisa sebisanya -bisa terbisa -bisik berbisik -bisik berbisiklah -bisik dibisiki -bisik dibisikkan -bisik membisikan -bisik membisiki -bisik membisikkan -bisik pembisik -bisik pembisiknya -bising kebisingan -bisnis berbisnis -bisnis berbisnisnya -bisnis dibisniskan -bisnis membisniskan -bisnis pebisnis -bisnis pebisnisnya -bisnis pembisnis -bisu kebisuan -bisu membisu -bisu membisukan -bit terbit -bit terbitan -bit terbitkan -bit terbitlah -bit terbitnya -bius dibius -bius membius -bius membiusnya -bius pembius -bius pembiusan -bius terbius -blender diblender -blender memblender -blok diblok -blok memblok -blok membloknya -blok terblok -blokade diblokade -blokade memblokade -blokade memblokadenya -blokade pemblokadean -blokade terblokade -blokir diblokir -blokir diblokirnya -blokir memblokir -blokir memblokirnya -blokir pemblokir -blokir pemblokiran -blokir terblokir -blokir terblokirnya -bobok dibobok -bobok membobok -bobol dibobol -bobol dibobolnya -bobol kebobolan -bobol mebobol -bobol membobol -bobol membobolkan -bobol membobolnya -bobol pembobol -bobol pembobolan -bobol terbobol -bobot berbobot -bobot pembobotan -bobrok kebobrokan -bocor dibocorkan -bocor dibocorkannya -bocor kebocoran -bocor membocorkan -bocor membocorkannya -bocor pembocor -bocor pembocoran -bocor pembocornya -bodi berbodi -bodoh dibodohi -bodoh kebodohan -bodoh membodohi -bodoh membodohkan -bodoh pembodohan -bodoh sebodoh -bodoh terbodoh -bogem dibogem -bohong berbohong -bohong dibohongi -bohong kebohongan -bohong membohongi -bohong pembohong -bohong pembohongan -boikot diboikot -boikot memboikot -boikot memboikotnya -boikot pemboikotan -bokar pembokaran -bokong berbokong -bola pebola -bolak membolak -boleh diboleh -boleh dibolehkan -boleh dibolehkannya -boleh kebolehan -boleh membolehkan -boleh membolehkannya -boleh pembolehan -boleh perbolehkan -boling peboling -bolong dibolongi -bolong membolongi -bolos membolos -bolos pembolos -bom dibom -bom membom -bom membomi -bom pembom -bom pemboman -bombardir dibombardir -bombardir membombardir -bombardir pembombardiran -bon dibon -bon kebon -bon kebonan -bonceng berboncengan -bonceng dibonceng -bonceng diboncengi -bonceng diboncengkan -bonceng diboncengnya -bonceng membonceng -bonceng memboncengi -bonceng memboncengkan -bonceng memboncengnya -bonceng pembonceng -bondong berbondong -bongkah sebongkah -bongkar dibongkar -bongkar dibongkarnya -bongkar kebongkar -bongkar membongkar -bongkar membongkarnya -bongkar pembongkar -bongkar pembongkaran -bongkar terbongkar -bongkar terbongkarlah -bongkar terbongkarnya -bonsai dibonsai -bonsai membonsai -bonsai pembonsaian -bonus berbonus -bopong dibopong -bopong membopong -bopong membopongnya -bor dibor -bor membor -bor pemboran -bordir dibordir -bordir membordir -borgol diborgol -borgol diborgolnya -borgol memborgol -borgol memborgolnya -borgol pemborgolan -borgol terborgol -borok keborokan -borong diborong -borong diborongnya -borong memborong -borong memborongnya -borong pemborong -borong pemborongan -borong pemborongnya -boros keborosan -boros memboroskan -boros pemboros -boros pemborosan -boros terboros -bos terbosan -bosan kebosanan -bosan membosankan -bosan membosankannya -bosan terbosan -bot kebot -botak dibotaki -botak kebotakan -botak membotaki -botak pembotakan -botol pembotolan -botol sebotol -bowo perbowo -boyong diboyong -boyong diboyongnya -boyong meboyong -boyong memboyong -boyong memboyongnya -brutal kebrutalan -bu dibui -bu dibukan -bu dibukannya -bu membukan -bu pembukan -bu pembukannya -bu sebu -bu sebuan -bu terbukan -buah berbuah -buah berbuahkan -buah dibuah -buah dibuahi -buah mebuahkan -buah membuah -buah membuahi -buah membuahkan -buah pembuahan -buah perbuah -buah perbuahan -buah sebuah -buai dibuai -buai membuai -buai terbuai -buak membuak -bual membual -bual pembual -buang dibuang -buang dibuangnya -buang kebuang -buang membuang -buang membuangnya -buang pembuang -buang pembuangan -buang terbuang -buang terbuangnya -buar membuar -buar membuarkan -buas kebuasan -buas terbuas -buat berbuat -buat berbuatan -buat berbuatlah -buat dibuat -buat dibuatkan -buat dibuatkannya -buat dibuatlah -buat dibuatnya -buat mebuat -buat membuat -buat membuatkan -buat membuatkannya -buat membuatnya -buat menbuat -buat pebuatan -buat pembuat -buat pembuatan -buat pembuatnya -buat perbuat -buat perbuatan -buat sebuat -buat sebuatan -buat terbuat -bubar dibubarkan -bubar dibubarkannya -bubar membubarkan -bubar membubarkannya -bubar pembubaran -bubuh dibubuhi -bubuh dibubuhkan -bubuh membubuhi -bubuh membubuhkan -bubuh membubuhkannya -bubuh pembubuhan -bubuhan pembubuhan -bubung membubung -budak perbudakan -budaya berbudaya -budaya dibudayakan -budaya kebudayaan -budaya membudaya -budaya membudayakan -budaya pembudayaan -budi berbudi -budi pembudi -budi sebudi -bugar kebugaran -bugar membugarkan -bugar pembugaran -bugar sebugar -bugil berbugil -bui dibui -buih berbuih -bujang membujang -bujet berbujet -bujuk dibujuk -bujuk membujuk -bujuk membujuknya -bujuk pembujukan -bujuk terbujuk -bujur membujur -bujur terbujur -buk dibukan -buk membukan -buk pembukan -buk terbukan -buk terbuki -buka berbuka -buka berbukaan -buka berbukalah -buka dibuka -buka dibukakan -buka dibukalah -buka dibukanya -buka kebuka -buka mebuka -buka membuka -buka membukakan -buka membukanya -buka menbuka -buka pembuka -buka pembukaan -buka pembukanya -buka terbuka -buka terbukalah -buka terbukanya -buket sebuket -bukit bebukitan -bukit berbukit -bukit kebukit -bukit pebukitan -bukit perbukitan -bukti berbukti -bukti dibuktikan -bukti dibuktikannya -bukti mebuktikan -bukti membuktikan -bukti membuktikannya -bukti pembuktian -bukti pembuktikan -bukti terbukti -bukti terbuktilah -bukti terbuktinya -buku dibuku -buku dibukukan -buku dibukukannya -buku mebukukan -buku membukukan -buku membukukannya -buku pembukuan -buku perbukuan -buku sebuku -buku terbukukan -bulan berbulan -bulan dibulan -bulan kebulan -bulan perbulan -bulan perbulannya -bulan sebulan -bulan sebulanan -bulan sebulannya -bulat berbulat -bulat dibulatkan -bulat kebulatan -bulat membulat -bulat membulatkan -bulat pembulatan -buldoser dibuldoser -buldoser membuldoser -bulu berbulu -bulu berbulunya -bulu pebulu -bulu pembulu -bulu sebulu -buluh pembuluh -bum dibumi -bum membumi -bum sebum -bumbu berbumbu -bumbu dibumbui -bumbu membumbui -bumbung membumbung -bumbung membumbungkan -bumbung membumbungnya -bumi dibumi -bumi dibumikan -bumi kebumian -bumi kebumikan -bumi membumi -bumi membumikan -bumi pembumian -bun kebun -bun kebunnya -buncah membuncah -buncah membuncahkan -buncit membuncit -buncit terbuncit -bundel dibundel -bundel membundel -bundel sebundel -bung kebung -bung membungkan -bung pembungan -bunga bebungaan -bunga berbunga -bunga pembungaan -bunga perbungaan -bungkam dibungkam -bungkam kebungkaman -bungkam membungkam -bungkam membungkamnya -bungkam pembungkam -bungkam pembungkaman -bungkam terbungkam -bungkuk membungkuk -bungkuk membungkukan -bungkuk membungkukkan -bungkus berbungkus -bungkus dibungkus -bungkus dibungkusnya -bungkus membungkus -bungkus membungkusnya -bungkus pembungkus -bungkus pembungkusan -bungkus pembungkusnya -bungkus perbungkus -bungkus sebungkus -bungkus terbungkus -bunting kebuntingan -buntu kebuntuan -buntut berbuntut -buntut dibuntuti -buntut membuntut -buntut membuntuti -buntut pembuntutan -bunuh dibunuh -bunuh dibunuhnya -bunuh membunuh -bunuh membunuhi -bunuh membunuhnya -bunuh pembunuh -bunuh pembunuhan -bunuh pembunuhnya -bunuh terbunuh -bunuh terbunuhnya -bunyi bebunyian -bunyi berbunyi -bunyi dibunyikan -bunyi dibunyikannya -bunyi membunyikan -bunyi membunyikannya -bunyi pembunyian -bur kebur -bur perburan -bura terburai -burai terburai -buram diburamkan -buram keburaman -buram memburamkan -bursa dibursa -buru berburu -buru berburunya -buru diburu -buru diburunya -buru keburu -buru keburukan -buru keburukannya -buru memburu -buru memburunya -buru pemburu -buru pemburuan -buru pemburukan -buru pemburunya -buru perburuan -buru perburukan -buru terburu -buruh keburuhan -buruh memburuh -buruh pemburuh -buruh perburuhan -buruk berburuk -buruk keburukan -buruk memburuk -buruk memburukkan -buruk memburuknya -buruk pemburukan -buruk perburuk -buruk perburukan -buruk seburuk -buruk terburuk -buruk terburuknya -bus terbus -busa berbusa -busana berbusana -busana berbusananya -busuk kebusukan -busuk membusuk -busuk membusukkan -busuk membusuknya -busuk pembusuk -busuk pembusukan -busung membusung -busung membusungkan -buta dibutakan -buta kebutaan -buta membuta -buta membutakan -butik membutikan -butir perbutir -butir sebutir -butuh dibutuh -butuh dibutuhan -butuh dibutuhkan -butuh dibutuhkannya -butuh kebutuhan -butuh kebutuhkan -butuh mebutuhkan -butuh membutuh -butuh membutuhan -butuh membutuhkan -butuh membutuhkannya -butuh menbutuhkan -butul kebutulan -butul perbutulan -butut membututi -buyar dibuyarkan -buyar membuyarkan -buyut bebuyutan -ca beca -ca berca -ca dica -ca mencai -ca menya -ca menyakan -ca menyalah -ca penca -ca penyalah -ca perca -ca seca -caba secaba -cabang bercabang -cabang kecabangan -cabang penyabangan -cabang percabangan -cabar menyabar -cabar penyabar -cabik dicabik -cabik mencabik -cabik tercabik -cabul dicabuli -cabul kecabulan -cabul mencabuli -cabul pencabul -cabul pencabulan -cabul percabulan -cabut dicabut -cabut dicabuti -cabut dicabutnya -cabut mecabut -cabut mencabut -cabut mencabuti -cabut mencabutnya -cabut menyabut -cabut menyabutkan -cabut pecabutan -cabut pencabut -cabut pencabutan -cabut tercabut -cacah dicacah -cacah mencacah -cacah pencacah -cacah pencacahan -cacat kecacatan -cacat mencacat -cacat mencacatkan -cacat tercacat -caci dicaci -caci mencaci -caci mencacinya -caci-maki dicaci-maki -caci-maki mencaci-maki -cacing bercacing -cacing kecacingan -cadai menyadai -cadang dicadangkan -cadang dicadangkannya -cadang mencadangkan -cadang mencadangkannya -cadang menyadang -cadang pencadangan -cadang penyadang -cadar bercadar -cadar menyadari -cadar menyadarkan -cadar menyadarkannya -cadar penyadaran -cah memcah -cah memcahkan -cah pecah -cah pecahan -cah pecahkan -cah pecahlah -cah pecahnya -cahar pencahar -cahari pencaharian -cahaya bercahaya -cahaya pencahayaan -caing menyaingi -cair dicairkan -cair dicairkannya -cair mencair -cair mencairkan -cair mencairkannya -cair mencairnya -cair pencair -cair pencairan -cair penyair -cair tercairkan -cak becak -cak becaknya -cak bercak -cak kecak -cak menyakan -cak pecak -cak pencak -cak penyaki -cakap bercakap -cakap kecakapan -cakap pecakapan -cakap percakapan -cakar bercakar -cakar dicakar -cakar mencakar -cakar pencakar -cakar pencakaran -caki penyaki -cako pencakokan -cakup dicakup -cakup mencakup -cakup mencakupi -cakup tercakup -cal becali -calak menyalak -calak menyalakan -calang pecalang -calo mencalokan -calo pencaloan -calo percaloan -calon dicalonkan -calon dicalonkannya -calon mencalon -calon mencalonkan -calon mencalonkannya -calon menyalonkan -calon pecalonan -calon pencalon -calon pencalonan -calon percalonan -cam dicamkan -cam kecam -cam kecaman -cam kecamnya -cam mencamkan -cam menyamkan -camar kecamaran -camar menyamar -camar menyamarkan -camar menyamarkannya -camar pencamaran -camar penyamar -camar penyamaran -camat kecamatan -cambang bercambang -cambang menyambangi -cambuk dicambuk -cambuk mencambuk -cambuk pencambukan -cambung menyambung -cambung menyambungkan -cambung menyambungkannya -cambung menyambungnya -cambung penyambung -cambung penyambungan -camil mencamil -campa dicampakan -campa mencampai -campa mencampakan -campa menyampai -campa menyampakan -campa penyampai -campak dicampakan -campak dicampakkan -campak mencampakan -campak mencampakkan -campak mencampakkannya -campak menyampakan -campak penyampak -camping menyamping -camping menyampingkan -campur bercampur -campur bercampurnya -campur dicampur -campur dicampuri -campur dicampurkan -campur mencampur -campur mencampuri -campur mencampurkan -campur mencampurkannya -campur mencampurnya -campur menyampuri -campur menyampurkan -campur pencampur -campur pencampuran -campur percampuran -campur tercampur -campur tercampurnya -camuk kecamuk -canang dicanangkan -canang dicanangkannya -canang mencanangkan -canang pencanangan -canda becanda -canda becandaan -canda becandanya -canda bercanda -canda bercandaan -canda bercandanya -canda mencandai -candai mencandai -candi penyandian -candi percandian -candra menyandra -candra penyandraan -candu kecanduan -candu mencandu -candu pecandu -candu pecandunya -candu pencandu -candu pencandunya -candung menyandung -cang kecang -cang mencangkan -cang menyangi -cang menyangkan -cang pencangan -cang penyang -cang secang -cang secangan -canggah menyanggah -canggah menyanggahnya -canggah penyanggah -canggah penyanggahan -canggih kecanggihan -canggih secanggih -canggih tercanggih -canggih tercanggihnya -canggung kecanggungan -cangkang bercangkang -cangkir secangkir -cangkul dicangkul -cangkul mencangkul -cangkul pencangkulan -cangkup mencangkup -cangkup menyangkup -cantik kecantikan -cantik kecantikkan -cantik percantik -cantik secantik -cantik tercantik -canting mencanting -cantol dicantolkan -cantol kecantol -cantum dicantum -cantum dicantumkan -cantum dicantumkannya -cantum mencantum -cantum mencantumkan -cantum mencantumkannya -cantum menyantumkan -cantum pencantuman -cantum penyantuman -cantum tercantum -cantum tercantumkan -cantum tercantumnya -cap bercap -cap dicap -cap dicapnya -cap kecap -cap kecapi -cap kecapnya -cap mencap -cap mencapi -cap mencapnya -cap pengcap -capa dicapai -capa kecapai -capa kecapakan -capa mecapai -capa memcapai -capa mencapa -capa mencapai -capa menyapa -capa menyapai -capa menyapanya -capa pencapai -capa percapakan -capa secapa -capa tercapai -capai dicapai -capai dicapainya -capai kecapai -capai kecapaian -capai mecapai -capai memcapai -capai mencapai -capai mencapainya -capai menyapai -capai menyapaikan -capai pencapai -capai pencapaian -capai tercapai -capai tercapailah -capai tercapainya -capak kecapakan -capak percapakan -cape kecapean -cape kecapekan -capek kecapekan -capit bercapit -caplok dicaplok -caplok dicaploknya -caplok mencaplok -caplok mencaploknya -caplok menyaplok -caplok pencaplok -caplok pencaplokan -capuk menyapukan -cara mencara -cara mencarai -cara menyarakan -cara pencara -cara pengcara -cara percara -cara secara -carah menyarahkan -carak menyarakan -caran menyarankan -caran menyarankannya -carang menyarang -carang menyarangkan -carang menyarangkannya -carang penyarang -cari dicari -cari dicarikan -cari dicarilah -cari dicarinya -cari mecari -cari memcari -cari mencari -cari mencarian -cari mencarikan -cari mencarikannya -cari mencarinya -cari menyarikan -cari pecarian -cari pencari -cari pencarian -cari pencarinya -cari penyarikan -cari percarian -carik dicarikan -carik mencarikan -carik menyarikan -carik penyarikan -carik secarik -caring menyaring -caring menyaringnya -caring penyaring -caring penyaringan -carter dicarter -carter mencarter -cas dicas -cas percasi -cat bercat -cat dicat -cat mecat -cat mencat -cat menyatan -cat menyatkan -cat pecat -cat pecatan -catat dicatat -catat dicatatkan -catat dicatatkannya -catat dicatatnya -catat kecatatan -catat mecatat -catat mecatatkan -catat mencatat -catat mencatatan -catat mencatatkan -catat mencatatkannya -catat mencatatnya -catat pencatat -catat pencatatan -catat tercatat -catat tercatatkan -catat tercatatnya -catu menyatu -catu menyatukan -catu menyatukannya -catu menyatunya -catu pecatu -catu pencatu -catu penyatu -catu penyatuan -catuk menyatukan -catur pecatur -catur percaturan -catut dicatut -catut mencatut -catut menyatut -catut pencatut -catut pencatutan -catut tercatut -ce bercelah -ce dice -ce kece -ce menyelah -ce pence -cebak menyebakan -ceban menyebankan -cebok menceboki -cebong kecebong -cebur diceburkan -cebur kecebur -cebur mencebur -cebur menceburkan -cebur menyebur -cebur menyeburkan -cebur tercebur -cebur terceburnya -cecap mencecap -cecar dicecar -cecar mencecar -cecar mencecarnya -cecar menyecar -cedera dicederai -cedera kecederaan -cedera mencederai -cedera pencederaan -cedera tercederai -cegah dicegah -cegah dicegahnya -cegah mecegah -cegah mencegah -cegah mencegahnya -cegah pecegahan -cegah pencegah -cegah pencegahan -cegah tercegah -cegak mencegak -cegar menyegarkan -cegar penyegar -cegar penyegaran -cegat dicegat -cegat mencegat -cegat mencegatnya -cegat menyegat -cegat pencegat -cegat pencegatan -cek becek -cek dicek -cek mencek -cek mengcek -cek pecek -cekal dicekal -cekal dicekalnya -cekal mencekal -cekal mencekalnya -cekal pencekalan -cekam dicekam -cekam mencekam -cekam mencekamnya -cekam tercekam -cekat kecekatan -cekat menyekat -cekat penyekat -cekat penyekatan -cekat tercekat -cekcok percekcokan -cekcok percekcokkan -ceki pencekikan -cekik dicekik -cekik dicekiknya -cekik mencekik -cekik mencekiknya -cekik pencekikan -cekik tercekik -cekok dicekoki -cekok mencekoki -cela bercela -cela dicela -cela kecelaan -cela kecelakan -cela mencela -cela mencelanya -cela menyela -cela pencela -cela pencelaan -cela tercela -cela tercelanya -celah bercelah -celah menyelah -celak kecelakan -celak menyelak -celaka kecelakaan -celaka mencelakai -celaka mencelakakan -celaka mencelakakannya -celana bercelana -celat mencelat -cele kecele -celetuk berceletuk -celetuk menyeletuk -celoteh berceloteh -celup dicelup -celup dicelupkan -celup mencelup -celup mencelupkan -celup mencelupkannya -celup menyelupkan -celup pencelup -celup pencelupan -celup tercelup -celurit bercelurit -celurit dicelurit -celurit penceluritan -cema menyemai -cema penyemai -cemar dicemari -cemar dicemarkan -cemar mencemari -cemar mencemarkan -cemar pecemaran -cemar pencemar -cemar pencemaran -cemar tercemar -cemar tercemari -cemar tercemarkan -cemar tercemarnya -cemara menyemarakan -cemara pencemaraan -cemas dicemaskan -cemas kecemasan -cemas mencemaskan -cemas mencemaskannya -cemas pencemas -cemat kecematan -cemat menyemat -cemat menyematkan -cemat menyematkannya -cemat penyematan -cembul menyembul -cembul menyembulkan -cemburu dicemburui -cemburu kecemburuan -cemburu pencemburu -cemerlang kecemerlangan -cemerlang secemerlang -cemooh dicemooh -cemooh mencemooh -cemooh mencemoohkan -cemooh mencemoohnya -cempal menyempal -cemplung dicemplungkan -cemplung kecemplung -cemplung mencemplungkan -cemplung menyemplungkan -cemplung tercemplung -cendera menyendera -cendera penyenderaan -cenderung kecenderung -cenderung kecenderungan -cendok menyendok -cendok menyendokkan -ceng keceng -ceng menceng -cengang mencengangkan -cengang mencengangkannya -cengang tercengang -cengkeram dicengkeram -cengkeram mencengkeram -cengkerama bercengkerama -centang dicentang -centang mencentang -centil menyentil -centil penyentilan -cenung tercenung -cepak menyepak -cepak menyepaknya -cepat dicepat -cepat dicepatkan -cepat kecepatan -cepat menyepati -cepat pecepatan -cepat pencepatan -cepat percepat -cepat percepatan -cepat secepat -cepat secepatnya -cepat secepatnyalah -cepat tercepat -cepat tercepatnya -cepek kecepek -ceplos diceploskan -ceplos diceploskannya -ceplos keceplosan -ceplos menceploskan -ceplos menceploskannya -ceplos menyeploskan -cerabut dicerabut -cerabut mencerabut -cerabut tercerabut -cerah dicerahkan -cerah kecerahan -cerah mencerahkan -cerah menyerah -cerah menyerahan -cerah menyerahkan -cerah menyerahkannya -cerah menyerahlah -cerah menyerahnya -cerah pencerah -cerah pencerahan -cerah penyerah -cerah penyerahan -cerah penyerahkan -cerah secerah -cerah tercerah -cerah tercerahkan -cerai bercerai -cerai dicerai -cerai diceraikan -cerai diceraikannya -cerai menceraikan -cerai menceraikannya -cerai penceraian -cerai perceraian -cerai tercerai -cerai-berai bercerai-berai -cerai-berai mencerai-beraikan -cerai-berai tercerai-berai -cerak menyerakan -ceramah berceramah -ceramah diceramahi -ceramah menceramahi -ceramah penceramah -cerang menyerang -cerang menyerangan -cerang menyerangkan -cerang menyerangnya -cerang penyerang -cerang penyerangan -cerang penyerangnya -cerap menyerap -cerap menyerapnya -cerap penyerap -cerap penyerapan -cerat menyerat -cerbak menyerbak -cerca dicerca -cerca mencerca -cerca mencercanya -cerca secerca -cercah secercah -cerdas dicerdaskan -cerdas kecerdasan -cerdas mencerdaskan -cerdas pencerdasan -cerdas secerdas -cerdas tercerdas -cerdik kecerdikan -cerewet kecerewetan -ceria keceriaan -ceria menceriakan -cerita becerita -cerita bercerita -cerita diceritakan -cerita diceritakannya -cerita meceritakan -cerita menceritakan -cerita menceritakannya -cerita menyeritakan -cerita pencerita -cerita penceritaan -cerlang kecerlangan -cermat dicermati -cermat kecermatan -cermat mencermati -cermat pencermatan -cermat secermat -cermin becermin -cermin bercermin -cermin bercerminlah -cermin dicerminkan -cermin mencerminkan -cermin pencerminan -cermin tercermin -cermin tercerminkan -cerna dicerna -cerna mencerna -cerna mencernanya -cerna pencernaan -cerna percernaan -cerna tercerna -ceroboh kecerobohan -ceruk menyerukan -cetak dicetak -cetak dicetaknya -cetak mecetak -cetak memcetak -cetak mencetak -cetak mencetakkan -cetak mencetaknya -cetak menyetak -cetak menyetakan -cetak pecetak -cetak pencetak -cetak pencetakan -cetak pencetakkan -cetak pencetaknya -cetak penyetakan -cetak percetakan -cetak percetakkan -cetak tercetak -cetak tercetaknya -cetok menyetok -cetus dicetus -cetus dicetuskan -cetus dicetuskannya -cetus mencetus -cetus mencetuskan -cetus pencetus -cetus pencetusnya -cetus tercetus -cetus tercetuslah -cetus tercetusnya -ci keci -ci menci -ci peci -ci pecinya -ci percikan -ci percikannya -ciak menyiakan -ciap menyiapan -ciap menyiapkan -ciap menyiapkannya -ciap penyiap -ciap penyiapan -ciar menyiarkan -ciar menyiarkannya -ciar penyiar -ciar penyiaran -ciar penyiarnya -cibir dicibir -cibir mencibir -cibir mencibirnya -cibuk menyibukan -cibuk menyibukkan -cicil dicicil -cicil mencicil -cicil mencicilnya -cicil menyicil -cicil pecicilan -cicil pencicilan -cicip dicicip -cicip dicicipi -cicip mencicip -cicip mencicipi -cicip menyicip -cicip menyicipi -cicip pencicip -cicit mencicit -ciduk diciduk -ciduk diciduknya -ciduk menciduk -ciduk menciduknya -ciduk menyiduk -ciduk pencidukan -ciduk terciduk -cik becik -cik kecik -cik percik -cik percikan -cik perciki -cik percikkan -cikut menyikut -cikut menyikutnya -cincang dicincang -cincang mencincang -cincin bercincin -cing kecing -cingkat menyingkat -cingkat penyingkat -cingkat penyingkatan -cinta bercinta -cinta bercintalah -cinta bercintanya -cinta dicinta -cinta dicintai -cinta kecintaan -cinta mencinta -cinta mencintai -cinta menyintai -cinta pecinta -cinta pecintanya -cinta pencinta -cinta pencintanya -cinta percintaan -cinta tercinta -cinta tercintanya -ciprat kecipratan -ciprat mencipratkan -ciprat terciprat -cipta dicipta -cipta diciptakan -cipta diciptakannya -cipta meciptakan -cipta memciptakan -cipta mencipta -cipta menciptaan -cipta menciptakan -cipta menciptakannya -cipta menyiptakan -cipta pencipta -cipta penciptaan -cipta penciptanya -cipta tercipta -cipta terciptakan -cipta terciptalah -cipta terciptanya -cir berciri -ciri berciri -ciri bercirikan -ciri dicirikan -ciri mencirikan -cit mencit -cita bercita -cita dicitakan -cita mencitai -cita mencitakan -cita menyita -cita menyitanya -cita pencita -cita penyitaan -citra bercitra -citra dicitrakan -citra mencitrakan -citra pencitraan -citra tercitrakan -cium berciuman -cium dicium -cium diciumi -cium diciumnya -cium kecium -cium mencium -cium menciumi -cium menciumnya -cium menyium -cium pencium -cium penciuman -cium tercium -cium terciumnya -ciut diciutkan -ciut menciut -ciut menciutkan -ciut menciutnya -ciut menyiutkan -ciut penciutan -coak kecoak -cobek menyobek -cobek penyobekan -coblos dicoblos -coblos mencoblos -coblos mencoblosnya -coblos menyoblos -coblos pencoblos -coblos pencoblosan -coblos tercoblos -cocok bercocok -cocok dicocok -cocok dicocokan -cocok dicocokkan -cocok kecocokan -cocok kecocokkan -cocok mencocokan -cocok mencocokkan -cocok mencocokkannya -cocok menyocokkan -cocok pencocokan -cocok pencocokkan -cocol dicocol -cocor dicocor -cocor mencocor -cocor mencocorkan -cocor mencocornya -codet menyodet -codet penyodetan -cogok menyogok -cogok menyogoknya -cogok penyogok -cogok penyogokan -cok penyok -cokelat kecokelatan -cokelat mencokelatkan -cokelat pencokelatan -cokok dicokok -cokok mencokok -cokok mencokoknya -cokol bercokol -cokol bercokolnya -cokol mencokol -colek dicolek -colek mencolek -colek menyolek -coleng pencoleng -colok dicolok -colok dicolokan -colok dicolokkan -colok mecolok -colok mencolok -colok mencolokan -colok mencolokkan -colok mencoloknya -colok menyolok -colok tercolok -colong dicolong -colong kecolongan -colong mencolong -colong menyolong -combong menyombongkan -comot dicomot -comot mencomot -comot mencomotnya -congkak kecongkakan -contoh dicontoh -contoh dicontohkan -contoh dicontohkannya -contoh mecontohkan -contoh mencontoh -contoh mencontohkan -contoh mencontohkannya -contoh mencontohnya -contoh menyontoh -contoh menyontohkan -contoh pencontohan -contoh percontohan -copet dicopet -copet kecopetan -copet mencopet -copet pencopet -copet pencopetan -copot dicopot -copot dicopoti -copot dicopotnya -copot mencopot -copot mencopoti -copot mencopotnya -copot pencopotan -cor dicor -cor mencor -corak bercorak -corak menyoraki -corak menyorakkan -coreng dicoreng -coreng mencoreng -coreng tercoreng -coreng tercorengnya -coret dicoret -coret dicoreti -coret dicoretnya -coret mencoret -coret mencoreti -coret mencoretkan -coret mencoretnya -coret pencoretan -coret tercoret -coret tercoretnya -corong mencorong -corong menyorongkan -corot menyorot -corot menyoroti -corot menyorotkan -corot menyorotnya -cuaca bercuaca -cual kecuali -cuat dicuatkan -cuat mencuat -cuat mencuatkan -cuat mencuatnya -cuat tercuat -cubit dicubit -cubit mencubit -cubit mencubitnya -cubung kecubung -cuci dicuci -cuci dicucinya -cuci mencuci -cuci mencucikan -cuci mencucinya -cuci menyuci -cuci menyucikan -cuci pencuci -cuci pencucian -cuci penyucian -cuci tercuci -cucu bercucu -cucu mencucui -cucur bercucur -cucur bercucuran -cucur mencucurkan -cudang pecudangi -cuek dicueki -cuil mencuil -cuil secuil -cuit bercuit -cuit dicuit -cuit dicuitkan -cuit mencuit -cuit mencuitkan -cuk kecuk -cuk pecuk -cuka bercukai -cuka menyukai -cuka penyuka -cuka penyukanya -cukai bercukai -cukai menyukai -cukai menyukainya -cukur bercukur -cukur dicukur -cukur mencukur -cukur mencukurnya -cukur menyukur -cukur menyukuri -cukur pencukur -cukur pencukuran -cukur tercukur -cula bercula -culas keculasan -culik diculik -culik diculiknya -culik menculik -culik menculiknya -culik peculikan -culik penculik -culik penculikan -culik penculikkan -culik penculiknya -cuma percuma -cumbu bercumbu -cumbu dicumbu -cumbu mencumbu -cumbu mencumbunya -cumbu percumbuan -cundang kecundang -cundang mencundangi -cundang pecundang -cundang pecundangi -cundang pencundang -cungkil dicungkil -cungkil mencungkil -cungkil mencungkilnya -cunia secunia -cup kecup -cup kecupan -cuplik dicuplik -cuplik mencuplik -cuplik pencuplikan -cuplik secuplik -cur dicuri -cur mecuri -cur mencuri -cur pencuran -cur pencuri -cur tercuri -cura securai -curah dicurahkan -curah mencurahkan -curah mencurahkannya -curah tercurah -curah tercurahkan -curai securai -curam kecuraman -curang dicurangi -curang kecurangan -curang mencurangi -curat menyurat -curat menyurati -curat menyuratkan -curat menyuratnya -curi dicuri -curi dicurinya -curi kecurian -curi mecuri -curi mencuri -curi mencurikan -curi mencurinya -curi pecurian -curi pencuri -curi pencurian -curi pencurinya -curi tercuri -curiga dicurigai -curiga dicurigakan -curiga kecurigaan -curiga mecurigakan -curiga mencurigaan -curiga mencurigai -curiga mencurigakan -curik mencurikan -cus becus -cus becusnya -cus menyusi -cut kecut -cut pecut -cut pecutan -cut percut -da beda -da bedakan -da bedalah -da bedanya -da berda -da dida -da didakan -da keda -da kedaan -da kedai -da meda -da medai -da menda -da mengdakan -da peda -da pelda -da pemda -da pemdanya -da penda -da pendaan -da pengda -da perda -da perdanya -da seda -da sedakan -dab perdaban -dad sedadi -dada berdada -dada didada -dada pedada -dada sedada -dadak mendadak -dadak mendadaknya -dadar pendadaran -dadi sedadi -dadung bedadung -daeng medaeng -daerah didaerah -daerah didaerahnya -daerah kedaerah -daerah kedaerahan -daerah sedaerah -daftar didaftar -daftar didaftarkan -daftar didaftarkannya -daftar mendaftar -daftar mendaftaran -daftar mendaftarkan -daftar mendaftarkannya -daftar mendaftarnya -daftar pedaftaran -daftar pendaftar -daftar pendaftaran -daftar pendaftarnya -daftar perdaftaran -daftar terdaftar -daftar terdaftarkan -daftar terdaftarnya -daga bedagai -dagang berdagang -dagang berdagangan -dagang berdagangnya -dagang didagangkan -dagang mendagangkan -dagang pedagang -dagang pedagangan -dagang pedagangnya -dagang pendagang -dagang perdagang -dagang perdagangan -dagang perdagangkan -daging berdaging -daging pedaging -dah bedah -dah bedahan -dah bedahnya -dah didah -dah kedah -dah medah -dah sedah -dah sedahan -dahak berdahak -dahan bedahan -dahan sedahan -dahar pendaharan -dahsyat kedahsyatan -dahsyat sedahsyat -dahsyat terdahsyat -dahulu didahului -dahulu didahulukan -dahulu kedahuluan -dahulu mendahului -dahulu mendahulukan -dahulu pendahulu -dahulu pendahuluan -dahulu pendahulunya -dahulu terdahulu -dahulu terdahulunya -dai kedai -dai kedainya -dai medai -daki didaki -daki mendaki -daki mendakinya -daki pendaki -daki pendakian -daku didaku -daku mendaku -dakwa berdakwa -dakwa didakwa -dakwa didakwaan -dakwa didakwakan -dakwa mendakwa -dakwa mendakwakan -dakwa mendakwanya -dakwa pendakwa -dakwa pendakwaan -dakwa terdakwa -dakwa terdakwanya -dakwah berdakwah -dakwah didakwahi -dakwah mendakwahkan -dakwah pendakwah -dakwah terdakwah -dal bedali -dal medal -dal medali -dal mendalan -dal mendali -dal pedal -dal pedalnya -dalam didalam -dalam didalami -dalam didalamkan -dalam didalamnya -dalam kedalam -dalam kedalaman -dalam kedalamnya -dalam mendalam -dalam mendalami -dalam mendalamnya -dalam pedalaman -dalam pendalam -dalam pendalaman -dalam perdalam -dalam perdalaman -dalam sedalam -dalam sedalamnya -dalam terdalam -dalam terdalamnya -dalang didalangi -dalang mendalang -dalang mendalangi -dalang pedalangan -dalih berdalih -dalil berdalil -dalil didalilkan -dalil mendalilkan -dam memdamkan -dam pemdam -dam pemdaman -dam pendam -dam perdami -damai berdamai -damai berdamailah -damai berdamainya -damai didamaikan -damai kedamaian -damai mendamaikan -damai pedamaian -damai pendamai -damai pendamaian -damai perdamaian -damai terdamai -daman pemdaman -damar pedamaran -damba didamba -damba didambakan -damba didambakannya -damba mendamba -damba mendambakan -damba mendambakannya -dame kedamean -dame perdamean -dami perdami -dami perdamian -dampak bedampak -dampak berdampak -dampak berdampaknya -dampak terdampak -dampar mendamparkan -dampar terdampar -dampar terdamparnya -damping berdampingan -damping didamping -damping didampingi -damping mendamping -damping mendampingi -damping mendampingnya -damping pedamping -damping pedampingan -damping pendamping -damping pendampingan -damping pendampingnya -damprat didamprat -damprat mendamprat -dan bedan -dan medan -dan medannya -dan mendan -dan pedan -dan pendanan -dan perdan -dan perdanan -dan sedan -dan sedankan -dan sedannya -dana berdana -dana didanai -dana medana -dana mendanai -dana pedana -dana pedanaan -dana pendana -dana pendanaan -dana perdana -dana perdananya -dana sedana -dana terdanai -danda pedanda -dandan berdandan -dandan didandani -dandan mendandani -dang kedang -dang medang -dang mendang -dang pedang -dang pedangan -dang pedangnya -dang pendang -dang pendangan -dang perdangan -dang sedang -dang sedangan -dang sedangkan -dang sedangnya -dangdut pedangdut -dangdut pendangdut -dangka sedangka -dangka terdangka -dangkal kedangkalan -dangkal mendangkal -dangkal mendangkalkan -dangkal pedangkalan -dangkal pendangkalan -dansa berdansa -dansa pedansa -danyang kedanyang -dap kedap -dap kedapan -dap pendapan -dap pendapi -dap sedap -dap sedapnya -dapa kedapa -dapa mendapa -dapa mendapai -dapa mendapakan -dapa pendapa -dapa terdapa -dapat didapat -dapat didapati -dapat didapatkan -dapat didapatkannya -dapat didapatlah -dapat didapatnya -dapat kedapatan -dapat medapat -dapat medapatkan -dapat memdapat -dapat memdapatkan -dapat mendapat -dapat mendapatan -dapat mendapati -dapat mendapatkan -dapat mendapatkannya -dapat mendapatnya -dapat pedapat -dapat pedapatan -dapat pendapat -dapat pendapatan -dapat pendapatkan -dapat pendapatnya -dapat perdapatan -dapat sedapat -dapat sedapatnya -dapat terdapat -dapat terdapatnya -dapur didapur -dar bedar -dar berdar -dar berdarkan -dar kedar -dar medari -dar pendar -dar pendaran -dar perdaran -dar sedar -dar sedari -dar terdari -dara berdara -dara kedaraan -darah bedarah -darah berdarah -darah berdarahnya -darah mendarah -darah pendarahan -darah perdarahan -darah sedarah -darat didarat -darat didaratan -darat didarati -darat didaratkan -darat mendarat -darat mendaratkan -darat mendaratkannya -darat mendaratnya -darat pendarat -darat pendaratan -dari medari -dari sedari -dari terdari -darmabakti mendarmabaktikan -darmawisata berdarmawisata -darurat kedaruratan -das berdasi -das pedas -das pedasnya -das sedasi -dasar bedasar -dasar bedasarkan -dasar berdasar -dasar berdasaran -dasar berdasarkan -dasar didasar -dasar didasari -dasar didasarkan -dasar mendasar -dasar mendasari -dasar mendasarkan -dasar mendasarkannya -dasar mendasarnya -dasawarsa berdasawarsa -dasawarsa sedasawarsa -dasi berdasi -dasi sedasi -daster berdaster -data didata -data mendata -data mendatanya -data pendata -data pendataan -data perdata -data perdatanya -data terdata -data terdatanya -datar didataran -datar mendatar -datar mendatarnya -datar pendataran -dati kedati -dati pedati -dati sedati -datif sedatif -daulat berdaulat -daulat berdaulatnya -daulat didaulat -daulat didaulatnya -daulat kedaulatan -daulat mendaulat -daulat mendaulatkan -daulat mendaulatnya -daulat pendaulatan -daun berdaun -daur didaur -daur mendaur -daur pendaur -dawai mendawai -daya bedaya -daya berdaya -daya berdayakan -daya berdayanya -daya pendayaan -daya perdaya -daya sedaya -dayu sedayu -dayung mendayung -dayung pedayung -dayung pendayung -de bede -de dide -de mede -de mende -de mendekan -de pede -de sede -debah bedebah -debar berdebar -debar mendebarkan -debat berdebat -debat berdebatan -debat berdebatlah -debat didebat -debat didebatkan -debat mendebat -debat mendebatkan -debat mendebatnya -debat pedebatan -debat perdebatan -debat perdebatkan -debit berdebit -debu berdebu -debum berdebum -debut berdebut -debut terdebut -decak berdecak -decit berdecit -dedah mendedahkan -dedikasi berdedikasi -dedikasi didedikasikan -dedikasi didedikasikannya -dedikasi mendedikasikan -dedikasi mendedikasikannya -dedikasi terdedikasi -definisi berdefinisi -definisi didefinisikan -definisi mendefinisi -definisi mendefinisikan -definisi mendefinisikannya -definisi pendefinisian -definisi terdefinisi -definitif didefinitifkan -definitif mendefinitifkan -defleksi terdefleksi -degar mendegar -degar mendegarkan -degar terdegar -degradasi didegradasi -degradasi mendegradasi -degradasi mendegradasikan -degradasi terdegradasi -degradasi terdegradasinya -degup berdegup -dehem berdehem -dek mendekan -dek pedek -dek pendek -dek pendeknya -dek sedek -dekade berdekade -dekade sedekade -dekah sedekah -dekah sedekahkan -dekah sedekahnya -dekam mendekam -dekan mendekan -dekap didekap -dekap mendekap -dekap mendekapnya -dekar pendekar -dekat berdekat -dekat berdekatan -dekat didekat -dekat didekati -dekat didekatkan -dekat didekatnya -dekat kedekatan -dekat medekati -dekat mendekat -dekat mendekati -dekat mendekatkan -dekat mendekatkannya -dekat mendekatlah -dekat mendekatnya -dekat pedekatan -dekat pendekat -dekat pendekatan -dekat sedekat -dekat terdekat -dekat terdekatnya -deklarasi berdeklarasi -deklarasi dideklarasi -deklarasi dideklarasikan -deklarasi dideklarasikannya -deklarasi medeklarasikan -deklarasi mendeklarasi -deklarasi mendeklarasikan -deklarasi mendeklarasikannya -deklarasi pendeklarasian -dekomposisi terdekomposisi -dekor didekor -dekor mendekor -dekorasi berdekorasi -dekorasi didekorasi -dekorasi mendekorasi -dekriminalisasi mendekriminalisasi -delap berdelapan -delap kedelapan -delap perdelapan -delapan berdelapan -delapan kedelapan -delapan kedelapannya -delapan perdelapan -delegasi didelegasikan -delegasi mendelegasikan -delegasi mendelegasikannya -delegasi pendelegasian -delegitimasi mendelegitimasi -delik mendelik -delusi terdelusi -demi pendemi -demi sedemikan -demik sedemikan -demikian sedemikian -demisioner didemisionerkan -demisioner mendemisionerkan -demo berdemo -demo didemo -demo didemokan -demo mendemo -demo mendemokan -demo mendemonya -demo pedemo -demo pendemo -demo pendemonya -demokrasi berdemokrasi -demokratisasi mendemokratisasi -demonstran pendemonstran -demonstrasi berdemonstrasi -demonstrasi didemonstrasi -demonstrasi didemonstrasikan -demonstrasi mendemonstrasikan -demonstrasi mendemonstrasikannya -demoralisasi mendemoralisasi -demosi didemosi -dempet berdempet -dempet berdempetan -den belden -den diden -den peden -denda didenda -denda mendenda -denda mendendanya -dendam mendendam -dendam pendendam -dendang berdendang -dendang didendangkan -dendang mendendangkan -dengan bedengan -dengan mendengan -dengan terdengan -dengar didengar -dengar didengarkan -dengar didengarkannya -dengar didengarnya -dengar kedengaran -dengar medengar -dengar medengarkan -dengar mendengar -dengar mendengarkan -dengar mendengarkannya -dengar mendengarnya -dengar pendengar -dengar pendengaran -dengar pendengarnya -dengar perdengarkan -dengar terdengar -dengar terdengarlah -dengar terdengarnya -denging berdenging -dengki kedengkian -dengkur mendengkur -dengkur pendengkur -dengung berdengung -dengung didengungkan -dengung mendengung -dengung mendengungkan -dengus mendengus -denominasi berdenominasi -dentang berdentang -denting berdenting -dentum berdentum -denyut berdenyut -dep didepan -dep kedepan -dep terdepan -depa kedepanya -depa pendepakan -depak didepak -depak didepaknya -depak mendepak -depak mendepaknya -depak pendepakan -depak terdepak -depak terdepaknya -depan didepan -depan didepannya -depan kedepan -depan kedepankan -depan kedepannya -depan mendepankan -depan terdepan -depan terdepannya -deponir dideponir -deponir mendeponir -deportasi dideportasi -deportasi dideportasinya -deportasi mendeportasi -deportasi mendeportasinya -deportasi pendeportasian -deposit didepositkan -deposit mendepositkan -deposito didepositokan -deposito mendepositokan -depresiasi mendepresiasi -depresiasi terdepresiasi -depresiasi terdepresiasinya -deputi kedeputian -dera bedera -dera berderai -dera didera -dera dideranya -dera mendera -dera menderanya -derai berderai -derajat sederajat -derajat sederajatnya -derak berderak -derang menderang -derap berderap -deras menderas -deras sederas -deras terderas -deregulasi dideregulasi -deregulasi menderegulasi -derek diderek -derek menderek -derek penderek -derek penderekan -deres menderes -deres penderes -deret berderet -deret berderetan -deret sederet -deret sederetan -derik berderik -dering berdering -derit berderit -derit menderit -derit penderitan -derita diderita -derita dideritanya -derita mederita -derita menderita -derita menderitanya -derita penderita -derita penderitaan -derita penderitanya -derma berderma -derma mendermakan -derma penderma -dermawan kedermawanan -deru menderu -desa berdesakan -desa didesa -desa didesanya -desa mendesa -desa mendesakan -desa pedesaan -desa pendesaan -desa perdesaan -desah mendesah -desain berdesain -desain didesain -desain didesainnya -desain mendesain -desain mendesainnya -desain pendesain -desain pendesainan -desak berdesak -desak berdesakan -desak berdesakkan -desak didesak -desak didesakkan -desak didesaknya -desak medesak -desak mendesak -desak mendesakan -desak mendesakkan -desak mendesaknya -desak terdesak -desak terdesaknya -desar mendesar -desas-desus didesas-desuskan -desentralisasi didesentralisasikan -desentralisasi terdesentralisasi -desinfeksi didesinfeksi -desing berdesing -desing mendesing -desir berdesir -desis berdesis -desis mendesis -deskripsi dideskripsikan -deskripsi mendeskripsi -deskripsi mendeskripsikan -deskripsi mendeskripsikannya -destabilisasi mendestabilisasi -detail berdetail -detail didetailkan -detail mendetail -detail mendetailkan -detail pendetailan -detail sedetail -detak berdetak -deteksi dideteksi -deteksi dideteksinya -deteksi medeteksi -deteksi mendeteksi -deteksi mendeteksinya -deteksi pendeteksi -deteksi pendeteksian -deteksi terdeteksi -deteksi terdeteksinya -detensi pendetensian -determinasi berdeterminasi -determinasi terdeterminasi -detik berdetik -detik perdetik -detik sedetik -detoksifikasi mendetoksifikasi -devaluasi mendevaluasi -dewa didewakan -dewa mendewakan -dewan kedewan -dewan kedewanan -dewasa kedewasaan -dewasa mendewasakan -dewasa pendewasaan -di bedi -di bedian -di berdi -di didi -di didikan -di didikannya -di kedi -di medi -di median -di mendi -di pedi -di pendi -di pendikan -di penydikan -di perdi -dia kedia -dia media -dia medialah -dia medianya -dia mendia -dia menydiakan -dia pedia -dia sedia -dia sediaan -dia sediakan -dia sedianya -diagnosis didiagnosis -diagnosis mendiagnosis -diagnosis mendiagnosisnya -diagnosis terdiagnosis -diagonal berdiagonal -dialek berdialek -dialektika berdialektika -dialog berdialog -dialog didialogkan -dialog mendialogkan -diam berdiam -diam berdiamnya -diam didiami -diam didiamkan -diam kediaman -diam mendiami -diam mendiamkan -diam mendiamkannya -diam pendiam -diam terdiam -diameter berdiameter -dian bedian -dian median -diang mediang -diang mendiang -dias medias -dias mediasi -diaspora berdiaspora -didih mendidih -didih mendidihkan -didik dididik -didik dididiknya -didik mendidik -didik mendidikan -didik mendidiknya -didik pedidikan -didik pendidik -didik pendidikan -didik pendidikkan -didik pendidiknya -didik terdidik -diet berdiet -diet didiet -diet pediet -diferensiasi berdiferensiasi -diferensiasi terdiferensiasi -digdaya kedigdayaan -digit berdigit -digital didigitalkan -digital mendigitalkan -digitalisasi didigitalisasi -digitalisasi mendigitalisasi -digitalisasi mendigitalisasikan -digitalisasi terdigitalisasi -dik didik -dik didikan -dik didiknya -dik medik -dik mediknya -dik pendikan -dik penydik -dik penydikan -dik sediki -dikit sedikit -dikit sedikitlah -dikit sedikitnya -dikotomi didikotomikan -dikotomi mendikotomi -dikotomi mendikotomikan -diktator kediktatoran -dikte didikte -dikte didiktekan -dikte mendikte -dikte mendiktekan -dikte mendiktenya -dikte pendiktean -dil bedil -dil bedilan -dil kedilan -dil pengdilan -dil sedili -dimensi berdimensi -din beldin -din didin -din medin -din medini -din mendini -din sedini -dinamika berdinamika -dinamis kedinamisan -dinding berdinding -dinding berdindingkan -dinding didinding -dinding kedinding -dingin bedingin -dingin didinginkan -dingin kedinginan -dingin mendingin -dingin mendinginkan -dingin mendinginkannya -dingin mendinginnya -dingin pendingin -dingin pendinginan -dingin pendinginnya -dingin sedingin -dingin terdingin -dini medini -dini mendini -dini sedini -dipan kedipan -diplomasi berdiplomasi -dirgantara kedirgantaraan -diri bediri -diri berdiri -diri berdirikan -diri berdirilah -diri berdirinya -diri didirikan -diri didirikannya -diri kediri -diri mendiri -diri mendirikan -diri mendirikannya -diri pendiri -diri pendirian -diri pendirinya -diri sediri -diri terdiri -disiplin berdisiplin -disiplin didisiplinkan -disiplin kedisiplinan -disiplin mendisiplinkan -disiplin pendisiplinan -disko berdisko -diskon berdiskon -diskon didiskon -diskon mendiskon -diskon terdiskon -diskredit didiskreditkan -diskredit mendiskreditkan -diskredit mendiskreditkannya -diskredit pendiskreditan -diskriminasi didiskriminasi -diskriminasi didiskriminasikan -diskriminasi mendiskriminasi -diskriminasi mendiskriminasikan -diskriminasi terdiskriminasi -diskualifikasi didiskualifikasi -diskualifikasi didiskualifikasinya -diskualifikasi mendiskualifikasi -diskualifikasi pendiskualifikasian -diskus berdiskusi -diskusi berdiskusi -diskusi berdiskusilah -diskusi didiskusikan -diskusi didiskusikannya -diskusi mendiskusikan -diskusi mendiskusikannya -diskusi pendiskusian -disposisi didisposisi -disposisi didisposisikan -disposisi mendisposisi -disposisi mendisposisikan -disrupsi mendisrupsi -disrupsi terdisrupsi -distorsi didistorsi -distorsi mendistorsi -distorsi terdistorsi -distribusi didistribusi -distribusi didistribusikan -distribusi didistribusikannya -distribusi mendistribusi -distribusi mendistribusikan -distribusi mendistribusikannya -distribusi pendistribusi -distribusi pendistribusian -distribusi terdistribusi -distribusi terdistribusikan -distribusi terdistribusinya -diversifikasi mendiversifikasi -diversifikasi mendiversifikasikan -diversifikasi terdiversifikasi -divestasi didivestasi -divestasi didivestasikan -divestasi mendivestasi -divestasi mendivestasikan -do dido -do kedokan -do medo -do medokan -do mendo -do mendoan -do mendokan -do sedo -doa berdoa -doa berdoalah -doa berdoanya -doa didoakan -doa mendoakan -doa mendoakannya -doa pendoa -doa sedoa -dobrak didobrak -dobrak mendobrak -dobrak mendobraknya -dobrak pendobrak -dobrak pendobrakan -dodor kedodoran -dok bedok -dok kedok -dok kedokan -dok kedoknya -dok medok -dok medokan -dok mendokan -dok sedok -dokter kedokter -dokter kedokteran -doktrin didoktrin -doktrin mendoktrin -doktrin pendoktrinan -doktrin terdoktrin -dokumen berdokumen -dokumentasi didokumentasi -dokumentasi didokumentasikan -dokumentasi mendokumentasi -dokumentasi mendokumentasikan -dokumentasi mendokumentasikannya -dokumentasi pendokumentasian -dokumentasi terdokumentasi -dokumentasi terdokumentasikan -dol bedol -dol didol -dol sedol -dom pedoman -dom pendoman -domain berdomain -dominan sedominan -dominasi berdominasi -dominasi didominasi -dominasi medominasi -dominasi mendominasi -dominasi mendominasinya -domisili berdomisili -dompet berdompet -dompleng didompleng -dompleng didomplengi -dompleng mendompleng -dompleng pendompleng -dompleng pendomplengan -donasi berdonasi -donasi didonasikan -donasi mendonasi -donasi mendonasikan -donasi mendonasikannya -dong bedong -dong didong -dong mendong -dong sedong -dongak mendongak -dongak mendongakkan -dongan kedonganan -dongeng didongengi -dongeng mendongeng -dongeng mendongengkan -dongeng pendongeng -dongkel didongkel -dongkel mendongkel -dongkel mendongkelnya -dongkel pedongkelan -dongkel pendongkelan -dongkol kedongkolan -dongkrak didongkrak -dongkrak mendongkrak -dongkrak mendongkraknya -dongkrak mengdongkrak -dongkrak pendongkrak -dongkrak terdongkrak -dongkrak terdongkraknya -donor berdonor -donor didonorkan -donor mendonor -donor mendonorkan -donor pedonor -donor pendonor -donor pendonoran -donor pendonornya -dor bedor -dor didor -dorong didorong -dorong didorongnya -dorong kedorong -dorong medorong -dorong memdorong -dorong mendorong -dorong mendorongnya -dorong pendorong -dorong pendorongan -dorong pendorongnya -dorong terdorong -dorong terdorongnya -dosa berdosa -dosa pendosa -dosis berdosis -dot sedot -dot sedotan -doyo bedoyo -doyo mendoyo -dram pedram -dramatis sedramatis -dramatisasi didramatisasi -dramatisasi mendramatisasi -drastis sedrastis -dribel mendribel -drop didrop -drop mendrop -dua bedua -dua beduai -dua berdua -dua berduaan -dua berdualah -dua didua -dua diduakan -dua kedua -dua keduanya -dua keduanyalah -dua medua -dua mendua -dua menduakan -duai beduai -dubes kedubes -dubes kedubesnya -duda diduda -duda menduda -dudu didudukan -dudu kedudukan -dudu kedudukannya -dudu mendudukan -dudu mendudukannya -dudu pendudukan -dudu pendudukannya -duduk diduduk -duduk didudukan -duduk diduduki -duduk didudukkan -duduk kedudukan -duduk meduduki -duduk menduduk -duduk mendudukan -duduk menduduki -duduk mendudukkan -duduk mendudukkannya -duduk peduduk -duduk penduduk -duduk pendudukan -duduk penduduknya -duduk terduduk -duel berduel -duet beduet -duet berduet -duet diduetkan -duet menduetkan -duet menduetkannya -duga diduga -duga didugakan -duga diduganya -duga meduga -duga menduga -duga menduganya -duga pendugaan -duga terduga -duga terduganya -duh seduh -duh seduhan -duh seduhlah -duit berduit -duk beduk -duk diduki -duk kedukan -duka berduka -duka kedukaan -duka menduka -dukacita berdukacita -dukan kedukan -duku pendukunya -dukuh pedukuhan -dukun mendukun -dukun perdukunan -dukung didukung -dukung didukungan -dukung didukungnya -dukung medukung -dukung memdukung -dukung mendukung -dukung mendukungan -dukung mendukungnya -dukung pedukung -dukung pedukungnya -dukung pendukung -dukung pendukungan -dukung pendukungnya -dukung terdukung -dula medula -dulang didulang -dulang mendulang -dulang pendulang -dulang pendulangan -dulang sedulang -duli peduli -duli pedulian -duli pedulikan -duli pedulinya -duli perduli -dulur sedulur -dum bedum -dung bedungan -dung kedung -dung mendung -dung pedungan -dung pendung -dunia didunia -dunia kedunia -dunia keduniaan -dunia mendunia -dunia menduniakan -dunia sedunia -duniawi keduniawian -duplikasi diduplikasi -duplikasi menduplikasi -duplikasi menduplikasikan -duplikasi terduplikasi -duplikat diduplikat -duplikat menduplikat -dur berduri -dur mendur -durasi bedurasi -durasi berdurasi -duri berduri -dusta berdusta -dusta kedustaan -dusta mendustakan -dusta pendusta -duta kedutaan -duyun berduyun -eban menyebankan -ecek mengecek -ecek mengecekan -ecek mengeceknya -ecek pengecek -ecek pengecekan -ecek pengecekkan -ecer diecer -ecer mengecer -ecer mengecerkan -ecer pengecer -ecer pengecernya -edan mengedan -edar beredar -edar beredarlah -edar beredarnya -edar diedar -edar diedarkan -edar diedarkannya -edar mengedar -edar mengedarkan -edar mengedarkannya -edar pengedar -edar pengedaran -edar pengedarnya -edar peredar -edar peredaran -edit diedit -edit mengedit -edit mengeditnya -edit pengedit -edit pengeditan -edukasi diedukasi -edukasi mengedukasi -edukasi mengedukasikan -edukasi teredukasi -ef beef -efek berefek -efektif diefektifkan -efektif keefektifan -efektif mengefektifkan -efektif pengefektifan -efektif seefektif -efektif terefektif -efektivitas keefektivitasan -efisien diefisienkan -efisien keefisienan -efisien mengefisienkan -efisien seefisien -efisiensi diefisiensi -efisiensi diefisiensikan -efisiensi mengefisiensi -efisiensi mengefisiensikan -egah menegah -egah penegah -egah penegahan -egat menyegat -ego diego -ego meego -ego menego -egois keegoisan -egol mengegolkan -eh meehan -eh meneh -eja dieja -eja mengeja -eja mengejanya -eja pengejaan -ejakulasi berejakulasi -ejan mengejan -ejawantah diejawantahkan -ejawantah mengejawantah -ejawantah mengejawantahkan -ejawantah pengejawantahan -ejek diejek -ejek mengejek -ejek mengejeknya -ekang belekang -ekang mengekang -ekang mengekangnya -ekang pengekang -ekang pengekangan -ekonom berekonomi -ekonom perekonoman -ekonom perekonomi -ekonomi berekonomi -ekonomi keekonomian -ekonomi perekonomi -ekonomi perekonomian -ekonomis keekonomisan -ekor berekor -ekor mengekor -ekor mengekornya -ekor pengekor -ekor perekor -ekor seekor -eks bereksi -eks meeks -eks seeks -eksaminasi dieksaminasi -eksaminasi mengeksaminasi -eksekusi dieksekusi -eksekusi dieksekusinya -eksekusi mengeksekusi -eksekusi mengeksekusinya -eksekusi pengeksekusi -eksekusi pengeksekusian -eksekusi tereksekusi -ekses berekses -eksfoliasi mengeksfoliasi -ekskavasi diekskavasi -ekskavasi mengekskavasi -eksklusif mengeksklusifkan -ekskresi diekskresikan -eksotis keeksotisan -ekspansi berekspansi -ekspansi diekspansi -ekspansi mengekspansi -eksperimen bereksperimen -eksperimen bereksperimenlah -eksploitasi dieksploitasi -eksploitasi mengeksploitasi -eksploitasi mengeksploitasinya -eksploitasi pengeksploitasi -eksploitasi pengeksploitasian -eksploitasi tereksploitasi -ekspor diekspor -ekspor diekspornya -ekspor mengekspor -ekspor mengekspornya -ekspor pengekspor -ekspor pengeksporan -ekspos diekspos -ekspos mengekspos -ekspos mengeksposnya -ekspos terekspos -ekspos tereksposnya -ekspose diekspose -ekspose mengekspose -ekspose terekspose -ekspres berekspresi -ekspres terekspresi -ekspresi berekspresi -ekspresi diekspresikan -ekspresi mengekspresikan -ekspresi mengekspresikannya -ekspresi pengekspresian -ekspresi terekspresi -ekstensi berekstensi -ekstradisi diekstradisi -ekstradisi mengekstradisi -ekstradisi mengekstradisinya -ekstradisi pengekstradisian -ekstrak diekstrak -ekstrak mengekstrak -ekstraksi diekstraksi -ekstraksi mengekstraksi -ekstrem seekstrem -ekstrem terekstrem -el belel -el keel -el meel -el menelan -el peel -el perel -el pereli -elaborasi dielaborasi -elaborasi mengelaborasi -elak dielak -elak dielakan -elak dielakkan -elak mengelak -elak mengelakkan -elak mengelaknya -elak menyelak -elak pengelak -elak pengelakan -elak terelakan -elak terelakkan -elan memelankan -elan menelan -elan menelannya -elang pelelang -elang pelelangan -elastisitas keelastisitasan -elemen berelemen -eliminasi dieliminasi -eliminasi mengeliminasi -eliminasi tereliminasi -elite terelite -elo keelokan -elo mengelolah -elo pengelolah -elok keelokan -elu dielukan -elu memelukan -elu mengelukan -elung keelung -elus dielus -elus mengelus -elus mengelusnya -em belem -em berem -em diem -em menem -em pelem -em pereman -em seem -email diemail -emang mememangi -emang mememangkan -emang pememang -emas beremas -emas keemasan -emas mengemas -emas mengemasi -emas mengemaskan -emas mengemasnya -emas pelemasan -emas pengemas -emas pengemasan -emat menemati -emat mengemat -emat menyemat -emat menyematkan -emat menyematkannya -emat pengematan -emat penyematan -embah menembah -embah menembahkan -embah menyembah -embah menyembahnya -embah penembahan -embah penyembah -embah penyembahan -embak menembak -embak menembakan -embak menembaki -embak menembakkan -embak menembakkannya -embak menembaknya -embak mengembakan -embak penembak -embak penembakan -embak penembakkan -embak penembaknya -emban diemban -emban diembankan -emban diembannya -emban mengemban -emban mengembankan -emban mengembannya -emban pengemban -emban pengembanan -embara mengembara -embara pengembara -embara pengembaraan -embargo diembargo -embargo mengembargo -embat diembat -ember seember -embik mengembik -embok menembok -embok penembokan -embuh menembuh -embuh menyembuh -embuh menyembuhkan -embuh menyembuhkannya -embuh penyembuh -embuh penyembuhan -embun berembun -embun mengembun -embun pengembunan -embung mengembung -embus berembus -embus berembusnya -embus diembuskan -embus menembus -embus menembuskan -embus menembusnya -embus mengembuskan -embus penembus -embus penembusan -embut menyembut -embut menyembutkan -embut pelembut -emigrasi beremigrasi -emir keemiran -emir menyemir -emir penyemir -emis beremisi -emis mengemis -emis mengemisnya -emis pengemis -emisi beremisi -emong mengemong -empal menyempal -empar keempar -empar mengemparkan -empar pelempar -empar pelemparan -empas diempas -empas diempaskan -empas mengempas -empas mengempaskan -empas terempas -empat berempat -empat berempati -empat diempat -empat keempat -empat keempatan -empat keempatnya -empat menempat -empat menempatan -empat menempati -empat menempatkan -empat menempatkannya -empat menyempatkan -empat penempat -empat penempatan -empat perempat -empat perempatan -empat perempatnya -empati berempati -empati menempati -empati menempatinya -empu keempukan -empu perempuan -empuan perempuan -empuan perempuanlah -empuan perempuannya -empuk keempukan -empuk mengempukkan -emulsi pengemulsi -emut mengemut -emut menyemut -emut menyemuti -en been -en belen -en dien -en keen -en keenan -en memen -en mengeni -en peen -en penen -en pengen -en pengennya -en peren -en seen -enak keenakan -enak mengenak -enak mengenakan -enak mengenakkan -enak seenak -enak seenaknya -enak terenak -enam berenam -enam dienam -enam keenam -enam keenamnya -enas mengenasi -enas mengenaskan -encang mengencang -encang mengencangkan -encang mengencangkannya -encang pengencang -encang pengencangan -encer diencerkan -encer mengencerkan -encer pengencer -encer pengenceran -endal pengendali -endang menendang -endang menendangi -endang menendangkan -endang menendangnya -endang penendang -endang penendangan -endang penendangnya -endap diendapkan -endap mengendap -endap mengendapkan -endap mengendapnya -endap pengendapan -endap terendap -endong mengendong -endus diendus -endus mengendus -endus mengendusnya -endus pengendus -endus pengendusan -endus terendus -endus terendusnya -energi berenergi -engah menengah -engah menengahi -engah menengahkan -engah menengahnya -engah mengengah -engah penengah -engah penengahan -engah penengahnya -engah terengah -engas menengaskan -enggak menenggak -enggak menenggaknya -enggak penenggak -enggak seenggaknya -enggan keengganan -enggang menenggang -enggang perenggangan -engsel berengsel -enkripsi dienkripsi -enkripsi mengenkripsi -enkripsi terenkripsi -entah mementahkan -entah mementahkannya -entak mengentak -entak menyentak -entak menyentakkan -entak perentak -entas dientas -entas dientaskan -entas mementaskan -entas mengentas -entas mengentaskan -entas pementasan -entas pengentasan -entas perentas -entas terentaskan -enteng menenteng -enteng mengentengkan -enyah dienyahkan -enyah mengenyahkan -enyak terenyak -epak mengepak -epak mengepakan -epak mengepakkan -epak menyepak -epak menyepaknya -epak pengepakan -epik menepikan -epos mengepos -epos mengeposkan -er beer -er beeri -er beler -er dier -er meer -er memerkan -er meneri -er mengeri -er peer -er pemeran -er pener -er pengeran -er penyeran -er seer -era diera -era keera -era menerakan -era mengerakan -era menyerakan -era peneraan -era perera -erak menerakan -erak mengerak -erak mengerakan -erak mengerakkan -erak menyerakan -erak pengerak -eram mengeram -eram mengerami -eram menyeramkan -eram pengeraman -erang belerang -erang belerangnya -erang memerangi -erang menerangan -erang menerangi -erang menerangkan -erang menerangkannya -erang mengerang -erang menyerang -erang menyerangan -erang menyerangkan -erang menyerangnya -erang pemerangan -erang penerang -erang penerangan -erang pengerang -erang penyerang -erang penyerangan -erang penyerangnya -erat keeratan -erat mengerat -erat mengeratkan -erat menyerat -erat pemeratan -erat pengerat -erat pererat -erata memeratakan -erata pemerataan -ereksi berereksi -eret menyeret -eret menyeretnya -eret penyeret -eret penyeretan -erik memerikan -erik menerikan -erik menerikkan -erik mengerik -erik mengerikan -ering mengering -ering mengeringkan -ering mengeringkannya -ering mengeringnya -ering peering -ering pengering -ering pengeringan -erong menyerong -eror meneror -eror menerornya -eror peneror -eror peneroran -erosi mengerosi -erosi tererosi -erpak menerpakan -erti mengerti -erti mengertilah -erti mengertinya -erti pengertian -erti seerti -eru menyeru -eru menyerukan -eru menyerukannya -eru pengerukan -eru pengerukannya -eru penyeru -erupsi bererupsi -es bees -es beres -es beresi -es bereskan -es beresnya -es dies -es kees -es mees -es memes -es memesan -es menes -es pemesan -es peres -es sees -esa keesaan -esa mengesakan -esa menyesakan -esa teresa -esai menyesaikan -esai penyesaian -esak mengesakan -esak menyesak -esak menyesakan -esak menyesaki -esak menyesakkan -eskalasi bereskalasi -eskalasi dieskalasi -eskalasi mengeskalasi -esok keesokan -esok keesokkan -estafet diestafetkan -ester meester -estetika berestetika -estimasi diestimasi -estimasi diestimasikan -estimasi mengestimasi -estimasi mengestimasikan -eta keeta -eta memetakan -eta memetakannya -eta mengetakan -eta menyetakan -eta peletakan -eta peletakannya -eta pemetaan -eta penyetakan -etek menetek -eter dieter -eter meneteri -eter peeter -etik memetik -etik memetiknya -etik mengetik -etik mengetikan -etik mengetikkan -etik mengetiknya -etik pemetik -etik pemetikan -etik pengetik -etik pengetikan -etika beretika -etika memetika -etnik beretnik -etnis beretnis -etos beretos -euforia bereuforia -eutanasia dieutanasia -evakuasi dievakuasi -evakuasi dievakuasinya -evakuasi mengevakuasi -evakuasi mengevakuasikan -evakuasi mengevakuasinya -evakuasi pengevakuasi -evakuasi pengevakuasian -evakuasi terevakuasi -evaluasi dievaluasi -evaluasi mengevaluasi -evaluasi mengevaluasinya -evaluasi pengevaluasian -evaluasi terevaluasi -evolusi berevolusi -evolusi mengevolusi -fa befa -fa difa -fa kefa -fa sefa -fabel difabel -faedah berfaedah -faktor memfaktorkan -falsafah berfalsafah -fanatik kefanatikan -fantasi berfantasi -fantastis sefantastis -farmasi kefarmasian -fasih kefasihan -fasilitas berfasilitas -fasilitas difasilitas -fasilitas difasilitasi -fasilitas memfasilitas -fasilitas memfasilitasi -fasilitas menfasilitasi -fasilitas mengfasilitasi -fasilitas terfasilitasi -fatal kefatalan -fatwa berfatwa -fatwa difatwa -fatwa difatwakan -fatwa memfatwakan -favorit difavoritkan -favorit difavoritkannya -favorit memfavoritkan -favorit terfavorit -favorit terfavoritnya -fenomenal sefenomenal -fermentasi berfermentasi -fermentasi difermentasi -fermentasi difermentasikan -fermentasi memfermentasi -fermentasi terfermentasi -festival difestivalkan -fi difi -fi kefi -fi sefi -fiksasi difiksasi -film difilmkan -film memfilmkan -film memfilmkannya -film perfilman -filosofi berfilosofi -filter berfilter -filter difilter -filter memfilter -filter pemfilteran -final difinal -final difinalkan -final kefinal -final memfinalkan -firasat berfirasat -firman berfirman -fisik berfisik -fitnah difitnah -fitnah memfitnah -fitnah memfitnahnya -fitnah menfitnah -fitnah pemfitnah -fitnah pemfitnahan -fitnah terfitnah -fleksibel sefleksibel -fluktuasi berfluktuasi -fluktuasi berfluktuasinya -fluktuatif berfluktuatif -fokus berfokus -fokus berfokuslah -fokus difokuskan -fokus memfokuskan -fokus menfokuskan -fokus mengfokuskan -fokus pemfokusan -fokus terfokus -fokus terfokusnya -formal diformalkan -formal memformalkan -formalin berformalin -formalin diformalin -forman performan -forman performannya -format berformat -format diformat -format memformat -formulasi diformulasi -formulasi diformulasikan -formulasi memformulasi -formulasi memformulasikan -forsir diforsir -forsir memforsir -fortifikasi difortifikasi -foto berfoto -foto difoto -foto difotonya -foto memfoto -foto memfotonya -foto terfoto -fotokopi difotokopi -fotokopi memfotokopi -fotosintesis berfotosintesis -fragmentasi terfragmentasi -fraksi difraksi -fraksi sefraksinya -frekuensi berfrekuensi -frustrasi kefrustrasian -fundamental berfundamental -fungi berfungi -fungsi befungsi -fungsi berfungsi -fungsi berfungsinya -fungsi difungsi -fungsi difungsikan -fungsi difungsikannya -fungsi memfungsikan -fungsi memfungsikannya -fungsi mengfungsikan -fungsional difungsionalkan -fusi berfusi -fusi difusi -gabai mengabaikan -gabai mengabaikannya -gabai pengabaian -gabung begabung -gabung bergabung -gabung bergabunglah -gabung bergabungnya -gabung digabung -gabung digabungkan -gabung digabungkannya -gabung digabungnya -gabung mengabungkan -gabung menggabung -gabung menggabungan -gabung menggabungkan -gabung menggabungkannya -gabung pengabungan -gabung penggabung -gabung penggabungan -gabung tergabung -gabung tergabungnya -gada digadai -gada megadakan -gada mengada -gada mengadakan -gada mengadakannya -gada menggadai -gada menggadakan -gada pengada -gada pengadaan -gada penggadaan -gada penggadai -gada tergadai -gadai digadai -gadai digadaikan -gadai digadaikannya -gadai mengadaikan -gadai menggadai -gadai menggadaikan -gadai menggadaikannya -gadai pegadaian -gadai pengadaian -gadai penggadai -gadai penggadaian -gadai pergadaian -gadai tergadai -gadai tergadaikan -gadang begadang -gadang bergadang -gadang digadang -gadang digadangkan -gadang mengadang -gadang mengadangnya -gadang menggadang -gadang pegadang -gadang pengadang -gadang pengadangan -gadang pergadangan -gading bergading -gadis kegadisan -gaduh kegaduhan -gaduh mengaduh -gaduh penggaduh -gaduk mengaduk -gaduk mengadukan -gaduk mengaduknya -gaduk pengaduk -gaduk pengadukan -gadung mengadung -gadung pegadungan -gadungan pegadungan -gaet digaet -gaet digaetnya -gaet mengaet -gaet menggaet -gaet menggaetnya -gaga mengaga -gagah digagahi -gagah kegagahan -gagah menggagahi -gagah segagah -gagal digagalkan -gagal digagalkannya -gagal kegagalan -gagal mengagalkan -gagal menggagalkan -gagal menggagalkannya -gagal penggagalan -gagang bergagang -gagap kegagapan -gagap menggagap -gagap tergagap -gagas digagas -gagas digagasnya -gagas mengagas -gagas menggagas -gagas pengagas -gagas penggagas -gagas penggagasnya -gagu menggagu -gah begah -gah megah -gah megahnya -gah mengah -gahar kegaharan -gahar segahar -gaib kegaiban -gail mengail -gain megain -gairah bergairah -gairah bergairahnya -gairah kegairahan -gairah mengairahkan -gairah menggairahkan -gajak mengajak -gajak mengajakan -gajak mengajaknya -gaji bergaji -gaji digaji -gaji digajinya -gaji mengaji -gaji mengajinya -gaji menggaji -gaji menggajinya -gaji pengajian -gaji penggajian -gala digalakan -gala mengalai -gala mengalakan -gala menggala -gala menggalakan -gala penggalakan -gala segala -gala segalanya -gala-gala segala-galanya -galah megalahkan -galah mengalah -galah mengalahan -galah mengalahkan -galah mengalahkannya -galah menggalahkan -galai mengalai -galak digalakan -galak digalakkan -galak digalakkannya -galak mengalakan -galak mengalakkan -galak menggalakan -galak menggalakkan -galak penggalakan -galak penggalakkan -galak segalak -galan mengalani -galan menggalan -galan penggalan -galan penggalannya -galang digalang -galang digalangkan -galang digalangnya -galang mengalang -galang mengalangi -galang menggalang -galang menggalangkan -galang pengalangan -galang penggalang -galang penggalangan -galang tergalang -galar menggalar -galau kegalauan -galau mengalau -galeng pengalengan -gali digali -gali digalinya -gali mengali -gali mengalikan -gali menggali -gali menggalinya -gali pengali -gali pengalian -gali penggali -gali penggalian -gali tergali -galih mengalih -galih mengalihan -galih mengalihkan -galih mengalihkannya -galih pengalih -galih pengalihan -galir mengalir -galir mengaliri -galir mengalirkan -galir mengalirkannya -galir mengalirlah -galir mengalirnya -galir pengalir -galir pengaliran -galon segalon -galuh megaluh -gam megaman -gam megami -gam mengaman -gam mengami -gam mengamkan -gam pengaman -gama bergama -gama kegamaan -gama mengamakan -gama pengamaan -gama segamai -gamak mengamakan -gamal mengamali -gamal mengamalkan -gamal mengamalkannya -gamal pengamal -gamal pengamalan -gamam pengamaman -gaman megaman -gaman megamankan -gaman mengaman -gaman mengamanan -gaman mengamankan -gaman mengamankannya -gaman pegamanan -gaman pengaman -gaman pengamanan -gaman pengamankan -gaman pengamannya -gamang kegamangan -gamat mengamati -gamat mengamatkan -gamat pengamat -gamat pengamatan -gamat pengamatnya -gambang mengambang -gambang mengambangkan -gambang mengambangnya -gambang pengambang -gambang pengambangan -gambar bergambar -gambar bergambarkan -gambar digambar -gambar digambari -gambar digambarkan -gambar digambarkannya -gambar digambarnya -gambar mengambar -gambar mengambarkan -gambar menggambar -gambar menggambari -gambar menggambarkan -gambar menggambarkannya -gambar menggambarnya -gambar penggambar -gambar penggambaran -gambar tergambar -gambar tergambarkan -gambir pegambiran -gambir pengambiran -gamblang segamblang -gambut bergambut -gamis bergamis -gamit menggamit -gampang menggampangkan -gampang segampang -gampar digampar -gampar menggampar -gana menganai -gana menganakan -gana pengana -ganal menganal -ganas keganasan -ganas mengganas -ganas mengganasnya -ganas seganas -ganas terganas -ganda berganda -ganda digandakan -ganda kegandaan -ganda mengandakan -ganda mengganda -ganda menggandakan -ganda menggandakannya -ganda pengandaan -ganda pengganda -ganda penggandaan -gandal mengandalkan -gandal mengandalkannya -gandal menggandalkan -gandar pengandaran -gandeng bergandeng -gandeng bergandengan -gandeng digandeng -gandeng digandengkan -gandeng digandengnya -gandeng mengandeng -gandeng menggandeng -gandeng menggandengan -gandeng menggandengkan -gandeng menggandengnya -gandi pegandikan -gandik pegandikan -gandrung digandrungi -gandrung kegandrungan -gandrung mengandrungi -gandrung menggandrungi -gandung megandung -gandung mengandung -gandung mengandungnya -gandung menggandung -gang megang -gang memgang -gang pegang -gang pegangan -gang peganglah -gang pegangnya -gang pemgang -gang pengang -gang pengangan -ganggu diganggu -ganggu keganggu -ganggu menganggu -ganggu menganggukan -ganggu menganggunya -ganggu mengganggu -ganggu mengganggunya -ganggu penganggu -ganggu pengganggu -ganggu terganggu -ganggu terganggunya -gangsa pegangsaan -gangsa pengangsaan -gani mengani -gani segani -ganjal diganjal -ganjal keganjalan -ganjal menganjal -ganjal mengganjal -ganjal mengganjalnya -ganjal pengganjal -ganjal pengganjalan -ganjal terganjal -ganjal terganjalnya -ganjar diganjar -ganjar diganjarkan -ganjar menganjar -ganjar mengganjar -ganjar mengganjarnya -ganjil keganjilan -ganjur menganjurkan -ganjur menganjurkannya -ganjur penganjur -ganjur penganjuran -gantang menggantang -gantar mengantar -gantar mengantarkan -gantar mengantarkannya -gantar mengantarnya -gantar pengantar -gantar pengantaran -gantar pengantarnya -ganteng kegantengan -ganteng seganteng -ganteng terganteng -gantung bergantung -gantung bergantungan -gantung bergantungnya -gantung digantung -gantung digantungi -gantung digantungkan -gantung digantungnya -gantung mengantung -gantung mengantungi -gantung mengantungkan -gantung menggantung -gantung menggantungkan -gantung menggantungkannya -gantung menggantungnya -gantung pegantungan -gantung penggantung -gantung penggantungan -gantung tergantung -gantung tergantungnya -ganyang diganyang -ganyang mengganyang -ganyang pengganyangan -gap menggap -gap menggapi -gap pengap -gap pengapnya -gapai digapai -gapai digapainya -gapai mengapai -gapai menggapai -gapai menggapainya -gapai tergapai -gapit mengapit -gapit mengapitnya -gapit pengapit -gar megar -gar menggarkan -gar penggaran -gar segar -gar segaran -gar segarkan -gar segarnya -garah megarah -garah mengarah -garah mengarahan -garah mengarahkan -garah mengarahkannya -garah mengarahnya -garah pengarah -garah pengarahan -garah pengarahnya -garai pengaraian -garam bergaram -garam digarami -garam mengaramkan -garam menggarami -garam pegaraman -garam penggaraman -garam segaram -garan penggaran -garan segaran -garang kegarangan -garang mengarang -garang pengarang -garang pengarangnya -garang segarang -garangan kegarangan -garangan kegarangannya -garansi bergaransi -garansi digaransi -garansi menggaransi -garap bergarap -garap digarap -garap digarapnya -garap mengarap -garap mengarapkan -garap menggarap -garap menggarapnya -garap penggarap -garap penggarapan -garap tergarap -garis bergaris -garis digaris -garis digariskan -garis menggaris -garis menggariskan -garis pegaris -garis penggaris -garis segaris -garong digarong -garong menggarong -garong penggarongan -garuk digaruk -garuk menggaruk -garuk menggaruknya -garuk penggaruk -garung mengarungi -garung pengarungan -gas bergas -gas digas -gas mengaskan -gas pegas -gas tergas -gasak digasak -gasak mengasak -gasak menggasak -gasing mengasing -gasing mengasingkan -gasing pegasing -gasing pengasingan -gatal kegatalan -gatal mengatalan -gaul bergaul -gaul bergaullah -gaul bergaulnya -gaul digauli -gaul menggauli -gaul pergaulan -gaun bergaun -gaun menggauni -gaung bergaung -gaung digaungkan -gaung mengaung -gaung menggaung -gaung menggaungkan -gawai megawai -gawai mengawai -gawai pegawai -gawai pegawainya -gawai pengawai -gawal mengawal -gawal mengawali -gawal mengawalnya -gawal pengawal -gawal pengawalan -gawal pengawalnya -gawan begawan -gawan pegawan -gawan pengawan -gawang digawang -gawang digawangi -gawang kegawang -gawang megawangi -gawang mengawang -gawang menggawangi -gawat kegawat -gawat kegawatan -gawat megawat -gawat megawati -gawat mengawati -gaya bergaya -gaya mengayakan -gaya pengaya -gaya pengayaan -gayam pegayaman -gayuh mengayuh -gayuh mengayuhkan -gayuh pengayuh -gayun mengayun -gayun mengayunkan -gayun mengayunkannya -ge berge -ge menge -ge menggelah -ge pege -gebang mengebangkan -geber digeber -geber mengeber -geber menggeber -geblok mengeblok -gebrak digebrak -gebrak mengebrak -gebrak menggebrak -gebrak penggebrak -gebu menggebu -gebuk digebuk -gebuk digebuki -gebuk menggebuk -gebuk menggebuki -gebuk penggebuk -gecek mengecek -gecek mengecekan -gecek mengeceknya -gecek pengecek -gecek pengecekan -gecek pengecekkan -gecer mengecer -gecer mengecerkan -gecer pengecer -gecer pengecernya -gede kegedean -gede segede -gedok digedok -gedor digedor -gedor mengedor -gedor menggedor -gedor penggedor -gedung digedung -gegabah segegabah -gegas bergegas -gegas bergegaslah -gegas mengegaskan -geger digegerkan -geger kegegeran -geger mengegerkan -geger menggegerkan -gejala bergejala -gejala menggejala -gejolak bergejolak -gejolak bergejolaknya -gel kegel -gel megel -gel pegel -gel segel -gel segelnya -gela menggela -gela pengelakan -gela segela -gelak mengelak -gelak mengelakkan -gelak mengelaknya -gelak pengelak -gelak pengelakan -gelak tergelak -gelam mengelami -gelam pengelaman -gelambir bergelambir -gelambir menggelambir -gelandang digelandang -gelandang menggelandang -gelandang menggelandangnya -gelang bergelang -gelang pegelangan -gelang pergelangan -gelantung bergelantung -gelantung bergelantungan -gelantung menggelantung -gelantung tergelantung -gelap digelapkan -gelap digelapkannya -gelap kegelapan -gelap mengelap -gelap mengelapkan -gelap mengelapnya -gelap menggelap -gelap menggelapkan -gelap pengelap -gelap pengelapan -gelap penggelap -gelap penggelapan -gelap segelap -gelap tergelap -gelar bergelar -gelar digelar -gelar digelaran -gelar digelari -gelar digelarkan -gelar digelarlah -gelar digelarnya -gelar mengelar -gelar mengelarkan -gelar menggelar -gelar menggelarkan -gelar menggelarnya -gelar pegelaran -gelar penggelar -gelar penggelaran -gelar pergelaran -gelar tergelar -gelar tergelarnya -gelas digelas -gelas mengelas -gelas pengelasan -gelas segelas -gelatak tergelatak -gelayut bergelayut -gelayut bergelayutan -gelayut digelayuti -gelayut menggelayut -gelayut menggelayuti -geledah digeledah -geledah mengeledah -geledah menggeledah -geledah menggeledahan -geledah menggeledahnya -geledah pengeledahan -geledah penggeledah -geledah penggeledahan -gelegak menggelegak -gelegar menggelegar -gelembung bergelembung -gelembung digelembungkan -gelembung menggelembung -gelembung menggelembungkan -gelembung menggelembungnya -gelembung pengelembungan -gelembung penggelembungan -geleng menggeleng -geleng menggelengkan -gelepar menggelepar -geleta bergeletakan -geletak bergeletakan -geletak bergeletakkan -geletak digeletakkan -geletak menggeletakkan -geletak tergeletak -geletak tergeletaknya -geli kegelian -geli menggelikan -geliat bergeliat -geliat bergeliatnya -geliat mengeliat -geliat menggeliat -geliat menggeliatkan -geliat menggeliatnya -gelimang bergelimang -gelimang bergelimangan -gelimpang bergelimpangan -gelincir menggelincir -gelincir menggelincirkan -gelincir tergelincir -gelincir tergelincirnya -gelinding digelindingkan -gelinding menggelinding -gelinding menggelindingkan -gelinjang menggelinjang -gelintir segelintir -gelisah kegelisahan -gelisah menggelisahkan -gelitik digelitik -gelitik mengelitik -gelitik menggelitik -gelitik menggelitiki -gelitik menggelitiknya -gelitik tergelitik -gelo mengelolah -gelo pengelolah -gelombang bergelombang -gelontor digelontor -gelontor digelontorkan -gelontor digelontorkannya -gelontor mengelontorkan -gelontor menggelontor -gelontor menggelontorkan -gelontor menggelontorkannya -gelontor penggelontoran -gelora bergelora -gelora digelorakan -gelora menggelora -gelora menggelorakan -geluk mengelukan -gelung bergelung -gelung digelung -gelut bergelut -gelut digeluti -gelut mengeluti -gelut menggeluti -gelut penggelut -gelut pergelutan -gema bergema -gema digemakan -gema menggema -gema menggemakan -gemak digemakan -gemak menggemakan -gemar digemari -gemar kegemaran -gemar menggemari -gemar pengemar -gemar pengemarnya -gemar penggemar -gemar penggemarnya -gemas mengemas -gemas mengemasi -gemas mengemaskan -gemas mengemasnya -gemas menggemaskan -gemas menggemaskannya -gemas pengemas -gemas pengemasan -gembak mengembakan -gembala digembalakan -gembala mengembala -gembala mengembalakan -gembala menggembala -gembala menggembalakan -gembala pengembala -gembala pengembalaan -gembala penggembala -gembala penggembalaan -gembar-gembor digembar-gembor -gembar-gembor digembar-gemborkan -gembar-gembor mengembar-gemborkan -gembar-gembor menggembar-gemborkan -gembil mengembil -gembira bergembira -gembira bergembiralah -gembira kegembiraan -gembira mengembirakan -gembira menggembirakan -gembira menggembirakannya -gembira pengembira -gembira penggembira -gembleng digembleng -gembleng mengembleng -gembleng menggembleng -gembleng penggemblengan -gembok digembok -gembok menggembok -gembok penggembokan -gembok tergembok -gembor digemborkan -gembor menggemborkan -gembos digembosi -gembos digemboskan -gembos mengembosi -gembos menggembosi -gembos menggemboskan -gembos pengembosan -gembos penggembos -gembos penggembosan -gembung digembungkan -gembung mengembung -gembung menggembung -gembung menggembungkan -gembung penggembungan -gembur menggemburkan -gembus mengembuskan -gemerlap segemerlap -gemilang kegemilangan -gemilang segemilang -geming bergeming -gempa kegempaan -gempar digemparkan -gempar kegemparan -gempar mengemparkan -gempar menggemparkan -gempur digempur -gempur mengempur -gempur menggempur -gempur penggempur -gempur penggempuran -gemuk digemukkan -gemuk kegemukan -gemuk kegemukkan -gemuk mengemukan -gemuk menggemuk -gemuk menggemukan -gemuk menggemukkan -gemuk penggemuk -gemuk penggemukan -gemuk penggemukkan -gemuk segemuk -gemuk tergemuk -gemuruh bergemuruh -gemuruh menggemuruh -gen bergen -gen mengeni -gen pengen -gen pengennya -gen segen -gena megenai -gena memgenai -gena mengena -gena mengenai -gena mengenakan -gena mengenakannya -gena menggenai -gena menggenakan -gena pengenaan -gena pengenai -genah mengenah -genang digenang -genang digenangi -genang mengenang -genang mengenangi -genang mengenangkan -genang mengenangnya -genang menggenang -genang menggenangi -genang penggenangan -genang tergenang -genang tergenangi -genang tergenangnya -genap digenapi -genap digenapkan -genap menggenapi -genap menggenapkan -genap menggenapkannya -genap penggenapan -genap segenap -gencar digencarkan -gencar digencarkannya -gencar mengencarkan -gencar menggencarkan -gencar segencar -gencet digencet -gencet menggencet -gencet tergencet -gendak mengendaki -gendang segendang -gendar mengendari -gendar pengendar -gendar pengendaran -gendong digendong -gendong digendongnya -gendong mengendong -gendong menggendong -gendong menggendongnya -gendut kegendutan -generalisasi digeneralisasi -generalisasi digeneralisasikan -generalisasi mengeneralisasi -generalisasi mengeneralisasikan -generalisasi menggeneralisasi -generalisasi menggeneralisasikan -generasi bergenerasi -generasi segenerasi -generasi segenerasinya -geng begeng -geng megengan -genggam digenggam -genggam digenggaman -genggam digenggamnya -genggam mengenggam -genggam menggenggam -genggam menggenggamnya -genggam segenggam -genggam tergenggam -gengsi bergengsi -gengsi bergengsinya -genit kegenitan -genius kegeniusan -genjot digenjot -genjot digenjotnya -genjot mengenjot -genjot menggenjot -genjot menggenjotnya -genjot penggenjot -genjot penggenjotan -genre bergenre -gentar kegentaran -gentar menggentarkan -gentas mengentas -gentas mengentaskan -gentas pengentasan -gentayang bergentayangan -gentian pengentian -genting kegentingan -genting segenting -gepok segepok -gera bergera -gera bergerakan -gera digerai -gera digerakan -gera mengerakan -gera menggerai -gera menggerakan -gera menggerakannya -gera pegerakan -gera penggerakan -gera pergerakan -gera pergerakannya -gera segera -gera segerakan -gera segeralah -gera segeranya -gera tergerai -gerah kegerahan -gerah mengerah -gerah mengerahkan -gerah mengerahkannya -gerah menggerahkan -gerah pengerah -gerah pengerahan -gerai digerai -gerai menggerai -gerai tergerai -gerak begerak -gerak bergerak -gerak bergerakan -gerak bergeraklah -gerak bergeraknya -gerak digerakan -gerak digerakkan -gerak mengerak -gerak mengerakan -gerak mengerakkan -gerak menggerak -gerak menggerakan -gerak menggerakkan -gerak menggerakkannya -gerak pegerakan -gerak pengerak -gerak penggerak -gerak penggerakan -gerak penggeraknya -gerak pergerakan -gerak pergerakkan -gerak pergerakkannya -gerak segerakan -gerak tergerak -geram kegeraman -geram mengeram -geram mengerami -geram menggeram -geram pengeraman -geraman kegeraman -geraman kegeramannya -geraman pengeraman -gerang mengerang -gerang pengerang -gerat mengerat -gerat mengeratkan -gerat pengerat -gerayang digerayangi -gerayang menggerayangi -gerebek digerebek -gerebek digerebeknya -gerebek mengerebek -gerebek menggerebek -gerebek menggerebeknya -gerebek pengerebekan -gerebek penggerebekan -gerebek penggerebekkan -gerek mengerek -gerek menggerek -gerek pengerek -gerek penggerek -gerek penggerekan -gerek pergerekan -geret digeret -geret menggeret -gergaji digergaji -gergaji mengergaji -gergaji menggergaji -gergaji penggergajian -gerigi bergerigi -gerilya bergerilya -gerinda digerinda -gering mengering -gering mengeringkan -gering mengeringkannya -gering mengeringnya -gering pengering -gering pengeringan -gerobak segerobak -gerogot digerogoti -gerogot mengerogoti -gerogot menggerogoti -gerogot penggerogotan -gerogot tergerogoti -gerombol bergerombol -gerombol bergerombolan -gerombol segerombol -gerombol segerombolan -geros mengerosi -gersang kegersangan -gertak digertak -gertak menggertak -gertak menggertakkan -gertak penggertak -geru pengerukan -geru pengerukannya -geruh mengeruh -geruh mengeruhkan -gerupuk pengerupukan -gerus digerus -gerus mengerus -gerus menggerus -gerus penggerus -gerus penggerusan -gerus tergerus -gerus tergerusnya -gerut mengerut -gerut mengerutkan -gerut pengerutan -gerutu menggerutu -gerutu penggerutu -gesa mengesakan -gesa tergesa -gesek bergesek -gesek bergesekan -gesek bergesekkan -gesek digesek -gesek menggesek -gesek menggesekan -gesek menggesekkan -gesek penggesek -gesek pergesekan -gesek tergesek -geser bergeser -geser bergesernya -geser digeser -geser digesernya -geser mengeser -geser menggeser -geser menggeserkan -geser menggesernya -geser pegeseran -geser penggeseran -geser pergeseran -geser tergeser -geser tergeserkan -geser tergesernya -gesit kegesitan -gesit segesit -geta mengetakan -getah bergetah -getah mengetahi -getar bergetar -getar bergetarnya -getar digetarkan -getar mengetarkan -getar menggetarkan -getar penggetar -getar tergetar -getas pengetasan -getik mengetik -getik mengetikan -getik mengetikkan -getik mengetiknya -getik pengetik -getik pengetikan -getir kegetiran -getok digetok -getok mengetok -getok menggetok -getok pengetokan -getu mengetukan -getuk mengetuk -getuk mengetukan -getuk mengetukkan -getuk mengetuknya -getuk pengetuk -gi begi -gi begian -gi belgi -gi belgian -gi digi -gi megi -gi mengi -gi pegi -gi pergi -gi pergilah -gi perginya -gi segi -gi seginya -giat bergiat -giat digiatkan -giat kegiatan -giat menggiatkan -giat mengiatkan -giat pegiat -giat pegiatnya -giat penggiat -giat penggiatnya -giat pengiat -gidik bergidik -gigi bergigi -gigih kegigihan -gigil menggigil -gigil mengigil -gigit digigit -gigit digigiti -gigit digigitnya -gigit menggigit -gigit menggigiti -gigit menggigitnya -gigit mengigit -gigit mengigitnya -gigit penggigit -gigit penggigitan -gigit tergigit -gilang mengilang -gilang mengilangkan -gilang penggilangan -gilang pengilangan -gilap mengilap -gilap mengilapnya -gilas digilas -gilas menggilas -gilas mengilas -gilas tergilas -giling digiling -giling menggiling -giling menggilingnya -giling penggiling -giling penggilingan -gilir bergilir -gilir bergiliran -gilir digilir -gilir menggilir -gilir penggiliran -gilir pergiliran -gin begin -gin begini -gin menginkan -gin pengin -gin penginnya -gin segini -gincu bergincu -gips digips -gir mengiri -gir pengiran -gir segiri -girang kegirangan -giri mengiri -giri mengirikan -giri pegirian -giri pegirikan -giri segiri -girik mengirikan -girik pegirikan -girikan mengirikan -girikan pegirikan -giring digiring -giring digiringnya -giring menggiring -giring menggiringnya -giring mengiring -giring mengiringi -giring penggiring -giring penggiringan -giring pengiring -giring pengiringan -giring pengiringnya -giring tergiring -giris mengiris -giris mengirisnya -giris pengiris -gisik mengisikan -gitar bergitar -gitar mengitari -giur menggiurkan -giur mengiur -giur mengiurkan -giur tergiur -gizi bergizi -gizi mengizikan -gizi pergizi -glamor keglamoran -global mengglobal -global mengglobalkan -global menglobal -gobar mengobarkan -gobar pengobar -gocek menggocek -gocek mengocek -goda digoda -goda menggoda -goda menggodanya -goda mengoda -goda penggoda -goda tergoda -godok digodok -godok menggodok -godok menggodoknya -godok mengodok -godok penggodok -godok penggodokan -goel digoel -gojek mengojek -gojek pengojek -gojlok digojlok -gokar pegokar -golak bergolak -golak bergolaknya -golak pergolakan -golek tergolek -golf pegolf -golok mengolok -golok mengoloknya -golong bergolongan -golong digolongkan -golong menggolongkan -golong menggolongkannya -golong mengolongi -golong penggolongan -golong segolongan -golong tergolong -gom bergomi -gondol digondol -gondol menggondol -gondol mengondol -gondol penggondol -gong digong -gonggong menggonggong -gonta-ganti bergonta-ganti -gonta-ganti digonta-ganti -gonta-ganti menggonta-ganti -gorek mengorek -gorek mengoreknya -gorek pengorek -gorek pengorekan -goreng bergoreng -goreng digoreng -goreng menggoreng -goreng menggorengnya -goreng penggorengan -gores digores -gores digoreskan -gores menggores -gores menggoreskan -gores tergores -gorok digorok -gorok menggorok -gorok mengorok -gorok penggorokan -gorok tergorok -gosip bergosip -gosip digosipkan -gosip menggosip -gosip menggosipkan -gosip penggosip -gosong mengosongi -gosong mengosongkan -gosong mengosongkannya -gosong pengosongan -gotong bergotong -gotong digotong -gotong menggotong -gotong menggotongnya -goyah digoyahkan -goyah kegoyahan -goyah menggoyah -goyah menggoyahkan -goyah mengoyahkan -goyah tergoyah -goyah tergoyahkan -goyak mengoyak -goyang bergoyang -goyang digoyang -goyang digoyangkan -goyang kegoyangan -goyang menggoyang -goyang menggoyangkan -goyang menggoyangkannya -goyang menggoyangnya -goyang mengoyang -goyang tergoyang -grad belgrad -gradasi bergradasi -granat digranat -granat penggranatan -gratis digratiskan -gratis digratiskannya -gratis menggratiskan -gratis menggratiskannya -gratis mengratiskan -gratis penggratisan -gravitas bergravitasi -gravitasi bergravitasi -grup segrup -gu begu -gu megu -gu menggu -gu menggukan -gu pengguan -gu penggunya -gu segui -gua diguakan -gua mengguakan -gua penggua -gua pengguaan -gua penguakan -guar menguar -guar menguarkan -gubah digubah -gubah megubah -gubah menggubah -gubah mengubah -gubah mengubahnya -gubah penggubah -gubah pengubah -gubah pengubahan -gubernur kegubernuran -gubris digubris -gubris digubrisnya -gubris menggubris -gubris menggubrisnya -gubris mengubris -gubuk digubuk -gudang digudang -gudang digudangkan -gudang menggudangkan -gudang mengudang -gudang pegudang -gudang penggudangan -gudang pergudangan -gudang segudang -gudangan penggudangan -gudangan pergudangan -gue begue -gugah digugah -gugah menggugah -gugah mengugah -gugah penggugah -gugah tergugah -gugat digugat -gugat digugatnya -gugat menggugat -gugat menggugatnya -gugat mengugat -gugat penggugat -gugat penggugatan -gugat penggugatnya -gugat pengugat -gugat tergugat -gugat tergugatnya -gugu digugu -gugup kegugupan -gugur berguguran -gugur digugurkan -gugur digugurkannya -gugur keguguran -gugur menggugurkan -gugur menggugurkannya -gugur mengugurkan -gugur penggugur -gugur pengguguran -gul digul -gul mengguli -gula bergula -gula pergulaan -gulat bergulat -gulat pegulat -gulat pergulatan -guli mengguli -guling berguling -guling bergulingan -guling digulingkan -guling digulingkannya -guling mengguling -guling menggulingan -guling menggulingkan -guling menggulingkannya -guling mengulingkan -guling pengguling -guling penggulingan -guling terguling -guling tergulingnya -gulir begulir -gulir bergulir -gulir bergulirnya -gulir digulir -gulir digulirkan -gulir digulirkannya -gulir digulirnya -gulir menggulir -gulir menggulirkan -gulir menggulirkannya -gulir mengulirkan -gulir pengguliran -gulir perguliran -gulung bergulung -gulung digulung -gulung menggulung -gulung menggulungnya -gulung penggulung -gulung segulung -gulung tergulung -gum begum -gum megumi -gum mengumkan -gum penguman -gumam bergumam -gumam menggumam -gumam menggumamkan -gumam pengumaman -gumbar mengumbar -gumbar mengumbarnya -gumpal bergumpal -gumpal menggumpal -gumpal menggumpalkan -gumpal penggumpalan -gumpal segumpal -gumuk mengumukan -gumul bergumul -gumul mengumulkan -gumul pergumulan -gumun mengumunkan -gumun pengumunan -gun begun -gun digunkan -gun menggunan -gun menggunkan -gun penggun -gun penggunan -gun penguni -gun segun -gun seguni -guna beguna -guna berguna -guna bergunanya -guna diguna -guna digunaan -guna digunakan -guna digunakannya -guna kegunaan -guna mengguna -guna menggunaan -guna menggunakan -guna menggunakannya -guna mengunakan -guna mengunakannya -guna pengguna -guna penggunaan -guna penggunakan -guna penggunanya -guna penguna -guna pengunaan -guna pengunanya -guna pergunakan -guncang berguncang -guncang diguncang -guncang keguncangan -guncang mengguncang -guncang mengguncangkan -guncang mengguncangnya -guncang menguncang -guncang terguncang -guncang terguncangnya -gunci mengunci -gunci menguncinya -gunci pengunci -gunci penguncian -gundah kegundahan -gundah mengundah -gundal begundal -gundang menggundang -gundang mengundang -gundang mengundangkan -gundang mengundangnya -gundang pengundang -gundang pengundangan -gundang pengundangnya -gundi mengundi -gundi pengundian -gundi pergundikan -gundik pergundikan -gundu mengundukan -gunduk mengundukan -gundul digunduli -gundul kegundulan -gundul menggunduli -gundul penggundulan -gung menggung -gung mengungkan -gung penggung -gung pengungi -gung pergung -gunjing bergunjing -gunjing digunjingkan -gunjing menggunjing -gunjing menggunjingkan -gunjing pergunjingan -gunting digunting -gunting menggunting -gunting mengguntingnya -gunting pengguntingan -guntung mengguntungkan -guntung menguntung -guntung menguntungan -guntung menguntungkan -guntung menguntungkannya -gunung bergunung -gunung menggunung -gunung menggunungnya -gunung pegunungan -gunung penggunungan -gunung pengunung -gunung pengunungan -gunung pergunungan -gunung segunung -gurat diguratkan -gurat mengguratkan -gurat tergurat -gurau bergurau -gurita menggurita -gurita mengguritanya -guru berguru -guru digurui -guru keguruan -guru menggurui -guru peguruan -guru pengurukan -guru perguruan -guruk menguruk -guruk pengurukan -gurun mengurunkan -gurung mengurung -gurung mengurungi -gurung mengurungkan -gurung mengurungkannya -gurung mengurungnya -gurung pengurungan -gusah pengusah -gusah pengusahan -gusar kegusaran -gusar menggusarkan -gusi pengusian -gusul mengusul -gusul mengusulan -gusul mengusulkan -gusul mengusulkannya -gusul pengusul -gusul pengusulan -gusul pengusulnya -gusur digusur -gusur digusurnya -gusur menggusur -gusur menggusurnya -gusur mengusur -gusur penggusur -gusur penggusuran -gusur pengusuran -gusur pergusuran -gusur tergusur -gusur tergusurnya -gutuk mengutuk -gutuk mengutuknya -gutuk pengutukan -guyon berguyon -guyub keguyuban -guyub peguyuban -guyur diguyur -guyur diguyurkan -guyur mengguyur -guyur mengguyuri -guyur mengguyurkan -guyur mengguyurnya -guyur menguyur -guyur terguyur -ha beha -ha meha -ha penha -ha seha -habis dihabisi -habis dihabiskan -habis dihabiskannya -habis kehabisan -habis mengabiskan -habis menghabisi -habis menghabiskan -habis menghabiskannya -habis penghabisan -habis sehabis -habitat berhabitat -habitat kehabitatnya -had berhad -had terhadan -had terhadi -hadap berhadap -hadap berhadapan -hadap dihadap -hadap dihadapan -hadap dihadapi -hadap dihadapkan -hadap kehadapan -hadap mengadapi -hadap menghadap -hadap menghadapi -hadap menghadapkan -hadap menghadapkannya -hadap menghadapnya -hadap menhadapi -hadap terhadap -hadap terhadapan -hadap terhadapi -hadap terhadapnya -hadiah berhadiah -hadiah dihadiahi -hadiah dihadiahkan -hadiah menghadiahi -hadiah menghadiahkan -hadiah menghadiahkannya -hadir dihadir -hadir dihadiri -hadir dihadirkan -hadir dihadirkannya -hadir kehadiran -hadir menghadir -hadir menghadiri -hadir menghadirkan -hadir menghadirkannya -hadir menhadiri -hadir menhadirkan -hadir penghadiran -hadirat kehadirat -hafal dihafal -hafal dihafalkan -hafal menghafal -hafal menghafalkan -hafal menghafalnya -hafal penghafal -hail berhail -haj belhaj -haj berhaji -hajar dihajar -hajar menghajar -hajar menghajarnya -hajat dihajat -hajat dihajatkan -haji berhaji -haji menghajikan -haji perhajian -hak berhak -hak sehak -hakim dihakimi -hakim kehakiman -hakim menghakimi -hakim penghakiman -hal berhal -hal menhali -hala berhala -halal berhalal -halal dihalalkan -halal kehalalan -halal menghalalkan -halaman berhalaman -halaman dihalaman -halaman sehalaman -halang berhalangan -halang dihalang -halang dihalangi -halang menghalang -halang menghalangi -halang penghalang -halang penghalangan -halang penghalangnya -halang terhalang -halang terhalangi -halang terhalangnya -halau berhalauan -halau dihalau -halau dihalaunya -halau menghalau -halau menghalaunya -halau penghalau -halau penghalauan -halau terhalau -haluan berhaluan -haluan sehaluan -halus dihaluskan -halus kehalusan -halus menghaluskan -halus penghalus -halus penghalusan -halus sehalus -halus terhalus -halusinasi berhalusinasi -ham memhami -hamba menghamba -hamba penghambaan -hambar menghambar -hambat dihambat -hambat menghambat -hambat menghambatnya -hambat penghambat -hambat penghambatan -hambat penghambatnya -hambat terhambat -hambat terhambatnya -hambur berhambur -hambur berhamburan -hambur dihamburkan -hambur menghambur -hambur menghamburkan -hambur menghamburkannya -hambur penghamburan -hambur terhambur -hamil dihamili -hamil kehamilan -hamil menghamili -hampa kehampaan -hampar dihampar -hampar dihamparkan -hampar menghampar -hampar menghamparkan -hampar terhampar -hampir dihampir -hampir dihampiri -hampir menghampir -hampir menghampiri -hancur dihancurkan -hancur dihancurkannya -hancur kehancuran -hancur menghancur -hancur menghancuran -hancur menghancurkan -hancur menghancurkannya -hancur menhancurkan -hancur penghancur -hancur penghancuran -hancur penghancurkan -hang mehang -hangat dihangatkan -hangat kehangatan -hangat menghangat -hangat menghangatkan -hangat menghangatkannya -hangat menghangatnya -hangat penghangat -hangat penghangatan -hangat sehangat -hangat terhangat -hangus dihanguskan -hangus menghanguskan -hangus penghangusan -hantam dihantam -hantam dihantamkan -hantam dihantamnya -hantam menghantam -hantam menghantamkan -hantam menghantamkannya -hantam menghantamnya -hantam terhantam -hantar dihantar -hantar dihantarkan -hantar menghantar -hantar menghantarkan -hantar menghantarkannya -hantar penghantar -hantar penghantaran -hantu berhantu -hantu dihantui -hantu menghantui -hanyut dihanyutkan -hanyut menghanyutkan -hanyut menghanyutkannya -hanyut terhanyut -hap berhap -hap menghapi -hap perhapi -hap terhap -hapus dihapus -hapus dihapuskan -hapus dihapuskannya -hapus dihapusnya -hapus menghapus -hapus menghapuskan -hapus menghapuskannya -hapus menghapusnya -hapus penghapus -hapus penghapusan -hapus terhapus -hapus terhapuskan -hapus terhapusnya -hara berhara -hara diharakan -hara pengharaan -harak diharakan -haram diharamkan -haram diharamkannya -haram keharaman -haram mengharamkan -haram mengharamkannya -haram pengharaman -hardik dihardik -hardik menghardik -hardik menghardiknya -harga beharga -harga berharga -harga berharganya -harga diharga -harga dihargai -harga dihargakan -harga menghargai -harga penghargaan -harga perhargaan -harga seharga -hari behari -hari berhari -hari dihari -hari kehari -hari perhari -hari perharian -hari perharinya -hari sehari -hari seharian -hari seharinya -harmoni mengharmonikan -harmonik mengharmonikan -harmonis diharmoniskan -harmonis keharmonisan -harmonis mengharmoniskan -harmonisasi diharmonisasi -harmonisasi diharmonisasikan -harmonisasi mengharmonisasi -harmonisasi mengharmonisasikan -harpa diharpakan -harta berharta -haru keharuan -haru mengharu -haru mengharukan -haru seharunya -haru terharu -haruan keharuan -haruan keharuannya -harum keharuman -harum mengharumkan -harum pengharum -harum seharum -harus diharus -harus diharuskan -harus diharuskannya -harus diharusnya -harus keharusan -harus mengharuskan -harus mengharuskannya -harus mengharusnya -harus seharus -harus seharusnya -harus seharusnyalah -has berhasi -hasrat berhasrat -hasta sehasta -hasut dihasut -hasut menghasut -hasut penghasut -hasut penghasutan -hasut terhasut -hati behati -hati berhati -hati dihati -hati dihatinya -hati kehati -hati pehatian -hati perhatian -hati perhatikan -hati sehati -hati sehatinya -haus kehausan -hawa berhawa -hawa penghawaan -hayat dihayati -hayat menghayati -hayat penghayat -hayat penghayatan -hayati dihayati -hayati menghayati -hebat kehebatan -hebat menghebat -hebat sehebat -hebat terhebat -hebat terhebatnya -heboh dihebohkan -heboh kehebohan -heboh menghebohkan -heboh seheboh -heboh terheboh -hegemoni menghegemoni -hektare perhektare -hektare sehektare -hela dihela -hela menghela -hela penghela -hela sehelai -helai sehelai -helat dihelat -helat dihelatkan -helat dihelatnya -helat menghelat -helat pehelatan -helat penghelatan -helat perhelatan -helm berhelm -hemat berhemat -hemat berhematlah -hemat dihemat -hemat kehematan -hemat menghemat -hemat menghematnya -hemat penghemat -hemat penghematan -hemat sehemat -hemat terhemat -hempas dihempas -hempas dihempaskan -hempas menghempas -hempas menghempaskan -hempas terhempas -hempas terhempasnya -hendak dihendaki -hendak kehendak -hendak kehendaki -hendak kehendaknya -hendak menghendaki -hening keheningan -hening mengheningkan -hening pengheningan -henti behenti -henti berhenti -henti berhentikan -henti berhentilah -henti berhentinya -henti dihentikan -henti dihentikannya -henti menghentian -henti menghentikan -henti menghentikannya -henti menhentikan -henti penghenti -henti penghentian -henti penghentikan -henti perhentian -henti terhenti -henti terhentikan -henti terhentinya -heran diherankan -heran keheranan -heran mengherankan -heran terheran -hewan kehewanan -hias berhias -hias berhiaskan -hias dihias -hias dihiasi -hias menghias -hias menghiasi -hias menghiasnya -hias penghias -hias perhiasan -hibah dihibahkan -hibah menghibahkan -hibah penghibahan -hibernasi berhibernasi -hibur dihibur -hibur menghibur -hibur menghiburnya -hibur penghibur -hibur penghiburan -hibur terhibur -hidang dihidangkan -hidang menghidangkan -hidang menghidangkannya -hidang terhidang -hidrasi menghidrasi -hidrasi terhidrasi -hidrogenasi terhidrogenasi -hidung berhidung -hidup dihidupi -hidup dihidupkan -hidup dihidupkannya -hidup kehidupan -hidup menghidup -hidup menghidupi -hidup menghidupkan -hidup menghidupkannya -hidup penghidupan -hidup sehidup -higienis kehigienisan -hijab berhijab -hijau dihijaukan -hijau kehijauan -hijau menghijau -hijau menghijaukan -hijau menghijaunya -hijau penghijauan -hijrah berhijrah -hikmat menghikmati -hilang dihilangkan -hilang dihilangkannya -hilang kehilang -hilang kehilangan -hilang menghilang -hilang menghilangan -hilang menghilangkan -hilang menghilangkannya -hilang menghilangnya -hilang penghilang -hilang penghilangan -hilir dihilir -himpun berhimpun -himpun berhimpunnya -himpun dihimpun -himpun dihimpunnya -himpun menghimpun -himpun penghimpun -himpun penghimpunan -himpun perhimpunan -himpun terhimpun -hina dihina -hina dihinakan -hina kehinaan -hina menghina -hina menghinakan -hina menghinanya -hina penghina -hina penghinaan -hina terhina -hindar dihindari -hindar dihindarkan -hindar menghindar -hindar menghindari -hindar menghindarkan -hindar menghindarkannya -hindar menhindari -hindar penghindar -hindar penghindaran -hindar terhindar -hindar terhindari -hindar terhindarkan -hindar terhindarnya -hinggap dihinggapi -hinggap menghinggap -hinggap menghinggapi -hipnosis dihipnosis -hipnosis menghipnosis -hipnotis dihipnotis -hipnotis menghipnotis -hipnotis penghipnotis -hipnotis terhipnotis -hipotesis berhipotesis -hirau dihiraukan -hirau dihiraukannya -hirau menghiraukan -hirau menghiraukannya -hirup dihirup -hirup dihirupnya -hirup menghirup -hirup menghirupnya -hirup terhirup -hirup terhirupnya -hitam dihitamkan -hitam kehitaman -hitam menghitam -hitam menghitamkan -hitam menghitamnya -hitam penghitam -hitam sehitam -hitung berhitung -hitung berhitungnya -hitung dihitung -hitung dihitungnya -hitung kehitung -hitung menghitung -hitung menghitungnya -hitung penghitung -hitung penghitungan -hitung perhitungan -hitung perhitungkan -hitung terhitung -hobi pehobi -hobi penghobi -hologram berhologram -hormat dihormati -hormat kehormatan -hormat menghormat -hormat menghormati -hormat penghormatan -hormat perhormatan -hormat terhormat -hormat terhormatnya -hot terhot -hotel belhotel -hotel dihotel -hotel perhotelan -hubung behubungan -hubung berhubung -hubung berhubungan -hubung dihubung -hubung dihubungan -hubung dihubungi -hubung dihubungkan -hubung dihubungkannya -hubung menghubung -hubung menghubungan -hubung menghubungi -hubung menghubungkan -hubung menghubungkannya -hubung pehubungan -hubung penghubung -hubung penghubungan -hubung penghubungnya -hubung perhubungan -hubung sehubungan -hubung terhubung -hubung terhubungan -hubung terhubungkan -hubung terhubungnya -hujan berhujan -hujan dihujani -hujan dihujankan -hujan kehujanan -hujan menghujani -hujan menghujankan -hujan penghujan -hujat dihujat -hujat menghujat -hujat menghujatnya -hujat penghujat -hujat penghujatan -hujung penghujung -hukum berhukum -hukum dihukum -hukum dihukuman -hukum dihukumi -hukum dihukumnya -hukum menghukum -hukum menghukumi -hukum menghukumnya -hukum penghukum -hukum penghukuman -hukum terhukum -hulu berhulu -hulu dihulu -hulu penghulu -hulu penghulunya -hun berhuni -hun dihuni -hun menghuni -hun penghuni -hun sehun -huni berhuni -huni dihuni -huni dihuninya -huni menghuni -huni menghuninya -huni penghuni -huni penghunian -huni penghuninya -hunjam menghunjam -hunjam menghunjamkan -hunus dihunuskan -hunus menghunus -hunus menghunuskan -hunus terhunus -hura-hura berhura-hura -huruf berhuruf -hutan berhutan -hutan dihutan -hutan dihutankan -hutan kehutan -hutan kehutanan -hutan menghutankan -hutan penghutanan -hutan perhutanan -hutan perhutani -huyung terhuyung -ia belia -ia belianya -ia beria -ia diia -ia meniai -ia menyiakan -ia penia -ia peria -ia seia -ia teriakan -ia teriakannya -iba mengiba -ibadah beribadah -ibadah peribadahan -ibadat beribadat -ibadat peribadatan -ibu beribu -ibu keibuan -ibu menyibukan -ibu seibu -ibul mengibuli -id meidi -id penyidkan -id seid -idah memidahkan -idah pemidahan -idam diidamkan -idam diidamkannya -idam mengidam -idam mengidamkan -idap diidap -idap diidapnya -idap mengidap -idap mengidapnya -idap pengidap -idap pengidapnya -ide peride -ide seide -ideal mengidealkan -ideal seideal -identifikasi diidentifikasi -identifikasi diidentifikasikan -identifikasi diidentifikasinya -identifikasi mengidentifikasi -identifikasi mengidentifikasikan -identifikasi mengidentifikasikannya -identifikasi mengidentifikasinya -identifikasi menidentifikasi -identifikasi pengidentifikasi -identifikasi pengidentifikasian -identifikasi teridentifikasi -identifikasi teridentifikasinya -identik diidentikan -identik diidentikkan -identik keidentikan -identik mengidentikan -identik mengidentikkan -identitas beridentitas -ideologi berideologi -ideologi berideologikan -ideologi seideologi -idola diidolai -idola diidolakan -idola diidolakannya -idola mengidolai -idola mengidolakan -idola mengidolakannya -idola pengidola -idola pengidolaan -iga meiga -igau mengigau -ih pemihan -ih perih -ih perihnya -ijas seijas -ijazah berijazah -ijon diijon -ijon mengijon -ijon pengijon -ijtihad berijtihad -ikan belikan -ikan berikan -ikan berikanlah -ikan pelikan -ikan perikan -ikan perikanan -ikan seikan -ikan terikan -ikat belikat -ikat berikat -ikat berikatan -ikat diikat -ikat diikatkan -ikat memikat -ikat memikatnya -ikat mengikat -ikat mengikatkan -ikat mengikatkannya -ikat mengikatnya -ikat menyikat -ikat menyikatnya -ikat pemikat -ikat pengikat -ikat pengikatan -ikat pengikatnya -ikat penyikatan -ikat perikatan -ikat seikat -ikat terikat -ikhlas diikhlaskan -ikhlas keikhlasan -ikhlas mengikhlaskan -ikhlas mengikhlaskannya -ikhlas seikhlasnya -ikhtiar berikhtiar -ikhtiar diikhtiarkan -ikhtiar mengikhtiarkan -iklan beriklan -iklan diiklankan -iklan mengiklan -iklan mengiklankan -iklan mengiklankannya -iklan pengiklan -iklan pengiklanan -iklan periklanan -iklim beriklim -ikon berikon -ikrar berikrar -ikrar diikrarkan -ikrar mengikrarkan -iktikad beriktikad -iktikaf beriktikaf -ikut beikut -ikut berikut -ikut berikuti -ikut berikutnya -ikut diikut -ikut diikuti -ikut diikutkan -ikut keikut -ikut mengikut -ikut mengikuti -ikut mengikutkan -ikut menyikut -ikut menyikutnya -ikut pengikut -ikut pengikuti -ikut pengikutnya -ikut terikut -ilah belilah -ilah berilah -ilah memilah -ilah memilahkan -ilah memilahnya -ilah menilah -ilah menyilahkan -ilah pemilahan -ilah perilah -ilai meilai -ilai memilai -ilai menilai -ilai menilainya -ilai penilai -ilai penilaian -ilai penilainya -ilak menilak -ilak menyilakan -ilas belilas -ilas mengilas -ilegal mengilegalkan -iler seiler -ilham diilhami -ilham mengilhami -ilham terilhami -ili meili -ili memili -ili memilii -ili pemili -ili pemilian -ili pemilikan -ili pemilikannya -ili penilian -ilian pemilian -ilian penilian -iling meiling -ilmiah keilmiahan -ilmu berilmu -ilmu keilmuan -ilmuwan keilmuwan -ilu memilukan -ilu pemilu -ilu pemilunya -ilusi berilusi -ilustrasi diilustrasikan -ilustrasi mengilustrasikan -imajinasi berimajinasi -imajinasi diimajinasikan -imajinasi mengimajinasikan -imak menyimak -imak menyimaknya -imak terimakan -imam diimami -imam mengimami -iman beriman -iman diimani -iman keimanan -iman mengimani -iman seiman -imani diimani -imani mengimani -imbal berimbal -imbang berimbang -imbang berimbangnya -imbang diimbangi -imbang mengimbang -imbang mengimbangi -imbang mengimbangkan -imbang menimbang -imbang menimbangkan -imbang menimbangnya -imbang menyimbangkan -imbang pengimbang -imbang penimbang -imbang penimbangan -imbang penyimbang -imbang penyimbangan -imbang perimbangan -imbang seimbang -imbang seimbangan -imbang seimbangkan -imbang seimbangnya -imbang terimbang -imbas berimbas -imbas mengimbas -imbas terimbas -imbau diimbau -imbau diimbaunya -imbau mengimbau -imbau mengimbaunya -imbau menimbau -imbau pengimbauan -imbuh diimbuhi -imbuh diimbuhkan -imbuh mengimbuhi -imbuh mengimbuhkan -imigrasi berimigrasi -imigrasi keimigrasian -iming-iming diiming-iming -iming-iming diiming-imingi -iming-iming diiming-imingkan -iming-iming mengiming-iming -iming-iming mengiming-imingi -iming-iming mengiming-imingkan -imitasi mengimitasi -impak menimpakan -impas pelimpas -impas pelimpasan -impi diimpikan -impi diimpikannya -impi memimpi -impi memimpikan -impi memimpikannya -impi mengimpikan -impi pemimpi -impi pemimpian -impi pemimpinya -impit berimpitan -impit diimpit -impit mengimpit -impit terimpit -implan diimplan -implan mengimplan -implementasi diimplementasi -implementasi diimplementasikan -implementasi diimplementasikannya -implementasi mengimplementasi -implementasi mengimplementasikan -implementasi mengimplementasikannya -implementasi pengimplementasian -implementasi terimplementasi -implementasi terimplementasikan -implikasi berimplikasi -implikasi diimplikasikan -implikasi mengimplikasikan -impor diimpor -impor diimpornya -impor mengimpor -impor mengimpornya -impor pengimpor -impor pengimporan -impresif seimpresif -improvisasi berimprovisasi -improvisasi diimprovisasi -improvisasi mengimprovisasi -imunisasi diimunisasi -imunisasi mengimunisasi -ina belina -ina memina -ina mengina -inang meminang -inang meminangnya -inang peminang -inang peminangan -inap diinapi -inap diinapkan -inap menginap -inap menginapkan -inap menginapnya -inap penginap -inap penginapan -incar diincar -incar diincarnya -incar mengincar -incar mengincari -incar mengincarnya -incar pengincar -inci perinci -inci perincian -inci terinci -incut memincut -indah diindahkan -indah diindahkannya -indah keindahan -indah memindah -indah memindahan -indah memindahkan -indah memindahkannya -indah mengindahkan -indah mengindahkannya -indah pemindah -indah pemindahan -indah pemindahkan -indah seindah -indah terindah -indah terindahnya -indang keindangan -indang pemindangan -indang perindang -indap mengindap -indeks berindeks -indeks diindeks -indeks mengindeks -indeks pengindeksan -indeks terindeks -indik menindik -indik penindikan -indikan penindikan -indikasi berindikasi -indikasi berindikasikan -indikasi diindikasi -indikasi diindikasikan -indikasi mengindikasi -indikasi mengindikasikan -indikasi terindikasi -indikasi terindikasikan -indoktrinasi diindoktrinasi -indoktrinasi mengindoktrinasi -indra pengindra -indra pengindraan -indu perindu -indu perindukan -induk berinduk -induk menginduk -induk perindukan -induksi diinduksi -induksi menginduksi -induksi terinduksi -indung pelindung -indung pelindungan -indung pelindungnya -indung perindungan -industri diindustri -industri perindustri -industri perindustrian -infak berinfak -infak menginfakkan -infeksi diinfeksi -infeksi menginfeksi -infeksi menginfeksinya -infeksi terinfeksi -infeksi terinfeksinya -infiltrasi diinfiltrasi -infiltrasi menginfiltrasi -info diinfo -info diinfokan -info menginfokan -info terinfo -informasi berinformasi -informasi diinformasi -informasi diinformasikan -informasi menginformasi -informasi menginformasikan -informasi menginformasikannya -informasi terinformasi -informasi terinformasikan -infus diinfus -infus menginfus -ingar peringaran -ingat diingat -ingat diingatan -ingat diingatkan -ingat diingatkannya -ingat diingatnya -ingat mengingat -ingat mengingatkan -ingat mengingatkannya -ingat mengingatnya -ingat meningat -ingat meningatkan -ingat pengingat -ingat pengingatan -ingat peningatan -ingat peringat -ingat peringatan -ingat peringati -ingat peringatkan -ingat seingat -ingat seingatnya -ingat teringat -inggu meninggu -inggung menyinggung -inggung menyinggungnya -ingin beringin -ingin diingin -ingin diingini -ingin diinginkan -ingin diinginkannya -ingin keingin -ingin keinginan -ingin keinginnya -ingin menginginan -ingin mengingini -ingin menginginkan -ingin menginginkannya -ingin meninginkan -ingkar diingkari -ingkar mengingkari -ingkar pengingkaran -ingkir menyingkir -ingkir menyingkirkan -ingkir menyingkirkannya -ingkir penyingkiran -ingsut beringsut -ini diinikan -inisial beinisial -inisial berinisial -inisial diinisialkan -inisiasi berinisiasi -inisiasi diinisiasi -inisiasi diinisiasikan -inisiasi diinisiasinya -inisiasi menginisiasi -inisiasi menginisiasikan -inisiatif berinisiatif -injak diinjak -injak diinjaknya -injak menginjak -injak menginjakan -injak menginjakkan -injak menginjaknya -injak penginjak -injak penginjakan -injak terinjak -injeksi diinjeksi -injeksi diinjeksikan -injeksi menginjeksi -injeksi menginjeksikan -inkubasi diinkubasi -inkubasi menginkubasi -inovasi berinovasi -inovasi diinovasi -inovasi menginovasi -inovatif terinovatif -insektisida berinsektisida -inseminasi diinseminasi -insinyur keinsinyuran -inspeksi diinspeksi -inspeksi menginspeksi -inspirasi berinspirasi -inspirasi diinspirasi -inspirasi menginspirasi -inspirasi menginspirasikan -inspirasi menginspirasinya -inspirasi terinspirasi -instalasi diinstalasi -instalasi menginstalasi -instalasi terinstalasi -instruksi diinstruksi -instruksi diinstruksikan -instruksi diinstruksikannya -instruksi menginstruksi -instruksi menginstruksikan -instruksi menginstruksikannya -intai diintai -intai memintai -intai mengintai -intai mengintainya -intai menyintai -intai pengintai -intai pengintaian -intai pengintainya -intan memintan -integrasi berintegrasi -integrasi diintegrasi -integrasi diintegrasikan -integrasi diintegrasikannya -integrasi mengintegrasi -integrasi mengintegrasikan -integrasi mengintegrasikannya -integrasi pengintegrasian -integrasi terintegrasi -integrasi terintegrasikan -integrasi terintegrasinya -integritas berintegritas -integritas terintegritas -intens seintens -intensif diintensifkan -intensif mengintensifkan -intensif pengintensifan -intensif seintensif -intensitas berintensitas -interaksi berinteraksi -interaksi berinteraksilah -interkoneksi berinterkoneksi -interkoneksi terinterkoneksi -internal diinternal -internalisasi diinternalisasikan -internalisasi menginternalisasi -internalisasi menginternalisasikan -internalisasi terinternalisasi -internasional menginternasionalkan -internasionalisasi menginternasionalisasi -interogasi diinterogasi -interogasi menginterogasi -interogasi menginterogasinya -interogasi penginterogasi -interpelasi diinterpelasi -interpelasi menginterpelasi -interpretasi diinterpretasi -interpretasi diinterpretasikan -interpretasi menginterpretasi -interpretasi menginterpretasikan -interpretasi menginterpretasikannya -intersepsi diintersepsi -intersepsi mengintersepsi -interupsi diinterupsi -interupsi menginterupsi -interupsi terinterupsi -intervensi diintervensi -intervensi mengintervensi -intervensi mengintervensinya -intervensi terintervensi -inti berinti -inti berintikan -intim keintiman -intimidasi diintimidasi -intimidasi mengintimidasi -intimidasi mengintimidasinya -intimidasi pengintimidasi -intimidasi terintimidasi -intip diintip -intip mengintip -intip mengintipnya -intip pengintip -intip pengintipan -introduksi diintroduksi -introspeksi berintrospeksi -introspeksi mengintrospeksi -intrusi terintrusi -invasi diinvasi -invasi menginvasi -inventaris diinventaris -inventaris menginventaris -inventarisasi diinventarisasi -inventarisasi menginventarisasi -investasi berinvestasi -investasi berinvestasilah -investasi diinvestasi -investasi diinvestasikan -investasi diinvestasikannya -investasi menginvestasi -investasi menginvestasikan -investasi menginvestasikannya -investigasi diinvestigasi -investigasi menginvestigasi -investigasi menginvestigasinya -ion pengion -ionisasi terionisasi -ipis menipis -ipis menipiskan -ipis menipisnya -ipis pelipis -ipis pelipisnya -ipis penipisan -ira beira -ira keira -ira meira -ira mengira -ira mengiranya -ira pemira -iradiasi diiradiasi -iram menyiram -iram menyirami -iram menyiramkan -iram menyiramkannya -iram menyiramnya -iram penyiram -iram penyiraman -irama berirama -irama seirama -iri beriri -iri diirinya -iri keirian -iri mengiri -iri mengirikan -irigasi beririgasi -irik mengirikan -iring beriring -iring beriringan -iring diiring -iring diiringi -iring memiringkan -iring mengiring -iring mengiringi -iring pengiring -iring pengiringan -iring pengiringnya -iring seiring -iring seiringan -iring seiringnya -iring teriring -iris beririsan -iris diiris -iris memiriskan -iris mengiris -iris mengirisnya -iris meniriskan -iris peiris -iris pengiris -iris seiris -iris teriris -irit keiritan -irit mengirit -irit pengiritan -irit teririt -iritasi mengiritasi -iritasi teriritasi -irus meniruskan -isak menyisakan -isak menyisakkan -isak perisakan -isak terisak -isak-isak terisak-isak -isap diisap -isap diisapnya -isap mengisap -isap mengisapnya -isap pengisap -isap pengisapan -isap perisapan -isap terisap -iseng keisengan -iseng mengisengi -isi berisi -isi berisikan -isi diisi -isi diisikan -isi diisinya -isi mengisi -isi mengisikan -isi mengisinya -isi menyisikan -isi pengisi -isi pengisian -isi pengisinya -isi penyisian -isi seisi -isi seisinya -isi terisi -isi terisinya -isis berisis -isis mengisis -isis mengisisi -isis pengisisan -islah berislah -islah diislahkan -islah mengislahkan -isolasi diisolasi -isolasi mengisolasi -isolasi mengisolasikan -isolasi mengisolasinya -isolasi pengisolasian -isolasi terisolasi -isolasi terisolasinya -istigfar beristigfar -istilah diistilahkan -istilah mengistilahkan -istilah mengistilahkannya -istimewa diistimewakan -istimewa keistimewaan -istimewa mengistimewakan -istimewa pengistimewaan -istimewa seistimewa -istimewa teristimewa -istirahat beristirahat -istirahat beristirahatlah -istirahat diistirahatkan -istirahat diistirahatkannya -istirahat mengistirahatkan -istirahat mengistirahatkannya -istirahat pengistirahatan -istirahat peristirahatan -istiwa peristiwa -istiwa peristiwanya -istri beristri -istri beristrikan -istri pelistrikan -isu diisukan -isu mengisukan -isya keisya -isya meisya -isyarat diisyaratkan -isyarat mengisyaratkan -isyarat mengisyaratkannya -itik menitik -itik menitikan -itik menitikkan -itu beitu -itu meitu -itu seituan -iur mengiur -iur mengiurkan -iya diiyakan -iya mengiyakan -iya mengiyakannya -iya seiya -izin berizin -izin diizinkan -izin diizinkannya -izin mengizinkan -izin mengizinkannya -izin perizinan -izin seizin -izin seizinnya -jabar dijabarkan -jabar dijabarkannya -jabar menjabar -jabar menjabarkan -jabar menjabarkannya -jabar pejabar -jabar penjabaran -jabar terjabarkan -jabat berjabat -jabat berjabatan -jabat dijabat -jabat dijabatnya -jabat mejabat -jabat menjabat -jabat menjabatnya -jabat pejabat -jabat pejabatan -jabat pejabatnya -jabat penjabat -jabat perjabat -jadi dijadikan -jadi dijadikannya -jadi kejadi -jadi kejadian -jadi kejadikan -jadi mejadi -jadi mejadikan -jadi memjadi -jadi menjadi -jadi menjadii -jadi menjadikan -jadi menjadikannya -jadi penjadi -jadi sejadinya -jadi terjadi -jadi terjadilah -jadi terjadinya -jadwal berjadwal -jadwal dijadwal -jadwal dijadwalkan -jadwal dijadwalkannya -jadwal menjadwal -jadwal menjadwalkan -jadwal menjadwalkannya -jadwal penjadwalan -jadwal terjadwal -jadwal terjadwalkan -jaga berjaga -jaga dijaga -jaga dijaganya -jaga mejaga -jaga menjaga -jaga menjagai -jaga menjaganya -jaga pejaga -jaga pejagaan -jaga penjaga -jaga penjagaan -jaga penjaganya -jaga terjaga -jaga terjaganya -jagal dijagal -jagal menjagal -jagal pejagal -jagal pejagalan -jagal penjagal -jagal penjagalan -jagat sejagat -jago dijagokan -jago dijagokannya -jago menjagokan -jago menjagokannya -jago sejago -jagung kejagung -jah dijah -jah sejah -jahat dijahati -jahat kejahatan -jahat pejahat -jahat penjahat -jahat penjahatnya -jahat sejahat -jahat terjahat -jahil dijahili -jahil kejahilan -jahil menjahili -jahit dijahit -jahit dijahitkan -jahit menjahit -jahit menjahitkan -jahit menjahitnya -jahit penjahit -jahit penjahitan -jahit penjahitnya -jahit terjahit -jail menjaili -jaja dijajakan -jaja dijajakannya -jaja menjajakan -jaja menjajakannya -jaja penjaja -jaja penjajakan -jajah dijajah -jajah menjajah -jajah pejajahan -jajah penjajah -jajah penjajahan -jajah penjajahnya -jajah terjajah -jajak dijajakan -jajak dijajaki -jajak menjajakan -jajak menjajaki -jajak menjajakkan -jajak penjajakan -jajal dijajal -jajal dijajalnya -jajal menjajal -jajal menjajalnya -jajal penjajalan -jajar berjajar -jajar dijajaran -jajar dijajarkan -jajar kejajar -jajar menjajarkan -jajar penjajaran -jajar sejajar -jajar sejajaran -jajar sejajarkan -jajar sejajarnya -jaka kejakaan -jaka perjaka -jaka sejaka -jaket berjaket -jaksa kejaksaan -jala berjala -jala berjalanya -jala dijalakan -jala menjala -jala menjalai -jala menjalakan -jalak dijalakan -jalak menjalakan -jalang menjalang -jalar bejalar -jalar menjalar -jalar menjalari -jalar menjalarnya -jalar penjalaran -jali menjali -jalin dijalin -jalin dijalinnya -jalin mejalin -jalin menjalin -jalin penjalin -jalin terjalin -jalin terjalinnya -jalur berjalur -jalur dijalur -jalur sejalur -jam berjam -jam dijaman -jam kejam -jam kejamnya -jam menjami -jam pejamkan -jam perjam -jam perjamnya -jam sejam -jamah berjamah -jamah dijamah -jamah menjamah -jamah terjamah -jambak dijambak -jambak menjambak -jambon kejambon -jambon pejambon -jambret dijambret -jambret menjambret -jambret pejambret -jambret penjambret -jambret penjambretan -jambul berjambul -jamin bejamin -jamin berjamin -jamin berjaminan -jamin dijamin -jamin dijaminkan -jamin dijaminnya -jamin mejamin -jamin menjamin -jamin menjaminan -jamin menjaminkan -jamin menjaminnya -jamin penjamin -jamin penjaminan -jamin penjaminnya -jamin terjamin -jamin terjaminnya -jamu dijamu -jamu mejamu -jamu menjamu -jamu menjamunya -jamu penjamuan -jamu perjamuan -jamur berjamur -jamur berjamuran -jamur menjamur -jamur menjamurnya -janda menjanda -jangan menjangan -jangan terjangan -jangan terjangannya -janggal kejanggalan -janggut berjanggut -jangka berjangka -jangka terjangka -jangkau berjangkauan -jangkau dijangkau -jangkau dijangkaunya -jangkau mengjangkau -jangkau menjangkau -jangkau menjangkaunya -jangkau penjangkau -jangkau penjangkauan -jangkau terjangkau -jangkau terjangkaunya -jangkit berjangkit -jangkit berjangkitnya -jangkit dijangkiti -jangkit menjangkit -jangkit menjangkiti -jangkit menjangkitnya -jangkit penjangkitan -jangkit terjangkit -jangkit terjangkiti -jangkit terjangkitnya -jangkung terjangkung -jani berjani -jani menjani -jani perjanian -janji berjanji -janji berjanjian -janji berjanjilah -janji dijanji -janji dijanjikan -janji dijanjikannya -janji menjanjikan -janji menjanjikannya -janji pejanjian -janji penjanjian -janji perjanjian -jantan kejantanan -jantan pejantan -jantan pejantannya -jantung berjantung -jantung dijantung -jara pejara -jara pejarakan -jara penjara -jara penjarakan -jara penjaranya -jara sejara -jarah dijarah -jarah menjarah -jarah penjarah -jarah penjarahan -jarah sejarah -jarah sejarahnya -jarak berjarak -jarak pejarakan -jarak penjarakan -jarak sejarak -jaran kejaran -jaran penjaran -jaran sejaran -jarang menjarangkan -jarang sejarang -jargon berjargon -jari berjari -jari kejari -jari menjari -jaring berjaring -jaring berjaringan -jaring dijaring -jaring dijaringan -jaring dijaringkan -jaring dijaringkannya -jaring menjaring -jaring menjaringkan -jaring menjaringnya -jaring pejaringan -jaring penjaring -jaring penjaringan -jaring terjaring -jaring terjaringnya -jas berjas -jas menjasi -jas penjas -jas terjasi -jasa berjasa -jasa kejasaan -jatah dijatah -jatah dijatahi -jatah dijatahkan -jatah kejatahan -jatah menjatah -jatah menjatahkan -jatah penjatahan -jati berjati -jati kejati -jati sejati -jati sejatinya -jatuh berjatuhan -jatuh dijatuh -jatuh dijatuhi -jatuh dijatuhkan -jatuh dijatuhkannya -jatuh kejatuhan -jatuh mejatuhkan -jatuh menjatuh -jatuh menjatuhan -jatuh menjatuhi -jatuh menjatuhkan -jatuh menjatuhkannya -jatuh penjatuhan -jatuh terjatuh -jatuh terjatuhnya -jauh berjauhan -jauh dijauhi -jauh dijauhkan -jauh kejauhan -jauh menjauh -jauh menjauhi -jauh menjauhkan -jauh menjauhkannya -jauh menjauhlah -jauh menjauhnya -jauh sejauh -jauh terjauh -jauh terjauhnya -jawab berjawab -jawab dijawab -jawab dijawabnya -jawab mejawab -jawab menjawab -jawab menjawabnya -jawab penjawab -jawab terjawab -jawab terjawablah -jawara menjawarai -jawat pejawat -jawat sejawat -jawat sejawatnya -jawi berjawi -jaya berjaya -jaya berjayanya -jaya dijaya -jaya kejaya -jaya kejayaan -jaya menjayakan -je terje -jebak dijebak -jebak kejebak -jebak menjebak -jebak menjebaknya -jebak penjebak -jebak penjebakan -jebak terjebak -jebak terjebaknya -jebat pejebat -jeblos dijebloskan -jeblos dijebloskannya -jeblos kejeblos -jeblos menjebloskan -jeblos menjebloskannya -jeblos penjeblosan -jeblos terjeblos -jebol dijebol -jebol kejebolan -jebol mejebol -jebol menjebol -jebol menjebolkan -jebol menjebolnya -jebol penjebol -jebol penjebolan -jebur terjebur -jeda berjeda -jeda dijeda -jegal dijegal -jegal menjegal -jegal menjegalnya -jegal penjegal -jegal penjegalan -jegal terjegal -jejak berjejak -jejak dijejaki -jejak menjejak -jejak menjejakan -jejak menjejaki -jejak menjejakkan -jejak penjejak -jejak penjejakan -jejal berjejal -jejal berjejalan -jejal dijejali -jejal dijejalkan -jejal menjejali -jejal menjejalkan -jejer berjejer -jejer berjejeran -jejer dijejer -jejer dijejerkan -jejer menjejerkan -jela dijelakan -jela menjelakan -jelah penjelahan -jelajah berjelajah -jelajah dijelajah -jelajah dijelajahi -jelajah menjelajah -jelajah menjelajahi -jelajah penjelajah -jelajah penjelajahan -jelak dijelakan -jelak menjelakan -jelang dijelang -jelang mejelang -jelang menjelang -jelas dijelas -jelas dijelaskan -jelas dijelaskannya -jelas kejelasan -jelas mejelaskan -jelas menjelas -jelas menjelasan -jelas menjelaskan -jelas menjelaskannya -jelas pejelasan -jelas penjelas -jelas penjelasan -jelas penjelaskan -jelas perjelas -jelas sejelas -jelas terjelas -jelas terjelaskan -jelek dijelekkan -jelek kejelekan -jelek menjelekan -jelek menjelekkan -jelek sejelek -jelek terjelek -jeli kejelian -jelma menjelma -jelma menjelmakan -jelma penjelmaan -jemaah berjemaah -jembatan dijembatani -jembatan menjembatani -jembatan penjembatan -jembatan terjembatani -jemput dijemput -jemput dijemputnya -jemput menjemput -jemput menjemputnya -jemput penjemput -jemput penjemputan -jemput penjemputnya -jemu kejemuan -jemu menjemukan -jemur berjemur -jemur dijemur -jemur menjemur -jemur menjemurnya -jemur penjemur -jemur penjemuran -jemur terjemur -jenak sejenak -jenaka kejenakaan -jendela berjendela -jeng mejeng -jeng pejeng -jengah kejengahan -jenggot berjenggot -jengguk menjengguk -jengkal sejengkal -jengkang terjengkang -jengkel kejengkelan -jengkel menjengkelkan -jenguk dijenguk -jenguk menjenguk -jenguk menjenguknya -jenguk penjenguk -jenis berjenis -jenis berjeniskan -jenis sejenis -jenis sejenisnya -jenjang berjenjang -jenjang penjenjangan -jentik menjentikkan -jenuh kejenuhan -jenuh menjenuhkan -jepit dijepit -jepit dijepitkan -jepit kejepit -jepit menjepit -jepit menjepitkan -jepit menjepitnya -jepit penjepit -jepit penjepitan -jepit terjepit -jepit terjepitnya -jepret dijepret -jepret menjepret -jepret menjepretkan -jepret menjepretnya -jepret terjepret -jera menjerakan -jera penjeraan -jerat dijerat -jerat dijeratkan -jerat dijeratnya -jerat mejerat -jerat menjerat -jerat menjeratkan -jerat menjeratnya -jerat penjerat -jerat penjeratan -jerat terjerat -jerat terjeratnya -jerawat berjerawat -jerembap terjerembap -jerit menjerit -jernih dijernihkan -jernih kejernihan -jernih menjernihkan -jernih penjernih -jernih penjernihan -jernih sejernih -jeruji berjeruji -jerumus dijerumuskan -jerumus menjerumus -jerumus menjerumuskan -jerumus menjerumuskannya -jerumus terjerumus -jerumus terjerumusnya -jewer dijewer -jewer menjewer -ji beji -ji keji -ji kejinya -ji meji -jibaku bejibaku -jibaku berjibaku -jibun bejibun -jibun bejibunnya -jibun berjibun -jihad berjihad -jihad pejihad -jijik menjijikan -jijik menjijikkan -jil sejil -jilat dijilat -jilat dijilati -jilat menjilat -jilat menjilati -jilat menjilatnya -jilat penjilat -jilat terjilat -jilbab berjilbab -jilid berjilid -jilid dijilid -jilid penjilidan -jin dijinkan -jinak dijinakan -jinak dijinakkan -jinak menjinakan -jinak menjinakkan -jinak menjinakkannya -jinak penjinak -jinak penjinakan -jinak penjinakkan -jingkrak berjingkrak -jinjing dijinjing -jinjing menjinjing -jinjit berjinjit -jiplak dijiplak -jiplak menjiplak -jiplak menjiplaknya -jiplak penjiplak -jiplak penjiplakan -jir berjiran -jiran berjiran -jiwa berjiwa -jiwa dijiwai -jiwa kejiwaan -jiwa menjiwai -jiwa penjiwaan -jiwa perjiwa -jiwa sejiwa -jobong kejobong -joget berjoget -joging berjoging -joki perjokian -joli sejoli -jongkok berjongkok -jorok menjorok -jorok terjorok -jorong kejorongan -jotos menjotos -jua penjuakan -juak penjuakan -jual berjual -jual berjualan -jual dijual -jual dijualkan -jual dijualnya -jual kejual -jual mejual -jual menjual -jual menjualan -jual menjualkan -jual menjualnya -jual pejual -jual pejualan -jual penjual -jual penjualan -jual penjualnya -jual perjualan -jual terjual -jual terjualnya -juang bejuang -juang berjuang -juang berjuangan -juang berjuanglah -juang berjuangnya -juang kejuangan -juang pejuang -juang pejuangan -juang pejuangnya -juang penjuang -juang perjuang -juang perjuangan -juang perjuangkan -juar kejuaran -juar menjuari -juara dijuarai -juara kejuaraan -juara mejuarai -juara menjuara -juara menjuarai -jubah berjubah -jubel bejubel -jubel berjubel -jubel berjubelnya -jubel dijubeli -judi berjudi -judi pejudi -judi penjudi -judi penjudian -judi perjudian -judo pejudo -judul berjudul -juju menjuju -jujur kejujuran -jujur sejujur -jujur sejujurnya -jujuran kejujuran -jujuran kejujurannya -julang menjulang -julang menjulangkan -julang menjulangnya -juluk bejuluk -juluk berjuluk -juluk berjulukan -juluk dijuluki -juluk menjuluki -julur dijulurkan -julur menjulur -julur menjulurkan -julur terjulur -jumbai berjumbai -jumlah bejumlah -jumlah berjumlah -jumlah dijumlah -jumlah dijumlahkan -jumlah menjumlah -jumlah menjumlahkan -jumlah penjumlahan -jumlah sejumlah -jumpa berjumpa -jumpa dijumpai -jumpa menjumpai -jumpa perjumpaan -jumput menjumput -jumput sejumput -jumud kejumudan -jun sejunlah -jun terjun -jun terjunkan -jun terjunnya -jung perjungan -jung terjung -jungkal dijungkalkan -jungkal menjungkal -jungkal menjungkalkan -jungkal terjungkal -jungkal terjungkalnya -jungkir menjungkir -jungkir menjungkirkan -jungkir terjungkir -junjung dijunjung -junjung menjunjung -junjung penjunjung -junta menjuntai -junta terjuntai -juntai menjuntai -juntai terjuntai -jura kejuraan -jura menjurai -jurai menjurai -juri penjurian -juru kejuruan -juru penjuru -juru penjurunya -jurus dijuruskan -jurus kejurusan -jurus menjurus -jurus menjuruskan -jurus penjurusan -jurus sejurus -jus dijus -justifikasi dijustifikasi -justifikasi menjustifikasi -juta berjuta -juta sejuta -juta sejutaan -ka beka -ka belka -ka dika -ka kekalah -ka meka -ka menga -ka mengakan -ka mengalah -ka peka -ka pekanya -ka pengakan -ka perka -ka seka -ka sekaan -ka sekai -ka terka -ka terkaan -ka terkai -ka terkanya -kaba dikabakan -kabak dikabakan -kabar berkabar -kabar dikabar -kabar dikabaran -kabar dikabari -kabar dikabarkan -kabar dikabarnya -kabar mengabari -kabar mengabarkan -kabar mengabarkannya -kabar pekabaran -kabar terkabar -kabel berkabel -kabel perkabelan -kabil mengabil -kabin berkabin -kabinet dikabinet -kabul dikabulkan -kabul dikabulkannya -kabul mengabulkan -kabul mengabulkannya -kabul pengabulan -kabul terkabul -kabul terkabulkan -kabul terkabulnya -kabung berkabung -kabung berkabungnya -kabung mengabungkan -kabung pengabungan -kabung perkabungan -kabupaten dikabupaten -kabupaten sekabupaten -kabur dikaburkan -kabur kekaburan -kabur mengabur -kabur mengaburkan -kabur pengaburan -kabut berkabut -kabut pengabut -kabut pengabutan -kaca berkaca -kaca mengaca -kaca pengaca -kaca pengacakan -kacak berkacak -kacak mengacak -kacak pengacak -kacak pengacakan -kacam mengacam -kacamata berkacamata -kacar pengacar -kacau dikacaukan -kacau kekacauan -kacau mengacau -kacau mengacaukan -kacau mengacaukannya -kacau pengacau -kacau pengacauan -kacu kekacuan -kacu mengacu -kacu mengacukan -kacu mengacunya -kacuk mengacukan -kacukan mengacukan -kacung mengacung -kacung mengacungi -kacung mengacungkan -kacung mengacungkannya -kad menkadi -kad pengadan -kad terkadi -kada mengada -kada mengadakan -kada mengadakannya -kada pengada -kada pengadaan -kada perkada -kadal dikadali -kadal mengadalan -kadal mengadalkan -kadang mengadang -kadang mengadangnya -kadang pengadang -kadang pengadangan -kadang terkadang -kadar berkadar -kadar sekadar -kadar sekadarnya -kader dikader -kader mengkader -kader pengaderan -kader pengkaderan -kader perkaderan -kadi menkadi -kadi pengadian -kadi pengadikan -kadi terkadi -kadir mengadiri -kadir mengadirkan -kadung mengadung -kadung terkadung -kafan dikafani -kafan dikafankan -kafan mengafani -kafan mengkafani -kafir dikafirkan -kafir kekafiran -kafir mengafirkan -kafir mengkafirkan -kafir pengkafiran -kaget dikagetkan -kaget kekagetan -kaget mengagetkan -kaget mengagetkannya -kaget terkaget -kagum dikagumi -kagum kekaguman -kagum mengagumi -kagum mengagumkan -kagum mengagumkannya -kagum pengagum -kagum pengagumnya -kagum terkagum -kail mengail -kain berkain -kain terkain -kais mengais -kais pengais -kaisar kekaisaran -kait bekaitan -kait berkait -kait berkaitan -kait berkaitkan -kait dikait -kait dikaitan -kait dikaitkan -kait dikaitkannya -kait mengait -kait mengaitkan -kait mengaitkannya -kait mengkait -kait mengkaitkan -kait mengkaitkannya -kait pengait -kait pengaitan -kait pengaitnya -kait sekaitan -kait terkait -kait terkaitan -kait terkaitnya -kajang pekajangan -kajangan pekajangan -kaji dikaji -kaji dikajinya -kaji mengaji -kaji mengajinya -kaji mengkaji -kaji mengkajinya -kaji menkaji -kaji pengajian -kaji pengkaji -kaji pengkajian -kak berkaki -kak dikaki -kak mekaki -kak mengakan -kak mengaki -kak pekak -kak pengak -kak pengakan -kak sekaki -kakap pengakap -kakap pengakapan -kakas perkakas -kaki berkaki -kaki dikaki -kaki dikakinya -kaki mekaki -kaki mengaki -kaki sekaki -kaku dikakukan -kaku kekakuan -kaku mekakukan -kaku mengaku -kaku mengakui -kaku mengakukan -kaku mengakunya -kaku pekaku -kaku pengaku -kaku pengakuan -kaku sekaku -kal bekal -kal bekali -kal bekalnya -kal berkali -kal dikali -kal kekal -kal kekalan -kal mengali -kal mengkal -kal mengkali -kal pengali -kal pengkalan -kal sekal -kal sekali -kala bekala -kala berkala -kala berkalanya -kala dikala -kala mengalai -kala mengalakan -kala sekala -kalah dikalahan -kalah dikalahkan -kalah dikalahkannya -kalah kekalah -kalah kekalahan -kalah mengalah -kalah mengalahan -kalah mengalahkan -kalah mengalahkannya -kalah terkalahan -kalah terkalahkan -kalah terkalahkannya -kalai mengalai -kalam mengalam -kalam mengalami -kalam pengalam -kalam pengalaman -kalam pengalami -kalamin mengalamin -kalang bekalang -kalang bekalangan -kalang berkalang -kalang dikalangan -kalang mengalang -kalang mengalangi -kalang pekalangan -kalang pengalangan -kalau mengalau -kaleng dikalengkan -kaleng pengalengan -kaleng sekaleng -kali bekali -kali berkali -kali dikali -kali dikalikan -kali mengali -kali mengalikan -kali mengkali -kali pengali -kali pengalian -kali perkalian -kali sekali -kali sekalian -kali sekalinya -kalian pengalian -kalian perkalian -kalian sekalian -kaliber berkaliber -kaliber sekaliber -kaliber sekalibernya -kalibrasi dikalibrasi -kalibrasi mengkalibrasi -kalih mengalih -kalih mengalihan -kalih mengalihkan -kalih mengalihkannya -kalih pengalih -kalih pengalihan -kalkulasi berkalkulasi -kalkulasi dikalkulasi -kalkulasi dikalkulasikan -kalkulasi mengalkulasi -kalkulasi mengalkulasikan -kalkulasi mengkalkulasi -kalkulasi mengkalkulasikan -kalkulasi terkalkulasi -kalong pekalongan -kalor berkalori -kalori berkalori -kalsium berkalsium -kalung berkalung -kalung dikalungi -kalung dikalungkan -kalung mengalungi -kalung mengalungkan -kalung pengalungan -kalut kekalutan -kam bekam -kam mengaman -kam mengami -kam mengamkan -kam pengaman -kam sekam -kam terkam -kam terkaman -kama mengamakan -kama pengamaan -kamal mengamali -kamal mengamalkan -kamal mengamalkannya -kamal pengamal -kamal pengamalan -kamar berkamar -kamar dikamar -kamar dikamarnya -kamar sekamar -kamar sekamarnya -kamat mengamati -kamat mengamatkan -kamat pengamat -kamat pengamatan -kamat pengamatnya -kambang mengambang -kambang mengambangkan -kambang mengambangnya -kambang pengambang -kambang pengambangan -kambang perkambangan -kambar mengambar -kambar mengambarkan -kambi mengambi -kambing dikambing -kambuh kekambuhan -kamera berkamera -kami mengami -kamil mengamil -kamil perkamil -kampanye berkampanye -kampanye dikampanyekan -kampanye dikampanyekannya -kampanye mengampanyekan -kampanye mengkampanyekan -kampanye mengkampanyekannya -kampanye pengkampanye -kampil mengampil -kampus dikampus -kampus sekampus -kampus sekampusnya -kamuflase berkamuflase -kamuflase dikamuflase -kamuflase dikamuflasekan -kamuflase mengkamuflase -kan dikanan -kan kekanan -kan mekan -kan mengani -kan pekan -kan pekanan -kan pekannya -kan pemkan -kan pengan -kan penganan -kan sekan -kan terkan -kan terkanan -kana kekanakan -kana menganai -kana menganakan -kana pengana -kana terkana -kanak-kanak kekanak-kanakan -kanak-kanak kekanak-kanakkan -kanal menganal -kanalisasi dikanalisasi -kanalisasi menganalisasi -kanan dikanan -kanan kekanan -kanan menganani -kanan pekanan -kanan penganan -kanan pengananan -kanan terkanan -kancah berkancah -kancah dikancah -kancing berkancing -kancing dikancing -kancing dikancingkan -kancing kekancingan -kancing mengancingkan -kancung mengancungkan -kanda mengandakan -kanda pengandaan -kandang berkandang -kandang dikandang -kandang dikandangi -kandang dikandangkan -kandang dikandangnya -kandang mengandangkan -kandang mengkandangkan -kandang pekandangan -kandang pengandangan -kandang terkandang -kandar pengandaran -kandas dikandaskan -kandas mengandaskan -kandas mengkandaskan -kandidat dikandidatkan -kandil pengandilan -kandung berkandungan -kandung dikandung -kandung dikandungnya -kandung mengandung -kandung mengandungnya -kandung sekandung -kandung terkandung -kang bekang -kang kekang -kang kekangan -kang pengang -kang pengangan -kang sekang -kangar mengangarkan -kangkang dikangkangi -kangkang mengangkang -kangkang mengangkangi -kangkang pengangkangan -kangsa pengangsaan -kanibal dikanibal -kanibal mengkanibal -kanjal menganjal -kanjar menganjar -kanopi berkanopi -kanta mengantakan -kantan bekantan -kantar mengantar -kantar mengantarkan -kantar mengantarkannya -kantar mengantarnya -kantar pengantar -kantar pengantaran -kantar pengantarnya -kanti menganti -kanti mengantikan -kanti mengantikannya -kanti mengantinya -kanti penganti -kanti pengantian -kanti pengantinya -kantin pengantin -kantin pengantinnya -kantong berkantong -kantong dikantong -kantong dikantongi -kantong mengantong -kantong mengantongi -kantong pengantongan -kantong sekantong -kantor berkantor -kantor berkantornya -kantor dikantor -kantor dikantornya -kantor kekantor -kantor mengantor -kantor perkantoran -kantor sekantor -kantor sekantornya -kantuk mengantuk -kantuk mengantuknya -kantuk terkantuk -kantung berkantung -kantung dikantungi -kantung mengantung -kantung mengantungi -kantung mengantungkan -kantung sekantung -kanvas dikanvaskan -kanvas menganvaskan -kanvas mengkanvaskan -kanya pekanya -kanya terkanya -kaos berkaos -kap bekap -kap bekapan -kap mengkap -kap pengap -kap pengapnya -kap pengkapan -kap perkap -kap perkapnya -kap sekap -kap sekapan -kapa bekapai -kapa mengapa -kapa mengapai -kapai bekapai -kapai mengapai -kapal dikapal -kapal dikapalkan -kapal mengapalkan -kapal mengkapalkan -kapal pengapalan -kapal pengkapalan -kapal perkapalan -kapan bekapan -kapan pengkapan -kapan sekapan -kapar terkapar -kapar terkaparnya -kapasitas bekapasitas -kapasitas berkapasitas -kapat sekapat -kapi pengapian -kapit mengapit -kapit mengapitnya -kapit pengapit -kapita perkapita -kapita perkapitanya -kapon pengapon -kapten dikapteni -kapten mengapteni -kapung mengapung -kapung mengapungkan -kapung pengapung -kapung pengapungan -kapur berkapur -kapur pekapuran -kapur pengapuran -kapur perkapuran -kapur sekapur -kara mengarakan -kara mengkara -kara pekara -kara pengarakan -kara perkara -kara perkarakan -kara perkaranya -karam dikaramkan -karam mengaramkan -karang berkarang -karang dikarang -karang mengarang -karang pekarangan -karang pengarang -karang pengarangnya -karang perkarangan -karang sekarang -karang sekarangkan -karang sekaranglah -karang sekarangnya -karantina dikarantina -karantina dikarantinakan -karantina kekarantinaan -karantina mengarantina -karantina mengkarantina -karantina perkarantinaan -karaoke berkaraoke -karap mengarap -karap mengarapkan -karas kekarasan -karat berkarat -karat sekarat -karbohidrat berkarbohidrat -karbon berkarbon -karbonat berkarbonat -kardus sekardus -karena dikarena -karena dikarenakan -karier berkarier -karisma berkarisma -karpet berkarpet -karti mengartikan -karti mengartikannya -kartu berkartu -kartu dikartu -kartu mengartu -kartu mengkartu -karung mengarungi -karung pekarungan -karung pengarungan -karung perkarung -karung sekarung -karunia dikarunia -karunia dikaruniai -karunia dikaruniakan -karya bekarya -karya berkarya -karya dikaryakan -karya kekaryaan -karyawan kekaryawanan -kas bekas -kas bekasi -kas bekasnya -kas berkas -kas berkasi -kas berkasnya -kas dikasi -kas mengaskan -kas pekas -kasa mengasai -kasa perkasa -kasa perkasanya -kasah mengasah -kasah mengasahnya -kasah pengasah -kasah pengasahan -kasai mengasai -kasam pengasaman -kasap mengasapi -kasap pengasapan -kasar dikasari -kasar kekasaran -kasar mengasari -kasar mengkasari -kasar sekasar -kasasi dikasasi -kasasi dikasasikan -kasi bekasi -kasi berkasi -kasi dikasi -kasih berkasih -kasih dikasih -kasih dikasihi -kasih dikasihkan -kasih dikasihnya -kasih kekasih -kasih kekasihnya -kasih mengasih -kasih mengasihi -kasih pengasih -kasih pengasihan -kasih terkasih -kasih terkasihnya -kasir pekasiran -kasta berkasta -kasus berkasus -kasus dikasuskan -kasus perkasus -kata berkata -kata berkatalah -kata dikata -kata dikatai -kata dikatakan -kata dikatakannya -kata mengataan -kata mengatai -kata mengatakan -kata mengatakannya -kata perkata -kata perkataan -kata sekata -kata terkatakan -katai dikatai -katai mengatai -katak dikatakan -katak mengatak -katak mengatakan -katak mengatakkan -katak sekatak -katak terkatakan -kataka dikataka -kataka dikatakanya -kataka mengataka -kataka mengatakaan -kataka mengatakakan -katakana mengatakana -katalisasi mengkatalisasi -katar mengatar -katar mengatarkan -katar pengatar -kategori berkategori -kategori dikategori -kategori dikategorikan -kategori mengategorikan -kategori mengategorikannya -kategori mengkategorikan -kategori mengkategorikannya -kategori pengategorian -kategori pengkategorian -kategori terkategori -kategori terkategorikan -kategorisasi dikategorisasi -kati berkati -kati dikatikan -kati sekati -kati terkati -katik dikatikan -katrol dikatrol -katrol mengatrol -katrol mengkatrol -katrol terkatrol -katul bekatul -katung sekatung -katung terkatung -katup mengatup -katup mengatupkan -katup terkatup -kau dikau -kau mengau -kau mengkau -kau mengkaui -kaum mengaum -kaum pekauman -kaus berkaus -kaut kekautan -kaut mengaut -kaver mengkaver -kaver terkaver -kawak mengawaki -kawak pengawak -kawak pengawakan -kawal dikawal -kawal dikawalnya -kawal mengawal -kawal mengawali -kawal mengawalnya -kawal mengkawal -kawal pengawal -kawal pengawalan -kawal pengawalnya -kawal terkawal -kawan berkawan -kawan dikawan -kawan pengawan -kawan perkawanan -kawan sekawan -kawan sekawanan -kawang mengawang -kawasan dikawasan -kawasan pengawasan -kawasan pengawasannya -kawasan sekawasan -kawat berkawat -kawat mengawati -kawin dikawin -kawin dikawini -kawin dikawinkan -kawin mengawini -kawin mengawinkan -kawin mengawinkannya -kawin perkawinan -kaya dikayakan -kaya kekayaan -kaya mengayakan -kaya pengaya -kaya pengayaan -kaya pengkayaan -kaya perkaya -kaya sekaya -kaya terkaya -kayak dikayakan -kayak mengayak -kayak mengayakan -kayan kekayan -kayan kekayannya -kayu berkayu -kayu perkayuan -kayu sekayu -kayuh dikayuh -kayuh mengayuh -kayuh mengayuhkan -kayuh pengayuh -kayun mengayun -kayun mengayunkan -kayun mengayunkannya -ke berke -ke dike -ke keke -ke menge -ke menke -ke seke -kebal kekebalan -kebas kekebasan -kebaya berkebaya -kebiri dikebiri -kebiri mengebiri -kebiri mengkebiri -kebiri pengebirian -kebul mengebul -kebun berkebun -kebun dikebun -kebun pekebun -kebun pekebunan -kebun perkebunan -kebut dikebut -kebut mengebut -kecak pengecakan -kecam dikecam -kecam dikecamnya -kecam mengecam -kecam mengecamnya -kecam pengecam -kecam pengecaman -kecam pengecamnya -kecambah berkecambah -kecambah perkecambahan -kecamuk berkecamuk -kecamuk berkecamuknya -kecap dikecap -kecap mengecap -kecap pengecap -kecap pengecapan -kece mengecekan -kece pengecekan -kece pengecekannya -kecek mengecek -kecek mengecekan -kecek mengeceknya -kecek pengecek -kecek pengecekan -kecek pengecekkan -kecer mengecer -kecer mengecerkan -kecer pengecer -kecer pengecernya -kecewa dikecewakan -kecewa kekecewaan -kecewa mengecewakan -kecewa mengecewakannya -kecil berkecil -kecil dikecilkan -kecil kekecilan -kecil mengecil -kecil mengecilkan -kecil mengecilkannya -kecil mengecilnya -kecil pengecil -kecil pengecilan -kecil perkecil -kecil sekecil -kecil terkecil -kecil terkecilnya -kecimpung bekecimpung -kecimpung berkecimpung -kecoh dikecoh -kecoh mengecoh -kecoh mengecohkan -kecoh mengecohnya -kecoh pengecoh -kecoh terkecoh -kecuali dikecualikan -kecuali kekecualian -kecuali mengecualikan -kecuali pengecualian -kecuali perkecualian -kecuali terkecuali -kecup mengecup -kecut pengecut -kedal pengedali -kedip berkedip -kedip mengedip -kedip mengedipkan -kedok berkedok -keduduk berkedudukan -keduk mengeduk -kedut berkedut -kejam kekejaman -kejam sekejam -kejam terkejam -kejan mengejan -kejang kekejangan -kejang mengejang -kejap sekejap -kejar berkejaran -kejar dikejar -kejar dikejarnya -kejar kekejar -kejar mengejar -kejar mengejarkan -kejar mengejarnya -kejar pengejar -kejar pengejaran -kejar pengejarnya -kejar terkejar -keji kekejian -keji sekeji -keju mengejukan -kejut dikejutkan -kejut mengejutan -kejut mengejutkan -kejut mengejutkannya -kejut pengejut -kejut terkejut -kejut terkejutlah -kejut terkejutnya -kek kekek -kekal kekekalan -kekal mengekalkan -kekang dikekang -kekang mengekang -kekang mengekangnya -kekang pengekang -kekang pengekangan -kekang terkekang -kekeh terkekeh -kelabu dikelabui -kelabu mengelabui -kelabu pengelabuan -kelabu terkelabui -kelah berkelahi -kelah kekelahan -kelah mengelahkan -kelahi berkelahi -kelahi perkelahian -kelak mengelak -kelak mengelakkan -kelak mengelaknya -kelak pengelak -kelak pengelakan -kelakar berkelakar -kelam kekelaman -kelam mengelami -kelam pengelaman -kelam terkelam -kelamin berkelamin -kelana berkelana -kelana pengelana -kelap mengelap -kelap mengelapkan -kelap mengelapnya -kelap pengelap -kelap pengelapan -kelap-kelip berkelap-kelip -kelar mengelar -kelar mengelarkan -kelas berkelas -kelas berkelasnya -kelas dikelas -kelas dikelasnya -kelas mengelas -kelas pengelasan -kelas sekelas -kelas sekelasnya -kelebat berkelebat -kelebat sekelebat -keler dikeler -keliar bekeliaran -keliar berkeliaran -keliling bekeliling -keliling berkeliling -keliling dikeliling -keliling dikelilingi -keliling mengeliling -keliling mengelilingi -keliling sekeliling -keliling sekelilingnya -kelindan berkelindan -kelip berkelip -kelir berkelir -kelir dikelir -keliru kekeliruan -kelit berkelit -kelitik mengelitik -kelok berkelok -kelola dikelola -kelola dikelolanya -kelola mengelola -kelola mengelolaan -kelola mengelolanya -kelola pengelola -kelola pengelolaan -kelola pengelolanya -kelola terkelola -kelompok berkelompok -kelompok dikelompokan -kelompok dikelompokkan -kelompok mengelompok -kelompok mengelompokan -kelompok mengelompokkan -kelompok mengelompokkannya -kelompok pengelompokan -kelompok pengelompokkan -kelompok perkelompok -kelompok sekelompok -kelopak berkelopak -kelu mengelukan -kelua mengeluakan -keluak mengeluakan -keluar dikeluar -keluar dikeluaran -keluar dikeluarkan -keluar dikeluarkannya -keluar mengeluar -keluar mengeluaran -keluar mengeluarkan -keluar mengeluarkannya -keluar pengeluar -keluar pengeluaran -keluar pengeluarkan -keluar sekeluar -keluar sekeluarnya -keluarga bekeluarga -keluarga berkeluarga -keluarga dikeluarga -keluarga kekeluargaan -keluarga sekeluarga -keluh berkeluh -keluh dikeluhkan -keluh dikeluhkannya -keluh mengeluh -keluh mengeluhkan -keluh mengeluhkannya -keluh pengeluh -keluk mengelukan -kelumit sekelumit -kelupas dikelupas -kelupas mengelupas -kelupas mengelupaskan -kelupas pengelupas -kelupas pengelupasan -kelupas terkelupas -kelupas terkelupasnya -kelus mengelus -kelus mengelusnya -kelut mengeluti -keluyur berkeluyuran -kemah berkemah -kemah perkemahan -kemas berkemas -kemas berkemasan -kemas dikemas -kemas dikemasi -kemas dikemasnya -kemas mengemas -kemas mengemasi -kemas mengemaskan -kemas mengemasnya -kemas pengemas -kemas pengemasan -kemas terkemas -kemat mengemat -kemat pengematan -kembal dikembali -kembal sekembali -kembali dikembali -kembali dikembalikan -kembali dikembalikannya -kembali mengembalikan -kembali mengembalikannya -kembali pengembalian -kembali pengembalikan -kembali sekembali -kembali sekembalinya -kemban mengemban -kemban mengembankan -kemban mengembannya -kemban pengemban -kemban pengembanan -kembang bekembang -kembang berkembang -kembang berkembangan -kembang berkembangkan -kembang berkembanglah -kembang berkembangnya -kembang dikembang -kembang dikembangan -kembang dikembangkan -kembang dikembangkannya -kembang mengembang -kembang mengembangan -kembang mengembangkan -kembang mengembangkannya -kembang mengembangnya -kembang pekembangan -kembang pengembang -kembang pengembangan -kembang pengembangkan -kembang pengembangnya -kembang perkembang -kembang perkembangan -kembang perkembangkan -kembang perkembangnya -kembang terkembang -kembung mengembung -kemeja berkemeja -kemi perkemi -kemih berkemih -kemoterapi dikemoterapi -kempas mengempas -kempas mengempaskan -kempis dikempiskan -kempis mengempis -kempis mengempiskan -kempis pengempisan -kempit mengempit -kemplang dikemplang -kemplang mengemplang -kemplang pengemplang -kemplang pengemplangan -kemu dikemukan -kemu mengemukan -kemu terkemukan -kemudi berkemudi -kemudi dikemudian -kemudi dikemudikan -kemudi dikemudikannya -kemudi mengemudi -kemudi mengemudikan -kemudi mengemudikannya -kemudi mengemudilah -kemudi mengemudinya -kemudi pengemudi -kemudi pengemudian -kemudi pengemudinya -kemudian dikemudian -kemudian pengemudian -kemut mengemut -ken beken -ken bekennya -ken berkenan -ken keken -ken mengeni -ken peken -ken pengen -ken pengennya -ken perkenan -ken perkeni -ken seken -ken terkenan -kena berkenaan -kena dikena -kena dikenai -kena dikenakan -kena dikenakannya -kena mengena -kena mengenai -kena mengenakan -kena mengenakannya -kena pengenaan -kena pengenai -kena sekenanya -kena terkena -kena terkenanya -kenal berkenalan -kenal dikenal -kenal dikenalan -kenal dikenali -kenal dikenalkan -kenal dikenalkannya -kenal dikenalnya -kenal mengenal -kenal mengenali -kenal mengenalkan -kenal mengenalkannya -kenal mengenalnya -kenal pengenal -kenal pengenalan -kenal pengenalnya -kenal perkenalan -kenal perkenalkan -kenal terkenal -kenal terkenali -kenal terkenalnya -kenan berkenan -kenan dikenankan -kenan mengenani -kenan perkenan -kenan perkenankan -kenan terkenan -kenang dikenang -kenang dikenangnya -kenang mengenang -kenang mengenangi -kenang mengenangkan -kenang mengenangnya -kenang terkenang -kenas mengenasi -kenas mengenaskan -kencan berkencan -kencan dikencani -kencan mengencani -kencan perkencanan -kencang dikencangkan -kencang kekencangan -kencang mengencang -kencang mengencangkan -kencang mengencangkannya -kencang pengencang -kencang pengencangan -kencang sekencang -kencang terkencang -kencar mengencarkan -kencing dikencingi -kencing mengencingi -kendal berkendali -kendal dikendali -kendal pengendali -kendal terkendal -kendal terkendali -kendala berkendala -kendala terkendala -kendala terkendalanya -kendali berkendali -kendali dikendali -kendali dikendalikan -kendali dikendalikannya -kendali mengendalikan -kendali mengendalikannya -kendali pengendali -kendali pengendalian -kendali pengendalinya -kendali terkendali -kendali terkendalikan -kendali terkendalinya -kendara bekendara -kendara berkendara -kendara berkendaraan -kendara berkendaralah -kendara berkendaranya -kendara dikendaraan -kendara dikendarai -kendara mengendara -kendara mengendarai -kendara mengendarakan -kendara pengendara -kendara pengendaraan -kendara pengendaranya -kendong mengendong -kendur dikendurkan -kendur kekenduran -kendur mengendur -kendur mengendurkan -kendur mengendurnya -kendur pengenduran -keng mekeng -kental kekentalan -kental mengental -kental mengentalkan -kental pengental -kental pengentalan -kenteng mengentengkan -kenyal kekenyalan -kenyal mengenyalkan -kenyam mengenyam -kenyang kekenyangan -kenyang mengenyangkan -keong mengeong -kepak mengepak -kepak mengepakan -kepak mengepakkan -kepak pengepakan -kepal mengepal -kepal mengepalkan -kepal sekepal -kepal sekepalan -kepal terkepal -kepala berkepala -kepala dikepala -kepala dikepalai -kepala dikepalanya -kepala mengepalai -kepang dikepang -kepang mengepang -kepel mengepel -keping berkeping -keping sekeping -kepret dikepret -kepret mengepret -kepruk dikepruk -kepul mengepul -kepul mengepulkan -kepul pengepul -kepul pengepulan -kepul pengepulnya -kepung dikepung -kepung mengepung -kepung mengepungnya -kepung pengepungan -kepung terkepung -kera bekera -kera kekeraan -kera mengerakan -kera pekera -kerabat berkerabat -kerabat kekerabatan -kerah bekerah -kerah berkerah -kerah dikerahkan -kerah dikerahkannya -kerah mengerah -kerah mengerahkan -kerah mengerahkannya -kerah pengerah -kerah pengerahan -kerak berkerak -kerak mengerak -kerak mengerakan -kerak mengerakkan -kerak pengerak -keram mengeram -keram mengerami -keram pengeraman -keraman pengeraman -keramas berkeramas -keramas dikeramas -keramat dikeramatkan -keramat mengeramatkan -keramat mengkeramatkan -keramik dikeramik -keran kekeran -keran pengeran -kerang kekerangan -kerang mengerang -kerang pengerang -kerang sekerang -kerangka berkerangka -kerangkeng dikerangkeng -keranjang sekeranjang -kerap dikerap -kerap kekerapan -kerap pengerapan -keras berkeras -keras dikerasi -keras dikeraskan -keras kekerasan -keras mengeras -keras mengeraskan -keras mengerasnya -keras pengeras -keras pengerasan -keras perkerasan -keras sekeras -keras terkeras -kerasan kekerasan -kerasan kekerasannya -kerasan pengerasan -kerasan perkerasan -kerat mengerat -kerat mengeratkan -kerat pengerat -kerat sekerat -kerdil dikerdilkan -kerdil kekerdilan -kerdil mengerdilkan -kerdil mengkerdilkan -kerdil pengerdilan -kerdil pengkerdilan -kerek dikerek -kerek mengerek -kerek pengerek -kerek terkerek -kerek terkereknya -keren sekeren -keren terkeren -kereta berkereta -kereta perkereta -keri mengeri -keri mengerikan -keri mengerikannya -kerik dikerik -kerik mengerik -kerik mengerikan -kerikil berkerikil -kering dikeringkan -kering kekeringan -kering mengering -kering mengeringkan -kering mengeringkannya -kering mengeringnya -kering pengering -kering pengeringan -kering sekering -kering terkering -keringat berkeringat -keriput berkeriput -keriput mengeriput -keritik mengeritik -keritik pengeritik -keritik pengeritiknya -keriting dikeriting -keriting mengeriting -keriting pengeriting -keriting pengeritingan -kerja bekerja -kerja bekerjalah -kerja bekerjanya -kerja berkerja -kerja dikerja -kerja dikerjaan -kerja dikerjai -kerja dikerjakan -kerja dikerjakannya -kerja mengerjai -kerja mengerjakan -kerja mengerjakannya -kerja pekerja -kerja pekerjaan -kerja pekerjakan -kerja pekerjanya -kerja pengerja -kerja pengerjaan -kerja perkerja -kerja perkerjaan -kerja sekerja -kerja sekerjanya -kernyit mengernyit -kernyit mengernyitkan -kerok dikerok -kerok dikeroki -kerok mengerok -keropos kekeroposan -keropos pengeroposan -kerosi mengerosi -keroyok dikeroyok -keroyok mengeroyok -keroyok mengeroyoknya -keroyok pengeroyok -keroyok pengeroyokan -keroyok pengeroyokkan -keroyok pengeroyoknya -kers kekersan -kerubung dikerubungi -kerubung mengerubung -kerubung mengerubungi -kerubut dikerubuti -kerubut mengerubuti -kerucut dikerucutkan -kerucut mengerucut -kerucut mengerucutkan -kerucut mengerucutnya -kerucut mengkerucut -kerucut pengerucutan -kerudung berkerudung -keruh berkeruh -keruh kekeruhan -keruh mengeruh -keruh mengeruhkan -keruh perkeruh -keruk dikeruk -keruk mengeruk -keruk pengeruk -keruk pengerukan -keruk pengerukkan -keruk terkeruk -kerumun berkerumun -kerumun berkerumunan -kerumun dikerumunan -kerumun dikerumuni -kerumun mengerumuni -kerumun sekerumunan -kerupuk pengerupukan -kerut berkerut -kerut mengerut -kerut mengerutkan -kerut mengkerut -kerut pengerutan -kes berkesan -kes mekes -kes menkes -kes terkes -kes terkesan -kesah mengesahan -kesah mengesahkan -kesah mengesahkannya -kesah pengesahan -kesak mengesakan -kesal kekesalan -kesal mengesalkan -kesan berkesan -kesan berkesannya -kesan dikesankan -kesan mengesankan -kesan mengesankannya -kesan terkesan -kesan terkesannya -keset mengeset -keset pengesetan -kesiap terkesiap -kesima terkesima -keta mengetakan -ketak mengetakan -ketar mengetarkan -ketat diketatkan -ketat keketatan -ketat mengetat -ketat mengetatkan -ketat mengetatnya -ketat pengetatan -ketat perketat -ketat perketatan -ketat seketat -ketat terketat -ketemu diketemukan -ketemu diketemukannya -keteng seketeng -ketes mengetes -ketes mengetesnya -ketes pengetes -ketes pengetesan -keti mengetikan -keti pengetikan -keti seketi -ketik diketik -ketik diketikkan -ketik mengetik -ketik mengetikan -ketik mengetikkan -ketik mengetiknya -ketik pengetik -ketik pengetikan -ketok diketok -ketok mengetok -ketok pengetokan -ketombe berketombe -ketu diketui -ketu mengetukan -ketua diketua -ketua diketuai -ketua keketuaan -ketua mengetuai -ketuk diketuk -ketuk mengetuk -ketuk mengetukan -ketuk mengetukkan -ketuk mengetuknya -ketuk pengetuk -ketuk terketuk -kewuh pekewuh -khabis menghabisi -khabis menghabiskan -khabis menghabiskannya -khabis penghabisan -khalifah kekhalifahan -khalwat berkhalwat -khas kekhasan -khasi menghasikan -khasiat berkhasiat -khatam menghatam -khatam mengkhatamkan -khawatir dikhawatir -khawatir dikhawatirkan -khawatir dikhawatirkannya -khawatir kekhawatiran -khawatir kekhawatirkan -khawatir menghawatirkan -khawatir mengkhawatir -khawatir mengkhawatiran -khawatir mengkhawatirkan -khawatir mengkhawatirkannya -khawatir menkhawatirkan -khayal berkhayal -khayal menghayal -khayal mengkhayal -khayal mengkhayalkan -khianat berkhianat -khianat dikhianati -khianat menghianati -khianat mengkhianati -khianat penghianat -khianat penghianatan -khianat pengkhianat -khianat pengkhianatan -khianat terkhianati -khidmat berkhidmat -khidmat kekhidmatan -khilaf kekhilafan -khitan dikhitan -khitan mengkhitan -khotbah berkhotbah -khotbah pengkhotbah -khusus dikhususkan -khusus dikhususnya -khusus kekhususan -khusus mengkhususkan -khusus pengkhususan -khusus terkhusus -khusyuk kekhusyukan -ki beki -ki berkilah -ki diki -ki keki -ki meki -ki mengi -ki pekikan -ki pengki -ki perki -ki seki -ki sekian -kian sekian -kiar sekiar -kiat berkiatan -kiat mengiatkan -kiat pengiat -kiat sekiat -kiat terkiat -kibar berkibar -kibar berkibarlah -kibar berkibarnya -kibar dikibarkan -kibar dikibarkannya -kibar mengibarkan -kibar mengibarkannya -kibar pengibar -kibar pengibaran -kibas dikibaskan -kibas mengibas -kibas mengibaskan -kiblat berkiblat -kibul dikibuli -kibul mengibuli -kicau berkicau -kicau dikicaukan -kicau dikicaukannya -kicau mengicau -kicau mengicaukan -kicau pengicau -kici perkici -kidam mengidam -kidam mengidamkan -kijang sekijang -kik pekik -kik pekikan -kik pekiknya -kikir dikikir -kikir mengikir -kikir pekikir -kikis dikikis -kikis mengikis -kikis mengikisnya -kikis mengkikis -kikis pengikis -kikis pengikisan -kikis terkikis -kikis terkikisnya -kikuk kekikukan -kilah berkilah -kilang mengilang -kilang mengilangkan -kilang pengilangan -kilap berkilap -kilap mengilap -kilap mengilapnya -kilap mengkilap -kilap mengkilapnya -kilas mengilas -kilas sekilas -kilat berkilat -kilat mengilat -kilat mengkilat -kilau berkilau -kilau berkilauan -kilau mengkilau -kili dikili -kilir terkilir -kilo perkilo -kilo perkilonya -kilo sekilo -kilo sekilonya -kilogram perkilogram -kilogram perkilogramnya -kilogram sekilogram -kilometer berkilometer -kilometer perkilometer -kilometer perkilometernya -kim bekim -kim perkim -kimbang mengimbang -kimbang mengimbangi -kimbang mengimbangkan -kimbang pengimbang -kina mengina -kincau sekincau -kindap mengindap -kinerja berkinerja -kini kekinian -kini pengkinian -kini terkini -kini terkininya -kinja menginjakan -kinja penginjakan -kipas dikipas -kipas dikipasi -kipas mengipas -kipas mengipasi -kiprah berkiprah -kir bekir -kir dikir -kir dikiri -kir kekiri -kir mengiri -kir mengkir -kir pengiran -kir perkiran -kir sekir -kira dikira -kira dikiranya -kira mengira -kira mengiranya -kira perkiraan -kira perkirakan -kira sekira -kira sekiranya -kira terkira -kirab dikirab -kiri dikiri -kiri kekiri -kiri mengiri -kiri mengirikan -kirik mengirikan -kirim berkirim -kirim dikirim -kirim dikirimi -kirim dikirimkan -kirim dikirimkannya -kirim dikirimlah -kirim dikirimnya -kirim mengirim -kirim mengiriman -kirim mengirimi -kirim mengirimkan -kirim mengirimkannya -kirim mengirimnya -kirim pengirim -kirim pengiriman -kirim pengirimkan -kirim pengirimnya -kirim terkirim -kirim terkirimnya -kiris mengiris -kiris mengirisnya -kiris pengiris -kisah berkisah -kisah dikisahkan -kisah dikisahkannya -kisah mengisahkan -kisah mengkisahkan -kisar bekisar -kisar berkisar -kisar berkisaran -kisar dikisaran -kisar dikisarkan -kisar sekisar -kisi mengisi -kisi mengisikan -kisi mengisinya -kisi pengisi -kisi pengisian -kisi pengisinya -kisik mengisikan -kisruh kekisruhan -kit berkitan -kit dikit -kit dikitlah -kit terkit -kita dikita -kita sekita -kita sekitanya -kitar dikitari -kitar mengitari -kitar sekitar -kitar sekitaran -kitar sekitarnya -kitir pengkitiran -klaim diklaim -klaim diklaimkan -klaim diklaimnya -klaim mengklaim -klaim mengklaimnya -klaim menglaim -klaim menklaim -klaim pengklaim -klaim pengklaiman -klakson diklakson -klakson mengklakson -klarifikasi diklarifikasi -klarifikasi diklarifikasikan -klarifikasi mengklarifikasi -klarifikasi mengklarifikasikan -klarifikasi mengklarifikasinya -klarifikasi menglarifikasi -klarifikasi terklarifikasi -klasemen diklasemen -klasifikasi berklasifikasi -klasifikasi diklasifikasi -klasifikasi diklasifikasikan -klasifikasi mengklasifikasi -klasifikasi mengklasifikasikan -klasifikasi mengklasifikasikannya -klasifikasi pengklasifikasian -klasifikasi terklasifikasi -klik diklik -klik mengklik -klik mengkliknya -kloning dikloning -kloning mengkloning -kloning pengkloningan -klorat perklorat -klorin berklorin -klub diklub -klub diklubnya -klub seklub -klub seklubnya -knalpot berknalpot -koalisi berkoalisi -koar berkoar -kobar berkobar -kobar berkobarnya -kobar dikobarkan -kobar mengobarkan -kobar pengobar -kocek berkocek -kocek mengocek -koci sekoci -koci sekocinya -kocok dikocok -kocok mengocok -kocok mengocoknya -kocok pengocokan -koda mengoda -kode berkode -kode dikodekan -kode mengkodekan -kode pengkodean -kode pengodean -kodifikasi dikodifikasi -kodok mengodok -koh berkoh -kok pengkok -kok pengok -kokah sekokah -kokang dikokang -kokang mengokang -kokok berkokok -kol pengkol -kol pengkolan -kol sekolan -kola mengola -kola pengola -kola pengolaan -kola sekola -kolaborasi berkolaborasi -kolaborasi dikolaborasi -kolaborasi dikolaborasikan -kolaborasi mengkolaborasi -kolaborasi mengkolaborasikan -kolaborasi mengolaborasi -kolaborasi mengolaborasikan -koleksi dikoleksi -koleksi dikoleksinya -koleksi mengkoleksi -koleksi mengoleksi -koleksi mengoleksinya -koleksi pengkoleksi -koleksi pengoleksi -kolesterol berkolesterol -kolok mengolok -kolok mengoloknya -kolon berkoloni -kolong mengolongi -kolong sekolong -koloni berkoloni -kolonisasi mengkolonisasi -kolusi berkolusi -komandan dikomandani -komandan mengomandani -komando dikomando -komando dikomandoi -komando mengkomando -komando mengkomandoi -komando mengomando -komando mengomandoi -kombinasi berkombinasi -kombinasi dikombinasi -kombinasi dikombinasikan -kombinasi mengkombinasi -kombinasi mengkombinasikan -kombinasi mengkombinasikannya -kombinasi mengombinasi -kombinasi mengombinasikan -kombinasi mengombinasikannya -komentar bekomentar -komentar berkomentar -komentar dikomentari -komentar mengkomentari -komentar mengomentar -komentar mengomentari -komersial dikomersialkan -komersial mengkomersialkan -komersial mengomersialkan -komersialisasi dikomersialisasi -komersialisasi dikomersialisasikan -komersialisasi mengkomersialisasikan -komersialisasi mengomersialisasikan -komitmen berkomitmen -komitmen dikomitmenkan -kompak kekompakan -kompak kekompakkan -kompak sekompak -komparasi dikomparasi -komparasi dikomparasikan -komparasi mengkomparasi -komparasi mengkomparasikan -komparasi mengomparasi -komparasi mengomparasikan -kompatriot sekompatriotnya -kompensasi dikompensasi -kompensasi dikompensasikan -kompensasi mengkompensasi -kompensasi mengompensasi -kompensasi terkompensasi -kompeten berkompeten -kompetensi berkompetensi -kompetisi berkompetisi -kompetisi dikompetisi -kompetisi dikompetisikan -kompetitif berkompetitif -kompetitif sekompetitif -kompilasi dikompilasi -kompilasi dikompilasikan -kompilasi mengkompilasi -kompilasi mengkompilasikan -kompilasi mengompilasi -komplain dikomplain -komplain mengkomplain -kompleks sekompleks -komplikasi berkomplikasi -komplot berkomplot -kompon berkompon -komponen berkomponen -kompor dikompori -kompor mengompori -kompos pengomposan -komposisi berkomposisi -kompres berkompresi -kompres dikompres -kompres dikompresi -kompres mengkompres -kompres mengkompresi -kompres mengompres -kompres mengompresi -kompres mengompresnya -kompres pengompresan -kompres terkompresi -kompresi berkompresi -kompresi dikompresi -kompresi mengkompresi -kompresi mengompresi -kompresi terkompresi -kompromi berkompromi -kompromi dikompromi -kompromi dikompromikan -kompromi mengkompromikan -kompromi mengompromikan -komputer berkomputer -komputer memkomputer -komputerisasi dikomputerisasi -komputerisasi terkomputerisasi -komunikasi bekomunikasi -komunikasi berkomunikasi -komunikasi berkomunikasilah -komunikasi berkomunikasinya -komunikasi dikomunikasi -komunikasi dikomunikasikan -komunikasi mengkomunikasi -komunikasi mengkomunikasikan -komunikasi mengkomunikasikannya -komunikasi mengomunikasikan -komunikasi mengomunikasikannya -komunikasi terkomunikasi -komunikasi terkomunikasikan -komunitas berkomunitas -konco perkoncoan -kondensasi terkondensasi -kondisi berkondisi -kondisi dikondisikan -kondisi mengkondisikan -kondisi mengondisikan -kondisi pengkondisian -kondisi pengondisian -kondisi terkondisi -kondisi terkondisikan -kondusif kekondusifan -kondusif mengkondusifkan -kondusif sekondusif -koneksi berkoneksi -koneksi dikoneksi -koneksi dikoneksikan -koneksi mengkoneksi -koneksi mengkoneksikan -koneksi mengoneksikan -koneksi terkoneksi -koneksi terkoneksinya -konfigurasi berkonfigurasi -konfigurasi dikonfigurasi -konfigurasi dikonfigurasikan -konfigurasi mengkonfigurasi -konfigurasi mengonfigurasi -konfigurasi terkonfigurasi -konfirmasi dikonfirmasi -konfirmasi dikonfirmasikan -konfirmasi mengkonfirmasi -konfirmasi mengkonfirmasikan -konfirmasi mengkonfirmasikannya -konfirmasi mengkonfirmasinya -konfirmasi mengonfirmasi -konfirmasi mengonfirmasikan -konfirmasi mengonfirmasikannya -konfirmasi mengonfirmasinya -konfirmasi menkonfirmasi -konfirmasi terkonfirmasi -konflik berkonflik -konfrontasi berkonfrontasi -konfrontasi dikonfrontasi -konfrontasi dikonfrontasikan -konfrontasi mengkonfrontasi -konfrontasi mengkonfrontasikan -konfrontasi mengonfrontasi -kongres berkongres -kongsi berkongsi -kongsi perkongsian -konkret dikonkretkan -konkret mengkonkretkan -konotasi berkonotasi -konotasi dikonotasikan -konsekuensi berkonsekuensi -konsentrasi berkonsentrasi -konsentrasi berkonsentrasilah -konsentrasi dikonsentrasikan -konsentrasi mengkonsentrasikan -konsentrasi mengonsentrasikan -konsentrasi terkonsentrasi -konsentrasi terkonsentrasinya -konsep berkonsep -konsep dikonsep -konsep dikonsepkan -konsep mengkonsep -konsep mengonsep -konsep mengonsepkan -konsep pengonsep -konsep terkonsep -konservasi dikonservasi -konservasi mengkonservasi -konservasi mengonservasi -konsinyasi dikonsinyasi -konsisten kekonsistenan -konsisten sekonsisten -konsolidasi berkonsolidasi -konsolidasi dikonsolidasi -konsolidasi dikonsolidasikan -konsolidasi mengkonsolidasi -konsolidasi mengkonsolidasikan -konsolidasi mengonsolidasi -konsolidasi mengonsolidasikan -konsolidasi menkonsolidasikan -konsolidasi terkonsolidasi -konsolidasi terkonsolidasikan -konsolidasi terkonsolidasinya -konsorsium berkonsorsium -konspirasi berkonspirasi -konstitusi berkonstitusi -konstruksi berkonstruksi -konstruksi dikonstruksi -konstruksi dikonstruksikan -konstruksi mengkonstruksi -konstruksi mengkonstruksikan -konstruksi mengonstruksi -konstruksi mengonstruksikan -konstruksi terkonstruksi -konsultasi berkonsultasi -konsultasi berkonsultasilah -konsultasi dikonsultasikan -konsultasi mengkonsultasikan -konsultasi mengkonsultasikannya -konsultasi mengonsultasikan -konsultasi mengonsultasikannya -konsumsi berkonsumsi -konsumsi dikonsumsi -konsumsi dikonsumsinya -konsumsi mengkonsumsi -konsumsi mengkonsumsinya -konsumsi mengonsumsi -konsumsi mengonsumsinya -konsumsi menkonsumsi -konsumsi pengkonsumsi -konsumsi pengkonsumsian -konsumsi pengkonsumsinya -konsumsi pengonsumsi -konsumsi pengonsumsian -konsumsi pengonsumsinya -konsumsi terkonsumsi -kontak berkontak -kontak dikontak -kontak mengkontak -kontak mengontak -kontak mengontaknya -kontak terkontak -kontaminasi mengkontaminasi -kontaminasi mengontaminasi -kontaminasi terkontaminasi -kontaminasi terkontaminasinya -konteks berkonteks -kontemplasi berkontemplasi -konter dikonter -konter mengkonter -kontes berkontes -kontes dikonteskan -kontol mengontol -kontradiksi berkontradiksi -kontrak berkontrak -kontrak dikontrak -kontrak dikontrakan -kontrak dikontrakkan -kontrak dikontraknya -kontrak mengkontrak -kontrak mengontrak -kontrak mengontrakkan -kontrak mengontraknya -kontrak pengontrak -kontrak terkontrak -kontraksi berkontraksi -kontraksi terkontraksi -kontraksi terkontraksinya -kontras dikontraskan -kontras kekontrasan -kontras mengontraskan -kontribusi bekontribusi -kontribusi berkontribusi -kontribusi dikontribusi -kontribusi dikontribusikan -kontribusi mengkontribusi -kontribusi mengkontribusikan -kontribusi mengontribusi -kontribusi mengontribusikan -kontrol dikontrol -kontrol dikontrolnya -kontrol mengkontrol -kontrol mengontrol -kontrol mengontrolnya -kontrol pengontrol -kontrol pengontrolan -kontrol pengontrolnya -kontrol terkontrol -kontrol terkontrolnya -kontur berkontur -konvergensi berkonvergensi -konvergensi terkonvergensi -konversi dikonversi -konversi dikonversikan -konversi mengkonversi -konversi mengkonversikan -konversi mengkonversikannya -konversi mengkonversinya -konversi mengonversi -konversi mengonversikan -konversi mengonversikannya -konversi mengonversinya -konversi menkonversi -konversi terkonversi -konvoi berkonvoi -konyol kekonyolan -kooperasi berkooperasi -kooptasi dikooptasi -kooptasi mengkooptasi -kooptasi terkooptasi -koordinasi bekoordinasi -koordinasi berkoordinasi -koordinasi berkoordinasikan -koordinasi dikoordinasi -koordinasi dikoordinasikan -koordinasi mengkoordinasi -koordinasi mengkoordinasikan -koordinasi mengkoordinasikannya -koordinasi mengoordinasi -koordinasi mengoordinasikan -koordinasi mengoordinasikannya -koordinasi pengkoordinasian -koordinasi terkoordinasi -koordinasi terkoordinasikan -koordinasi terkoordinasinya -koordinator dikoordinatori -kop berkop -kop dikopi -kop mengkopi -kop mengopi -kop menkop -kop sekop -koper mengoper -koper mengoperkan -koper mengoperkannya -koper mengopernya -koper pengoper -koper pengoperan -koper sekoper -koperasi berkoperasi -koperasi mengoperasi -koperasi mengoperasikan -koperasi mengoperasikannya -koperasi mengoperasinya -koperasi pengoperasi -koperasi pengoperasian -koperasi pengoperasikan -koperasi perkoperasian -kopi dikopi -kopi mengkopi -kopi mengopi -kopi perkopian -kopiah berkopiah -kor sekor -koral mengoral -korban berkorban -korban dikorbankan -korban mengorbankan -korban mengorbankannya -korban pengorbanan -korban terkorbankan -korek dikorek -korek mengorek -korek mengoreknya -korek pengorek -korek pengorekan -koreksi dikoreksi -koreksi mengkoreksi -koreksi mengoreksi -koreksi mengoreksinya -koreksi pengoreksi -koreksi pengoreksian -koreksi terkoreksi -koreksi terkoreksinya -korelasi berkorelasi -korelasi dikorelasikan -korelasi mengkorelasikan -korelasi terkorelasi -korespondensi berkorespondensi -korok mengorok -korting dikorting -korting mengkorting -korting mengorting -korup dikorup -korup terkorup -korupsi berkorupsi -korupsi dikorupsi -korupsi dikorupsinya -korupsi mengkorupsi -korupsi mengorupsi -kosong dikosongi -kosong dikosongkan -kosong kekosongan -kosong mengosongi -kosong mengosongkan -kosong mengosongkannya -kosong pengosongan -kostum berkostum -kota dikota -kota pemkota -kota pengkotakan -kota perkota -kota perkotaan -kota sekota -kota sekotanya -kotak dikotak -kotak mengkotak -kotak mengotak -kotak mengotaki -kotak pengkotakan -kotak sekotak -kotak terkotak -koteng sekoteng -kotong sekotong -kotor dikotori -kotor kekotoran -kotor mengotori -kotor pengotor -kotor sekotor -kotor terkotor -kotor terkotori -kover dikover -kover mengkover -kover mengover -kover terkover -koyak dikoyak -koyak mengoyak -koyak terkoyak -koyak terkoyaknya -kram pekraman -kreasi berkreasi -kreasi dikreasi -kreasi dikreasikan -kreasi mengkreasi -kreasi mengkreasikan -kreasi mengkreasikannya -kreatif sekreatif -kreativitas berkreativitas -kredit dikredit -kredit dikreditkan -kredit mengkredit -kredit mengkreditkan -kredit pengkreditan -kredit perkreditan -kremasi dikremasi -kremasi dikremasikan -kremasi mengkremasi -krim mengrim -krim mengrimkan -kriminal dikriminalkan -kriminal mengkriminalkan -kriminalisasi dikriminalisasi -kriminalisasi dikriminalisasikan -kriminalisasi mengkriminalisasi -kriminalisasi mengkriminalisasikan -kriminalisasi mengkriminalisasinya -kring sekring -kristal mengkristal -kristal mengkristalkan -kristal pengkristalan -kristalisasi mengkristalisasi -kristalisasi terkristalisasi -kritik dikritik -kritik dikritiknya -kritik mengkritik -kritik mengkritiki -kritik mengkritiknya -kritik mengritik -kritik menkritik -kritik pengkritik -kritik pengkritiknya -kritik pengritik -kritik pengritiknya -kritis dikritisi -kritis kekritisan -kritis mengkritis -kritis mengkritisi -kritis mengritisi -kritisi dikritisi -kritisi mengkritisi -kritisi mengkritisinya -kritisi mengritisi -kromo dikromo -ksi beksi -ksi diksi -ksi meksi -ksi seksi -ksi seksinya -ku beku -ku bekuan -ku bekukan -ku bekunya -ku mengku -ku mengkui -ku pengkuan -ku perku -kuah berkuah -kuak berkuak -kuak dikuak -kuak menguak -kuak menguaknya -kuak penguak -kuak penguakan -kuak terkuak -kuak terkuaklah -kuak terkuaknya -kualifikasi berkualifikasi -kualifikasi dikualifikasi -kualifikasi dikualifikasikan -kualifikasi mengkualifikasi -kualifikasi mengkualifikasikan -kualifikasi terkualifikasi -kualitas berkualitas -kualitas berkualitasnya -kualitas sekualitas -kuang kekuangan -kuang mengkuang -kuang menguangkan -kuang penguangan -kuantifikasi dikuantifikasi -kuap menguap -kuap menguapi -kuap menguapkan -kuap menguapnya -kuap penguapan -kuar kekuaran -kuar menguar -kuar menguarkan -kuark menguarkan -kuartal dikuartal -kuartal perkuartal -kuarter dikuarter -kuas dikuasi -kuas kekuasan -kuas menguasi -kuas penguasan -kuasa bekuasa -kuasa berkuasa -kuasa berkuasanya -kuasa dikuasai -kuasa dikuasakan -kuasa kekuasaan -kuasa menguasa -kuasa menguasai -kuasa menguasakan -kuasa penguasa -kuasa penguasaan -kuasa penguasai -kuasa penguasanya -kuasa terkuasai -kuasi dikuasi -kuasi menguasi -kuat berkuatan -kuat dikuatkan -kuat kekuatan -kuat menguat -kuat menguatan -kuat menguatkan -kuat menguatkannya -kuat menguatnya -kuat penguat -kuat penguatan -kuat penguatnya -kuat perkuat -kuat perkuatan -kuat perkuatlah -kuat sekuat -kuat sekuatnya -kuat terkuat -kuat terkuatnya -kubah berkubah -kubah mengubah -kubah mengubahnya -kubah pengubah -kubah pengubahan -kubang berkubang -kubu berkubu -kubu dikubu -kubu pekubuan -kubu pengkubuan -kubung mengubungi -kubung mengubungkan -kubung pengubung -kubur dikubur -kubur dikuburkan -kubur dikuburnya -kubur mengubur -kubur menguburkan -kubur menguburkannya -kubur menguburnya -kubur pekuburan -kubur pengubur -kubur penguburan -kubur perkuburan -kubur terkubur -kubur terkuburnya -kucek dikucek -kucek mengucek -kucur dikucuri -kucur dikucurkan -kucur dikucurkannya -kucur mengucur -kucur mengucuri -kucur mengucurkan -kucur mengucurnya -kucur pengucuran -kuda berkuda -kudang mengudang -kudap dikudap -kudap mengudap -kudeta dikudeta -kudeta mengkudeta -kudeta mengkudetanya -kudeta mengudeta -kudeta pengkudeta -kudeta terkudeta -kudu mengkudu -kufur kekufuran -kui mengkui -kuin penguin -kujung berkujung -kujung mengujungi -kujung pengujung -kujur sekujur -kuk bekuk -kuk bekukan -kuku berkuku -kukuh berkukuh -kukuh dikukuhkan -kukuh dikukuhkannya -kukuh kekukuhan -kukuh mengkukuhkan -kukuh mengukuhkan -kukuh mengukuhkannya -kukuh pengukuh -kukuh pengukuhan -kukur mengukur -kukur mengukurnya -kukur pengukur -kukur pengukuran -kukus dikukus -kukus mengukus -kukus pengukus -kukus pengukusan -kulai terkulai -kulak perkulakan -kuliah berkuliah -kuliah dikuliahi -kuliah dikuliahkan -kuliah menguliahi -kuliah menguliahkan -kuliah perkuliahan -kulir mengulirkan -kulit berkulit -kulit dikulit -kulit dikuliti -kulit menguliti -kultur berkultur -kultus dikultuskan -kultus mengkultuskan -kultus pengkultusan -kulum mengulum -kulur mengulur -kulur mengulurkan -kulur penguluran -kuman berkuman -kuman penguman -kumandang berkumandang -kumandang berkumandangnya -kumandang dikumandangan -kumandang dikumandangkan -kumandang dikumandangkannya -kumandang mengumandang -kumandang mengumandangkan -kumandang pengumandangan -kumbar mengumbar -kumbar mengumbarnya -kumis berkumis -kumpul bekumpul -kumpul berkumpul -kumpul berkumpulnya -kumpul dikumpul -kumpul dikumpulkan -kumpul dikumpulkannya -kumpul kekumpul -kumpul mengumpul -kumpul mengumpulan -kumpul mengumpulkan -kumpul mengumpulkannya -kumpul pengumpul -kumpul pengumpulan -kumpul pengumpulkan -kumpul perkumpulan -kumpul sekumpul -kumpul sekumpulan -kumpul terkumpul -kumpul terkumpulkan -kumpul terkumpullah -kumpul terkumpulnya -kumuh kekumuhan -kumur berkumur -kumur berkumurlah -kunang-kunang berkunang-kunang -kuncen pekuncen -kunci dikunci -kunci mengunci -kunci menguncinya -kunci pengunci -kunci penguncian -kunci terkunci -kunci terkuncinya -kundang mengundang -kundang mengundangkan -kundang mengundangnya -kundang pengundang -kundang pengundangan -kundang pengundangnya -kundi mengundi -kundi pengundian -kundur mengundur -kundur mengunduran -kundur mengundurkan -kundur mengundurnya -kundur pengunduran -kundur pengundurkan -kunduran mengunduran -kunduran pengunduran -kunduran pengundurannya -kung dikungan -kung mengungkan -kung pengungi -kungkung dikungkung -kungkung mengungkung -kungkung mengungkungnya -kungkung terkungkung -kuning kekuningan -kuning menguning -kuning menguningkan -kuning menguningnya -kuning sekuning -kunjung bekunjung -kunjung berkunjung -kunjung berkunjungan -kunjung berkunjunglah -kunjung berkunjungnya -kunjung dikunjung -kunjung dikunjungi -kunjung mengunjung -kunjung mengunjungi -kunjung pengunjung -kunjung pengunjungnya -kuntit dikuntit -kuntit menguntit -kuntit menguntitnya -kuntit penguntit -kuntit penguntitan -kuntit penguntitnya -kuntum sekuntum -kuntung menguntung -kuntung menguntungan -kuntung menguntungkan -kuntung menguntungkannya -kunyah dikunyah -kunyah dikunyahnya -kunyah mengunyah -kunyah mengunyahnya -kunyah pengunyah -kunyah pengunyahan -kuota berkuota -kup bekup -kupahan pengupahan -kupang sekupang -kupas dikupas -kupas mengupas -kupas mengupasnya -kupas pengupas -kupas pengupasan -kupas terkupas -kupil mengupil -kuping berkuping -kuping menguping -kupon berkupon -kur berkuran -kur mengkur -kura mengurai -kura pengurai -kura sekura -kurai mengurai -kurai menguraikan -kurai menguraikannya -kurai mengurainya -kurai pengurai -kurai penguraian -kurang bekurang -kurang berkurang -kurang berkuranglah -kurang berkurangnya -kurang dikurang -kurang dikurangi -kurang dikurangkan -kurang kekurang -kurang kekurangan -kurang mengurang -kurang mengurangi -kurang mengurangkan -kurang pengurang -kurang pengurangan -kurang pengurangi -kurang sekurang -kurang sekurangnya -kurang terkurangi -kuras dikuras -kuras dikurasi -kuras mengkurasi -kuras menguras -kuras mengurasi -kuras mengurasnya -kuras penguras -kuras pengurasan -kuras terkuras -kuras terkurasi -kuras terkurasnya -kurator dikuratori -kurban berkurban -kurban dikurbankan -kurban mengurbankan -kurban pekurban -kuret dikuret -kurs berkursi -kurs dikurs -kurs dikursi -kurs dikurskan -kurs pengurs -kursi berkursi -kursi dikursi -kurun mengurunkan -kurung dikurung -kurung mengurung -kurung mengurungi -kurung mengurungkan -kurung mengurungkannya -kurung mengurungnya -kurung pengurungan -kurung terkurung -kurus mengurus -kurus mengurusi -kurus menguruskan -kurus mengurusnya -kurus pengurus -kurus pengurusan -kurus pengurusnya -kurus sekurus -kusa dikusai -kusa kekusaan -kusa mengusai -kusa pengusa -kusa pengusaan -kusam kekusaman -kusik mengusik -kusik mengusiknya -kusir mengusir -kusir mengusirnya -kusir pengusir -kusir pengusiran -kusut kekusutan -kusut mengusut -kusut mengusutnya -kusut pengusut -kusut pengusutan -kuta mengutakan -kutak mengutak -kutak mengutakan -kutang mengutang -kutang mengutangi -kutang pengutang -kutat berkutat -kutat pekutatan -kuti dikuti -kuti mengkuti -kuti menguti -kutik berkutik -kutil mengutil -kutil pengutil -kutil pengutilan -kutip dikutip -kutip dikutipnya -kutip mengutip -kutip mengutipkan -kutip mengutipnya -kutip pengutip -kutip pengutipan -kutu berkutu -kutu pengutukan -kutu sekutu -kutu sekutunya -kutuk dikutuk -kutuk mengutuk -kutuk mengutuknya -kutuk pengutukan -kutuk terkutuk -kutuk terkutuklah -kutung mengutungkan -kutut perkutut -la bela -la belai -la belakan -la belanya -la bella -la dila -la dilakan -la kela -la kelakan -la mela -la melakan -la menlai -la pela -la perla -la sela -la selai -la selanya -laba kelabakan -labak kelabakan -labang kelabang -label berlabel -label berlabelkan -label dilabel -label dilabeli -label dilabelkan -label melabel -label melabeli -label melabelkan -label pelabelan -labil kelabilan -labrak dilabrak -labrak melabrak -labu kelabu -labu kelabui -labu pelabuan -labuh berlabuh -labuh berlabuhnya -labuh dilabuh -labuh dilabuhi -labuh dilabuhkan -labuh melabuh -labuh melabuhkan -labuh melabuhkannya -labuh pelabuan -labuh pelabuhan -labuh perlabuhan -labun pelabunan -labur dilabur -labur melabur -lacak dilacak -lacak melacak -lacak melacaknya -lacak pelacak -lacak pelacakan -lacak terlacak -lacak terlacaknya -laci berlaci -lacur dilacurkan -lacur melacur -lacur melacurkan -lacur pelacur -lacur pelacuran -lada belada -lada kelada -lada selada -ladang berladang -ladang peladang -ladang perladangan -laden diladeni -laden meladeni -laden peladen -ladi keladi -ladi keladinya -ladi seladi -lafal berlafal -lafal dilafalkan -lafal melafalkan -lafal melafalkannya -lafal pelafalan -laga belaga -laga berlaga -laga berlaganya -laga dilaga -laga pelaga -lagak belagak -lagak berlagak -lagan selagan -lagi pelagian -lagi selagi -lago dilago -lagu belagu -lagu dilagukan -lagu melagukan -lah belah -lah belahan -lah belahnya -lah berlahan -lah dilah -lah dilahan -lah kelah -lah kelahan -lah kelahi -lah melah -lah menglahkan -lah pelahan -lah perlahan -lah selah -lah terlah -lahan belahan -lahan berlahan -lahan dilahan -lahan kelahan -lahan pelahan -lahan perlahan -lahap dilahap -lahap dilahapnya -lahap melahap -lahap melahapnya -lahap pelahap -lahir dilahirkan -lahir dilahirkannya -lahir kelahiran -lahir melahirkan -lahir melahirkannya -lahir terlahir -lahir terlahirnya -lai belai -lai belaian -lai belailah -lai kelaikan -lai kelaikannya -lai melaikan -lai menlai -lai selai -lai selaian -laik kelaikan -laik melaikan -laik selaiknya -lailah belailah -lain belain -lain berlainan -lain dilain -lain kelainan -lain melain -lain melainkan -lain selain -lain selaini -lain selainnya -laja belaja -lajang melajang -laju dilajukan -laju melaju -laju melajukan -laju melajunya -laju pelaju -laju penglaju -laju selaju -lajur terlajur -lak belak -lak belakan -lak dilakan -lak dilakkan -lak kelak -lak kelakan -lak melak -lak melakan -lak melakkan -lak pelak -lak pelaki -lak perlak -lak selak -lakar kelakar -lakar kelakarnya -laki dilakikan -laki melakikan -laki pelaki -laknat dilaknat -laknat melaknat -lakon berlakon -lakon dilakoni -lakon kelakon -lakon melakoni -lakon melakonkan -lakon pelakon -lakon pelakonnya -laksa dilaksakan -laksa melaksakan -laksa pelaksa -laksa pelaksaan -laksa selaksa -laksana dilaksana -laksana dilaksanaan -laksana dilaksanakan -laksana dilaksanakannya -laksana melaksana -laksana melaksanaan -laksana melaksanakan -laksana melaksanakannya -laksana pelaksana -laksana pelaksanaan -laksana pelaksanakan -laksana pelaksananya -laksana perlaksanaan -laksana terlaksana -laksana terlaksanakan -laksana terlaksananya -laku belaku -laku berlaku -laku berlakukan -laku berlakulah -laku berlakunya -laku dilakuan -laku dilakui -laku dilakukan -laku dilakukannya -laku kelakuan -laku kelakukan -laku kelakukannya -laku melaku -laku melakuan -laku melakui -laku melakukan -laku melakukannya -laku menlakukan -laku pelaku -laku pelakuan -laku pelakukan -laku pelakunya -laku perlaku -laku perlakuan -laku perlakukan -laku perlakukannya -laku selaku -laku terlaku -lala belalai -lalah kelalahan -lalai belalai -lalai belalainya -lalai dilalaikan -lalai kelalaian -lalai melalaikan -lalang belalang -lalang melalang -lalang selalang -lalap dilalap -lalap melalap -lalap terlalap -lalau melalaui -lalau selalau -lalau terlalau -lali kelalian -lali melali -lali selali -lalu berlalu -lalu berlalunya -lalu dilalui -lalu dilalukan -lalu melalu -lalu melalui -lalu melalukan -lalu melalukannya -lalu memlalui -lalu pelalu -lalu selalu -lalu selalui -lalu selalulah -lalu terlalu -lalu terlalui -lalu-lalang berlalu-lalang -lam dilam -lam dilaman -lam dilami -lam kelam -lam kelamnya -lam menglami -lam penglaman -lam selam -lam selaman -lam selami -lam selamnya -lama berlama -lama kelamaan -lama selama -lama selamanya -lama terlama -lama terlamanya -lamar dilamar -lamar dilamarnya -lamar melamar -lamar melamarnya -lamar pelamar -lamar pelamaran -lamar pelamarnya -lambai melambai -lambai melambaikan -lamban kelambanan -lamban melamban -lamban melambankan -lamban melambannya -lambang belambang -lambang belambangan -lambang berlambang -lambang berlambangkan -lambang dilambangkan -lambang melambangkan -lambang pelambang -lambang perlambang -lambat dilambatkan -lambat kelambatan -lambat melambat -lambat melambatkan -lambat melambatnya -lambat pelambatan -lambat perlambat -lambat perlambatan -lambat selambat -lambat selambatnya -lambat terlambat -lambat terlambatnya -lambu kelambu -lambung berlambung -lambung dilambungkan -lambung melambung -lambung melambungkan -lambung melambungnya -lambung pelambungan -lamin kelamin -lamin kelaminnya -lamin melamin -lamin pelaminan -laminasi dilaminasi -laminating dilaminating -lampai melampai -lampau dilampaui -lampau melampau -lampau melampaui -lampau pelampauan -lampau terlampau -lampau terlampaui -lampias dilampiaskan -lampias melampiaskan -lampias melampiaskannya -lampias pelampiasan -lampias terlampiaskan -lampir dilampiri -lampir dilampirkan -lampir melampirkan -lampir pelampiran -lampir terlampir -lampok kelampok -lampu berlampu -lampu melampui -lampu perlampuan -lampu terlampu -lampung pelampung -lampung pelampungnya -lamun melamun -lamun pelamun -lamun selamun -lana kelana -lana pelana -lancar dilancarkan -lancar dilancarkannya -lancar kelancaran -lancar melancar -lancar melancarkan -lancar melancarkannya -lancar pelancar -lancar pelancaran -lancar perlancar -lancar selancar -lancar selancarnya -lancong melancong -lancong pelancong -lancong pelancongan -landa belanda -landa belandanya -landa dilanda -landa melanda -landa melandai -landa melandanya -landa terlanda -landai melandai -landai melandainya -landas berlandas -landas berlandasan -landas berlandaskan -landas dilandasi -landas dilandaskan -landas melandasi -landas melandaskan -landuk pelanduk -lang belang -lang belangan -lang belangnya -lang kelang -lang kelangan -lang melangkan -lang pelang -lang pelangan -lang pelangi -lang selang -lang selangnya -langgam berlanggam -langgan berlanggan -langgan berlangganan -langgan melanggan -langgan pelanggan -langgan pelanggannya -langgar dilanggar -langgar dilanggarnya -langgar melanggar -langgar melanggaran -langgar melanggarnya -langgar pelanggar -langgar pelanggaran -langgar pelanggarnya -langgar perlanggaran -langgar terlanggar -langgar terlanggarnya -langgeng dilanggengkan -langgeng kelanggengan -langgeng melanggeng -langgeng melanggengkan -langgeng pelanggengan -langi pelangi -langir pelangiran -langit dilangit -langit melangit -langit selangit -langka kelangkaan -langka selangka -langka selangkanya -langka terlangka -langkah dilangkahi -langkah melangkah -langkah melangkahi -langkah melangkahkan -langkah melangkahlah -langkah selangkah -langkan melangkan -langkang selangkang -langkang selangkangan -langkap dilangkapi -langkap kelangkapan -langkap melangkapi -langkap pelangkap -langkap perlangkapan -langkap selangkapnya -langlang melanglang -langsi pelangsian -langsing kelangsingan -langsing melangsingkan -langsing pelangsing -langsing pelangsingan -langsir dilangsir -langsir melangsir -langsir pelangsir -langu terlangu -lanja belanja -lanja belanjaan -lanja belanjakan -lanja belanjalah -lanja belanjanya -lanjak belanjakan -lanjuk dilanjukan -lanjuk melanjukan -lanjur terlanjur -lanjut belanjut -lanjut berlanjut -lanjut berlanjutan -lanjut berlanjutnya -lanjut dilanjut -lanjut dilanjutan -lanjut dilanjuti -lanjut dilanjutkan -lanjut dilanjutkannya -lanjut dilanjutnya -lanjut kelanjutan -lanjut kelanjutkan -lanjut melanjut -lanjut melanjutan -lanjut melanjuti -lanjut melanjutkan -lanjut melanjutkannya -lanjut melanjutnya -lanjut menlanjutkan -lanjut pelanjut -lanjut pelanjutan -lanjut selanjut -lanjut selanjutkan -lanjut selanjutnya -lanjut terlanjut -lansir dilansir -lansir dilansirnya -lansir melansir -lansir pelansir -lansir terlansir -lantai berlantai -lantai berlantaikan -lantai dilantai -lantai melantai -lantan kelantan -lantang dilantangkan -lantang melantangkan -lantang pelantang -lantar pelantar -lantar pelantaran -lantar terlantar -lantar terlantarkan -lantar terlantarnya -lantik dilantik -lantik dilantiknya -lantik melantik -lantik melantiknya -lantik pelantikan -lantik pelantikkan -lantik terlantik -lanting belanting -lantun dilantunkan -lantun dilantunkannya -lantun melantun -lantun melantunkan -lantun pelantun -lantun terlantun -lantur melantur -lap belapan -lap dilap -lap kelap -lap melap -lap selap -lap selapan -lapak pelapak -lapang berlapang -lapang dilapangan -lapang dilapangkan -lapang kelapangan -lapang melapangkan -lapar kelaparan -lapar melaparkan -lapar selaparan -lapis berlapis -lapis berlapiskan -lapis dilapis -lapis dilapisi -lapis melapis -lapis melapisi -lapis pelapis -lapis pelapisan -lapis pelapisnya -lapis selapis -lapis terlapisi -lapor dilapor -lapor dilaporan -lapor dilapori -lapor dilaporkan -lapor dilaporkannya -lapor melapor -lapor melaporan -lapor melaporkan -lapor melaporkannya -lapor melapornya -lapor pelapor -lapor pelaporan -lapor pelapornya -lapor terlapor -lapor terlaporkan -lapor terlapornya -lapuk melapuk -lapuk pelapukan -lara kelara -lara melara -larang dilarang -larang dilarangan -larang dilarangnya -larang melarang -larang melarangan -larang melarangnya -larang pelarang -larang pelarangan -larang selarang -larang terlarang -larang terlarangnya -laras berlaras -laras selaras -laras selaraskan -larat melarat -lari belari -lari berlari -lari berlarian -lari berlarilah -lari berlarinya -lari dilarikan -lari dilarikannya -lari melarikan -lari melarikannya -lari pelari -lari pelarian -larik dilarikan -larik melarikan -laris pelaris -laris penglaris -laris selaris -laris terlaris -laris terlarisnya -laron selaron -laru selaru -larung dilarung -larung melarung -larung pelarungan -larut berlarut -larut berlarutnya -larut dilarutkan -larut kelarutan -larut melarutkan -larut melarutkannya -larut pelarut -larut pelarutan -larut terlarut -las belas -las belasan -las berlasan -las dilas -las dilasi -las kelas -las kelasi -las kelasnya -las melas -las pelasan -las selas -las selasan -las selasi -lasa belasa -lasa selasa -lasa selasai -lasa selasanya -lasana melasanakan -lasana pelasana -lasana pelasanaan -laser dilaser -lasi dilasi -lasi kelasi -lasi selasi -laskar kelaskaran -lat belat -lat belati -lat melati -lat pelat -lat pelati -lat pelatnya -lat perlatan -lat selat -lat selatan -lata melata -lata selata -latah selatah -latam selatam -latar berlatar -latar berlatarkan -latar dilatar -latar dilatari -latar melatar -latar melatari -latar pelataran -latas dilatasi -latif pelatif -latih belatih -latih berlatih -latih berlatihlah -latih berlatihnya -latih dilatih -latih dilatihkan -latih dilatihnya -latih melatih -latih melatihnya -latih pelatih -latih pelatihan -latih pelatihlah -latih pelatihnya -latih terlatih -latih terlatihnya -latuh pelatuh -latuk pelatuk -latuk pelatuknya -latung belatung -latung belatungnya -lauk berlauk -lauk dilaukan -lauk melaukan -lauk pelaukan -laung pelaung -laur kelaur -laut dilaut -laut dilautan -laut kelaut -laut kelautan -laut melaut -laut melautnya -laut pelaut -laut pelautnya -lava kelava -lawa belawa -lawa melawa -lawa melawaan -lawa melawai -lawa pelawa -lawai melawai -lawak melawak -lawak pelawak -lawan belawan -lawan berlawan -lawan berlawanan -lawan dilawan -lawan dilawannya -lawan melawan -lawan melawannya -lawan pelawan -lawan pelawanan -lawan perlawan -lawan perlawanan -lawan terlawan -lawang melawang -lawang pelawangan -lawar dilawar -lawat belawati -lawat melawat -lawat melawati -lawat pelawat -lawat selawat -lawi melawi -lawi pelawi -layak kelayakan -layak selayak -layak selayaknya -layak selayaknyalah -layan belayan -layan dilayanan -layan dilayani -layan kelayan -layan kelayanan -layan melayan -layan melayanan -layan melayani -layan pelayan -layan pelayanan -layan pelayannya -layan selayan -layan terlayani -layang dilayang -layang dilayangkan -layang dilayangkannya -layang kelayang -layang melayang -layang melayangkan -layang melayangnya -layang pelayang -layang pelayangan -layang selayang -layap kelayapan -layar belayar -layar berlayar -layar berlayarnya -layar dilayar -layar dilayari -layar dilayarkan -layar melayari -layar melayarkan -layar pelayar -layar pelayaran -layar perlayaran -layar selayar -layat melayat -layat pelayat -layu melayu -layu melayunya -lazim kelaziman -lazim selazimnya -lebah perlebahan -lebah selebah -lebat kelebatan -lebat selebat -lebat terlebat -lebih belebihan -lebih berlebih -lebih berlebihan -lebih berlebihnya -lebih dilebih -lebih dilebihi -lebih dilebihkan -lebih kelebihan -lebih melebih -lebih melebihi -lebih melebihkan -lebih selebihnya -lebih terlebih -lebuh terlebuh -lebur dilebur -lebur dileburkan -lebur dileburnya -lebur melebur -lebur meleburkan -lebur meleburnya -lebur pelebur -lebur peleburan -lecah melecahkan -lecah pelecahan -leceh dilecehkan -leceh melecehkan -leceh melecehkannya -leceh peleceh -leceh pelecehan -leceh terlecehkan -lecut dilecut -lecut melecut -lecut melecutkan -lecut pelecut -lecut terlecut -ledak diledakan -ledak diledakkan -ledak diledakkannya -ledak meledak -ledak meledakan -ledak meledakkan -ledak meledakkannya -ledak meledaklah -ledak meledaknya -ledak peledak -ledak peledakan -ledak peledakkan -ledak peledaknya -ledek diledek -ledek meledek -ledek meledeknya -leduk meleduk -lega berlega -lega kelegaan -lega melegakan -lega pelega -legal dilegalkan -legal dilegalkannya -legal kelegalan -legal melegalkan -legal melegalkannya -legal pelegalan -legalisasi dilegalisasi -legalisasi melegalisasi -legalisasi melegalisasikan -legenda melegenda -legitimas berlegitimasi -legitimas dilegitimasi -legitimas melegitimasi -legitimas terlegitimasi -legitimasi berlegitimasi -legitimasi dilegitimasi -legitimasi melegitimasi -legitimasi terlegitimasi -lego dilego -lego dilegonya -lego melego -lego melegonya -leha-leha berleha-leha -leher berleher -leher dileher -leher dilehernya -leher seleher -lejit melejit -lejit melejitkan -lejit melejitnya -leka seleka -lekang belekang -lekar kelekar -lekas selekas -lekas selekasnya -lekat dilekati -lekat dilekatkan -lekat kelekatan -lekat melekat -lekat melekatkan -lekat melekatnya -lekat pelekat -lekat pelekatan -lekat perlekatan -lekat terlekat -leku melekukan -lekuk berlekuk -lekuk melekuk -lekuk melekukan -lelah kelelahan -lelah melelahkan -lelah selelah -lelaki kelelakian -lelang dilelang -lelang dilelangkan -lelang dilelangnya -lelang melelang -lelang melelangnya -lelang pelelang -lelang pelelangan -lelang terlelang -lelap melelapkan -lelap terlelap -leleh dilelehkan -leleh meleleh -leleh melelehkan -leleh melelehnya -leleh pelelehan -lelep kelelep -leler keleler -leler keleleran -leluasa keleluasaan -leluasa seleluasa -lem belem -lem dilem -lem pelem -lem seleman -lema dilema -lema dilemanya -lema perlemakan -lema selema -lemah dilemahkan -lemah kelemahan -lemah melemah -lemah melemahkan -lemah melemahkannya -lemah melemahnya -lemah pelemah -lemah pelemahan -lemah perlemah -lemah perlemahan -lemah selemah -lemah terlemah -lemah terlemahnya -lemak berlemak -lemak perlemakan -lemas melemas -lemas melemaskan -lemas pelemasan -lembaga dilembaga -lembaga dilembagakan -lembaga kelembagaan -lembaga melembaga -lembaga melembagakan -lembaga pelembagaan -lembaga perlembagaan -lembaga terlembaga -lembaga terlembagakan -lembam kelembaman -lembang pelembang -lembap kelembapan -lembap melembapkan -lembap pelembap -lembar perlembar -lembar selembar -lembar selembaran -lembek melembek -lembung melembung -lembut dilembutkan -lembut kelembutan -lembut melembut -lembut melembutkan -lembut pelembut -lembut selembut -lempang melempangkan -lempang selempang -lempar dilempar -lempar dilempari -lempar dilemparkan -lempar dilemparkannya -lempar dilemparnya -lempar melempar -lempar melempari -lempar melemparkan -lempar melemparkannya -lempar melemparnya -lempar pelempar -lempar pelemparan -lempar selemparan -lempar terlempar -lempar terlemparnya -lempari dilempari -lempari melempari -lempari melemparinya -lempem melempem -lempem melempemnya -lena melena -lena melenakan -lena selena -lena terlena -lendir berlendir -lendir perlendiran -lendung belendung -leng berlengan -leng meleng -lengan berlengan -lengang kelengangan -lengang melengang -lenggak berlenggak -lenggang berlenggang -lenggang melenggang -lenggang melenggangkan -lenggok berlenggok -lengkap dilengkap -lengkap dilengkapi -lengkap dilengkapkan -lengkap kelengkapan -lengkap melengkap -lengkap melengkapi -lengkap melengkapkan -lengkap pelengkap -lengkap pelengkapan -lengkap pelengkapnya -lengkap perlengkapan -lengkap selengkap -lengkap selengkapnya -lengkap terlengkap -lengkap terlengkapi -lengkeng kelengkeng -lengket perlengketan -lengking melengking -lengkung dilengkungkan -lengkung kelengkungan -lengkung melengkung -lengkung melengkungkan -lengkung melengkungnya -lengos melengos -lengseng pelengsengan -lengser dilengserkan -lengser dilengserkannya -lengser melengserkan -lengser melengserkannya -lengser pelengseran -lenguh melenguh -lensa berlensa -lentang terlentang -lenteng kelenteng -lentik melentikkan -lentik pelentik -lenting melenting -lenting selentingan -lentur kelenturan -lentur melentur -lentur melenturkan -lenyap dilenyapkan -lenyap melenyapkan -lenyap melenyapkannya -lenyap pelenyapan -lepa melepakan -lepak melepakan -lepas berlepas -lepas dilepas -lepas dilepaskan -lepas dilepaskannya -lepas dilepasnya -lepas kelepasan -lepas melepas -lepas melepasan -lepas melepaskan -lepas melepaskannya -lepas melepasnya -lepas pelepas -lepas pelepasan -lepas selepas -lepas selepasnya -lepas terlepas -lepas terlepaskan -lepas terlepasnya -lepat pelepat -lepot belepotan -lepot berlepotan -lepuh melepuh -lerai dilerai -lerai melerai -lerai meleraikan -lerai melerainya -lerang belerang -lerang belerangnya -lereng berlereng -lereng kelereng -lereng kelerengan -leri belleri -les belles -les keles -les meles -les seles -les selesi -lesa dilesakan -lesa dilesakannya -lesa melesakan -lesa selesa -lesa selesai -lesak dilesakan -lesak dilesakkan -lesak dilesakkannya -lesak melesak -lesak melesakan -lesak melesakkan -lesak melesakkannya -lesi selesi -lesir pelesir -lesir pelesiran -lestari dilestarikan -lestari kelestarian -lestari melestarikan -lestari melestarikannya -lestari pelestari -lestari pelestarian -lestari terlestarikan -lesu kelesuan -lesu melesu -lesu melesunya -lesung berlesung -leta diletakan -leta diletakannya -leta meletakan -leta meletakannya -leta peletakan -leta peletakannya -letak berletak -letak diletakan -letak diletakkan -letak diletakkannya -letak meletakan -letak meletakkan -letak meletakkannya -letak peletak -letak peletakan -letak peletakkan -letak terletak -letih keletihan -letih meletihkan -letup diletupkan -letup meletup -letup meletupkan -letup meletupnya -letus diletuskan -letus meletus -letus meletuskan -letus meletusnya -level berlevel -level dilevel -level kelevel -level selevel -lewa melewai -lezat kelezatan -lezat melezatkan -lezat selezat -lezat terlezat -lian belian -lian berlian -lian berliannya -lian kelian -lian meliani -lian selian -liana berliana -liana diliana -liana meliana -liar diliarkan -liar keliaran -liar meliarkan -liar seliar -liar terliar -liat diliat -liat keliat -liat keliatan -liat meliat -liat terliat -liau beliau -liau beliaulah -liau beliaunya -liau meliau -libas dilibas -libas melibas -libas terlibas -libat dilibatkan -libat dilibatkannya -libat melibat -libat melibatan -libat melibatkan -libat melibatkannya -libat pelibatan -libat perlibatan -libat selibat -libat terlibat -libat terlibatlah -libat terlibatnya -liberal meliberalkan -liberalisasi diliberalisasi -liberalisasi meliberalisasi -libur belibur -libur berlibur -libur berliburan -libur berliburlah -libur berliburnya -libur diliburkan -libur diliburkannya -libur melibur -libur meliburkan -libur peliburan -lici kelicikan -licik kelicikan -licin melicinkan -licin pelicin -licin selicin -lidah berlidah -liga diliga -lihai kelihaian -lihai selihai -lihat dilihat -lihat dilihatkan -lihat dilihatlah -lihat dilihatnya -lihat kelihatan -lihat melihat -lihat melihatkan -lihat melihatnya -lihat penglihatan -lihat perlihatkan -lihat terlihat -lihat terlihatlah -lihat terlihatnya -lik belik -lik belikan -lik kelik -lik melik -lik meliki -lik memliki -lik pelik -lik pelikan -lik peliknya -lik pemlik -likat belikat -liku berliku -likuidasi dilikuidasi -likuidasi melikuidasi -lilah belilah -lilit dililit -lilit dililitkan -lilit melilit -lilit melilitkan -lilit melilitkannya -lilit melilitnya -lilit terlilit -lima berlima -lima kelima -lima kelimanya -lima penglima -lima perlima -limbah pelimbahan -limbing belimbing -limpah berlimpah -limpah berlimpahnya -limpah dilimpah -limpah dilimpahi -limpah dilimpahkan -limpah dilimpahkannya -limpah kelimpahan -limpah melimpah -limpah melimpahi -limpah melimpahkan -limpah melimpahkannya -limpah melimpahnya -limpah pelimpah -limpah pelimpahan -limpas melimpas -limpas pelimpas -limpas pelimpasan -limpung kelimpungan -limut selimut -limut selimuti -limut selimutnya -lin belin -lin bellin -lin bellini -lin berlin -lin dilini -lin kelin -lin melin -lin perlini -lin selin -linang berlinang -linang berlinangan -lincah kelincahan -lincah selincah -lindang kelindang -lindang perlindangan -lindas dilindas -lindas melindas -lindas melindasnya -lindas terlindas -lindung berlindung -lindung dilindung -lindung dilindungi -lindung melindung -lindung melindungan -lindung melindungi -lindung pelindung -lindung pelindungan -lindung pelindungnya -lindung perlindung -lindung perlindungan -lindung terlindung -lindung terlindungi -ling beling -ling keling -ling kelingi -ling peling -ling seling -ling selingan -ling selingi -lingkar dilingkaran -lingkar dilingkari -lingkar dilingkarkan -lingkar melingkar -lingkar melingkari -lingkar melingkarkan -lingkung dilingkungan -lingkup dilingkup -lingkup dilingkupi -lingkup melingkupi -lingsir penglingsir -lini bellini -lini dilini -lini perlini -lintang melintang -lintang melintangi -lintang melintangkan -lintas dilintas -lintas dilintasan -lintas dilintasi -lintas melintas -lintas melintasi -lintas melintaslah -lintas melintasnya -lintas pelintas -lintas pelintasan -lintas perlintas -lintas perlintasan -lintas selintas -lintas terlintas -lintas terlintasi -linting dilinting -linting melinting -linting selinting -linting selintingan -lintir melintir -lintir pelintir -lintir pelintiran -lipan selipan -lipat berlipat -lipat dilipat -lipat dilipatkan -lipat kelipatan -lipat melipat -lipat melipatkan -lipat melipatnya -lipat pelipat -lipat pelipatan -lipat terlipat -lipur pelipur -lipur penglipuran -liput diliput -liput diliputi -liput meliput -liput meliputi -liput meliputnya -liput peliput -liput peliputan -lir kelir -lir keliran -lir pelir -lir selir -lir selirnya -lirih selirih -lirik berlirik -lirik dilirik -lirik diliriknya -lirik melirik -lirik meliriknya -liris diliris -liris meliris -lis belis -lis bellis -lis melis -lis perlis -lis selis -lis selisi -lisensi berlisensi -lisensi dilisensi -lisensi dilisensikan -lisensi melisensi -lisensi melisensikan -lisensi terlisensi -listrik berlistrik -listrik dilistriki -listrik kelistrikan -listrik kelistrikkan -listrik melistriki -listrik pelistrikan -listrik terlistriki -liter meliter -liter perliter -liter perliternya -liter seliter -liuk meliuk -liuk meliukkan -liuk-liuk meliuk-liuk -liuk-liuk meliuk-liukkan -lob dilobi -lob melobi -lob pelobi -lobi dilobi -lobi melobi -lobi melobinya -lobi pelobi -lobi-lobi melobi-lobi -log belog -log selogan -logat berlogat -logika berlogika -logo berlogo -logo berlogokan -lok belok -lok belokan -lok belokkan -lok beloknya -lok kelok -lok kelokan -lok penlok -lok selok -lok selokan -lokalisasi dilokalisasi -lokalisasi dilokalisasikan -lokalisasi melokalisasi -lokalisasi terlokalisasi -lokan belokan -lokan kelokan -lokan selokan -lokan selokannya -lokasi belokasi -lokasi berlokasi -lokasi dilokasi -lokasi dilokasikan -lokasi kelokasi -loket diloket -lolong melolong -lolos diloloskan -lolos diloloskannya -lolos kelolosan -lolos meloloskan -lolos meloloskannya -lolos pelolosan -lomba berlomba -lomba dilombakan -lomba melombakan -lomba perlombaan -lompat berlompatan -lompat dilompati -lompat melompat -lompat melompati -lompat melompatnya -lompat pelompat -lompok kelompok -lompok kelompokan -lompok kelompokkan -lompok kelompoknya -lompong melompong -loncat berloncatan -loncat meloncat -loncat meloncati -loncat peloncat -lonco pelonco -long belong -long kelong -long melong -long selong -longgar dilonggarkan -longgar kelonggaran -longgar melonggar -longgar melonggarkan -longgar melonggarnya -longgar pelonggaran -longgar perlonggar -longo melongo -longok melongok -longsor kelongsoran -longsor melongsorkan -lonjak kelonjakan -lonjak melonjak -lonjak melonjakkan -lonjak melonjaknya -lonjak pelonjakan -lonjor selonjor -lonjor selonjoran -lonsong selonsong -lontar dilontarkan -lontar dilontarkannya -lontar melontar -lontar melontarkan -lontar melontarkannya -lontar pelontar -lontar pelontaran -lontar pelontarnya -lontar terlontar -lontar terlontarkan -lontar terlontarlah -lontar terlontarnya -lontong kelontong -lontong kelontongan -lontong kelontongnya -lop selop -lopak kelopak -lopak kelopaknya -lopor pelopor -lopor pelopori -lopor pelopornya -lor kelor -lor melor -lor pelor -lor selor -lorong berlorong -lorot melorot -lorot melorotkan -lorot melorotnya -los pelosi -lot belloti -lot selot -lota pelota -loyang seloyang -lu belu -lu kelu -lu melu -lu melui -lu melukan -lu menlu -lu menlunya -lu pellu -lu pelu -lu peluan -lu pelukan -lu pelukannya -lu perlu -lu perlukan -lu perlulah -lu perlunya -lu terlukan -luah keluahan -luang diluangkan -luang keluang -luang meluangkan -luang peluang -luang peluangan -luang peluangnya -luang perluang -luang seluang -luang terluang -luap diluapkan -luap meluap -luap meluapkan -luap meluapkannya -luap meluapnya -luap terluapkan -luar diluar -luar keluar -luar keluaran -luar keluarkan -luar keluarlah -luar keluarnya -luar mengluarkan -luar seluar -luar terluar -luar terluarnya -luas berluas -luas diluaskan -luas keluasan -luas meluas -luas meluaskan -luas meluasnya -luas peluasan -luas perluas -luas perluasan -luas perluaslah -luas seluas -luas seluasnya -luas terluas -luat keluat -luat keluatan -lubang berlubang -lubang dilubangi -lubang melubangi -lubang pelubang -lubang pelubangan -luber meluber -luber melubernya -lucu kelucuan -lucu melucu -lucu selucu -lucu terlucu -lucut dilucuti -lucut melucuti -lucut pelucutan -lucut perlucutan -ludah diludahi -ludah meludah -ludah meludahi -ludah meludahkan -ludah meludahkannya -ludah peludahan -ludes meludeskan -lugas kelugasan -lugu keluguan -luhur keluhuran -luk beluk -luk beluknya -luk meluk -luk melukan -luk peluk -luk pelukan -luk peluklah -luk perlukan -luk seluk -luk terlukan -luka dilukai -luka melukai -luka perlukaan -luka terluka -luka terlukai -luka terlukanya -lukah perlukah -lukat melukat -lukis berlukiskan -lukis dilukis -lukis dilukiskan -lukis melukis -lukis melukiskan -lukis melukiskannya -lukis melukisnya -lukis pelukis -lukis pelukisan -lukis pelukisnya -lukis terlukis -lukis terlukiskan -luluh meluluh -luluh meluluhkan -lulus diluluskan -lulus diluluskannya -lulus kelulusan -lulus meluluskan -lulus meluluskannya -lumai belumai -lumas dilumasi -lumas melumasi -lumas pelumas -lumas pelumasan -lumas pelumasnya -lumas terlumasi -lumat dilumat -lumat dilumatkan -lumat melumat -lumat melumatkan -lumer melumerkan -lumpang kelumpang -lumpang pelumpang -lumpuh dilumpuhkan -lumpuh dilumpuhkannya -lumpuh kelumpuhan -lumpuh melumpuhkan -lumpuh melumpuhkannya -lumpuh pelumpuh -lumpuh pelumpuhan -lumpuk melumpukan -lumpur berlumpur -lumpur pelumpuran -lumur berlumur -lumur berlumuran -lumur dilumuri -lumur melumuri -lumut berlumut -lunak dilunakkan -lunak melunak -lunak melunakan -lunak melunakkan -lunak melunaknya -lunak pelunak -lunak pelunakan -lunas dilunasi -lunas dilunaskan -lunas melunasi -lunas melunaskan -lunas pelunasan -lunas terlunasi -luncur diluncuran -luncur diluncurkan -luncur diluncurkannya -luncur meluncur -luncur meluncuran -luncur meluncurkan -luncur meluncurkannya -luncur meluncurlah -luncur meluncurnya -luncur menluncurkan -luncur peluncur -luncur peluncuran -luncur peluncurkan -luncur peluncurnya -luncur seluncur -luncur seluncuran -luncur seluncurnya -lung melung -lung pelung -lunta terlunta -luntas beluntas -luntur meluntur -luntur melunturkan -luntur melunturnya -lupa dilupakan -lupa dilupakannya -lupa kelupaan -lupa melupakan -lupa melupakannya -lupa pelupa -lupa terlupa -lupa terlupakan -lupuk pelupuk -luput meluputkan -luput terluput -lurah kelurahan -luru peluru -luru pelurunya -luru perluru -luru seluru -luru selurunya -luruh keluruhan -luruh meluruh -luruh meluruhkan -luruh peluruh -luruh peluruhan -luruh seluruh -luruh seluruhan -luruh seluruhnya -lurus diluruskan -lurus kelurusan -lurus meluruskan -lurus meluruskannya -lurus pelurus -lurus pelurusan -lurus selurus -lus dilusi -lus pelus -lusa pelusa -lusin selusin -lusuh kelusuhan -lut belut -lut berluti -lut kelutan -luti berluti -lutu belutu -lutut berlutut -lutut berlututlah -lutut selutut -luwes keluwesan -maaf bermaafan -maaf dimaafkan -maaf memaafkan -maaf memaafkannya -maaf pemaaf -maaf pemaafan -maaf permaafan -maaf termaafkan -mabrur kemabruran -mabuk dimabuk -mabuk memabukan -mabuk memabukkan -mabuk pemabuk -macam bermacam -macam semacam -macam semacamnya -macan semacan -macet bermacet -macet kemacetan -macet memacetkan -macet semacet -macet termacet -mad belmadi -mad pemadan -mad permadi -mad semadi -madah memadahi -madam memadam -madam memadamkan -madam memadamkannya -madam pemadam -madam pemadaman -madam pemadamnya -madam semadam -madang kemadang -madang memadang -madang pemadangan -madani permadani -madat memadat -madat memadati -madat memadatkan -madat memadatkannya -madat pemadat -madat pemadatan -madi belmadi -madi permadi -madi semadi -madu dimadu -madu memadu -madu memadukan -madu memadukannya -madu pemadu -mag memag -magang dimagangkan -magang memagang -magang pemagang -magang pemagangan -magnet bermagnet -magnitudo bermagnitudo -mah dimah -mah kemah -mah pemahan -mah permah -mah permahi -mah semah -mahal dimahalkan -mahal kemahalan -mahal pemahalan -mahal semahal -mahal termahal -mahal termahalnya -mahasiswa kemahasiswaan -mahir kemahiran -mahir pemahiran -mahkota bermahkota -mahkota dimahkotai -mahkota memahkotai -main bemain -main bermain -main bermainan -main bermainlah -main bermainnya -main dimainkan -main dimainkannya -main kemain -main memain -main memainkan -main memainkannya -main pemain -main pemainan -main pemainlah -main pemainnya -main permain -main permainan -main permainkan -main permainnya -main semain -maja kemaja -maja pemajakan -majemuk kemajemukan -maju dimajukan -maju dimajukannya -maju kemajuan -maju kemajukan -maju memajukan -maju memajukannya -maju pemajuan -maju semaju -maju termaju -mak dimakan -mak dimaki -mak kemakan -mak memakan -mak memaki -mak pemakan -mak permak -mak semak -mak semaki -mak termakan -maka memakai -maka pemakai -maka pemakalah -maka semaka -makalah pemakalah -makam dimakam -makam dimakaman -makam dimakamkan -makam dimakamkannya -makam memakamkan -makam memakamkannya -makam pemakaman -makam permakaman -makan dimakan -makan dimakankan -makan dimakannya -makan kemakan -makan memakan -makan memakannya -makan pemakan -makan pemakanan -makan pemakannya -makan permakanan -makan termakan -maket memaketkan -maket pemaketan -maki dimaki -maki memaki -maki memakinya -maki pemakian -maki semaki -maki semakian -makin semakin -maklum dimaklumi -maklum dimaklumkan -maklum memaklumi -maklum memaklumkan -maklum pemakluman -maklum permakluman -maklumat memaklumatkan -makmur dimakmurkan -makmur kemakmuran -makmur memakmurkan -makmur semakmur -makmur termakmur -makna bermakna -makna dimaknai -makna dimaknakan -makna memaknai -makna pemaknaan -maksiat kemaksiatan -maksimal dimaksimalkan -maksimal dimaksimalkannya -maksimal memaksimal -maksimal memaksimalkan -maksimal memaksimalkannya -maksimal pemaksimalan -maksimal semaksimal -maksimal semaksimalkan -maksimal semaksimalnya -maksimal termaksimalkan -maksimum memaksimumkan -maksimum semaksimum -maksud bermaksud -maksud dimaksud -maksud dimaksudkan -maksud dimaksudkannya -maksud dimaksudnya -maksud memaksudkan -maksud termaksud -maktub termaktub -makzul dimakzulkan -makzul memakzulkan -makzul memakzulkannya -makzul pemakzulan -mal kemal -mal kemali -mal pemali -mal semal -mal termal -mala kemala -mala pemalakan -mala semala -malah permalahan -malam bermalam -malam dimalam -malam kemalaman -malam permalam -malam semalam -malam semalaman -malam semalamnya -malang kemalang -malang kemalangan -malang memalang -malang memalangkan -malang pemalang -malang pemalangan -malas kemalasan -malas pemalas -malas termalas -maling dimaling -maling kemalingan -maling memalingkan -malu kemaluan -malu memalu -malu memalui -malu memalukan -malu memalukannya -malu pemalu -malu permalukan -mam dimam -mam kemaman -mama bermama -mamah memamah -mamah pemamah -maman kemaman -mambu semambu -mambung semambung -mampai semampai -mampir semampir -mampu kemampuan -mampu memampukan -mampu semampu -mampu semampunya -man belman -man berman -man bermani -man diman -man dimankan -man keman -man kemanan -man meman -man peman -man perman -man permanan -man seman -man semanan -man terman -mana bermana -mana dimana -mana dimanakan -mana dimananya -mana kemana -mana kemanaan -mana kemanakan -mana permana -mana semana -manah memanah -manah pemanah -manah pemanahan -manah pemanahnya -manajemen dimanajemen -manajemen memanajemen -manajer dimanajeri -manajer memanajeri -manakan dimanakan -manakan kemanakan -mancung memancung -mancung memancungkan -mancung pemancungan -manda bermanda -mandat dimandatkan -mandat memandatkan -mandek kemandekan -mandi bermandi -mandi bermandikan -mandi dimandikan -mandi memandikan -mandi memandikannya -mandi pemandi -mandi pemandian -mandi permandian -mandir kemandiran -mandiri kemandirian -mandiri memandirikan -mandor kemandoran -mandu memandu -mandu memandunya -mandu pemandu -mandu pemanduan -mandu pemandunya -mandul dimandulkan -mandul kemandulan -mandul memandulkan -mandul pemandulan -manfaat bemanfaat -manfaat bermanfaat -manfaat bermanfaatkan -manfaat bermanfaatnya -manfaat dimanfaat -manfaat dimanfaatkan -manfaat dimanfaatkannya -manfaat kemanfaatan -manfaat memanfaat -manfaat memanfaatan -manfaat memanfaatkan -manfaat memanfaatkannya -manfaat pemanfaat -manfaat pemanfaatan -manfaat pemanfaatkan -manfaat termanfaatkan -mang kemang -mang kemangan -mang kemangi -mang memang -mang memangkan -mang memanglah -mang memangnya -mang semang -mang semangan -mang semangnya -mangan kemangan -mangan semangan -manggis kemanggisan -manggung kemanggungan -manggung memanggungkan -mangkas memangkas -mangkas memangkasnya -mangkas pemangkas -mangkas pemangkasan -mangkat pemangkat -mangkir pemangkiran -mangkok semangkok -mangkuk semangkuk -mangsa dimangsa -mangsa dimangsanya -mangsa memangsa -mangsa memangsanya -mangsa pemangsa -mangsa pemangsaan -mangsa pemangsanya -mangu termangu -mangun pemangunan -mani bermani -manifestasi bermanifestasi -manifestasi dimanifestasikan -manifestasi memanifestasikan -manifestasi termanifestasi -manifestasi termanifestasikan -manipulasi dimanipulasi -manipulasi memanipulasi -manipulasi memanipulasinya -manis kemanis -manis kemanisan -manis pemanis -manis pemanisnya -manis semanis -manis termanis -manja bermanja -manja dimanja -manja dimanjakan -manja kemanjaan -manja memanjakan -manja memanjakannya -manja pemanjaan -manja termanjakan -manjung semanjung -manjur kemanjuran -manta memantai -mantan kemantan -mantap dimantapkan -mantap kemantapan -mantap memantapkan -mantap pemantapan -mantel bermantel -mantik memantik -mantik pemantik -mantik pemantiknya -mantik semantik -manunggal kemanunggalan -manusia dimanusiakan -manusia kemanusia -manusia kemanusiaan -manusia memanusiakan -manuver bermanuver -map semapan -mapan kemapanan -mapan memapankan -mapan semapan -mar belmar -mar kemar -mar kemari -mar memar -mar memarkan -mar memarnya -mar semar -mara dimara -mara semara -marah dimarahi -marah kemarahan -marah memarahi -marah pemarah -marah semarah -marak memarakkan -marak semarak -marak semarakkan -marak semaraknya -mare semare -marga bermarga -marginal dimarginalkan -marginal memarginalkan -marginal termarginalkan -mari kemari -mari kemarian -mari kemarilah -maritim kemaritiman -mark memarkan -markas bermarkas -markas bermarkasi -markas dimarkas -maro dimaro -maro kemaro -martabat bermartabat -martabat kemartabatan -martabat memartabatkan -mas bermaslah -mas dimas -mas kemas -mas kemasan -mas kemasi -mas memasan -mas pemasan -mas penmas -mas permas -mas termas -masa bemasalah -masa bermasa -masa bermasalah -masa dimasa -masa dimasanya -masa memasakan -masa pemasakan -masa pemasakannya -masa permasalah -masa semasa -masak dimasak -masak dimasakkan -masak dimasaknya -masak memasak -masak memasakan -masak memasakkan -masak memasaknya -masak pemasak -masak pemasakan -masalah bemasalah -masalah bermasalah -masalah bermasalahan -masalah bermasalahnya -masalah dimasalahkan -masalah memasalahkan -masalah pemasalahan -masalah permasalah -masalah permasalahan -masalah permasalahkan -masalah permasalahnya -masif dimasifkan -masif memasifkan -masif semasif -masih semasih -masinis dimasinisi -masjid kemasjidan -masker bermasker -masker dimasker -maskulin kemaskulinan -maslahat kemaslahatan -mason kemasonan -massa bermassa -massa dimassa -massal pemassalan -mastik memastikan -masturbasi bermasturbasi -masuk dimasuk -masuk dimasukan -masuk dimasuki -masuk dimasukkan -masuk dimasukkannya -masuk kemasukan -masuk kemasukkan -masuk memasuk -masuk memasukan -masuk memasuki -masuk memasukkan -masuk memasukkannya -masuk pemasuk -masuk pemasukan -masuk pemasukkan -masuk termasuk -masuk termasuki -masuk termasuknya -masyarakat bermasyarakat -masyarakat dimasyarakat -masyarakat dimasyarakatkan -masyarakat kemasyarakat -masyarakat kemasyarakatan -masyarakat memasyarakat -masyarakat memasyarakatkan -masyarakat memasyarakatnya -masyarakat pemasyarakat -masyarakat pemasyarakatan -masyarakat permasyarakat -masyarakat permasyarakatan -masyhur kemasyhuran -masyhur termasyhur -mat kemat -mat kematan -mat pemati -mat semat -mat sematan -mat semati -mat sematkan -mata bermata -mata dimata -mata dimatanya -mata memata -mata mematai -mata permata -mata permatanya -mata semata -mata-mata dimata-matai -mata-mata memata-matai -mata-mata semata-mata -matan kematan -matan sematan -matang dimatangkan -matang kematangan -matang mematangkan -matang mematangkannya -matang pematang -matang pematangan -matang permatang -matang sematang -materi bermateri -materi bermaterikan -materi pemateri -materi pematerinya -material bermaterial -material bermaterialkan -mati dimatikan -mati dimatikannya -mati kematian -mati mematikan -mati mematikannya -mati pemati -mati semati -mau dimau -mau dimaui -mau kemauan -mau semau -mau semaunya -maya semaya -mayam semayamkan -mayang semayang -mayor kemayoran -mayoritas bermayoritas -mayoritas bermayoritaskan -mayung memayungi -mayung pemayung -mazhab bermazhab -mbah menmbahkan -mbah pembahan -mbah sembah -mebel permebelan -medan bermedan -media bermedia -media dimedia -mediasi bermediasi -mediasi dimediasi -mediasi dimediasikan -mediasi memediasi -mediator dimediatori -meditasi bermeditasi -megah kemegahan -megah semegah -megah termegah -megan memegan -megan pemegan -meja dimeja -meja kemeja -meja kemejanya -meja semeja -mejam memejamkan -mejeng memejeng -mek semekan -mekar bermekaran -mekar dimekarkan -mekar memekarkan -mekar pemekaran -mel semel -melamin bermelamin -melarat kemelaratan -melas memelas -melik memeliki -memang kememangan -memang mememangi -memang mememangkan -memang pememang -memar dimemarkan -memori bermemori -menak kemenakan -menang dimenangi -menang dimenangkan -menang dimenangkannya -menang kemenang -menang kemenangan -menang memenang -menang memenangan -menang memenangi -menang memenangkan -menang memenangkannya -menang pemenang -menang pemenangan -menang pemenangnya -menara semenara -menit dimenit -menit permenit -menit semenit -mentah dimentahkan -mentah dimentahkannya -mentah mementahkan -mentah mementahkannya -mentah termentahkan -mental bermental -mental mementalkan -mentari kementarian -mentas mementaskan -mentas pementasan -mentereng sementereng -menteri kementeri -menteri kementerian -mentor dimentori -menu memenui -menung termenung -mepet memepet -mepet memepetkan -mepet memepetnya -meraga memeragakan -meraga memeragakannya -merah kemerahan -merah memerah -merah memerahkan -merah memerahnya -merah pemerah -merah pemerahan -merah semerah -merang memerangi -merang pemerangan -merat pemeratan -merawan memerawani -merdeka dimerdekakan -merdeka kemerdekaan -merdeka memerdekaan -merdeka memerdekakan -merek bermerek -merger dimerger -meri memerikan -meri pemerian -meriam bermeriam -merih memerihkan -merih pemerihan -merik memerikan -merikan memerikan -merosot kemerosotan -merosot memerosotkan -merosot pemerosotan -meru semeru -mes dimes -mes dimesi -mes memes -mes memesan -mes pemesan -mesan memesan -mesan memesankan -mesan memesannya -mesan pemesan -mesan pemesanan -mesan pemesannya -mesin bermesin -mesin dimesin -mesin permesinan -mesra bermesraan -mesra kemesraan -mesti kemestian -mesti semestinya -mesum bermesum -meta memetakan -meta memetakannya -meta pemetaan -metabolisme dimetabolisme -metabolisme memetabolisme -metah memetahkan -metamorfosis bermetamorfosis -metastasis bermetastasis -meter permeter -meter permeternya -meter semeter -meterai bermeterai -meterai memeteraikan -metil dimetil -metrologi kemetrologian -mewah kemewahan -mewah semewah -mewah termewah -mi bermian -mi dimi -mi kemi -mi memi -mi memilah -mi meminya -mi pemian -mi permi -mi permian -mi semi -mi seminya -migrasi bermigrasi -migrasi dimigrasi -migrasi dimigrasikan -migrasi kemigrasian -migrasi memigrasi -migrasi memigrasikan -mik memiki -mikat memikat -mikat memikatnya -mikat pemikat -mil memili -mil pemili -mil permil -miliar semiliar -milik dimilik -milik dimiliki -milik dimiliknya -milik memilik -milik memiliki -milik memiliknya -milik memmiliki -milik pemilik -milik pemilikan -milik pemiliki -milik pemiliknya -milir semilir -militer kemiliteran -milu memilukan -milu pemilu -milu pemilunya -mimpi bermimpi -mimpi bermimpilah -mimpi dimimpikan -mimpi memimpi -mimpi memimpikan -mimpi memimpikannya -mimpi pemimpi -mimpi pemimpian -mimpi pemimpinya -minat berminat -minat berminatnya -minat diminat -minat diminati -minat meminat -minat meminati -minat peminat -minat peminatan -minat peminatnya -minat seminat -minggir meminggirkan -minggir meminggirkannya -minggir peminggiran -minim keminiman -minim meminimkan -minim seminim -minim terminim -minimal diminimalkan -minimal meminimalkan -minimal seminimal -minimum meminimumkan -mintak dimintakan -mintak memintak -mintak memintakan -minum diminum -minum diminumkan -minum diminumnya -minum meminum -minum meminumkan -minum meminumnya -minum peminum -minum peminumnya -minum terminum -minus terminus -minyak berminyak -minyak diminyaki -minyak meminyaki -minyak perminyakan -minyak seminyak -miring dimiringkan -miring kemiringan -miring memiringkan -mirip dimiripkan -mirip kemiripan -mirip semirip -miris memiriskan -misal dimisalkan -misal memisalkan -misal semisal -misal semisalnya -misan permisan -misi bermisi -misi permisi -miskin dimiskinkan -miskin kemiskinan -miskin memiskinkan -miskin pemiskinan -miskin semiskin -miskin termiskin -misterius kemisteriusan -mitra bermitra -mitra kemitraan -mobil bermobil -mobil dimobil -mobil semobil -mobilisasi bermobilisasi -mobilisasi dimobilisasi -mobilisasi dimobilisasikan -mobilisasi memobilisasi -mobilisasi termobilisasi -mobilitas bermobilitas -modal bermodal -modal bermodalkan -modal dimodali -modal memodali -modal pemodal -modal pemodalan -modal pemodalnya -modal permodalan -model bermodel -model bermodelkan -model dimodelkan -model memodelkan -model pemodelan -model permodelan -model semodel -moderator dimoderatori -moderator memoderatori -modernisasi dimodernisasi -modernisasi memodernisasi -modernisasi memodernisasikan -modifikasi dimodifikasi -modifikasi memodifikasi -modifikasi memodifikasinya -modifikasi pemodifikasian -modifikasi termodifikasi -modulasi memodulasi -modus bermodus -modus bermoduskan -moga semoga -mogok pemogok -mogok pemogokan -mogok pemogokkan -mohon bermohon -mohon dimohon -mohon dimohonkan -mohon memohon -mohon memohonkan -mohon pemohon -mohon pemohonan -mohon pemohonnya -mohon permohon -mohon permohonan -mohon termohon -mohon termohonnya -mok semok -mole kemolekan -mole kemolekannya -molek kemolekan -moles memoles -moles memoleskan -moles memolesnya -moles pemoles -moles pemolesan -molor memolorkan -moncong bermoncong -mondok pemondokan -mono permono -monopoli dimonopoli -monopoli memonopoli -monyong memonyongkan -moral bermoral -moratorium dimoratorium -moratorium memoratorium -mori memori -mori memorinya -motif bermotif -motif bermotifkan -motivasi bermotivasi -motivasi dimotivasi -motivasi memotivasi -motivasi memotivasinya -motivasi termotivasi -moto bermoto -moto memoto -motor bemotor -motor bermotor -motor bermotornya -motor dimotori -motor memotori -motor pemotor -mu memukan -mu permukan -mu permukannya -mu semu -mu semuan -mu semunya -mu termuan -mua dimuai -mua kemuakan -mua memuai -mua semua -mua semualah -mua semuanya -mua semuanyalah -muai dimuai -muai memuai -muai pemuaian -muak kemuakan -muak memuakkan -mual dimuali -mual semual -muamalah bermuamalah -muara bermuara -muara bermuaranya -muas memuaskan -muas memuaskannya -muas pemuas -muas pemuasan -muat bermuatan -muat dimuat -muat dimuati -muat dimuatnya -muat memuat -muat memuatnya -muat pemuat -muat pemuatan -muat semuat -muat termuat -mud kemudan -mud kemudi -mud pemudan -mud pemudi -mud pengmudi -muda bermuda -muda kemudaan -muda memuda -muda memudakan -muda pemuda -muda pemudanya -muda semuda -muda termuda -muda termudanya -mudah dimudahkan -mudah dimudahkannya -mudah kemudahan -mudah memudah -mudah memudahan -mudah memudahkan -mudah memudahkannya -mudah permudah -mudah semudah -mudah termudah -mudah termudahkan -mudah termudahnya -mudarat kemudaratan -mudik bermudik -mudik kemudikan -mudik pemudik -mudik pemudiknya -mufakat bermufakat -mufakat kemufakatan -mufakat pemufakatan -mufakat permufakatan -muhasabah bermuhasabah -mujur kemujuran -mujur semujur -muka bermuka -muka dimuka -muka kemuka -muka kemukakan -muka kemukanya -muka memuka -muka memukai -muka pemuka -muka pemukaan -muka permukaan -muka termuka -mukim bermukim -mukim bermukimnya -mukim dimukimi -mukim dimukimkan -mukim kemukiman -mukim memukimkan -mukim pemukim -mukim pemukiman -mukim pemukimnya -mukim permukim -mukim permukiman -muktamar bermuktamar -mula bemula -mula bermula -mula bermulai -mula bermulanya -mula dimulai -mula memulai -mula pemula -mula permulaan -mula semula -mula semulai -mula semulanya -mulai bermulai -mulai dimulai -mulai dimulailah -mulai dimulainya -mulai memulai -mulai memulainya -mulai semulai -mulas memulas -mulas memulaskan -mulas memulasnya -mulas pemulas -mulia dimuliakan -mulia kemuliaan -mulia memulia -mulia memuliakan -mulia memuliakannya -mulia pemulia -mulia pemuliaan -mulus dimuluskan -mulus kemulusan -mulus memuluskan -mulus memuluskannya -mulus pemulus -mulus pemulusan -mulus semulus -mulut bermulut -mulut dimulut -mulut kemulut -mulut pemulutan -mumi dimumikan -mumi memumikan -mumpuni memumpuni -mumut pemumutan -munafik kemunafikan -munajat bermunajat -muncul bermunculan -muncul dimunculkan -muncul dimunculkannya -muncul kemunculan -muncul memunculkan -muncul memunculkannya -muncul pemunculan -mundur dimundurkan -mundur dimundurkannya -mundur kemunduran -mundur memundurkan -mundur memundurkannya -mundur pemunduran -mungil termungil -mungkar kemungkaran -mungkin dimungkin -mungkin dimungkinan -mungkin dimungkinkan -mungkin dimungkinkannya -mungkin kemungkin -mungkin kemungkinan -mungkin kemungkinkan -mungkin memungkin -mungkin memungkinan -mungkin memungkinkan -mungkin memungkinkannya -mungkir dimungkiri -mungkir memungkiri -mungut memungut -mungut memunguti -mungut memungutnya -mungut pemungut -mungut pemungutan -mupus memupus -mupus memupuskan -mur semur -murah bermurah -murah dimurahkan -murah kemurahan -murah memurahkan -murah pemurah -murah semurah -murah termurah -murah termurahnya -muram bermuram -muram kemuraman -murka dimurkai -murka kemurkaan -murni dimurnikan -murni kemurnian -murni memurnikan -murni pemurni -murni pemurnian -murni permurnian -murtad kemurtadan -murtad pemurtadan -murung kemurungan -murung pemurung -murus pemurus -mus permusi -museum dimuseumkan -museum permuseuman -musik bermusik -musik bermusiknya -musik pemusik -musik permusikan -musim dimusim -musim permusim -musim permusimnya -musim semusim -musim semusimnya -musnah dimusnahkan -musnah dimusnahkannya -musnah kemusnahan -musnah memusnahkan -musnah memusnahkannya -musnah pemusnah -musnah pemusnahan -mustahil kemustahilan -mustaka pemustaka -musuh bermusuhan -musuh dimusuhi -musuh memusuhi -musuh permusuhan -musyawarah bermusyawarah -musyawarah dimusyawarahkan -musyawarah memusyawarahkan -musyawarah permusyawarahan -musyrik kemusyrikan -mutakhir dimutakhirkan -mutakhir kemutakhiran -mutakhir memutakhirkan -mutakhir pemutakhiran -mutakhir termutakhir -mutakhir termutakhirnya -mutasi bermutasi -mutasi dimutasi -mutasi dimutasikan -mutasi memutasi -mutasi memutasikan -mutasi pemutasian -mutasi permutasi -mutih memutih -mutih memutihkan -mutih memutihkannya -mutih pemutih -mutih pemutihan -mutilasi dimutilasi -mutilasi memutilasi -mutilasi memutilasinya -mutilasi pemutilasi -mutilasi pemutilasian -mutilasi termutilasi -mutlak kemutlakan -mutu bermutu -mutu memutukan -nabi kenabian -nabu menabukan -nada bernada -nada menadakan -nada senada -nadi bernadi -nadi menadi -naf kenaf -nafkah dinafkahi -nafkah menafkahi -nafsu bernafsu -naga penagakan -naga senagai -nagari kenagarian -nah benah -nah benahi -nah bernah -nah dinah -nah menahan -nah penah -nah penahan -nah pernah -nah pernahkan -nah pernahnya -nah senah -nah ternah -nahas kenahasan -nahi benahi -nahu menahu -naif kenaifan -naik dinaikan -naik dinaiki -naik dinaikkan -naik dinaikkannya -naik kenaikan -naik kenaikkan -naik kenaikkannya -naik menaik -naik menaikan -naik menaiki -naik menaikkan -naik menaikkannya -naik menaiknya -naik penaikan -naik penaikkan -najam menajam -najam menajamkan -najam menajamnya -najam penajam -najam penajaman -nak benak -nak benaknya -nak kenak -nak kenakan -nak menak -nak menakan -nak penak -nak pernak -nak ternak -nak ternakan -nak ternaknya -naka menaka -nakal kenakalan -nakhoda dinakhodai -nakhoda menakhodai -nal benali -nal bernal -nal dinal -nal kenal -nal kenalan -nal kenali -nal kenalkan -nal kenalnya -nal menalan -nal penal -nal penali -nalam menalami -nalar bernalar -nalar dinalar -nalar menalar -nalar penalaran -nali benali -nali kenali -nali kenalilah -nali penali -naluri bernaluri -nama benama -nama bernama -nama bernamakan -nama dinama -nama dinamai -nama dinamakan -nama dinamakannya -nama kenamaan -nama menamai -nama menamakan -nama menamakannya -nama penamaan -nama pernama -nama ternama -nan benan -nan bernan -nan dinan -nan kenan -nan menan -nan pernanan -nan senan -nanah bernanah -nanah penanahan -nanang menanangi -nanang penanangan -nandu menandu -nandu menandunya -nandung menandung -nandung senandung -nang benang -nang benangnya -nang kenang -nang kenangan -nang kenangnya -nang memnangkan -nang menang -nang menangan -nang menangi -nang menangkan -nang menanglah -nang menangnya -nang penang -nang penangan -nang penangkan -nang senang -nang senangan -nang senangi -nang senangkan -nang senanglah -nang senangnya -nangka penangkaan -naning senaning -nanti dinanti -nanti dinantikan -nanti dinantikannya -nanti dinantinya -nanti menanti -nanti menantikan -nanti menantikannya -nanti menantinya -nanti penanti -nanti penantian -napas bernapas -napas bernapaskan -napas bernapaslah -napas bernapasnya -napas penapasan -napas pernapasan -napas senapas -nara dinara -nara menara -nara menaranya -nara penara -narasi dinarasikan -narasi menarasikan -narsis bernarsis -narsis kenarsisan -nas belnas -nas benas -nas bernas -nas dinas -nas dinasi -nas dinasnya -nas kenas -nas menas -nas penas -nasar penasaran -nasi dinasi -nasib bernasib -nasib senasib -nasihat dinasihati -nasihat menasihati -nasihat menasihatkan -nasihat penasihat -nasihat penasihatan -nasihat penasihatnya -nasional dinasionalkan -nasional menasional -nasionalisasi dinasionalisasi -nasionalisasi dinasionalisasikan -nasionalisasi menasionalisasi -nasionalisasi menasionalisasikan -nasti dinasti -nasti dinastinya -natang menatang -natar penataran -natural senatural -naturalisasi dinaturalisasi -naturalisasi menaturalisasi -naung bernaung -naung bernaungnya -naung dinaungi -naung menaungi -naung penaung -naung ternaungi -navigasi bernavigasi -navigasi dinavigasi -navigasi dinavigasikan -navigasi kenavigasian -navigasi menavigasi -navigasi menavigasikan -nawa benawa -nawa bernawa -nawa menawakan -nazar bernazar -nazir benazir -nazir kenaziran -ndoro bendoro -nebeng menebeng -negara bernegara -negara dinegara -negara dinegaranya -negara kenegara -negara kenegaraan -negara menegarai -negara senegara -negara senegaranya -negarawan kenegarawan -negarawan kenegarawanan -negasi dinegasikan -negasi menegasikan -negeri dinegeri -negeri dinegerikan -negeri kenegerian -negeri penegerian -negosiasi bernegosiasi -negosiasi dinegosiasi -negosiasi dinegosiasikan -negosiasi menegosiasi -negosiasi menegosiasikan -negosiasi menegosiasikannya -nek kenek -nek keneknya -nek menekan -nek penekan -nekat kenekatan -nekat senekat -neng meneng -neng menengan -neng peneng -neng seneng -neng senengnya -nestapa kenestapaan -net benet -net penet -netral dinetralkan -netral kenetralan -netral menetralkan -netral menetralkannya -netral penetral -netral penetralan -netralisasi dinetralisasi -netralisasi menetralisasi -ngaben pengabenan -ngalau mengalau -nganga menganga -nganga ternganga -ngarai pengaraian -ngebut mengebut -ngenas mengenasi -ngenas mengenaskan -ngeong mengeong -ngeri kengerian -ngeri mengeri -ngeri mengerikan -ngeri mengerikannya -ngiang terngiang -ngung mengungkan -ngung pengungi -ni beni -ni berni -ni dini -ni dinilah -ni dininya -ni keni -ni kenikan -ni meni -ni menilah -ni pelni -ni peni -ni seni -ni senilah -ni seninya -ni terni -nia dinia -nia diniai -nia kenia -nia keniakan -nia meniai -nia penia -nia pernia -nia senia -nia seniai -niaga berniaga -niaga diniagakan -niaga meniagakan -niaga perniagaan -niat beniat -niat berniat -niat diniati -niat diniatkan -niat meniatkan -nih benih -nih benihnya -nihil dinihilkan -nihil menihilkan -nik benik -nik kenikan -nik menik -nik menikkan -nik pernik -nik perniknya -nikah dinikah -nikah dinikahi -nikah dinikahkan -nikah menikah -nikah menikahi -nikah menikahkan -nikah menikahkannya -nikah menikahlah -nikah menikahnya -nikah penikahan -nikah pernikah -nikah pernikahan -nila benilai -nila bernilai -nila dinila -nila dinilai -nila menila -nila menilai -nila penilai -nila senila -nila senilai -nila ternilai -nilai benilai -nilai bernilai -nilai bernilainya -nilai dinilai -nilai dinilainya -nilai menilai -nilai menilainya -nilai penilai -nilai penilaian -nilai penilainya -nilai pernilaian -nilai senilai -nilai ternilai -ninabobo dininabobokan -ninabobo meninabobokan -ning bening -ning beningnya -ning dining -ning kening -ning keningnya -ning mening -ning pening -ning perning -ningrat diningrat -nipah senipah -nipis menipis -nipis menipiskan -nipis menipisnya -nipis penipisan -nisan bernisan -nisbah dinisbahkan -niscaya diniscayakan -niscaya keniscayaan -niscaya meniscayakan -nista dinista -nista dinistakan -nista kenistaan -nista menista -nista menistai -nista menistakan -nista penista -nista penistaan -noa benoa -nobat dinobatkan -nobat dinobatkannya -nobat menobatkan -nobat menobatkannya -nobat penobatan -noda bernoda -noda dinodai -noda menoda -noda menodai -noda menodakan -noda penoda -noda penodaan -noda ternoda -noda ternodai -nol dinolkan -nol senol -nominal bernominal -nominal dinominalkan -nominasi dinominasi -nominasi dinominasikan -nominasi menominasikan -nominasi penominasian -nomor benomor -nomor bernomor -nomor dinomor -nomor dinomori -nomor menomor -nomor penomoran -non dinon -non menon -nonaktif dinonaktifkan -nonaktif dinonaktifkannya -nonaktif mengnonaktifkan -nonaktif menonaktifkan -nonaktif menonaktifkannya -nonaktif penonaktifan -nonaktif penonaktifkan -normal dinormalkan -normal kenormalan -normal menormalkan -normal penormalan -normal senormal -normalisasi dinormalisasi -normalisasi dinormalisasikan -normalisasi menormalisasi -normalisasi menormalisasikan -nostalgia bernostalgia -notariat kenotariatan -notifikasi dinotifikasi -notifikasi menotifikasi -nrima menrima -nu benu -nu dinu -nu menu -nu menui -nu menukan -nu menunya -nu penuan -nuansa bernuansa -nuansa bernuansakan -nukil dinukil -nukil menukil -nunut menunut -nunut penunut -nur benur -nur menur -nus dinus -nus menus -nus penus -nusantara kenusantaraan -nusantara senusantara -nutrisi bernutrisi -nutrisi menutrisi -nutrisi ternutrisi -nyai benyai -nyak benyak -nyak dinyakan -nyak menyakan -nyak penyaki -nyala dinyalakan -nyala dinyalakannya -nyala menyala -nyala menyalakan -nyala menyalakannya -nyala menyalanya -nyala penyala -nyala penyalaan -nyali bernyali -nyaman kenyaman -nyaman kenyamanan -nyaman menyamankan -nyaman senyaman -nyaman ternyaman -nyana dinyana -nyang kenyang -nyang kenyangnya -nyang menyangi -nyang menyangkan -nyang penyang -nyanyang menyanyangi -nyanyang menyanyangkan -nyanyang penyanyang -nyanyi bernyanyi -nyanyi bernyanyilah -nyanyi dinyanyikan -nyanyi dinyanyikannya -nyanyi menyanyi -nyanyi menyanyikan -nyanyi menyanyikannya -nyanyi menyanyinya -nyanyi penyanyi -nyanyi penyanyinya -nyarang menyarang -nyarang menyarangkan -nyarang menyarangkannya -nyarang penyarang -nyarik menyarikan -nyarik penyarikan -nyaring kenyaringan -nyaring menyaring -nyaring menyaringnya -nyaring penyaring -nyaring penyaringan -nyata dinyataan -nyata dinyatakan -nyata dinyatakannya -nyata kenyataan -nyata mennyatakan -nyata menyataan -nyata menyatakan -nyata menyatakannya -nyata penyataan -nyata pernyataan -nyata pernyatakan -nyata senyata -nyata senyatanya -nyata ternyata -nyawa bernyawa -nyawa dinyawai -nyawa senyawa -nyawa senyawanya -nyeri kenyeri -nyiur senyiur -obar mengobarkan -obar pengobar -obat berobat -obat berobatlah -obat berobatnya -obat diobati -obat mengobat -obat mengobati -obat menobatkan -obat menobatkannya -obat pengobat -obat pengobatan -obat penobatan -obat perobatan -obat terobati -obi pelobi -objektif keobjektifan -objektif seobjektif -obral diobral -obral mengobral -obrol diobrolkan -obrol mengobrol -obrol mengobrolkan -observasi diobservasi -observasi mengobservasi -obsesi berobsesi -obsesi terobsesi -obsesi terobsesinya -oceh mengoceh -odalan pemodalan -ode diode -ode pengodean -ode perode -ogok menyogok -ogok menyogoknya -ogok pemogok -ogok pemogokan -ogok pemogokkan -ogok penyogok -ogok penyogokan -ojek mengojek -ojek pengojek -ojok memojokan -ojok memojokkan -ojok memojokkannya -okok perokok -okok perokoknya -oksida dioksida -oksida peroksida -oksidasi dioksidasi -oksidasi mengoksidasi -oksidasi teroksidasi -oksigen beroksigen -okupasi diokupasi -okupasi mengokupasi -olah berolah -olah diolah -olah diolahnya -olah mengolah -olah mengolahnya -olah menolah -olah pengolah -olah pengolahan -olah pengolahnya -olah perolahan -olah seolah -olah terolah -olahraga berolahraga -olahraga berolahragalah -olahraga berolahraganya -olahraga keolahragaan -olahraga mengolahragakan -olak menolak -olak menolakan -olak menolaknya -olak meolak -olak penolak -olak penolakan -olak penolakkan -oleh beroleh -oleh dioleh -oleh menoleh -oleh menolehkan -oleh peroleh -oleh perolehan -olek menyolek -oles dioles -oles diolesi -oles dioleskan -oles memoles -oles memoleskan -oles memolesnya -oles mengoles -oles mengolesi -oles mengoleskan -oles mengoleskannya -oles pemoles -oles pemolesan -oles pengolesan -olok diolok -olok mengolok -olok mengoloknya -olok menyolok -om belom -om beom -om keoman -ombak berombak -ombak menombak -ombak perombakan -ombak perombakkan -ombang-ambing diombang-ambing -ombang-ambing diombang-ambingkan -ombang-ambing mengombang-ambingkan -ombang-ambing terombang-ambing -omel diomeli -omel mengomel -omel mengomeli -omong diomongkan -ompol mengompol -omzet beromzet -onar keonaran -oncat peloncat -ondo pemondokan -ondo pemondokannya -ondok pemondokan -ong belong -ong keong -ong menong -ong meong -ong meongan -ong seong -ong terong -onggok seonggok -onggok teronggok -ongkos diongkos -ongkos diongkosi -ongkos mengongkosi -opa belopa -oper dioper -oper dioperkan -oper mengoper -oper mengoperkan -oper mengoperkannya -oper mengopernya -oper pengoper -oper pengoperan -opera beroperai -operasi beoperasi -operasi beroperasi -operasi beroperasinya -operasi dioperasi -operasi dioperasikan -operasi dioperasikannya -operasi mengoperasi -operasi mengoperasikan -operasi mengoperasikannya -operasi mengoperasinya -operasi pengoperasi -operasi pengoperasian -operasi pengoperasikan -operasional beroperasional -operasional dioperasionalkan -operasional dioperasionalkannya -operasional mengoperasionalkan -operasional mengoperasionalkannya -operasional pengoperasionalan -operasionalisasi dioperasionalisasikan -operator dioperatori -operator mengoperatori -operator mengoperatorkan -opini beropini -opini diopinikan -oplah beroplah -oplos dioplos -oplos mengoplos -oplos mengoplosnya -oplos pengoplos -oplos pengoplosan -opname diopname -opor pelopor -opor pelopori -opor pelopornya -oposisi beroposisi -optimal dioptimalkan -optimal mengoptimalkan -optimal mengoptimalkannya -optimal pengoptimalan -optimal seoptimal -optimis keoptimisan -orak menyoraki -orak menyorakkan -oral dioral -oral mengoral -orang peorangan -orang perorang -orang perorangan -orang seorang -orang seorangan -orang seorangnya -orasi berorasi -oratorium memoratorium -orbit diorbitkan -orbit diorbitkannya -orbit diorbitnya -orbit mengorbit -orbit mengorbiti -orbit mengorbitkan -orbit mengorbitkannya -orbit mengorbitnya -orbit pengorbit -orbit pengorbitan -order diorder -order mengorder -ordinasi mengordinasi -ordinasi mengordinasikan -organisasi berorganisasi -organisasi diorganisasi -organisasi diorganisasikan -organisasi keorganisasian -organisasi mengorganisasi -organisasi mengorganisasikan -organisasi pengorganisasi -organisasi pengorganisasian -organisasi terorganisasi -organisasi terorganisasikan -orgasme berorgasme -orientasi beorientasi -orientasi berorientasi -orientasi diorientasikan -orientasi mengorientasikan -orkestrasi mengorkestrasi -ornamen berornamen -orok mengorok -otak berotak -otak diotak -otak diotaki -otak mengotak -otak mengotaki -otak-atik diotak-atik -otak-atik mengotak-atik -oto memoto -otomatisasi diotomatisasi -otomatisasi mengotomatisasi -otomatisasi mengotomatisasikan -otomatisasi terotomatisasi -otonom berotonomi -otonomi berotonomi -otorisasi diotorisasi -otorisasi mengotorisasi -otot berotot -otot mengotot -otot pelototi -oven dioven -ovulasi berovulasi -oyak mengoyak -pabean kepabean -pabean kepabeanan -pabrik dipabrik -pacar berpacaran -pacar dipacari -pacar memacari -pacet memacetkan -pacu berpacu -pacu dipacu -pacu dipacunya -pacu memacu -pacu memacunya -pacu pemacu -pacu terpacu -pada kepada -pada kepadanya -pada memadai -pada sepada -pada terpada -padah memadahi -padam dipadamkan -padam memadam -padam memadamkan -padam memadamkannya -padam pemadam -padam pemadaman -padam pemadamnya -padan dipadankan -padan kepadan -padan kepadannya -padan memadankan -padan memadankannya -padan pemadan -padan pemadanan -padan sepadan -padang dipadang -padang memadang -padang pemadangan -padat dipadati -padat dipadatkan -padat kepadatan -padat memadat -padat memadati -padat memadatkan -padat memadatkannya -padat pemadat -padat pemadatan -padat sepadat -padat terpadat -padi pepadi -padi perpadi -padi terpadi -padu memadu -padu memadukan -padu memadukannya -padu pemadu -paduk dipadukan -paduk memadukan -pagar berpagar -pagar dipagar -pagar dipagari -pagar memagar -pagar memagari -pagar pemagaran -pagi dipagi -pagi kepagian -pagi sepagi -pagu dipagukan -paha sepaha -pahala berpahala -pahat dipahat -pahat memahat -pahat pemahat -pahat pemahatan -pahat terpahat -pahit kepahitan -pahit sepahit -pahit terpahit -pahlawan kepahlawan -pahlawan kepahlawanan -pai memaikan -pai pemai -pai pemaian -pai pemainya -pailit dipailitkan -pailit kepailitan -pailit memailitkan -pailit mempailitkan -pailit pemailitan -paja pemajakan -paja perpajakan -paja perpajakannya -pajak dipajaki -pajak memajaki -pajak pemajakan -pajak perpajakan -pajak perpajakkan -pajan terpajan -pajang dipajang -pajang dipajangkan -pajang dipajangnya -pajang memajang -pajang memajangkan -pajang memajangnya -pajang pemajangan -pajang perpajangan -pajang sepajang -pajang terpajang -pajuan pemajuan -pak dipak -pak kepak -pak kepakan -pak memakan -pak memaki -pak pemakan -pak sepak -pak sepakan -pak sepakkan -pakai berpakaian -pakai dipakai -pakai dipakaikan -pakai dipakailah -pakai dipakainya -pakai kepakai -pakai memakai -pakai memakaikan -pakai memakaikannya -pakai memakainya -pakai pemakai -pakai pemakaian -pakai pemakainya -pakai terpakai -pakai terpakainya -pakan kepakan -pakan memakan -pakan memakannya -pakan pemakan -pakan pemakanan -pakan pemakannya -pakan sepakan -pakan sepakannya -pakar kepakaran -pakat kepakatan -pakat sepakat -pakat sepakatan -pakat sepakati -pakat sepakatnya -paket dipaket -paket dipaketkan -paket memaketkan -paket pemaketan -paket perpaket -paket sepaket -pakis kepakisan -paksa dipaksa -paksa dipaksakan -paksa dipaksanya -paksa memaksa -paksa memaksaan -paksa memaksakan -paksa memaksakannya -paksa memaksanya -paksa pemaksa -paksa pemaksaan -paksa terpaksa -paksa terpaksalah -paku berpaku -paku dipaku -paku dipakukan -paku memaku -paku memakukan -paku sepaku -paku terpaku -pakuk dipakukan -pakuk memakukan -pal kepal -pal kepalan -pal kepalkan -pal pemali -pal terpal -pala kepala -pala kepalai -pala kepalanya -pala pemalakan -palai kepalai -palak dipalak -palak memalak -palak memalaknya -palak pemalak -palak pemalakan -palang berpalang -palang dipalang -palang kepalang -palang memalang -palang memalangkan -palang pemalang -palang pemalangan -palas pemalas -palet berpalet -paling berpaling -paling berpalingnya -paling memalingkan -palsu dipalsu -palsu dipalsukan -palsu dipalsukannya -palsu kepalsuan -palsu memalsu -palsu memalsukan -palsu memalsukannya -palsu pemalsu -palsu pemalsuan -palu dipalu -palu memalu -palu memalui -palu memalukan -palu memalukannya -palu pemalu -pamah memamah -pamah pemamah -pamer berpameran -pamer dipamerkan -pamer dipamerkannya -pamer memamerkan -pamer memamerkannya -pamit berpamitan -pampang dipampang -pampang dipampangkan -pampang memampang -pampang memampangkan -pampang terpampang -pampang terpampangnya -pampat memampatkan -pan dipan -pan meman -pan mempan -pan menpan -pan peman -pan perpani -pan sepan -pana terpana -panah dipanah -panah memanah -panah pemanah -panah pemanahan -panah pemanahnya -pancang dipancang -pancang dipancangkan -pancang memancang -pancang memancangkan -pancang pemancang -pancang pemancangan -pancang terpancang -pancar dipancarkan -pancar dipancarkannya -pancar memancar -pancar memancarkan -pancar pemancar -pancar pemancaran -pancar pemancarnya -pancar terpancar -pancing dipancing -pancing kepancing -pancing memancing -pancing memancingnya -pancing pemancing -pancing pemancingan -pancing terpancing -pancung dipancung -pancung dipancungnya -pancung memancung -pancung memancungkan -pancung pemancungan -pandai kepandaian -pandai sepandai -pandai terpandai -pandan sepandan -pandang berpandangan -pandang dipandang -pandang dipandangi -pandang dipandangnya -pandang memandang -pandang memandangi -pandang memandangnya -pandang pemandangan -pandang sepandangan -pandang terpandang -pandu berpandu -pandu berpanduan -pandu dipandu -pandu dipandunya -pandu kepanduan -pandu memandu -pandu memandunya -pandu pemandu -pandu pemanduan -pandu pemandunya -pandu terpandu -panel berpanel -pangan kepangan -pangeran kepangeranan -panggang dipanggang -panggang memanggang -panggang memanggangnya -panggang pemanggang -panggang pemanggangan -panggang terpanggang -panggil dipanggil -panggil dipanggilan -panggil dipanggilkan -panggil dipanggilnya -panggil memanggil -panggil memanggilkan -panggil memanggilnya -panggil pemanggil -panggil pemanggilan -panggil terpanggil -panggul dipanggul -panggul memanggul -panggung dipanggung -panggung dipanggungkan -panggung memanggungkan -panggung sepanggung -pangkal berpangkal -pangkal berpangkalan -pangkal memangkal -pangkas dipangkas -pangkas dipangkasnya -pangkas memangkas -pangkas memangkasnya -pangkas pemangkas -pangkas pemangkasan -pangkas terpangkas -pangkas terpangkasnya -pangkat berpangkat -pangkat kepangkatan -pangkat pemangkat -pangku berpangku -pangku dipangku -pangku dipangkuan -pangku dipangkunya -pangku kepangkuan -pangku memangku -pangku memangkunya -pangku pemangku -pangku pemangkuan -pangsa memangsa -pangsa memangsanya -pangsa pemangsa -pangsa pemangsaan -pangsa pemangsanya -panik kepanikan -panik sepanik -panitera kepaniteraan -panitia kepanitiaan -panja memanjakan -panja memanjakannya -panja pemanjaan -panjak memanjakan -panjang berpanjang -panjang dipanjang -panjang dipanjangkan -panjang kepanjangan -panjang memanjang -panjang memanjangkan -panjang memanjangnya -panjang pemanjangan -panjang perpanjang -panjang perpanjangan -panjang sepanjang -panjang sepanjangan -panjang terpanjang -panjang terpanjangnya -panjat dipanjat -panjat dipanjatkan -panjat dipanjatnya -panjat memanjat -panjat memanjatkan -panjat memanjatnya -panjat pemanjat -panjat pemanjatan -panorama berpanorama -pantai dipantai -pantai memantai -pantai terpantai -pantar sepantaran -pantas kepantasan -pantas memantaskan -pantas sepantasnya -pantas sepantasnyalah -pantau dipantau -pantau dipantaunya -pantau memantau -pantau memantaunya -pantau pemantau -pantau pemantauan -pantau pemantaunya -pantau terpantau -pantau terpantaunya -pantik dipantik -pantik memantik -pantik pemantik -pantik pemantiknya -pantik terpantik -panting kepantingan -pantul dipantulkan -pantul memantul -pantul memantulkan -pantul memantulkannya -pantul pemantul -pantul terpantul -pantun berpantun -papah dipapah -papah memapah -papah memapahnya -papan berpapan -papan dipapan -papan memapankan -papar dipapar -papar dipaparkan -papar dipaparkannya -papar memapar -papar memaparkan -papar memaparkannya -papar pemaparan -papar terpapar -papar terpaparnya -papas berpapasan -papas dipapas -papas memapas -par memar -par memarkan -par memarnya -par memparkan -par menpar -para kepara -para keparakan -parade berparade -paradigma berparadigma -paraf diparaf -paraf memaraf -paraf memparaf -parah keparahan -parah memarahi -parah pemarah -parah perparah -parah separah -parah terparah -parah terparahnya -parak keparakan -parak memarakkan -parang diparang -parang pemarangan -paras berparas -paras separasi -paring diparingi -paripurna diparipurnakan -paripurna memparipurnakan -pariwisata kepariwisataan -parkir diparkir -parkir diparkiran -parkir diparkiri -parkir diparkirkan -parkir diparkirnya -parkir memarkir -parkir memarkirkan -parkir memarkirkannya -parkir memarkirnya -parkir pemarkir -parkir pemarkiran -parkir perparkiran -parkir terparkir -parlemen berparlemen -parlemen diparlemen -parlemen keparlemenan -parodi diparodikan -parodi memparodikan -paron pemaron -partai berpartai -partai dipartai -partai kepartaian -partai separtai -partai separtainya -partisi berpartisi -partisipasi bepartisipasi -partisipasi berpartisipasi -partner berpartner -paruh berparuh -paruh diparuh -paruh separuh -paruh separuhnya -parut diparut -parut memarut -parut pemarut -pas kepas -pas memasan -pas pemasan -pasak memasak -pasak memasakan -pasak memasakkan -pasak memasaknya -pasak pemasak -pasak pemasakan -pasang berpasangan -pasang dipasang -pasang dipasangan -pasang dipasangi -pasang dipasangkan -pasang dipasangkannya -pasang dipasangnya -pasang memasang -pasang memasangi -pasang memasangkan -pasang memasangkannya -pasang memasangnya -pasang pemasang -pasang pemasangan -pasang pemasangnya -pasang perpasangan -pasang sepasang -pasang terpasang -pasang terpasangnya -pasar dipasar -pasar dipasaran -pasar dipasarkan -pasar dipasarkannya -pasar kepasar -pasar kepasaran -pasar memasarkan -pasar memasarkannya -pasar pemasar -pasar pemasaran -pasar pemasarnya -pasar perpasaran -pasara dipasarakan -pasif memasifkan -pasir berpasir -pasok dipasok -pasok dipasoknya -pasok memasok -pasok memasoknya -pasok pemasok -pasok pemasokan -pasok pemasoknya -paspor berpaspor -pasrah berpasrah -pasrah dipasrahi -pasrah dipasrahkan -pasrah kepasrahan -pasrah memasrahkan -pasteurisasi dipasteurisasi -pasti dipastikan -pasti dipastikannya -pasti kepastian -pasti kepastikan -pasti memastian -pasti memastikan -pasti memastikannya -pasti pemasti -pasti pemastian -pastor kepastoran -pasu memasukan -pasu memasukannya -pasu pemasukan -pasu pemasukannya -pasu sepasukan -pasuk memasuk -pasuk memasukan -pasuk memasuki -pasuk memasukkan -pasuk memasukkannya -pasuk pemasuk -pasuk pemasukan -pasuk pemasukkan -pasuk sepasukan -pasung dipasung -pasung memasung -pasung memasungnya -pasung pemasungan -pasung terpasung -patah dipatahkan -patah mematahkan -patah mematahkannya -patah pepatah -patah sepatah -patah terpatahkan -patang mematangkan -patang mematangkannya -patang pematang -patang pematangan -paten dipatenkan -paten dipatenkannya -paten mematenkan -paten mematenkannya -paten mempatenkan -paten pematenan -pater pemateri -pati berpati -pati dipati -pati dipatikan -pati kepatian -pati mematikan -pati mematikannya -pati pemati -pati sepati -patih kepatihan -patik dipatikan -patik mematik -patik mematikan -patik pematik -patok berpatok -patok berpatokan -patok dipatok -patok dipatoknya -patok mematok -patok mematoknya -patok pematokan -patok terpatok -patri dipatri -patri dipatrikan -patri mematri -patri mematrikan -patri terpatri -patroli berpatroli -patroli dipatroli -patroli mematroli -patuh dipatuhi -patuh kepatuhan -patuh mematuhi -patuk dipatuk -patuk mematuk -patung berpatungan -patung mematung -patung pematung -patungan berpatungan -patut kepatutan -patut mematut -patut sepatutnya -paus kepausan -paut terpaut -pawai berpawai -paya pepaya -payah kepayahan -payang kepayang -payet berpayet -payu memayu -payudara berpayudara -payung berpayung -payung dipayungi -payung memayungi -payung pemayung -pe bepe -pe dipekan -pe meme -pe memei -pe pepe -pe perpekan -pe perpekannya -pe sepe -pe sepekan -pe sepekannya -pecah berpecah -pecah dipecah -pecah dipecahkan -pecah dipecahkannya -pecah kepecahan -pecah memecah -pecah memecahan -pecah memecahkan -pecah memecahkannya -pecah memecahnya -pecah pemecah -pecah pemecahan -pecah perpecahan -pecah terpecah -pecah terpecahkan -pecah terpecahkannya -pecah terpecahnya -pecat dipecat -pecat dipecatnya -pecat memecat -pecat memecatnya -pecat pemecatan -peci berpeci -pecut dipecut -pecut memecut -pecut pemecut -pecut pemecutan -pecut terpecut -peda kepeda -peda sepeda -peda sepedaan -peda sepedanya -pedang berpedang -pedih kepedihan -pedoman berpedoman -pedoman dipedomani -pedoman memedomani -pedoman mempedomani -peduli dipedulikan -peduli dipedulikannya -peduli kepedulian -peduli memedulikan -peduli memedulikannya -peduli mempedulikan -peduli mempedulikannya -pegah terpegah -pegan memegan -pegan pemegan -pegang berpegang -pegang berpegangan -pegang berpeganglah -pegang dipegang -pegang dipegangi -pegang dipegangnya -pegang kepegang -pegang memegang -pegang memegangi -pegang memegangnya -pegang pemegang -pegang pemegangan -pegang pemegangnya -pegang terpegang -pegawai kepegawaian -pei memei -pejam memejamkan -pejam terpejam -pek dipekan -pek kepek -pek pempek -pek perpekan -pek sepekan -peka kepekaan -peka memekakan -pekak memekakan -pekak memekakkan -pekan dipekan -pekan perpekan -pekan perpekannya -pekan sepekan -pekan sepekannya -pekat kepekatan -pekat sepekat -pekik dipekikkan -pekik memekik -pekik memekikkan -pel dipel -pel kepel -pel penpel -pel sepel -pelan memelankan -pelancar mempelancar -pelanting terpelanting -pelas memelas -pelat berpelat -pelek sepelekan -peleset dipelesetkan -peleset kepeleset -peleset memelesetkan -peleset mempelesetkan -peleset terpeleset -peleset terpelesetnya -pelesir berpelesir -pelesir berpelesiran -pelihara dipelihara -pelihara dipeliharanya -pelihara memelihara -pelihara memeliharanya -pelihara pemelihara -pelihara pemeliharaan -pelihara pemeliharanya -pelihara terpelihara -pelihara terpeliharanya -pelik kepelikan -pelik memeliki -pelik sepelik -pelikan kepelikan -pelintir dipelintir -pelintir memelintir -pelintir pemelintiran -pelintir terpelintir -pelopor dipelopori -pelopor kepeloporan -pelopor memelopori -pelopor mempelopori -pelorot memelorotkan -pelosok dipelosok -pelosok kepelosok -pelosok terpelosok -pelotot dipelototi -pelotot memelototi -peluang berpeluang -peluh berpeluh -peluk berpelukan -peluk dipeluk -peluk dipelukan -peluk dipeluknya -peluk kepelukan -peluk memeluk -peluk memelukan -peluk memeluknya -peluk pemeluk -peluk pemeluknya -peluru berpeluru -pemuda kepemudaan -pen memen -pen menpen -pen pepen -penak kepenak -penalti dipenalti -penampang berpenampang -penasaran kepenasaran -penat kepenatan -pencar berpencar -pencar dipencar -pencar memencar -pencar terpencar -pencet dipencet -pencet kepencet -pencet memencet -pencet memencetnya -pencet pemencetan -pencil terpencil -pencil terpencilnya -penda dipenda -pendam dipendam -pendam dipendamnya -pendam memendam -pendam memendamnya -pendam terpendam -pendam terpendamnya -pendar berpendar -pendar memendar -pendar memendarkan -pendek dipendekkan -pendek kependekan -pendek memendek -pendek memendekkan -pendek pemendek -pendek pemendekan -pendek perpendek -pendek perpendekan -pendek sependek -pendek terpendek -pendeta kependetaan -pending dipending -penduk kependukan -penetrasi berpenetrasi -penetrasi dipenetrasi -penetrasi mempenetrasi -pengacara pengacaranya -pengang dipengang -pengang memengang -pengang pemengang -pengaruh bepengaruh -pengaruh berpengaruh -pengaruh berpengaruhnya -pengaruh dipengaruh -pengaruh dipengaruhi -pengaruh memengaruhi -pengaruh mempengaruh -pengaruh mempengaruhi -pengaruh terpengaruh -pengaruh terpengaruhi -pengaruh terpengaruhnya -penggal dipenggal -penggal memenggal -penggal memenggalnya -penggal pemenggal -penggal pemenggalan -penggal sepenggal -penggal terpenggal -penghulu kepenghuluan -pengin kepengin -penis berpenis -penjara dipenjara -penjara dipenjarakan -penjara dipenjarakannya -penjara dipenjaranya -penjara kepenjaraan -penjara memenjara -penjara memenjarakan -penjara memenjarakannya -penjara pemenjaraan -penjara terpenjara -pental mementalkan -pental terpental -pental terpentalnya -pentas berpentas -pentas dipentas -pentas dipentaskan -pentas mementaskan -pentas pementasan -penting dipentingkan -penting kepenting -penting kepentingan -penting mementingkan -penting sepenting -penting terpenting -penting terpentingnya -penuh dipenuh -penuh dipenuhi -penuh kepenuhan -penuh memenuh -penuh memenuhi -penuh pemenuh -penuh pemenuhan -penuh sepenuh -penuh sepenuhnya -penuh terpenuh -penuh terpenuhi -pepes dipepes -pepet dipepet -pepet dipepetkan -pepet kepepet -pepet memepet -pepet memepetkan -pepet memepetnya -pepet terpepet -per beperan -per berperan -per berperi -per memerkan -per pemeran -per peper -per seper -per seperi -per terperi -pera keperakan -pera menpera -pera pepera -perah diperah -perah memerah -perah memerahkan -perah memerahnya -perah pemerah -perah pemerahan -perahu berperahu -perak keperakan -perak seperak -peran beperan -peran berperan -peran berperanan -peran berperannya -peran diperankan -peran diperankannya -peran memerankan -peran memerankannya -peran pemeran -peran pemerannya -perang beperang -perang berperang -perang diperangi -perang memerangi -perang pemerangan -perang peperangan -perang perperangan -perangah terperangah -perangai berperangai -perangai memerangai -perangkap diperangkap -perangkap memerangkap -perangkap terperangkap -perangkap terperangkapnya -perangkat berperangkat -perangkat diperangkat -perangkat seperangkat -perangkat terperangkat -peranjat terperanjat -peras berperasi -peras diperas -peras diperasnya -peras memeras -peras memerasnya -peras pemeras -peras pemerasan -perat memperat -perat pemeratan -perata memeratakan -perata pemerataan -perban diperban -perban diperbankan -perca kepercaan -percaya dipercaya -percaya dipercayai -percaya dipercayakan -percaya dipercayanya -percaya kepercaya -percaya kepercayaan -percaya memercayai -percaya memercayakan -percaya memercayakannya -percaya mempercaya -percaya mempercayai -percaya mempercayakan -percaya mempercayakannya -percaya terpercaya -percaya terpercayanya -percik diperciki -percik dipercikkan -percik memercik -percik memercikan -percik memercikkan -percik sepercik -percik terpercik -perdata keperdataan -perempuan keperempuanan -peretel dipereteli -peretel memereteli -peretel mempereteli -performa berperforma -pergi bepergian -pergi berpergian -pergi kepergian -pergok dipergoki -pergok kepergok -pergok memergoki -pergok terpergok -perhati diperhatian -perhati diperhatikan -perhati diperhatikannya -perhati memerhatikan -perhati memerhatikannya -perhati memperhatian -perhati memperhatikan -perhati memperhatikannya -perhati meperhatikan -perhati pemerhati -perhati terperhatikan -peri berperi -peri diperikan -peri memerikan -peri memperikan -peri pemerian -peri seperi -peri terperi -peri terperikan -perian pemerian -perih keperihan -perih memerihkan -perih pemerihan -perikemanusiaan berperikemanusiaan -periksa diperiksa -periksa diperiksakan -periksa diperiksanya -periksa memeriksa -periksa memeriksaan -periksa memeriksakan -periksa memeriksakannya -periksa memeriksanya -periksa pemeriksa -periksa pemeriksaan -periksa pemeriksanya -periksa terperiksa -perilaku berperilaku -perin menperin -perinci diperinci -perinci memerinci -perinci memperinci -perinci terperinci -pering diperingan -pering memperingan -peringkat berperingkat -peringkat diperingkat -peringkat diperingkatkan -peringkat keperingkat -peringkat memeringkat -peringkat memeringkatkan -peringkat memperingkatkan -peringkat pemeringkat -peringkat pemeringkatan -perintah diperintah -perintah diperintahkan -perintah diperintahkannya -perintah memerintah -perintah memerintahan -perintah memerintahkan -perintah memerintahkannya -perintah memerintahnya -perintah memperintahkan -perintah pemerintah -perintah pemerintahan -perintah pemerintahkan -perintah pemerintahlah -perintah pemerintahnya -periode diperiode -perisa berperisa -perisa diperisa -perisa pemerisa -perisa pemerisaan -perit seperit -perjaka keperjakaan -perkara beperkara -perkara berperkara -perkara diperkarakan -perkara memerkarakan -perkara memperkarakan -perkara memperkarakannya -perkasa keperkasaan -perkosa diperkosa -perkosa diperkosanya -perkosa memerkosa -perkosa memerkosanya -perkosa memperkosa -perkosa memperkosanya -perkosa pemerkosa -perkosa pemerkosaan -perkosa pemerkosanya -permai mempermaikan -permak dipermak -permak memermak -permak mempermak -permanen dipermanenkan -permanen memermanenkan -permanen memermanenkannya -permanen mempermanenkan -permanen mempermanenkannya -peron peperoni -perosok terperosok -perosok terperosoknya -perosot memerosotkan -perosot pemerosotan -perosot terperosot -pers pempers -pers perpers -persekusi dipersekusi -persen sepersen -persentase dipersentase -persentase dipersentasekan -persepsi berpersepsi -persepsi dipersepsi -persepsi dipersepsikan -persepsi memersepsikan -persepsi mempersepsi -persepsi mempersepsikan -persepsi mempersepsikannya -personifikasi dipersonifikasikan -perspektif berperspektif -persuasi mempersuasi -perut berperut -perut diperut -perut diperutnya -pes berpesan -pes dipesan -pes memes -pes memesan -pes pemesan -pes pepes -pes pepesan -pes perpes -pes terpesan -pesan berpesan -pesan dipesan -pesan dipesankan -pesan dipesannya -pesan memesan -pesan memesankan -pesan memesannya -pesan pemesan -pesan pemesanan -pesan pemesannya -pesan pepesan -pesan perpesanan -pesan terpesan -pesat sepesat -pesat terpesat -pesawat dipesawat -peser sepeser -pesiar berpesiar -pesisir dipesisir -pesona memesona -pesona mempesona -pesona terpesona -pesona terpesonanya -pesta berpesta -pestisida berpestisida -pet memet -pet mepet -pet mepetnya -pet pepet -pet sepet -pet sepeti -peta dipetakan -peta memetakan -peta memetakannya -peta mempetakan -peta pemetaan -peta perpetaan -peta terpetakan -petah memetahkan -petak dipetakan -petak memetakan -petak mempetakan -petak sepetak -petak terpetakan -peti dipetikan -peti pemetikan -peti sepeti -peti sepetinya -petik dipetik -petik dipetikan -petik dipetiknya -petik memetik -petik memetiknya -petik pemetik -petik pemetikan -petik terpetik -peting kepetingan -peting memetingkan -petis dipetisi -petisi dipetisi -petisi dipetisikan -pi dipi -pi dipilah -pi kepi -pi memi -pi memilah -pi meminya -pi pemian -pi pepi -pi sepi -pi sepinya -pi terpilah -piala dipiala -piawai kepiawaian -picik kepicikan -picing memicingkan -picu dipicu -picu dipicunya -picu memicu -picu memicunya -picu pemicu -picu pemicuan -picu pemicunya -picu terpicu -picu terpicunya -pidana dipidana -pidana dipidanakan -pidana dipidanakannya -pidana memidana -pidana memidanakan -pidana memidanakannya -pidana mempidana -pidana mempidanakan -pidana mempidanakannya -pidana pemidanaan -pidana terpidana -pidana terpidananya -pidato berpidato -pidato dipidatokan -pigmen berpigmen -pihak berpihak -pihak berpihaknya -pihak dipihak -pihak dipihaknya -pihak kepihak -pihak memihak -pihak memihaknya -pihak pemihakan -pihak sepihak -pihak sepihaknya -pijah memijah -pijah pemijahan -pijak berpijak -pijak dipijak -pijak dipijaknya -pijak memijak -pijak memijakkan -pijar berpijar -pijar memijarkan -pijat dipijat -pijat memijat -pijat memijatnya -pijat pemijat -pijat pemijatan -pijit dipijit -pijit memijit -pikat dipikat -pikat memikat -pikat memikatnya -pikat pemikat -pikat terpikat -pikir bepikir -pikir berpikir -pikir berpikiran -pikir berpikirlah -pikir berpikirnya -pikir dipikir -pikir dipikiran -pikir dipikirkan -pikir dipikirkannya -pikir dipikirnya -pikir kepikir -pikir kepikiran -pikir memikir -pikir memikiran -pikir memikirkan -pikir memikirkannya -pikir pemikir -pikir pemikiran -pikir perpikir -pikir terpikir -pikir terpikirkan -piknik berpiknik -pikul dipikul -pikul dipikulnya -pikul memikul -pikul memikulnya -pikul pemikul -pikun kepikunan -pil kepil -pil memili -pil pemili -pilah dipilah -pilah memilah -pilah memilahkan -pilah memilahnya -pilah pemilahan -pilah terpilah -pilar berpilar -pilih dipilih -pilih dipilihan -pilih dipilihkan -pilih dipilihlah -pilih dipilihnya -pilih kepilih -pilih memilih -pilih memilihi -pilih memilihkan -pilih memilihnya -pilih pemilih -pilih pemilihan -pilih pemilihnya -pilih terpilih -pilih terpilihlah -pilih terpilihnya -pilin berpilin -pilin dipilin -pilin memilin -pilin terpilin -pilot dipiloti -pilu kepiluan -pilu memilukan -pilu pemilu -pilu pemilunya -pimpin dipimpin -pimpin dipimpinan -pimpin dipimpinnya -pimpin kepimpinan -pimpin memimpin -pimpin memimpinnya -pimpin mempimpin -pimpin pemimpin -pimpin pemimpinan -pimpin pemimpinnya -pimpin pempimpin -pimpin terpimpin -pimping dipimping -pin mempin -pin pemin -pin pempinan -pin pepin -pinang dipinang -pinang meminang -pinang meminangnya -pinang peminang -pinang peminangan -pincang kepincangan -pincang terpincang -pincut kepincut -pincut memincut -pincut terpincut -pinda dipindai -pinda dipindakan -pinda memindai -pinda pemindai -pindah berpindah -pindah berpindahnya -pindah dipindah -pindah dipindahkan -pindah dipindahkannya -pindah dipindahnya -pindah kepindahan -pindah memindah -pindah memindahan -pindah memindahkan -pindah memindahkannya -pindah pemindah -pindah pemindahan -pindah pemindahkan -pindah perpindahan -pindai dipindai -pindai memindai -pindai memindainya -pindai pemindai -pindai pemindaian -pindang pemindangan -pinggan sepinggan -pinggang berpinggang -pinggang dipinggang -pinggang dipinggangnya -pinggang sepinggang -pinggir dipinggir -pinggir dipinggiran -pinggir dipinggirkan -pinggir kepinggir -pinggir meminggirkan -pinggir meminggirkannya -pinggir peminggiran -pinggir terpinggir -pinggir terpinggirkan -pinggir terpinggirkannya -pinggul berpinggul -pingit dipingit -pingkal terpingkal -pingpong dipingpong -pinjam dipinjam -pinjam dipinjami -pinjam dipinjamkan -pinjam dipinjamkannya -pinjam dipinjamnya -pinjam meminjam -pinjam meminjami -pinjam meminjamkan -pinjam meminjamkannya -pinjam meminjamnya -pinjam peminjam -pinjam peminjaman -pinjam peminjamnya -pinta dipinta -pinta meminta -pinta memintai -pinta memintakan -pinta memintanya -pinta peminta -pinta pemintaan -pintal dipintal -pintal memintal -pintal pemintal -pintal pemintalan -pintan memintan -pintar kepintaran -pintar sepintar -pintar terpintar -pintas memintas -pintas pemintas -pintas sepintas -pintu berpintu -pintu dipintu -pipa berpipa -pipa pemipaan -pipa perpipaan -pipi berpipi -pipih dipipihkan -pipil pemipil -piring memiringkan -piring sepiring -pirsa pemirsa -pirsa pemirsanya -pisah berpisah -pisah berpisahnya -pisah dipisah -pisah dipisahkan -pisah dipisahkannya -pisah memisah -pisah memisahkan -pisah memisahkannya -pisah pemisah -pisah pemisahan -pisah perpisahan -pisah terpisah -pisah terpisahkan -pisah terpisahnya -pisau berpisau -pistol berpistol -pita berpita -pita memita -pita pepita -piting dipiting -piting kepiting -piting kepitingnya -piting memiting -planet keplanetan -plastik seplastik -platform berplatform -pleno diplenokan -pleno memplenokan -plester diplester -plester memplester -plonco perploncoan -plot diplot -plot diplotkan -plot memplot -plot memplotnya -po dipo -po kepo -po memo -po memonya -po mepo -po pepo -po sepoi -pohon berpohon -pohon memohon -pohon memohonkan -pohon pemohon -pohon pemohonan -pohon pemohonnya -pohon pepohonan -poin kepoin -pojok dipojok -pojok dipojokan -pojok dipojokkan -pojok memojokan -pojok memojokkan -pojok memojokkannya -pojok terpojok -pojok terpojokkan -pok kepok -pola berpola -pola terpola -polarisasi mempolarisasi -polarisasi terpolarisasi -polemik berpolemik -polemik dipolemikan -polemik dipolemikkan -poles dipoles -poles dipolesnya -poles memoles -poles memoleskan -poles memolesnya -poles pemoles -poles pemolesan -poles terpoles -poligam berpoligami -poligam dipoligami -poligami berpoligami -poligami dipoligami -polis kepolisan -polis kepolisi -polisi dipolisikan -polisi kepolisi -polisi kepolisian -polisi mempolisikan -polisi pemolisian -polisi perpolisian -politik berpolitik -politik berpolitiknya -politik dipolitikkan -politik kepolitikan -politik perpolitikan -politis dipolitisi -politisasi dipolitisasi -politisasi memolitisasi -politisasi mempolitisasi -politisasi terpolitisasi -polos kepolosan -polusi berpolusi -polusi terpolusi -pompa dipompa -pompa dipompakan -pompa memompa -pompa memompakan -pompa memompanya -pompa mempompa -pompa pemompa -pompa pemompaan -pompa perpompaan -pompa terpompa -pompong kepompong -pompong kepompongan -pon berponi -pon memon -ponakan keponakan -ponakan keponakannya -pondok pemondokan -pongah kepongahan -poni berponi -popor dipopor -popularitas kepopularitasan -populasi berpopulasi -populer dipopulerkan -populer dipopulerkannya -populer kepopuleran -populer memopulerkan -populer mempopulerkan -populer mempopulerkannya -populer sepopuler -populer terpopuler -porak-poranda diporak-porandakan -porak-poranda memorak-porandakan -porak-poranda memporak-porandakan -pori berpori -pori memori -pori memorinya -poros berporos -porsi berporsi -porsi perporsi -porsi seporsi -portal diportal -portal pemortalan -pos dipos -pos diposkan -pos memos -pos perposan -pose berpose -posisi berposisi -posisi diposisi -posisi diposisikan -posisi diposisinya -posisi keposisi -posisi memosisikan -posisi memosisikannya -posisi memposisikan -posisi memposisikannya -posisi pemosisian -postur berpostur -potensi bepotensi -potensi berpotensi -potensi berpotensinya -potensial berpotensial -potret dipotret -potret dipotretnya -potret memotret -potret memotretnya -potret pemotret -potret pemotretan -potret terpotret -praduga berpraduga -prajurit keprajuritan -prakarsa diprakarsai -prakarsa memprakarsai -prakarsa pemprakarsa -prakarsa pemrakarsa -prakarsa pemrakarsanya -prakira diprakirakan -prakira memprakirakan -praktik berpraktik -praktik dipraktikan -praktik dipraktikkan -praktik dipraktikkannya -praktik mempraktikan -praktik mempraktikkan -praktik mempraktikkannya -praktikan dipraktikan -praktikan mempraktikan -praktikan mempraktikannya -praktis kepraktisan -praktis sepraktis -pramuka kepramukaan -praperadilan dipraperadilan -praperadilan dipraperadilankan -praperadilan mempraperadilankan -prasangka berprasangka -predikat berpredikat -prediksi berprediksi -prediksi diprediksi -prediksi diprediksikan -prediksi diprediksinya -prediksi memprediksi -prediksi memprediksikan -prediksi memprediksinya -prediksi memrediksi -prediksi meprediksi -prediksi terprediksi -prediksi terprediksikan -prei seprei -pres dipres -pres kepres -pres kepresnya -pres pepres -pres perpres -pres perpresnya -presentasi dipresentasikan -presentasi mempresentasikan -presentasi mempresentasikannya -presiden kepresiden -presiden kepresidenan -presiden kepresidennya -presisi berpresisi -prestasi beprestasi -prestasi berprestasi -presto dipresto -pretel dipreteli -pretel mempreteli -pretensi berpretensi -pribadi kepribadian -prihatin diprihatinkan -prihatin keprihatin -prihatin keprihatinan -prihatin keprihatinnya -prihatin memprihatinkan -prihatin memprihatinkannya -prihatin memrihatinkan -prima seprima -prinsip berprinsip -prioritas diprioritas -prioritas diprioritaskan -prioritas memprioritas -prioritas memprioritaskan -prioritas memprioritaskannya -prioritas memrioritaskan -prit sepriti -privatisasi diprivatisasi -privatisasi memprivatisasi -pro pempro -produk diproduk -produk memproduk -produksi berproduksi -produksi berproduksinya -produksi diproduksi -produksi diproduksikan -produksi diproduksinya -produksi memproduksi -produksi memproduksikan -produksi memproduksinya -produksi memroduksi -produksi meproduksi -produksi pemroduksi -produksi terproduksi -produktif seproduktif -produktif terproduktif -produktivitas berproduktivitas -produser diproduseri -produser memproduseri -profesi beprofesi -profesi berprofesi -profesi keprofesian -profesi seprofesi -profesi seprofesinya -profesional keprofesionalan -profesional seprofesional -profil berprofil -program diprogram -program diprogramkan -program memprogram -program memprogramkan -program memprogramnya -program memrogram -program memrogramkan -program pemprograman -program pemrogram -program pemrograman -program terprogram -proklamasi diproklamasikan -proklamasi memproklamasikan -promosi berpromosi -promosi dipromosi -promosi dipromosikan -promosi dipromosikannya -promosi mempromosi -promosi mempromosikan -promosi mempromosikannya -promosi memromosikan -promosi terpromosi -promosi terpromosikan -promotor dipromotori -promotor mempromotori -prop pemprop -propaganda dipropagandakan -propaganda mempropagandakan -proses berproses -proses diproses -proses diprosesnya -proses memproses -proses memprosesnya -proses memroses -proses memrosesnya -proses pemprosesan -proses pemroses -proses pemrosesan -proses terproses -prosesor berprosesor -prospek berprospek -prospek diprospek -protein berprotein -proteksi diproteksi -proteksi memproteksi -proteksi terproteksi -protes diprotes -protes memprotes -protes memprotesnya -protes memrotes -protes pemprotes -protes pemrotes -protokol keprotokolan -protokoler keprotokoleran -provinsi diprovinsi -provinsi seprovinsi -provokasi diprovokasi -provokasi memprovokasi -provokasi memprovokasinya -provokasi memrovokasi -provokasi terprovokasi -proyek diproyekkan -proyeksi diproyeksi -proyeksi diproyeksikan -proyeksi memproyeksi -proyeksi memproyeksikan -proyeksi memproyeksikannya -proyeksi memroyeksikan -proyeksi terproyeksi -psi pepsi -puak memuakkan -puas berpuas -puas dipuaskan -puas kepuasan -puas memuaskan -puas memuaskannya -puas pemuas -puas pemuasan -puas sepuas -puas sepuasnya -puas terpuaskan -publik dipublik -publikasi dipublikasi -publikasi dipublikasikan -publikasi dipublikasikannya -publikasi mempublikasi -publikasi mempublikasikan -publikasi mempublikasikannya -publikasi memublikasi -publikasi memublikasikan -publikasi memublikasikannya -publikasi terpublikasi -publikasi terpublikasikan -pucat memucat -pucuk sepucuk -pudar memudar -pudar memudarkan -pudar memudarnya -pudar pemudaran -pudi pemudi -pugar dipugar -pugar memugar -pugar pemugaran -puisi berpuisi -puja dipuja -puja memuja -puja memujanya -puja pemuja -puja pemujaan -puja pemujanya -puji dipuji -puji dipujinya -puji memuji -puji memujinya -puji terpuji -puji terpujilah -puji terpujinya -pukat pemukatan -pukau memukau -pukau memukaunya -pukau terpukau -pukul dipukul -pukul dipukuli -pukul dipukulkan -pukul dipukulnya -pukul memukul -pukul memukuli -pukul memukulkan -pukul memukulkannya -pukul memukulnya -pukul pemukul -pukul pemukulan -pukul terpukul -pukul terpukulnya -pul kepulan -pul kepulkan -pul sepul -pula memulai -pula pemula -pulai memulai -pulai memulainya -pulan kepulan -pulang berpulang -pulang berpulangnya -pulang dipulang -pulang dipulangkan -pulang dipulangkannya -pulang kepulangan -pulang memulangkan -pulang memulangkannya -pulang pemulang -pulang pemulangan -pulang sepulang -pulang sepulangnya -pulang terpulang -pulas dipulas -pulas memulas -pulas memulaskan -pulas memulasnya -pulas pemulas -pulau dipulau -pulau kepulau -pulau kepulauan -pulih dipulihkan -pulih dipulihkannya -pulih kepulihan -pulih memulih -pulih memulihan -pulih memulihkan -pulih memulihkannya -pulih pemulih -pulih pemulihan -pulih terpulihkan -pulik memuliki -pulsa sepulsa -puluh berpuluh -puluh sepuluh -puluh sepuluhan -puluh sepuluhnya -pulung memulung -pulung pemulung -pulut pemulutan -pumpun memumpuni -pun mempuni -punah kepunahan -puncak berpuncak -puncak dipuncak -puncak dipuncaki -puncak memuncak -puncak memuncaki -puncak memuncaknya -puncak pemuncak -pundak dipundak -pundak dipundaknya -pung kepung -pung kepungan -punggung dipunggung -punggung dipunggungnya -punggung memunggungi -punggung sepunggung -pungkas dipungkasi -pungkas memungkas -pungkas memungkasi -pungkas pemungkas -pungkur dipungkuri -pungut dipungut -pungut dipunguti -pungut dipungutnya -pungut kepungut -pungut memungut -pungut memunguti -pungut memungutnya -pungut pemungut -pungut pemungutan -pungut terpungut -puntir memuntir -puntir terpuntir -puntung sepuntung -punuk berpunuk -pupu pemupukan -pupu sepupu -pupu sepupunya -pupuk dipupuk -pupuk memupuk -pupuk memupuknya -pupuk pemupukan -pupuk terpupuk -pupus dipupuskan -pupus memupus -pupus memupuskan -pura berpura -pura mempura -pura-pura berpura-pura -pura-pura berpura-puralah -pura-pura kepura-puraan -purbakala kepurbakalaan -puruk terpuruk -puruk terpuruknya -purus pemurus -purut memurut -pus pempus -pus perpus -pusar berpusar -pusat berpusat -pusat dipusat -pusat dipusatkan -pusat kepusat -pusat memusat -pusat memusatkan -pusat memusatkannya -pusat pemusatan -pusat terpusat -pusat terpusatkan -pusat terpusatnya -pusing dipusingkan -pusing kepusingan -pusing memusingkan -pusing memusingkannya -pusta perpustaan -pusta perpustakan -pustaka kepustakaan -pustaka pemustaka -pustaka perpustakaan -putar berputar -putar berputarnya -putar diputar -putar diputaran -putar diputarkan -putar diputarnya -putar keputaran -putar memutar -putar memutari -putar memutarkan -putar memutarnya -putar pemutar -putar pemutaran -putar pemutarnya -putar perputaran -putar seputar -putar seputaran -putar seputarnya -putar terputar -puter pemuteran -putih diputihkan -putih keputih -putih keputihan -putih memutih -putih memutihkan -putih memutihkannya -putih pemutih -putih pemutihan -putih seputih -putra berputra -putra diputra -putra seputra -putu keputuan -putu memutukan -putus berputus -putus diputus -putus diputusan -putus diputusi -putus diputuskan -putus diputuskannya -putus diputusnya -putus keputus -putus keputusan -putus memutus -putus memutusan -putus memutuskan -putus memutuskannya -putus memutusnya -putus pemutus -putus pemutusan -putus terputus -putus terputusnya -ra bera -ra berai -ra berra -ra dira -ra kera -ra kerai -ra mera -ra merai -ra pelra -ra pemra -ra pera -ra perai -ra peranya -ra sera -ra serai -ra serakan -ra terra -raba diraba -raba meraba -raba merabanya -raba peraba -raba perabaan -raban beraban -rabat kerabat -rabat kerabatnya -rabet merabet -rabi serabi -rabung berabung -rabut serabut -rabut serabutan -rabut serabutnya -racau meracau -raci peracikan -racik diracik -racik diraciknya -racik meracik -racik meraciknya -racik peracik -racik peracikan -racun beracun -racun beracunnya -racun diracun -racun diracuni -racun keracunan -racun meracun -racun meracuni -racun peracunan -rad berad -rad beradi -rad penrad -rad peradi -rad serad -rada berada -rada beradaan -rada beradai -rada beradanya -rada merada -rada perada -radah peradah -radai beradai -radang meradang -radang peradangan -radang teradang -radar beradar -radar peradaran -raden keradenan -radi beradi -radi peradi -radiasi diradiasi -radiasi meradiasi -radikalisasi diradikalisasi -radikalisasi meradikalisasi -radin peradin -radius beradius -radu beradu -radu peraduan -raga beraga -raga beragai -raga peraga -raga peragaan -raga peragakan -raga peraganya -ragam beragam -ragam beragaman -ragam beragamnya -ragam keragaman -ragam meragamkan -ragam seragam -ragam seragamkan -ragam seragamnya -ragi peragi -ragi peragian -ragil keragilan -ragu diragukan -ragu diragukannya -ragu keraguan -ragu meragu -ragu meragukan -ragu meragukannya -ragu peragu -raguk diragukan -raguk meragukan -rahang berahang -rahap berahap -rahasia berahasia -rahasia dirahasiakan -rahasia dirahasiakannya -rahasia kerahasiaan -rahasia merahasiakan -rahasia merahasiakannya -rahim kerahiman -rahmat dirahmati -rahmat kerahmatan -rahmat merahmati -rahu perahu -rahu perahunya -rai berai -rai kerai -rai merai -rai perai -rai peraian -rai serai -raih beraih -raih diraih -raih diraihnya -raih meraih -raih meraihnya -raih peraih -raih peraihan -raih peraihnya -raja diraja -raja dirajai -raja kerajaan -raja meraja -raja merajai -rajah dirajah -rajah merajah -rajalela merajalela -rajalela merajalelanya -rajam dirajam -rajam merajam -rajang dirajang -rajang merajang -rajang perajang -rajin kerajinan -rajin pengrajin -rajin pengrajinnya -rajin perajin -rajin perajinnya -rajuk merajuk -rajut dirajut -rajut merajut -rajut merajutnya -rajut perajut -rak berak -rak kerak -rak keraknya -rak merak -rak perak -rak peraknya -rak serak -rak serakan -raka meraka -raka merakai -rakah serakah -rakit berakit -rakit dirakit -rakit dirakitnya -rakit merakit -rakit merakitnya -rakit perakit -rakit perakitan -rakit perakitnya -raksasa meraksasa -raksi beraksi -raksi beraksilah -raksi beraksinya -rakus kerakusan -rakyat kerakyatan -rakyat merakyat -ralat diralat -ralat diralatnya -ralat meralat -ralat meralatnya -ralat peralat -ralat peralatan -ram beram -ram keram -ram meram -ram seram -ram seramnya -rama berama -rama beramai -rama perama -rama serama -rama seramai -ramah beramah -ramah keramah -ramah keramahan -ramah seramah -ramal beramal -ramal diramal -ramal diramalkan -ramal meramal -ramal meramalkan -ramal peramal -ramal peramalan -rambah dirambah -rambah kerambah -rambah merambah -rambah merambahnya -rambah perambah -rambah perambahan -ramban peramban -ramban perambannya -rambat merambat -rambat merambatnya -rambat perambatan -rambu perambuan -rambut berambut -rambut berrambut -ramin beramin -rampak berampak -rampang serampang -rampang serampangan -rampas dirampas -rampas dirampasnya -rampas merampas -rampas merampasnya -rampas perampas -rampas perampasan -rampas serampas -ramping dirampingkan -ramping kerampingan -ramping merampingkan -ramping perampingan -ramping seramping -rampok dirampok -rampok dirampoknya -rampok kerampokan -rampok merampok -rampok merampoknya -rampok perampok -rampok perampokan -rampok perampokkan -rampok perampoknya -rampung dirampungkan -rampung dirampungkannya -rampung merampung -rampung merampungkan -rampung merampungkannya -rampung perampungan -ramu diramu -ramu meramu -ramu meramunya -ramu peramu -rana kerana -rana merana -rana peranakan -rana seranai -ranah diranah -ranah keranah -ranap peranap -rancah perancah -rancak perancak -rancang dirancang -rancang dirancangkan -rancang dirancanglah -rancang dirancangnya -rancang merancang -rancang merancangnya -rancang perancang -rancang perancangan -rancang perancangnya -rancu kerancuan -rancu merancukan -randa beranda -randa berandai -randa berandanya -randa keranda -randai berandai -rang berang -rang berangan -rang berangkan -rang berangnya -rang kerang -rang kerangan -rang kerangkan -rang kerangnya -rang merang -rang merangkan -rang penyrang -rang perang -rang perangan -rang perangi -rang perangkan -rang perangnya -rang serang -rang serangan -rang serangkan -rang serangnya -rangai perangai -rangai perangainya -rangai serangai -rangam serangam -rangas berangas -rangas berangasan -rangga serangga -ranggas meranggas -ranggung beranggung -rangin berangin -rangin merangin -rangin perangin -rangin peranginan -rangka berangka -rangka berangkai -rangka dirangkai -rangka kerangka -rangka kerangkanya -rangka merangka -rangka merangkai -rangka perangka -rangka perangkai -rangka serangkai -rangkai berangkai -rangkai dirangkai -rangkai dirangkaian -rangkai dirangkaikan -rangkai merangkai -rangkai merangkaikan -rangkai merangkainya -rangkai perangkai -rangkai perangkaian -rangkai serangkai -rangkai serangkaian -rangkak merangkak -rangkak merangkaknya -rangkap dirangkap -rangkap merangkap -rangkap perangkap -rangkap perangkapan -rangkap perangkapnya -rangking dirangking -rangking merangking -rangkul berangkulan -rangkul dirangkul -rangkul dirangkulnya -rangkul merangkul -rangkul merangkulkan -rangkul merangkulnya -rangkum dirangkum -rangkum merangkum -rangkum merangkumkan -rangkum merangkumnya -rangkut berangkutan -rangsang dirangsang -rangsang merangsang -rangsang merangsangnya -rangsang perangsang -rangsang perangsangan -rani berani -rani beranikan -rani beranilah -rani beraninya -rani dirani -rani merani -ranjang beranjang -ranjang diranjang -ranjang keranjang -ranjang keranjangnya -ranjang seranjang -ranji keranji -ranjing keranjingan -rantai berantai -rantai berantainya -rantai dirantai -rantai merantai -rantai merantainya -rantam berantam -rantas berantas -rantau merantau -rantau perantau -rantau perantauan -rantau serantau -ranti meranti -ranti peranti -ranti perantinya -ranting beranting -rap berap -rap berapi -rap kerap -rap kerapnya -rap merapi -rap perapi -rap serap -rap serapan -rap serapi -rap serapnya -rapah serapah -rapah serapahnya -rapal dirapalkan -rapal merapal -rapal merapalkan -rapat dirapat -rapat dirapatkan -rapat kerapatan -rapat merapat -rapat merapatkan -rapat merapatkannya -rapat merapatnya -rapat perapat -rapat perapatan -rapat serapat -rapel dirapel -rapel merapel -rapi berapi -rapi dirapikan -rapi kerapian -rapi merapi -rapi merapikan -rapi merapikannya -rapi perapi -rapi perapian -rapi serapi -rapik dirapikan -rapik merapikan -rapor berapor -rapu kerapu -rapu merapu -rapuh kerapuh -rapuh kerapuhan -rapuh merapuhkan -rapuh serapuh -rapun berapun -rapung serapung -rarak berarak -rarak perarakan -ras beras -ras berasan -ras berasnya -ras keras -ras kerasan -ras keraslah -ras kerasnya -ras meras -ras meraskan -ras peras -ras perasan -ras perasi -ras serasan -ras serasi -rasa berasa -rasa berasalah -rasa dirasa -rasa dirasakan -rasa dirasakannya -rasa dirasanya -rasa kerasa -rasa kerasaan -rasa kerasanya -rasa merasa -rasa merasai -rasa merasakan -rasa merasakannya -rasa perasa -rasa perasaan -rasa serasa -rasai merasai -rasam berasam -rasan berasan -rasan kerasan -rasan perasan -rasan perasannya -rasan serasan -rasi perasi -rasi serasi -rasional dirasionalkan -rasional merasionalkan -rasionalisasi dirasionalisasi -rasionalisasi dirasionalisasikan -rasionalisasi merasionalisasi -rasionalisasi merasionalisasikan -rasuk dirasuki -rasuk kerasukan -rasuk merasuk -rasuk merasuki -rasul kerasulan -rat berat -rat beratan -rat berati -rat beratkan -rat beratlah -rat beratnya -rat kerat -rat merat -rat serat -rat seratnya -rata berata -rata diratakan -rata kerata -rata kerataan -rata merata -rata meratakan -rata meratakannya -rata meratanya -rata perataan -rata serata -ratah beratahan -ratap beratap -ratap beratapkan -ratap diratapi -ratap meratap -ratap meratapi -ratifikasi diratifikasi -ratifikasi diratifikasinya -ratifikasi meratifikasi -ratifikasi meratifikasinya -ratu peratuan -ratus beratus -ratus meratus -ratus seratus -ratus seratusan -rau berau -raung meraung -raup diraup -raup diraupnya -raup meraup -raup peraup -raut diraut -rawa berawa -rawa merawa -rawa perawakan -rawa perawakannya -rawah berawah -rawak berawak -rawak berawaknya -rawak perawakan -rawak serawak -rawan berawan -rawan kerawanan -rawan perawan -rawan perawannya -rawang kerawang -rawang merawang -rawang perawang -rawat dirawat -rawat dirawatnya -rawat merawat -rawat merawatnya -rawat perawat -rawat perawatan -rawat perawatnya -rawi berawi -rawi merawikan -rawit pengrawit -raya dirayakan -raya dirayakannya -raya merayakan -raya merayakannya -raya peraya -raya perayaan -raya seraya -rayah berayah -rayah berayahkan -rayah dirayah -rayap merayap -rayap merayapi -rayu dirayu -rayu merayu -rayu merayunya -rayu perayu -rayu serayu -razia dirazia -razia merazia -re bere -re dire -re kere -re mere -re merekan -re pere -re sere -re serei -re serelah -re terre -reak mereak -reaksi bereaksi -reaksi direaksi -reaksi mereaksi -reaksi pereaksi -real sereal -realisasi direalisasi -realisasi direalisasikan -realisasi direalisasikannya -realisasi merealisasi -realisasi merealisasikan -realisasi merealisasikannya -realisasi perealisasian -realisasi terrealisasi -realisasi terrealisasikan -realistis serealistis -realokasi direalokasi -realokasi direalokasikan -realokasi merealokasi -realokasi merealokasikan -reba perebakan -rebah direbahkan -rebah merebah -rebah merebahkan -rebak merebak -rebak merebakkan -rebak merebaknya -rebak perebakan -rebek pengrebekan -rebes berebes -reboisasi direboisasi -reboisasi mereboisasi -rebus direbus -rebus merebus -rebus merebusnya -rebus perebusan -rebut berebut -rebut berebutan -rebut direbut -rebut direbutkan -rebut direbutnya -rebut merebut -rebut merebutkan -rebut merebutnya -rebut perebut -rebut perebutan -rebut perebutkan -recok direcoki -recok merecoki -reda bereda -reda direda -reda diredakan -reda diredakannya -reda mereda -reda meredakan -reda meredakannya -reda meredanya -reda pereda -reda peredaan -redaksi keredaksian -redam diredam -redam meredam -redam meredamkan -redam meredamnya -redam peredam -redam peredaman -redefinisi meredefinisi -reduksi direduksi -reduksi mereduksi -reduksi mereduksinya -redup diredupkan -redup meredup -redup meredupkan -redup meredupnya -redup peredupan -redusir meredusir -reekspor direekspor -referensi direferensikan -referensi mereferensi -referensi mereferensikan -refleks berefleksi -refleks merefleksi -refleksi berefleksi -refleksi direfleksikan -refleksi merefleksi -refleksi merefleksikan -refleksi merefleksikannya -reformasi bereformasi -reformasi direformasi -reformasi mereformasi -regang diregangkan -regang keregangan -regang meregang -regang meregangkan -regang meregangnya -regang peregangan -regenerasi beregenerasi -regenerasi diregenerasi -regenerasi meregenerasi -register beregister -register diregister -registrasi beregistrasi -registrasi diregistrasi -registrasi diregistrasikan -registrasi meregistrasi -registrasi meregistrasikan -regu beregu -reguk direguk -reguk mereguk -regulasi diregulasi -regulasi meregulasi -rehab direhab -rehab merehab -rehabilitasi direhabilitasi -rehabilitasi merehabilitasi -rehabilitasi merehabilitasinya -reinkarnasi bereinkarnasi -reja direja -reja mereja -rek berek -rek kerek -rek merek -rek merekan -rek mereknya -reka direka -reka mereka -reka merekakan -reka merekalah -reka merekanya -rekah merekah -rekah merekahnya -rekam direkam -rekam direkaman -rekam direkamnya -rekam merekam -rekam merekamnya -rekam perekam -rekam perekaman -rekam perekamnya -rekam terrekam -rekan merekan -rekapitalisasi merekapitalisasi -rekapitulasi direkapitulasi -rekapitulasi merekapitulasi -rekat direkat -rekat direkatkan -rekat kerekatan -rekat merekat -rekat merekatkan -rekat perekat -rekat perekatnya -rekayasa direkayasa -rekayasa kerekayasaan -rekayasa merekayasa -rekayasa perekayasa -rekayasa perekayasaan -rekening berekening -rekening direkening -rekening direkeningnya -reklamasi direklamasi -reklamasi mereklamasi -rekomendasi direkomendasi -rekomendasi direkomendasikan -rekomendasi direkomendasikannya -rekomendasi merekomendasi -rekomendasi merekomendasikan -rekomendasi merekomendasikannya -rekonsiliasi berekonsiliasi -rekonsiliasi direkonsiliasi -rekonsiliasi merekonsiliasi -rekonstruksi direkonstruksi -rekonstruksi direkonstruksikan -rekonstruksi merekonstruksi -rekonstruksi merekonstruksikan -rekor berekor -rekor perekor -rekreasi berekreasi -rekrut direkrut -rekrut direkrutnya -rekrut merekrut -rekrut merekrutnya -rekrut pengrekrutan -rekrut perekrut -rekrut perekrutan -rekrut perekrutnya -rektor direktor -rektor direktoran -rektor direktori -rel mereli -rel perel -rel pereli -rel terrel -rela direlai -rela direlakan -rela kerelaan -rela merela -rela merelai -rela merelakan -rela merelakannya -rela serela -relai direlai -relai merelai -relaksasi berelaksasi -relaksasi direlaksasi -relaksasi merelaksasi -relaksasi merelaksasikan -relas berelasi -relasi berelasi -reli mereli -reli pereli -religius kereligiusan -relokasi direlokasi -relokasi direlokasikan -relokasi merelokasi -relokasi merelokasikan -relokasi merelokasinya -rem berem -rem direm -rem kerem -rem merem -rem pereman -rem serem -remah meremahkan -remaja diremajakan -remaja keremajaan -remaja meremajakan -remaja peremajaan -remang keremangan -remas beremas -remas diremas -remas meremas -remas meremasnya -rembes merembes -rembes merembeskan -rembes merembesnya -rembes perembesan -rembet merembet -rembet merembetnya -rembuk berembuk -rembuk dirembuk -rembuk dirembukkan -rembuk merembuk -rembuk merembukkan -rembuk perembukan -remeh diremehkan -remeh meremehkan -remeh meremehkannya -remis beremisi -remisi beremisi -rempah berempah -rempah serempah -rempak serempak -remuk diremukkan -remuk meremukkan -renang berenang -renang berenangnya -renang merenangi -renang perenang -rencak direncakan -rencak merencakan -rencana berencana -rencana berencananya -rencana berrencana -rencana direncana -rencana direncanakan -rencana direncanakannya -rencana merencana -rencana merencanakan -rencana merencanakannya -rencana perencana -rencana perencanaan -renda berenda -renda merenda -rendah direndahkan -rendah kerendahan -rendah merendah -rendah merendahkan -rendah merendahkannya -rendah perendahan -rendah serendah -rendah terrendah -rendam berendam -rendam berendamlah -rendam direndam -rendam kerendam -rendam merendam -rendam merendamkan -rendam merendamnya -rendam perendam -rendam perendaman -rendam terrendam -renegosiasi direnegosiasi -renegosiasi merenegosiasi -reng bereng -reng kereng -reng pereng -reng serengan -rengek merengek -renggang direnggangkan -renggang kerenggangan -renggang merenggang -renggang merenggangkan -renggang merenggangnya -renggang perenggangan -renggut direnggut -renggut merenggut -renggut merenggutnya -renggut perenggut -rengkuh direngkuh -rengkuh direngkuhnya -rengkuh merengkuh -rengkuh merengkuhnya -rengkuh perengkuh -rengut merengut -renovasi direnovasi -renovasi direnovasinya -renovasi merenovasi -renovasi merenovasinya -renovasi perenovasian -rentak perentak -rentak serentak -rentak serentaknya -rental dirental -rental merental -rental merentalkan -rentan kerentanan -rentang direntang -rentang direntangkan -rentang merentang -rentang merentangkan -rentas merentas -rentas perentas -rentet berentetan -rentet serentet -rentet serentetan -renti berenti -renung direnungi -renung direnungkan -renung merenung -renung merenungi -renung merenungkan -renung merenungkannya -renung perenungan -renyah kerenyahan -reorganisasi mereorganisasi -reparasi direparasi -reparasi mereparasi -repatriasi direpatriasi -repatriasi direpatriasikan -repatriasi merepatriasi -replika mereplika -replika pereplika -reposisi direposisi -reposisi mereposisi -repot direpotkan -repot kerepotan -repot merepotkan -repot merepotkannya -representasi direpresentasikan -representasi merepresentasi -representasi merepresentasikan -represi direpresi -represi merepresi -reproduksi bereproduksi -reproduksi direproduksi -reproduksi mereproduksi -reputasi bereputasi -resa meresa -resa meresakan -resah diresahkan -resah keresahan -resah meresahkan -resak meresakan -resap diresapi -resap diresapkan -resap meresap -resap meresapi -resap meresapkan -resap peresapan -resek keresek -resep diresepkan -resep meresepkan -resep peresepan -resi beresi -residen keresidenan -residen peresiden -resin beresin -resmi diresmikan -resmi diresmikannya -resmi meresmikan -resmi meresmikannya -resmi pengresmian -resmi peresmian -resolusi beresolusi -resolusi berresolusi -resonansi beresonansi -respons direspons -respons merespons -respons meresponsnya -restitusi direstitusi -restoran direstoran -restorasi direstorasi -restorasi merestorasi -restorasi merestorasinya -restrukturisasi direstrukturisasi -restrukturisasi merestrukturisasi -restu direstui -restu merestui -ret keret -ret meret -ret perret -ret seret -ret seretan -ret seretnya -reta berreta -reta kereta -reta keretakan -reta keretakannya -reta keretanya -retak keretakan -retak meretakkan -retak seretak -retas diretas -retas diretasnya -retas meretas -retas meretasnya -retas peretas -retas peretasan -retas peretasnya -retek keretek -retorika beretorika -retur diretur -reuni bereuni -revaluasi direvaluasi -revaluasi merevaluasi -revisi direvisi -revisi direvisinya -revisi merevisi -revisi merevisinya -revisi perevisian -revitalisasi direvitalisasi -revitalisasi merevitalisasi -revolusi berevolusi -revolusi direvolusi -revolusi merevolusi -rewel kerewelan -ria beria -ria keriaan -ria meria -ria peria -ria seria -riah meriah -riah meriahkan -riah meriahnya -riah periah -riak beriak -rial merial -rial serial -rial serialnya -riam meriam -rian merian -rian serian -riang keriangan -riang meriang -riang periang -riang periangan -riap seriap -rias berias -rias dirias -rias merias -rias perias -ribu beribu -ribu seribu -ribu seribuan -ribu-ribu beribu-ribu -ribut diributkan -ribut keributan -ribut meributkan -ribut meributkannya -rica merica -rica mericanya -rica perica -ricuh kericuhan -rida diridai -rida merida -rida perida -ridi meridian -rileks merilekskan -rilis dirilis -rilis dirilisnya -rilis merilis -rilis merilisi -rilis meriliskan -rilis merilisnya -rilis perilis -rilis perilisan -rim beriman -rim kerim -rim mengrim -rim mengrimkan -rima berima -rima menrima -rima merima -rimbas berimbas -rimbun kerimbunan -rimpi serimpi -rindang perindang -rinding merinding -rindu dirindukan -rindu dirindukannya -rindu kerinduan -rindu merindu -rindu merindukan -rindu merindukannya -rindu perindu -rindu perindukan -ring bering -ring beringan -ring diringi -ring kering -ring keringan -ring keringkan -ring keringnya -ring mering -ring meringan -ring meringkan -ring pering -ring peringan -ring sering -ring seringan -ring seringlah -ring seringnya -ringan beringan -ringan diringankan -ringan keringan -ringan keringanan -ringan meringan -ringan meringankan -ringan meringankannya -ringan peringan -ringan peringanan -ringan seringan -ringgit seringgit -ringin beringin -ringis meringis -ringkas diringkas -ringkas keringkasan -ringkas meringkas -ringkas peringkas -ringkuk meringkuk -ringkus diringkus -ringkus diringkusnya -ringkus meringkus -ringkus meringkusnya -ringkus peringkus -ringkus peringkusan -ringsek meringsek -rintang dirintangi -rintang merintang -rintang merintangi -rintang perintang -rintang perintangan -rintih merintih -rintik berintikan -rintis dirintis -rintis dirintisnya -rintis merintis -rintis merintisnya -rintis perintis -rintis perintisan -rintis perintisnya -ririt seririt -risa perisa -risa perisai -risa perisakan -risa perisalah -risak dirisak -risak merisak -risak perisakan -risalah perisalah -risau dirisaukan -risau kerisauan -risau merisaukan -risau merisaukannya -riset diriset -riset meriset -riset periset -risi berisi -risi berisikan -risi merisi -risik berisik -risik berisikan -risik berisiknya -risiko berisiko -risiko berisikonya -risiko berrisiko -risiko merisikokan -rit berit -rit merit -rit serit -ritus meritus -riuh keriuhan -riuh meriuhkan -riuk periuk -riung meriung -riwayat diriwayatkan -riwayat meriwayatkan -ro bero -ro berolah -ro diro -ro kerokan -ro mero -ro pero -ro perro -ro sero -ro serokan -robek dirobek -robek merobek -robek merobeknya -robek perobek -robek perobekan -roboh dirobohkan -roboh merobohkan -roboh merobohkannya -roboh perobohan -robok kerobokan -robot serobot -robot serobotan -roda beroda -rogoh dirogoh -rogoh merogoh -rogok merogok -rohani kerohanian -rok berok -rok kerok -rok kerokan -rok keroknya -rok serok -rok serokan -roket diroket -roket meroket -roket meroketkan -roket meroketnya -roket peroketan -rokok merokok -rokok merokoklah -rokok merokoknya -rokok perokok -rokok perokoknya -romantis keromantisan -romantis seromantis -rombak berombak -rombak dirombak -rombak dirombaknya -rombak merombak -rombak merombaknya -rombak perombakan -rombak perombakkan -rombong berombongan -rombong serombongan -romong keromong -rompak dirompak -rompak merompak -rompak perompak -rompak perompakan -rompi berompi -rona merona -rona perona -ronda meronda -rong serong -rongga berongga -rongga serongga -rongkong kerongkongan -rongrong dirongrong -rongrong merongrong -ronta meronta -rontgen dirontgen -rontok dirontokkan -rontok kerontokan -rontok merontokan -rontok merontokkan -rontok perontok -ros perosi -rosin kerosin -rosok merosok -rosot merosot -rosot merosotnya -rosot perosotan -rotasi berotasi -rotasi dirotasi -rotasi merotasi -rotasi merotasinya -rotasi perotasian -rua meruakan -rua serua -rua seruakan -ruak keruak -ruak meruak -ruak meruakan -ruak meruaknya -ruak seruak -ruak seruakan -ruang beruang -ruang beruangnya -ruang diruang -ruang diruangan -ruang keruang -ruang keruangan -ruang seruang -ruang seruangan -ruap beruap -ruap meruap -ruap meruapkan -ruas beruas -ruas diruas -ruaya beruaya -rubah berubah -rubah berubahan -rubah berubahlah -rubah berubahnya -rubah dirubah -rubah merubah -rubah merubahnya -rubah perubah -rubah perubahan -ruban beruban -rubung dirubung -rudal dirudal -rudal merudal -rudu berudu -rudu serudukan -ruh keruh -ruh keruhnya -ruh peruh -ruing keruing -ruit seruit -ruji beruji -rujuk berujuk -rujuk dirujuk -rujuk dirujuknya -rujuk merujuk -rujuk merujukkan -rujuk merujuknya -rujuk perujukan -rukun kerukunan -rukun merukunkan -rukyat dirukyat -rukyat perukyat -rum dirum -rum perum -rum serum -rumah berumah -rumah dirumah -rumah dirumahkan -rumah dirumahkannya -rumah dirumahnya -rumah kerumah -rumah kerumahnya -rumah merumahkan -rumah perumah -rumah perumahan -rumah serumah -rumah serumahnya -rumba berumbai -rumbai berumbai -rumen serumen -rumit kerumitan -rumit merumitkan -rumit serumit -rumor dirumorkan -rumor merumorkan -rumpun serumpun -rumput berumput -rumput merumput -rumput merumputnya -rumus dirumuskan -rumus dirumuskannya -rumus merumuskan -rumus merumuskannya -rumus perumus -rumus perumusan -runcing diruncingkan -runcing meruncing -runcing meruncingkan -runcing meruncingnya -runcing peruncingan -runding berunding -runding dirundingkan -runding merundingan -runding merundingkan -runding merundingkannya -runding perunding -runding perundingan -runding perundingnya -runduk merunduk -rundung dirundung -rundung merundung -rundung merundungnya -rundung perundung -rundung perundungan -runggas perunggasan -rungu perungu -runjung berunjung -runtuh diruntuhkan -runtuh keruntuhan -runtuh meruntuhkan -runtuh meruntuhkannya -runtuh peruntuhan -runtun beruntun -runtun beruntunnya -runtut beruntut -runut dirunut -runut merunut -rupa berupa -rupa berupakan -rupa merupa -rupa merupaan -rupa merupakan -rupa perupa -rupa perupakan -rupa serupa -rupa serupanya -rupiah dirupiahkan -rupiah serupiah -rurut berurut -rurut berurutan -rusa berusa -rusa berusai -rusa kerusakan -rusa kerusakannya -rusa merusakan -rusa pengrusakan -rusa penrusakan -rusa perusaan -rusa perusakan -rusak dirusak -rusak dirusaki -rusak dirusaknya -rusak kerusakan -rusak kerusakkan -rusak merusak -rusak merusakan -rusak merusakkan -rusak merusaknya -rusak pengrusak -rusak pengrusakan -rusak pengrusakkan -rusak penrusakan -rusak perusak -rusak perusakan -rusak perusakkan -rusak perusaknya -rusuh dirusuhi -rusuh kerusuhan -rusuh perusuh -rusuk kerusukan -rute berute -rutin dirutinkan -rutin merutinkan -rutin serutin -ruwat diruwat -ruwat meruwat -ruwet keruwetan -ruyak meruyak -ruyung meruyung -sa bersa -sa bersalah -sa besa -sa besalah -sa disa -sa disalah -sa kesalah -sa kesanya -sa mensa -sa menya -sa menyakan -sa menyalah -sa mesa -sa penyalah -sa persaan -sa pesa -sa sesa -sa sesai -saat disaat -saat pesaat -saat sesaat -saat sesaatnya -sabang penyabangan -sabar bersabar -sabar bersabarlah -sabar kesabaran -sabar menyabar -sabar penyabar -sabat persabatan -sabda bersabda -sabda disabdakan -sabel disabel -sabet disabet -sabet disabetkan -sabet disabetnya -sabet menyabet -sabet menyabetkan -sabet menyabetkannya -sabet menyabetnya -sabet penyabet -sabit menyabit -sablon disablon -sablon menyablon -sablon penyablonan -sabot menyabot -sabot penyabot -sabotase disabotase -sabotase mensabotase -sabotase menyabotase -sabotase penyabotase -sabun bersabun -sabun menyabuni -sabun penyabunan -sabung menyabung -sabung penyabung -sabung penyabungan -sabut menyabut -sabut menyabutkan -sabut tersabut -sad persad -sadai menyadai -sadang menyadang -sadang penyadang -sadap disadap -sadap menyadap -sadap menyadapnya -sadap penyadap -sadap penyadapan -sadap tersadap -sadar bersadarkan -sadar disadari -sadar disadarkan -sadar kesadaran -sadar menyadari -sadar menyadarkan -sadar menyadarkannya -sadar penyadaran -sadar tersadar -sadar tersadarkan -sadur disadur -sadur menyadur -safari bersafari -sahabat bersahabat -sahabat bersahabatan -sahabat bersahabatlah -sahabat bersahabatnya -sahabat persahabat -sahabat persahabatan -sahaja bersahaja -sahaja kesahajaan -saham persaham -sahan pensahan -sahih kesahihan -sahut bersahutan -sahut disahut -sahut disahuti -sahut menyahut -sahut menyahuti -sai sesai -saing bersaing -saing bersaingan -saing bersaingnya -saing besaing -saing disaingi -saing menyaingi -saing persaing -saing persaingan -saing pesaing -saing pesaingan -saing pesaingnya -saing tersaingi -sair penyair -sajen sesajen -saji disajikan -saji disajikannya -saji menyajikan -saji menyajikannya -saji penyaji -saji penyajian -saji sesaji -saji sesajian -saji tersaji -saji tersajikan -sak besak -sak menyakan -sak mesak -sak penyaki -sak sesak -sak sesaki -sak sesaknya -sakat menyakatan -saki penyaki -saki sesaki -sakit disakiti -sakit kesakitan -sakit menyakit -sakit menyakiti -sakit menyakitkan -sakit menyakitkannya -sakit penyakit -sakit penyakitan -sakit penyakitnya -sakit pesakitan -sakit sesakit -sakit tersakiti -sakral disakralkan -sakral kesakralan -sakral mensakralkan -saksi bersaksi -saksi disaksikan -saksi disaksikannya -saksi kesaksian -saksi kesaksikan -saksi menyaksikan -saksi menyaksikannya -saksi persaksian -sakti kesaktian -sakti penyakti -saku disaku -sal bersal -sal kesal -sal kesalnya -sal persal -sal sesal -sal sesali -sal sesalkan -sal sesalnya -sala bersala -sala menyala -sala menyalakan -sala menyalakannya -sala menyalanya -sala penyala -sala penyalaan -salah bersalah -salah bersalahnya -salah besalah -salah disalah -salah disalahi -salah disalahkan -salah kesalah -salah kesalahan -salah menyalah -salah menyalahi -salah menyalahkan -salah menyalahkannya -salah penyalah -salah penyalahan -salah persalahkan -salak menyalak -salak menyalakan -salam bersalam -salam bersalaman -salam disalami -salam menyalami -salat disalati -salat disalatkan -salat mensalati -salat mensalatkan -salat menyalati -salat menyalatkan -saldo bersaldo -saleh kesalehan -sali sesali -salib disalib -salib disalibkan -salib menyalib -salib menyalibkan -salib penyaliban -salin bersalin -salin disalin -salin menyalin -salin menyalinnya -salin penyalinan -salin persalinan -salina bersalina -salip disalip -salip disalipnya -salip menyalip -salip menyalipnya -salip tersalip -salju bersalju -salon menyalonkan -salto bersalto -salur disaluran -salur disalurkan -salur disalurkannya -salur menyaluran -salur menyalurkan -salur menyalurkannya -salur penyalur -salur penyaluran -salur penyalurkan -salur penyalurnya -salur tersalur -salur tersalurkan -salur tersalurkannya -salut bersalut -sama bersama -sama bersamaan -sama bersamalah -sama bersamanya -sama besama -sama besamaan -sama disama -sama disamai -sama disamakan -sama kesamaan -sama menyama -sama menyamai -sama menyamakan -sama menyamakannya -sama penyama -sama penyamaan -sama penyamakan -sama persama -sama persamaan -sama sesama -sama sesamanya -samak disamakan -samak menyamakan -samak penyamak -samak penyamakan -saman bersaman -saman menyamankan -samapta kesamaptaan -samar disamarkan -samar menyamar -samar menyamarkan -samar menyamarkannya -samar penyamar -samar penyamaran -samar tersamar -samar tersamarkan -sambang disambangi -sambang menyambangi -sambar disambar -sambar disambarnya -sambar kesambar -sambar menyambar -sambar menyambarnya -sambar tersambar -samben kesamben -sambi disambi -sambi kesambi -sambi menyambi -sambit menyambit -sambung bersambung -sambung bersambungan -sambung disambung -sambung disambungkan -sambung menyambung -sambung menyambungkan -sambung menyambungkannya -sambung menyambungnya -sambung penyambung -sambung penyambungan -sambung persambungan -sambung tersambung -sambung tersambungkan -sambung tersambungnya -sambut bersambut -sambut disambut -sambut disambutnya -sambut menyambut -sambut menyambutnya -sambut penyambut -sambut penyambutan -sambut penyambutnya -sami persami -sampa disampai -sampa disampakan -sampa menyampai -sampa menyampakan -sampa penyampai -sampa sesampai -sampah persampahan -sampai disampai -sampai disampaian -sampai disampaikan -sampai disampaikannya -sampai kesampaian -sampai menyampai -sampai menyampaian -sampai menyampaikan -sampai menyampaikannya -sampai penyampai -sampai penyampaian -sampai penyampaikan -sampai sesampai -sampai sesampainya -sampai tersampaikan -sampai tersampaikannya -sampak disampakan -sampak menyampakan -sampak penyampak -sampakan disampakan -sampakan menyampakan -samping bersampingan -samping disamping -samping disampingi -samping disampingnya -samping kesamping -samping kesampingkan -samping menyamping -samping menyampingkan -sampir disampirkan -sampir menyampirkan -sampir tersampir -sampul bersampul -sampur menyampuri -sampur menyampurkan -samun penyamun -samurai bersamurai -sana bersana -sana besana -sana disana -sana disanalah -sana kesana -sana persana -sana sesana -sana tersana -sanak mensanak -sandal bersandal -sandang disandang -sandang disandangkan -sandang disandangnya -sandang menyandang -sandang menyandangnya -sandang penyandang -sandang penyandangnya -sandang tersandang -sandar bersandar -sandar bersandarkan -sandar bersandarlah -sandar bersandarnya -sandar disandari -sandar disandarkan -sandar menyandar -sandar menyandarkan -sandar tersandar -sandera disandera -sandera disanderanya -sandera menyandera -sandera menyanderanya -sandera penyandera -sandera penyanderaan -sandera penyanderanya -sandera tersandera -sandera tersanderanya -sandi bersandi -sandi bersandikan -sandi disandikan -sandi penyandian -sandi persandian -sanding bersanding -sanding bersandingan -sanding disandingkan -sanding menyandingkan -sanding menyandingkannya -sanding penyandingan -sandiwara bersandiwara -sandung kesandung -sandung menyandung -sandung tersandung -sandung tersandungnya -sang disangkan -sang menyangi -sang menyangkan -sang mesang -sang penyang -sang pesang -sang pesangan -sang tersang -sang tersangkan -sanga kesanga -sanga tersanga -sangan pesangan -sangga disangga -sangga menyangga -sangga menyangganya -sangga penyangga -sangga penyangganya -sanggah disanggah -sanggah menyanggah -sanggah menyanggahnya -sanggah penyanggah -sanggah penyanggahan -sanggama bersanggama -sanggar pesanggaran -sanggerah pesanggerahan -sanggrah pesanggrahan -sanggul bersanggul -sanggul disanggul -sanggul menyanggul -sanggup disanggupi -sanggup kesanggupan -sanggup menyanggupi -sangka disangka -sangka disangkakan -sangka disangkakannya -sangka disangkanya -sangka menyangka -sangka menyangkakan -sangka menyangkanya -sangka persangkaan -sangka tersangka -sangka tersangkakan -sangka tersangkalah -sangka tersangkanya -sangkak disangkakan -sangkak menyangkakan -sangkak tersangkakan -sangkal disangkal -sangkal disangkalnya -sangkal menyangkal -sangkal menyangkalnya -sangkal penyangkal -sangkal penyangkalan -sangkan disangkan -sangkan menyangkan -sangkan tersangkan -sangkut bersangkut -sangkut bersangkutan -sangkut besangkutan -sangkut disangkut -sangkut disangkutkan -sangkut menyangkut -sangkut menyangkutkan -sangkut tersangkut -sangkut tersangkutnya -sangon pesangon -sangon pesangonnya -sangrai disangrai -sangrai menyangrai -sangsi disangsikan -sangsi kesangsian -sangsi menyangsikan -sangsi menyangsikannya -sani bersani -sani persani -sanjung disanjung -sanjung menyanjung -sanjung menyanjungnya -sanjung tersanjung -sanksi disanksi -sanksi disanksikan -santa bersantai -santa sesantai -santai bersantai -santai bersantailah -santai sesantai -santan bersantan -santap bersantap -santap disantap -santap disantapnya -santap menyantap -santap menyantapnya -santap penyantap -santap penyantapnya -santet disantet -santet menyantet -santri kesantrian -santun disantuni -santun kesantunan -santun menyantuni -santun penyantun -santun penyantunan -santun pesantunan -sap disap -sap persap -sapa bersapa -sapa disapa -sapa disapai -sapa disapanya -sapa menyapa -sapa menyapai -sapa menyapanya -sapai disapai -sapai menyapai -sapai menyapaikan -sapi persapian -sapih disapih -sapih menyapih -sapih penyapihan -sapu disapu -sapu disapukan -sapu menyapu -sapu menyapukan -sapu menyapunya -sapu penyapu -sapu penyapuan -sapu tersapu -saput tersaput -sar bersar -sar besar -sar besaran -sar besari -sar besarkan -sar besarlah -sar besarnya -sar kesar -sar pensaran -sar pesar -sar sesar -sar sesarnya -sara besara -sara besaranya -sara disarakan -sara menyarakan -saraf persarafan -sarak disarakan -sarak menyarakan -saran besaran -saran besarannya -saran disarankan -saran disarankannya -saran menyarankan -saran menyarankannya -saran pensaran -sarang bersarang -sarang bersarangnya -sarang disarangkan -sarang disarangkannya -sarang menyarang -sarang menyarangkan -sarang menyarangkannya -sarang penyarang -sarat kesarat -sarat menyaratkan -sarat persaratan -sarean pesarean -sari besari -sari disarikan -sari menyarikan -sari penyarikan -sarik disarikan -sarik menyarikan -sarik penyarikan -saring disaring -saring menyaring -saring menyaringnya -saring penyaring -saring penyaringan -saring tersaring -sarjana kesarjanaan -saru menyaru -sarung bersarung -sasak disasak -sasar bersasarkan -sasar disasar -sasar disasarkan -sasar disasarnya -sasar kesasar -sasar mensasar -sasar menyasar -sasar menyasarkan -sasar menyasarnya -sasar tersasar -sasi menyasikan -sastra kesastraan -sat besat -sat kesat -sat menyatan -sat menyatkan -sat mesat -sat pesat -sat pesatnya -sat sesat -sat sesatnya -satak menyatakan -satron disatroni -satron menyatroni -satu bersatu -satu bersatulah -satu bersatunya -satu besatu -satu disatu -satu disatukan -satu disatukannya -satu kesatu -satu kesatuan -satu menyatu -satu menyatukan -satu menyatukannya -satu menyatunya -satu penyatu -satu penyatuan -satu persatu -satu persatuan -satu persatukan -satu pesatuan -satu sesatu -saudara bersaudara -saudara persaudaraan -saudari bersaudari -sawah bersawah -sawah persawahan -sawah pesawahan -sawan kesawan -sawan pesawan -sawar pesawar -sawar pesawaran -sawat persawat -sawat pesawat -sawat pesawatnya -saya kesaya -sayang disayang -sayang disayangi -sayang disayangkan -sayang disayangkannya -sayang kesayangan -sayang menyayangi -sayang menyayangkan -sayang menyayangkannya -sayang penyayang -sayang tersayang -sayang tersayangnya -sayap bersayap -sayat disayat -sayat menyayat -sayat menyayatnya -sayat penyayat -sayat penyayatan -sayat tersayat -sayembara disayembarakan -seba disebakan -seba menyebakan -seba penyebanya -seba perseba -sebak disebakan -sebak menyebakan -sebak pesebak -sebal menyebalkan -sebal menyebalkannya -sebar disebar -sebar disebarkan -sebar disebarkannya -sebar disebarnya -sebar menyebar -sebar menyebaran -sebar menyebarkan -sebar menyebarkannya -sebar menyebarnya -sebar penyebar -sebar penyebaran -sebar penyebarnya -sebar persebaran -sebar pesebaran -sebar tersebar -sebar tersebarnya -sebat tersebat -seberang berseberangan -seberang diseberang -seberang diseberangi -seberang diseberangkan -seberang menyeberang -seberang menyeberangi -seberang menyeberangkan -seberang menyeberangkannya -seberang menyeberangnya -seberang penyeberang -seberang penyeberangan -sebit tersebit -sebu disebukan -sebu menyebu -sebu menyebukan -sebu tersebu -sebuk disebukan -sebuk menyebukan -sebut bersebut -sebut disebut -sebut disebutkan -sebut disebutkannya -sebut disebutlah -sebut disebutnya -sebut menyebut -sebut menyebutan -sebut menyebutkan -sebut menyebutkannya -sebut menyebutnya -sebut penyebut -sebut penyebutan -sebut penyebutkan -sebut persebut -sebut tersebut -sebut tersebuti -sebut tersebutkan -sebut tersebutlah -sebut tersebutnya -sedak tersedak -sedap menyedapkan -sedap penyedap -sedat tersedat -sedekah bersedekah -sedekah disedekahkan -sedekah menyedekahkan -sederhana disederhanakan -sederhana kesederhanaan -sederhana menyederhanakan -sederhana menyederhanakannya -sederhana penyederhanaan -sederhana sesederhana -sedia bersedia -sedia bersedianya -sedia besedia -sedia disediakan -sedia disediakannya -sedia kesediaan -sedia menyedia -sedia menyediaan -sedia menyediakan -sedia menyediakannya -sedia penyedia -sedia penyediaan -sedia penyediakan -sedia penyedianya -sedia persediaan -sedia tersedia -sedia tersedianya -sedih bersedih -sedih kesedihan -sedih menyedihkan -sedih menyedihkannya -sedih tersedih -sedikit sesedikit -sedikit tersedikit -sedot disedot -sedot kesedot -sedot menyedot -sedot menyedotnya -sedot penyedot -sedot penyedotan -sedot tersedot -sedu tersedu -seduh diseduh -seduh menyeduh -seduh menyeduhnya -seduh penyeduhan -segala disegala -segan disegani -segan keseganan -segani disegani -segar disegarkan -segar kesegaran -segar menyegarkan -segar penyegar -segar penyegaran -segar sesegar -segara sesegara -segel bersegel -segel disegel -segel disegelnya -segel menyegel -segel menyegelnya -segel penyegelan -segel tersegel -segera bersegera -segera disegerakan -segera kesegeraan -segera menyegerakan -segera sesegera -segi bersegi -segi persegi -segi perseginya -segi pesegi -segmen bersegmen -segmen disegmen -segmen tersegmen -segmentasi disegmentasikan -segmentasi tersegmentasi -sehat bersehati -sehat disehatkan -sehat kesehatan -sehat menyehatkan -sehat pensehat -sehat penyehat -sehat penyehatan -sehat sesehat -sehat tersehat -sejahtera disejahterakan -sejahtera kesejahteraan -sejahtera mensejahterakan -sejahtera menyejahterakan -sejahtera penyejahteraan -sejarah bersejarah -sejarah bersejarahnya -sejarah kesejarahan -sejarah menyejarah -sejat kesejatan -sejuk kesejukan -sejuk menyejukan -sejuk menyejukkan -sejuk penyejuk -seka diseka -seka menyeka -seka menyekanya -seka penyeka -seka perseka -sekal sesekali -sekala bersekala -sekali sesekali -sekam persekam -sekap disekap -sekap disekapnya -sekap menyekap -sekap menyekapnya -sekap penyekap -sekap penyekapan -sekap persekap -sekap tersekap -sekar menyekar -sekat bersekat -sekat disekat -sekat menyekat -sekat penyekat -sekat penyekatan -sekat persekat -sekat tersekat -seko bersekolah -seko disekolah -seko kesekolah -sekolah bersekolah -sekolah disekolah -sekolah disekolahkan -sekolah disekolahnya -sekolah kesekolah -sekolah menyekolahkan -sekolah menyekolahkannya -sekolah persekolahan -sekongkol bersekongkol -sekongkol persekongkolan -sekop menyekop -sekresi disekresi -sekresi disekresikan -sekresi mensekresi -sekretariat kesekretariatan -seks diseksi -seks seseksi -seks terseksi -seksi diseksi -seksi keseksian -seksi seseksi -seksi terseksi -sektor disektor -sekutu bersekutu -sekutu menyekutukan -sekutu persekutuan -sel bersel -sel disel -sel kesel -sela disela -sela menyela -sela persela -sela sesela -selak menyelak -selamat diselamat -selamat diselamatkan -selamat diselamatkannya -selamat keselamatan -selamat menyelamat -selamat menyelamatan -selamat menyelamati -selamat menyelamatkan -selamat menyelamatkannya -selamat penyelamat -selamat penyelamatan -selamat penyelamatkan -selamat penyelamatnya -selamat terselamatkan -selancar berselancar -selancar beselancar -selancar peselancar -selang berselang -selang beselang -selang-seling berselang-seling -selang-seling diselang-seling -selaput berselaput -selat keselatan -selat terselatan -seleksi diseleksi -seleksi diseleksinya -seleksi menseleksi -seleksi menyeleksi -seleksi menyeleksinya -seleksi penyeleksi -seleksi penyeleksian -seleksi terseleksi -selempang berselempang -selempang diselempangkan -selenggara diselenggaraan -selenggara diselenggarakan -selenggara diselenggarakannya -selenggara menyelenggaraan -selenggara menyelenggarakan -selenggara menyelenggarakannya -selenggara penyelenggara -selenggara penyelenggaraan -selenggara penyelenggarakan -selenggara penyelenggaranya -selenggara terselenggara -selenggara terselenggaranya -selera berselera -selesai diselesai -selesai diselesaian -selesai diselesaikan -selesai diselesaikannya -selesai menyelesaian -selesai menyelesaikan -selesai menyelesaikannya -selesai penyelesai -selesai penyelesaian -selesai penyelesaikan -selesai seselesainya -selesai terselesaikan -selesai terselesaikannya -seletuk menyeletuk -seleweng diselewengkan -seleweng menyeleweng -seleweng menyelewengkan -seleweng penyeleweng -seleweng penyelewengan -selia penyelia -selia penyeliaan -selidik diselidik -selidik diselidiki -selidik menyelidik -selidik menyelidikan -selidik menyelidiki -selidik penyelidik -selidik penyelidikan -selidik penyelidiki -selidik penyelidikkan -selidik penyelidiknya -selimut berselimut -selimut berselimutkan -selimut diselimut -selimut diselimuti -selimut menyelimuti -selimut terselimuti -selinap menyelinap -selinap menyelinapkan -seling berseling -seling diseling -seling diselingi -seling menyelingi -selingkuh berselingkuh -selingkuh diselingkuhi -selingkuh menyelingkuhi -selingkuh perselingkuhan -selingkuh peselingkuh -selip diselipi -selip diselipkan -selip menyelip -selip menyelipkan -selip menyelipkannya -selip terselip -selip terselipnya -selisih berselisih -selisih beselisih -selisih perselisihan -selisih peselisihan -selisik menyelisik -seliwer berseliweran -selonjor berselonjor -selonong menyelonong -seloroh berseloroh -selubung berselubung -selubung diselubungi -selubung menyelubungi -selubung terselubung -seludup diseludupkan -seludup menyeludupkan -seludup penyeludup -seludup penyeludupan -seluncur berseluncur -seluncur peseluncur -selundup diselundupkan -selundup diselundupkannya -selundup menyelundup -selundup menyelundupan -selundup menyelundupkan -selundup menyelundupkannya -selundup penyelundup -selundup penyelundupan -selundup penyelundupkan -selup menyelupkan -selurah keselurahan -seluru keseluruan -seluruh diseluruh -seluruh keseluruh -seluruh keseluruhan -seluruh menyeluruh -selusup menyelusup -selusur menyelusuri -sema bersemai -sema disemai -sema menyemai -sema penyemai -sema persema -semah besemah -semai bersemai -semai disemai -semai disemaikan -semai menyemai -semai menyemaikan -semai penyemai -semai penyemaian -semai persemaian -semak bersemak -seman perseman -semangat bersemangat -semangat bersemangatnya -semangat disemangati -semangat menyemangati -semangat penyemangat -semangat penyemangatnya -semara disemarakan -semara kesemarakan -semara menyemarakan -semarak disemarakan -semarak disemarakkan -semarak kesemarakan -semarak menyemarakan -semarak menyemarakkan -semarak penyemarak -semat disemat -semat disemati -semat disematkan -semat disematkannya -semat kesematan -semat menyemat -semat menyematkan -semat menyematkannya -semat penyematan -semat tersemat -semat tersematkan -semayam bersemayam -semayam bersemayamnya -semayam disemayamkan -semayam disemayamkannya -semayam menyemayamkan -semayam penyemayaman -semayam persemayaman -sembah disembah -sembah menyembah -sembah menyembahnya -sembah penyembah -sembah penyembahan -sembah persembahan -sembah persembahkan -sembah sesembahan -sembahyang bersembahyang -sembahyang persembahyangan -sembarang disembarang -sembelih disembelih -sembelih disembelihnya -sembelih menyembelih -sembelih menyembelihnya -sembelih penyembelih -sembelih penyembelihan -sembilan bersembilan -sembilan kesembilan -sembilan kesembilannya -semboyan bersemboyan -sembrono kesembronoan -sembuh disembuhkan -sembuh kesembuhan -sembuh menyembuh -sembuh menyembuhkan -sembuh menyembuhkannya -sembuh penyembuh -sembuh penyembuhan -sembuh tersembuhkan -sembul menyembul -sembul menyembulkan -sembul tersembul -sembunyi bersembunyi -sembunyi bersembunyinya -sembunyi disembunyikan -sembunyi disembunyikannya -sembunyi menyembunyikan -sembunyi menyembunyikannya -sembunyi penyembunyian -sembunyi persembunyian -sembunyi tersembunyi -sembunyi tersembunyinya -sembur disembur -sembur disemburkan -sembur menyembur -sembur menyemburkan -sembur penyembur -sembur tersembur -semen disemen -semen menyemen -semen penyemenan -semi bersemi -semi persemian -semifinal disemifinal -semifinal kesemifinal -seminar diseminarkan -semir disemir -semir menyemir -semir penyemir -sempal menyempal -sempat disempatkan -sempat kesempat -sempat kesempatan -sempat menyempatkan -sempil menyempil -sempit disempitkan -sempit kesempitan -sempit menyempit -sempit menyempitkan -sempit menyempitnya -sempit penyempitan -sempit persempit -sempit sesempit -sempit tersempit -semprit disemprit -semprit menyemprit -semprot disemprot -semprot disemprotkan -semprot menyemprot -semprot menyemprotkan -semprot menyemprotkannya -semprot menyemprotnya -semprot penyemprot -semprot penyemprotan -semprot tersemprot -sempur menyempurkan -sempurna disempurnakan -sempurna disempurnakannya -sempurna kesempurnaan -sempurna menyempurnakan -sempurna menyempurnakannya -sempurna penyempurna -sempurna penyempurnaan -sempurna sesempurna -semrawut kesemrawutan -semu bersemu -semua disemua -semua kesemua -semua kesemuanya -semut disemuti -semut kesemutan -semut menyemut -semut menyemuti -senam bersenam -senam pesenam -senandung bersenandung -senandung disenandungkan -senandung menyenandungkan -senang bersenang -senang disenangi -senang disenangkan -senang kesenangan -senang menyenangi -senang menyenangkan -senang menyenangkannya -senang sesenang -senda bersenda -sendar persendari -sendat tersendat -sendat tersendatnya -sendawa bersendawa -sender bersender -sender menyender -sender menyenderkan -sendi bersendi -sendi bersendikan -sendi persendi -sendi persendian -sendiri disendirikan -sendiri kesendirian -sendiri menyendiri -sendiri penyendiri -sendiri tersendiri -sendok menyendok -sendok menyendokkan -sendok sesendok -sengaja disengaja -sengaja kesengajaan -sengaja menyengaja -sengal tersengal -sengat disengat -sengat menyengat -sengat menyengatnya -sengat penyengat -sengat tersengat -senggol bersenggolan -senggol disenggol -senggol kesenggol -senggol menyenggol -senggol menyenggolnya -senggol tersenggol -sengguk sesenggukan -sengit kesengitan -sengit sesengit -sengit tersengit -sengketa bersengketa -sengketa disengketakan -sengketa menyengketakan -sengketa persengketaan -sengsara disengsarakan -sengsara kesengsaraan -sengsara menyengsarakan -sengsem kesengsem -seni berseni -seni kesenian -senjang kesenjangan -senjata bersenjata -senjata bersenjatakan -senjata bersenjatanya -senjata besenjata -senjata disenjatai -senjata kesenjataan -senjata persenjataan -senjata persenjatai -sensitif kesensitifan -sensor bersensor -sensor disensor -sensor mensensor -sensor menyensor -sensor penyensoran -sensus disensus -sentak menyentak -sentak menyentakkan -sentak tersentak -senter disenter -sentil disentil -sentil menyentil -sentil penyentilan -sentil persentil -sentil tersentil -senting disenting -sentralisasi disentralisasi -sentralisasi tersentralisasi -sentuh bersentuhan -sentuh disentuh -sentuh disentuhnya -sentuh menyentuh -sentuh menyentuhkan -sentuh menyentuhnya -sentuh persentuhan -sentuh tersentuh -sentuh tersentuhnya -sentuk menyentuk -senyap kesenyapan -senyum tersenyum -senyum tersenyumlah -seok terseok -sep menyepi -sep persepi -sepak bersepak -sepak disepak -sepak disepaknya -sepak kesepakan -sepak menyepak -sepak menyepaknya -sepak persepak -sepak pesepak -sepakat bersepakat -sepakat disepakat -sepakat disepakati -sepakat kesepakat -sepakat kesepakatan -sepakat mensepakati -sepakat menyepakati -sepam persepam -sepat kesepatan -sepat menyepati -sepatu bersepatu -sepatu persepatuan -sepeda bersepeda -sepeda pesepeda -sepele disepelekan -sepele menyepelekan -sepele menyepelekannya -sepi kesepian -sepi menyepi -sepi penyepian -sepi persepi -sepuh bersepuh -sepuh disepuh -sepuh kesepuhan -sepuh penyepuhan -sepuh sesepuh -sepuh sesepuhnya -sera berserakan -sera diserakan -sera menyerakan -sera pesera -serabut berserabut -seragam berseragam -seragam berseragamkan -seragam diseragamkan -seragam keseragaman -seragam menyeragamkan -seragam penyeragaman -serah berserah -serah diserah -serah diserahan -serah diserahi -serah diserahkan -serah diserahkannya -serah menyerah -serah menyerahan -serah menyerahkan -serah menyerahkannya -serah menyerahlah -serah menyerahnya -serah penyerah -serah penyerahan -serah penyerahkan -serah seserahan -serah terserah -serah terserahlah -serahi diserahi -serak berserak -serak berserakan -serak berserakkan -serak diserakan -serak menyerakan -serak terserak -serakah keserakahan -seram menyeramkan -seram seseram -seram terseram -seran menyerankan -seran penyeran -serang diserang -serang diserangnya -serang keserang -serang menyerang -serang menyerangan -serang menyerangkan -serang menyerangnya -serang penyerang -serang penyerangan -serang penyerangnya -serang perserang -serang seserang -serang terserang -serang terserangnya -serap diserap -serap diserapnya -serap menyerap -serap menyerapnya -serap penyerap -serap penyerapan -serap terserap -serap terserapnya -serasi diserasikan -serasi keserasian -serasi menyerasikan -serasi penyerasian -serat berserat -serat menyerat -serat terserat -serbak menyerbak -serban berserban -serbu diserbu -serbu menyerbu -serbu menyerbunya -serbu penyerbu -serbu penyerbuan -serbu penyerbukan -serbuk penyerbuk -serbuk penyerbukan -serempet diserempet -serempet keserempet -serempet menyerempet -serempet terserempet -serenta keserentakan -serentak keserentakan -seret diseret -seret diseretnya -seret keseret -seret menyeret -seret menyeretnya -seret penyeret -seret penyeretan -seret terseret -seret terseretnya -sergam bersergam -sergap disergap -sergap menyergap -sergap menyergapnya -sergap penyergap -sergap penyergapan -seri berseri -serikat berserikat -serikat perserikat -serikat perserikatan -sering disering -sering keseringan -sering sesering -sering tersering -seringai menyeringai -serius diseriusi -serius diseriuskan -serius keseriusan -serius menseriusi -serius menyeriusi -serius seserius -sero persero -sero perseroan -sero pesero -sero peseroan -serobot diserobot -serobot menyerobot -serobot penyerobot -serobot penyerobotan -serok menyerok -serong menyerong -sersi disersi -serta berserta -serta beserta -serta diserta -serta disertai -serta disertakan -serta disertakannya -serta kesertaan -serta menyertai -serta menyertakan -serta menyertakannya -serta penyerta -serta penyertaan -serta penyertanya -serta perserta -serta peserta -serta pesertanya -sertifikasi bersertifikasi -sertifikasi disertifikasi -sertifikasi mensertifikasi -sertifikasi menyertifikasi -sertifikasi tersertifikasi -sertifikat bersertifikat -sertifikat besertifikat -sertifikat disertifikat -sertifikat disertifikatkan -sertifikat mensertifikatkan -sertifikat pensertifikatan -sertifikat penyertifikatan -sertifikat tersertifikat -seru berseru -seru diseru -seru diserukan -seru diserukannya -seru keseru -seru keseruan -seru menyeru -seru menyerukan -seru menyerukannya -seru penyeru -seru perseru -seru perserui -seru terseru -seruak menyeruak -seruak menyeruakan -seruak menyeruaknya -seruduk diseruduk -seruduk menyeruduk -seruduk terseruduk -serui perserui -seruk diserukan -seruk menyerukan -seruput diseruput -seruput diseruputnya -seruput menyeruput -seruput menyeruputnya -serut diserut -servis diservis -servis menservis -servis menyervis -sesah disesah -sesah penyesahan -sesak bersesakan -sesak disesaki -sesak kesesakan -sesak menyesak -sesak menyesakan -sesak menyesaki -sesak menyesakkan -sesal disesali -sesal disesalkan -sesal disesalkannya -sesal menyesal -sesal menyesali -sesal menyesalkan -sesal menyesalkannya -sesal menyesalnya -sesal penyesalan -sesap menyesap -sesar penyesaran -sesat disesatkan -sesat kesesatan -sesat menyesatkan -sesat penyesatan -sesat tersesat -sesat tersesatnya -sesi disesi -sesi kesesi -set diset -set keset -set penyet -set penyetan -set persetan -set sesetan -seta menyetakan -seta penyetakan -seta perseta -seta peseta -setan kesetanan -setan penyetan -setan persetan -setan sesetan -setel disetel -setel menyetel -setel menyetelnya -setel penyetel -setel penyetelan -seteru berseteru -seteru perseteruan -seteru peseteruan -seti kesetian -setia kesetiaan -setir disetir -setir menyetir -setir menyetirnya -setir penyetir -setop disetop -setop disetopnya -setop mensetop -setop menyetop -setop menyetopnya -setop penyetopan -setor disetor -setor disetorkan -setor disetorkannya -setor disetornya -setor menyetor -setor menyetorkan -setor menyetorkannya -setor penyetor -setor penyetoran -setrika disetrika -setrika menyetrika -setrum disetrum -setrum kesetrum -setrum menyetrum -setrum menyetrumnya -setrum penyetrum -setrum penyetruman -setrum tersetrum -setu menyetui -setu persetuan -seturu perseturuan -sewa disewa -sewa disewakan -sewa disewakannya -sewa disewanya -sewa menyewa -sewa menyewakan -sewa menyewakannya -sewa menyewanya -sewa penyewa -sewa penyewaan -sewa penyewanya -sewa persewaan -sewa tersewa -sewar persewar -si bersi -si besi -si besinya -si disi -si mesi -si mesinya -si pensi -si persi -si persian -si persinya -si sesi -si sesinya -sia bersia -sia disiakan -sia menyiakan -sia mesia -sia persia -sia tersia -sia-sia disia-siakan -sia-sia disia-siakannya -sia-sia kesia-siaan -sia-sia mensia-siakan -sia-sia menyia-siakan -sia-sia tersia-siakan -siaga bersiaga -siaga disiagakan -siaga disiagakannya -siaga kesiagaan -siaga mensiagakan -siaga menyiagakan -siaga penyiagaan -siah mesiah -siak disiakan -siak menyiakan -sial kesialan -sian persian -siang bersiang -siang disiang -siang kesiangan -siang menyiangi -siang penyiangan -siang persiangan -sianida bersianida -siap bersiap -siap bersiaplah -siap disiap -siap disiapkan -siap disiapkannya -siap kesiap -siap kesiapan -siap menyiapan -siap menyiapkan -siap menyiapkannya -siap penyiap -siap penyiapan -siap persiapan -siap persiapkan -siap pesiapan -siap sesiap -siapa disiapakan -siapa kesiapanya -siapa menyiapakan -siapa persiapa -siapa persiapaan -siapa persiapakan -siapa persiapanya -siar bersiaran -siar disiarkan -siar disiarkannya -siar menyiarkan -siar menyiarkannya -siar penyiar -siar penyiaran -siar penyiarnya -siar pesiar -siar pesiarnya -siar tersiar -siar tersiarnya -siasat bersiasat -siasat disiasati -siasat mensiasati -siasat menyiasati -siasat penyiasat -siasat penyiasatan -sibak disibak -sibak menyibak -sibak menyibakkan -sibak tersibak -sibuk disibukan -sibuk disibukkan -sibuk kesibukan -sibuk kesibukkan -sibuk kesibukkannya -sibuk menyibukan -sibuk menyibukkan -sibuk sesibuk -sibuk tersibuk -sida penyidakan -sida persida -sidang bersidang -sidang disidang -sidang disidangkan -sidang disidangkannya -sidang menyidang -sidang menyidangkan -sidang menyidangkannya -sidang penyidangan -sidang persidang -sidang persidangan -sidang persidangkan -sidang pesidangan -sidi menyidikan -sidi penyidikan -sidi penyidikannya -sidik disidik -sidik menyidik -sidik menyidikan -sidik menyidiki -sidik menyidiknya -sidik penyidik -sidik penyidikan -sidik penyidikkan -sidik penyidiklah -sidik penyidiknya -siduk menyiduk -sifat bersifat -sifat besifat -sigap kesigapan -sigar persigar -signifikan sesignifikan -sih bersih -sih bersihkan -sih bersihlah -sih bersihnya -sih besih -sih mesih -sih penysihan -sih persih -sihir disihir -sihir menyihir -sihir penyihir -sihir tersihir -sikap bersikap -sikap bersikaplah -sikap besikap -sikap disikapi -sikap mensikapi -sikap menyikap -sikap menyikapi -sikap penyikapan -sikap persikap -sikas persikas -sikas persikasi -siklus bersiklus -siksa disiksa -siksa menyiksa -siksa menyiksanya -siksa penyiksa -siksa penyiksaan -siksa tersiksa -siku persiku -sikut disikut -sikut menyikut -sikut menyikutnya -sikut tersikut -sil pensil -sil persil -sil sesil -sila bersila -sila disilakan -sila menyilakan -sila persilakan -silang bersilang -silang bersilangan -silang disilang -silang disilangkan -silang menyilang -silang menyilangkan -silang menyilangnya -silang penyilangan -silang persilangan -silat bersilat -silat persilat -silat persilatan -silat pesilat -silaturahmi bersilaturahmi -silau menyilaukan -silet disilet -silet menyilet -silet penyilet -silet penyiletan -silinder bersilinder -siluet bersiluet -simak disimak -simak menyimak -simak menyimaknya -simbah bersimbah -simbang kesimbangan -simbang menyimbangkan -simbang penyimbang -simbang penyimbangan -simbiosis bersimbiosis -simbol bersimbol -simbol disimbolkan -simbol menyimbolkan -simpan disimpan -simpan disimpannya -simpan menyimpan -simpan menyimpanan -simpan menyimpannya -simpan penyimpan -simpan penyimpanan -simpan penyimpannya -simpan tersimpan -simpan tersimpannya -simpang bersimpangan -simpang disimpang -simpang disimpangi -simpang disimpangkan -simpang kesimpang -simpang menyimpang -simpang menyimpangi -simpang menyimpangkan -simpang menyimpangnya -simpang penyimpang -simpang penyimpangan -simpang persimpangan -simpang tersimpang -simpat bersimpati -simpati bersimpati -simpatik bersimpatik -simpel sesimpel -simpuh bersimpuh -simpuh bersimpuhlah -simpul disimpulkan -simpul disimpulkannya -simpul kesimpulan -simpul menyimpulkan -simpul menyimpulkannya -simpul penyimpulan -simpul tersimpul -simulasi disimulasi -simulasi disimulasikan -simulasi mensimulasi -simulasi mensimulasikan -simulasi menyimulasikan -sin bersin -sin besin -sin disini -sin kesini -sin mensin -sin mesin -sin mesinnya -sin persin -sinambung bersinambungan -sinambung kesinambungan -sinar bersinar -sinar bersinarnya -sinar disinar -sinar disinari -sinar menyinari -sinar penyinaran -sinden pesinden -sindir disindir -sindir menyindir -sindir menyindirnya -sindir tersindir -sinergi bersinergi -sinergi bersinerginya -sinergi besinergi -sinergi disinergikan -sinergi mensinergikan -sinergi menyinergikan -sinergi tersinergi -sinergis bersinergis -sinergis disinergiskan -sinergis mensinergiskan -sinetron pesinetron -sing bersing -sing mesing -sing pesing -singa persinga -singgah bersinggah -singgah disinggahi -singgah menyinggahi -singgah persinggahan -singgung bersinggungan -singgung disinggung -singgung disinggungnya -singgung menyinggung -singgung menyinggungnya -singgung persinggungan -singgung tersinggung -singgung tersinggungnya -singkap disingkap -singkap menyingkap -singkap menyingkapi -singkap menyingkapkan -singkap penyingkapan -singkap tersingkap -singkat disingkat -singkat menyingkat -singkat penyingkat -singkat penyingkatan -singkat persingkat -singkat sesingkat -singkat tersingkat -singkir disingkirkan -singkir disingkirkannya -singkir menyingkir -singkir menyingkirkan -singkir menyingkirkannya -singkir penyingkiran -singkir tersingkir -singkir tersingkirkan -singkir tersingkirnya -singsing menyingsing -singsing menyingsingkan -sini disini -sini disinilah -sini kesini -sinis kesinisan -sinkron disinkronkan -sinkron mensinkronkan -sinkron menyinkronkan -sinkron tersinkron -sinkronisasi bersinkronisasi -sinkronisasi disinkronisasi -sinkronisasi disinkronisasikan -sinkronisasi mensinkronisasi -sinkronisasi mensinkronisasikan -sinkronisasi menyinkronisasi -sinkronisasi menyinkronisasikan -sinkronisasi tersinkronisasi -sinonim bersinonim -sintas menyintas -sintas penyintas -sintas penyintasan -sintesis disintesis -sintesis mensintesis -sinyal bersinyal -sinyal disinyalkan -sinyal mensinyalkan -sinyal pensinyalan -sinyal persinyalan -sinyalir disinyalir -sinyalir mensinyalir -sinyalir menyinyalir -sip disipkan -sip persip -sip persipan -sipat bersipat -sipit menyipit -sipit menyipitkan -sipu tersipu -sir besir -sir mesir -sir mesirnya -sira kesira -siram disiram -siram disirami -siram disiramkan -siram menyiram -siram menyirami -siram menyiramkan -siram menyiramkannya -siram menyiramnya -siram penyiram -siram penyiraman -siram persiram -siram tersiram -sirat disiratkan -sirat menyiratkan -sirat tersirat -sirep menyirep -sirip bersirip -sirkuit disirkuit -sirkulasi bersirkulasi -sirkulasi disirkulasikan -sirkulasi tersirkulasi -sis bersisi -sis disisi -sis persis -sis persisi -sis persisnya -sis pesisi -sis tersisi -sisa bersisa -sisa disisa -sisa disisakan -sisa menyisa -sisa menyisakan -sisa tersisa -sisa tersisanya -sisi bersisi -sisi bersisian -sisi disisi -sisi disisinya -sisi menyisikan -sisi penyisian -sisi persisi -sisi persisinya -sisi pesisi -sisi tersisi -sisih disisihkan -sisih disisihkannya -sisih menyisihkan -sisih menyisihkannya -sisih penyisihan -sisih tersisih -sisih tersisihkan -sisih tersisihnya -sisik bersisik -sisik menyisikan -sisip disisipi -sisip disisipkan -sisip disisipkannya -sisip menyisipkan -sisip penyisipan -sisip tersisip -sisir disisir -sisir menyisir -sisir menyisiri -sisir menyisirnya -sisir penyisir -sisir penyisiran -sisir pesisir -sisir pesisiran -sisir pesisirnya -sisir tersisir -sistem bersistem -sistem kesisteman -sistem tersistem -sistematis tersistematis -siswa kesiswaan -sit kesit -sit mesit -sit persit -sita disita -sita disitanya -sita menyita -sita menyitanya -sita penyitaan -sita persita -sita tersita -sitat disitat -siter persiter -sitir disitir -sitir menyitir -situ disitu -situ disitulah -situ kesitu -situs disitus -siul bersiul -siul disiuli -siul menyiuli -siut menyiutkan -skala berskala -skala beskala -skala penskalaan -skema berskema -skema terskema -skenario diskenario -skenario diskenariokan -skenario menskenariokan -ski berski -ski diski -ski meski -ski meskinya -ski seski -skop diskop -skor berskor -skor diskor -skor menskor -skors diskors -skors menskors -skors penskorsan -skripsi diskripsi -slah keslahan -slogan berslogan -soal disoal -soal menyoal -soal menyoalkan -soal persoalan -soal persoalkan -soal pesoalan -soba menyoba -sobek disobek -sobek menyobek -sobek penyobekan -soda bersoda -sodet disodet -sodet menyodet -sodet penyodetan -sodok disodok -sodok menyodok -sodomi disodomi -sodomi menyodomi -sodor disodori -sodor disodorkan -sodor disodorkannya -sodor menyodori -sodor menyodorkan -sodor menyodorkannya -soe menyoe -sogo penyogokan -sogok disogok -sogok menyogok -sogok menyogoknya -sogok penyogok -sogok penyogokan -sohor kesohor -sohor pesohor -sohor tersohor -sok besok -sok besoklah -sok besoknya -sok kesokan -sok penyok -sokong disokong -sokong menyokong -sokong menyokongnya -sokong penyokong -sokong penyokongnya -sol bersol -sol persolan -solder disolder -solder menyolder -solid disolidkan -solid kesolidan -solid mensolidkan -solid menyolidkan -solid sesolid -solidaritas bersolidaritas -solo bersolo -solok menyolok -solusi bersolusi -solusi disolusikan -solusi mensolusi -somasi disomasi -somasi mensomasi -somasi menyomasi -sombong disombongkan -sombong kesombongan -sombong menyombongkan -songsong disongsong -songsong menyongsong -sono tersono -sontek disontek -sontek mensontek -sontek menyontek -sontek menyonteknya -sop bersopan -sop mesop -sopan bersopan -sopan kesopanan -sopir disopiri -sopir menyopir -sopir menyopiri -sorak bersorak -sorak disoraki -sorak menyoraki -sorak menyorakkan -sorak-sorai bersorak-sorai -sorang sesorang -sore kesorean -sorot disorot -sorot disoroti -sorot disorotkan -sorot menyorot -sorot menyoroti -sorot menyorotkan -sorot menyorotnya -sorot tersorot -sortir disortir -sortir mensortir -sortir menyortir -sortir menyortirnya -sortir penyortir -sortir penyortiran -sosial bersosial -sosialis bersosialisi -sosialisasi bersosialisasi -sosialisasi disosialisasi -sosialisasi disosialisasikan -sosialisasi disosialisasikannya -sosialisasi mensosialisasi -sosialisasi mensosialisasikan -sosialisasi mensosialisasikannya -sosialisasi menyosialisasi -sosialisasi menyosialisasikan -sosialisasi menyosialisasikannya -sosialisasi tersosialisasi -sosialisasi tersosialisasikan -sosoh disosoh -sosok bersosok -sosok sesosok -sosor menyosor -span sespan -spektakuler sespektakuler -spekulasi berspekulasi -spekulasi dispekulasi -spekulasi dispekulasikan -spesial dispesialkan -spesialisasi berspesialisasi -spesialisasi terspesialisasi -spesifikasi berspesifikasi -sponsor bersponsor -sponsor disponsori -sponsor mensponsori -spora dispora -sri mesri -stabil distabilkan -stabil kestabilan -stabil menstabilkan -stabil menstabilkannya -stabil penstabil -stabil penstabilan -stabilisasi menstabilisasi -stabilitas distabilitas -stadion distadion -staf distafkan -staf menstafkan -stamina berstamina -stan distan -stan distankan -standar berstandar -standar distandarkan -standar menstandarkan -standar terstandar -standardisasi distandardisasi -standardisasi terstandardisasi -stapler distapler -staples distaples -starter distarter -stasi perstasi -stasiun distasiun -statistik perstatistikan -status berstatus -status berstatuskan -status bestatus -stempel berstempel -stempel distempel -steril disteril -steril disterilkan -steril kesterilan -steril mensterilkan -steril pensterilan -sterilisasi disterilisasi -sterilisasi mensterilisasi -sterilisasi mensterilisasikan -stigma distigma -stigma distigmakan -stigma menstigma -stigma terstigma -stik distik -stik memstikan -stiker berstiker -stimulan distimulan -stimulasi distimulasi -stimulasi menstimulasi -stimulasi menstimulasikan -stimulasi menstimulasinya -stimulasi terstimulasi -stimulus distimulus -stimulus menstimulus -stok distok -stok menstok -strategi berstrategi -stres distres -struktur berstruktur -struktur distruktur -struktur terstruktur -sua bersua -sua bersuai -sua disua -sua sesua -sua sesuai -suai bersuai -suai sesuai -suai sesuaian -suai sesuaikan -suai sesuainya -suam bersuami -suami bersuami -suami bersuamikan -suap disuap -suap disuapi -suap disuapkan -suap menyuap -suap menyuapi -suap menyuapkan -suap menyuapnya -suap penyuap -suap penyuapan -suap penyuapnya -suap sesuap -suara bersuara -suara disuarakan -suara disuarakannya -suara menyuarakan -suara menyuarakannya -suara penyuara -suasana bersuasana -suat besuatan -suat sesuat -suat sesuati -suatu disuatu -suatu sesuatu -suatu sesuatunya -subordinasi tersubordinasi -subsidi bersubsidi -subsidi bersubsidinya -subsidi besubsidi -subsidi disubsidi -subsidi disubsidikan -subsidi mensubsidi -subsidi menyubsidi -substitusi disubstitusi -substitusi mensubstitusi -subur disuburkan -subur kesuburan -subur menyuburkan -subur penyubur -subur penyuburan -subur sesubur -subur tersubur -subur tersuburnya -suci bersuci -suci disucikan -suci kesucian -suci mensucikan -suci menyuci -suci menyucikan -suci pensucian -suci penyucian -suci tersuci -sudah disudah -sudah disudahi -sudah kesudahan -sudah menyudahi -sudah sesudah -sudah sesudahnya -sudut bersudut -sudut besudut -sudut disudut -sudut disudutkan -sudut menyudut -sudut menyudutkan -sudut menyudutkannya -sudut penyudutan -sudut tersudut -sudut tersudutkan -sugesti mensugesti -sugesti tersugesti -sugih kesugihan -sugih pesugihan -suguh disuguhi -suguh disuguhkan -suguh disuguhkannya -suguh menyuguhi -suguh menyuguhkan -suguh menyuguhkannya -suhu bersuhu -suji mesuji -sujud bersujud -suka bersuka -suka disuka -suka disukai -suka disukanya -suka kesukaan -suka menyukai -suka penyuka -suka penyukanya -suka sesuka -suka sesukanya -sukacita bersukacita -sukan besukan -sukan kesukannya -sukar kesukaran -sukar tersukar -sukarela kesukarelaan -sukarelawan kesukarelawanan -sukaria bersukaria -suki besuki -suki memsuki -sukses disukseskan -sukses kesuksesan -sukses kesukseskan -sukses mensukseskan -sukses mensukseskannya -sukses menyukseskan -sukses menyukseskannya -sukses penyuksesan -sukses sesukses -sukses tersukses -sukses tersuksesnya -suku bersuku -suku kesukuan -sulam bersulam -sulam disulam -sulam menyulam -sulam penyulam -sulam penyulaman -sulang bersulang -sulang penyulang -sulap disulap -sulap disulapnya -sulap menyulap -sulap menyulapnya -sulap pesulap -suling disuling -suling menyuling -suling penyuling -suling penyulingan -sulit disulitkan -sulit kesulitan -sulit menyulitkan -sulit menyulitkannya -sulit penyulit -sulit persulit -sulit sesulit -sulit tersulit -sulit tersulitnya -sultan kesultan -sultan kesultanan -suluh penyuluh -suluh penyuluhan -suluh penyuluhnya -sulut disulut -sulut disulutnya -sulut menyulut -sulut menyulutkan -sulut menyulutnya -sulut penyulut -sulut penyulutan -sulut tersulut -sulut tersulutnya -sum mesum -sum mesumnya -sumah kesumah -sumbang disumbang -sumbang disumbangkan -sumbang disumbangkannya -sumbang menyumbang -sumbang menyumbangan -sumbang menyumbangkan -sumbang menyumbangkannya -sumbang penyumbang -sumbang penyumbangnya -sumbangsih bersumbangsih -sumbar sesumbar -sumbar sesumbarnya -sumbat disumbat -sumbat menyumbat -sumbat menyumbatnya -sumbat penyumbat -sumbat penyumbatan -sumbat tersumbat -sumbat tersumbatnya -sumber bersumber -sumber bersumberkan -sumbu bersumbu -sumo pesumo -sumpah bersumpah -sumpah disumpah -sumpah menyumpah -sumpah menyumpahi -sumpah penyumpahan -sumpah tersumpah -sumpal disumpal -sumpal menyumpal -sumpal tersumpal -sunah disunahkan -sunan kesunanan -sunat bersunat -sunat disunat -sunat menyunat -sunat menyunatkan -sunat penyunatan -sundul disundul -sundul disundulnya -sundul menyundul -sundul menyundulnya -sundul penyundul -sundut disundut -sundut menyundut -sundut tersundut -sungai disungai -sungging menyungging -sungging menyunggingkan -sungging tersungging -sungguh bersungguh -sungguh kesungguhan -sungguh sesungguh -sungguh sesungguhnya -sungkur menyungkurkan -sungkur tersungkur -sungkur tersungkurnya -sungut bersungut -sunti disuntikan -sunti menyuntikan -sunti menyuntikannya -sunti penyuntikan -suntik disuntik -suntik disuntikan -suntik disuntikkan -suntik menyuntik -suntik menyuntikan -suntik menyuntikkan -suntik menyuntikkannya -suntik menyuntiknya -suntik penyuntik -suntik penyuntikan -suntik penyuntikkan -sunting disunting -sunting menyunting -sunting penyunting -sunting penyuntingan -sunyi kesunyian -super tersuper -supervisi disupervisi -supervisi mensupervisi -suplai disuplai -suplai mensuplai -suplai menyuplai -suplai menyuplainya -suplai pensuplai -suplai penyuplai -suplai penyuplaian -suplai penyuplainya -suplai tersuplai -suram kesuraman -suram sesuram -surat bersurat -surat disurat -surat disurati -surat disuratkan -surat menyurat -surat menyurati -surat menyuratkan -surat menyuratnya -surat persuratan -surat tersurat -surati disurati -surati menyurati -suruh disuruh -suruh disuruhnya -suruh menyuruh -suruh menyuruhnya -suruh penyuruh -suruh pesuruh -surup kesurupan -surut menyurut -surut menyurutkan -surut penyurutan -survei disurvei -survei mensurvei -survei menyurvei -survei penyurvei -sus menyusi -sus pelsus -susah bersusah -susah disusahkan -susah kesusahan -susah menyusahkan -susah sesusah -susastra kesusastraan -suspensi disuspensi -suspensi mensuspensi -suspensi menyuspensi -suspensi tersuspensi -susu besusu -susu disusui -susu kesusu -susu menyusu -susu menyusui -susu menyusunya -susu penyusuan -susu persusuan -susuk menyusuk -susul disusul -susul disusuli -susul disusulkan -susul kesusul -susul menyusul -susul menyusulkan -susul menyusulnya -susul tersusul -susun bersusun -susun disusun -susun disusunlah -susun disusunnya -susun menyusun -susun menyusunnya -susun penyusun -susun penyusunan -susun penyusunnya -susun tersusun -susun tersusunnya -susung disusung -susup disusupi -susup disusupkan -susup menyusup -susup menyusupi -susup menyusupkan -susup menyusupnya -susup penyusup -susup penyusupan -susup tersusupi -susur disusuri -susur menyusur -susur menyusuri -susur penyusuran -susut disusutkan -susut menyusut -susut menyusutkan -susut menyusutnya -susut penyusutan -sut besut -sut besutan -sut mesut -sut pesut -sutan besutan -sutan besutannya -sutradara disutradarai -sutradara menyutradarai -sutradara penyutradaraan -suwir disuwir -swadaya berswadaya -swadaya keswadayaan -swasembada berswasembada -swasta diswastakan -swasta menswastakan -syah disyahkan -syah mensyahkan -syahadat bersyahadat -syahbandar kesyahbandaran -syahid kesyahidan -syair penyair -syala menyala -syala menyalakan -syala menyalakannya -syala menyalanya -syala penyala -syala penyalaan -syaman menyamankan -syarah menyarahkan -syarak menyarakan -syarat bersyarat -syarat bersyaratnya -syarat disyaratkan -syarat mensyaratkan -syarat menyaratkan -syarat persyarat -syarat persyaratan -syarat persyaratkan -syarat pesyaratan -syariat bersyariat -syariat disyariatkan -syarik menyarikan -syarik penyarikan -syarikat persyarikatan -syiar mensyiarkan -syiar menyiarkan -syiar menyiarkannya -syiar penyiar -syiar penyiaran -syiar penyiarnya -syirik kesyirikan -syok penyok -ta berta -ta bertanya -ta bertanyalah -ta beta -ta betanya -ta dita -ta ditanya -ta keta -ta mena -ta menakan -ta menanya -ta mengtakan -ta menta -ta mentakan -ta menytakan -ta meta -ta pelta -ta pena -ta penanya -ta penta -ta perta -ta pertai -ta peta -ta petai -ta petakan -ta petanya -ta seta -ta setalah -taat ditaati -taat ketaatan -taat menaati -taat mentaati -taat penaatan -tabah ketabahan -tabah menabahkan -tabal ditabalkan -tabal menabalkan -tabarak bertabarakan -tabarak menabarak -tabayun bertabayun -tabiat bertabiat -tabrak bertabrakan -tabrak bertabrakkan -tabrak ditabrak -tabrak ditabrakan -tabrak ditabrakkan -tabrak ditabraknya -tabrak ketabrak -tabrak menabrak -tabrak menabrakan -tabrak menabraki -tabrak menabrakkan -tabrak menabrakkannya -tabrak menabraknya -tabrak penabrak -tabrak penabrakan -tabrak penabraknya -tabrak tertabrak -tabrak tertabraknya -tabu ditabukan -tabu ketabuan -tabu menabukan -tabuh ditabuh -tabuh ditabuhkan -tabuh menabuh -tabuh menabuhkan -tabuh penabuh -tabuh penabuhan -tabuhan penabuhan -tabung bertabung -tabung ditabung -tabung ditabungkan -tabung ditabungnya -tabung menabung -tabung menabungkan -tabung menabunglah -tabung menabungnya -tabung penabung -tabung pertabung -tabur bertabur -tabur bertaburan -tabur bertaburkan -tabur bertaburnya -tabur ditabur -tabur ditaburi -tabur ditaburkan -tabur menabur -tabur menaburi -tabur menaburkan -tabur menaburkannya -tabur mengabur -tabur mengaburkan -tabur penabur -tabur penaburan -tadah ditadah -tadah menadah -tadah menadahkan -tadah penadah -tadah penadahan -tadah penadahnya -tadarus bertadarus -tadi menadi -tafakur bertafakur -tafsir ditafsir -tafsir ditafsirkan -tafsir menafsir -tafsir menafsirkan -tafsir menafsirkannya -tafsir penafsir -tafsir penafsiran -tagak penagak -tagak penagakan -tagan menagani -tagan penagan -tagan penaganan -tagar bertagar -tagih ditagih -tagih ditagihkan -tagih ketagihan -tagih menagih -tagih menagihkan -tagih menagihnya -tagih penagih -tagih penagihan -tagih tertagih -tah bertahan -tah bertahi -tah betah -tah betahan -tah betahnya -tah ditahan -tah ketahan -tah menahan -tah mentah -tah mentahan -tah mentahkan -tah mentahnya -tah penah -tah penahan -tah pertahan -tah petah -tah petahan -tah setah -tah tertahan -tahan bertahan -tahan bertahanan -tahan bertahanlah -tahan bertahannya -tahan betahan -tahan ditahan -tahan ditahanan -tahan ditahannya -tahan ketahan -tahan ketahanan -tahan menahan -tahan menahanan -tahan menahannya -tahan mentahan -tahan penahan -tahan penahanan -tahan penahannya -tahan pertahan -tahan pertahanan -tahan pertahankan -tahan pertahannya -tahan petahan -tahan petahanan -tahan tertahan -tahan tertahankan -tahan tertahannya -tahana penahana -tahana penahananya -tahana pertahana -tahana petahana -tahap bertahap -tahap bertahaplah -tahap ditahap -tahap ketahap -tahap penahapan -tahap pentahapan -tahap setahap -tahbis ditahbiskan -tahbis menahbiskan -tahbis mentahbiskan -tahbis penahbisan -tahbis pentahbisan -tahi bertahi -tahu ditahui -tahu ketahuan -tahu ketahui -tahu menahu -tahu mengtahui -tahu setahu -tahu setahunya -tahun bertahun -tahun ditahun -tahun ketahun -tahun menahun -tahun pertahun -tahun pertahunnya -tahun setahun -tahun setahunan -tahun setahunnya -tais bertais -taja ditaja -taja menaja -taja penaja -tajam ditajamkan -tajam ketajaman -tajam menajam -tajam menajamkan -tajam menajamnya -tajam penajam -tajam penajaman -tajam pertajam -tajam setajam -tajam tertajam -taji beltaji -taji bertaji -tajuk bertajuk -tak ketak -tak menak -tak menakan -tak mengtakan -tak mentak -tak mentakan -tak menytakan -tak penak -tak petak -tak petakan -takar ditakar -takar menakar -takar penakar -takar penakaran -takat setakat -takbir bertakbir -takdir ditakdirkan -takdir menakdirkan -takdir mentakdirkan -takhta bertakhta -takhta bertakhtakan -takjub ketakjuban -takjub menakjubkan -takjub menakjubkannya -takluk ditaklukan -takluk ditaklukkan -takluk ditaklukkannya -takluk menaklukan -takluk menaklukkan -takluk menaklukkannya -takluk penakluk -takluk penaklukan -takluk penaklukkan -taksi ditaksi -taksir ditaksir -taksir ditaksirnya -taksir menaksir -taksir mentaksir -taksir penaksir -taksir penaksiran -takuk ketakukan -takut ditakuti -takut ditakutkan -takut ditakutkannya -takut ketakutan -takut ketakutkan -takut menakut -takut menakuti -takut menakutkan -takut menakutkannya -takut penakut -takut setakut -takwa bertakwa -takwa bertakwalah -takwa ketakwaan -takziah bertakziah -takziah petakziah -tal bertali -tal ditali -tal menalan -tal mental -tal mentalnya -tal metal -tal metalnya -tal penal -tal penali -tal pentalan -tal pertal -tal petal -tal setali -tala petala -talah setalah -talam menalami -talang ditalangi -talang menalangi -talang penalangan -talang petalangan -talar menalar -talar penalaran -talenta bertalenta -tali bertali -tali bertalian -tali ditali -tali penali -tali pertalian -tali setali -talu tertalu -tam bertam -tam ditaman -tam ketam -tam menaman -tam menamkan -tam metaman -tam penaman -tam pertam -tam pertaman -tam pertamnya -tam setaman -tamak ketamakan -tamak menamakan -tamam menamam -taman ditaman -taman menaman -taman menamankan -taman metaman -taman penaman -taman penamanan -taman pertaman -taman pertamanan -taman pertamannya -taman setaman -tamasya bertamasya -tamat ditamatkan -tamat menamatkan -tamat setamat -tambah bertambah -tambah bertambahnya -tambah betambah -tambah ditambah -tambah ditambahan -tambah ditambahi -tambah ditambahkan -tambah ditambahkannya -tambah ditambahnya -tambah ketambahan -tambah menambah -tambah menambahan -tambah menambahi -tambah menambahkan -tambah menambahkannya -tambah menambahnya -tambah penambah -tambah penambahan -tambah penambahkan -tambah pertambahan -tambah tertambah -tambak ditambakan -tambak menambak -tambak menambakan -tambak penambak -tambak penambakan -tambak pertambakan -tambak petambak -tambakan ditambakan -tambakan menambakan -tambakan penambakan -tambakan pertambakan -tambal ditambal -tambal menambal -tambal menambalnya -tambal penambal -tambal penambalan -tambang bertambang -tambang ditambang -tambang menambang -tambang menambangnya -tambang penambang -tambang penambangan -tambang penambangnya -tambang pertambang -tambang pertambangan -tambang petambang -tambat ditambat -tambat ditambatkan -tambat menambatkan -tambat penambat -tambat penambatan -tambat tertambat -tambung menambung -tambur pertamburan -tambur petamburan -tameng bertameng -tampah penampahan -tampak ditampakkan -tampak menampakan -tampak menampakkan -tampak penampakan -tampak penampakkan -tampan ketampanan -tampan setampan -tampan tertampan -tampang bertampang -tampang penampang -tampang penampangnya -tampang tertampang -tampar ditampar -tampar menampar -tampar menamparnya -tampar penampar -tampar penamparan -tampar tertampar -tampi ditampikan -tampi menampikan -tampi penampian -tampi penampikan -tampik ditampik -tampik ditampikan -tampik ditampiknya -tampik menampik -tampik menampikan -tampik menampikkan -tampik menampiknya -tampik penampikan -tampil bertampilan -tampil ditampil -tampil ditampilan -tampil ditampilkan -tampil ditampilkannya -tampil menampil -tampil menampilan -tampil menampilkan -tampil menampilkannya -tampil penampil -tampil penampilan -tampil tertampil -tamping penamping -tampuk menampuk -tampung ditampung -tampung ditampungnya -tampung ketampung -tampung menampung -tampung menampungnya -tampung penampung -tampung penampungan -tampung penampungnya -tampung tertampung -tamu bertamu -tamu pertamuan -tan bertani -tan betan -tan ketan -tan menan -tan mentan -tan metan -tan pertani -tan petan -tan petani -tan setan -tan setannya -tanah bertanah -tanah ditanah -tanah ketanah -tanah penanahan -tanah pertanahan -tanah petanahan -tanah setanah -tanak ditanak -tanak menanak -tanak penanak -tanam bertanam -tanam ditanam -tanam ditanaman -tanam ditanami -tanam ditanamkan -tanam ditanamkannya -tanam ditanamnya -tanam menanam -tanam menanaman -tanam menanami -tanam menanamkan -tanam menanamkannya -tanam menanamnya -tanam penanam -tanam penanaman -tanam pertanaman -tanam tertanam -tanam tertanamnya -tanang menanangi -tanang penanangan -tanang petanang -tancap ditancap -tancap ditancapkan -tancap menancap -tancap menancapkan -tancap menancapkannya -tancap penancapan -tancap tertancap -tanda bertanda -tanda ditanda -tanda ditandai -tanda ditandakan -tanda menanda -tanda menandai -tanda menandakan -tanda penanda -tanda penandaan -tanda penandanya -tanda pertanda -tanda petanda -tanda petandakan -tanda tertanda -tandak ditandakan -tandak menandakan -tandak petandakan -tandan bertandan -tandan ketandan -tandan setandan -tandang bertandang -tandang bertandangan -tandang menandang -tandas ditandaskan -tandas menandaskan -tandem bertandem -tandem ditandem -tandem ditandemkan -tandem menandemkan -tanding bertanding -tanding bertandingan -tanding bertandingnya -tanding ditandingi -tanding ditandingkan -tanding menandingi -tanding pentandingan -tanding pertanding -tanding pertandingan -tanding pertandingkan -tanding petandingan -tanding setanding -tanding tertandingi -tandu ditandu -tandu menandu -tandu menandunya -tanduk bertanduk -tanduk ditanduk -tanduk menanduk -tanduk menandukkan -tanduk menanduknya -tang bertangan -tang betang -tang ditangan -tang ditangkan -tang ketang -tang ketangan -tang ketangi -tang menang -tang menangan -tang menangi -tang menangkan -tang menanglah -tang menangnya -tang mentang -tang penang -tang penangan -tang penangkan -tang petang -tang petangnya -tang setang -tang setangnya -tangan bertangan -tangan ditangan -tangan ditangani -tangan ditangannya -tangan ketangan -tangan menangan -tangan menangani -tangan penangan -tangan penanganan -tangan penangannya -tangan tertangani -tangap ditangap -tangap ditangapi -tangap menangap -tangap menangapi -tangga bertangga -tangga menanggai -tangga tertangga -tanggal bertanggal -tanggal ditanggal -tanggal ditanggalkan -tanggal menanggal -tanggal menanggalkan -tanggal menanggalkannya -tanggal penanggalan -tanggal pertanggal -tanggal tertanggal -tanggap ditanggap -tanggap ditanggapi -tanggap ketanggapan -tanggap menanggap -tanggap menanggapi -tanggap menanggapnya -tanggap penanggap -tanggap petanggap -tanggap tertanggap -tanggar penanggaran -tangguh ditangguhkan -tangguh ditangguhkannya -tangguh ketangguhan -tangguh menangguhkan -tangguh menangguhkannya -tangguh penangguhan -tangguh setangguh -tangguh tertangguh -tangguk menangguk -tanggul ditanggul -tanggul menanggul -tanggul penanggulan -tanggulang ditanggulangi -tanggulang menanggulangi -tanggulang penanggulang -tanggulang penanggulangan -tanggulang tertanggulangi -tanggung bertanggung -tanggung betanggung -tanggung ditanggung -tanggung ditanggungkan -tanggung ditanggungnya -tanggung ketanggung -tanggung ketanggungan -tanggung menanggung -tanggung menanggungnya -tanggung penanggung -tanggung penanggungan -tanggung pertanggung -tanggung pertanggungan -tanggung tertanggung -tangis ditangisi -tangis menangis -tangis menangisi -tangis menangislah -tangis menangisnya -tangkai bertangkai -tangkai setangkai -tangkal ditangkal -tangkal menangkal -tangkal menangkalnya -tangkal penangkal -tangkal penangkalan -tangkal penangkalnya -tangkap ditangkap -tangkap ditangkapi -tangkap ditangkaplah -tangkap ditangkapnya -tangkap ketangkap -tangkap menangkap -tangkap menangkapan -tangkap menangkapi -tangkap menangkapnya -tangkap penangkap -tangkap penangkapan -tangkap penangkapkan -tangkap penangkapnya -tangkap tertangkap -tangkap tertangkaplah -tangkap tertangkapnya -tangkar ditangkar -tangkar ditangkarkan -tangkar menangkar -tangkar menangkarkan -tangkar penangkar -tangkar penangkaran -tangkas ketangkasan -tangki bertangki -tangkis ditangkis -tangkis menangkis -tangkis menangkisnya -tangkis penangkis -tangkup menangkupkan -tangkup setangkup -tani bertani -tani pertani -tani pertanian -tani petani -tani petanian -tani petaninya -tania betania -tania pertania -tanin betanin -tanin pertaninan -tanjak ditanjakan -tanjak menanjak -tanjak menanjaknya -tanjak penanjakan -tanjung penanjung -tantang ditantang -tantang ditantangnya -tantang menantang -tantang menantangnya -tantang penantang -tantang penantangnya -tantang tertantang -tanti menanti -tanti menantikan -tanti menantikannya -tanti menantinya -tanti penanti -tanti penantian -tanya bertanya -tanya bertanyalah -tanya betanya -tanya ditanya -tanya ditanyai -tanya ditanyakan -tanya ditanyakannya -tanya menanya -tanya menanyai -tanya menanyakan -tanya menanyakannya -tanya penanya -tanya pertanyaan -tanya pertanyakan -tanya petanya -tanya petanyaan -tap betap -tap mentap -tap mentapkan -tap pentapan -tap petapan -tap setap -tap tertap -tap tertapi -tapa bertapa -tapa betapa -tapa menapai -tapa menapakan -tapa pertapa -tapa pertapaan -tapa petapa -tapai menapai -tapak ditapaki -tapak menapak -tapak menapakan -tapak menapaki -tapak menapakkan -tapak setapak -tapang ketapang -tapi menapikan -tapi tertapi -tapis ditapis -tapis menapis -tapis penapis -tapis penapisan -tar betar -tar ketar -tar menari -tar mentari -tar penari -tar petar -tar setar -tar tertari -tara betara -tara betarai -tara ketara -tara menara -tara menaranya -tara penara -tara setara -tara setarakan -tara setaranya -taraf bertaraf -taraf setaraf -tarak setarakan -tarang ketarangan -tarang mentarang -target bertarget -target ditarget -target ditargetkan -target ditargetkannya -target ditargetnya -target menarget -target menargetkan -target menargetkannya -target menargetnya -target mentarget -target mentargetkan -target penargetan -target tertarget -tari ditarikan -tari menari -tari menarikan -tari menarilah -tari menarinya -tari mentari -tari penari -tari penarikan -tari penarikannya -tari penarinya -tari tertari -tarif bertarif -tarif ditarif -tarif penarifan -tarif pentarifan -tarik ditarik -tarik ditarikan -tarik ditariknya -tarik ketarik -tarik menarik -tarik menarikan -tarik menariknya -tarik penarik -tarik penarikan -tarik penariknya -tarik tertarik -tarik tertariknya -tarikh bertarikh -taring bertaring -taruh bertaruh -taruh ditaruh -taruh ditaruhnya -taruh menaruh -taruh menaruhkan -taruh menaruhnya -taruh penaruh -taruh pertaruhan -taruh pertaruhkan -taruh petaruh -taruk penarukan -taruk petarukan -tarung bertarung -tarung bertarunglah -tarung bertarungnya -tarung betarung -tarung pertarung -tarung pertarungan -tarung petarung -tarung petarungan -tarung petarungnya -tas ditas -tas ketas -tas menas -tas mengtasi -tas mentas -tas penas -tas pentas -tas pentaskan -tas petasan -tas setasi -tas tertas -tasbih bertasbih -tasbih ditasbihkan -tasbih menasbihkan -tasbih mentasbihkan -tasbih penasbihan -tashih pentashihan -tata bertata -tata ditata -tata ditatanya -tata ketata -tata menata -tata menatakan -tata menatanya -tata mengtatakan -tata mentatakan -tata penata -tata penataan -tata tertata -tata tertatanya -tatah bertatahkan -tatah petatah -tatak menatakan -tatak mengtatakan -tatak mentatakan -tatang menatang -tatap bertatap -tatap bertatapan -tatap ditatap -tatap menatap -tatap menatapkan -tatap menatapnya -tatap penatapan -tatar ditatar -tatar ditataran -tatar penataran -tatih penatih -tatih tertatih -tato bertato -tato ditato -tato menato -tato mentato -tato penatoi -tau ketau -tau ketauan -tau pentauan -tau setau -tauhid ketauhidan -taung menaungi -taung penaung -taur pertauran -taut bertaut -taut bertautan -taut ditautkan -taut menautkan -taut mentautkan -taut pertautan -taut tertaut -tawa ditawakan -tawa ketawa -tawa ketawanya -tawa menawakan -tawa mentawa -tawa mentawai -tawa tertawa -tawa tertawaan -tawa tertawai -tawa tertawakan -tawa tertawalah -tawa tertawanya -tawa-tawa ketawa-tawa -tawa-tawa tertawa-tawa -tawak ditawakan -tawak menawakan -tawak tertawakan -tawakal bertawakal -tawan ditawan -tawan menawan -tawan menawannya -tawan penawan -tawan penawanan -tawan tertawan -tawang ketawang -tawang penawangan -tawar ditawar -tawar ditawari -tawar ditawarkan -tawar ditawarkannya -tawar menawar -tawar menawaran -tawar menawari -tawar menawarkan -tawar menawarkannya -tawar menawarnya -tawar penawar -tawar penawaran -tawar penawarnya -tawar-tawar ditawar-tawar -tawas menawaskan -tayamum bertayamum -tayang ditayang -tayang ditayangan -tayang ditayangkan -tayang ditayangkannya -tayang menayang -tayang menayangkan -tayang menayangkannya -tayang penayang -tayang penayangan -tayang tertayang -te bete -te dite -te ditekan -te ditekannya -te ditelah -te kete -te ketekan -te mene -te menekan -te menekannya -te menelah -te mente -te mete -te penekan -te pete -te sete -te setelah -te tertekan -te tertekannya -teater berteater -tebak ditebak -tebak ketebak -tebak menebak -tebak menebaknya -tebak penebak -tebak penebakan -tebak tertebak -tebal ditebalkan -tebal ketebalan -tebal menebal -tebal menebalkan -tebal menebalnya -tebal penebalan -tebal pertebal -tebal setebal -tebang bertebangan -tebang ditebang -tebang ditebangi -tebang menebang -tebang menebangi -tebang menebangnya -tebang penebang -tebang penebangan -tebar bertebaran -tebar betebaran -tebar ditebar -tebar ditebarkan -tebar menebar -tebar menebarkan -tebar penebar -tebar penebaran -tebas ditebas -tebas menebas -tebas menebaskan -tebeng menebeng -tebing bertebing -tebus ditebus -tebus ditebuskan -tebus ditebusnya -tebus menebus -tebus menebusnya -tebus penebus -tebus penebusan -teduh berteduh -teduh keteduhan -teduh meneduh -teduh meneduhkan -teduh peneduh -tega ditegakan -tega menegakan -tega mentega -tega penegakan -tega penegakannya -tega setega -tegah ditegah -tegah menegah -tegah penegah -tegah penegahan -tegah pertegahan -tegah setegah -tegak ditegakan -tegak ditegakkan -tegak ditegakkannya -tegak menegak -tegak menegakan -tegak menegakkan -tegak menegakkannya -tegak penegak -tegak penegakan -tegak penegakkan -tegak penegakkannya -tegak penegaknya -tegang bertegangan -tegang ketegangan -tegang menegang -tegang menegangkan -tegang menegangnya -tegang setegang -tegar ketegaran -tegas ditegaskan -tegas ditegaskannya -tegas ketegasan -tegas menegas -tegas menegasan -tegas menegaskan -tegas menegaskannya -tegas penegas -tegas penegasan -tegas pertegas -tegas setegas -teguh beteguh -teguh diteguhkan -teguh keteguhan -teguh meneguhkan -teguh peneguhan -teguk diteguk -teguk diteguknya -teguk meneguk -teguk meneguknya -teguk seteguk -tegun tertegun -tegur bertegur -tegur ditegur -tegur menegur -tegur menegurnya -tegur peneguran -teh meneh -teka-teki berteka-teki -tekad bertekad -tekah setekah -tekak menekakan -tekan bertekanan -tekan ditekan -tekan ditekankan -tekan ditekankannya -tekan ditekannya -tekan ketekan -tekan menekan -tekan menekanan -tekan menekankan -tekan menekannya -tekan penekan -tekan penekanan -tekan tertekan -tekan tertekannya -tekat bertekat -tekel ditekel -tekel menekel -tekel menekelnya -tekel mentekel -teken diteken -teken ditekennya -teken meneken -teken menekennya -teken penekenan -teknik berteknik -teknik keteknikan -teknologi berteknologi -teks diteksi -tekstil pertekstilan -tekstur bertekstur -tekuk bertekuk -tekuk ditekuk -tekuk menekuk -tekuk tertekuk -tekun ditekuni -tekun ketekunan -tekun menekuni -tel betel -tel ditelan -tel ketel -tel ketelan -tel menelan -tel petel -tel setel -tel setelan -tel tertelan -tela ketela -tela penelaan -tela pertelaan -tela setela -telaah ditelaah -telaah menelaah -telaah menelaahnya -telaah penelaah -telaah penelaahan -teladan diteladani -teladan keteladan -teladan keteladanan -teladan meneladani -telah ditelah -telah menelah -telah setelah -telah setelahnya -telak tertelak -telan ditelan -telan ditelannya -telan ketelan -telan menelan -telan menelannya -telan setelan -telan setelannya -telan tertelan -telan tertelannya -telanjang bertelanjang -telanjang ditelanjangi -telanjang ketelanjangan -telanjang menelanjangi -telanjang penelanjangan -telantar ditelantarkan -telantar ketelantaran -telantar menelantarkan -telantar menelantarkannya -telantar mentelantarkan -telantar penelantar -telantar penelantaran -telapak ditelapak -telaten ketelatenan -tele bertele -teledor keteledoran -telefon bertelefon -telefon ditelefon -telefon menelefon -telefon menelefonnya -telefon penelefon -telekomunikasi pertelekomunikasian -telepon bertelepon -telepon ditelepon -telepon menelepon -telepon meneleponnya -telepon penelepon -telepon peneleponnya -telepon pertelepon -televisi ditelevisi -televisi pertelevisian -telikung ditelikung -telikung menelikung -telinga bertelinga -telinga ditelinga -teliti diteliti -teliti ditelitinya -teliti ketelitian -teliti meneliti -teliti menelitinya -teliti peneliti -teliti penelitian -teliti penelitinya -teliti seteliti -teluk seteluk -telungkup menelungkup -telungkup menelungkupkan -telungkup tertelungkup -telur bertelur -telur bertelurnya -telur ditelurkan -telur ditelurkannya -telur menelurkan -telur peneluran -telur petelur -telusur ditelusur -telusur ditelusuri -telusur ketelusuran -telusur menelusur -telusur menelusuri -telusur penelusur -telusur penelusuran -tem berteman -tem menem -tem perteman -tema bertema -tema bertemakan -tema ditemai -tema menemai -tema pertema -temak bertemakan -teman berteman -teman bertemanlah -teman ditemani -teman menemani -teman perteman -teman pertemanan -tembak ditembak -tembak ditembakan -tembak ditembaki -tembak ditembakkan -tembak ditembakkannya -tembak ditembaknya -tembak ketembak -tembak menembak -tembak menembakan -tembak menembaki -tembak menembakkan -tembak menembakkannya -tembak menembaknya -tembak penembak -tembak penembakan -tembak penembakkan -tembak penembaknya -tembak petembak -tembak tertembak -tembak tertembaknya -tembakau pertembakauan -tembang menembang -tembang menembangkan -tembang penembang -tembang penembangan -tembok bertembok -tembok ditembok -tembok menembok -tembok penembokan -tembus ditembus -tembus ditembuskan -tembus ditembusnya -tembus menembus -tembus menembuskan -tembus menembusnya -tembus penembus -tembus penembusan -tembus tertembus -tempa ditempa -tempa ditempakan -tempa menempa -tempa menempai -tempa menempakan -tempa menempanya -tempa penempaan -tempa setempa -tempa tertempa -tempat bertempat -tempat ditempat -tempat ditempati -tempat ditempatkan -tempat ditempatkannya -tempat ditempatnya -tempat ketempat -tempat ketempatan -tempat menempat -tempat menempatan -tempat menempati -tempat menempatkan -tempat menempatkannya -tempat penempat -tempat penempatan -tempat setempat -tempat setempatnya -tempel ditempel -tempel ditempeli -tempel ditempelkan -tempel menempel -tempel menempeli -tempel menempelkan -tempel menempelkannya -tempel menempelnya -tempel penempelan -tempel setempel -tempel tertempel -tempeleng ditempeleng -tempeleng menempeleng -temperamen bertemperamen -temperatur bertemperatur -tempo bertempo -tempuh ditempuh -tempuh ditempuhnya -tempuh menempuh -tempuh menempuhnya -tempuh penempuh -tempur bertempur -tempur penempur -tempur pertempuran -tempur petempur -tempur petempuran -tempur petempurnya -tempurung bertempurung -temu bertemu -temu bertemulah -temu bertemunya -temu betemu -temu ditemu -temu ditemuan -temu ditemui -temu ditemukan -temu ditemukannya -temu ketemu -temu ketemuan -temu ketemukan -temu ketemulah -temu ketemunya -temu menemu -temu menemuan -temu menemui -temu menemukan -temu menemukannya -temu penemu -temu penemuan -temu penemukan -temu penemunya -temu pertemu -temu pertemuan -temu pertemukan -temu petemuan -tenaga bertenaga -tenaga bertenagakan -tenaga ditenagai -tenaga ketenaga -tenaga ketenagaan -tenaga mentenagai -tenak pertenakan -tenak petenak -tenang ditenangkan -tenang ketenangan -tenang menenangi -tenang menenangkan -tenang menenangkannya -tenang penenang -tenang penenangan -tenang setenang -tenar ketenaran -tenar setenar -tenda ditenda -tendang ditendang -tendang ditendangi -tendang ditendangnya -tendang menendang -tendang menendangi -tendang menendangkan -tendang menendangnya -tendang penendang -tendang penendangan -tendang penendangnya -tendang tertendang -tendensi bertendensi -tender ditender -tender ditenderkan -tender menenderkan -teng beteng -teng keteng -teng ketengan -teng meneng -teng menengan -teng menteng -teng peneng -teng pertengan -teng setengan -tengadah menengadah -tengadah menengadahkan -tengah ditengah -tengah ditengahi -tengah ditengahnya -tengah ketengah -tengah menengah -tengah menengahi -tengah menengahkan -tengah menengahnya -tengah penengah -tengah penengahan -tengah penengahnya -tengah pertengah -tengah pertengahan -tengah petengahan -tengah setengah -tengah setengahnya -tengak menengak -tengak penengak -tengak penengakan -tengar ditengari -tengara ditengarai -tengara menengarai -tengas menengaskan -tenggak ditenggak -tenggak ditenggaknya -tenggak menenggak -tenggak menenggaknya -tenggak penenggak -tenggang bertenggang -tenggang menenggang -tenggara ditenggarai -tenggara menenggarai -tenggat ditenggat -tenggelam ditenggelamkan -tenggelam ditenggelamkannya -tenggelam menenggelamkan -tenggelam menenggelamkannya -tenggelam penenggelaman -tengger bertengger -tengger bertenggernya -tengkar bertengkar -tengkar pertengkaran -tengok ditengok -tengok menengok -tengok menengoknya -tenis petenis -tenis petenisnya -tenor bertenor -tensi bertensi -tensi ditensi -tensi petensi -tentakel bertentakel -tentang bertentang -tentang bertentangan -tentang ditentang -tentang ditentangnya -tentang menentang -tentang menentangnya -tentang penentang -tentang penentangan -tentang penentangnya -tentang pertentangan -tentara ketentaraan -tenteng ditenteng -tenteng menenteng -tenteram ketenteraman -tenteram menenteramkan -tenuk menenukan -tenun ditenun -tenun menenun -tenun penenun -tenun penenunan -tenun pertenunan -tenun petenun -teori berteori -tepat bertepatan -tepat ditepati -tepat ketepatan -tepat menepati -tepat menepatkan -tepat penepatan -tepat setepat -tepi bertepi -tepi ditepi -tepi ditepian -tepi ditepikan -tepi menepi -tepi menepikan -tepi menepilah -tepi menepinya -tepi penepi -tepik ditepikan -tepik menepikan -tepis ditepis -tepis ditepisnya -tepis menepis -tepis menepiskan -tepis menepisnya -tepis tertepis -tepuk bertepuk -tepuk ditepuk -tepuk menepuk -tepuk menepukkan -tepung bertepung -ter keteran -ter meneri -ter menter -ter menteri -ter meter -ter meteran -ter meteri -ter meternya -ter pener -ter peter -tera beterai -tera ditera -tera diterakan -tera ketera -tera menerakan -tera meterai -tera peneraan -tera setera -tera tertera -terak diterakan -terak menerakan -teral meneral -terampil keterampilan -teran keteran -teran keteranan -teran meteran -teran meterannya -terang diterangi -terang diterangkan -terang diterangkannya -terang keterang -terang keterangan -terang keterangnya -terang menerangan -terang menerangi -terang menerangkan -terang menerangkannya -terang menterang -terang penerang -terang penerangan -terang seterang -terap diterapi -terap diterapkan -terap diterapkannya -terap menerap -terap menerapan -terap menerapi -terap menerapkan -terap menerapkannya -terap penerap -terap penerapan -terap penerapkan -terapi diterapi -terapi menerapi -teras diteras -teras penterasi -terasi penterasi -terawang diterawang -terawang menerawang -terawang penerawangan -terbang berterbangan -terbang beterbangan -terbang diterbangi -terbang diterbangkan -terbang diterbangkannya -terbang menerbangan -terbang menerbangi -terbang menerbangkan -terbang menerbangkannya -terbang penerbang -terbang penerbangan -terbang penerbangnya -terbit diterbitkan -terbit diterbitkannya -terbit menerbitan -terbit menerbitkan -terbit menerbitkannya -terbit penerbit -terbit penerbitan -terbit penerbitkan -terbit penerbitnya -teri meneri -teri menerikan -teri menteri -teri menterian -teri menterilah -teri menterinya -teri meteri -teriak berteriak -teriak beteriak -teriak diteriakan -teriak diteriaki -teriak diteriakkan -teriak meneriakan -teriak meneriaki -teriak meneriakkan -terik menerikan -terik menerikkan -terik meterik -terika menerika -terika seterika -terima berterima -terima diterima -terima diterimakan -terima diterimanya -terima keterima -terima menerima -terima menerimanya -terima penerima -terima penerimaan -terima penerimanya -terin menterin -tering metering -terjang diterjang -terjang menerjang -terjang menerjangnya -terjemah diterjemahkan -terjemah diterjemahkannya -terjemah menerjemah -terjemah menerjemahkan -terjemah menerjemahkannya -terjemah menterjemahkan -terjemah menterjemahkannya -terjemah penerjemah -terjemah penerjemahan -terjemah penerjemahnya -terjemah penterjemah -terjemah penterjemahan -terjun diterjunkan -terjun diterjunkannya -terjun menerjuni -terjun menerjunkan -terjun penerjun -terjun penerjunan -terjun peterjun -terka diterka -terka menerka -terkam diterkam -terkam diterkamnya -terkam menerkam -terkam menerkamnya -terkam penerkaman -terlalu keterlaluan -terminal diterminal -terminasi diterminasi -terna diternakan -terna perternakan -terna peternakan -terna peternakannya -ternak berternak -ternak beternak -ternak diternak -ternak diternakan -ternak diternakkan -ternak perternak -ternak perternakan -ternak peternak -ternak peternakan -ternak peternaknya -terobos diterobos -terobos menerobos -terobos menerobosnya -terobos penerobos -terobos penerobosan -teropong diteropong -teropong meneropong -teropong peneropongan -teror diteror -teror meneror -teror menerornya -teror menteror -teror meteror -teror peneror -teror peneroran -teror terteror -terpa diterpa -terpa diterpakan -terpa menerpa -terpa menerpakan -terpa menerpanya -tertib ditertibkan -tertib ditertibkannya -tertib ketertiban -tertib menertiban -tertib menertibkan -tertib menertibkannya -tertib mentertibkan -tertib penertib -tertib penertiban -tertib penertibkan -teruk diterukan -terus berterus -terus diteruskan -terus diteruskannya -terus keterusan -terus menerus -terus meneruskan -terus meneruskannya -terus penerus -terus penerusan -terus penerusnya -terus seterusnya -tes dites -tes menes -tes mentes -tetak menetak -tetak penetak -tetangga bertetangga -tetangga bertetanggaan -tetap bertetapan -tetap ditetap -tetap ditetapan -tetap ditetapkan -tetap ditetapkannya -tetap ketetapan -tetap menetap -tetap menetapan -tetap menetapi -tetap menetapkan -tetap menetapkannya -tetap menetapnya -tetap mentetapkan -tetap penetap -tetap penetapan -tetap penetapkan -tetapi menetapi -tetas ditetaskan -tetas menetas -tetas menetaskan -tetas menetasnya -tetas penetas -tetas penetasan -tetek menetek -teter keteter -teter keteteran -teter meneteri -tetes ditetesi -tetes diteteskan -tetes menetes -tetes meneteskan -tetes penetesan -tetes setetes -tewas ditewaskan -tewas menewaskan -tewas menewaskannya -tiada ditiadakan -tiada ditiadakannya -tiada ketiadaan -tiada meniadakan -tiada meniadakannya -tiada peniadaan -tiaga meniagakan -tiam setiaman -tian setian -tian setiani -tiang bertiang -tiap ditiap -tiap setiap -tib ditiban -tib ketiban -tib tertib -tib tertiban -tib tertibkan -tib tertibnya -tiba ketibaan -tiba setiba -tiba setibanya -tiban ditiban -tiban ketiban -tiban tertiban -tidak bertidak -tidak ketidak -tidak menidak -tidak penidakan -tidak setidak -tidak setidaknya -tidur ditiduri -tidur ditidurkan -tidur ketiduran -tidur meniduri -tidur menidurkan -tidur menidurkannya -tidur tertidur -tiga bertiga -tiga ditiga -tiga ketiga -tiga ketiganya -tiga pertiga -tiga pertigaan -tiga pertiganya -tigas ketigas -tigas petigas -tik betik -tik ketik -tik ketikan -tik ketikkan -tik ketiknya -tik menik -tik menikkan -tik mentik -tik metik -tik petik -tik petikan -tika bertikai -tika ketika -tika petikai -tikai bertikai -tikai pertikaian -tikai petikai -tikam ditikam -tikam ditikamnya -tikam menikam -tikam menikamkan -tikam menikamnya -tikam penikam -tikam penikaman -tikam tertikam -tiket bertiket -tikung ditikung -tikung ditikungan -tikung menikung -tilang ditilang -tilang menilang -tilang menilangnya -tilang penilangan -tilang tertilang -tilap ditilap -tilap menilap -tilap penilapan -tilas metilasi -tilas petilasan -tilik ditilik -tilik menilik -tilik penilik -tim beltim -tim ditim -tim setim -tim setimnya -timah pertimahan -timang ditimang -timang menimang -timba ditimba -timba menimba -timba tertimba -timbal bertimbal -timbang ditimbang -timbang ketimbang -timbang ketimbangan -timbang menimbang -timbang menimbangkan -timbang menimbangnya -timbang penimbang -timbang penimbangan -timbang pertimbang -timbang pertimbangan -timbang pertimbangkan -timbang pertimbangnya -timbang petimbangan -timbang setimbang -timbang tertimbang -timbau menimbau -timbel bertimbel -timbil menimbilkan -timbuk menimbukan -timbul ditimbulkan -timbul ditimbulkannya -timbul menimbul -timbul menimbulan -timbul menimbulkan -timbun ditimbun -timbun ditimbuni -timbun menimbun -timbun menimbunnya -timbun penimbun -timbun penimbunan -timbun tertimbun -timbun tertimbunnya -timpa ditimpa -timpa ditimpakan -timpa ketimpa -timpa menimpa -timpa menimpakan -timpa menimpanya -timpa tertimpa -timpal ditimpali -timpal menimpali -timpal setimpal -timpang ketimpangan -timpuk ditimpuk -timpuk ditimpuki -timpuk menimpuk -timpuk menimpuki -timpuk penimpukan -timun ketimun -timun mentimun -timur ditimur -timur ketimuran -timur tertimur -tin bertin -tin bertini -tin metin -tin pentin -tindak bertindak -tindak bertindakan -tindak bertindaklah -tindak bertindaknya -tindak betindak -tindak ditindak -tindak ditindaki -tindak menindak -tindak menindaki -tindak menindaknya -tindak penindak -tindak penindakan -tindak penindakkan -tindas ditindas -tindas menindas -tindas menindasnya -tindas penindas -tindas penindasan -tindas tertindas -tindih ditindih -tindih ketindihan -tindih menindih -tindih menindihnya -tindih tertindih -tindik bertindik -tindik ditindik -tindik menindik -tindik penindikan -ting belting -ting beting -ting keting -ting mening -ting pening -ting penting -ting pentingan -ting pentingkan -ting pentinglah -ting pentingnya -ting peting -ting petingi -ting seting -ting setingan -ting setingi -ting tertingi -tinggal ditinggal -tinggal ditinggali -tinggal ditinggalkan -tinggal ditinggalkannya -tinggal ditinggalnya -tinggal ketinggal -tinggal ketinggalan -tinggal ketinggalkan -tinggal meninggal -tinggal meninggalan -tinggal meninggali -tinggal meninggalkan -tinggal meninggalkannya -tinggal meninggalnya -tinggal peninggalan -tinggal tertinggal -tinggal tertinggalnya -tinggi bertinggi -tinggi ditinggikan -tinggi ketinggi -tinggi ketinggian -tinggi meninggi -tinggi meninggikan -tinggi meningginya -tinggi peninggi -tinggi peninggian -tinggi pentinggi -tinggi pertinggi -tinggi petinggi -tinggi petingginya -tinggi setinggi -tinggi setingginya -tinggi tertinggi -tinggi tertingginya -tingi ketingian -tingi petingi -tingi setingi -tingi tertingi -tingkah bertingkah -tingkah ditingkahi -tingkah pentingkah -tingkat bertingkat -tingkat ditingkat -tingkat ditingkatan -tingkat ditingkatkan -tingkat ditingkatkannya -tingkat ketingkat -tingkat meningkat -tingkat meningkatan -tingkat meningkatkan -tingkat meningkatkannya -tingkat meningkatnya -tingkat peningkat -tingkat peningkatan -tingkat peningkatkan -tingkat pertingkat -tingkat setingkat -tingkat setingkatnya -tinjau ditinjau -tinjau meninjau -tinjau meninjaunya -tinjau peninjau -tinjau peninjauan -tinju bertinju -tinju bertinjunya -tinju ditinju -tinju meninju -tinju meninjunya -tinju peninjuan -tinju petinju -tinju petinjunya -tinta bertinta -tinta meninta -tinting ketinting -tinting meninting -tip ditip -tip ditipkan -tip mentip -tip setip -tipe bertipe -tipe setipe -tipikal bertipikal -tipis ditipiskan -tipis ketipisan -tipis menipis -tipis menipiskan -tipis menipisnya -tipis penipisan -tipis setipis -tipis tertipis -tipis tertipisnya -tipu ditipu -tipu ditipunya -tipu ketipu -tipu menipu -tipu menipunya -tipu penipu -tipu penipuan -tipu tertipu -tir betiri -tir ketir -tir menir -tir meniran -tir petir -tir petirnya -tir setir -tir setirnya -tiran meniran -tiri betiri -tiris ditiriskan -tiris meniriskan -tirta petirtaan -tiru ditiru -tiru ditirukan -tiru ditirunya -tiru meniru -tiru menirukan -tiru menirukannya -tiru menirunya -tiru peniru -tiru peniruan -tirus meniruskan -tis betis -tis betisnya -tis menis -tis penis -tis penisnya -tis petis -tis petisi -titah bertitah -titah dititahkan -titah menitahkan -titel bertitel -titi meniti -titi menitikan -titi peniti -titik bertitik -titik dititik -titik ketitik -titik menitik -titik menitikan -titik menitikkan -titik setitik -titip dititip -titip dititipi -titip dititipkan -titip dititipkannya -titip menitip -titip menitipkan -titip menitipkannya -titip penitip -titip penitipan -tiup bertiup -tiup bertiupnya -tiup ditiup -tiup ditiupkan -tiup ditiupnya -tiup meniup -tiup meniupkan -tiup meniupnya -tiup peniup -tiup peniupan -tiup tertiup -to berto -to beto -to dito -to ditolah -to keto -to ketokan -to meno -to menolah -to meto -to peno -to peto -to seto -todak menodakan -todong ditodong -todong ditodongkan -todong menodong -todong menodongkan -todong menodongkannya -todong menodongnya -todong penodong -todong penodongan -togok petogokan -tohok menohok -tohok tertohok -tok betok -tok ketok -tok ketokan -tok menok -tok mentok -tok mentoknya -tok petok -tok setok -toko ditoko -toko pertokoan -tokoh ditokohkan -tokoh ketokohan -tokoh menokohkan -tokoh penokohan -tol ketol -tol mentol -tol pentol -tol pentolan -tolak bertolak -tolak bertolaknya -tolak ditolak -tolak ditolaknya -tolak menolak -tolak menolakan -tolak menolaknya -tolak penolak -tolak penolakan -tolak penolakkan -tolak tertolak -tolan pentolan -tolan pentolannya -toleh menoleh -toleh menolehkan -toleransi bertoleransi -toleransi ditoleransi -toleransi menoleransi -toleransi menoleransinya -toleransi mentoleransi -tolol ketololan -tolong ditolong -tolong ditolongnya -tolong ketolong -tolong menolong -tolong menolongnya -tolong penolong -tolong penolongnya -tolong pertolongan -tolong petolongan -tolong tertolong -tombak ditombak -tombak ditombaki -tombak menombak -tombok ditomboki -tombok menombok -tombok menomboki -ton belton -ton berton -ton bertoni -ton beton -ton betonnya -ton keton -ton menon -ton menton -ton pelton -ton perton -ton seton -tonase bertonase -tong betong -tong menong -tong petong -tongkat bertongkat -tongkrong ditongkrongi -tonjok ditonjok -tonjok menonjok -tonjol ditonjolkan -tonjol menonjol -tonjol menonjolkan -tonjol menonjolnya -tonjol penonjolan -tonton ditonton -tonton ditontonkan -tonton ditontonnya -tonton menonton -tonton menontonnya -tonton penonton -tonton penontonnya -tonton pentonton -tonton pertontonkan -top bertopi -top setop -topang bertopang -topang ditopang -topang menopang -topang menopangkan -topang menopangnya -topang penopang -topang penopangnya -topang tertopang -topeng bertopeng -topi bertopi -topik bertopik -toreh ditoreh -toreh ditorehkan -toreh ditorehkannya -toreh ditorehnya -toreh menoreh -toreh menorehkan -toreh menorehkannya -toreh penoreh -toreh tertoreh -torpedo ditorpedo -torpedo menorpedo -torpedo mentorpedo -tos bertos -tos menos -tos mentos -toyor ditoyor -toyor menoyor -tra metra -tra petra -tra setra -tradisi bertradisi -tradisi ditradisikan -tradisi mentradisi -tradisi mentradisikan -tragis setragis -traktir ditraktir -traktir menraktir -traktir mentraktir -transaksi bertransaksi -transaksi ditransaksi -transaksi ditransaksikan -transaksi mentransaksikan -transfer ditransfer -transfer ditransferkan -transfer ditransfernya -transfer menransfer -transfer mentransfer -transfer mentransferkan -transfer mentransfernya -transfer pentransferan -transformasi bertransformasi -transformasi ditransformasi -transformasi ditransformasikan -transformasi mentransformasi -transformasi mentransformasikan -transfusi ditransfusi -transfusi ditransfusikan -transisi bertransisi -transkrip ditranskrip -transkrip mentranskrip -translasi mentranslasikan -transmigrasi bertransmigrasi -transmigrasi ditransmigrasikan -transmigrasi ketransmigrasian -transmisi bertransmisi -transmisi ditransmisi -transmisi ditransmisikan -transmisi mentransmisi -transmisi mentransmisikan -transparan setransparan -transplantasi ditransplantasi -transplantasi ditransplantasikan -transplantasi mentransplantasi -transplantasi mentransplantasikan -transportasi bertransportasi -transportasi ditransportasikan -transportasi mentransportasikan -trayek bertrayek -tres ditres -tres metres -trik metrik -trip setrip -tros petros -truk petruk -truk setruk -trusa penrusakan -tsar pensaran -tua dituai -tua dituakan -tua ketua -tua ketuaan -tua ketuai -tua ketuanya -tua menua -tua menuai -tua menuanya -tua penuaan -tua penuai -tua setua -tua tertua -tua tertuanya -tuah bertuah -tuah betuah -tuah petuah -tuah petuahnya -tuai dituai -tuai ketuai -tuai menuai -tuai menuaikan -tuai penuai -tuak dituakan -tualang bertualang -tualang pertualangan -tualang petualang -tualang petualangan -tuam ketuam -tuan bertuan -tuan ketuan -tuan penuan -tuang dituang -tuang dituangi -tuang dituangkan -tuang dituangkannya -tuang menuang -tuang menuangkan -tuang menuangkannya -tuang penuangan -tuang tertuang -tuas petuas -tuban ketuban -tuban ketubannya -tube metube -tubi bertubi -tubruk bertubrukan -tubruk ditubruk -tubruk menubruk -tubruk menubrukkan -tubuh bertubuh -tubuh ditubuh -tubuh ditubuhnya -tubuh pertubuhan -tubuh setubuhi -tuding dituding -tuding ditudingkan -tuding ditudingnya -tuding menuding -tuding menudingkan -tuding menudingnya -tuding penuding -tuduh dituduh -tuduh dituduhkan -tuduh dituduhkannya -tuduh dituduhnya -tuduh menuduh -tuduh menuduhkan -tuduh menuduhnya -tuduh penuduh -tuduh penuduhan -tuduh penuduhnya -tuduh tertuduh -tudung bertudung -tugas bertugas -tugas bertugasnya -tugas betugas -tugas ditugas -tugas ditugasi -tugas ditugaskan -tugas ditugaskannya -tugas menugasi -tugas menugaskan -tugas menugaskannya -tugas penugas -tugas penugasan -tugas pertugas -tugas petugas -tugas petugasnya -tuhu setuhu -tui menui -tui setui -tuji menuji -tuju bertujuan -tuju betujuan -tuju dituju -tuju ditujuan -tuju ditujukan -tuju ditujukannya -tuju ditujunya -tuju menuju -tuju menujukan -tuju penujukan -tuju pertujukan -tuju setuju -tuju setujuan -tuju setujui -tuju setujulah -tuju setujunya -tuju tertuju -tujuh bertujuh -tujuh ditujuh -tujuh ketujuh -tujuh ketujuhnya -tuk betuk -tuk ketuk -tuk ketukan -tuk mentukan -tuk menuk -tuk menukan -tuk pentuk -tukal penukal -tukang bertukang -tukang ditukangi -tukang menukangi -tukang pertukangan -tukang petukangan -tukar bertukar -tukar bertukaran -tukar ditukar -tukar ditukarkan -tukar ditukarnya -tukar menukar -tukar menukarkan -tukar menukarkannya -tukar menukarnya -tukar penukar -tukar penukaran -tukar pertukaran -tukar petukaran -tukar tertukar -tukar tertukarnya -tukas menukas -tukik menukik -tukik menukiknya -tukil menukil -tukung menukung -tulang bertulang -tulang petulangan -tulang setulang -tular ditulari -tular ditularkan -tular ditularkannya -tular ketularan -tular menular -tular menulari -tular menularkan -tular menularkannya -tular menularnya -tular penular -tular penularan -tular tertular -tular tertulari -tular tertularnya -tuli ketulian -tulis bertulis -tulis bertulisan -tulis bertuliskan -tulis betuliskan -tulis ditulis -tulis ditulisi -tulis dituliskan -tulis dituliskannya -tulis ditulisnya -tulis menulis -tulis menulisi -tulis menuliskan -tulis menuliskannya -tulis menulisnya -tulis penulis -tulis penulisan -tulis penulisnya -tulis tertulis -tulis tertuliskan -tulis tertulisnya -tulus ketulusan -tulus setulus -tulus setulusnya -tum ketum -tum ketumnya -tum menuman -tum penum -tuman menuman -tumang penumang -tumbal ditumbalkan -tumbal menumbalkan -tumbang bertumbangan -tumbang ditumbangkan -tumbang menumbang -tumbang menumbangkan -tumbang menumbangkannya -tumbang penumbang -tumbang penumbangan -tumbu bertumbukan -tumbu menumbukan -tumbu pertumbuan -tumbu setumbu -tumbuh bertumbuh -tumbuh bertumbuhan -tumbuh bertumbuhnya -tumbuh ditumbuh -tumbuh ditumbuhi -tumbuh ditumbuhkan -tumbuh menumbuh -tumbuh menumbuhan -tumbuh menumbuhkan -tumbuh menumbuhkannya -tumbuh penumbuh -tumbuh penumbuhan -tumbuh pertumbuh -tumbuh pertumbuhan -tumbuh petumbuhan -tumbuk bertumbukan -tumbuk ditumbuk -tumbuk menumbuk -tumbuk menumbukan -tumbuk menumbuknya -tumbuk penumbuk -tumbuk tertumbuk -tumbung pertumbungan -tumis ditumis -tumis menumis -tumit bertumit -tumpah bertumpah -tumpah ditumpahkan -tumpah ketumpahan -tumpah menumpahkan -tumpah menumpahkannya -tumpah penumpahan -tumpah pertumpahan -tumpah tertumpah -tumpal betumpal -tumpang bertumpang -tumpang ditumpang -tumpang ditumpangi -tumpang ditumpangkan -tumpang menumpang -tumpang menumpangi -tumpang menumpangkan -tumpang penumpang -tumpang penumpangan -tumpang penumpangnya -tumpas ditumpas -tumpas menumpas -tumpas menumpaskan -tumpas menumpasnya -tumpas penumpas -tumpas penumpasan -tumpu bertumpu -tumpu bertumpukan -tumpu ditumpukan -tumpu menumpu -tumpu menumpukan -tumpu penumpukan -tumpu setumpukan -tumpu tertumpu -tumpuk bertumpuk -tumpuk bertumpukan -tumpuk bertumpuknya -tumpuk ditumpuk -tumpuk ditumpukan -tumpuk ditumpuki -tumpuk menumpuk -tumpuk menumpukan -tumpuk menumpukkan -tumpuk menumpuknya -tumpuk penumpukan -tumpuk penumpukkan -tumpuk setumpuk -tumpuk setumpukan -tumpuk tertumpuk -tumpul ketumpulan -tumpul menumpul -tumpul menumpulkan -tumu menumukan -tun betun -tun pertuni -tuna ketunaan -tuna menunai -tunai ditunaikan -tunai ditunaikannya -tunai menunai -tunai menunaikan -tunai menunaikannya -tunang bertunangan -tunang pertunangan -tunang petunang -tunas bertunas -tunda ditunda -tunda ditundanya -tunda menunda -tunda menundanya -tunda penunda -tunda penundaan -tunda tertunda -tunda tertundanya -tundang menundang -tunduk ditundukan -tunduk ditundukkan -tunduk ketundukan -tunduk menunduk -tunduk menundukan -tunduk menundukkan -tunduk tertunduk -tung betung -tung betungan -tung pentung -tung pentungan -tung petung -tungau ketungau -tunggak ditunggak -tunggak menunggak -tunggak menunggaknya -tunggak penunggak -tunggak penunggakan -tunggak tertunggak -tunggak tertunggaknya -tunggal ketunggalan -tunggang ditunggangi -tunggang menunggang -tunggang menunggangi -tunggang penunggang -tunggang penunggangan -tunggang penunggangnya -tungging menungging -tunggu ditunggu -tunggu ditunggui -tunggu ditunggunya -tunggu menunggu -tunggu menunggui -tunggu menunggunya -tunggu penunggu -tunggu penunggunya -tunggul menunggul -tunggul menungguli -tungkap menungkap -tungkap menungkapkan -tungkap penungkapan -tungkul penungkulan -tunjam menunjam -tunjam penunjaman -tunjang ditunjang -tunjang menunjang -tunjang menunjangnya -tunjang penunjang -tunjang penunjangnya -tunjuk ditunjuk -tunjuk ditunjukan -tunjuk ditunjukkan -tunjuk ditunjukkannya -tunjuk ditunjuklah -tunjuk ditunjuknya -tunjuk menunjuk -tunjuk menunjukan -tunjuk menunjukkan -tunjuk menunjukkannya -tunjuk menunjuknya -tunjuk pentunjuk -tunjuk penunjuk -tunjuk penunjukan -tunjuk penunjukkan -tunjuk penunjukkannya -tunjuk pertunjukan -tunjuk pertunjukkan -tunjuk pertunjukkannya -tunjuk petunjuk -tunjuk petunjukan -tunjuk petunjuknya -tunjung menunjung -tunjung menunjungi -tunjung penunjung -tuntas dituntaskan -tuntas dituntaskannya -tuntas ketuntasan -tuntas mentuntaskan -tuntas menuntas -tuntas menuntaskan -tuntas menuntaskannya -tuntas penuntas -tuntas penuntasan -tuntas tertuntaskan -tuntun dituntun -tuntun menuntun -tuntun menuntunnya -tuntun penuntun -tuntun penuntunan -tuntut dituntut -tuntut dituntutkan -tuntut dituntutnya -tuntut menuntut -tuntut menuntutnya -tuntut penuntut -tuntut penuntutan -tuntut penuntutnya -tunu menunu -tunu menunukan -tur menturkan -tur menur -tur perturan -tur seturan -turap diturap -turap penurapan -turas peturasan -turnamen diturnamen -turun diturun -turun diturunan -turun dituruni -turun diturunkan -turun diturunkannya -turun keturunan -turun menurun -turun menurunan -turun menuruni -turun menurunkan -turun menurunkannya -turun menurunnya -turun penurun -turun penurunan -turun penurunkan -turus menurus -turus menuruskan -turut berturut -turut berturutan -turut dituruti -turut menurut -turut menuruti -turut menurutkan -turut menurutnya -turut penurut -turut seturut -tus bertus -tus ketus -tus ketusnya -tus memtuskan -tus menus -tus pentus -tus penus -tusuk ditusuk -tusuk ditusukkan -tusuk menusuk -tusuk menusukan -tusuk menusukkan -tusuk menusukkannya -tusuk menusuknya -tusuk penusuk -tusuk penusukan -tusuk tertusuk -tutu betutu -tutu menutu -tutu menutukan -tutuk menutukan -tutur bertutur -tutur dituturkan -tutur dituturkannya -tutur menutur -tutur menuturkan -tutur menuturkannya -tutur menuturnya -tutur penutur -tutur penuturan -tutur penuturnya -tutut ditutut -tutut menutut -tutut penutut -tutut penututan -ua keua -ua memuai -ua menua -ua menuai -ua menuanya -ua penguakan -ua penuaan -ua penuai -ua seuai -ua terua -uai memuai -uai menuai -uai menuaikan -uai pemuaian -uai penuai -uai seuai -uak memuakkan -uak menguak -uak menguaknya -uak penguak -uak penguakan -uan peluan -uan penuan -uang beruang -uang beruangnya -uang diuangkan -uang keuangan -uang menguangkan -uang menuang -uang menuangkan -uang menuangkannya -uang peluang -uang peluangan -uang peluangnya -uang penguangan -uang penuangan -uang peuang -uap beruap -uap diuapkan -uap menguap -uap menguapi -uap menguapkan -uap menguapnya -uap menyuap -uap menyuapi -uap menyuapkan -uap menyuapnya -uap penguapan -uap penyuap -uap penyuapan -uap penyuapnya -uar keuar -uar menguar -uar menguarkan -uba beruba -uba perubaan -ubah berubah -ubah berubahan -ubah berubahlah -ubah berubahnya -ubah beubah -ubah diubah -ubah diubahnya -ubah mengubah -ubah mengubahnya -ubah pengubah -ubah pengubahan -ubah perubah -ubah perubahan -ubah peubahan -uban beruban -ubang diubang -ubang pelubang -ubang pelubangan -ubar mengubar -ubel meubel -uber diuber -uber menguber -ubrak-abrik mengubrak-abrik -ubung mengubungi -ubung mengubungkan -ubung pengubung -ucap berucap -ucap diucap -ucap diucapkan -ucap diucapkannya -ucap mengucap -ucap mengucapan -ucap mengucapkan -ucap mengucapkannya -ucap pengucapan -ucap terucap -ucap terucapkan -ucek mengucek -uda keuda -uda memuda -uda memudakan -uda menuda -uda pemuda -uda pemudanya -uda penudaan -udak memudakan -udang diudang -udang mengudang -udang perudangan -udap mengudap -udar memudar -udar memudarkan -udar memudarnya -udar pemudaran -udara berudara -udara diudara -udara diudarakan -udara keudara -udara mengudara -udara mengudarakan -ude keude -udi pemudi -udik pemudik -udik pemudiknya -udu berudu -uduh menguduh -uduh menuduh -uduh menuduhkan -uduh menuduhnya -uduh penuduh -uduh penuduhan -uduh penuduhnya -uduk menudukkan -udut menyudut -udut menyudutkan -udut menyudutkannya -udut penyudutan -ugut pemugutan -uh memuhi -uh menuhi -uh peluh -uh penuh -uh penuhi -uh penuhlah -uh penuhnya -uh peruh -uit peluit -uit peluitnya -ujang menujang -ujar berujar -ujar diujarkan -ujar pengujaran -uji beruji -uji diuji -uji diujikan -uji diujinya -uji memuji -uji memujinya -uji menguji -uji mengujikan -uji mengujinya -uji menuji -uji penguji -uji pengujian -uji pengujinya -uji teruji -uju berujuan -uju memuju -uju menuju -uju menujukan -uju meuju -uju pengujuan -uju penujukan -uju perujukan -ujud berujud -ujud memujudkan -ujuk berujuk -ujuk menujuk -ujuk menujukan -ujuk menujukkan -ujuk pengujuk -ujuk penujukan -ujuk penujukkan -ujuk perujukan -ujung berujung -ujung diujung -ujung diujungnya -ujung mengujungi -ujung pengujung -ujung seujung -ujung terujung -ukas menukas -ukik menukik -ukik menukiknya -ukir berukir -ukir berukiran -ukir diukir -ukir diukirkan -ukir diukirnya -ukir mengukir -ukir mengukirkan -ukir mengukirnya -ukir pengukir -ukir pengukiran -ukir terukir -ukup menyukupi -ukur berukuran -ukur diukur -ukur diukurnya -ukur mengukur -ukur mengukurnya -ukur menyukur -ukur menyukuri -ukur pengukur -ukur pengukuran -ukur seukuran -ukur terukur -ukur terukurnya -ulah berulah -ulam menyulam -ulam penyulam -ulam penyulaman -ulama keulamaan -ulang belulang -ulang belulangnya -ulang berulang -ulang berulangnya -ulang diulang -ulang diulangi -ulang diulangnya -ulang memulangkan -ulang memulangkannya -ulang mengulang -ulang mengulangi -ulang mengulangnya -ulang pemulang -ulang pemulangan -ulang pengulangan -ulang penyulang -ulang perulangan -ulang terulang -ulang terulangi -ulang terulangnya -ular mengular -ular mengularnya -ular menular -ular menulari -ular menularkan -ular menularkannya -ular menularnya -ular penular -ular penularan -ulas diulas -ulas memulas -ulas memulaskan -ulas memulasnya -ulas mengulas -ulas mengulasnya -ulas pemulas -ulas pengulas -ulas pengulasan -ulas seulas -ulat berulat -ulek diulek -ulek mengulek -ulen diuleni -ulen menguleni -ulet keuletan -ulik diulik -ulik memuliki -ulik mengulik -ulik menguliknya -uling mengulingkan -uling menyuling -uling penyuling -uling penyulingan -ulir berulir -ulir mengulirkan -ulit menguliti -ulit menyulitkan -ulit menyulitkannya -ulit penyulit -ultimatum diultimatum -ultimatum mengultimatum -ulung memulung -ulung pemulung -ulur diulur -ulur diulurkan -ulur mengulur -ulur mengulurkan -ulur menulurkan -ulur penguluran -ulur terulur -um belum -um belumlah -um belumnya -um beum -um beumi -um keum -um mengumkan -um menuman -um penguman -um penum -um perum -um seumlah -uma beluma -uma belumai -uma seuma -uma teruma -uman menuman -uman penguman -umat keumatan -umbai berumbai -umbang menumbang -umbang menumbangkan -umbang menumbangkannya -umbang menyumbang -umbang menyumbangan -umbang menyumbangkan -umbang menyumbangkannya -umbang penumbang -umbang penumbangan -umbang penyumbang -umbang penyumbangnya -umbar diumbar -umbar diumbarnya -umbar mengumbar -umbar mengumbarnya -umbar terumbar -umbra penumbra -umbu menumbukan -umbu terumbu -umbuk menumbuk -umbuk menumbukan -umbuk menumbuknya -umbuk penumbuk -umbul menumbulkan -umi beumi -umi memumikan -umpak mengumpakan -umpama diumpamakan -umpama mengumpamakan -umpama mengumpamakannya -umpama perumpamaan -umpama seumpama -umpama seumpamanya -umpan diumpan -umpan diumpankan -umpan mengumpan -umpan mengumpankan -umpan mengumpankannya -umpan mengumpannya -umpan pengumpan -umpan penumpan -umpat mengumpat -umpuk mengumpukan -umpuk menumpuk -umpuk menumpukan -umpuk menumpukkan -umpuk menumpuknya -umpuk penumpukan -umpuk penumpukkan -umput berumput -umrah berumrah -umu diumukan -umu mengumukan -umu menumukan -umu pengumuan -umuk diumukan -umuk mengumukan -umuk menumukan -umum diumumkan -umum diumumkannya -umum mengumuman -umum mengumumkan -umum mengumumkannya -umum menumumkan -umum pengumuman -umum pengumumkan -umun diumunkan -umun mengumunkan -umun pengumunan -umur berumur -umur diumur -umur seumur -umur seumuran -umur seumurnya -uncang menguncang -unda menunda -unda menundanya -unda penunda -unda penundaan -undak berundak -undan penundan -undang diundang -undang diundangan -undang diundangkan -undang diundangkannya -undang diundangnya -undang mengundang -undang mengundangkan -undang mengundangnya -undang menundang -undang pengundang -undang pengundangan -undang pengundangnya -undang perundang -undang perundangan -undi diundi -undi mengundi -undi pengundian -undi terundi -unduh diunduh -unduh diunduhnya -unduh mengunduh -unduh mengunduhnya -unduh menunduh -unduh pengunduh -unduh pengunduhan -unduh pengunduhnya -unduh terunduh -undur diundur -undur diundurkan -undur diundurnya -undur memundurkan -undur memundurkannya -undur mengundur -undur mengunduran -undur mengundurkan -undur mengundurnya -undur pemunduran -undur pengunduran -undur pengundurkan -undur-undur diundur-undur -undur-undur mengundur-undur -unggal diunggal -unggal keunggalan -unggas perunggasan -unggul diunggulan -unggul diungguli -unggul diunggulkan -unggul diunggulkannya -unggul keunggulan -unggul mengungguli -unggul mengunggulkan -unggul menunggul -unggul menungguli -unggul terunggul -unggut memunggut -unggut pemunggutan -ungka mengungkakan -ungkak mengungkakan -ungkal berungkali -ungkal penungkal -ungkap diungkap -ungkap diungkapan -ungkap diungkapkan -ungkap diungkapkannya -ungkap diungkapnya -ungkap mengungkap -ungkap mengungkapan -ungkap mengungkapkan -ungkap mengungkapkannya -ungkap mengungkapnya -ungkap menungkap -ungkap menungkapkan -ungkap pengungkap -ungkap pengungkapan -ungkap pengungkapkan -ungkap penungkapan -ungkap terungkap -ungkap terungkapkan -ungkap terungkaplah -ungkap terungkapnya -ungkit diungkit -ungkit mengungkit -ungkit mengungkitnya -ungkit pengungkit -ungkul penungkulan -ungkur menyungkurkan -ungsi diungsikan -ungsi mengungsi -ungsi mengungsikan -ungsi mengungsinya -ungsi pengungsi -ungsi pengungsian -ungsi pengungsinya -ungu keunguan -ungu menungu -ungu perungu -uni keunikan -uni keunikannya -uni penguni -unik keunikan -unik keunikkan -unik seunik -unik terunik -unit perunit -unit seunit -unjuk berunjuk -unjuk memunjukkan -unjuk menunjuk -unjuk menunjukan -unjuk menunjukkan -unjuk menunjukkannya -unjuk menunjuknya -unjuk meunjukkan -unjuk pengunjuk -unjuk penunjuk -unjuk penunjukan -unjuk penunjukkan -unjuk penunjukkannya -unjung berunjung -unjung mengunjung -unjung mengunjungi -unjung menunjung -unjung menunjungi -unjung pengunjung -unjung pengunjungnya -unjung penunjung -unsur berunsur -unta seuntai -untai seuntai -unti menyuntikan -unti menyuntikannya -unti penyuntikan -unting menyunting -unting penyunting -unting penyuntingan -untir memuntir -untuk beruntuk -untuk menuntuk -untuk peruntukan -untuk peruntukkan -untuk peruntukkannya -untuk teruntuk -untun beruntun -untun beruntunnya -untun menuntun -untun menuntunnya -untun penuntun -untun penuntunan -untut beruntut -untut menuntut -untut menuntutnya -untut penuntut -untut penuntutan -untut penuntutnya -unyai memunyai -upa berupa -upa berupakan -upa meupakan -upa pelupa -upa perupa -upa perupakan -upacara diupacarai -upah berupah -upah diupah -upah diupahi -upah mengupah -upah pengupahan -upak berupakan -upak meupakan -upak perupakan -upas mengupas -upas mengupasnya -upas pengupas -upas pengupasan -upaya berupaya -upaya diupayakan -upaya diupayakannya -upaya mengupayakan -upaya mengupayakannya -upaya pengupayaan -upil mengupil -urah memurahkan -urah meurah -urah pemurah -urai berurai -urai diurai -urai diuraikan -urai diuraikannya -urai mengurai -urai menguraikan -urai menguraikannya -urai mengurainya -urai pengurai -urai penguraian -urai terurai -urai terurainya -urang mengurang -urang mengurangi -urang mengurangkan -urang pengurang -urang pengurangan -urang pengurangi -urap penurapan -uras menguras -uras mengurasi -uras mengurasnya -uras penguras -uras pengurasan -urat berurat -urat menyurat -urat menyurati -urat menyuratkan -urat menyuratnya -uri peruri -uruk diuruk -uruk menguruk -uruk menurukan -uruk pengurukan -urun mengurunkan -urun menurun -urun menurunan -urun menuruni -urun menurunkan -urun menurunkannya -urun menurunnya -urun meurunkan -urun penurun -urun penurunan -urun penurunkan -urung diurungkan -urung diurungkannya -urung mengurung -urung mengurungi -urung mengurungkan -urung mengurungkannya -urung mengurungnya -urung menurung -urung pemurung -urung pengurungan -urus berurusan -urus diurus -urus diurusi -urus diuruskan -urus diurusnya -urus keurus -urus mengurus -urus mengurusi -urus menguruskan -urus mengurusnya -urus menurus -urus menuruskan -urus pelurus -urus pelurusan -urus pemurus -urus pengurus -urus pengurusan -urus pengurusnya -urus terurus -urut berurut -urut berurutan -urut diurut -urut diurutan -urut diurutkan -urut keurutan -urut memurut -urut mengurut -urut mengurutkan -urut mengurutkannya -urut menurut -urut menuruti -urut menurutkan -urut menurutnya -urut menyurut -urut menyurutkan -urut meurut -urut pengurutan -urut penurut -urut penyurutan -usah berusah -usah berusahan -usah diusahkan -usah menyusahkan -usah pengusah -usah pengusahan -usah perusahan -usaha berusaha -usaha berusahaan -usaha berusahalah -usaha diusahakan -usaha diusahakannya -usaha mengusaha -usaha mengusahakan -usaha mengusahakannya -usaha pengusaha -usaha pengusahaan -usaha pengusahanya -usaha perusaha -usaha perusahaan -usaha peusahaan -usai berusai -usai mengusai -usai seusai -usai seusainya -usak perusak -usak perusakan -usak perusakkan -usak perusaknya -usang peusangan -usap diusap -usap diusapkan -usap mengusap -usap mengusapkan -usap mengusapkannya -usap mengusapnya -usar peusar -usat memusat -usat memusatkan -usat memusatkannya -usat pemusatan -usia berusia -usia beusia -usia diusia -usia diusianya -usia menusia -usia seusia -usia seusianya -usik diusik -usik mengusik -usik mengusiknya -usik pemusik -usik terusik -usik terusiknya -usil diusili -usil keusilan -usil mengusili -usir diusir -usir diusirnya -usir mengusir -usir mengusirnya -usir pengusir -usir pengusiran -usir terusir -usir terusirnya -uskup keuskupan -usuk menusuk -usuk menusukan -usuk menusukkan -usuk menusukkannya -usuk menusuknya -usuk menyusuk -usuk penusuk -usuk penusukan -usul diusul -usul diusulkan -usul diusulkannya -usul mengusul -usul mengusulan -usul mengusulkan -usul mengusulkannya -usul menyusul -usul menyusulkan -usul menyusulnya -usul pengusul -usul pengusulan -usul pengusulnya -usung diusung -usung diusungkan -usung diusungnya -usung mengusung -usung mengusungkan -usung mengusungnya -usung pengusung -usung pengusungan -usung pengusungnya -usur mengusur -usur menyusur -usur menyusuri -usur pengusuran -usur penyusuran -usus berususan -usut diusut -usut diusutnya -usut mengusut -usut mengusutnya -usut menyusut -usut menyusutkan -usut menyusutnya -usut pengusut -usut pengusutan -usut penyusutan -utak-atik diutak-atik -utak-atik mengutak-atik -utak-atik mengutak-atiknya -utama diutamakan -utama diutamakannya -utama keutamaan -utama mengutamakan -utama pengutamaan -utama terutama -utama terutamanya -utang berutang -utang diutangi -utang mengutang -utang mengutangi -utang pengutang -utang terutang -utang terutangnya -utara diutarakan -utara diutarakannya -utara mengutarakan -utara mengutarakannya -utas memutasi -utas menutaskan -utas seutas -utik beutik -utuh keutuhan -utuh memutuhkan -utuh seutuhnya -utus diutus -utus diutusnya -utus memutus -utus memutusan -utus memutuskan -utus memutuskannya -utus memutusnya -utus mengutus -utus mengutusnya -utus menutuskan -utus pemutus -utus pemutusan -utus pengutusan -utus perutusan -vak pervak -vaksin divaksin -vaksin memvaksin -vaksin memvaksinkan -vaksinasi divaksinasi -vaksinasi memvaksinasi -vakum kevakuman -valid kevalidan -variasi bervariasi -variasi bervariasinya -variasi divariasikan -variasi memvariasikan -variatif bervariatif -vas divas -vas kevas -vasektomi divasektomi -ve dive -ve seve -vegetasi bervegetasi -ventilasi berventilasi -verifikasi diverifikasi -verifikasi memverifikasi -verifikasi memverifikasinya -verifikasi menverifikasi -verifikasi meverifikasi -verifikasi terverifikasi -versi diversi -veto diveto -veto memveto -veto memvetonya -vide divide -video bervideo -video divideokan -video memvideokan -vila sevila -virus bervirus -visi bervisi -visi divisi -visi divisinya -visi sevisi -visual memvisualkan -visualisasi divisualisasikan -visualisasi memvisualisasi -visualisasi memvisualisasikan -visualisasi memvisualisasikannya -visum divisum -visum memvisum -vitamin bervitamin -voli pevoli -voltase bervoltase -volume bervolume -vonis divonis -vonis divonisnya -vonis memvonis -vonis memvonisnya -vonis menvonis -vonis tervonis -wa diwa -wa menwa -wa mewa -wa perwa -wa sewa -wa sewaan -wa sewakan -wa sewanya -wabah mewabah -wabah mewabahnya -wacana berwacana -wacana diwacanakan -wacana mewacanakan -wadah berwadah -wadah diwadahi -wadah mewadahi -wadah terwadahi -wah mewah -wah mewahnya -wahid terwahid -wajah berwajah -wajah diwajah -wajah diwajahnya -wajah perwajahan -wajar diwajarkan -wajar kewajaran -wajar mewajari -wajar mewajarkan -wajar sewajar -wajar sewajarnya -wajib berwajib -wajib diwajibkan -wajib diwajibkannya -wajib kewajiban -wajib mewajibkan -wajib mewajibkannya -wajib sewajibnya -wak diwak -wak sewakan -wakaf berwakaf -wakaf diwakafkan -wakaf mewakafkan -wakil diwakil -wakil diwakili -wakil diwakilkan -wakil mewakil -wakil mewakili -wakil mewakilkan -wakil mewakilkannya -wakil perwakilan -wakil pewakilan -wakil terwakili -wakil terwakilkan -walah kewalahan -wali diwali -wali perwali -wali perwalian -wan diwan -wan sewan -wana berwana -wang mewangi -wang pewangi -wang sewangi -wangi mewangi -wangi pewangi -wangi sewangi -wanita kewanitaan -wanti-wanti diwanti-wanti -wanti-wanti mewanti-wanti -wara perwara -waralaba diwaralabakan -waralaba mewaralabakan -waralaba pewaralaba -waras kewarasan -warga berwarga -warga kewarga -warga kewargaan -waris diwarisi -waris diwariskan -waris diwariskannya -waris mewarisi -waris mewariskan -waris mewariskannya -waris pewaris -waris pewarisan -waris pewarisnya -warna berwarna -warna bewarna -warna diwarna -warna diwarnai -warna mewarna -warna mewarnai -warna perwarna -warna pewarna -warna pewarnaan -warna pewarnanya -warna sewarna -warna-warni berwarna-warni -warta diwartakan -warta mewartakan -warta pewarta -warta pewartaan -wartawan kewartawanan -wasiat berwasiat -wasiat diwasiatkan -wasiat mewasiatkan -wasit diwasiti -wasit mewasiti -wasit perwasitan -waspada berwaspada -waspada diwaspadai -waspada kewaspadaan -waspada mewaspada -waspada mewaspadai -watak berwatak -watan perwatan -watt perwatt -wawancara diwawancara -wawancara diwawancarai -wawancara mewawancara -wawancara mewawancarai -wawancara pewawancara -wawas berwawasan -wayang perwayangan -wayang pewayangan -we sewe -wenang berwenang -wenang berwenangan -wenang bewenang -wenang kewenang -wenang kewenangan -wenang sewenang -wibawa berwibawa -wibawa kewibawaan -wilayah berwilayah -wilayah diwilayah -wilayah diwilayahnya -wilayah kewilayah -wilayah kewilayahan -wilayah perwilayah -wilayah perwilayahan -wilayah sewilayah -windu sewindu -wing sewing -wira berwira -wira perwira -wira perwiranya -wiraswasta berwiraswasta -wiraswasta kewiraswastaan -wisata berwisata -wisuda diwisuda -wisuda mewisuda -wol sewol -wosi perwosi -wudu berwudu -wujud berwujud -wujud diwujudkan -wujud diwujudkannya -wujud menwujudkan -wujud mewujud -wujud mewujudkan -wujud mewujudkannya -wujud perwujudan -wujud pewujudan -wujud terwujud -wujud terwujudkan -wujud terwujudlah -wujud terwujudnya -wulan sewulan -ya diya -ya keya -ya menya -ya menyakan -ya menyalah -ya penyalah -ya peryaan -yakin diyakin -yakin diyakini -yakin diyakinkan -yakin keyakinan -yakin menyakini -yakin menyakinkan -yakin meyakin -yakin meyakinan -yakin meyakini -yakin meyakinkan -yakin meyakinkannya -yakin penyakin -yakin seyakin -yakin teryakinkan -yakis menyakiskan -yakni diyakni -yakni meyakni -yakut menyakut -yang menyangi -yang menyangkan -yang penyang -yang peyang -ye beye -ye menyelah -yodium beryodium -yoga beryoga -yoga peyoga -yogia seyogianya -yosong menyosong -zakat berzakat -zalim dizalimi -zalim kezaliman -zalim menzalimi -zalim penzaliman -zalim terzalimi -zaman sezaman -ziarah berziarah -ziarah diziarahi -ziarah menziarahi -ziarah penziarah -ziarah peziarah -ziarah peziarahan -zikir berzikir -zina berzina -zina perzinaan -zina pezina -zodiak berzodiak -""" +ID_BASE_LEMMA = { + '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', + 'mereka': 'reka', + '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' +} LOOKUP = {} -for line in ID_BASE_LEMMA.strip().split('\n'): - lemma, word = line.strip().split() - LOOKUP[word] = lemma +LOOKUP.update(ID_BASE_LEMMA) \ No newline at end of file From 8b814c63f172b4765882c02ab298411f08044736 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 27 Jul 2017 19:46:30 +0700 Subject: [PATCH 076/739] more exceptions --- spacy/lang/id/_tokenizer_exceptions_list.py | 2154 ++++++++++++++++++- 1 file changed, 2151 insertions(+), 3 deletions(-) diff --git a/spacy/lang/id/_tokenizer_exceptions_list.py b/spacy/lang/id/_tokenizer_exceptions_list.py index 779273bb6..7ccf0b7b0 100644 --- a/spacy/lang/id/_tokenizer_exceptions_list.py +++ b/spacy/lang/id/_tokenizer_exceptions_list.py @@ -6,24 +6,36 @@ aba-aba abah-abah abal-abal abang-abang +abar-abar abong-abong abrit-abrit -bangsa-bangsa -alih-alih -pertama-tama +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 @@ -35,17 +47,28 @@ 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 @@ -57,17 +80,26 @@ 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 @@ -75,6 +107,9 @@ ancang-ancang ancar-ancar andang-andang andeng-andeng +aneh-aneh +angan-angan +anggar-anggar anggaran-red anggota-anggota anggung-anggip @@ -82,40 +117,59 @@ 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 @@ -126,19 +180,27 @@ 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 @@ -148,16 +210,23 @@ 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 @@ -171,7 +240,10 @@ barau-barau bare-bare bareng-bareng bari-bari +barik-barik +baris-berbaris baru-baru +baru-baru ini baru-batu barung-barung basa-basi @@ -181,18 +253,27 @@ 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 @@ -205,54 +286,748 @@ 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 @@ -261,10 +1036,12 @@ 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 @@ -273,6 +1050,7 @@ bom-bom bomber-bomber bonek-bonek bongkar-bangkir +bongkar-membongkar bongkar-pasang boro-boro bos-bos @@ -281,7 +1059,10 @@ box-to-box boyo-boyo buah-buahan buang-buang +buang-buang air +buat-buatan buaya-buaya +bubun-bubun bugi-bugi build-up built-in @@ -289,62 +1070,93 @@ 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 @@ -355,42 +1167,68 @@ 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 @@ -425,10 +1263,13 @@ 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 @@ -437,8 +1278,10 @@ dulang-dulang duri-duri duta-duta dwi-kewarganegaraan +ecek-ecek eco-friendly eco-park +edan-edanan editor-editor editor-in-chief efek-efek @@ -448,15 +1291,33 @@ 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 @@ -489,75 +1350,127 @@ 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 @@ -566,16 +1479,22 @@ 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 @@ -586,11 +1505,14 @@ 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 @@ -598,6 +1520,7 @@ hiruk-pikuk hitam-putih hitung-hitung hitung-hitungan +hormat-menghormati hot-swappable hotel-hotel how-to @@ -616,17 +1539,29 @@ 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 @@ -634,9 +1569,12 @@ 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 @@ -644,14 +1582,22 @@ 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 @@ -659,24 +1605,46 @@ 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 @@ -688,30 +1656,41 @@ 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 @@ -723,64 +1702,175 @@ 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 @@ -789,15 +1879,22 @@ 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 @@ -806,6 +1903,8 @@ knock-on knock-out ko-as ko-pilot +koak-koak +koboi-koboian kocah-kacih kocar-kacir kodam-kodam @@ -815,11 +1914,14 @@ 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 @@ -831,18 +1933,29 @@ 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 @@ -851,12 +1964,15 @@ 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 @@ -865,42 +1981,73 @@ 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 @@ -910,6 +2057,7 @@ lil-alamin lilin-lilin line-up lintas-selat +lipat-melipat liquid-cooled lithium-ion lithium-polymer @@ -923,6 +2071,8 @@ long-term longak-longok lontang-lanting lontang-lantung +lopak-lapik +lopak-lopak low-cost low-density low-end @@ -936,40 +2086,60 @@ 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 @@ -977,53 +2147,493 @@ 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 @@ -1034,22 +2644,30 @@ 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 @@ -1060,6 +2678,9 @@ nipa-nipa nong-nong norma-norma novel-novel +nyai-nyai +nyolong-nyolong +nyut-nyutan ob-gyn obat-obat obat-obatan @@ -1072,15 +2693,18 @@ 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 @@ -1096,11 +2720,13 @@ 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 @@ -1112,6 +2738,7 @@ opt-in orak-arik orang-aring orang-orang +orang-orangan orat-oret organisasi-organisasi ormas-ormas @@ -1120,20 +2747,26 @@ 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 @@ -1143,22 +2776,27 @@ 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 @@ -1166,18 +2804,27 @@ 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 @@ -1188,10 +2835,13 @@ 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 @@ -1204,24 +2854,33 @@ 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 @@ -1231,16 +2890,22 @@ 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 @@ -1250,6 +2915,7 @@ porak-peranda porak-poranda pos-pos posko-posko +potong-memotong praktek-praktek praktik-praktik produk-produk @@ -1259,20 +2925,27 @@ 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 @@ -1283,39 +2956,65 @@ 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 @@ -1326,97 +3025,226 @@ 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 @@ -1424,13 +3252,28 @@ 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 @@ -1444,7 +3287,10 @@ slintat-slintut slo-mo slow-motion snap-on +sobek-sobekan +sodok-sodokan sok-sokan +solek-menyolek solid-state sorak-sorai sorak-sorak @@ -1454,6 +3300,7 @@ soya-soya spill-resistant split-screen sponsor-sponsor +sponsor-sponsoran srikandi-srikandi staf-staf stand-by @@ -1463,72 +3310,309 @@ 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 @@ -1541,27 +3625,48 @@ 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 @@ -1574,41 +3679,69 @@ 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 @@ -1617,6 +3750,7 @@ umbi-umbian umbul-umbul umbut-umbut uncang-uncit +undak-undakan undang-undang undang-undangnya unduk-unduk @@ -1626,16 +3760,28 @@ 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 @@ -1660,8 +3806,10 @@ wake-up wakil-wakil walk-in walk-out +wangi-wangian wanita-wanita wanti-wanti +wara-wara wara-wiri warna-warna warna-warni From 3cca4ed7983464b85b811cf4b92527759d0c0851 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sat, 29 Jul 2017 17:22:21 +0700 Subject: [PATCH 077/739] added lex attrs rules --- spacy/lang/id/lex_attrs.py | 40 +++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/spacy/lang/id/lex_attrs.py b/spacy/lang/id/lex_attrs.py index ef9e8f897..a614516cb 100644 --- a/spacy/lang/id/lex_attrs.py +++ b/spacy/lang/id/lex_attrs.py @@ -1,4 +1,42 @@ # coding: utf8 from __future__ import unicode_literals -LEX_ATTRS = {} \ No newline at end of file +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: + pre, num = text.split('-') + if pre in ['Ke', 'ke'] and (num.isdigit() or num in _num_words): + return True + return False + + +LEX_ATTRS = { + LIKE_NUM: like_num +} From 7d96d477eabe1bcd18bf07599870ede5ac595aa6 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sat, 29 Jul 2017 17:44:46 +0700 Subject: [PATCH 078/739] updated like_num --- spacy/lang/id/lex_attrs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/id/lex_attrs.py b/spacy/lang/id/lex_attrs.py index a614516cb..f6acd8508 100644 --- a/spacy/lang/id/lex_attrs.py +++ b/spacy/lang/id/lex_attrs.py @@ -31,8 +31,8 @@ def like_num(text): if text in _num_words: return True if text.count('-') == 1: - pre, num = text.split('-') - if pre in ['Ke', 'ke'] and (num.isdigit() or num in _num_words): + _, num = text.split('-') + if num.isdigit() or num in _num_words: return True return False From 4d04898deab0c239b46e7dd30b0fbd65455cbcbf Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sat, 29 Jul 2017 17:44:57 +0700 Subject: [PATCH 079/739] updated regexp --- spacy/lang/id/tokenizer_exceptions.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 84464c31c..ef52996c8 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -44,10 +44,11 @@ ke-annya di-kan di-kannya de-isasi ber-an berke-an""".split() _hyphen_suffix = """el""" -_regular_exp = ['^{p}-*$'.format(p=prefix) for prefix in _hyphen_prefix] -_regular_exp = ['^{p}-*$'.format(p=prefix.title()) for prefix in _hyphen_prefix] -_regular_exp += ['^{0}-*-{1}$'.format(*infix.title().split('-')) for infix in _hyphen_infix] -_regular_exp = ['^*-{s}$'.format(s=suffix) for suffix in _hyphen_suffix] +_regular_exp = ['^{p}-.*$'.format(p=prefix) for prefix in _hyphen_prefix] +_regular_exp += ['^{p}-.*$'.format(p=prefix.title()) for prefix in _hyphen_prefix] +_regular_exp += ['^{p}-.*$'.format(p=prefix.upper()) for prefix in _hyphen_prefix] +_regular_exp += ['^{0}-.*-{1}$'.format(*infix.title().split('-')) for infix in _hyphen_infix] +_regular_exp += ['^.*-{s}$'.format(s=suffix) for suffix in _hyphen_suffix] _regular_exp.append(URL_PATTERN) From 783f7d8b86bf56f9179b163713f36021a721b3d5 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sat, 29 Jul 2017 18:21:07 +0700 Subject: [PATCH 080/739] added test set for Indonesian language --- spacy/tests/lang/id/__init__.py | 0 spacy/tests/lang/id/test_exceptions.py | 0 spacy/tests/lang/id/test_indices.py | 0 spacy/tests/lang/id/test_lemmatizer.py | 0 spacy/tests/lang/id/test_models.py | 0 spacy/tests/lang/id/test_ner.py | 0 spacy/tests/lang/id/test_noun_chunks.py | 0 spacy/tests/lang/id/test_parser.py | 0 spacy/tests/lang/id/test_prefix_suffix_infix.py | 0 spacy/tests/lang/id/test_punct.py | 0 spacy/tests/lang/id/test_sbd.py | 0 spacy/tests/lang/id/test_tagger.py | 0 spacy/tests/lang/id/test_text.py | 0 13 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 spacy/tests/lang/id/__init__.py create mode 100644 spacy/tests/lang/id/test_exceptions.py create mode 100644 spacy/tests/lang/id/test_indices.py create mode 100644 spacy/tests/lang/id/test_lemmatizer.py create mode 100644 spacy/tests/lang/id/test_models.py create mode 100644 spacy/tests/lang/id/test_ner.py create mode 100644 spacy/tests/lang/id/test_noun_chunks.py create mode 100644 spacy/tests/lang/id/test_parser.py create mode 100644 spacy/tests/lang/id/test_prefix_suffix_infix.py create mode 100644 spacy/tests/lang/id/test_punct.py create mode 100644 spacy/tests/lang/id/test_sbd.py create mode 100644 spacy/tests/lang/id/test_tagger.py create mode 100644 spacy/tests/lang/id/test_text.py 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_exceptions.py b/spacy/tests/lang/id/test_exceptions.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_indices.py b/spacy/tests/lang/id/test_indices.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_lemmatizer.py b/spacy/tests/lang/id/test_lemmatizer.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_models.py b/spacy/tests/lang/id/test_models.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_ner.py b/spacy/tests/lang/id/test_ner.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_noun_chunks.py b/spacy/tests/lang/id/test_noun_chunks.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_parser.py b/spacy/tests/lang/id/test_parser.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..e69de29bb diff --git a/spacy/tests/lang/id/test_punct.py b/spacy/tests/lang/id/test_punct.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_sbd.py b/spacy/tests/lang/id/test_sbd.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_tagger.py b/spacy/tests/lang/id/test_tagger.py new file mode 100644 index 000000000..e69de29bb diff --git a/spacy/tests/lang/id/test_text.py b/spacy/tests/lang/id/test_text.py new file mode 100644 index 000000000..e69de29bb From e5adc26c724f449a3d419195cf932716d8b96df8 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sat, 29 Jul 2017 18:21:32 +0700 Subject: [PATCH 081/739] simplified rules --- spacy/lang/id/tokenizer_exceptions.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index ef52996c8..5d5a6fac5 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -5,7 +5,6 @@ import regex as re from ._tokenizer_exceptions_list import ID_BASE_EXCEPTIONS from ..tokenizer_exceptions import URL_PATTERN -from ..char_classes import ALPHA from ...symbols import ORTH @@ -39,18 +38,16 @@ kuartal lintas m macro makro me mem meng micro mid mikro mini multi neo nge no non on pan pasca pe pem poli poly post pra pre pro re se self serba seri sub super t trans ultra un x""".split() -_hyphen_infix = """me-kan me-kannya men-kan men-kannya meng-kannya ke-an -ke-annya di-kan di-kannya de-isasi ber-an berke-an""".split() +_hyphen_infix = """ber-an berke-an de-isasi di-kan di-kannya di-nya ke-an +ke-annya me-kan me-kannya men-kan men-kannya meng-kannya pe-an pen-an +per-an per-i se-an se-nya ter-i ter-kan ter-kannya""".split() _hyphen_suffix = """el""" -_regular_exp = ['^{p}-.*$'.format(p=prefix) for prefix in _hyphen_prefix] -_regular_exp += ['^{p}-.*$'.format(p=prefix.title()) for prefix in _hyphen_prefix] -_regular_exp += ['^{p}-.*$'.format(p=prefix.upper()) for prefix in _hyphen_prefix] -_regular_exp += ['^{0}-.*-{1}$'.format(*infix.title().split('-')) for infix in _hyphen_infix] -_regular_exp += ['^.*-{s}$'.format(s=suffix) for suffix in _hyphen_suffix] +_regular_exp = ['^{p}-[A-Za-z0-9]+$'.format(p=prefix) for prefix in _hyphen_prefix] +_regular_exp += ['^{0}-[A-Za-z0-9]+-{1}$'.format(*infix.split('-')) for infix in _hyphen_infix] +_regular_exp += ['^[A-Za-z0-9]+-{s}$'.format(s=suffix) for suffix in _hyphen_suffix] _regular_exp.append(URL_PATTERN) - TOKENIZER_EXCEPTIONS = dict(_exc) TOKEN_MATCH = re.compile('|'.join('(?:{})'.format(m) for m in _regular_exp), re.IGNORECASE).match From ec63f4fe7ba874995bbb14939ce1d54d4fe8337b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 29 Jul 2017 21:58:37 +0200 Subject: [PATCH 082/739] Add option to control how missing entities are handled when getting NER tags --- spacy/gold.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/gold.pyx b/spacy/gold.pyx index aa5daa41d..39951447c 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -483,7 +483,7 @@ cdef class GoldParse: return not nonproj.is_nonproj_tree(self.heads) -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). @@ -535,7 +535,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 From 27abc56e98fc77667d69006746e1d4f1ce97f830 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 29 Jul 2017 21:59:02 +0200 Subject: [PATCH 083/739] Add method to get beam entities --- spacy/syntax/ner.pyx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 023707aaa..d15de0181 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -141,6 +141,23 @@ cdef class BiluoPushDown(TransitionSystem): 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: From c16ef0a85c3da28b6defda0461263a082b4d1b79 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 29 Jul 2017 21:59:27 +0200 Subject: [PATCH 084/739] Clarify train textcat example --- examples/training/train_textcat.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py index 033cc50a9..eefae111f 100644 --- a/examples/training/train_textcat.py +++ b/examples/training/train_textcat.py @@ -28,8 +28,8 @@ def train_textcat(tokenizer, textcat, batch_sizes = compounding(4., 128., 1.001) for i in range(n_iter): losses = {} - for batch in minibatch(tqdm.tqdm(train_data, leave=False), - size=batch_sizes): + train_data = tqdm.tqdm(train_data, leave=False) # Progress bar + for batch in minibatch(train_data, size=batch_sizes): docs, golds = zip(*batch) textcat.update((docs, None), golds, sgd=optimizer, drop=0.2, losses=losses) @@ -70,7 +70,7 @@ def load_data(): texts, labels = zip(*train_data) cats = [(['POSITIVE'] if y else []) for y in labels] - + split = int(len(train_data) * 0.8) train_texts = texts[:split] @@ -104,7 +104,6 @@ def main(model_loc=None): doc = nlp(u'This movie sucked!') print(doc.cats) - if __name__ == '__main__': plac.call(main) From e9af79a80382639e5fa0a61687c655fe500c110e Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 30 Jul 2017 21:23:01 +0700 Subject: [PATCH 085/739] added u-\d+ rules (sports team) --- spacy/lang/id/tokenizer_exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 5d5a6fac5..57135b4d5 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -36,7 +36,7 @@ amir an antar anti ar as ash asy at ath az bekas ber best bi co di double dual duo e eco eks el era ex full hi high i in inter intra ke kontra korona kuartal lintas m macro makro me mem meng micro mid mikro mini multi neo nge no non on pan pasca pe pem poli poly post pra pre pro re se self serba seri -sub super t trans ultra un x""".split() +sub super t trans u ultra un x \#""".split() _hyphen_infix = """ber-an berke-an de-isasi di-kan di-kannya di-nya ke-an ke-annya me-kan me-kannya men-kan men-kannya meng-kannya pe-an pen-an From bb08d696f9a3eeeff21f547a97279443f5ffa677 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 30 Jul 2017 21:23:28 +0700 Subject: [PATCH 086/739] added hashtag rule and fixed currency rules --- spacy/lang/id/punctuation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py index b72109ba6..d7ee767f7 100644 --- a/spacy/lang/id/punctuation.py +++ b/spacy/lang/id/punctuation.py @@ -11,7 +11,7 @@ _units = (_units + 's bit Gbps Mbps mbps Kbps kbps ƒ ppi px ' 'ratus rb ribu ribuan ' 'juta jt jutaan mill?iar million bil[l]?iun bilyun billion ' ) -_currency = (_currency + r'Rp IDR RMB SGD S\$ ') +_currency = (_currency + r' 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 ' @@ -25,7 +25,7 @@ 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', '[—-]'] + [ From 78e262140f3128cc1e24770e9ec568e9b10a925a Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 1 Aug 2017 01:11:35 +0200 Subject: [PATCH 087/739] Add workaround for displaCy server on Python 2/3 (resolves #1227) Make sure status and headers are bytes on Python 2 and strings on Python 3 --- spacy/compat.py | 8 ++++++++ spacy/displacy/__init__.py | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spacy/compat.py b/spacy/compat.py index c2ab27d7e..4ef24cd8b 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -61,6 +61,14 @@ elif is_python3: json_dumps = lambda data: ujson.dumps(data, indent=2) 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') 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] From 8fce187de430f86861da1808dd47b72bf2bbd513 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 1 Aug 2017 22:10:05 +0200 Subject: [PATCH 088/739] Fix ArcEager for missing values --- spacy/syntax/arc_eager.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index d4367c6df..29e8de0aa 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -362,7 +362,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: From 2e00361522549f922d25c41b1dbfb2a96c6dc8f1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 1 Aug 2017 22:10:17 +0200 Subject: [PATCH 089/739] Fix update when 0 docs --- spacy/language.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spacy/language.py b/spacy/language.py index fad2e2119..0284c4636 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -292,6 +292,11 @@ class Language(object): >>> for docs, golds in epoch: >>> state = nlp.update(docs, golds, sgd=optimizer) """ + 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 tok2vec = self.pipeline[0] feats = tok2vec.doc2feats(docs) grads = {} From ba07e23c8787c097ae1a6646ffc8ca2dea93cc89 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Wed, 2 Aug 2017 22:42:47 +0700 Subject: [PATCH 090/739] added USD in currency rules --- spacy/lang/id/punctuation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/id/punctuation.py b/spacy/lang/id/punctuation.py index d7ee767f7..b8f8c57a8 100644 --- a/spacy/lang/id/punctuation.py +++ b/spacy/lang/id/punctuation.py @@ -11,7 +11,7 @@ _units = (_units + 's bit Gbps Mbps mbps Kbps kbps ƒ ppi px ' 'ratus rb ribu ribuan ' 'juta jt jutaan mill?iar million bil[l]?iun bilyun billion ' ) -_currency = (_currency + r' Rp IDR RMB SGD S\$') +_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 ' @@ -29,7 +29,7 @@ TOKENIZER_PREFIXES.remove('#') # hashtag _prefixes = TOKENIZER_PREFIXES + LIST_CURRENCY + [HTML_PREFIX] + ['/', '—'] _suffixes = TOKENIZER_SUFFIXES + [r'\-[Nn]ya', '-[KkMm]u', '[—-]'] + [ - r'(?<=[0-9])(?:{c})'.format(c=CURRENCY), + 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), From 30fd068d426b01e2be07ce82587e337548980399 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 3 Aug 2017 13:03:02 +0700 Subject: [PATCH 091/739] hashtag prefix should be handled somewhere else --- spacy/lang/id/tokenizer_exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 57135b4d5..3990a15e1 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -36,7 +36,7 @@ amir an antar anti ar as ash asy at ath az bekas ber best bi co di double dual duo e eco eks el era ex full hi high i in inter intra ke kontra korona kuartal lintas m macro makro me mem meng micro mid mikro mini multi neo nge no non on pan pasca pe pem poli poly post pra pre pro re se self serba seri -sub super t trans u ultra un x \#""".split() +sub super t trans u ultra un x""".split() _hyphen_infix = """ber-an berke-an de-isasi di-kan di-kannya di-nya ke-an ke-annya me-kan me-kannya men-kan men-kannya meng-kannya pe-an pen-an From 37f19f5ed2d96df091f320935acc50d19814c0af Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 3 Aug 2017 13:03:25 +0700 Subject: [PATCH 092/739] added more currencies based on corpus data --- spacy/lang/id/norm_exceptions.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spacy/lang/id/norm_exceptions.py b/spacy/lang/id/norm_exceptions.py index 758d9c389..cb168dfeb 100644 --- a/spacy/lang/id/norm_exceptions.py +++ b/spacy/lang/id/norm_exceptions.py @@ -3,7 +3,11 @@ from __future__ import unicode_literals _exc = { "Rp": "$", + "IDR": "$", "RMB": "$", + "USD": "$", + "AUD": "$", + "GBP": "$", } NORM_EXCEPTIONS = {} From cc4772cac20c45eab16b8a57325e273c3434a822 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Thu, 3 Aug 2017 13:08:38 +0700 Subject: [PATCH 093/739] reworks --- spacy/tests/lang/id/test_exceptions.py | 0 spacy/tests/lang/id/test_indices.py | 0 spacy/tests/lang/id/test_lemmatizer.py | 0 spacy/tests/lang/id/test_models.py | 0 spacy/tests/lang/id/test_ner.py | 0 spacy/tests/lang/id/test_noun_chunks.py | 0 spacy/tests/lang/id/test_parser.py | 0 spacy/tests/lang/id/test_prefix_suffix_infix.py | 0 spacy/tests/lang/id/test_punct.py | 0 spacy/tests/lang/id/test_sbd.py | 0 spacy/tests/lang/id/test_tagger.py | 0 spacy/tests/lang/id/test_text.py | 0 12 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 spacy/tests/lang/id/test_exceptions.py delete mode 100644 spacy/tests/lang/id/test_indices.py delete mode 100644 spacy/tests/lang/id/test_lemmatizer.py delete mode 100644 spacy/tests/lang/id/test_models.py delete mode 100644 spacy/tests/lang/id/test_ner.py delete mode 100644 spacy/tests/lang/id/test_noun_chunks.py delete mode 100644 spacy/tests/lang/id/test_parser.py delete mode 100644 spacy/tests/lang/id/test_prefix_suffix_infix.py delete mode 100644 spacy/tests/lang/id/test_punct.py delete mode 100644 spacy/tests/lang/id/test_sbd.py delete mode 100644 spacy/tests/lang/id/test_tagger.py delete mode 100644 spacy/tests/lang/id/test_text.py diff --git a/spacy/tests/lang/id/test_exceptions.py b/spacy/tests/lang/id/test_exceptions.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_indices.py b/spacy/tests/lang/id/test_indices.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_lemmatizer.py b/spacy/tests/lang/id/test_lemmatizer.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_models.py b/spacy/tests/lang/id/test_models.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_ner.py b/spacy/tests/lang/id/test_ner.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_noun_chunks.py b/spacy/tests/lang/id/test_noun_chunks.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_parser.py b/spacy/tests/lang/id/test_parser.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_prefix_suffix_infix.py b/spacy/tests/lang/id/test_prefix_suffix_infix.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_punct.py b/spacy/tests/lang/id/test_punct.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_sbd.py b/spacy/tests/lang/id/test_sbd.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_tagger.py b/spacy/tests/lang/id/test_tagger.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/spacy/tests/lang/id/test_text.py b/spacy/tests/lang/id/test_text.py deleted file mode 100644 index e69de29bb..000000000 From ae1ad810692ee8dc88b965a325cc840b1f648796 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 5 Aug 2017 18:09:32 +0200 Subject: [PATCH 094/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 4bac17503..bf44c31d5 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a6' +__version__ = '2.0.0a7' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 7f876a7a8284a6a0479beb57c265e13a4bec4ea0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 00:00:21 +0200 Subject: [PATCH 095/739] Clean up some unused code in parser --- spacy/syntax/nn_parser.pxd | 4 --- spacy/syntax/nn_parser.pyx | 50 ++++++-------------------------------- 2 files changed, 8 insertions(+), 46 deletions(-) diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd index 524718965..7ff4b9f9f 100644 --- a/spacy/syntax/nn_parser.pxd +++ b/spacy/syntax/nn_parser.pxd @@ -14,8 +14,4 @@ cdef class Parser: cdef readonly TransitionSystem moves cdef readonly object cfg - cdef void _parse_step(self, StateC* state, - const float* feat_weights, - int nr_class, int nr_feat, int nr_piece) nogil - #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 0b39e2216..66787c22a 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -248,15 +248,10 @@ cdef class Parser: nI=token_vector_width) with Model.use_device('cpu'): - if depth == 0: - upper = chain() - upper.is_noop = True - else: - upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) - ) - upper.is_noop = False + upper = chain( + clone(Maxout(hidden_width), (depth-1)), + zero_init(Affine(nr_class, drop_factor=0.0)) + ) # TODO: This is an unfortunate hack atm! # Used to set input dimensions in network. lower.begin_training(lower.ops.allocate((500, token_vector_width))) @@ -394,18 +389,11 @@ cdef class Parser: cdef np.ndarray scores c_token_ids = token_ids.data c_is_valid = is_valid.data - cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): - if not has_hidden: - for i in cython.parallel.prange( - next_step.size(), 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()): - 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) + for i in range(next_step.size()): + 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) vectors = state2vec(token_ids[:next_step.size()]) scores = vec2scores(vectors) c_scores = scores.data @@ -461,28 +449,6 @@ cdef class Parser: 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)) - - state.set_context_tokens(token_ids, nr_feat) - sum_state_features(scores, - feat_weights, token_ids, 1, nr_feat, nr_class * nr_piece) - self.moves.set_valid(is_valid, state) - guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece) - action = self.moves.c[guess] - action.do(state, action.label) - - free(is_valid) - free(scores) - free(token_ids) - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): if losses is not None and self.name not in losses: losses[self.name] = 0. From 468c138ab3923276d36ace9d03586709a5c7f187 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 01:13:23 +0200 Subject: [PATCH 096/739] WIP: Add fine-tuning logic to tagger model, re #1182 --- spacy/_ml.py | 70 ++++++++++++++++++++++++++++++++++++++++++++-- spacy/pipeline.pyx | 14 ++++------ 2 files changed, 73 insertions(+), 11 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index f1ded666e..5f8ce9470 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -19,7 +19,7 @@ from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel -from thinc.api import uniqued, wrap +from thinc.api import uniqued, wrap, flatten_add_lengths from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc @@ -53,6 +53,27 @@ def _logistic(X, drop=0.): 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) @@ -61,6 +82,7 @@ def _zero_init(model): model.W.fill(0.) return model + @layerize def _preprocess_doc(docs, drop=0.): keys = [doc.to_array([LOWER]) for doc in docs] @@ -72,7 +94,6 @@ def _preprocess_doc(docs, drop=0.): return (keys, vals, lengths), None - def _init_for_precomputed(W, ops): if (W**2).sum() != 0.: return @@ -80,6 +101,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"), @@ -323,6 +345,21 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.): return vectors, backward +def fine_tune(model1, combine=None): + def fine_tune_fwd(docs, drop=0.): + X1, bp_X1 = model1.begin_update(docs) + lengths = [len(doc) for doc in docs] + X2 = model1.ops.flatten(X1) + + def fine_tune_bwd(d_output, sgd=None): + bp_X1(d_output, sgd=sgd) + return d_output + + return (X1+X2, lengths), fine_tune_bwd + model = wrap(fine_tune_fwd) + return model + + @layerize def flatten(seqs, drop=0.): if isinstance(seqs[0], numpy.ndarray): @@ -370,6 +407,35 @@ def preprocess_doc(docs, drop=0.): return (keys, vals, lengths), None +def build_tagger_model(nr_class, token_vector_width, **cfg): + with Model.define_operators({'>>': chain, '+': add}): + # Input: (doc, tensor) tuples + embed_docs = with_getitem(0, + FeatureExtracter([NORM]) + >> HashEmbed(token_vector_width, 1000) + >> flatten_add_lengths + ) + + model = ( + fine_tune(embed_docs) + >> + with_getitem(0, + FeatureExtracter([NORM]) + >> HashEmbed(token_vector_width, 1000) + >> flatten_add_lengths + ) + >> with_getitem(1, + flatten_add_lengths) + >> add_tuples + >> with_flatten( + Maxout(token_vector_width, token_vector_width) + >> Softmax(nr_class, token_vector_width) + ) + ) + return model + + + def build_text_classifier(nr_class, width=64, **cfg): nr_vector = cfg.get('nr_vector', 200) with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 947f0a1f1..b96387351 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -42,7 +42,7 @@ 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 build_text_classifier +from ._ml import build_text_classifier, build_tagger_model from .parts_of_speech import X @@ -346,10 +346,8 @@ class NeuralTagger(BaseThincComponent): @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))) - + return build_tagger_model(n_tags, token_vector_width) + def use_params(self, params): with self.model.use_params(params): yield @@ -455,10 +453,8 @@ class NeuralLabeller(NeuralTagger): @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))) - + return build_tagger_model(n_tags, token_vector_width) + def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) cdef int idx = 0 From e9ab800e15ba45ba919387107aadb0cec388872a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 01:50:08 +0200 Subject: [PATCH 097/739] Fix tagging model --- spacy/_ml.py | 27 +++++++++------------------ spacy/pipeline.pyx | 12 +++++++----- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 5f8ce9470..e60e8a610 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -346,16 +346,16 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.): def fine_tune(model1, combine=None): - def fine_tune_fwd(docs, drop=0.): + def fine_tune_fwd(docs_tokvecs, drop=0.): + docs, tokvecs = docs_tokvecs + lengths = model.ops.asarray([len(doc) for doc in docs], dtype='i') X1, bp_X1 = model1.begin_update(docs) - lengths = [len(doc) for doc in docs] - X2 = model1.ops.flatten(X1) def fine_tune_bwd(d_output, sgd=None): - bp_X1(d_output, sgd=sgd) + bp_X1(model1.ops.flatten(d_output), sgd=sgd) return d_output - return (X1+X2, lengths), fine_tune_bwd + return model1.ops.unflatten(X1+X2, lengths), fine_tune_bwd model = wrap(fine_tune_fwd) return model @@ -410,30 +410,21 @@ def preprocess_doc(docs, drop=0.): def build_tagger_model(nr_class, token_vector_width, **cfg): with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples - embed_docs = with_getitem(0, + embed_docs = ( FeatureExtracter([NORM]) + >> flatten >> HashEmbed(token_vector_width, 1000) - >> flatten_add_lengths ) model = ( fine_tune(embed_docs) - >> - with_getitem(0, - FeatureExtracter([NORM]) - >> HashEmbed(token_vector_width, 1000) - >> flatten_add_lengths - ) - >> with_getitem(1, - flatten_add_lengths) - >> add_tuples >> with_flatten( Maxout(token_vector_width, token_vector_width) >> Softmax(nr_class, token_vector_width) ) ) - return model - + model.nI = None + return model def build_text_classifier(nr_class, width=64, **cfg): diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index b96387351..848653c5c 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -253,23 +253,25 @@ class NeuralTagger(BaseThincComponent): self.cfg = dict(cfg) def __call__(self, doc): - tags = self.predict([doc.tensor]) + tags = self.predict(([doc], [doc.tensor])) 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): + docs = list(docs) tokvecs = [d.tensor for d in docs] - tag_ids = self.predict(tokvecs) + tag_ids = self.predict((docs, tokvecs)) self.set_annotations(docs, tag_ids) yield from docs - def predict(self, tokvecs): - scores = self.model(tokvecs) + def predict(self, docs_tokvecs): + scores = self.model(docs_tokvecs) scores = self.model.ops.flatten(scores) guesses = scores.argmax(axis=1) if not isinstance(guesses, numpy.ndarray): guesses = guesses.get() + tokvecs = docs_tokvecs[1] guesses = self.model.ops.unflatten(guesses, [tv.shape[0] for tv in tokvecs]) return guesses @@ -295,7 +297,7 @@ class NeuralTagger(BaseThincComponent): 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_tokvecs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) From 4cfb7a54e78c077dc6ac743ec7ccfe8a3b341ebd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 01:53:31 +0200 Subject: [PATCH 098/739] Fix tagger --- spacy/_ml.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index e60e8a610..c0025e597 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -350,6 +350,7 @@ def fine_tune(model1, combine=None): docs, tokvecs = docs_tokvecs lengths = model.ops.asarray([len(doc) for doc in docs], dtype='i') X1, bp_X1 = model1.begin_update(docs) + X2 = model1.ops.flatten(tokvecs) def fine_tune_bwd(d_output, sgd=None): bp_X1(model1.ops.flatten(d_output), sgd=sgd) From cc19ea0e7ca9c8adfb779dfafb1d534d55d78e5e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 02:17:10 +0200 Subject: [PATCH 099/739] Add update_tensors flag to Language.update. Experimental, re #1182 --- spacy/language.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 0284c4636..4a489387a 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -277,7 +277,8 @@ class Language(object): def make_doc(self, text): return self.tokenizer(text) - def update(self, docs, golds, drop=0., sgd=None, losses=None): + def update(self, docs, golds, drop=0., sgd=None, losses=None, + update_tensors=False): """Update the models in the pipeline. docs (iterable): A batch of `Doc` objects. @@ -310,7 +311,7 @@ class Language(object): 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: + if update_tensors and d_tokvecses is not None: bp_tokvecses(d_tokvecses, sgd=sgd) for key, (W, dW) in grads.items(): sgd(W, dW, key=key) From 0a566dc320a1103569df90791e1ede24f513e78e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 02:18:12 +0200 Subject: [PATCH 100/739] Add update_tensors flag to Language.update. Experimental, re #1182 --- spacy/cli/train.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index af028dae5..9ed621c12 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -91,7 +91,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) nlp.update(docs, golds, sgd=optimizer, - drop=next(dropout_rates), losses=losses) + drop=next(dropout_rates), losses=losses, + update_tensors=True) pbar.update(sum(len(doc) for doc in docs)) with nlp.use_params(optimizer.averages): From 0eec7c9e9b7bfafaa80633942088ce6016e3c918 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 02:18:31 +0200 Subject: [PATCH 101/739] Fix Language.evaluate --- spacy/language.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 4a489387a..3079249f6 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -382,9 +382,13 @@ class Language(object): return optimizer def evaluate(self, docs_golds): - docs, golds = zip(*docs_golds) scorer = Scorer() - for doc, gold in zip(self.pipe(docs, batch_size=32), golds): + docs, golds = zip(*docs_golds) + docs = list(docs) + golds = list(golds) + for pipe in self.pipeline: + docs = pipe.pipe(docs) + for doc, gold in zip(docs, golds): scorer.score(doc, gold) doc.tensor = None return scorer From bfffdeabb2ad16b65a1d5c2b0c0f088d47e7f7cc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 14:10:48 +0200 Subject: [PATCH 102/739] Fix parser batch-size bug introduced during cleanup --- spacy/syntax/nn_parser.pyx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 66787c22a..4be31b4de 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -339,12 +339,10 @@ 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 cdef Doc doc - queue = [] for docs in cytoolz.partition_all(batch_size, docs): docs = list(docs) - tokvecs = [d.tensor for d in docs] + tokvecs = [doc.tensor for doc in docs] if beam_width == 1: parse_states = self.parse_batch(docs, tokvecs) else: @@ -364,6 +362,8 @@ cdef class Parser: int nr_class, nr_feat, nr_piece, nr_dim, nr_state if isinstance(docs, Doc): docs = [docs] + if isinstance(tokvecses, np.ndarray): + tokvecses = [tokvecses] tokvecs = self.model[0].ops.flatten(tokvecses) @@ -395,14 +395,14 @@ cdef class Parser: st.set_context_tokens(&c_token_ids[i*nr_feat], nr_feat) self.moves.set_valid(&c_is_valid[i*nr_class], st) vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) - c_scores = scores.data - for i in range(next_step.size()): - 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) + scores = vec2scores(vectors) + c_scores = scores.data + for i in range(next_step.size()): + 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) this_step, next_step = next_step, this_step next_step.clear() for st in this_step: From 0acce0521b3768dce2029db28168b5ec79aac741 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 14:13:03 +0200 Subject: [PATCH 103/739] Fix Language.update for pipeline --- spacy/language.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index 3079249f6..6d97f41fe 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -387,7 +387,12 @@ class Language(object): docs = list(docs) golds = list(golds) for pipe in self.pipeline: - docs = pipe.pipe(docs) + 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): scorer.score(doc, gold) doc.tensor = None From 3cb8f06881f5991e4de2be4520e201612debb911 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 14:15:14 +0200 Subject: [PATCH 104/739] Fix NeuralLabeller --- spacy/pipeline.pyx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 848653c5c..b87f73c27 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -296,7 +296,6 @@ class NeuralTagger(BaseThincComponent): if self.model.nI is None: self.model.nI = tokvecs[0].shape[1] - tag_scores, bp_tag_scores = self.model.begin_update(docs_tokvecs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) @@ -432,7 +431,7 @@ class NeuralLabeller(NeuralTagger): @property def labels(self): - return self.cfg.get('labels', {}) + return self.cfg.setdefault('labels', {}) @labels.setter def labels(self, value): From 4a5cc8913845accce3033bd751f503dd72d9c2ff Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 14:15:48 +0200 Subject: [PATCH 105/739] Fix tagger 'fine_tune', to keep private CNN weights --- spacy/_ml.py | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index c0025e597..bc08dfbbc 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -5,6 +5,7 @@ from thinc.neural._classes.hash_embed import HashEmbed 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 @@ -207,9 +208,9 @@ class PrecomputableMaxouts(Model): def Tok2Vec(width, embed_size, preprocess=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE] + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): - norm = get_col(cols.index(NORM)) >> HashEmbed(width, embed_size, name='embed_lower') + 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') @@ -218,7 +219,7 @@ def Tok2Vec(width, embed_size, preprocess=None): tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') - >> embed + >> uniqued(embed, column=5) >> Maxout(width, width*4, pieces=3) >> Residual(ExtractWindow(nW=1) >> Maxout(width, width*3)) >> Residual(ExtractWindow(nW=1) >> Maxout(width, width*3)) @@ -319,7 +320,7 @@ def zero_init(model): def doc2feats(cols=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE] + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] def forward(docs, drop=0.): feats = [] for doc in docs: @@ -345,19 +346,26 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.): return vectors, backward -def fine_tune(model1, combine=None): +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') - X1, bp_X1 = model1.begin_update(docs) - X2 = model1.ops.flatten(tokvecs) + + vecs, bp_vecs = embedding.begin_update(docs, drop=drop) + + output = embedding.ops.unflatten( + embedding.ops.flatten(tokvecs) + + embedding.ops.flatten(vecs), + lengths) def fine_tune_bwd(d_output, sgd=None): - bp_X1(model1.ops.flatten(d_output), sgd=sgd) + bp_vecs(d_output, sgd=sgd) return d_output - - return model1.ops.unflatten(X1+X2, lengths), fine_tune_bwd - model = wrap(fine_tune_fwd) + return output, fine_tune_bwd + model = wrap(fine_tune_fwd, embedding) return model @@ -407,18 +415,18 @@ def preprocess_doc(docs, drop=0.): 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, token_vector_width, **cfg): with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples - embed_docs = ( - FeatureExtracter([NORM]) - >> flatten - >> HashEmbed(token_vector_width, 1000) - ) + private_tok2vec = Tok2Vec(token_vector_width, 7500, preprocess=doc2feats()) model = ( - fine_tune(embed_docs) + fine_tune(private_tok2vec) >> with_flatten( Maxout(token_vector_width, token_vector_width) >> Softmax(nr_class, token_vector_width) From 78498a072de1104baefe0e5b075303d24a7828f6 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 14:16:36 +0200 Subject: [PATCH 106/739] Return Transition for missing actions in lookup_action --- spacy/syntax/arc_eager.pyx | 1 + spacy/syntax/transition_system.pyx | 2 ++ 2 files changed, 3 insertions(+) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 29e8de0aa..9477449a5 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -385,6 +385,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] diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index 27b375bba..d3f64f827 100644 --- a/spacy/syntax/transition_system.pyx +++ b/spacy/syntax/transition_system.pyx @@ -107,6 +107,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: From 3ed203de2504edd2b5470ecfa4ef8a5b2e382b2a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 18:33:18 +0200 Subject: [PATCH 107/739] Use LayerNorm and SELU in Tok2Vec --- spacy/_ml.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index bc08dfbbc..f7ab9b259 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -10,6 +10,7 @@ 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.layernorm import LayerNorm as LN from thinc.neural._classes.resnet import Residual from thinc.neural import ReLu from thinc.neural._classes.selu import SELU @@ -220,11 +221,11 @@ def Tok2Vec(width, embed_size, preprocess=None): with_flatten( asarray(Model.ops, dtype='uint64') >> uniqued(embed, column=5) - >> 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)), + >> LN(Maxout(width, width*4, pieces=3)) + >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)), pad=4) ) if preprocess not in (False, None): From 42bd26f6f397c5234b9b82c3daa14c3c0268bd3c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 6 Aug 2017 18:33:46 +0200 Subject: [PATCH 108/739] Give parser its own tok2vec weights --- spacy/syntax/nn_parser.pyx | 40 +++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 4be31b4de..06c61656b 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -237,6 +237,7 @@ cdef class Parser: 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) + tensors = Tok2Vec(token_vector_width, 7500, preprocess=doc2feats()) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -263,7 +264,7 @@ cdef class Parser: 'hidden_width': hidden_width, 'maxout_pieces': parser_maxout_pieces } - return (lower, upper), cfg + return (tensors, lower, upper), cfg def __init__(self, Vocab vocab, moves=True, model=True, **cfg): """ @@ -366,6 +367,7 @@ cdef class Parser: tokvecses = [tokvecses] tokvecs = self.model[0].ops.flatten(tokvecses) + tokvecs += self.model[0].ops.flatten(self.model[0](docs)) nr_state = len(docs) nr_class = self.moves.n_moves @@ -417,6 +419,7 @@ cdef class Parser: cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output tokvecs = self.model[0].ops.flatten(tokvecses) + tokvecs += self.model[0].ops.flatten(self.model[0](docs)) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -457,6 +460,9 @@ cdef class Parser: if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs, drop=0.) + my_tokvecs = self.model[0].ops.flatten(my_tokvecs) + tokvecs += my_tokvecs cuda_stream = get_cuda_stream() @@ -506,7 +512,9 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) - return self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) + d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) + #bp_my_tokvecs(d_tokvecs, sgd=sgd) + return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long @@ -569,7 +577,7 @@ cdef class Parser: return names def get_batch_model(self, batch_size, tokvecs, stream, dropout): - lower, upper = self.model + _, lower, upper = self.model state2vec = precompute_hiddens(batch_size, tokvecs, lower, stream, drop=dropout) return state2vec, upper @@ -659,10 +667,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)) @@ -683,24 +693,29 @@ cdef class Parser: 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)) )) if 'model' in exclude: + exclude['tok2vec_model'] = True exclude['lower_model'] = True exclude['upper_model'] = True exclude.pop('model') @@ -711,6 +726,7 @@ cdef class Parser: ('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))), + ('tok2vec_model', lambda b: None), ('lower_model', lambda b: None), ('upper_model', lambda b: None) )) @@ -720,10 +736,12 @@ cdef class Parser: self.model, cfg = self.Model(self.moves.n_moves) else: cfg = {} + 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 From 5d837c37762cb06a230906be80225e0e421c6cb2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 7 Aug 2017 06:32:59 -0500 Subject: [PATCH 109/739] Add mix weights on fine_tune --- spacy/_ml.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index f7ab9b259..d28f48c42 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -356,17 +356,24 @@ def fine_tune(embedding, combine=None): 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( - embedding.ops.flatten(tokvecs) - + embedding.ops.flatten(vecs), + (model.mix[0] * flat_vecs + model.mix[1] * flat_tokvecs), lengths) def fine_tune_bwd(d_output, sgd=None): bp_vecs(d_output, sgd=sgd) + flat_grad = model.ops.flatten(d_output) + model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() + model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() + sgd(model._mem.weights, model._mem.gradient, key=model.id) return d_output return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) + model.mix = model._mem.add((model.id, 'mix'), (2,)) + model.mix.fill(1.) + model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) return model From 88bf1cf87c874c2e9fa0d88aa28db07907b6ad90 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 8 Aug 2017 15:34:17 -0500 Subject: [PATCH 110/739] Update parser for fine tuning --- spacy/_ml.py | 18 +++++++++--------- spacy/syntax/nn_parser.pyx | 10 +++++----- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index d28f48c42..01f166b9f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -222,11 +222,11 @@ def Tok2Vec(width, embed_size, preprocess=None): asarray(Model.ops, dtype='uint64') >> uniqued(embed, column=5) >> LN(Maxout(width, width*4, pieces=3)) - >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> SELU(width, width*3)), - pad=4) + >> Residual(ExtractWindow(nW=1) >> LN(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) ) if preprocess not in (False, None): tok2vec = preprocess >> tok2vec @@ -432,8 +432,8 @@ def build_tagger_model(nr_class, token_vector_width, **cfg): with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples private_tok2vec = Tok2Vec(token_vector_width, 7500, preprocess=doc2feats()) - - model = ( + + model = ( fine_tune(private_tok2vec) >> with_flatten( Maxout(token_vector_width, token_vector_width) @@ -457,7 +457,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> _flatten_add_lengths >> with_getitem(0, uniqued( - (embed_lower | embed_prefix | embed_suffix | embed_shape) + (embed_lower | embed_prefix | embed_suffix | embed_shape) >> Maxout(width, width+(width//2)*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) @@ -478,7 +478,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0)) >> logistic ) - + model.lsuv = False return model diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 06c61656b..00835f697 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -44,7 +44,7 @@ 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 .._ml import Tok2Vec, doc2feats, rebatch, fine_tune from ..compat import json_dumps from . import _parse_features @@ -237,7 +237,7 @@ cdef class Parser: 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) - tensors = Tok2Vec(token_vector_width, 7500, preprocess=doc2feats()) + tensors = fine_tune(Tok2Vec(token_vector_width, 7500, preprocess=doc2feats())) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -367,7 +367,7 @@ cdef class Parser: tokvecses = [tokvecses] tokvecs = self.model[0].ops.flatten(tokvecses) - tokvecs += self.model[0].ops.flatten(self.model[0](docs)) + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -419,7 +419,7 @@ cdef class Parser: cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output tokvecs = self.model[0].ops.flatten(tokvecses) - tokvecs += self.model[0].ops.flatten(self.model[0](docs)) + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -460,7 +460,7 @@ cdef class Parser: if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs, drop=0.) + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=0.) my_tokvecs = self.model[0].ops.flatten(my_tokvecs) tokvecs += my_tokvecs From dbdd8afc4bb4fa56db69ddca584df7505888e46b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 8 Aug 2017 15:46:07 -0500 Subject: [PATCH 111/739] Fix parser fine-tune training --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 00835f697..31c3801a2 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -513,7 +513,7 @@ cdef class Parser: self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - #bp_my_tokvecs(d_tokvecs, sgd=sgd) + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): From 28e2fec23bf5f654490c8d8f17d551fda190e831 Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 9 Aug 2017 11:52:38 +0200 Subject: [PATCH 112/739] Fix autolinking failure on fresh model install (resolves #1138) On fresh install via subprocess, pip.get_installed_distributions() won't show new model, so is_package check in link command fails. Solution for now is to get model package path explicitly and pass it to link command. --- spacy/cli/download.py | 8 ++++++-- spacy/cli/link.py | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/spacy/cli/download.py b/spacy/cli/download.py index b6e5549da..675ae8cee 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 @@ -32,7 +32,11 @@ def download(cmd, model, direct=False): 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) + # 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 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) From 764540a6dd36b4a51fc6b9f28786aa5ffeaee202 Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 9 Aug 2017 12:16:30 +0200 Subject: [PATCH 113/739] Don't ignore /bin directory --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 52838918c..cb0a8e84e 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,6 @@ venv/ # Distribution / packaging env/ -bin/ build/ develop-eggs/ dist/ From 495e0424291e95846fcccb679c938a0a1e8f6ff1 Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 9 Aug 2017 12:17:30 +0200 Subject: [PATCH 114/739] Add entry point-style auto alias for "spacy" Simplest way to run commands as spacy xxx instead of python -m spacy xxx, while avoiding environment conflicts --- MANIFEST.in | 1 + bin/spacy | 1 + setup.py | 1 + 3 files changed, 3 insertions(+) create mode 100644 bin/spacy 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/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/setup.py b/setup.py index ecdf15536..0a3384ed5 100755 --- a/setup.py +++ b/setup.py @@ -187,6 +187,7 @@ 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', From bcce6f7de0d03c86c5c189381d00de16b6cdbb19 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 9 Aug 2017 16:23:12 -0500 Subject: [PATCH 115/739] Fix parser fine tuning --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 00835f697..31c3801a2 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -513,7 +513,7 @@ cdef class Parser: self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - #bp_my_tokvecs(d_tokvecs, sgd=sgd) + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): From bbace204bec8160936ff8ce9b50b8194b5d94a23 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 9 Aug 2017 16:40:42 -0500 Subject: [PATCH 116/739] Gate parser fine-tuning behind feature flag --- spacy/syntax/nn_parser.pyx | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 31c3801a2..f1f21134c 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -59,8 +59,9 @@ 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 +USE_FINE_TUNE = True def get_templates(*args, **kwargs): return [] @@ -237,7 +238,8 @@ cdef class Parser: 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) - tensors = fine_tune(Tok2Vec(token_vector_width, 7500, preprocess=doc2feats())) + tensors = fine_tune(Tok2Vec(token_vector_width, 7500, + preprocess=doc2feats(cols=[ID, NORM, PREFIX, SUFFIX, TAG]))) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -367,7 +369,8 @@ cdef class Parser: tokvecses = [tokvecses] tokvecs = self.model[0].ops.flatten(tokvecses) - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + if USE_FINE_TUNE: + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -419,7 +422,8 @@ cdef class Parser: cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output tokvecs = self.model[0].ops.flatten(tokvecses) - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + if USE_FINE_TUNE: + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -460,9 +464,10 @@ cdef class Parser: if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=0.) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs + if USE_FINE_TUNE: + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=0.) + my_tokvecs = self.model[0].ops.flatten(my_tokvecs) + tokvecs += my_tokvecs cuda_stream = get_cuda_stream() @@ -513,7 +518,8 @@ cdef class Parser: self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - bp_my_tokvecs(d_tokvecs, sgd=sgd) + if USE_FINE_TUNE: + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): From ac2de6dced7a3fa3d224487c61885b334c493392 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 9 Aug 2017 16:41:25 -0500 Subject: [PATCH 117/739] Switch to ReLu layers in Tok2Vec --- spacy/_ml.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 01f166b9f..d08a43b8e 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -220,12 +220,12 @@ def Tok2Vec(width, embed_size, preprocess=None): tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') - >> uniqued(embed, column=5) + >> embed >> LN(Maxout(width, width*4, pieces=3)) - >> Residual(ExtractWindow(nW=1) >> LN(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)), + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)), pad=4) ) if preprocess not in (False, None): @@ -321,7 +321,8 @@ def zero_init(model): def doc2feats(cols=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] + if cols is None: + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] def forward(docs, drop=0.): feats = [] for doc in docs: From f93f2bed58a5caa8bdfba78c3c3f035c97c790e7 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 9 Aug 2017 17:47:03 -0500 Subject: [PATCH 118/739] Revert use of layer normalization in Tok2Vec --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index d08a43b8e..39041cc22 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -221,7 +221,7 @@ def Tok2Vec(width, embed_size, preprocess=None): with_flatten( asarray(Model.ops, dtype='uint64') >> embed - >> LN(Maxout(width, width*4, pieces=3)) + >> Maxout(width, width*4, pieces=3) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) From f37528ef58c89988eaa8c046d6dd0f0e6144a378 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 9 Aug 2017 17:52:53 -0500 Subject: [PATCH 119/739] Pass embed size for parser fine-tune. Use SELU --- spacy/syntax/nn_parser.pyx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index f1f21134c..eb6117167 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -37,7 +37,8 @@ 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.neural import Model, Affine, ReLu, Maxout +from thinc.neural._classes.selu import SELU from thinc.neural.ops import NumpyOps, CupyOps from thinc.neural.util import get_array_module @@ -238,8 +239,9 @@ cdef class Parser: 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) - tensors = fine_tune(Tok2Vec(token_vector_width, 7500, - preprocess=doc2feats(cols=[ID, NORM, PREFIX, SUFFIX, TAG]))) + embed_size = util.env_opt('embed_size', 7500) + tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, + preprocess=doc2feats(cols=[ID, NORM, PREFIX, SUFFIX, SHAPE]))) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -252,7 +254,7 @@ cdef class Parser: with Model.use_device('cpu'): upper = chain( - clone(Maxout(hidden_width), (depth-1)), + clone(SELU(hidden_width), (depth-1)), zero_init(Affine(nr_class, drop_factor=0.0)) ) # TODO: This is an unfortunate hack atm! From d01dc3704a5339cfd1f576a83f761ba9d6e62e7a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 9 Aug 2017 20:06:33 -0500 Subject: [PATCH 120/739] Adjust parser model --- spacy/syntax/nn_parser.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index eb6117167..a94b94e83 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -241,7 +241,7 @@ cdef class Parser: parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) embed_size = util.env_opt('embed_size', 7500) tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - preprocess=doc2feats(cols=[ID, NORM, PREFIX, SUFFIX, SHAPE]))) + preprocess=doc2feats())) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -254,7 +254,7 @@ cdef class Parser: with Model.use_device('cpu'): upper = chain( - clone(SELU(hidden_width), (depth-1)), + clone(Maxout(hidden_width), (depth-1)), zero_init(Affine(nr_class, drop_factor=0.0)) ) # TODO: This is an unfortunate hack atm! From d42a03b8ded67eabac13122ede58aa5f9e2dd447 Mon Sep 17 00:00:00 2001 From: Nikolai Kruglikov Date: Thu, 10 Aug 2017 14:38:30 +0500 Subject: [PATCH 121/739] Fix small typo in documentation --- website/docs/usage/adding-languages.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/adding-languages.jade b/website/docs/usage/adding-languages.jade index a0b77ad17..4cd65a62d 100644 --- a/website/docs/usage/adding-languages.jade +++ b/website/docs/usage/adding-languages.jade @@ -205,7 +205,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 From 1a59db1c86537c54b8b59e3a2988c6a24749b7f2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 05:44:39 -0500 Subject: [PATCH 122/739] Fix dropout and learn rate in parser --- spacy/syntax/nn_parser.pyx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index a94b94e83..201b988b9 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -39,6 +39,7 @@ from preshed.maps cimport map_get from thinc.api import layerize, chain, noop, clone from thinc.neural import Model, Affine, ReLu, Maxout from thinc.neural._classes.selu import SELU +from thinc.neural._classes.layernorm import LayerNorm from thinc.neural.ops import NumpyOps, CupyOps from thinc.neural.util import get_array_module @@ -467,7 +468,7 @@ cdef class Parser: docs = [docs] golds = [golds] if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=0.) + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) my_tokvecs = self.model[0].ops.flatten(my_tokvecs) tokvecs += my_tokvecs @@ -496,13 +497,13 @@ cdef class Parser: 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_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), From ebe0f7f6418927e92086c1d408c6c9622682efcb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 05:45:20 -0500 Subject: [PATCH 123/739] Pass embed size correctly in tagger, and cache embeddings for efficiency --- spacy/_ml.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 39041cc22..33c6f378b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -23,8 +23,10 @@ from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths + from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc +from . import util import numpy import io @@ -208,6 +210,17 @@ class PrecomputableMaxouts(Model): return Yfp, backward +def drop_layer(layer, factor=1.0): + def drop_layer_fwd(X, drop=0.): + drop *= factor + mask = layer.ops.get_dropout_mask((1,), drop) + if mask is not None and mask[0] == 0.: + return X, lambda dX, sgd=None: dX + else: + return layer.begin_update(X, drop=drop) + return wrap(drop_layer_fwd, layer) + + def Tok2Vec(width, embed_size, preprocess=None): cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): @@ -220,13 +233,13 @@ def Tok2Vec(width, embed_size, preprocess=None): tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') - >> embed - >> Maxout(width, width*4, pieces=3) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)), - pad=4) + >> uniqued(embed >> Maxout(width, width*4, pieces=3), column=5) + >> Residual( + (ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> (ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> (ExtractWindow(nW=1) >> ReLu(width, width*3)) + >> (ExtractWindow(nW=1) >> ReLu(width, width*3)) + ), pad=4) ) if preprocess not in (False, None): tok2vec = preprocess >> tok2vec @@ -430,9 +443,10 @@ def getitem(i): return layerize(getitem_fwd) def build_tagger_model(nr_class, token_vector_width, **cfg): + embed_size = util.env_opt('embed_size', 7500) with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples - private_tok2vec = Tok2Vec(token_vector_width, 7500, preprocess=doc2feats()) + private_tok2vec = Tok2Vec(token_vector_width, embed_size, preprocess=doc2feats()) model = ( fine_tune(private_tok2vec) From 680043ebca7b695933d4935e6d189c54e27fa087 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 08:54:21 -0500 Subject: [PATCH 124/739] Improve efficiency of tagger.set_annotations for GPU --- spacy/pipeline.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index b87f73c27..f367d2b5b 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -284,6 +284,8 @@ class NeuralTagger(BaseThincComponent): 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: From 8870d491f1f4c1b50791484d234c2890f225abef Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 08:55:53 -0500 Subject: [PATCH 125/739] Remove redundant pickling during training --- spacy/cli/train.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 9ed621c12..04aac8319 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -99,8 +99,6 @@ 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( From cd5ecedf6a02c0ce1fe2c2157e2281751cec98cb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 08:56:33 -0500 Subject: [PATCH 126/739] Try drop_layer in parser --- spacy/syntax/nn_parser.pyx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 201b988b9..bd56ba40b 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -47,6 +47,7 @@ from .. import util from ..util import get_async, get_cuda_stream from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune +from .._ml import Residual, drop_layer from ..compat import json_dumps from . import _parse_features @@ -255,7 +256,7 @@ cdef class Parser: with Model.use_device('cpu'): upper = chain( - clone(Maxout(hidden_width), (depth-1)), + clone(drop_layer(Residual(Maxout(hidden_width))), (depth-1)), zero_init(Affine(nr_class, drop_factor=0.0)) ) # TODO: This is an unfortunate hack atm! From 4ab0c8c8e9b3320675e6a5e20d39db0be7fa0210 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 08:56:57 -0500 Subject: [PATCH 127/739] Try different drop_layer structure in Tok2Vec --- spacy/_ml.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 33c6f378b..e37bcac52 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -210,14 +210,14 @@ class PrecomputableMaxouts(Model): return Yfp, backward -def drop_layer(layer, factor=1.0): +def drop_layer(layer, factor=2.): def drop_layer_fwd(X, drop=0.): drop *= factor mask = layer.ops.get_dropout_mask((1,), drop) - if mask is not None and mask[0] == 0.: - return X, lambda dX, sgd=None: dX - else: + if mask is None or mask > 0: return layer.begin_update(X, drop=drop) + else: + return X, lambda dX, sgd=None: dX return wrap(drop_layer_fwd, layer) @@ -229,17 +229,17 @@ def Tok2Vec(width, embed_size, preprocess=None): 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') - embed = (norm | prefix | suffix | shape ) + embed = (norm | prefix | suffix | shape ) >> Maxout(width, width*4, pieces=3) tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') - >> uniqued(embed >> Maxout(width, width*4, pieces=3), column=5) - >> Residual( - (ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> (ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> (ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> (ExtractWindow(nW=1) >> ReLu(width, width*3)) - ), pad=4) + >> uniqued(embed, column=5) + >> drop_layer( + Residual( + (ExtractWindow(nW=1) >> ReLu(width, width*3)) + ) + ) ** 4, pad=4 + ) ) if preprocess not in (False, None): tok2vec = preprocess >> tok2vec From d4f2baf7dd7f0136916aa54c5d2af3ce12a43495 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 12 Aug 2017 21:44:15 +0200 Subject: [PATCH 128/739] Add create_meta option to package command Re-create meta.json in model directory, even if it exists. Especially useful when updating existing spaCy models or training with Prodigy. Ensures user won't end up with multiple "en_core_web_sm" models, and offers easy way to change the model's name and settings without having to edit the meta.json file. --- spacy/cli/package.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 1c720c2b5..9be28d4aa 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: From b353e4d843be9eb55bc89927df1e4d4ec099dc21 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 14:47:45 -0500 Subject: [PATCH 129/739] Work on parser beam training --- setup.py | 1 + spacy/syntax/_beam_utils.pyx | 196 +++++++++++++++++++++++++++++ spacy/syntax/nn_parser.pyx | 27 +++- spacy/tests/parser/test_nn_beam.py | 98 +++++++++++++++ 4 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 spacy/syntax/_beam_utils.pyx create mode 100644 spacy/tests/parser/test_nn_beam.py diff --git a/setup.py b/setup.py index 0a3384ed5..02d4fe0d9 100755 --- a/setup.py +++ b/setup.py @@ -36,6 +36,7 @@ MOD_NAMES = [ 'spacy.syntax.transition_system', 'spacy.syntax.arc_eager', 'spacy.syntax._parse_features', + 'spacy.syntax._beam_utils', 'spacy.gold', 'spacy.tokens.doc', 'spacy.tokens.span', diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx new file mode 100644 index 000000000..4a4b79dad --- /dev/null +++ b/spacy/syntax/_beam_utils.pyx @@ -0,0 +1,196 @@ +# cython: infer_types=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 .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) + + +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 docs + cdef public object golds + cdef public object beams + + def __init__(self, TransitionSystem moves, docs, golds, + int width=4, float density=0.001): + self.moves = moves + self.docs = docs + self.golds = golds + self.beams = [] + cdef Doc doc + cdef Beam beam + for doc in docs: + beam = Beam(self.moves.n_moves, width, density) + beam.initialize(self.moves.init_beam_state, doc.length, doc.c) + self.beams.append(beam) + + @property + def is_done(self): + return all(beam.is_done for beam in 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): + 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: + assert self.golds is not None + 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) + + def _set_scores(self, Beam beam, scores): + for i in range(beam.size): + state = beam.at(i) + for j in range(beam.nr_class): + beam.scores[i][j] = scores[i, j] + self.moves.set_valid(beam.is_valid[i], state.c) + + def _set_costs(self, Beam beam, GoldParse gold, int follow_gold=False): + for i in range(beam.size): + state = beam.at(i) + self.moves.set_costs(beam.is_valid[i], beam.costs[i], state, gold) + if follow_gold: + for j in range(beam.nr_class): + beam.is_valid[i][j] *= beam.costs[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='i', 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) + c_ids += ids.shape[1] + return ids + + +def update_beam(TransitionSystem moves, int nr_feature, + docs, tokvecs, golds, + state2vec, vec2scores, drop=0., sgd=None, + losses=None, int width=4, float density=0.001): + pbeam = ParserBeam(moves, docs, golds, + width=width, density=density) + gbeam = ParserBeam(moves, docs, golds, + width=width, density=density) + beam_map = {} + backprops = [] + violns = [MaxViolation() for _ in range(len(docs))] + example_ids = list(range(len(docs))) + while not pbeam.is_done and not gbeam.is_done: + states, p_indices, g_indices = get_states(example_ids, pbeam, gbeam, beam_map) + + token_ids = get_token_ids(states, nr_feature) + vectors, bp_vectors = state2vec.begin_update(token_ids, drop=drop) + scores, bp_scores = vec2scores.begin_update(vectors, drop=drop) + + backprops.append((token_ids, bp_vectors, bp_scores)) + + p_scores = [scores[indices] for indices in p_indices] + g_scores = [scores[indices] for indices in g_indices] + pbeam.advance(p_scores) + gbeam.advance(g_scores, follow_gold=True) + + for i, violn in enumerate(violns): + violn.check_crf(pbeam[i], gbeam[i]) + + histories = [(v.p_hist + v.g_hist) for v in violns] + losses = [(v.p_probs + v.g_probs) for v in violns] + states_d_scores = get_gradient(moves.n_moves, beam_map, + histories, losses) + return states_d_scores, backprops + + +def get_states(example_ids, pbeams, gbeams, beam_map): + states = [] + seen = {} + p_indices = [] + g_indices = [] + cdef Beam pbeam, gbeam + for eg_id, pbeam, gbeam in zip(example_ids, pbeams, gbeams): + p_indices.append([]) + for j in range(pbeam.size): + key = tuple([eg_id] + pbeam.histories[j]) + seen[key] = len(states) + p_indices[-1].append(len(states)) + states.append(pbeam.at(j)) + beam_map.update(seen) + g_indices.append([]) + for i in range(gbeam.size): + 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(gbeam.at(i)) + + p_indices = numpy.asarray(p_indices, dtype='i') + g_indices = numpy.asarray(g_indices, dtype='i') + return states, p_indices, g_indices + + +def get_gradient(nr_class, beam_map, 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." + """ + nr_step = max(len(hist) for hist in histories) + nr_beam = len(histories) + grads = [numpy.zeros((nr_beam, nr_class), dtype='f') for _ in range(nr_step)] + for hist, loss in zip(histories, losses): + key = tuple() + for j, clas in enumerate(hist): + grads[j][i, clas] = loss + key = key + clas + i = beam_map[key] + return grads + + diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index bd56ba40b..11584e4d2 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -63,6 +63,7 @@ from ..tokens.doc cimport Doc from ..strings cimport StringStore from ..gold cimport GoldParse from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG +from . import _beam_utils USE_FINE_TUNE = True @@ -256,7 +257,7 @@ cdef class Parser: with Model.use_device('cpu'): upper = chain( - clone(drop_layer(Residual(Maxout(hidden_width))), (depth-1)), + clone(Residual(ReLu(hidden_width)), (depth-1)), zero_init(Affine(nr_class, drop_factor=0.0)) ) # TODO: This is an unfortunate hack atm! @@ -526,6 +527,30 @@ cdef class Parser: bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs + def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + docs, tokvecs = docs_tokvecs + tokvecs = self.model[0].ops.flatten(tokvecs) + + cuda_stream = get_cuda_stream() + state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) + + states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, + docs, tokvecs, golds, + state2vec, vec2scores, + drop, sgd, losses) + backprop_lower = [] + for i, d_scores in enumerate(states_d_scores): + ids, bp_vectors, bp_scores = backprops[i] + d_vector = bp_scores(d_scores, sgd=sgd) + backprop_lower.append(( + get_async(cuda_stream, ids), + get_async(cuda_stream, d_vector), + bp_vectors)) + d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) + self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) + lengths = [len(doc) for doc in docs] + return self.model[0].ops.unflatten(d_tokvecs, lengths) + def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long doc will get multiple states. Let's say we have a doc of length 2*N, diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py new file mode 100644 index 000000000..ad0dfa7a1 --- /dev/null +++ b/spacy/tests/parser/test_nn_beam.py @@ -0,0 +1,98 @@ +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 + + +@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 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, docs, golds, beam_width): + return ParserBeam(moves, docs, golds, width=beam_width) + +@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]) + + +def test_update_beam(moves, docs, tokvecs, golds, vector_size): + @layerize + def state2vec(X, drop=0.): + vec = numpy.ones((X.shape[0], vector_size), dtype='f') + return vec, None + @layerize + def vec2scores(X, drop=0.): + scores = numpy.ones((X.shape[0], moves.n_moves), dtype='f') + return scores, None + d_loss, backprops = update_beam(moves, 13, docs, tokvecs, golds, + state2vec, vec2scores, drop=0.0, sgd=None, + losses={}, width=4, density=0.001) + + From d4308d236356e483c60f0119549f5a4da12fe1cc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 17:14:39 -0500 Subject: [PATCH 130/739] Initialize State offset to 0 --- spacy/syntax/_state.pxd | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index c06851978..9aeeba441 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -37,6 +37,7 @@ 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)) + this.offset = 0 cdef int i for i in range(length + (PADDING * 2)): this._ents[i].end = -1 From 4638f4b869ad18c86c227e71e99c462aabd31eba Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 17:15:16 -0500 Subject: [PATCH 131/739] Fix beam update --- spacy/syntax/_beam_utils.pyx | 76 +++++++++++++++++++++--------------- spacy/syntax/nn_parser.pyx | 20 ++++++---- 2 files changed, 58 insertions(+), 38 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 4a4b79dad..10b5e407c 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -41,21 +41,24 @@ cdef hash_t _hash_state(void* _state, void* _) except 0: cdef class ParserBeam(object): cdef public TransitionSystem moves - cdef public object docs + cdef public object states cdef public object golds cdef public object beams - def __init__(self, TransitionSystem moves, docs, golds, + def __init__(self, TransitionSystem moves, states, golds, int width=4, float density=0.001): self.moves = moves - self.docs = docs + self.states = states self.golds = golds self.beams = [] - cdef Doc doc cdef Beam beam - for doc in docs: + cdef StateClass state, st + for state in states: beam = Beam(self.moves.n_moves, width, density) - beam.initialize(self.moves.init_beam_state, doc.length, doc.c) + beam.initialize(self.moves.init_beam_state, state.c.length, state.c._sent) + for i in range(beam.size): + st = beam.at(i) + st.c.offset = state.c.offset self.beams.append(beam) @property @@ -100,34 +103,38 @@ cdef class ParserBeam(object): def get_token_ids(states, int n_tokens): cdef StateClass state cdef np.ndarray ids = numpy.zeros((len(states), n_tokens), - dtype='i', order='C') + 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 -def update_beam(TransitionSystem moves, int nr_feature, - docs, tokvecs, golds, +def update_beam(TransitionSystem moves, int nr_feature, int max_steps, + states, tokvecs, golds, state2vec, vec2scores, drop=0., sgd=None, losses=None, int width=4, float density=0.001): - pbeam = ParserBeam(moves, docs, golds, + pbeam = ParserBeam(moves, states, golds, width=width, density=density) - gbeam = ParserBeam(moves, docs, golds, + gbeam = ParserBeam(moves, states, golds, width=width, density=density) - beam_map = {} + beam_maps = [] backprops = [] - violns = [MaxViolation() for _ in range(len(docs))] - example_ids = list(range(len(docs))) - while not pbeam.is_done and not gbeam.is_done: - states, p_indices, g_indices = get_states(example_ids, pbeam, gbeam, beam_map) + violns = [MaxViolation() for _ in range(len(states))] + for t in range(max_steps): + if pbeam.is_done and gbeam.is_done: + break + beam_maps.append({}) + states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1]) token_ids = get_token_ids(states, nr_feature) vectors, bp_vectors = state2vec.begin_update(token_ids, drop=drop) scores, bp_scores = vec2scores.begin_update(vectors, drop=drop) - + backprops.append((token_ids, bp_vectors, bp_scores)) p_scores = [scores[indices] for indices in p_indices] @@ -140,18 +147,18 @@ def update_beam(TransitionSystem moves, int nr_feature, histories = [(v.p_hist + v.g_hist) for v in violns] losses = [(v.p_probs + v.g_probs) for v in violns] - states_d_scores = get_gradient(moves.n_moves, beam_map, + states_d_scores = get_gradient(moves.n_moves, beam_maps, histories, losses) return states_d_scores, backprops -def get_states(example_ids, pbeams, gbeams, beam_map): - states = [] +def get_states(pbeams, gbeams, beam_map): seen = {} + states = [] p_indices = [] g_indices = [] cdef Beam pbeam, gbeam - for eg_id, pbeam, gbeam in zip(example_ids, pbeams, gbeams): + for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): p_indices.append([]) for j in range(pbeam.size): key = tuple([eg_id] + pbeam.histories[j]) @@ -174,23 +181,30 @@ def get_states(example_ids, pbeams, gbeams, beam_map): return states, p_indices, g_indices -def get_gradient(nr_class, beam_map, histories, losses): +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 = max(len(hist) for hist in histories) - nr_beam = len(histories) - grads = [numpy.zeros((nr_beam, nr_class), dtype='f') for _ in range(nr_step)] - for hist, loss in zip(histories, losses): - key = tuple() - for j, clas in enumerate(hist): - grads[j][i, clas] = loss - key = key + clas - i = beam_map[key] + nr_step = len(beam_maps) + grads = [numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f') + for beam_map in beam_maps] + for eg_id, hists in enumerate(histories): + for loss, hist in zip(losses[eg_id], hists): + key = tuple([eg_id]) + for j, clas in enumerate(hist): + i = beam_maps[j][key] + grads[j][i, clas] = loss + key = key + tuple([clas]) return grads diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 11584e4d2..c842ef00b 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -529,23 +529,29 @@ cdef class Parser: def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): docs, tokvecs = docs_tokvecs + lengths = [len(d) for d in docs] tokvecs = self.model[0].ops.flatten(tokvecs) + states, golds, max_moves = self._init_gold_batch(docs, golds) cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) + state2vec, vec2scores = self.get_batch_model(len(states), tokvecs, cuda_stream, 0.0) - states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, - docs, tokvecs, golds, + states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, max_moves, + states, tokvecs, golds, state2vec, vec2scores, drop, sgd, losses) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): ids, bp_vectors, bp_scores = backprops[i] d_vector = bp_scores(d_scores, sgd=sgd) - backprop_lower.append(( - get_async(cuda_stream, ids), - get_async(cuda_stream, d_vector), - bp_vectors)) + 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, backprop_lower, sgd, cuda_stream) lengths = [len(doc) for doc in docs] From 24b45b45c6bbbb42443d4eb91ec39062a22039d0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 17:15:28 -0500 Subject: [PATCH 132/739] Add test for beam update --- spacy/tests/parser/test_neural_parser.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 42b55745f..30a6367c8 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -78,3 +78,16 @@ def test_predict_doc_beam(parser, tok2vec, model, doc): parser(doc, beam_width=32, beam_density=0.001) for word in doc: print(word.text, word.head, word.dep_) + + +def test_update_doc_beam(parser, tok2vec, model, doc, gold): + parser.model = model + tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) + d_tokvecs = parser.update_beam(([doc], tokvecs), [gold]) + assert d_tokvecs[0].shape == tokvecs[0].shape + def optimize(weights, gradient, key=None): + weights -= 0.001 * gradient + bp_tokvecs(d_tokvecs, sgd=optimize) + assert d_tokvecs[0].sum() == 0. + + From c96d76983626ed1edcd4f513318469b7b7e6a191 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 18:21:54 -0500 Subject: [PATCH 133/739] Fix beam parse. Not sure if working --- spacy/syntax/_beam_utils.pyx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 10b5e407c..3fcd322e2 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -87,8 +87,9 @@ cdef class ParserBeam(object): def _set_scores(self, Beam beam, scores): for i in range(beam.size): state = beam.at(i) - for j in range(beam.nr_class): - beam.scores[i][j] = scores[i, j] + if not state.is_final(): + for j in range(beam.nr_class): + beam.scores[i][j] = scores[i, j] self.moves.set_valid(beam.is_valid[i], state.c) def _set_costs(self, Beam beam, GoldParse gold, int follow_gold=False): @@ -137,8 +138,8 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, backprops.append((token_ids, bp_vectors, bp_scores)) - p_scores = [scores[indices] for indices in p_indices] - g_scores = [scores[indices] for indices in g_indices] + 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] pbeam.advance(p_scores) gbeam.advance(g_scores, follow_gold=True) @@ -176,8 +177,8 @@ def get_states(pbeams, gbeams, beam_map): beam_map[key] = len(states) states.append(gbeam.at(i)) - p_indices = numpy.asarray(p_indices, dtype='i') - g_indices = numpy.asarray(g_indices, dtype='i') + p_indices = [numpy.asarray(idx, dtype='i') for idx in p_indices] + g_indices = [numpy.asarray(idx, dtype='i') for idx in g_indices] return states, p_indices, g_indices @@ -203,7 +204,9 @@ def get_gradient(nr_class, beam_maps, histories, losses): key = tuple([eg_id]) for j, clas in enumerate(hist): i = beam_maps[j][key] - grads[j][i, clas] = loss + # In step j, at state i action clas + # resulted in loss + grads[j][i, clas] += loss key = key + tuple([clas]) return grads From 28e930aae096407cf5dcb0cfda54bcbd881a551c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 19:22:52 -0500 Subject: [PATCH 134/739] Fixes for beam parsing. Not working --- spacy/syntax/_beam_utils.pyx | 41 ++++++++++++++++++++++-------------- spacy/syntax/nn_parser.pyx | 27 +++++++++++++++++++----- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 3fcd322e2..af4aff9fe 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -60,10 +60,16 @@ cdef class ParserBeam(object): st = beam.at(i) st.c.offset = state.c.offset self.beams.append(beam) + + 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(beam.is_done for beam in self.beams) + return all(b.is_done for b in self.beams) def __getitem__(self, i): return self.beams[i] @@ -77,28 +83,31 @@ cdef class ParserBeam(object): 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: - assert self.golds is not None - 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 follow_gold: + assert self.golds is not None + 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) - def _set_scores(self, Beam beam, scores): + def _set_scores(self, Beam beam, float[:, ::1] scores): + cdef float* c_scores = &scores[0, 0] for i in range(beam.size): state = beam.at(i) if not state.is_final(): for j in range(beam.nr_class): - beam.scores[i][j] = scores[i, j] - self.moves.set_valid(beam.is_valid[i], state.c) + beam.scores[i][j] = c_scores[i * beam.nr_class + j] + self.moves.set_valid(beam.is_valid[i], state.c) def _set_costs(self, Beam beam, GoldParse gold, int follow_gold=False): for i in range(beam.size): state = beam.at(i) - self.moves.set_costs(beam.is_valid[i], beam.costs[i], state, gold) - if follow_gold: - for j in range(beam.nr_class): - beam.is_valid[i][j] *= beam.costs[i][j] <= 0 + 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): @@ -122,7 +131,7 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, pbeam = ParserBeam(moves, states, golds, width=width, density=density) gbeam = ParserBeam(moves, states, golds, - width=width, density=density) + width=width, density=0.0) beam_maps = [] backprops = [] violns = [MaxViolation() for _ in range(len(states))] @@ -145,7 +154,7 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, for i, violn in enumerate(violns): violn.check_crf(pbeam[i], gbeam[i]) - + histories = [(v.p_hist + v.g_hist) for v in violns] losses = [(v.p_probs + v.g_probs) for v in violns] states_d_scores = get_gradient(moves.n_moves, beam_maps, diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index c842ef00b..fa954a879 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -66,6 +66,7 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_FINE_TUNE = True +BEAM_PARSE = True def get_templates(*args, **kwargs): return [] @@ -335,7 +336,7 @@ cdef class Parser: return output def pipe(self, docs, int batch_size=1000, int n_threads=2, - beam_width=1, beam_density=0.001): + beam_width=4, beam_density=0.001): """ Process a stream of documents. @@ -348,14 +349,18 @@ cdef class Parser: Yields (Doc): Documents, in order. """ cdef Doc doc + cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): docs = list(docs) tokvecs = [doc.tensor for doc in docs] if beam_width == 1: parse_states = self.parse_batch(docs, tokvecs) else: - parse_states = self.beam_parse(docs, tokvecs, - beam_width=beam_width, beam_density=beam_density) + beams = self.beam_parse(docs, tokvecs, + 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 @@ -462,6 +467,9 @@ cdef class Parser: return beams def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + if BEAM_PARSE: + return self.update_beam(docs_tokvecs, golds, 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 @@ -528,9 +536,16 @@ cdef class Parser: return d_tokvecs def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + if losses is not None and self.name not in losses: + losses[self.name] = 0. docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] tokvecs = self.model[0].ops.flatten(tokvecs) + if USE_FINE_TUNE: + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + my_tokvecs = self.model[0].ops.flatten(my_tokvecs) + tokvecs += my_tokvecs + states, golds, max_moves = self._init_gold_batch(docs, golds) cuda_stream = get_cuda_stream() @@ -554,8 +569,10 @@ cdef class Parser: backprop_lower.append((ids, d_vector, bp_vectors)) d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) - lengths = [len(doc) for doc in docs] - return self.model[0].ops.unflatten(d_tokvecs, lengths) + d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) + if USE_FINE_TUNE: + bp_my_tokvecs(d_tokvecs, sgd=sgd) + return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long From 3e30712b627ea5c5625f4eeeba125b38722bd67a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 19:24:17 -0500 Subject: [PATCH 135/739] Improve defaults --- spacy/pipeline.pyx | 2 +- spacy/syntax/nn_parser.pyx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index f367d2b5b..634d3e4b5 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -138,7 +138,7 @@ class TokenVectorEncoder(BaseThincComponent): 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. diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index fa954a879..8a33a9da1 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -238,12 +238,12 @@ 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): + def Model(cls, nr_class, token_vector_width=128, hidden_width=300, 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) - embed_size = util.env_opt('embed_size', 7500) + embed_size = util.env_opt('embed_size', 4000) tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, preprocess=doc2feats())) if parser_maxout_pieces == 1: From 17874fe4918eeef757bae153342468e166ba9c96 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 12 Aug 2017 19:35:40 -0500 Subject: [PATCH 136/739] Disable beam parsing --- spacy/syntax/nn_parser.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 8a33a9da1..ea61af1df 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -66,7 +66,7 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_FINE_TUNE = True -BEAM_PARSE = True +BEAM_PARSE = False def get_templates(*args, **kwargs): return [] @@ -336,7 +336,7 @@ cdef class Parser: return output def pipe(self, docs, int batch_size=1000, int n_threads=2, - beam_width=4, beam_density=0.001): + beam_width=1, beam_density=0.001): """ Process a stream of documents. From 92ebab6073f29fd919306e9f5775e8f8842692f8 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 13 Aug 2017 08:56:02 +0200 Subject: [PATCH 137/739] Update beam-update tests --- spacy/tests/parser/test_nn_beam.py | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py index ad0dfa7a1..45c85d969 100644 --- a/spacy/tests/parser/test_nn_beam.py +++ b/spacy/tests/parser/test_nn_beam.py @@ -8,6 +8,7 @@ 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 @@ -27,6 +28,10 @@ def moves(vocab): 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 = [] @@ -57,8 +62,8 @@ def vector_size(): @pytest.fixture -def beam(moves, docs, golds, beam_width): - return ParserBeam(moves, docs, golds, width=beam_width) +def beam(moves, states, golds, beam_width): + return ParserBeam(moves, states, golds, width=beam_width) @pytest.fixture def scores(moves, batch_size, beam_width): @@ -80,19 +85,3 @@ def test_beam_advance(beam, scores): def test_beam_advance_too_few_scores(beam, scores): with pytest.raises(IndexError): beam.advance(scores[:-1]) - - -def test_update_beam(moves, docs, tokvecs, golds, vector_size): - @layerize - def state2vec(X, drop=0.): - vec = numpy.ones((X.shape[0], vector_size), dtype='f') - return vec, None - @layerize - def vec2scores(X, drop=0.): - scores = numpy.ones((X.shape[0], moves.n_moves), dtype='f') - return scores, None - d_loss, backprops = update_beam(moves, 13, docs, tokvecs, golds, - state2vec, vec2scores, drop=0.0, sgd=None, - losses={}, width=4, density=0.001) - - From 4ae0d5e1e63903613ed24aa7fea0fe5593c30fe8 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 13 Aug 2017 09:03:38 +0200 Subject: [PATCH 138/739] Set defaults for convert command --- spacy/cli/convert.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index a0a76e5ec..fef6753e6 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -21,10 +21,10 @@ CONVERTERS = { @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), 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): """ Convert files into JSON format for use with train command and other experiment management functions. From 12de2638137c1c8c9f86b687d6296138e0aaa0ea Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 13 Aug 2017 09:33:39 +0200 Subject: [PATCH 139/739] Bug fixes to beam parsing. Learns small sample --- spacy/syntax/_beam_utils.pyx | 81 +++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index af4aff9fe..0a513531d 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -66,7 +66,7 @@ cdef class ParserBeam(object): for beam in self.beams: if beam is not None: _cleanup(beam) - + @property def is_done(self): return all(b.is_done for b in self.beams) @@ -80,6 +80,8 @@ cdef class ParserBeam(object): def advance(self, scores, follow_gold=False): cdef Beam beam for i, beam in enumerate(self.beams): + if beam.is_done: + continue self._set_scores(beam, scores[i]) if self.golds is not None: self._set_costs(beam, self.golds[i], follow_gold=follow_gold) @@ -108,7 +110,22 @@ cdef class ParserBeam(object): for j in range(beam.nr_class): if beam.costs[i][j] >= 1: beam.is_valid[i][j] = 0 - + + +def is_gold(StateClass state, GoldParse gold, 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 + def get_token_ids(states, int n_tokens): cdef StateClass state @@ -123,11 +140,13 @@ def get_token_ids(states, int n_tokens): c_ids += ids.shape[1] return ids - +nr_update = 0 def update_beam(TransitionSystem moves, int nr_feature, int max_steps, states, tokvecs, golds, state2vec, vec2scores, drop=0., sgd=None, losses=None, int width=4, float density=0.001): + global nr_update + nr_update += 1 pbeam = ParserBeam(moves, states, golds, width=width, density=density) gbeam = ParserBeam(moves, states, golds, @@ -139,8 +158,9 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, if pbeam.is_done and gbeam.is_done: break beam_maps.append({}) - states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1]) - + states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1], nr_update) + if not states: + break token_ids = get_token_ids(states, nr_feature) vectors, bp_vectors = state2vec.begin_update(token_ids, drop=drop) scores, bp_scores = vec2scores.begin_update(vectors, drop=drop) @@ -154,6 +174,16 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, for i, violn in enumerate(violns): violn.check_crf(pbeam[i], gbeam[i]) + # The non-monotonic oracle makes it difficult to ensure final costs are + # correct. Therefore do final correction + cdef Beam pred + for i, (pred, gold_parse) in enumerate(zip(pbeam, golds)): + for j in range(pred.size): + if is_gold(pred.at(j), gold_parse, moves.strings): + pred._states[j].loss = 0.0 + elif pred._states[j].loss == 0.0: + pred._states[j].loss = 1.0 + violn.check_crf(pred, gbeam[i]) histories = [(v.p_hist + v.g_hist) for v in violns] losses = [(v.p_probs + v.g_probs) for v in violns] @@ -162,30 +192,35 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, return states_d_scores, backprops -def get_states(pbeams, gbeams, beam_map): +def get_states(pbeams, gbeams, beam_map, nr_update): seen = {} states = [] p_indices = [] g_indices = [] cdef Beam pbeam, gbeam for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): + if pbeam.loss > 0 and pbeam.min_score > (gbeam.score + nr_update): + continue p_indices.append([]) for j in range(pbeam.size): - key = tuple([eg_id] + pbeam.histories[j]) - seen[key] = len(states) - p_indices[-1].append(len(states)) - states.append(pbeam.at(j)) + state = pbeam.at(j) + if not state.is_final(): + key = tuple([eg_id] + pbeam.histories[j]) + seen[key] = len(states) + p_indices[-1].append(len(states)) + states.append(pbeam.at(j)) beam_map.update(seen) g_indices.append([]) for i in range(gbeam.size): - 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(gbeam.at(i)) - + state = gbeam.at(j) + 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(gbeam.at(i)) p_indices = [numpy.asarray(idx, dtype='i') for idx in p_indices] g_indices = [numpy.asarray(idx, dtype='i') for idx in g_indices] return states, p_indices, g_indices @@ -206,12 +241,18 @@ def get_gradient(nr_class, beam_maps, histories, losses): So history is list of lists of lists of ints """ nr_step = len(beam_maps) - grads = [numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f') - for beam_map in beam_maps] + grads = [] + for beam_map in beam_maps: + if beam_map: + grads.append(numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f')) + else: + grads.append(None) for eg_id, hists in enumerate(histories): for loss, hist in zip(losses[eg_id], hists): key = tuple([eg_id]) for j, clas in enumerate(hist): + if grads[j] is None: + continue i = beam_maps[j][key] # In step j, at state i action clas # resulted in loss From 4363b4aa4a757807831d89e1f1b10bc46e8bc69a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 13 Aug 2017 12:36:55 +0200 Subject: [PATCH 140/739] Fix redundant tokvecs updates during update --- spacy/language.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 6d97f41fe..cb679a2bc 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -305,14 +305,17 @@ class Language(object): grads[key] = (W, dW) pipes = list(self.pipeline[1:]) random.shuffle(pipes) + tokvecses, bp_tokvecses = tok2vec.model.begin_update(feats, drop=drop) + all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for 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 update_tensors and d_tokvecses is not None: - bp_tokvecses(d_tokvecses, sgd=sgd) + for i, d_tv in enumerate(d_tokvecses): + all_d_tokvecses[i] += d_tv + bp_tokvecses(all_d_tokvecses, sgd=sgd) for key, (W, dW) in grads.items(): sgd(W, dW, key=key) # Clear the tensor variable, to free GPU memory. From 6a42cc16ff673c738e29aa515c1623dde4cf9566 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 13 Aug 2017 12:37:26 +0200 Subject: [PATCH 141/739] Fix beam parser, improve efficiency of non-beam --- spacy/syntax/_beam_utils.pyx | 39 ++++++++++++------------------------ spacy/syntax/beam_parser.pyx | 14 +------------ spacy/syntax/nn_parser.pyx | 38 +++++++++++++++++++++++------------ 3 files changed, 39 insertions(+), 52 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 0a513531d..6df8d472f 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -1,4 +1,5 @@ # cython: infer_types=True +# cython: profile=True cimport numpy as np import numpy from cpython.ref cimport PyObject, Py_INCREF, Py_XDECREF @@ -155,8 +156,6 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, backprops = [] violns = [MaxViolation() for _ in range(len(states))] for t in range(max_steps): - if pbeam.is_done and gbeam.is_done: - break beam_maps.append({}) states, p_indices, g_indices = get_states(pbeam, gbeam, beam_maps[-1], nr_update) if not states: @@ -174,16 +173,6 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, for i, violn in enumerate(violns): violn.check_crf(pbeam[i], gbeam[i]) - # The non-monotonic oracle makes it difficult to ensure final costs are - # correct. Therefore do final correction - cdef Beam pred - for i, (pred, gold_parse) in enumerate(zip(pbeam, golds)): - for j in range(pred.size): - if is_gold(pred.at(j), gold_parse, moves.strings): - pred._states[j].loss = 0.0 - elif pred._states[j].loss == 0.0: - pred._states[j].loss = 1.0 - violn.check_crf(pred, gbeam[i]) histories = [(v.p_hist + v.g_hist) for v in violns] losses = [(v.p_probs + v.g_probs) for v in violns] @@ -199,20 +188,18 @@ def get_states(pbeams, gbeams, beam_map, nr_update): g_indices = [] cdef Beam pbeam, gbeam for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): - if pbeam.loss > 0 and pbeam.min_score > (gbeam.score + nr_update): - continue p_indices.append([]) - for j in range(pbeam.size): - state = pbeam.at(j) + for i in range(pbeam.size): + state = pbeam.at(i) if not state.is_final(): - key = tuple([eg_id] + pbeam.histories[j]) + key = tuple([eg_id] + pbeam.histories[i]) seen[key] = len(states) p_indices[-1].append(len(states)) - states.append(pbeam.at(j)) + states.append(pbeam.at(i)) beam_map.update(seen) g_indices.append([]) for i in range(gbeam.size): - state = gbeam.at(j) + state = gbeam.at(i) if not state.is_final(): key = tuple([eg_id] + gbeam.histories[i]) if key in seen: @@ -243,17 +230,17 @@ def get_gradient(nr_class, beam_maps, histories, losses): nr_step = len(beam_maps) grads = [] for beam_map in beam_maps: - if beam_map: - grads.append(numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f')) - else: - grads.append(None) + grads.append(numpy.zeros((max(beam_map.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): key = tuple([eg_id]) for j, clas in enumerate(hist): - if grads[j] is None: - continue - i = beam_maps[j][key] + try: + i = beam_maps[j][key] + except: + print(sorted(beam_maps[j].items())) + raise # In step j, at state i action clas # resulted in loss grads[j][i, clas] += loss diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx index e96e28fcf..f4f66f9fb 100644 --- a/spacy/syntax/beam_parser.pyx +++ b/spacy/syntax/beam_parser.pyx @@ -34,6 +34,7 @@ from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context from .stateclass cimport StateClass from .parser cimport Parser +from ._beam_utils import is_gold DEBUG = False @@ -237,16 +238,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/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ea61af1df..51fd61cc1 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -66,7 +66,7 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_FINE_TUNE = True -BEAM_PARSE = False +BEAM_PARSE = True def get_templates(*args, **kwargs): return [] @@ -348,6 +348,8 @@ cdef class Parser: The number of threads with which to work on the buffer in parallel. Yields (Doc): Documents, in order. """ + if BEAM_PARSE: + beam_width = 8 cdef Doc doc cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): @@ -439,6 +441,8 @@ cdef class Parser: 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) @@ -451,16 +455,22 @@ cdef class Parser: states = [] for i in range(beam.size): stcls = beam.at(i) - states.append(stcls) + # 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) 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 j in range(nr_class): - beam.scores[i][j] = scores[i, j] + 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) @@ -540,6 +550,7 @@ cdef class Parser: losses[self.name] = 0. docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] + assert min(lengths) >= 1 tokvecs = self.model[0].ops.flatten(tokvecs) if USE_FINE_TUNE: my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) @@ -554,9 +565,14 @@ cdef class Parser: states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, max_moves, states, tokvecs, golds, state2vec, vec2scores, - drop, sgd, losses) + drop, sgd, losses, + width=8) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): + if d_scores is None: + continue + 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) \ @@ -617,14 +633,10 @@ cdef class Parser: 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 + indices = xp.nonzero(mask) + self.model[0].ops.scatter_add(d_tokvecs, ids[indices], + d_state_features[indices]) @property def move_names(self): From 0ae045256df6f735b0a301914d87b5c26e2520d5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 13 Aug 2017 18:02:05 -0500 Subject: [PATCH 142/739] Fix beam training --- spacy/syntax/_beam_utils.pyx | 59 +++++++++++++++++++++++++----------- spacy/syntax/nn_parser.pyx | 8 ++--- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 6df8d472f..e77036e55 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -57,7 +57,7 @@ cdef class ParserBeam(object): 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.size): + for i in range(beam.width): st = beam.at(i) st.c.offset = state.c.offset self.beams.append(beam) @@ -81,7 +81,7 @@ cdef class ParserBeam(object): def advance(self, scores, follow_gold=False): cdef Beam beam for i, beam in enumerate(self.beams): - if beam.is_done: + if beam.is_done or not scores[i].size: continue self._set_scores(beam, scores[i]) if self.golds is not None: @@ -92,6 +92,12 @@ cdef class ParserBeam(object): else: beam.advance(_transition_state, _hash_state, self.moves.c) beam.check_done(_check_final_state, NULL) + if beam.is_done: + for j in range(beam.size): + if is_gold(beam.at(j), self.golds[i], self.moves.strings): + beam._states[j].loss = 0.0 + elif beam._states[j].loss == 0.0: + beam._states[j].loss = 1.0 def _set_scores(self, Beam beam, float[:, ::1] scores): cdef float* c_scores = &scores[0, 0] @@ -152,32 +158,49 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, 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): + # 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) 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 = [(v.p_hist + v.g_hist) for v in violns] - losses = [(v.p_probs + v.g_probs) for v in violns] + # Only make updates if we have non-gold states + histories = [((v.p_hist + v.g_hist) if v.p_hist else []) for v in violns] + losses = [((v.p_probs + v.g_probs) if v.p_probs else []) for v in violns] states_d_scores = get_gradient(moves.n_moves, beam_maps, histories, losses) + assert len(states_d_scores) == len(backprops), (len(states_d_scores), len(backprops)) return states_d_scores, backprops @@ -187,17 +210,20 @@ def get_states(pbeams, gbeams, beam_map, nr_update): 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([]) + if pbeam.loss > 0 and pbeam.min_score > gbeam.score: + continue for i in range(pbeam.size): state = pbeam.at(i) if not state.is_final(): key = tuple([eg_id] + pbeam.histories[i]) seen[key] = len(states) p_indices[-1].append(len(states)) - states.append(pbeam.at(i)) + states.append(state) beam_map.update(seen) - g_indices.append([]) for i in range(gbeam.size): state = gbeam.at(i) if not state.is_final(): @@ -207,10 +233,10 @@ def get_states(pbeams, gbeams, beam_map, nr_update): else: g_indices[-1].append(len(states)) beam_map[key] = len(states) - states.append(gbeam.at(i)) - p_indices = [numpy.asarray(idx, dtype='i') for idx in p_indices] - g_indices = [numpy.asarray(idx, dtype='i') for idx in g_indices] - return states, p_indices, g_indices + 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): @@ -230,20 +256,17 @@ def get_gradient(nr_class, beam_maps, histories, losses): nr_step = len(beam_maps) grads = [] for beam_map in beam_maps: - grads.append(numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f')) + if beam_map: + grads.append(numpy.zeros((max(beam_map.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): key = tuple([eg_id]) for j, clas in enumerate(hist): - try: - i = beam_maps[j][key] - except: - print(sorted(beam_maps[j].items())) - raise + i = beam_maps[j][key] # In step j, at state i action clas # resulted in loss - grads[j][i, clas] += loss + grads[j][i, clas] += loss / len(histories) key = key + tuple([clas]) return grads diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 51fd61cc1..a193c96a3 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -557,20 +557,20 @@ cdef class Parser: my_tokvecs = self.model[0].ops.flatten(my_tokvecs) tokvecs += my_tokvecs - states, golds, max_moves = self._init_gold_batch(docs, golds) + states = self.moves.init_batch(docs) + for gold in golds: + self.moves.preprocess_gold(gold) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(states), tokvecs, cuda_stream, 0.0) - states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, max_moves, + states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, states, tokvecs, golds, state2vec, vec2scores, drop, sgd, losses, width=8) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): - if d_scores is None: - continue if losses is not None: losses[self.name] += (d_scores**2).sum() ids, bp_vectors, bp_scores = backprops[i] From ac6c25f7629011c9a51692e684b1e1db3422585d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 14 Aug 2017 12:09:18 +0200 Subject: [PATCH 143/739] Check SGD is not None in update --- spacy/_ml.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index e37bcac52..91b530fad 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -381,7 +381,8 @@ def fine_tune(embedding, combine=None): flat_grad = model.ops.flatten(d_output) model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() - sgd(model._mem.weights, model._mem.gradient, key=model.id) + if sgd is not None: + sgd(model._mem.weights, model._mem.gradient, key=model.id) return d_output return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) From 5750f62d0a440ba188a805ac015868aaa666c543 Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 9 Aug 2017 11:52:38 +0200 Subject: [PATCH 144/739] Fix autolinking failure on fresh model install (resolves #1138) On fresh install via subprocess, pip.get_installed_distributions() won't show new model, so is_package check in link command fails. Solution for now is to get model package path explicitly and pass it to link command. --- spacy/cli/download.py | 8 ++++++-- spacy/cli/link.py | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/spacy/cli/download.py b/spacy/cli/download.py index b6e5549da..675ae8cee 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 @@ -32,7 +32,11 @@ def download(cmd, model, direct=False): 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) + # 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 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) From 4b2fe129925af29a87cb670fd607f58ff468da93 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 12 Aug 2017 21:44:15 +0200 Subject: [PATCH 145/739] Add create_meta option to package command Re-create meta.json in model directory, even if it exists. Especially useful when updating existing spaCy models or training with Prodigy. Ensures user won't end up with multiple "en_core_web_sm" models, and offers easy way to change the model's name and settings without having to edit the meta.json file. --- spacy/cli/package.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 1c720c2b5..9be28d4aa 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: From 371b21f82ddf2c6308a89baa339f0a5bfa57797d Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 9 Aug 2017 12:16:30 +0200 Subject: [PATCH 146/739] Don't ignore /bin directory --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 52838918c..cb0a8e84e 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,6 @@ venv/ # Distribution / packaging env/ -bin/ build/ develop-eggs/ dist/ From d208bcef96284b7816b26f190b67a7abedd60a60 Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 9 Aug 2017 12:17:30 +0200 Subject: [PATCH 147/739] Add entry point-style auto alias for "spacy" Simplest way to run commands as spacy xxx instead of python -m spacy xxx, while avoiding environment conflicts --- MANIFEST.in | 1 + bin/spacy | 1 + setup.py | 1 + 3 files changed, 3 insertions(+) create mode 100644 bin/spacy 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/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/setup.py b/setup.py index ecdf15536..0a3384ed5 100755 --- a/setup.py +++ b/setup.py @@ -187,6 +187,7 @@ 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', From 08e443e083c5300433bca99ac11c7719d1dd07b5 Mon Sep 17 00:00:00 2001 From: Nikolai Kruglikov Date: Thu, 10 Aug 2017 14:38:30 +0500 Subject: [PATCH 148/739] Fix small typo in documentation --- website/docs/usage/adding-languages.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/adding-languages.jade b/website/docs/usage/adding-languages.jade index a0b77ad17..4cd65a62d 100644 --- a/website/docs/usage/adding-languages.jade +++ b/website/docs/usage/adding-languages.jade @@ -205,7 +205,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 From 52c180ecf5474e62f305424065d645d14fc43b7b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 14 Aug 2017 13:00:23 +0200 Subject: [PATCH 149/739] Revert "Merge branch 'develop' of https://github.com/explosion/spaCy into develop" This reverts commit ea8de11ad57199e5abc3db3e7a8ecc920ef356fd, reversing changes made to 08e443e083c5300433bca99ac11c7719d1dd07b5. --- setup.py | 1 - spacy/_ml.py | 120 ++-------- spacy/cli/convert.py | 4 +- spacy/cli/train.py | 5 +- spacy/language.py | 25 +-- spacy/pipeline.pyx | 33 +-- spacy/syntax/_beam_utils.pyx | 273 ----------------------- spacy/syntax/_state.pxd | 1 - spacy/syntax/arc_eager.pyx | 1 - spacy/syntax/beam_parser.pyx | 14 +- spacy/syntax/nn_parser.pxd | 4 + spacy/syntax/nn_parser.pyx | 220 +++++++----------- spacy/syntax/transition_system.pyx | 2 - spacy/tests/parser/test_neural_parser.py | 13 -- spacy/tests/parser/test_nn_beam.py | 87 -------- 15 files changed, 143 insertions(+), 660 deletions(-) delete mode 100644 spacy/syntax/_beam_utils.pyx delete mode 100644 spacy/tests/parser/test_nn_beam.py diff --git a/setup.py b/setup.py index 02d4fe0d9..0a3384ed5 100755 --- a/setup.py +++ b/setup.py @@ -36,7 +36,6 @@ MOD_NAMES = [ 'spacy.syntax.transition_system', 'spacy.syntax.arc_eager', 'spacy.syntax._parse_features', - 'spacy.syntax._beam_utils', 'spacy.gold', 'spacy.tokens.doc', 'spacy.tokens.span', diff --git a/spacy/_ml.py b/spacy/_ml.py index 91b530fad..f1ded666e 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -5,12 +5,10 @@ from thinc.neural._classes.hash_embed import HashEmbed 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.layernorm import LayerNorm as LN from thinc.neural._classes.resnet import Residual from thinc.neural import ReLu from thinc.neural._classes.selu import SELU @@ -21,12 +19,10 @@ from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel -from thinc.api import uniqued, wrap, flatten_add_lengths - +from thinc.api import uniqued, wrap from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc -from . import util import numpy import io @@ -57,27 +53,6 @@ def _logistic(X, drop=0.): 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) @@ -86,7 +61,6 @@ def _zero_init(model): model.W.fill(0.) return model - @layerize def _preprocess_doc(docs, drop=0.): keys = [doc.to_array([LOWER]) for doc in docs] @@ -98,6 +72,7 @@ def _preprocess_doc(docs, drop=0.): return (keys, vals, lengths), None + def _init_for_precomputed(W, ops): if (W**2).sum() != 0.: return @@ -105,7 +80,6 @@ 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"), @@ -210,36 +184,25 @@ class PrecomputableMaxouts(Model): return Yfp, backward -def drop_layer(layer, factor=2.): - def drop_layer_fwd(X, drop=0.): - drop *= factor - mask = layer.ops.get_dropout_mask((1,), drop) - if mask is None or mask > 0: - return layer.begin_update(X, drop=drop) - else: - return X, lambda dX, sgd=None: dX - return wrap(drop_layer_fwd, layer) - - def Tok2Vec(width, embed_size, preprocess=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] + 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') + 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') - embed = (norm | prefix | suffix | shape ) >> Maxout(width, width*4, pieces=3) + embed = (norm | prefix | suffix | shape ) tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') - >> uniqued(embed, column=5) - >> drop_layer( - Residual( - (ExtractWindow(nW=1) >> ReLu(width, width*3)) - ) - ) ** 4, pad=4 - ) + >> 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) ) if preprocess not in (False, None): tok2vec = preprocess >> tok2vec @@ -334,8 +297,7 @@ def zero_init(model): def doc2feats(cols=None): - if cols is None: - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE] def forward(docs, drop=0.): feats = [] for doc in docs: @@ -361,37 +323,6 @@ 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_vecs + model.mix[1] * flat_tokvecs), - lengths) - - def fine_tune_bwd(d_output, sgd=None): - bp_vecs(d_output, sgd=sgd) - flat_grad = model.ops.flatten(d_output) - model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() - model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() - if sgd is not None: - sgd(model._mem.weights, model._mem.gradient, key=model.id) - return d_output - return output, fine_tune_bwd - model = wrap(fine_tune_fwd, embedding) - model.mix = model._mem.add((model.id, 'mix'), (2,)) - model.mix.fill(1.) - model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) - return model - - @layerize def flatten(seqs, drop=0.): if isinstance(seqs[0], numpy.ndarray): @@ -438,27 +369,6 @@ def preprocess_doc(docs, drop=0.): 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, token_vector_width, **cfg): - embed_size = util.env_opt('embed_size', 7500) - with Model.define_operators({'>>': chain, '+': add}): - # Input: (doc, tensor) tuples - private_tok2vec = Tok2Vec(token_vector_width, embed_size, preprocess=doc2feats()) - - model = ( - fine_tune(private_tok2vec) - >> with_flatten( - Maxout(token_vector_width, token_vector_width) - >> Softmax(nr_class, token_vector_width) - ) - ) - model.nI = None - return model - def build_text_classifier(nr_class, width=64, **cfg): nr_vector = cfg.get('nr_vector', 200) @@ -473,7 +383,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> _flatten_add_lengths >> with_getitem(0, uniqued( - (embed_lower | embed_prefix | embed_suffix | embed_shape) + (embed_lower | embed_prefix | embed_suffix | embed_shape) >> Maxout(width, width+(width//2)*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) @@ -494,7 +404,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0)) >> logistic ) - + model.lsuv = False return model diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index fef6753e6..a0a76e5ec 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -21,10 +21,10 @@ CONVERTERS = { @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", int), + n_sents=("Number of sentences per doc", "option", "n", float), morphology=("Enable appending morphology to tags", "flag", "m", bool) ) -def convert(cmd, input_file, output_dir, n_sents=1, morphology=False): +def convert(cmd, input_file, output_dir, n_sents, morphology): """ Convert files into JSON format for use with train command and other experiment management functions. diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 04aac8319..af028dae5 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -91,14 +91,15 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) nlp.update(docs, golds, sgd=optimizer, - drop=next(dropout_rates), losses=losses, - update_tensors=True) + drop=next(dropout_rates), losses=losses) pbar.update(sum(len(doc) for doc in docs)) with nlp.use_params(optimizer.averages): 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( diff --git a/spacy/language.py b/spacy/language.py index cb679a2bc..0284c4636 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -277,8 +277,7 @@ class Language(object): def make_doc(self, text): return self.tokenizer(text) - def update(self, docs, golds, drop=0., sgd=None, losses=None, - update_tensors=False): + def update(self, docs, golds, drop=0., sgd=None, losses=None): """Update the models in the pipeline. docs (iterable): A batch of `Doc` objects. @@ -305,17 +304,14 @@ class Language(object): grads[key] = (W, dW) pipes = list(self.pipeline[1:]) random.shuffle(pipes) - tokvecses, bp_tokvecses = tok2vec.model.begin_update(feats, drop=drop) - all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for 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 update_tensors and d_tokvecses is not None: - for i, d_tv in enumerate(d_tokvecses): - all_d_tokvecses[i] += d_tv - bp_tokvecses(all_d_tokvecses, sgd=sgd) + if d_tokvecses is not None: + bp_tokvecses(d_tokvecses, sgd=sgd) for key, (W, dW) in grads.items(): sgd(W, dW, key=key) # Clear the tensor variable, to free GPU memory. @@ -385,18 +381,9 @@ class Language(object): return optimizer def evaluate(self, docs_golds): - scorer = Scorer() docs, golds = zip(*docs_golds) - docs = list(docs) - golds = list(golds) - for 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): + scorer = Scorer() + for doc, gold in zip(self.pipe(docs, batch_size=32), golds): scorer.score(doc, gold) doc.tensor = None return scorer diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 634d3e4b5..947f0a1f1 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -42,7 +42,7 @@ 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 build_text_classifier, build_tagger_model +from ._ml import build_text_classifier from .parts_of_speech import X @@ -138,7 +138,7 @@ class TokenVectorEncoder(BaseThincComponent): name = 'tensorizer' @classmethod - def Model(cls, width=128, embed_size=4000, **cfg): + def Model(cls, width=128, embed_size=7500, **cfg): """Create a new statistical model for the class. width (int): Output size of the model. @@ -253,25 +253,23 @@ class NeuralTagger(BaseThincComponent): self.cfg = dict(cfg) def __call__(self, doc): - tags = self.predict(([doc], [doc.tensor])) + tags = self.predict([doc.tensor]) 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): - docs = list(docs) tokvecs = [d.tensor for d in docs] - tag_ids = self.predict((docs, tokvecs)) + tag_ids = self.predict(tokvecs) self.set_annotations(docs, tag_ids) yield from docs - def predict(self, docs_tokvecs): - scores = self.model(docs_tokvecs) + def predict(self, tokvecs): + scores = self.model(tokvecs) scores = self.model.ops.flatten(scores) guesses = scores.argmax(axis=1) if not isinstance(guesses, numpy.ndarray): guesses = guesses.get() - tokvecs = docs_tokvecs[1] guesses = self.model.ops.unflatten(guesses, [tv.shape[0] for tv in tokvecs]) return guesses @@ -284,8 +282,6 @@ class NeuralTagger(BaseThincComponent): 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: @@ -298,7 +294,8 @@ class NeuralTagger(BaseThincComponent): if self.model.nI is None: self.model.nI = tokvecs[0].shape[1] - tag_scores, bp_tag_scores = self.model.begin_update(docs_tokvecs, drop=drop) + + tag_scores, bp_tag_scores = self.model.begin_update(tokvecs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) @@ -349,8 +346,10 @@ class NeuralTagger(BaseThincComponent): @classmethod def Model(cls, n_tags, token_vector_width): - return build_tagger_model(n_tags, token_vector_width) - + return with_flatten( + chain(Maxout(token_vector_width, token_vector_width), + Softmax(n_tags, token_vector_width))) + def use_params(self, params): with self.model.use_params(params): yield @@ -433,7 +432,7 @@ class NeuralLabeller(NeuralTagger): @property def labels(self): - return self.cfg.setdefault('labels', {}) + return self.cfg.get('labels', {}) @labels.setter def labels(self, value): @@ -456,8 +455,10 @@ class NeuralLabeller(NeuralTagger): @classmethod def Model(cls, n_tags, token_vector_width): - return build_tagger_model(n_tags, token_vector_width) - + return with_flatten( + chain(Maxout(token_vector_width, token_vector_width), + Softmax(n_tags, token_vector_width))) + def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) cdef int idx = 0 diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx deleted file mode 100644 index e77036e55..000000000 --- a/spacy/syntax/_beam_utils.pyx +++ /dev/null @@ -1,273 +0,0 @@ -# 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 .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) - - -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 - - def __init__(self, TransitionSystem moves, states, golds, - int width=4, float density=0.001): - 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) - - 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 for b in 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: - 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: - assert self.golds is not None - 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: - for j in range(beam.size): - if is_gold(beam.at(j), self.golds[i], self.moves.strings): - beam._states[j].loss = 0.0 - elif beam._states[j].loss == 0.0: - beam._states[j].loss = 1.0 - - def _set_scores(self, Beam beam, float[:, ::1] scores): - cdef float* c_scores = &scores[0, 0] - for i in range(beam.size): - state = beam.at(i) - if not state.is_final(): - for j in range(beam.nr_class): - beam.scores[i][j] = c_scores[i * beam.nr_class + j] - self.moves.set_valid(beam.is_valid[i], state.c) - - 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 is_gold(StateClass state, GoldParse gold, 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 - - -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, tokvecs, golds, - state2vec, vec2scores, drop=0., sgd=None, - losses=None, int width=4, float density=0.001): - global nr_update - 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): - # 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) - 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]) - - # Only make updates if we have non-gold states - histories = [((v.p_hist + v.g_hist) if v.p_hist else []) for v in violns] - losses = [((v.p_probs + v.g_probs) if v.p_probs else []) for v in violns] - states_d_scores = get_gradient(moves.n_moves, beam_maps, - histories, losses) - assert len(states_d_scores) == len(backprops), (len(states_d_scores), len(backprops)) - return states_d_scores, backprops - - -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([]) - if pbeam.loss > 0 and pbeam.min_score > gbeam.score: - continue - for i in range(pbeam.size): - state = pbeam.at(i) - if not state.is_final(): - key = tuple([eg_id] + pbeam.histories[i]) - 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 = [] - for beam_map in beam_maps: - if beam_map: - grads.append(numpy.zeros((max(beam_map.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): - key = tuple([eg_id]) - 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 / len(histories) - key = key + tuple([clas]) - return grads - - diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 9aeeba441..c06851978 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -37,7 +37,6 @@ 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)) - this.offset = 0 cdef int i for i in range(length + (PADDING * 2)): this._ents[i].end = -1 diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 9477449a5..29e8de0aa 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -385,7 +385,6 @@ 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] diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx index f4f66f9fb..e96e28fcf 100644 --- a/spacy/syntax/beam_parser.pyx +++ b/spacy/syntax/beam_parser.pyx @@ -34,7 +34,6 @@ from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context from .stateclass cimport StateClass from .parser cimport Parser -from ._beam_utils import is_gold DEBUG = False @@ -238,3 +237,16 @@ 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/nn_parser.pxd b/spacy/syntax/nn_parser.pxd index 7ff4b9f9f..524718965 100644 --- a/spacy/syntax/nn_parser.pxd +++ b/spacy/syntax/nn_parser.pxd @@ -14,4 +14,8 @@ cdef class Parser: cdef readonly TransitionSystem moves cdef readonly object cfg + cdef void _parse_step(self, StateC* state, + const float* feat_weights, + int nr_class, int nr_feat, int nr_piece) nogil + #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index a193c96a3..0b39e2216 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -37,17 +37,14 @@ 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, ReLu, Maxout -from thinc.neural._classes.selu import SELU -from thinc.neural._classes.layernorm import LayerNorm +from thinc.neural import Model, Affine, ELU, ReLu, Maxout 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, fine_tune -from .._ml import Residual, drop_layer +from .._ml import Tok2Vec, doc2feats, rebatch from ..compat import json_dumps from . import _parse_features @@ -62,11 +59,8 @@ from ..structs cimport TokenC from ..tokens.doc cimport Doc from ..strings cimport StringStore from ..gold cimport GoldParse -from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG -from . import _beam_utils +from ..attrs cimport TAG, DEP -USE_FINE_TUNE = True -BEAM_PARSE = True def get_templates(*args, **kwargs): return [] @@ -238,14 +232,11 @@ cdef class Parser: Base class of the DependencyParser and EntityRecognizer. """ @classmethod - def Model(cls, nr_class, token_vector_width=128, hidden_width=300, depth=1, **cfg): + 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) - embed_size = util.env_opt('embed_size', 4000) - tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - preprocess=doc2feats())) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -257,10 +248,15 @@ cdef class Parser: nI=token_vector_width) with Model.use_device('cpu'): - upper = chain( - clone(Residual(ReLu(hidden_width)), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) - ) + if depth == 0: + upper = chain() + upper.is_noop = True + else: + upper = chain( + clone(Maxout(hidden_width), (depth-1)), + zero_init(Affine(nr_class, 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))) @@ -272,7 +268,7 @@ cdef class Parser: 'hidden_width': hidden_width, 'maxout_pieces': parser_maxout_pieces } - return (tensors, lower, upper), cfg + return (lower, upper), cfg def __init__(self, Vocab vocab, moves=True, model=True, **cfg): """ @@ -348,21 +344,17 @@ cdef class Parser: The number of threads with which to work on the buffer in parallel. Yields (Doc): Documents, in order. """ - if BEAM_PARSE: - beam_width = 8 + cdef StateClass parse_state cdef Doc doc - cdef Beam beam + queue = [] for docs in cytoolz.partition_all(batch_size, docs): docs = list(docs) - tokvecs = [doc.tensor for doc in docs] + tokvecs = [d.tensor for d in docs] if beam_width == 1: parse_states = self.parse_batch(docs, tokvecs) else: - beams = self.beam_parse(docs, tokvecs, - beam_width=beam_width, beam_density=beam_density) - parse_states = [] - for beam in beams: - parse_states.append(beam.at(0)) + parse_states = self.beam_parse(docs, tokvecs, + beam_width=beam_width, beam_density=beam_density) self.set_annotations(docs, parse_states) yield from docs @@ -377,12 +369,8 @@ cdef class Parser: int nr_class, nr_feat, nr_piece, nr_dim, nr_state if isinstance(docs, Doc): docs = [docs] - if isinstance(tokvecses, np.ndarray): - tokvecses = [tokvecses] tokvecs = self.model[0].ops.flatten(tokvecses) - if USE_FINE_TUNE: - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -406,20 +394,27 @@ cdef class Parser: cdef np.ndarray scores c_token_ids = token_ids.data c_is_valid = is_valid.data + cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): - for i in range(next_step.size()): - 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) + if not has_hidden: + for i in cython.parallel.prange( + next_step.size(), 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()): + 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) vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) - c_scores = scores.data - for i in range(next_step.size()): - 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) + scores = vec2scores(vectors) + c_scores = scores.data + for i in range(next_step.size()): + 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) this_step, next_step = next_step, this_step next_step.clear() for st in this_step: @@ -434,15 +429,11 @@ cdef class Parser: cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output tokvecs = self.model[0].ops.flatten(tokvecses) - if USE_FINE_TUNE: - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, 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) @@ -455,31 +446,44 @@ cdef class Parser: 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) + states.append(stcls) token_ids = self.get_token_ids(states) vectors = state2vec(token_ids) 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 + for j in range(nr_class): + beam.scores[i][j] = scores[i, j] 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)) + + state.set_context_tokens(token_ids, nr_feat) + sum_state_features(scores, + feat_weights, token_ids, 1, nr_feat, nr_class * nr_piece) + self.moves.set_valid(is_valid, state) + guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece) + action = self.moves.c[guess] + action.do(state, action.label) + + free(is_valid) + free(scores) + free(token_ids) + def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - if BEAM_PARSE: - return self.update_beam(docs_tokvecs, golds, 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 @@ -487,10 +491,6 @@ cdef class Parser: if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs cuda_stream = get_cuda_stream() @@ -517,13 +517,13 @@ cdef class Parser: scores, bp_scores = vec2scores.begin_update(vector, drop=drop) d_scores = self.get_batch_loss(states, golds, scores) - d_vector = bp_scores(d_scores, sgd=sgd) + d_vector = bp_scores(d_scores / d_scores.shape[0], 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 GPU, asynchronously + # Move token_ids and d_vector to CPU, asynchronously backprops.append(( get_async(cuda_stream, token_ids), get_async(cuda_stream, d_vector), @@ -540,55 +540,7 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) - d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - if USE_FINE_TUNE: - bp_my_tokvecs(d_tokvecs, sgd=sgd) - return d_tokvecs - - def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - if losses is not None and self.name not in losses: - losses[self.name] = 0. - docs, tokvecs = docs_tokvecs - lengths = [len(d) for d in docs] - assert min(lengths) >= 1 - tokvecs = self.model[0].ops.flatten(tokvecs) - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs - - states = self.moves.init_batch(docs) - for gold in golds: - self.moves.preprocess_gold(gold) - - cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(len(states), tokvecs, cuda_stream, 0.0) - - states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, - states, tokvecs, golds, - state2vec, vec2scores, - drop, sgd, losses, - width=8) - backprop_lower = [] - for i, d_scores in enumerate(states_d_scores): - 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, backprop_lower, sgd, cuda_stream) - d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - if USE_FINE_TUNE: - bp_my_tokvecs(d_tokvecs, sgd=sgd) - return d_tokvecs + return self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long @@ -633,10 +585,14 @@ cdef class Parser: xp = get_array_module(d_tokvecs) for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) - mask = ids >= 0 - indices = xp.nonzero(mask) - self.model[0].ops.scatter_add(d_tokvecs, ids[indices], - d_state_features[indices]) + 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) @property def move_names(self): @@ -647,7 +603,7 @@ cdef class Parser: return names def get_batch_model(self, batch_size, tokvecs, stream, dropout): - _, lower, upper = self.model + lower, upper = self.model state2vec = precompute_hiddens(batch_size, tokvecs, lower, stream, drop=dropout) return state2vec, upper @@ -737,12 +693,10 @@ cdef class Parser: def to_disk(self, path, **exclude): serializers = { - 'tok2vec_model': lambda p: p.open('wb').write( - self.model[0].to_bytes()), 'lower_model': lambda p: p.open('wb').write( - self.model[1].to_bytes()), + self.model[0].to_bytes()), 'upper_model': lambda p: p.open('wb').write( - self.model[2].to_bytes()), + self.model[1].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)) @@ -763,29 +717,24 @@ cdef class Parser: self.model, cfg = self.Model(**self.cfg) else: cfg = {} - with (path / 'tok2vec_model').open('rb') as file_: - bytes_data = file_.read() - self.model[0].from_bytes(bytes_data) with (path / 'lower_model').open('rb') as file_: bytes_data = file_.read() - self.model[1].from_bytes(bytes_data) + self.model[0].from_bytes(bytes_data) with (path / 'upper_model').open('rb') as file_: bytes_data = file_.read() - self.model[2].from_bytes(bytes_data) + self.model[1].from_bytes(bytes_data) self.cfg.update(cfg) return self def to_bytes(self, **exclude): serializers = OrderedDict(( - ('tok2vec_model', lambda: self.model[0].to_bytes()), - ('lower_model', lambda: self.model[1].to_bytes()), - ('upper_model', lambda: self.model[2].to_bytes()), + ('lower_model', lambda: self.model[0].to_bytes()), + ('upper_model', lambda: self.model[1].to_bytes()), ('vocab', lambda: self.vocab.to_bytes()), ('moves', lambda: self.moves.to_bytes(strings=False)), ('cfg', lambda: ujson.dumps(self.cfg)) )) if 'model' in exclude: - exclude['tok2vec_model'] = True exclude['lower_model'] = True exclude['upper_model'] = True exclude.pop('model') @@ -796,7 +745,6 @@ cdef class Parser: ('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))), - ('tok2vec_model', lambda b: None), ('lower_model', lambda b: None), ('upper_model', lambda b: None) )) @@ -806,12 +754,10 @@ cdef class Parser: self.model, cfg = self.Model(self.moves.n_moves) else: cfg = {} - if 'tok2vec_model' in msg: - self.model[0].from_bytes(msg['tok2vec_model']) if 'lower_model' in msg: - self.model[1].from_bytes(msg['lower_model']) + self.model[0].from_bytes(msg['lower_model']) if 'upper_model' in msg: - self.model[2].from_bytes(msg['upper_model']) + self.model[1].from_bytes(msg['upper_model']) self.cfg.update(cfg) return self diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index d3f64f827..27b375bba 100644 --- a/spacy/syntax/transition_system.pyx +++ b/spacy/syntax/transition_system.pyx @@ -107,8 +107,6 @@ 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: diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 30a6367c8..42b55745f 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -78,16 +78,3 @@ def test_predict_doc_beam(parser, tok2vec, model, doc): parser(doc, beam_width=32, beam_density=0.001) for word in doc: print(word.text, word.head, word.dep_) - - -def test_update_doc_beam(parser, tok2vec, model, doc, gold): - parser.model = model - tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) - d_tokvecs = parser.update_beam(([doc], tokvecs), [gold]) - assert d_tokvecs[0].shape == tokvecs[0].shape - def optimize(weights, gradient, key=None): - weights -= 0.001 * gradient - bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs[0].sum() == 0. - - diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py deleted file mode 100644 index 45c85d969..000000000 --- a/spacy/tests/parser/test_nn_beam.py +++ /dev/null @@ -1,87 +0,0 @@ -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) - -@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]) From 65bf80302c11a51fe086b8d48c4c4d715062e3f1 Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 14 Aug 2017 12:42:35 +0200 Subject: [PATCH 150/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index bf44c31d5..3b8e9a127 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a7' +__version__ = '2.0.0a8' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From a29f132ffdd8cde12a3f03782e467a365f520cce Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 14 Aug 2017 12:41:06 +0200 Subject: [PATCH 151/739] Change python -m spacy to spacy Reflects latest change to entry point or auto-alias --- spacy/deprecated.py | 2 +- website/docs/api/cli.jade | 35 +++++++++--------------- website/docs/api/language-models.jade | 6 ++-- website/docs/usage/adding-languages.jade | 2 +- website/docs/usage/index.jade | 14 ++++++---- website/docs/usage/lightning-tour.jade | 4 +-- website/docs/usage/models.jade | 16 +++++------ website/docs/usage/saving-loading.jade | 2 +- website/docs/usage/training-ner.jade | 2 +- website/docs/usage/v2.jade | 10 +++---- website/docs/usage/visualizers.jade | 2 +- website/index.jade | 2 +- 12 files changed, 45 insertions(+), 52 deletions(-) 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/website/docs/api/cli.jade b/website/docs/api/cli.jade index e109e4b66..d388069b8 100644 --- a/website/docs/api/cli.jade +++ b/website/docs/api/cli.jade @@ -5,16 +5,7 @@ include ../../_includes/_mixins 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]. - -+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. + | commands, type #[code spacy --help]. +infobox("⚠️ Deprecation note") | As of spaCy 2.0, the #[code model] command to initialise a model data @@ -33,8 +24,8 @@ p | 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 @@ -80,8 +71,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 @@ -112,8 +103,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 @@ -139,8 +130,8 @@ p | 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", "$"). + spacy convert [input_file] [output_dir] [--n-sents] [--morphology] +table(["Argument", "Type", "Description"]) +row @@ -174,8 +165,8 @@ p | Train a model. Expects data in spaCy's | #[+a("/docs/api/annotation#json-input") JSON format]. -+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", "$"). + spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--no-tagger] [--no-parser] [--no-entities] +table(["Argument", "Type", "Description"]) +row @@ -345,8 +336,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", "$"). + spacy package [input_dir] [output_dir] [--meta] [--force] +table(["Argument", "Type", "Description"]) +row diff --git a/website/docs/api/language-models.jade b/website/docs/api/language-models.jade index 74007f228..c6943b410 100644 --- a/website/docs/api/language-models.jade +++ b/website/docs/api/language-models.jade @@ -8,9 +8,9 @@ p +aside-code("Download language models", "bash"). - python -m spacy download en - python -m spacy download de - python -m spacy download fr + spacy download en + spacy download de + spacy download fr +table([ "Language", "Token", "SBD", "Lemma", "POS", "NER", "Dep", "Vector", "Sentiment"]) +row diff --git a/website/docs/usage/adding-languages.jade b/website/docs/usage/adding-languages.jade index 4cd65a62d..b341c9f9b 100644 --- a/website/docs/usage/adding-languages.jade +++ b/website/docs/usage/adding-languages.jade @@ -789,4 +789,4 @@ p | 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] + spacy train [lang] [output_dir] [train_data] [dev_data] [--n-iter] [--n-sents] [--use-gpu] [--no-tagger] [--no-parser] [--no-entities] diff --git a/website/docs/usage/index.jade b/website/docs/usage/index.jade index 817b08ba9..60bc3cd7b 100644 --- a/website/docs/usage/index.jade +++ b/website/docs/usage/index.jade @@ -32,10 +32,10 @@ p +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 + +qs({model: 'en'}) spacy download en + +qs({model: 'de'}) spacy download de + +qs({model: 'fr'}) spacy download fr + +qs({model: 'es'}) spacy download es +h(2, "installation") Installation instructions @@ -52,7 +52,7 @@ p Using pip, spaCy releases are currently only available as source packages. | and available models, see the #[+a("/docs/usage/models") docs on models]. +code.o-no-block. - python -m spacy download en + spacy download en >>> import spacy >>> nlp = spacy.load('en') @@ -312,7 +312,9 @@ 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], + | 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]. diff --git a/website/docs/usage/lightning-tour.jade b/website/docs/usage/lightning-tour.jade index 0be3a55be..2b0cf0880 100644 --- a/website/docs/usage/lightning-tour.jade +++ b/website/docs/usage/lightning-tour.jade @@ -10,8 +10,8 @@ p +h(2, "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 diff --git a/website/docs/usage/models.jade b/website/docs/usage/models.jade index 39c37a816..bae80d2ad 100644 --- a/website/docs/usage/models.jade +++ b/website/docs/usage/models.jade @@ -20,7 +20,7 @@ p +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}) 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() @@ -52,16 +52,16 @@ p | #[+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 }) +- 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 "python -m spacy download " + l}).join('\n')} + #{Object.keys(MODELS).map(function(l) {return "spacy download " + l}).join('\n')} # download best-matching version of specific model for your spaCy installation - python -m spacy download en_core_web_md + 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 + spacy download en_core_web_md-1.2.0 --direct p | The download command will #[+a("#download-pip") install the model] via @@ -72,7 +72,7 @@ p +code(false, "bash"). pip install spacy - python -m spacy download en + spacy download en +code. import spacy @@ -179,8 +179,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 diff --git a/website/docs/usage/saving-loading.jade b/website/docs/usage/saving-loading.jade index 827b54748..de7e4ed33 100644 --- a/website/docs/usage/saving-loading.jade +++ b/website/docs/usage/saving-loading.jade @@ -85,7 +85,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: diff --git a/website/docs/usage/training-ner.jade b/website/docs/usage/training-ner.jade index 3d732b16d..3c74f7a9d 100644 --- a/website/docs/usage/training-ner.jade +++ b/website/docs/usage/training-ner.jade @@ -102,7 +102,7 @@ p | 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 + spacy package /home/me/data/en_technology /home/me/my_models p | To build the package and create a #[code .tar.gz] archive, run diff --git a/website/docs/usage/v2.jade b/website/docs/usage/v2.jade index d9727c62b..6d98e3f05 100644 --- a/website/docs/usage/v2.jade +++ b/website/docs/usage/v2.jade @@ -238,11 +238,11 @@ p +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 + 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 comes with new and improved neural network models for English, diff --git a/website/docs/usage/visualizers.jade b/website/docs/usage/visualizers.jade index b3cbd3b46..96a6bd49f 100644 --- a/website/docs/usage/visualizers.jade +++ b/website/docs/usage/visualizers.jade @@ -259,7 +259,7 @@ p | 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 + # don't forget to install a model, e.g.: spacy download en import spacy from spacy import displacy diff --git a/website/index.jade b/website/index.jade index 741db53cf..9336d5c34 100644 --- a/website/index.jade +++ b/website/index.jade @@ -68,7 +68,7 @@ include _includes/_mixins +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 From 52c63022238d8d98961d83b84900a7e9664e0316 Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 14 Aug 2017 12:40:39 +0200 Subject: [PATCH 152/739] Allow prompt setting on code mixin --- website/_includes/_mixins.jade | 8 ++++---- website/assets/css/_components/_code.sass | 7 +++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade index 16514bcda..b140151b2 100644 --- a/website/_includes/_mixins.jade +++ b/website/_includes/_mixins.jade @@ -103,20 +103,20 @@ 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 or icon to display next to code block, (mostly used for old/new) height - [integer] optional height to clip code block to -mixin code(label, language, icon, height) +mixin code(label, language, prompt, height) 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 = (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(data-prompt=icon ? null : prompt) block diff --git a/website/assets/css/_components/_code.sass b/website/assets/css/_components/_code.sass index 2e1856c0a..036c5358f 100644 --- a/website/assets/css/_components/_code.sass +++ b/website/assets/css/_components/_code.sass @@ -35,6 +35,13 @@ 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 + //- Inline code From d9f82f6b504d75a89d9499e0c587535f25c75a09 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 14 Aug 2017 14:55:26 +0200 Subject: [PATCH 153/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 3b8e9a127..9f62c769e 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a8' +__version__ = '2.0.0a9' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 0aba11b64b967e9da7acf35006f86cdb2331a801 Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 14 Aug 2017 16:45:42 +0200 Subject: [PATCH 154/739] Update package command docs --- website/docs/api/cli.jade | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/website/docs/api/cli.jade b/website/docs/api/cli.jade index d388069b8..26aa1f883 100644 --- a/website/docs/api/cli.jade +++ b/website/docs/api/cli.jade @@ -351,10 +351,17 @@ 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). + +row + +cell #[code --create-meta], #[code -c] + +cell flag + +cell + | Create a meta.json file on the command line, even if one already + | exists in the directory. + +row +cell #[code --force], #[code -f] +cell flag From 335fa8b05cb1367de462973416a8889a77270e3a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 14 Aug 2017 14:55:47 -0500 Subject: [PATCH 155/739] Fix gradient in fine_tune --- spacy/_ml.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index e37bcac52..6045beb96 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -377,16 +377,16 @@ def fine_tune(embedding, combine=None): lengths) def fine_tune_bwd(d_output, sgd=None): - bp_vecs(d_output, sgd=sgd) + bp_vecs([d_o * model.d_mix[0] for d_o in d_output], sgd=sgd) flat_grad = model.ops.flatten(d_output) model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() sgd(model._mem.weights, model._mem.gradient, key=model.id) - return d_output + return [d_o * model.d_mix[1] for d_o in d_output] return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) model.mix = model._mem.add((model.id, 'mix'), (2,)) - model.mix.fill(1.) + model.mix.fill(0.5) model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) return model From 62594903478a5be5b8c9c0a77624cd83ef8efc2d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 14 Aug 2017 17:55:18 -0500 Subject: [PATCH 156/739] Fix mixture weights in fine_tune --- spacy/_ml.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 6045beb96..34f1e0a53 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -372,21 +372,25 @@ def fine_tune(embedding, combine=None): vecs, bp_vecs = embedding.begin_update(docs, drop=drop) flat_tokvecs = embedding.ops.flatten(tokvecs) flat_vecs = embedding.ops.flatten(vecs) + alpha = model.mix + minus = 1-model.mix output = embedding.ops.unflatten( - (model.mix[0] * flat_vecs + model.mix[1] * flat_tokvecs), - lengths) + (alpha * flat_tokvecs + minus * flat_vecs), lengths) def fine_tune_bwd(d_output, sgd=None): - bp_vecs([d_o * model.d_mix[0] for d_o in d_output], sgd=sgd) flat_grad = model.ops.flatten(d_output) - model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() - model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() + model.d_mix += flat_tokvecs.dot(flat_grad.T).sum() + model.d_mix += 1-flat_vecs.dot(flat_grad.T).sum() + + bp_vecs([d_o * minus for d_o in d_output], sgd=sgd) + d_output = [d_o * alpha for d_o in d_output] sgd(model._mem.weights, model._mem.gradient, key=model.id) - return [d_o * model.d_mix[1] for d_o in d_output] + model.mix = model.ops.xp.minimum(model.mix, 1.0) + return d_output return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) - model.mix = model._mem.add((model.id, 'mix'), (2,)) - model.mix.fill(0.5) + model.mix = model._mem.add((model.id, 'mix'), (1,)) + model.mix.fill(0.0) model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) return model From 60d811124548d4f1d9f0cc8d5abb64afc7827aa8 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 15 Aug 2017 03:12:26 -0500 Subject: [PATCH 157/739] Require thinc 6.8.1 --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index aae0f9388..fa1a3e6d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.8.0,<6.9.0 +thinc>=6.8.1,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index 02d4fe0d9..ca8e41cb4 100755 --- a/setup.py +++ b/setup.py @@ -194,7 +194,7 @@ def setup_package(): 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.8.0,<6.9.0', + 'thinc>=6.8.1,<6.9.0', 'plac<1.0.0,>=0.9.6', 'pip>=9.0.0,<10.0.0', 'six', From e420e0366cba712ab678679fe9fbb212f2eb6466 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 15 Aug 2017 03:13:57 -0500 Subject: [PATCH 158/739] Remove use of hash function in beam parser --- spacy/syntax/_beam_utils.pyx | 6 +----- spacy/syntax/nn_parser.pyx | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index e77036e55..15f1ce59b 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -86,11 +86,7 @@ cdef class ParserBeam(object): 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: - assert self.golds is not None - beam.advance(_transition_state, NULL, self.moves.c) - else: - beam.advance(_transition_state, _hash_state, self.moves.c) + beam.advance(_transition_state, NULL, self.moves.c) beam.check_done(_check_final_state, NULL) if beam.is_done: for j in range(beam.size): diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index a193c96a3..fb7099022 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -471,7 +471,7 @@ cdef class Parser: 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.advance(_transition_state, NULL, self.moves.c) beam.check_done(_check_final_state, NULL) beams.append(beam) return beams From a8e4064dd81dcebea53a2bdbee4a2d6904b23ff5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 15 Aug 2017 03:14:36 -0500 Subject: [PATCH 159/739] Fix tensor gradient in parser --- spacy/syntax/nn_parser.pyx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index fb7099022..5d6f51538 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -633,10 +633,9 @@ cdef class Parser: xp = get_array_module(d_tokvecs) for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) - mask = ids >= 0 - indices = xp.nonzero(mask) - self.model[0].ops.scatter_add(d_tokvecs, ids[indices], - d_state_features[indices]) + mask = (ids >= 0).reshape((ids.shape[0], ids.shape[1], 1)) + self.model[0].ops.scatter_add(d_tokvecs, ids, + d_state_features * mask) @property def move_names(self): From 500e92553d477c29cd306590e078b8b3256d41d0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 15 Aug 2017 03:15:04 -0500 Subject: [PATCH 160/739] Fix memory error when copying scores in beam --- spacy/syntax/_beam_utils.pyx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 15f1ce59b..09738b584 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -97,12 +97,19 @@ cdef class ParserBeam(object): def _set_scores(self, Beam beam, float[:, ::1] scores): cdef float* c_scores = &scores[0, 0] - for i in range(beam.size): + 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(beam.nr_class): - beam.scores[i][j] = c_scores[i * beam.nr_class + j] + 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): @@ -196,8 +203,7 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, losses = [((v.p_probs + v.g_probs) if v.p_probs else []) for v in violns] states_d_scores = get_gradient(moves.n_moves, beam_maps, histories, losses) - assert len(states_d_scores) == len(backprops), (len(states_d_scores), len(backprops)) - return states_d_scores, backprops + return states_d_scores, backprops[:len(states_d_scores)] def get_states(pbeams, gbeams, beam_map, nr_update): From 23537a011d7f27bc93579d7aae5579062823f67f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 15 Aug 2017 03:15:28 -0500 Subject: [PATCH 161/739] Tweaks to beam parser --- spacy/syntax/_beam_utils.pyx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 09738b584..48030b72a 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -216,12 +216,13 @@ def get_states(pbeams, gbeams, beam_map, nr_update): for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): p_indices.append([]) g_indices.append([]) - if pbeam.loss > 0 and pbeam.min_score > gbeam.score: + if pbeam.loss > 0 and pbeam.min_score > (gbeam.score + nr_update): continue 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) @@ -257,12 +258,18 @@ def get_gradient(nr_class, beam_maps, histories, losses): """ nr_step = len(beam_maps) grads = [] - for beam_map in beam_maps: - if beam_map: - grads.append(numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f')) + nr_step = 0 + for eg_id, hists in enumerate(histories): + for loss, hist in zip(losses[eg_id], hists): + if abs(loss) >= 0.0001 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 abs(loss) < 0.0001 or numpy.isnan(loss): + continue key = tuple([eg_id]) for j, clas in enumerate(hist): i = beam_maps[j][key] From 210f6d5175f867d985d2d20c05b063ca259867ee Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 15 Aug 2017 03:19:03 -0500 Subject: [PATCH 162/739] Fix efficiency error in batch parse --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 5d6f51538..9a35c69d7 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -411,7 +411,7 @@ cdef class Parser: 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) - vectors = state2vec(token_ids[:next_step.size()]) + vectors = state2vec(token_ids[:next_step.size()]) scores = vec2scores(vectors) c_scores = scores.data for i in range(next_step.size()): From 1cb2f15d654ed475eb0e0699fa97059bb0a4769c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 16 Aug 2017 18:22:26 -0500 Subject: [PATCH 163/739] Clean up unused predict_confidences function --- spacy/pipeline.pyx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 634d3e4b5..d1a2a2964 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -653,14 +653,6 @@ cdef class NeuralEntityRecognizer(NeuralParser): nr_feature = 6 - def predict_confidences(self, docs): - tensors = [d.tensor for d in docs] - samples = [] - for i in range(10): - states = self.parse_batch(docs, tensors, drop=0.3) - for state in states: - samples.append(self._get_entities(state)) - def __reduce__(self): return (NeuralEntityRecognizer, (self.vocab, self.moves, self.model), None, None) From 3533bb61cbf4a12ce4d7efb7d86a362becb0afe1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 16 Aug 2017 18:23:27 -0500 Subject: [PATCH 164/739] Add option of 8 feature parse state --- spacy/syntax/_state.pxd | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 9aeeba441..3da9e5d4c 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -74,7 +74,16 @@ cdef cppclass StateC: free(this.shifted - PADDING) void set_context_tokens(int* ids, int n) nogil: - if n == 13: + 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) From a6d8d7c82e269c2f91ca25ac73cc70dcc9cf890d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 16 Aug 2017 18:24:09 -0500 Subject: [PATCH 165/739] Add is_gold_parse method to transition system --- spacy/syntax/arc_eager.pyx | 14 ++++++++++++++ spacy/syntax/transition_system.pyx | 3 +++ 2 files changed, 17 insertions(+) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 9477449a5..aab350d76 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -351,6 +351,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]]): diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index d3f64f827..9cf82e0c7 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 From 4b1e7bd6d8c677b6bb96e7ec69bb7e2ce436c648 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 16 Aug 2017 18:25:20 -0500 Subject: [PATCH 166/739] Improve tensorizer model --- spacy/_ml.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 91b530fad..c49bad6d4 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -9,7 +9,7 @@ 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.batchnorm import BatchNorm as BN from thinc.neural._classes.layernorm import LayerNorm as LN from thinc.neural._classes.resnet import Residual from thinc.neural import ReLu @@ -22,6 +22,7 @@ from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths +from thinc.neural._classes.rnn import BiLSTM from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP @@ -229,14 +230,14 @@ def Tok2Vec(width, embed_size, preprocess=None): 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') - embed = (norm | prefix | suffix | shape ) >> Maxout(width, width*4, pieces=3) + embed = (norm | prefix | suffix | shape ) >> LN(Maxout(width, width*4, pieces=3)) tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') >> uniqued(embed, column=5) >> drop_layer( Residual( - (ExtractWindow(nW=1) >> ReLu(width, width*3)) + (ExtractWindow(nW=1) >> BN(Maxout(width, width*3))) ) ) ** 4, pad=4 ) From 0209a06b4e2e572d8dbdab8724c05cd884a85319 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 16 Aug 2017 18:25:49 -0500 Subject: [PATCH 167/739] Update beam parser --- spacy/syntax/_beam_utils.pyx | 71 ++++++++++++++++++------------------ spacy/syntax/beam_parser.pyx | 7 ++-- spacy/syntax/nn_parser.pyx | 24 +++++++----- 3 files changed, 53 insertions(+), 49 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 48030b72a..7afe51d4f 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -6,6 +6,7 @@ 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 @@ -45,6 +46,7 @@ cdef class ParserBeam(object): 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=4, float density=0.001): @@ -61,6 +63,7 @@ cdef class ParserBeam(object): 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: @@ -70,7 +73,7 @@ cdef class ParserBeam(object): @property def is_done(self): - return all(b.is_done for b in self.beams) + return all(b.is_done or self.dones[i] for i, b in enumerate(self.beams)) def __getitem__(self, i): return self.beams[i] @@ -81,19 +84,24 @@ cdef class ParserBeam(object): 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: + 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) - beam.advance(_transition_state, NULL, self.moves.c) + beam.advance(_transition_state, _hash_state, self.moves.c) beam.check_done(_check_final_state, NULL) - if beam.is_done: + if beam.is_done and self.golds is not None: for j in range(beam.size): - if is_gold(beam.at(j), self.golds[i], self.moves.strings): - beam._states[j].loss = 0.0 - elif beam._states[j].loss == 0.0: - beam._states[j].loss = 1.0 + 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] @@ -110,7 +118,6 @@ cdef class ParserBeam(object): 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) @@ -122,21 +129,6 @@ cdef class ParserBeam(object): beam.is_valid[i][j] = 0 -def is_gold(StateClass state, GoldParse gold, 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 - - def get_token_ids(states, int n_tokens): cdef StateClass state cdef np.ndarray ids = numpy.zeros((len(states), n_tokens), @@ -156,16 +148,19 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, state2vec, vec2scores, drop=0., sgd=None, losses=None, int width=4, float density=0.001): 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) + width=width, density=density) 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 @@ -197,12 +192,16 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, # Track the "maximum violation", to use in the update. for i, violn in enumerate(violns): violn.check_crf(pbeam[i], gbeam[i]) - - # Only make updates if we have non-gold states - histories = [((v.p_hist + v.g_hist) if v.p_hist else []) for v in violns] - losses = [((v.p_probs + v.g_probs) if v.p_probs else []) for v in violns] - states_d_scores = get_gradient(moves.n_moves, beam_maps, - histories, losses) + histories = [] + losses = [] + for i, violn in enumerate(violns): + if violn.cost < 1: + histories.append([]) + losses.append([]) + else: + histories.append(violn.p_hist + violn.g_hist) + losses.append(violn.p_probs + violn.g_probs) + states_d_scores = get_gradient(moves.n_moves, beam_maps, histories, losses) return states_d_scores, backprops[:len(states_d_scores)] @@ -216,7 +215,9 @@ def get_states(pbeams, gbeams, beam_map, nr_update): for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): p_indices.append([]) g_indices.append([]) - if pbeam.loss > 0 and pbeam.min_score > (gbeam.score + nr_update): + if pbeam.loss > 0 and pbeam.min_score > (gbeam.score + numpy.sqrt(nr_update)): + pbeams.dones[eg_id] = True + gbeams.dones[eg_id] = True continue for i in range(pbeam.size): state = pbeam.at(i) @@ -261,21 +262,21 @@ def get_gradient(nr_class, beam_maps, histories, losses): nr_step = 0 for eg_id, hists in enumerate(histories): for loss, hist in zip(losses[eg_id], hists): - if abs(loss) >= 0.0001 and not numpy.isnan(loss): + 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 abs(loss) < 0.0001 or numpy.isnan(loss): + if abs(loss) == 0.0 or numpy.isnan(loss): continue key = tuple([eg_id]) 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 / len(histories) + grads[j][i, clas] += loss key = key + tuple([clas]) return grads diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx index f4f66f9fb..68e9f27af 100644 --- a/spacy/syntax/beam_parser.pyx +++ b/spacy/syntax/beam_parser.pyx @@ -34,7 +34,6 @@ from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context from .stateclass cimport StateClass from .parser cimport Parser -from ._beam_utils import is_gold DEBUG = False @@ -108,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 @@ -214,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) @@ -228,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]) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 9a35c69d7..11fc4e742 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -38,6 +38,7 @@ from preshed.maps cimport map_get from thinc.api import layerize, chain, noop, clone from thinc.neural import Model, Affine, ReLu, Maxout +from thinc.neural._classes.batchnorm import BatchNorm as BN from thinc.neural._classes.selu import SELU from thinc.neural._classes.layernorm import LayerNorm from thinc.neural.ops import NumpyOps, CupyOps @@ -258,7 +259,7 @@ cdef class Parser: with Model.use_device('cpu'): upper = chain( - clone(Residual(ReLu(hidden_width)), (depth-1)), + clone(Maxout(hidden_width), (depth-1)), zero_init(Affine(nr_class, drop_factor=0.0)) ) # TODO: This is an unfortunate hack atm! @@ -321,6 +322,8 @@ cdef class Parser: beam_width = self.cfg.get('beam_width', 1) if beam_density is None: beam_density = self.cfg.get('beam_density', 0.001) + if BEAM_PARSE: + beam_width = 16 cdef Beam beam if beam_width == 1: states = self.parse_batch([doc], [doc.tensor]) @@ -349,7 +352,7 @@ cdef class Parser: Yields (Doc): Documents, in order. """ if BEAM_PARSE: - beam_width = 8 + beam_width = 16 cdef Doc doc cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): @@ -427,7 +430,7 @@ cdef class Parser: next_step.push_back(st) return states - def beam_parse(self, docs, tokvecses, int beam_width=8, float beam_density=0.001): + def beam_parse(self, docs, tokvecses, int beam_width=16, float beam_density=0.001): cdef Beam beam cdef np.ndarray scores cdef Doc doc @@ -471,13 +474,13 @@ cdef class Parser: for k in range(nr_class): beam.scores[i][k] = c_scores[j * scores.shape[1] + k] j += 1 - beam.advance(_transition_state, NULL, self.moves.c) + beam.advance(_transition_state, _hash_state, self.moves.c) beam.check_done(_check_final_state, NULL) beams.append(beam) return beams def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - if BEAM_PARSE: + if BEAM_PARSE and numpy.random.random() >= 0.5: return self.update_beam(docs_tokvecs, golds, drop=drop, sgd=sgd, losses=losses) if losses is not None and self.name not in losses: @@ -568,7 +571,7 @@ cdef class Parser: states, tokvecs, golds, state2vec, vec2scores, drop, sgd, losses, - width=8) + width=16) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): if losses is not None: @@ -633,9 +636,10 @@ cdef class Parser: xp = get_array_module(d_tokvecs) for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) - mask = (ids >= 0).reshape((ids.shape[0], ids.shape[1], 1)) - self.model[0].ops.scatter_add(d_tokvecs, ids, - d_state_features * mask) + mask = ids >= 0 + d_state_features *= mask.reshape(ids.shape + (1,)) + self.model[0].ops.scatter_add(d_tokvecs, ids * mask, + d_state_features) @property def move_names(self): @@ -651,7 +655,7 @@ cdef class Parser: lower, stream, drop=dropout) return state2vec, upper - nr_feature = 13 + nr_feature = 8 def get_token_ids(self, states): cdef StateClass state From ebf5a3ce599be517414b136a2b91b8895e32c1d8 Mon Sep 17 00:00:00 2001 From: Dan O'Huiginn Date: Thu, 17 Aug 2017 15:15:08 +0000 Subject: [PATCH 168/739] Allow loading with python < 3.6 Don't rely on recent python features to load models Fixes Issue #1271 --- spacy/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/util.py b/spacy/util.py index ccb81fbed..d83fe3416 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -113,7 +113,7 @@ 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) + spec = importlib.util.spec_from_file_location(name, str(init_file)) try: cls = importlib.util.module_from_spec(spec) except AttributeError: From f75420ae79f67da5091bd9c02622aa3c756d36d9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 13:31:15 -0500 Subject: [PATCH 169/739] Unhack beam parsing, moving it under options instead of global flags --- spacy/syntax/_beam_utils.pyx | 33 +++++++++++++++++--------------- spacy/syntax/nn_parser.pyx | 37 ++++++++++++++++++++++-------------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 7afe51d4f..4d90fe23b 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -49,7 +49,7 @@ cdef class ParserBeam(object): cdef public object dones def __init__(self, TransitionSystem moves, states, golds, - int width=4, float density=0.001): + int width, float density): self.moves = moves self.states = states self.golds = golds @@ -89,7 +89,10 @@ cdef class ParserBeam(object): self._set_scores(beam, scores[i]) if self.golds is not None: self._set_costs(beam, self.golds[i], follow_gold=follow_gold) - beam.advance(_transition_state, _hash_state, self.moves.c) + 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): @@ -145,15 +148,16 @@ def get_token_ids(states, int n_tokens): nr_update = 0 def update_beam(TransitionSystem moves, int nr_feature, int max_steps, states, tokvecs, golds, - state2vec, vec2scores, drop=0., sgd=None, - losses=None, int width=4, float density=0.001): + state2vec, vec2scores, + int width, float density, + sgd=None, 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=density) + width=width, density=0.0) cdef StateClass state beam_maps = [] backprops = [] @@ -194,13 +198,13 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, violn.check_crf(pbeam[i], gbeam[i]) histories = [] losses = [] - for i, violn in enumerate(violns): - if violn.cost < 1: - histories.append([]) - losses.append([]) - else: + 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)] @@ -215,10 +219,6 @@ def get_states(pbeams, gbeams, beam_map, nr_update): for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): p_indices.append([]) g_indices.append([]) - if pbeam.loss > 0 and pbeam.min_score > (gbeam.score + numpy.sqrt(nr_update)): - pbeams.dones[eg_id] = True - gbeams.dones[eg_id] = True - continue for i in range(pbeam.size): state = pbeam.at(i) if not state.is_final(): @@ -269,9 +269,12 @@ def get_gradient(nr_class, beam_maps, histories, losses): assert len(histories) == len(losses) for eg_id, hists in enumerate(histories): for loss, hist in zip(losses[eg_id], hists): - if abs(loss) == 0.0 or numpy.isnan(loss): + 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 diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 11fc4e742..3e5566705 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -67,7 +67,6 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_FINE_TUNE = True -BEAM_PARSE = True def get_templates(*args, **kwargs): return [] @@ -299,6 +298,10 @@ 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) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -321,9 +324,7 @@ cdef class Parser: 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.001) - if BEAM_PARSE: - beam_width = 16 + beam_density = self.cfg.get('beam_density', 0.0) cdef Beam beam if beam_width == 1: states = self.parse_batch([doc], [doc.tensor]) @@ -339,7 +340,7 @@ cdef class Parser: return output def pipe(self, docs, int batch_size=1000, int n_threads=2, - beam_width=1, beam_density=0.001): + beam_width=None, beam_density=None): """ Process a stream of documents. @@ -351,8 +352,10 @@ cdef class Parser: The number of threads with which to work on the buffer in parallel. Yields (Doc): Documents, in order. """ - if BEAM_PARSE: - beam_width = 16 + 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 cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): @@ -430,7 +433,7 @@ cdef class Parser: next_step.push_back(st) return states - def beam_parse(self, docs, tokvecses, int beam_width=16, float beam_density=0.001): + def beam_parse(self, docs, tokvecses, int beam_width=3, float beam_density=0.001): cdef Beam beam cdef np.ndarray scores cdef Doc doc @@ -480,9 +483,10 @@ cdef class Parser: return beams def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - if BEAM_PARSE and numpy.random.random() >= 0.5: - return self.update_beam(docs_tokvecs, golds, drop=drop, sgd=sgd, - losses=losses) + if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: + return self.update_beam(docs_tokvecs, 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 @@ -548,7 +552,12 @@ cdef class Parser: bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs - def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + def update_beam(self, docs_tokvecs, golds, width=None, density=None, + drop=0., sgd=None, losses=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. docs, tokvecs = docs_tokvecs @@ -570,8 +579,8 @@ cdef class Parser: states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, states, tokvecs, golds, state2vec, vec2scores, - drop, sgd, losses, - width=16) + width, density, + sgd=sgd, drop=drop, losses=losses) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): if losses is not None: From ed4fb991dcd514aad98efe2a5def82118ce4dd27 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:45:48 +0200 Subject: [PATCH 170/739] Work on vectors loading --- spacy/vectors.pyx | 127 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 110 insertions(+), 17 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 35d4d17ab..59a24dfa9 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -1,18 +1,26 @@ +from libc.stdint cimport int32_t, uint64_t import numpy from collections import OrderedDict import msgpack import msgpack_numpy msgpack_numpy.patch() +from cymem.cymem cimport Pool +cimport numpy as np +from libcpp.vector cimport vector +from .typedefs cimport attr_t from .strings cimport StringStore from . import util +from ._cfile cimport CFile + +MAX_VEC_SIZE = 10000 cdef class Vectors: '''Store, save and load word vectors.''' cdef public object data cdef readonly StringStore strings - cdef public object key2i + cdef public object index def __init__(self, strings, data_or_width): self.strings = StringStore() @@ -22,9 +30,9 @@ cdef class Vectors: else: data = data_or_width self.data = data - self.key2i = {} + self.index = {} for i, string in enumerate(strings): - self.key2i[self.strings.add(string)] = i + self.index[self.strings.add(string)] = i def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -32,7 +40,7 @@ cdef class Vectors: def __getitem__(self, key): if isinstance(key, basestring): key = self.strings[key] - i = self.key2i[key] + i = self.index[key] if i is None: raise KeyError(key) else: @@ -41,7 +49,7 @@ cdef class Vectors: def __setitem__(self, key, vector): if isinstance(key, basestring): key = self.strings.add(key) - i = self.key2i[key] + i = self.index[key] self.data[i] = vector def __iter__(self): @@ -61,34 +69,119 @@ cdef class Vectors: def most_similar(self, key): raise NotImplementedError - def to_disk(self, path): - raise NotImplementedError + def to_disk(self, path, **exclude): + def serialize_vectors(p): + write_vectors_to_bin_loc(self.strings, self.key2i, self.data, str(p)) - def from_disk(self, path): - raise NotImplementedError + serializers = OrderedDict(( + ('vec.bin', serialize_vectors), + )) + return util.to_disk(serializers, exclude) + + def from_disk(self, path, **exclude): + def deserialize_vectors(p): + self.key2i, self.vectors = load_vectors_from_bin_loc(self.strings, str(p)) + + serializers = OrderedDict(( + ('vec.bin', deserialize_vectors) + )) + return util.to_disk(serializers, exclude) 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(( + ('key2row', lambda: msgpack.dumps(self.key2i)), ('strings', lambda: self.strings.to_bytes()), - ('weights', serialize_weights) + ('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) deserializers = OrderedDict(( + ('key2row', lambda b: self.key2i.update(msgpack.loads(b))), ('strings', lambda b: self.strings.from_bytes(b)), - ('weights', deserialize_weights) + ('vectors', deserialize_weights) )) return util.from_bytes(deserializers, exclude) + + +def write_vectors_to_bin_loc(StringStore strings, dict key2i, + np.ndarray vectors, out_loc): + + cdef int32_t vec_len = vectors.shape[1] + cdef int32_t word_len + cdef bytes word_str + cdef char* chars + cdef uint64_t key + cdef int32_t i + cdef float* vec + + cdef CFile out_file = CFile(out_loc, 'wb') + keys = [(i, key) for (key, i) in key2i.item()] + keys.sort() + for i, key in keys: + vec = vectors.data[i * vec_len] + word_str = strings[key].encode('utf8') + word_len = len(word_str) + + out_file.write_from(&word_len, 1, sizeof(word_len)) + out_file.write_from(&vec_len, 1, sizeof(vec_len)) + + chars = word_str + out_file.write_from(chars, word_len, sizeof(char)) + out_file.write_from(vec, vec_len, sizeof(float)) + out_file.close() + + +def load_vectors_from_bin_loc(StringStore strings, loc): + """ + Load vectors from the location of a binary file. + Arguments: + loc (unicode): The path of the binary file to load from. + Returns: + vec_len (int): The length of the vectors loaded. + """ + cdef CFile file_ = CFile(loc, b'rb') + cdef int32_t word_len + cdef int32_t vec_len = 0 + cdef int32_t prev_vec_len = 0 + cdef float* vec + cdef attr_t string_id + cdef bytes py_word + cdef vector[float*] vectors + cdef int line_num = 0 + cdef Pool mem = Pool() + cdef dict key2i = {} + while True: + try: + file_.read_into(&word_len, sizeof(word_len), 1) + except IOError: + break + file_.read_into(&vec_len, sizeof(vec_len), 1) + if prev_vec_len != 0 and vec_len != prev_vec_len: + raise Exception("Mismatched vector sizes") + if 0 >= vec_len >= MAX_VEC_SIZE: + raise Exception("Mismatched vector sizes") + + chars = file_.alloc_read(mem, word_len, sizeof(char)) + vec = file_.alloc_read(mem, vec_len, sizeof(float)) + + key = strings.add(chars[:word_len]) + key2i[key] = vectors.size() + vectors.push_back(vec) + numpy_vectors = numpy.zeros((vectors.size(), vec_len), dtype='f') + for i in range(vectors.size()): + for j in range(vec_len): + numpy_vectors[i, j] = vectors[i][j] + return key2i, numpy_vectors From a1ec41298c9b749e2f946b2c3e4fcac2c116d5ee Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:46:16 +0200 Subject: [PATCH 171/739] Restore CFile loader --- spacy/_cfile.pxd | 26 ++++++++++++++ spacy/_cfile.pyx | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 spacy/_cfile.pxd create mode 100644 spacy/_cfile.pyx 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) From de7f3509d2ea2c7eb74eec0bbf8b95fefa4a6bfe Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:46:41 +0200 Subject: [PATCH 172/739] Compile CFile, for vector loading --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 0a3384ed5..ec114c94e 100755 --- a/setup.py +++ b/setup.py @@ -29,6 +29,7 @@ MOD_NAMES = [ 'spacy.syntax.stateclass', 'spacy.syntax._state', 'spacy.tokenizer', + 'spacy._cfile', 'spacy.syntax.parser', 'spacy.syntax.nn_parser', 'spacy.syntax.beam_parser', From 2993b54fff64ad3e4f6126064ec709e59d78a0fb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:46:56 +0200 Subject: [PATCH 173/739] Load vectors in vocab --- spacy/vocab.pyx | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 149317779..5909872d6 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -280,7 +280,7 @@ cdef class Vocab: or int ID.""" return False - 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 +292,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, exclude='strings.json') - 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 +307,8 @@ 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='string.json') return self def to_bytes(self, **exclude): @@ -313,9 +317,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') + 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 +337,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 From 1cec1efca75c6609b699894ded2683a9edbad9e5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:50:49 +0200 Subject: [PATCH 174/739] Fix merge conflicts in nn_parser from beam stuff --- spacy/syntax/nn_parser.pyx | 48 -------------------------------------- 1 file changed, 48 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 9e7cb9a0e..8160f52e8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -37,14 +37,11 @@ from preshed.maps cimport MapStruct from preshed.maps cimport map_get from thinc.api import layerize, chain, noop, clone -<<<<<<< HEAD from thinc.neural import Model, Affine, ELU, ReLu, Maxout -======= from thinc.neural import Model, Affine, ReLu, Maxout from thinc.neural._classes.batchnorm import BatchNorm as BN from thinc.neural._classes.selu import SELU from thinc.neural._classes.layernorm import LayerNorm ->>>>>>> feature/nn-beam-parser from thinc.neural.ops import NumpyOps, CupyOps from thinc.neural.util import get_array_module @@ -68,10 +65,6 @@ from ..strings cimport StringStore from ..gold cimport GoldParse from ..attrs cimport TAG, DEP -<<<<<<< HEAD -======= -USE_FINE_TUNE = True ->>>>>>> feature/nn-beam-parser def get_templates(*args, **kwargs): return [] @@ -259,7 +252,6 @@ cdef class Parser: nI=token_vector_width) with Model.use_device('cpu'): -<<<<<<< HEAD if depth == 0: upper = chain() upper.is_noop = True @@ -269,12 +261,6 @@ cdef class Parser: zero_init(Affine(nr_class, drop_factor=0.0)) ) upper.is_noop = False -======= - upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) - ) ->>>>>>> feature/nn-beam-parser # TODO: This is an unfortunate hack atm! # Used to set input dimensions in network. lower.begin_training(lower.ops.allocate((500, token_vector_width))) @@ -422,7 +408,6 @@ cdef class Parser: c_is_valid = is_valid.data cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): -<<<<<<< HEAD if not has_hidden: for i in cython.parallel.prange( next_step.size(), num_threads=6, nogil=True): @@ -442,21 +427,6 @@ cdef class Parser: &c_scores[i*nr_class], &c_is_valid[i*nr_class], nr_class) action = self.moves.c[guess] action.do(st, action.label) -======= - for i in range(next_step.size()): - 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) - vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) - c_scores = scores.data - for i in range(next_step.size()): - 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) ->>>>>>> feature/nn-beam-parser this_step, next_step = next_step, this_step next_step.clear() for st in this_step: @@ -526,13 +496,10 @@ cdef class Parser: free(token_ids) def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): -<<<<<<< HEAD -======= if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: return self.update_beam(docs_tokvecs, golds, self.cfg['beam_width'], self.cfg['beam_density'], drop=drop, sgd=sgd, losses=losses) ->>>>>>> feature/nn-beam-parser if losses is not None and self.name not in losses: losses[self.name] = 0. docs, tokvec_lists = docs_tokvecs @@ -589,9 +556,6 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) -<<<<<<< HEAD - return self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) -======= d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) if USE_FINE_TUNE: bp_my_tokvecs(d_tokvecs, sgd=sgd) @@ -646,7 +610,6 @@ cdef class Parser: if USE_FINE_TUNE: bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs ->>>>>>> feature/nn-beam-parser def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long @@ -691,21 +654,10 @@ cdef class Parser: xp = get_array_module(d_tokvecs) for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) -<<<<<<< HEAD - 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) ->>>>>>> feature/nn-beam-parser @property def move_names(self): From d456d2efe1b24805cf0399f2956749f213e72083 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:55:58 +0200 Subject: [PATCH 175/739] Fix conflicts in nn_parser --- spacy/syntax/nn_parser.pyx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 8160f52e8..ca238774a 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -51,6 +51,7 @@ from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch from ..compat import json_dumps +from . import _beam_utils from . import _parse_features from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context @@ -504,6 +505,9 @@ cdef class Parser: losses[self.name] = 0. docs, tokvec_lists = docs_tokvecs tokvecs = self.model[0].ops.flatten(tokvec_lists) + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs += self.model[0].ops.flatten(my_tokvecs) + if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] @@ -557,8 +561,7 @@ cdef class Parser: self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - if USE_FINE_TUNE: - bp_my_tokvecs(d_tokvecs, sgd=sgd) + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def update_beam(self, docs_tokvecs, golds, width=None, density=None, @@ -573,10 +576,9 @@ cdef class Parser: lengths = [len(d) for d in docs] assert min(lengths) >= 1 tokvecs = self.model[0].ops.flatten(tokvecs) - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + my_tokvecs = self.model[0].ops.flatten(my_tokvecs) + tokvecs += my_tokvecs states = self.moves.init_batch(docs) for gold in golds: @@ -607,8 +609,7 @@ cdef class Parser: d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - if USE_FINE_TUNE: - bp_my_tokvecs(d_tokvecs, sgd=sgd) + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): From f9ae86b01cb53a6b7e479f6932b77fb53e0037a2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 20:56:53 +0200 Subject: [PATCH 176/739] Fix requirement --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index fa1a3e6d3..aae0f9388 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.8.1,<6.9.0 +thinc>=6.8.0,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index baaabe492..ec114c94e 100755 --- a/setup.py +++ b/setup.py @@ -194,7 +194,7 @@ def setup_package(): 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.8.1,<6.9.0', + 'thinc>=6.8.0,<6.9.0', 'plac<1.0.0,>=0.9.6', 'pip>=9.0.0,<10.0.0', 'six', From 85794c1167a2f15569003d04fe51211c22e747fe Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 14:55:23 -0500 Subject: [PATCH 177/739] Restore state of _ml.py --- spacy/_ml.py | 90 +++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 18 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index d6116cfe5..c49bad6d4 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -5,6 +5,7 @@ from thinc.neural._classes.hash_embed import HashEmbed 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 @@ -26,6 +27,7 @@ from thinc.neural._classes.rnn import BiLSTM from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP from .tokens.doc import Doc +from . import util import numpy import io @@ -56,6 +58,27 @@ def _logistic(X, drop=0.): 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) @@ -64,6 +87,7 @@ def _zero_init(model): model.W.fill(0.) return model + @layerize def _preprocess_doc(docs, drop=0.): keys = [doc.to_array([LOWER]) for doc in docs] @@ -75,7 +99,6 @@ def _preprocess_doc(docs, drop=0.): return (keys, vals, lengths), None - def _init_for_precomputed(W, ops): if (W**2).sum() != 0.: return @@ -83,6 +106,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"), @@ -187,10 +211,21 @@ class PrecomputableMaxouts(Model): return Yfp, backward +def drop_layer(layer, factor=2.): + def drop_layer_fwd(X, drop=0.): + drop *= factor + mask = layer.ops.get_dropout_mask((1,), drop) + if mask is None or mask > 0: + return layer.begin_update(X, drop=drop) + else: + return X, lambda dX, sgd=None: dX + return wrap(drop_layer_fwd, layer) + + def Tok2Vec(width, embed_size, preprocess=None): - cols = [ID, NORM, PREFIX, SUFFIX, SHAPE] + cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): - norm = get_col(cols.index(NORM)) >> HashEmbed(width, embed_size, name='embed_lower') + 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') @@ -300,7 +335,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: @@ -337,25 +373,22 @@ def fine_tune(embedding, combine=None): vecs, bp_vecs = embedding.begin_update(docs, drop=drop) flat_tokvecs = embedding.ops.flatten(tokvecs) flat_vecs = embedding.ops.flatten(vecs) - alpha = model.mix - minus = 1-model.mix output = embedding.ops.unflatten( - (alpha * flat_tokvecs + minus * flat_vecs), lengths) + (model.mix[0] * flat_vecs + model.mix[1] * flat_tokvecs), + lengths) def fine_tune_bwd(d_output, sgd=None): + bp_vecs(d_output, sgd=sgd) flat_grad = model.ops.flatten(d_output) - model.d_mix += flat_tokvecs.dot(flat_grad.T).sum() - model.d_mix += 1-flat_vecs.dot(flat_grad.T).sum() - - bp_vecs([d_o * minus for d_o in d_output], sgd=sgd) - d_output = [d_o * alpha for d_o in d_output] - sgd(model._mem.weights, model._mem.gradient, key=model.id) - model.mix = model.ops.xp.minimum(model.mix, 1.0) + model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() + model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() + if sgd is not None: + sgd(model._mem.weights, model._mem.gradient, key=model.id) return d_output return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) - model.mix = model._mem.add((model.id, 'mix'), (1,)) - model.mix.fill(0.0) + model.mix = model._mem.add((model.id, 'mix'), (2,)) + model.mix.fill(1.) model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) return model @@ -406,6 +439,27 @@ def preprocess_doc(docs, drop=0.): 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, token_vector_width, **cfg): + embed_size = util.env_opt('embed_size', 7500) + with Model.define_operators({'>>': chain, '+': add}): + # Input: (doc, tensor) tuples + private_tok2vec = Tok2Vec(token_vector_width, embed_size, preprocess=doc2feats()) + + model = ( + fine_tune(private_tok2vec) + >> with_flatten( + Maxout(token_vector_width, token_vector_width) + >> Softmax(nr_class, token_vector_width) + ) + ) + model.nI = None + return model + def build_text_classifier(nr_class, width=64, **cfg): nr_vector = cfg.get('nr_vector', 200) @@ -420,7 +474,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> _flatten_add_lengths >> with_getitem(0, uniqued( - (embed_lower | embed_prefix | embed_suffix | embed_shape) + (embed_lower | embed_prefix | embed_suffix | embed_shape) >> Maxout(width, width+(width//2)*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) @@ -441,7 +495,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0)) >> logistic ) - + model.lsuv = False return model From 96a4a9070bd177e24669d5e15533e4f02ee1f368 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 21:56:19 +0200 Subject: [PATCH 178/739] Compile _beam_utils --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index ec114c94e..6a22f4076 100755 --- a/setup.py +++ b/setup.py @@ -28,6 +28,7 @@ MOD_NAMES = [ 'spacy.pipeline', 'spacy.syntax.stateclass', 'spacy.syntax._state', + 'spacy.syntax._beam_utils', 'spacy.tokenizer', 'spacy._cfile', 'spacy.syntax.parser', From 263366729e77f23b0e9ce1dd67f05391613ee28c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 21:56:31 +0200 Subject: [PATCH 179/739] Don't import BiLSTM --- spacy/_ml.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index d6116cfe5..b0c8f2455 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,7 +21,6 @@ from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths -from thinc.neural._classes.rnn import BiLSTM from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP From baf36d0588b6069b1bc04cf9ce86a6ab84487cf9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 21:56:47 +0200 Subject: [PATCH 180/739] Add compat function for importlib.util --- spacy/compat.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/spacy/compat.py b/spacy/compat.py index 4ef24cd8b..7e69f3a61 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -46,6 +46,7 @@ is_osx = sys.platform == 'darwin' if is_python2: + import imp bytes_ = str unicode_ = unicode basestring_ = basestring @@ -54,6 +55,7 @@ if is_python2: path2str = lambda path: str(path).decode('utf8') elif is_python3: + import importlib.util bytes_ = bytes unicode_ = str basestring_ = str @@ -102,3 +104,12 @@ 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(init_file)) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module From ed95009b5c2626a9bc9f2acc460fa5255b6e8526 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 21:57:06 +0200 Subject: [PATCH 181/739] Fix data loading on Python 2 --- spacy/util.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/spacy/util.py b/spacy/util.py index d83fe3416..645f8b3f7 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -22,7 +22,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 +112,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, str(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) From ec482580b593fc3f4962935f97a581b6c617b6b4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:02:35 +0200 Subject: [PATCH 182/739] Restore changes to pipeline.pyx from nn-beam-parser branch --- spacy/pipeline.pyx | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index b9f59681e..634d3e4b5 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -42,7 +42,7 @@ 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 build_text_classifier +from ._ml import build_text_classifier, build_tagger_model from .parts_of_speech import X @@ -138,7 +138,7 @@ class TokenVectorEncoder(BaseThincComponent): 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. @@ -253,23 +253,25 @@ class NeuralTagger(BaseThincComponent): self.cfg = dict(cfg) def __call__(self, doc): - tags = self.predict([doc.tensor]) + tags = self.predict(([doc], [doc.tensor])) 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): + docs = list(docs) tokvecs = [d.tensor for d in docs] - tag_ids = self.predict(tokvecs) + tag_ids = self.predict((docs, tokvecs)) self.set_annotations(docs, tag_ids) yield from docs - def predict(self, tokvecs): - scores = self.model(tokvecs) + def predict(self, docs_tokvecs): + scores = self.model(docs_tokvecs) scores = self.model.ops.flatten(scores) guesses = scores.argmax(axis=1) if not isinstance(guesses, numpy.ndarray): guesses = guesses.get() + tokvecs = docs_tokvecs[1] guesses = self.model.ops.unflatten(guesses, [tv.shape[0] for tv in tokvecs]) return guesses @@ -282,6 +284,8 @@ class NeuralTagger(BaseThincComponent): 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: @@ -294,8 +298,7 @@ class NeuralTagger(BaseThincComponent): 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_tokvecs, drop=drop) loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) @@ -346,10 +349,8 @@ class NeuralTagger(BaseThincComponent): @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))) - + return build_tagger_model(n_tags, token_vector_width) + def use_params(self, params): with self.model.use_params(params): yield @@ -432,7 +433,7 @@ class NeuralLabeller(NeuralTagger): @property def labels(self): - return self.cfg.get('labels', {}) + return self.cfg.setdefault('labels', {}) @labels.setter def labels(self, value): @@ -455,10 +456,8 @@ class NeuralLabeller(NeuralTagger): @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))) - + return build_tagger_model(n_tags, token_vector_width) + def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) cdef int idx = 0 @@ -654,6 +653,14 @@ cdef class NeuralEntityRecognizer(NeuralParser): nr_feature = 6 + def predict_confidences(self, docs): + tensors = [d.tensor for d in docs] + samples = [] + for i in range(10): + states = self.parse_batch(docs, tensors, drop=0.3) + for state in states: + samples.append(self._get_entities(state)) + def __reduce__(self): return (NeuralEntityRecognizer, (self.vocab, self.moves, self.model), None, None) From 5f81d700ff6fb2d8a136b04361885f208badee8a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:23:03 +0200 Subject: [PATCH 183/739] Restore patches from nn-beam-parser to spacy/syntax --- spacy/syntax/_beam_utils.pyx | 99 ++++++-------- spacy/syntax/_state.pxd | 12 +- spacy/syntax/arc_eager.pyx | 15 +-- spacy/syntax/beam_parser.pyx | 20 +-- spacy/syntax/nn_parser.pxd | 4 - spacy/syntax/nn_parser.pyx | 210 ++++++++++++++--------------- spacy/syntax/transition_system.pyx | 5 +- 7 files changed, 151 insertions(+), 214 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 4d90fe23b..e77036e55 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -6,7 +6,6 @@ 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 @@ -46,10 +45,9 @@ cdef class ParserBeam(object): 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): + int width=4, float density=0.001): self.moves = moves self.states = states self.golds = golds @@ -63,7 +61,6 @@ cdef class ParserBeam(object): 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: @@ -73,7 +70,7 @@ cdef class ParserBeam(object): @property def is_done(self): - return all(b.is_done or self.dones[i] for i, b in enumerate(self.beams)) + return all(b.is_done for b in self.beams) def __getitem__(self, i): return self.beams[i] @@ -84,42 +81,32 @@ cdef class ParserBeam(object): 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]: + if beam.is_done or not scores[i].size: 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: + assert self.golds is not None 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: + if beam.is_done: 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 + if is_gold(beam.at(j), self.golds[i], self.moves.strings): + beam._states[j].loss = 0.0 + elif beam._states[j].loss == 0.0: + beam._states[j].loss = 1.0 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): + for i in range(beam.size): 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 + beam.scores[i][j] = c_scores[i * beam.nr_class + j] + self.moves.set_valid(beam.is_valid[i], state.c) def _set_costs(self, Beam beam, GoldParse gold, int follow_gold=False): for i in range(beam.size): @@ -132,6 +119,21 @@ cdef class ParserBeam(object): beam.is_valid[i][j] = 0 +def is_gold(StateClass state, GoldParse gold, 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 + + def get_token_ids(states, int n_tokens): cdef StateClass state cdef np.ndarray ids = numpy.zeros((len(states), n_tokens), @@ -148,11 +150,9 @@ def get_token_ids(states, int n_tokens): nr_update = 0 def update_beam(TransitionSystem moves, int nr_feature, int max_steps, states, tokvecs, golds, - state2vec, vec2scores, - int width, float density, - sgd=None, losses=None, drop=0.): + state2vec, vec2scores, drop=0., sgd=None, + losses=None, int width=4, float density=0.001): global nr_update - cdef MaxViolation violn nr_update += 1 pbeam = ParserBeam(moves, states, golds, width=width, density=density) @@ -163,8 +163,6 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, 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 @@ -196,17 +194,14 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, # 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)] + + # Only make updates if we have non-gold states + histories = [((v.p_hist + v.g_hist) if v.p_hist else []) for v in violns] + losses = [((v.p_probs + v.g_probs) if v.p_probs else []) for v in violns] + states_d_scores = get_gradient(moves.n_moves, beam_maps, + histories, losses) + assert len(states_d_scores) == len(backprops), (len(states_d_scores), len(backprops)) + return states_d_scores, backprops def get_states(pbeams, gbeams, beam_map, nr_update): @@ -219,11 +214,12 @@ def get_states(pbeams, gbeams, beam_map, nr_update): for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): p_indices.append([]) g_indices.append([]) + if pbeam.loss > 0 and pbeam.min_score > gbeam.score: + continue 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) @@ -259,27 +255,18 @@ def get_gradient(nr_class, beam_maps, histories, losses): """ 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')) + for beam_map in beam_maps: + if beam_map: + grads.append(numpy.zeros((max(beam_map.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 + grads[j][i, clas] += loss / len(histories) key = key + tuple([clas]) return grads diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index b2a4e9eee..9aeeba441 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -37,6 +37,7 @@ 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)) + this.offset = 0 cdef int i for i in range(length + (PADDING * 2)): this._ents[i].end = -1 @@ -73,16 +74,7 @@ cdef cppclass StateC: free(this.shifted - PADDING) void set_context_tokens(int* ids, int n) nogil: - 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: + if n == 13: ids[0] = this.B(0) ids[1] = this.B(1) ids[2] = this.S(0) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 25a6ca42e..9477449a5 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -351,20 +351,6 @@ 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]]): @@ -399,6 +385,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] diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx index e585e2ccb..f4f66f9fb 100644 --- a/spacy/syntax/beam_parser.pyx +++ b/spacy/syntax/beam_parser.pyx @@ -34,6 +34,7 @@ from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context from .stateclass cimport StateClass from .parser cimport Parser +from ._beam_utils import is_gold DEBUG = False @@ -107,7 +108,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 self.moves.is_gold_parse(pred.at(i), gold_parse): + if is_gold(pred.at(i), gold_parse, self.moves.strings): pred._states[i].loss = 0.0 elif pred._states[i].loss == 0.0: pred._states[i].loss = 1.0 @@ -213,7 +214,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 moves.is_gold_parse(state, gold_parse) == True: + if is_gold(state, gold_parse, moves.strings) == True: for dep in gold_parse.orig_annot: print(dep[1], dep[3], dep[4]) print("Cost", pred._states[i].loss) @@ -227,7 +228,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 moves.is_gold(state, gold_parse) == False: + if is_gold(state, gold_parse, moves.strings) == False: print("Truth") for dep in gold_parse.orig_annot: print(dep[1], dep[3], dep[4]) @@ -237,16 +238,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/nn_parser.pxd b/spacy/syntax/nn_parser.pxd index 524718965..7ff4b9f9f 100644 --- a/spacy/syntax/nn_parser.pxd +++ b/spacy/syntax/nn_parser.pxd @@ -14,8 +14,4 @@ cdef class Parser: cdef readonly TransitionSystem moves cdef readonly object cfg - cdef void _parse_step(self, StateC* state, - const float* feat_weights, - int nr_class, int nr_feat, int nr_piece) nogil - #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ca238774a..a193c96a3 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -37,9 +37,7 @@ 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.neural import Model, Affine, ReLu, Maxout -from thinc.neural._classes.batchnorm import BatchNorm as BN from thinc.neural._classes.selu import SELU from thinc.neural._classes.layernorm import LayerNorm from thinc.neural.ops import NumpyOps, CupyOps @@ -48,10 +46,10 @@ 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 .._ml import Tok2Vec, doc2feats, rebatch, fine_tune +from .._ml import Residual, drop_layer from ..compat import json_dumps -from . import _beam_utils from . import _parse_features from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context @@ -64,8 +62,11 @@ 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 +USE_FINE_TUNE = True +BEAM_PARSE = True def get_templates(*args, **kwargs): return [] @@ -237,11 +238,14 @@ 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): + def Model(cls, nr_class, token_vector_width=128, hidden_width=300, 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) + embed_size = util.env_opt('embed_size', 4000) + tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, + preprocess=doc2feats())) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -253,15 +257,10 @@ cdef class Parser: nI=token_vector_width) with Model.use_device('cpu'): - if depth == 0: - upper = chain() - upper.is_noop = True - else: - upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) - ) - upper.is_noop = False + upper = chain( + clone(Residual(ReLu(hidden_width)), (depth-1)), + zero_init(Affine(nr_class, drop_factor=0.0)) + ) # TODO: This is an unfortunate hack atm! # Used to set input dimensions in network. lower.begin_training(lower.ops.allocate((500, token_vector_width))) @@ -273,7 +272,7 @@ cdef class Parser: 'hidden_width': hidden_width, 'maxout_pieces': parser_maxout_pieces } - return (lower, upper), cfg + return (tensors, lower, upper), cfg def __init__(self, Vocab vocab, moves=True, model=True, **cfg): """ @@ -299,10 +298,6 @@ 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) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -325,7 +320,7 @@ cdef class Parser: 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) + beam_density = self.cfg.get('beam_density', 0.001) cdef Beam beam if beam_width == 1: states = self.parse_batch([doc], [doc.tensor]) @@ -341,7 +336,7 @@ cdef class Parser: return output def pipe(self, docs, int batch_size=1000, int n_threads=2, - beam_width=None, beam_density=None): + beam_width=1, beam_density=0.001): """ Process a stream of documents. @@ -353,21 +348,21 @@ 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) + if BEAM_PARSE: + beam_width = 8 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] + tokvecs = [doc.tensor for doc in docs] if beam_width == 1: parse_states = self.parse_batch(docs, tokvecs) else: - parse_states = self.beam_parse(docs, tokvecs, - beam_width=beam_width, beam_density=beam_density) + beams = self.beam_parse(docs, tokvecs, + 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 @@ -382,8 +377,12 @@ cdef class Parser: int nr_class, nr_feat, nr_piece, nr_dim, nr_state if isinstance(docs, Doc): docs = [docs] + if isinstance(tokvecses, np.ndarray): + tokvecses = [tokvecses] tokvecs = self.model[0].ops.flatten(tokvecses) + if USE_FINE_TUNE: + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -407,27 +406,20 @@ cdef class Parser: cdef np.ndarray scores c_token_ids = token_ids.data c_is_valid = is_valid.data - cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): - if not has_hidden: - for i in cython.parallel.prange( - next_step.size(), 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()): - 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) + for i in range(next_step.size()): + 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) vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) - c_scores = scores.data - for i in range(next_step.size()): - 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) + scores = vec2scores(vectors) + c_scores = scores.data + for i in range(next_step.size()): + 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) this_step, next_step = next_step, this_step next_step.clear() for st in this_step: @@ -435,18 +427,22 @@ cdef class Parser: next_step.push_back(st) return states - def beam_parse(self, docs, tokvecses, int beam_width=3, float beam_density=0.001): + def beam_parse(self, docs, tokvecses, int beam_width=8, 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 tokvecs = self.model[0].ops.flatten(tokvecses) + if USE_FINE_TUNE: + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, 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) @@ -459,58 +455,42 @@ cdef class Parser: states = [] for i in range(beam.size): stcls = beam.at(i) - states.append(stcls) + # 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) 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 j in range(nr_class): - beam.scores[i][j] = scores[i, j] + 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)) - - state.set_context_tokens(token_ids, nr_feat) - sum_state_features(scores, - feat_weights, token_ids, 1, nr_feat, nr_class * nr_piece) - self.moves.set_valid(is_valid, state) - guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece) - action = self.moves.c[guess] - action.do(state, action.label) - - free(is_valid) - free(scores) - free(token_ids) - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: - return self.update_beam(docs_tokvecs, golds, - self.cfg['beam_width'], self.cfg['beam_density'], - drop=drop, sgd=sgd, losses=losses) + if BEAM_PARSE: + return self.update_beam(docs_tokvecs, golds, 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) - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs += self.model[0].ops.flatten(my_tokvecs) - if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] + if USE_FINE_TUNE: + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + my_tokvecs = self.model[0].ops.flatten(my_tokvecs) + tokvecs += my_tokvecs cuda_stream = get_cuda_stream() @@ -537,13 +517,13 @@ cdef class Parser: 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_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), @@ -561,24 +541,21 @@ cdef class Parser: self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - bp_my_tokvecs(d_tokvecs, sgd=sgd) + if USE_FINE_TUNE: + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs - def update_beam(self, docs_tokvecs, golds, width=None, density=None, - drop=0., sgd=None, losses=None): - if width is None: - width = self.cfg.get('beam_width', 2) - if density is None: - density = self.cfg.get('beam_density', 0.0) + def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): if losses is not None and self.name not in losses: losses[self.name] = 0. docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] assert min(lengths) >= 1 tokvecs = self.model[0].ops.flatten(tokvecs) - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs + if USE_FINE_TUNE: + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + my_tokvecs = self.model[0].ops.flatten(my_tokvecs) + tokvecs += my_tokvecs states = self.moves.init_batch(docs) for gold in golds: @@ -590,8 +567,8 @@ cdef class Parser: states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, states, tokvecs, golds, state2vec, vec2scores, - width, density, - sgd=sgd, drop=drop, losses=losses) + drop, sgd, losses, + width=8) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): if losses is not None: @@ -609,7 +586,8 @@ cdef class Parser: d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - bp_my_tokvecs(d_tokvecs, sgd=sgd) + if USE_FINE_TUNE: + bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): @@ -656,9 +634,9 @@ cdef class Parser: for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) mask = ids >= 0 - d_state_features *= mask.reshape(ids.shape + (1,)) - self.model[0].ops.scatter_add(d_tokvecs, ids * mask, - d_state_features) + indices = xp.nonzero(mask) + self.model[0].ops.scatter_add(d_tokvecs, ids[indices], + d_state_features[indices]) @property def move_names(self): @@ -669,12 +647,12 @@ cdef class Parser: return names def get_batch_model(self, batch_size, tokvecs, stream, dropout): - lower, upper = self.model + _, lower, upper = self.model state2vec = precompute_hiddens(batch_size, tokvecs, lower, stream, drop=dropout) return state2vec, upper - nr_feature = 8 + nr_feature = 13 def get_token_ids(self, states): cdef StateClass state @@ -759,10 +737,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)) @@ -783,24 +763,29 @@ cdef class Parser: 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)) )) if 'model' in exclude: + exclude['tok2vec_model'] = True exclude['lower_model'] = True exclude['upper_model'] = True exclude.pop('model') @@ -811,6 +796,7 @@ cdef class Parser: ('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))), + ('tok2vec_model', lambda b: None), ('lower_model', lambda b: None), ('upper_model', lambda b: None) )) @@ -820,10 +806,12 @@ cdef class Parser: self.model, cfg = self.Model(self.moves.n_moves) else: cfg = {} + 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 diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index 647f5e24a..d3f64f827 100644 --- a/spacy/syntax/transition_system.pyx +++ b/spacy/syntax/transition_system.pyx @@ -99,9 +99,6 @@ 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 @@ -110,6 +107,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: From ce321b03225149aaa0d847e9ac4e00fac96ec801 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:24:46 +0200 Subject: [PATCH 184/739] Restore changes from nn-beam-parser to spacy/_ml --- spacy/_ml.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index b3b0d3e46..91b530fad 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -9,7 +9,7 @@ import cytoolz from thinc.neural._classes.convolution import ExtractWindow from thinc.neural._classes.static_vectors import StaticVectors -from thinc.neural._classes.batchnorm import BatchNorm as BN +from thinc.neural._classes.batchnorm import BatchNorm from thinc.neural._classes.layernorm import LayerNorm as LN from thinc.neural._classes.resnet import Residual from thinc.neural import ReLu @@ -229,14 +229,14 @@ def Tok2Vec(width, embed_size, preprocess=None): 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') - embed = (norm | prefix | suffix | shape ) >> LN(Maxout(width, width*4, pieces=3)) + embed = (norm | prefix | suffix | shape ) >> Maxout(width, width*4, pieces=3) tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') >> uniqued(embed, column=5) >> drop_layer( Residual( - (ExtractWindow(nW=1) >> BN(Maxout(width, width*3))) + (ExtractWindow(nW=1) >> ReLu(width, width*3)) ) ) ** 4, pad=4 ) From 11c31d285ce0bc7d64099f29e0d5c4cd26ce7e99 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:26:12 +0200 Subject: [PATCH 185/739] Restore changes from nn-beam-parser --- spacy/cli/convert.py | 4 ++-- spacy/cli/train.py | 5 ++--- spacy/language.py | 25 +++++++++++++++++++------ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index a0a76e5ec..fef6753e6 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -21,10 +21,10 @@ CONVERTERS = { @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), 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): """ Convert files into JSON format for use with train command and other experiment management functions. diff --git a/spacy/cli/train.py b/spacy/cli/train.py index af028dae5..04aac8319 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -91,15 +91,14 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) nlp.update(docs, golds, sgd=optimizer, - drop=next(dropout_rates), losses=losses) + drop=next(dropout_rates), losses=losses, + update_tensors=True) pbar.update(sum(len(doc) for doc in docs)) with nlp.use_params(optimizer.averages): 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( diff --git a/spacy/language.py b/spacy/language.py index 0284c4636..cb679a2bc 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -277,7 +277,8 @@ class Language(object): def make_doc(self, text): return self.tokenizer(text) - def update(self, docs, golds, drop=0., sgd=None, losses=None): + def update(self, docs, golds, drop=0., sgd=None, losses=None, + update_tensors=False): """Update the models in the pipeline. docs (iterable): A batch of `Doc` objects. @@ -304,14 +305,17 @@ class Language(object): grads[key] = (W, dW) pipes = list(self.pipeline[1:]) random.shuffle(pipes) + tokvecses, bp_tokvecses = tok2vec.model.begin_update(feats, drop=drop) + all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for 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) + if update_tensors and d_tokvecses is not None: + for i, d_tv in enumerate(d_tokvecses): + all_d_tokvecses[i] += d_tv + bp_tokvecses(all_d_tokvecses, sgd=sgd) for key, (W, dW) in grads.items(): sgd(W, dW, key=key) # Clear the tensor variable, to free GPU memory. @@ -381,9 +385,18 @@ class Language(object): return optimizer def evaluate(self, docs_golds): - docs, golds = zip(*docs_golds) scorer = Scorer() - for doc, gold in zip(self.pipe(docs, batch_size=32), golds): + docs, golds = zip(*docs_golds) + docs = list(docs) + golds = list(golds) + for 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): scorer.score(doc, gold) doc.tensor = None return scorer From de7e8703e35f1e0d6090e2e4ce81779e8e17e03f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:27:42 +0200 Subject: [PATCH 186/739] Restore tests for beam parser --- spacy/tests/parser/test_neural_parser.py | 13 ++++ spacy/tests/parser/test_nn_beam.py | 87 ++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 spacy/tests/parser/test_nn_beam.py diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 42b55745f..30a6367c8 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -78,3 +78,16 @@ def test_predict_doc_beam(parser, tok2vec, model, doc): parser(doc, beam_width=32, beam_density=0.001) for word in doc: print(word.text, word.head, word.dep_) + + +def test_update_doc_beam(parser, tok2vec, model, doc, gold): + parser.model = model + tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) + d_tokvecs = parser.update_beam(([doc], tokvecs), [gold]) + assert d_tokvecs[0].shape == tokvecs[0].shape + def optimize(weights, gradient, key=None): + weights -= 0.001 * gradient + bp_tokvecs(d_tokvecs, sgd=optimize) + assert d_tokvecs[0].sum() == 0. + + diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py new file mode 100644 index 000000000..45c85d969 --- /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) + +@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]) From fe90dfc390c98b154c544c10f07f2138d9b03384 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:38:28 +0200 Subject: [PATCH 187/739] Restore changes from nn-beam-parser to spacy/_ml --- spacy/_ml.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 91b530fad..c49bad6d4 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -9,7 +9,7 @@ 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.batchnorm import BatchNorm as BN from thinc.neural._classes.layernorm import LayerNorm as LN from thinc.neural._classes.resnet import Residual from thinc.neural import ReLu @@ -22,6 +22,7 @@ from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths +from thinc.neural._classes.rnn import BiLSTM from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP @@ -229,14 +230,14 @@ def Tok2Vec(width, embed_size, preprocess=None): 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') - embed = (norm | prefix | suffix | shape ) >> Maxout(width, width*4, pieces=3) + embed = (norm | prefix | suffix | shape ) >> LN(Maxout(width, width*4, pieces=3)) tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') >> uniqued(embed, column=5) >> drop_layer( Residual( - (ExtractWindow(nW=1) >> ReLu(width, width*3)) + (ExtractWindow(nW=1) >> BN(Maxout(width, width*3))) ) ) ** 4, pad=4 ) From c307a0ffb8317b2405978f88ddf13c2f05957095 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:38:59 +0200 Subject: [PATCH 188/739] Restore patches from nn-beam-parser to spacy/syntax --- spacy/syntax/_beam_utils.pyx | 99 +++++++++++++++++------------- spacy/syntax/_state.pxd | 11 +++- spacy/syntax/arc_eager.pyx | 14 +++++ spacy/syntax/beam_parser.pyx | 7 +-- spacy/syntax/nn_parser.pyx | 48 +++++++++------ spacy/syntax/transition_system.pyx | 3 + 6 files changed, 116 insertions(+), 66 deletions(-) diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index e77036e55..4d90fe23b 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -6,6 +6,7 @@ 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 @@ -45,9 +46,10 @@ cdef class ParserBeam(object): 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=4, float density=0.001): + int width, float density): self.moves = moves self.states = states self.golds = golds @@ -61,6 +63,7 @@ cdef class ParserBeam(object): 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: @@ -70,7 +73,7 @@ cdef class ParserBeam(object): @property def is_done(self): - return all(b.is_done for b in self.beams) + return all(b.is_done or self.dones[i] for i, b in enumerate(self.beams)) def __getitem__(self, i): return self.beams[i] @@ -81,32 +84,42 @@ cdef class ParserBeam(object): 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: + 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: - assert self.golds is not None 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: + if beam.is_done and self.golds is not None: for j in range(beam.size): - if is_gold(beam.at(j), self.golds[i], self.moves.strings): - beam._states[j].loss = 0.0 - elif beam._states[j].loss == 0.0: - beam._states[j].loss = 1.0 + 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] - for i in range(beam.size): + 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(beam.nr_class): - beam.scores[i][j] = c_scores[i * beam.nr_class + j] + 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): @@ -119,21 +132,6 @@ cdef class ParserBeam(object): beam.is_valid[i][j] = 0 -def is_gold(StateClass state, GoldParse gold, 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 - - def get_token_ids(states, int n_tokens): cdef StateClass state cdef np.ndarray ids = numpy.zeros((len(states), n_tokens), @@ -150,9 +148,11 @@ def get_token_ids(states, int n_tokens): nr_update = 0 def update_beam(TransitionSystem moves, int nr_feature, int max_steps, states, tokvecs, golds, - state2vec, vec2scores, drop=0., sgd=None, - losses=None, int width=4, float density=0.001): + state2vec, vec2scores, + int width, float density, + sgd=None, losses=None, drop=0.): global nr_update + cdef MaxViolation violn nr_update += 1 pbeam = ParserBeam(moves, states, golds, width=width, density=density) @@ -163,6 +163,8 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, 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 @@ -194,14 +196,17 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps, # Track the "maximum violation", to use in the update. for i, violn in enumerate(violns): violn.check_crf(pbeam[i], gbeam[i]) - - # Only make updates if we have non-gold states - histories = [((v.p_hist + v.g_hist) if v.p_hist else []) for v in violns] - losses = [((v.p_probs + v.g_probs) if v.p_probs else []) for v in violns] - states_d_scores = get_gradient(moves.n_moves, beam_maps, - histories, losses) - assert len(states_d_scores) == len(backprops), (len(states_d_scores), len(backprops)) - return states_d_scores, backprops + 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): @@ -214,12 +219,11 @@ def get_states(pbeams, gbeams, beam_map, nr_update): for eg_id, (pbeam, gbeam) in enumerate(zip(pbeams, gbeams)): p_indices.append([]) g_indices.append([]) - if pbeam.loss > 0 and pbeam.min_score > gbeam.score: - continue 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) @@ -255,18 +259,27 @@ def get_gradient(nr_class, beam_maps, histories, losses): """ nr_step = len(beam_maps) grads = [] - for beam_map in beam_maps: - if beam_map: - grads.append(numpy.zeros((max(beam_map.values())+1, nr_class), dtype='f')) + 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 / len(histories) + grads[j][i, clas] += loss key = key + tuple([clas]) return grads diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 9aeeba441..3da9e5d4c 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -74,7 +74,16 @@ cdef cppclass StateC: free(this.shifted - PADDING) void set_context_tokens(int* ids, int n) nogil: - if n == 13: + 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) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index 9477449a5..aab350d76 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -351,6 +351,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]]): diff --git a/spacy/syntax/beam_parser.pyx b/spacy/syntax/beam_parser.pyx index f4f66f9fb..68e9f27af 100644 --- a/spacy/syntax/beam_parser.pyx +++ b/spacy/syntax/beam_parser.pyx @@ -34,7 +34,6 @@ from ._parse_features cimport CONTEXT_SIZE from ._parse_features cimport fill_context from .stateclass cimport StateClass from .parser cimport Parser -from ._beam_utils import is_gold DEBUG = False @@ -108,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 @@ -214,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) @@ -228,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]) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index a193c96a3..3e5566705 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -38,6 +38,7 @@ from preshed.maps cimport map_get from thinc.api import layerize, chain, noop, clone from thinc.neural import Model, Affine, ReLu, Maxout +from thinc.neural._classes.batchnorm import BatchNorm as BN from thinc.neural._classes.selu import SELU from thinc.neural._classes.layernorm import LayerNorm from thinc.neural.ops import NumpyOps, CupyOps @@ -66,7 +67,6 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_FINE_TUNE = True -BEAM_PARSE = True def get_templates(*args, **kwargs): return [] @@ -258,7 +258,7 @@ cdef class Parser: with Model.use_device('cpu'): upper = chain( - clone(Residual(ReLu(hidden_width)), (depth-1)), + clone(Maxout(hidden_width), (depth-1)), zero_init(Affine(nr_class, drop_factor=0.0)) ) # TODO: This is an unfortunate hack atm! @@ -298,6 +298,10 @@ 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) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -320,7 +324,7 @@ cdef class Parser: 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.001) + beam_density = self.cfg.get('beam_density', 0.0) cdef Beam beam if beam_width == 1: states = self.parse_batch([doc], [doc.tensor]) @@ -336,7 +340,7 @@ cdef class Parser: return output def pipe(self, docs, int batch_size=1000, int n_threads=2, - beam_width=1, beam_density=0.001): + beam_width=None, beam_density=None): """ Process a stream of documents. @@ -348,8 +352,10 @@ cdef class Parser: The number of threads with which to work on the buffer in parallel. Yields (Doc): Documents, in order. """ - if BEAM_PARSE: - beam_width = 8 + 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 cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): @@ -411,7 +417,7 @@ cdef class Parser: 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) - vectors = state2vec(token_ids[:next_step.size()]) + vectors = state2vec(token_ids[:next_step.size()]) scores = vec2scores(vectors) c_scores = scores.data for i in range(next_step.size()): @@ -427,7 +433,7 @@ cdef class Parser: next_step.push_back(st) return states - def beam_parse(self, docs, tokvecses, int beam_width=8, float beam_density=0.001): + def beam_parse(self, docs, tokvecses, int beam_width=3, float beam_density=0.001): cdef Beam beam cdef np.ndarray scores cdef Doc doc @@ -477,9 +483,10 @@ cdef class Parser: return beams def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - if BEAM_PARSE: - return self.update_beam(docs_tokvecs, golds, drop=drop, sgd=sgd, - losses=losses) + if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: + return self.update_beam(docs_tokvecs, 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 @@ -545,7 +552,12 @@ cdef class Parser: bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs - def update_beam(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + def update_beam(self, docs_tokvecs, golds, width=None, density=None, + drop=0., sgd=None, losses=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. docs, tokvecs = docs_tokvecs @@ -567,8 +579,8 @@ cdef class Parser: states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, states, tokvecs, golds, state2vec, vec2scores, - drop, sgd, losses, - width=8) + width, density, + sgd=sgd, drop=drop, losses=losses) backprop_lower = [] for i, d_scores in enumerate(states_d_scores): if losses is not None: @@ -634,9 +646,9 @@ cdef class Parser: for ids, d_vector, bp_vector in backprops: d_state_features = bp_vector(d_vector, sgd=sgd) mask = ids >= 0 - indices = xp.nonzero(mask) - self.model[0].ops.scatter_add(d_tokvecs, ids[indices], - d_state_features[indices]) + d_state_features *= mask.reshape(ids.shape + (1,)) + self.model[0].ops.scatter_add(d_tokvecs, ids * mask, + d_state_features) @property def move_names(self): @@ -652,7 +664,7 @@ cdef class Parser: lower, stream, drop=dropout) return state2vec, upper - nr_feature = 13 + nr_feature = 8 def get_token_ids(self, states): cdef StateClass state diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index d3f64f827..9cf82e0c7 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 From bae59bf92f7d4a22b5b1391699d29f2892de9792 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 22:46:59 +0200 Subject: [PATCH 189/739] Remove BiLSTM import --- spacy/_ml.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index c49bad6d4..b3b0d3e46 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -22,7 +22,6 @@ from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths -from thinc.neural._classes.rnn import BiLSTM from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP From a7309a217d5a0d9c94bc9dff85c2e7d8262b345a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 18 Aug 2017 23:12:05 +0200 Subject: [PATCH 190/739] Update tagger serialization --- spacy/tests/serialize/test_serialize_tagger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/tests/serialize/test_serialize_tagger.py b/spacy/tests/serialize/test_serialize_tagger.py index fa9a776bb..e56db1421 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, 8) + tagger2.model = tagger2.Model(8, 8) return (tagger1, tagger2) From 2da96a0ec7bc52fe09c12ffbe7e51388963e8f84 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 04:15:46 +0200 Subject: [PATCH 191/739] Fix beam test --- spacy/tests/parser/test_nn_beam.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/parser/test_nn_beam.py b/spacy/tests/parser/test_nn_beam.py index 45c85d969..ab8bf012b 100644 --- a/spacy/tests/parser/test_nn_beam.py +++ b/spacy/tests/parser/test_nn_beam.py @@ -63,7 +63,7 @@ def vector_size(): @pytest.fixture def beam(moves, states, golds, beam_width): - return ParserBeam(moves, states, golds, width=beam_width) + return ParserBeam(moves, states, golds, width=beam_width, density=0.0) @pytest.fixture def scores(moves, batch_size, beam_width): From 42d47c1e5ced1afbd45a5df8ceded4bcd485d858 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 04:16:32 +0200 Subject: [PATCH 192/739] Fix tagger serialization --- spacy/tests/serialize/test_serialize_tagger.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/tests/serialize/test_serialize_tagger.py b/spacy/tests/serialize/test_serialize_tagger.py index e56db1421..3154687c3 100644 --- a/spacy/tests/serialize/test_serialize_tagger.py +++ b/spacy/tests/serialize/test_serialize_tagger.py @@ -12,7 +12,7 @@ def taggers(en_vocab): tagger1 = Tagger(en_vocab) tagger2 = Tagger(en_vocab) tagger1.model = tagger1.Model(8, 8) - tagger2.model = tagger2.Model(8, 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) From 19c495f451e3b83f5575743d63c3745a9fd5eaa2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 04:33:03 +0200 Subject: [PATCH 193/739] Fix vectors deserialization --- spacy/vectors.pyx | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 59a24dfa9..1b1e8000a 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -20,7 +20,7 @@ cdef class Vectors: '''Store, save and load word vectors.''' cdef public object data cdef readonly StringStore strings - cdef public object index + cdef public object key2row def __init__(self, strings, data_or_width): self.strings = StringStore() @@ -30,9 +30,9 @@ cdef class Vectors: else: data = data_or_width self.data = data - self.index = {} + self.key2row = {} for i, string in enumerate(strings): - self.index[self.strings.add(string)] = i + self.key2row[self.strings.add(string)] = i def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -40,7 +40,7 @@ cdef class Vectors: def __getitem__(self, key): if isinstance(key, basestring): key = self.strings[key] - i = self.index[key] + i = self.key2row[key] if i is None: raise KeyError(key) else: @@ -49,7 +49,7 @@ cdef class Vectors: def __setitem__(self, key, vector): if isinstance(key, basestring): key = self.strings.add(key) - i = self.index[key] + i = self.key2row[key] self.data[i] = vector def __iter__(self): @@ -71,7 +71,7 @@ cdef class Vectors: def to_disk(self, path, **exclude): def serialize_vectors(p): - write_vectors_to_bin_loc(self.strings, self.key2i, self.data, str(p)) + write_vectors_to_bin_loc(self.strings, self.key2row, self.data, str(p)) serializers = OrderedDict(( ('vec.bin', serialize_vectors), @@ -80,12 +80,13 @@ cdef class Vectors: def from_disk(self, path, **exclude): def deserialize_vectors(p): - self.key2i, self.vectors = load_vectors_from_bin_loc(self.strings, str(p)) + values = load_vectors_from_bin_loc(self.strings, str(p)) + self.key2row, self.data = values serializers = OrderedDict(( - ('vec.bin', deserialize_vectors) + ('vec.bin', deserialize_vectors), )) - return util.to_disk(serializers, exclude) + return util.from_disk(path, serializers, exclude) def to_bytes(self, **exclude): def serialize_weights(): @@ -93,9 +94,9 @@ cdef class Vectors: return self.data.to_bytes() else: return msgpack.dumps(self.data) - + b = msgpack.dumps(self.key2row) serializers = OrderedDict(( - ('key2row', lambda: msgpack.dumps(self.key2i)), + ('key2row', lambda: msgpack.dumps(self.key2row)), ('strings', lambda: self.strings.to_bytes()), ('vectors', serialize_weights) )) @@ -109,7 +110,7 @@ cdef class Vectors: self.data = msgpack.loads(b) deserializers = OrderedDict(( - ('key2row', lambda b: self.key2i.update(msgpack.loads(b))), + ('key2row', lambda b: self.key2row.update(msgpack.loads(b))), ('strings', lambda b: self.strings.from_bytes(b)), ('vectors', deserialize_weights) )) From 482bba1722b848a92d6f19ec2bb3152ed1b84ae4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 12:20:45 +0200 Subject: [PATCH 194/739] Add Span.to_array method --- spacy/tokens/span.pxd | 2 +- spacy/tokens/span.pyx | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) 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..9625b5547 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 @@ -135,6 +135,28 @@ 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) + output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64) + for i in range(self.start, self.end): + for j, feature in enumerate(attr_ids): + output[i, 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 \ From 80236116a6034c45be6521d99d64f97ddeb764a1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 12:21:09 +0200 Subject: [PATCH 195/739] Add Doc.char_span method, to get a span by character offset --- spacy/tokens/doc.pyx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index 822a0152d..75088b010 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -238,6 +238,27 @@ cdef class Doc: def doc(self): return self + def char_span(self, int start_idx, int end_idx, attr_t 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): 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. + """ + 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. From 97aabafb5f99d12065397f8ca162f92ad9a4acc0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 12:21:33 +0200 Subject: [PATCH 196/739] Document as_tuples keyword arg of Language.pipe --- spacy/language.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index cb679a2bc..aa757ffa8 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -430,11 +430,16 @@ class Language(object): except StopIteration: pass - def pipe(self, texts, tuples=False, 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. @@ -446,7 +451,7 @@ class Language(object): >>> for doc in nlp.pipe(texts, batch_size=50, n_threads=4): >>> assert doc.is_parsed """ - if tuples: + 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) From 1fe5e1a4d1cd9857e2ad945800c1c5c6850c853c Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:22:26 +0200 Subject: [PATCH 197/739] Add language example sentences (see #1107) da, de, en, es, fr, he, it, nb, pl, pt, sv --- spacy/lang/da/examples.py | 18 ++++++++++++++++++ spacy/lang/de/examples.py | 22 ++++++++++++++++++++++ spacy/lang/en/examples.py | 22 ++++++++++++++++++++++ spacy/lang/es/examples.py | 22 ++++++++++++++++++++++ spacy/lang/fr/examples.py | 26 ++++++++++++++++++++++++++ spacy/lang/he/examples.py | 28 ++++++++++++++++++++++++++++ spacy/lang/it/examples.py | 18 ++++++++++++++++++ spacy/lang/nb/examples.py | 18 ++++++++++++++++++ spacy/lang/pl/examples.py | 20 ++++++++++++++++++++ spacy/lang/pt/examples.py | 18 ++++++++++++++++++ spacy/lang/sv/examples.py | 18 ++++++++++++++++++ 11 files changed, 230 insertions(+) create mode 100644 spacy/lang/da/examples.py create mode 100644 spacy/lang/de/examples.py create mode 100644 spacy/lang/en/examples.py create mode 100644 spacy/lang/es/examples.py create mode 100644 spacy/lang/fr/examples.py create mode 100644 spacy/lang/he/examples.py create mode 100644 spacy/lang/it/examples.py create mode 100644 spacy/lang/nb/examples.py create mode 100644 spacy/lang/pl/examples.py create mode 100644 spacy/lang/pt/examples.py create mode 100644 spacy/lang/sv/examples.py 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/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/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/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/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/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/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/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/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/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/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." +] From 4731d5022021dd22b4e58c72725755608cc6aee2 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:44:23 +0200 Subject: [PATCH 198/739] Add break utility for long nowrap items (e.g. code) --- website/assets/css/_base/_utilities.sass | 4 ++++ website/docs/api/doc.jade | 6 +++--- website/docs/api/lexeme.jade | 2 +- website/docs/api/span.jade | 4 ++-- website/docs/api/token.jade | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass index 2c40858a8..46c3e84d9 100644 --- a/website/assets/css/_base/_utilities.sass +++ b/website/assets/css/_base/_utilities.sass @@ -112,6 +112,10 @@ .u-nowrap white-space: nowrap +.u-break.u-break + word-wrap: break-word + white-space: initial + .u-no-border border: none diff --git a/website/docs/api/doc.jade b/website/docs/api/doc.jade index 929985144..212f823ba 100644 --- a/website/docs/api/doc.jade +++ b/website/docs/api/doc.jade @@ -216,7 +216,7 @@ p +footrow +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,7 +245,7 @@ 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 @@ -509,7 +509,7 @@ p +table(["Name", "Type", "Description"]) +footrow +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 diff --git a/website/docs/api/lexeme.jade b/website/docs/api/lexeme.jade index a0487be9b..6e3f68493 100644 --- a/website/docs/api/lexeme.jade +++ b/website/docs/api/lexeme.jade @@ -129,7 +129,7 @@ p A real-valued meaning representation. +table(["Name", "Type", "Description"]) +footrow +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 diff --git a/website/docs/api/span.jade b/website/docs/api/span.jade index 542336714..5b480b280 100644 --- a/website/docs/api/span.jade +++ b/website/docs/api/span.jade @@ -37,7 +37,7 @@ 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 @@ -270,7 +270,7 @@ p +table(["Name", "Type", "Description"]) +footrow +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 diff --git a/website/docs/api/token.jade b/website/docs/api/token.jade index 87387e09d..db445d09b 100644 --- a/website/docs/api/token.jade +++ b/website/docs/api/token.jade @@ -250,7 +250,7 @@ p A real-valued meaning representation. +table(["Name", "Type", "Description"]) +footrow +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 From 6a37c93311ca4dd446eb36dc6ca4fec6a8f4922e Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:44:33 +0200 Subject: [PATCH 199/739] Update argument type --- website/docs/api/doc.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/api/doc.jade b/website/docs/api/doc.jade index 212f823ba..5c065e775 100644 --- a/website/docs/api/doc.jade +++ b/website/docs/api/doc.jade @@ -211,7 +211,7 @@ p +table(["Name", "Type", "Description"]) +row +cell #[code attr_ids] - +cell ints + +cell list +cell A list of attribute ID ints. +footrow From d53cbf369fff63d20861eee003f671f4a9b013fc Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:44:50 +0200 Subject: [PATCH 200/739] Document as_tuples kwarg on Language.pipe() --- website/docs/api/language.jade | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/website/docs/api/language.jade b/website/docs/api/language.jade index 9c26f506c..69665ee9d 100644 --- a/website/docs/api/language.jade +++ b/website/docs/api/language.jade @@ -111,6 +111,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 From 404d3067b89a71145b85af37f4f0233eb9cc5689 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:45:00 +0200 Subject: [PATCH 201/739] Document new Doc.char_span() method --- website/docs/api/doc.jade | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/website/docs/api/doc.jade b/website/docs/api/doc.jade index 5c065e775..fcba091b8 100644 --- a/website/docs/api/doc.jade +++ b/website/docs/api/doc.jade @@ -140,6 +140,44 @@ p Get the number of tokens in the document. +cell int +cell The number of tokens in the document. ++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') + label = doc.vocab.strings['GPE'] + span = doc.char_span(7, 15, label=label) + 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 + +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. + + +footrow + +cell returns + +cell #[code Span] + +cell The newly constructed object. + +h(2, "similarity") Doc.similarity +tag method +tag-model("vectors") From 471eed4126f21830b01a8f8c1554602a9b3c77af Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:45:16 +0200 Subject: [PATCH 202/739] Add example to Span.merge() --- website/docs/api/span.jade | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/website/docs/api/span.jade b/website/docs/api/span.jade index 5b480b280..f15958e1c 100644 --- a/website/docs/api/span.jade +++ b/website/docs/api/span.jade @@ -150,6 +150,13 @@ p 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] From 5cb0200e63c8bfd9454f5a6548e06464452f2a5f Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 12:45:28 +0200 Subject: [PATCH 203/739] Document new Span.to_array() method --- website/docs/api/span.jade | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/website/docs/api/span.jade b/website/docs/api/span.jade index f15958e1c..2ca2d3ea9 100644 --- a/website/docs/api/span.jade +++ b/website/docs/api/span.jade @@ -145,6 +145,35 @@ p +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. + + +footrow + +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 From ab28f911b457fdd3479fa2091bea44ec7d42ddc5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 09:02:57 -0500 Subject: [PATCH 204/739] Fix parser learning rates --- spacy/syntax/nn_parser.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 3e5566705..7412ebeee 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -524,6 +524,7 @@ cdef class Parser: scores, bp_scores = vec2scores.begin_update(vector, drop=drop) d_scores = self.get_batch_loss(states, golds, scores) + d_scores /= len(docs) d_vector = bp_scores(d_scores, sgd=sgd) if drop != 0: d_vector *= mask @@ -582,7 +583,9 @@ cdef class Parser: width, density, sgd=sgd, 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] From 8b7ac77c233dc1693fd6e21abd66af5330e6a34b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 16:18:09 +0200 Subject: [PATCH 205/739] Allow span label to be string in Doc.char_span --- spacy/tokens/doc.pyx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index 75088b010..dd52c4cbf 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -238,16 +238,18 @@ cdef class Doc: def doc(self): return self - def char_span(self, int start_idx, int end_idx, attr_t label=0, vector=None): + 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): A label to attach to the Span, e.g. for named entities. + 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 From c606b4a42c9f87caea01d8d4308924f00d3c5d10 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 16:18:23 +0200 Subject: [PATCH 206/739] Add test for Doc.char_span --- spacy/tests/spans/test_span.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py index d22fa52ae..fecfe0da8 100644 --- a/spacy/tests/spans/test_span.py +++ b/spacy/tests/spans/test_span.py @@ -89,3 +89,10 @@ 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' From dea229c634ea029a1582725ba57c66b93e62af44 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 16:24:28 +0200 Subject: [PATCH 207/739] Fix Span.to_array method --- spacy/tokens/span.pyx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx index 9625b5547..7e29cccf4 100644 --- a/spacy/tokens/span.pyx +++ b/spacy/tokens/span.pyx @@ -151,10 +151,11 @@ cdef class Span: # 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) - output = numpy.ndarray(shape=(self.length, len(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, j] = get_token_attr(&self.doc.c[i], feature) + output[i-self.start, j] = get_token_attr(&self.doc.c[i], feature) return output cpdef int _recalculate_indices(self) except -1: From 4fda02c7e602df778e0648fcb86c9e2c8224e64d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 16:24:38 +0200 Subject: [PATCH 208/739] Add test for new Span.to_array method --- spacy/tests/spans/test_span.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py index fecfe0da8..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 @@ -96,3 +97,12 @@ def test_spans_by_character(doc): 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]) + From 1261b01e46288a5240915133831440978d5f8d60 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 16:34:32 +0200 Subject: [PATCH 209/739] Update Doc.char_span docs --- website/docs/api/doc.jade | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/website/docs/api/doc.jade b/website/docs/api/doc.jade index fcba091b8..7fbbcce97 100644 --- a/website/docs/api/doc.jade +++ b/website/docs/api/doc.jade @@ -148,8 +148,7 @@ p Create a #[code Span] object from the slice #[code doc.text[start : end]]. +aside-code("Example"). doc = nlp(u'I like New York') - label = doc.vocab.strings['GPE'] - span = doc.char_span(7, 15, label=label) + span = doc.char_span(7, 15, label=u'GPE') assert span.text == 'New York' +table(["Name", "Type", "Description"]) @@ -165,7 +164,7 @@ p Create a #[code Span] object from the slice #[code doc.text[start : end]]. +row +cell #[code label] - +cell uint64 + +cell uint64 / unicode +cell A label to attach to the Span, e.g. for named entities. +row From d55d6e1cfab6d0380255f7ffb3d7b6791f536054 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 16:39:32 +0200 Subject: [PATCH 210/739] Fix comparison of Token from different docs. Closes #1257 --- spacy/tests/regression/test_issue1257.py | 12 ++++++++++++ spacy/tokens/token.pyx | 12 ++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 spacy/tests/regression/test_issue1257.py 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/tokens/token.pyx b/spacy/tokens/token.pyx index 5b8c276d8..7b11d6efa 100644 --- a/spacy/tokens/token.pyx +++ b/spacy/tokens/token.pyx @@ -62,18 +62,26 @@ 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: From 3d049af56317b98654bbb0440cfc01c8bb18f5c5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 18:42:11 +0200 Subject: [PATCH 211/739] Improve vectors to/from disk --- spacy/vectors.pyx | 117 ++++++++++++---------------------------------- 1 file changed, 31 insertions(+), 86 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 1b1e8000a..ac748292c 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -21,6 +21,7 @@ cdef class Vectors: cdef public object data cdef readonly StringStore strings cdef public object key2row + cdef public object keys def __init__(self, strings, data_or_width): self.strings = StringStore() @@ -31,8 +32,11 @@ cdef class Vectors: data = data_or_width self.data = data self.key2row = {} + self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') for i, string in enumerate(strings): - self.key2row[self.strings.add(string)] = i + key = self.strings.add(string) + self.key2row[key] = i + self.keys[i] = key def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -70,23 +74,30 @@ cdef class Vectors: raise NotImplementedError def to_disk(self, path, **exclude): - def serialize_vectors(p): - write_vectors_to_bin_loc(self.strings, self.key2row, self.data, str(p)) - serializers = OrderedDict(( - ('vec.bin', serialize_vectors), + ('vectors', lambda p: numpy.save(p.open('wb'), self.data)), + ('strings.json', self.strings.to_disk), + ('keys', lambda p: numpy.save(p.open('wb'), self.keys)), )) - return util.to_disk(serializers, exclude) + return util.to_disk(path, serializers, exclude) def from_disk(self, path, **exclude): - def deserialize_vectors(p): - values = load_vectors_from_bin_loc(self.strings, str(p)) - self.key2row, self.data = values + def load_keys(path): + self.keys = numpy.load(path) + for i, key in enumerate(self.keys): + self.keys[i] = key + self.key2row[key] = i + + def load_vectors(path): + self.data = numpy.load(path) serializers = OrderedDict(( - ('vec.bin', deserialize_vectors), + ('keys', load_keys), + ('vectors', load_vectors), + ('strings.json', self.strings.from_disk), )) - return util.from_disk(path, serializers, exclude) + util.from_disk(path, serializers, exclude) + return self def to_bytes(self, **exclude): def serialize_weights(): @@ -94,9 +105,8 @@ cdef class Vectors: return self.data.to_bytes() else: return msgpack.dumps(self.data) - b = msgpack.dumps(self.key2row) serializers = OrderedDict(( - ('key2row', lambda: msgpack.dumps(self.key2row)), + ('keys', lambda: msgpack.dumps(self.keys)), ('strings', lambda: self.strings.to_bytes()), ('vectors', serialize_weights) )) @@ -109,80 +119,15 @@ cdef class Vectors: else: self.data = msgpack.loads(b) + def load_keys(keys): + for i, key in enumerate(keys): + self.keys[i] = key + self.key2row[key] = i + deserializers = OrderedDict(( - ('key2row', lambda b: self.key2row.update(msgpack.loads(b))), + ('keys', lambda b: load_keys(msgpack.loads(b))), ('strings', lambda b: self.strings.from_bytes(b)), ('vectors', deserialize_weights) )) - return util.from_bytes(deserializers, exclude) - - -def write_vectors_to_bin_loc(StringStore strings, dict key2i, - np.ndarray vectors, out_loc): - - cdef int32_t vec_len = vectors.shape[1] - cdef int32_t word_len - cdef bytes word_str - cdef char* chars - cdef uint64_t key - cdef int32_t i - cdef float* vec - - cdef CFile out_file = CFile(out_loc, 'wb') - keys = [(i, key) for (key, i) in key2i.item()] - keys.sort() - for i, key in keys: - vec = vectors.data[i * vec_len] - word_str = strings[key].encode('utf8') - word_len = len(word_str) - - out_file.write_from(&word_len, 1, sizeof(word_len)) - out_file.write_from(&vec_len, 1, sizeof(vec_len)) - - chars = word_str - out_file.write_from(chars, word_len, sizeof(char)) - out_file.write_from(vec, vec_len, sizeof(float)) - out_file.close() - - -def load_vectors_from_bin_loc(StringStore strings, loc): - """ - Load vectors from the location of a binary file. - Arguments: - loc (unicode): The path of the binary file to load from. - Returns: - vec_len (int): The length of the vectors loaded. - """ - cdef CFile file_ = CFile(loc, b'rb') - cdef int32_t word_len - cdef int32_t vec_len = 0 - cdef int32_t prev_vec_len = 0 - cdef float* vec - cdef attr_t string_id - cdef bytes py_word - cdef vector[float*] vectors - cdef int line_num = 0 - cdef Pool mem = Pool() - cdef dict key2i = {} - while True: - try: - file_.read_into(&word_len, sizeof(word_len), 1) - except IOError: - break - file_.read_into(&vec_len, sizeof(vec_len), 1) - if prev_vec_len != 0 and vec_len != prev_vec_len: - raise Exception("Mismatched vector sizes") - if 0 >= vec_len >= MAX_VEC_SIZE: - raise Exception("Mismatched vector sizes") - - chars = file_.alloc_read(mem, word_len, sizeof(char)) - vec = file_.alloc_read(mem, vec_len, sizeof(float)) - - key = strings.add(chars[:word_len]) - key2i[key] = vectors.size() - vectors.push_back(vec) - numpy_vectors = numpy.zeros((vectors.size(), vec_len), dtype='f') - for i in range(vectors.size()): - for j in range(vec_len): - numpy_vectors[i, j] = vectors[i][j] - return key2i, numpy_vectors + util.from_bytes(deserializers, exclude) + return self From 49a615e7d9e37c5de208f516929733a5bb7cfaed Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 18:50:16 +0200 Subject: [PATCH 212/739] Create Vectors object in Vocab --- spacy/vocab.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 5909872d6..055f2ef24 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -22,6 +22,7 @@ from .structs cimport SerializedLexemeC from .compat import copy_reg, pickle from .lemmatizer import Lemmatizer from .attrs import intify_attrs +from .vectors import Vectors from . import util from . import attrs from . import symbols @@ -63,6 +64,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, 300) property lang: def __get__(self): From 93fb8b64e9516d64e6a762af5ccf715582b8c1c5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 19:52:25 +0200 Subject: [PATCH 213/739] Fix vector loading --- spacy/vectors.pyx | 26 ++++++++++++++++++-------- spacy/vocab.pyx | 16 +++++++++++----- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index ac748292c..e569b46e7 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -4,16 +4,12 @@ from collections import OrderedDict import msgpack import msgpack_numpy msgpack_numpy.patch() -from cymem.cymem cimport Pool cimport numpy as np -from libcpp.vector cimport vector from .typedefs cimport attr_t from .strings cimport StringStore from . import util -from ._cfile cimport CFile - -MAX_VEC_SIZE = 10000 +from .compat import basestring_ cdef class Vectors: @@ -60,7 +56,21 @@ cdef class Vectors: yield from self.data def __len__(self): - return len(self.strings) + # TODO: Fix the quadratic behaviour here! + return max(self.key2row.values()) + + def __contains__(self, key): + if isinstance(key, basestring_): + key = self.strings[key] + return key in self.key2row + + def add_key(self, string, vector=None): + key = self.strings.add(string) + next_i = len(self) + 1 + self.keys[next_i] = key + self.key2row[key] = next_i + if vector is not None: + self.data[next_i] = vector def items(self): for i, string in enumerate(self.strings): @@ -75,9 +85,9 @@ cdef class Vectors: def to_disk(self, path, **exclude): serializers = OrderedDict(( - ('vectors', lambda p: numpy.save(p.open('wb'), self.data)), + ('vectors', lambda p: numpy.save(p.open('wb'), self.data, allow_pickle=False)), ('strings.json', self.strings.to_disk), - ('keys', lambda p: numpy.save(p.open('wb'), self.keys)), + ('keys', lambda p: numpy.save(p.open('wb'), self.keys, allow_pickle=False)), )) return util.to_disk(path, serializers, exclude) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 055f2ef24..1fc3f5e39 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -19,7 +19,7 @@ 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 @@ -244,7 +244,7 @@ cdef class Vocab: @property def vectors_length(self): - raise NotImplementedError + return len(self.vectors) def clear_vectors(self): """Drop the current vector table. Because all vectors must be the same @@ -264,7 +264,9 @@ cdef class Vocab: RAISES: If no vectors data is loaded, ValueError is raised. """ - raise NotImplementedError + if isinstance(orth, basestring_): + orth = self.strings.add(orth) + return self.vectors[orth] def set_vector(self, orth, vector): """Set a vector for a word in the vocabulary. @@ -274,13 +276,17 @@ cdef class Vocab: RETURNS: None """ - raise NotImplementedError + if not isinstance(orth, basestring_): + orth = self.strings[orth] + self.vectors.add_key(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, **exclude): """Save the current state to a directory. From 8cfeeb48842dc2f995d57849ab703a2b38faf73a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 19:52:58 +0200 Subject: [PATCH 214/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 9f62c769e..d494f8d31 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a9' +__version__ = '2.0.0a10' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 1391f9da3717a9b3e8d3a3b8b419370b361d751b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 20:34:58 +0200 Subject: [PATCH 215/739] Restore vectors tests --- spacy/tests/vectors/test_similarity.py | 9 +- spacy/tests/vectors/test_vectors.py | 248 +++++++++++++------------ 2 files changed, 128 insertions(+), 129 deletions(-) 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..0e4464d93 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,11 +13,27 @@ 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 @@ -42,125 +60,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 From ef875627411c5b2f6ad099a5451afd96e193482f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 20:35:16 +0200 Subject: [PATCH 216/739] Restore vectors test utils --- spacy/tests/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From 1157294434d7978141c4c8be87cca905fbfc18d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 20:35:33 +0200 Subject: [PATCH 217/739] Improve vector handling --- spacy/vectors.pyx | 34 +++++++++++++++++++++------------- spacy/vocab.pyx | 8 +++++--- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index e569b46e7..b6ddf0818 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -18,6 +18,7 @@ cdef class Vectors: cdef readonly StringStore strings cdef public object key2row cdef public object keys + cdef public int i def __init__(self, strings, data_or_width): self.strings = StringStore() @@ -26,13 +27,12 @@ cdef class Vectors: dtype='f') else: data = data_or_width + self.i = 0 self.data = data self.key2row = {} self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') - for i, string in enumerate(strings): - key = self.strings.add(string) - self.key2row[key] = i - self.keys[i] = key + for string in strings: + self.add_key(string) def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -56,21 +56,29 @@ cdef class Vectors: yield from self.data def __len__(self): - # TODO: Fix the quadratic behaviour here! - return max(self.key2row.values()) + return self.i def __contains__(self, key): if isinstance(key, basestring_): key = self.strings[key] return key in self.key2row - def add_key(self, string, vector=None): - key = self.strings.add(string) - next_i = len(self) + 1 - self.keys[next_i] = key - self.key2row[key] = next_i + def add(self, key, vector=None): + 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[next_i] = vector + self.data[i] = vector + return i def items(self): for i, string in enumerate(self.strings): @@ -139,5 +147,5 @@ cdef class Vectors: ('strings', lambda b: self.strings.from_bytes(b)), ('vectors', deserialize_weights) )) - util.from_bytes(deserializers, exclude) + util.from_bytes(data, deserializers, exclude) return self diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 1fc3f5e39..1c992b56c 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -246,11 +246,13 @@ cdef class Vocab: def vectors_length(self): return len(self.vectors) - 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. @@ -278,7 +280,7 @@ cdef class Vocab: """ if not isinstance(orth, basestring_): orth = self.strings[orth] - self.vectors.add_key(orth, vector=vector) + self.vectors.add(orth, vector=vector) def has_vector(self, orth): """Check whether a word has a vector. Returns False if no From 6a9464837381f2aad57e57b319acf27509174c79 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 21:27:35 +0200 Subject: [PATCH 218/739] Fix serialization --- spacy/vectors.pyx | 8 +++----- spacy/vocab.pyx | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index b6ddf0818..ae45f99b3 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -1,3 +1,4 @@ +from __future__ import unicode_literals from libc.stdint cimport int32_t, uint64_t import numpy from collections import OrderedDict @@ -32,7 +33,7 @@ cdef class Vectors: self.key2row = {} self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') for string in strings: - self.add_key(string) + self.add(string) def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -94,7 +95,6 @@ cdef class Vectors: def to_disk(self, path, **exclude): serializers = OrderedDict(( ('vectors', lambda p: numpy.save(p.open('wb'), self.data, allow_pickle=False)), - ('strings.json', self.strings.to_disk), ('keys', lambda p: numpy.save(p.open('wb'), self.keys, allow_pickle=False)), )) return util.to_disk(path, serializers, exclude) @@ -112,7 +112,6 @@ cdef class Vectors: serializers = OrderedDict(( ('keys', load_keys), ('vectors', load_vectors), - ('strings.json', self.strings.from_disk), )) util.from_disk(path, serializers, exclude) return self @@ -125,7 +124,6 @@ cdef class Vectors: return msgpack.dumps(self.data) serializers = OrderedDict(( ('keys', lambda: msgpack.dumps(self.keys)), - ('strings', lambda: self.strings.to_bytes()), ('vectors', serialize_weights) )) return util.to_bytes(serializers, exclude) @@ -138,13 +136,13 @@ cdef class Vectors: 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(( ('keys', lambda b: load_keys(msgpack.loads(b))), - ('strings', lambda b: self.strings.from_bytes(b)), ('vectors', deserialize_weights) )) util.from_bytes(data, deserializers, exclude) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 1c992b56c..dc141552d 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -303,7 +303,7 @@ cdef class Vocab: 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, exclude='strings.json') + self.vectors.to_disk(path) def from_disk(self, path, **exclude): """Loads state from a directory. Modifies the object in place and @@ -318,7 +318,7 @@ cdef class Vocab: 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='string.json') + self.vectors.from_disk(path, exclude='strings.json') return self def to_bytes(self, **exclude): @@ -331,7 +331,7 @@ cdef class Vocab: if self.vectors is None: return None else: - return self.vectors.to_bytes(exclude='strings') + return self.vectors.to_bytes(exclude='strings.json') getters = OrderedDict(( ('strings', lambda: self.strings.to_bytes()), From e5344b83a3da70f07b5402664fe9c297750e27f4 Mon Sep 17 00:00:00 2001 From: Gyorgy Orosz Date: Sat, 19 Aug 2017 21:45:23 +0200 Subject: [PATCH 219/739] Ported model cli from v1 --- spacy/__main__.py | 20 ++++--- spacy/cli/__init__.py | 1 + spacy/cli/model.py | 119 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 spacy/cli/model.py diff --git a/spacy/__main__.py b/spacy/__main__.py index 214a7b617..2b15e4374 100644 --- a/spacy/__main__.py +++ b/spacy/__main__.py @@ -3,15 +3,21 @@ 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.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, + 'convert': convert, + 'package': package, + 'model': model + } if len(sys.argv) == 1: prints(', '.join(commands), title="Available commands", exits=1) command = sys.argv.pop(1) @@ -19,5 +25,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/cli/__init__.py b/spacy/cli/__init__.py index 2b4f98a88..480b27a23 100644 --- a/spacy/cli/__init__.py +++ b/spacy/cli/__init__.py @@ -4,3 +4,4 @@ from .link import link from .package import package from .train import train from .convert import convert +from .model import model diff --git a/spacy/cli/model.py b/spacy/cli/model.py new file mode 100644 index 000000000..5c3b0cb80 --- /dev/null +++ b/spacy/cli/model.py @@ -0,0 +1,119 @@ +# coding: utf8 +from __future__ import unicode_literals + +import gzip +import math +from ast import literal_eval +from pathlib import Path +from preshed.counter import PreshCounter + +import spacy +from ..compat import fix_text +from .. import util + + +def model(cmd, lang, model_dir, freqs_data, clusters_data, vectors_data): + 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) + clusters = read_clusters(clusters_path) if clusters_path else {} + populate_vocab(vocab, clusters, probs, oov_prob) + create_model(model_path, nlp) + + +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") From a3c51a035520987e0d78d008c85ddea4ffba346e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 21:58:57 +0200 Subject: [PATCH 220/739] Fix creation of pipeline --- spacy/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index aa757ffa8..ed880d9ca 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -95,7 +95,7 @@ class BaseDefaults(object): meta = nlp.meta if nlp is not None else {} # Resolve strings, like "cnn", "lstm", etc pipeline = [] - for entry in cls.pipeline: + for entry in meta.get('pipeline', []): if entry in disable or getattr(entry, 'name', entry) in disable: continue factory = cls.Defaults.factories[entry] From b8e1603cc44cf2f1fc0b2f6384e547c95d9d68fa Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 22:07:00 +0200 Subject: [PATCH 221/739] Fix load fail for missing vectors --- spacy/vectors.pyx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index ae45f99b3..72e30bd2f 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -32,8 +32,6 @@ cdef class Vectors: self.data = data self.key2row = {} self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') - for string in strings: - self.add(string) def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -101,13 +99,15 @@ cdef class Vectors: def from_disk(self, path, **exclude): def load_keys(path): - self.keys = numpy.load(path) - for i, key in enumerate(self.keys): - self.keys[i] = key - self.key2row[key] = i + 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): - self.data = numpy.load(path) + if path.exists(): + self.data = numpy.load(path) serializers = OrderedDict(( ('keys', load_keys), From 41c2218c534a6c19be2bf263a4b89588039fa48b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 22:09:12 +0200 Subject: [PATCH 222/739] Fix test for vectors --- spacy/tests/vectors/test_vectors.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spacy/tests/vectors/test_vectors.py b/spacy/tests/vectors/test_vectors.py index 0e4464d93..798871edd 100644 --- a/spacy/tests/vectors/test_vectors.py +++ b/spacy/tests/vectors/test_vectors.py @@ -40,11 +40,15 @@ def test_init_vectors_with_data(strings, data): 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]) @@ -53,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] From 2d126a00aebbbe224ee3721aac6117f598fc339f Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 22:32:07 +0200 Subject: [PATCH 223/739] Fix typo --- spacy/compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/compat.py b/spacy/compat.py index 7e69f3a61..3ed777154 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -109,7 +109,7 @@ def import_file(name, loc): if is_python2: return imp.load_source(name, loc) else: - spec = importlib.util.spec_from_file_location(name, str(init_file)) + spec = importlib.util.spec_from_file_location(name, str(loc)) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module From 281e7e58b30efe66dee888d3b3a1791309c60396 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 19 Aug 2017 22:32:16 +0200 Subject: [PATCH 224/739] Don't escape forward slashes on ujson.dumps --- spacy/compat.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/compat.py b/spacy/compat.py index 3ed777154..e6b7c066b 100644 --- a/spacy/compat.py +++ b/spacy/compat.py @@ -51,7 +51,7 @@ if is_python2: 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: @@ -60,7 +60,7 @@ elif is_python3: 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) From aefef6fd282a93e39f949248345d39432bbfe4d1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 19 Aug 2017 22:42:17 +0200 Subject: [PATCH 225/739] Prevent strings from being lost during from_disk and from_bytes --- spacy/strings.pyx | 6 ++++++ 1 file changed, 6 insertions(+) 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): From fdf802d505f8cbb9b5148debcc78f08d7e22489b Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 20 Aug 2017 11:57:10 +0700 Subject: [PATCH 226/739] added examples --- spacy/lang/id/examples.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 spacy/lang/id/examples.py 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?" +] From 7193c47f0bd9f6ef0984b01496d72279263e9231 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 20 Aug 2017 11:57:52 +0700 Subject: [PATCH 227/739] direct lookup --- spacy/lang/id/lemmatizer.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/spacy/lang/id/lemmatizer.py b/spacy/lang/id/lemmatizer.py index ae13a53ad..387037e48 100644 --- a/spacy/lang/id/lemmatizer.py +++ b/spacy/lang/id/lemmatizer.py @@ -1,7 +1,7 @@ # coding: utf8 from __future__ import unicode_literals -ID_BASE_LEMMA = { +LOOKUP = { 'berabad-abad': 'abad', 'keabadian': 'abadi', 'keabadiannya': 'abadi', @@ -27878,7 +27878,6 @@ ID_BASE_LEMMA = { 'redam-redam': 'redam', 'bermerek': 'merek', 'bermereknya': 'merek', - 'mereka': 'reka', 'merekanya': 'reka', 'merekalah': 'reka', 'merekakan': 'reka', @@ -36882,6 +36881,3 @@ ID_BASE_LEMMA = { 'berzikiri': 'zikir', 'perzonaan': 'zona' } - -LOOKUP = {} -LOOKUP.update(ID_BASE_LEMMA) \ No newline at end of file From b7d83f37c8e7e1e22c10f157655f6ae3ac465b0e Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 20 Aug 2017 12:16:50 +0700 Subject: [PATCH 228/739] indonesian abbr. --- spacy/lang/id/tokenizer_exceptions.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 3990a15e1..3bbb4b385 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -30,6 +30,23 @@ for orth in ID_BASE_EXCEPTIONS: _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}] + + _hyphen_prefix = """abdur abdus abou aboul abror abshar abu abubakar abul aero agri agro ahmadi ahmed air abd abdel abdul ad adz afro al ala ali all amir an antar anti ar as ash asy at ath az bekas ber best bi co di double From 713d7c0aa0cc4524f29361a03d6edb26b9936d07 Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 20 Aug 2017 12:17:14 +0700 Subject: [PATCH 229/739] added indonesian lang test --- spacy/tests/conftest.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index 200f9ff4f..e0e999f4c 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -11,8 +11,8 @@ from ..strings import StringStore from .. import util -_languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'it', 'nb', - 'nl', 'pl', 'pt', 'sv', 'xx'] +_languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id', + 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx'] _models = {'en': ['en_depent_web_sm', 'en_core_web_md'], 'de': ['de_core_news_md'], 'fr': ['fr_depvec_web_lg'], @@ -86,6 +86,9 @@ def hu_tokenizer(): 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(): From fbc62a09c7e1ef8a085d526b0f7100ab77ec85bc Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 20 Aug 2017 13:43:00 +0700 Subject: [PATCH 230/739] added {pre,suf,in}fix tests --- .../tests/lang/id/test_prefix_suffix_infix.py | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 spacy/tests/lang/id/test_prefix_suffix_infix.py 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 == "." From f77443ab68d79103ab69fe29d22eaf38b2c3858c Mon Sep 17 00:00:00 2001 From: Jim Geovedi Date: Sun, 20 Aug 2017 13:43:21 +0700 Subject: [PATCH 231/739] reworked --- spacy/lang/id/__init__.py | 3 +-- spacy/lang/id/tokenizer_exceptions.py | 22 +--------------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py index a65a5b24f..e0cfa941d 100644 --- a/spacy/lang/id/__init__.py +++ b/spacy/lang/id/__init__.py @@ -3,7 +3,7 @@ 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, TOKEN_MATCH +from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .norm_exceptions import NORM_EXCEPTIONS from .lemmatizer import LOOKUP from .lex_attrs import LEX_ATTRS @@ -24,7 +24,6 @@ class IndonesianDefaults(Language.Defaults): tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) stop_words = set(STOP_WORDS) - token_match = TOKEN_MATCH prefixes = tuple(TOKENIZER_PREFIXES) suffixes = tuple(TOKENIZER_SUFFIXES) infixes = tuple(TOKENIZER_INFIXES) diff --git a/spacy/lang/id/tokenizer_exceptions.py b/spacy/lang/id/tokenizer_exceptions.py index 3bbb4b385..9978606b0 100644 --- a/spacy/lang/id/tokenizer_exceptions.py +++ b/spacy/lang/id/tokenizer_exceptions.py @@ -46,25 +46,5 @@ for orth in [ ]: _exc[orth] = [{ORTH: orth}] - -_hyphen_prefix = """abdur abdus abou aboul abror abshar abu abubakar abul -aero agri agro ahmadi ahmed air abd abdel abdul ad adz afro al ala ali all -amir an antar anti ar as ash asy at ath az bekas ber best bi co di double -dual duo e eco eks el era ex full hi high i in inter intra ke kontra korona -kuartal lintas m macro makro me mem meng micro mid mikro mini multi neo nge -no non on pan pasca pe pem poli poly post pra pre pro re se self serba seri -sub super t trans u ultra un x""".split() - -_hyphen_infix = """ber-an berke-an de-isasi di-kan di-kannya di-nya ke-an -ke-annya me-kan me-kannya men-kan men-kannya meng-kannya pe-an pen-an -per-an per-i se-an se-nya ter-i ter-kan ter-kannya""".split() - -_hyphen_suffix = """el""" - -_regular_exp = ['^{p}-[A-Za-z0-9]+$'.format(p=prefix) for prefix in _hyphen_prefix] -_regular_exp += ['^{0}-[A-Za-z0-9]+-{1}$'.format(*infix.split('-')) for infix in _hyphen_infix] -_regular_exp += ['^[A-Za-z0-9]+-{s}$'.format(s=suffix) for suffix in _hyphen_suffix] -_regular_exp.append(URL_PATTERN) - TOKENIZER_EXCEPTIONS = dict(_exc) -TOKEN_MATCH = re.compile('|'.join('(?:{})'.format(m) for m in _regular_exp), re.IGNORECASE).match + From 3c33003078951cbff1ecc02d1c42eaad9e5ac570 Mon Sep 17 00:00:00 2001 From: ines Date: Sun, 20 Aug 2017 12:00:15 +0200 Subject: [PATCH 232/739] Port over typo corrections from #1245 --- README.rst | 2 +- website/docs/api/span.jade | 2 +- website/docs/usage/customizing-tokenizer.jade | 2 +- website/docs/usage/index.jade | 2 +- website/docs/usage/pos-tagging.jade | 2 +- website/docs/usage/production-use.jade | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) 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/website/docs/api/span.jade b/website/docs/api/span.jade index 2ca2d3ea9..72821ab04 100644 --- a/website/docs/api/span.jade +++ b/website/docs/api/span.jade @@ -205,7 +205,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.') diff --git a/website/docs/usage/customizing-tokenizer.jade b/website/docs/usage/customizing-tokenizer.jade index f56ce9fb1..7e0b4b479 100644 --- a/website/docs/usage/customizing-tokenizer.jade +++ b/website/docs/usage/customizing-tokenizer.jade @@ -39,7 +39,7 @@ p +h(2, "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. diff --git a/website/docs/usage/index.jade b/website/docs/usage/index.jade index 60bc3cd7b..a0aa1dca8 100644 --- a/website/docs/usage/index.jade +++ b/website/docs/usage/index.jade @@ -109,7 +109,7 @@ 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 + | 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 diff --git a/website/docs/usage/pos-tagging.jade b/website/docs/usage/pos-tagging.jade index dd72efeba..effc185e9 100644 --- a/website/docs/usage/pos-tagging.jade +++ b/website/docs/usage/pos-tagging.jade @@ -40,7 +40,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 diff --git a/website/docs/usage/production-use.jade b/website/docs/usage/production-use.jade index 70227e648..d4a1ffbc2 100644 --- a/website/docs/usage/production-use.jade +++ b/website/docs/usage/production-use.jade @@ -94,7 +94,7 @@ p | 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 + | process, this only adds an unnecessary layer of complexity. If you know | which models your application needs, you should be specifying them directly. p From 84b7ed49e48ca75ca1fea4e1c76218e0643e087c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 14:41:38 +0200 Subject: [PATCH 233/739] Ensure updates aren't made if no gold available --- spacy/gold.pyx | 4 ++-- spacy/syntax/ner.pyx | 2 +- spacy/syntax/nn_parser.pyx | 15 +++++++++++++++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/spacy/gold.pyx b/spacy/gold.pyx index 39951447c..096f265a9 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -406,11 +406,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): diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index d15de0181..2f5cd4e48 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -113,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 diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 7412ebeee..f1a0bc91c 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -483,6 +483,9 @@ cdef class Parser: return beams def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + docs_tokvecs, golds = self._filter_unlabelled(docs_tokvecs, golds) + if not golds: + return None if self.cfg.get('beam_width', 1) >= 2 and numpy.random.random() >= 0.5: return self.update_beam(docs_tokvecs, golds, self.cfg['beam_width'], self.cfg['beam_density'], @@ -555,6 +558,9 @@ cdef class Parser: def update_beam(self, docs_tokvecs, golds, width=None, density=None, drop=0., sgd=None, losses=None): + docs_tokvecs, golds = self._filter_unlabelled(docs_tokvecs, golds) + if not golds: + return None if width is None: width = self.cfg.get('beam_width', 2) if density is None: @@ -605,6 +611,15 @@ cdef class Parser: bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs + def _filter_unlabelled(self, docs_tokvecs, golds): + '''Remove inputs that have no relevant labels before update''' + has_golds = [self.moves.has_gold(gold) for gold in golds] + docs, tokvecs = docs_tokvecs + docs = [docs[i] for i, has_gold in enumerate(has_golds) if has_gold] + tokvecs = [tokvecs[i] for i, has_gold in enumerate(has_golds) if has_gold] + golds = [golds[i] for i, has_gold in enumerate(has_golds) if has_gold] + return (docs, tokvecs), golds + def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long doc will get multiple states. Let's say we have a doc of length 2*N, From 88755900818535527f2724d7286d2229a2e748d3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 14:42:07 +0200 Subject: [PATCH 234/739] Add optimizer in Language.update if sgd=None --- spacy/language.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index ed880d9ca..50ed0a166 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -200,6 +200,7 @@ class Language(object): else: flat_list.append(pipe) self.pipeline = flat_list + self._optimizer = None @property def meta(self): @@ -278,7 +279,7 @@ class Language(object): return self.tokenizer(text) def update(self, docs, golds, drop=0., sgd=None, losses=None, - update_tensors=False): + update_shared=False): """Update the models in the pipeline. docs (iterable): A batch of `Doc` objects. @@ -298,6 +299,10 @@ class Language(object): "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 tok2vec = self.pipeline[0] feats = tok2vec.doc2feats(docs) grads = {} @@ -312,12 +317,13 @@ class Language(object): continue d_tokvecses = proc.update((docs, tokvecses), golds, drop=drop, sgd=get_grads, losses=losses) - if update_tensors and d_tokvecses is not None: + if update_shared and d_tokvecses is not None: for i, d_tv in enumerate(d_tokvecses): all_d_tokvecses[i] += d_tv - bp_tokvecses(all_d_tokvecses, sgd=sgd) - for key, (W, dW) in grads.items(): - sgd(W, dW, key=key) + if update_shared and bp_tokvecses is not None: + bp_tokvecses(all_d_tokvecses, sgd=sgd) + 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. @@ -378,11 +384,11 @@ 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): scorer = Scorer() From c1d3ff517a6b532be8cc07fd5fd152daee0ddaff Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 14:42:23 +0200 Subject: [PATCH 235/739] Track loss in tagger --- spacy/pipeline.pyx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 634d3e4b5..8c3759778 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -294,6 +294,8 @@ class NeuralTagger(BaseThincComponent): doc.is_tagged = True def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + if losses is not None and self.name not in losses: + losses[self.name] = 0. docs, tokvecs = docs_tokvecs if self.model.nI is None: @@ -302,6 +304,8 @@ class NeuralTagger(BaseThincComponent): loss, d_tag_scores = self.get_loss(docs, golds, tag_scores) d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) + if losses is not None: + losses[self.name] += loss return d_tokvecs def get_loss(self, docs, golds, scores): From 84bb543e4df265cbce89d78d77b925324f117e31 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 11:07:00 -0500 Subject: [PATCH 236/739] Add gold_preproc flag to cli/train --- spacy/cli/train.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 04aac8319..a3dcf9ebc 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -32,10 +32,12 @@ from ..compat import json_dumps resume=("Whether to resume training", "flag", "R", bool), 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), ) 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): + use_gpu=-1, resume=False, no_tagger=False, no_parser=False, no_entities=False, + gold_preproc=False): """ Train a model. Expects data in spaCy's JSON format. """ @@ -86,7 +88,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, 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) + gold_preproc=gold_preproc, max_length=0) losses = {} for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) @@ -104,7 +106,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, scorer = nlp_loaded.evaluate( corpus.dev_docs( nlp_loaded, - gold_preproc=False)) + gold_preproc=gold_preproc)) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: file_.write(json_dumps(scorer.scores)) From 8a59718fd641cb1aa885842ad5e62f9fac1dad94 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 18:17:35 +0200 Subject: [PATCH 237/739] Fix fine-tuning --- spacy/_ml.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index b3b0d3e46..b385e2e53 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -359,8 +359,6 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.): def backward(d_output, sgd=None): return (tokens, d_output) return vectors, backward - - def fine_tune(embedding, combine=None): if combine is not None: raise NotImplementedError( @@ -372,22 +370,25 @@ def fine_tune(embedding, combine=None): vecs, bp_vecs = embedding.begin_update(docs, drop=drop) flat_tokvecs = embedding.ops.flatten(tokvecs) flat_vecs = embedding.ops.flatten(vecs) + alpha = model.mix + minus = 1-model.mix output = embedding.ops.unflatten( - (model.mix[0] * flat_vecs + model.mix[1] * flat_tokvecs), - lengths) + (alpha * flat_tokvecs + minus * flat_vecs), lengths) def fine_tune_bwd(d_output, sgd=None): - bp_vecs(d_output, sgd=sgd) flat_grad = model.ops.flatten(d_output) - model.d_mix[1] += flat_tokvecs.dot(flat_grad.T).sum() - model.d_mix[0] += flat_vecs.dot(flat_grad.T).sum() - if sgd is not None: - sgd(model._mem.weights, model._mem.gradient, key=model.id) + model.d_mix += flat_tokvecs.dot(flat_grad.T).sum() + model.d_mix += 1-flat_vecs.dot(flat_grad.T).sum() + + bp_vecs([d_o * minus for d_o in d_output], sgd=sgd) + d_output = [d_o * alpha for d_o in d_output] + sgd(model._mem.weights, model._mem.gradient, key=model.id) + model.mix = model.ops.xp.minimum(model.mix, 1.0) return d_output return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) - model.mix = model._mem.add((model.id, 'mix'), (2,)) - model.mix.fill(1.) + model.mix = model._mem.add((model.id, 'mix'), (1,)) + model.mix.fill(0.0) model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) return model From f2f92299647bab7d8d3cc29a5c37332729cd8135 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 18:19:06 +0200 Subject: [PATCH 238/739] Fix name of update_shared flag --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 04aac8319..449ccff68 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -92,7 +92,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, docs, golds = zip(*batch) nlp.update(docs, golds, sgd=optimizer, drop=next(dropout_rates), losses=losses, - update_tensors=True) + update_shared=True) pbar.update(sum(len(doc) for doc in docs)) with nlp.use_params(optimizer.averages): From 78a5f842e9cf9699791cc2707508e1ed81f0c18e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 15:58:34 -0500 Subject: [PATCH 239/739] Fix update when update_shared=False --- spacy/language.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 50ed0a166..66b42ff94 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -245,7 +245,7 @@ class Language(object): def matcher(self): return self.get_component('matcher') - def get_component(self, name): + def get_component(self, name): if self.pipeline in (True, None): return None for proc in self.pipeline: @@ -322,8 +322,8 @@ class Language(object): all_d_tokvecses[i] += d_tv if update_shared and bp_tokvecses is not None: bp_tokvecses(all_d_tokvecses, sgd=sgd) - for key, (W, dW) in grads.items(): - sgd(W, dW, key=key) + 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. From 62878e50dbdd2a3d566c5dc83d3ecd229536b653 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 15:59:28 -0500 Subject: [PATCH 240/739] Fix misalignment caued by filtering inputs at wrong point in parser --- spacy/syntax/nn_parser.pyx | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index f1a0bc91c..24e5841a5 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -483,8 +483,7 @@ cdef class Parser: return beams def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): - docs_tokvecs, golds = self._filter_unlabelled(docs_tokvecs, golds) - if not golds: + 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_tokvecs, golds, @@ -558,7 +557,8 @@ cdef class Parser: def update_beam(self, docs_tokvecs, golds, width=None, density=None, drop=0., sgd=None, losses=None): - docs_tokvecs, golds = self._filter_unlabelled(docs_tokvecs, golds) + if not any(self.moves.has_gold(gold) for gold in golds): + return None if not golds: return None if width is None: @@ -611,15 +611,6 @@ cdef class Parser: bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs - def _filter_unlabelled(self, docs_tokvecs, golds): - '''Remove inputs that have no relevant labels before update''' - has_golds = [self.moves.has_gold(gold) for gold in golds] - docs, tokvecs = docs_tokvecs - docs = [docs[i] for i, has_gold in enumerate(has_golds) if has_gold] - tokvecs = [tokvecs[i] for i, has_gold in enumerate(has_golds) if has_gold] - golds = [golds[i] for i, has_gold in enumerate(has_golds) if has_gold] - return (docs, tokvecs), golds - def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long doc will get multiple states. Let's say we have a doc of length 2*N, From c10f63bf1024fc4e0e636fae0c6e21118277fe30 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 20 Aug 2017 15:59:48 -0500 Subject: [PATCH 241/739] Initialize fine tuning to 0.5 --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index b385e2e53..15ffca9ad 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -388,7 +388,7 @@ def fine_tune(embedding, combine=None): return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) model.mix = model._mem.add((model.id, 'mix'), (1,)) - model.mix.fill(0.0) + model.mix.fill(0.5) model.d_mix = model._mem.add_gradient((model.id, 'd_mix'), (model.id, 'mix')) return model From b3576bfc869c24b68cab854f0ddf8cf7d1f867c3 Mon Sep 17 00:00:00 2001 From: Gyorgy Orosz Date: Sun, 20 Aug 2017 23:16:03 +0200 Subject: [PATCH 242/739] Added vector leading to model cli --- spacy/cli/model.py | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/spacy/cli/model.py b/spacy/cli/model.py index 5c3b0cb80..14e75647e 100644 --- a/spacy/cli/model.py +++ b/spacy/cli/model.py @@ -1,33 +1,51 @@ # 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 -import spacy -from ..compat import fix_text from .. import util +from ..compat import fix_text -def model(cmd, lang, model_dir, freqs_data, clusters_data, vectors_data): +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() + vocab = util.get_lang_class(lang).Defaults.create_vocab() nlp = spacy.blank(lang) vocab = nlp.vocab - probs, oov_prob = read_probs(freqs_path) + 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() From d15775c3ad266f23b79bca9242c89423e3b8ae50 Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 21 Aug 2017 13:40:09 +0200 Subject: [PATCH 243/739] Fix typos and commands in alpha docs --- spacy/glossary.py | 4 ++-- website/docs/api/_annotation/_pos-tags.jade | 4 ++-- website/docs/usage/models.jade | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) 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/website/docs/api/_annotation/_pos-tags.jade b/website/docs/api/_annotation/_pos-tags.jade index ea3a225bf..51db4f4e2 100644 --- a/website/docs/api/_annotation/_pos-tags.jade +++ b/website/docs/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/docs/usage/models.jade b/website/docs/usage/models.jade index bae80d2ad..7421e8aad 100644 --- a/website/docs/usage/models.jade +++ b/website/docs/usage/models.jade @@ -190,10 +190,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]. From 80acbc5f1f52c2026662bc5112b316e1e1c0bf56 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 21 Aug 2017 14:15:29 -0500 Subject: [PATCH 244/739] Fix fine-tune weight mixture --- spacy/_ml.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 15ffca9ad..5ab430684 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -370,24 +370,20 @@ def fine_tune(embedding, combine=None): vecs, bp_vecs = embedding.begin_update(docs, drop=drop) flat_tokvecs = embedding.ops.flatten(tokvecs) flat_vecs = embedding.ops.flatten(vecs) - alpha = model.mix - minus = 1-model.mix output = embedding.ops.unflatten( - (alpha * flat_tokvecs + minus * flat_vecs), lengths) + (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 += flat_tokvecs.dot(flat_grad.T).sum() - model.d_mix += 1-flat_vecs.dot(flat_grad.T).sum() + 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 * minus for d_o in d_output], sgd=sgd) - d_output = [d_o * alpha for d_o in d_output] + bp_vecs([d_o * model.mix[1] for d_o in d_output], sgd=sgd) sgd(model._mem.weights, model._mem.gradient, key=model.id) - model.mix = model.ops.xp.minimum(model.mix, 1.0) - return d_output + return [d_o * model.mix[0] for d_o in d_output] return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) - model.mix = model._mem.add((model.id, 'mix'), (1,)) + 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')) return model From a68dc891eac74eaa276ba7ac221b9be929716002 Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 21 Aug 2017 23:19:18 +0200 Subject: [PATCH 245/739] Port over changes from #1281 --- spacy/lang/en/tokenizer_exceptions.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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]: From 7be5f30f17bed017eb4ecdcbe2d451fc6fd86f4d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 21 Aug 2017 23:22:49 +0200 Subject: [PATCH 246/739] Add profile function --- spacy/cli/__init__.py | 1 + spacy/cli/profile.py | 45 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 spacy/cli/profile.py diff --git a/spacy/cli/__init__.py b/spacy/cli/__init__.py index 480b27a23..e58c94642 100644 --- a/spacy/cli/__init__.py +++ b/spacy/cli/__init__.py @@ -2,6 +2,7 @@ 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 .convert import convert from .model import model 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 From cec76801dc870ae3e1f8682e84126ee69a2a25a2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 21 Aug 2017 23:23:05 +0200 Subject: [PATCH 247/739] Add profile command to CLI --- spacy/__main__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/__main__.py b/spacy/__main__.py index 2b15e4374..d02242d68 100644 --- a/spacy/__main__.py +++ b/spacy/__main__.py @@ -7,6 +7,7 @@ if __name__ == '__main__': import plac import sys from spacy.cli import download, link, info, package, train, convert, model + from spacy.cli import profile from spacy.util import prints commands = { @@ -16,7 +17,8 @@ if __name__ == '__main__': 'train': train, 'convert': convert, 'package': package, - 'model': model + 'model': model, + 'profile': profile, } if len(sys.argv) == 1: prints(', '.join(commands), title="Available commands", exits=1) From a21d8f3f0b2b470ce1fd17df96429a2300b04018 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 21 Aug 2017 23:23:29 +0200 Subject: [PATCH 248/739] Add predict paths to _ml models --- spacy/_ml.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 5ab430684..e2e0d070b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -218,7 +218,10 @@ def drop_layer(layer, factor=2.): return layer.begin_update(X, drop=drop) else: return X, lambda dX, sgd=None: dX - return wrap(drop_layer_fwd, layer) + + model = wrap(drop_layer_fwd, layer) + model.predict = layer + return model def Tok2Vec(width, embed_size, preprocess=None): @@ -382,10 +385,18 @@ def fine_tune(embedding, combine=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 From 682346dd660601c538a9b689f2b7d4dadbf1ff12 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 21 Aug 2017 19:18:04 -0500 Subject: [PATCH 249/739] Restore optimized hidden_depth=0 for parser --- spacy/syntax/nn_parser.pxd | 4 +++ spacy/syntax/nn_parser.pyx | 68 ++++++++++++++++++++++++++++---------- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd index 7ff4b9f9f..524718965 100644 --- a/spacy/syntax/nn_parser.pxd +++ b/spacy/syntax/nn_parser.pxd @@ -14,4 +14,8 @@ cdef class Parser: cdef readonly TransitionSystem moves cdef readonly object cfg + cdef void _parse_step(self, StateC* state, + const float* feat_weights, + int nr_class, int nr_feat, int nr_piece) nogil + #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 24e5841a5..06a248767 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -257,10 +257,15 @@ cdef class Parser: nI=token_vector_width) with Model.use_device('cpu'): - upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) - ) + if depth == 0: + upper = chain() + upper.is_noop = True + else: + upper = chain( + clone(Maxout(hidden_width), (depth-1)), + zero_init(Affine(nr_class, 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))) @@ -412,20 +417,27 @@ cdef class Parser: cdef np.ndarray scores c_token_ids = token_ids.data c_is_valid = is_valid.data + cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): - for i in range(next_step.size()): - 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) - vectors = state2vec(token_ids[:next_step.size()]) - scores = vec2scores(vectors) - c_scores = scores.data - for i in range(next_step.size()): - 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) + if not has_hidden: + for i in cython.parallel.prange( + next_step.size(), 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()): + 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) + vectors = state2vec(token_ids[:next_step.size()]) + scores = vec2scores(vectors) + c_scores = scores.data + for i in range(next_step.size()): + 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) this_step, next_step = next_step, this_step next_step.clear() for st in this_step: @@ -482,6 +494,28 @@ cdef class Parser: 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)) + + state.set_context_tokens(token_ids, nr_feat) + sum_state_features(scores, + feat_weights, token_ids, 1, nr_feat, nr_class * nr_piece) + self.moves.set_valid(is_valid, state) + guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece) + action = self.moves.c[guess] + action.do(state, action.label) + + free(is_valid) + free(scores) + free(token_ids) + def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): if not any(self.moves.has_gold(gold) for gold in golds): return None From 18b64e79ecdb13ac37e9d0d62324668ca57bf644 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 21 Aug 2017 19:18:26 -0500 Subject: [PATCH 250/739] Fix fine tuning --- spacy/_ml.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 15ffca9ad..ebff377ca 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -236,7 +236,7 @@ def Tok2Vec(width, embed_size, preprocess=None): >> uniqued(embed, column=5) >> drop_layer( Residual( - (ExtractWindow(nW=1) >> BN(Maxout(width, width*3))) + (ExtractWindow(nW=1) >> ReLu(width, width*3)) ) ) ** 4, pad=4 ) @@ -370,24 +370,20 @@ def fine_tune(embedding, combine=None): vecs, bp_vecs = embedding.begin_update(docs, drop=drop) flat_tokvecs = embedding.ops.flatten(tokvecs) flat_vecs = embedding.ops.flatten(vecs) - alpha = model.mix - minus = 1-model.mix output = embedding.ops.unflatten( - (alpha * flat_tokvecs + minus * flat_vecs), lengths) + (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 += flat_tokvecs.dot(flat_grad.T).sum() - model.d_mix += 1-flat_vecs.dot(flat_grad.T).sum() + 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 * minus for d_o in d_output], sgd=sgd) - d_output = [d_o * alpha for d_o in d_output] + bp_vecs([d_o * model.mix[1] for d_o in d_output], sgd=sgd) sgd(model._mem.weights, model._mem.gradient, key=model.id) - model.mix = model.ops.xp.minimum(model.mix, 1.0) - return d_output + return [d_o * model.mix[0] for d_o in d_output] return output, fine_tune_bwd model = wrap(fine_tune_fwd, embedding) - model.mix = model._mem.add((model.id, 'mix'), (1,)) + 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')) return model From 5b329acbf2285bbba32249c187b5888e1fadf09c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 22 Aug 2017 19:00:27 +0200 Subject: [PATCH 251/739] Fix vectors_length property in vocab --- spacy/vocab.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index dc141552d..f65c81da1 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -244,7 +244,7 @@ cdef class Vocab: @property def vectors_length(self): - return len(self.vectors) + return self.vectors.data.shape[0] def clear_vectors(self, new_dim=None): """Drop the current vector table. Because all vectors must be the same From 83f8e9845087a0e61b54ffa08f82e5b66d5e74bb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 22 Aug 2017 19:46:35 +0200 Subject: [PATCH 252/739] Fix retrieval of OOV vectors --- spacy/vocab.pyx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index f65c81da1..bf7fb6903 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 @@ -244,7 +245,7 @@ cdef class Vocab: @property def vectors_length(self): - return self.vectors.data.shape[0] + return self.vectors.data.shape[1] def clear_vectors(self, new_dim=None): """Drop the current vector table. Because all vectors must be the same @@ -268,7 +269,10 @@ cdef class Vocab: """ if isinstance(orth, basestring_): orth = self.strings.add(orth) - return self.vectors[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. From 0551b7b03a2d725ea56aac589dcf8308e9c6903e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 22 Aug 2017 19:46:52 +0200 Subject: [PATCH 253/739] Fix doc.vector --- spacy/tokens/doc.pyx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index dd52c4cbf..b9941b50b 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -304,7 +304,10 @@ cdef class Doc: 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) + 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) From 03b5b9727a5733869a7e604ab9fbb3b3b400f35b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 22 Aug 2017 19:52:19 +0200 Subject: [PATCH 254/739] Fix Doc.vector for empty doc objects --- spacy/tokens/doc.pyx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index b9941b50b..3b1f38b68 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -303,7 +303,10 @@ 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): + 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) From a4633fff6fd7f5c84b41c24178c5d8b22aa09724 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 22 Aug 2017 17:01:58 -0500 Subject: [PATCH 255/739] Restore use of batch norm in model --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index ebff377ca..5ab430684 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -236,7 +236,7 @@ def Tok2Vec(width, embed_size, preprocess=None): >> uniqued(embed, column=5) >> drop_layer( Residual( - (ExtractWindow(nW=1) >> ReLu(width, width*3)) + (ExtractWindow(nW=1) >> BN(Maxout(width, width*3))) ) ) ** 4, pad=4 ) From 1c5c256e5882d58b53050eb8f1ba1f3741c3c955 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 23 Aug 2017 10:51:33 +0200 Subject: [PATCH 256/739] Fix fine_tune when optimizer is None --- spacy/_ml.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index e2e0d070b..ee2d0835c 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -382,7 +382,8 @@ def fine_tune(embedding, combine=None): 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) - sgd(model._mem.weights, model._mem.gradient, key=model.id) + 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 From bb2541ffd3880fa9c34a00918230d07fab0115ab Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 23 Aug 2017 12:11:52 +0200 Subject: [PATCH 257/739] Fix PROB attr for OOV words --- spacy/lang/lex_attrs.py | 1 + 1 file changed, 1 insertion(+) 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, From bb1abbeba5c27ea0cc6ec81b845b48fbbe629eb2 Mon Sep 17 00:00:00 2001 From: ines Date: Wed, 23 Aug 2017 12:36:31 +0200 Subject: [PATCH 258/739] Only link model if download was successfull --- spacy/cli/download.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/spacy/cli/download.py b/spacy/cli/download.py index 675ae8cee..28ae07865 100644 --- a/spacy/cli/download.py +++ b/spacy/cli/download.py @@ -24,28 +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: - # 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") + 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): @@ -77,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()) From 6ceb0f0518c270b26da993a036af5a765091e428 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 24 Aug 2017 21:43:00 +0200 Subject: [PATCH 259/739] Allow Lexeme.rank to be set --- spacy/lexeme.pyx | 2 ++ 1 file changed, 2 insertions(+) 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): From 20dd66ddc25afb7942bddde1b5e4b03f97a759b8 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 25 Aug 2017 19:35:47 +0200 Subject: [PATCH 260/739] Constrain sentence boundaries to IS_PUNCT and IS_SPACE tokens --- spacy/syntax/arc_eager.pyx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index aab350d76..cdf17857b 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -20,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 @@ -249,7 +249,13 @@ cdef class Break: elif st.stack_depth() < 1: return False else: - return True + prev = st.B_(0)-1 + if Lexeme.c_check_flag(prev.lex, IS_PUNCT): + return True + elif Lexeme.c_check_flag(prev.lex, IS_SPACE): + return True + else: + return False @staticmethod cdef int transition(StateC* st, attr_t label) nogil: From 4ce55313890a23a51a6ecb0e320d6a5a6d3f1d99 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 25 Aug 2017 12:37:10 -0500 Subject: [PATCH 261/739] Use layer norm instead of batch norm --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index e2e0d070b..76d8fd678 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -239,7 +239,7 @@ def Tok2Vec(width, embed_size, preprocess=None): >> uniqued(embed, column=5) >> drop_layer( Residual( - (ExtractWindow(nW=1) >> BN(Maxout(width, width*3))) + (ExtractWindow(nW=1) >> LN(Maxout(width, width*3))) ) ) ** 4, pad=4 ) From 44589fb38c60ae8fe19513df357e2054b1846c5d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 25 Aug 2017 19:50:55 -0500 Subject: [PATCH 262/739] Fix Break oracle --- spacy/syntax/arc_eager.pyx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx index cdf17857b..d1e1987d7 100644 --- a/spacy/syntax/arc_eager.pyx +++ b/spacy/syntax/arc_eager.pyx @@ -249,13 +249,7 @@ cdef class Break: elif st.stack_depth() < 1: return False else: - prev = st.B_(0)-1 - if Lexeme.c_check_flag(prev.lex, IS_PUNCT): - return True - elif Lexeme.c_check_flag(prev.lex, IS_SPACE): - return True - else: - return False + return True @staticmethod cdef int transition(StateC* st, attr_t label) nogil: @@ -292,7 +286,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 @@ -522,9 +516,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" From 4bb6bc3f9e0c2eff374f4690c8674a0eb23287b0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 25 Aug 2017 20:03:14 -0500 Subject: [PATCH 263/739] Add support for sent_start to GoldParse --- spacy/gold.pxd | 1 + spacy/gold.pyx | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/spacy/gold.pxd b/spacy/gold.pxd index 5873b23ac..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 diff --git a/spacy/gold.pyx b/spacy/gold.pyx index 096f265a9..f00d04109 100644 --- a/spacy/gold.pyx +++ b/spacy/gold.pyx @@ -426,6 +426,7 @@ 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 = list(cats) @@ -482,6 +483,10 @@ 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, missing='O'): """Encode labelled spans into per-token tags, using the Begin/In/Last/Unit/Out From cfc055734e67cfb5242444bd85b3b4a3e73e8542 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 25 Aug 2017 20:03:37 -0500 Subject: [PATCH 264/739] Split % in units, for compatibility with corpus --- spacy/lang/char_classes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index bec685646..0698cfd43 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -27,7 +27,7 @@ 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'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «' From 40afa13a8a7fa0ed8d70215cd7190f37facbab50 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 26 Aug 2017 18:30:49 +0200 Subject: [PATCH 265/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index d494f8d31..efa603e9a 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a10' +__version__ = '2.0.0a11' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 7e04b7f89c9245388cbd3bf6c75b957bc0822048 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 26 Aug 2017 18:30:59 +0200 Subject: [PATCH 266/739] Fix info text on pipeline in package cli --- spacy/cli/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 9be28d4aa..7019819a7 100644 --- a/spacy/cli/package.py +++ b/spacy/cli/package.py @@ -101,7 +101,7 @@ 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) From 173089a45ac1465adaaac49fa58b01d262a60b14 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 29 Aug 2017 11:21:44 +0200 Subject: [PATCH 267/739] Add more validation for model meta --- spacy/util.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/util.py b/spacy/util.py index 645f8b3f7..9d839a25a 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -169,8 +169,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 From 4ceebde523c003440cd31da447e12acf3b1147f0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 30 Aug 2017 17:31:53 -0500 Subject: [PATCH 268/739] Fix gradient bug in parser --- spacy/syntax/nn_parser.pyx | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 06a248767..552ea4f8f 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -36,7 +36,7 @@ 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.api import layerize, chain, noop, clone, with_flatten from thinc.neural import Model, Affine, ReLu, Maxout from thinc.neural._classes.batchnorm import BatchNorm as BN from thinc.neural._classes.selu import SELU @@ -245,7 +245,7 @@ cdef class Parser: parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) embed_size = util.env_opt('embed_size', 4000) tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - preprocess=doc2feats())) + preprocess=doc2feats())) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -393,7 +393,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -453,7 +453,7 @@ cdef class Parser: cdef StateClass stcls, output tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -531,9 +531,8 @@ cdef class Parser: docs = [docs] golds = [golds] if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs + tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs = self.model[0].ops.flatten(tokvecs) cuda_stream = get_cuda_stream() @@ -586,7 +585,7 @@ cdef class Parser: backprops, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) if USE_FINE_TUNE: - bp_my_tokvecs(d_tokvecs, sgd=sgd) + d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def update_beam(self, docs_tokvecs, golds, width=None, density=None, @@ -606,9 +605,8 @@ cdef class Parser: assert min(lengths) >= 1 tokvecs = self.model[0].ops.flatten(tokvecs) if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - my_tokvecs = self.model[0].ops.flatten(my_tokvecs) - tokvecs += my_tokvecs + tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs = self.model[0].ops.flatten(tokvecs) states = self.moves.init_batch(docs) for gold in golds: @@ -642,7 +640,7 @@ cdef class Parser: self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) if USE_FINE_TUNE: - bp_my_tokvecs(d_tokvecs, sgd=sgd) + d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs def _init_gold_batch(self, whole_docs, whole_golds): From 30e35d9666f03cbe27c80fc6adc3e1c571aa9105 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 30 Aug 2017 17:35:39 -0500 Subject: [PATCH 269/739] Fix syntax error --- spacy/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/util.py b/spacy/util.py index 9d839a25a..95fcb493d 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -170,7 +170,7 @@ def get_model_meta(path): meta = read_json(meta_path) for setting in ['lang', 'name', 'version']: if setting not in meta or not meta[setting]: - raise ValueError('No valid '%s' setting found in model meta.json' % setting) + raise ValueError("No valid '%s' setting found in model meta.json" % setting) return meta From 789e1a39805b8a299e880e8c0a091782753c205a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 31 Aug 2017 14:13:00 -0500 Subject: [PATCH 270/739] Use 13 parser features, not 8 --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 552ea4f8f..2aaae4f05 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -705,7 +705,7 @@ cdef class Parser: lower, stream, drop=dropout) return state2vec, upper - nr_feature = 8 + nr_feature = 13 def get_token_ids(self, states): cdef StateClass state From 7742a6d55915dcd46dbecabdde1426e8177ec536 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 1 Sep 2017 16:39:22 +0200 Subject: [PATCH 271/739] Add GloVe vectors reader --- spacy/vectors.pyx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 72e30bd2f..0eec5a00a 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -90,6 +90,33 @@ cdef class Vectors: def most_similar(self, key): 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 to_disk(self, path, **exclude): serializers = OrderedDict(( ('vectors', lambda p: numpy.save(p.open('wb'), self.data, allow_pickle=False)), From ac040b99bb6d947d02209865fd57f2e7ba1f35c7 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 1 Sep 2017 16:39:55 +0200 Subject: [PATCH 272/739] Add support for pre-trained vectors in text classifier --- spacy/_ml.py | 114 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 16 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 8adacdfda..7dbb137b8 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -469,30 +469,80 @@ def build_tagger_model(nr_class, token_vector_width, **cfg): 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', 200) - with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): - embed_lower = HashEmbed(width, nr_vector, column=1) - embed_prefix = HashEmbed(width//2, nr_vector, column=2) - embed_suffix = HashEmbed(width//2, nr_vector, column=3) - embed_shape = HashEmbed(width//2, nr_vector, column=4) + with Model.define_operators({'>>': chain, '+': add, '|': concatenate, + '**': clone}): + 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( + (lower | prefix | suffix | shape) + ) + ) + + convolution = ( + ExtractWindow(nW=1) + >> LN(Maxout(width, width*3)) + ) cnn_model = ( - FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE]) - >> _flatten_add_lengths - >> with_getitem(0, - uniqued( - (embed_lower | embed_prefix | embed_suffix | embed_shape) - >> Maxout(width, width+(width//2)*3)) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) - >> Residual(ExtractWindow(nW=1) >> ReLu(width, width*3)) - ) - >> ParametricAttention(width,) + # TODO Make concatenate support lists + concatenate_lists(trained_vectors, SpacyVectors) + >> with_flatten( + LN(Maxout(width, 64+32+32+32+300)) + >> convolution ** 4, pad=4) + >> flatten_add_lengths + >> ParametricAttention(width) >> Pooling(sum_pool) >> ReLu(width, width) >> zero_init(Affine(nr_class, width, drop_factor=0.0)) ) + linear_model = ( _preprocess_doc >> LinearModel(nr_class, drop_factor=0.) @@ -507,3 +557,35 @@ def build_text_classifier(nr_class, width=64, **cfg): 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 + + From a824cf8f9affda45e0d00ad77fc245d781ad1901 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 11:41:00 +0200 Subject: [PATCH 273/739] Adjust text classification model --- spacy/_ml.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 7dbb137b8..41e1c5d62 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -24,7 +24,7 @@ from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths -from .attrs import ID, ORTH, LOWER, 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 @@ -521,25 +521,30 @@ def build_text_classifier(nr_class, width=64, **cfg): trained_vectors = ( FeatureExtracter([ORTH, LOWER, PREFIX, SUFFIX, SHAPE, ID]) >> with_flatten( - (lower | prefix | suffix | shape) + uniqued( + (lower | prefix | suffix | shape) + >> LN(Maxout(width, 64+32+32+32)), + column=0 + ) ) ) - convolution = ( - ExtractWindow(nW=1) - >> LN(Maxout(width, width*3)) + static_vectors = ( + SpacyVectors + >> with_flatten(Affine(width, 300)) ) cnn_model = ( # TODO Make concatenate support lists - concatenate_lists(trained_vectors, SpacyVectors) - >> with_flatten( - LN(Maxout(width, 64+32+32+32+300)) - >> convolution ** 4, pad=4) + concatenate_lists(trained_vectors, static_vectors) >> flatten_add_lengths + >> with_getitem(0, + SELU(width, width*2) + >> (ExtractWindow(nW=1) >> SELU(width, width*3)) ** 2 + ) >> ParametricAttention(width) >> Pooling(sum_pool) - >> ReLu(width, width) + >> SELU(width, width) ** 2 >> zero_init(Affine(nr_class, width, drop_factor=0.0)) ) From 5e6a9e7dcc6e03ebab39adfbbdb163eb33c28631 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 12:53:38 +0200 Subject: [PATCH 274/739] Add rule-based SBD --- spacy/pipeline.pyx | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 8c3759778..9413fb6bb 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -46,6 +46,43 @@ from ._ml import build_text_classifier, build_tagger_model from .parts_of_speech import X +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 From a3b69bcb3d2751d5c66aaaeec3433181900f0d54 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 14:56:30 +0200 Subject: [PATCH 275/739] Add low_data mode in textcat --- spacy/_ml.py | 30 +++++++++++++++++++++++------- spacy/pipeline.pyx | 5 +++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 41e1c5d62..1cd83563e 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -510,9 +510,23 @@ def foreach(layer, drop_factor=1.0): def build_text_classifier(nr_class, width=64, **cfg): - nr_vector = cfg.get('nr_vector', 200) + nr_vector = cfg.get('nr_vector', 5000) with Model.define_operators({'>>': chain, '+': add, '|': concatenate, '**': clone}): + if cfg.get('low_data'): + model = ( + SpacyVectors + >> flatten_add_lengths + >> with_getitem(0, LN(Affine(width, 300))) + >> 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) @@ -523,7 +537,7 @@ def build_text_classifier(nr_class, width=64, **cfg): >> with_flatten( uniqued( (lower | prefix | suffix | shape) - >> LN(Maxout(width, 64+32+32+32)), + >> LN(Maxout(width, width+(width//2)*3)), column=0 ) ) @@ -537,14 +551,16 @@ def build_text_classifier(nr_class, width=64, **cfg): cnn_model = ( # TODO Make concatenate support lists concatenate_lists(trained_vectors, static_vectors) - >> flatten_add_lengths - >> with_getitem(0, - SELU(width, width*2) - >> (ExtractWindow(nW=1) >> SELU(width, width*3)) ** 2 + >> with_flatten( + LN(Maxout(width, width*2)) + >> Residual( + (ExtractWindow(nW=1) >> zero_init(Maxout(width, width*3))) + ) ** 2, pad=2 ) + >> flatten_add_lengths >> ParametricAttention(width) >> Pooling(sum_pool) - >> SELU(width, width) ** 2 + >> Residual(zero_init(Maxout(width, width))) >> zero_init(Affine(nr_class, width, drop_factor=0.0)) ) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 9413fb6bb..675bfa52e 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -638,12 +638,13 @@ class TextCategorizer(BaseThincComponent): return mean_square_error, d_scores def begin_training(self, gold_tuples=tuple(), pipeline=None): - if pipeline: + 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(len(self.labels), token_vector_width) + self.model = self.Model(len(self.labels), token_vector_width, + **self.cfg) cdef class EntityRecognizer(LinearParser): From e3ea6ee02b56e97fd0558a54ec3fbce6b9db3aa4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 15:17:01 +0200 Subject: [PATCH 276/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index efa603e9a..4ff279506 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a11' +__version__ = '2.0.0a12' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 9e378bdac5558ce31138cd05709d1521093ac224 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 15:17:20 +0200 Subject: [PATCH 277/739] Fix textcat serialization --- spacy/pipeline.pyx | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 675bfa52e..238e5670e 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -128,15 +128,20 @@ class BaseThincComponent(object): def to_bytes(self, **exclude): serialize = OrderedDict(( + ('cfg', lambda: json_dumps(self.cfg)), ('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() + def load_model(b): + if self.model is True: + self.model = self.Model(**self.cfg) + self.model.from_bytes(b) + deserialize = OrderedDict(( + ('cfg', lambda b: self.cfg.update(ujson.loads(b))), ('model', lambda b: self.model.from_bytes(b)), ('vocab', lambda b: self.vocab.from_bytes(b)) )) @@ -145,19 +150,22 @@ class BaseThincComponent(object): def to_disk(self, path, **exclude): serialize = OrderedDict(( + ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), ('model', lambda p: p.open('wb').write(self.model.to_bytes())), - ('vocab', lambda p: self.vocab.to_disk(p)), - ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))) + ('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() + def load_model(p): + if self.model is True: + self.model = self.Model(**self.cfg) + self.model.from_bytes(p.open('rb').read()) + deserialize = OrderedDict(( - ('model', lambda p: self.model.from_bytes(p.open('rb').read())), + ('cfg', lambda p: self.cfg.update(_load_cfg(p))), + ('model', load_model), ('vocab', lambda p: self.vocab.from_disk(p)), - ('cfg', lambda p: self.cfg.update(_load_cfg(p))) )) util.from_disk(path, deserialize, exclude) return self From c0eaba8b28613241819ec3280526e3d2e64e2e7e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 15:17:32 +0200 Subject: [PATCH 278/739] Fix low-data textcat --- spacy/_ml.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 1cd83563e..ffa2951ce 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -517,7 +517,9 @@ def build_text_classifier(nr_class, width=64, **cfg): model = ( SpacyVectors >> flatten_add_lengths - >> with_getitem(0, LN(Affine(width, 300))) + >> with_getitem(0, + Affine(width, 300) + ) >> ParametricAttention(width) >> Pooling(sum_pool) >> Residual(ReLu(width, width)) ** 2 From e920885676c6e7019fdd2891b2173aa630d54c6b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 2 Sep 2017 12:46:01 -0500 Subject: [PATCH 279/739] Fix pickle during train --- spacy/cli/train.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index ddec2c069..b2c87d2b5 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -80,6 +80,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, n_train_words = corpus.count_train() 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 %") try: From 644d6c9e1a763a421d436bb634da361e73c29ca9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 15:17:44 +0200 Subject: [PATCH 280/739] Improve lemmatization tests, re #1296 --- spacy/tests/lang/en/test_lemmatizer.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spacy/tests/lang/en/test_lemmatizer.py b/spacy/tests/lang/en/test_lemmatizer.py index d02ae1700..00f02ccb4 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): From b29e6bff46f4afd20f50fc24d4460ef8c260516a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 15:18:10 +0200 Subject: [PATCH 281/739] Improve lemmatization rule for am|VBP --- spacy/lang/en/morph_rules.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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": { From bfddf50081557b8ad5815a60a3fd8625ee5fe728 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 15:18:41 +0200 Subject: [PATCH 282/739] Fix #1296: Incorrect lemmatization of base form verbs --- spacy/lemmatizer.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py index d7541c56b..4d534b50f 100644 --- a/spacy/lemmatizer.py +++ b/spacy/lemmatizer.py @@ -44,6 +44,11 @@ class Lemmatizer(object): 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'): + return True elif univ_pos == 'adj' and morphology.get('Degree') == 'pos': return True elif VerbForm_inf in morphology: From 382ce566eb39a730440b891209df33b4d5a213cd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 15:19:01 +0200 Subject: [PATCH 283/739] Fix deserialization bug --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 238e5670e..cbecbe3b6 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -142,7 +142,7 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda b: self.cfg.update(ujson.loads(b))), - ('model', lambda b: self.model.from_bytes(b)), + ('model', load_model), ('vocab', lambda b: self.vocab.from_bytes(b)) )) util.from_bytes(bytes_data, deserialize, exclude) From cb4839033c5bc5373d06aa0a3ed17280b8dd4526 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 15:19:18 +0200 Subject: [PATCH 284/739] Fix loader for EN tests --- spacy/tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index e0e999f4c..f5d65803a 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -13,7 +13,7 @@ from .. import util _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx'] -_models = {'en': ['en_depent_web_sm', 'en_core_web_md'], +_models = {'en': ['en_core_web_sm'], 'de': ['de_core_news_md'], 'fr': ['fr_depvec_web_lg'], 'xx': ['xx_ent_web_md']} From 9f512e657a425af8b72795dd9d6a771ed1b9617d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 09:26:38 -0500 Subject: [PATCH 285/739] Fix drop_layer calculation --- spacy/_ml.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 8adacdfda..f8a78948e 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -212,12 +212,14 @@ class PrecomputableMaxouts(Model): def drop_layer(layer, factor=2.): def drop_layer_fwd(X, drop=0.): - drop *= factor - mask = layer.ops.get_dropout_mask((1,), drop) - if mask is None or mask > 0: + if drop <= 0.: return layer.begin_update(X, drop=drop) else: - return X, lambda dX, sgd=None: dX + 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 @@ -362,6 +364,8 @@ def get_token_vectors(tokens_attrs_vectors, drop=0.): def backward(d_output, sgd=None): return (tokens, d_output) return vectors, backward + + def fine_tune(embedding, combine=None): if combine is not None: raise NotImplementedError( From 7fdafcc4c409697af789debbb287afc45352af00 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 16:38:49 +0200 Subject: [PATCH 286/739] Fix config loading in tagger --- spacy/pipeline.pyx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index cbecbe3b6..7e00a443d 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -417,7 +417,8 @@ class NeuralTagger(BaseThincComponent): 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) + 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, token_vector_width) self.model.from_bytes(b) @@ -451,7 +452,8 @@ class NeuralTagger(BaseThincComponent): 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) + 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, token_vector_width) self.model.from_bytes(p.open('rb').read()) From d5fbf27335a9df265b8151425e88e311333f176c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 16:45:11 +0200 Subject: [PATCH 287/739] Fix test --- spacy/tests/lang/en/test_tagger.py | 1 - 1 file changed, 1 deletion(-) 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' From 9d65d6798570b9121d099de1b2a3f412fce6563b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 16:46:22 +0200 Subject: [PATCH 288/739] Preserve model compatibility in parser, for now --- spacy/syntax/nn_parser.pyx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 2aaae4f05..34e504da9 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -393,7 +393,8 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: - tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + # TODO: This is incorrect! Unhack when training next model + tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -531,8 +532,8 @@ cdef class Parser: docs = [docs] golds = [golds] if USE_FINE_TUNE: - tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs = self.model[0].ops.flatten(tokvecs) + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs += self.model[0].ops.flatten(my_tokvecs) cuda_stream = get_cuda_stream() @@ -605,8 +606,8 @@ cdef class Parser: assert min(lengths) >= 1 tokvecs = self.model[0].ops.flatten(tokvecs) if USE_FINE_TUNE: - tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs = self.model[0].ops.flatten(tokvecs) + my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs += self.model[0].ops.flatten(my_tokvecs) states = self.moves.init_batch(docs) for gold in golds: From 66646ead261ec941fa2624a8fa53295973126433 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 18:14:15 +0200 Subject: [PATCH 289/739] Update travis --- .travis.yml | 3 ++- travis.sh | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index a1f7044b0..fda38937d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ os: env: - VIA=compile LC_ALL=en_US.ascii - VIA=compile + - VIA=pypi # - VIA=sdist @@ -23,7 +24,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" ]]; then python -m pytest --tb=native --models --en `python -c "import os.path; import spacy; print(os.path.abspath(ospath.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/travis.sh b/travis.sh index 67d413a1b..49cc3f158 100755 --- a/travis.sh +++ b/travis.sh @@ -3,7 +3,7 @@ if [ "${VIA}" == "pypi" ]; then rm -rf * pip install spacy - python -m spacy.en.download + python -m spacy download en python -m spacy.de.download fi From d47af995613ff503a701a8425b25adb59bda6c4e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 18:43:33 +0200 Subject: [PATCH 290/739] Update travis.yml --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fda38937d..8be9a35ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,6 @@ os: env: - VIA=compile LC_ALL=en_US.ascii - VIA=compile - - VIA=pypi # - VIA=sdist From 3ba9994f1f7c986a6404fd63336514ff7aad5ee9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 18:44:23 +0200 Subject: [PATCH 291/739] Update travis --- .travis.yml | 3 +-- travis.sh | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8be9a35ca..5d15c33d9 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 install: - "./travis.sh" diff --git a/travis.sh b/travis.sh index 49cc3f158..4ed998ec0 100755 --- a/travis.sh +++ b/travis.sh @@ -4,7 +4,6 @@ if [ "${VIA}" == "pypi" ]; then rm -rf * pip install spacy python -m spacy download en - python -m spacy.de.download fi if [[ "${VIA}" == "sdist" && "${TRAVIS_PULL_REQUEST}" == "false" ]]; then From d9c609c0f5c5e3585d1815363b40ec206d27fab3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 19:01:38 +0200 Subject: [PATCH 292/739] Update travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 5d15c33d9..95685da29 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,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 --models --en `python -c "import os.path; import spacy; print(os.path.abspath(ospath.dirname(spacy.__file__)))"`; fi + - if [[ "${VIA}" == "pypi" ]]; 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: From 6bd0a0df9a0d517cc9d7df20385ec8c0bc09048c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 19:49:35 +0200 Subject: [PATCH 293/739] Update travis --- .travis.yml | 4 ++-- travis.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 95685da29..f302d0f1b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ os: env: - VIA=compile LC_ALL=en_US.ascii - VIA=compile - - VIA=pypi + - VIA=pypi_nightly install: - "./travis.sh" @@ -22,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 --models --en `python -c "import os.path; import spacy; print(os.path.abspath(os.path.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/travis.sh b/travis.sh index 4ed998ec0..4b7d8017c 100755 --- a/travis.sh +++ b/travis.sh @@ -2,7 +2,7 @@ if [ "${VIA}" == "pypi" ]; then rm -rf * - pip install spacy + pip install spacy-nightly python -m spacy download en fi From 48f4abdcf2a51ce1cb9ec00cc6a866f5b7a6ec9d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 20:05:37 +0200 Subject: [PATCH 294/739] Update travis, removing pypi build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f302d0f1b..b87ffbd06 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ os: env: - VIA=compile LC_ALL=en_US.ascii - VIA=compile - - VIA=pypi_nightly + #- VIA=pypi_nightly install: - "./travis.sh" From e88a42e4604cc056fd25b324d8b4393c796c5500 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 21:14:39 +0200 Subject: [PATCH 295/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index 4ff279506..d566fbb1f 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a12' +__version__ = '2.0.0a13' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 33fa91feb7fa81a3346b8d34ac927c1578bc719b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 4 Sep 2017 21:19:30 +0200 Subject: [PATCH 296/739] Restore correctness of parser model --- spacy/syntax/nn_parser.pyx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 34e504da9..2aaae4f05 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -393,8 +393,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: - # TODO: This is incorrect! Unhack when training next model - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -532,8 +531,8 @@ cdef class Parser: docs = [docs] golds = [golds] if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs += self.model[0].ops.flatten(my_tokvecs) + tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs = self.model[0].ops.flatten(tokvecs) cuda_stream = get_cuda_stream() @@ -606,8 +605,8 @@ cdef class Parser: assert min(lengths) >= 1 tokvecs = self.model[0].ops.flatten(tokvecs) if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs += self.model[0].ops.flatten(my_tokvecs) + tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) + tokvecs = self.model[0].ops.flatten(tokvecs) states = self.moves.init_batch(docs) for gold in golds: From c537154b21f245ccf42ac08a7b98e7d38adfff54 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 04:59:08 -0500 Subject: [PATCH 297/739] Revert gold pre-processing to True --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 94483129e..4bdfc5b1a 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -70,7 +70,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, batch_sizes = util.compounding(util.env_opt('batch_from', 1), util.env_opt('batch_to', 64), util.env_opt('batch_compound', 1.001)) - gold_preproc = util.env_opt('gold_preproc', False) + gold_preproc = util.env_opt('gold_preproc', True) noise_level = util.env_opt('noise_level', 0.0) if resume: From 24ff6b0ad9a5ee976cf8b8e88704136d66c0c93b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 05:50:58 -0500 Subject: [PATCH 298/739] Fix parsing and tok2vec models --- spacy/_ml.py | 17 ++++++++--------- spacy/cli/train.py | 6 +++--- spacy/syntax/nn_parser.pyx | 7 +++---- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index e6437cdcf..003541f4b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -229,20 +229,18 @@ def drop_layer(layer, factor=2.): def Tok2Vec(width, embed_size, preprocess=None): cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] 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') + 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') embed = (norm | prefix | suffix | shape ) >> LN(Maxout(width, width*4, pieces=3)) tok2vec = ( with_flatten( asarray(Model.ops, dtype='uint64') >> uniqued(embed, column=5) - >> drop_layer( - Residual( - (ExtractWindow(nW=1) >> LN(Maxout(width, width*3))) - ) + >> Residual( + (ExtractWindow(nW=1) >> LN(Maxout(width, width*3))) ) ** 4, pad=4 ) ) @@ -372,6 +370,7 @@ def fine_tune(embedding, combine=None): "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) @@ -556,7 +555,7 @@ def build_text_classifier(nr_class, width=64, **cfg): cnn_model = ( # TODO Make concatenate support lists - concatenate_lists(trained_vectors, static_vectors) + concatenate_lists(trained_vectors, static_vectors) >> with_flatten( LN(Maxout(width, width*2)) >> Residual( diff --git a/spacy/cli/train.py b/spacy/cli/train.py index ddec2c069..a22db6abc 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -72,8 +72,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, 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')) + prints(output_path / 'model9.pickle', title="Resuming training") + nlp = dill.load((output_path / 'model9.pickle').open('rb')) else: nlp = lang_class(pipeline=pipeline) corpus = GoldCorpus(train_path, dev_path, limit=n_sents) @@ -87,7 +87,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, if resume: i += 20 with tqdm.tqdm(total=n_train_words, leave=False) as pbar: - train_docs = corpus.train_docs(nlp, projectivize=True, + train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, gold_preproc=gold_preproc, max_length=0) losses = {} for batch in minibatch(train_docs, size=batch_sizes): diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 34e504da9..1c4107c06 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -393,8 +393,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: - # TODO: This is incorrect! Unhack when training next model - tokvecs += self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) nr_state = len(docs) nr_class = self.moves.n_moves @@ -533,7 +532,7 @@ cdef class Parser: golds = [golds] if USE_FINE_TUNE: my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs += self.model[0].ops.flatten(my_tokvecs) + tokvecs = self.model[0].ops.flatten(my_tokvecs) cuda_stream = get_cuda_stream() @@ -706,7 +705,7 @@ cdef class Parser: lower, stream, drop=dropout) return state2vec, upper - nr_feature = 13 + nr_feature = 8 def get_token_ids(self, states): cdef StateClass state From 5384fff5ceaa694109b6a6efa790877aabd5be7e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 18:40:18 +0200 Subject: [PATCH 299/739] Add test for 1305: Incorrect lemmatization of VBZ for English --- spacy/tests/regression/test_issue1305.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 spacy/tests/regression/test_issue1305.py 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' From 497a9308a8775b51c79621bfe5f03aab1bf6696c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 18:41:22 +0200 Subject: [PATCH 300/739] Xfail new lemmatizer test --- spacy/tests/regression/test_issue1305.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/tests/regression/test_issue1305.py b/spacy/tests/regression/test_issue1305.py index e123ce0ba..c75b42434 100644 --- a/spacy/tests/regression/test_issue1305.py +++ b/spacy/tests/regression/test_issue1305.py @@ -1,5 +1,6 @@ import pytest +@pytest.mark.xfail @pytest.mark.models('en') def test_issue1305(EN): '''Test lemmatization of English VBZ''' From dd9cab0fafe0c9df863a5f539303b1bcfa4f1feb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 19:03:05 +0200 Subject: [PATCH 301/739] Fix type-check for int/long --- spacy/syntax/transition_system.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx index 9cf82e0c7..055129c8b 100644 --- a/spacy/syntax/transition_system.pyx +++ b/spacy/syntax/transition_system.pyx @@ -148,7 +148,7 @@ cdef class TransitionSystem: 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 From 5c3ff069242804da4aba48ec6d09777eb91f74b9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 19:13:24 +0200 Subject: [PATCH 302/739] Fix lemmatizer rules --- spacy/lemmatizer.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py index 4d534b50f..3a04a471d 100644 --- a/spacy/lemmatizer.py +++ b/spacy/lemmatizer.py @@ -25,6 +25,7 @@ class Lemmatizer(object): elif univ_pos == PUNCT: univ_pos = 'punct' # See Issue #435 for example of where this logic is requied. + print("Check base form", string) if self.is_base_form(univ_pos, morphology): return set([string.lower()]) lemmas = lemmatize(string, self.index.get(univ_pos, {}), @@ -38,7 +39,8 @@ 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 @@ -47,7 +49,9 @@ class Lemmatizer(object): # 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'): + 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 From 99e44fbdbbb34f33f3a02890cec03bea2b0a4b74 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 19:13:51 +0200 Subject: [PATCH 303/739] Update regression test --- spacy/tests/regression/test_issue429.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spacy/tests/regression/test_issue429.py b/spacy/tests/regression/test_issue429.py index 1baa9a1db..74f12bd9f 100644 --- a/spacy/tests/regression/test_issue429.py +++ b/spacy/tests/regression/test_issue429.py @@ -9,11 +9,14 @@ 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) From 456bb8a74c384bcef58d562525c5ce914b0bed76 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 6 Sep 2017 19:14:17 +0200 Subject: [PATCH 304/739] Unxfail and close #1305 --- spacy/tests/regression/test_issue1305.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/tests/regression/test_issue1305.py b/spacy/tests/regression/test_issue1305.py index c75b42434..e123ce0ba 100644 --- a/spacy/tests/regression/test_issue1305.py +++ b/spacy/tests/regression/test_issue1305.py @@ -1,6 +1,5 @@ import pytest -@pytest.mark.xfail @pytest.mark.models('en') def test_issue1305(EN): '''Test lemmatization of English VBZ''' From b8e81daccfd0ccf1388a7538ffcd9e6489e8d9ec Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 14 Sep 2017 12:49:59 +0200 Subject: [PATCH 305/739] Fix typo (closes #1312) --- website/docs/usage/customizing-tokenizer.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/customizing-tokenizer.jade b/website/docs/usage/customizing-tokenizer.jade index 7e0b4b479..0bc81771d 100644 --- a/website/docs/usage/customizing-tokenizer.jade +++ b/website/docs/usage/customizing-tokenizer.jade @@ -282,7 +282,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 From ba23d63c35bf9187f093804f93af4fd345cfa1e3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 13:37:41 +0200 Subject: [PATCH 306/739] Fix minibatch function, for fixed batch size --- spacy/gold.pyx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spacy/gold.pyx b/spacy/gold.pyx index f00d04109..fc8d6622b 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 From 9cb2aef5877b342ef44cd77386328ee91039088e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 13:38:28 +0200 Subject: [PATCH 307/739] Remove print statement --- spacy/lemmatizer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py index 3a04a471d..312c8db72 100644 --- a/spacy/lemmatizer.py +++ b/spacy/lemmatizer.py @@ -25,7 +25,6 @@ class Lemmatizer(object): elif univ_pos == PUNCT: univ_pos = 'punct' # See Issue #435 for example of where this logic is requied. - print("Check base form", string) if self.is_base_form(univ_pos, morphology): return set([string.lower()]) lemmas = lemmatize(string, self.index.get(univ_pos, {}), From 683d81bb49096867f5ad8d3dde23217ea54d6790 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:15:59 +0200 Subject: [PATCH 308/739] Update example for adding entity type --- examples/training/train_new_entity_type.py | 87 ++++++++++------------ 1 file changed, 40 insertions(+), 47 deletions(-) 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) From daf869ab3b02a6e3ab36fe6b2bf5e4c7c0a72049 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:16:41 +0200 Subject: [PATCH 309/739] Fix add_action for NER, so labelled 'O' actions aren't added --- spacy/syntax/ner.pyx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 2f5cd4e48..11b429aa2 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -220,6 +220,31 @@ 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): From c6395b057a6cd65fe931f5b9b8aece35e94f16d7 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:18:02 +0200 Subject: [PATCH 310/739] Improve parser feature extraction, for missing values --- spacy/syntax/_state.pxd | 13 +++++++++---- spacy/syntax/nn_parser.pyx | 16 +++++++++++++++- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 3da9e5d4c..9a08691de 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -101,9 +101,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: @@ -118,8 +119,12 @@ cdef cppclass StateC: # TODO error =/ pass for i in range(n): + # Token vectors should be padded, so that there's a vector for + # missing values at the start. if ids[i] >= 0: - ids[i] += this.offset + ids[i] += this.offset + 1 + else: + ids[i] = 0 int S(int i) nogil const: if i >= this._s_i: @@ -162,9 +167,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: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 552ea4f8f..ad6ed280e 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -394,7 +394,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - + tokvecs = self._pad_tokvecs(tokvecs) nr_state = len(docs) nr_class = self.moves.n_moves nr_dim = tokvecs.shape[1] @@ -454,6 +454,7 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + tokvecs = self._pad_tokvecs(tokvecs) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -534,6 +535,8 @@ cdef class Parser: tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs = self.model[0].ops.flatten(tokvecs) + tokvecs = self._pad_tokvecs(tokvecs) + cuda_stream = get_cuda_stream() states, golds, max_steps = self._init_gold_batch(docs, golds) @@ -583,6 +586,7 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) + d_tokvecs = self._unpad_tokvecs(d_tokvecs) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) @@ -639,10 +643,20 @@ cdef class Parser: d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) + d_tokvecs = self._unpad_tokvecs(d_tokvecs) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs + def _pad_tokvecs(self, tokvecs): + # Add a vector for missing values at the start of tokvecs + xp = get_array_module(tokvecs) + pad = xp.zeros((1, tokvecs.shape[1]), dtype=tokvecs.dtype) + return xp.vstack((pad, tokvecs)) + + def _unpad_tokvecs(self, d_tokvecs): + return d_tokvecs[1:] + def _init_gold_batch(self, whole_docs, whole_golds): """Make a square batch, of length equal to the shortest doc. A long doc will get multiple states. Let's say we have a doc of length 2*N, From 70da88a3a74e17b0c15fd9224c025a5c556625aa Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:18:30 +0200 Subject: [PATCH 311/739] Update comment on Language.begin_training --- spacy/language.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 66b42ff94..e6a5304dd 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -347,15 +347,9 @@ class Language(object): """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)) From d1518027a980f57d6ee88d6d99e161267ab9ad25 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:18:46 +0200 Subject: [PATCH 312/739] Increment version --- spacy/about.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/about.py b/spacy/about.py index d566fbb1f..40444ffd1 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,7 +3,7 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a13' +__version__ = '2.0.0a14' __summary__ = 'Industrial-strength Natural Language Processing (NLP) with Python and Cython' __uri__ = 'https://spacy.io' __author__ = 'Explosion AI' From 664c5af745786312725917cd9a44418777868350 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:59:25 +0200 Subject: [PATCH 313/739] Revert padding in parser --- spacy/syntax/_state.pxd | 6 ++---- spacy/syntax/nn_parser.pyx | 6 ------ 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 9a08691de..4fb16881a 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -119,12 +119,10 @@ cdef cppclass StateC: # TODO error =/ pass for i in range(n): - # Token vectors should be padded, so that there's a vector for - # missing values at the start. if ids[i] >= 0: - ids[i] += this.offset + 1 + ids[i] += this.offset else: - ids[i] = 0 + ids[i] = -1 int S(int i) nogil const: if i >= this._s_i: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ad6ed280e..3ea17f2fe 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -394,7 +394,6 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - tokvecs = self._pad_tokvecs(tokvecs) nr_state = len(docs) nr_class = self.moves.n_moves nr_dim = tokvecs.shape[1] @@ -454,7 +453,6 @@ cdef class Parser: tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - tokvecs = self._pad_tokvecs(tokvecs) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -527,7 +525,6 @@ cdef class Parser: 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] @@ -535,7 +532,6 @@ cdef class Parser: tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs = self.model[0].ops.flatten(tokvecs) - tokvecs = self._pad_tokvecs(tokvecs) cuda_stream = get_cuda_stream() @@ -586,7 +582,6 @@ cdef class Parser: break self._make_updates(d_tokvecs, backprops, sgd, cuda_stream) - d_tokvecs = self._unpad_tokvecs(d_tokvecs) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) @@ -643,7 +638,6 @@ cdef class Parser: d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - d_tokvecs = self._unpad_tokvecs(d_tokvecs) if USE_FINE_TUNE: d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) return d_tokvecs From 8c503487af306e4ca1fc93372c28cecebede95ca Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 16:59:45 +0200 Subject: [PATCH 314/739] Fix lookup of missing NER actions --- spacy/syntax/ner.pyx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 11b429aa2..1a174aba8 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -161,8 +161,7 @@ cdef class BiluoPushDown(TransitionSystem): 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: From 18347ab69ceb4d57a87269bd141b300081b82983 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 19:07:35 +0200 Subject: [PATCH 315/739] Implement AddHistory layer wrapper --- spacy/_ml.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index 003541f4b..d3c82897f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -78,6 +78,37 @@ def add_tuples(X, drop=0.): return (vals1+vals2, length), add_tuples_bwd +def AddHistory(layer, decay=0.0001): + ops = layer.ops + nonlocals = [] + if layer.nI: + average_inputs = ops.allocate((layer.nO, layer.nI-layer.nO)) + nonlocals = [] + def history_fwd(X, drop=0.): + if not nonlocals: + nonlocals.append(ops.allocate((layer.nO, X.shape[1]))) + model.history = nonlocals[0] + average_inputs = nonlocals[0] + hist = ops.xp.tensordot(X, average_inputs, axes=[[1], [1]]) + X_hist = ops.xp.hstack((X, hist)) + Y, bp_Y = layer.begin_update(X_hist, drop=drop) + for i in range(Y.shape[0]): + amax = Y[i].argmax() + average_inputs[amax] *= 1-decay + average_inputs[amax] += decay * X[i] + def history_bwd(dY, sgd=None): + dX_hist = bp_Y(dY, sgd=sgd) + dX = dX_hist[:, :X.shape[1]] + return dX + return Y, history_bwd + model = wrap(history_fwd, layer) + if layer.nI: + model.history = average_inputs + else: + model.history = None + return model + + def _zero_init(model): def _zero_init_impl(self, X, y): self.W.fill(0) From bd3da3d6fb8626613e7ee76931ea6ae67786011e Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Thu, 14 Sep 2017 19:23:13 +0200 Subject: [PATCH 316/739] Port over change from #1323 and tidy up --- spacy/lang/zh/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py index 3f68336f8..46ad3946f 100644 --- a/spacy/lang/zh/__init__.py +++ b/spacy/lang/zh/__init__.py @@ -14,8 +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=[x for x in words if x] + 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)) From d84607f6bb7fa561d65734b1d2d15770c5de05b9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 14 Sep 2017 20:34:40 +0200 Subject: [PATCH 317/739] Vectorize update in AddHistory --- spacy/_ml.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index d3c82897f..1f3d50cbd 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -81,31 +81,28 @@ def add_tuples(X, drop=0.): def AddHistory(layer, decay=0.0001): ops = layer.ops nonlocals = [] - if layer.nI: - average_inputs = ops.allocate((layer.nO, layer.nI-layer.nO)) - nonlocals = [] def history_fwd(X, drop=0.): if not nonlocals: - nonlocals.append(ops.allocate((layer.nO, X.shape[1]))) + if hasattr(layer, 'nO'): + nO = layer.nO + else: + nO = layer._layers[-1].nO + nonlocals.append(ops.allocate((nO, X.shape[1]))) model.history = nonlocals[0] average_inputs = nonlocals[0] hist = ops.xp.tensordot(X, average_inputs, axes=[[1], [1]]) X_hist = ops.xp.hstack((X, hist)) Y, bp_Y = layer.begin_update(X_hist, drop=drop) - for i in range(Y.shape[0]): - amax = Y[i].argmax() - average_inputs[amax] *= 1-decay - average_inputs[amax] += decay * X[i] + amax = Y.argmax(axis=1) + average_inputs *= 1-decay + ops.scatter_add(average_inputs, amax, X * decay) def history_bwd(dY, sgd=None): dX_hist = bp_Y(dY, sgd=sgd) dX = dX_hist[:, :X.shape[1]] - return dX + return ops.xp.ascontiguousarray(dX) return Y, history_bwd model = wrap(history_fwd, layer) - if layer.nI: - model.history = average_inputs - else: - model.history = None + model.history = None return model From 027a5d8b75c74fe2ae27d21ecb1d4ca36ec23cb3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 10:36:46 +0200 Subject: [PATCH 318/739] Update train_ner_standalone example --- examples/training/train_ner_standalone.py | 192 +++++++++------------- 1 file changed, 80 insertions(+), 112 deletions(-) diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py index 9591d1b71..6cca56c69 100644 --- a/examples/training/train_ner_standalone.py +++ b/examples/training/train_ner_standalone.py @@ -13,24 +13,27 @@ 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 +from thinc.neural.optimizers import Adam +from thinc.neural.ops import NumpyOps +import tqdm -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,95 +41,40 @@ 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): + def __init__(self, vocab=None, tokenizer=None, tensorizer=None, entity=None): if vocab is None: vocab = init_vocab() if tokenizer is None: tokenizer = Tokenizer(vocab, {}, None, None, None) + if tensorizer is None: + tensorizer = TokenVectorEncoder(vocab) if entity is None: - entity = init_ner_model(self.vocab) + entity = NeuralEntityRecognizer(vocab) self.vocab = vocab self.tokenizer = tokenizer + self.tensorizer = tensorizer self.entity = entity - self.pipeline = [self.entity] + self.pipeline = [tensorizer, 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_) @@ -147,14 +95,18 @@ 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)] + + tensors, bp_tensors = self.tensorizer.update(docs, golds, drop=drop) + d_tensors = self.entity.update((docs, tensors), golds, drop=drop, + sgd=sgd, losses=losses) + bp_tensors(d_tensors, sgd=sgd) + return losses def evaluate(self, examples): scorer = Scorer() @@ -164,34 +116,38 @@ 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.tensorizer.to_disk(path / 'tensorizer') + 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.tensorizer = self.tensorizer.from_disk(path / 'tensorizer') + 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() + report_scores(i, losses['ner'], scores) scores = nlp.evaluate(dev_examples) report_scores(channels, i+1, loss, scores) @@ -208,7 +164,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 +174,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) From 8b481e04658443013e132988dc77740b4aa6a167 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 10:38:08 +0200 Subject: [PATCH 319/739] Remove redundant brackets --- spacy/syntax/nn_parser.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 3ea17f2fe..e2dc35966 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -262,8 +262,8 @@ cdef class Parser: upper.is_noop = True else: upper = chain( - clone(Maxout(hidden_width), (depth-1)), - zero_init(Affine(nr_class, drop_factor=0.0)) + clone(Maxout(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! From 2f08489694f0ad74f03ccf566814628c57a1976c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 10:41:40 +0200 Subject: [PATCH 320/739] Remove AddHistory layer -- didnt work as planned --- spacy/_ml.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 1f3d50cbd..003541f4b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -78,34 +78,6 @@ def add_tuples(X, drop=0.): return (vals1+vals2, length), add_tuples_bwd -def AddHistory(layer, decay=0.0001): - ops = layer.ops - nonlocals = [] - def history_fwd(X, drop=0.): - if not nonlocals: - if hasattr(layer, 'nO'): - nO = layer.nO - else: - nO = layer._layers[-1].nO - nonlocals.append(ops.allocate((nO, X.shape[1]))) - model.history = nonlocals[0] - average_inputs = nonlocals[0] - hist = ops.xp.tensordot(X, average_inputs, axes=[[1], [1]]) - X_hist = ops.xp.hstack((X, hist)) - Y, bp_Y = layer.begin_update(X_hist, drop=drop) - amax = Y.argmax(axis=1) - average_inputs *= 1-decay - ops.scatter_add(average_inputs, amax, X * decay) - def history_bwd(dY, sgd=None): - dX_hist = bp_Y(dY, sgd=sgd) - dX = dX_hist[:, :X.shape[1]] - return ops.xp.ascontiguousarray(dX) - return Y, history_bwd - model = wrap(history_fwd, layer) - model.history = None - return model - - def _zero_init(model): def _zero_init_impl(self, X, y): self.W.fill(0) From 86367ab092d75af98bfb68bc3b6c499d28d0067f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:41:59 +0200 Subject: [PATCH 321/739] Start work on appveyor, for Windows build --- .appveyor.yml | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index 4dd7b0a31..d63512fcf 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -1 +1,53 @@ +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 -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. From 1f840a9211347ec5d3f7dc64eccf74e254aa414c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:49:02 +0200 Subject: [PATCH 322/739] Appveyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index d63512fcf..1fc3c920f 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -17,7 +17,7 @@ environment: #- PYTHON: "C:\\Python34-x64" #- DISTUTILS_USE_SDK: "1" #- PYTHON: "C:\\Python35-x64" - #- PYTHON: "C:\\Python36-x64" + - PYTHON: "C:\\Python36-x64" install: # We need wheel installed to build wheels From 25ec8935adfc50f25109b411dd59980c2f065c52 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:53:07 +0200 Subject: [PATCH 323/739] Appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index 1fc3c920f..f2d166754 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -22,6 +22,7 @@ environment: 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 -e ." build: off From 02273eeca8290e5fb7906871c76a9e6db1c6f943 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 12:55:33 +0200 Subject: [PATCH 324/739] Appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index f2d166754..a379cdd31 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -23,6 +23,7 @@ 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 From 07cdbd121910c7984f7f597234b0cf986af9c2d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 22:47:53 +0200 Subject: [PATCH 325/739] Require thinc 6.8.1, for Windows --- requirements.txt | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index aae0f9388..54c888a11 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,9 @@ -cython<0.24 +cython>=0.24 pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.8.0,<6.9.0 +thinc>=6.8.1,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index 6a22f4076..535dddd0d 100755 --- a/setup.py +++ b/setup.py @@ -195,7 +195,7 @@ def setup_package(): 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.8.0,<6.9.0', + 'thinc>=6.8.1,<6.9.0', 'plac<1.0.0,>=0.9.6', 'pip>=9.0.0,<10.0.0', 'six', From 2432308f3ef136e5e90d7be39ea795d3c6e61510 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 23:55:19 +0200 Subject: [PATCH 326/739] Build in separate step for appveyor --- .appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.appveyor.yml b/.appveyor.yml index a379cdd31..8dbdd2868 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,6 +24,7 @@ install: - "%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 python setup.py build_ext --inplace" - "%PYTHON%\\python.exe -m pip install -e ." build: off From 1ffc9a7fbfdd7ef620b025a770c4ba07305ce81d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 15 Sep 2017 23:59:36 +0200 Subject: [PATCH 327/739] Fix appveyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 8dbdd2868..12399a5a1 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,7 +24,7 @@ install: - "%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 python setup.py build_ext --inplace" + - "%PYTHON%\\python.exe setup.py build_ext --inplace" - "%PYTHON%\\python.exe -m pip install -e ." build: off From f730d07e4e7ab3d4cba3d16537b7ca7a5a098307 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 00:25:18 +0200 Subject: [PATCH 328/739] Fix prange error for Windows --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index e2dc35966..ea484f1c2 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -419,7 +419,7 @@ cdef class Parser: cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): if not has_hidden: - for i in cython.parallel.prange( + for i in range( next_step.size(), num_threads=6, nogil=True): self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) From 3fa5b40b5cace40a5b8fde8112354abce6488b77 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 11:21:35 +0200 Subject: [PATCH 329/739] Add test for hash consistency --- spacy/tests/stringstore/test_stringstore.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spacy/tests/stringstore/test_stringstore.py b/spacy/tests/stringstore/test_stringstore.py index 65b994606..602ebcee6 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 == 11841826740069053588L + + def test_stringstore_from_api_docs(stringstore): apple_hash = stringstore.add('apple') assert apple_hash == 8566208034543834098 From 8a829eb98c41194a08f48fd1a9bec496ec673c98 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 11:49:31 +0200 Subject: [PATCH 330/739] Fix travis.sh --- travis.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis.sh b/travis.sh index 4b7d8017c..eed6a96f2 100755 --- a/travis.sh +++ b/travis.sh @@ -17,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + python setup.py build_ext --inplace pip install -e . fi From 11f2a05ede85b547b0b33d5642db6e3eaa1fba07 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:20:04 +0200 Subject: [PATCH 331/739] Fix code explosion from long enum in Python 3, Cython 0.24+ --- spacy/symbols.pxd | 2 +- spacy/symbols.pyx | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) 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) From 8c945310fb16912a23ef8311cd4cd00aeb3798e2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 16:21:13 +0200 Subject: [PATCH 332/739] Excuse emoji failure on narrow unicode builds --- spacy/tests/tokenizer/test_exceptions.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 From ebf8942564246729c79a299d597f13e8bd1215b2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 16:22:38 +0200 Subject: [PATCH 333/739] Fix test for Python3 --- spacy/tests/stringstore/test_stringstore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/stringstore/test_stringstore.py b/spacy/tests/stringstore/test_stringstore.py index 602ebcee6..3f2992a6f 100644 --- a/spacy/tests/stringstore/test_stringstore.py +++ b/spacy/tests/stringstore/test_stringstore.py @@ -13,7 +13,7 @@ def test_string_hash(stringstore): heart = '\U0001f499' print(heart) h = ss.add(heart) - assert h == 11841826740069053588L + assert h == 11841826740069053588 def test_stringstore_from_api_docs(stringstore): From e0a2aa92891af890738b6290cd622cc87fe652ac Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:45:09 -0500 Subject: [PATCH 334/739] Support having word vectors data on GPU --- spacy/vectors.pyx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 0eec5a00a..b912be80b 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -6,6 +6,8 @@ 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 @@ -31,7 +33,7 @@ cdef class Vectors: self.i = 0 self.data = data self.key2row = {} - self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') + self.keys = np.ndarray((self.data.shape[0],), dtype='uint64') def __reduce__(self): return (Vectors, (self.strings, self.data)) @@ -118,9 +120,14 @@ cdef class Vectors: self.data 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: numpy.save(p.open('wb'), self.data, allow_pickle=False)), - ('keys', lambda p: numpy.save(p.open('wb'), self.keys, allow_pickle=False)), + ('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) @@ -133,8 +140,9 @@ cdef class Vectors: self.key2row[key] = i def load_vectors(path): + xp = Model.ops.xp if path.exists(): - self.data = numpy.load(path) + self.data = xp.load(path) serializers = OrderedDict(( ('keys', load_keys), From 2a93404da683193683003cdd597e29496b21e31e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:45:37 -0500 Subject: [PATCH 335/739] Support optional pre-trained vectors in tensorizer model --- spacy/_ml.py | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 003541f4b..14341c407 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,7 +21,7 @@ from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention from thinc.linear.linear import LinearModel -from thinc.api import uniqued, wrap, flatten_add_lengths +from thinc.api import uniqued, wrap, flatten_add_lengths, noop from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER @@ -226,7 +226,7 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, preprocess=None): +def Tok2Vec(width, embed_size, preprocess=True, pretrained_dims=0): cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') @@ -234,18 +234,30 @@ def Tok2Vec(width, embed_size, preprocess=None): 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') - embed = (norm | prefix | suffix | shape ) >> LN(Maxout(width, width*4, pieces=3)) - tok2vec = ( - with_flatten( - asarray(Model.ops, dtype='uint64') - >> uniqued(embed, column=5) - >> Residual( - (ExtractWindow(nW=1) >> LN(Maxout(width, width*3))) - ) ** 4, pad=4 + trained_vectors = ( + FeatureExtracter(cols) + >> with_flatten( + uniqued( + (norm | prefix | suffix | shape) + >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - if preprocess not in (False, None): - tok2vec = preprocess >> tok2vec + if pretrained_dims: + embed = concatenate_lists(trained_vectors, SpacyVectors) + else: + embed = trained_vectors + convolution = Residual(ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=3))) + + tok2vec = ( + embed + >> with_flatten( + Affine(width, width+pretrained_dims) + >> convolution + >> convolution + >> convolution + >> convolution, + pad=1) + ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width tok2vec.embed = embed @@ -457,10 +469,11 @@ def getitem(i): def build_tagger_model(nr_class, token_vector_width, **cfg): embed_size = util.env_opt('embed_size', 7500) + pretrained_dims = cfg.get('pretrained_dims', 0) with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples - private_tok2vec = Tok2Vec(token_vector_width, embed_size, preprocess=doc2feats()) - + private_tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=pretrained_dims) model = ( fine_tune(private_tok2vec) >> with_flatten( From 84e637e2e67c3b1b4509c94c08e00687b5881b8f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:46:02 -0500 Subject: [PATCH 336/739] Pass option for pretrained vectors in pipeline --- spacy/pipeline.pyx | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 7e00a443d..4643b759a 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -41,7 +41,7 @@ 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 .parts_of_speech import X @@ -137,6 +137,7 @@ class BaseThincComponent(object): def from_bytes(self, bytes_data, **exclude): 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) @@ -159,6 +160,7 @@ class BaseThincComponent(object): def from_disk(self, path, **exclude): 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()) @@ -193,7 +195,7 @@ class TokenVectorEncoder(BaseThincComponent): """ 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 @@ -210,7 +212,6 @@ class TokenVectorEncoder(BaseThincComponent): >>> tok2vec.model = tok2vec.Model(128, 5000) """ self.vocab = vocab - self.doc2feats = doc2feats() self.model = model self.cfg = dict(cfg) @@ -245,8 +246,7 @@ class TokenVectorEncoder(BaseThincComponent): 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): @@ -270,8 +270,7 @@ class TokenVectorEncoder(BaseThincComponent): """ 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): @@ -285,9 +284,8 @@ class TokenVectorEncoder(BaseThincComponent): 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() + self.model = self.Model(**self.cfg) class NeuralTagger(BaseThincComponent): @@ -394,12 +392,14 @@ class NeuralTagger(BaseThincComponent): 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.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width): - return build_tagger_model(n_tags, token_vector_width) - + def Model(cls, n_tags, token_vector_width, pretrained_dims=0): + return build_tagger_model(n_tags, token_vector_width, + pretrained_dims) + def use_params(self, params): with self.model.use_params(params): yield @@ -419,7 +419,8 @@ class NeuralTagger(BaseThincComponent): if self.model is True: 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, token_vector_width) + self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + pretrained_dims=self.vocab.vectors_length) self.model.from_bytes(b) def load_tag_map(b): @@ -428,7 +429,7 @@ class NeuralTagger(BaseThincComponent): 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), @@ -454,7 +455,8 @@ class NeuralTagger(BaseThincComponent): if self.model is True: 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, token_vector_width) + self.model = self.Model(self.vocab.morphology.n_tags, token_vector_width, + pretrained_dims=self.vocab.vectors_length) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -503,12 +505,14 @@ class NeuralLabeller(NeuralTagger): self.labels[dep] = len(self.labels) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width) + self.model = self.Model(len(self.labels), token_vector_width, + pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width): - return build_tagger_model(n_tags, token_vector_width) - + def Model(cls, n_tags, token_vector_width, pretrained_dims=0): + return build_tagger_model(n_tags, token_vector_width, + pretrained_dims) + def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) cdef int idx = 0 @@ -653,6 +657,7 @@ class TextCategorizer(BaseThincComponent): else: token_vector_width = 64 if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(len(self.labels), token_vector_width, **self.cfg) From e37a50a436643c201a7ecb088325c9b94593fabd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:46:36 -0500 Subject: [PATCH 337/739] Pass documents to tensorizer, not 'features' --- spacy/language.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 66b42ff94..538d12221 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -304,13 +304,12 @@ class Language(object): self._optimizer = Adam(Model.ops, 0.001) sgd = self._optimizer tok2vec = self.pipeline[0] - feats = tok2vec.doc2feats(docs) grads = {} def get_grads(W, dW, key=None): grads[key] = (W, dW) pipes = list(self.pipeline[1:]) random.shuffle(pipes) - tokvecses, bp_tokvecses = tok2vec.model.begin_update(feats, drop=drop) + tokvecses, bp_tokvecses = tok2vec.model.begin_update(docs, drop=drop) all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for proc in pipes: if not hasattr(proc, 'update'): From 8665a77f482a9c607a79cc285949c6cc049bf5f0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:46:57 -0500 Subject: [PATCH 338/739] Fix feature error in NER --- spacy/syntax/_state.pxd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 3da9e5d4c..c4be8cff2 100644 --- a/spacy/syntax/_state.pxd +++ b/spacy/syntax/_state.pxd @@ -101,9 +101,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: From 5ff2491f245c95e8003b84aeeef379cb8ef5676d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 16 Sep 2017 12:47:21 -0500 Subject: [PATCH 339/739] Pass option for pre-trained vectors in parser --- spacy/syntax/nn_parser.pyx | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 1c4107c06..04cf20d12 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -245,7 +245,7 @@ cdef class Parser: parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) embed_size = util.env_opt('embed_size', 4000) tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - preprocess=doc2feats())) + pretrained_dims=cfg.get('pretrained_dims'))) if parser_maxout_pieces == 1: lower = PrecomputableAffine(hidden_width if depth >= 1 else nr_class, nF=cls.nr_feature, @@ -391,9 +391,10 @@ cdef class Parser: if isinstance(tokvecses, np.ndarray): tokvecses = [tokvecses] - tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + else: + tokvecs = self.model[0].ops.flatten(tokvecses) nr_state = len(docs) nr_class = self.moves.n_moves @@ -451,9 +452,10 @@ cdef class Parser: cdef Doc doc cdef int nr_class = self.moves.n_moves cdef StateClass stcls, output - tokvecs = self.model[0].ops.flatten(tokvecses) if USE_FINE_TUNE: tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) + else: + tokvecs = self.model[0].ops.flatten(tokvecses) cuda_stream = get_cuda_stream() state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, cuda_stream, 0.0) @@ -533,6 +535,8 @@ cdef class Parser: if USE_FINE_TUNE: my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs = self.model[0].ops.flatten(my_tokvecs) + else: + tokvecs = self.model[0].ops.flatten(docs_tokvecs[1]) cuda_stream = get_cuda_stream() @@ -603,11 +607,11 @@ cdef class Parser: docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] assert min(lengths) >= 1 - tokvecs = self.model[0].ops.flatten(tokvecs) if USE_FINE_TUNE: my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) tokvecs += self.model[0].ops.flatten(my_tokvecs) - + else: + tokvecs = self.model[0].ops.flatten(tokvecs) states = self.moves.init_batch(docs) for gold in golds: self.moves.preprocess_gold(gold) @@ -775,6 +779,7 @@ cdef class Parser: 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.cfg.update(cfg) @@ -856,9 +861,11 @@ cdef class Parser: 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.moves.n_moves, + 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: From 68f66aebf81eeebef3750a5c881795effb58d7d7 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 16 Sep 2017 20:27:59 +0200 Subject: [PATCH 340/739] Use pkg_resources instead of pip for is_package (resolves #1293) --- requirements.txt | 1 - setup.py | 1 - spacy/util.py | 6 +++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 54c888a11..6298b1982 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,6 @@ 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 diff --git a/setup.py b/setup.py index 535dddd0d..0b0d2cc81 100755 --- a/setup.py +++ b/setup.py @@ -197,7 +197,6 @@ def setup_package(): 'preshed>=1.0.0,<2.0.0', 'thinc>=6.8.1,<6.9.0', 'plac<1.0.0,>=0.9.6', - 'pip>=9.0.0,<10.0.0', 'six', 'pathlib', 'ujson>=1.35', diff --git a/spacy/util.py b/spacy/util.py index 95fcb493d..a55eed2f8 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 @@ -180,9 +180,9 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ - packages = pip.get_installed_distributions() + packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.project_name.replace('-', '_') == name: + if package.replace('-', '_') == name: return True return False From ece30c28a88e55f29a22fbe5f93a9988cec44836 Mon Sep 17 00:00:00 2001 From: ines Date: Sat, 16 Sep 2017 20:40:15 +0200 Subject: [PATCH 341/739] Don't split hyphenated words in German This way, the tokenizer matches the tokenization in German treebanks --- spacy/lang/de/__init__.py | 2 ++ spacy/lang/de/punctuation.py | 20 ++++++++++++++++ .../tests/lang/de/test_prefix_suffix_infix.py | 24 +++++++++---------- spacy/tests/lang/de/test_text.py | 14 +++++------ 4 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 spacy/lang/de/punctuation.py diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py index b8a7580a0..1c64541e6 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 @@ -23,6 +24,7 @@ class GermanDefaults(Language.Defaults): NORM_EXCEPTIONS, BASE_NORMS) tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) + infixes = tuple(TOKENIZER_INFIXES) tag_map = dict(TAG_MAP) stop_words = set(STOP_WORDS) syntax_iterators = dict(SYNTAX_ITERATORS) 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/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', [ From c003c561c34daa216f3a96176bc3e739cff4439a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:46:03 -0500 Subject: [PATCH 342/739] Revert NER action loading change, for model compatibility --- spacy/syntax/ner.pyx | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx index 1a174aba8..d8c748099 100644 --- a/spacy/syntax/ner.pyx +++ b/spacy/syntax/ner.pyx @@ -219,28 +219,28 @@ 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 + #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 From 8f913a74ca4eaa2e36354530bfe8e822b1697777 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:46:36 -0500 Subject: [PATCH 343/739] Fix defaults and args to build_tagger_model --- spacy/_ml.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 14341c407..2f6a36942 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -467,9 +467,8 @@ def getitem(i): return X[i], None return layerize(getitem_fwd) -def build_tagger_model(nr_class, token_vector_width, **cfg): - embed_size = util.env_opt('embed_size', 7500) - pretrained_dims = cfg.get('pretrained_dims', 0) +def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): + embed_size = util.env_opt('embed_size', 4000) with Model.define_operators({'>>': chain, '+': add}): # Input: (doc, tensor) tuples private_tok2vec = Tok2Vec(token_vector_width, embed_size, From 31c2e91c35ae4299f53b2ca411cd6686cc86748c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:46:55 -0500 Subject: [PATCH 344/739] Fix wiring of pre-trained vectors in parser loading --- spacy/syntax/nn_parser.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index bf873f0e2..cf18b6e96 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -825,6 +825,7 @@ 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 = {} From 2b0efc77ae3bd4ab97353b4f55be7ae36e8523ad Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 05:47:34 -0500 Subject: [PATCH 345/739] Fix wiring of pre-trained vectors in parser loading --- spacy/syntax/nn_parser.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index cf18b6e96..532a69b36 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -871,6 +871,7 @@ cdef class Parser: if self.model is True: self.model, cfg = self.Model(self.moves.n_moves, pretrained_dims=self.vocab.vectors_length) + cfg['pretrained_dims'] = self.vocab.vectors_length else: cfg = {} cfg['pretrained_dims'] = self.vocab.vectors_length From 16122f566ea18eb87880e51f6a119d9f28401fdc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:28:53 -0500 Subject: [PATCH 346/739] Fix cpdef enum in attrs.pyx --- spacy/attrs.pxd | 2 +- spacy/attrs.pyx | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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): From 4f38a67a89168309642525ba56f71d692900f577 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:29:14 -0500 Subject: [PATCH 347/739] Make width default to 0 in vectors.pyx --- spacy/vectors.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index b912be80b..346421153 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -23,7 +23,7 @@ cdef class Vectors: cdef public object keys cdef public int i - def __init__(self, strings, data_or_width): + def __init__(self, strings, data_or_width=0): self.strings = StringStore() if isinstance(data_or_width, int): self.data = data = numpy.zeros((len(strings), data_or_width), From 039d609362138bd26d6c53f087a48c0888d9c887 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:29:39 -0500 Subject: [PATCH 348/739] Remove hard-coded default vectors width --- spacy/vocab.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index bf7fb6903..b4a244287 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -65,7 +65,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, 300) + self.vectors = Vectors(self.strings) property lang: def __get__(self): @@ -336,7 +336,7 @@ cdef class Vocab: 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()), From 8f42f8d305787cb74bf7d85ef16c9cd40b948895 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 12:30:16 -0500 Subject: [PATCH 349/739] Remove unused 'preprocess' argument in Tok2Vec' --- spacy/_ml.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2f6a36942..2b9a98fd2 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -226,7 +226,7 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, preprocess=True, pretrained_dims=0): +def Tok2Vec(width, embed_size, pretrained_dims=0): cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') @@ -242,7 +242,7 @@ def Tok2Vec(width, embed_size, preprocess=True, pretrained_dims=0): >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - if pretrained_dims: + if pretrained_dims >= 1: embed = concatenate_lists(trained_vectors, SpacyVectors) else: embed = trained_vectors From c013e5996f3aec8fe6813f1af4386637c29114ec Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 13:13:20 -0500 Subject: [PATCH 350/739] Fix parser test --- spacy/tests/parser/test_neural_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 30a6367c8..29350b30a 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -26,7 +26,7 @@ def arc_eager(vocab): @pytest.fixture def tok2vec(): - return Tok2Vec(8, 100, preprocess=doc2feats()) + return Tok2Vec(8, 100) @pytest.fixture From 2148ae605b193ca1ff9859a5fc717989b6613034 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 17 Sep 2017 17:36:04 -0500 Subject: [PATCH 351/739] Dont use iterated convolutions --- spacy/_ml.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2b9a98fd2..ce818c8e1 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -252,11 +252,8 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): embed >> with_flatten( Affine(width, width+pretrained_dims) - >> convolution - >> convolution - >> convolution - >> convolution, - pad=1) + >> convolution ** 4, + pad=4) ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width From 2480f8f521ea22b74ff90aed0853e9c0e2543b1b Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 18 Sep 2017 15:31:57 +0200 Subject: [PATCH 352/739] Add missing return in Doc.from_disk() (closes #1330) --- spacy/tokens/doc.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx index 3b1f38b68..fcb5a16fa 100644 --- a/spacy/tokens/doc.pyx +++ b/spacy/tokens/doc.pyx @@ -660,7 +660,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. From 7b3f391f80a8c30b815cd202f5340933280120d5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 11:35:59 -0500 Subject: [PATCH 353/739] Try dropping the Affine layer, conditionally --- spacy/_ml.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index ce818c8e1..dde78af8a 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -251,7 +251,8 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): tok2vec = ( embed >> with_flatten( - Affine(width, width+pretrained_dims) + (Affine(width, width+pretrained_dims) + if pretrained_dims else noop()) >> convolution ** 4, pad=4) ) From 3fa76c17d19b49162652976207e030e484888f02 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 15:00:05 -0500 Subject: [PATCH 354/739] Refactor Tok2Vec --- spacy/_ml.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index dde78af8a..d79d6e39b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -242,20 +242,24 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - if pretrained_dims >= 1: - embed = concatenate_lists(trained_vectors, SpacyVectors) - else: - embed = trained_vectors convolution = Residual(ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=3))) - tok2vec = ( - embed - >> with_flatten( - (Affine(width, width+pretrained_dims) - if pretrained_dims else noop()) - >> convolution ** 4, - pad=4) - ) + if pretrained_dims >= 1: + embed = concatenate_lists(trained_vectors, SpacyVectors) + tok2vec = ( + embed + >> with_flatten( + Affine(width, width+pretrained_dims) + >> convolution ** 4, + pad=4) + ) + else: + embed = trained_vectors + tok2vec = ( + embed + >> with_flatten(convolution ** 4, pad=4) + ) + # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width tok2vec.embed = embed From c858927271b8e28e587c067e53b3d3b66c2e1559 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 18:04:16 -0500 Subject: [PATCH 355/739] Copy vectors to GPU on begin training --- spacy/language.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/language.py b/spacy/language.py index 2a5558824..25648ed42 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -364,6 +364,9 @@ class Language(object): device.use() Model.ops = CupyOps() Model.Ops = CupyOps + 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: From a0c4b33d0354fa841c93293de248bf6cf294e80d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 18:04:47 -0500 Subject: [PATCH 356/739] Support resuming a model during spacy train --- spacy/cli/train.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 7ad94ce9c..8a3446cfe 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -53,7 +53,6 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, if dev_path and not dev_path.exists(): prints(dev_path, title="Development data not found", exits=1) - lang_class = util.get_lang_class(lang) pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] if no_tagger and 'tags' in pipeline: pipeline.remove('tags') @@ -71,22 +70,22 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, util.env_opt('batch_to', 64), util.env_opt('batch_compound', 1.001)) - if resume: - prints(output_path / 'model9.pickle', title="Resuming training") - nlp = dill.load((output_path / 'model9.pickle').open('rb')) - else: + if not resume: + lang_class = util.get_lang_class(lang) nlp = lang_class(pipeline=pipeline) + else: + print("Load resume") + nlp = _resume_model(lang, pipeline) + lang_class = nlp.__class__ + corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() - 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 %") try: 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, noise_level=0.0, gold_preproc=gold_preproc, max_length=0) @@ -120,6 +119,17 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, dill.dump(nlp, file_, -1) +def _resume_model(lang, pipeline): + nlp = util.load_model(lang) + pipes = {getattr(pipe, 'name', None) for pipe in nlp.pipeline} + for name in pipeline: + if name not in pipes: + factory = nlp.Defaults.factories[name] + nlp.pipeline.extend(factory(nlp)) + nlp.meta['pipeline'] = pipeline + return nlp + + def _render_parses(i, to_render): to_render[0].user_data['title'] = "Batch %d" % i with Path('/tmp/entities.html').open('w') as file_: From 40837b275d9ed028bbdbe10ecaeb7af5d395f8eb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 18 Sep 2017 18:05:38 -0500 Subject: [PATCH 357/739] Fix tensorizer with pretrained vectors --- spacy/pipeline.pyx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 4643b759a..824b6932d 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -285,7 +285,9 @@ class TokenVectorEncoder(BaseThincComponent): pipeline (list): The pipeline the model is part of. """ if self.model is True: - self.model = self.Model(**self.cfg) + self.model = self.Model( + pretrained_dims=self.vocab.vectors_length, + **self.cfg) class NeuralTagger(BaseThincComponent): From 2489dcaccf6fe4551a05804d982408d2899ce70f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 19 Sep 2017 23:42:12 +0200 Subject: [PATCH 358/739] Fix serialization of parser --- spacy/syntax/nn_parser.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 532a69b36..52e677390 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -307,6 +307,8 @@ cdef class Parser: 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] self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): From b36a38f63dda5e229212e8c10521e7f21fe418fd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 19 Sep 2017 23:42:27 +0200 Subject: [PATCH 359/739] Fix serialization of pretrained_dims property --- spacy/pipeline.pyx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 824b6932d..29670c155 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -214,6 +214,7 @@ class TokenVectorEncoder(BaseThincComponent): self.vocab = vocab self.model = model self.cfg = dict(cfg) + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -458,7 +459,7 @@ class NeuralTagger(BaseThincComponent): 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, token_vector_width, - pretrained_dims=self.vocab.vectors_length) + **self.cfg) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -470,10 +471,10 @@ class NeuralTagger(BaseThincComponent): 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), - ('cfg', lambda p: self.cfg.update(_load_cfg(p))) )) util.from_disk(path, deserialize, exclude) return self From 78301b2d29fe0c37fb05d98b3cf141cc3d6b060a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 00:19:34 +0200 Subject: [PATCH 360/739] Avoid comparison to None in Tok2Vec --- spacy/_ml.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index d79d6e39b..eaf72b44f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -227,6 +227,8 @@ def drop_layer(layer, factor=2.): def Tok2Vec(width, embed_size, pretrained_dims=0): + if pretrained_dims is None: + pretrained_dims = 0 cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') From 828cc91545458613dff701e804eaec442423e739 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 21:54:31 +0200 Subject: [PATCH 361/739] Fix PhraseMatcher for spaCy 2 --- spacy/matcher.pyx | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index c75d23957..d321218b8 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -426,7 +426,7 @@ cdef class PhraseMatcher: 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: @@ -435,7 +435,7 @@ cdef class PhraseMatcher: 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) def add(self, Doc tokens): cdef int length = tokens.length @@ -454,22 +454,19 @@ cdef class PhraseMatcher: self.phrase_ids[key] = True 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) - return matches + matches = self.matcher(doc) + accepted = [] + for ent_id, start, end in matches: + if self.accept_match(doc, ent_id, start, end): + accepted.append((ent_id, start, end)) + return accepted def pipe(self, stream, batch_size=1000, n_threads=2): for doc in stream: 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, attr_t ent_id, int start, int end): assert (end - start) < self.max_length cdef int i, j for i in range(self.max_length): @@ -478,6 +475,6 @@ cdef class PhraseMatcher: 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) + return True else: return False From 43ad250dd5c4a9731acf648a40b8218fc677df81 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 21:54:49 +0200 Subject: [PATCH 362/739] Update matcher tests --- spacy/tests/test_matcher.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py index 388aab03e..651707019 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,7 +98,6 @@ def test_matcher_match_multi(matcher): (doc.vocab.strings['Java'], 5, 6)] -@pytest.mark.xfail def test_matcher_phrase_matcher(en_vocab): words = ["Google", "Now"] doc = get_doc(en_vocab, words) From cc408fc1898b7693a3130483e51119e9d78d0693 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:20:35 +0200 Subject: [PATCH 363/739] Make PhraseMatcher API like Matcher API --- spacy/matcher.pyx | 72 ++++++++++++++++++++++--------------- spacy/tests/test_matcher.py | 3 +- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index d321218b8..ba3559966 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -421,52 +421,67 @@ 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 + + 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.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', 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 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[phrase_hash] = ent_id def __call__(self, Doc doc): - matches = self.matcher(doc) - accepted = [] - for ent_id, start, end in matches: - if self.accept_match(doc, ent_id, start, end): - accepted.append((ent_id, start, end)) - return accepted + matches = [] + 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): for doc in stream: self(doc) yield doc - def accept_match(self, Doc doc, attr_t ent_id, 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): @@ -474,7 +489,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 True + ent_id = self.phrase_ids.get(key) + if ent_id == 0: + return None else: - return False + return ent_id diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py index 651707019..1b9f92519 100644 --- a/spacy/tests/test_matcher.py +++ b/spacy/tests/test_matcher.py @@ -101,7 +101,8 @@ def test_matcher_match_multi(matcher): 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 From 0c93c73e496f9c57da523393e33a6f88aa3eac25 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:26:40 +0200 Subject: [PATCH 364/739] Add __reduce__ method for PhraseMatcher --- spacy/matcher.pyx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index ba3559966..ef4044d21 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -422,6 +422,7 @@ cdef class PhraseMatcher: cdef attr_t* _phrase_key cdef public object _callbacks + cdef public object _patterns def __init__(self, Vocab vocab, max_length=10): self.mem = Pool() @@ -436,6 +437,9 @@ cdef class PhraseMatcher: self.matcher.add('Candidate', None, *abstract_patterns) self._callbacks = {} + def __reduce__(self): + return (self.__class__, (self.vocab,), None, None) + def add(self, key, on_match, *docs): cdef Doc doc for doc in docs: From 01858e9b5972a8c1dec86f88eef3f17fea63cdc6 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:51:41 +0200 Subject: [PATCH 365/739] Fix PhraseMatcher example --- examples/multi_word_matches.py | 74 +++++++++++++++++----------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/examples/multi_word_matches.py b/examples/multi_word_matches.py index 73f48bf42..ca9b0cc92 100644 --- a/examples/multi_word_matches.py +++ b/examples/multi_word_matches.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: From f92ab03dc87711ca03cd4a29a886bc1c827b0934 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 22:51:58 +0200 Subject: [PATCH 366/739] Rename phrase matcher example --- examples/{multi_word_matches.py => phrase_matcher.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{multi_word_matches.py => phrase_matcher.py} (100%) diff --git a/examples/multi_word_matches.py b/examples/phrase_matcher.py similarity index 100% rename from examples/multi_word_matches.py rename to examples/phrase_matcher.py From 842e21de9f54c3e37e43f698c75a246d69d4551c Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 23:55:30 +0200 Subject: [PATCH 367/739] Fix int type error for Python 2 --- spacy/matcher.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index ef4044d21..5106161a0 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -466,7 +466,7 @@ cdef class PhraseMatcher: self._phrase_key[i] = lexeme.orth phrase_hash = hash64(self._phrase_key, self.max_length * sizeof(attr_t), 0) - self.phrase_ids[phrase_hash] = ent_id + self.phrase_ids.set(phrase_hash, ent_id) def __call__(self, Doc doc): matches = [] From f5144f04be1e5b6d7bb937611f1303ec39054f99 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:14:41 -0500 Subject: [PATCH 368/739] Add argument for CNN maxout pieces --- spacy/_ml.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index eaf72b44f..004d9ca73 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -226,9 +226,9 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, pretrained_dims=0): - if pretrained_dims is None: - pretrained_dims = 0 +def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): + assert pretrained_dims is not None + cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3) cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): norm = HashEmbed(width, embed_size, column=cols.index(NORM), name='embed_norm') @@ -244,7 +244,10 @@ def Tok2Vec(width, embed_size, pretrained_dims=0): >> LN(Maxout(width, width*4, pieces=3)), column=5) ) ) - convolution = Residual(ExtractWindow(nW=1) >> LN(Maxout(width, width*3, pieces=3))) + convolution = Residual( + ExtractWindow(nW=1) + >> LN(Maxout(width, width*3, pieces=cnn_maxout_pieces)) + ) if pretrained_dims >= 1: embed = concatenate_lists(trained_vectors, SpacyVectors) From b832f89ff8cd7c959c6645ad71aed1f9c65617b2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:15:20 -0500 Subject: [PATCH 369/739] Add resume_training function --- spacy/language.py | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 25648ed42..9d1538a18 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -342,7 +342,28 @@ class Language(object): 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. @@ -353,17 +374,14 @@ class Language(object): 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) From 24e85c20484336cfe386bd97e8c3e2e097a315a3 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:15:49 -0500 Subject: [PATCH 370/739] Pass values for CNN maxout pieces option --- spacy/pipeline.pyx | 8 +++++--- spacy/syntax/nn_parser.pyx | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 29670c155..dcc06cdf7 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -215,6 +215,7 @@ class TokenVectorEncoder(BaseThincComponent): self.model = model self.cfg = dict(cfg) self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + self.cfg.setdefault('cnn_maxout_pieces', 2) def __call__(self, doc): """Add context-sensitive vectors to a `Doc`, e.g. from a CNN or LSTM @@ -286,9 +287,7 @@ class TokenVectorEncoder(BaseThincComponent): pipeline (list): The pipeline the model is part of. """ if self.model is True: - self.model = self.Model( - pretrained_dims=self.vocab.vectors_length, - **self.cfg) + self.model = self.Model(**self.cfg) class NeuralTagger(BaseThincComponent): @@ -297,6 +296,7 @@ class NeuralTagger(BaseThincComponent): self.vocab = vocab self.model = model self.cfg = dict(cfg) + self.cfg.setdefault('cnn_maxout_pieces', 2) def __call__(self, doc): tags = self.predict(([doc], [doc.tensor])) @@ -442,6 +442,7 @@ class NeuralTagger(BaseThincComponent): 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( @@ -486,6 +487,7 @@ class NeuralLabeller(NeuralTagger): self.vocab = vocab self.model = model self.cfg = dict(cfg) + self.cfg.setdefault('cnn_maxout_pieces', 2) @property def labels(self): diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 52e677390..ad0e35428 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -309,6 +309,7 @@ cdef class Parser: 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', 2) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): From ffda38356a1d51c1bced19c1c1bfdced3756c891 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:16:35 -0500 Subject: [PATCH 371/739] Add util function to enable GPU --- spacy/util.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/spacy/util.py b/spacy/util.py index a55eed2f8..429d9bae5 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -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 @@ -557,3 +558,14 @@ def minify_html(html): RETURNS (unicode): "Minified" HTML. """ return html.strip().replace(' ', '').replace('\n', '') + + +def use_gpu(gpu_id): + import cupy.cuda.device + from thinc.neural.ops import CupyOps + device = cupy.cuda.device.Device(gpu_id) + device.use() + Model.ops = CupyOps() + Model.Ops = CupyOps + return device + From 1d73dec8b12a84dcf3d3c7949fe257b1cc0d011f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 20 Sep 2017 19:17:10 -0500 Subject: [PATCH 372/739] Refactor train script --- spacy/cli/train.py | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 8a3446cfe..f80e285c0 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -8,6 +8,7 @@ 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 @@ -69,18 +70,20 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, batch_sizes = util.compounding(util.env_opt('batch_from', 1), util.env_opt('batch_to', 64), util.env_opt('batch_compound', 1.001)) + corpus = GoldCorpus(train_path, dev_path, limit=n_sents) + n_train_words = corpus.count_train() if not resume: lang_class = util.get_lang_class(lang) nlp = lang_class(pipeline=pipeline) + optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) else: print("Load resume") - nlp = _resume_model(lang, pipeline) + util.use_gpu(use_gpu) + nlp = _resume_model(lang, pipeline, corpus) + optimizer = nlp.resume_training(device=use_gpu) lang_class = nlp.__class__ - corpus = GoldCorpus(train_path, dev_path, limit=n_sents) - n_train_words = corpus.count_train() - 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 %") @@ -101,11 +104,11 @@ 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) - nlp_loaded = lang_class(pipeline=pipeline) - nlp_loaded = nlp_loaded.from_disk(epoch_model_path) - scorer = nlp_loaded.evaluate( + #nlp_loaded = lang_class(pipeline=pipeline) + #nlp_loaded = nlp_loaded.from_disk(epoch_model_path) + scorer = nlp.evaluate( corpus.dev_docs( - nlp_loaded, + nlp, gold_preproc=gold_preproc)) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: @@ -114,19 +117,30 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, print_progress(i, losses, scorer.scores) 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: + pass -def _resume_model(lang, pipeline): +def _resume_model(lang, pipeline, corpus): nlp = util.load_model(lang) pipes = {getattr(pipe, 'name', None) for pipe in nlp.pipeline} for name in pipeline: if name not in pipes: factory = nlp.Defaults.factories[name] - nlp.pipeline.extend(factory(nlp)) + for pipe in factory(nlp): + if hasattr(pipe, 'begin_training'): + pipe.begin_training(corpus.train_tuples, + pipeline=nlp.pipeline) + nlp.pipeline.append(pipe) nlp.meta['pipeline'] = pipeline + if nlp.vocab.vectors.data.shape[1] >= 1: + nlp.vocab.vectors.data = Model.ops.asarray( + nlp.vocab.vectors.data) + return nlp From 20193371f5deb85137b892158465344a6af7fbcb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 21 Sep 2017 14:59:48 +0200 Subject: [PATCH 373/739] Don't share CNN, to reduce complexities --- spacy/_ml.py | 20 ++--- spacy/about.py | 3 +- spacy/cli/train.py | 2 +- spacy/language.py | 21 +---- spacy/pipeline.pyx | 42 +++------ spacy/syntax/_beam_utils.pyx | 4 +- spacy/syntax/nn_parser.pyx | 106 ++++++++--------------- spacy/tests/parser/test_neural_parser.py | 21 ++--- 8 files changed, 69 insertions(+), 150 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 004d9ca73..37bf6335b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -226,8 +226,8 @@ def drop_layer(layer, factor=2.): return model -def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): - assert pretrained_dims is not None +def Tok2Vec(width, embed_size, **kwargs): + pretrained_dims = kwargs.get('pretrained_dims', 0) cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3) cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): @@ -474,20 +474,18 @@ def getitem(i): return X[i], None return layerize(getitem_fwd) + def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): embed_size = util.env_opt('embed_size', 4000) with Model.define_operators({'>>': chain, '+': add}): - # Input: (doc, tensor) tuples - private_tok2vec = Tok2Vec(token_vector_width, embed_size, - pretrained_dims=pretrained_dims) - model = ( - fine_tune(private_tok2vec) - >> with_flatten( - Maxout(token_vector_width, token_vector_width) - >> Softmax(nr_class, token_vector_width) - ) + tok2vec = Tok2Vec(token_vector_width, embed_size, + pretrained_dims=pretrained_dims) + model = with_flatten( + tok2vec + >> Softmax(nr_class, token_vector_width) ) model.nI = None + model.tok2vec = tok2vec return model diff --git a/spacy/about.py b/spacy/about.py index 40444ffd1..0ae019946 100644 --- a/spacy/about.py +++ b/spacy/about.py @@ -3,12 +3,13 @@ # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py __title__ = 'spacy-nightly' -__version__ = '2.0.0a14' +__version__ = '2.0.0a15' __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' __download_url__ = 'https://github.com/explosion/spacy-models/releases/download' diff --git a/spacy/cli/train.py b/spacy/cli/train.py index f80e285c0..c87aabb01 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -55,7 +55,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, prints(dev_path, title="Development data not found", exits=1) - pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] + pipeline = ['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') diff --git a/spacy/language.py b/spacy/language.py index 9d1538a18..a6ab0453f 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -303,31 +303,17 @@ class Language(object): if self._optimizer is None: self._optimizer = Adam(Model.ops, 0.001) sgd = self._optimizer - tok2vec = self.pipeline[0] grads = {} def get_grads(W, dW, key=None): grads[key] = (W, dW) - pipes = list(self.pipeline[1:]) + pipes = list(self.pipeline) random.shuffle(pipes) - tokvecses, bp_tokvecses = tok2vec.model.begin_update(docs, drop=drop) - all_d_tokvecses = [tok2vec.model.ops.allocate(tv.shape) for tv in tokvecses] for proc in pipes: if not hasattr(proc, 'update'): continue - d_tokvecses = proc.update((docs, tokvecses), golds, - drop=drop, sgd=get_grads, losses=losses) - if update_shared and d_tokvecses is not None: - for i, d_tv in enumerate(d_tokvecses): - all_d_tokvecses[i] += d_tv - if update_shared and bp_tokvecses is not None: - bp_tokvecses(all_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, @@ -371,8 +357,6 @@ class Language(object): **cfg: Config parameters. returns: An optimizer """ - if self.parser: - self.pipeline.append(NeuralLabeller(self.vocab)) # Populate vocab if get_gold_tuples is not None: for _, annots_brackets in get_gold_tuples(): @@ -418,7 +402,6 @@ class Language(object): assert len(docs) == len(golds) for doc, gold in zip(docs, golds): scorer.score(doc, gold) - doc.tensor = None return scorer @contextmanager diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index dcc06cdf7..8ad62d696 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -299,27 +299,25 @@ class NeuralTagger(BaseThincComponent): self.cfg.setdefault('cnn_maxout_pieces', 2) def __call__(self, doc): - tags = self.predict(([doc], [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): docs = list(docs) - tokvecs = [d.tensor for d in docs] - tag_ids = self.predict((docs, tokvecs)) + tag_ids = self.predict(docs) self.set_annotations(docs, tag_ids) yield from docs - def predict(self, docs_tokvecs): - scores = self.model(docs_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() - tokvecs = docs_tokvecs[1] 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): @@ -339,20 +337,15 @@ class NeuralTagger(BaseThincComponent): idx += 1 doc.is_tagged = True - def update(self, docs_tokvecs, golds, drop=0., sgd=None, losses=None): + 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. - docs, tokvecs = docs_tokvecs - if self.model.nI is None: - self.model.nI = tokvecs[0].shape[1] - tag_scores, bp_tag_scores = self.model.begin_update(docs_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) - d_tokvecs = bp_tag_scores(d_tag_scores, sgd=sgd) if losses is not None: losses[self.name] += loss - return d_tokvecs def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) @@ -399,9 +392,9 @@ class NeuralTagger(BaseThincComponent): pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0): + def Model(cls, n_tags, token_vector_width, pretrained_dims=0, **cfg): return build_tagger_model(n_tags, token_vector_width, - pretrained_dims) + pretrained_dims, **cfg) def use_params(self, params): with self.model.use_params(params): @@ -573,15 +566,10 @@ class SimilarityHook(BaseThincComponent): 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) - - return d_tensor1s, d_tensor2s + def update(self, doc1_doc2, golds, sgd=None, drop=0.): + sims, bp_sims = self.model.begin_update(doc1_doc2, drop=drop) def begin_training(self, _=tuple(), pipeline=None): """ @@ -636,15 +624,13 @@ class TextCategorizer(BaseThincComponent): for j, label in enumerate(self.labels): doc.cats[label] = float(scores[i, j]) - def update(self, docs_tensors, golds, state=None, drop=0., sgd=None, losses=None): - docs, tensors = docs_tensors + 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) - d_tensors = bp_scores(d_scores, sgd=sgd) + bp_scores(d_scores, sgd=sgd) if losses is not None: losses.setdefault(self.name, 0.0) losses[self.name] += loss - return d_tensors def get_loss(self, docs, golds, scores): truths = numpy.zeros((len(golds), len(self.labels)), dtype='f') diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx index 4d90fe23b..a26900f6b 100644 --- a/spacy/syntax/_beam_utils.pyx +++ b/spacy/syntax/_beam_utils.pyx @@ -147,10 +147,10 @@ def get_token_ids(states, int n_tokens): nr_update = 0 def update_beam(TransitionSystem moves, int nr_feature, int max_steps, - states, tokvecs, golds, + states, golds, state2vec, vec2scores, int width, float density, - sgd=None, losses=None, drop=0.): + losses=None, drop=0.): global nr_update cdef MaxViolation violn nr_update += 1 diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ad0e35428..77f99624a 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -48,7 +48,7 @@ from .. import util from ..util import get_async, get_cuda_stream from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune -from .._ml import Residual, drop_layer +from .._ml import Residual, drop_layer, flatten from ..compat import json_dumps from . import _parse_features @@ -244,8 +244,9 @@ cdef class Parser: hidden_width = util.env_opt('hidden_width', hidden_width) parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2) embed_size = util.env_opt('embed_size', 4000) - tensors = fine_tune(Tok2Vec(token_vector_width, embed_size, - pretrained_dims=cfg.get('pretrained_dims'))) + 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, @@ -277,7 +278,7 @@ cdef class Parser: 'hidden_width': hidden_width, 'maxout_pieces': parser_maxout_pieces } - return (tensors, lower, upper), cfg + return (tok2vec, lower, upper), cfg def __init__(self, Vocab vocab, moves=True, model=True, **cfg): """ @@ -309,7 +310,6 @@ cdef class Parser: 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', 2) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -335,11 +335,11 @@ cdef class Parser: beam_density = self.cfg.get('beam_density', 0.0) cdef Beam beam if beam_width == 1: - states = self.parse_batch([doc], [doc.tensor]) + states = self.parse_batch([doc]) self.set_annotations([doc], states) return doc else: - beam = self.beam_parse([doc], [doc.tensor], + 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) @@ -368,11 +368,10 @@ cdef class Parser: cdef Beam beam for docs in cytoolz.partition_all(batch_size, docs): docs = list(docs) - tokvecs = [doc.tensor for doc in docs] if beam_width == 1: - parse_states = self.parse_batch(docs, tokvecs) + parse_states = self.parse_batch(docs) else: - beams = self.beam_parse(docs, tokvecs, + beams = self.beam_parse(docs, beam_width=beam_width, beam_density=beam_density) parse_states = [] for beam in beams: @@ -380,7 +379,7 @@ cdef class Parser: 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 @@ -391,21 +390,15 @@ cdef class Parser: int nr_class, nr_feat, nr_piece, nr_dim, nr_state if isinstance(docs, Doc): docs = [docs] - if isinstance(tokvecses, np.ndarray): - tokvecses = [tokvecses] - if USE_FINE_TUNE: - tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - else: - 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) @@ -448,19 +441,15 @@ cdef class Parser: next_step.push_back(st) return states - def beam_parse(self, docs, tokvecses, int beam_width=3, float beam_density=0.001): + 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 - if USE_FINE_TUNE: - tokvecs = self.model[0].ops.flatten(self.model[0]((docs, tokvecses))) - else: - tokvecs = self.model[0].ops.flatten(tokvecses) cuda_stream = get_cuda_stream() - state2vec, vec2scores = self.get_batch_model(len(docs), tokvecs, - cuda_stream, 0.0) + (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, + 0.0) beams = [] cdef int offset = 0 cdef int j = 0 @@ -520,30 +509,24 @@ cdef class Parser: 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_tokvecs, golds, + 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 if isinstance(docs, Doc) and isinstance(golds, GoldParse): docs = [docs] golds = [golds] - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs = self.model[0].ops.flatten(my_tokvecs) - else: - tokvecs = self.model[0].ops.flatten(docs_tokvecs[1]) 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, + 0.0) todo = [(s, g) for (s, g) in zip(states, golds) if not s.is_final() and g is not None] if not todo: @@ -587,13 +570,9 @@ cdef class Parser: if n_steps >= max_steps: break self._make_updates(d_tokvecs, - backprops, sgd, cuda_stream) - d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, [len(d) for d in docs]) - if USE_FINE_TUNE: - d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) - return d_tokvecs + bp_tokvecs, backprops, sgd, cuda_stream) - def update_beam(self, docs_tokvecs, golds, width=None, density=None, + 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 @@ -605,26 +584,20 @@ cdef class Parser: density = self.cfg.get('beam_density', 0.0) if losses is not None and self.name not in losses: losses[self.name] = 0. - docs, tokvecs = docs_tokvecs lengths = [len(d) for d in docs] assert min(lengths) >= 1 - if USE_FINE_TUNE: - my_tokvecs, bp_my_tokvecs = self.model[0].begin_update(docs_tokvecs, drop=drop) - tokvecs = self.model[0].ops.flatten(my_tokvecs) - else: - tokvecs = self.model[0].ops.flatten(tokvecs) states = self.moves.init_batch(docs) for gold in golds: self.moves.preprocess_gold(gold) cuda_stream = get_cuda_stream() - 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, 0.0) states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500, - states, tokvecs, golds, + states, golds, state2vec, vec2scores, width, density, - sgd=sgd, drop=drop, losses=losses) + drop=drop, losses=losses) backprop_lower = [] cdef float batch_size = len(docs) for i, d_scores in enumerate(states_d_scores): @@ -642,20 +615,7 @@ cdef class Parser: else: backprop_lower.append((ids, d_vector, bp_vectors)) d_tokvecs = self.model[0].ops.allocate(tokvecs.shape) - self._make_updates(d_tokvecs, backprop_lower, sgd, cuda_stream) - d_tokvecs = self.model[0].ops.unflatten(d_tokvecs, lengths) - if USE_FINE_TUNE: - d_tokvecs = bp_my_tokvecs(d_tokvecs, sgd=sgd) - return d_tokvecs - - def _pad_tokvecs(self, tokvecs): - # Add a vector for missing values at the start of tokvecs - xp = get_array_module(tokvecs) - pad = xp.zeros((1, tokvecs.shape[1]), dtype=tokvecs.dtype) - return xp.vstack((pad, tokvecs)) - - def _unpad_tokvecs(self, d_tokvecs): - return d_tokvecs[1:] + 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 @@ -693,7 +653,7 @@ 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() @@ -704,6 +664,7 @@ cdef class Parser: 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): @@ -713,11 +674,12 @@ 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, + 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=dropout) - return state2vec, upper + return (tokvecs, bp_tokvecs), state2vec, upper nr_feature = 8 diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py index 29350b30a..8747b01ba 100644 --- a/spacy/tests/parser/test_neural_parser.py +++ b/spacy/tests/parser/test_neural_parser.py @@ -61,33 +61,22 @@ def test_predict_doc(parser, tok2vec, model, doc): parser(doc) -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[0].shape == tokvecs[0].shape def optimize(weights, gradient, key=None): weights -= 0.001 * gradient - bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs[0].sum() == 0. + parser.update([doc], [gold], sgd=optimize) -def test_predict_doc_beam(parser, tok2vec, model, doc): - doc.tensor = tok2vec([doc])[0] +def test_predict_doc_beam(parser, model, doc): parser.model = model parser(doc, beam_width=32, beam_density=0.001) - for word in doc: - print(word.text, word.head, word.dep_) -def test_update_doc_beam(parser, tok2vec, model, doc, gold): +def test_update_doc_beam(parser, model, doc, gold): parser.model = model - tokvecs, bp_tokvecs = tok2vec.begin_update([doc]) - d_tokvecs = parser.update_beam(([doc], tokvecs), [gold]) - assert d_tokvecs[0].shape == tokvecs[0].shape def optimize(weights, gradient, key=None): weights -= 0.001 * gradient - bp_tokvecs(d_tokvecs, sgd=optimize) - assert d_tokvecs[0].sum() == 0. + parser.update_beam([doc], [gold], sgd=optimize) From 0a9016cadeb93b33deb711764177127c5f187a09 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 21 Sep 2017 13:06:45 -0500 Subject: [PATCH 374/739] Fix serialization during training --- spacy/cli/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index f80e285c0..801706614 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -104,8 +104,8 @@ 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) - #nlp_loaded = lang_class(pipeline=pipeline) - #nlp_loaded = nlp_loaded.from_disk(epoch_model_path) + nlp_loaded = lang_class(pipeline=pipeline) + nlp_loaded = nlp_loaded.from_disk(epoch_model_path) scorer = nlp.evaluate( corpus.dev_docs( nlp, From 40a4873b70ec6f70f64f961fcb2573d9e2c12817 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 21 Sep 2017 13:07:26 -0500 Subject: [PATCH 375/739] Fix serialization of model options --- spacy/_ml.py | 7 ++++++- spacy/pipeline.pyx | 23 ++++++++--------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 004d9ca73..c139623c1 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -474,8 +474,13 @@ def getitem(i): return X[i], None return layerize(getitem_fwd) -def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): +def build_tagger_model(nr_class, **cfg): embed_size = util.env_opt('embed_size', 4000) + 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}): # Input: (doc, tensor) tuples private_tok2vec = Tok2Vec(token_vector_width, embed_size, diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index dcc06cdf7..3d302a782 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -297,6 +297,7 @@ class NeuralTagger(BaseThincComponent): 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], [doc.tensor])) @@ -393,15 +394,12 @@ class NeuralTagger(BaseThincComponent): 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, - pretrained_dims=self.vocab.vectors_length) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0): - return build_tagger_model(n_tags, token_vector_width, - pretrained_dims) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def use_params(self, params): with self.model.use_params(params): @@ -422,8 +420,7 @@ class NeuralTagger(BaseThincComponent): if self.model is True: 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, token_vector_width, - pretrained_dims=self.vocab.vectors_length) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) self.model.from_bytes(b) def load_tag_map(b): @@ -457,10 +454,7 @@ class NeuralTagger(BaseThincComponent): def from_disk(self, path, **exclude): def load_model(p): if self.model is True: - 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, token_vector_width, - **self.cfg) + self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) self.model.from_bytes(p.open('rb').read()) def load_tag_map(p): @@ -514,9 +508,8 @@ class NeuralLabeller(NeuralTagger): pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0): - return build_tagger_model(n_tags, token_vector_width, - pretrained_dims) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def get_loss(self, docs, golds, scores): scores = self.model.ops.flatten(scores) From a18659630788e40eb7aa3c729160b6fb4da07a09 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 09:37:03 -0500 Subject: [PATCH 376/739] Add 'reapply' combinator, for iterated CNN --- spacy/_ml.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index c139623c1..91640c14a 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -271,6 +271,28 @@ def Tok2Vec(width, embed_size, pretrained_dims=0, **kwargs): 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 From d9124f1aa3cdc6ff13ccda708fbafe9012adcd92 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 09:38:22 -0500 Subject: [PATCH 377/739] Add link_vectors_to_models function --- spacy/_ml.py | 2 ++ spacy/pipeline.pyx | 11 +++++++++-- spacy/syntax/nn_parser.pyx | 7 ++++--- spacy/vocab.pyx | 4 ++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 91640c14a..65ffb42a6 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -4,6 +4,7 @@ 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.neural.util import get_array_module +import thinc.extra.load_nlp import random import cytoolz @@ -31,6 +32,7 @@ from . import util import numpy import io +VECTORS_KEY = 'spacy_pretrained_vectors' @layerize def _flatten_add_lengths(seqs, pad=0, drop=0.): diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 3d302a782..a7ff90174 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -43,6 +43,7 @@ from .compat import json_dumps from .attrs import ID, LOWER, PREFIX, SUFFIX, SHAPE, TAG, DEP, POS 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 @@ -121,6 +122,7 @@ class BaseThincComponent(object): token_vector_width = pipeline[0].model.nO if self.model is True: self.model = self.Model(1, token_vector_width) + link_vectors_to_models(self.vocab) def use_params(self, params): with self.model.use_params(params): @@ -215,7 +217,7 @@ class TokenVectorEncoder(BaseThincComponent): self.model = model self.cfg = dict(cfg) self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] - self.cfg.setdefault('cnn_maxout_pieces', 2) + 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 @@ -288,6 +290,7 @@ class TokenVectorEncoder(BaseThincComponent): """ if self.model is True: self.model = self.Model(**self.cfg) + link_vectors_to_models(self.vocab) class NeuralTagger(BaseThincComponent): @@ -396,6 +399,7 @@ class NeuralTagger(BaseThincComponent): exc=vocab.morphology.exc) if self.model is True: self.model = self.Model(self.vocab.morphology.n_tags, **self.cfg) + link_vectors_to_models(self.vocab) @classmethod def Model(cls, n_tags, **cfg): @@ -504,8 +508,9 @@ class NeuralLabeller(NeuralTagger): self.labels[dep] = len(self.labels) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width, + self.model = self.Model(len(self.labels), token_vector_width=token_vector_width, pretrained_dims=self.vocab.vectors_length) + link_vectors_to_models(self.vocab) @classmethod def Model(cls, n_tags, **cfg): @@ -585,6 +590,7 @@ class SimilarityHook(BaseThincComponent): """ if self.model is True: self.model = self.Model(pipeline[0].model.nO) + link_vectors_to_models(self.vocab) class TextCategorizer(BaseThincComponent): @@ -658,6 +664,7 @@ class TextCategorizer(BaseThincComponent): 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): diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index ad0e35428..010b3771e 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -49,6 +49,7 @@ from ..util import get_async, get_cuda_stream from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts from .._ml import Tok2Vec, doc2feats, rebatch, fine_tune from .._ml import Residual, drop_layer +from .._ml import link_vectors_to_models from ..compat import json_dumps from . import _parse_features @@ -309,7 +310,7 @@ cdef class Parser: 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', 2) + cfg.setdefault('cnn_maxout_pieces', 3) self.cfg = cfg if 'actions' in self.cfg: for action, labels in self.cfg.get('actions', {}).items(): @@ -791,6 +792,7 @@ cdef class Parser: if self.model is True: cfg['pretrained_dims'] = self.vocab.vectors_length self.model, cfg = self.Model(self.moves.n_moves, **cfg) + link_vectors_to_models(self.vocab) self.cfg.update(cfg) def preprocess_gold(self, docs_golds): @@ -872,8 +874,7 @@ cdef class Parser: 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, - pretrained_dims=self.vocab.vectors_length) + self.model, cfg = self.Model(**self.cfg) cfg['pretrained_dims'] = self.vocab.vectors_length else: cfg = {} diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index b4a244287..01e074617 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -27,6 +27,7 @@ from .vectors import Vectors from . import util from . import attrs from . import symbols +from ._ml import link_vectors_to_models cdef class Vocab: @@ -323,6 +324,7 @@ cdef class Vocab: 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): @@ -362,6 +364,7 @@ cdef class Vocab: ('vectors', lambda b: serialize_vectors(b)) )) util.from_bytes(bytes_data, setters, exclude) + link_vectors_to_models(self) return self def lexemes_to_bytes(self): @@ -436,6 +439,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 From 980fb6e85482d0325897775be86ef4343f880941 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 09:38:36 -0500 Subject: [PATCH 378/739] Refactor Tok2Vec --- spacy/_ml.py | 59 +++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 65ffb42a6..34f66233d 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -227,45 +227,52 @@ def drop_layer(layer, factor=2.): 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, pretrained_dims=0, **kwargs): - assert pretrained_dims is not None + +def Tok2Vec(width, embed_size, **kwargs): + pretrained_dims = kwargs.get('pretrained_dims', 0) cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3) cols = [ID, NORM, PREFIX, SUFFIX, SHAPE, ORTH] - with Model.define_operators({'>>': chain, '|': concatenate, '**': clone, '+': add}): + 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) + - trained_vectors = ( - FeatureExtracter(cols) - >> with_flatten( - 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 pretrained_dims >= 1: - embed = concatenate_lists(trained_vectors, SpacyVectors) - tok2vec = ( - embed - >> with_flatten( - Affine(width, width+pretrained_dims) - >> convolution ** 4, - pad=4) - ) - else: - embed = trained_vectors - tok2vec = ( - embed - >> with_flatten(convolution ** 4, pad=4) - ) + tok2vec = ( + FeatureExtracter(cols) + >> with_flatten( + embed >> (convolution * 4), pad=4) + ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 tok2vec.nO = width From 05596159bfb8e50e4ecbf0f5841aa709a9a71f5d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 15:33:27 -0500 Subject: [PATCH 379/739] Fix serialization when pre-trained vectors --- spacy/pipeline.pyx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index a7ff90174..f5b2db55a 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -145,8 +145,8 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda b: self.cfg.update(ujson.loads(b))), - ('model', load_model), ('vocab', lambda b: self.vocab.from_bytes(b)) + ('model', load_model), )) util.from_bytes(bytes_data, deserialize, exclude) return self @@ -154,8 +154,8 @@ class BaseThincComponent(object): def to_disk(self, path, **exclude): serialize = OrderedDict(( ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), + ('vocab', lambda p: self.vocab.to_disk(p)), ('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) @@ -168,8 +168,8 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda p: self.cfg.update(_load_cfg(p))), - ('model', load_model), ('vocab', lambda p: self.vocab.from_disk(p)), + ('model', load_model), )) util.from_disk(path, deserialize, exclude) return self @@ -289,6 +289,7 @@ class TokenVectorEncoder(BaseThincComponent): pipeline (list): The pipeline the model is part of. """ if self.model is True: + self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(**self.cfg) link_vectors_to_models(self.vocab) @@ -398,6 +399,7 @@ class NeuralTagger(BaseThincComponent): vocab.morphology.lemmatizer, exc=vocab.morphology.exc) if self.model is True: + 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) @@ -486,6 +488,7 @@ class NeuralLabeller(NeuralTagger): 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]) @property def labels(self): @@ -508,8 +511,8 @@ class NeuralLabeller(NeuralTagger): self.labels[dep] = len(self.labels) token_vector_width = pipeline[0].model.nO if self.model is True: - self.model = self.Model(len(self.labels), token_vector_width=token_vector_width, - pretrained_dims=self.vocab.vectors_length) + self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] + self.model = self.Model(len(self.labels), **self.cfg) link_vectors_to_models(self.vocab) @classmethod From a2357cce3fdf38382fcce783b13132f4d473ddfd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:57:31 +0200 Subject: [PATCH 380/739] Set random seed in train script --- spacy/cli/train.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index c87aabb01..3551c4f2c 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -11,6 +11,8 @@ 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 @@ -21,6 +23,9 @@ from .. import util from .. import displacy from ..compat import json_dumps +random.seed(0) +numpy.random.seed(0) + @plac.annotations( lang=("model language", "positional", None, str), From 386c1a5bd886f43bfc9b6ce2482deb948b6b0ccc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:58:06 +0200 Subject: [PATCH 381/739] Fix tagger training --- spacy/pipeline.pyx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 8ad62d696..5ab70f2dd 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -343,6 +343,7 @@ class NeuralTagger(BaseThincComponent): 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) if losses is not None: losses[self.name] += loss @@ -386,15 +387,13 @@ class NeuralTagger(BaseThincComponent): 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.model = self.Model(self.vocab.morphology.n_tags, pretrained_dims=self.vocab.vectors_length) @classmethod - def Model(cls, n_tags, token_vector_width, pretrained_dims=0, **cfg): - return build_tagger_model(n_tags, token_vector_width, - pretrained_dims, **cfg) + def Model(cls, n_tags, **cfg): + return build_tagger_model(n_tags, **cfg) def use_params(self, params): with self.model.use_params(params): From 4bd6a12b1f6c70b4ebdcc06f65e5846ba942b5c4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:58:54 +0200 Subject: [PATCH 382/739] Fix Tok2Vec --- spacy/_ml.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 37bf6335b..74757f502 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -475,14 +475,16 @@ def getitem(i): return layerize(getitem_fwd) -def build_tagger_model(nr_class, token_vector_width, pretrained_dims=0, **cfg): +def build_tagger_model(nr_class, pretrained_dims=0, **cfg): embed_size = util.env_opt('embed_size', 4000) + if 'token_vector_width' not in cfg: + token_vector_width = util.env_opt('token_vector_width', 128) with Model.define_operators({'>>': chain, '+': add}): tok2vec = Tok2Vec(token_vector_width, embed_size, pretrained_dims=pretrained_dims) - model = with_flatten( + model = ( tok2vec - >> Softmax(nr_class, token_vector_width) + >> with_flatten(Softmax(nr_class, token_vector_width)) ) model.nI = None model.tok2vec = tok2vec From 0795857dcbb1f224e7ac3f45208ba1520730a82a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 02:59:18 +0200 Subject: [PATCH 383/739] Fix beam parsing --- spacy/syntax/nn_parser.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 77f99624a..a56ed35a8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -370,6 +370,7 @@ cdef class Parser: docs = list(docs) 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) From e93d43a43a03ed207a7d9efe5817adb0afb0ef82 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 20:00:40 -0500 Subject: [PATCH 384/739] Fix training with preset vectors --- spacy/cli/train.py | 45 ++++++++++----------------------------------- 1 file changed, 10 insertions(+), 35 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 801706614..96233406d 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -30,14 +30,14 @@ 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), gold_preproc=("Use gold preprocessing", "flag", "G", bool), ) 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, + use_gpu=-1, vectors=None, no_tagger=False, no_parser=False, no_entities=False, gold_preproc=False): """ Train a model. Expects data in spaCy's JSON format. @@ -73,25 +73,20 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() - if not resume: - lang_class = util.get_lang_class(lang) - nlp = lang_class(pipeline=pipeline) - optimizer = nlp.begin_training(lambda: corpus.train_tuples, device=use_gpu) - else: - print("Load resume") - util.use_gpu(use_gpu) - nlp = _resume_model(lang, pipeline, corpus) - optimizer = nlp.resume_training(device=use_gpu) - lang_class = nlp.__class__ - + lang_class = util.get_lang_class(lang) + nlp = lang_class(pipeline=pipeline) + if vectors: + util.load_model(vectors, vocab=nlp.vocab) + 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 %") 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): with tqdm.tqdm(total=n_train_words, leave=False) as pbar: - train_docs = corpus.train_docs(nlp, projectivize=True, noise_level=0.0, - gold_preproc=gold_preproc, max_length=0) losses = {} for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) @@ -124,26 +119,6 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, except: pass - -def _resume_model(lang, pipeline, corpus): - nlp = util.load_model(lang) - pipes = {getattr(pipe, 'name', None) for pipe in nlp.pipeline} - for name in pipeline: - if name not in pipes: - factory = nlp.Defaults.factories[name] - for pipe in factory(nlp): - if hasattr(pipe, 'begin_training'): - pipe.begin_training(corpus.train_tuples, - pipeline=nlp.pipeline) - nlp.pipeline.append(pipe) - nlp.meta['pipeline'] = pipeline - if nlp.vocab.vectors.data.shape[1] >= 1: - nlp.vocab.vectors.data = Model.ops.asarray( - nlp.vocab.vectors.data) - - return nlp - - def _render_parses(i, to_render): to_render[0].user_data['title'] = "Batch %d" % i with Path('/tmp/entities.html').open('w') as file_: From 7dc61b3f439c436ae4ca69ae0d9a2d14dda65723 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 20:00:50 -0500 Subject: [PATCH 385/739] Whitespace --- spacy/language.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index 9d1538a18..130d7989d 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -362,7 +362,6 @@ class Language(object): 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. From 5a7fd0fd3683fb5949f11e81109853020113ca1e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Fri, 22 Sep 2017 20:11:52 -0500 Subject: [PATCH 386/739] Fix vector linkage --- spacy/language.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/language.py b/spacy/language.py index d63d4d163..edf0a4b5c 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -34,6 +34,7 @@ from .lang.tag_map import TAG_MAP from .lang.lex_attrs import LEX_ATTRS from . import util from .scorer import Scorer +from ._ml import link_vectors_to_models class BaseDefaults(object): @@ -370,6 +371,7 @@ class Language(object): self.vocab.vectors.data) else: device = None + link_vectors_to_models(self.vocab) for proc in self.pipeline: if hasattr(proc, 'begin_training'): context = proc.begin_training(get_gold_tuples(), From 63bd87508d12ca3a55d6ab05834cf8e69cc5e21e Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sat, 23 Sep 2017 04:39:17 -0500 Subject: [PATCH 387/739] Don't use iterated convolutions --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 7cdf9c68b..3bb76c268 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -270,7 +270,7 @@ def Tok2Vec(width, embed_size, **kwargs): tok2vec = ( FeatureExtracter(cols) >> with_flatten( - embed >> (convolution * 4), pad=4) + embed >> (convolution ** 4), pad=4) ) # Work around thinc API limitations :(. TODO: Revise in Thinc 7 From dc3a623d0008c1362a2f26369f777b5ceef8958b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:00:37 -0500 Subject: [PATCH 388/739] Remove unused update_shared argument --- spacy/cli/train.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 777121616..055cccab0 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -96,8 +96,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, for batch in minibatch(train_docs, size=batch_sizes): docs, golds = zip(*batch) nlp.update(docs, golds, sgd=optimizer, - drop=next(dropout_rates), losses=losses, - update_shared=True) + drop=next(dropout_rates), losses=losses) pbar.update(sum(len(doc) for doc in docs)) with nlp.use_params(optimizer.averages): From 204b58c86491fa9f3cbddadf026c9a49e57b521a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:01:03 -0500 Subject: [PATCH 389/739] Fix evaluation during training --- spacy/cli/train.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 055cccab0..d9c345b97 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -105,10 +105,10 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, nlp.to_disk(epoch_model_path) nlp_loaded = lang_class(pipeline=pipeline) nlp_loaded = nlp_loaded.from_disk(epoch_model_path) - scorer = nlp.evaluate( - corpus.dev_docs( - nlp, - gold_preproc=gold_preproc)) + scorer = nlp_loaded.evaluate( + list(corpus.dev_docs( + nlp_loaded, + gold_preproc=gold_preproc))) acc_loc =(output_path / ('model%d' % i) / 'accuracy.json') with acc_loc.open('w') as file_: file_.write(json_dumps(scorer.scores)) From 72bbcc0871568fc6944a45e1aa4907735c743453 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:01:31 -0500 Subject: [PATCH 390/739] Handle lemmatization for unknown string IDs --- spacy/morphology.pyx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx index 13a0ed8e3..5ee11c151 100644 --- a/spacy/morphology.pyx +++ b/spacy/morphology.pyx @@ -146,6 +146,8 @@ 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()) From 8716ffe57d71cd0cd8d1e34b0417006e588ae478 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 24 Sep 2017 05:01:45 -0500 Subject: [PATCH 391/739] Serialize vocab last --- spacy/language.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/language.py b/spacy/language.py index edf0a4b5c..502430368 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -491,7 +491,6 @@ 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))) )) @@ -503,6 +502,7 @@ class Language(object): if not hasattr(proc, 'to_disk'): continue serializers[proc.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()): From 39f390dba7e4a5e7ac224b27731e8c463cb92f7d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 25 Sep 2017 16:20:49 +0200 Subject: [PATCH 392/739] Add docstrings for Pipe API --- spacy/pipeline.pyx | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index dcc06cdf7..fef925d85 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -88,17 +88,30 @@ class BaseThincComponent(object): @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) @@ -106,27 +119,42 @@ class BaseThincComponent(object): 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_tensors, golds, state=None, drop=0., sgd=None, losses=None): + 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): - token_vector_width = pipeline[0].model.nO + '''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(1, token_vector_width) + self.model = self.Model(**self.cfg) 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(( ('cfg', lambda: json_dumps(self.cfg)), ('model', lambda: self.model.to_bytes()), @@ -135,6 +163,7 @@ class BaseThincComponent(object): 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 @@ -150,6 +179,7 @@ class BaseThincComponent(object): return self def to_disk(self, path, **exclude): + '''Serialize the pipe to disk.''' serialize = OrderedDict(( ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), ('model', lambda p: p.open('wb').write(self.model.to_bytes())), @@ -158,6 +188,7 @@ class BaseThincComponent(object): 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 From d2d35b63b770c74f80e560fbb2efc5491064608c Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 25 Sep 2017 18:37:13 +0200 Subject: [PATCH 393/739] Fix formatting --- spacy/pipeline.pyx | 50 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index f660f88a6..90ff1ad88 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -48,7 +48,7 @@ from .parts_of_speech import X class SentenceSegmenter(object): - '''A simple spaCy hook, to allow custom sentence boundary detection logic + """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 @@ -57,7 +57,7 @@ class SentenceSegmenter(object): 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): @@ -89,30 +89,30 @@ class BaseThincComponent(object): @classmethod def Model(cls, *shape, **kwargs): - '''Initialize a model for the pipe.''' + """Initialize a model for the pipe.""" raise NotImplementedError def __init__(self, vocab, model=True, **cfg): - '''Create a new pipe instance.''' + """Create a new pipe instance.""" raise NotImplementedError def __call__(self, doc): - '''Apply the pipe to one document. The document is + """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. + """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) @@ -120,43 +120,43 @@ class BaseThincComponent(object): yield from docs def predict(self, docs): - '''Apply the pipeline's model to a batch of docs, without + """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.''' + """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, + """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.''' + """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.''' + """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. - ''' + """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 the pipe to a bytestring.""" serialize = OrderedDict(( ('cfg', lambda: json_dumps(self.cfg)), ('model', lambda: self.model.to_bytes()), @@ -165,7 +165,7 @@ class BaseThincComponent(object): return util.to_bytes(serialize, exclude) def from_bytes(self, bytes_data, **exclude): - '''Load the pipe from a bytestring.''' + """Load the pipe from a bytestring.""" def load_model(b): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length @@ -181,7 +181,7 @@ class BaseThincComponent(object): return self def to_disk(self, path, **exclude): - '''Serialize the pipe to disk.''' + """Serialize the pipe to disk.""" serialize = OrderedDict(( ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))), ('vocab', lambda p: self.vocab.to_disk(p)), @@ -190,7 +190,7 @@ class BaseThincComponent(object): util.to_disk(path, serialize, exclude) def from_disk(self, path, **exclude): - '''Load the pipe from disk.''' + """Load the pipe from disk.""" def load_model(p): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length @@ -596,7 +596,7 @@ class SimilarityHook(BaseThincComponent): 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 From edf7e4881debb5244e445225a98117f9263d9b0d Mon Sep 17 00:00:00 2001 From: ines Date: Mon, 25 Sep 2017 19:00:47 +0200 Subject: [PATCH 394/739] Add meta.json option to cli.train and add relevant properties Add accuracy scores to meta.json instead of accuracy.json and replace all relevant properties like lang, pipeline, spacy_version in existing meta.json. If not present, also add name and version placeholders to make it packagable. --- spacy/cli/train.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 96233406d..d71523a9c 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -18,6 +18,7 @@ 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 @@ -35,10 +36,11 @@ from ..compat import json_dumps no_parser=("Don't train parser", "flag", "P", bool), no_entities=("Don't train NER", "flag", "N", bool), gold_preproc=("Use gold preprocessing", "flag", "G", bool), + 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, vectors=None, no_tagger=False, no_parser=False, no_entities=False, - gold_preproc=False): + gold_preproc=False, meta_path=None): """ Train a model. Expects data in spaCy's JSON format. """ @@ -47,13 +49,19 @@ 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) pipeline = ['token_vectors', 'tags', 'dependencies', 'entities'] if no_tagger and 'tags' in pipeline: pipeline.remove('tags') @@ -105,9 +113,16 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, corpus.dev_docs( nlp, gold_preproc=gold_preproc)) - 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['lang'] = nlp.lang + meta['pipeline'] = pipeline + meta['spacy_version'] = '>=%s' % about.__version__ + meta.setdefault('name', 'model%d' % i) + meta.setdefault('version', '0.0.0') + + with meta_loc.open('w') as file_: + file_.write(json_dumps(meta)) util.set_env_log(True) print_progress(i, losses, scorer.scores) finally: From 4ae9ea76845ad141f12d5bfa82ed5975830322ca Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 05:41:35 -0500 Subject: [PATCH 395/739] Remove unused argument in Language --- spacy/language.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spacy/language.py b/spacy/language.py index 502430368..701b5c140 100644 --- a/spacy/language.py +++ b/spacy/language.py @@ -279,8 +279,7 @@ class Language(object): def make_doc(self, text): return self.tokenizer(text) - def update(self, docs, golds, drop=0., sgd=None, losses=None, - update_shared=False): + def update(self, docs, golds, drop=0., sgd=None, losses=None): """Update the models in the pipeline. docs (iterable): A batch of `Doc` objects. From bf917225ab123f354ead66f9685558cd52129fff Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 05:42:52 -0500 Subject: [PATCH 396/739] Allow multi-task objectives during training --- spacy/pipeline.pyx | 109 ++++++++++++++++++++++++++++--------- spacy/syntax/nn_parser.pxd | 1 + spacy/syntax/nn_parser.pyx | 16 +++++- 3 files changed, 99 insertions(+), 27 deletions(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index b91ddcc9d..17e9a15de 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -291,7 +291,7 @@ class TokenVectorEncoder(BaseThincComponent): if self.model is True: self.cfg['pretrained_dims'] = self.vocab.vectors_length self.model = self.Model(**self.cfg) - link_vectors_to_models(self.vocab) + link_vectors_to_models(self.vocab) class NeuralTagger(BaseThincComponent): @@ -395,7 +395,7 @@ class NeuralTagger(BaseThincComponent): if self.model is True: 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) + link_vectors_to_models(self.vocab) @classmethod def Model(cls, n_tags, **cfg): @@ -477,9 +477,25 @@ class NeuralTagger(BaseThincComponent): class NeuralLabeller(NeuralTagger): name = 'nn_labeller' - def __init__(self, vocab, model=True, **cfg): + def __init__(self, vocab, model=True, target='dep_tag_offset', **cfg): self.vocab = vocab self.model = model + 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]) @@ -495,43 +511,78 @@ class NeuralLabeller(NeuralTagger): def set_annotations(self, docs, dep_ids): pass - def begin_training(self, gold_tuples=tuple(), 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) + print(len(self.labels)) if self.model is True: - self.cfg['pretrained_dims'] = self.vocab.vectors.data.shape[1] - self.model = self.Model(len(self.labels), **self.cfg) - link_vectors_to_models(self.vocab) + self.model = chain( + tok2vec, + Softmax(len(self.labels), 128) + ) + link_vectors_to_models(self.vocab) @classmethod - def Model(cls, n_tags, **cfg): - return build_tagger_model(n_tags, **cfg) + 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] + + @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): """ @@ -695,6 +746,14 @@ cdef class NeuralDependencyParser(NeuralParser): name = 'parser' TransitionSystem = ArcEager + def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): + for target in ['dep']: + 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) @@ -705,13 +764,13 @@ cdef class NeuralEntityRecognizer(NeuralParser): nr_feature = 6 - def predict_confidences(self, docs): - tensors = [d.tensor for d in docs] - samples = [] - for i in range(10): - states = self.parse_batch(docs, tensors, drop=0.3) - for state in states: - samples.append(self._get_entities(state)) + 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) 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 9d9eda882..988c092af 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -318,6 +318,7 @@ cdef class Parser: 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) @@ -419,7 +420,7 @@ cdef class Parser: cdef int has_hidden = not getattr(vec2scores, 'is_noop', False) while not next_step.empty(): if not has_hidden: - for i in range( + for i in cython.parallel.prange( next_step.size(), num_threads=6, nogil=True): self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) @@ -745,7 +746,7 @@ cdef class Parser: # order, or the model goes out of synch self.cfg.setdefault('extra_labels', []).append(label) - 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) @@ -756,9 +757,20 @@ cdef class Parser: 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 From 02c65155ababfc16d67714fefbe58723cb595f5f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 12:50:31 +0200 Subject: [PATCH 397/739] Try to fix crazy travis error --- travis.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis.sh b/travis.sh index eed6a96f2..78599665c 100755 --- a/travis.sh +++ b/travis.sh @@ -17,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + python setup.py clean --all python setup.py build_ext --inplace pip install -e . fi From e34e70673f163e30a549e44fc9a85cf3673f74c9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 05:51:52 -0500 Subject: [PATCH 398/739] Allow tagger models to be built with pre-defined tok2vec layer --- spacy/_ml.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 3bb76c268..2e95aa55b 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -512,8 +512,11 @@ def build_tagger_model(nr_class, **cfg): token_vector_width = util.env_opt('token_vector_width', 128) pretrained_dims = cfg.get('pretrained_dims', 0) with Model.define_operators({'>>': chain, '+': add}): - tok2vec = Tok2Vec(token_vector_width, embed_size, - pretrained_dims=pretrained_dims) + 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)) From 50ad50f96acdd110cdbd4662ca9878dc33e74cea Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Tue, 26 Sep 2017 13:11:17 +0200 Subject: [PATCH 399/739] Update matcher.pyx --- spacy/matcher.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index 5106161a0..84414c255 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -436,6 +436,9 @@ cdef class PhraseMatcher: abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) self.matcher.add('Candidate', None, *abstract_patterns) self._callbacks = {} + + def __len__(self): + raise NotImplementedError def __reduce__(self): return (self.__class__, (self.vocab,), None, None) From 7123139b2bce61f21bcab3f10f179ec235d9ae67 Mon Sep 17 00:00:00 2001 From: Ines Montani Date: Tue, 26 Sep 2017 13:13:27 +0200 Subject: [PATCH 400/739] Add __contains__ to PhraseMatcher --- spacy/matcher.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index 84414c255..9d7e66835 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -439,6 +439,9 @@ cdef class PhraseMatcher: def __len__(self): raise NotImplementedError + + def __contains__(self): + raise NotImplementedError def __reduce__(self): return (self.__class__, (self.vocab,), None, None) From 5056743ad52f27f58c067abbf21f34e154d60fbd Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:44:56 -0500 Subject: [PATCH 401/739] Fix parser serialization --- spacy/syntax/nn_parser.pyx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 988c092af..a77352212 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 @@ -829,7 +830,7 @@ cdef class Parser: ('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 @@ -842,7 +843,7 @@ 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) From 18a27c7579059617518bd87091e1fbd6a073a543 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:45:14 -0500 Subject: [PATCH 402/739] Fix typo in tensorizer serialization --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 17e9a15de..cd6fc3da6 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -145,7 +145,7 @@ class BaseThincComponent(object): deserialize = OrderedDict(( ('cfg', lambda b: self.cfg.update(ujson.loads(b))), - ('vocab', lambda b: self.vocab.from_bytes(b)) + ('vocab', lambda b: self.vocab.from_bytes(b)), ('model', load_model), )) util.from_bytes(bytes_data, deserialize, exclude) From 5aaef3e7b8b44f3af347aaed269380727823c380 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:45:47 -0500 Subject: [PATCH 403/739] Dont link vectors in vocab deserialize --- spacy/vocab.pyx | 2 -- 1 file changed, 2 deletions(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 01e074617..0a420849c 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -324,7 +324,6 @@ cdef class Vocab: 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): @@ -364,7 +363,6 @@ cdef class Vocab: ('vectors', lambda b: serialize_vectors(b)) )) util.from_bytes(bytes_data, setters, exclude) - link_vectors_to_models(self) return self def lexemes_to_bytes(self): From 74f08e1ad5468ec5cf6545ad0719b736357016d1 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:45:56 -0500 Subject: [PATCH 404/739] Update test --- spacy/tests/serialize/test_serialize_tagger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tests/serialize/test_serialize_tagger.py b/spacy/tests/serialize/test_serialize_tagger.py index 3154687c3..475be1cef 100644 --- a/spacy/tests/serialize/test_serialize_tagger.py +++ b/spacy/tests/serialize/test_serialize_tagger.py @@ -11,7 +11,7 @@ import pytest def taggers(en_vocab): tagger1 = Tagger(en_vocab) tagger2 = Tagger(en_vocab) - tagger1.model = tagger1.Model(8, 8) + tagger1.model = tagger1.Model(8) tagger2.model = tagger1.model return (tagger1, tagger2) From 0196ff85da65e118501688eeee96120740655c0b Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:54:21 -0500 Subject: [PATCH 405/739] Try to fix travis --- travis.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/travis.sh b/travis.sh index eed6a96f2..1940955b4 100755 --- a/travis.sh +++ b/travis.sh @@ -17,6 +17,7 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt + export PYTHONPATH=`pwd` python setup.py build_ext --inplace pip install -e . fi From a181987061d1e1042a21f162cc951219a1e5d485 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 06:55:15 -0500 Subject: [PATCH 406/739] Try to fix appveyor --- .appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 12399a5a1..a379cdd31 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -24,7 +24,6 @@ install: - "%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 setup.py build_ext --inplace" - "%PYTHON%\\python.exe -m pip install -e ." build: off From ddee15cee957956394677b0dbcfa8ec48a76e6e4 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 14:00:25 +0200 Subject: [PATCH 407/739] Try to fix travis --- travis.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/travis.sh b/travis.sh index 78599665c..d1a1b6b29 100755 --- a/travis.sh +++ b/travis.sh @@ -18,7 +18,6 @@ fi if [ "${VIA}" == "compile" ]; then pip install -r requirements.txt python setup.py clean --all - python setup.py build_ext --inplace pip install -e . fi From 8c390e23a2ca8c0b24dece18d2faafcbe8066778 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 14:14:46 +0200 Subject: [PATCH 408/739] Require older Cython --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6298b1982..5d515f7a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -cython>=0.24 +cython>=0.24,<0.27.0 pathlib numpy>=1.7 cymem>=1.30,<1.32 From 9bfd585a11e67e0bc3683de491357044ef66b8f0 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 07:28:50 -0500 Subject: [PATCH 409/739] Fix parameter name in .pxd file --- spacy/tokens/doc.pxd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/tokens/doc.pxd b/spacy/tokens/doc.pxd index d0c83e0f8..ad2b9876d 100644 --- a/spacy/tokens/doc.pxd +++ b/spacy/tokens/doc.pxd @@ -54,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) From ca28590ddd0f1922d14290170c4c7ff8adcadab2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 08:13:52 -0500 Subject: [PATCH 410/739] Use dep and ent multi-task objectives for parser' --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index cd6fc3da6..294440494 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -747,7 +747,7 @@ cdef class NeuralDependencyParser(NeuralParser): TransitionSystem = ArcEager def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): - for target in ['dep']: + for target in ['dep', 'ent']: labeller = NeuralLabeller(self.vocab, target=target) tok2vec = self.model[0] labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) From 698fc0d016c3fde05234ef7125ac56343bd343c9 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 08:31:37 -0500 Subject: [PATCH 411/739] Remove merge artefact --- spacy/cli/train.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 2ed66b1a6..6178ecb3b 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -130,7 +130,6 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, with meta_loc.open('w') as file_: file_.write(json_dumps(meta)) ->>>>>>> origin/develop util.set_env_log(True) print_progress(i, losses, scorer.scores) finally: From 19c7c09bf735c74274cbf6d75a3ca89b248d3865 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 08:35:53 -0500 Subject: [PATCH 412/739] Fix PhraseMatcher.__contains__ --- spacy/matcher.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx index 9d7e66835..3bc6f859c 100644 --- a/spacy/matcher.pyx +++ b/spacy/matcher.pyx @@ -436,11 +436,11 @@ cdef class PhraseMatcher: abstract_patterns.append([{tag: True} for tag in get_bilou(length)]) self.matcher.add('Candidate', None, *abstract_patterns) self._callbacks = {} - + def __len__(self): raise NotImplementedError - - def __contains__(self): + + def __contains__(self, key): raise NotImplementedError def __reduce__(self): From 3274b46a0d3255975178f669c7b5c83f57be48fb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 09:05:53 -0500 Subject: [PATCH 413/739] Try to fix compile error on Windows --- spacy/syntax/nn_parser.pyx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index a77352212..99099cad8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -419,21 +419,23 @@ 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()): + 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) vectors = state2vec(token_ids[:next_step.size()]) 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) From 10d291f129efe94115ccb679e3c52cf9a0292a19 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:11:41 +0200 Subject: [PATCH 414/739] Port over change from #1351 --- spacy/lang/char_classes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index 0698cfd43..46e422df2 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -29,7 +29,7 @@ _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm '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 %') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' -_punct = r'… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' _quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «' _hyphens = '- – — -- ---' _other_symbols = r'[\p{So}]' From 5cba67146cc17f8075dc4010927a220c5353500e Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 21:36:27 +0700 Subject: [PATCH 415/739] add thai in spacy2 --- spacy/lang/th/__init__.py | 36 ++++++++++++ spacy/lang/th/stop_words.py | 62 ++++++++++++++++++++ spacy/lang/th/tag_map.py | 81 +++++++++++++++++++++++++++ spacy/lang/th/tokenizer_exceptions.py | 80 ++++++++++++++++++++++++++ spacy/tests/conftest.py | 6 +- spacy/tests/lang/th/__init__.py | 0 spacy/tests/lang/th/test_tokenizer.py | 13 +++++ 7 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 spacy/lang/th/__init__.py create mode 100644 spacy/lang/th/stop_words.py create mode 100644 spacy/lang/th/tag_map.py create mode 100644 spacy/lang/th/tokenizer_exceptions.py create mode 100644 spacy/tests/lang/th/__init__.py create mode 100644 spacy/tests/lang/th/test_tokenizer.py diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py new file mode 100644 index 000000000..4b52cfa25 --- /dev/null +++ b/spacy/lang/th/__init__.py @@ -0,0 +1,36 @@ +# 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 = TOKENIZER_EXCEPTIONS + tag_map = dict(TAG_MAP) + stop_words = set(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..e225f7289 --- /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} +} \ No newline at end of file diff --git a/spacy/lang/th/tokenizer_exceptions.py b/spacy/lang/th/tokenizer_exceptions.py new file mode 100644 index 000000000..7e3967aed --- /dev/null +++ b/spacy/lang/th/tokenizer_exceptions.py @@ -0,0 +1,80 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from ..symbols import * +from ..language_data import PRON_LEMMA + + +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: "ธันวาคม"} + ] +} + + +# exceptions mapped to a single token containing only ORTH property +# example: {"string": [{ORTH: "string"}]} +# converted using strings_to_exc() util +''' +ORTH_ONLY = [ + "a.", + "b.", + "c.", + "d.", + "e.", + "f.", + "g.", + "h.", + "i.", + "j.", + "k.", + "l.", + "m.", + "n.", + "o.", + "p.", + "q.", + "r.", + "s.", + "t.", + "u.", + "v.", + "w.", + "x.", + "y.", + "z." +] +''' \ No newline at end of file diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index f5d65803a..70c78ab9f 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -12,7 +12,7 @@ from .. import util _languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id', - 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx'] + 'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'th','xx'] _models = {'en': ['en_core_web_sm'], 'de': ['de_core_news_md'], 'fr': ['fr_depvec_web_lg'], @@ -108,6 +108,10 @@ def he_tokenizer(): def nb_tokenizer(): return util.get_lang_class('nb').Defaults.create_tokenizer() +@pytest.fixture +def th_tokenizer(): + return util.get_lang_class('th').Defaults.create_tokenizer() + @pytest.fixture def stringstore(): 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 From 5ee10379db2d567755b48e8cf4881bb2049181b2 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:38:08 +0200 Subject: [PATCH 416/739] Port over changes from #1340 --- spacy/lang/char_classes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py index 46e422df2..b10481411 100644 --- a/spacy/lang/char_classes.py +++ b/spacy/lang/char_classes.py @@ -29,9 +29,9 @@ _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm '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 %') _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$' -_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* &' +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ ·' _quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «' -_hyphens = '- – — -- ---' +_hyphens = '- – — -- --- —— ~' _other_symbols = r'[\p{So}]' UNITS = merge_chars(_units) From adda08fe14479e465668bcf39dcedd238a4be20e Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:39:15 +0200 Subject: [PATCH 417/739] Implement like_num getter for Dutch (via #1177) --- spacy/lang/nl/__init__.py | 2 ++ spacy/lang/nl/lex_attrs.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 spacy/lang/nl/lex_attrs.py diff --git a/spacy/lang/nl/__init__.py b/spacy/lang/nl/__init__.py index 7b948f295..98df8d487 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,6 +13,7 @@ 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) diff --git a/spacy/lang/nl/lex_attrs.py b/spacy/lang/nl/lex_attrs.py new file mode 100644 index 000000000..4a9c0bdc3 --- /dev/null +++ b/spacy/lang/nl/lex_attrs.py @@ -0,0 +1,36 @@ +# 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): + 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 +} From 15479b3baea8d0f5cb58bf7d22321646ac4513bc Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:43:28 +0200 Subject: [PATCH 418/739] Add comment to like_num re: future work --- spacy/lang/nl/lex_attrs.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spacy/lang/nl/lex_attrs.py b/spacy/lang/nl/lex_attrs.py index 4a9c0bdc3..08b1df3be 100644 --- a/spacy/lang/nl/lex_attrs.py +++ b/spacy/lang/nl/lex_attrs.py @@ -19,6 +19,10 @@ miljardste biljoenste biljardste triljoenste triljardste 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 From bb5c6314029cc598b667542579fad347044422e9 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:47:45 +0200 Subject: [PATCH 419/739] Implement like_num getter for French (via #1161) --- spacy/lang/fr/__init__.py | 2 ++ spacy/lang/fr/lex_attrs.py | 41 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 spacy/lang/fr/lex_attrs.py diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py index a243b6268..06dcf2d45 100644 --- a/spacy/lang/fr/__init__.py +++ b/spacy/lang/fr/__init__.py @@ -4,6 +4,7 @@ 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 @@ -17,6 +18,7 @@ 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) 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 +} From a2bf4cc7bff9508a6bbc3d97aeffaf815f50b662 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 21:49:43 +0700 Subject: [PATCH 420/739] fix newline in file --- spacy/lang/th/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py index 4b52cfa25..368fb9ae5 100644 --- a/spacy/lang/th/__init__.py +++ b/spacy/lang/th/__init__.py @@ -12,7 +12,6 @@ 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' From 665cdab58d7d0308054646c11bbe5c7d8eb54964 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 16:51:52 +0200 Subject: [PATCH 421/739] Port over change from #1126 --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 5d515f7a1..225d1fb31 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,3 +16,4 @@ pytest>=3.0.6,<4.0.0 mock>=2.0.0,<3.0.0 msgpack-python msgpack-numpy +html5lib==1.0b8 From b49cc8153a1672ad5bdc275e71e9ef15d633956f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 26 Sep 2017 10:00:18 -0500 Subject: [PATCH 422/739] Require correct thinc --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 225d1fb31..7fa5d72d3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ pathlib numpy>=1.7 cymem>=1.30,<1.32 preshed>=1.0.0,<2.0.0 -thinc>=6.8.1,<6.9.0 +thinc>=6.8.2,<6.9.0 murmurhash>=0.28,<0.29 plac<1.0.0,>=0.9.6 six diff --git a/setup.py b/setup.py index 0b0d2cc81..8943d7a2e 100755 --- a/setup.py +++ b/setup.py @@ -195,7 +195,7 @@ def setup_package(): 'murmurhash>=0.28,<0.29', 'cymem>=1.30,<1.32', 'preshed>=1.0.0,<2.0.0', - 'thinc>=6.8.1,<6.9.0', + 'thinc>=6.8.2,<6.9.0', 'plac<1.0.0,>=0.9.6', 'six', 'pathlib', From 2ea27d07f474332486db0a047999870f40ba37a4 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 22:14:47 +0700 Subject: [PATCH 423/739] fix tokenizer_exceptions in thai --- spacy/lang/th/tokenizer_exceptions.py | 39 +-------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/spacy/lang/th/tokenizer_exceptions.py b/spacy/lang/th/tokenizer_exceptions.py index 7e3967aed..c31595893 100644 --- a/spacy/lang/th/tokenizer_exceptions.py +++ b/spacy/lang/th/tokenizer_exceptions.py @@ -1,9 +1,7 @@ # encoding: utf8 from __future__ import unicode_literals -from ..symbols import * -from ..language_data import PRON_LEMMA - +from ...symbols import * TOKENIZER_EXCEPTIONS = { "ม.ค.": [ @@ -43,38 +41,3 @@ TOKENIZER_EXCEPTIONS = { {ORTH: "ธ.ค.", LEMMA: "ธันวาคม"} ] } - - -# exceptions mapped to a single token containing only ORTH property -# example: {"string": [{ORTH: "string"}]} -# converted using strings_to_exc() util -''' -ORTH_ONLY = [ - "a.", - "b.", - "c.", - "d.", - "e.", - "f.", - "g.", - "h.", - "i.", - "j.", - "k.", - "l.", - "m.", - "n.", - "o.", - "p.", - "q.", - "r.", - "s.", - "t.", - "u.", - "v.", - "w.", - "x.", - "y.", - "z." -] -''' \ No newline at end of file From a63f790b8c45f14254d665029f2e5fbcf431a533 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 22:28:57 +0700 Subject: [PATCH 424/739] fix thai tag_map --- spacy/lang/th/tag_map.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/lang/th/tag_map.py b/spacy/lang/th/tag_map.py index e225f7289..40e5ac44c 100644 --- a/spacy/lang/th/tag_map.py +++ b/spacy/lang/th/tag_map.py @@ -2,7 +2,7 @@ # 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 * +from ...symbols import * TAG_MAP = { #NOUN @@ -78,4 +78,4 @@ TAG_MAP = { # PUNCT "PUNCT": {POS: PUNCT}, "PUNC": {POS: PUNCT} -} \ No newline at end of file +} From 7fdfb78141a90d1f27ebd50406d0ba3591a1253f Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 17:34:52 +0200 Subject: [PATCH 425/739] Add version option to cli.train --- spacy/cli/train.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 6178ecb3b..5e13037fd 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -41,11 +41,12 @@ numpy.random.seed(0) no_parser=("Don't train parser", "flag", "P", 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, vectors=None, no_tagger=False, no_parser=False, no_entities=False, - gold_preproc=False, meta_path=None): + gold_preproc=False, version="0.0.0", meta_path=None): """ Train a model. Expects data in spaCy's JSON format. """ @@ -126,7 +127,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0, meta['pipeline'] = pipeline meta['spacy_version'] = '>=%s' % about.__version__ meta.setdefault('name', 'model%d' % i) - meta.setdefault('version', '0.0.0') + meta.setdefault('version', version) with meta_loc.open('w') as file_: file_.write(json_dumps(meta)) From 3d5046c499d6e61492820293865c6b7af0e26fd0 Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 22:41:20 +0700 Subject: [PATCH 426/739] fix import in th --- spacy/lang/th/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py index 368fb9ae5..b6bdb658f 100644 --- a/spacy/lang/th/__init__.py +++ b/spacy/lang/th/__init__.py @@ -6,7 +6,7 @@ from .tag_map import TAG_MAP from .stop_words import STOP_WORDS from ..tokenizer_exceptions import BASE_EXCEPTIONS -from ..tokens import Doc +from ...tokens import Doc from ..norm_exceptions import BASE_NORMS from ...language import Language from ...attrs import LANG, NORM From 1ff62eaee7ad2be5aa5a0a2e95bd00945b2b732b Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 26 Sep 2017 17:59:34 +0200 Subject: [PATCH 427/739] Fix option shortcut to avoid conflict --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 5e13037fd..4ce86d31e 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -41,7 +41,7 @@ numpy.random.seed(0) no_parser=("Don't train parser", "flag", "P", bool), no_entities=("Don't train NER", "flag", "N", bool), gold_preproc=("Use gold preprocessing", "flag", "G", bool), - version=("Model version", "option", "v", str), + 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, From 7b5263ffa44a4d20d983b117257e72a89dd1f6ff Mon Sep 17 00:00:00 2001 From: Wannaphong Phatthiyaphaibun Date: Tue, 26 Sep 2017 23:54:15 +0700 Subject: [PATCH 428/739] fix thai test --- spacy/tests/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py index 70c78ab9f..b33a7c008 100644 --- a/spacy/tests/conftest.py +++ b/spacy/tests/conftest.py @@ -110,6 +110,7 @@ def nb_tokenizer(): @pytest.fixture def th_tokenizer(): + pythainlp = pytest.importorskip("pythainlp") return util.get_lang_class('th').Defaults.create_tokenizer() From b5dd7e7cc4f10f179e3ad1a0a60c498585e8d86a Mon Sep 17 00:00:00 2001 From: Reza Gharibi Date: Wed, 27 Sep 2017 03:55:28 +0330 Subject: [PATCH 429/739] Fix typo --- website/docs/usage/_spacy-101/_vocab.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/_spacy-101/_vocab.jade b/website/docs/usage/_spacy-101/_vocab.jade index cff0b106e..3063262d5 100644 --- a/website/docs/usage/_spacy-101/_vocab.jade +++ b/website/docs/usage/_spacy-101/_vocab.jade @@ -112,4 +112,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. From fa1844b132684daf0119383548f0513f94d9dda2 Mon Sep 17 00:00:00 2001 From: Reza Gharibi Date: Wed, 27 Sep 2017 03:55:54 +0330 Subject: [PATCH 430/739] Fix typo --- website/docs/usage/_spacy-101/_language-data.jade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/docs/usage/_spacy-101/_language-data.jade b/website/docs/usage/_spacy-101/_language-data.jade index aaca10ebb..1f75b47e8 100644 --- a/website/docs/usage/_spacy-101/_language-data.jade +++ b/website/docs/usage/_spacy-101/_language-data.jade @@ -22,7 +22,7 @@ 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 From 0461b8215816dc30fa87cb16af7dc03334b2857d Mon Sep 17 00:00:00 2001 From: Reza Gharibi Date: Wed, 27 Sep 2017 03:56:20 +0330 Subject: [PATCH 431/739] Fix typos --- website/docs/usage/spacy-101.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/usage/spacy-101.jade b/website/docs/usage/spacy-101.jade index a54e5cf66..ac3e808b3 100644 --- a/website/docs/usage/spacy-101.jade +++ b/website/docs/usage/spacy-101.jade @@ -65,7 +65,7 @@ p | 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 + | 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 @@ -87,7 +87,7 @@ p +aside | If one of spaCy's functionalities #[strong needs a model], it means that - | you need to have one our the available + | you need to have one of 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. From 983201a83a2b69174d693cd850be90e80c914168 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:43:58 -0500 Subject: [PATCH 432/739] Fix hard-coded vector width --- spacy/pipeline.pyx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index 717a1bd3f..f7e05ece7 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -553,9 +553,10 @@ class NeuralLabeller(NeuralTagger): self.labels[label] = len(self.labels) print(len(self.labels)) if self.model is True: + token_vector_width = util.env_opt('token_vector_width') self.model = chain( tok2vec, - Softmax(len(self.labels), 128) + Softmax(len(self.labels), token_vector_width) ) link_vectors_to_models(self.vocab) From 66c388ee01a10218ebba7a174ccf20481c34f0d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:44:16 -0500 Subject: [PATCH 433/739] Remove unhelpful multitask objectives --- spacy/pipeline.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx index f7e05ece7..1a12107b7 100644 --- a/spacy/pipeline.pyx +++ b/spacy/pipeline.pyx @@ -779,7 +779,7 @@ cdef class NeuralDependencyParser(NeuralParser): TransitionSystem = ArcEager def init_multitask_objectives(self, gold_tuples, pipeline, **cfg): - for target in ['dep', 'ent']: + for target in []: labeller = NeuralLabeller(self.vocab, target=target) tok2vec = self.model[0] labeller.begin_training(gold_tuples, pipeline=pipeline, tok2vec=tok2vec) From 1a37a2c0a0b41b5b719a6d62b11d85c0c139baed Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:48:07 -0500 Subject: [PATCH 434/739] Update training defaults --- spacy/_ml.py | 2 +- spacy/syntax/nn_parser.pyx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 2e95aa55b..22a501f0f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -505,7 +505,7 @@ def getitem(i): return layerize(getitem_fwd) def build_tagger_model(nr_class, **cfg): - embed_size = util.env_opt('embed_size', 4000) + embed_size = util.env_opt('embed_size', 1000) if 'token_vector_width' in cfg: token_vector_width = cfg['token_vector_width'] else: diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 99099cad8..830aac551 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -240,12 +240,12 @@ cdef class Parser: Base class of the DependencyParser and EntityRecognizer. """ @classmethod - def Model(cls, nr_class, token_vector_width=128, hidden_width=300, depth=1, **cfg): + def Model(cls, nr_class, token_vector_width=128, hidden_width=200, 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) - embed_size = util.env_opt('embed_size', 4000) + embed_size = util.env_opt('embed_size', 1000) tok2vec = Tok2Vec(token_vector_width, embed_size, pretrained_dims=cfg.get('pretrained_dims', 0)) tok2vec = chain(tok2vec, flatten) From dcb86bdc4363a115974a4d0748a2d899094a14eb Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 11:48:19 -0500 Subject: [PATCH 435/739] Default batch size to 32 --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 4ce86d31e..53426febe 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -82,7 +82,7 @@ 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', 32), util.env_opt('batch_compound', 1.001)) corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() From 542ebfa49864b5a46af1eed22f535747061f4bc5 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Wed, 27 Sep 2017 18:54:37 -0500 Subject: [PATCH 436/739] Improve defaults --- spacy/cli/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 53426febe..dfa755b8e 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -44,7 +44,7 @@ numpy.random.seed(0) 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, +def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, 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): """ @@ -82,7 +82,7 @@ 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', 32), + util.env_opt('batch_to', 16), util.env_opt('batch_compound', 1.001)) corpus = GoldCorpus(train_path, dev_path, limit=n_sents) n_train_words = corpus.count_train() From ac8481a7b086880225229e6d69d8a3335accd3ba Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 08:05:31 -0500 Subject: [PATCH 437/739] Print NER loss --- spacy/cli/train.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index dfa755b8e..d973effb6 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -94,7 +94,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, 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) @@ -158,12 +158,14 @@ def print_progress(itn, losses, dev_scores, wps=0.0): '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}', From f6330d69e65b779368827a3d99128ab10880f0d2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 08:07:41 -0500 Subject: [PATCH 438/739] Default embed size to 7000 --- spacy/_ml.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 22a501f0f..62fc7543f 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -505,7 +505,7 @@ def getitem(i): return layerize(getitem_fwd) def build_tagger_model(nr_class, **cfg): - embed_size = util.env_opt('embed_size', 1000) + embed_size = util.env_opt('embed_size', 7000) if 'token_vector_width' in cfg: token_vector_width = cfg['token_vector_width'] else: From 158e177cae44f72382ea83162b6830cf8189abea Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 08:25:23 -0500 Subject: [PATCH 439/739] Fix default embed size --- spacy/syntax/nn_parser.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 830aac551..7b45db0d8 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -245,7 +245,7 @@ cdef class Parser: 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) - embed_size = util.env_opt('embed_size', 1000) + embed_size = util.env_opt('embed_size', 7000) tok2vec = Tok2Vec(token_vector_width, embed_size, pretrained_dims=cfg.get('pretrained_dims', 0)) tok2vec = chain(tok2vec, flatten) From cdb2d83e168b8602bcaa98b1a8f2842908eaad49 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Thu, 28 Sep 2017 18:47:13 -0500 Subject: [PATCH 440/739] Pass dropout in parser --- spacy/syntax/nn_parser.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 7b45db0d8..1efdc4474 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -533,7 +533,7 @@ cdef class Parser: states, golds, max_steps = self._init_gold_batch(docs, golds) (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, - 0.0) + drop) todo = [(s, g) for (s, g) in zip(states, golds) if not s.is_final() and g is not None] if not todo: @@ -598,7 +598,7 @@ cdef class Parser: self.moves.preprocess_gold(gold) cuda_stream = get_cuda_stream() - (tokvecs, bp_tokvecs), state2vec, vec2scores = self.get_batch_model(docs, cuda_stream, 0.0) + (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, @@ -685,7 +685,7 @@ cdef class Parser: tok2vec, lower, upper = self.model tokvecs, bp_tokvecs = tok2vec.begin_update(docs, drop=dropout) state2vec = precompute_hiddens(len(docs), tokvecs, - lower, stream, drop=dropout) + lower, stream, drop=0.0) return (tokvecs, bp_tokvecs), state2vec, upper nr_feature = 8 From 7d77dc490fb2f8cf5232690f3775e77cdadc59ee Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:52:28 +0200 Subject: [PATCH 441/739] Always compare lowercase package names Otherwise, is_package will return False if model name contains uppercase characters. See this issue: https://support.prodi.gy/t/saving-a-trained-ner-model-as-a-loadable-modu le/46/6 --- spacy/util.py | 4 +- website/usage/spacy-101.jade | 300 +++++++++++++++++++++++++++++++++++ 2 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 website/usage/spacy-101.jade diff --git a/spacy/util.py b/spacy/util.py index 429d9bae5..911970831 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -181,9 +181,10 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ + name = name.lower() # compare package name against lowercase name packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.replace('-', '_') == name: + if package.lower().replace('-', '_') == name: return True return False @@ -194,6 +195,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) diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade new file mode 100644 index 000000000..a57137674 --- /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/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("/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 From fd1a9225d80a667bfd88c5d21bdaeaf156003cf2 Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:52:56 +0200 Subject: [PATCH 442/739] Handle conversion of pipeline components correctly Allow both comma and comma + whitespace as separators --- spacy/cli/package.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spacy/cli/package.py b/spacy/cli/package.py index 7019819a7..5ffc493c3 100644 --- a/spacy/cli/package.py +++ b/spacy/cli/package.py @@ -105,8 +105,11 @@ def generate_pipeline(): "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): From 153c2589d40a7dd127864b0e68efe20182d0941e Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:53:36 +0200 Subject: [PATCH 443/739] Revert "Always compare lowercase package names" This reverts commit 7d77dc490fb2f8cf5232690f3775e77cdadc59ee. --- spacy/util.py | 4 +- website/usage/spacy-101.jade | 300 ----------------------------------- 2 files changed, 1 insertion(+), 303 deletions(-) delete mode 100644 website/usage/spacy-101.jade diff --git a/spacy/util.py b/spacy/util.py index 911970831..429d9bae5 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -181,10 +181,9 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ - name = name.lower() # compare package name against lowercase name packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.lower().replace('-', '_') == name: + if package.replace('-', '_') == name: return True return False @@ -195,7 +194,6 @@ 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) diff --git a/website/usage/spacy-101.jade b/website/usage/spacy-101.jade deleted file mode 100644 index a57137674..000000000 --- a/website/usage/spacy-101.jade +++ /dev/null @@ -1,300 +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 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/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("/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 From 8dbe49ecb8cfe2edd932a10d418e4be5466700ba Mon Sep 17 00:00:00 2001 From: ines Date: Fri, 29 Sep 2017 20:55:17 +0200 Subject: [PATCH 444/739] Always compare lowercase package names Otherwise, is_package will return False if model name contains uppercase characters. See this issue: https://support.prodi.gy/t/saving-a-trained-ner-model-as-a-loadable-modu le/46/6 --- spacy/util.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spacy/util.py b/spacy/util.py index 429d9bae5..911970831 100644 --- a/spacy/util.py +++ b/spacy/util.py @@ -181,9 +181,10 @@ def is_package(name): name (unicode): Name of package. RETURNS (bool): True if installed package, False if not. """ + name = name.lower() # compare package name against lowercase name packages = pkg_resources.working_set.by_key.keys() for package in packages: - if package.replace('-', '_') == name: + if package.lower().replace('-', '_') == name: return True return False @@ -194,6 +195,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) From 69c7c642c2c3a9c51d0b7c1c1e5e67848f9b7953 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 14:04:32 -0500 Subject: [PATCH 445/739] Add spacy evaluate --- spacy/__main__.py | 3 +- spacy/cli/__init__.py | 1 + spacy/cli/evaluate.py | 93 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 spacy/cli/evaluate.py diff --git a/spacy/__main__.py b/spacy/__main__.py index d02242d68..0ec96e4a1 100644 --- a/spacy/__main__.py +++ b/spacy/__main__.py @@ -7,7 +7,7 @@ if __name__ == '__main__': import plac import sys from spacy.cli import download, link, info, package, train, convert, model - from spacy.cli import profile + from spacy.cli import profile, evaluate from spacy.util import prints commands = { @@ -15,6 +15,7 @@ if __name__ == '__main__': 'link': link, 'info': info, 'train': train, + 'evaluate': evaluate, 'convert': convert, 'package': package, 'model': model, diff --git a/spacy/cli/__init__.py b/spacy/cli/__init__.py index e58c94642..ebe185f24 100644 --- a/spacy/cli/__init__.py +++ b/spacy/cli/__init__.py @@ -4,5 +4,6 @@ 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 diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py new file mode 100644 index 000000000..209660529 --- /dev/null +++ b/spacy/cli/evaluate.py @@ -0,0 +1,93 @@ +# 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), +) +def evaluate(cmd, model, data_path, gold_preproc=False): + """ + Train a model. Expects data in spaCy's JSON format. + """ + util.set_env_log(True) + data_path = util.ensure_path(data_path) + if not data_path.exists(): + prints(data_path, title="Evaluation data not found", exits=1) + corpus = GoldCorpus(data_path, data_path) + nlp = util.load_model(model) + scorer = nlp.evaluate(list(corpus.dev_docs(nlp, gold_preproc=gold_preproc))) + print_results(scorer) + + +def _render_parses(i, to_render): + to_render[0].user_data['title'] = "Batch %d" % i + with Path('/tmp/entities.html').open('w') as file_: + html = displacy.render(to_render[:5], style='ent', page=True) + file_.write(html) + with Path('/tmp/parses.html').open('w') as file_: + html = displacy.render(to_render[:5], style='dep', page=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): + results = { + '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") From 2cf0f4622fb5efc57c622b5d37c771e8042bed3d Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 14:05:32 -0500 Subject: [PATCH 446/739] Fix loading of models with pre-trained vectors --- spacy/vocab.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 0a420849c..21c2a1165 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -324,6 +324,7 @@ cdef class Vocab: 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): From b776f48e58586ee27d27cf8a1a8e316b8c73c42c Mon Sep 17 00:00:00 2001 From: ines Date: Sun, 1 Oct 2017 21:58:45 +0200 Subject: [PATCH 447/739] Fix typo --- spacy/vocab.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx index 21c2a1165..a5f8bf6ad 100644 --- a/spacy/vocab.pyx +++ b/spacy/vocab.pyx @@ -262,7 +262,7 @@ 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. From 97c409b6021c131f66ef4f90ff7ec47f99bea2f2 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 22:10:33 +0200 Subject: [PATCH 448/739] Add docstrings for spacy.vectors --- spacy/vectors.pyx | 55 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 346421153..dcb31da83 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -16,7 +16,16 @@ 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 key2row @@ -24,7 +33,36 @@ cdef class Vectors: cdef public int i def __init__(self, strings, data_or_width=0): - self.strings = StringStore() + '''Create a new vector store. + + To keep the vector table empty, pass data_or_width=0: + + >>> empty_vectors = Vectors(StringStore()) + + To create the vector table, and add vectors one-by-one: + + >>> my_vector_data = { + ... 'dog': numpy.random.uniform(-1, 1, (300,)), + ... 'cat': numpy.random.uniform(-1, 1, (300,)), + ... 'orange': numpy.random.uniform(-1, 1, (300,)), + ... } + >>> strings = StringStore() + >>> for word in my_vector_data.keys(): + ... strings.add(word) + >>> vectors = Vectors(strings, 300) + >>> for word in strings: + ... vectors[word] = preset_vectors[word] + + To set the vector values directly on initialization: + + >>> my_vector_table = numpy.zeros((3, 300), dtype='f') + >>> strings = StringStore() + >>> for key in my_vectors.keys(): + ... strings.add(key) + >>> for i, word in enumerate(strings): + ... my_vectors_table[i] = my_vectors[word] + >>> vectors = Vectors(strings, my_vector_table) + ''' if isinstance(data_or_width, int): self.data = data = numpy.zeros((len(strings), data_or_width), dtype='f') @@ -39,6 +77,11 @@ cdef class Vectors: 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.key2row[key] @@ -48,23 +91,30 @@ cdef class Vectors: 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.key2row[key] self.data[i] = vector def __iter__(self): + '''Yield vectors from the table.''' yield from self.data def __len__(self): + '''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: @@ -82,6 +132,7 @@ cdef class Vectors: return i def items(self): + '''Iterate over (string key, vector) pairs, in order.''' for i, string in enumerate(self.strings): yield string, self.data[i] From 38286b6f07ec829c956e4c2a881ba526d135b5ff Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 23:40:02 +0200 Subject: [PATCH 449/739] Add example loadig Fast Text vectors --- examples/chainer_sentiment.py | 322 ---------------------------------- examples/vectors_fast_text.py | 30 ++++ 2 files changed, 30 insertions(+), 322 deletions(-) delete mode 100644 examples/chainer_sentiment.py create mode 100644 examples/vectors_fast_text.py 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/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) From b2a8b9be77506d5bb5c03885d44893a85044b6a6 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Sun, 1 Oct 2017 17:00:34 -0500 Subject: [PATCH 450/739] Fix inconsistency of Vectors class API --- spacy/vectors.pyx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx index 346421153..da0489bbf 100644 --- a/spacy/vectors.pyx +++ b/spacy/vectors.pyx @@ -24,7 +24,12 @@ cdef class Vectors: cdef public int i def __init__(self, strings, data_or_width=0): - self.strings = StringStore() + 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') @@ -82,7 +87,8 @@ cdef class Vectors: return i def items(self): - for i, string in enumerate(self.strings): + for i, key in enumerate(self.keys): + string = self.strings[key] yield string, self.data[i] @property From 4896ce33200352248b48590510e47bbe1b5b8e41 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 00:09:14 +0200 Subject: [PATCH 451/739] Remove misleading comment --- spacy/cli/convert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py index fef6753e6..89615bbe8 100644 --- a/spacy/cli/convert.py +++ b/spacy/cli/convert.py @@ -14,7 +14,7 @@ from ..util import prints CONVERTERS = { '.conllu': conllu2json, '.conll': conllu2json, - '.iob': iob2json + '.iob': iob2json, } From 31681d20e038fb0b318a9479856da473b0e0e926 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 16:50:26 +0200 Subject: [PATCH 452/739] Fix concatenation in iob2json converter --- spacy/cli/converters/iob2json.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/spacy/cli/converters/iob2json.py b/spacy/cli/converters/iob2json.py index 4849345e9..4d456fa57 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,22 +11,24 @@ 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_) + if n_sents: + lines = [' '.join(para) for para in partition_all(n_sents, file_)] + else: + lines = file_ + sentences = read_iob(lines) 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: - f.write(json_dumps(docs)) - prints("Created %d documents" % len(docs), + f.write(json_dumps(sentences)) + prints("Created %d documents" % len(sentences), 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()] From f942903429b33b920c18ed7f9c4fe4715733d55f Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 17:02:10 +0200 Subject: [PATCH 453/739] Improve sentence merging in iob2json --- spacy/cli/converters/iob2json.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/spacy/cli/converters/iob2json.py b/spacy/cli/converters/iob2json.py index 4d456fa57..74bc22ada 100644 --- a/spacy/cli/converters/iob2json.py +++ b/spacy/cli/converters/iob2json.py @@ -12,17 +12,13 @@ def iob2json(input_path, output_path, n_sents=10, *a, **k): Convert IOB files into JSON format for use with train cli. """ with input_path.open('r', encoding='utf8') as file_: - if n_sents: - lines = [' '.join(para) for para in partition_all(n_sents, file_)] - else: - lines = file_ - sentences = read_iob(lines) - + 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: - f.write(json_dumps(sentences)) - prints("Created %d documents" % len(sentences), + f.write(json_dumps(docs)) + prints("Created %d documents" % len(docs), title="Generated output file %s" % path2str(output_file)) @@ -46,3 +42,15 @@ def read_iob(raw_sents): 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 From c617d288d8fb9636f9dd077f8393c9e1d2d8626a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 17:20:19 +0200 Subject: [PATCH 454/739] Update pipeline component names in spaCy train --- spacy/cli/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index d973effb6..2096bf0a1 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -69,7 +69,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, prints("Expected dict but got: {}".format(type(meta)), title="Not a valid meta.json format", exits=1) - pipeline = ['tags', 'dependencies', 'entities'] + pipeline = ['tagger', 'parser', 'ner'] 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') From 8902df44de0a4b6fb4b4d23a3e3cb1d4088db492 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Mon, 2 Oct 2017 21:07:23 +0200 Subject: [PATCH 455/739] Fix component disabling during training --- spacy/cli/train.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spacy/cli/train.py b/spacy/cli/train.py index 2096bf0a1..651fafb05 100644 --- a/spacy/cli/train.py +++ b/spacy/cli/train.py @@ -70,9 +70,9 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0, title="Not a valid meta.json format", exits=1) pipeline = ['tagger', 'parser', 'ner'] - 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') + 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. From 6aa6a5bc25eeebf1ffea4ee97f7e26d3f09c357a Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 12:43:09 +0200 Subject: [PATCH 456/739] Add a layer type for history features --- spacy/_ml.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/spacy/_ml.py b/spacy/_ml.py index 62fc7543f..38f220cc1 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,6 +21,7 @@ from thinc.neural._classes.affine import _set_dimensions_if_needed from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention +from thinc.neural._classes.embed import Embed from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths, noop @@ -212,6 +213,27 @@ class PrecomputableMaxouts(Model): return Yfp, backward +def HistoryFeatures(nr_class, hist_size=8, nr_dim=8): + '''Wrap a model, adding features representing action history.''' + embed = Embed(nr_dim, nr_dim, nr_class) + ops = embed.ops + def add_history_fwd(vectors_hists, drop=0.): + vectors, hist_ids = vectors_hists + flat_hists, bp_hists = embed.begin_update(hist_ids.flatten(), drop=drop) + hists = flat_hists.reshape((hist_ids.shape[0], + hist_ids.shape[1] * flat_hists.shape[1])) + outputs = ops.xp.hstack((vectors, hists)) + + 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.reshape((d_hists.shape[0]*hist_size, + int(d_hists.shape[1]/hist_size))), 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.: From ee41e4fea7609119655a6ad73ead2df4b754c552 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 12:43:48 +0200 Subject: [PATCH 457/739] Support history features in stateclass --- spacy/syntax/_state.pxd | 30 ++++++++++++++++++++++++++++-- spacy/syntax/stateclass.pyx | 8 ++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd index 4fb16881a..f4fa49286 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,7 @@ 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)): @@ -271,7 +290,14 @@ 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) + + int get_hist(int i) nogil: + return ring_get(&this._hist, i) void push() nogil: if this.B(0) != -1: diff --git a/spacy/syntax/stateclass.pyx b/spacy/syntax/stateclass.pyx index 228a3ff91..9c179820c 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() From b50a359e1140e968e115f09ced042fc6a02fac22 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 12:44:01 +0200 Subject: [PATCH 458/739] Add support for history features in parsing models --- spacy/syntax/nn_parser.pyx | 51 +++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 1efdc4474..2277e568e 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -51,6 +51,7 @@ from .._ml import zero_init, PrecomputableAffine, PrecomputableMaxouts 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 from . import _parse_features @@ -68,7 +69,7 @@ from ..gold cimport GoldParse from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils -USE_FINE_TUNE = True +USE_HISTORY = True def get_templates(*args, **kwargs): return [] @@ -261,18 +262,35 @@ cdef class Parser: with Model.use_device('cpu'): if depth == 0: - upper = chain() - upper.is_noop = True - else: + hist_size = 8 + nr_dim = 8 + if USE_HISTORY: + upper = chain( + HistoryFeatures(nr_class=nr_class, hist_size=hist_size, + nr_dim=nr_dim), + zero_init(Affine(nr_class, nr_class+hist_size*nr_dim, + drop_factor=0.0))) + upper.is_noop = False + else: + upper = chain() + upper.is_noop = True + elif USE_HISTORY: upper = chain( - clone(Maxout(hidden_width), depth-1), + HistoryFeatures(nr_class=nr_class, hist_size=8, nr_dim=8), + Maxout(hidden_width, hidden_width+8*8), zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) ) upper.is_noop = False + else: + upper = chain( + Maxout(hidden_width, hidden_width), + 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, @@ -428,12 +446,18 @@ cdef class Parser: self._parse_step(next_step[i], feat_weights, nr_class, nr_feat, nr_piece) else: + 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 USE_HISTORY: + scores = vec2scores((vectors, hists)) + else: + scores = vec2scores(vectors) c_scores = scores.data for i in range(nr_step): st = next_step[i] @@ -441,6 +465,7 @@ cdef class Parser: &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: @@ -551,7 +576,11 @@ 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 USE_HISTORY: + 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_scores /= len(docs) @@ -570,7 +599,8 @@ 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 @@ -706,12 +736,15 @@ cdef class Parser: cdef StateClass state cdef int[500] is_valid # TODO: Unhack cdef float* c_scores = &scores[0, 0] + hists = [] for state in states: self.moves.set_valid(is_valid, state.c) guess = arg_max_if_valid(c_scores, is_valid, scores.shape[1]) action = self.moves.c[guess] action.do(state.c, action.label) c_scores += scores.shape[1] + hists.append(guess) + return hists def get_batch_loss(self, states, golds, float[:, ::1] scores): cdef StateClass state From b770f4e1082b1da83597bb723a0e1986befdd069 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 13:26:55 +0200 Subject: [PATCH 459/739] Fix embed class in history features --- spacy/_ml.py | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/spacy/_ml.py b/spacy/_ml.py index 38f220cc1..3b6e4da10 100644 --- a/spacy/_ml.py +++ b/spacy/_ml.py @@ -21,7 +21,6 @@ from thinc.neural._classes.affine import _set_dimensions_if_needed from thinc.api import FeatureExtracter, with_getitem from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool from thinc.neural._classes.attention import ParametricAttention -from thinc.neural._classes.embed import Embed from thinc.linear.linear import LinearModel from thinc.api import uniqued, wrap, flatten_add_lengths, noop @@ -212,23 +211,60 @@ class PrecomputableMaxouts(Model): return dXf return Yfp, backward +# 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 + +@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): + Model.__init__(self, **kwargs) + 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._embed(ids) + + def begin_update(self, ids, drop=0.): + if ids.ndim == 2: + ids = ids[:, self.column] + vectors = self.vectors[ids] + 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.''' - embed = Embed(nr_dim, nr_dim, nr_class) + embed_tables = [Embed(nr_dim, nr_class, column=i) for i in range(hist_size)] + embed = concatenate(*embed_tables) ops = embed.ops def add_history_fwd(vectors_hists, drop=0.): vectors, hist_ids = vectors_hists - flat_hists, bp_hists = embed.begin_update(hist_ids.flatten(), drop=drop) - hists = flat_hists.reshape((hist_ids.shape[0], - hist_ids.shape[1] * flat_hists.shape[1])) - outputs = ops.xp.hstack((vectors, hists)) + hist_feats, bp_hists = embed.begin_update(hist_ids) + 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.reshape((d_hists.shape[0]*hist_size, - int(d_hists.shape[1]/hist_size))), sgd=sgd) + bp_hists(d_hists, sgd=sgd) return embed.ops.xp.ascontiguousarray(d_vectors) return outputs, add_history_bwd return wrap(add_history_fwd, embed) From 278a4c17c642b366b71dccc7cec202dc22cfcb93 Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 13:27:10 +0200 Subject: [PATCH 460/739] Fix history features --- spacy/syntax/nn_parser.pyx | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 2277e568e..4a874e834 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -70,6 +70,8 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_HISTORY = True +HIST_SIZE = 2 +HIST_DIMS = 16 def get_templates(*args, **kwargs): return [] @@ -262,13 +264,11 @@ cdef class Parser: with Model.use_device('cpu'): if depth == 0: - hist_size = 8 - nr_dim = 8 if USE_HISTORY: upper = chain( - HistoryFeatures(nr_class=nr_class, hist_size=hist_size, - nr_dim=nr_dim), - zero_init(Affine(nr_class, nr_class+hist_size*nr_dim, + HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, + nr_dim=HIST_DIMS), + zero_init(Affine(nr_class, nr_class+HIST_SIZE*HIST_DIMS, drop_factor=0.0))) upper.is_noop = False else: @@ -736,15 +736,13 @@ cdef class Parser: cdef StateClass state cdef int[500] is_valid # TODO: Unhack cdef float* c_scores = &scores[0, 0] - hists = [] for state in states: self.moves.set_valid(is_valid, state.c) guess = arg_max_if_valid(c_scores, is_valid, scores.shape[1]) action = self.moves.c[guess] action.do(state.c, action.label) c_scores += scores.shape[1] - hists.append(guess) - return hists + state.c.push_hist(guess) def get_batch_loss(self, states, golds, float[:, ::1] scores): cdef StateClass state From dc3c79194763d28e5d9e34918c22a05585d151cc Mon Sep 17 00:00:00 2001 From: Matthew Honnibal Date: Tue, 3 Oct 2017 13:41:23 +0200 Subject: [PATCH 461/739] Fix history size option --- spacy/syntax/nn_parser.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx index 4a874e834..87099aa4f 100644 --- a/spacy/syntax/nn_parser.pyx +++ b/spacy/syntax/nn_parser.pyx @@ -70,8 +70,8 @@ from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG from . import _beam_utils USE_HISTORY = True -HIST_SIZE = 2 -HIST_DIMS = 16 +HIST_SIZE = 8 # Max 8 +HIST_DIMS = 8 def get_templates(*args, **kwargs): return [] @@ -276,8 +276,8 @@ cdef class Parser: upper.is_noop = True elif USE_HISTORY: upper = chain( - HistoryFeatures(nr_class=nr_class, hist_size=8, nr_dim=8), - Maxout(hidden_width, hidden_width+8*8), + HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, nr_dim=HIST_DIMS), + Maxout(hidden_width, hidden_width+HIST_SIZE*HIST_DIMS), zero_init(Affine(nr_class, hidden_width, drop_factor=0.0)) ) upper.is_noop = False From 3e1b971b16d8c0a11b1f6215513046f4b8c01304 Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:14:52 +0200 Subject: [PATCH 462/739] Update CSS --- website/assets/css/_base/_animations.sass | 7 + website/assets/css/_base/_fonts.sass | 44 ++---- website/assets/css/_base/_grid.sass | 10 +- website/assets/css/_base/_layout.sass | 4 + website/assets/css/_base/_objects.sass | 79 +++++++++- website/assets/css/_base/_reset.sass | 7 +- website/assets/css/_base/_utilities.sass | 149 ++++++++++++++---- website/assets/css/_components/_asides.sass | 6 +- website/assets/css/_components/_buttons.sass | 41 ++++- website/assets/css/_components/_chat.sass | 27 ++-- website/assets/css/_components/_code.sass | 29 ++-- website/assets/css/_components/_landing.sass | 39 ++++- website/assets/css/_components/_lists.sass | 5 +- website/assets/css/_components/_misc.sass | 5 +- .../assets/css/_components/_navigation.sass | 26 +-- website/assets/css/_components/_progress.sass | 24 +++ .../assets/css/_components/_quickstart.sass | 10 +- website/assets/css/_components/_sidebar.sass | 65 +++++++- website/assets/css/_components/_tables.sass | 3 +- website/assets/css/_components/_tooltips.sass | 18 ++- website/assets/css/_mixins.sass | 17 +- website/assets/css/_variables.sass | 25 +-- website/assets/css/style.sass | 1 + website/assets/css/style_red.sass | 4 - 24 files changed, 496 insertions(+), 149 deletions(-) create mode 100644 website/assets/css/_components/_progress.sass delete mode 100644 website/assets/css/style_red.sass 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 46c3e84d9..e2ba552b7 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,59 @@ .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-float-left + float: left + margin-right: 1rem + +.u-float-right + float: right + margin-left: 1rem + .u-text-center text-align: center @@ -104,14 +164,20 @@ padding: 0.5em 0.75em .u-padding-medium - padding: 2.5rem + padding: 1.8rem .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 @@ -123,13 +189,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 @@ -145,6 +208,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 036c5358f..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 @@ -43,17 +45,26 @@ 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..2a933c95e 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 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..4fafbfca5 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" !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 From 7d01d7411b8e5ed8f8abd3c1ee9287147070057a Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:15:36 +0200 Subject: [PATCH 463/739] Update web fonts --- website/assets/fonts/hkgrotesk-bold.woff | Bin 0 -> 31224 bytes website/assets/fonts/hkgrotesk-bold.woff2 | Bin 0 -> 24676 bytes .../assets/fonts/hkgrotesk-bolditalic.woff | Bin 0 -> 33256 bytes .../assets/fonts/hkgrotesk-bolditalic.woff2 | Bin 0 -> 26248 bytes website/assets/fonts/hkgrotesk-semibold.woff | Bin 0 -> 31812 bytes website/assets/fonts/hkgrotesk-semibold.woff2 | Bin 0 -> 25092 bytes .../fonts/hkgrotesk-semibolditalic.woff | Bin 0 -> 34196 bytes .../fonts/hkgrotesk-semibolditalic.woff2 | Bin 0 -> 26908 bytes .../assets/fonts/sourcecodepro-semibold.eot | Bin 24976 -> 0 bytes .../assets/fonts/sourcecodepro-semibold.svg | 244 ---- .../assets/fonts/sourcecodepro-semibold.ttf | Bin 55544 -> 0 bytes .../assets/fonts/sourcecodepro-semibold.woff | Bin 27952 -> 0 bytes website/assets/fonts/sourcesanspro-bold.eot | Bin 89026 -> 0 bytes website/assets/fonts/sourcesanspro-bold.svg | 1031 ---------------- website/assets/fonts/sourcesanspro-bold.ttf | Bin 88820 -> 0 bytes website/assets/fonts/sourcesanspro-bold.woff | Bin 33612 -> 0 bytes website/assets/fonts/sourcesanspro-bold.woff2 | Bin 26800 -> 0 bytes .../assets/fonts/sourcesanspro-bolditalic.eot | Bin 55994 -> 0 bytes .../assets/fonts/sourcesanspro-bolditalic.svg | 840 ------------- .../assets/fonts/sourcesanspro-bolditalic.ttf | Bin 55764 -> 0 bytes .../fonts/sourcesanspro-bolditalic.woff | Bin 28960 -> 0 bytes .../fonts/sourcesanspro-bolditalic.woff2 | Bin 22492 -> 0 bytes website/assets/fonts/sourcesanspro-italic.eot | Bin 56574 -> 0 bytes website/assets/fonts/sourcesanspro-italic.svg | 852 -------------- website/assets/fonts/sourcesanspro-italic.ttf | Bin 56360 -> 0 bytes .../assets/fonts/sourcesanspro-italic.woff | Bin 28844 -> 0 bytes .../assets/fonts/sourcesanspro-italic.woff2 | Bin 22488 -> 0 bytes .../assets/fonts/sourcesanspro-regular.eot | Bin 90326 -> 0 bytes .../assets/fonts/sourcesanspro-regular.svg | 1039 ----------------- .../assets/fonts/sourcesanspro-regular.ttf | Bin 90112 -> 0 bytes .../assets/fonts/sourcesanspro-regular.woff | Bin 34096 -> 0 bytes .../assets/fonts/sourcesanspro-regular.woff2 | Bin 27292 -> 0 bytes 32 files changed, 4006 deletions(-) create mode 100755 website/assets/fonts/hkgrotesk-bold.woff create mode 100755 website/assets/fonts/hkgrotesk-bold.woff2 create mode 100755 website/assets/fonts/hkgrotesk-bolditalic.woff create mode 100755 website/assets/fonts/hkgrotesk-bolditalic.woff2 create mode 100755 website/assets/fonts/hkgrotesk-semibold.woff create mode 100755 website/assets/fonts/hkgrotesk-semibold.woff2 create mode 100755 website/assets/fonts/hkgrotesk-semibolditalic.woff create mode 100755 website/assets/fonts/hkgrotesk-semibolditalic.woff2 delete mode 100644 website/assets/fonts/sourcecodepro-semibold.eot delete mode 100644 website/assets/fonts/sourcecodepro-semibold.svg delete mode 100644 website/assets/fonts/sourcecodepro-semibold.ttf delete mode 100644 website/assets/fonts/sourcecodepro-semibold.woff delete mode 100644 website/assets/fonts/sourcesanspro-bold.eot delete mode 100644 website/assets/fonts/sourcesanspro-bold.svg delete mode 100644 website/assets/fonts/sourcesanspro-bold.ttf delete mode 100644 website/assets/fonts/sourcesanspro-bold.woff delete mode 100644 website/assets/fonts/sourcesanspro-bold.woff2 delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.eot delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.svg delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.ttf delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.woff delete mode 100644 website/assets/fonts/sourcesanspro-bolditalic.woff2 delete mode 100644 website/assets/fonts/sourcesanspro-italic.eot delete mode 100644 website/assets/fonts/sourcesanspro-italic.svg delete mode 100644 website/assets/fonts/sourcesanspro-italic.ttf delete mode 100644 website/assets/fonts/sourcesanspro-italic.woff delete mode 100644 website/assets/fonts/sourcesanspro-italic.woff2 delete mode 100644 website/assets/fonts/sourcesanspro-regular.eot delete mode 100644 website/assets/fonts/sourcesanspro-regular.svg delete mode 100644 website/assets/fonts/sourcesanspro-regular.ttf delete mode 100644 website/assets/fonts/sourcesanspro-regular.woff delete mode 100644 website/assets/fonts/sourcesanspro-regular.woff2 diff --git a/website/assets/fonts/hkgrotesk-bold.woff b/website/assets/fonts/hkgrotesk-bold.woff new file mode 100755 index 0000000000000000000000000000000000000000..41e8651c329fa923448b4bda853de03f001883fc GIT binary patch literal 31224 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 z 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 literal 0 HcmV?d00001 diff --git a/website/assets/fonts/hkgrotesk-semibold.woff2 b/website/assets/fonts/hkgrotesk-semibold.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..6c52d924569beb719c42d85a05f4e0f9823571c4 GIT binary patch literal 25092 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%0D&cnZO7r_6 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 4619eef6bb3477233ad8f5f64ac818dcf6c459ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88820 zcmeFa3w%`7wLiYknP=WJlQ$t@k^lii5|SZ=$Wz`gF^2FC$XlL@qM}7=DI$VWRD4jS z6e&eZy>w=Xl%f|Oi0D;*UWu(=lG7rxm;JNLPfrADs zxuQLuzr=H=A$2#5er{$qp4A*7e(~Xu(PR4GxA~4VAp%IZB;GK(qUx4G$7c)CbRPMq z&R95Y(dWPFZx!OjM%3}^8F$^`%^aOJRfu19MS7pvi*8;xx~bwhJTF3>vu>WYcu^=M zEJFP1L!>)zUU1Ls$EW45!Skm=Jo3Fcv!=~VZS2@2l;NmDbf1HWv^?9hc;0~L_H!2A zard6LM*IxVFQY%tFSvEav~&OG!vdjXM3ff~E}1ob_Dem-{Rz*f@N5?Z zODBF-kt)==GiTj;`>hLa5!Qi&M>dEyGw!*4f#`bk?X%{K!3(C{af@g~2|5&^qExa_ zw5?pjH;<({alG4m%X@VHbz;tOx_{uB|0_;O#Y2wp;;Q0V5hwA(tl&wOq|)?D6yFnD zqWa&7``?TEKb*@5%#bXXD3sCl{k-Jkj>f*WInI$sx{!nc*sYX7i&(v}P#xhS$RZgMbQZtB4EV)F#5{zwG*KuD@S_$yNUar< zgsN_>^iu2X*G6{*ObAp{CH1kUzANR^|V` z0}x&Y7&QFv8#!bDflv?_wl*{`bO`Gp$f13q9fZfBEgq8>=DCDxxaZw4(z%#FmZNP}*NLlu;Fp|sZW9Uht^BAGq^m4}YlUN&AJK^}t zsrDP^1@*xm8Nv$19vgK~oJ@&|ra0bJjs4U})v-Aj>BmAZg!UQn7r&!@+K*qrbqB)O z|1X~ZYNtl1($%i{pQk<=qnyq7eWIDf>O0;%HQsD+ZA{BC&pSeIqwFsH?xbI6q)`Vw z%M`wk#2ka;LVo7ELT~dfNc-R}#()#JQg|2YJb}G27}|>%8MoJ{^MCRli|yZbUwCJv z{gGGUx7}Ln>c{LhhI(Qadup0q0?)*`(7e+<9B-;HG#p&82rZUTq2ZCR5o4r>c2f*p zL+im8)#F@`(g?|%aj#Bb40aU09*yw(ar2rYu?MwuK$CEJvmN>bB_v*(B#vGhfu-o;WjI@VP>Hxlc+AUMKW0=^$-GI1D2pxiEsS{&&ohmnj3nf^!-yBz@|gGN^W19Q zlSf&`l3WI4bcuE0HbbcIN{*K2IkvX{8LlX{7ysDj|CM82`j3V2zfNnUn`-qz8fN`q z&cXC-#K+#F_sr-g${UHHeGbo`gwB97`-FHCk{Kw3=+sc7=u21Z#AjmZ1eKFVXuT0K z?vlgdJv0ulqiYpd0uLQTYh(erDo4xv>y=gyNHBz2TfU{S&^V2Q;d1rHd|CZ7`f#y( zOJgRU?%O?peUj(Wp>uh#mwgL;uHWN8m}-xnA!8-*oWw}WR8MHEtnJ&o$`u#sml;!9 z+o~K>eC(&S7&B&*93NL2{Fj(#f(__WoLNSEi}TE-4#2))gEh({(m~()B0K}9UEG5+ zK`h6agd779Zxbod_9x<+hBHC9a4vy`!;Nqe&O}&n+r#ccHk^fQ!&%6j>|(a$EM!a0 zLeU-PWKn~&r|5yR7p!2lqK~*1XFtUC6gMHR7c6MKaZZJ8ZJ?OP_MZi8|C!JBpB`c) z&fCTHIIm?}&;qsvEnr*Fonk!ByVxSsn=L|pVQHHrrm$V;I^Z(XrXuvXARqq7P9SVp?F4YLce~Dvp=kt&!bmlO8$ ziM?o@EKAq1W$8M$EG=Zq(gN`Y&i>-CID&SM;!F}B;!GAF;Y<*}!I>nE;Y=34#hD;} zhciKZit}!99A{^?P0eRplm|0517le()Gmw2Qqwu(nk`}k;Kf!YXq{kvg0A76i^zkm zU0B~JUqt^OT8oM@L?Luxw8NgpnoP!+IztxN1ue~vE9JRc+dZt4c|;v>-xXRFw&8Su zeXBEM&04C*q$|uv|2pHBkLyY7244ynV0s#%2Gp}7)Hk#+{<>>ze~f$v#p1qwi8f%j zLt8|#=*Jv_k@sTv%i^a@6%p+XeU5esHbJL*Ym~jJz+Tvusj9JAXyrZ z89mi^ua6KDmoAx_ZWcsMN4Xzyb|E9P(T;?V5o_F|ppb0D(w)b-CsNv+*4i*|m0;7t zA?v6b#Idj*YHcKAC8TjK~0VPQ=R@9T$OoXsZr^=nVXH z>Gop^jTQHavDnqh4Es!UIxJLSTr@&D%jheA_! zHoE?npMZ};DV6X75*6knG?jCwf(o1Dx^NqeDV*aQU$`~kVCXYh73jDxQYnvSpwTY+ z6{Iwb_HC92_YkH6>tWf^%Os0z3Tb~qj(vz{3W_`*!78R7p-u3X_{4y)5li>bN5&I& z>5)db<+~ZLQNoykcS5&@W};W78EUzXZ;~Q0kmyP4YH1DbU%IBy#!Kh9c#dZ4^5WTJ zQppB{xjGiwg6k!;zmXZ`GN9LbWd@Bl?s{|tk{p`C8gJ%9^bD80$-M^nY_!BQJW}r^ zE4bnev`-tY!tX)qa5KO)IL-9lRDEYt7>-5eC+uw}&Cl_}Mr-j?uUc#?{F*LJ>;4fl za77~~t4bpHZkO&W8eK^=envk<=e*3PFvV%-p1DofIf$@zm?TTXM<%Q zP$9U`dFkUS!lij*hAzfPk@UxS`p4cwdl@b?ULJFNN-8-yBTsA(W5*Ml9{(A(QQpr$ zWABEb=)Nq30(OM(_2RbCJHN4D2ei>`N zM%JB-1(j&k0UkLqGzFTMI$&9`wwe2~2`z%d3a!@b%8OLRdw}G=nt=E4Jf$>*inZey zL!Nd{F9Tfxu=O+8?8(|6CEtZ0owM3OIZ(>gkODZZ{*;bsx7U%}0anj>5UlgmH! z{jU;|T4!iUTR8Mw(R^47d0URwxq9-&Z?UD8OJ5}A8}{oWH5*A8Mj-kg;T~G%>wqV# zn8vT={V0xR!i;x@&O=gHxl5o1(%+oLUIe`fVQh3Se0%^mQcr@gDXU(%j`Tcj=7VbIC~uMPzVspkmOAUij zcW8Sk5j?kGIf)^lnQ+L^d>gr`F2IE#DUU*V(>})7H-KUthS!jUco<5dr*Vd#jDoTE zxVp*I(8vg$7_I6sN)2nuk7;9-nlGvM*tbM(>zb$F?5l*#*t>3B5*) zP7e`p5@mBXQsUGQL-FI~XekabhMiQ`HlD)!S;=@h&AhIz{f@L7jWb-M6MYPi+0a}8 zKR*LZNQ=Ku`U)dg7#gPhQJuoNmHW|Atl5Lc97JXLW)CgUzSdQWvBY4OPSehq#}k27 z^IBu};W%`pc^Qfc;}#&u)C^V`)RhPd6V@}twA(JKCf0KsF-9*i@5YQsy@fFJfkw_t z-{Wycmo8=GAa3>2vmAO2xmX8jlr!$6eW5VsfhndDAHF-WuEKL>gv^jKRvnihO>g)B zgvml?tV$hHW=d$TCtNHX0N$6%2lSHOdN6oP!a>GE{XLnBXwyR5!_|@WrgNC#S&Jkh z6xtklY}V^XL3cgiJh4N9Dv@`#M|yBm8R)=IgjNE_R(J>)n9EQ|1iou%$PWJl~a z2g_TizB=5mN@-mTKgS6GrbA898DZ;NhL|oEi#x>% zQ)=^IHFWgx4`2M~*jSwhUW~RD$EL-9j>ZBrC5X!3qGYG%>Km22*+Uq2!`KXHgMZSG ziQsrm{cQn5B0H&3E_|0ONvG7hRUn-BKN`T=iIJ@0Qw#&=uXbl?Mh$p^&b$}K$V6%> ziff}?5G&h+1GG0rNn%`PEyXpD=d@2+9tY78qc8DFn|-nje4#qy9yK~wPOFw`4ck-+ zy0Uh(2fm;+2j&R8s&UW=xGzLE5=k=?uCW;`j50=!$n#}|jC~zDDn{}sRzot&kStAs zUg~A#V(yDpbh>zT{X2Vq0s5g>IA+%$>O_d$i9de71Z^IIcti?2+(Us`Zj1fsaCeF-g z+Zcgf3sUHiwZ+FAJ%>q-jMOI6E_OxFBcmp&1%DvmKIv4C8+5?f?NKl3UJaiG3iEnG zJZX|J7nno2_Kxd4{sg>~TyqhwQ}=#|*DJJ4@QCbiF_|t!>o5xu45-od_MmliaLsbI z4uD!n%)xqS-GPxe81P4!sK8W|q_OoO*lke52l0giyk92m=Z4?Og2^} z*THiet=-gD74$_d9R}5v=|<^G_s4*bafdw32TCT3JUuLR&UgUljW22Fy@8($@13** zV-Mv6Ru#H~X6-}jNyszc&+!}uPni|55uB$e1^%dSzMGj+TXD6w)@Ch%v~sGmn8_B;nMVJ!r{`b_l#~Q={5-ViaWGq%(5J zG0-?l5J{tv=OBa!p*<&Rx*CTUvtbo~KX@uDLR>AWH4Qi=^jp@c`?rZ;ZcN>Igp2VdD3_a^po(9zO7_F#$>9i<)ad#=>S~w=vRS|05-{S&}t;EMTJjtd$dOo z9E=q;6kf;q;7cZBy?-BH+^K}u^uHl?C;Xxt;TQb|cI+Yo?ZBV2wB+ z^C3(=$>1t^r`yHe$qn#pi>8Q1<}18o4<&z}FrO4%O$$0GQzpq9nIf)QP>z%LYTa*I zh5;7|yB1n9?~^TLX=SwB8To2RVR#d3 zfwBf}(i)?3hF+FhZ(fff*)&h#vX{{pz5nlE?d0lOf0A@{Ssys6^T}NAR*cl(^U2Ry zhZd*pMo+^WI*o>&7-9sU(`JoS{9bb{w5I55Vpn(&h2VM)USS0nEr!|NhcOvA0`55a zFy=5i_Ub(m#DQsMsNZAMjxV4AJBP~oFU`s-;^QMn3m#+PxkHICM;a*=8-n&1 z)~L|S@vt*CZ@gz?WwS1vRy}*HG2ZCD`H0i$wUIYoJ@Mkq>xt4M^%%L$FuYitk%l^0 z-xhhkSSYj=kmu9T54Mca=2}j!O^nKtHNEqQG z;@2LI(gQLj8p4pQ4@G(!T>`w-+c-ahmA)Y+<*4=o<~mG^L5Vg{j%aN-YVLrzsesA$ z&?sQd4p?4TOMs{Sf8e2 z4By915iJmplHS>W8|maNxjTYWNQ0Io(o=>Fphj3s)ETt{Yc74DW}2z3k($C~2yYsU z9)@FM0!BHuDu%H|?~OqRdB>oFEki|Ci&4J(&q!~KK}#%0Y@SohpIpPHb#E>iyH3n$mlKZNk<5KC>cLkp_<-DN zveUDjoHL|$+UDt!`_?=dRI`X<_B5`?~=M!H2mB=_m#(7T*7F% z-cSu@JIucWBH^&P3}gMBpjj+gVN5z-jUDWiq)3R{j`!@aXQ4iQuQBE*ex1mN@5pg} zxqkz14DU9Ch&H!)m_0dK%oI+D?3}2VDN9D|j#a8FIbdGXe%qC{k5_^x}W^9Ulj?gQt zQIa&DG}8eCvj|_!vV3Sc)7kArd606J>M~Iw=~2S6Cc%fKPGc`aMv^r@Yi?<}81Boy zUg?$E#(rR|IM%>jXnb!DLwnWZ-a4;NNlN=&9EZ9dTHn z5(gW?`>mcma^qU|ntOv<_eohkk}DFz4n)3@C$JAbs^@~$2P>U@B@u#dO&(Z9ems-E zqPSm7#*p3o!BUSFYsrq+yTcj*T zFD`Z0cRuI>zxhFOAkHi9lTp$PuW#Nf2{Y^x(8p7la40mD>oxgeATEqskv1a~FcKFD zVMa_d%XQ1yK^7gZk>?s#n9Db{lq;|TV?B!yaYUlup~y@HVaGYjvqah)NRblfd8U9}##|zB z>6uDK?y$eDL8(nV0rw;Bnu0vn@&QU3UNbG{k}2pv{9u6Jd*!<*dj344Toiw^1#%1d z&|p;=M`VVPLi^fY-uZ~X`5gQV@fcEGUq~g8M?M+FO|mSa6#b{dx^Kl<2@e7ryb{P0 zr2rm1$?$qf!P$<#3YUhx-32cL^4Um(-+%``B>Bjf%3p|U%U_uD;yZ8sP--g9Ui=ld zD*g&vSFs3ZcmDF6o4?5BgrxspW# za3Q}5hQ=rOMxGN8qOZL{rwm@D1N_a7fwmk2PIpE=+HqKpLPmNE_n2LV_aQmP zFptneNj&+JHEfT zO$H5n5%cRrAIL&<5I=giKWs;gDSjD`SPS%i<^j~%>UT4Z^>`W0e3PtK9fwWylVuD8 zdn8o=pBA;+{z0R4UY>2GIY2RoQvXhG#^YU5J%^LOVR+IG=gLreeaNCq_PH&98Cdb-#{5yx6gY9!sx+P zqdjOTS^;&l#mksUxl+KBkhWkc@!$px)LS*bC2ll#nRk**SX&~$L`d(a(Ck(i)fjyV zKbtVvh`aJT=CK7T$~v%b)K)~xN;)lCYrNh%=-*2aF?OUqGz#peON_OPU33ZN)g-qz z$HR+_Jd#_6@QnrFh~ejg-HqVPBP1&m-h~TWqb^o!Bn^F|-Q$vbZv^|0KNg~7jX4vk z^KwH}pHaT~ngdOU!hGf)uW)6`o^cIfi~;Sr=;&kLzKib7<&M>ut>|)~(sAY>Om(9( z$9=-;rf={Xqw<953u~@XyPjhH3NNG-)5t^M=jlLAMDv?~8KBHpdYJH1#}@RD>NTx| zE3Nxt<;>qpMQhCMu@#rvrr%2aF4qiUo(Tpm)?CObeUW=l9Q+R#gGM<@TA(*M8QakE zFr>+l$-1;{A$}w-Dt>c1BevpD8hPP3#K_HO{q(Xn2RF_t%u?h)F(>@^bIjrir!i%5^6WP<3@EkBWDD)$`p zIM<-7&`+I)?gjrlQI<65E6o>d2a&NjB@aiVMNRP7r}|oMEs_GRhG#w!Lm{eJVglDl z>rv8GZjs-$G3GD2;65;lx7eZO1CoS&!aqGU+cj?Q}KK*K1=trfo zMrAr?mgv1Pzxd)3hiMO`S_HJNEbnpnVwa_`F$jV8uhHwsyQ-b#HyR=Z3DWZEQdkrz z(_*MzuL(7x)?6_WTC957BfuF_7Ch}}D?#xO4jUBQ(ca)s%0#J%U0g>TxmYK2`%lb0;RG$MN4U9wDU2I9vf z5=)G%cHDR-x?miDEbSjY#^iR8r#edxogqx$S2-bZ+{k~ayLq0%oHiHY`Q62ML(g*M zTs|)ceixR<9gvB38E<37_Q{MrfJc~@BRn<6j#_k%j4?ROL&w$?d1gOltP#`^#mPl- zT>X%w!v;>WE{nXyXhrZ>**O&VE3>jM(KB!*{R5PE%#pH}U1!|gljaDx$M}w&h`DOL z4ZAT%kv7dC;=0&&OtvcW)}XnQ*u;{8kr#FAdIWu)BcE(f<^Tl4Jh{YL-F8p!HpLuz z4d7Cu5A;J{OQ0yn;4c-kep$+1i2W3Pc&$6aYn0|#uZ<}KzuCd7GNz4q^+M(cZ^7Tx zk#AG!nVOF*Ug;}|gHCuRm5Z{m9t*A3IUds888#ME^=4{eif&aySBh#hADG7_^4aJ& zN&@3h&k1O1=vx37v0+6q@Wot1Yr|ZRfp1~CrnRO2|9n>i0+&r$FQ?ID_>En@pLbl^ zeL2m3J9)7l3GZWeCR1B6e&upyux*g`9r}?bG-};m#_GvNS+WR*_lZadvD~wmx{rZ- zpm_YQ0F_+P=-(dvZ?}Qa znDaM-5kng3v+?#BqrK*Ldi!0sO25sPM||rFtrCqT43Xa(W+?+aCwbWGeSs~1yYXGl zIJN3jn^G87sH??8enBjf>|$E4YeqP_S|-Xpz}N{Q1zHNl(32K@Th5R&&-wnYlT5c=TVPCvklC^Y<&qD0=kYE@?eX{uf|Az;hCXA zmpG!oj6<1Q`c{CsqRVN)D2G{m50naDd)9gKsFB3i@jxD4Zj?9Qb=ruxi_Ebtg#ka7 z0^+5IC4csdjhEwc;&=^RV*MDtNU~m?2hcSRL>u{M{$A^4?$6|ph+4wyE~1x{vlcyf zz^=30>nqh+k!NKPwctN7!OrHB?P8vf$A_Cisf^U<-Waj1y`x3wmSPXy+la3@O(|E_ z0@raA5qxINQ z2Co?#-@0eK#Y1*v(y_|_(;kr@P z$G{7eWx6A+Hs%(o)~Lc)^bp=3b+0L^gx3Q5hCureU!T(oJ!(tciMDETd%OmlWzmw!N5(?+16pmwT_lSpmy(nV63^zN!$W@7z|vT3v&u9yq(fURaAK`r_`j zc>9Y^`pWMDehZD>LF*^RiD5X)#7LZr@H7tc!33Pu_-1V*%F#P&=22u};BN+8joPGE$H#@)Omd z;LEyY64I&t=#97JMaf^`d)1Es_9PE<29L27^Xa4?hnh{*|Jn%p-}WTsMs!RFVKr33 z&P_51c!B@5u%Uqybn3y)K+XhJA`1eA2tM`r+Wsm02hQh#U+Y1~=Ha&z-{qKz*h8WF zpb_z*#4hM7=#9Fyp&C>CZHO`F0!8AIq+JT4)NLW59o5bu&oOW}`%udkoJ^zsxn=`B zq;ED5*GOZPTpDqUh$Sh+kVNoIvBd8)#{>u+r@aQ_(`6dT(HZe_l#wS>$%{aN`B36P z$={s6(}Syg7mDOck|)V>Njdn9>3=R*Uftdp-uqX#)^D>mo*$MBC8k3cY5LDXv=1{E zD|cs_RsOzr7=I*Q$#|Xj;<;z7pQ$9-oLl70kS4X-y7vuZt&E}n{=|pOLD-D`5vI}C zis%hKYMZY3VnfR@Vyg8F?Rszbm{p{FSC~ePQ?<4@Yr;J;@0^QSs4F(Ir}X z()R^$07hFfC+3#*$n->cWWJVaX&w*WjaEpwj_4dRK6F$gY{MLzES{>!WXaCTlAZDY zY0@CisVvP|Sem1+hZI0QDZ=SsdCJD}l!av|J4-+omVlfr0VS{mq_PC$WCU>;AQ#UNYs7M#53@YELOh6bxk-j}i!I`Lr2P#4RizyN zRb?mYZ^HjpDaZd-*@LTDw%jN7A%bQQz2H^a0K!*mtHbQQ~x_hXLQ zU_NaaTM}UCLJc%?MUYIVVBT)Ue37(z6g7T?nvS7{-(fC}v+S7&>G!w7I&kpF2GM55 zJ-06qtG0IrZrfjc48PFev~(0}Mj6w2uO{$AW;Q{v?=61M9m4#NNC z8BpJV>!{J!<2ri8Xj~iWN8sA57TdIG3+@o!8C8pCh>kO6ELyQfb9y&sgL12Yz%D)Xx;Voj zyP_&NO1UynnW!w1C6zm5N#$Oj3dXGH|3QlKs(_FDe?Ro!ecC|7u^AE|X)$^*rq!ZPv1P8L zr_?6ZBS$1_h+l8(V~v@Va8(!*sc3=PAS|4YJ3%6TjVd&xIY^UwHp*%IRA{g)VyUPuK0Wa1>z}^z>E2IY`gHfF{!gF#bj7DNpS=E?leW+GUZL7c z9}3ou90cyfm4rDHy(|(fR-4`7Oh`;hPDxF3xjpF_nOWI6xoz^=<`=Z{78Vt^@6fTN zQ|D_+yOfnzbgiuNb*t`P)1&sD%wR{sRUM8a!m^u;C*{UO(!Fx*O|9H;frO zZv2FalNu*axoPS&@xZFp53S#@=_gyZZu{wTKl}Oi7yj)RJN$v2FE;Jk{mYkM`uDx! z_L;Nheth?{i{}5~u6g3Yr|Dgao0o9^7ThbI-?MziE%dN(+3%)*f8|rJ?>l_tH^+{C z_$%?+8{)H1kAHDO-1E_I#r+SjSi5H3Bai;zi6_P58-MhS*#G8jDD)k!24kf8)x;@r zMzJYnIIFSRw}Y;~C%zOfi{B}2L2ZwSx3OD1EqE$_Pex-}|H~!?(GQZkoME&?d#S;q4{FW|r zbG-h3b>j>D{U((8tzD>SVR7Mi#($i5a6%sPjlYoh=Lvbmg??MmzLCUC-p38>H3 zC8cpYQRYwR;$23Kyn*_?eoKd8 z#a_R)<8Z&I8^31OnrU7N^vEkLoRGJMpX%ikHJB)S=gM;xqLHL7-e2=@lDl{-{EpJb z@m}wc;=$AAdB=NaPM1|sz7%R1O?%gPhpZVqt$2-hO))oD>=*Up{r!*=P*`hP#%XU4=AFdSI}Y2 z|8rHqZu@PophZPc1S}M7qv)W+UU0rwP@#CAyU^XC&|NrC^=j>v4cZ*rm~%fL$h1-w z@JLlXwnqGaxitKDxFCe7(k6>tBw0%pzpKJ8jx^a4M7Fh5zwJ!Mzcnlkq&ZId(<%bV zj*|hmQW{83b9;7L98R@;cCF}IS<|h1RaRz(y{Kb)VUkj8**0h69Q?IYDw0ayDBW7W zU_pJ|!i6@c_T`1ODi$|Up^fTci{G{kbUX>%l;2w6Pw+Ki-*#9_{q`!wpIqU$9SNvt zS9JxF(54e@rzoXpPBx-&QyZ0v#9mu_D#z&llU}xE+LziKWrO09ciGlptpD>iAO1sM zJLM)3#Fk$g%*@L5`Fws+u`?q(C$D|BuSv0rOl#>*)!jC~eRdUkwA11$Xh$hFnPN{! zOhF0&o>;oGpUsg_8gwQlS5=|6z|S^EnsOZk$DNMcHqO!}CqD!oPRi`CCY1VfU4bm6 zv?)_2WM)x9W_m*D&ZNvN6iDXyK%r9V@7`ul-}}!NiOkZ(J$+Z79YFzq8`n;?jU&Bu zr-iR}x}wgV3As)LvRpe8vyu?VbnQ&ZOhz^rU)_AopeyCc<~%5s!=+GXo>5O*qn>=q zv$Md+*^c5Z{amVr0N`>Hyl7`Ak2(DP+R)@w`)Z1-ed#_6|1ygmzRY4vaXS5KkTiHl z+h_NbzR>wFep~kBy|AxhN7*6#4jgKGSh?@j-@mHVYdh$NptfAOkAAQIp5{>zb)j~a zy|y#>kDx1rzjFoQZ6eU6O+}N3LyEtw!k>C1&=y$J))nXsNV=<Gs zFsVH-sT}vVscugoQK_vBbn1+dr42&u?QTynE8AOJTZ`pI(W0cb*5AgxQ%TKk4|Ml? zJOOuBZEe@ezDky_s(W>}a$9w`?lsjuY?_X8rMM_Fqris6;K(elE?4SS{P=+}H}<;e zj>R|i`srf_o?G+OwKw;Ds@F}6@x1k!15@{{dS}VtA=eD6sU1|mbi|WyZoFU;(h%@9{MiGm?Tb z;4$6TqCZB8)SH1Gd>k4#0S{^?U zTmxx|Zjawn>$kas7Dpza74T*Oa_Kn*2>Uy@{TYCtvlwI|E6>{ja0|F|@c_vu4G%z* zZr!~^GQ1sYGO`GYMd^w!L1`9Sy<6$DXOH&b?)L}YGVsjv>iat`R4BoyNXzy&e*gP7 z_J98Q{s->8_W|wezP7pNo>HPC34biY7dm091pJEde`&iz$_#o5c5Quuj@Fa@ysBU# zVAs^mD)NaK)?mLo($vKva=am zuc`G{dUhsyJ9-FVQrv-zPJ~V!y~t5e>+j}n5{{H>%5^~WQENH^gM36nQ&mS+cK4b> zJ8q7SCHCT?jvX?9W;F<>XJq$Ls=IY8F0%VN4z256f8Zxi2Fu2c>3!>u=5oqf2amlt;->1AkJPDUL&sN6=~G#ABi0(|v+@qp=X|2hI%!t?c7rYl942C{ zlVOAWqWpU8QFV&#IB*q`kw3A*uN-NzGcbvogHU)}o|D{{4XmAACUjM7h`U zvU2aJV_NNn(^@SmQp70r9m_;p5b_T+CD_aSmLpA8NpW46J*x$ClSG?YdQEnXFS{n& zk?kmPl+=u>_;cQ-Hm52-zGvCiZOiVlPI}jF%`NeWU#)6Nkn77@6--E^p8-19fEmo72>5!v*JYR`+ zkxXdp=8;M~4O&uAv#_9%fCrNhNVH}m5pkhdK*?$5sjAyOFsp85)fDwmIRStEe+Ttf>ak~j#thq z8xI3oidYspp`1iN6W|44=040}#+O)5L`Rzludz&W83ucSy7RQ%>QdVd^lLQc7%TL#-Dn^LMCJh>sZ=I$`;XtqkMIhuqJj2&7^1b1DKB0!ab&B9I7@0Ro!= zOtWG4X@`5Fz~-VlK{;(1wEH-SMC5?63fKf~FX=9i*W-4nURB8`P<>T>R9CrLT$E}V z`L*)G*I#Q5Un_0f`ucS0+}oFz=j+|s>#OjltLsP+qHWV&)?U(nq|8tTeXnU+=g!l1 zDr#VI$E==H;a03b#u1ixY#G4UIuXPuN&|}Rq(6ap9-Y_mJ1Q7U)gyrf$H`!V%E*}n zhS?piy zTQ~BxqaDZM@e2Z4AH|@f-F;Xv)qU)eVmf-ydVAGtf9}6x*_8XoDE9LU$IVKBY{FpbfL=+fyQkx&3PD2S{@A{4FC*u0=)9TWd!oERf5Op z0MLnAf08?(6k;IBGQsb02Qu^Uoa6ClVPIiqLoKeR?UHr@M~U1t9GL|QwhpD(TlUZc zPffeM-H3o_hVmcTazG*TXA6TB&`wdGCrFhn4s9|NMc0&7$;z@Rv3{Yy`v!q@~_(FSIsrlkimop8kFb@@&hok6U0rbK_eDFffLqbJU z2JhLRb%9h1rlK8BMJ^Va7r@RXV5hkl*!dFJ3GSehoJ)9<;R&R8%-oy=Y&vkq0q7Q} z60jAk9$q{9&P9`JM)XD@Xc_c<0R(|1qb0*5ki%Kl0sqbEi-2OX~x6AIoQ$msH5Q z!6d>O+7xIeATwfj6_8)iVGGZFVP>k$QP@VQnP^!(;+9dBUYA{aKmEy_*6a(rC;jB- z8xQV%Sh+#@&$FQ7V*$StfL|6gZa#R01>sCt+SEo)c4Y-|walt@V@jXx5beO{+pzSS zI?Hgjix~Z;B<2_V`LrnA0Bkh?+u4R5skQ!c_s)zqB~Aiwk|&S~Xo^5(8@K00VM}tC zbkTXVnrhSDmpNN*`PLHW{r;`5?|XLq6J4F(`OU_IZ@t< z6s2X@Et8cK!y8K{%^2BuJ<%dn3EPoO z{7~2Vddm)F5xC$v8Y+ z?x;;(3Ey1cFVRHcZ~l>{B8KeFtfG8KUk)98vp~dObXnZFELZxA+`MZ24(8tjxe&5~ zjVCbea&6k*lDgD2^d8=~ zdR)0{_Qtt$M_qrjbCeJYx2S<(g>Z0aCGS%e{jWq3qIQ@#w9RW#W-r1)=OTIQ2ntIrk41^pT* zp9Z>!d1#XIdY}$i)oGyH(=WlEmX%*t+pEtoUdL&*SjRni<$7uZBL=%YO^LanpG4vE z-NAN+MF0)$5}rOvdta5+LsBPTP*Tjxxw;!cE8AD&v)HA2gPBe!HL$7FWJ4k?SJe&~ z2&ZGKOjTyy^z$#2tS5h?3=fQ1y=C--@b$vh{hT%jet1?a_7}UiI;+ zp`(ZP9Qpji%f5JQ_E@dA|Gh1@zy70%10UG+*Hw4ze|TDX-PY+nmok{ zX{$N+w$fYMr*>Z2^RZxswrM0fW`U=&u&zhHT(EQ%irYjG#;($U+j=snqHBRd>&d3v z9G8mj>B{JB+rx0D)^@Ra28TWJeps$PN4o(vRIr%8NpFkg@ZDg!CjpX=rb zf1$^3MgJi?dflXv;zghqm-wo%21=D`$qbY#o0PYdQ#akPU`5>zes$~X+t1!}-}bfh z=geBL&Q_znIC)!vv+a-XoAJXb6(?UDJL;4A5!VkOcthq4ov<#2KBWz~`XEem7?b^E z&_-iQvST2ikbrY4fC~~Rpf*GAGKkd;iiC7ppf-=ru>cprw?pNDT_lqg9@+N7qH;x@ zGJD4#?z`vUh#xPxbL~sNcw*h1o40G{zW3?&8S46Hm1O_aY1h9t|4(nc`^CL4@1O9z z;$S>rcsDT~cwkcwA{Odnn+|Ockryzr=oxXaPFElqK(wKgkj_NFgGmoqZL~xPY?!k` zfQxo{mEd%b(p#CTZPDIutbOs#>NzVX)B;4mx-e6F;q-s};m)5)v`$_O+ zkn&Z6Qd{C-ar8$f14}= zF8oP(Q@d6zMf2L}^V&g8Z}$Y+O%VNLyOB1XHb#FZwF#EKS(}m8q;@9K+9u1e3x81F z(<-T@ceD%VB6GhLbKedY+F)Mn+&5)r<=KGGnFMSIbrKEysV-V(O*szH(OL>+Aq_V@ zQ_6LLbTA;nBpZYtNIh;$4(*WcJm5@DZ6GTX(~=6o7}x`xAb>ZOP5bu#>ZZ!yDSsSx@_~o`9GIo9-=ZY>r|x*Iy89pB{LkNa z`r^!m9}bzMBN5M`^#IRdU!9UTBqj0Nd`%YkRbX@$LUK8Sv_91;EYW}y%$Bu^cdPKk zLDG@uCRiR1DizxMn$K2qK~vRpZ>wb&4#~NLzO4q-qR=#Vx)uZ4fs_1`DiutQ8#NKN z;dNMu{d6hHy7A6~l&P&)hfb_RrgaY1KM>?azzTVS#7(Cg0vU;w%*j=wLb(eR9&A6Y zdd!VVS-08G&423sk2drlFlV`C`uUYJp8Ni=C9ioy5@1XXyv5t=0#;Ac|eo^*{<>4y|{fm`0EXhQgof-l-<#FbkLB31q?wppVZE4LH+_ z^a3T@*GH*Ir|E_qR#Oan82$>ZnHce~qiNleoXM4Ghm@h(pKXcGRMolQm2G?HJJnQY zq74w(QTnsO_Rn3T)?*(z* zU63-Bj4Uq+TVDGVWrUKhc$Dk4;Dz65JC*8Z71y(ywZCjuwe{srB& zo@&$KSrDB8EA1iMRKO|=BO5Cuh}zjtl0GAu2xuX9Asdi_KugjDL8=J%w%LG`B_n}I zrrjM#hD;}LMW51Y{q5XMc9EJv=n6uKeT-nII%vT&AJ@L5BUFpc;P~18(oKychg6SW z|E~7I@Q=WPzu<0!@a;ms|nUazr+2a zH6=5zV^?CaOFe;{TT^o8L&Zfv|My;sMYRL71xHYmyO-Syd+AFg@mhDkX+d=)l(qVp+2CMOgb{z8u6U!C44~3L3kBQq}^)wv$z9&{+r34t8rB7=@tSMnOC2`699*Q9PeD zS$j---&(6_Umvj6QvFW?zI#x=8(yJuZ?Xfv)P|pkm1M<1#{JOH6R{!}16pDUWROW? zgA6JrmascfBu3*Wm5ST%yz4HdNIR>Y)BdLYw>nQfcp-D|mY@8)`d=4(+Kbv-N)MsX zmjkWK(RK>)rztcxAgF9Nl~GT@l2Tl-0fR_lT4Dc07}J`}7$;KD1sf*JQkb6Q$@X>k zfUYZrsY>6?nFBHs(g$R0QheI2+7qCJj}6zp7&=7B8?N3$o3a9HfUwU-+xg<8uB*&! z>+^930*M|UhAu4wdKX}h38Z7_une$e;*Y1VWut%F@>GBBs{wn;-~9=%?s;v~Uz;e} z=FdcY)~kWk)W7?aU)|H^kEd%9pX9f@b~@|{u--!-3xj`KnD^V}rkBDyB!OI1itXUB zu%>E*h(<_2cuYu6&C1PlIK$R_rC$<7!a*XhttndCL8K-xzc!E#^k*ZlfH)qoL7f32 zV}et9R=Tfy9*a#7E$t3VVZKt`=dx(QuB_|T-S&+r=jC#6?sSrkS6VvN1bQ;8t~H7y_>R(Zz3uP;?V-m}9Hfu*>3gj% zteXP7r_Izjm`+uWF^GCib*eH}0sEKu#I2ha{PxJ3 z2mfED^RXvZZ&M2I>^iK=hVLtR&j#B)-uULqKYVdv&z$A{r>9=iC73ye#}zO$snX_%SwtJ>AWSmFshXhWtOem{o&BNe>i&Gcbqxb4Vg50u76^KZKL+% zXBKIH{L_6OtRC^eLZw~*C!bK#C(~RgVmRhv9p)mJ_NGjl1Q$BZ>eoc-wB(Ia&`r#M z2)H2s`qOLui2$t=1}l>U+y}I`2Kr_KESU#s_?Bk0UEOr+Q=VVt+v!Hi5r>N zHz8br1%}m_w`?}Fk&JFb=lsbK-`SFqjV)BFXWNo4mc(}5M1@XgWtV^g0vSkHS39`C zm%2#-R5xVFQ#aP#R-2-f0T+6#8?yKJO7-rU{fA7uey(!RSV*!x0jCs5x)JPw5{^R2RntI(QpncX;Ws|; zLgV|NBwyH^@zC6bx6B;%%A`-V-zi?@*3sjJFI3Lo{qD*U+Fw5$T{VBffL+~tEA5n- z6Xp<8roi)GsOM}=7zbok!i}H{$m~~qfppT$S3%4UIBBJ3SNJo@k0g)*sp;M2&R_mg zJ7h`zG_j^(^}^mAKF)ls_o?%zE!gcWVz5?cEdiX%V4WExJ{CbYy4N(2p~}{hKo1JZhN@9T!pnNKlUFuCURx{d{>>~7NbR|9809b(w$$aM{NuvGBqSv?gp zBUnjY312ot4k;psE%t2d2*cQ;Q~LRO-Z1E{CmJRWR2FY3{3Ot`U#4rw=&i5rgFLM* zed&(BExmc>$`N&Qr&RXnbN#*7<8Q~(dS{& zI^6rf=6Aa-d7ww{q19!@$yMtAg%f%G_2WPmfj=w3FXUn^r{ldU$sZ;9Bt1+cc7e@i z#BJ*Iki2W*pu*x8(L=B)gz0u5zMX_FU4_i_4|+H#HfWVP+@O1@&un`38SPNd{?#|u z5V_m+&ayM}mM8iUIH&9(I|dX|SM63ulbDe%kbrBSt7?)-TqK z8@Fb{*NZJ@&(pi2YG{LYt8x&1AXy)t0}g6Fl?|m>K~3p)!M%W>4+jpYVs{qU-Kp@? z<^B+n3najWV5cWND;p>QmkqL%f|xm^4h`OCH0kIBtI*J|sx0_I&#A5`>{+3db*OuE z=DbH|JUL^=liEWcr(QqKa_)TUxV4M>*_UuX_4yi$`AWu$lJfeO z_>wma*0BWX$6tjCNs_53gSnd_AzH zzJ5*M_28P%rZi5PI(1T`viuB~h@mUrJ#+B>VZ-i+ap0?`pH@<#vjtD4t+EaVyoe{m z9?bp;#Evln7(5xQ%LZHK!IZ-_+Y`-}c?ij4*s_R!0#HCP0GUqn4nP`=S$3{;%Vx$5 z0Db6*-A9NqTYg(2vt{GPX{&6v&041Y@zi$@tsXIdi*{7q5N6E42ciEi^q=^kX(H$$ z_!0|5?6G7dzz1Oij$wtM>W8&1%nGH%VTDLwhFVTCLSe?3_Fzb+aF{D}vqMEJBUFE1 zZ)fg*X@^p(9~{t(5$bi_taIy>>W#qs2qR?d0hUUP!)5FNJOg;if>&W6nRHw54VC&g zlE1(MkyB{EMZSE{-2{?plJ@M&%6u_7h`rPQl>xSrZ@?b~V6h z$=-XHDrLO}^cYpHl%2`4585z8+pjEFmt64AAM5L*Za(i^Ti*b1qEB#=vu2}DN$~mN zJqkY5#4SL#0!y2dfyNfmfPk5Rc@wCeGSa0+r7%~iSW)M!Xtz=+)S9%dma|%+q8&J} zSowr`0p_jkR@9#_4n*nY2q_cHdO2VvloPRfx&JTdNy76ra&Es2-duX)p6u~d?~FPS)E9u1P(=7 zpWv*ZYu)gc!t{g!hqJTiHpRNwQwA0{VVaV4THD;1*EXSj+C=Sn0I75Lx64lqR*q_& zhksV}mQOi)-l;tKz2`ry)8+yE&}CZj1|_&Bv%by15O_MXEkx?u*qJg$-&Rr%@A6b7 zP03ekv}4M^iACL<%Ai3?5A7qRR(pB6tDnp1?2%fhx|Ba|9Xi{(ed~oYn&)@^t_X>D_G8-R zlD=imp>=gbon?JXmOr#KbBuD_ZyDF8?*}8cEZ^L-q5FsZZd;J<%$RpuzYn{Q>G|X3 zTZSLGcdQ(<9}Ww5!rnkSFhhd{dWTWy4s?bh3vWL7_iK3D8t!VC2h!~=hi>m0ycbR) zrmov73_~rmqA4o^E9((|YE@H539B|$O@JB!s<%_pjBh4%p{bQnt5@I;`HxDN-x z$P4QeY}c^d1XA&O7+#c+@*RL61wv_bf+Gz{gn&_YW-4rI2$w2TO8S*05Ofl{Tu0E! zXlQI~$NAU%-&LcJuNrBR=TcXPm`v8GG-M;aiqV81+<6Su{%{^mTZr zL(2R+)14`hi&VmTL(!d1b_#d{!&D}c&{>tXZA>S)qKMNLu;0;h_0KEDUe~ir$%JHSQ&rXEageWQz?M{1 zMG8M@9u1^r08UAG4=W+H4PO2vHDAC2ttR!;qrc17vBcdS+bO-r*AX6XS=ny;(*NGS z?MKsA_wF%b*xieNxb2-kD;-7*U9aAGNJ%Yxb8p(r-IewWhf;dJGBab}zC6WsZ1Vl> zRB;{S?R22}Ir#0i$Cuq%jtCS%3c}k|dA_Cux!&RJl~EB$BObm3>qjt_U~)DMG?_Sp zY?r@))FW8zaGxPp)B@>9Q@{(ppgnmE734wV(-EV$lEDG&TedquE`R<4k3ScMtymn+3W=@}akM-cg$%SWL z`}HGRhfHdik`0%Zzu8Kw)bu^2+vcXX_b1Nk`^x9rwvL@TwfmGkWy!%8xv;$O&?~GJjvWJ4dL|VD%ErPcW|Z+Oure^c<7w=224?J zXos`|*qjfXvt?*sHjOWNv8&>`@cg>l)@g^7GTcbki_mZf{A$=(Y&inwC*7O_+mK<{ z(M?3KqQFuQdcJ?ZvgP~~>wT8x=kFt0NAFQJ;6199uyFMiYXyv>f%f2?4Mk@^wn0@$ zGEN@;{Bli&D^LT}fa5=e7g`?t+6^>=co`>v*KSB@i1h?IWGO1`L%34nZc1?$wC_dX zJkQSbq}*=yUQsn?cItE#wBEE93@gsY^@v{RzTfOM!TY68wYsvK9&sV&+=dL6Dcg+4y@7_J>?cbhSr@HI!>M*!n z#mIqE3x}v1M?PFWc;>_Zw({lab@|=Od;{yhJL37dgU79VaeTwmbGvr>|7!aZz^JNo z|8wu1nN0SX?0Y8ro=GMNA?ySaRv`q835G2MNMwhw$tskhMNkB(MMMRP6p_wMMnp;# zi`L@SXBB+bwa;!^YW@3^_SrCbzwexTXC{*gc6oo}<=#8XopZkPopZkPeZTK_EQ5;6 zY8$t<=L{>)sfa0>l0GQ6AhpnJCE2~K+oPODZX@C4s~E-Xp;$C;DynsMt$I*+`S+v^Hz?fqPT z6k~KWaBD-rsKl|YE@T)(tDOdn*ksM%+BMi_GQjsfn2&X?++u#0tIpIzdHcrjvDzME zBF~QttxZ!k8aWkr$l;)Id>D#trR*0Ap_xYoN1750>A3}i2J>dL4aPfzCpB;CUs-`Y2A+P=3o{#CNM-}s-dvvWq(Y_8upyJJ&U z*6zh0@P05<{zASFzW-Q^6w4Was;&evJLviNh&ZO|IdR1a`5;D@#A9??x&ei?ykWYe zeqlN+BOMVG@#0}R4!87pBcSR1!gSTNtgJE&edZUzx7V$n{Db><-ghd-*wi^|)vJ@O zH7@1Cl6BEDhwq+w==<)?^-XI#M+{nlpd#sIJ6o-ECa;9Rr%vHE9R)pt zFxO+?L(mpEv&tDtm%Y)AOj&y7zn;IUW3}>TWx4(w`kEOYqC7A(ktaJ`jM}MISGv&r z)O0FIDkfullnuiXrKr(3Z-&>KU-1+Nc)f*Q69f)RO`6c5<&*~ov=PAFG`7(TuxQ|r zr37l~1O;ee4nH!7p&1d$Fs2Y#4uPp|Q+Oh`XE2>7VGc}%Y1nNDWf9a5(#@~{;6<_H zI>y|s4~dlUGCb)fOnz}DD7$O|9L$t!QOw++4T{I=J=TK~uf6u1Lo|2MI!^GcTS34=|$i|JYTN2~b zAbTl9cR}gUZ-m{SPwlC$aMTkm1hfod5P_&m0LnU%Lgd-H3(r5#^{PR!%8wy8Js7=Y zs;~UfTQuonc7=42D?#Ez>MbJ7n)nC{Y4Su89ArLsOK{=%2}99>ITVt7a?_S4pWL!3 z{FY(ECr=(e>=xy!#GZJfmpvinjk$Hk*xDI0pzp*pLV4f{A`R`Tm501&T9$=YP;4F1 zQm2lCr*sjB(RqnPIQL4#RhltHs+rHBzR#bl2sI~iSzCXi4o^&(t3 zL%A&-YD6t4aUvd39c~jFVNg0G02Umkbp8^MzPyu=GXaALc?~eLBl8vzLmD4Nh#>}8 zN?`?5?;JP3y!N@r2bGSl-8^+0icMmIdOrQ?)xPv`uq;*PCt`K1lZ$B({qLD$%% z_AyKDrO8v0&g=FoFZ^S8j$kPspO=Qc>fWQzlh(ZKehzZl={~4C3!g+fWdafg-yT;% zYazfXy$(E}?-33l2VT03r;Y$<#{qAc{3CE6rP>ifV7p`jICJnKaKT7AhEEUnV|R2+ z0{C#qUBGi;0Q2!U_YBC6g=qLZ$srwiaq)-^4Xv%5o+nx5sM6xJtgNZ?-?kYi-FsWU zVs;u#YlMJ!<{vG{k}a)6m*day^r1m++? z7eW<84upgaLT8&%bV9V#ifx24R5BCjK|_Z|JiIKuXg~W3t`cfgO1O#4FNlhh`@AJvO zlV-T%W%5=;z(YYA3jYK&R%4t1#}5>dqn*P@>5K?op$Zc3AbHglT%+{TjJ31sTISn_ zOuYq|u=@-JMHz*mmv=^wANdj{QgCyiAD0`_@hg<)K{gh+i|{KN#{{1kgE@Z*W(?B& zAP(LPqKT2(9>FH=RkS&A7g1LW&aJk8yhw29JP6oy^xCyA9X}psY}7UHqGtaudF0>kBletEmrHJU z*8NWB{WJb@gyf@e`7BlClf|ACh<={ZPD@w}!X7b2W{{XvRq>Y!5-kRj3hY+$){weJ zrP0h2m57-qEs8GFk{}OC#_-A`&HOYm7DkGgd_3T+G=gQAT|rTXv@DWRq~JF3s5pcY zECrmGgk;7G$$Z{tk{VGxeuBSv7sg<5zS`49DOX<>@3!xHq5lw`S#2n0j))b8RS=ssJ zB)?L#qq2&8#^q%YZeEQ;!R+W{^cr_I(u`>jrYV#r4ikLI|Hxb!97r|G`2_m>QO^W= ztV>Lw(iqVw8=$UH>(;$=>{z(5Q9jzyR$1KXomJP4Nt#cy>W%#Yv=_KX_YQ?H3FLDE zgGUD`r#b@k}-Kc=*_|(udAFbQaZfN_|x1zXs(2%S$8n z3}JzKGhoBK8L%Qp$S(ty>|$sOLGZFFMECI3$Yh z66K3m)EV$d0&p5o+@qeA#yz{^O7NA*{cE6q^^;E;PM_{M<1cf=n<#%OR5w{|#7P;QCVR}<`u(8IGj89-l@u@#q+i8GFRLAqI zPUNExAd3w__pU5&tr;FSI`n7S<*3lQ0D?L7-~%}&IqeY#_S30nk4Hc>j*EU|IH$HT ztwQ{y$DVav2>TORaQ{e^}t4Gmkg z1aEwauMX1p6A^U z?!GRu;9W_cY;dXE{YyDnu5mwyEG$|x%y!4~T>X3o22?FYAG}*cLBSiXfHxYF^(jl6 zA}&e1`#K8IHkJsO1u3anoB%Tk09|vaiiHd%3?2(cY?S6lUzyY_ z-T#|15%jTdiQpU1`;_R$1wNyBi^S(KS}SomVeSfrw;p+>&(HcXP?;I~*GTVCd5)y|)QiUTD zLvI|0-W0CBH!Ut8RdzE?RT!WtvIG|bUgEH4;tE5Q!4XU-rbxs?{i?#$K{s1H`&Q|9 ze5jSy@sqb&VuZyYi~liRyoFBqCUlf|c7SZsLH4{G@~D{(qa_LhAU{S+M-Z_xVwH@< zL$b2q(a^GVU7rBB1GqzCQ%;kdN`j0cS|L;)A(d4n&=y(X?}BAoe`=2h@mkZ@o0o%#n7eZ zt|Jj!WZcE+KXu8W+!K&kK}m8LJ?-%*FxXBwsV9Lzp_0xp&gdCNi`Wp3RtO>AEnFm& z>yF7$kfKnEAR(K;qIM^evqWc3&*GZ-1!H=U&zTaL{#!7iGiRQ={=~OqpQq1A7e5%SSNI5lO2kB-_N8pGLl` z5G?JYBnC@Xe^s^Aelnbe+@p@!y^(esTWA!@!RpAw zWI?DX6NX!7FfpqF5oN|KYtIDVyOHeIfiy*1UwOr#Sp$Abe~nKsL0a{t&3u;eSAE^R z+$6YRRBJD9S65!(x@Nyq-qFp)yu+e{rE1u9!BSAL)Fx%QKR77mNI4I>KajE>biW4> z?PlEPeIEc?`p5m=LsFg_)3$vv;rO$H_hSR)hlqcrFrfiXaaig620Smi3P zU!M}xg5p1vW=h`G7{nx;QWRf^gjSrQ7NL%TEt%J((n3 zny}=aM|ah=-u-w~mi;^&`55%@G<5u?>HwqG&NY6fB;5$aC!Q5Cw(xkE4}P&qT$ z9sNs6GcepQu^13k_X`FDQEVOp=9sx?@Ihc?@bZgvr-zYq1^_YGY~+#QewbtgQ?QzV zk_VEuHV9}7fPPhaly`P%Enfu$tk!G1pQ{T3Y6rn10o@Hp4Z)5=J_Nx~LfH-&>%s`U z%*iAO&PtXdAOpfJ#K>$UXkTAC2?a{wPbp#0mVBjB;HA1FglHrqIJ4;epLdl3=|VJY&@1fy)UY$n$o;Q)%HSb$1Y zik_15tDfH9K(t8bPky~&(@A~xE5&n9tzGR{Jg7&yc4YzBsL5wR`Tg(c?britjj&h+ z(H!^^?UexiQc-HS2{sr_IhgOrz!war&~mhIFze*nq&VE!l}m_q^#vF4q_*8F6{!ea}o zY(s7NBX7B7Wd6^)Z@s^vqkT^0@cfZea9=v8w0=bET;+G|CpOj9%)N6=?dma8GLuVl z3#!L7CfxjVMV>2^zLfRCH%bK8K0vv|4 zXadZtZk<3J4m3I{0Ei9DH{~iu0aZS|MwjiF7&w6R@UnMDe7GaR39Sk z-g=k#)SFUa;GKkF+?|)2i2xjsklaeHMU`jB#(uLie zZsok+q!;8oF5>ybWl?7#uY}|ro=8061@nra7otoK!sYpLvVf=q^EPL#2H~DAM=-R^#U_sh`Uwq7jx2uv z#nyc#-+f~H`R1@2XU#k2Hg8=x<@uI3_T6!I(XJCx`kDnTaR$YGO)ij{rZh~LFC`v( zI&It}kPJB$3}Y3|*R+cq5F3s>hzo|HNK5ax&6t37VRwq){H_gbuCTL{??Brs5NG3pRh}+1X3F43Fq5^ zO%ew`X-0p>ophLu$%1hQSuK3zMu0TM!?=^ev!YW7ltzJ2BUL6a;|?fVZpOI7jgXtM z?vM>~;M9Q3JGx(z8FJ$t!N22MuT<0v?G{68=$kPKp8+zIV56&h>VHsX3F*{8~7|ej9!WM*l4h@Bul|ld+;Lf@U zyOb9(6fNZDokas{$P!GNm^xiTdaPHSM*H(m>5|o%^v2zgqC8WZM&;i97|5I)ryNA_ zAQ8I)h{`8+p>E$2KC5ly^6fW|5TjfmAZl zFD>iuX zasxKiuX(WHo`$Lo?hmGXUb}9`5jZoaT$f_p|MTIT)7vLYQR`b~cFI%N&srwEbw_vC zsHR6&@7uY~I{cYwvk&at?Eci<+2j6M{pO!6TeIWv4@RUnZ-l>1a9({1zh@qHix+qu zf2JP7s313-78J>GIk4scUExC<08QjcM(@rehCs4d2sDWhxR=nUJ1ry>Ur`gtVJsq7 zhvsQQHSryF418h98M73?m@qOrV)BF=K~U8Aa{Va&D}^9G_MeODdSGbSPt~j8q5h0O zI;Zc7V5K%EBLVR+kPy*mcc39SLr`B5KdbF_?m) zqxhUfW7z;)K{WRwZ3v5;{(M1kwDdm_m^4VA!ROpBJk&wLo>0r4=u`H->_(#Oe(Xk6 zc49Z;WlrKNVNjeCXFFEtESDN`5l6#anj=O(@qma)_wXjes zMqsukZ65X3rf*I1XjBtx^ofDnLRX=VbZ&#UIkfiBe~LO~BTM2QwNCk3ok}p206-+z z6uUFxQ_wx4)E_#kFJ5`fRCM1Iips0e#NUthCpg zn&nO+v1ijFyZ|FH5Zs&w-4Tv#ZVba>MN|M(5=~u>OhB&&PzkS*;1z}UwZ7_6BxaOz zsu)g*X~j?BbxSqd;Bi$9vQD!Pzz4|=BJa%!jiGt5lINBMaaKJwV-vaVF0+?rkCSrn zx<=bLcMR5Wl*#6q^Ss-2A$9Y{jyZehc>YHo=N0!ibuBG*V_RC39Q6W2AJ^B{!Hs4` z8E9{0#0$)1x0CaOFT7I8VJwDvxPpmjj(i+MI8I}D0t^jeSj_?UP@l|~?ucw)Q%grC zMiyr@ZTCPq$K7EpiF=FmaCrn1?*Oep`Jzkk2heUxv~w)hn|-5RB=>pyH_cozcMbT| z<{jMBymD@r1Y(@>lKNT8o2=tnmq&<|*VJXr>mK;kMzE_jE@@h~_qUDJ(&oH}-OCCd z-ZrC}>Pp-g;BLY=AC20AC6q=RK~~m>y$MR_iHLA>ifT(td)%xdHZ6p|oKeIBgIE(M zT>myECmQhkvpLnj0yD24rIY@18sz(xSDlsqnetLl43>u|r`Z|FTjN_~ zSS=RPquJ^sn|gI8>hR>tO(2738=O(-Bk^d%0IX5ibQVn|lF^Xp`E9IGvI)PRGK_V~jy2z_NH)*0T#8Oy-8j&kG zAlH}P;IB&9p9NTN>`ee4at2$hA}VOtVr&`Dk<{2#%btqOyu(bi=M@mO+8%B`TecA9 zlybULDDx^D+j`+&zR_1WGQr6R1TzuwI6)RLT^S}DnpOx&?S&qLVpz!rX9dr8jgV$9 zeD<#oDU00(@QO9b5j`urEfQPpVMGP33LAu&l7bD@>mHv$e1KFcsiKCO)6;pjzDs534X;glM? z6}U}WNtT!$IYl^ow)f)mD#s-GxpZ^6Pq$QNp0$Tw^&{Q#ou}r#zIntGt=oUn5`N=p z^LBW1JEy!bv-R}I(Z`mxJ$ct8sl2su`kXn_8|7rxpUYX%owv?{FL%PAMR$-dclNC_ zTPEy$Rg&FbJ$zUSIs5`SbQKY^2PPq$M-&i;^^Mxoo<=DZvM?V&^`T4B9)vuB&iin*jtj$k{_C1oAK_dzkh`(I%-& z-W7(&X+pklm+qkQ9M%sp!1)s2K#*8_n}Z+>LeBEFH{S-zv*PBPz-U`sa`IZDGm^n` zfgOM#0tbVT95Q9alI?{)(%<}d1v2ydu9d5XQTe<)AYdo)*`@y9d+&s@RbGhRg}ogD z@>}R3Lt*eXD|yn1ix<%ssVpZ95&!7-^k+TaTPeGwEBbZ7Zh#*J`R3qh<80QP+f`+} zz`i~hb(n#&N|2bv97ggra+(HH4w9;35i(Kvj8;mSwXSnhoFGvM@c33yH z$kWG6nze_@xlevm`kQ{g_&spagnEAuoLwTd$Egr=1yhJi8Fb4`k3c`Mr1i ze-3svmS)ijSsKxdgPI=RfpxoJC7c{bHj0XwlSg{?)^hhlhg*z3e~qq z9&T)rS;0Ne6o3wkv)O$2%jR>_?M&kZIH06IaDIjiq^n^<5v4J~DFR>;Hp>JJ1O^8X zPScpkDWX(vC?8TNJO?}v(wBXogM1mP7#`()jzrHwy9ZkkOs?1%VmwSk_65(>&dw`ZF3ZceTBXc4X8pMKWOK`HYZ9fi?!mIu z<$f$>ZPVguCw}n$i|$WLq;q?XQCT^rdqY0ynKAkC<}GU3HLs z-K&jpy0cEF+bX^3w#qwR*|qDH8=GIc<~}1eUV903!+*+kCV0Iy?E2PF1%& zL2jklzuLtu54EqFS6w-#x>lO$*%77d>{<7(+$Y>`>8`7Cm_-QT-EXtmHt^<6rB zCSPM?=|aYyR?-h}KF3bzCb7d90qSuy7~W%5`X*KZTj;QSk?qIPraZx>(EE68w)_NZ z#(A@RmL=o0$vE!AF&sw;jyxPz95Zmt#L^N6kuM>#v9Pr`jWJ0f@BK8gW!igPwQVo1Py({QZE^IlZXf53aI*mxWjc<-QY zRqvOEyI|km!{T)nypr$qu3}5&n%;*{uATA(wiEK%soRfZ1^@g``i^47_jj`*#l*67yV*wgKobpB zct#4@*ep>w!=~VON6OjEuKxZ|=|`&UYw-CR)`p`1M6tvwK zX53B(rz_)f-|jMp-kWbV!Ubyi{4maH$cqq6VJwr9Ve6OmJ!b0Ftj?)cna z=bgw;%3qcLT0wEabA=-c|D!0s=wQ*u#f8Op7XPs%s$@jTl9K02^Gh#UQ>^Q)@0YDF z`=&gl{6P7~wo==6+n3msWP7Eta#Q7(Rm%n?3_4ytqWZUk8wWpEQ(W`dkoqAjh8!C5 z%FxWA4-HEhcIUAF99}#8jS)>F4vjR8>==1*ROYCoqpppfJo@Lgw%XUm3>(un#yP;> z#W8P;d4J5`#>R}DJoY4I?&c#wK60WlP#Uc-g~##DTU;y**wYaOts z+th14Tft7M*C1Dv64dJ;c2OFpUK?4Z)T3Spvjn+Jy$)qIdAxcZu2|$d)$0gWsXwG% z|ANKo-%zhFvoif})$3PSgh4Ckt1QHjDPDh9VM&H!HXRwgtKfO<1fzHdt}WOJaXPHa zHF$MC`jrKD^Vl*V&n>J0uPsMb(Qy{(1wRqP;Q{wOEdN%;%q5i`UC}IZI(%3_|&q zqBe{1Ec(nsyt4#PY~xR>!rdTv4JtWT)jv`X-_Ka^9FoyI973Y)_!auKRroy%es3ZE z9SylH$L|TbZooIX_^0Tb6HqTI^(yEI{X37p*N%5Od5ybJGy2}Gxa;)1N9`v*DSmw! ze!5Unxxker*k;WeT2;FQ8p?WwLi(J3*RNVQEkO1sFg??Ne>s`nHK)5 zBw?zXCYkAw;bh!T<d! z*WsSZAvB;KvYp1SyC4w@UiX#GYSe{VVFg~Lb|9@@f-|-HB1mW|%01byB;J|~B%^jb zh4hJ@+y?oOW|5>sf1y5Xu_T~e)K@03>6S#CYxzCyFtb_MZFqeKT68LOYzDs{jrDsY zJ~IXP6L@bW={DlMF*r|w4$wCy@N0T5m7KJE3Ot+^SyC|b=rGS3u+lfeYZJmk!7dpNMuAB9 zGtHQ1qcNk#V)l(k=3OFC)X9hnredB=N9i(<|CEK5a}LWz^fn*fib6!(ih(yNMW3OP z+xX~Rg&I_2w68(EhO%MUPj&=2^hZG}YoWDcp~dxV9JG7__KTZ@es&9VbSmbyY0&HG z(B@k)GTa6XK?|D+CZkq13-PWwY%ZH8>DV!FU+rW+We3?G*>{1f+YK(LAF<<-o_&w~ z8n~DJ*w;9S?U9V^Zgz=%CoP_OYw%ZFU8k@F(_X;EnEp#1}*RmO#HAL%Xa*Yto!Z zeSIy)%+JuP?u6EDWSg;b&N=otIAgZJ{W1qA0@V`6QPuPF5ccl<1R008$M4J$q zz^M@>MN2VAFpiVr5y9+cXW29CMPwp9&0b==*pskTo@37=+MC4gm6D|tY+RHkr5hG4 z*|4IcT%2q{YnFAEm5nY_&tt{8R(-v;LcOn2&oy+mm6h?&<6N%Z^Uvd+e;(&b^>zL| z+z(RktJU*h^{hQ_w74%ni9T6`%OpEEw7 S-L}|cikNiUXFnOj*#83LCq0e; diff --git a/website/assets/fonts/sourcesanspro-bold.woff b/website/assets/fonts/sourcesanspro-bold.woff deleted file mode 100644 index 3257aeddf27c40f6d920b23d272ab8d25e77c98d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33612 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 X!MKqdM6>~IswnaR00CF(yE*^>v(EHK diff --git a/website/assets/fonts/sourcesanspro-bold.woff2 b/website/assets/fonts/sourcesanspro-bold.woff2 deleted file mode 100644 index 42b02574f7ee2144c72afd74143073894ce064e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26800 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

V_Yi6u`q zh`YVLB|hAF_)GXjY@_Yflk^F*y)a!|YqD81UYahREQ*rNS6HrIVo?=Tx9JqdYg$m} jE}&o7JS_dk(%JWn71cuHQLnwMhW&8oGk~`Kcy0gy9YLk7 diff --git a/website/assets/fonts/sourcesanspro-bolditalic.eot b/website/assets/fonts/sourcesanspro-bolditalic.eot deleted file mode 100644 index da15809396149125a0cb79eb02852a281e7cfb3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55994 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

2^By#(L6k#h&l&~lKP$BuT< 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 i2VLutI17FU{+xaqgHy{Y{dAVw3NnB+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ 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 ae8b0816668b20b1cfd7b8a733540d85ac5ea446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55764 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 OfjA(|{^*x5P5n1?1pB)H diff --git a/website/assets/fonts/sourcesanspro-bolditalic.woff b/website/assets/fonts/sourcesanspro-bolditalic.woff deleted file mode 100644 index 3ac22abd8631f3d6052761e9f1d4a49a81363ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28960 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 diff --git a/website/assets/fonts/sourcesanspro-italic.eot b/website/assets/fonts/sourcesanspro-italic.eot deleted file mode 100644 index a5d050e7524b7604484109342898c38e44ce937e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56574 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 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 f17a128568ee036dd2faaba08b7409818c0876c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56360 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%0D% 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 diff --git a/website/assets/fonts/sourcesanspro-italic.woff b/website/assets/fonts/sourcesanspro-italic.woff deleted file mode 100644 index 32c1e1962b60de2c6d1974f41288042f9ed59953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28844 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 diff --git a/website/assets/fonts/sourcesanspro-italic.woff2 b/website/assets/fonts/sourcesanspro-italic.woff2 deleted file mode 100644 index c3d399f8c041bb4c69d24eddf2429461f1651365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22488 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 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 0bb5057904308ba09bfae7b1a6657dfff683625e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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 diff --git a/website/assets/fonts/sourcesanspro-regular.woff b/website/assets/fonts/sourcesanspro-regular.woff deleted file mode 100644 index aa0503cac85f92c25d370305b4325626e8cd02d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34096 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

~S}J4)I@oZ+|Z< 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 diff --git a/website/assets/fonts/sourcesanspro-regular.woff2 b/website/assets/fonts/sourcesanspro-regular.woff2 deleted file mode 100644 index 06206e4836a9ea8f68abd17650034f1880dd96ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27292 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 H`W*lO$7q<~ From a8ff8423bb2ecc0b6da3536aeddcf261d80be00c Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:17:41 +0200 Subject: [PATCH 464/739] Update image assets, icons and SVGs Move SVG sprite to Jade file and include in template. Only use SVG symbols for logos. --- website/_includes/_svg.jade | 157 ++++++++++++++++++ website/_layout.jade | 1 + .../assets/img/{docs => }/architecture.svg | 34 ++-- .../img/{docs => }/displacy_jupyter.jpg | Bin website/assets/img/graphics.svg | 84 ---------- website/assets/img/icons.svg | 43 ----- .../assets/img/{docs => }/language_data.svg | 31 ++-- website/assets/img/logo.svg | 2 +- website/assets/img/logos/chartbeat.png | Bin 2761 -> 0 bytes website/assets/img/logos/chattermill.png | Bin 6351 -> 0 bytes website/assets/img/logos/cytora.png | Bin 3028 -> 0 bytes website/assets/img/logos/duedil.png | Bin 4254 -> 0 bytes website/assets/img/logos/indico.png | Bin 1668 -> 0 bytes website/assets/img/logos/kip.png | Bin 1770 -> 0 bytes website/assets/img/logos/quora.png | Bin 4705 -> 0 bytes website/assets/img/logos/signaln.png | Bin 3321 -> 0 bytes website/assets/img/logos/socrata.png | Bin 5121 -> 0 bytes website/assets/img/logos/stitchfix.png | Bin 1993 -> 0 bytes website/assets/img/logos/synapsify.png | Bin 2532 -> 0 bytes website/assets/img/logos/turi.png | Bin 2915 -> 0 bytes website/assets/img/logos/wayblazer.png | Bin 2306 -> 0 bytes website/assets/img/logos/wonderflow.png | Bin 2626 -> 0 bytes website/assets/img/pattern_green.jpg | Bin 221731 -> 232481 bytes website/assets/img/{docs => }/pipeline.svg | 6 +- .../{showcase => resources}/displacy-ent.jpg | Bin .../img/{showcase => resources}/displacy.jpg | Bin website/assets/img/resources/neuralcoref.jpg | Bin 0 -> 31380 bytes .../img/{showcase => resources}/sense2vec.jpg | Bin website/assets/img/showcase/foxtype.jpg | Bin 27435 -> 0 bytes website/assets/img/showcase/indico.jpg | Bin 33559 -> 0 bytes website/assets/img/showcase/kip.jpg | Bin 28937 -> 0 bytes website/assets/img/showcase/laice.jpg | Bin 9263 -> 0 bytes website/assets/img/showcase/textanalysis.jpg | Bin 16789 -> 0 bytes website/assets/img/showcase/truthbot.jpg | Bin 24521 -> 0 bytes website/assets/img/social/preview_101.jpg | Bin 388748 -> 383381 bytes website/assets/img/social/preview_alpha.jpg | Bin 382786 -> 386720 bytes website/assets/img/social/preview_docs.jpg | Bin 258021 -> 0 bytes .../assets/img/{docs => }/tokenization.svg | 4 +- .../assets/img/{docs => }/training-loop.svg | 4 +- website/assets/img/{docs => }/training.svg | 4 +- .../img/{docs => }/vocab_stringstore.svg | 8 +- 41 files changed, 208 insertions(+), 170 deletions(-) create mode 100644 website/_includes/_svg.jade rename website/assets/img/{docs => }/architecture.svg (91%) rename website/assets/img/{docs => }/displacy_jupyter.jpg (100%) delete mode 100644 website/assets/img/graphics.svg delete mode 100644 website/assets/img/icons.svg rename website/assets/img/{docs => }/language_data.svg (88%) delete mode 100644 website/assets/img/logos/chartbeat.png delete mode 100644 website/assets/img/logos/chattermill.png delete mode 100644 website/assets/img/logos/cytora.png delete mode 100644 website/assets/img/logos/duedil.png delete mode 100644 website/assets/img/logos/indico.png delete mode 100644 website/assets/img/logos/kip.png delete mode 100644 website/assets/img/logos/quora.png delete mode 100644 website/assets/img/logos/signaln.png delete mode 100644 website/assets/img/logos/socrata.png delete mode 100644 website/assets/img/logos/stitchfix.png delete mode 100644 website/assets/img/logos/synapsify.png delete mode 100644 website/assets/img/logos/turi.png delete mode 100644 website/assets/img/logos/wayblazer.png delete mode 100644 website/assets/img/logos/wonderflow.png rename website/assets/img/{docs => }/pipeline.svg (92%) rename website/assets/img/{showcase => resources}/displacy-ent.jpg (100%) rename website/assets/img/{showcase => resources}/displacy.jpg (100%) create mode 100644 website/assets/img/resources/neuralcoref.jpg rename website/assets/img/{showcase => resources}/sense2vec.jpg (100%) delete mode 100644 website/assets/img/showcase/foxtype.jpg delete mode 100644 website/assets/img/showcase/indico.jpg delete mode 100644 website/assets/img/showcase/kip.jpg delete mode 100644 website/assets/img/showcase/laice.jpg delete mode 100644 website/assets/img/showcase/textanalysis.jpg delete mode 100644 website/assets/img/showcase/truthbot.jpg delete mode 100644 website/assets/img/social/preview_docs.jpg rename website/assets/img/{docs => }/tokenization.svg (98%) rename website/assets/img/{docs => }/training-loop.svg (95%) rename website/assets/img/{docs => }/training.svg (95%) rename website/assets/img/{docs => }/vocab_stringstore.svg (94%) 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,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") + + 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,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") + + 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,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") + + 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..b198c8333 100644 --- a/website/_layout.jade +++ b/website/_layout.jade @@ -45,6 +45,7 @@ html(lang="en") link(href="/assets/css/style.css?v#{V_CSS}" rel="stylesheet") body + include _includes/_svg include _includes/_navigation if SECTION == "docs" 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 40e644154c61af56595579b41ae5713d14ae1227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2761 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 P00000NkvXXu0mjf$-)Gl diff --git a/website/assets/img/logos/chattermill.png b/website/assets/img/logos/chattermill.png deleted file mode 100644 index 6f98359d53b64fad4266ee6df60b80f26479e5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6351 zcmV;=7%=CFP)U03o83yT$v%`NeXDZ!zU zF>y(J$SWvnXl(B5$Mi$|8yg>=o|#!(R8LOLET~ilgVAI%x!rDYv;700L9f@BS60Wy zCuL>lw)Xa#y`8=N17Q)-scD%whP?bDAd+8LoO7iB_mGpDUr<=WA^4A}>1m)KZnl2_ zG~nb*%PQg$Qmzyh56{oaoo;1|yKjOIIe7(9F$rlImlBiH@DTBdsR>DGd?sqdB_v13 zCPc-=^M6WOW<^!?(9p2cNjcx7WQQyivun%Dc zUjp$Qm>8GhQRlF3OVHw9KQ*3D6F1w&&ncRkTm1t=rsn7QY}_9uJa$ ziz>a@<4#UVha7w(6rh=rG4Y5I4pC~>)H3a>$F#2;<7~trOM1EJ-q@PNCK|fCdxJv4 zGcV;hy}VJte(#*oeImIB%`*qgLD`afXl;v(j!XMmD8$4iB2Ekp4~w+vMZ>{p&C~m} z@1Bvc^{K!1&6Dc;wm4b_#Lc!b(O|JyT~1etqBJ%>IU*{qzPW`?+vRHE`GY`#35_ka z@0=C|qt4-oPe@5l%eWO3qGA)0QqreYDk(ZtwsD~F!eJmKqe}bw30#gjrogTF!R*25 z^4J_6t6g+$W-hmG9*;aq9*1)kEpSSmcE>tsfcB4~DUMH|8Kh=p5$~g-y99y`&n>jQ```%f@?r>i;SgqEo znyV_+Vs2gm?mbO5YD@xZqjav8>zd~d$#hb(>y|*#>7LXqk}Ti=qT>=#pV(i9LbMkO zI;&ZNLS!CL;F2HG}tTJkYDxNg56r9&rim$($)8Glc(LrZ{GKRb(j08`@N3bL%%| z4aUPU`p^8O+~H$C!+~g9Nh8C(j0SR7qL{O9+&!l;o=oEEY&;~4>E^*=WEl~|?lAU& z7U(|nH=Rp$&8Sx{SKbPs_1i(ii;zs=!0lIh3vOjXZ{M62Y3FEN@dZfqP5@Zg`^}(F=ay3L!zcbW1GW{LUK;4oR z45S9$3bj;~X0pnKY3u|gq#xr^*i1>yun`x$&3HCN^t+@H-S<_*{;VMIPG!{p&N=sC zOCCQvf^*dOe5rl!oLuNK9#2?esioya94g(bpaAkD-MXNt#O-$70@7~jjvw2jd1wbu zqI>_G@XAs3JzEz4_NnQsG;-)0zTpU$gVvGnsQ><%_Vwe!vj^Cp8!#M*TAtjT&6-!M zef7Bd?k_bD?%-6YqL6Af#?C#vgR7^O9q;L&4b%D_iWMJD{Xw>D-n>NaFA-g z-u|V$emmB zuSrG<&Q{;?Id~!i>QZ^_{gK?(A;G-KpGf&N-FyOkP7@vf} z$ZxGVH8-ZD+ju07p=Z+IT{sm9BsmzWC}T|qw6xd2BteI%56G~(y{g^Oa@|qaBWB~y_IpL>UCO9G6o)=rn`XA!#Kcmuu1|W}mVQfIk?1{PVX=|`f$eYJ@J40j zRe4qg)aWjL#D%=dQX6=)>u)0J%Pfk}_tXRlZ}527JZz?nhafWk`98JnZdEJ5mI;txXuY(+4Miw1FY zUThl{t2$iyb+*J3OF)+KaIA4}glMo%>vh55QA7=I5J}R^F3j4EgC@zT7ESm6zBuHr z(kQ6I-cF^6r?M}jNNN_R11Jz~F#N61P*|uK86BfCvJQ_+EoIQTU3*>kH|G>D9dUH{ zLdtkLNx)%jx#%%jzK&4l*Ww$PVa}ehm1B>_<5$Qje6({w1{xS^Y_^6Lx?F~%ahwOo zv(6!e#u~j#LW6ew{K8|h0u=Zf6OPGBl>OdlfZ;>;n9!iX9AC_! zo5QcjnOK5oQgrxCTwtWp6Tw}9q9w#8vi?%S2(Yl&i(c?u!w8w1w zo@g-a4CRt=CFn8x5esE`V0i-~M!$4>YMB_8FV^*%^@iTQe#{&(+VWr157(;3hYjjK z7Kh$f7X7>8ko@WX*rDcsy>j7yW}m9nPKizrTmw3S$-ibJk)a?mF)=waGka6M?*QzQ zEw?hWZQo08AOs{Yp+RR{z2XntP(3jmiD4k52j}sb5}={?`}+p+Nw^EL3PXpZVp6Sa zi2CoGVbkx6^w{jnzJZ@?rA=RlhS6Cc-@q-A?5s(Y94^ve&>+Xt?}-KyCqW`#H_Q(d zNX!_Nch7PbP{QbF9^Q%EM9i}six*p${P50}!vB+V?!k)K=)uOnDI@-0?s=%gQ#NNz#zUJ%x7^8#{$e5y5QP&94`G?=3cNQC$T zV<$imCKyvlI5?0})ldD6yTUCOGQ^RYr9ofN*uA*UpC0&i(M50oX?UzEaaUXM1LZM) zED5`}Eav{Qn19Rj^S@pv7e2lb4T&ik-nu2IKlc-FmqOBVlQ4PW2B&gX~?*3B{TRw&4y*LD#BV z4Fq*xG#rl8JRwm+kI}LQ4bv*nz-c*~uN6acpuL#cH8gdbpguX(YA&y+LVAJ>1_g(AG`5;V&!d$Ie^W%r6)Q1sQBW3eR16tW%mqwW1rbZK(oPoV@q9}($QA|q znumAr@T(2%F`5m>;vjV76h6LzA*S?72#^yzF6TwVqVDZ8Pytgw=8fFXzFg>{pHmTf ze1v3{c$uRL+$!BhMZ=9YIysq|c`561uKXSZ6PmRu7&6MMNTM+$d1o*yT?aaQ8O28` z}2pTa33bK`j)P zzKn~evx?VhK55VW_$qzI*g;C57mgonrsaz8vnnnH}G{GG@O;P5_l*=(6SHE zy?N3Ubjf*r5>Nt5nG>cmTmzalB zE%~#I3XUS|vOoGXOD>Q%5RTxLs$aZCbY8Mx(*QIDb?a7WKxopww+c4wE#BYj%!NiHq@^|aA|9|fJf4$=OYHbFmZEtF2(F56IQ)id5 zsv4CuIW1FGyMYK^fpY@2s+w!xP^8GO<&Gs~`u=Sw$_TDNfyCHW*(OJQYj!pL5JO_0 z&#~yWi+}!@aYr!r8qx+c)jY7>t8?!q45|P8G13#rz`E)?zi_kq|xgRt{^}SoUCH1{q*ie_5)26^Ih|7%? z5}n)z$I1xvX{=d7Fa=evwbc#eip4*Ch>bm~%c^##_N_CEfBJ|zj-0;I%pp1IKYv2i z4FPuv4a3u%kkMGZR9#YL@7|()`KW}3W$xC}+J@kGtCAJ{fa5|yaC>u`;Ih>(PTE|~ z_ZxElToQ(RVEb)R$o_VP(P2B&Q}wIz@O#T++@hzYwvhtF%HWEk;Bkxzi%s3##iiw_ z;9w#kC{)T?zo|Kgrb!5mrxMv1DMoPh3KUET#u;mQ9{3b*(2vcDie(KS0%1uhrOt$3 zHJ(bcRkkm46dVa9$JK{3H9524a10TL9bD6k;ti&Y8b}GocqA5Q%isCDF%CB7QnGlP4IauhPW=jYunk|C(`D%)S&8w>3`0< zaCd2x3Z^ouaIZx!eeF=oZ9CLOZe6cqqokIuUe3i&NZe z8x0M1yB(#7x>03y4RlY20-7=YpsllOa&~rndRlVG+11XhYV7?{OWsfO10E=s9K&ir z{J)%Y=LYK}03=8hM)%@T}4%(qUpwIo9|Qb zM>)tQSdGFuSI_{(3ki#A?dV(yz=;ZEO4c|J+6^phA;Sa#YtaxR36TXClV-fcep*f3 z(!OvQ3MQ|bU#)qA1DV4ke338EgCOXw+zaAHXq#`>lqkzW!(&+P9G{fRQid+?LP%G~ zFm%RxsS*k;=Wjj2>>VW$H=}_KZ$XyvA9;SqyDOFw9gP9u2yGjGK(f132l0i)1=L0| zZy3Iv^&p#VBcQ=*v#~ZhBs_`$(c3>DzoCI3gG;B(4<_W@dbM+RDI(WJgB&mZu8jCe zzJG%-?KD{|UTw>CAWHwSpAJtzfO!5Oxg2#eA7s$US`SIy*&uE6%{!8du!v}xFgogc zapUM^IC;Ul&PUE_S~OFCSA_pv8M!VR*ifYqt*bQSPK|zeWOT{AE{`~&5^K7wv4y5n zN$^UX0Rke?$6Ge@zP|1jYBFI-^t*+H4yQ4b)eto)H~n z!ViTs`(@C-sMQ8t3>)bl7BROXp9>0Y~*!Q$zADO(fV=X zc=rge0EGk=^0J@d(b1gTf}oIy@!p{!*Ag0jQ4n;vqjdEdt}cwROp*79**RlV9&iS7d1pY^!fAB!P4;p@56#OrFe*Zn|#0ytb z#m#n`qv4yIV7K`9U;C&b2R9JZU$^?FHeu$C+RPoT#b^7jDrN`8&35~={{(i3Uor3> RFlPV&002ovPDHLkV1hNAPmcfq diff --git a/website/assets/img/logos/cytora.png b/website/assets/img/logos/cytora.png deleted file mode 100644 index 24040dc4f0a790a0c979c1c0d9cec0fd6bce16c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3028 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 ATmS$7 diff --git a/website/assets/img/logos/indico.png b/website/assets/img/logos/indico.png deleted file mode 100644 index eb840a431120400ddbd083ffac23bd618d206568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1668 zcmV-~27CF5P)oh>(h)5KvIiAY4DVdwb^Y+Gqb-=XU?3n zwXCH1VK$Ly8)v0{0$}}$9c?>PG=gC5bYQJZ(MZ8c!AimMTx54Dsb)@c!s1S<*v{bO zK-I%pVo~zJBG<9?O9ohPI?K64y`+P+%&~1s23QN6<(wid>0lK)wvuFk)sj8YKZ0UMhWT$?OM{3HtLo}>qS0}7Z$Mk-oJ#aSs>bqS>fH`1M4+Nl>x-N2$g>8@6v zbc1o%(1{*&rlp@~GL@83Mmg)b!q;6lCQ`yCDtVVBjHYAg57LcARP(0;HyFG?%;IoZu}--+-`D1z@o9| zevoaMFRIq;Gw@-HUx^_s`WyMx!eWf!*hdXvaTSLQU2gS6)ru2_KJ0L?xG#jq`f-t^ z`Ph+WunxuzJWdr`*v9d=o)10#01wA0Yp7r)>-hY?z~Yv;QHNN|T%P9zSDQzH`s(Fg z&723>LMiWQx5piUu$b-|vVz-V+nIFkXS1t+o(9%iF3kq|h~73#<=ExGBAwI9h)V7X zaV!7kns2E*o9IfZtN%O=d|{ET$oF!qX3~M2QdBp)`g^%1)!dylWaVYRTBhj7h6-Rt zxh^QQhyRa?D&i08eIc##3FVFoovSLtZe_wegUp8!EZQjQ0U@J3xv##Xk!QG6qs-FQ z6BgIWyTo_uHe3?gE}|z_nQWS`mx@rZiiLJkNK`|VfF;xSlgTv|dBd73WC8gIChCI- ziiCY%fRD^juueMG>d>!r$xZ|HIWgA^Ei9Vzw_|; zYAsW&(}aGx9@af#Pc$=Ff`mInW7}-tqqoqn_k~qb8{URKv4)CS9uoE(VZU0~M+o~W zJ*?UY_cT`;ECJziSk%@<*gi1u(NE~#_Jy@ny!k?wSa?{>GSuUO5ucdRO01=YHBdZm zGeYjH=n`lrA0h@mMhg96Usx|WwsSNM2}?e`pVi*!BRx;j#fgJePu!6jgmCE5B&z-t~Wmzmzrt|o=0@z+a8KLYdn?j}6D@CK`+7_A=yF5-Jo5k+uG_6?S(&Q%`mSvG2m#bRCFglV& zHhr1NSFYauF3;YXQg!5Ero>8W2J0<%&H6hf|0QLIy=`ozMrEM5(f?LJ2< zV^}RY8#jIrn_0&OSKG+zuC#JvB@1VZFJ0N%gmc>e1WWnA{_PB%e8$EXEINn`LQqSO zt2osdjyxc$sfmYWSZrD&KW!$I>jT>1mMH+~KL| z#cIv@Su)6DIty4qgi;nzz#y9Fl>Y$vOazyHK%KP! O0000SN1q8yws0b<{Q6LdS49vZEW?ytXGi`KPW`^AXySuoP{Ik20 zJ#*&%a_+hJoLk}+$+w^==wgZnK>JFvygYvTs$0a`v#z8)?*ix&NM%J5Nw=Hvl`^8D zkJfPlUBQIO>+?UykCx>4(!l%yQVn!Ao9FmYvfksznw_Z_k(_Zvu0N7$H@_`9c2+Nd z6Ndf+nzI?l$_~e>a}DOQ$v}S0^cfRR#JwyGj15|VL9{>J?w$1mBRxDl?+D>r0m5&u zAOAILYx41e1=H9pxf@!f!2uz&XrTvhPQf3q^BV8E3AoGgcgndGbztw_Jg)c;HSVhcEJ zHA~4eS`^jr%F2RSmFnB@6kj`zxkVU=d7?d%?K^n8=oBVQyCC8AgMAMdCQj{sL4bjm zp2P+TWd+OWa});lKn{kH8!!+d&q9Pqma7jyfxMtYxqrbRP*Bprcu;JzOOO(li5Afv zrVj2WFfe7*>K?LZ+WvSchm>n>!7|Zq&*$+$6pwNvI^K=sGIxlMX2Z&Z_Q43SGIZ1P z6@BE4)ixir_pVLp$wte2Xn^4rrE^irlw5C!U|XqfQAkDQ(ItCp>QHi>8Ioq z82f@sUY)*+25f_=4r6s*YjpAb2F4X8s;}dQIhR@XplB4nsj0;p3RQy&xr|nTT>3tv}ZEPSXjPJGf zSh*FL1cV`FO`AxP>hP0Deu2TT{~{+d@yi9tFK)pAEL8S&o$|+~U^tN+s^p{NW`)UB zH@dx<#0c87f}YHFx;9_Ha1hBe`V#e-_^sPQmm0NWS&$<{cAJ7>1nIQ)fH{1;ma}L| zF}$Su1Z7cPL<}N-GC}%qCVpMpVx<6Oz-T%_lK$QlOmztVQ(eE^q^xp6bTA=fI2BL+b(0+)7SAeQ{t!F2Jxsz4kenUFA)FV2pc9 z=dx;TmI;aRmEBk|O2!a=s+NlyH<2B=no68NE;Vk+tcIH#j6MZph%?6hrQ=yQ!yEYc zOf5PXvt$gp$P=V|j`lI&Tj4VC%XG_&OvV7hVOz&13!9?vI)gV1caJQH2}o*HpZviv zgVA#xC(_-S_^k=xQ%3t3mWSu`%1dk?xJ^DPH`ljGkgQC0ps7qhi`|Y)o{+pN7xm}9?uFtN^_~bZ9#xa9rtjiIS)K@mp6T=OL{dcf8 zS&^QC?_Yq9f#R%)O{?pw9!Yh6869r}j6pIE#F(0ZaWdw#W!x{RlMc|G!vV$`l(k%f z1T|7@v8|Ix8_8I|=joKxhIZPTuZ=1$0O_Dx{>}ukYLlhe+n><*Hs< zZRTVZr~}lLq5$aqY{5(qBu8@yw}7ptrZlZ{3%JjT@cOiE`G=q`P*aKmpcQuZF)X5E zhR)g-!oBk*EtQj%y>vlI;a=8YOrmDOtrfI9#w}0}+@H%L;$RVevfu&OOul#QMHj&o z!4$z1!4$z1!4$z1!4$#dADE36U?%>b!K@sDa3Mw4hB^gf?}d-Q0Yycfr;*OukN^Mx M07*qoM6N<$f^*YhivR!s diff --git a/website/assets/img/logos/quora.png b/website/assets/img/logos/quora.png deleted file mode 100644 index 07c38144cb6d41052c9607a53a0218aa16ceefac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4705 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�IQvA^)|$T6C9-7XM3eELm_`*4rVcDc!7HkOyMSh^A@uKaz&mSvd?aM{I*X z>_o+kJh#%DMmxIZ;Pm>7L7l$aMb)V%1F(9CQU^dh=g~h4oAJ68(^xqhndaJ9M<)Ye zz_L00@<#zIaHIP?dnE?lCqi4_PQBtCdv+n}9jzEx0M)0#ra$mc1z|Ex;^utan7-Q5 zX`rRx$&)AM%bl}6b+)^}ur!jKy`40fmorN1gG4vTddCGUL6(fPyCKE2&DOB77EU)k z)J@CFOTzr>(B{P;y%P72q;(Pduz_U>veqwj*I|fkzuNfYK=p-0FU0uE1D02`v3^^4 z8(JeVHqycT-4Fr~;Pp3GW_+bL8Ju*XcT(096 zNJl(477fe}#Tr~*wkY%}@!AD}@j`?(x+0AvKWS4eaF9iaMTvsW!zsAe;p~v(h6;$s z0hnSu+tzIUSHh$l9O19aAs_7F5}_bnS}Z}*E zz2X*qbZe1Y!`eU9P+zxQjSjTOgm;tNKFQO5?Y2_&b|I1r!#zw5j{?}-n2=%3J8fMp z;yjk=CbPZQABl+21)NjAtefgtKjj=0kVL2h6zsAxLP3+0hJRQ@0?VPwUaO(r7n}*5 z{tW=|kgV%3iY2(o!AyL{H&Uij1e8Z-)StEqdF`3FArD89?kN}6Vv&o>;1<8JeLVOn zU1Zz2^6dbu4EKAq^Y;#tevm?R9$PP;=r-y?xdY?xx2_lYx#raL;#~Jx1EVwT>l$)H0@fR@J zi||_$Xex-|fP4)A9!SWTpPWO9d~z)Ev#9e!%bAx~ zr54g;nPY^!Xi;!e8~{ev;P8ACYw|!ppL#}sCzj7iG4Yy5BB z-nM-J-5E3ba1bM2)1EEIrWNaj2EhRZNDZL0KRuLg!esctKxt?XxHP1{t ztF}D(ER@eA8FSoCL1T}FP$4-c7M_BLdW|oj&#h3pFls}aQMG>eo00000NkvXXu0mjfNPP%) diff --git a/website/assets/img/logos/signaln.png b/website/assets/img/logos/signaln.png deleted file mode 100644 index 078f50380b224277d86648f969f2901625a4063f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3321 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 DMAKXH diff --git a/website/assets/img/logos/socrata.png b/website/assets/img/logos/socrata.png deleted file mode 100644 index 079872c4e2b57d98eb2e2cf541d08b74eb353287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5121 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 diff --git a/website/assets/img/logos/stitchfix.png b/website/assets/img/logos/stitchfix.png deleted file mode 100644 index 0a97057c5d5644e35629444cd9f885cb39a1fe8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1993 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 b2u1i0nFd;5l$zqL00000NkvXXu0mjf1;XW3 diff --git a/website/assets/img/logos/synapsify.png b/website/assets/img/logos/synapsify.png deleted file mode 100644 index 3c65d9b320ff9f435027b332c46a42750879de1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2532 zcmVeLqoB}&6_s^0|RkFiA2Igft9f!M0D-iwYw;Eb93v^p@U6R7&>$)oowsYt<@}-`yzy2Ccg+kG}bLS?fCnO}q#l_Kcn>K9<3k#V5q*5tg5Uewz zu)4bX@ZrOJxwdWFwr<@TXKHN#yj{3(Aw*2e?b@}Aro8gXE6f;hH)+7knKNnD&p-dn zH*#@t5u$MF)TtP-XU`rcj9X<@k4NXqwI;bkrBd0eS1+vD`3_pNXwgaskQ)By2MY-a zp;<6Fx+IZUjAF!y5i}()FOQb;@bI{^ud09l0cf^t*%E>^lq&T=tH@l@UN|aQEIriL z)(#mmgvP|g#Qfioo;h=dUf|oH*ZKMR1qB88pFeQmd@`9#SJo3IOrRB^#CrSX=H}9? zcJ116V+-?WqXSo0*Je|Au0Xv#y6AFVrHK^w?%f+}e)7pD#l^+A=J|I6r#*P^AW0vL z!X9GQ+_`hn1mEBzUl&p!KXQBe`e(-7Q%|M=sNB$*jA zW-tS+UcFlHk^wg4oJcp{dh0E-!$P^dYuB!{?%A_vsgn#yw{G3&_T}W{@P2qivc`S- z^r2bK&d$xF&_7weA*|r@bGc?w=;h@lG7O(Ur@C_G3YycVO~do%&6}BN5TWqnk3VLn z0c6t|o_gvj-TwF9dyo3R`Q{t_a0Y=%mo8oK?xmMrV&(&vh-(!BBJz~u#*L#MxLiZm zh%1I$KWWk=u8Yl}@W*TAo5Bk1!}AJd8q+EK{`>DmhT-P5Z{Hrn_V3@1=9DQ@@Ql0v z`zbU_J?!l4NHXv{)DsX8Ks^sX{IHRT6moz1>8J4;dn1B4ZGcm!PQj~XWMnV_AeN&I zz#R1Q%{SkqCUIa$AuJW1Z{NP%w{Kq>>EPgCE`_h1D&8EDyFR4Q?P}g1MIqb-JQjvQ zWN6}U;h6|PtZpb4_@K13G@}%HdV12nL?ML>a42PEW#xB+j5Y@i<1tixe0)|`7Cq0J zHLIba!FW=ERVGfHXwwwn8^|ge;=q9e-0joD7hilK6rgtR-kp4EMMVV}0N{roe&7_s zf{9aDq^{c&RiYK+SZkpe%~ zLk~S9l4IaBFj>?C56`_R&osu49V<@Z>3sE?LzycNWX<25asQrdhl{x;Qb-pCx`H(E z#Qy-5LX#Vh>C>mf7x1}z_wIeeB#@3MXSb{hd8{=#{f$v|+Ae45;+5nrfM5ruEO z@doJ$EN7VxplvuC695n3QCRq63T)(}plwV5k3RY+2JGCq6VIko2;hoQR7_rE%a$!7 z6iTZa?EI2^Zxt!3YtgK2WV=%o_J<^tdWuu{(@#Hg%DJTLJH~-AYh%?*jT++4UKHBPwG3-=|(B^N|B9rk}UMiJSr(=2I$i6zvW0W zcP0YiK8`^`fbTRa87SH3pMOq9m=2FCh;KxAPube=;lmMm!pk!A0p+6uK+VJ`M3Mko zO8&qo;5P6-)$zoEY#oEKnuzDXMyMzXg{(X)G8#h%B+90`r7ZD@S81wsNu;;C!gFW3 zB`*rdTHv4c%lRB_O&vOG8`#ZaOohg%)tIroI z-#t?_%_(M?PvTR-=`Tg5zkNLC{S$dFMPw}WPO|k(TDm87j(_ee2d-Hu{5$c()$*Ax z@r(T>^LQR7jm+tYGx_0QW#%e zeV=>6EVty%`%;}Q1j~H!DEweaSDNL5u*m=awa7p+m uDwP5j%Y)Sy2B%hjcP6Jq-gG_4ivIwkGO|wx8B65=0000M%@(v diff --git a/website/assets/img/logos/turi.png b/website/assets/img/logos/turi.png deleted file mode 100644 index de70d08bd78778e7922c130e5ddf90322f886be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2915 zcmV-p3!Lui=aGQa44ToK%wV$XlkW|=X2$xapprE8*6kt!nHX|wFQsZxPk6Dgto%(w+)k`7Uw0Gc9@FMTo{WV5W^RKc@}ec60=*SRXWuw%2CE5?zPmj2`dH+1M{weL1G}tdKH6NhrwfLjS$@R={Co*18*l!8vT9r zWn&7tJLsVE{SvJ~TW4>y@8+oviCk1O$ex;1_fw`Dg{Tg4VLfZJthHu^w8jJFX7Kay zC?bU~)dkPMo#4qyz*xF za~S_jex_q0?u{_#{JPQk)h~ETQRkNm5Ap(| z!aD7@(|gR!PTKd#rzZMyx|#a^7Uqi)Y$ESD@MxI&r-M`a{J1qfq|Sdd)d$==VLH%i z_XPPYWfJ-^$T8a9(Vh<{REZ=HWzO;?&NSNudRHt7>y!y$H94r@^)SLxo5_ESRT)xu zmG1r(@C~?t+Yg7-d9)c}9X2bhn)Jd{MRp%j9SgN+1g6TKh46Xen`$SRK0k3^%G6l_ zVc{v2mx-2u=s9SM(0;-{)Lifo$O-vI2XHh$=@H0Y3M)l?Q}Du%fcv$$#v$ zx9_wK+vQ@NBX1n_h68>DAa!#{>%xWQOIf-$+JQXGh4p8XF}zLkG7MpX~lh6xVR_VqOhvdNeTw?!mSb%3)EJ~C0e<# zZcw>%Ss$N+z7tMd3i1V{!t(Yatbkcz;dpRc6c*nRailfH)7%WmBK2>iPN`}nZoxGL z_v-Wy&lL!+Dx;uZdl1$RlfwEh$Y{gDIu>=r{Q5CHs$dfzjz_DR3#K8G{_XXkEYgkH zWmo>5GE~&}As~1=t9Eah{>ea4T5z~M2M|*;PeISNCM?xn*i8}1`G~^-BCX#T=yQ^P?nt6JEibk7wT7io zl@~5E+P|%R$nf%X@_s-@n-XP?{}H3Yc$W)ntw~`m2O2nOi{9qkZo&$PRMm?n#DTux z7s5XzR;7IQTGsvwM}eW`AN3pxSvu!N(#OA~knRYWejdP*h?(rd2DzlO5n;RqG*D?$ zSVg@2X||L_>0cecorL9++$;6}$$@XH?cM?`Ll0ERG#Pu>e{qwruz9eiZ~hxcyFO;< z6|(hsqZ>=wcf9+P?Mg~&_8u-AZ7#0AH@61dGW^E#` zr`-z+OJA}okXr6=b6l8(=qG+hQNPA7MbN?ez44V<-t(17FLX89-pcM|daaXaJDlWf zt&^sh>GSFCcXp{3=U=Ln7HR1F{YHdQ3N&!lq%eLN5=R;e%vfjce7AdH1?(hOk;v&r zOP>P>uzM`0HugF78)oOf_3DME3~ z4k^FNV3};NE2NxHH+$_c*!(=6pTA7eDz=^rYk%~=w?%U?>wE(01yyAyZ?5h^nsgcV zrca#^wC7*)OO)@82Lj!PNcw{Y+Z(Im8DIVW`piXIMVd=#omg8@7YJ(ajYmCntWj~i z3^dNaz-(L|0J?)To;GEjb?*qOxHdQrrfZ`klKYXa0GC2uvkHXdscjGnk8Aw^bZLe{ zp8qqD#;)-)-B7QQCF2g3mz4=&8}HXa5PF@>=A8_SDxJC&iN9$BfA1+#$t{#;GtgOG z**Z`Swu9XbQFR@~I`REZcmF@&JWutU*X6yyuJQCTL@~?2-#weMrzN5Xy{HRHP#aWV|3S=#Ff&m2O*0%N~JIhl&18tUB zX4VwJJK*}3lnl?A-D1IFn`M?oYt<>V({`sf@wL?AA6DCGyseGf{{XPua;+=`2T1?` N002ovPDHLkV1oDbnB)Ke diff --git a/website/assets/img/logos/wayblazer.png b/website/assets/img/logos/wayblazer.png deleted file mode 100644 index 95a0098e409a25e545e0649e4a0af088e321733e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2306 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 diff --git a/website/assets/img/pattern_green.jpg b/website/assets/img/pattern_green.jpg index d2e3418220471c3caf719433280789ce31c76950..172495c38e389753575ab1716f413e643f03e81f 100644 GIT binary patch literal 232481 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

5m%Lpjko7|@ zi(45gr6#546R4Z*6_9j93B84r7apggQNb(Q>aS^jqB*K>NYHg_JYZ`*ShkbnUNw2H zo3+u-*XiaCJUPc&Hd(^6lxEHtG$gBV=&e;MY3jG>&=Z5k2}iaZ2-dMQY{G?(i>lN= z!alVL1EG^^d`crLIMwBqNzyntKMhq#qIu>ZBsmUHp#s=}dmHi<-U)DTgJai~^Y=*adhp+t!keh^Fc;M}G z5s-WNEAWKb{}JNK`?+VUx+IHRg8WOrsGzcebQWjJ*n#eS%9Y>XRlndIPH}^_(3udu zkkO>lBeLP*TgAN`S69a$+oxE|EA;gZ>gEH?oA2h_=1YDX|V++UB>X3pE<&maWz{RO`x#UH#D?B*%fwkjJE;R2P5y9Lz>KwHd*{;5$)Y>nf2L)3 zMC^NemTO!GH=tzScF$}IT{7{V&x;t2vHqI+pzYEO{To_gh=fy5f9@B7F>lZr!TQKVc{;E zxMqYAcUMw4AbvDR`QBUj_T4uh|9g2I<4pFgoBBVamiHGqn~kq3c$INI+4GB@3Ws}% z*T3vcyaI3xzV)US)YT~H#O>A3uxo`*+n4J>Uu{-3b{@GituEXXAM^8^s}a8+!7x{V zp=^(&XA$?i!S*XV`P*>EJV< z4o?kkgkUK_nfnpW9d3CYhh9vh=zVp3#@erCzeBZB-dUNCaf4+;MH0G>KJ$sV7?aQaH@*TNA)NXh@>t$ z_bvZC^X7|yv-UR_0<}Fyc>ew|O!+z_?5QHGmTY`GlPpOk2b1A+f{4|1(Q|QqPkEe+ z{3?1_ZK28cR5xp-ov#sW@1Neta)HqL9p%oTP*bWeB6R^Uv3VI=PV7rBGGMbaQmpjC zu0NC=&Lg7`lhl<9*F(D`j;#@(#+FRb4a!Jzp_jlaGwcm@?|uaY_7g4fjFXfH3&S++ z2gC@T+Gee+V%F5KljCO8)V!gGCSL263Xy5u<=gSk}=2$fhrg~m?+8fF6kB+uqz{cibI`;+L{9#CDCF< z_MaWsOeEko8%p6KsHPytqlDcFQ zYAF4nlB_vxYwTBiinZzz}dA!km?jmStKsxX6hAIkO3KPiB}LqpEX!fay~t zHHHLx;G3{G8*!^>Jk;wTrS(aT)GutJOkveo<=K!Ybnf_>XIwmMcFrwp2ac_iJI+~y z2YgYJR)d>fQ)pfW2e@!Lv~Vr!MpY|V0b=8w)==qWflRm0wefr_)nPYlcD2+DqvH}2 z;2?_F_GYYv@qhoNLD)MTZ{#6hc1wQFq-JR$?wYY!rV(K?!+#eo*dj4<;I5LF>i41@ z-ods|yC3cVVZVK1>n66XTS$g)mgcd`4Pe$&O5D*J#wW0D9gd9ku<>8rLLD(YNgG8q zW#;o6VvTzR*zMVtS<^zi>&(qMCHT5osx{Vw6CRTwhE1X@r~a8o7)2KzhiHmTFX#%5 zlNT)&$R9d&Ae=E4JkA(qfJs#)X|$qBhs3g6k#t)4#)_K?li3M!ciErpbmpTBk#S}D z8|$lyC5*{$$!^f~HI#c>oA;jE#24x?@JJ5+mp>g=ygk)V)L)jjZT(k}l`uX!$930l zquLPckbu6B+~HRstjANlZ#}y`&ESh#aL2EZ9%HLVujABR4_Zw66NC0@eq}DmwF$Z_ z0h2rznh7jPxDdpW_Sl$YT3*x|2OaWLK|LHQI0$_7MDxE z0)akk+L1ootv@C`Sa;wo>njRKwlf>M9O~F28y_@L(sX*3wBzy8nQjvA7iJH%-#2yfa5cLT2Q zA5eP{PO@nAiYd*Y?8fkE!HfbDMvKsVkSLqj z;Th;jNOu$?$nopw*hVBLO3c6f1k;`lNN|T?oggy(%}H=f7P)VELMxPNM>smZs-Y#i z!i)M9Gk>bB1RSywnz|D$ek%7o4aO;FLqAT`h;5VvGU8J3G$hu&0?w%~n_XeXYD2{B z);s&Hmsvu1oXJhN!0zXnZ9$PRPdsUr#LOU+XrJ8tU2XY?FBX|1DxXU{E;R>o6+XzM zIo1Wh8cSP!vxzNZ{}fbUrj64$z*+}+9;D~>!lo3-F+jWgRp8lc26tn6@-|rJxXUro z4PR#9<{Q&(uzLghZxe!aZei{vN^Y+FR_fu;ly4NjM}tgX4vE9aJbPGt0daZ@F6mGH z7v%IkI*sjIbj?M|?h_tEW=J@aGd-c6CfG*!`pH)(G<}f2J`Z1+0s*E!^WN}Vfo@_K z@=Jy!_UD#tvqZi_O7Kk{M!SnSw~=RkCpZf|aFOK81M{2zoOBwTp$?JAvT9dUj25f@ zSeLjj^Zo$TLt#_?3ed7zN2=RnzhY@g$L?3AFn9YHgfNq(fw*py}!R zK$orjHK?K1v~B%jwM}ZTcbp*nM9`eYpY~%TCB~}5EYiuwTGLkoLx~1@LQLVdI8(5) zMW{K6rXcesmU{mDQAhUkW0ptU)0T2OcV_fi4hsCKGhD@e55{^uklJ^e%AC7;$i4p4a8fFn@S?@^LkKvX+1%%LZ2wE93l zM#o8H1L-_oDab4afxklKcs`R{;Y5llXup^xtWNzncfq{0?aHW1Up74LQxyVEwp>qI z2vEJKb29yok)+>x?pTAYpllxeDZ@w3i3-^xzuVpTiRNgMm?5`Y!6|#91VIG;jB*pnSIr*#-83w4dW$&^NrMU3)<7>>d&`VHjAIDN zhqR5b&lMTXB*_ccO-ar=kLM(os;vArB4BQ`wz)V7WE61Qo6GsMSsI~z5Mi@cNW30# z$29camA3QElsiM_q3{6u0`HpVN!hIH=>XMJ7*71#ptAi6sW~0Q{(X5@*#O7Z0VDXx zJNDSiWeGEfrdlXV6UBiT>XZb!RF)Wbj7u2~*-zpgvb%dmXZGPnxq9pi!y*VD?7UQ< zo6J73S4)9HKH043WU+A;q_wHLKbb~lCvF5WwmWq-7?%vM!A2p-u|yUMEb}j$m)+QY zf^u0Prmik(?o3}N@nKUVYSQwsU-?vXS(G$04KMPc2AlktnCcxqd2D2^w8Cz(&p666u@n5iF2CfR4eGf zoptw5jYMBqK_)$+OfIh!@7#?PH#1H=)idv{E@?&R5}+QjTWJzr9S0?LT+CRixQs7rAWmRNTNxCK(sq*(9L zR;m%CG~C8YsK`Q%f_C4?BWz}l7c4W{pH|2yshybC{&1-X)6>Hp-YllNwFI>@z0 zJ%}t64kAYAxuJSh@c{OnO)o*b>Q~Jadp?>$;8x<`JUu>5B*<+eJb)uO)qrN1d?7;n zi+1sHLxP}O2WBpaCVX(yTTCyD)cVGzjJb*cq`dKoB0Z*RN|N+EJv{j;45`gE^V zIA6&uV|HucWWKLtA(}?f4r$@tV+;{UN@9-57*JV7x9bwy;&#ylgYrosB)~Ic{E)7{ zWfV)K!qc$XzF0p6F|ncUG4V|K7-I5^c9zy=`G~&A1}m+nN1$H3%1X?l)@6seG1@|i zRGn*3AXa0Y`_1?pCir7A5-}f#$UkQz5*;a z%{CMs*^JxBo7Rz%#9hfBB{V+v`OiX^ov7om`wbFg#-X)?fo@JhD*Io3>GY81@zqTG z%{32(ONcc)@0l?Y8!Lx^$t{hM+Efj{CC?%~*S&o8vS1cE`A-BAc!W<1 zFQsE8l%mhHFlW|C^<0BuNoi6|HVgQh8AbRKlY=U4D0?;+vs<13DqUM2Bb5&xSy5{hww5qy!&m5V1M42=YkPS8v32iG4E`i>4Em z>P;aR zV}iHAL@O=ZsYQ)RMxXcIbmsbVFA+$A{rvk=S$k&jl)ajoDv zY=1IYgwxGyVWLn6iaaQ9Mc9b|T0CK~e!9^mho9hZj;kqUAuQ$R^~}(8@i@-G!9V#< z0vdwv%5?zQHmxABHh3`58~6`8(0xjMldS17-Yo(lZcEbuQ%w)UJ5Y#JV4o^bW&@VF zX}xTa)*CFOQcxrI1?sQz*jE6&*$wD=(jQnq!&f7N)vpn_aMNiGY!$l{TqYEuP9WpI zio?fuBaJ3u;cm;X%F~<7aMEDi&aOrLapxLj zU*in|HS=f{Aj9JfYKuJAD+w5Zyy#qI@#FAK8ZtNFI=jG8#krh0(3x*GZ6kB?df&a6 zy^|-n*(QKyPxxdkW|5uB?KnagC|m5)UW>YbSP?NvgxtF4*S(~#(be(+{wY4voDk%c zFQK&E6J!t_%=}<1&9vV*0V88AtGrMT1V4uzO+gsvK936qbe>k4uM#l%nakXkQC8E< zB5@3stV~k?Gd3T7k}F6S=35v9rGapQR%}($0psMnF}|trn3Z*23)#ws_L6Yu$j9>f zuzN($B`+$cz-8I7Y^2Uiimxr04^$P+3z`}@apL%}!Bb+-uYkH}^+znnzyXKx*-zgF zdbtn!5&ko_*52tBzeON(h@AfYE?Pn;hCfY5dLg{&MtcQ>x1#<48R;d6i98*QXZms_F^6b1h>Y66c3;0ptylsy(Kr)aYB zCQNSe>GcCq_xP&jOiD=gD)A&7MBWS*;34>vwr{dPz;z{4Dbp~W9H%;rzI#)TO!tUY z@b2L7J6#hUUvEt=Em=5-Md@|wa>`J25G-v(&ziI+L6*^kcgFD8oNkUmq*Wlx^fm|I zc;2WlJr@xN8_z;1l=OUr)NfqaGbiD#aC8LO={v*wvU#&V7HwHiDVZvk>|9=lbB-}rvh$mW;H=~XD zg-*u)WS36FTc}hJu+Se8%(=--8u2)W8#o2=8%VEls~AX`6lh`KCvC^;;gm|~0VMP& z>Phx{IafYs;ZVuHK|fd^XahF=l5?XwUhj`+T@c(8u~f*Q}oI^3u*KBG88 zK~AHC{A8l4heMu!Fq#i}46da1z{N%9F8Ld4>X`?7t*W~*lQb=iy|^ip1qClQ&n`=* za+oMGhv~LuPoj14G1gC9z30T>9mnjC82eQ3p!~a(YbbNaSs8MCy)e)VOY0k#n6-~D*~BSjg$o{mt8j0V3u?G!ZzHn7S#?@6Heq){hp$#vFKft)Q_Kz9 z$&Od|abL&z(Voe*tT6_g8slmv`=4YKENAn+A5$Scdpmktmw!2oIhqJcLh=v? z8cIt^&{{uGc6tvhhU1g+9qZ_DlOqQl=3XAdXC+WYo)u`EQ4mg1@k7>l$B1dI`3(x1 zRVzGg2;`dUGmfyWv5wH-iVTOt#WH^09`frzEQDkX*MBxnhU1%bc_SAH3@Iriq`ekj zdI2$2Rc*aBz23tdB7|4TgxbF>VNViHd<b6VTw1AYTuwm)cY&h)*fwnZbU_gZKK(M+;G z^r2_~lxZQ~>avojir^ULMi5uwf4`YEXu#pdtz?S){5U$|;)X=cUPT2n$_{2K`Cnow zPK!r1f>XM*ZQ@_qVRK)kubK^pE z2v=)8#5FZVF^BZzpawFaeP)Nve+5)}E}wnUV2YOhAhC_O4UEUWR3cKFz*TkmFv~rr zWGvZaGFrg~nKY<<>^3yUZ4sEd+t#Z@Q1kTJL}ramI&NM}(B>#CZ>i4yT>p9ZsYCcQ zFt(~HJeH?Om5Xs0p;YOxWlMt_aXq(JaW0?cM8yleSEu9da=1cMQhA}AD7%qS<}I?y z5HG5kJYUQZF+Ke(uWW2*Q9Iu!H@EbYQ;y{oYjDZQ*Z^Z;_yc=(2!g!xG2{DHWyBL< zy&r8zH`eg&%@k=iSlfWF=>4KsG}nqBl}b404Gz zwSW?=Z__kJUCN|DTJUN6Y2l<9*FcDAztlqmBH*jGQBHBGn>;cN*RctnIoT3gL+kZx zAq{#3IEYSO9Vd743soN5K5Sag3j;m;v=`Mu2aF)Cn-tfo?X3xW?H55=ZG=7_j0mOA z^!6VI1MHX=4Yg+-nxdS4dia%3_GCaWuNlb(o799Le(o4=a`wa;fMCKvm`Cmu(^G#1 zcnUFtq0t@DG&*jHj9fJJo7|w5R8I2yX8u#_bi-^5W0mto?BL!O@m6c)$Xt@34~qcr z%Kw&d!SI9M*wGVcbnFW2*Ll4?+7tb~{x3IFfqc*kC59cDN*na7AKZA-nbGXNX25Uv{t+uyRw^W zYig9&1-OG)s;h7})K@;zdA5R?)pyKNUu1Jx1)!I`YL4_Uj4+TA;N)ZY`)pjKq58JB zUJ9-uuV2!;zWopqx&5uaRqyEOKuP89fw_>TLg=m&XOoP`)^rj*I_w4a#Px>cmsg!! z9p`cec3P}Ia7@9-`l#O!)Ch<@^-&sq8XLI7qX2B41F36>FUcy6F^{YN_Gh9$tM~l2 z2*BttL+<0m`Q+HAktPqG6A29-I|YK~=mi`x5Sq-P$@N=vVTqdoo?pH~U=XtJYV#g4 ziu75^EJ*@yCr+=8n!&1!;>*`BX`^r0X{xk~w(0^?wvmcW>(c`2JAt5ME2D4ibmYY* z{m~nZk%n3p!ty;+Jc_{GJfn5Wxlp-=VlwsN_@7{68>hyLDN+kXe;Btyxm0Q7m!gfq z9hqZrC1O|p4x0bBu>Ecm&%Ot>ICmFjJu{pinfuA|fvuL}H#Y3tL41?(PhkV?7apF# z5~;0ymO(u^Mad9V>riPp<1WAr1bc~2YtKL7RO(*71au%>;UGmIjed}KE^D})xUQ4* z$|LL&DTNHV1?1j5&9TWE;*lE`E`_%se80FcLnY2ZEC9Wa6j8Aor4djco?xZ}opiS* z%UkGNrjA6nkNcL*;)CIQ#;nhqyuCyT1qGa)|KJ7fL%sA^2k1(z6R-;z6G!3&It9w! zY!0n|m*9uS8s~V(MLIl9t>4&bww72cWA9a3&*ruT!6oabRu6%LZgKbtjAL6QqiQRt zueVB5sLzZ16{FJpgUvYUz?Wl zMC+9r&b@a+N=EiF6QHly4n07gm=H1vb8+bLA7?*xGu-I!^l?!nuG01D??~GSbR(1J z=zQ0Yx5i9OL)k4xKYs+p<96-boS)T6aC&%PFUbegC;-Z)RWQ5)HnZxp#2WQlP|dZE z5t`g^NJ0;bXrtf0%PQ(Ch1F#j~_%BXfWq1DPB+WZRdl9)XM+Q2vbMqkyEH6h;^|Ks$cKh!Q`kSwBj8D zKW`#<2U~rOpPt7ogdW}(v7t?CMOM_ADWz3pUTLTUi)(|Te-=&lNCj9^8>xg&(tocS z@O<5QblfDOcw^Nilq@@NBYQA|FMcj&>lI*SA3qev$I{-8Ps2~cgk@OE1Ti%+Wwt?f zRgNeM=TSe(cy7xMO3qk_HTRUR7BdEcb%9mBN1pG#zB>ce%`zx&RKbC|bo7`HVa~?q zY4hfMfAYm9M%n66mZ7FPqHm#oVS#$yO#ex)%wcI<^9uObsp~F_;^_EgaQK!iGIExEjAZ1kq!>{%@eZzuOoS=T2kT(oz+SxI zMx34F_=X2h)zr6!VIf0==d*fhSo!#u6wCCOzmyc`MdkCey!20cPfEB$j&ez~gU zMZ=o1h_Fboyvw|)9Mswj*{PN=y=*U@5!V!YgOYr-$G$1baV1!G<5^lWKu5nPUia{X^;I4}|Px z2b@1SH9fUocp{6R9Qd1`%x+4pK?kPy;jaLCRFg>sFEAS8ch?#PT&EOCPAgm4;A?VNeuBHoC%xvr+?;sK&|47K?u08_Y1zy{xVTc^d3dxK zK=bk$1Ck(AceA?kL2?^l?o>Ltr<^rf%$FqRPM3M6%ClDH+^TZmR65oZ&Z?5Pcu_(9 z_?bxkWt2z%MD-H<4Ll1&SP2Ob7PXOg2v&|7-??Ee4xWd0*#_Pub2@R?(ft+QHI zCrCPV83L!)9XTUb%S9H844riO(XG#U?R)}mwWGcgO*2xg_>@$f)LR$lzIk#5i1KOR z$GrSojHX&+aWMOGQ6E>rt@YaDBA2NP=%w1B(<@!9%q5EWNyFE1Vi^8{%J#tav+ZES zuk%P@2nvr#;XYH4Xp$IZ=NYzuR(8~XENGY|3W z=>T&a@BKi`q_p{!{iq8g;=NPKl38g;C&T7uqKxJ9suG;dAV>q-AyFrc5+ z(lPoS9q;*_s2vQ*)CJah$Ih@Tu>jT21sSk&ft zNR7WeJWr(q(R5Z3-Y@!^z5@8(aFceT@>**XZ^qhc$oU8aHxE?G>dD>EYE1m9@x_jB zjMS48-3MhAGxC=7eq3oImt=mq^dlp#+FKu+@*7n4jewIRrv3|NJFvu+>r9nMtc_R1 zbcowWie0H3EduY3NTzmzVAxH~HPx;LIrgtbe$c(+xs7T?fUN4Bf=2CFG14V!z$ zD6z*ef7Is9zue>y9+lpw)>p2}>9(?M%nVmYIe<5N6x7#g{1?9Q8;A(>1atbXHX0f2 zm6CYzH>=!C1Z7_VrUccubWcxT9k0BrpA#KXO{%BBnZ!M(ZB=blqSZrx%-hjvFX6p( z*sivPn>{dT@9CtQB_t(OaP${y4Kbf<_~>SHxuQ#;LSI!iUAq^Q6^y?yVwh2o$@{B* z;{D>{zj&bPBg;rxuI~H#mqtHU1$(1hi?ut0mR0YmFP60}9uM!cNqQ%*V)bm{>Zx;z zt7lO)R*DliR)OcdkK+PSp*xke@6OzD&IEimq$37}>^K_Rl;;LEaI{!LX^RS!QK@+T zC|360+#Z%puhLCOHs(*A6y413z@rZFR{*NeRXRnPjVzglHvCrlm|8VuBHA9!F>sCI zL!*LiB3h>$@OcmcgQSNXoKFA74`447Hh8`;K=NQ_?ROt#DsF90Ug)PAIKe4a^Zg^W z?&kv8phgU*$I7aqxkGi@anU#p_;r1wVS2aXQ|3PuwEq&*6rP>hnhYqG%^8ea$tD{m zxks3Yh0x^nXW>L+;J2!I&&RtDjMW#$#6uivMQ?Ely%zYsZ-6V*Rzehu(AS@2eTich zr)il;L-pKqDuY7){KA*b(Q0pTgdF)u-4TUUq(J>4(c? z-TE=|J6xb*dNv)EO#&_!?eSV849x(eRn76IJLIjgUeDKE3g2GJHRB! z%nXe&CoRGty8n|^QsE+QgVB4GJ8X70DWIuXWBWVP->cLk(B5DBbLSsEkjy(yp|4?7 z6oF&J|45SCuf;rS4kkx4)J{lU0HIO)jpH_ovi+AuDDYCH#2Mv_TrZg$MXq#;6$hO9 zsL?jQB)P6LH8-)|rLkj34=2!PQfFxIf{Kg2VNsx^z?9Q67yP zsSY0}C9|Vw9V`XJzG(?l2cNUEVCXHuPLVyQGiz@dPGJ4DohPQE(^?+uHy-T(X$R2k zEGG>lD4y*z$E~%vANgBhbYz+(?RpF>;84L~@zCyR1kk=fTASKn7t4#XWJ)_SOe#*u zf3^S@xYyOBo}kQ!$nzJ)hr+prGAn?=C{7AKAqsPkgBsUU%L|(=Vab}fl>(V^PVUEr zp#SObTr_5gIhb3xa(IH*n#aYmpa26UgqTf*N(rs*6B^z?;lZCOGesz}(P+O~rz>S^ z;K*P0{BMf+@Y4;=;IH@uci;BiuZV&5f= z4F5(8Z1?(DOX3*f_buMDZLC;(^*slAiawFYCmL4T$uMw0p(8(%4X;WA6s`SQ4$P}w zSi^bV+$mPorCQHgY!pMO4tu)D-|o=#+y;c zRiv2MGw~WpaO`dWy!+J{%zlfKjW5)r3W6s#q0Sb=b#P2`0}7RP^tfRKD?XbOWuFG+=IVq z-uu7=?u(JecwGVCsjTge9^q8=<^^U*Kcn7nkqNn?D&+&x&X(UbOHxBpQwxkUU{dkP zzl-lGUIi%{eUvLrE1D1dE=ANdsL7N}E&`r78Hp>qX(%0Ty1|$B zmAD~2IH48jP^@Y!v?~jFU3Hp>^d%(&$^tjx!a%F!o$K?FTW&D z$vYilOLVGKk7DwU#&SMjioi8kb(x57Lj+!lhcbEbXLN&lqgyVJPJSB zm`dL0YV6VKvHDUGhX`40?$qcze+G7myX$OQNGomKwOow+6%7$x1>#7_!^dN#iu6JxYBF*#l;@dhpm^MdNAwO zG?Qk~Ldt|>slYguKO@dkbY4IJvE zSKDENXugq$Zp*qA8HtngSba0YP>#%(S77`pWW!+T?7WEH@yxM*fxP}U z{e;W^NzlV@6(3#-kwE!e^`$HA5jn&+2lZTO6V8Cs4a(dA>?()JLZMk=7}gFKHj&vf zzuaG4*wKcWh+T7qRAb{;-3f^Wp%Gb+OKs|2uTh#hw zb)6T>fy&ueq(rx9ho*z@V|Hjz5KYFoam7-@}+;rJLp)Q`3Zl+SiOguCV z&Qza`;xJD(g;R-#jnum7mQ8MQS~7aC1hnW4PT6pACA6M7h0;X%!4PuzqiUCIw_yj| z)>Yrj(z5B`UTkcPrD)1ne@pqPTk(`xj#|?Vp4$D^(a8Q}dXstZ%x+y5MPGhfaZi!@%&n_kGNv*i)g{ z1E=4>MW|mPD}k7|5uP%RLGH95&rZjO7&4tf3Dlv7Sfq&ZNabmaH?NaY#` zwX-JAb%wfuCap|hsEk5#F%ii86(9$$R=pqdg2ww?7O9h^`Z7^28?m4HUP^{Xdw^(1 zyKM;g&Brm@HY;&%#g)F4$$ofXSHvlTK5fpXW&6fvO^8jve|ZTxl(ONg)X26N7X+zI z>Ki%gVUFG{BkKgYa#pm!v-7vnhE-lwm2 zeI#RlYAOAR;UY`A~3{q@aKzqq_y~JJ8d^P+{3^_bgR5)IS zRH$K-L)f|^PnJUHaXia{V5i0D>ei=s9;gfZAf{d$oicChE{Z!2_CkcCwo5^>a@H8D zGpZNSmEGkQ+VdkoT6`l<%MV^DS2sfmn;IG0Mtr3;0RxpF;2d~$U1JA0Yi&Ne?#C<~ zP3hr)_6)^W7aELdpkX+ZRKm4F<_fDJt=d_YeEC~CMi3Y8T|OgW?W1fe=>AAjeDO{_ z-&eZi1E>-79p4Kwpi5XB8`VCI5}Cb+Lcr|&(_7^IVX)i3krO26`3r0jgmQH4oAO&7 zOG92ksQcj(2xjgx4=0E4ka&ND-(OlV-RvuNXB;CU= zXd-`$oK5`5aIdj6s&SR)Ac2i0ev_l~5U2&?XOz84Q?+ zvHG7|e>PXbYg#ocq;Vt;EvwAAdvK2sPPx{tO>1di-psjz=++ODC$Molk9pS$2DW={ zroFOCg%sM8I)oJ8btBzXvLi&s?ckTkSEll|48K#`o;&7o$|T8y(7?yW&yktD$D$dI zKVw)@i!3-c*4Kp3DM{9-<;-AcPOOmn^vx5j_N-%o{My6vbfjQ7e275uSm{5JkX_h> zy|2HP)dG$<82oDD8ZoDpzIEr|5&-wJr{HHQaKU=`DlMTBW{deFkpAu-&^^#~&vM=P zzo%GZp76Ddu&;nZrr#DPZtqkMOGqK{8L9EAtt2j`%N+@TVhkZ>U@nHzw=ddhW?x=%`;G_GAS}S zQC%O{iRtFED6sfu(U;`rB}Y?Bf)bQ(eg(#4YaYY*rfR5EUU>Yd)Q`^)yR7>jZU!(Q z71qRzKR~5P_pdLz6VmIIb!CJkATVrnA}a8F)N_C|JyF{b<}Ba7CyUa-S2NFoFlE8< z+6dlDV08;h_>K$9CfKxX{r1D@!dR%LQAe^(`i4?9S!3Q_(={JO6xSQ2b7oWBhk-yq zU%R@wTh-*Bb_|?G3F~y$+=c60u1h`*IQQ`tRT4GtDOyRf=q(-vxQGQ3z#>r)^Vy$} z!t9UUlL?>;AnJZ0AmlZqc!OR3&LN%F3sSQU(}%U}ClC5zX8^+qg1MpWJ0xr*C{(mZ z1*7cm_VoHgwXt(AMA;$IB&Xcpd~1?Ucx@W9d~wo5HkDE}4P9xABaXPhT86w^eKk|8YBFc3UjO^Lyy)G&;4iO$C!akNQ{sbRV%cqn zW&a8qVQA4#Br;ZTuha$RiLqf(#$`PvkU|4qL?ZiF%slc0+xd#M`+8LcT5wn@7rt$ikh8{^Oj9!! zmg+RI6g$`HAc8}h8-9!zPmxTjl1~>o3w~+?Sw2Y3KUsuUL75{e4f=F1j^yr(_bUMO zT&|`g?~qE*DARM#pt&**w_B|=Tjdzr0uJnH1k%|1iA}v>Z%AMjU*?~7W`l96x{KhF zs&|$~qa@Z?=TI&yXq+8I%M3%OREhT82Hf0ch ztQ74b;3a!XzLZS&*ke`4V9(6LW9%pAr(Ik&W2_Q;r>>2B9m13{lPx8uJkzDk(&HiW z?vFwYuaJW(C5LyXMU?D9^*TkJT%(hWi0LrCyDt(9p^*<7yoVL=#6A@3O&~9`FH_e} z`oR$)_cjX zu=JsZ!7}KX<_G}}mB^8d3{-(N30o(>+!6H0fC%P&t-m{$a!?Nbnf&Mw6p&-1>dH?4 zW1tloC2E`#)U(@n3lI|;1=tNpB3XW*X55m>5UVP3gtaw?)3{s_dHC|~WotZZWGoE7 zKanYT;JWEzv<6<*qKu|(^9=UW#J(jZ-mc#HZo}JDT!~&4;_yAhVo4M?oS&S)dqOR3 zj4h#_Gl5&`LhixCDSlyqLm@*%1tE+5uR4?JQDnwGA-)|x?WVyy|s zBYS@EhhqtP#6g}F@*aI6V8k8R&c}EzW0kf3Y)-OP_z?W%>)Lbcj!+idErZSb(8fv; zuAvxSI;~9e!xOf}ixZ=y$re_N@Vq+3>vx%<+~qJwt(hd_x$0 zyi**7Q-OEc1@Qjw;>Q@cd5k-r(#v_zTW}ItZd2z(R+I5&?B}RfbTciN)!5rj#05J@ zZw)fB=>YQI;9oV0GzW<(`bd$dpg1=~-{cD$+(E7Fm;`0CMTVH& zFi3IH8czXTeB>Bskq!%+jA)0^?LOc9AW6ax_8bj?Q~ebw?nn404a}0s;#r&x$dNBD z#7o9nl)rxHKOBUTqri*=Y}}&TX)hF3SA)}*NSAs|Wn$&bFeV;_NM%-2X3BwbKJt@W z*N6cl0xXHR1eAjiv~ixu?wbWAHYwJ^E_baN>*34w*~c7gMMx!Mv;Qc~h#*}CV**E~ zy^bQV;yagG5VIV!Vl&^7>~&SAwH$s~?GW`kFrRQXZK{rI;T`tK=)}+$AxX58^C05HND8LTZP&nIQbd$GP)$9^0+cbE`iiOv)HM+2W?sJI|T(_`=&vdBM^ zOc0`Z&6&Pv1(CmCB!WBqI!!s7zvpU2D!n`YkL1(HTSMa}3eK8a&T2W|uk5BIxPWQ} zZB+9#-p(B)t!z|ofML4-N7-8d)zPinqPV-ey9D>(?rsYR?(Xgo+}+*X-QC>@1P>5M zupj~Q7D@iS_uc2bSNBzQblxWs-B`=OerQ@TrWzWR1LDdk zsW}=OS2+dCHVSS!*R^6tN5{YO(%FNQX-hNHhXtMfu3%*~p(_9LWx~ zI%s-yJW&WasrTT+I*+7lev^OGwE828H-@07*|i+VxS{n|t(6g^@9n|=kW4^G%Fo)i z)WtLT828uyWU;F(NjC>#t6o#xZ=3$$6ei5;u*)WzleZr;{xQ^8Wz9w=NjBP0@@ekg z%(p{ETPkTJ_>I2S!6pO-D8oU^W$xzo`LoNB+dMrN#bQ@&qr)COb;{+n{O)5ZIDwKj zpcytV6cfp!=P;)d-BKYrGnK%g_mTJ?;_bf}xPKdzM%1oDXy?wjqNANZFVhUh}roKCSVH9)KkwZJ*U@he(a6G_v>Zw12$~(CFPT zpJ=5s@EobF3}f$c32r*CESjwhAvt?e(Uj(T2)>uVS`spUxX+IMNK2!z4a! zjbR+XFC`sQdt6gxCVLV(8&9H0a0^oW6a9%%CmWzzEH==#5$!s6y?4v(+QtGFlmiB~ zYHr$ePVCwy5357g!$&IP2m@yfMwMZV#QZr=lF~p`yfM_fKu`L0d4@s1mh6Tbk36Z{ zD2PUD0S&-6pz2MsF*`RrTr(uU0F3V(@TG{S+op8XBr&jWcl~PUVv8UxRCL%B4h??WR;SG4)eLc-QK$OL{*Ar z9)z%0_sO8vH=Wy^jO3bX1JE($5Mx4<7b}K4er&&jcXz;yNaI`*CS0?2rtcpUUJ@oh zyiT$gxOihUErl&j?m=a8hj&`}Uz4f#F6bq-)iJb?F_};qOpxe!-8g)W&_et)m#Q-& z$v;Zp34GI`PVztl2FY+F5wtD>Q;e06A{w7HU2|7)SDf#nN-sAixVM+fSW~-78;j*suI?=wN_p$Z2)d7IPdzwveYI9a;>8?IJCmv zxuR#*)u&#cU;Ui?RtRr;oEjTKBZKzw9=41 zYf=j!T@l|@Hy?<3f5_sG^HZF2Lxv@l!NY4Lu!y9Ac>1486TgKgEK7VHqPwS#;UX== zKOr%o>9(JH%U>}tMyC+1uA#ZeA~{e}c;>h@^T_m>qr=oHYp%zqxJI_NPMfO1Ij#?x z&=PHe#l3~&Gd6T*-vaP#jU6dp2t{U1yw^0Xzj^Kx`jwO&_GCp3rSb;hRLPAcx4>NL ze7}G0qwAXxj7D{gib*;6Fzp$5Ug6p&7h0nA8hqK}n1*3)s-jpyi4h{;6GllG#);;X z%9mQQwgB9mMDT+Ivz*6QVj1jwUFfR`7^sbFtO3g|Pf9L)MEfmYjK>LW?Zrn}-+I2f z8BK^};y+o$|JB}I8DYR~$X;D8U&!up=?u`+CAqe~$sdZ#28*I6yttvW&0Ikl@{XZF z(7^HOaQ$kU(x-+wfnc&t&4seXP&+CmnjOaT?O}4aW~giCD00zMB$mTXIH0+TNr!<{ zhJKNrq=t2NMZUGVUDWDxDCnieX11jI|B6-PHZV z+WHrLYc6c9f7;be{7yZ*#f@#Cu7$wqAYEv}?lqO)aVFkN;5C)caVDKt7TE}h@uoG& zRzcgQ`0*4a?^66>PwMOAhh0E#RA1^d>&r)@CR7XX_u5*v(1xU^pD@}6TgWMMTODJ; z2qfX%yj)HQN}*}_(X=&ziQ*Qc^$u2Psba=RzI=qXo|E5zZ6K@|p?tPao;?{)2-)vh6TDFD5b$$Ku$?Y;kkCg=2c-e~wpQgB#8!KC)-Iat<^c)RA1( zcvh57)J1dDu{f+EG`S0ezm|lS%8g{0ctrM2@&uB%})yfS!{<{(%IV_lIkw98uKow0}6^M@cU^3u9 z=U5BU<|%u6;V?jkJ3r(Q9%-9~Yx^ z=EQ;KKu{Pr&A(3$@6_v%K<>pHis7;8ryX$)?p9u3Fp(O#&t+k5cb8ED#~@+2gtI^z`O-0SAh7*{+4DgXs16nHnP+_XF^}y#iDzmEKjz z2+!YuFbi%83wm5j4p#UOojXjXZugljD&E={BJ*&ze+9`WdK}6Mv_T7joEc!6(>&~T zil^^@0qbmq=1$?^04W|AI$leN!5kD-fNrn9qq|$B-e^tgl~Ze!kQv{niJVI@91#5| z?E#3;`%UvrO{pqxjij_vWzA>!NrtmXiW!d;W+Do%mJbUy^fv?2P?JbcBtjpZbvggd z+ooIlP2z#{73KOLH+#mtN4&T#y3yPDc8VrH3G1UE9T2r};}N_Oh4#bB7@Y!41t!%l z?YvV1hu%AoZCG%>R`i+l$XGxHQPxFyPuA(WO)PX9Ut4EDhBwM)2aF{(tz4=zJJ&KQ zw(hK@E!$i; zbltd$u3^~86wrFOxw-!X+i`Ez{$UV@Bo4LX?&5V;5)k5wqgC(No4yyUOO|}hMA^sd zvwIb40`iomvGQ}bwDDven@$j~E#YrgFOTzV&ECi9!JBJun;#*F37P=Bp|RtQKo0D0kM3)2~R#5Vj~TD>FGndPAqM11C+fP^nr~E!ajdeN=^Ry zr5~b2f*J^+yQ$Oua{Yi2i{GfuK2imeC+8rCthFSY3Vd5bSaFE-W|lv2qpV?~X|1#- zRj#`y)BXMr@J<%KKc2fqU+E472Z=PQFPab`(-4G6g9OB-*`~Zn5|r@wak<-I&oEdK z+#DyLj7YI@faJEj#^(|L@xBwq^L^wG>D+yFLP%om?IqKyaYfL4L)#x}j>hUfqyeEp z=U>iwm5uPE*A#|yY?qWiD(|e7+iYbo7_D7fnDxc@MESYAYOGA-W)Lv{0-<@-{Rws? zd7yDExX$U}|F!Alc5RLG+DEth?ia|Y-l<0ePN-==s07IrCFkaAuy#|qp9v^<`?Mh; z19xyqT+Tl|cUeN#oY_u_Kpr0I(@hS_Q)M}xGJz%YQ@#7`MUVcM9_zKyW*;Ktw^%kk zer%;sPtM$+Uum#3bLk120D9e5Cxsy-($7K&|6n~$J8nm;Mi)QKC^DhE(ac1@wH>_; zX@bVc_vM%J8ynWfkiHg+YgqjD4Rd9xQkyMLbDdcz=PM2X<_0fsLi-PyJB`QPs07=D z@*bW>?w-HVmx)8ZnDu}$P;5++J00W2r{Z%~h}r>~4M3bj;-q?6^U7^roxUsK5K~c4 zDUT6)^pa*U_Aci`6X73XGUqZ3hQDrM$-rH8 zp>geq(o=3xv09s8qHO+OF$q&=NmdIZEVFjscBJ28 z{*7|?*nS4o+xth=0@t@rEVPF5>+-cHj$px=v^pZWv+Hk)nX^)Kp#Vdx9Z&>KqO_Mj zk~+&xmbw?0$)(_=+_(a<{}QdlBq1Sz^ELgu$zT~)d1iEAi#x3ZFavWFKp9yrM1_uW z3_m#_&)Yke(#kLJM6E4uPF`zRmCuJ-Qev&9=%duwyxLcyQ9~53t2!7-jS3+ZIa%s- zcyVraH;HKLFN%1z`6`dFc2$>PKbtqc(*^5VUV4Jn1XQMS{tBN$9HRpiB{JCfZRO`w zqTBEuosBLjo!)6{76^qnh@$lFhQq_2dWf;&lHwvWV3G&U8`Ka$eBk8TJM}ds6#66x z_4LLF;4N|b+E3;czG%XtY%%qA4ZKNRIruF+fmdWL|7+k{#S3@!j;;g5zaa;#zODn} zxV{{>|5`~?`e9sNps^13DMV>?AyR{`I~;fc))KbTVxjt#fv7IOK)l?`2X$6^NfZT0 z6fx@IzBMoZX=As^SDc|hx4Y>~KG7wM+ZbH^tUB(#cNhybzJBA=wjGW=Aa-pS$rv%WS5cju=Y1>Nl884&B&w zBU#^_%7(ZPHmtkLBL>@GE4(HFtFHUk!3jeH62vA??v9Lq1SxtEb=}_dW#N0-G(tJ| zrTs>?qqYV+A0|=+t(hhK{71qAqj6h3;9(Y=!QFug(9*A?GBq zD=T`O08L!n@p-B-)^aQq4PJ)6=4K!pkhV%jQJKf3#!_H5JIXTvH|mOulGt32wbGHg zAM!%4qFRJ;v_PGM=K1%OW>t#{Q4n~CF+AWEMX#bLGa>6L=!ID~vgcPvhGBHO;U~K{ z73#*`aN93tfy!mQo-v=yXiEu0V2rmPke_zfI%@sFjvi`&WUi1$yls+gGDEuovpM8L=4WEE(1(4co(Em_LZOY8_9FVnYng;I8mPk~7O- zZ%fm^#8IR^13+IqIe`%ihCNMp-dfu;Sq1NIMMb%ps5IEU{hRu3gdD&z~2rguonCW26n8oBuif`b^`|XWDeI zyOR#59{={CSc@{?v4mNHVA_)oE8gvrnx}J}RV^afQWZp*@K&69{of?NKN3Fy5t?T0 zBuXJqYaEldIGwB$%VHE8+BhPJ_99(B@JF^=0-#ZT2gv@(Z+bj_Mc@|iVk!~xr6JwfQ7{I7URvWnhi#5?+|Cf=sW^kyARx zUs<@EMSa=JoQh7$&L$bHfn}uTyiBVR zA4&xSBs{Txb3Vfe@n-Yu*w7uUEzhSt?r$SwFv#7ffGq3d%=L(Rr4nG7_8APJ%hm1P zNm->P6?&QnN{YUszYHMrrSiZ@DVLh(W|K2?{D7Fu8)FJHp*vR<{2eOG+$pJ%)c^uo zj)0v!*=N+3umQGtz*&d7^TKS3YgiHYX69u=XxE~Yc117Gm6+TwWcy;2OBgI@oBz|( zQ>4QU+f*{_Wqn$sp<2EsD3BiC!;b5%i#5bz==95K1PJdicVR^=vK^VPk8qM%%|Jia z#4o$+o07;%^Zx>o_pEtbI{Aw?O#(utT&Le`kR*rXRU_s)NAWf8jPDO8{loWZeq)~c zx5D7Q=JkH}|j=w-i{35=YI4P%0b_ zH|Tr#hIW24Bxmw;@C})Y{qtK`b2SC}GgKdrt|w?aNrh~y7SU5EG3Z0*#|W)ZqMgQ; zy2;Pyp#G3QaGiuF7)Lq$MtmrmxltOWwE;M_T&OAy0-2x-bk#0>K$6lM_NrBenZiRF zmUkRi%sBt zW%}#Axrge3!69PYBAhk0>Lu+@Pv6!o<4x7jh+l!5*k<18*A0EbI`D)wqB2uu;Ku4! z;1?PtGj$Hx+ZMLd{aaNu;TedQs5MPHMwzu}%4L$HyDQ1V1?rmCNW9-O-5z5~HdO zv|BNV`shwfm(GE7(rhdRWlXCiE;Jgaa5Sp96-< zpG%dzoC$6lpF4q?X3qc6$a4a;jWyWQ77D`}G$&p*ojue_wWgvs1(OB0S%hBVzly|nOm(DseLnna;UC!TJ zVu;b#`a*P^{KgLXkmnbmWDPDGU=U@n1dqd4C|EvTUF#djT6Q&c02|tVM)jK)L0%&X zSgrPF4NGd{h4qBDI;vOHvxopkf zP&)E2zq-6w0_tpmTVRU3uNaz6sLr6x=rB%3T+T0lh@Qdl@QhgHTN$7{JGj|frPKBl%g4|>~dd{$ArJOMX)XW$I%wj(TXI9Hr zj=C%cPYhB-7jTwKSJ+uYh2~5>1%w+CKv8R-Vr8@mAZ>Z7RFK%?m9~PBa8*G8sM1fywm27tayO=+Pfb84QO9J z`*tH%kxHHBqDXv}WrCdg&&Xbp%;JJm_;s>~rR31T$J>F1h5kxnvHaxL2E$aLEIJHh zz`hI^J@!7%$uP^@ZwRmeX)No;#UTlV!%?*Ho9#GOG9*##&~^I7uzV4TSyF7}(H9KV zzd<8kB3&sD5kL|-^zI@x$OPQ_ zNjSh-Rj+n_2?RJCA+4gk)(?eqQ)(?z91w?8uoE)i>W}fAj4o<%!W}V4xPSYAw$+}T zJ9~>wIrKbg;IRXq3czjh7YKE2%k6cxEB7R;Qeve~6|w$Pyr|$!WR>VMM~(GEtG{fR zA)!d3x*e^)H_IV>gL;2LwF+{2_t}QD4nOn`EJY?@gTGc7jvAYPTy)0@nP3zvsXmFmmUtp$h@ zdjRfKq#j*|8%hLFE{(2tS;zZSeSDC74d#19kCtZ!8s6q0FBCnZOx;Dn;=lL5tT2}-_z2oj|0~C*8T)>2QX`HZqYJwSP8sKP^D^tvxcCAg& zwJT8_^T`~V)S=WFD@vv=ESm1s4^uf~is_SrO9@uY{36D&R}jW^JM@VT*A7Kx!R@F( z^38Reo|%obMO<7TN?3$gWtF?3lWa|5j^YHeEU!t8P^Uvu_8!_;Xn`yj)Wj;IvxLq0 zy87USordL)U)oK$h$_=46Lbo7KP9rP)vkB%zZAz;zMEL(e+IsB{FT<1l+Pb0^bHb9 zTCA$%SWkiCAJ5bYzd#6$?}FWw8N3m0>hbwN8&!ea!f|obqEQAHG*eM%H91Ex*{LJX z??vTTv~Eza1xY7u)EfI=;*|H+kbfAloaxRO-Cb+1;$5eYDk_-&cK<1HW+015(9|yC zp`Dsc)3oB8TcBFd6*N};+xkvVv7VM{MH1Z@fMiVj^%y3pFW6lh5DJLwZmBhu%)kQMZ=-IzKedR4O>;ar2s&^oljPzQwZVp?qtyy;Nru*@xi~b4r{! zUA7z%irrd?1VVd|#&cirBPX;BMhnB9brF)OH$@bDhtwtz$r>*!-rWfk1ptHBqNJm! z&P}~mc~cc+lE*ty72*lg9Y$*KgCtsa>ug-Odp%R&hyrR!`q+^nXb!t&hC}GH)IkQnzH} z9BW%pAWL*C&pw7u(rnYA?`aT`rnWrA_zk!8z}m%^EPOR}*2j4otQNOjTu+*u`@t|c zz^DtJ9moJ9XNX~P!GQOEjyTMDZ@aE02rn-u=@U-N5T@N6lAoql!(8G!PuzpZd6~!F zI*sO$;tR9XPKnuxOIQ#PrTLF6=QGDtl_l)-vl^JFF+ko6BT!In#2IZOkhsu5i2@#H z7HcVDM~kf8f)R}j+@L-+uy`}2(J?xv#?J7g3bTrBVBXOc_Oswuf$16?yeJq)n0%VX z>&hu*K~GUZo1iBSc^cUq{cT2!7lvoiw{*9b&O+{cD9Fqz`*6X3^5I!mQ1`d78=daA z5p<40y2tO!UePDrHC5#-R=+XKhoZEf9oJ}E=<+r>>I)Ijb~tSCxM)um&gx+yL^2t% z!i1Q8c?!r7INzsRmc}nWShl6Q{mgFhn1hL%hWb<74Jhm0Cax}q3!)Aq1HJ>iVO817 zcQ@YH#~dYDr8#!5U^Sq=47hY=~v?fe<&d0v0^EycrGN&=>$^5Nx(t~ueQKg z$9Y5{M!^u24W^1$;4U{l7c(2MXv3KLFAy>HyVbit%G@m`m06$D{3&|3nGPx((h)$@ zufpa|`$~cOCo4b|l*;D|%*V~Do8~oh%i7r`pzwa*+8PuN6faJ0a$+mKv(t(|b|xW7 zG5dYT^UiPe_2t(`}jIwCz<&zYv5y(J!dXMu#Ilsngtr{W? zgrm@O}+l{3oLFj9O@-D%f3Dq<87jOrV8WWuJF;Q8O=VMHOwSl$re55x@!G^2*& zCX~h%v*LA2_snZZKVwF*cBb`J?)hTQ*Ax_HE;ac&{%Sryo4m7`>P5Y$kG|w0%2?WF z>CNA8|K=XKlv7}F^%c>y*{H{>(mbq#26tPU8mFW$rw49hVG=MwV8)Dzc1 ztY&Jfo{=;cHfZ74(Vve4ek0;Y;YylJ_TG&RhQ7|ap5^#_Ujp?Y=C*~=CWrxnJ6Zd0 z1qlWtS~>-<@A?{1U%b>%Nac&V)M#v3XlA@ikfhZ^OXW)ntBd7Xp8YZ3DsZUIAJEP? z%53asPbj#$q0431KC(ORj;|g8EurW8XJb0hb{o@8EZ3j=id|Ymw`n~*Ij7TaT4UCn zM^pO6bgF(Q{GY4=Pu7$*_BzWEVg-~Vkf>n(#rlGOeKz1EeuG8d?J6PkQJ9cei_mn4 z%zCipBAf*C3`}|s$#*flwQd?K*`l38zKoY}2R1~S?ZP~9vBo$ zQyV(NG2Gwc{$PWu#V$Ka+js9PXW;Jix3K>(NBzFmfL3w25SIG6B4f(|Be}kz--!*lFYh2D7=s*B%FR=k;^&PW zOSMqd%%|#OoIv9zKjd#8CXnJ{uj!9A0u|dH^;mkolVNBqMn&^>sFv&Jz?Jc~^r;U5 zsH?moZ889Iu?>u@dU(W}*+n>)s<>iWSMW1sYpS=Ynmx@ zO5gMdUdT`JAFuX~U_!d6!(Ke)?9HCP_q?ykWS4?S{mmxhl3MOf{M{m_I?Fhva>^P|p0GOi;jngmi zw*!_DIBCDK4x^iD)@7Aw5enPJ(b8-p>afKfV{{+ac8Khemrz$uN=4vfq6hNvPUs;D z7zdTIWeF8n_XYS4)x=R z&^pS^ZDDWoOr5%U?KbZZ$+Moo)Ps{TBn0ov=64y+r?br5I}3#{qX`|qC+GPZ$tJ$J zDlsOTE2@^;)we+g6b6X{Y%$99aeNi0H005Ex`6bx`OA7Y+m)$3!gFyUJuQ3!G7eg2 zz7+5e_&p4B{hWLc&2dI6K@nX<>Zq>mJ zM3H5&TI5lwqYMGbs*d{C$Ouv~*}jtBLJ}Yg$}bUo0iPhU(qe zpE@e*$O#x)jRy=?MayhFZkD%vSPEtLNvWxo(YRJ-XnRQalas&{;PtnMDdZ0^aWdMI z(xOh+PAxGktyPa{kN;f`2&r{ous;=VwWvl?gJ>cfsCaYTdS^Dk!3J3Nk7|Vx9h))++6QoWkuIAP}hVygz1vnLT-g2 zoK6a5ubf=JnHCp|zy({!4tZ&;8ycFZec>nh?af<{d;o4*hrZm1DMZf#8Nh+^c*)JP zTbUPJ{vycqdw$mwfBnt+&zxItO70yL-2Pj=2xtroAXD}6_T{YAr>g&i{3nB$_aCbQ zklqjro!mF7z4z_W&l?ydv7UP?Qq%{m0Huin0tyZW1_6l(4+{+e_ErK43>+1N6paM} zU04}~jMdPQgj_^LH83HmprL7Dkxk9WII*y(abW2?hNy{CP;&F$0VD;p^We}hdvNiU z*uIdKDJj-T7htB~Bt|-lW6@wBt6yiw-^UW3^be+tHB;n#k z5^YVv!#%}K_JzOj(7u0=ugY4CEu3kVLqUPX$B=D>)S)RTQ+^zAE#ON@G`Ufo>F872 zm-ESp`_5O`n_qjlyG$r~9PWA%DA|Ft0d?z9OC_<0bkH8W?3eT`>jQ-b%IYKqj!NwU zCtC};0TR#CM3VbZA_W}{6O`yQ%=(j?FX1PBXU7kf`s!0qXi6Q8i;tu|?Ag+er2P&J zE|mxY?!i)znH=QD7RzxNMJfVjF@G+<+*X5*L|J9DQz0%Qxjx)ExI^>f*7@+=>3n`Z zF8l>j$Dp6@p!Z(IeTo`BcqEggLG zE+(^W+wha3JU1|?wHbNp06DXk=u2HWeMiw55^==sh31%-y9a0RaTO*#3^k*%$*6BV z=gDVg$O#_M=G@4{EhAyBuda-<{WA7DdoSd(bI_Eu-%@O(cBD%_8$vOzM-j@BT*S1M zF2?#S*R875+V{`rM1c|DbC;#quB_oWt<^iYRc?R5w^RuOAxVI?Ac^_B6_&S{TkLu) z{Qi<70~fz2AQ2yu7To}$66BO)BM)S=s2fx|gp?9ec`iEmsC19tHbtYE<%Za7Q((%eR`N`27bkb#i$fFv)D07g$h+i56#|$ z>Ji3lLm5n{2@+a0oooOK0zo-rF%x4X)gXEVT|LHm;-~%1E#2hgV`CG|t`^W)2XnZC zJbTSgn0JuwRImAabBT+7?6atIsMMLoIb@<%WKv0#S1BiSZ3Jg!BwyC48{7qoZu9na zKIgW7L2}-Z`7VVqNbrt5g}V$5Zdn7A=MaQl2B41;n?qm;%C|=y+(F#fRrp$8=To%6 zuehh`#Rn>?@)BEv#y`m*Zb>WxRDaS)xMg}-`JZjoU9tO5i+AZTGVQf6y#3x3!D+~h zquEm5V#-Xp>&rD6m;xkkAN>s+xbN}w;nCq--gGyR;rc?`DI(HQBSYMfETC(_R) zQNv*SJWrcaj#Y%&fcZU14yarWZ~Kw&o3UImgVH1OWiWi?k-1Q_5CJLpx5s?D>QAf8l^9Wku>SaPY^-g&8mK`Wxy zZtBjF0Qp{o^JJ?VS8iw3tP2*tR)^Pw6Z7ED=}GQ6+$xy!c{L*AAPP%c=yP28*u|)k zNKyn>p6p*}tUxT-ldrO=5eV2uhWY}WI_Ss@w}g-T5=(tI$XF-ZsO+;HZk|+EymQ~T zf^UHO1a)l_eKQaNG>@&5eGa3beVTkP+M3~Yc+8!RS2-+tdvKLD@O3j(LY$*qln=@x zzkqFy6SGI%KRAQ=fTdLu88)5?nNug3gK>`#A5p}B@(PiKrEm8>Tq7IkZ z;nN!&g@=XZ^rY0x^}qY)_z#rC&Y?LpaoVHVt^c&TjW4cZPat1K~2CHveLrtfd#hr9PrTGRxj&|!@2En$ndHb^Cphn zbYu((&C+GHQgF1xB*Q~laPk%pIGkfqXdz}sOhkC0l$vnZ5cYeX34FYJuu|hljQO6H z$Mv>Dk;XPMM#eqjh*c6Ht%V3y^#f286OrDMPl{$awxbcrdn4q&lR}}AVU^o+Wtysx z1~A(gQVQe?9L2KTrY#f)A%v078^eq$x+W!*I_l(6QJxKXOrRkoGM%ig6IAJl)U-1A z)UOA%gVM)!4;;YH+V^?w84oC~r2pL#uRnwKz#?K$;W{yM90d9WNo4TfKec{E^dI>1 zD_Jqtc9SJZ?`n>hJ!;U=p)>oiYQMcMwQOtMiu4h0d-xMo(#TfffTcvixo1&IV&JQ0 za!tDTJ!UOMW9cejgQ=w{if=rAlYE;{)a!SP5>+Rs8(1_bF=;ESp=HwEf%N(kr%$=1T2CUpcp$ zN*I}pGY(dYj+s%e|M5@ugQ!)SU~YGX{_NAW5=)slvh|P)eA<&&`zA%f8{a?kaH&%= zw9hQ{v#hoR;e$QdzkfRSIDOPx-Myu8fH zHq>9g31y`mxD%DfPjOae8Li~IvJPDXH;%;GTAr(tvRL%F?i;K^MU5_wvTSMp51|?M z7$e@*E|^tC6MPESe9onkL(q4vY9CNrbzDprA3z;9eE11#T%9pbFfgt;p@&-Eu&~0EN~4$QcBQ0V%P)+++qnVuu^;u-}x#J zij#1PsZFG|G-2ddQ0XWpB6xrq!O;I$9Oj-8d8%YPE4rmUS2#wa;z4Ri>M%Cp%t1k= zRUGkA3dBgLG~^D!yyt0e511iBL8Ldr1Co@mk}1G94;*Q~2UITFp`0(!(S=}wQ+Z0l zMxKYZ!E^tl5y8K{D$KAPN~Ok=W@ep62Oj{uiv!ZXVplICFE)VtXmFcdSNu=w1A!(V zf*mhd6}c-6u&@`7VtkE=Lch!11^{PlD5VBz>7w^A1)jwzg!yQH#sf6mRp0`E8ko_O zXjUwHjj_m6e8F1~$a~@_^cB3d7JKslvKn#w3uK`N`4c#SY*!<#(4NW%g1Kv zezYt>Kblz%c7sx|t@p)Wp`FV7k-2gcqQI7=hLiir_b^rsVWDjYg;=}?&OBde&&2!p zI~j^^3D?G#9tJKHN+jk=`wEC`Cr_xXb0E;BBNA$X1y8A)S7Ln!2U^|n27jzov zvj()2X%Mf4qvpe+0@zRGLi&ern&dK@#!zs2;X^v1c_Ip#BPc2dA-`!X=;qum}n9_LEp~^LkD{Y0$T$-C zo7D$VE5W#CY6hFO0AEwgHs5Qe4dc{tNl)&i(6Ffq#3^1~xf z0_e~C1DfaZUt28krb$JS$`HoM`K=mrwz0Uuo%vTRMS86&Xf+c2SVQ(?J}mF83q{mm z!pn3~d^soEh=95R5YO|S*C2R=`MM+{s!2c$JGCWsrs7L8Q=mI`!B91aJhb^{E~4*$ z`e7}l80EfELn=u6%_ud^!0{tE_KQjMaeIU_GPVIcf#Cud!TYP{3M8I@!DKji8~8wPXZaw8JqfKqTrB z<4O)r$W|7PE`WtbdQjbvRq&bU+iQvnOM47vB05BnjHHz?u%bsXNqlOHLO^w)iUK)X zZ!_x8)`a_({J2leaXmFSoQucm6&|QY&MNsInhg%5!Zk|vGg;jrZbn@bGKZrY3Fr$vyH;mRN^<`irA{OEm?=zGl( z&$I!jC2L)9XKXNcbj1)l1KS{oaGZ}7AozIh*JEiTAD1GEFW$R5grZr?!kS9xngngt zMAWZH$s{JV8l_ZAP)6Y*=6tBfn2yKd5e?3o1Bf!_j95arM2~Q9qIGaD=Tq0pN9-V4 z%K0<^REZfhlEJ5`#cbP^scDOE`;n8O<1k?9ejRr1!^YC0W7T9xGZnmot=@ z>weaLh0dB%oZ3GFQ}%hp<=yH0o) zG3E%*+dwCOyKPUfxT)CY*zDv5#qU!2W~39n@Hs&JJY47NX-p2PZL(%fKcgVgFVx;%D2r4Wm!{CtVN zI)($dDMDzA^a{C-C|!I?w`7!!(IaIHxlpjP_XZ6juQuEdI&?|)z^=m~&+ zw8;gi>tN;KC6M+w3*jAzB-^$i$3!Y=%^9 z$m&DZ8|pzM4E)E&{btoCvik@fsQnE18~hpv&$iec zfij$O$A#jfSc5NrqKDJ@LOG)EzfT<|5FQICof zlPmSWev(3QhP*VVv@R~jgSEGZ^8|8%c%D+)=GWdMv;!kv%r^cpQQh;3RuGkjF3sn#-u=;*v*l3 z>Mo8?WU_77#a&8Vjjva!7p7J1@sy7j!$-JR0*V*tGY^BR*)|lxiCU4T4=YNQbVXQe zQVNOLvZfeOEH=mC<#m-<5^)H+%PhXP^1Dna_E>(|g&y|r(QDcuPp=?;gOy|GMri*Kwg%?)7^v_KKz*43 zhU%M5*;lRzMQ08(uvsB0Gh$HCLoZ|lv{{pC4nL{SoJt~yX(T3^Qw`=^7f^Uue$TjA zEH?k19RI!rwLVxtuNxMpa29k8eZFRGitfF5y3GzK7laS?$C+o!`eaUMoZR)?VZx8$ zqcLVQlNx6;eWo9X@GDBJnWGZpVKjZ@?#sCeEJ<0>xxa_wi|O!eNzvF+>f9`!sq9QB zL1Uum*@$66WYJX6DZFEh*iyo`)vYilM-O4iVCgait+S;D&sq9he&m~d+W@S@*8rN} z^a~_Y>f0I$DyeT*K#5iwdS)n6y<=M#RtyA9ww6pXL9hS-bVAuvsSr#<0^{?0-9&mR zRSyNplsR}g;SwgzK=Metc!D#$4-B z@-;<{1Jv^}oqKE$oTXfJaQ@q7QvGCl4u~x{gYBgnkKw0NX{AY(e4j0QjdxVk+?*u2 zp>PXR(MibzK_;Uk6ba-)LW6v2NRVeKMUWF}fuUrMU|`|l zwS1jyiHkK%(89y3+GPS>@S-tgNTeH}cJZf?BEdA>*`E_4tfN4nCVIH>Y~LB$rf7+h zjZUPXeR`tVM=W5ReE?;{-RXJ@7&DzCfs|lQz{=r+y>pasNkb`2R3&lThgHPL+Vt=v ze>uCzz2T5Wq8i-JcSp@s1P=!2O0OJO-;fY7`E@Dkt8iorN3@b`e+6f4%CUrObi> z3iNqIi*w4>#Ry0~DBMZ=9E(ezVy`Mm=OgkJ0AC(0QRTw+qtu-$k|EWxFnKQ3elk`{ zgiPoFv_)y^alI5Ri4Zh>q&*S>+1aoGJz9!QVmvnjB}odpK|;oNakQPt>>mhhrtc-p zR^?rndIojSr_ogNc-T1{H<-^-nw%y-s=0Qu&Uxw%>uY@Vu$aW6u-_uN2_BgGSq7?@ zqW{@qrb6=b$bEVQKYM&~bRw7#A&5?&0@ht%laVT&>;9r@6f=bC(Q>VAjjN@Sv;xIo zQG-&!yGpR}?Go+ci(okXhK_2mcLB8f<-laUMCPTytf$n7u?BrGB2*NenY+9}>PImQyiI;6+=W0cR@F49Ue5ukd!x09}wi zcwca*n9_3F=TyUzA7g*oO)w`W-|bzjl|A_WYy~;o37G;7!eYxT{@DO;$BuN+-n9}4 zJP3rC9e7^gk9p@oHR{7y4(=8g_WJh)>>jlgG*aC(kksSWsS!%M5i7XlcS6@oUbEZ^ zxUou9Hb`gluZ}+}|8GwV4%TwgDzOOPQ0PfET!@yN;R2yuyD{HOhRgrJ2nO$!X9P}U zN|gb18clhSa%5N;b)>ye@r`F!xi zAeAI?G8o**GP2wNiH6gjlw0Uk&r3yH(GLG+xH z$x!=96}t=$K1_UivR>E0Ye)>F6lU=v3N%}?I*1`gLv$hQx_ex7>ZFRvba*loAHOF> zelLQ@r?JXbG?3e3kXF-$yY@{nAz?NbkiAS1QxIBQJVvyqHe;PfwYiWFWp9zO-Qucp zd_RdBspP0wR!!amQI1Q>n2Gu*v`~-Oj`n0IS?YuF9oee6^n1KHddXroXDs_7Wm8E~ z29^vi78!zEq-|>rC}RLdi(j+!=_etq_ zeZZv8c)D*zRJ-F7_Be|3Z^+U6lu%_Het~SU>pc?BM)i?DuGWWw(=z5VlfiIp(l9os z7!BfS(p=2BV*5$n{5Ea=d2qq~(4Y6+bKHr1#k;EHhmJDzK* zkw5%;?cNP(fuW_X@m{j2*X2C6$^vEmBzq!w0l>{q=kQ{RgK1Js@&6F^mSIu0>%Z{O zjkL7Hz%YX#-5?D!l0!-;rP4i;D&0BEfWUyn&>=CTfHZ=Hba#UwpeQ2xyy&ymv)2Ca z{qFsR18y$(z;SZj=lQD>uLTUy_zL&hyHt^S$08Fary7yu?9VfM?dEv)w}VF2}(H?Zqe4l;nZHe-2f;m#sihc+FB#6F!jFzR1Jb zj|tj8QE|3J_Y5Is%yh=?{^h$>_Mn$TLF?YSa@MX-d43$58;7f%`FW>3j%#9hWBtR_ z+91VS5ouBrUK59rn@UI5B&cdH`JHS@PBsU{zSU;*l+;^vOnKrN;&__5(JU1XOgbx0 z@FG`UD58zP>(F&*vQ@ZHzRnka^mB9Q;&T2(!n!Nwae0q*gDYP!M@ zJ10uYGvHq=I*-qcO*c+c3hlgu}SZAx3!q43`lE7~?>u|K5!A$GNS|7{4nS9w1 zE0}Y_pU{>;4~d|1LdaFwr8)^J2)adfCFb1LYRZIL;n-dQuiAd!`-cf_Ls7V8VQl#K zH(hT7ap^W>^`-pto#dGf1SH0I^SqWy&kGZ=<-MVDmDX|U*4z4l`Lo8)Ml|7R;=;RC z##8DDG73F)8q&K0tg4eIYEeqQnR%by|1#$I{$eQn?Vaxie%pTmAkoscu7a#1fRX|D<{XafiJcW+k5%xAvJ;2g^|EL1+ag zv0eXWeBS>JnMqrZx)Ier4#?+zk>es{#XcqNUd3ys7z-gM@Pt31bAfKe)bLG`hya}@ z6)!`ME2EI&u52!Po4XQnn-?a8)sK|Nlqm6PXyQ!rV{!+OcslLbep39vB(3S7|!?yK4<~lOikyl4Hx#P=L zHs;2D{^~URX+B}X%3CvO&l%SIY7w0KuC-6Qi$)l-g@NkJx?jszUi};=SM4nZVQAOS zW);Z}DbC2G_K0)bC}7iII8r>OE+NGQYCpicP{o(bp6rZESMXLWpD;gt_qFVZcbj*v zsBw;sBAgcF)YlI@$!$BzT9vojQ&ysfm*i|pHqyP2eM_HrA;UJS9trU*o~a>2Q|v;8 zT4m;-nR;Jd(i5I&D%}IiTgkE=$5s_45ceg)pKk9QJk%5_qg(&9PJBbxi44=aaqpol z6u<7^HqoFI4e&^UI;DNB$8?t~jlEk?bGpXThjv zXcT1MuHZ59{WdwIe^wNU-NI%vH8c~-WD3bIyi$NbhEz<;J&5jR?KL!u`xa@fL&+TJ z-_S_*@{B1^Gs+#acxhPW(OU$0$bHCIcr;<9qcfKlpVx<|x}yo#OpT7OeB~WT49nUE z%b1Mjd8Yj^oZ>M0$!>#`)Ordg&ZzeG zaz4hQJ$!TT@4PPwqZp-Q!-OuBE=G@8=n=i~M8lFeB9;gVTGNdeQ}AOU+srUzA&D6e z>3lb;nUt4|j%;3BDl6)|D*bYou?|?al{1vWgZt?8aT4B|J4`G+P<4GAF>qsD2>>N zljjQO0)DN*UWvIMs@++{OucKAba?+hTz9f(0D6M`2-iDR2S@7*`pygI>4dtAydGFH=^v+~{sGT%xoI~~1M)3a z{x53!AF2(+5<#%AA+5N+UBwk`O{6MJ>{ZEsz%PJyu1Oyr=7aP2@e6ewQ?fTQElBMg zj^+|v(@jp?ejPwc5y__>i7eLn*B?4fe%+XmJDctBv&ZJq*dVb z24lgKxFEXBtHlmIW-b5dZ6VF4P2}Jt>Ixq?T8cvYg_9JwnD%%uuNv``J zPK9E9NeQ>g^xi2j8JOS8CN-DI@+ z#>1A@!cvdd6pKqwDBBPBLjTw-sN|e>Jff@>WWd}lPqRiYi4L1Y1)WZP%`HE!_#qQO zRo3aYEV8ahVy4H-4eleV#|h}>jrY@%2|{rjXj^$Tn#%oDCQan7%494QeYPiSnkc7y2rn@74~?x9GkFVPM_6Mkag7MpAl0J@y%ntSC(OAC4< zx#YK2Sn0ys+*A{r{1PP)F{;hI>!u6|G16u_C#M(%6fl-+ORu;1=|qEt(tDce^n9{Fq1m6@pW2EcaIAgo1V#G1su@KW=bTQ z%)GfsgR-7#a1UEUfs$v%@#3rbPPxx;i`A3y4_fIlGa^E=&GYPPEALCU@)!m43}w6+ zydtcnrE;HBrenUbpk6isp&sspzGO@^aU3t*DVT?3|&%IMQdK5XY}M@@3L7F^}wSrB0e|e(yFR0h^nKMYCN0 z7BUqVE@qL?l`kwS5PYrlc-Pg8mwvg@{=h3%wsUFiZBY2B*{=ulSRmrWCZ)@f##&JMo+b+VS>Y*fgNpaM*)rRq~`gWe5Y30o6)tJIOi);!u5Gw6NyIJD$M5!@$ z9xS{rVC-e`@JF?W;&Z14S++Ggz^){s45lpAil*=zmARfD84Q-RwF#G%A93k^o7jr! zoeU>azv5Wh4E3iU%Zi;#0cOoM-gsPm^x0Iq)PPHXHbXSkj!M(m3SqN+8!MQ*4I{Yu zJPz56p(eHR0oW|LW?en{YPLC|e3S8UTJZM)NB;8xip?UytK*IQrKqmdz5K+zjk=dF zW03ANX|StTT0EWabyLTWtCO;x4czFQ&U?`Un-FTEQ<^!{hM4+8rv;Ab`9Nbmrw`d2~uV!0is##V6T8i&uaIM33+2HnCnk>gsdRmVJbGrmnfAq(D%5 zOdTlx;KJ{qX-cVIXb3@Xi=)dzl#nmEsh@XDaDBqmtzFZ^FtAL6 zEr{9(LbiNTRx?9F;U%5|%?@2ObN!ZCex&h8PqNHSR}CrBoX_l|f#o{bIO z%_bAlYeUM_aGe;7qp4Ey4I{ldO`|P(ETM|@<_bf*&grdCYv1_Ew$6L#DUqR3v!M<2 zWuFWjH(WOkM#3Bkv99=lJ^U#%LFOphxX$l)G*(lu_Vw%#ov2evXx$6boyw>#cuj20 zAN*hs7lf-}eU|Z~`=;NJnLp4u0bY<~4ci zGEr z6*TJM6I4}JnnzsT@Txq_5XYI(phk5hrLGjNR7t+s_79Or z%g#qmT6~~d12*EHsJx5~D~IgxM$n^2M&HHdh2`GKdK?b5?34;us|kI<U1%FCr|GMl%#~`DPo%7$j)8(X1K9iZp0P@aLp2!VPvAOE>L8l3KsCW-BZJqH^pa`}x}*M-bVo8AogFPfs+hoY|g! zGe~OO`4PI#&Lk7}q!T+ZD9PbPW;!~^^|MW}YfRH+mHMaYg|UiPuOv?|un1=CyB-%X ztk;-9&CUhDh2JFMa{8x3K@6+(#`i|j6ycM`BuFx2-0A{hc=A$dU5I8CZ`q%Nr7MMj zqxd=U%d%IPXz3fR1;%5CR2g#`70WCbF3dtUHu2~ch-Bc>P#fVm0YsFhmJ4A9cZ*l) zV<#R6nD!F*eyeB<8lHYy&_v_cClvU`)?0l!$7W6oGG)2}&F+1#PG83rZk8%OtUkfC z=}s6P0flPEhXw;dieDD8oeJX*DEhg);!Ee_V4yKO)b%qRsp4YS^N`T{AsD(nKQM5Jr#}M&_ z1*h~Sg8&s69EX+mqOGo*Kwxr7n)ie2nDvEd4 zf|WbG|Jx%SQm+y`k)u#T-ERaBE*=&-=NyjnadmBAd1Jhdu@9WuE&Ae{jm3^8#6B6Y zs^v7C5M;n!uNS3vo08M1^!16+rT-v2ISPJ-ulJ0x7De$q?||+)Ggn2mmn}u5%A0=a zLv8p-{Cg;w@;j=}jgL(pJZwz!4cS8W5H< zaxp>(*Ovs%nGd-jmipX6<3*e8EY?c1z#jr0GGB^L_(Vj zEEUjki=BV4UwGQ`-a0p^z7V2i;S(T$PxjN{yGz_;9i23Yx~2M3R`O!MIGsXHXCs@P z+bx^w%fhMDJ0iHqc`cjR`ajop=jR8aoUImQS4I4Igg>&oUHzs*#?67phv0K#-20#y z=whUvz>40wRiTZo7$XaFU0Bm>2kT|EnWt7(ivT@Io#EC1tiob53Z`bmDONA-sf<5Z zjC++bwrXUd|L)1BvMSJ)__wKz{_Gs|awOXYWmt z4vPLQou6pwXGIMAjH-n5y%caGF zdHg!Hm;Z~`LZb6xxbZ&;_POjT*lb>r(j<`afo zaejR<4r%}LR(+PhPPwiRl{Wk|mcERe3}2VhCVk+;|BdMvQvJ-1f>0ye*1Dpf5q zLd-`$&J|vNMc{rNUArvI;vz=M1Lqr%eYX|o%C+G~%d<=2G@`jHcQu+||7()ZvV+PE zZjtM7Iu=b+7;Vu8;Z?ZFcfCyyEZkm2RW)MikS`M>YV-6-$D6EQWv^qd)4g(nlAs^$ zK996b#$88`b8W%T&duUErA!9l+6rqil5=ZkjMxje2Yalp*qGLd!xYUP=WCIv@=dv4 zZ)jAbaI!(5*tLT6$ytpx{>|e5H#UNr5xSI9a-mM>o`L9(dZ z%;(pQXJD`oMx{1pgPp?W(`s**HiL3tvS$CT?ku&kF^UiYy$dr*$1Ld>m-#As%~Pr% z$pXg}?$?iTx@^6YA7^3<{iE8m#w9#xX6tqHaXa|jJa$*couj`C`pEK2+3VofAL@S- z{}m1FEJC94n(6{R?@C$+JqKB6$VjM{AXPlpyi9F0#b|k6JFTdUO52(Ooua9Too5rA z_!(4sblCLFa68RAzKeP;OkUQ&h>~30LAH?!?f#x9GJ0yf46VTaBt-`q>y;wSAM1Kn zvU;h{u2tn)6c$S^;E*<2e4p;JD*FAu0EK@`A+x5PJr^y-skJw4b^HbYO9c7%87V3| zUZyupoL{lJjtir*#)ma$ubB~$|NaesizzQFh3#^l3ip<@fSx(lm%H*KPUGkZ`?0-! zlHcWNyvjWjvLj-#XTW6Da6qWw&`y_p~QT2X{C0HdgavM?zI)^K}R0iHrt-N%ehs$ zBl)T5lD}DZLVT$xWkFk>$I;HKhbk?YOZz_iw(@F(oN-#Dm2oPs9|wO!jw_bk1|(7% z1Ap@Xz(DO}GVtOVJ5>jkk`15Jl!ipaPq<7)fRirBm~v2JB3rk4mhyJW&1KCyBp(2#jmK>jqN99>u#l&4WHt_EqX&X z;VW9a6*{9M=%v|n-C(UBQ!`DL@%25?cv@YuBLcS@tC($dnD3&h{N^2UsdZag^dKZi z=i5C`_Ax(*B(aNY4fRDoR>DqNzQZGWyU}q!q$c82gfl}GO#e65cIJ8$w^lVSS_!5Y z%q9_`FKy{}RASMX^g+QPoEujJC(9%>+p37iZ?}lqgESZP*m=XUZzk3VJGr56B9&ob zb+FgDsxHlv_Lqfz(gtg)#FJaQSvP1G529{CYPAB>*`W(kv@hioFDwKPlS72XjfcC2 z1eK||b{Gm&7W)qkAI|T&iN}N#q)O2r2Q0i4Iv7gC4i9v(UDv!2Q0N`R_kO2FSm-;} z`-rx8w_NypzdXR18zokiMM^S<>a4?c9WVRJx<3vspsk*0TG6Gesi8HjE-6yf%?^H=<&N>-bGF z0bS5+G@sVhBhD5X&tmV`S2u{llR~OJQ*<~ls=!B&3DMnFA*GvI=CZ64zRAelzW~<| zV(OXIUx4rX&PH-gA_T6`d$HZx4Spb{{A$a1Qk{iu1Hm6Eje{I%D)JuD^cyZeR5C;! zQsS~didUN&SGr-i1VudaaRTv6cEoT00?0lOneE8f%UZv9r8iCD#mle`)84G=<}sCG z)l1z-`-aNl-FgAX*)`DfSwsz$1fw6kM6^hE4;f_~^_9tK#p$oWeUq79x!2mla5i2c zl+iO!>FYxxlDq*N;?4%9XXM&+PkW~i-YKWae+BxKjvEDvKgNHm8JNE7YOR?X$_q?- z_B~Dhf|?|S6!ulixwJ(m_Zu?QPs>>(6INKu?tw_2sqU+pcxyxa%QwKW(;}bnlkVc% zZpRP3kyd^AYJ3E3Mx#_VB3r2RPZ2{=cDO`ulfqIimj_RU2u~*fqfNEH&Y3~hzxo7P z_h`s!nA806x4!M2#vvSkB2JAsSiV(AFX8;8F3Os8K9H*s5{*nohFF;!w1w@*{k|#3 z{{kpiF`C1c$+&By@iDZaQe#;!EmSAAkTP`|bqdSoSM$Sev?Og#(~VxJPHi4~^vHjy z74&XO){BwY8OiF#NZKgmsOIDIOP6nbiK;8U9Oj>Zf(&KfiAz-DKE}v5SnR~k^9nQC z+(+;-5Rrn7Vbi7 zK}3-goKm-ors4~|8aa7f3(od;7D!6yIHc(L&pt;Co9wQ zqiC$|4N>K^&W0CDci!5(=E1EvR)0c@^PcNvSj+9cF(`r%WMussNl(qZvoFp@#=UYU z9p}w}BuKoOo8qU3)0U^A6wqu2$#dPN0gfIFLcxlJD&ck0*f3TvVa*B!2r-DGgwo8% zl-G(wt9gMcmJ7VQr?dbRC|0=-T7r)eeyG`pW(_)o> zRD@`gvyhKZZgPCB(9%!vTd3kt5?yu1`Cbe>EC2JjEF!q6ylxHlBb4}I1d0C$+t zhM@uhz>)r;`}gETEK(Bsuu&62{h|F5b&`5Csy+a9K^Yz$S_1}kNIxDir4Rd|f^xZc ze}3PqFq$WCl_R*h2-@6$9-z`zQ{;{3%XIveUKqB9vQhpM-0D|nuli`qXr@(7sqD~GZ0Je}L*vZy(R*@OG*>B>X-ay$yXieRbtyHO<1^ui zkaI8Hz70PwpK3aEK;FAFVh}io*Wts&5ZHYuPM#fg@McE4f)7hrCtX1)_3GjC7CpMf zCr+Do2%jeU^n)9WIP@)pUBeQD4w07;pU}1l-3^wmMONSDcLp;mqR*Ez4Z8hy?+ZTm zw|bXMy3<4)qHyomv?D(|vyRA@q=Z8axth8%PnneTaA6u-D1#9W*u0UR z7w(D8%zairg)BioVaQIEn&!V#WkMG44q_^B`-*|nspAr{kvkiAL&caS&vL2@t|g@x ziz(Q2EWIH`-0Z>efvQYVGo>AVF(OED-;EtJDN%U?A5q=y-&2cI{$+gjo-~!&@-WFg zCB=sN<{~W0{+gUb6&q7IQI)CB%Y+#IM61mAoU|Qz`n~v4j(s&aXH1nZSC{{mTVG}- z?@hI>kR9uTJCTICo5^TOs%m<+DN*KIPxEETZpzQ6cXANlGbyolv953N$(ShbS?^Y+^hU~ zyeaB>n@bx`VQglM=cnk$~1{- zQJ1ADi7sPQCp4jbZFI(zrm=EjltKm@F`APC8%2hTMxpd6Ertr?5Qz;~BPkrZ*9(v} z^9&j<&k}B`L?R$o%uFeMMz#%y%y`V&hk@T;8ZJQBg58098j3P`;VVTXG(o^j_RZk9 z+KpAW9K99$u9Le_#h7Ue>u%4a+GvFqlk2bl0+4o_5#8?+7ATVU)~2@@eztgv^M%>c zX1gZB9F_W#NZ7`c+Rmg?RhdXVx7S0WD+rVJJZb`Cs9V-_2JMUClQ$;BXP{KhmxFC} zUCo^NHCMH3DsOn=y@QMbt_ByROcRPAeekk2uY52)!~FOXKmQ|$SxS*s*zrx`0$DgO z?N4**-L-mKfclbP9eHT3Fj$-8|2SN~V(Am{Cs|CM@yaDt*SWxQ*++2^xB3@e02q`)Ma<54NqnwCWWX44sS?-Wa!k5G)NKT(u8(175Bm9Bce@ZkEnS> z`P3`kriQ3qLltttOn+k)#`f@yLxaSvku|sKpTXDu!w&h$H(f)>d4X-DIH_X1+mVSA zSS_xFOz(|{11v2th>jlN+)se7I9_1P@Zr-3vI(|rpo2z!?=PXQOX<^luY>OHp{?tG zg=YQa{m}FWXSH0scGVuOYo=q*v32)n4kqwD$N?e4nC0vlk{dF7Dva#kVD6s5!2% zWp9$=CdqDXrR@gR?vpPC&aJ+?`RPF%8v%a`eezeh7)dS>$f%Hiw_*SO$E6*Hw6@AK z%!6q<*?wbN-I`O99HG*9j;VbMm2UlSzDs=9V|mTQucyiPdJQ5LXmjiMyX)SCKR;zS zE{1NP1#CN1ph%-<4cHCsr6zWR#jMIuRk|E)m}V!ZvjY0lGx5=j0?)iMZkd>rX(W9! zr%6TC9ZO~v!y&y|nOFlb?|Z8f37#U?O>kz2obL7AQ~dU~dH>@K8}Kn+%iCAQX_c0F z7=M&VZvqb~KG=Uj`#wodNw|t-b-2|E$}{-Jdb1MA$+V3yvWWy3j@@I0l*s#qsi0b4AG_nzuk0?@-hlv)bJNJJYp>SL)KwG5OVn#pcJg+{ z#c4r0B|j96$F0UgsPT0wl6X4e7_xy~bmVWj=UM*&0Bb8(f>~s#sW-wX!5W~%;7;OP zA_!Txaf_)yj2J9FW53!|5xN4;GnMZwd9P{Qm|}7{r)(C)=sNT4amD|lcxXr@K3Sh& zAv=T#m(Xw>Nfz%7-s8?B>VixwSc�cCb!l^(4rMD19*QMvCX&Va27_G^WgDWDj!j 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 z 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
  • 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 literal 221731 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 z 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

    s9-lF)-DOgJ!q!I<;&tsps@LV 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%0D3Vzbpu5V2Cl9>4g-qLuNNgm(WQ+k?RLCTV8tf zWvq3)law6>mzQPwCMQyT{3}bbm_?X)4>Y|)yjkN9)pVu~rx@16#>VO5eTOQiw)H49 z`7Ujk9m2e7NC!OdE*gZx(u?6Io$_Z>cgd3#i!h&0V5E_C13Q1q?emcT|BWvT)U75d0)_6v>&d+sTjCo2|6Vz){Z;7Lo?F9V)yJEQh3TgMh6 z`-5zB8={DY51sYStCrNF59mF&tx8eO1F~eiCs$5Ff;PMVdNNZ~s5%(-oKmf+Ze3sT zAe1S0^KeM^y**dbY;H;|KFETr?8-kG5FC=OdAqhF&{G3{P|zJPoOjN$kb)Xgw(~0TWVn`LPt^RISJ>)ri8*>wG4xYkMc->WKD4yOd+CL;TfHB-pyA<{W5#wCz zb&M?^FpQ@^xcNvrRvG2(wVq&|^80&@V2b?^dS2GkVydnD=x>{5Y}mhs-Cv#ve4C#d z7FcN+54?%kLr|I1qaBeXd~kX1PZ$+-+}N)@|hQA&O`ujFcTzpNwDZ$1G#oAneEFM!`GE!;2*<+ZnIFd`%O6?CFJF0#Ck>hQ{-*?DZX5$iX+;a7fjB0X2 zYAjayv3-?d-j(5<92UEbU9vgnr=dIMmq+R8%Uyfi5XAC>B+HsVnGqv_#rQRIuhYa6 zm-Js$h_ozPaaJ$bUpJMyH0}dHwnkCx>ZSwOph#-V%jTOx*#k6fw@#}(q)VnQ5v~mj zz(Jb#<7GaMRJVz=RY@%LSH-_kic+ApDrdI#XV&qv?EE5DRhPpn4lb#%O}UxPf6Gdg(YRQ6Y;e%^!ZJ# z_F<|#FX1fh2-4aLH?h4GvKTV;0%%y_v%a;{U>$XVMJ)zlP+_-V$~X9tQ;B_~Kzb~Z zdxL7PLy*_n->u?tps!h>O$^Y)Tpa!Lk5?<%A(zs2f^Pm7iry-Zf4uJ`;n8u3 z?R(S~F}%*1S$7K@`@^~1l%BJMu1PD(R^K}8zq_HvGFTK&fOzTmKPxXg8!D+B17&k; z2Y|r~fnXh&L6h=AI7_xq-D_;Y@;R8?0y38HyQ(0~0D3BNC6% z53GoG_9qp)1qH0#SEi{7V&@ec^7&S10vwl(P_tCLJZ=h@`30O@bRm?K15HDD#f0rG zu$K*ArD@GxM7Zb+UKCnh0z%Z<)!9scVRJnY@oBMWBf|?yWW>^uDl+aj#n+FF%cm@n zw9LULEF@g?2iGq-!!8Hh**ULDoF7I!-@ zU>Y1OMk3?KYCo+Ft3+4taie)_73AyHN`kILTP9J0O^;&H^S2$FCxp!X@_lg9wo2#@ zCz;szkN_;HU)telze2;*7_@RecUYn`L1Bz-0wU_~KJ`|UwUhym9*(VujNI2|ehSCY zAACmj=u9D49wsxhzW^)PX0NwKqyf4?q;#F5@0aO@$ZvEceY755{YH7FsrCa50fI5 zaX65YV^IeICsx7ST}XLQg#nl4N?y9BTHNfsp+eH?j)KfIt>dVYJw_<=w?^f3HzD*L zajs*5-qDXfp1(ZdAHK^{!jSdbXYBj)n~a4xnXRG=$MISE2ip zaquNDCQY@J(O@2XQ>qF!W@lgm?L%LUBuKuwt3arPk9r3|UT`8G2N`ATCN~>)8ccPi z<7IrE6cK>;8-=&0dJh@7Hu&@nADH`704L!B>8EX!BDQT$i1R|KUQT!Ob4>5P8l)pw zCa1SdSmrtD;!bK$obieV|M+ltsk3%IEeV^DK9M^>B`pQ^Y}p-PopglBN$@eBzL1|L z`)aOF;a#kK2=()v>dCQ8OTqKF^(LdR&C10ADz_sZ1t1G75cc=+0MAm;f1-6`;AJdo zyns@)kQm<4AdLlTLgZO1#@Ehq5JibUZe9~edH(G`COOvXR$G*-9Kl)5(kf)g8H5IT zJY`Z;=12Zl(WL4vy@S>gngJ|H;xBUF?JOb(0YP&KD?~MmUsfHYlFW8FY#5N1Z9@im z`Op>R*s?TghULSJX_FhIUN20xikz1bp0uR763d{z8ÜWs?9)R4Q@wXCxmb^B!C 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 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 0000000000000000000000000000000000000000..fb8984919837c07cc75237b14bcc526c97b88595 GIT binary patch literal 31380 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

    ?^0&&W&AYiqER$B$^)L6Qz&Z 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 T>4}+c<9DC*kH614|IGdmFuXRf diff --git a/website/assets/img/showcase/laice.jpg b/website/assets/img/showcase/laice.jpg deleted file mode 100644 index fb151b1fcdb3557813ba6fc152037dabb8a5abb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9263 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 diff --git a/website/assets/img/showcase/textanalysis.jpg b/website/assets/img/showcase/textanalysis.jpg deleted file mode 100644 index 16207825759bf6a93a3f89419074d2cad956d74f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16789 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 diff --git a/website/assets/img/showcase/truthbot.jpg b/website/assets/img/showcase/truthbot.jpg deleted file mode 100644 index 4903f3d176a374bbaefe49df8dbde8f292b424d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24521 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 diff --git a/website/assets/img/social/preview_101.jpg b/website/assets/img/social/preview_101.jpg index 448c63eafadef39e478c5b860bdc4e36ae218d19..f65eaf8708b4ab4c715eb660fc551ca7ba846f05 100644 GIT binary patch delta 361916 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

    C(IRVt2l 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

    uyAu_#enA5c^x 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

    dChw` z*2+rNHcGwRgYmyid>*;auXe<}1In)u*ZET9ouZD!EXt+UI_mD0^ccGTenVOui;tmE zqw>*~Y0G%GnUM+i?r+>%f?hT{lYJN8cl>W8?-tE}&QJr1TLFd?NFBac9b>CsnI%xx zaidq!M`WRc8zQZec&z&e)Bm1eHAM#Miy0UVNXl85DHxPTRO#1Mf7Nfdj?7`jvpQ2U zTQ^1|$Bhm;^*Psl@fVHU-APS})wSehkC5E-7oI$pG);=I9OE!xr=Wzpci622MDHQj zmIVqXt%6xi(?_0gT?}SIs(vGQp!Zgx`HMiHA2K%ldktd_&)3a=_|=r~`h}!FEgi#C zaU~xH{1M=%Tyrl;l$9z+HenSH76ESe>y!Ypc1_Ku+dY{v=@taPv~CEiP_>g;8`bJ{ z%5&_%fOC>@ldLZZJ-KOVdVW{%1)W0Do}QVHNB}L39cnN7OdV>|9Q&+&43it+PA9^| zMtl68qf?6p7Z;i|YURh)Lm~rlUtXIKY?QReB_<#u$+!=l+BUQxss*Ow7`7&7Y9Z^Z z{RLNjW4k-3adIJ}92wZ&+5_S^4pj`VgbL$q1Ush8?ZDWJZ#iEq$GN6`T4$#jFYzuq zDtv^TlZ_~poA!4DIs!myrkLOzHaD>*5!$r;iO;L@ll$zHJHlU?L>&^uaBR<;wJtP! zzLXVe8JHEZ$g>Tq6^&<*X})^cYN>&rb-#%8OoP$Yz*Bqe(6GN4OXkQP7zyM=|I8Z{ zVuEAK(vM7d^L5Hvq!>s9ok}i6wvSDxZ3uKl@8xh)QOKvIne|DV#|mPo2%mD5$B~I}F zN7q|N#SwhnqQl_s?h>3ZxVyUtf?I-Xa2*DB2pZho-GjSBaCZU(cgZ8a?|$FC@2>ZH zt*+@mdadcMI(@2YpL6!^Y?}!zT$8gwP@dGbW+ar0=hIUnlaFd3q-C~SU3AVZGe2gP zNZxGEY1R!0#tekYmW_c!E~rpZtsw5e|12%Zd5RLUhhUj_;hbk64t4NW>M@v0AyKLw zB}r(~o%AZX9l7!+n#lEQu*fxW|AnWTZjA%c*w?j-Klyn(tD0 zZm&LUA9h^|Xd0rYjEu|MpRhBjI6*i}#2o;-xp5jo3=b!JcqEGa{pk~0{aY}A0uedv zg!iV3Au!`vM;9`w#9-2mkv!mvh?qI2mAk4Sq|&Czq|g@AyUFSD?N*|&3$6-Raf5g( z#~JtA3^lxQBhEB4-^}EP7@kE>OgoCr4>;1lkCp%#DUC)ZCpOI|x-a^j*GwWQ_@?z2 zv#7+eerzC&fEH;5owPB?_T<9$1{2!&I5Z`9Wn@f;Md^hiiH%Yv zJr3>ooP$r1PJ=84G%Okg+3;hm1fwJ(?H_pQJa{ux487*u0aJu{EEWBO5;g1E4-Dx^ zJYY%e(7lk5GgBfuM6O>8sZS;(1zhxjIDPWOF~Qsza?p;-vzpbZ+!h)|4N=grqO}Qt zq1Vr68&zk>^?JB(i7#Gj4m#MEyub=aYgdkCKabw>ZRcQbq}I7p8t?ke2zuInp~6ql zO;qcEC-Juz)Kq_bujC-~I5at6BO#jid!aiIkRrNBv_f-@2Hs6kV)DS=5kGjyf!(_( z3f5QyK#`=Yc>xmLQAedx-wSU?+=pc&7$3-wYmzV|{6`U2J zD$$3_{F7dkUvdY@qDOD`%1+MY;S1N-mCu7iingm9Nv#^8vFW`dH#06DM}c2bjFZtC zQq-#;(vTnD)x@y%W$kkolJCSw_%z??RB4!NqHkZ4e~#F^Bv+JdA8+4l8ROp7~oJr@jy|)mp^CF+j?gn)VxH)MB z{D{2AA8>vaN^wq{<4s&rhzX<16+gK~wi;$ct8|g^_>M(sY_f&MoE&cJUR4e&57w;P zLEtKnj*?YmVAE@qSE8EBH_xha$rXx=LRHK_hpp?V8fBskTlcmT#?+7&psvsP3rOcJ z0FvY&@K4`yIc2`)Kq5scSTK!QNEz4mQa|D|^C-W-WJYgR*s`jP?g*_5_zS*=>Vue+ zHbc7Re~23NR-5%#)rzxoKjw%TQ1u~3&ly>>3pw5Vz+SYp?Q@?d&rrV#rPiR#*!v66 z|ELpFdigAO9~ z5f4T^j=J-$%*_`Ka2FlWG@>S{n>x|l{b-$>{mZ~CYEcwfbeIcedhO=9j|A8U-w}SVsJ|> z{%5|$?2X;99llEJw4Ci0*!PlV{kcj?loVX*NfmAW*52gR)`qrqF^;^qfT?1rokM*@ z0aZP|WZ9sN>BHCZn2Jeg7q$MYea3)F6Kg`oZ{|Iq_>f2_mVVCazQ~z4LGq-w>VM{; zJPLzn`I;6tci%oOIF63QvOFOtJbTvXkr>i9KZakLOUuJLCEZbpq->QWq@ChV_Ut(# zdLxg;+Q(;Sd-7~1HpLjaJ*CUcR`z9`uy7R-(U!g~Gquq!s9&c-L$r!6x4l#^i9_U| z(;v3&*LPXTcs9a0`KxwKX35iAF9X%|I@)r{qT>T`;qHq{8+YwXrbf@$h5wm<=j?n7 ze-d|+>&_SK7dX=+fxz7_PFi2vD65V_1azBnXfQ{6SRekG3@ht> z5NJ*O1FTlC%J%c0bwJg&$6`0p8%zFjeLB%iuCc>h#__~>_AR>~UCX!d-T|-leVI$0 z=rsHf=AR3Ur)hPG8PV9`^y_cA$uVtE?%tEY`#NX9_U0plxi~ow+INKeuExy3Hi{0( zK(O}9{IR{&q#e90+SrndCsnYXlX+*{O@$?~tY+Ib*xjHrm}FhkZ$DeQTlkqWP)Br_ zt(6lB4^YQ|NLQ;W@#FW8RB`$mY3hf|Q_OCLB{-Lr)byKb@BKpIBRb(=~ks=DaEX+K!n#s&hcNse|*d&8iN=kR2ixnE0EX?EHu5q z>PwyZKfPW}@-jCKXCgZCFJs4MT%_^vm%~BQRkjq|j;ubGqPX=RJ>}E~o|0j+HI|Dm zYx>Prj%nQ=HrzilFn{S4s@THLQ^rW)aGR#9+p%E4GPw1I+4~;~b%m88Folad@v|MZ zu*I$4;J;{|)2#RwJkR?^OfNE%cl&ayoXA%FO-a=j;j|36>40xpw#ZKhe|w z7a&ZFLj@e0$b3kVRKGyz4v|a@#b8{*BaUE`&xfKv`UceuHG?gN6i<6(`WD-HzoWFB zA}5Tqs3YSTTDwu*N4ZoL)IQpP^40N*g$2C@I@T0kFiI^)=?2emH6n4$Y8v}?=x2G4 zZ8dWJ9Ekb8ih5UASBnDt`3v&aBmV_H_g#2>ZrMY5Yp`k4LP9tKZvrJnkcdg%8FhlF zAEaL6Tl=$g@=?x#o|wr?Po)kHKIw1RCDa$Rw?8VFS%a#a^Q&2ed%*_MKyHcMQZHuO{RG{wvZ;v~OQDDYU`;oJxr6krS zNsZCu^BXgd!}IHWWkTPp%!Qbaw{{q8^hhM1h~@3zyEmMnSslaB)O>)$1`yjzPR93f zwx8;Mc6BTLs8{?v+S=B!Zuq{l)=n?8|6EGk!YNdW6+jtg^G_vmX!CgDp{ZIt(;<57 zdWtHjb{z8@QxGAvmGa0m{>^FLHtyR^g=pBkezUF@`@cBmbi2AM%hJqy0`H$cf6jAx zlgBM@U`MnnjA6eyq9sAXh7B{xQZ}A1Q{od}G+7S*0zTb0N;rNNi0S&YHTrg;glDf% z(iN^Ft?)Xvh*^**L9;U*eA0IEFI0YPo6M8{U*Yuc{_&2okRuBA&7@Hn3rJsH)0=5e5rAQ?Sjy*0 z75^Bd+$;}rIorGVGdL0HNxAS#_!=8G=t_~q2x0*%G`h9+;{)g&uo$PNILN?fV*(kF zBcZSyU3s>tyYeoYNCaphOMIN@N$@|RC2XJ3NU2)#OM&+G zcE6#&fUmJ)u)5>jJ&^MkqXsIA$ET|cJKsB=wJF96b(M`S=Z>m1X68>GnOG%~FPc(I zNtyOV-Y^%F=St@{Ocd!r-+3R^`Vyg{aiQ|n&zX7GMNFzf2be`a&2aCu%Iw++OV=po-m$v9D->e zSgYYdeKf_<^)Sw3s*iGo?8?rAr=-z7^zuzJ2}J@f7BqWw>t@c9FY=FJx=|l)H5P| z3Ck>TW1~?7RWhnoDNU_W7iIg_A@wn5%xr2{?RE_;n z^1L2;cW6xYzd$ieldrcqls+iv6V%AcOThn z3KKxdCZ=YBLE#h-pIduz3F?{I7FGSb0zi1b6-oqSMQibT*U%Xwk6Uc1_#D3Hn=Bez zh$UmY;vb{D*P>h&1g8P(2XY&Eh!xDYnEK7PjqCr9^AcLJu}3{b0yk|PQG+t4{PMLp zHtT?(D8CkPb2HF@L9s<2Fl($>&eShGym5g_GRPV@;n+Sxr;7~2x!@{QlranSEL zME&?fA*V^{7)a6VC>#hgKOS~8j(;|^M~r`3RwzdR=~2aB+38i%r8HK_${UXKJPM%n z1zWKXjqMBOTlZvodCBDwu=B^W$d88d>chc~eI8n%EANeE)WJYM)}e8r70+k@dSmUr z?55wlEb_vy*Wke@omqS@UjerMqL99-Ss35!PhX`9`@=x6?okN~{ON@?SIEyh^iiy8 z@}K$T+gyc3yx$aYHiqtbo=o-?X@5zP5SYs^Awb}UNDqI$cK+Yzj%)S#ek!v;;J_Mi zc_ijXnY=@wdpF0i@VOI zly|nK))cZ8nl?5~QJ;Zk%JwjNMQxBrF^_(j-u(*wrcnv{$9@05i&s6*TXL~i0`C73k(;3y6)k5cnX<6h4TJ&zp!yA3?G`tj_A z^N~{lYKI&T!gR@)?unpSI6&`Re;BQcTrX(SSVD}u%#*||jGt88ast~Yt!Ia3nwN%| zF{1zRHG7V)8Uxp)x7=@gvlk@G&q=oa_G5wB#M!I?f0LvYW#XeJ-q~oEQ9h5I?k7m) zd)<6Sa8uRBhLH{M8=DS*YHxLe$yg0X4h)<`jR!>>H>Y48v=^*45xr#0EeMX&_jydY%3=QzT@4C z-~G#vSMAs##~uKZRP&L>Ns;&=P(T`p}oxJQ%tC{=8S%NVe<-uC#mIyF0l z$3JjJZ|p&Sso(0n|DHEWU1``If*)`>K-rMT890F8!yIhEoc;-;({L@sGS>ke$8!s&<+ynw-+r!hbaH$Fm%d z4CSsGdM?B|DxNH1Rx<&!=|RuU5o$yf#BlTe3RS@GjA3E0>O@__q1?bFdr5}YOCr+_ zq;qqKmlnFI+i*BYO5a;eaGxV6mR`?F%3EaL`gQPZzh*+P5QmPLs&j5o?c^*)zyFKf zZ%*S{GLTgOR)>VTb#dBv%FQi@Zezs`ZCg-fGCum(P;qVe3Wn4I}L=uKMTu7K10ckw^|r++)% zv+l66doK0pT7f&@1$RPYqZ~rSBCdyTY#E?%8ff;YR^5cq!k)%c*{+}xr~9m zebhK)4wbE5&buIVSnLW01ZYb(7r2ChuW9^x_%lc$So&i07N(bqZ;K&ly*Bn^ZAayB1HG)?r?m73F&aGR zcm08BI8R}Ji~ z_+7iI4i@vC^h;T#nnI^30jJ501D;+PZAF3O6Z z^7;Z@(^sQOvRrhtk)b~?JO8xpz--x(1|%n9^tj=8#}A{+&n(9GaC#Ar)4sjFh-~(~ zzF@*m*DM!}Org)D4;{V;M;{7q#_kPlyNfFn2nrhOKCvKp8U;V_$+X!rPV^vmUnef* zjxE>_KEqo_Sg>#L;qbm`UZr?E* zvfuQxh@9+D33k^bRP+3Vxv*wo^v14f(!(;L>P^xA8yTQ!vcw^WPz7Z`acM_;ZJ2_J zX+n=Zs&vTXt#0XNQXk10<({v(Ld`F>s`JO_QP;TaRGP3PVixw5_sN_QMw{ad}vb zz-{LJv;Ge=7a|z_V0Hi$MGk7-%kHxS@9WRKD3d@6BU>1*cOACILjDvU;`cxNzR91j zGOdyyp2sWCPbD3heZGZKEw*G3t-|X@bYzG1-S5ABuAAv(E#y=EyS@=!|REq>6z}25o2M00h%1m;)MjKcZbge zim)^*1*5?0+_R^j7B_SK)>}F1GFk4lcKc-TZ8+r#(k+8J-tldhss`Zp>K-m7Lz5iN zkASnUa0FI(&4%e}6!%jLWzD(WVjuD}CVEAnegj~&EK**yv>c>{UzCSAp>Kv_ryhLu zCSBJuCpda{9{lpV_xR(!N!1>_!N+)SfRZMXbgk3vcz+Jn-=847ijSt|y^>w(g(>id z8T^P7KI_|hUR?bdqjJ{qTK)L#P6R6C5Jn_QA_%O`i@346yY)GV5OJT`@w)g;qUg>+ z_gv-rMx_;7I>k14HT!(Ka^e)KYF%hYC$lD`gfVdM@cF_2XXw8s$#<0q^}%G?;`zbz zFTlY6kWz;{>+KSTUNaeSN)ko)mXqTzb!g{{$(3m))aJ~qrOsVD=g+RG1&s( z4+~5D<1u<-YK~F~v@}9B$3gMHxiNX7BN^d0I?i@Vk$+qcpgCfgHpilb^OyFH7mm5w#pAc*EvK&j0L|HV6hrEdVB3&$8$S|R%uXtk{oZ_e~WUspAVtLNg6}8!NSIV*K7F)V z?cT$I{SJOHG<_&qk${0X$Zjxx99=u(|LXpsCqoh0E_QyGUiDBUQO?X_{Ojn53gG;T zmvM9J^~A%QVw~>E7q}mqzjxx`)F3$O*k!&V^-q*iYpn%1U}O0-;uIPRO2lqdL`z*F zV}0I3%t2KtQeQyZ*T71}>Elf*a$6+MR~#|2+$g4EozJRK%Y(l6K`oW| zN`23I9YLZM3;Y4_$aWK?tL6wrdu)wd3@g_|$LD+0aZF#@&84|q90e8u;XY@ZzL#o=5)4#Lz+8sd8Yo}T&N;eVHhH_aDiO)$7 z$eE|d=ve>4w8NwE(7jth#1N{-L^_!P>HE=dUZPQPYm>`0+Sd9!>TS~AF$owo=Sk~TNR}Kz5ls8XcI+%8zxW=e)%uJ z{oRxKobw&tIpWx5NwQ#=O?fOeR{QwF=O<)#uYlRV%Lc}?ezw=rrl6ukCQ@NMhr=MI zcW{GDfhRN>L17^|b~1`>l`KFpaw#uxMl3LALkWtCROBx}i8^5WH6hQoIGdMD(1Nwi zx1OnQyBhH%M>o^Kr#O&u6|GsVFKIir^oipjr%R08gYWC%{R?lbWC**PK{#0J7T!rS zfDP9z2Rgw8KMo)v?$hfR$YA5`Hwtz;_Mk{-I6V>OU3ZUOvuFN&B5_w% zrc|7$oR*H1>Fv%RrZHEGk08fsEeseTl<=Z9Lo z%0-;`S}%XKD5kdAA&PPf^`%#%0F`8?^-4aD#oqHXQG7z1Vrnz7uF+=2Ydjg7(<5;BnhLUUyC&j;-U<14$b z&|EW*@@UWfqX=QHKdBLSbXsC1i)JYBh8vac{{k-FHo-77GAWJiE-{i1umj-H2NIt~ zYibsb+=L*w$qQ-SLv2=iR8kYb@)8Y20BZVx>Qh-`njs)&o$p!Xabk)7pi@-R<%W(S zb_xmeCC7b=0?m0wnO?utBv;#cr>0oE2Ct@Sqw2q0>t^;Jj|=wNMt7N`$E_9P}5CEps1 zp3|m{bg`15JZhCNtEuNR${Fe*v)H^50VK z8$+@Dqp+IUkbPtG~ z#j~w{Q=hTk_ei4SiiS`_a)gaYVslmkd2)^nPU+gC3bLfDbw$|trEP+SLgm5kG)J=W zcYdYB-1rHK_oSK-_Vc+1lL&r-c^3Uwxe7KrNdN8GoTo`%+IIO&fV6F1$Js{4E7|vYEHN;lzP$ zy@yAC@4r2or&L_nSA+A5=P!WddP?wmiaSw~)=|UtJK?k6doH(OlWR46k8>eT)|kY3 z3qO&$=GO(1G$%$*mKoaKBxp1Jz2Q0>X!*20yoHB{kFDFzaT0YB8-7!?gVZJnkQkWu zJKxWTS)Tb#(6;=1x2p-KQn)_GGPNpEY#pCD#OSM|3zYoHcn)#nP*E?*0whj*kEIVi zygi=Cj6(mdT8Ss+AeBJq(RD)TOwr3&NE{Uqw3{4Yz3OaF;qNs3<(-Tm- zdGPD5)*U2n_k4O~E@dY|P;oJOoF;GvlYs)u5684ELD-{ws^P#mAtdURUl87xPOUB_ z5cwmoOEtIg?5uD;yj=EK?a0&6{RWMUY~}kxJcIoJM_&eH0@HHygN}%x zwy<&*s?_$VtUR7kgj#?4RnyM0lE~WgrVC=akSkH(p*uNAOA(||zy*tayg=Z*38wzw z(msS%52cR;JlJUZDc7Yjxit5m8lkxAO)-R&&&Q`hgCHWBpyZo{KG zkmMaqr)Gvq5!Y~YhY@CWW%@H;MaBAxD%^|#i!KN`3CaCOMJR+qfvaReL?jx%iECl!|+V@styDK6ZUQhf<>hMxCYWgEC%wAN>LmFh~F7G877R%MiBWYM=4 z9M}|~1Esk-`a&lL!D&SZnIwNQm8hT(2jAfMY;Obr-UTv0eJk(z3t(Nnpct0Ft*`VD zM*j2i!xKC>I%>ajTDe3FIF03$#nv^9uCsDkP z_kBW9H6V6=$S*tD{{qa5!oUThmIf)W>Gg#K1tT4g5i#v72HOFqGc{0LUVcTIAW>KH zvIn6lLHYqm@^&Mnt`rE>IBCVwYadZ7Y=FH?aiVLUKUC7ysz?O^CWCTZ9g-_Hi|YE~fF(JMBj4?H`vV(;1nt%@okHBYN7(!N0`fdKlihP7NlvNMu#mY}pI z^0(@D&}R@0c^Mrkh&k;2a4~Jo1UFl*ay4~tK8BJGCpI&Ql zU{OUq*5n)kFi-$aG%yJ{F3vO+hj9iEtyF;EOR$dzdK>D-Q7xU7gf$1laXLA(=`@7A zN+^X?W%O3PtX)eb@3r!&OgS-%U)+;{n5ibm?~aOBjApg9f&_d$|FD1OBQ)q&x{asq zL-B&Sp;}`CGrp^^_$!EZ`Gakkm?SUE!8m0tz37#1(yT8iS3HP{alGl+!K@oFIHE0kARhdr<4({B!>!zv{;5*egbS*Z^pt?V z1%NXlV-dbQd_1t3BaI0k?>IRC6{HCZeKEcgMp-|Tj&pEmO+TBL``~DogU^sjU_rnG zCM*{gCAwhENbdgNGui9)fx1Rm~0yiD5Jn1b$s|ZHc80Bq?2j$kf=P48>yXSg=nmy+0)JjFF%IlW_X_{ zuzwx{WmwFM5e?2f4BNfceIMPz{*qjNL;}C_NVzBB3CaqE(@6v%O#T9@w5c7yScA8E zk?4JtLt07#+K^eMqQU?(l6OSp;ox*M<Ebn5 zUQoQd(*iYb`=Ey@KQEWi7Fo-H3l1!PC?8e8w9mgF+gth24skbavtvbQI>-VAYSX z_{YiM(!>DsDB1ID0(e$)niwUU>0?DuWe`2?2e(hOv0ntBw`+PC(ObQoRdKm%P!mg0 zFAoVku^J0uls>jBu+}i3))1P5ulydQMo{JeqELE^#j0XLihW@SG1|Rtqs!&~uPu?f&w^j20X^3AE z5U~J6B=1;q?A?<1hxDtA-_^T>&<2v^va9!B0BO?<6IkJ(Xb)3wac;70c<0q@TGSyo&|aCB7q(itxFnl2NP3W-1Y_a9$;{M6!TQ=AsUer}fbu%WhMNlIt3cw_yuEomz+z?*9 zJNWXdeZKkAr!9YajXk^9YQZ57>;`Q%`@VsWp?tc}GR#SnF)L=|ZN#FbUo#4inEf-e z9ZckF(-90p14tdg9_a`6Ksa?|@XAV8^^4qU#O7)Y`(!w4=3xf_G#-l)uC38UliUXP z!G77XOTHf*4Zp*kg3~Q|H@2~ufAp(bPp0(K5}9FA16Jq}cQYqR!PwR;y;7R3;C<$f494kf8MP05uJ#6>L;M&5k z=WZCRthAKVj&UGZgJbB$iToniO8M-rQCytFj9vkS)r3+ki^NsT+Tc=XQbLQWWOCrFoZ59B zw)7ZsUjDN;_>Y<`cx+*SOK!^j z)Cm2uJHCpxvJA$$OF@U9e?CGuOLIE<_A7*dUZQb0iIlaSa~TS-2rRM?K%LQNyy$og zNSHI3z(7v=r?LnL_Ld+>t<@N$4v{XiB4qm`dK4(RKgvs11-k^bs>NPxv$8|?ZU4K1 z#>n!0u_iQpnOajxeP3Jw-r$%DFC>z>IuI96yfe=IXHv#&)oWoPMgL?@_D zxxK*)LA_~aM4VG_c5{#NW3=5G(WQbB-hTmE?+-~Z2s-|rJB<Yu6br;_bYH9@NnGew4|(@)Fu0b|i%+XbmG5wX<#D$aa4 zebh+?998$;z1Fml&myYFX?fC%hmhrA4G2ryR zE%uU=2@l{%x>mA1#~n_FFpUlwSc85HnF_XY`mERT#|CVfA`oA~89Y-R<2-kW$|Azc zylSxX7eF?(S+V!~_pb<8RSaNtN5eN+&D}WPb?N26728iK#%Ug2J+70VrxI>B9XW{v zAkP~4Z!P}}=G|)E$o~R#ROx5*{GKaTn_Do?)k=iN)&Bz8vow(-oIzOBwKn|rXmdas zHYs3OA!~N_#$P~!$OHL_=RgqK$ZGVKL*NEn0`+%wxKns==Qd@nI4p;y=I<{CN$lqH z2;h%>{xaB~=#cdTLiVXHWil*$!Z5y@mV__2ZitUtd*-Fre&j|j@GFJ)`>5@a1ZHR| zTfBA55F1b%`6V67sO$_WOv_a(K`3eam>{0VWy?usywDia>Xf*Ii!jUeY&xhR-zt{` zC4J*;6~bP!=C&}2IdkSmVl6cz%YVp=Q&ZR3y_Q@hgzCA#iVc0s7v``W)GXVhrCRD6 zXdm_IBw*|*fTco+o{LUW;KM9P0mH?AeHzQjMfR+Ocg}~)cnltkMkz(jX&gpjX^J`Z zcl=}a2#n3fBcP+~v>VC%+m+ZIeAp3Xk8Zv;4pU?Ol^QujwI`!aMoULm0?4dJxyS9x zmMa? z3O~L}dlfG^H@xHM_DAe7*!#!-Isg9enfU#xh9;srlMrwk@T8l=8xbg)HdS9-v8Gh& zO2=OG=n|GgWDJ%LQ^TCQ*xdmmlvP8+^EJStz{K+X{04OpD2JxY9+r!4QNO;KQTo-r$q1ETC*UPzufh*dz_jQ^{$I61e#h zD6tovrBfz-yg#=WaydezhOblYE>#eg?;Sw)CU?5|_0_Nf~ttVKVb@PIKA2SR{Z!Amf)8=I@{kmb>ER#5qB& zTk&dx`YiFl&X!zCh}C4v>p<9fmK0Yf~@K~L)I9qtJ3>!e@$_L>|a9Eb02!pxxw zc&30?L!r())Y3cjo6!p=0je0E2N4+oE{bO2A9+|72RF6E)bFyuqKJm~KpZIzmSG{! zTHV1aA%g9yr>Mo6iA)4kF|jBYk@mRgLRt>98_t5(UqFik2U|^>nw=%gVLW|jT9WE~ za5c#nbH;WHsy4CM_UaV&c^sGcvWX-#%pp#t=+f0fIR{vfXua15vakKyOUDR@DyxtC zNmN;ojGh$6Em^E?9LkZ+86r-HKi@F6TG8^XWTN5L@G&ki*oFP=F4b29MbA0wB0QS; zTV^Ciftmq03l|rZGB^MPRA^{+3^6waEUr=hjhd*tK-$oFQN7%m=>C$d%;yKAt|z1+ zR$8{KX^QD9dO~hu4!J1qTmeetPhf+Sy;gblPI>WIs7yr+Wp2V_+}df5+fj;OPW5~> z>q_kn_;P;cr5sPJQ+Q*Tc$8Hz_tN2K;YkXKnE4K|b>41cC<9rF z+aD)3k}IyW_C%Hu@RMuyfp_oQ)L;zly=d=0+qa zy9>;H*#LU5EK*NcOjqKD1n$NFj38z2r>^u$kkP_fKvk)*)yUMTI5 zhp&S`>;g>@y*K+Cv@6yg#hGSe_k4}H*HI%!$qSV%VJyN+Hd58>0(hDE?l-o=sEWdS zJ^8M07%`~;fI@YEqn;3zhOTw^o~a=oJwh#xa!7rmsC zdMK+1{BXT|)#P~h#fAj)=|yG8sj>C|b8N&JfK5~*vHzN^)?QvHM}a4ZxZqj+9V4^&3t2Fd`^Yv#>)_pbe2O#KBML;)4Cif!lz{hG&Xh44ha{BAp$Rn5Ey#Z0=UWp{h7NT6tRlv zxYaBGDA8>S2}w&{&{__MDOqtlRAiRh>i{>mqd~`evPTavzm-wKMPA#6B0;NY6`DlA zWagl?;8s-ND34Mms4HmaOKw@4B|2eaZ=Q^3jhrVr^RxuU>hrfm48Engl&pUUHFtM!`lu{>XR z)ZpLZpP;9rG^r#3Q1S(U-G-31Iw-2Z9?ugpygzg0v+TuY3(zo$0{982r<+DntzTAU zGz@w&TpW8bBSX0-3MseXCu@;d;J+#>eQAN$HK)Yl!pO$2gdp2p7;bopmRC?BYt`&k2T;?w>uE2$xqV+06 zDOYS#l`13^L|O7Lr89OHGBikClEtW33LZi}Z4BH4gD((AF1ZI$)~3*H1m|K_@;rYO zgN1H{gOE3dPK_>Okv@WwVD+Z9uP`>$7#DuUs)eNDp{Uza%F}d?GxRApq$B-0>QsTS z5yZDTUW9j@FW3QW94^v#q}5xpzel^?n{&$jr|{3IeR`>MlY{LX(uaB`rHEx?p(reazG7{p!>cv;{-EWwopGUPwkfzU#do z7{iHHR^oSZPByM&WBRQiUX_l4?Q!74vCp28t&7uTS0h#U$Z%rU53+%+8Jl)nKeoa8 z8mOY>I+2XLXt?7h>Mt4+KD_vCHmZOQG>S9PQRK2P6VLnS?aSD1idI$h!qwAPo%fW0 z5lPLR2AYl1lu=XOL`(WU3WAGtuJ6N28aYgo*2_2K2ovU_lK8TZZG+YCm9T`9g;=z= z3GsIaVnMV`vX|lIqdi0z6c+&ZMu*Wxjvn(mYRp}LdIK4nx=4nqpA3O`Gx|29ktB%@ zY~;A@LBhO;2@jU|a6!UMdj{lJf(+h3+;8N}qNE_)Ju(w9iVB&>ll{&~-bOLatJh$b zu$~jR0HjAHkAzeO7FZF2bVHQfIuLDMA&%@7(1c;22@i2I5Jye2o5|Qc7}HB%{q9r2 zG9JzcgEKIPc0kx~OAZ-TSI1I7*yjULLXDaI{w$OlQO-{{QfTX~lOazF?;IVg$x3^G z{v3Jk>b$K5;eK6G%#D%LU9{E7-X}ukcxRqSY=R=N+f&afP}*&Oi=TJ6<3>4L=;zp3 z@*ci7k+R~^cjvmz^c+hu0;o2?Er<;OD+)I&7z+`q2A2?|MZky0f(Eoj!%ek(VC|lm z-|{r;ioaUL1iSm%mECY$oy2&*8u}WqC}^?|hDiOXu`KIBsTZYOPpRBCk+cKauSZV1 z`*j(8rO0-XF9e4nBbMr;q{TtLS86OAGC>H5Ern=sXQ|A8j@ferNQ{#ZwxPW^k6WUSaf1cauW5jeiqRy&2c_hLm~$$ z5{&E7Swu!2Jk`l*4ap{d|wCOyR*Aj$IX1RnT{bNUjI8U7R$;O+u% zF5w**{w`%O;`fISNeNqKgq+g5uR~pK8si@B+2BjK$(Af~1Y&)^qS*qKoSf?X{-UKC z5JprT5CIE6*wT}e3i{2nQVT$clBCE8JUwSpHolx6Vc zt+u7Jbe+KJgz9-$+*)T6`AkcB3i}3`LSoH)Tz6uzq(csYSHx=C#eweE-#MB2XizU! zuVX#p$s$Bw{jgz3Cri{?^Os_-f4IT~Y|7|QYf1c@Ad7c zjC3VbBXd94?c-qu~`EHGr7%@N4l>e60i#8Wnw&-F&S8vQ5!MSZ=}_XNxeM50Rq!c zwXeBq!GVWi(X6Xm9&XVS^LWLJ8EO#G8hRhk9rGvvQakDUxzIOJ zIAC=dH?m`86Jekw8v_0`BwPI1*)hUkI&jv_C4Hnuo*nhWJKgRA8 z3%T8Tub>BEr*9%Z=y`*f2xc(8jT<0 zKb|a+vVHwi^Kbz1qSjQ7n*=HM&5ROQSGd}yd{bL<6r;r*{a!OS?J zLQ92A^g0)NWwHVrtHs|>CPl$t}O`|hgM+zUGMKX5Jha%ZvIN;Hz+=PmCH zmFi?y$;*T({$O-$mf+JdYjhL88Rz4{uU1_UH%Zrz3PDXjr;{Rh&q<~HofbAwHOXC; zFdW*CY6xeozt8%iKY)t!U2_3rL>(hGWEqHUp&%#c?r39UC)WjCl@&`iCM|kd1m_{O zX&_Rb%5HU9gTGi-lC1!-HIEe~iJb9;w-{xFZ~D#|31FUXJI&sl3xWr#>!-auVzdyY zv3RyV>|p;2pKla?Mxq_&qb>gTR?A~defTG<&(2g5ry;^So9ecc%8_>2 ziV;bgEEQ?<tfmw0jljS7m63>xukuUV{qag+A!Xb;ioLce&9}0V3k}R{E zT~>2PKIeV5gw6oB2ygFqapRw+BQ5Rw^q(p|1k0N9;p4MX(ThbLC)k~R&c<`z1}*~F zh>DU+`_R#4F64Z)>Q8Y(-5mXS>%Ia9#7Ie^C4T?_FoXymI<=Hg=S?mjMRwXI`BC*N%-=znumHN%)Uh9_WwH zqop;(h4=~K(_Z42qiZ6^b@*8!7Y0VJI`yQ_k}ow1cziuiMVjW^hOaN0&ZP18}ot z4r$_N}JN%6aOm{Ns0V?O-(wB2J?46aE^CC z!(MhD1586t8c2(R-zUNY7v^sEDQjH?TJR*d!Y14Cd(0HH4AxF5+~l_#e%aFu-S6Q} zK{s_Lr%F73*wHj)Ka$B|pw|M0KMwOKIHwo-?B!G>&c4>-=rVblKE6Ij5gYW)`^kWa z_DoXQV$=;xDKk$vM=vnH-%-jZlY^|weeKn-;LYcsr3zXmlO3Zl#| zHxDk)G5kxp%8lnyXYEVDk^Q&r9y({CEKO9i)bV^<*%_-b?6Q~FZm4H%M`1&k395B2GnIi&V`8*|(X*8~R6FbU0d$JKFDSB_ zX%TVQ>Xm(H44GjYAmZlNo*z|gz`2CXEEQYBgL)yG5*7QLs3;_y-rZ%-u55Pho>`~? zwA;10thMwtOsmgd$0}a#PLi%{ftre(U-T?aQ)aU2Fj2? zqZaRIRrg)icv;R(-aY~#B81~CIV_6(ofsul;HtdGN~P`?l2+W8Jx(=}lsk;VrR0C9 zE;F}ZlK#HuV2@jIVH*=ouJk@aLHtMQx**!#s{x3VK4?SgKVxfat9l{S@I+}1XKUyI zr5NJ}hR?uy%N9gL16`Ri=iZzQ6`$_F!>cQey5!@w9wAuq01F?n!daFfmQ9z$@t3St za)^&o|2~4{buU4jMPZRyE+YqLI%W`=y{aby6HqB-DT^{j76+s&bd^yihd4C)Y>NdP zM9&zzpI;)|`$hl6C(NqV(BqZQsB;P6jc+uXdF9dK709k&glY(*T6t*)!;B(E6Id1* zdSH}|6v*!M5x%(;G}0mUu))myvg~q-@YIPeQR+>1yUmab*%rqlNoH{(?wN!VmKDnWf>w=VtkD`dn4sD6HDvhM{cFwb7oadK_`I?yMvMG^t;ZxMGQ9dBBq2LlWb#@(ORwb9@oEudVI3Rd|(#ZjuMAEMriSRYJiosU(Yv1xWpVF3ROZb=F6ZTSVIrJmkjq> z@+ZPckWVRSh^eNF0$IG*Uy~yuj*Xk&EJ%nTCa^Bjl?g~vLz`H;*dkON+*810i*8R+ zI+|8;TeD}pZB_UXm;M{o?(qArG`WjiZOUWZ%+0cT%r~(mYfhjFgm?pgT zD3GO|yHXM0Rt~Q|7+GUC(z*0l%K2lBDxA_6>wAI?Y+bPUS<;9(9{wJy5hY}ubgM9% zNPM{S3!As;YG9CLZbM5FIZL1Z=m%pnJE21F`77(w_`pI1^6^cPEg6&8kyB{VI~vOR zSTnUF>Q7Yc$WyaiXQer1EBZWEiwtpqJ0On!m^e!o%2xl8#=Hh;C26_q0x^FT*4!5t zt=AIkN)+b(NRMJ60}a-mCmtefgeZcJPx^5CK3@(p!{Unp+KLaGOQT8D5gYsg^CJUFr(xP9ADtXZpqI;aHgI1?ovY#OuY1NCCJ{fUkS))MW6uEb^Z^~ z$|wuG^}L_EyZ3&L=+;yGGo>oyjo+7x-O|{PWa#xPF_LMI3LCz17jw3(_Ibr!Q3EP` zgfaqc|8@QU1K{)t=nmf#{rX>`Bv`Q6*(p?HFDEpP@*N%#a|n2g#Dkhc8D%r1Xc<0xUiywD#C?66_Q4y zn0&7guMVRT8F5}6l4%sIgd1HJ%oL>61~5iX$ji-l*)T#KjP4>!d8=m zW+#CW(;5Jlbh-)Gy#VPAGkd|s11B|?d*1IbZoMJuHz;)X7Ap8)!U_#kT1$fjYGQ*e z|30}*>4&E+f=xAYeJS{sb5>Dlv*#|DjC~mR!-_$dD;Z(45m}!XT5@J z#+NAX{O;o>P9CYbO{7GatHO`>=If-zGz5rgNnagk2r9G5Ja`;n&~y{qcc0T>#)hcE zsZC)UQs3FpLU~gIG!nZFQ;%g5*fHtTyh1o|GmFXw4tKj9h@NqaE}iPLi12@zP+*Bd z-M&+=bshoOffKo6zwVseT}x#`7R6jZC3;G5O2WFlkk1v=^2;X(%ErcU)!AHJ^K+r0 zPpA*(o)?zcd6if#1W~-Yw1KND9GxId$wZJ7at&`(wMazs;W1xs8` z)oHIk!#wvhsN=%RPuW}iL8*NT1G%=;GBq@l zX-PPl+HjWTS!Ci`5SG=eeSPd7&^MUY$go@)xwA%_+oX+1z`^XP2h0ONydVHtQo_0` zt^N;5E+zUwQMGoio`nsFZTAfYABeI#2i;+aV>{2CcL> zazpf?NG@4Lr=v9ED`~g!W$=)l3&cQ-1hZY4Pm_tI-ImQuwo(wJHM(;O`sBG-i>*HLE4h~k$v?ORuRcsH4Z0W+l+GZ^ zw8^tgikl>f@o{4@Xw~0VNG258zNgzXDt>W;y4s08F@f#gq>V@;awZ$evr>3HwEHu! z=zdC=Pf!;0z2wc8Vft)wosW$3d80Q|???~Ag;g`OEO`Yrb{uw|q>Y3a^q3s9R=OVt zy5VTA2Xy)7x~8?C&2|w4vH-*>NCn3x@?$YMI8)^|17ZnQrhQU)v@(6c&ZJHB`|iG3 zF1Znk^_ldOfie}Ahgjn?UoyKS0E^M$N0z1|3Oip6S-50BBRqlBsN>)9LQ6ybQ@gPt z?>SJ+<8Z#TGcR@I9P@I2dn#83vjHGBkM8H>UAS~uNkmh9sGvIoSYR;6(<&9rq@&*o zp{#au&{1~9BLUygz?1>$ka$eT_;;-Dqt%K9YC_(SmcoFdp~SIxjcaLBwuNKVmV^5N zB9pY!$rfTZgw2Eao}amboVruX*Q#7?))@sO_lG|7$1s|t+S^q1mUu@&*99@s;Ge2b zK5{vt?!LzAjR0gV!%k>yB#OdvZ=;>MGq*=@VYqQxG~B%mUoT%tmoQ!5Q?wTJX5{xQ9swRg`I+nV#R0qGE^Q+rg=&z!hf0J~pb2H<^~LC@-8f8+Qnje<6dT z3bv#F@uqO;so}(>X@AEn16(Ep&_=+SR^JdE+3N;z_gz)L(SjQ`uhanN#?})3yB?E zAw2t=7y;&FLl|Q(1)!B~6|oaeE1*aySJLA_NM9>j_MsW8>!85q*^#>bzf=o$xC$yO z!+ZIFt#<=Dba;?}iK09m8xkyaW-_Fqw$e+6cwY7$qXNPk1ID@V^ZKHq5q&QpY3XJ_^N;)dyhEC>UDedV8}F_% zM8{by3;W)c-!#^geSb~xB}-G0Ty3&hl^oq4Jdqz-GsdGY-odSn@(Skjt?_pPC`~TD z{6Gk^+u$3RL?hz!=hPZx@NiApc=l~XTmx6eNJSPMjZv4waZ(|%E}S)Z#q(iO4}+Q5 za?CSVDK}uiEkTRog~h4s_o_;c`YAagx3)3P0*=^@!#ySp`#lQz&dWHob$i8Pkwt0+ z1J4N@`sh1`T#=$lx@8a|BQRZpX*ZAP=;YJk-p$qEV5?FX>y6+lbbklQS4|f5{dIi) z2XGzGlxi<**0>`U$WHQ}(lZ(d8`K<6Nj5z&_FhQKNLofG`-d$I^gGN~ueeL}{WGaW z=zuGAXGuiQ803DZat@Qk*jH6k#ax)C>NOP)L z-`+coDovkA;ho--yWoDjORz3lwOKq_O4h2Rf*HBKZT<}ExUfEu?U}At0){3Knoi;% zaAZ+r0{u;3wx0|5`U*47{XJ;(#Fqk*))=wRIs zY@^~ol+sJ+c_#fxX|i%?9Xsf6ah@wFM)dDfJ9%t`cV5@^UN4XBnW5l-db~sACy}On z4tRs~D}e`>_}m{HJ@<%-9oXPl%)5$Y8L_}*Feqb@v9O$tRnC`^q@W~TN-;6jAeqz9 zUv40TRjckauqQ6HCt{7ZFyUm2Q>h6lSt)vjsWf7eAtw@T1@G0I<3D}&*AfF12D~#w zb7^nsOfqoTN*P_--S2zlGSD_QBOq)V!_YBbkry`$Kg?)Qjiu$p z>YpG;>3x^M{f^{6fYW0e@2yG!AmprXtdQxp`8`t^yt z6b2)S48Wr+QXZm1cAj-nw) zCXB&|HlwEU2fJMzyMA0I?X>W(N%=?JLK)n_ZMunYu(Gn-Mdeged9+%?fD1lJ7hYJ* zI6sED*qB%E4uRrui)y$iv46{4fVBE|;J1%p2N-5EL=H2d4r_z#?k6ci#^At-dw(so z4e08+mDdrfR30?AmD~Rd0j1=?DV*GPCvsI_)eu=5(c%Yof&dllzjJYUsY^{ha_((l zF-_F$%WC2Us~`O~8bgQ1Y*SxZk_yr1X9c;>kHwUIEI+vSx{5^xZqXFsmBvth)_RXS7O_7re7`cDzsj0nD=z<1n~!F>b8R$Pd*4 z+O#rLq8RQfNRi=OpKxf($Z8=T0Q)Y$IeFo)+pb;+_L01bo0iPh+1_5s?MpkseOZ9cVECm$R~R2Qciiy_2qe+i!(KaYP|F?D-Pk zlmXEI0@k?>vhElrfnA|35ZY3%{o--s>}&Nm*10H;0_dY#!h0@ooR$GSf)WFjyK!R^ zCl8_;fkwX#x3UL}oFj=zPV3Z}szzgTE=b=iBrL-C;))V`;JaH|ceNXzI*!V;?ppl1 z{8`+~Z{bq+ssvt+6cbPntcIcy(rQDdbdTCh7Js(3I?=6ycd^Xkbqi_BV7;1l2PaOy z95|DFsogvNlxk2RP8Y%3VoW1SIBPWgkLN_O>nbE-2Dn2(>0o_kqG^2!w;3z@ ztX*PIt_h?I4XsV>b&*L7Hz|xMoZFMd*Z4K};Rjy#&WKF4V{S*Q{sZzKNVne?%2;4D zt4CfPC~j4)$lP9!P$goN{Tj0OP23meFvV1e-W{_RI2VMyJ)%XaiaJN;Upc-{i>|Z3 zY&wQoV+8@}vu2BqNWbmM$vQ4ih(^Uf7YzMpfY4NLh0YY0N;m*3s1!s_( zXXiX5erF<+1!64%(T+yiyOgl1S4*{(e^(iSr6&LG-{=v(8GN;ULZ=sUf_67ZC5B%R z=;xxLI3vSQROq59OvO(zC+r50_#6N6z{W$`=h$@mzq*if-h3h5i>&!#$ZeRX*Z zp}uCkTd7=dcB0p)w;uxotYsAiKI~%-+ijG5)(%V}B+ z#($F#q-+3B+>HXXOTQqT%Ooi67W)-`(!-f!ABm;_04n0G)i2C$ZRS1VjP+N=>nb7z zj+6=pXh#>0+7Ah&)Sj0dFQyn7ZV4w$t6}wLZ6i;v_+38t_ECgyuW2z z)&~|oQVDH{A@_T#!lx6%RBhRzy1Cghzy-;^g?<+P7?1uh{gYou^a8gf>D!lvpEK5V z@Wo8k#6|n{4`S69_csl9(A4)r`Lx4N=tWJfKzh9S3>%8uy3_CsJVUIC1wG14to?k- z>yVT!0>ks3K25?m&ErMS$k%Lp2Yuq!?7{R7TjQ>a5_Z(r&U23=dLj>gkefLndE0Lp zD4R`kmAqj7x4j3f#4=B0%*p?G`T&^U;-hQk&oco@RvA~crf<@sItSv(d(Wb;mKG@s z$5wL-QNMciDUsUzWI?5GtQ=&Jy;O|1Jdu_*(py9MLyDVgS6}1;;3{PEzyccjr&+X( zjeT?>S?)_j0*VXEf#p%>N&<#g-Anh6;sXRN5gJB7R>yrXYI)-&M{Gl4Ou?e`Z!$;TVE@%!xLZEXLXog#^i$F3(bb?Jq9Uc8k04Yw$Jh(O{5JZ9R-Ug4EDi+h%irddP=J!LS<(CT%^S$^R{khJ zSp|qfD{Svc8w<1X1x##+`ggI6prs_^wJJ>LAYhSL_~$Mp=l_7@{ICDz{C@@8{sZ{- zcj6yFR%N`lfT<)c!^t47$ooRCqj=OG=O0E3Pq$fEq-igsO}i+P+9G>!bwH(DjNS&r zTN}JKc+g4e_W>?%6FU@XQB<=MhmvMm5FnvKWt^uDlQVr4fRe#!FY}dl-k^$ieG!aW zWHjr84v&VXxWn)RMivmJ%pLPE>Vxl5?OI11=&l~h{>4rYVw==U7h#EET3b%JjvTj=2OPKzao>yZ z-{P|&?q@?KJ!9|;8!gzBSdp=&?w(?UVg>L{ax0sGX)vkWBZxElVC zK50&lSuzZaUDKD-o2(ufD2~OIdd`=*NQZv#wXdF*oVr(3Kzlj8x3cD00LN2&b4U2F zJnyNp#27gpA8I4~AU9z}}>fXy4ba!WuN( z)sv|GkrN?!#GGokHS-mD{&24~yv+PV|FL8LRr?F}VV*6k&dVuxj3YgC(i|T9qd;i) zYxd2fMLaxJ3G6omPOrMF(}sQgQ-&O%j>A}O-|8D?=s?l%csHteA8bZ4L2_q1m4@o; z0ReX(jQs+*MhvZjycYWUPZ}8U*LO_cq0wAPm!)GCk}}$AgcfoNcqbwcvhV+!Z0bJ#rYGo7 zB$1#P95b4yS+!CqTaX$dYw=M{S4(BMWmh4~589uA@f zBJQC_uk>40@RAx|adcX%$m#C}(@So_@tDw?><2Gs4WfvGi4<`{y1fFZLzzB*W>>We z#r~UHx`oGyi;3xS+;AiLPD9)7V~SjuAgy95M3Q^{c11y4bn13MiJG+KcMpo;`v~G9 zZMBhaZ21s42`YMk#S31_4m5I)&gnj!(i+}U`Ji+&%{FWlBj7#331(tUb&tyr>JhCD zRI-GxiZ}h%rheURFQ(5NC|TapI;7ZP_70XD8U#+C-@9TK5loWAnw|nRK&%GXaP_n! zJT&Y&8~S~^W_R~CR@(s!Ay+}Kg!2` zgn-};D7F4$lbCv(qUa4(F{zA>uU6R_;HoSVsfVnn)K@?~fW8qxr!$f`19as=&YBRr zySNZycR&KA&B(vRMyb|Wx0JO7=MkVSbzu-riyl~B6a9XA_<(ATHVX)I(m>h6((0;g zyqCF31Kgsjv?Qb$NcfMKh}j~&hRRQTruG{4`n$vd9TQH~8SCrvPtO6C{gLJ%hfl3= zc~k%Z00G#c>}ReZ`Fs1FqjQLKIEE0Wovik55bx9xxT&c+Kd52lkG|w6zOdYZyiz{a z^XKG?Np)X|L#d#nubcAAcEOtQ%EmWg+Ce(;s(|3ozQ?+E2>)eLkfJ5r0BALRNmJR!hBhIwcc8h|g8Un+FZa{08wo6D>yH za}v`!Bl>Ya8U60-JoWms*}L*{iGbGi=1PQKRG7NHNZC!mk&onf3dxLpvm?%uvJF#g zV(qZy6X{aO{>JWQ{A>XQ;;(ngd&ERinOk+et#`1X4I37*%0^KL0KXFvxWED2Z_Xt} zNkinR2XtE~)#`P?dQisiHB*h?c1y1!V~Z>S$O&fh%%qGO_c|CmwmFZ&DW z-a;i}!r`y+5u)_FEb;pXkbXubytH{9$#(^2&ggMmVh;ZJ58yYaBvpusD96KNaQXFp z*y^@5Y_ienrVxN5Y!J#tx3WQGnb_wQk;U<=K*B3&6Hjpp<8LBUhOtn_c`;@~sArE2=6&q8ndMv;nK?*-f`6i8kIKyl_) zEYGX&ROLy^&tw0%<=hQqdc9e&vZs!N1{rk>-~DxN)WhypDltD?4m>mX3jPE1npzGp zbAHi4t}T5tMqOGapv~cP5CRE<#vnV|Npn^y$M`tzsM7R0n;{Udje$6n57Qd&DqhZi zI{bF?%gG(Y#>3w$nq<>vNV{@hHqrVSaW9zE}n`-z;rrMuVC#PxB+Ou7RhPm^YV z5Ie&h!n&1xd|sbZZEBf3amvj;eeL@|Jc@p6(yLk1y899C;!olD?1Iu_!%BD1GN-UJ zSIzQ;8iRWMANqh@JIW73BZ$~HWwFE}+!_|Dx*kc6Kl6kBCFQ~0LxuEog?Mx)^4o*5 z17XPZ&_WT07=6!WkMTL0<~qAstRcB(y#u;`~&#^Kbj@! z-#DiF^3|kp>goG-j~_Vnqd$9u4szVc{StNZ&)+F}E#}Crc zw1FaUg*sO5XIuLsWndT(EN!p&^YRGyw?GA#+g(4{O{4+4{IgYZ2_etD|6DOmO)0EGnlWp)z+$&r! z%K3Yl-O{va>$~7@{}+SCYP`iy?dotK_a+>4t?YwhUjDy#+z3th@+}V}(E6L}k1C~B zS6YU*P^#EspL<({U!A`s4p6>6;|@AsEwQ3bf&9k5Q_D-hMrTA6)|AAn-|JM@Y|iCo zyfdB3Ig#x)PG`>>6PY7AczOjKL~}b`E#1=(g6o0m;j0Y*hmqG?k)%~YyNE~nmG7Pb zgb(W2Kv_%*qR-v4PZzJ##7kqrAoP6vx-CtJV?|-?y~PeKOENQlQHhRNSJ`W%N=KCy zHLL50Pe7}z1)XA9)fuHPp0i2jiLfJA%HyroVJdr_-$=_ljvwtupkxi}SMi=Dh$+8y zIL~dg?iVF~`bynf&zxb?WnCHv09}yZBj7IK0DXTHg7|^zCDF!T z4^nY<^!f~~P8OP|!CA06f{;^z*97NYKK}U*GJNXd972q7;DAy#w#6^21?f`HwnR7N z8ISdgK%rz86X}}x(^{KV%Js2;(nd6wp)E}!Y^upE$xi!qibGmg>0>MLT0h_nS>DU=qLiDpKioD+$yOGi-8`=#OEOJ(-r zcnrlVUMST6?>suiSS=lSir?%$LNR7pr+`wW8%+6|2tXUv3QeAIk8}~iR8`UE30Bkk zx~L>hQWG(0hguaUMsnWEn$Q2-izb>Zka#E8?Is(cI&=^n<>9n{JlQ1vj+DN95_57= zM5C_qOnWI;!Lw;tYNk*xV__nGA-;Oqs$IK$6sv9@4i)Ubn#jU5p zTKIc%bUuP}Qv9Mf8R%L67f_*-bt8y|PY9SwZk`fzL3;!~zxY1z^T6YS0s1sjjd>XZ zQ?;Xf4gK?MrjBeCw!?8R%%OkX9r0TT*pI{WT6<~aGNwCoepw`Zs|^jJb%|f#9{Y+r z_4u-#RC%k9{&TdDy3z>^2ze_yZjKMKtyW~vT7Jnm9gVW~PqL1LxP*0Td)Y0+m^`g~ ztx>%LW)EWjrY5w|ot%rf4Kc5RWj64RvvMoCycqEqY2XwIjK8J-V}!m(-j17L5AT9# z*a<=(=mdOJniI*Mc#_Vd!-ir|11j@=va=R#Ocv6>FK<9#j01%&q(;0)N)C&zIiS?9 zZ>>RUC7i6it512I7t_H{{{McakT0?|bk$y&#BCI$DupG4Lp(M67jPe*`xD&ZC{emY z{G7o+SrO`aiDA$ckDBcqmA=Se?IH7}?FFG(^>~7sJW8_W5*dNnu8jERYbZNfS4?rv zZ46;zjtZNcPy34Lt2Emf)!p8|mX{=1IuITJEJjS_T-3mnQ$K=L#@AiPB!QvXzK=CC z7(_5WB@9Y)L#=?xAV}qNM*lVUS&AQ+OpdGjcnUb1^)usS3OE;tSe#0M+?k$S<=>%+<@SKgRp zE^E6`-r&nCj4&;p7^3@twLzZ*rD$3gi`X->Tz%=9+=lScN&JlB`YfK`CMInZr$e4i zwoJIuKqrM+4sSFq9IXv}vE$apok0J|%BMx#fJE%5nlp{wa^ixV``$0aC{#t_ zQIs*HV~9pLQ-6x5v(Mh_xlF!WhMx1Ot*w{}C=SPb0b*N;eZHAA3%Jg@|5xEShd@6u zk#W=*Cfq;b(8hq})s=I5xVf<&?8(a@m4uXOhnlDu;;v%cI$i?#FEE?Y>@v{^<Za} zVZ>57A7~0L?$;nM~F#Ali95i=IM{}Ofb4}i>lUK&kD zbtcDn(WJ7}A#2hFB(?#Z%Alyed0SqG$m;@Jg@r0&Sd?1YkuG3zth*4(dDc2vQ0n(s zd&mwoFac+o? z7XZsK^Gg3mToECJEv6WG_u#+EXB_loAXO5H`#mlGEFB` zmDtK_Y&CROhK9UZ%wO|kbC)1dfSHY=YK#B`>g?|ccQ7==IRd3|uWcM=?W`C)IkW@% z(4P9FRORDJq|i{%513F=*QV$csQ~$8=j~569bz=+>Ldi@4;nWScoKGcME5la5sqGZ zP72D|KL8mO0!*|5a(%5d%g-=wdNVrE91a|FRu`^bJCmhr<+E|E*H)d>^$)=FaE@pl zGd|kPJNCEVlbO|RT-Y3xW_jD@5`wQk-L{c%+4lks^@-0(=JL1NeTgR28f~)1B+AgX zpku2eHwm<&P@!wfC?1O!=$M^*L)s9>eOoKndWwG3!y}Yd@b?WS9b6AtL*IlTJ^49? z4}_7ALzw)PS58$1{v9nS;kety)SGF>!SB*C^%_Mo!?U`pI+}Q->4G0gtJLehYP@-; zi9%ro+b*s23p>+QB%t#_00jXtH;$@-dyOLAJ79f$a!~3BP%0r4nIL`j*SMZ0_nL1u zg~~qX0q>oLuofMuj)J3h1IGuMOC(ZN7Okzilx#fpWvZvVkp=6NNsRWy%X&(vcbK^a z({%iy0JD#~(^1M>r}a-D1g;DyWrbm4Cz+42+u`UIG4tzdO;nV13$^X7y7}8uB0rUwAeg%~6NP)+QBBI68e zmcHTjYo-bS7G4UI$M8CkygK5G;SW;fuO_wrMWwjtLc|7y?6)EP0w4BBD*Mro=)l-6 z!m>#ieg(ly57c*F;JOqz(C9-%*GmW9n+)01G?lYUWHP7myiV zjO7Vos)mcc(ejHW_#>d`ctKbOLl;Sssc~#hl=ne!Avp2uz^BUI*+lLNB=Z8v0n$o@ z7B0ot?QMep%brCCDuRj3b7&`Q>?oH~jy#?r)|p^_AenYHdBA=y`hA-nCY|s!!EOR1 z4?5egCbEejs0;^i8Ua2~B#@iXqnqsHHzZ}%KY))46fak^KuF)Bki3wF|mjR&7Bk@@^sUz8d`9*MB(4w^3y;Rw?Xq71!-( zzq;QJ&-N_&D9FCBUW}qrrS9W*ztIwvDv>i=K<)jX^lZOG>^SSDdC`?SP)Xb1vI|Qe z2PmDWVxb=w@|IyGT#+4D9#P3CHF-aSQxlf{SqxK9(5{v?+zmAkhbNyu${|rT+Kyl9 zZR_o&VCG#gRHLP4NZ_{PU`lEVb8k!}UE4O`XzK^6ZJs>E-9AG`yMKSY^ zkR;lin>Sdxwt|5Cwc36gihMc+dYbv^(i=S0T#X|P>fjo%3^gnVf15h&FAHhO3k5aD zkVcv|w&-gyf&R}P)Z59D$rY~(0I_(U7q7QtB40W&hM0Pret3t~kbpE(ak1`dHfv=^e=1ZZ9H6}Q`=d+P2p;t= zQFmg}^4FJnxt0%%&G~ha^yxIk13$DvO74ll;>-sy)SXvA-=X{;#42^0dXiSO^uc^X zq}B8>kynhlX3h*lnyj2G(#d~sK>_D~rqy4wRM&EWN3Mf%qkbtzGei%LF%)H}W9VeI zTR5X+%PqY&zP=$<7#O3gx^Jz^;kUI&QV>dkG4h+4O-#L z!}YQ*KiKXNcPfxe7X>gNwU*mJfe68i!;_flmzD@GOXOa=BtUkw=OPfRvqOvZV%FD) z3R5Hm9KNK@&Ej$+lMaKXo9BKR{aRfBW~1NJ>d_4JI?l3yMwM8 z(l@OGjXA9lJE1Dm)tb#gRUw09iYLbB=CeGiCwHXEA62kD`VZjM9KS8_J&Q1WqVA{m zCy7~m?$!p}9{@TvN2(M|8EW+TQJuGqY!INm=m(Y1Mu%wH<(WD&-NGiyei}w4zlXm4 zr;VV=KQC=~J-6T>Bcen$`5{NuPz?9{b_ACxq+M`9{WMCK>~u%h&zRq*z!d3c+5C6q zfH~j-bG;c&pw`8LCWg2|9fkJ<8fMz=+8slC{U{49>`EJ`{W-W#y@LB6opeUq)?;n> zEiq=YFiC966P!5gi$>)wJ-pV0P7dZmvzDHS)?+ONUJzj`+xwt*LTHyTb2kH>8zwMT zLtW`=`S9lxs_7OdCN}gMaq0j=dR&FcXFZ1x9|9m^-)QigLh59yVd!2c1!v(7 zR5MN{V8%#1bfzfV0IP|#@@#Itgs~$yXI+#uAa`#q4o1d&{mm(8Ueq!x0S5p4jGe`a zt@WynV?^D-V?IEZmt1DQu8GUE?nl{tfJBPWGND%jfVgUaq`vWkDeMD^L746sY=|;y zJ~{3Qh>!Qlm64~2St?pbVd_jK@M+y^K?0j-EFzcRY9D9PvIZX!sY1Z#Yla;?KGV%^fxED86wO_Py~HT4ZrHy~dv z{iA%T*GcuqV^@uPP;=r-MN;uRZtp*U07-BMG4uq3C}d#=KXh<#xJrXO{LK66_8-9U zlXs-5>;nPCs+AAnA{~{5J*nPLUZ44jW1ry1eDPy0lcXmnOVsvQ+$kJUu}^sDAMx1j z2o@B0FPQKsS&RfHLdw)!aca^1(kFkpHokwkq9M&h|A(-DqJp(jp86sk@`_&VT zgjaUBP}}7Dxf4};z5)|CzDk|0?k-RaiXd{w;wrpA7oqZ+Bj@-kp13f W*LCvrt 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%0A#pgNp<50xlqo_#g_w`(HVLM3 zGwYiFUYEKQrc}&u$X3mw;U=^P|JhP`kvt&jl^o~_gPM+zp1Ll$&{EJt*$GNRmU5|v zx3QIkL9x?bpQ)mG>!4=AKT(!&Y_;BF#}+(nG?W5&qn*NR(;31|IaY+<3gs8ItKX7P z*Sz-|=VOgx`<_r6aI$;oC;0}joOS)j5mEpEdDW=C3QPouWRvpjd0W=yd57!SH)+s2UckRU{24{aFZi9C|e#C`LR>yb^$-PUF@ZLQ9Wzw z!Z>|qZifaaN6r1sJ zEu8b6ze!2|-u`-FF$2$)0V|~VoFmD}OuC8_mPLZlZwaq0niwLZ)(0WDn7C%f6dA|! zZ+daXgi8By)2dH7$}H(GxQXAy!zlT4wvBi)g+{5>gHOv4X* zTh{psn%m`AI-};59wG9dCRWzvVdAxgSXv1H_Q~tS3fH&wQCv*irvk(11Dp&h+<{qR z+T1#7Mv?5bv6F$0)|-Hl%b z2uI39ysx-`iikU!5+9w%2l-^#&TNxfJ;amo)pyB}J5CSP^VF~#jTL`H=yF4IA0y&u zk3S(Uwh*0149jMD6;CLi_ZoiE)qR%GNPfj0oILs3mq8?7w@4=Re3w@IP1(#xL~`2V z?kaaQf1!SiN@^>P$F->{R&p(GTTZbMWIxc=xv-kE1AVmgZY_e_?%5}%#^|4hygtiB zjDlNv)t$kQVE{ONF^d5Sh36r=P8$Yq{mTE}sG4Mo7y%=ZH?9ZINIh$K#IINX99l=`+sqhUK6M3_uig(e0?aIvc4&^c+ zN*FiAHEc6Ae7FkFps0RRpY+Dcj+_EfQ@lY8)QUgz*jhM=yD}!4Bo&w0R{ThP{vfSf2e-OY=doJPKmXib)?yTIU1}q-n5)GN<8gR0g>QV$b65)=lJ=In) zZsQiOr*D`MjGU;#EadMbDBKwD3^ z`;CygdA$*s)C}Yd12PkD@TfE>*t}H!>71^EXKr@ivsAD?;6Q{u8LC$c_>qJ()B#N~ z=hj69Ac3<_N$deL7w%6cl>$aSICI?EU+)?S3K8M2$Cc={%5!{?c(57UlTebB~DdE_@9Qn<~H{>X+6iR|KbAk(Z>Sd4Xv@eA^tWJhhjN?vvuGp4!f_TdvMUrpw zN;h0xGwVj?$s|wQt%!PcXVS&EE1GMcS7JwUlWI*B^-(P@R zkYa#9A839o7Qf1Z;AbGV-p7~j7yl@cq<<7lD=}T3_g*i>Lz&^&tWck3ks$N&9gF$zzw9&CzexJ*PVDx9ozKIp6plNMnmN z2np3BJpPiWXBnl)PDdnfch<>`EEdsag{R~NdrB24E|QP&^}lDYAB^8BNk_FoOHhBu2n+ zm<90YlIf&qpnB^-g<1nrpG=Q~>G1uS3lci`!=t|8l8e9?s#+}W>$`cL{) zhXiE8gvd?Iv0uno7(h`xY0!oz{jGAx^)g9$PYXMjgXaAGQRkCq>vkD2##o2D9c5K7 za44w-+M<|`beIhgMqC=?#Qll5Y|wB;e#ghu2vMHJwUstcbER4MqY>=03Tzld_A>NL1Jm9UJtLAz$7Q9=HjHLJis z1GfEV>38~1qv5CFM0Rw~9ac7y>+z{mAWfW^Rz)(3aHBfFgC~A+hEq#_0e$!;Ex|vV8#|DF%dJ>b}~7VaWXWZT%F6~2etzs4um8OZvX&R00b}%1P~W}#cWsP z(#G5zcs$kp8#`E$P_&Xkw?ZWL0TvJ_z-Kgp`naoF84=*2WL?S>#huJ zfBmh2f*=k?*MqCpS;YHJhbh;)&{It99I_tv-dUT-NNg78_lEZC9<0`+u@>~R6uM`r zTd+Oc8S!6I5<`_VW3P{<$0g~%>zwf4Zg$V`9sqb8zot3}J$d|jH9!J92{EpDL4goe z<5wyjE3lJzYqPZV}Y>TaZpz2e0c{v%PNaiZYYGJM*S#{M_@Ilv{Je}Q zQL5C2v)n-PTCtu#t?#kWVl!N7!csu?Jl@W3d1oBzfr+f*$hmgA2DJ%$5m5C9(`%Yh zZyu|3(ODNo92jp$I4|DlwDXbtx+=p4x#k?QN_Ly4{RD|M!5R6akHw94kFCkEui*UU zhp_aOUU&%36N91T(RK8q{?`ysD+#%vk4&SvJPvj&jv5?;v2JBK)#q}{{mg}#X)XFV zXD>qhe&4Q7H}Yl?s!gZPwM`sD_F6LHsaHE@_p}IA=f{vXGcT`XtXz;{U9)FHqdh^^ zVcnlZ4j)#J$|A3ePeNZRw2>ROOt(d?(2;IS(T7&|Y?>Ni1D#ANDN^YBcOAQZLQi78 znD0A2J`O$Ph`SBR%!%$)-66!wm3r7$30py;nr8)mM-<_eiU5Z)2 zmSot%>hanWbhSweExp|c?=0`L6%m2WLL`AWxv;kh`A!Jl8cCps!My9Vp!7ER*BgYm z`}+vj9aFniDrD&EHAyukv0AFuGh@BY=Z#%})R8W#f(IhP(e92S6)0)2eK<47fK`a6 zS=enPOZj6v3+->}95y#u03{xpUFIXbXb%3hogMVpFaBvFpNCwVz8P0+oIfp|0#(-g zmMt|3mH7cEFAbd_h;z1|&GMO@b%~!`W0F1%k%uX<4+*(SJgbT>t2D_dL~ELWQN(G} z?DaiSvb%ryBAyl(ZKY2+#1MPdgjVfGH9NBzpH7?af@QpBo<$kOMZF;-0k+|=(@x=q z`M{!wks7nUh2;z!06_e66a$C3rAcw0ps+1+;K~p(6o3jP7i+r|_{SFt&rV_(l5tFA z5L;{&cxWR8pu=nwy!vh*A-*PeoxDyiSSuU;lSBCLO3sn-tZXE+T&zJ?II1o{*i(R> ze%`UsB*^c9bp`I+q-*fEq{TGm?%J;>g97E5{_kox?};$5mfg8BMb~P_--eI8X$wb_ z!0XUm$J7#(dNZN%rLMswd0cWt1Oz_}g1qBMSTrs#>;LMeZ49u?KY&Fger zQlE=O+D3}Ye_S7IztT`bMIe1YQ>i?%R4W5C(s4!)ugfOo#xL1VMmrC4ZC;OwHg;(h zq11LxzdDfMJ@O=_1$-B~bNT$n^r6DC{-WfESNe<%0rWY(j$HNeHUfkxpNSQCeH8kc zeEgHuOl#D??mWp7j|s{WmQmaDo_PE9k;o%r5*;CBvx6ST!@=%nq5rFwN=c!B}+DEIo);Qf}m`S$PWRxMM9 zM5i&hC8etqjtf)_kQ0Sc9ik==$}v36XVa*B@HC&`4p@-$VVnJg@877PWw zj1OrYjbHm&#LP$6B&0Ai5o|pe;tG^UX?}Dk&}`aX5{FJnC~Audt(@zq49dto(Wm1P zZTABWJY9WEan~VZNVD^_u7)ow|1>DN&I3$2puY=-`t2G;{iL#Z=PfNT;-x4 zB!C{GSDt?XE97tIk_?NAE(a?4U7{Uw!q8W(R2MoNTFA7QnX5chr;Zh?a9YG^@10#Ud<)^{AKrEy23Z~A5CdT1UL=gm+>7QKfBM_w)i#4qTzmLIo<5ZU}` zd}=6eAA+^bx}ni-kR_H$HI*TU82&uG^6Yy$c8Ge31dr9!ywLsI_Ws_36Fr*@G`mZ% z-7QQ8E&(Y9GV@`vO7(f+B!3;@1)5pV|NO>Lmf@I(MrYac;Hj0gQ!=z+#Kss`DTqTS z4wpy}Z8*W9p~e*y$6Li9+LC{L1B%A;A=Tk$riSZ=^w686n!g7M+}LA6)O|q}Q6AoM z%@_G5X3~9)I$WcSWXq@1Pb8f{Q((Z)8R2Jb=_6I2=wbs7escz1Rj{QRX455T)7nJ4{*+JU1DsS-cEl`_i-bE4g8^a5?PetFL$ zv&NTX3iXHO3*XN8cNq|n8+DH~IN64^Tr!Cy(Zdl2-e6(xIcPZ&)hSrjK~wWaW9BT! z+eh?~qsp>a6gV+*=+cC01xqhI_l(XgeC20pqsC5zr&ir@tzq=fqwlJjw&uxe#?SnB z=HfpH4J@MwliZ}-&IvcT2n=D&xW!m^PF&r38w@hK!w#Kq^1CQoqgGwl-u`??I+ibN zv=i2UPxTj2d49DdPU=#*6*h$^%SjxgC~<+uZ@OqKbV?m>?%%DkWH*Qo+>71ZPK#rMDD98?5n zL$oCUJ73lnjgDFUaLuUSEmM2Y<>Q#`nwpv(dVXOl9vHYswT$J|zC-olnp?D;B#+9i zv8x#FO3Mu!(a_>?nOuIX8>{hZ6sj(1!~L{ver~~mZ>+dgB(09O(*#e&6|=y+yD7z~iS43yH9Aaxpn` zxJfQWuoCqy_n)(mwJN!kAWINIVYA(t(y85a8Tdl#Lb+3;^C3 zZ3C2E_eH8~ZeB9!{)1z>f0KGVMzk0MULPip+>*eJk9M$kSklT@btZ`U5wxVdG}~a3 zmp?TL7K_Ithj1Ry$DwmKH8d$#L31OrotHe#*q$%uX+^}%_O!sCT9OUj#L7vp^GjJ3 z(scXonoR@Un#h??eh@3TNGmH4y?^4_>{+nNF9e44g83ont&~PMSR0M#79`#m)h?k}wP>$id~T$ijH!L* zO~9fg4aABaKDcLxiO#?7q~5Cwrr!FNqJNCbSamsOZ{VnH{#lTYQB{uRsVik>gEEwv zq>HJ9^|>{hL^}v1HmWW*r-A<~N;JBy59R zSVp53PgZ*IajU9lV(T_5=E zv6?jUHCwp0wr`{MMboUiEJ%gvf#PE0dei6dYQzLQOJ379Zud;K_TvRR$!t)>o;Ry#)7^oSGR?k9)o`?m;sH!_yvq@98!9PLa$`lg9adNN2FyZuoNJc9w?W z@*&FqZD7?H2$EElch z^+X{W5I5Swq^ZiC3)|p|2_DtGoCUThDTpH7O$=7>a8@Rzx5@O14+F}sUhHW!hqvhH z2Wo4VRVgx8fid3@1>Yz?(R#c$F$+-0?zP^|%(Q2b?9bnI29MGJF#}{NuLzjc!u!lV zPOnQ8oz)z(%Tr%^pzt;n%bFCf>OU}}5F1e@zq(c1NY_)1ZY>vVS^AM+Y=7nB(|4F5 zGm*H`L8`?!*g1HWP%7M2Nc8w)=Nm;0az)Y&GWC|cmd~fyxcHsEF1v6euN?`2=gdRc zQ3w894qh}#Xh&n%Pa@e?X|MF3TR1?<>Fp1}Q+qP!KDYPuw&GoonQzh^JHC6xSc>Hp z%hNeA_tsblT8L_F!D68B@yCAgH^!xO=wU4FvaSlju0i*s3j! z-=2w)4a_e@hX3NM)^1M-!KE6rCoBylntyHBlIj=pltW=Cf~ORd6<`I50GV^!=KuK< zHpQ7uUKUkLXKjCsi}y{b`q@|DAeCB#`fglg8SVmACw~AD(f}bN@@MnbQ(^{{qyQit z9^c(|j(=yyUhF+~yTrd=c>Q4`yi zALantSr8g_5qW6D{TDDPf}xD6CDDpJ?IKq8zVuzSy>}5FFd$Q2rDcmMDUNpOoR95} zFS`~B)b1l=!2Yx~q^%`e*#;}Q=r> zoE=&vL>gvXQmYl-_Q)u%1gVfKzIC(*b2Ns-(!ridh?V(A*uH>8XlV;#o`MnT!gH}w zF`oLPRxi$-MadYvoyig}#tVoA|ItWbWwmb5ja!Q6XB9?K{J4TR)#|m>bPVh9e0El#9e?r1Gd6~7N`81;0QW0s|01I~evKo8JcKntMnx+F; zPT>epoS;zSsgu{~=v_ySV8dDABxC^INTPP_e^5oh@MOs1 z*TGuW7sPpYmwgJVV#@~{bFs$6fy}C=kX8{Q<4DK^JAl7_dXZi|Fk0P|xktW6YSKIh`9;l}yDh-oYJpXZ8s|H5Z^v1p(jfk{R{l@6K{lN>XQiKVq_i|^?@4{J&!cFBkRm|hdv^iV zQXLq3xmG(sv6!>tT4aASHY_Hyi%R|IYQ_8K=>ccaDAWj`1TWEmeEsa*vN`ZM4LsHk zml%$zX>vRTmod>0#C6(*jFs~%yjA*X$+iF`*x&~eZ^z|wg4fO48#$u*X&dL zOWe3EJ)?Db@W?o&S!9;zOKl$=ERh}BYeUv38h@0IuV@U&nIC{MASBB>FZiHuSO@Fo zP~v~`l|6~4IO<&(bFDiik+^VesmaEpm*Xc~Gf*q5rMt)a5mA0Zi=uHv?+me}flS3e zgay|k6u`O&K-Ja@(q_kc`_LTjr*lGYG*dyO zLX~Y?;AvWv3Qh*5wfYsVY3x`Ek)(uX*8yB+zztjI1519VB z5B_%nBpbad!>1XhZv5owVNK6)@``$)f*P?mX9$u>!PXh7*`(wLFz z?*g@E^H2drv`=u2AGNR;!@>vh;{hvlW!&7vXzwr-1+w4Tq~fWV%R zcCb$+570hVbE1*S0fH2clk2IIQs!Qc`h(~6RNqA;hEQ0s``z2Q#P_X8cIz=+;yIzp z>CkM?M>x}j3SwcFxnvwqWB|ys*Pp%S>G4B=557=eg@56}H2=t=7cKE0f3)kCQkTq1 ziSjsA< zS{vx!vBXudEG~RIE@D?9_V#|dz^0#%3my1<%VhnR|0k@@Yo0CY|DAO_x^cSN=oAAyQ|`(Mhmc^KvBt0(;L_ zL{S4*t)PIawZ}jb#UtKHl0Hp%3qVmiB|X+9jW6b)X_5fX8-8(Q0E4) z5JMC~$sB@4#)^TnkO7@_1PLCdJ&pB{8BbeR zcA@D=GmM-?5#%75XdVhWq$$gQ$U({JyQwb*cQe5zOgP8Xk%7{V0Nj%oZ?O(+-WiCJ z`{Rxl-+OZGFZf#fN1Xqb>8yo!img=eDRt4m7fNH-o3CX4GaDi<12yCBXtJo7vq7gxeZVI6C{HFgULjWQ zCM_At?6V@2Vr-I=b`<&Dtjm()v`7LrBgpGbKsDHQBFPpbC8Td&uzV=(!tl^MH;TN( z$u_*XlN39dEn>W<2=i$umkIuaC=+U<$tH<%2n1+9cSvi?y4To`NsY5C|u;*%fEoHtN-7^4yJt~ z+cTWT8L$M2AzLmEAlt^EJ=UgOO5k9ccg=$MQkfvxm<@Zop75CwK{Vq6r09!r-rLf| zq}259xSMUm>}Y@Z4VV3o*^ufi9V-=f$=xA~iVHtLyO-a`D{H?m)_xPzTq5D5#YFc) zUjpJ=6kf=A*N_`~YN`pd$#n0ge{|1@uT)fpSD9t@s(O*{i(i5^0RlUMc>tv}5h&)H zl8A3pes+NOvb3{kMV3b@zB0Y*T2YMC{IhFrUXS~Z!4JT4H*oB(sWclnCS3I(Zpfkz zIQA1BTp{FXm+Y2k_r6 zI7IDBUXVG{*&D(Vz1T#$W>%aea1)uqoflmJ1D8gQ5;2`O_0dHhfkJb8YheDce#DC` zKoUsiP#6|xehEvDjqyhht2;=|>D&KCpU61j`4I`a(=8Llpd$dZ%iUk&0;o))043RZ zR!|{o#a=nc*Y}S55Es?OWi9K0qir0-AuJ}}@`o8jkwQd|Y;>v+iG$;I4oSb-rdC3c zY0w(PaEBPjR27YT#W}<}lJhrg)2UXMwHca;8f8hN9>~4&I`wmO?e~L9_<3=VskzEs zDDTriB=jV}&QTce!qko*hQntL`M5)vevz^Jz@W%rr4X*a;}q!7Lytsd(`nNLjzbw7 zN*rH?i;iZo3=Sbm!!|nRuV21?f=f>1+Wi;sJel#a@q60MyLL=ac0e}Qs{y(S668tz zu!WiYS36w(gbM*ij28)O66-ODo)-V~_Ej&PRJ;B^N6={t~BMaM->^^oL?PGD(9`Bs#<@^J;Zry#L5J0;po>vXU&{bLXBzpLs*ng zHeG_<6b++Q+&jN?&9rMaK0ihX3j~TU=v7a)SJ10JuQ4LzdnsA;avv(#&x4lH2MA(V z!jJ4oY2zaGmX~5!r$0dCws9^rI;?>t5lW<7FEm?1I`;GF_Xd`b`;CPBNsMfQ*I$QDv=M5>OM6+Ih!zyKvc5SVABccGUdLP-8SW6we2b8P!wmyi^JO{m{?Qo*Bt zobDGtv%25P$N6Y#m5~-v9@Esr*#Y>G!2?%`CDr5rCLhKzzbUivAANlz=K~o2+V&;Q zKT$$TaXbC%)ISOTz9;LCRoQvwUVUjlGe8#4K6j}kwZrHTF|s|x}@&3`ag*Bb*XP7 z*TL;1XzDM3+08XiB9 zAF@yK8#=qZU(^SXw|gg;#Sp&;{-i@`YqDr@C!k>?SInj zZ{)pBl}=4bj!Iv=wL(VmIcX(V=_9`{1>F&SbiPn&TWlUK6$nnG^fKDc03V(_?X_Ti z^cqycE{}Ko?y^(*F56jyU1VE5Cdgr^4D_?vwLkC2Nk)%uaB=6I^Ni^2be$-! z@Tea5%X?n20k}zu`N^Wp^gIY5s1@$a8=8Rox#97KgYK|s$p=$PLu;+HrO|_i* zc0vH0JQJKp+?Dd;@R%=O-|*vDh0I;f@{QDw;SywM>)w8fgeH-^8m&gV`HIuHmV}}% zJECfxH<(A!{Q}DE^RPre#@@)&F?|M2bGw4glydg(@oB?8)5eo*#`N&TbScD>9=3w zx|GZhnHOO=lO95%Ga18eI&F=OKo-R z)5{*u7hoF`Cw)Bcx+P*nZe`9^F{{MYFg7X2chzt27M&w9=h)2YRo6GhC{XuR|XvB9h*abDr6qa)l}yoh%G}XLkF5P z$wu$txeIBa*whgWq5bLECTi*TGE9>ec_D{Yk<5O@TO)&~Z{d5<0{-mkrLAS!0Bv>^!QAVi3i`HKuuJ9 zjHM7Ho0`9}ENC1*BvZ9k54$ipE;D||p^AjFV zoztydNQL3b^oMy5Kmc#DJ%<>5{ps(BnSV^m=Fn;y)|UQ|>6H5eG%SNf&i%+PRB1Dcl~d);3b9bR&NO~@81&A^4y%kTX+;XO z$u6OW6W1UkHBG6cMq5D?up-FOMRP|GTZl!}(W8z(1wLQ#jRRBx;uIp%XHl|i7Y@HH zbro)?zTk-ltSv_t^`yw$lQ(L2)6dkBOTV(7kBPt&9%MQUMC>t9)Ki6S1E`Vww`Ej0j6Znq;%!wWLDxx{vBz7QDo9C=*wgN! zjAc>?IE;7ufyS&(5PJISJJ@7TJw=_w5A#`6FT&d}%G`;1Cw_%SG?w>$J%#{kQ4eNI zROV|4Dfw50@BsnaG_ zo_v-=9TO_QIl&Rl53+?E$#q9*f9ssO2CWaT6f?eJ*_h+g>*!0@OKC))FU99n)2V;# zaAUOH9vDZzq+3DN>rX#A7i?T$DvW>1d>@t z59CxH8O z9q}gOEATA&G*RH|IEpZGUl7sRGDlrB={zH;fR<*8BBy6Oo|K;?f9#r zkwjePGMw4pg<~!DLo`gpq;2Qp=1F8Xf_@Qtkc1|96rT{zG&Ei#clyEU(Vw{(=VC)j zJO6{rO0Uyv(7cug&hGbv3NcLq;j$F;e{(FwBlnOsEI7WAnuiUxf5y?~HzO-526U|} zu}FC|3phw)mq%cVdv~vBH~(V5Xo}57oHl12QQ=4rWk`bSQBI-zDdog}6@`jv*^L5> z=X9PG@r~;`^%H%qwR_I?WT35F47q>Empx zIT--uGZICFJA_Z}EXDOB*aO?8=x7DBH^|%91M&FYB0(NF%xPJW3ZhG{< zn$tUvyICnzjHeCQgpfwNTxtY6B-D4$rEE!!Oy@cO{t|CRacl{X8v{`SK9FJppu@3X z)^{VwGK`dwS?|pn`|a7jrXC+O5V{n}DNQ@vdTI3sFOxbdb>N-zJz=U~w9+H#<@ZIf zC^3l#dsMpLqLP{uQII!d$!CQ3|1>-ZR1T_&GB;VW<51ph3E|@knO8ia)$&H`Jhw-pK!^eWdW<8V8Su&J z+hp}vp=iG|a`tgdGeNgNt)3EFfP@jNqJwhM^m)COAAf3|ORyF>(<( z!;m2@?Rh^utmwhi1(Z)}BFy(``$@`-lyaW8Xs1PeRD&6sclpC=0e@5;RI^?PF4bQ4 zdP?qewW5F^NCW?XdSoc_fJ^Jilt``%s=GPR(AYfl3)*eNV_25k11{)G=DCP`mvAq=6RdH#DW%WyU)j z5y)#y;DlX@RfPLk&A2&zRsqWD-s?Yrf<8JXCa4oQG7o&0K%#1b;>8$1_?vL8-AqXC zkfvUzi3+snlyV5K5+{i7Y)CH)aU`3@W;c0-5tH}EK*UuTxz|YoC(-L6h6YP0hfucK zmp<$KdZ3B_eYFJD9!0UXS&D4T^*&It8r$qi@oFFx70gR~)vS=XFv{?f7a5d;bZ zT4G#oKdA9ApVsS5q@+S-!x(1fy~qJ}okJATF9Cm;X>4}$t(D8Dw`eY@Nh zA*K;$PZNuYjsxw3t3BShZ#X|Z=YD9wlBS&`9P*d^k z?ZRapOp9iM%^>DSr7~|#j^94=$7b)KPhORn4ikzY!O!QxzgNOgOjyucuVVOx=Y}Os zp`dO@64R<{xASb8XbLT#r=^o*4YTFzGl=FY+$x^0au@1+jE7N;2fraj@}SF0{ks<| z8sVpa3Adv#1ikL(Ua2;9nnn>e{TLLqgqV1k^mk7->i?@^jm}p>%aGYJToiZY(w;1n zX|nSIB_fKoSZFjIGp54d2svhOPz^9_wtE@QDP4uiBfSfWhLfipvRhhA=Uoeb-ei_G zCno#`RFclWh{e<(=_+a(BntQ?yb&R)NX}eK>Qn-lZhN<~So@r>w}e$EB~!eG4vO3= zS}8oNc>ga7s1BvA3A>fw;Q?mpRipWTZ@Xn~Td!ugcO1gbHgop$gh?H|wqT%Ys6ZrqnDL&&omxvQ1l6^;)^OUr;9FUPnVd zi$knwi#7_yU;W@jD(|qZ(pcUVYr9V3+p#x-iXtxmMV#c&2MelitXMqt4UJRiw}A8y zs!Q4mEJT4k3T(mnc8F#dt${tL2U9I?p-Bp{mmCX=x$uE%`WQxhK6vo&C&@1b%O}uR z#<)u`K*@7oG-S_oduPaQh=wbvlR+4>%)f4II!9F6I5q0o&=Eh{NOs2}lnI``>4aB> zBsg3(T8m@aPZHJwjQ%b)9`|u*Eaq^$Y76?sk!1_(G4c-%j*N zs_bAj0!Dlojw?2hG+fZOA``;~+A(NYT2M{54_5+r*?(1-UR^k=3k`DT**rSJCQtek zicJG3F~Sr8{l!K<8dfIEXbP~b7B#2EbeHvRPpGeG5oOwkffFb zkQ3Ov=O^6=e)XWYbDJT3w2!BC+C7+hxz$x{}|r>w$MREV#7R~F}YUM>UDV&+J#vw!7R12X<&7e39u zosuCj33QRYkqB6=m{ZxYH|0vQ!hhKMfz(JzXn!1J_BTP~X_Fc3n;XhtqCn zYo;*4`0Sp6!KE5YlI8R1ip$(BZ$El~CR?_(i9Pllc0QKm!*;YZ9D|JE`^rQsOL;V-wmg?GZ+eKbJMPJinyn0D>ZoYBC*L)&2gjx%!hyq#cn`c zk-bGr!RAJ+pc*-)-X15L;-U87q23^Gv26Bk7!Z?yM$XR_UaucaivPlQSNcQ9$ zULgqj_|}s&99v$x2zy>ZjzX;C4cazOy;$BA&O-Hbqu@0q z4iBal{ikRXBUK$w|HaGc`xj+ws~}_$RUH5LMOH^sZr#ivTcSY`c1VroM_mse4*DJL zo30Sxlg+PugGZ65xHX#9(jzDGK zx|A9tEW#`pcBU%YxbL%gG7AESx7~f8&m?~`4_y*+)Nv znwp2~AIYF9X{=SeH^Ys9dMC~?Z>|%7q9RzwvOwjax!O9oaxP}{vO*jay*LIN6_%rU z?Z4rG*cL(o{}9Qoqw=HEJ5Mwkr2=C@b{IeB!(Pm5<&eEKZNZ61bR&z?^~boYU{YFJ z21PYCLJuI|EmI5dxAW$wfcL~LTpws~cFDX^$_oY8?cU3&24}%*H{rfrrI%5ZZsm|X zQa>Hc>c$n&`iRK82dlT-itn{tVeeIT#FOq{hwi@{d@YL!d3WrmbMi{0NhBy>rDlLd z8!ec|Bi@=EC94_~{Ka8k|B5D`sOjDA5>W*mR|XlQx&;7odUV3hN9^UkC5F#`Td0h-__l z#Tv<`Vo<&ZBf6EW2NoJj#xa!I$rJ~PnUtf!h{li4FegHj<4v&3K^^_(eY4NOI{dy1 z21~ejuL%N%?5j`hzmMN6BJ>w3Xx_&v)az7Ee^BE4Ed{0BfCUB4CX zS?)XdTgwS3HNo0h?!&nH^WqyqztRycM56KNgkVV#SwR=(b@dh zA-xr}pFTiqMFK)u%sj{Lhtc@XUMIp3y}*bcDrNF==D#V2A}zw87>;0X0>OaH4OvoR zBVpVCzB zg;_ho+h7*Ie+^X`uu)~xrI7~bU}rswR8v7QWW30;q%o_ZBK5)3W(DW${y?U2YGJ-i z113bOi}IwAqR;yv5EWdo=zzj9Nbl!wR>KzjY))}Gx)0?N;pRD$PcX8{O#+PbT~)dpRv6K&@Rrjqj?r#oH=2iSUSn(qH13I zvk6#r)JI_{XNi6XipCCNwEjy}d;}F8OlRAMzfO=L_A7HpI@tc^7ok1jo^!8FUDs%F zYW-zNNx#|v`NvLCW?1_9DdkjE8i1l=&JWbK#qr^2I3^8LhbQg`)31YxTlc3Gh&;gr zxIs-*l_K*eU}9?mEfr1WPANG%$=21yS|V3-o{&afm5ReeUHN&KHvloN4cliHb4)gn zw&5e)w184%eM!og5v%bUOrR-VMVn{P^KAa8uO*7O zNUsGtR@mBdmK_)yj3*xe3mY4Jem$cR(T;=P)>(KvEKUQ^#D&5mFn>;sTO_p#rO!ax zq+8;*hQAw-rYbFj2bG5O+fKdnER%@b(nqu>s@YKo7Dpa~+$dBY<14>wDXg?pHzYEJ zl%#;2W&0GhSKZ!zHw!V{Du>|+jQ3;N8_<(IHUwL(f*@T8ZSzpaI1VOxY5Ap4?qQo9JdIj<@k)5 z4k)KR_{V>BXCruY-rhy0Z`5TIZBR9*=f#B_7i|%qxaoy6`v@U=?pvYW&^7!#8KpIP zc1BXNc!;ff4Fv5hYL-iSVV`)J=tno@Gx|K~}L(6Wd&7uCJsdbB3`=voo&K<=YYgE5DvJkRfnHqm4v``+_pZy?DrplDn% z>yF*05F!wH%F`r>_?3j9Yz-eDF*1rW8x#yrnEfr*E#M2jbi^M(bOiRIQ4{*FPe6cad5Km}+1?v~J_@Zsyl`~O;dK;O@67NY55ppS0(IxAy|^ zZT+ghm6sif^hxA8Nl7@ox*;DC&pXjlTxkLgl2THbiywa7v*5J4shs!%oa&2qRSjJ# zKpfKCy?c^Z0uNTj$+Yf|@4!&*{~IGqy3Dh^MYw|8b&RqQPDOrO1J7qX%ezE< zi)HN2wRFuFd2TJ*PWP?UR_H?^#NMvW34cw24m(Lmn~H*Dq@|K-L&37Rll=PW2|IS4 z*mHpMfbcF^)MB{UI02U@hG~C%5BURtGzVSk(3W(WRT8-*xIUht@~*^{7U&k>Ds~4n;J9NkJGKOJkNKrXR?*+o}EB z+0i!p!Zrsh*)j$2-VJ$1w*u;rlO>_{h=g2qOtkb0LK|d77cfr=rf&; z2#sKABFqzPscASI?b)X`?tMY&2$Z^($rnQWicX@|244k^T|s2p5`F^(CD08Kft-^@ zg9@S^?*D06ac!{IE67YfUj$P9yg4@}0Xx$Mj`{BtM-TbSrMT}JTcH+xFAPsgAX<2w z{!l^mHOU*pT{ve;ND?~lsoGcn{CM{>WLXAssM%-#5Ge$}?I{dOx$-D!GT5V`=yYAC zb)*)=0E_v5lG%&-Qiyp`TaAg|ig`Hv!Z8LFJi-_yC5%YU#8NP2Y7}ZBhtnGG52 zD->h3WB(=kklGZ=NmT7ja+@7yz=Js-h5v`Nb0u$@BlEu z7S+`V7~v|33H0CS8kMw(L4?wn9!X!tdj9~n!)n!Fr??#BaXu4_m;|ZtaGj%C#Wbfr zK3<&0OxLTQLt5*m!q(rJ)*B8`rhz6JaWIiML%^jq0_L#GsBtz9T?M}D)!XmN-xd(Y{7 zVHezYNeSn-tNvs0#V`7^UVCri$(bG55+bOtgZBy7cFx1f0zI2|FoZ3}?OE zN|(G}xqY({-_FPY+E9d5key~r2w5iOu?>++Yz>$oOm^TF#7mpJm zO2Eqz4u8)U%ZeH;r7-A#by~frnoMC0=@oK!+a`qLV^GDP)nAQ-ZbRiS73?4KD-B3|J5aU`FcKGOb>b_5CcN8|fav+t!)E@Rx!w_{HCIC!(rw-=7#AlT2;rF^VR5SA+o?dz~KrI zuU}Y^QvHsB*vCRp#)@)~w-+;tId|m+uxvDe)AG3}eR(HQo4sTgtZRijZZA)>{UwaV z*1wKP3$40qb1+07(E7NtTLhtW1~3VtB?u~~$VZLK=M($J{T+!(vsX&ytZ?^ZDe9A) zvA*WH^{;TEb@Vnk72n4rTHq!HahJB)%SOei1{3dMNvI{@aWF7Be)rItUTC)Nmq3`| zY-G=YFqYU4IdVy}4Yv^K;9^xTj2C&)lvY*wmZ*7DC6=3cZ9Icx0>6Ha!9w{r*4GBTGh{*4VuDB^y zer(4k3%eo`KxMX(yLoxjw-bCUKaeUFt?_TtC0`s_8;VfK&o@?DtF)l&BXos_Gw@)9 z_*g$-U0~h1kPP$189=&?ZUf{>Pe7p?E0vsjVak~FzV=akE(@kwFX*hqImkFHOt17t zf&EY)%s`C$b|ZBZyVbJ89a;ORN}X`6&?ol!vL2yJ_}tmD`9pIup1#RO6Kk-Ma#)J_ zrpVy?5}C9@pzgd(W$x=}d@^i=DM93iiP#&qP~xQx^nIQMMI=A4wGP>*$w(a^KtdsL z#4A^S3Q70`%<;BkdqAbnA({4^47)JTsgRIM_*S-U*2BlTB>myyyi$h5d%QIvm;Nx5 z>hH!rJFa2a!_Xg%P&2|Vy(mlMZ19Peenc+{0ep@)^S4hJFny3<%w#w771hylVZci> z0a`UM{1hJ(&!z1cAcfraL;T!D?nj!NdC9wJI+qqbjj@WD6$Bz?>`2RZY*RdqIhTD} zoj;!bt6t~l%P?(e7xiXHZd|;Hx-)y(Yk%Cq!#_eY(cd!1zsV#igLfq5Hsv4;R#Eam zIU38A@+j^v5v*yZWByIXm<-h@bt!K&@TwL{_8hcxV}ttm0>yW#6*q^lJD1{5LxrUK z)b6HaY>V?ald9)$LbVL(mph4gM%O^evVMP5RZsuCz*DI{bf*t?YU z2U^m?aX-QUa1WJAzXQ7x)0ZOlVnm@s2xMyu^hEZ)whFcYRlOUB`%|ioGtsenn}VmOzFhR zdy6eTnlQf0t6`xJ>P+$q(QP;Cqc{eH*HN*}ws3lbClOCz96L&ye!=v{1^eSWUVOYkiwp9ZTz5;Dkfyp2 znf8J7R!D7>5xEZc>bFR@$aZAnI_i?SnPY&SzyOM6;C6hCh5Z>O$;|tY@f*;VU~!dD z_mbL@!s+2ykrYvzPkE(a2{>CjjwB}YH$9Tk{U2EPAf43Y>2~O9EEYS`QE<4nrM~>W zrW9!6%!lrpiH>#0y9fEn;|H?EfHD)?K__X@&mGS_4s~QiaZeM@mufML7r&slmp5FY zOodnS57}_ZK)c>DKd#_p)n$pWE)A58TXxXNi_sMzX%(loB{u%t)v@`s+<}+jivCuS1$AR zt>7C^{F|eYD)CF@1uDudNzCB=w$C2OA#(@a7#aXZ86>pfnN&7Vv=12!Cw(8VY4ey) zXn=uQU@`SIZ#!x1*6tS{Z)}BjWIOgQQrL!lW-V&UG=i^qi67$?yk;@)YxjmRV__)V zXFOqcHL3mJ8ZXfth)aNr8MqbiW&r%bQ8thJyn)CemKDcQu)>dPO&w7LrIo?YJuuL7 zQYMn=q&2yK;dV?_@G(&+WNh1!xtrkbu zekcyF{89cYzGa}raT#p8Z24fE9|J@lA;WB*_Lq^7iXQ4lxX_r4m6s1QUpE*K;f+8x z*9{8>3}trCbvY=~3uy|P60Sxv{A{=EXol`lM~^GKCZ)3T#@_d_`uhjo?Zn(?T>77C zzFO}~?lLED+^z{ICA3C70I&3){wA~m^Bj2Kq_If1h=t#X+kV)_K-X}O# zwLN^7tEZ4&{1AI8_5>j5panIf6LeT@m%Q=MWT2UQ$k>r7mLlbY`RPA&$; z?ST=++4wKq5-2s8D)wVZr3FAR6nKhQk$d?2X#1P#M0`vrxtZ5Oc&_R8$kK1c(;lS}8)eVje8!Pk%A~#cV-UZs zN6HnBGl;K}eCP{wa!IR;laPuKjY_a&m>8zWmviwwd}sDx#=rZ(X$6IjGilP0H=9$FZ|QzNg9&5#^Tb`K@tcEgMB@I4l`FeVIFNA-TyVOK`#Xl%%d@kVyE*tm`#hXG6(BN zNH?Tx%8h!r_4R*yH0*c!9p3}f z+hpI))iIphpRyyW=l_UjEN-QGap#`w9Z|JM5P&iJ+6Z8L__}#`t47u`FTP?=IFg*`d3Yo;--d` z8`brwsf1l%GWse%k={y?UpOc$KjxBTMkQ$R*ToeCDpwQ;&2d*zlsu7AD>C4oa<}~oX`zKA zL3qjEV?5@#4)Vm%HRs#iRtrDZi*jE!jJ;&7=}8rRk-YVrb$}~X3)k?&Cw*?BM013S zRP*o0pN&f~HnGKg zB&OgE1pLt86R1`YgvIj2%X+j!GD7cDwW%`0bEL^O%Ge4ae}|v#s-6k$3W-UA9=H z?EZ+vFKgc!qnk^y%gP6~b*wSt{_4K@7GC@~VaIIj{TIV%3<>hFH5;JdZFY6SApL0EY9XLVwf@hvDQa8@7T>~*!aL8U3nyRp}EE68Bpl2f@J$8X7 z`-xF}0d;$x`u7!y%A&S!9YcL8pY~^7o3@3)*|i!i@n&Fwe9|`PmV8^~SKpp~Gx*`V zOL)-vMtUj#I-WmJB5hyJ8xT*9qT?4D!Hny9!C_uaP%(zpQyDjB_~hKCYOE`>T<0AJ6Wq7ht~ zFT`?_LFAiXdl;a$GE8aEneksA)Je>I(ib<8P>jB4OMW59N;eFP6rr}+J>LOmKR{p^6+|k5M06Q=gl^M%_0UTk zOT-ZGOO7IjViJyu{`mFmuEySDEMA~lK{YJ_1#k&>eNDV6l%nJ)h3Mebp?$WVKT39v#nt;Vh0RaE9GBK@`2@7mRU?t0DPr# z&jQOkirXvNx4+!LB=TdcB$qsa;M+I1cd!jBFYI*U-w&t%T>L^>tVWbQcQy_n)gfAF zyl^5Ja^H$SuWZFl9{wrUP;nc?Q7CxS&09gDD$s^)hDacdxJyQ)R4pFb>3Y7yKDeA< zle%c2*mXH}?oXnjRi2WuD%L)JFD;WCU0nIKzOH^_JBN{lo(WwzS>b{JpB9sNAFE3YYnMOlLo(M~_WDkQKf=Icw5mwmcxdNBF)XH{<+_<08%ue6Rm(0@; ze>~2@69u;)M?;Va{~ebmYHjjjgi-h;Dad!4hm(s-k<+#-Bl`!n=NB1yH0ZBLoN_mv zP~rYd1qgH*o1W(W1FfW^y!b{aqLHmZ*Y}=pb|t3XzhG!if;R;|DzuKb;X*Fb1R+wT zl5X3-jfJe{4!kA?wC8*H81zpvS|We_G`h?bP%4zt3eP$@zr;q5Ku0tq4;2xVg?DG* z2?wM9s-^u!HHbAQY&7V2_`;XTyf5Q9pZ&usBeD7aF$mdicy^6l{R1$Xo$u7eeV_t< z@csiJm#B|P{-w`$b1fXTLJ6W)B|syORDNbkTf4Lv6g#edsNhytL(*xG@xcp{S_!JYq6A; z0FSSFY&5XNcUgCB19LYD+8QH#_hf%vR`^b6)z}i!%HA);BKL6x4>V2oS{w6H|LRLI zg{;x$dC(a~(&>vu3h9GgC#{$l^E>FSw3V?gEg-^;YU1EPK$-B9g(sgl5IY0soAuF1 z6?L^ZO}=)*zW$r|L#BuylJLp7*BMn)hM_BiU*lGTbREx@?^vF(1iEIQ{4RV~H#cEW zLdrb=ybFUu1ehK^d8Q3O$!0!>+4F5<^-R(EBkcn_B-&_@R&j>g3#ZQ}|M5L?w$kq( z;^?KQamH#~LCGxTQ5Mm1J{Ja4W8^KrVmzb`6#$cVfD?Z&wE+2C)imw=z8t;9&JJKP zvE&S4Y80k?`>T+r4n?aUp?%w&bvmO=@1djq$($B0-EiXz`n8&Q0WWlZFJ4|YaEJT*r6RTVvAv3BX zfKi;Y>q7#@vQxgV2nPoSf#6^+EI=>-3myRz8wZyg zkrD!>;^g9?rs0qxAe6?#=a=A>}ds6y;H>A-o6#g;-MzWL~FN z#>-?V`$lEox|_~8e3|wWY_Q=y<^O6NU?CL!dGEP`As}n;Zef@^VlFfNBTO+v5VXsU zqns?EN?sYhDoaV*l}5en+|F&-HY4!KNfVJ7wkfhL?7;nXmc)+oLOFb&-oJ*DXeIpp zH+yI6)O1+jtL;!r*UHPPeecPs*B_y5e*nan`VwP7(RO^O6=AUKP!U${yt2ZUa0nHh zbYYPVDo~((Uu}ZjFTMz=#dx?qCj3S0)%k!AMex&yTE#UGz|snyRO9jOHa8XymmVI4 zbqfh`qW;B4#(OK4medYtXg4(u>FUS-5#Q^+Im|FB&jcT_!EYto`RFggacuaOI_4yt zoSZmB9ybtUhS&H&e)@DSL1SO_dj3!FTQG~J)sQT$U#o+Gi|G}`2hiq#5@Xf+7Nu1o+WXJ;gT`Ua>N?oI1=AF$(c?>%aB?>EbMh{?82-&=k0zDR~RrU9#TtGsi?5 z)U1NaSP@ZMBJ|(6suMVjAME^(S((}^`wTd6u(6Nz>$sVJI;u9I)Q?hVjv9%&;Q~+r z5ZC|N&m%_!veIAG7T<4t(g>%*BXz!y!htbiwyo&IQQQ0vP~b;HBFowYRV~tqxB->} zVdQus^$$+vgrvKvTAWzS#x288fVjEb-yRp_ti{iZl+3^?=gK8YLDpd;&;5E;u@`DB zB|uwR%aOUFO)DqlAY6?zeQo+g5OR+}z=hk)SRZYh)mAi_DKEHhQd-L$`piY*<7N-ZTX())BS--&n*{X{mn^RpE+>IHM5tazIAKc*vFq~ z6A_oGSWjJXWBTxs#m#PXWO1D414&bU7p90?BE|vU$X93* zn4E9HorXw`yq3m)2fE)d;U`R+rx$z?mdQZKkUp27qJwS%mEZpgZM-@N6A&A%ToM~eCz=szDfnAN?~rDX?QCRih>TbOpY>I#hg#WuSyjfMuFT8#Cdx#WVq zQjxpa)Jth*!Y57gb*T^a?Z)6;G-n`m_TdTDd{kDuL){JCz?-`T%w65Y#@+Dp;cLQ^ zSi_L@NPG%S=@No&u0#4DY`o5%T(Sn4;(n&YNr3#oB@hz29a?*ApKZJ{3TmQjUKDz2 z|L=5S5P}3@`%j$z4p?xA9hX2U1M4xW|G;;~Z8Q9;A(->8ZN^#7haH;(SZ%Y-IihVqUy#C-{TC-K*2Er{;uO06?7$ zvz&13+{w)PV919-Lu_OSpUmG^c@VQ2XWu$1$0_~m&eO*hg7MlXf|EnijJ04*Zt^<4 zb_O2JMau1?LI|gTHGoTNrE!5#?bpL|V31kC>fzrDPCX(DW10KM|K9lTg|5~>spHgl z=*WGT*x^$=4#z(FM5k%DraO0h3$mzWPIYE(v5nf``;ANV@&i*^hEUzT z8q+--#iQL+xg-_UQWGXiFq=71{?s^bMoPzTkO6@irvGF z5B)%U#eS!@XJ1q(!RQL@Qi%you!4kBYdR>-$9`xX90aitPwz+`VsV$IqBz84Sw;Nn z{XsYxPW|{H$by1d4-JF_t6-%?^SH?<-A!LcSJs#8mlS)!JIAzql1O>Ht}CXpTt+~x zRuV{!PV#BYV$*M&FjNlL9MoQ$jDN4kn7X1>JE>E8EO%-1f4kCGx;~dc#$Z9)Z-@;- zz;O4lc^H)U;{C4|(J?~=E_SzJRL1_JC4sL7Es_9Bb6NU5*h)Tr^GnjB!BQ%n^|qk( z6VkpJ!0PX^5=bvIW6;=ED~*oQvLF^#6av3)$6L#)L@6}FWR!(u+aXwjp2V4QXpt95 zt68)+R#FENT(hwVQ7bq1C*lGOP8K~mdZE?G5l0#R^sL_@U*QStjlYUUKF|^~`t?tyvC=gE@cwUf|A)^dijerE|Y%gwZx7WpRx2Ip55W7OiyW zIdqzgeyF!QJ0V#b4{r>O$Z;S_w!|~{V z;oAGGm~*bRSIh5Dp@w|hxod7fOxhD(uJ?|bleDna?jE)-5ZaR$1zwvwwL!^q{P-Yx z6bgF~$rn|k>s;h*knVx_OT;!aA=3jLzIjF0nJY1rF-eE!aWq&)^c1{|FG_pA&7lZw zVVcpHq`*m^7cuOz!LZ^?kfIpxOr6!`A));~ESq%{a(JOrqwoQI=HxG*89udw@n`l8 zyg4S6N1d0~m18ac1wvEbpL-#6l+x65?K?7U>ZHoyrA6BzQ9!@xoNG3M=A5LYoH`_G zaB$G-s>K|4ETROYp8mag(_H4rObOAk@a{8Sa|31hiWdDmO|{2kr|toN)O-zFIlUFC z7t_<%O|wx1^Mqo=g9B`2P_Zn9LNR>5ZhekU1(?}N>F<9qF>VhuD1+>a1?_e1tKzZ;(91I?^{V-oafw)YiqIa}sd=jUV zESEeCzMbrivw1AOmwfBA=*n(U1*7p)o7OMMJNEKT%Yx_w;j@+?pk#^;8(w2%~@g&81MKFNNgpX;)>-U>Nqtq!90T>8dcwk$jx~pZl?s|6c z|6X>rn>k7hE{Cnf{mD*NhC0UZ`s(K;p$K@tLxmMczaC6>cPT)y;B@SvSh0o9ETmlFN|dl0?(=FuX)~H;4}i`j`ga7fG(+kt88|n(s&3(}LO; zzN{>UX`{@hXH?@@U7wHYzhBkKYqsZ`BQ zAB$Rsnv6Fwy@N&}Mpv{qF`5y0N+>can)_)AgoiQXu2`WnDZ|*IdUB|Q`57NO2eV;XBKAN^H#|aiq zw(TmIr_wGnbR`^L*`8)pc?YjKH^C@nsFB2bgtq1;ZFEusDN`9WCb>*xBlUHdbQoiu zc1jwQ;5tAF4}ZWGdyNu~qe>=R4LZ@7Y}O~_>UVu}?YUknFn8e9b)l8$`RV>OBMYvg zHmHj;c$@@Py%R1S>!x5&sM*i`<3uCEh^MnJj;9580KDTz4v zMjtQP+3XV%kUosk!}?W)D<`Gi*!|k!A{UKwJ=-KSqjH{gx1Y-P_FQNUw+%3gB#%kW z*xyJNA=eRo0O?3hNK2lOEDpUi5tqXx{3?uVlPPPejM4bst~0S)@x4e$*R ziP4*@(*-Mbi;kwH-B?QCiuorqZ61kfi3IqFg5$px292bG$BE+mB@mw%ZtbXmyeI(YB-d=rHc85y;U z7UzEr>Hv?@pf9H+v4b1t7g{S;|CS(=xJ#2~lfg(e{{P(l{bQ)MnB^878)giTw44MhkEkeu_vYj;jvnA( z4T|qJ=hW~-{U_+@cnKCxdrrF(k~UO!4Illu)G@BVs1y0HGneUZ;?)_Au*fi~I{rw& zRx6j3l#Vxx4uPFF@EUAjR80HEU?#4*<&U;sH7^Mt@Ie;`%+GGiSkHmpiN#RIJjT~_ zEo<^^!7u8+<~WtWEK?R821!0BXrh;1;NQ_^B8xAWa?;;JyV~+=-~*koNzKYQ8h;)}D#u`dA2uyim+|sc&8f>L z#3)FfVMJiD-KgQCr z8&cn#CpkurIB)Fd{PQu9m8~i{Y1ln{^4S{{0(VMrS#h ze~%mt6J|hER0nDPMr~ht|AVyTQYgGqG@gqJVU3~ZNTZ@&r`dalVSSz+s`6iHn%>GoAxfuIA2taGgFe&;qt_t%qKe9w<|PWwjWG*YLvqY^OHIH=#N z-6So_bZ9{2J@tODf&2C-Rmuag`hO~2PU^;(Vn?fC$_{eo;i{?^7@P5ZSYIh&pPm?V zA_4))Y(-jal@pfP40~~NxCL_C%S{Qs|c{%bLI z8wwK;gLPUqKex(xv3__?rtc%fLnrBxEd_G{{V>B3Q}t%{HQJ7pJ9U7^1(s84Serro zkrj+b7Cx z+M|5>^^RKuQgzP9fG~;+1wixe!-LmCXD_f;5tFd0BYY=}dNpbEBf0)#MkxrBVUT z1M|O+98{YhLPw7`7l(LHQsp*2d5mSVR@aRu6WxYhN#&bfrNd-d2{JKOG=x;X|a1|-2}XyA&7{31KvC|4T(5fo6KIVM~OH&W=+y4!O@h+BQT8r%GF>Kzn3K0 zuTh;A-jtTV8u`7HwH(DHH>@`J-KEdxrNXziY^T-LDL$CL#!Kp;h5lr_+PU8%ARLO=Bhv zM?>NDKY$3)(9an5BoJNmWR}FM4h!-Xk}OF{E8J;Yj5yw=U+82c%7~jL6R+?vtk6X{ zr>(IPH)ol@T}z>d--f{>#Ib4-R)zJB(4}tb=bQH4F_~<dXSP?tdcitw=G9QMUNZc0S+secjRl zNpaI~@tc;duQ+NF2X5N#l3e~(fFKQfIKLbBJ6!-~cr{~yDJQOODg*|0F|`KnENNIz zjcTZptkI|tP^?@8YB9+nj<}J3i>ORy6yIDPckha(j(U<5&r2VAp=;V4k3nkg{PQ55 z+gz#S)F&n-fc?bg>lYAi5Z=U~i+-`SM-b@9FD?z-@t2fj;~h7rg_2VDm)+SZE<57MnpHr7Y*pB@*Tv0WnTV!cLX zgND9hA+J_L=;UQ9$lqtNSkBQm;EJucF19e>BTJQTgR0!oyWtfC_s}45MLBI%l4n@3 zAtc=4ZrXE(X!GfY1-tS`9>1r-VDf9cfjsO!HB`P(?K83*kFyy_Z~83;`r@7t8C{Ak zOKnpE%U^d)x3k=d%6!NZ1SA$rR_VA*jKvNUu0x|~sNNLuyL>@9M2Xa6u(PTPuv?B! z>@4tEtZ>_dSIcsv*c3CS^Dp(oi$0fh##l>-q53M2;F^h`ICgPRGz>N2!GfYi!y07*v2-=};w zRYl^KLiMS!CX1T7zJ{1Swpy-9*??B^govrKq8%EY_<`J!!atl|4?b{$&o%++-n=9- z#Y_{Ug0IIK$gNc+ziKjc%$-xgIzpAS?8I$$KHTMuyoJpsi%>JOy&@Z5g zc9!M_#{FQPmN$+Q;eqohlj*8*HL9!=NFL`QzqWzN^0%im!JxonWSoL=h_@bo{DaZfS&?YIXq9r78v})T`cU9QjSQvm2uf#R~Jt3ev*jj;ln}qYrF>< zX60dY8AbBOWcB%z4MYXH{s`Ji+MMBRGldo@Ro)X~OXL_~(`3GS|5l1TAV#$zUIhiI zvRZiOsT4@8KT5^S%^On{!4@8IMN*0sr3~6dWR&|r1`Pnw(SKkXu7tn!_c`UKgUqq2 zzNalLLnyQ!#|)CwoG~zTE&bfa_V$L-HLRGU8|vNwgZ1GbqZ{>2y&|OijKWelO9qC- z2jCd>|Zrxb2S@aU&cR+9Y?Hq~warbYm_pJ%Ua4h=Gf$+C3R z!QkJOP8+FKW%b#1u%()iM$D6z_a59@7K@6i8PY(byAAIJ&>1w3ER%{BX@xFD=DbCE zv{Qh#DBflQK&auVQ_AT6ZHrUXGrl7C;V;Y!` zB3gD_2g#(JmX@;a(Qhu|#kO`01G{0-g^DZUFfpgG#K=U)Coo0)D>norx4qmV>C{fK z_%&gmW-^k60fle7(yZ^=>@e&o2j!S@=r`^jDavEQ+~B0U?c`ZIFbJgOz-{$>B}rsF z#U>F^o6>SYFxIRN@19(#QE(z`nsdwPlV2gDq_|e;sQR>ab3kDdTO`782p1+tElEId zwzk>O2q!$*y+BzO;%k_MFe{$U+P%s zBW~{wv!DyusX8o7*JEngDRe2zHXXJndFJ&C%4aZZuGl8i;rbF61SS{9qln!GylkiCH%et(s!n}; zld?V~(p<2ps=+qFenDUn+YRO^w-VY`MNT+o8rXpt>d1%+ol4c`G}ZA)xj2Z?il$=J zstSMh;A|!+s5fa(HBJGE=7jR%zgEg#aqhHxHe8!qhNuMRN2%DF$*OjR)}o*5<6vQ^ zF40U#Yw(2wA}|IAFNOnMg^gN{ntv1~$SH)>MdiBFrs0>^ngXAb`aN!T_6*0zB_+Z!3Qvb zJ2ywCi+6(In^^l(T|OHrn4i^jUu~Y~_05#ZYs|Ijv9rSSIuwkeEGhBTZt#Ou%uP+_ zzNqOSXx-cLf`57(P}on{yhO>AKs66^bj;ey+Db4k+M^E(v6;l5#CIuBpLM#Zc^wuCH$V^gAnnE=8 z-BW7(P0U*a(fKXQp`c?fh-7csFYS6H5|t8k#>AvQFhT_u*uE=0dUPhTviv+wjKbQD z+-NGMyj;~VPeRWSaYCdSCY4`u8B9oX@^50ocDh!!5=}WO(EG+!ZJd#D9&8R?T+IQ$ zDEIJog+YD1IEbZ9O|uQfiV@bR(3hxlh)MK$SYRYB1)OtxefEyb>g-p`!Pu!YU|I-h z>61J&6Lzzo&1h92!HX1q3hW0QCs_4J5m+ec-dIt4Li%3DyqF1Fl@%wgxaD43n$zf~ zTIeN*ah!ZwWN9t01+PgMH4`)#y?h~yBa8j#V1LOQBWZbub2`}&d38xO%DWg0KgD3I z8f9PwFh_f*>1j-$kDigQ%RGM|&cE4U> zZ5yiG(7w_8j;oQa+7?y*fHKlpKr{o{3P_LA>K+C?7wParh`pOx?2Bn#s`ZCPjexgO}eWs|1_W&Mnx?`R>CrdnW4S@H`6TnXuq` z(qxYROI@%ZC?m3QcZiMsWifV6UGroRE|^5OxW{)yLDX#706@)4MUBB$C9_&ndOUV? z#D?=YJ_a84r0&553Rp*HDr^hvS;20d&2fd-an!uTwJbhYU<`;Pmipa zcIrB@+^2R}F~?dAaU;(TvjF2i-=rwh@1{ApVw>PiO*A%yMaweMA<@|3W%_31paXkg z8>qvYgUd~+H)sWRw-zgO<54U6e%+2u-tk%Wp6AjclD}&K^$s`a-|FO5gX{N*oZtt> zX)4L!+Dr7uW+=RH4^;8!$QcoXoYKgZ0?p`7>_T7;3e%9boCF352AOjcc})ubUXkr-{!DAWz$ zw^9?JFYiXfpVNvCjx6(LV1Hcx388RR(X}8C#4t)CX4`Ewxk7@z*voBgGMQLi4=9Nm z^x@K%nRxXy&-<1VKGob<0*_KjY=5sftEr)sNhkn-Vr0iSQjn4)edNSbjGT?~W7xx< zK*ifE++8Tp8}(+ysgGF~i9z>?7nF8&zCu^dJ&J_z^KlZ1K+1T6bu+;GB7yv6+Za2B zUl_*7!dpqp-o_VD=#NRitXiSB8AW~|&-bH;to$|#0r<>7O0i7xL^q@X|5jKin=4)l zV^0MG+tp4|NlN4)x!ayY_r={J1rI{~c@58EXJ;A}bBN`M4I*{2IS_utG3QEHpjh=CzqE``iyy zi-A{38TFP|@&4*y=!>qP>7cm~#JX(&lBip9jL;w|)6~E>dDG{Z9(Frvq08>i$@g*= z>Fl^R!vg?fFw}K>JfG3I5i&K#usf#Xg=#(qeO(;!!a{2eB4*C{cGj|aZk;Kskm7K7 z>H2ORk)#4dSu-2>Sh|k^eHta$i77APG>~4Oid+~z&h!Jc4C6wuSW-fXxfo;B=6=M^ z3#$SSg2BOHVKvzC97r(HAjoYpZ48rO2p;fswjTJ&afR}`e>wO6N-T!`YNpA|J;4^V zITL&djHZljaE)d4^i7iUuy6=4Ml#_j=%ZiMlGF3f%6d|P8C!@WRD`7JKhz;XfqdBC z24_i&qi(|HwVkaB>a6;4sFN1*GA+WBV8&#x&zx}y*0iKy(^0f@33Kp=X0WvJ9a>UI z>ESfodJbR1Bc{Oi3IzrNfFcRS4hP2Vb5#q-s4g7}Z`@QKiIapUrl>bQr9iz3sc}Bc z#z^>B?H}j63-=!;w{T8IIII?r%-Y)=lq8X<5$vRC;?e8&*6a_n-QdAtwzjl6K^K|v$i27Nia1w~Fmv{Y-MQH`+ha>6-mMe;{UYHJ z#45&1OF41lQr^Q$J3bk<0G-Fj^N+NSnO%wW7tbK-4^Sjr-}?CGGO8JT-@4tt5duvk ztxy}WsppIx2*d5cT_y3E@uMMcWOx8P45w_x6N3ZHJ6&bnx=WFcbMCl#c0_Px_qFz@ zpX7w(;GiGkAmTIMrT*l4nI86VS^r=OK;vOgGGGz8bcKQBKQIa7ioSaC>EHSc`Zs4Y z^=F-CSvFG}IrU7|G0W1@Op-oZ(eTe6BI|y|;&swo8+(b)_L9ifd%;vn{IzV5HaQME zQn?e^#KUlEY<9PVw@O^#_wV{IiZnrX00JR9$ zP{t>s5=km6ru3P0`HP-N#twhcx!SSE(4k|hTmv;Xa~HT3EEZ|Ar8hajVS7ifX!s^f z$mtC*X71jESrKyz_TICM1M8!wQ~yE9Wz!#%GW=a_2Y3fm!9 zQgF?z|I?QB&4Z>2$_ku`hGm_&z$ZOK{EFI7O(tFM2Yn0cNsA^5x3Y@w1fpZAnzI@p z0k`<+80jNgY%C2}5P2g!D?PAjNtCzK4Yi0vQQBj4gzS^5U5kD}Gm@kzK2S*aLw97d zIJ=XzXSgM3xT0Aru!%CH3sDMdEo7@qa6}9|Y<2&@uv#zGQm4OtFWVRU)`QoSaFELiU0zjhJafZo3a)p0>9n9@}AHIL0JS zCxGfFcz~rP9o_7Vm}9^MOUFyYu?0DoAi4D_qgwyCW*=IboM=5L-T2COeG~gS#{v;i zInObbW1Y$Zbdi|-91Pr_L*qK_3%}7>W;&=;SenrYF4*XOaFTr|k zI81gPQ6s5#+!c)fq};$9 zof6rH5(CL#SmW^{`-t);)W-s#cE9ERig?(>>U5a22~!sBr3#_qHhBIq|1>_-k-43{ zhV2+->qg0m%MAJ{YMSxPO#j}@oft716*&{=`~D`UbNz5)Fo$Ar8{Rl+%X1bfPoe6_ zjDd9UQf7cp=Eo;w1l4_MNqm`B&;b))1Wxa~6(<*ytAkymPA3PVABbTW}+T|V- zZR|2kV;0BCRs`%JfK}O2gPx<#<2vIY$+1xb%xU@k$skPkDb1ojc?7l2cb@;kRF_=A zGE*rF6cR=ROAQLzFuiav&%6u?MgKFDDK!dF(XKM>=bEoF@{!igY4+FNdv>cp_yk~E zv_>|-3%!Nw=-6dfQ!y9XsgE)7G&=kPle*guM^iFT?O)}`7!@IoyepwyW0&i0!ia&B z10GiN8_Qt(iT&@_jLcKA6bu)F{Box7x0#S6L(ICpU(*>$z>0R-yb#O_LXu&=Q|n87 z;UMp9XtTaRV@xtC-XX#9P0>Xy8~Z?t@A)PoCb>cTF(q@B#gFN9VV1gN7(LN1D1?f4 zDef?f0AO>Nc-lTXf3a|tklj8^RD-i3a>Bg&Vsb!cM^FAZYEiJ9= z<2`~Gv2S(|5uNfZtIan@36_Qa(OojC<3XiFVGjE(c@H0J4YAnO{wDjsZe@Fo*ty=2 z{`hr5aFhaZ`b2O-SxR&erCsMK3ou_$ab=YW{*e{DKJ6dqFZ3+<2Ce!|7*0>-H5jc--IrGAeK{L9 z_lF_fDuP!Yw+eIJy&K}XZbAw1ax@%h`)j0-WSuvtb@R?SPjMk4{{@r*+q%Qxc6m$xA=(HX~XXS>`31|*VG@7Wf)bg zl9r&8a$A5vBQQF~Ud&lCbd|nW0VVyp6raR%XhEYFZOp2yu>wgK5KXb+hQnM%Ifpoh z5cylfkNRkmD^+zIxrW>aUb04K<8n)H+n(*MJj}SX#C(6;fUJJ_z%%ZW?=50w_pU6n z`m+GNJ2zGoz8NMd^>!LMO06L&JiE#aUsTAaS89wM`j~3{|03lunD%0Lk~?<-I%0vS&-E|8OVy6h>LcgjhnfcmP* z((YyRfS~zZ^5CCUQkWtG5Cn>h_(0jPhjMiCjQrSA6Z@_@w8{Nq3gP*`4FQ=BqYk$J z>wmWTYsu{IW}yS^E@Kah$`2d?pIkR+f&Q+bgJ*SC+|P-l;nq`;0G;J}zcJyxlikfA zh4v;mEWDv1GwA8)6!NE<2^l%p!Kqq3{_Dp7&!u5AN_^A=h-twWDBzEbTejWOSN+M8 zOyuFyuE7Anz9Vw*9TQv6G@TR1vsmt2E>!4$%1HlWJ$?)>u;6sjP@(bEztS>0%dLr8(RYEdo_Bfxvw0%Fj zqRxFYvYP$5p>@Ws#qjdM-;V|tIs=-QX;4fC@4 zQ*t`fAfMgnAmxaw7VPS5YCyQU3DcCL|0%d#WfW zd?Hp*kw{)`YB=XK(cTdjAPocn=A}O{flj5#t9FtJU?Y-n?U(#XKgyNOkpJs@_Rc#iuvIN0{#Qz@>{MdJ=>y5(Jg%P z8{aZ5Gr58mD?@{v4gDEbc7gNr^IrJ{4)WlKf&SYNHesB-WWpdxibPiuyNHG_ik`3K zE7~DgQ2x?{&@Xb0}s=uD9{av85Mm)F9lEM>)4KyHOICD>?OG%S(_@y%=9?3x%k5%i=4^kZ z7v@usgvo+6J8W23SX}WORX6|aBOtkLE05&o-sUnlG(ubNr+D|b z?Sv;Cm;dXE@u+_CTe4~eyb`keGUUp%d%vN;2?6JMC8bv0DoU#}w1~B=(5@CrVFvfg z8pWF0h^O=Ln4ZaB&9L#r)pf#@LL4iSNR3L6)9PXaw;QhsZNY)z+YkkjQ+qJuEbwT)ZYvpKX7;t1`UEZ>@Qe)*R0i=ctY(zs@nx)aY2wtaS1JB z+;$_PgN{38 z^wW^C{Jzi#ArcGgNcFKIRPpyss4Ha4? zu&Hfh$Q;nk}$FZ2RfnqCax@`;kAJkGFcrtfekq(`}l_IkyrW|LrRO! z9~dO$eC2ufKXtDcBW4G*TB!hs(6g1+-tC7sGz^k;ABy(2h%=NbNh`0NyS5i+DK zEwP?BW3bJ4CX83z1W^{VONF2tNziM_@=^YM(>(&wGFx)g$K*?}dvw}~Qh|o1ekALz zqFhUmDUN|tQxIqn1Tsdp&Pqd_19{iw#Z5;TQhdq%#Y6wl{w)OjlFDG2LwiOi)AC_6 z30rc6PKS7m9Xrw0j{PSvzx2jKo5iuUIQ^*hP;v&UPXM6Q6Jip!Ek%l}SHFgQ-)Ff|c`M4})hR!c~qj~To z+FfXVvzuQ>OLV^d;pL9|(_n2%q1zns|2R zqJM52uycQ&I=ZdYTRA!d;F1}hS3ca_zfb#CRtSS5o~-s`)owE;kIvuxID41)HG2m2 z^qSC=Wl}a=O!5obCnH&yuo2|XYUpe^?e~rXPaURTa>T_YU*-6pyM8&keraY%fI(E1 z)v%}TUCra&nrUeta(QO3y{x0UmYr+ed~BF)@6@{E>_&4L__v7L;V81n#ne0Ye(RQ6 zNAK{`4NNFv*JNjGjE6%w`F0Qi5Utzlnqj0&;Ok}Ofcve5 zhkM1vlYqOM{lL4j1(!%3-?u{26$NItd#h*rt0yK3o^7wuQfJ@X%10lJjp1|Qhi@mYi2#LQz;~(9TvD?S5lSHP#o)Uw*VI;t9yD;BO6>kf1uw zuK=y_-MNPa<1ekDnc}+PRrGsxuI0M}2d1|K2-?3H8SQV113DX|7Z~31e|tm=ts(4P zTm3oiX{)u>xq|;N(CQ}KU)`Zs-Pp=#y0Aou(2k)y+h}k1dt}`w)xyMfL!+Cc^JsoG z2@Nd-v&k^upeDEshg7cV<<)gQ_ujebZC7Vx$BJ!tgu_tFT|D+P7vm{XAX3!N}HPxJNz7REp>hpT&qs_`uHlQ!$3&Sc_aRX`jU`L7$O?o zLBz#PLZ3m%k0qykNj9YcQp)H31I5RoJEhG`i8>xudijVP}P@fQwtH(zVAF(6K zT_y4?8@PIAGN%5$-0y1a>>Dbp4R?m8?<3~_HmTm7E~VupB!l=wQabz=M`_9`-)hKP zwt-Ey{qPJkiULEUpr;&&BquWqiWuwoVpUFMhkP~kiTVS%kiz;^EmAz%ubsU+H(gse0=$ls$yj$Qpg&$ov6Y z@1^BC4>y({ijcEhcbgBTjokJndcg`a-E-yjjF&(R7gAdyZxs?*&(8ShOSrtUo;IV; zg`(^{s@M#+*!H{LAogqDIn>=UOgi`LjjNa)6U?8QbL&DGs*0!>)RN|!ea1}iMz!Up zKH+Z+qkc=k%L4Mp*y_yuKQQj+EbFSg_Y&QtxArBOudKKMDdnT4y_S9B?I-8>fp1@C z{=jr~i!Ks!{c8>!JWkX%V~}MK&LNoa9vX5+Ov`WB3s;&l-t9juVPL@$oKtNP8;fhm z2}g*>Nm@@Fy%JH|128({ z{(eyBuu|85Wf?n$!=Y5cDSn7D&-#piFlZ=N{_E#vN+TTe0o)ekS82X_+~%}J71vuT zlb&kO)3oqt>I(jmIjsu9Ht&<8o6A$(L@X>eK^}W=o=6wF+lTJX4>&7QFirM`z1Kj< zMD2#*kg$TBmH9U}@@jo+(H^UtOo#wynKDt0Qq1H<`4|Vpst|uR zRoLCI6D|gmotao>womEy7Pi^--zz&5n-rIFvb;z;^!%GXooM`;=pCH6Agv(DJ-?36 zE(ZodV-wav=Pl1~NrS-&KQC+~SHDlbyLR68_p&#?5ZL|67B?mDF6>yQ=QE~}Qa)?@ zyAybcKN_kT_s3&k_=ioiLyaqEt$8Yl8W>;D^KQM?m&5id?NDpiyKZeE`1O&|UPgNT zhn@G4M6sC3I5iz@?kyD^Ji!Fo@ptv9UlJs%;@QwRfoV8Xs!nn>3_I@y z_tv{V6P8|mUDlH^(z6j!xOWNzjogOWtlxsU zvlw6aznB&>B^Ob<{W=mlkj&e7EYBoAo(lCHjv z;b*nGEM*PiQ)ARNQExp6#9)=RzWHWkP^P$(HcO*LnCUCKap!}{w$kiV=>!+|{4aaM zOSw-A!XJW_9z9!}4niD1Rpw&XFLBZ7xxIf z^q{mzBB1KO-NZjm`S}NC>38l0!tw{yT=DtYW$YF+=EX%WcN6y(?u(hb+FuKim#=VP z>P+R0=ia!e&2LzaWmD=4RN{Zt0~Ja^}v9^A=wbtxhKu|A!dVjiQ*ZorZ!%n7bW$x(du)R)* z|C-V0KDRz%h$Om=B#B(vFWXi``{>;~S==?xM{yum3Ck@LFhYtyhQqqjp}`8KJc(_s zSlPfD*c#mPEmaY$N#JZieUl_deRHlM4>=<)KIR#W`P%HXJ_#7s@=U0(`HcN$?v7jW z`~qPELJNj`2z{sA5>PNXzw^EN4@}HWjsCy)SHc9y*Waf$rH*Xz*hX?oU!Na6w&0-Z z4+6c8F5^50UMF^n$7k7l%`MzL-&P(}Zms5YBTg_ZQK5U|&q%DWN0A@;ZeUBC@ofsqA=0c?v z!a7(0h!Mu4iTNGK9Zg{AYRL?wK}Qz?Q%A9-dh>7W=2te5y@@MM&ey+x6!D6$+uh@7 z@p(!&I<{pINbO!xbG(hUxF8u@T+z%~ThimPh1~pDtdmdH)V0VIviJi7)jJs3nzDW~ zaV=tA_H~WP=1ncLkje84ik=R_RtOVc#PG^(3bnZp?a@jd*otVxKSn(fO?3^50K9Qm z#r4A+vcN#IUb{D?UpS|~%^F(B+2cAD!};9e22y9PBHYb<|If&o==EI&xaQ*Pr0h0T zLiQb#*#5`GSS9XQ$>E(>Nxh~vPANamf7xpuT;N_{sSk36yQ4|)wDCyHzE5}%;n>OB za(Eq%nDkNO!T}$`JX${BqB?S6eo8K=4;SjXa7o><)4;RJ{bWaq)cI}M_Dg$*(q}g0 z*SV@ZIqoAqx1shjXrWIl(x+aY(qC$hKd%Txw3#P6jlIukYRyz?7=4VK`%S)mB{F6bn~Pw4E$bDacxESZo(0^GOnvM(BXBURn~Tm6QixKEgE~ z18T;l8v$YDdy^8dZS-OQ`YgXuxEUtCYLTHQSD}rFEh3F1kXelIdbK%jr9w2M_D>oWrxV?FMrY zhYjyXno}@A=T;X@16|Fz!H<>tj?U<=mHq?@<3#*{t{*EO zmDhE9<$A6XcO|34YW9xZk-go;1;LZedhz*f$%>ZM+*aF4i{4sy=PP$(u|}I>OZk9G z*IkNIEH;|ssA;sE7#0S0Q&DLI&ZvKGMfb@W+H;6v%gVQ}FVuWca$OIJmH}`vkOHnH zOM~h+haY0U;gdcgIMm(Et7cqpNmPAr`tAod#dxJ3h1ANl;2-fB`ZcUphy>!*CoWj# zz;lEjZ6b$iy|}wY+ULYk?asg8{NIbye?7}gaW>G-Tt=F)UvZ#JS0Xc^8j<0wq?m%D zhP6-9-~dwOBK#X?Hm3;LW23>k2P6#Jl`lg!(=nAxmS883F%-O4fEHS4tQxHc_uHq;X1bF?_JMoKvzJ~b<;kZCobmy7LV2i~jJ9=UQS_k}CA#k$mf__s?QbKeM8Eg&8K{NZ5^rqnSTirvCxe%p47 zyR+Iu-mRv2y&-*gswf<9=YL*W`tZu4n+`rG=A-CX`DWs#*Um~`@aK^%=HPHfl+68pjoKT6L{Eq0LswX$LOfS_lyY1tFUG_Rf*Og>)*%nC7IUX!}&v}Yc)x}kjEP*SO~*W9;5I3-03 z_L))JXmy7kG35CwFpST`N~dE_Brr(I@F=Fdvc#eyHr@ThA~G8pq)b$GkY#nSmmdk}7fA~b54WDImq>W?ip8An;U(99x6NfE)9eWS$+vN| zgmA^v@-k@AIGCI3W?iG?l9l2>}`rFxd(})SuAXy2o z3@9@L-@dX;X)GN@HwMAAr}JG(b=oa=rZ%=*`x25uY?=L=j?SXvkF;t8T6=Kj8gIUQ zE8_FSwlZ*-NWoj+UhOqqOapvsx4I`4p)X4{GK`4_EO~ z6|;WUH@-NwDK$4jo=hkAPSaPUV%>(dZSG8VzrQog=|yNP4Y8W!Gp}RrWhmVL>@{pDNW%bMYV#4x?l~^v&?w%Me%8h{hJSkvuh_@~{ zEb4DpJ`uBT`>wN_$a}swQIa-TZv38>@#Cz}ujf|D(w`s3qD??J68e3wG?HR9Tycrw zM(>yqhj+@jbTFk%ZD_MVSZ{!ZG5Y9Lgd4KEQ^kKx*%l|VWyx0fR*c#yq z*geOVZqW_fZIy);eP1FUdf%_hz=5!KwaZ6lel&DJaCSgPQPsykFvo6puDo7mM_>Sv z@4n#IDqC4fWrjTE|FHYryWIJ$x%~8f_|f|2=^q#+9t}OD2&RY>QFU=6l=|kBvHe^F zAwIY53$sX$a=ue_--*t9(o9KL$6q#(Hqy^__LCJ*}>I&oyJzw|<%>RcyH} zB~&e$Soz39>pcZR;kAml zy!RL#A8swmR>%yVGG~ZciL}CapJPWore8R}2{jd2(_DBuBdW_4xdta4j}^wv=5R!4 zTGF<{>$Vl3Xsamnlg9i&U9QAINuMwzIDM#K1h-vrSH$KNr!Tu6pQdjHNcLQQX+)D8 zjw{dviDHY1z2R~yj7v{opI0qY9rP%-*5V-#Vl_pwe0Xrf+jRj+3!t2G)J+cj=Nm=n z=e9u<#P1f-=?a4rwtd9##s)Px?$7N`jyC=h<%rx%&S?OEDJ2_I$u{~*rj0E*vg8{b z-9GWw+FEqC9>e6&%6i@-mpx6t$xXBm=rIGILu8S_|P6;Um z6qNKG;GA=x`+c7Gzt{PEm|;M!*=x_N*?aA^zQ1dyTBOdAO7BD6F+bTOE^#u#7gGxq4m+hgWM z_1HrNo(2$G)ChYcig4!RCwWr={&CnS>OtuklTnm+1Y=~P{zLU=CRVwZy}MKKHsxCc z(s=44eNE~;D&Jd*`ORfG1uYk1#Xa@jXTm z$@doRW>*l_?9{p}7}kMXcO8qvfPY`uvC5B@sRO6b z{0Za?q@)ITr2DqWLG&+`EPnPX;JhQ^YcWL^0oYiFRqFt%WU=XjpIplkUZsTGOu7B$ zMqx;0gi_N?T(@6UG(E?j>u7lgJf|VsVv!L)WKL<2Cv5U2RaD&&Mx0{LFk(P9;>(^( z#5`52|0&Qp7omWDgTyT#9L(#jZB#&L;|bPwe0 z>G#r2M-rk+`HEk1wzGtvRt0Ym8!5~0?H+%C(}U$fsvqO_1g846D-7J1ddZb8Jv1x< zLGM?Zby<_&n6fbyQA0DMa$gTm)H;=C98vT9bx;JbGBkn6kCxP_6ci05mq5FKxG4g* z(3siAifSX%*m9ej1rSwgY4@_Tv{}pP+sbxcYTyLc3{?`pT5fJ-w~{QH&$%1a9zUna zh&rSYWQ$PG<4TRsG>Z+Fl0DV@g-gItqYLL~sJRo*vlWCt^szB7aZ%A8>j!srY{GEk zolC^`BeaC`u>%5W_5|)N3zA6OmUzu!wQFl`W4n>;*yu*Bp_1b67}I(0Iz>KDp1z;a zb*heR61rsb6p~?^3k^{RT|wC z=Haz6{qA~X(=uaxqE}bj$giQboYm~vr{k4ORMN&r4mOwk>FYS?=p(p9#P}0zqR9n- zhNzgyRoLe1okrPHQufu{TtYV(KBea2;UO3&_S@7O4eZsBI9ja_!^T&@Iz^D6y@W*< z7NU}>R)G!@ekRYT65H#!o6PVP^y#4djnm2>kafQI41I-u!3D{xwVM#iriI5818CAU;VJp#^%xH0ADyHxm`jXhW#8VrwT8|v( zE$lEG^R5IkUJs@iSvxalS_F)5k!kKxHbkc)uDbM}y&aDh^AfBdXbEsw*jU>1-WMeNdDZ>Jms(lGe(oS*Md zX`+DmP^mjEHXIH2Wj{0MKhtV_^%PdPGm`3Z>q*6>`lY_DeM8-~?+SD^Ifmy`I{4Kl z@0`@ivP@iTpKVmwcjS3<4jS0XPevDX@J^ixwyQ@MuO6*eczy(Q&j1;5l3Bh#Af-Ez z$%ms?N6j9t3pgc?x*;N6g9(^OqXljR*<=jjyNXtu$GC zVl}>BjM8pVY{WF**{}>Zt%2jY1X$am5RZb9!gBoIbYOm=)fY*Jw!_is4UD(1?A|pG zntxO1;}~CBI68T8QAm$ht!A9v8Y4^}5ymQGm@`gr=v%zPIb*YCHdoi4KHk{WWVN*7 z#+&fO1++HQG2{7M zsE^v82MaiGhy#<+83|H~zkPE2II`CpAT9P$9yUb&r|8&%GZ#C>)AKk~LCr5Ot%WLz z65=>BEcPzOeWxJyb>2E~v8*$T2^cs{SN#?L5OTLz;0P70!!q4j!RkX{^a%GXdmSMw z{=^V}3ocy`yOAsu&zUQ+uM2C|xX+o5_eELMx|Ke9Z`eu1|G+#9+BiHG+?067c{ zfsOcAeQL@6G96x3(_ltx$xzFv`dDb)=T`b;u1b{jazeXvYo*NS1(U4n-i?rgk9cI{ zI3Rz0jTL^wjl%DHH#YP~S3Y<@IXEv{?7(LOo3}i??*@)u%~y#U&+L}DbNYrBc4phW zQu-CGgBkBb{Zqo>KwW)(gCw*AvR)CPBV&IVGuc*ax4M)r5!&~?ke9;OwQ#wkeZAAu zq3#!q$Gfba$oN`l!CA&%3pb$kz8cCz-)*S6|;ATBDwC#HERl$@w))Q?QN3E4tmuU-rk#sNmZBLYf3i@MpU5f|u;fI(6bUx`rrqq(~k2v(u zQk0YV{K$GYlDGkCIGdhNAHGded0w(cDWmfjhDQd{M;`kQu(-ssFsYQ1#^Z@&b$Y)-#ntkhnmnpWd zBU0Wi$}-2mO6FH+&|ZHu&_ba}mlSlA>0h0uau7KI?N(EMX_kk9iYw+Iw?&bqQet7r zDz*u+CQ)$fvZM|rkX_r+U!$IlFHbZse5V;h58h8M zG05=St!5@1ytW-UDkYTHrI^>i5fr^_ZT$5-#3xe6*we+zJ+t#>sh)Geqp|YzOJBUTzC+!}=&X^qzB_993o8CH0fU+f=Y;Cq`s>4L7VUjIT0YLdtz_|tWACTS?xcNU-NMwM1x3HaducY3#E$w#BE?stT zxlFKuuxeg<6*?PDGGc)VO|_VIYg(r(?VIAyFIioKjO%S(qbK!By6$M!4_;!hvca;a z3DjNVe|{CLH}~-*dUO3qp!Iu@oo}&@QqqslBw`h;Ym7JR8)0^;2^}|TIu+H;p2BPm zKJa1 z&4?BSb#5KCtDz~+`t3@a?dAFL-Q=ptckmpL{QW+CZ_Bg4H7oao*NfWV7WmMenaPlo z$v>dxrelur>~O~P&bGNmj+gz5FOz`Dy4$qhn%u?84dME?la7k&D*H_kXzIj3;WN%D)B0Yr875@TkC07=L(LV~>a7abjm3VAvLw z3@W0(Uuo9Vtr2HY?+)utIU=RVJ*X5jaWd6YllM2x`6SgakPbbz zM--wku|WD<#8~5%)(7tln@S@z`75p?-RT!h4?9R_LOTNhSRHoE^)Q{8t-Cd8vy3Su z>oENxe{C&z^U=BKgFz&&rC~|C04`@&?Mk}7ll6D6Mvc7n3_H2C$hRGl^Kt531=(m` zf^H+7Ya1UlaE@@#=_bB?Q@C-tFz56#0+z+vYB^99l=;b4I#cJDTpI^_=Wo?zZRGm8 z4&C}HFJ7LXpq4e?hjB#tRAYI^x&Bm9*{d<%ZJ^}2m+ZA`VZJ^K!oaISYO>g_Gz^SP*|5ocH)BNL1SJ)BJ zR>umxYhzJA7^rBRX-Y7&bFqDyXnXcuu-L1tc5_XY`Xk(hv~x__{nfwVpa>}M1t|ob zxmf7!_Fhj5Tw%Zviof=lHB4NADMgMFdPwa zktSy2GF<4IgdupPq1906TDdKp|I1KLz>XPYy|PlJg=^L_6MX1)_xZbtmFa&DobF30vnTugc!wZ zLW+UTf&8=W%TqNZC$>>d8F;BvByP%pNynOgu?LV^ zFEZ}mXk+_rWr^4GBT#hrow~%O(NwQZdpyDw!#1n;ch<&Tk}U1Xi{BSt-n(rlxT-YM zZ)16v*_PV|GlZw4q^$U&>+H4z>vJv~T}4@iC*S25ZRov_@8+&Uv%gi%@~xf#OLe?) z?UU;jNr%si)9q$6OBAe5CW!iv_I}%O9BQrJTpj!Z&d=DCI9VO@Uv5;Cb+z^K4mbYF z+kWQ#tIGAeZA1Ce!ijZ7j)cY3#s@vlqFK~{@%5Dq0pcd88zR%i4b=SBQv6>wVkFBY zvBV4JBeu$SQ7CBaC@y}gUOhU_KJY~%pTK6zKD!)3>l=*y5D8WBB@`6SPK`#Kvzf1o zwJU{M7%&(ZcL|SUO$@cw^{B^(lIr&V_JZgixZ22Xe{Z8 zD=akeHI##l@5j6qAW$NL);;cTP1l>wgPL}IIH&H+?3~5ft`y;)SV^5*9vt?bov(8H z2;~saV}FvZnZLxUC?!pUgC|!4*ed|Uwdd%FA(XD!z)+%l0wh_8Hgn&w;PFFRr~5FK zd6Ag~*F*pBhQu@s>H2X@ASW%^#3O%J(u9YXDZDNeP0`6Rl5bWPuZN7$Y9@}ygBxc- zwat-b41+0j9I}!~5NB)JyzVGrcBWipAs~(7vn@d--Z06#A-Eo=K_E(MPl5i6>075L zWT5&xGAmHdGke|^sn|GB07Tgn#C`VZn$=lR48=k#@%qDbq!DgjZxuM0s67%bwJIB4 zrKqWiH^jMG43NSd>AG5Umwuuldy*W8iVsc<&Ot7*@k;MI-Dm;0wt^;lzZKW#s`Jb_ zx9nzNyN7)n^cCywNk_2N0v zY11LJiD=)Jm+zvk|NR`l$mC_o;me0#KNY~ed&7a5_rLrv!R4Z2_wT{kiptEQf=KH* z=;1=%^qxV?D%mHIz7G1xZTH)|BoBY*Ul&y?fWt4mupZhQvh-nR#Vh!0^42%!qIVRG zlo4WOYCYLzwO`+SZ7t?H+TDUvf!aGu0NpQ>$TrHt zbJ~U+{({~Q$uE?!^ONKbLGi^fg%x*=Ot4=Jp=>#_@l#FcCS+I>z9*&JBeLC4;Vc($ z_(b=IYpEG{DWc9Z8^&ne*3!gI8bW;k^CIyrAC?;xS7e z5@Wgmpe(uuaT=^+25}6ak1#^gvr6{BL9Cy2N~?NqkIbOud<=M#n&i(Iuv4XeVYm|j zSHSzjJrU`u<<sp?TOL&TRv z%R-T>=V10>l_NZ!g3HK7t6U9!all{{fXpT^EQ-$r5c=16nE!E*bBy{7$mPYJ9&cNu zWZsg)T(*nM#EtCmQyoMTu*V`O?~=vS5kr*eFyX@RfWohbPFW87Bn$m@=xZNaqY;!N zsbWnqAj?vW=hy>orpzDwi~9DsQWKbtgvebf+L>2l!K+;pB}1>EWJk`eQ^Ob%MC<_c z4w(G?t$)Vj_A&3bIEw(4y(8IY7TR(|S}x$8Gu;uDMLDfs(k_x7^21>D2`+U`T2Y#0 z;wJyRn`TWDFZCrr4on~wNH!A=l%RinjnumYGID_Bds$h#NW7cCT3iN=afcmZy^&dZTK`0vPweRtBQ0)Hf3^QUM@FwTezlSz~h2lU&j zPu49)Wc+`V5L=j!L|Ojk5*UbA!0Iqcf$3gT*|#)*_G9m1Rm~Aq3($UF((0c{(WUNo z*xxR6Z1M|W0cy5Mo1A|@rU%mtA)`RyeEgfsz7@AjgTH09HiVcu4R$P!lwBOPK+A|- z;C@|c=2InsHB&KE){z(oXmzA&^$YG_~k6Jr>gaswvGiiFq0~YU?L~x*^B;EL>~i18Qg>f&5Tyk zigHPyl#A&JVGdBuam)9GIxsMELl_A8ivGpUW*r3<=n8Q9m9Wk=MN2(PWej_$2CC)^ z`}-X*?1OBjFe)4t>Hp!NJgQ0kCn)g<))b*_nE8+dUcb#kjqfnc^$s(&_`rBg%^)%&?e^g{6d*!-@%xzgs!yw*MTPl~f%gmV;g)ZNH5C zp}ew^`ryGVt4;4YMN;iGlU?4(+dpe{h-+cdPb!0s$4JEwXw@AsAe8zC?Y>$4{H+9} zzy7?2-fsUNqr}N!uyFlIZltfE#d%K*24vN=Ys>9-%eVZW5eQo6T$-FtQ!iUyr7{2J z)WT8tulc+$d*q8(`45>B5=fXVKSz=TT~%OyX&)2H za1YzthLbRiiQX6qhD?=3vX>cYfdHH|syiM3fj4-!TtakKF@#aYb<5+|gsUa8?3pEh3 z9BVp(R0h%=LkE2*1Zpd6>OjmdtXdw0iXOf+Z+nFGSq~&VU|sQuF@CO?0MxR8Q$eV! z2Sqg_EybVR)d|CnA?(TR$Fe1es+8Qudo@Plo|bxCnR2~J&%e;A9+lA!?i4I$nm$*; zF_-?ZY#%(g0)~5DF9L^wfq~w&#@F#1UQA3@bn?kktcmYzrU5VrK&h4;eyfWOVGLLd zBz8Dwh@fQ<<%!>mkWiM3bFB%nuSrPK!6l(g>4^$gp@p$D_xosej`@I=t}#$&!;o{N zU?9KS8ciF;!C2ck9`d!+?Iwq``h9o+Lh20zd=Wnc5hja*=AHen*? ze|?a)0R|UO!J%{NUwRMK)B`OQltVUL@lFU2kwAGtKXc;BPm)G-gdZ}3%W7uTQE3Ci z8SK8j3inGnPn?dic|*(K%M}(j4GfnaiVXO9toH8tNHx1B97CxEkQ-2C|uwVae?_NH7fVkEo-i?kQ`!m~zikLb`9v^`!JTN&!crq#}C*QBw7Jqym}O z<+sojrluTbu^egaJcDNzNuGgc9YSTurNA%}_GAj5XWxG8mRB&RB=H~iZUNrh=3=T2 zIemkbmj7qWT|@hpO+YR5t)^@w|3J_EIE90-F8{sK8!K&Jl_!nQb+OqdgyOu}#~?YtHGi14!@-xq6S zrSJp6qel5-VR~9#_%&je+~LhFqmNo~w+}>L090jGld%&V_M&_U4AdV`Nz^U_e#%W~{h>`ty4AyYv+q}?#2-)*lc=oh7;yUC zlg-U9aD!L`dramC9&Juw$hw7(Ta~X{TYx2#Xhcp<0qDw20OCIn+o%a^COJ@(L4{7K zoHU+5%>kcBT}TF}bti!5?Es8O!K8V@exREdlT~qg<5B4`B*XJmpP7|h;s{N&Ygo$N zY)G7R#PY_t+(6G0RSaI7kSwZD3d66RNZaQh)#^u&@0AF)`%?RPPy-%f1!t6h zK;|HEtk{3I<=Z;e@%umhVli&a;~&(zdx4F)O%9J@eqtS>f`NEi=Kr`->Ois~n9=3# zxKS6!s*Rh``GZh`*2D^fr|MuPy~quH52jUq%M%cIV{!py)U!%5GRp?I5IR~L5*Usp zO@(c~Q<}(E{U~UtFF);P>u!!?V^D+meJ=C5u1lRXCt1_M_f}IC5*Eq(w^JcfRIlYK z*+P4MtWofcFf#qjjj-aRoGy<= zpi}&N`r^=b7oN0whVol(z|HwXp8zk$ya|f2fQ4X5f0dP9rKe%RdMbPxWlVwv>Jx5~ zw3D9GK#nlDtv$*aoc@;jVYv{K*^ju#`2sIxh9R3PtSVh>(8KB>VqN@<>Gv1BFZ#%) zSen@?e)m^j@aYN2|5}_t zog0J5<9$cthTeW@3!&fzP4xSEN62J18R3`7n4Ir6IE5-&HI))hXrVceiHQr*$2-(F zWSOFZ$L?e_i#6~owzmZvRsa!A5%JAfby?L9-JG~FP7s+2b2idB(2I;z(bGaD z7G%cI$^AyU3o>sA;MChxO(f2%P5go^3(DdX#M}Z~qJS>c||PJTP8FEeJ(`vJJi$cCjsZYYk4fxxz-2oDUU^^qYruR45u$)7PdrTP)?f z8^i{`+G|Gd-t)HX+#7Hqbvvng00OsBC)uQOs^u;m%3)zt8gA-T4Dt=fm__%#@H3c9 z26Bd~!}g8qZw{heoJFKe8(_PUtQps*Y@9Hk!?6;gJA4#Lb>P;k?uXqH#g>(!Nv@Sf zl3ln08NkEpPQ>q=hj|f94gnsK?7vKB{QF_rHgBw&*sr`N`E_q3Q1g4>3IF*iV*(m9 zYx@O5O{y1!D;80DAK#_dnd+xJcgR;zn5@JyGw?|E5)KFjCpN@3!&Alk>mm`dk2|R` zs*2N?1$(Fq;M&3EWa^H?j|9I*Q7i2bc11lT#f35*E=dEWrRLJ(R8=Rble? z-FJ}T)<4a=k_*WWQXS=jSozE98eCl~C+3!x+jupM(X9mxPxLa&YRVFzFi!L$ML>{3 zGw|s_#J!j3@TPCiI|T+H^-GMy50}*E=>ea(@POm6F8A9rkTwb%h~l&Fp^bZ8=xIt| zKovoTvy$|xQ190Kp|;xXEc4cw&^7-JJh!L>5Ct(VlD3NC-pOad9)ROp^6m@{L39ek z7T|H6cX0L4O!#p1`&X}rN86L6TGF;PSB4u{jHR;vIQ6v)x~-z4S7HEq|=M4zE%g7-sCuQ>^#{ z?*eIQE578ROk+w==XS$~c2QBE3c*6YI5pM++41k_J9v!mXv$MOKJt4UXzoM;Q%Dn^ zJT#+MD5GW7OJn~w9DZM;aKjz#TMa}fsj-790xb!yc*^Rs1|a`BRe!$Hd7@zY5~Fla zfi1aO@jMh>OL;$8!^WJi4hSV}&(xtXr6z?b?_kQOn5)XKru1z50pTG6+zI(DCp;-j zdT<}9u~i%sh8fXMB5WW>cJ9Jl7}?@gmwkrm)CW_hminBk2Y{hI^jXq!p;HOYqHGAq zV;tklXD0uJS_Ys-7Hb0XK>tSv_R~#6csE#Vl9q%-fTajdOh+{9 zO5LTGL87DN<_WeSn@J!X1jnV;7di!MthN0C`TR2>UTb>olK0ZOx*IMw)73eCI!-MV z!fF^(Zp6su*C_75tOSRzru_D5sR)WrW2ZUo~myxA&x#X|!#}FVt?Daf!QkI4>UUfY@_Yh1x zOgMHz8IJk*R7_EEmp@^P8pvmoD5k56;0u_W8A{vD%wt3UE7_`^9 zufzNuem%zlK~UZd!c*?`E|aj=#>zs}rTZP&Y=qGn;E2oR+75F`+Aen>JkmtFPaCW8;ef> z2=ET@SPy~14q!-Vu~B4)60xlSkyUzOQDP|M7H=`Y9STzMW@wYRB%~({86A0 zbz;iXQWlb;u?wEb!U~8mDYA`>bNFN2ejM-(t2qw&WNJai9u++uzJpNPy@S0^(dOK{ zv{vpBjz#&2Tqr}+XmYn}n^+-SpFbc>hP{BeBz*fKUTZ-+3-yJ>PR%DRT%s}J?qKi9 zYQ$*xQWM{#R6z?!;MzF(Zi^zTI2xRY>8PiHM=%;0!Nl6tN*Ax&PNe4=gU&eBw6}a0 zW3UVkMbdHDbGdRCvk$b$QdqgUw|_v#-!ks$4=|iMZE`6N$|)Cc0=CS*)-upD>9iVE z2l(TER1K+*0g5YF5U`yTh|mt6H%V^|s?aZ*zbit}d9!`CG$S z_O2j#?U=TZjPH00fZ2V}&WUx+XbkISALZGsY2Izb1F@(idR$qUGcxQJ1W4=olaZU& zeb#ggBRt@0tTdC>K}CDFZJ|P~^1wD{omQoC#r=I z%vsYZTVQFOiVXx%3#-xwvpS`sBq3dwGXtALm|4g)fEYa{seYoUC}0h(PXReXGn(++ z9q0)?k+$J1BB^s<+ZcK<6~tKEHIk~)MOh`K=9LmN^(&6aMjvO-1CV)dE)Zk@K|to= zrM+ihoF;8H12LjFLAO)h6FoaQU^1s~Ds4^$W-O+=2{T1lu4aa8d|>u)0s@}sX;H|R zl=o)Ls(g@7^o)mDS_G6CVrG@9P#m(l{Q^+(3Tx5?-t__=RC3@=!c_y z@=N1KGhbK%!xS%fbsH2*C9~Oq>Y3WDT{4#(4E#qZ(YIqM$H50a)K2BhU9=SJK)_&y zQx0EG(HIp577Id3&@27;qNELa2HLkX>xuU)p4|1!2DR+Z6B@)_=YBMa0~o(Gg5^Bk zM|8f`reBa_WTDDCJ;vI~)HkyPIO1LGPipN}`U_N5*D*NBMXPP67z>MZd+ zW`J({z-WOGI-Nm1>=$4L%`%v`KwxCvsyYdS&m5areZ;Cd1e6PXNS(m`@OnXuCFs(0 zDpjF2qeOEHn`e243&$kRNx{Z|d&{brIGz!N9;5VR^j>_fIP%Kb#5A7EF9%s2?eyvr z=aC#g_d>>#yMOeZ+&#+Np4w`0@4oD4KUx`<3!VHyYgFS0Q~fDR**Z`*hPk1^STg&- z+UhaTZ*?lK54@g-tl%YR$KB{W%6@T3{P>%`Vl&ZE=mkC zi?wv_6rw|xcz{3_RQ2|+NoD_-TU5qA%03z=-%LcQ%}e)Vo#b5H;4&JkGUEq*?qSm% zHahK6gh4i{(&rZU)Z*-LZ#_#M5=TiG9}Rl@Sy8Dt1u-fdfzj22puY+mVufd}Cy9h& zkoW36a`){s5*Rurmu@$D{{vWzmn?HZrox3}5N>+K3nV<`Q~_@wY#ua*B8Ay&-5xb9 zrgvU4Dp(!mmeu$$$cXWp!Xnb1^BXcqGJHWD$509#-iF%wQ!8 z^Ih-I7igTP1X5TPha4LceNhusy`NY<=gW3do?_yXiKJ&2{Zm+RcxuOd z3w3FiJ}RaThM!-6ou(Ix05Q)88^7RTD1tV!Ml?;069LmP+Sl+kL)Yp+n}3~G6v5Qq z7PMJqA|8u?q7P<*W-KcvKGW(@8)VP#fiyv3_9wu%wuU|6zhL!H3Ig}9e0kLbcEj3p#q`!Z{{vC4?6Z# z%e>_n%-!?!l<`!sL4?sknm5cPyD=Rtx1Rs53umlHmJsa`#a4LKS^_{bcc9XEeVrgt zW1&9frK>cpx1JF)!FlBlkDvj4Kq(`vVG2zbcvS)si48^+LjmW~3?(4UB{=c6Sy@fZb z_!$86pVmKF;pKfjiuXrcGqTaU;QJ%)PAl(BlAWThs7J&)7jYuWn1J|i#WhG)8qHX85%XD>O}RtE!?7LPDV3XT-QGVP02Kq zA`7xe^Q&qYDNMT|J(OV+$eB?X2hz&$D6dtZG`I1HgPcac%S#jRHBTHzcwlja7(Hi@ zG2m8{$3wn$e=?)y!AMskH~EmGXj|#JjkWXZ;g1(spDwsJCW=LeUGn7k<8Ey4=LG3J zI;~bS{Kxfs+nG&#d0t;cV!Yti_6Cq!%EFxvS#QeJt!=`~j?pWWjl@j$FCI;z?M zb5MMRF}e2!GP5Fg|3E<67$7KUXgCB!C>VriaB%SOFi;?97z|i+G8QFFA;Y+wnx0cQ zQgT*h2mh%pEO?4DY-ToLqlDgB6;;Rh#M&7VW2b;z97?sidfYdP&Uw?|*P3JQIrijM(_8+!swBS*xc8Xt;^pTnrn)12HRh#1Yzy3x(QzOe5#1Vj z?%Hl?6F#|}UvJ?@ex8;u=2$hEk908O5v%!)S|n-WL`=0)ONQ@pWg>z5j&rRAM*eFz zJVSb*iS%QntiP;%g+Hm^HGTZcl2Fr7h3+a{r*FU*J%oY&G;d!JZHzQo8M&71~CkHTw@cjZTh;N@N~fq@Q+ly}8F%iUauv zFlqXTr_o`ghkBIp0J=5GG>Jq!9aK|-g%!cOz zAXVtADm$A~DVwip(x2CcSKs{ij)MCI`?`?E*sNE9Tjd23WVO(0$^B=|o2H>M{qbAq z7PGFH{Nn-@pxUhqdu8T9x&D`R*u+Y2p>g{?vb^~>~ z`NXB?Y~OND1P))${LkIp`+W`%`qM-0yU|YDUx!AxIKSn0W)k?QEe&T=T);1+LY4nH zuo%w5Y;YIf9p*dHfU}kxUW-f9oEz5I=w2A_usuHfetPI8+DK6RKibuFcE|;X(b`Me zHqKUiqECo3SP{{!ejq}eaGbS-O2%c1%Jb1nFw@g5qFooM+gA6|vd2g@qKHv_TM{S<7?;3X-q$oZZ%3zu93f2{@&18FhKu``OHt6?edf?la?i>*F zM})HM^5+OO&AIB7?P{N7>OMX;VbAFOl!(e{qUW*2kB}%_f`JBxtr?2iR_AhRiee>o z12<9)QE9(6>K5ypjnZJd*F=_mX8DWOIK(@z z_ASF4>&Z_dO!gITB+{X~06VE3$l+Owtzfu9zS#WBLd_*39*5uRm-gC#(V1Xx+e{&B z^>$YIX;dW3TZ0I=ASA4J1J#;WK&X{J$msVf|4SIW&Okj?Wsy|uX<&XY4}6SZyR zpDX^areIqk1o|S?xL!xs(TiV%;^cW8%FuGxU0ljr*KN3#rkUB_s^|gvqfx&e?r1!? zEuzw9sDAe4&{nHPuX`)>>dI}($VO_+gIqIVrp3rc@{_POBWlXWT{9w+qz2CV1dHO@ zD@tCkr0!RYu8H6;_HuDqCN~}(A_+V(L@GgXFyQZ$It^U77xi|B>$$E!oKoF_HQ>-h zW-I`BC(t+-0jJgA?j+2mvNy>~g)n>A;6r5j>uSxU?ag)y z7Y(frVcSnRoQiTIj=@b^!YijaHopN6N~7~0o3ZP`p(5M$hSEFyR@^81&|9@*2HPSsZ&)jg*1qh!b zJ=rA5r5$^p`&jSTzt;=zplAZZtMx1@5jZ24QWw$1Rm!;kJPFTyB(iRo$F)dWOl;{K z@S{r96rtl9eri=%$tA@GAE;n0=@4dB-o%Ov@!2R4sSM1XHSm~f3FJx98C*DD*!7EM zO$G~IyA@|B)Y@5Dc1pVL8|wW5rCZ(++8IfBhJz_}8&@7L{9ge5B#@|Mr{mDFR(Lp??|jn;!>ek;!FJ*qj~CweC?D8Gi=$ zdHz-fhe4a4xUq|p)7E2KT)m6r1eBFry^GrfRQ9Ms$KPsy&X5NU3&VQQP$(&i=cYly z@%*b{mfaFcL9yYmE*?!~#x)8lbDjN9uBmX0cm$=ftjwEBW2zm8*K)800tGb?LjmYtV}aq}P{;2c(*(s%LXo+Eh%#WJ!l79>cZGzM*z+ zQ>UG=ps@AjS%s1(;8@P()DBy-q;M&&SeUh^R9|9~$Sh^Xc%IR)NB25)pFee`&|FZD zwl@3z%l2kED?(?a}E{zx<%}5j5h~xQfpCeL-CZI z+0#R{7~ayhNaM;hRGu|ErJ@aI3k;2CEPj$z7)I+E>k{>tXS+xGR#X4_n|$gB;H;|! z_q5#>!ZcvPud$b&vj*KpScj&n2Nqh1Y4}Ndf8a?tUv=>u7fa;Z-sb1ZV_`cmx!kYV z#NLFOJp88>x$j-RKECSc6<|Rp_B7cAu^UORie5?4-th&V`tesn=~DHh3&}&HQHNrm zDrD5tVdjuwCmX$OrIXg4!*os@!)NiC zDGEX@Z!6=e>E5+zGtEaf;P>t_dyr%>KW2?#yb^2bd^9YUTWXXjOSGvy&7Q)dG4AdKgb>9c;a}HhU90b3EWC?&EJG1f_r>n zr*R{K3tp~Fbf;V3m7!eCXL8wc9&p4~k?B*)4vQ^Mxz_7d;8}@|L93ffk%-#R83Zk{ z*Dl%4dI`N8`)Myy4;O6w>I2m}`E*;|RKM==x)cQa3oYt-nnQMjE#XW^{Z<7RazaS` zrn-I5qAJ#8Y0!x;9ah6_vFJ1940C`oeEnd;oP&XzvGtd!VYtIQ!&wZVjO>9 zLU8Tw!v5xbMaIaLw8}=%g$=e-Aj3*vRKZ%#u%WO>dTI@y+k^@^MkqazTTSUm3kO<(}n-mpSifL?Su{jPAbJb~# z6%Su0XJRcBy!IHGDuIe;#yeAo8ViZ2rYEel$vV8qP|J&eoXV$^td*=*AFg1zjfB6_ zH~qI4<@momtQB|jP1y$(7R9k{#gPzI)||vXs&};c;~a0)?A1j8RTUGk^I}kYL?gle z=dx&x8LZS`b-hf5gGx8JsgRf`oQw0&LYny=zJzq)cfh0le>DyXeHKf!LJ@Ks>{KtsNt?gLGC`Y1Phicu zoW=@o!0_W%?M6kDyjW_^Vl$Id-V4djguS(Qt_aqe z(RKEK$7vB~Kvxlj`p%Vmrv#J>?S0)u6Zn1ya2$`@G}Pzt+5c>5j%V@I$`4x@r=13P zIi1|9yIkE+#gvRuW(+VY7UJNC5tHofjG^&Gvn#-pZTlcK2fJ^l^Qyjdq2W7J^qBqh zqeN(5IdG!jS*G-JoPa?Y;fA6$ z5Z#?|%UjsVYz}Iv_SIY>oL?jYHd{ML>4Q${LGJRO z4LrO!{PZJHthvrY?R2uY$e49Y6^P40g;ln@Tf845{e(DaTQ6{ot=R_o<~~(^=LBc# zd~}s6Iv95|N%LV+XG@>D$r-y#>fuowWRvIC*7!eky=7EfThJ}qxVr`S#tGWEJ3)hn z;O^GA1-IZ5tZ_|n3r=tg?h-V3kOVzg@-{i=e)rxt-WxEQz3D%DtyQ~L)ts|x`F5UE zjDW|#pAafJt+;1VY!yaeGMmYuztHH5B;@)(Z+Z@h@GW3V;F0fVL`9wGgRdABKkJu` z-c>Wlge49d2wpn{VKhw0d@INIWcFX^g*bZisAptH6G|2#;WCHFqSI)?12-WIm*(fj z+T1*4=)5jM8CGlJ!nbVYR^D%Wjm-4k&y3eFVsLC~fl)MPQT34?#Wb*@g5W2PQePa9 z*@T`1`!4B~F_RwY5n@X}Q6zbnj*L;HCq)U5wIUwLpyb*OGn;qxO=ZW0y3_=|35_{= z*CUz!|1%n{7>XnH9M6**X|-X2zV=RHM!XbUlm$MNDT0eq_M69-K$32Vq#zc%+y=4j zHP_8UDdT$sh9koFu(kg^^0mRs(-HEa%FoK{D1tEtu5dO ziT~)BSS4EMSIxYj;Lw%uBi7p>j@TfVM`uWT#sA28RW(!Uo!j1`bg90Y-%Q$W9Y7R} z#~-<{sXLt15;V9i-OsTH!s;ZjmX5OB-wTLBoJnVLQ_FA()^mH)S2tzv3affExviNd z?o6R2IhVh5`Teu+WX|#h1<_DFlle>C{^8uQ<4#6Fl>eP~;X0u0$d&0+N#L4EatSOy|2q#IrwywL@9%+^B;d?$2j1rR5P zGZ^)^eLgnMO@6#8io^ZV=;~BfMT*FO$juwN}kx3ZJvo%&hF>WH#WuxvAJ3(KUAy zns+sP30kd+opXkv1Hy@*tCf)W4h6zBZiE=MoVwe}PG?O9b@7->vjZJd+$sj;wWf;8 zVeUK4-e_KvmQVu6iQl@X?KLwL94d9TDN{OU6xy7l4JRJOtB|i&)@puXcqmdOQNJT}H$LreHcbv>k* znk}`>UQvHGt9+Pnc$BRkJ)QGTl*THVH60)Lg0;s-_B&b8cG9x_45ihiNGa zK0GXnn4dAm{{9lJ=9ff#;B+o;$b?o2p6eWgHEWhvxT3HF0vk^gxzp4^p}`~GXjJ8H zd5VX-rZ-@`!s*%2`vkVG%tC7?YLvjhCAYg{ALUjSu&INmU-gA#XrK02oI<)%cx4UwVhmW@V&slDV^1SaZUZzOxr5dS2T0bzaL)=p8 z+mt;!y=4l1#I1jec_|_8YVk{_c@JI_tu-3}dhoTT3shtX{UaWqt7p z%ABhVWkPb5J(e9g)B^T*2(StMz!OgIzceOj^JztzvhE`PF)8_dp}t*c5(Y9UqWB?_ z3i6`6wy>$(D#t8tgSZIpKWe1awUNqB5`Dc=UB8Iia7Hz7zT1kA>A8D5o($u%bXF(T zr`;>`R$Ucs+lkuXbL@{j$G|}_Ci+MD7gdQ=wbVwzxrTRz$UNmS_H}XWJ4b9M)fPf` zSe1%($1n|(rmhO?tvtx8ZT)y#{{0q|H^hsLd{SK(P1cfQb)M-}$fn%o+J zzt)GIdQrB0-H5>NE5@8RwcTE9lY6d@C|!Qu2~}0-T#H&E$)rEo1T{fa_W!~b!HGPz zDLw?xFooQzb~W>j0#ns6DKr*#H>VeVX3Pm+wi-T}#*+sO47sl$3kylI4)fo!6+2UB zwo!LbOockeP3~oNgfH^!G=9t)b0=mePGA|b65MTn>sZN`;U{AVz-WPu?RUoqh>~4@ z2N}K#Er(kLh8YTZ+iS?m$#X!2Hw*U0`Mnptkq0+xKQq+XXFn&_JZVcBVibJgHzXyn zB+(Z$DC{(B-ofn5)`$0bBGo{k^0$4@IjV}9@&(gNAsx?3b;KnVEUII724_7|=6}Im^YbR+R%J;owld3e|Z4OhYH|L_%v14PTc6K&otzKIIQ=wgGRX zm~Ep$k$QfD<^;>5I=}N~k;X%Dtun3s{$|q2m8F=?w>CWgB5mL?1CNUTLEEskUOX~G zTd1F5xBt+sF$L-f?Cr!p=T}0V71b{VvMS;i0eHcc*03Q_+@3zJ2@|NechxTs_Q?5n zx;uu69OAz@z!vStvya{sJYL6z;=edp>XkjEHzQwI{Q2w_%IjW|z<1KS_f%78S)(_F zvR~)w1ynZ3Uu6Ff?V8_pPhULKLDvRcZM@z{SFG~)^@e@@Gn;_@UIqGOyK`V zZBJ;@Kgp|v@*|JUC|B5SSToJ3vX^>*iQbCj+Zbawwfzk6t$ThjEX=w8P1{-|QtUn|{6Uc_I%dL0L1TpF z>nLgLiimOu_hf`T2wEtU)*jb%Fd4TpX@xz@7#hK&GBavjo$*5z_DfG^eQGF3naR$3 z_#nQlGDZ_yyZXzDtVm#*Ov{SkuJVKfd@Wd65asKh00G>-dMUSIS6yOKx*KyFq0-IXL8}P$y!15YM1M@~6^zRof7LaaZlTuKPP6!NW}jqi4)v3ir-=p zjzi%;jY4zYH0GkdVN-s3u~KsPjo7(#k+Ncy*o|>LON5ZLWhoTc8o*jT6@j_D~*P^F4npGEfT5b!I3#Pr8nE|IVOZf4HtaY39mk%(;VG$L@If&%YB)Y+6n4+a;`u)-$=6w;AYZ zx2>DNQoyc26tbyRm6D|@tybsA`b!H)XJh)e`K;`y#xSFjb$O=)%EvEr(a^8lDpj4q z-=5(eyl+JPQM|gO7aC2CfDH4tz8bBQg>h|2IpBWg99j_Bq#L8w1Mu ztK+Ls<+B;H-m$6d9p*Bd&0b}@a;7Z|oCtMcHUGO3#3YoxAjAYC=yJi-wC(dJ<M3+l0#$iZ zC~H%q=W|T~goTt#Y?_z#cO{dMd11W5I%H0`j*aNw)ZxM}hKp~)M{Rdyyli9~>(fq= z7j_nt8f_QwByUc2o#70XZFvcrWt>Z~+S4G%8fzbcOSJY3j|cTiyWH-LV~UlDLB8mq zw;A3akM;{E@)Z1BETP9$uE!>f0sA?Sv=u(K1AZS2b;SQ+>He<^*%Xbs&4YY{rx(-- z9qE15&s=#GURvDKLJ`#HGK(B;nfE@2^(lAn8EO>?{h9teqbg-NKIF+{sQ_+u%-d+a zi&bijq6O?ADk?jLSPJVHin;pi$}^oDB4YutKuG!c-Gte2#jJMkYz_085YEf&M_{fg z`-<20XG&$V=Cv62>=ru?tPFg#SNcUqWs=1!J6-fCuXk`!CS-_}kB(-;qqL30o@|ue zck=5hCuuw;cx+wzxtjEm5@Zf7m7G2Yvu z`J>polO@0N+Sz8bxSSqCB01y5I}G&ji^}e1`7HY3Avvt4Mb5L^?{O_T_*Kwcb!JE3yR1 zr(J>E%2P>b(@X`72GLJEZSyt>}4PsvloeUEcqW0tUZX_?yMcrr7cbk z%VC#}`X4o)S(sF#U!vKpwzL$z&~T-zDkDB+Db=XVIo9v2E?}4A5Sfr^4ocoDIMCSN zKFnE}87N*Ac+hze8EZr97kP&`isg_}PqdRgw_g|&MP45KJaJ|VKXXTCg$&_?`fBbz zt$97Nr2`;{(CA<2v}E+HF|=M-63KpFsX*D#;jh#KyE~5vNS#AA0qVWa7NNR4&}e4T zGat56Y0HyAgh@*SE>foWHE~!SB)-6xRG5xgVZ|4kt&*yktT7QH!%C_#mg!cR!}<$p zo50AjCQ$JraRSb3XvjeRgVUYSE_ z@$8Yc*MJ*s!M=r~1Nj5Hg8?tj_-o49KzIgmm<<6@@H@E|6Mb(oA3uW_7C%Fc7zN`H zj->)}$nb>nMsu)jn%WYQN8MK%6>t=KW6>fTs zXwB9xr}t1z0Zi~{N!FCRnF>n;R~cbnwrqJ{rvh1>$bANL$TN$pEhT()UZL+hpR+>L z{yGKHvZ4G-_{s&X=*`I-BZsm-o};uU>yB1#VLl=9#x^qN6;1V^i_-F@JARDuzc z2zE4sMz|Mw+ym+4hletb4=g!rR}-jZd)av~h@-w5Wj^VkmZkc@l53 z<7Te6R7T!+H?gFsFp;D3dI(Tts1S?&LcBiHgiu=%nBAx&8P>r1CUv&M?J)+Q^-3xX z3B3Oezc3B8xnsikS=^-XdJmT={^NK1XtY|~TABiv{Qv@g8l7#C)IAqOXIf*VAWkGc z#gH5!g8wyqKoX)Wg0w*{?Gf2@Qrz(GS|D;2oxA%x^q?Oyq z_Wwv_cjH>uhW~%u=#JGmJ||)9z2sWEtilRpZ6^ysEc;3g2$ez1un$vaDfpBI>VH5H zhi(i9d@D+EYZ#+bXp!c)Z9{GxIXn&pawS*cTHyZ3*#iodh#q65B-^GW4kNxX0@W|_ zsCee_*wKpN!|zPx$#me;Uj->8zgP5E*|Yo|HA7CaqQF12v#QEzVd%~u+HRjEU9yie znuzgGA`|oDT0Nx*A|Xovo;6MRNB0{w7d6_Dsn;r*QYyt+2^2dQ?viA;twor;rz_EM zbsI*`U?~M7lL7CiItqpk_j`R1#1nxrY?~qdr??TGaY=D%!Of?wrYN5H`b-DG8OLvP z5jcHU`d`z%8y2i#K*jf82Fiya*RNCw;0p`U#}>VUle)LHSF(RV^D#i>Eje`aD9|Ui zFf0oV4On7e8!;e(EMxt z+3{Rxg4gCXwhrx0*N`u6VJJ_L==KIPTGDTe>c(wpa*F$09N~UnpfYa$d|Up}vjemBIbV4nT#I(B zm%wj>mMX1!+t6rB7Zje|$>X`}wFmeCRpla&z{^0tQHzA;){E#5_iaIo^UWzO>oW~;q z)AA46uhNAKM*M;>^Psa$jaRQPRvg!)8Hx$=?g>syI`lH&AD?ff%E zYqbB-j-~IYjoj~w8l7M)pHBDI8X#h5K#I2@<0+E!CBTeaiD?btQNps#f(ADSrWVN* zA=oU&;M0!`>;{6HU?Q&vHrkmz0u&RloM;nY22(iS$GhT$e_Me@&-gbOV1$L(5g;0% z3Jn^)gpZLOHy4E8;pOf+=(y3RIK?Qm3#8e;KjSFw_fB?=!8chApDPTEFRTli*H84S zTXZ%tFX*OvSFQ-fdD19S*T0lcooOoCzPCn^&WlcZzsuJZhd`tfp;*{e(EM{_slHz( zTTwi!cFIbSKc0Xg3xu=_>*36E;>_N>@z8yOii#J|q0;SOYDkTD56i{wIC|KgM!kga zP`sJKtl#gRxB|A#cSa9I{omRN3QK{bt5Y90k#3;H-;k|ej9;G1#`rxD5tH+_W6{>* z6jP&9)qXr~hhDI1)mU+S0cz$y3P@6SWk)YbyCULBA(BfW>PwAF&voh*`+nloQ;>SM zdleuahi^c^CmUpFa<^x645GHPE3E&>kTAy%6C^{V@s|;mzU1MtLUunefQGp?u1IB6 zU00G>vDUVP7DG7DMFn{1Dc~G3w`8*A5lO+V(?+*V-uX+R7w%4z`?zM^XLCwv(bcnV zM}oLhHx{zECe^jHylm=}zH^p8i`ri*4cc*4Oz)a^8l_oFMqztdwcp|PT%ej*Rj3rT z=8Y>1`tJ$duA0Rhja+F|Z3}rDe&@<*!yb=21AuJw zfxhU)K3m2WSSfQDcWFR0B8RN)s%bMw?myh@e!`u7LMu zznDhajo(~2j}ys9EG^uy>H-FwcWc4Oo=alnQZ(0BrbgaEXRZ2(+iX}J>HCOFQ`rDS z>RZGS6BWw@H$>|xp54l4r8h2>fZGzh=CIwitHrIWUL4Wy;9QySIX|}Dh{;r^$weFJ zAZ3|^Zq$yFCuOP<8`XYPv?Rl%-9Ko(HS2de_y3|(ti-^FPxqy`dpt!l3~M%qsC77+ z!ASJysw}q8*26$+N}ETGT9zrnZm$QkL*6og4fuleLE_G<$MD8 z6#fYeyXcQnvJy#GR#X%aNMQa)y!d#ci(eF^yh5o*=B0;Hk`BPC=M)*933c5SrNt9kpjz|{1W(reW2Rl|E!Vx ztB=(B17dxUB5jP2H-j56%D`KEVum&{hZ;&@I+PrFYa$(>AH)TU zVu*vxKUiFeYj4WMDur*kuy^+Pj^8M+ST%21W=0*g;^C8*W*{?0Om85&0e)PlM9}1I z$xktY_jVk`!W8r{**ICSpt-?8)Vr_ZCG0hcg$T;ASOZcV_fA659yT)A$Txf1NQH6$ zF2aY)T?2GzF4zk!F0hg-9{VRau`5L4HW+^DHqJB?X^<}pfetGi&xf9yNJ`?yL~g(d z%)4g_#nwhvJ1HM@P$b#qKYP-N<%z(Gm=q?PRqH7tP%Ihb1Z73?9J;POa4jP!q)n7$ z7q?S#V#;?V+NEaSB<;6S4B(>56(y4q7V{Y{j|<_wW$$Mvfq3l_!=8}?61e%ex9Ud< z#I0er#XKfjUyt#ZeS{)uCJd#I@xobD?Aj6?ve0R%*KndFPO#YE-j=Pbis7XKY)bk2 zP|i$rT7qeqO>&RpwQtF{GU; z9~uyuyF#;5Z=-#90gp(63&kzo3oJa`S(J0@W*0!XDuNlh8;(S- zv=ttFVOYs?Mq8oR{h=+Xo+a;0*k*45TG5wykeS8XeiBGt2_CBN{pD0Y!vRn3jO^kW zj}@RN8+S`0G|4y#jmZLj8B%#vOIGc>F#OWWdyY_XaH8-c)f^%QoN31KxTFvxQgO;F zR@h6WNl@@sVte1sy{CJ-?Ft3EyT?1>ButYclk(ixZ%UMnTbcRq*+wqm*}}bEr!KL> z;q+gRX@!Ft%z&GVq^jWxKuC_9vEOMxSxg|LlG^&KOVn>hXw$v3n36s6NqQ^jvQ5Hx z%XIkNlUlZQqHZ)@RpRO#BjO3i3ZsX@&>Z*_w3FcP%x-GP1S4(&PrP`=o&V|+**wdY z=G%ibXGgfcDPDYy!MqEZuNx?lDQ;Tx06!^&un!;i=if-jH$5<~sW-$alBpB<*0yet zIDKwcF^)gV9CD+^st#aI5a{};gpG?00-Y>q+6%pTAf&^l>WYdXLKejkYr^Gg_V&h)Rgs zHILFVU8T}4f{OdyqluGN#zQiRW;T`M7Gtu!c7$~YqJMn5wE_297?4ea9AP%X?c$V7 z#YHj1t%gvcvKz6M=2O}UNGM)_aYzXXnW#AjjR`tK6&|VO9?i|@7TSl;<_;)WG~N-7YOkyOwqvr115=B zj_$2ILV#2fE6N*^mP^_%Rh zbAEsW&M`QP!9-C=*oH_&s+7rPse436Vd5G}F*H|0b7tcBzGaCgKWF>3^aLo2fT{5>_Ez9&w}O8L6_ZkMl)JuuV01 zj7whQsXp_h6T_yS=j~=gnTriH=N{=Wfb}Req9f5Uol~QI0ZOJmnw8Aj;bCXVakWUp zSx=Qq50AZi#z$Ft5I3fTL%&G8hB6U}CW}QXQrc45Q&bo+V(wA&iIQ^PBWsE0)I;A- z@(+#{@g$Lw;}jFS?xZHXqA*5@DcIMu%>6ppqq{{nb2xbqog#gTrXLxE+7#Ih&QK^Z ztSUiL)WEI2dw_S%22Ef@?jlJh@!WhTzk0v*dZobUNNrr5>xxx zvhJN@)3Pt}c&giZq8r=+J5d*q_TFIOY@z&U2isAn;Ah{4V2-?W zRYyNUP0P}>CFNx|a(}9o(Fp-#Fe>=ci27Kg=sjvufIz~DqI2@7zv|Gm?CO@m0pFFO z-#ZzVCt*1%@*?ul09!wa~-qwLjtp?rWT17)(U8!hLe$1q;gM5Y{7R$Kzs=b2& z6`6YuJb{`=1&NtZ}iGo<_vYjZEc7c&*8r`uoTxuXxbsV9+HdCm77BPuf&3-#zP*KOi$ z3GRQjco5u`K(9D^uU;bSDCp>P<{yoPFrG6JdTBoTPEq8XglbtL@!*+{Y0;);0;nB3smDbsew7!>Bpw!Ot-qpv zUL!?f$~+y;P!5vAvF=D32!tPz=I+Td9I7ViG258*MS4DhM<^~U)qWXL)FcD3O;`+9 z`863YtQAZHGJb@iyaww)2oV(G6X%1)Ve6$Qn9=V(10p^*@e7d&RxXlV9@nj~Xy~}i z0V>(Hl?Kh1i|D)I*-)AHMn&`&wA80ny6}xDqZ<*eOMYD)8Gh%Q@AhBrpE0Xmz!nR@g-hrYWeSToqm9 z%j>j$bYnMUZM=sC^)RJk@_e+@=(*i}e8^IEP`~*(Is7^0*dDR8&)3(y-g{Ax)zyt5 zilue3)Mwf5JAXh|tGm-=h{41lq#h)9k7W+{^)X+c31O+FFus);I}e|v`~tDkMzXg; zaj1v}IjkzEwUNKVGIy46q_Nx@3=Ul_>fTv)Q^@?tz z76ZK`VbLDD2HQ-0!3I*G+NQKIO3I;ks;8EweEgeUN0=*e2P8zV;?<4{W)}zEr;uX` zDh-j7iEz5swYCj2B(1<7En31q=*c?D!$D-;Ek>h)`>|1@e+KjzAt;w-G*5hudkar( zSK0^)RA_w*&B4s6`tmWSj2`C?s8&u?m(~ZJSfsf0X?X_cmnSE#InLQo^alE)bn|lh zUpnp~EJe!^6@1foE&vEq7ALRoZJZZyz~OXHiZ23DyIM^xlF%a6V-jkZ)`!FHv~iuk zMj{Fpm>c$E-bph8avE^Kxq2>Ma!@#hcp6m?$Mh|VEKpCBD0p?4FONt66o>CVA}G$n zA#56f{rXaaoys2j`kCRB+9*`?#961@`0n0%9X_!cMYJh8YO2eu50q}Sgz{22oLg(9 z`YtStH=aY%H@tR5%(4{tvW)dc~aIw7;k*~;ZCpqDsNkKXk~im%7|;kYJ8|Twe-|BdNiMq zXYu{c8~#^OR57^lOZ~3?6dcVpb~K4}^?Hh&Tf6yI7SgSAICpRLvx+r}2guN{!o)Nc zuip&6X|OBrW;!n=JPovIBrmpT(b|^%jg%SVo9=j*-|&RDen#TG?NLn?BiGnWMo*h4 zeZjQLVZ=+EL;9ssA@tThKnff0$`|7Vx*m3f7v|X?xiocKsAb!PYQu-h0XA7pun?r= zpxI`;iOo^Ad(uzN+s6TuSOTFLcFS*GfHqN;)sNU>`7HR_Oz;oL=1{EtBERw@NwY$t zVz?u$`))>lBy2|hz#x9InQZE1nh0IZT^pdW?asCow#b3>ntCV>SPNkyHkYjk-Er{H z;7gaiKKwcQL0cbt^z$7MjrQ2l$%uxQNtbBQeRhn&>OFCt-coGX;U&i^{)p{%m~f95 z{X3R+EL<&8Zp?O$tU;EUFqqCR^rzVnbqBPxOiq+Il}l~_mji={0Q`aZ4@enX!a!iX zpB}&OyuyQP35PRFF>XX-Z6`nhxydgDK4bSvS%fx>#fms#ZZf0YMcB~q_e-nbb)ykA z65)jFjh;oYv>oDR;#S82P}#wt6{*RO7U4+WGWC_mOx~jQFNKJHp6-eoxaRGjed$V( zU5jtvT}`1&Yx-Og0@Q}sCFS+RGG~z9lR-?m+ZKIId)*boo%poXJKE(OLB6{sF$%%EF<64ks;78nb%LOP*=T zO9oJ(!K zkdv{KW};)K%I<9KLP!6AY%Lbg-)H!CbhEeQ`5THRD%ww8l}}bM&QraQxaOudU|2z-MgG}7qw8TQYK`X8UFPnaC$uT^A^MWu>nfhZ2@Y%8ZUUq5F z%pGp2v&Q2Jetp106bwIfFgmW#thoBHF%k!*5?$RwU6}X9E9m$+r2n z%CA*hI-ZQ*%b}-o5Lx3K zA*_IX?aYpQ`(FGMVDca7vnZ zw0KK!FbD)foCwB%cZv(Yr3CS%&Qqq&&eVN5)U3Z!X`C@8(;(Gu=ac8k30KML^M0&H zFgnbBOPavp3c;01Mzp3`c6gsWGv8xdAJYn9ah6FiB`2->8q?Nh6m%q!(B#O<_f>sQ zI~Z#qbOeiMiXLyToICP_jXL0Waxs6mH7{t@Fa9KF7{}-sTNR_!%nF9+<8G<>2gDl$ zlZLjP^|hvisf5z^q1@|3M6q5*o)j11^MKMGKZ)w^)qUCOho^YSQeW*xMW^Pwgl@z* ztHzfxZt!9Yk$4KHgzV1RLxHxQ%U%Va?kj#!K?iE&N-ExRZ`Fm>yRm>%g+?!zL4(VQ=n!|gYPPnH zy&YUrVk0fbRz}{GpV+KD3i&sXH$8u7?N0k84LqhwK1;zckT?`pUTNOEo)1iwqL)&I z>z7g^rI-5m-fdbVsS>CWC;Q8zC@`)OSWh~$EN5RJIj4N)GD0NI8twuAuX! zqemzeJ>eO%dn!vhK@U*ypf?n6LPNPM6d*NG_6`qcVk$Y7AE20rx4kLu4qb z*lQ-a;?{nY>!OZEv@e&kP^oF9ahM9w1yOZ3M@ihXvEjC_xb6?gRG0y<2SdhaHTZOe zLLf#uH{_v3C_WbY%tRtKkfK_W>dPd=Kl7HPG#hmZrmp&j2xokk4h+~a&YmMrt0==NO2{Y2h2+KT+wJWC=K?zY9-dJt)EmX zrpYZF$6|1AX?aORmwDj?gjMZm@3hCXU*DR}K=oICSCS!+@$wh7LW?!rKWbuAD=OnX zT^9POSAwWgffJ@4=7lg6BXJg-nOM<$u}HeA8hYRG6wT@%g!mVxrVDw+Av!VY=I3{oktd1`i@8yKwzbJ^819-nsexkpH>DqV|f8&t%?>YnLoAW(D*WyQ~h(~I6ZnJ@N@=8;@ zXV2fvWmE9wd*ZdvWIjhF3x8=!)x5M7f{Jp*?Gr7PUsD%xgI=$)5@<<9P0rf>z8$&) zBH~&jMX!s8-{WHN#3A=NzzrZ!PNvUc34|DGoMj*WW8!{5HLuK7r|jL1*pK=mOSfT7S9S(avP5@6Wk_qFJ>mN{Zm$IUz zgu=FK=KLCK#dN{iVK zD^~cxNBSS@w(+rLX&r4#tfR1@kYz*5q2GEB9psFg4^KQ|-~~w&Q@dypH@+e{8ENj}z$}!wI_YMeC1e zdG4*ed1X@4fxZYqsa5woHlqK-_>W~s@hPj7Qa(TG1(d7n?)pn#5ppf=S9pbX@A>>V z1l&BLQ8hxf+Q4&Nx7H}?zs2q!$Dsciar(`f(cOvB15-@__8*WOmr$2?Wn+$3f_}5X z-2!IY6RA?pUN)xdivvGdN76%voXXO66vdt(EvmKN);J79G>2^KCB6@>xQf~p+Bi)O zpnm@bGkNb=gl|?n?^Xn#q@eCSV@6*g?Zj9V9SVozF{7lzu=><3 zjM)S9(3*CE;^B!EQ#fs&ds&4@Kupy($zzKk#1M?k9M{f46z5CwB6K-{j1spsk^i}! z!m}seC`^qQ)Xblyq{Kx2%!^9+p~>eW+R+yS4x0IR<{$f@NHa{gI2=KmKrpT*WhSxW zANrtlr=r1biK=P*eRpT5pZZelQ^N1~L&f0c^RZkoo9Zd2i#35_{e&4beu&nNgTFUl zYMPNMN$~`hD(ISEac#^Xw@+@4XR9Wpyrq%LIIqx79-v99%npv{^aqhC9?QBuaH~X9 zP{B#04kg+7!p~uC@yRAJmR7q`ZrN#kpEi$cb)#*owFqf#o?yV+wJ+(9kPQbPboIvD z4zvw`M90%~wb~6a^J`gVw()XHe&_Z>)YlDP<-wViit~$$eBBY-cZR~Ol|+Nti9M;A z#b{-7JO+zXZW7mpxvv0C)+@FvnFqW)(@ssigBP;{(4FHt?m)cqAwD23IE7wWxY6MJ7EV)ki3Tds*tq4CVM|K z9iJM4?UHfxU6?)L12SH=axPh_TD0|HvhhLJhO-;Pk7Fs<2R0cW4{rlRJ&d;sW|Jmn z(F*PqC&jeNaa=#yO41h3)P;`3n=IVbIdvXWwz%gi0k}9*}{O z0Ek;9ore(jaB-80X+!Q3?u^6bqzOr==+uGDAUFCysj{u>F=*nUK(V#qb!wKso zLk;X7;FSyh;K`oSu`=I)bffn#&f!aIHuNl+H6&=zDsyA`u#?Lh)g~?7Xik|`25XGP zcN3kgz(n%lj|ci)_eT4f$yNtZ}_QVxvPVq1LO z`oe`XO3L}95bR$%S1gVN!T3rw916&CMnbU$sJaM;j!@5%;J0|Y_V??HmIRkUuVY@h zzDy*3&0UN~=Z0wuSGSf`pytfUSO(R@FQY7!q(9kI6q_*>#QsX5vLh)-EI1J+%CmxR zaHKak|A}5H%TX}Ffx->Slyt6}e$$#+L)`UW z2EYZTdeCmGFb1{{3Pdbpz_E;_S3_~f(v+MD`|$5{o(_R-Zz(hmLmw)v(pvE-u}%e=Puv`` zJ)+=oUK8snOusvKb4{ZY&r!2Tf6;Au@#Sxsfh; z6({)F)*5L__d#O1sU$yVzX>dr`#Fxdw=Ouu zp4(hjH{@rxR($aN+k~cE44rf8zpgv~HQf2zokrUzpOquegmoJznb7}fRNS~H7S73x!QTA+S(V5*jQSW7}}|Hx0L38_rVj5*~Qu%dQ5c zho)nirCM0P#R-Y#-{`8$6iJnGjgA8|KNpt0g({5t!^65-SVXT9O}gFBST!w8TAFEBZ3a)j*dCLDDb0cD*dZQd}*`f9s(#7LUY=P!e>bp7o(8Ko3g`%O+#Ic zO>@%KEpL8++-^}R$<rb8hURPGEAS zQD-yCP-}vS6?xZn>sR})6kZeLQ|=-+7qm@+w?J78`|u0mv4>E4rkGh{E=T%%p>@Fq zs3RSDXyIoy$LOIKel5N?pkBl$MjcP3Pvl*W^%xYBN>x4*T#tDl z6pp_ypg0z74#SYa`pjff`2V)i|1nv`>-K9AMjB0{~#&r@abKY?UgnHzB#P$KA_VlFkBcLIIm^3_ro1V)J`mQBG z2~L;vpd;^8p<1J-5rSN4FaxHd(@Wc@%#^P-k2R=T6`TU7nhn`v^bNeF1%ke{pFKX{ ztQFTk6v^ZjbZ^Mg{{f{U`~lr4Kj^5(@;*VNBbxizn>i!jtHiFw)A4>2)9=S7y?~+` zk;A{2BjLe>$k^QKgYvR;*VF)AC(lal50f51g;6E>2gD#3V?>RdDh;i+)a5^IU1NfW zBaLn{Mt^K9-f30SFyG^`xv_xIeu(TUuuiHEY>Hd79xLV_){pD053DR5j8y%iMkuK8 zHqNZxgJdu5^S67g?&g)>Sy*ABm-kwvv2b;(AP^b|aTi1ks?*PY1eBzpruWi^QZi+o zYxuF}MM?s&U`%{yiW$D@USLCMpEVv$14~AZ5wc(CgA?BAQ#P~RqD6;$xkm&?&#j8Q zjM-Hbri8ZKjbFTc42xBBo2FvVP>{AB7SgUKbB&caxfOOYYUGgV7qBJnjY?|LO)I>T z^Q*X}HFT}R!r_Jy+~qq2mOvSNdYkg2d(H%0vv#@vhq$*6i)!uu|A&%Bx=|WQrMtVE z0i?UT1yq#ojv*wZyQD$7duWjEPC>!nM$b9VbDq!l{~ufz?3ul1&%W2b_Z{nA>-9bn zEUeOFaRVM2EOrXh*KC9{A6Q!RR&d_H+5Di9aPu_yZvToBC)5`XeN=dXM%_m)Y{SV; z+tKJU6nRYeo1v{~U3(oYNqtD^Qrog{zv`1;ph2&fb-3TlI!TPh0N0I4`8$q=qk9_# z>7HkmU+r)X(28*x1hFz^#7(uoZqB@$*u|T_-*44px%ggwj?v>Mz4c^MB|Bw;g<2xw zi9B+PS(lY>VDLWj@OuUbpE*lRzd{E=1DECXYu<)!P{ME;89p4vEB|4xpwK+_Zc(QCF^EdafCB>Hdm7a5xt n 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 z�-lK3d%Wy)IAj(YT3pRxYh>(_5SL5`Wb*s^xpHDi@2!VI_@C7!4u2C4#3iqBilGvqU3>U<#>qD@I3$dK>0G4IU!XG=oDy z_E?(3bM+{%beca%nY~`j5V;YLLEd{L>fF)aGV*Kp7q?z9yK->M^abU{6M@KET%+Mg zyr^6XtD*#A1AV;5{VicxT0>*ux5gf(?8&**p2JL&g4)Jz;rfF_<$V&Ey42l+8r4`D zpCLyE{xrxagm534YRH`|TMpF`6ja01S zM6MpU51QmKO7~;gGY8Cad%keU1(riGyh2R~xapO~;UP59vMcs~NZ4OQQ4(YSxzZJ2 z&8&~wH{rS6u?V`wxtF!7FV!A(Ev=vk==L_MM*-c=Kb>93$oL?2#vy(AB4ji&Vienwk+E$Ba6f9J_0g$|yY$xR@knVIq$1=cQXNgAA0` zl~`>E!L=;j8S+M^o$`{cD~?)VK2Y<#|C(7_OJL+UUTCJG0qhNMmdWQs_Xl0c`ZqZ< zzJQmbZ&!qVB1v<4b(&5CKM*W%=rPiQQ6-#@XS?`R=KCaf1VYQidFHpWa@$L@@-_9P zdM=;h+P~s&pIlqb&kN-X-hCexE}YB~d7tmQ5CdOU{%~>K=dQpD+i)kaK3@t-W$Dg@ ziMUj|uqYQ_t9fs*Ws&<9`Y>3ij2#Gr>p8<3&2X3Hk3I2%!cQfj+-HTwQ}^W>Efm<6 z1)*Js*@`Cm#@@zOX5DdNC1(-Cgg9XLWwl>Nn) zg|Pb+xU9!2lt_eCs*64+x1KK<6tREU%a;F+q6`&V7fhOQTFxr(2e|zTy*26t2Hrd5 zSnq&0cseDoH*y!F`3wEkvri~>{Pl|au-F3^z<94OGF7NaStLx1^32%6&m0G?B(68N429zM>g*8Th=sUT*AcQa9TOYxLRhxdQD?vo>W0xh;js-=>qOUW~t=s0`Z+uUkD zNNjIml584~!rJpwx5+M>4Hjkd8$~B#tJW~2hc*`2Cs0iSAJFmFsW^B7p0(Igacd`i zJUqd}+?2EH?cIp1u?*S(1-2waCl%g+&{l`C8#zhM=00YF0}7@29%6z0*lO^|g2 zH|qke0U92~STb$Hgr1quLs<@R2HD9i((yy%mPWZWcF!WU5FuYYex7LEiz?MjR z<2E@T*bE_55>0%M_mICWFNs)qQkjpcHU-rK5)3XtXtmPX-=TP?a%iG64EwUdV`d)% zsq<~%{>zk&QA-|TXP1s|B|ZhuCte&113!mAWi=+Q@lf2a=FBblDZ}%O2lK@RURF}V zB~%kPVHgPasJL?*cy>fU%jnet-PE(Ie9vveeL_!g~0nhN|kHUsA`p4 zv^bQ>DeU?$33<(!K~Mapm@^+&7*IUauj#Mx0SD7W=RL2Hmw*?K2IWXgXEpdsficfV zXBCpqwbov@GXTH#+I!{8%M2~#pCE*Yt$r=9a18glzGY5%dmwV^15kqxvf~-G#eI^; zyU@lrQoEZhlZs}yyO>A2gLGGuY3vKEpBoZb+$|ds zfo6?O3DqryJK1{q*k0>MZ#EwwM+gwxfQ>{?aWLtxJvx$Qz{-(Dw&2rXdr7@4frmHl zxNH%ZO-4Cdr`zj_b_$er4s-i3nC-8Jr`^7p#;JOE>oLjnHV?vc%SInYrQ#jyS!k?)DrswK7~t2jYGzMV=?hzWkXAFljoOBFw5^$mO}4cP2?+`=#&F_?t#=i63<}!g zQd_?eC*GMQFK-_+<@AgxC>|}=m;PQC=qMaz+NF_J`mC*=uR*QtWO8y(c`bf$e}gaW z4;uSs{`vby{_^j-$26D9sA;e=1r~=4n8U;?K0vVk@d#G`cu z4>K2A9}=8h;nwHIhJQG4Xi~Z9lFp!zQ_?S1&LZU~LP~=SZv? zGLM|R|9lM`K1l~d6OakmRBmO7Zh%HK09XH@DeNE#d)>}>gvh~{-J(oHjg7)T@`lTQ z9Fa>14d0VVE}9P`w#%5Sow*G68m^>BUV|!dS{57F(m)s%P!YkWfw7~VR$yCCJ%{`{ zf4%%=1GX-_o&-&f>B0gItRD920grNFIv)p5_9dYy;({(U>5V&d;9*6uF!%uy#P7K=*!TRNk-MM<^M83_4*E}39-t|79t}-q~qLl@$z`akJqbf z6oBmKF%#B;IMLQorHrhQHTIr8+dDQkxkh#NkB6ZbJT5>fh~l?Y@=bj`9R-wA%>-t* z^VdhdhWs#YC$Lvlug6MM3X_|nRfc$_8}?sXJ#6rCyvO6)HXhqC%)ER9Zmbh)DTp8* z)Psv88;My1cYL4IpKE*ZSbz~3Iau^V%D?SqnvJxS(KG?9kyTpq(=SH%>8fi?{+JT{ zg%mBNFGz8{<&M@XOMM3z(Anh5r1 z8z1)M)tqtPvG(-Jdv@5b&?y3Xzd`W`^gaKlI-2%om?djUDvz;K&VTFP;=$)HdFbA$ zCs7H7njcf8dVQV!PJ>!H2sv=F(|T<3;Za{!^*+;D~VU)(=(|L5O7jUCDHx4 zl6d|*Mza#_{v{Guz`4Dxqq4PY8TMgGNgDg8JNxI6qeuO|{~_W!35ipyxtpTX-@Ywmtq93scFN^&J-8(rTERxEyvF&uSviL$m) z7>a~cO*zyGacsj9&R||zh6_33YM%q*d6h8Os8>^xtW$?$#t8gTUo7!2MeGoQ4t|Qq zW9kj*7#3V6rK&4_^~l zN|g&d>anM!mk7H5@iE~J9nX@;r=CFCKf-9j7h`UV!_9#s{?GSo{9=dqv~7{6X+7Tj zmD^qN>zT0)=rWQFuTuv{Um(xsap`@%@#C+Q0|fBDTB*#}>Ru_+ii=!3>8_L49g9m` z{*5E&mr{A%Xd@A7ukTg0^T@#dGb3B^+G|MTV$u3O7XJGAK}ww4VN%LYneadRrzn7| zsdeH5JTGpoVEs^SCRe0a<5qQEp1oUg8r4114>?^F5?jbB*`BNY^R!0*dTm6moU{{> zd)vjv$p}dSX4&9@V8LT>M7e>bNo7Z)aj95-|D%_E?pZHu7E6wT9c#mLJ$zdXgopBP zD%_2@W6<$l1X`x!P^w?C6#JuCsgPff^>NPdvR=08@`rj4K}Aa=H;3k)wj{3@(@|Oq5eVPP3#QcWtJ| zUKK2XnC8dZQL5Ccl*nX$kn7*CuytDg;bk$gQ^zx@RCyJ;MniV5fMz8S@9KR;OR58+ zm)GJt)tp~OT>nT&4xE6%QU5h+9(=?jL=kf7vlvsPf12cM8bOC`w2)DyBWqi_&*gyV zh8wTWA}NeUuE>BG%IzvwHoBa%bi?~9?rFcmoT*a7R;fw&6-`$$i=0>?eNwrOHXtdDu`f3dV^KE)qyNwLr>-C6hEN67lC)IkXW0P9`tjU998Z|KT z#?tVuTL4xqPV#m=AuoxF+XxJIFjr<4p{8EXeZH?!G8->@S8+&-UZ*s3A}V)sI<4Z2 zzrqxk_WPuvgU$GN8N!)Ko%_6bxw|sEYcFn?47`g8c`i3*V)~uYWrCP9w@N0&cb%_C zgwbp6Uj5RHi}dWUWgFqprzqqzf<($wRbd{K>4UJ0FK_`qrWKIu(L;>ei=nb_X0s>? zBYHXkfZ5*VJLXd4ZPTm?-NT2rus+nu>*}v{bIcz8voAiSk_1v8{9+@F*CG?IJ<1fJ zQ_lc42Zk8X2oWSW{M^)c2~Wd{)lIa!Gh4ExaIM7tg7~HZO(NfE9@D65INVL%D^t6a zoWcVt{{AT4CU>4lNBJPuZg~-4OHh=8Fh#t<7y|8}m^g0qN+Cg%t^E54nCpuOo@>o7 z96aj0{sJ4fuYAc^j`h0o{_VpkAQrfZT}71pLRyC*a8$l9P@|pK64~kpu8qP!!7w^y zlS`+5f-!F9^Z*M0q?8(IK*BSq5(tAlm|{#~W(}27Bw35L{)eICkoCBv#ti$b}+an7ZMf zV{0-AU$QmZx5V&2l(j9S^3Lb>2q8r)z8bd$>u=ajEx^T;)Wk@1pU1?f+dvnxrnaoa z!+sWaX7@R&&+nE|Ke>9|>sx@RYd79O7BBtuVi7<`72aEQKK19tdqZrqEbMWsPyNd3Dy>7iL8m>2 z-R`WQRQ#IL#XeA(Nbd#c1{Uv&%l2|_gQ_rKzWX!UIWVFnV@1mm1MI|~({SjaS?&{-l&`ba@LE4YfZyP4^&4kZ?lN$80MSypo&N zl*~LfVJ#n=8_R7jSA1;}ec4EV;Ujr^;Cc9CXXDQ@+(6Lg>$p~D_~YhkJ3}x!k^ct^p694AW+`zKjq;c=t#nrMd7YlNa}%n zx=E0d?*F)HSeAQ9Q>s+wd;{l?&$%`)R|-cb)jwZi$DjfIj@au*y<4VjS>KP+UA_0V zf+W?>TL2jxW_q|p{7LaMD}@nAw=gVXkp-57DzTi~*2&ah^Hqupcs` zRo!^*41E&rxympdPV~$Qw`OR9uN!Eumjy0{MSEzf(TbEd=={f4S0;SEQnE~lpWpGk z;^W&c6XQSuf&jfTh7Z_(99miG_2h<>dZtgh#B*z9is{Ot&C~F#{QgGuOpBD(!$&@U zJ1+B(lgZyW>=MjQ+?ior$C`-Cz4GHIy~B&Ihad~))*RsvM=&p)opfLODqcz@(O}@y zOPV^eGJ#a@8()Myb1i6kk|P%xKW58O)~{)tkyS4)<>BVDxpX+uwee>e4)ef<2>*Pt zVyk+|d15KmU*;P@^E_|cFh^WYPL@0GGi#r9?4fb!*oEQ^Lzu-%ZLf%h8MxIx7P%x} zpvRX7Mz`y#zqP!VuV&k|3)@|49EVPN{DgRI5e|O$&?I)3sha9Imjy1zvgnZU@NSN# zKevvjbj`lBIF}1mPdj5e33leETIPpVOYZU3(;vLoo4AyOAtYrQj1zk{gNL2L7C@qm$;p+}{-%x|7kv!He~0+@ZqEH@nc>ITBmFerK>tU{G0TY+Q|68;*LhW7Q&eaR$!{1%=4rFXIwv{CwtuSivV1| zr~E}gQ5>denA!HlO)o*kt}Ke=nM*rC5s2acx>s~2xOA?n4wjzLnJN0~0iU5Dpypn9?^P9pH>=znGp^b05#g1kb{*hxkXj`Xlr1;~R z4iUX`?0PY)u_p`J&+trch)SCQbtGv06i^rCxx-+zLG7jZ(r_F^$Es~AO4^A9E;h5Mr_Fe5FLr-$RY zG5hTj;gAPhKF%r|BgPuSA;<{tq~gD{ZENWn(|F?J^!z10d;)ou&WZ;U_O%Zi1;IUp zeiHO~*X=;J)A%25o_bCxns1sQpl?ybqR9`d#{Yx;8^p|JS~a3f1cXRQabwZMH2<;U zSX^}p_`9L+k71ecd%83_H`jgtXrzJa>{6vVnfu^q1vFE5{c2CFZf`bM@j1Wd)XJxZ8~KQW)v_?fIQd;8vr$4Z%QF|BTP>wsrd zEX-;AT>Ka+E1fKS;_^r?#?}M#{q<`jPF{p6S7p8IyP9by`%a0~DO)<*TI{x`4%+DZ z6xW1$sH-%2nWXxORpPO&dN0fF5aVVk9CAa9$*TZWLmT7pPmUCw3Dd+2r zpBH}P5S}--b9zK4&kxrNM|xAAOCAdi6I03%`Ok{!O^DBgTOoxF4|a5D$d&n=#Ni;7B-Tx5y&_l>a_cMgF>RJ%i>qBN%Ku#MjCMT*>*(s z4px)qzb0d32V%fJD|?x6K9F;*3%k$AMBQK-={B;YS(b}CnFJEQuBeoVPyMqJtCJHL{ zh6A(x(PwqznTwYAr08rCncI@j>JF_$#w@%RrTUw0A5kRrZo_;v>7>OyUn^Qv4{erl z&m-q4rJC-Rpz4hgzW9}r4J~66eG$JzlWQ+#cbv(^8f#A8oLKfcNzBFb|6BWLi(R^8 z6d8DJa2G`Ss+lmobb8r}qR;Pa^~7za;}o%zvGPk)A4QuzfV2|H4w9Trx@%p-8;IGV z^^?5z_Lnr@ab(}LldL^d`&;8Drfwld%@Uq*OR9dcf$j*kOh4A0Hc{~gGYv5*q<^fKn5l=lO-suhanmoLIlRJvNdz>9kn#Mida+|>)+RNe1lYG= zXK%IC=rFKMd0y1TBd5^^Ir`NqaF`BaP+$FxL-Q~Sv%PQjgT!NBz zfcq*^5vZmmoGM}+3PCzs^tI~v%!p|`u zS?~56=Z_S}PLbN^=lV=#&CA?ip&5lT--5l8bH^zCruE-ANs_wz0<07dCCYb(o29vQ zo>&0KmQJS<@o5?;t>;Oq!&Lj${n`K;JiOC9Wi#B8o-9DAQz@sRG1YmsJe{CKw6 zla`NP>+aKu3^=2OJX31>9MSHJ!){b%*0Q80Z?~VHy%j|hdDr7MOuH_NkiMfp!$;;K zrP}mo_~ypCq1^)RxYJ0EaK#_u4ap<(Gg^G^1E!C!eNiHE=vEz0Yc=6iyuz7Wd5S@XjV?6wDk>C20T|moTs5 zm}y9G|GkSJjvhmzF$;`n^5$Q+c0|~+kU&`!J?d$>#c1dFkmQI5cE#=+Btu*j&DUl} z(JyZ25@}jjif6aUuup4(`gd+Sd+hk6znCeW@{6Oxvg=16+{wtc^(Pv(cnc>s8HN^X z0+`dU-N+1?^_KuJ<64vSRN(I7zb;dy)%h9o)#htb>$a+O&KOY}5u`m;YHpK+`k1;6 zn2}*pV)ZiXsk?UGeA1Y|#~5cYgpD5NfLy|5OSq5i{8ChL?ih@S+&LYK_>CjHk@=HY zqeQptb9;}r?!I3KO^)n6`K#)pa(3Pj(5Y?!+R|MNcvJdz&<4qIf79i@bXD(i7r2B7QH`u$1fPR0a){7u^*CY$>g}&wyUw-|E2 zFVGp&d?gX$Pi5Dpvf}A6WY|XnJiLD=sdMI2HS1ALHlOL zj*&iRl82$oT+m3dDt+~2d5Z3Q@>8838tbSq1VY43(h*{}G`c78r-We zQH)fh2+M2VIA%IkiR_Xx5kSMBTirYJLcw_XWm4uY=<~`D8q6rx|!W( z=U;jXRMyuJYdRhb?#@&PgE=i)!J5j;r^KevEu&KRFBM)~C} z-i$4u@XPQ!D1re}>WcH+yUlCc6AmwOj6I7_8->$_Qw=h2@8XP<2cX|Ji0oKHw))$* zOfW`M>eG%kJLs~@PDdyCZtdr3Cr%q)zFKvC@Q$sd&h40m>Q`rjts~Zv+ef07NL~84 zem_G$CG4DsJN3H>hgWZ8N2feM3O?LGihN>bF6ts#X6|}2GS}WX@7P{CXXdKm`ix!Q zRnNgio&fS=sI9{iU_Cf3_ z`^W3Vt!!An-+Up7n7VzQO{vMvNKD&f{@A9SAqa$9q7x5PdJ?{YX!#D?M7}H)$b?zl zgfZ(;cxxL)!!x@*p8Ik1SEC#lgQS*z;{;DljUP`g?r~Qz&Uaj(o9~+PZj)nnw`Puu z`yBIsI=P%=&5E8_*7}$CkNq>3LGOe1Lr&)Q0xL zNVnJ~MnPdXmiy+l0`?Rmx+JFeXcvQ{UTTU2@f-INbPGWS-EJNfT{rlb@)1QZwyMUV zBGfr)4kaVT9>z#PuCYRATf{y9DXW}5SKcDO9ienV{fB$?7x~vKW=2W|p5B3|$Ny_p zCtO)krT4ClDj)fHLy)P;F zb(sfH>5-+UZEb2|jvd<`9NtvT#OQkO6A$xkbl=RZV@ON>Z=9p&hAlncfBMQm5x=%6 z#m7D-w6nHuzDd&VqV;8dA3w=`t6u^hp1Rx4&D*lwkl5;1Z{^!GV>0U)NYEFoX6;K* z)*>9NlA5AMA#82im~UEqk0~>4ayq}q(P_XjK$JATD6QR6=&@J;Qw=+zsK=B6XgKZY zH;&=^zO>8&%Oj*6T2v~kZxh{n$&}tz@=OnTws(S@)i|j@RE~LtcB#ohWm+$Pc}zyI zT&tIPL*J-=YT#eBcoK5s)|rS)E-(p3<5JNShlpgRe-aC%H6(hMOvec~A_mHyygfEG z^U>mZ-r#$}oU zU3lH?C>rS;$YHUb)Tzv9iNC(*ne9(4K(7cmrsy zI%a?65m^0GzSrjE)H(S!EmXd*sG<3d`ZDwjxD!f&wWv&yyyO-N4&APMwU+8`19`K! z9-k)XD9C(bcHQK=sNv1l#dn;#qLdCPjc!ROoz}uyx5eFo#3$JA$9k?A(o&EfQAW^r z<8lgK?A>}#!~&C$2MmQyv30 z(lly?#@{$;XiM+_jK*_c;#|sYMz-+@@!rXVe#lASq)m1r zsG%6O9L($kZgq_((k(d+A<$46aBciBU(fs1S>Lx}Y*Rr8s1tQ}m-=jWy)#q0XIi$1 z7+VLNCnEc{6t*hqL@^aTvkIH&9?OEqNaIc;0Y+HeiT})RoRich|A-0O-9GCd&`U<{ ztnRJLvAL-W)MRE=x8Hb-%Z%iXXn2O5)gy@#t1(;=uDXT+P_5bp6S#m*F3qm&6Y18= z8jqN@&pdrSZ+aqF6I?%uZk2p z_CCwuu!)^`dyzRyv_!4pWMk3E{4|=T<;6skOsMIleo$=fdvsuTi9M~t(wAK zwSDRoo}Y&hbZ2|j!9xbRCkAaKxMU>HY6;rBhdGr^4~REm?}#DUGazQ68!LP%&EC0B7pAFuH>f zu4vaQ80Jn_4NKn4v~_4!mF_1(T#)?sAv>vD_^3iLCZ?d@5+J%3jj3EW7knhkA}x`P zg)OeF=e@#G(BSoSWlq$yp5Ac}Fyp#TO7~GVu7tb5$pLNSZ}J%Lr3jrTog#+e5FxL= z*)EMAHxgu-!@>y_R~T>wS=or4GAoE{(si$!->p|FP8J)5 zsKNc8xlJ(PmcEX{U_S8>0cUZMnFii#WualIp;3Wz+h^5Y-HAuemd*F23d+`s zs*Py(GHbTr>p>4h3A0$}WPp)i<*9Cr}3f!K8h;;W*ih)>hOQT#iqs?sQ@{U!;~XB9`A7Dv7g zGWWMutnwlzj7v`v=8`75qK!5Ei#<0DCpd#`_YzlQFz4D*hh{62n$$1r!|ieT4})8_ z(nWn6wt}Y~m6}s*2=Zt2y|4$*8&(Mt1Ma})#b7C4e6W( z^`%YKwowWXmrWJs-exx03_0c1(|(vg330k~Gh(VV!W0Bib39gbt-mf=Iit`H^>#Vw zn@UgjZGtyGWRTd=%>taMqF3+V`BJM>&Mijq!?4Cz4UiR<%#G*o{FkpG4GM7mBJ0n! zfSRKxV^`;{I>q~O%v2~hzCUG)j$UzOaTn<*Ewro?yi`W-bu(lPU@8|%Y)JC4TM#T` zd^RUz!FN)7@8raTm*2_KlTs`dFiNKqj4V>F*Be?J-B)0~+R)KnDTyKmWqQ-9ytMk! zWrc(+HeZO8(g{}70Fu|=U?w$uIMoBGP8xIOEkLrE+%ja)dc%$=in~R6yEfWSIhx$`_&Z*6wng3;h`^|Zm>n1Uz|k8_#YnAYOcNv9RO5ds&M-p{>2Zj^w{U*O_4;v{KM z=w`?6QHl9}Vx=$RZp)sxrMGv*%x!XMVg7gC<8ZsJ+l27b8IMw_LKo+Le1{g0% zHhpIiMu>>WtSNPDi?thAt-PzYF`{#a)?1PdL3PMwr#+O#7>XUi74)qfM~TUmjRekk zbZYEYS64_<+d~XNRRtlKfD57MNe?GmTkRw;U!n&40H4cfS_HZqNT;z2NB;FXP3q(G zl$bqW49?U}d)ngtEUmuL4pci2Q2Y3t@XUrfs-O_bI&OyV z)|~I8#=!L|>$?xoj=I($rL@19)4a-uH>dUbPUP`x3{c(GUQVhCmEQ{2|1O#aI?M5^2nk;BZ|sy|Mcfzn-NBCV`vcuVAKaSGd?e!8u>&` zl4;@1e0qm}he4ihFT-ZK*E|K)*SG2f`QHY^E5omW?=^%`;~cxynOoD`KpuEJc6dCX z`cDWAl-`FWovjbK`e90sT(?TQ)=Cpr>FYHxT&=T(fUiDfaQ)eYZmC#l%eb(E!(T5x z&0ZqQ=XPGp%Y^XtS~@%O?R!*Wh@y;JODsidJhR{Qd}%3$DSS2%jE`#zJ3{%y6s%cP zJAbGSor+5C`L?(>C*u4}J#cNvzm6fMP{a z#D@kyG`O9|`{(_WhbO*>`Ua`eB}aY6FsbEoulm&~f>B9*s?`YLT?@UP^Jh?eQ_R8{ ztuy@|X~WxE^+#zNcL2Ut_mU4VhOX2P$H`}_;YijmH9#iRUs6{zwqgR+pj6lE>-oLk7yb( z&i5n-XPi2>-t5jeEpa*h^pRYdT6Q^qUL9qFl8Tv0;_|3;Bt+GE-`-D(5NyG{PqD8S zw*`36GtTRk=-~L^wHpV>zw;S)bGL`#?}<&A$QPd9Vmope|LC&J!HN#CS=@6Km@c+> zDtEK+YAaUNmmFZz^%9|6?#a|i?67}r#K#mdKggCXq~u-=ey(m29~28FE7!O0(}@Oq zQ6+1X;oZ*Hm(he<%slif(I;QqtP~F6lUvs8``1~ww7KqH{NuOd1-5O5KYeS<26B>EOHd!{CXoFXV^T)@_{wc}VQ= zXEU;0KU7;Ae%bm6I|JqwW?*RRYI?(nqu#d)UEnNsuIKz# zvS23hTYsGR)g@;bCNKBegKfo&kzaYfV{aWz5vhLt9<}e(>%I(@Bi_ zsctndxNgHiREB-Ryv~X1qWb=H7Uul!wvdfsy#Z8&=pM3W z{Uj=TaZhjW|FL!6fmHqf<0rH<$llrEBIMeH2-$nDYs9?>*{fvly+^X$>vHW8%DDFC z+R4t2jLd#V_5OU`-|zSL&*^sJcJFze@p?VS<8ed9sS%*o(G0i*^B;+uv~_xj$MaM- zmUMXsnZ5^C`lb(5Hr@SZhaBe=$au3|);%?mP)TQ`T{S)D)AE;WRQA)^vOkIT&%|y) z`U|V#`u^wf_@L9&xaH3s2_l+gZY3;DC;2#|kY89o+A=yZ_hvB#1;W)oD+byskQR+7 z2^P`dQ$hrgX($O9cTZYeVaF{WtPxV_3F`%^{KDE9U!?0Ld@nvj>e-9yl8*{I>%)j? z%~}-dqw@%4(};umh-f@Z6?)D;^8Pcc``$J4dhiGpqXDzx_CkMu{sm}2S@2X=gJWM8 z-VSdW)<^ZK_97cuacCL>o>?;)K8W}5pWv6WjU;6x?x<3#r(CnZ8$S%}TRw8*4j(l0 zrK{bnJlmh_IkC-fO?IX#nm)T*UuF3{`TK$5&OpzOwTl6vnT{(Yy7PX!m?D^Tb+tyO za_|B2wf?QD>u7-oZSmG^bPne@bHUa@m(BDbdp=LE8e<*8WVAI3X#O!thaL4=yW&{w zd+Ah*Y|e8z_;|JXPFQiOawwBsH~gSm7hvMz_$E3a^QYFAogG_9g`q3l&EQ5Y0o{3% z$sLh^7haz$z3!vZY3q%9pmyMSOE<4KwN+<84CrVp=-kzhF>6Yh>dTb-jMBvRP9L;; z3L`#)I2MUwgOF?Fi5+I8Yx$D-^6<>qnb4Grj9dcHxl6_)3C9!-DiMd8Gx?8pMLpZT zm{;$^Y8WJwi#TrweMl0s*Q}lx)~>qA>T2NN=6dE=;pHez7MGujUfTcpMS|=M4Wt8W z>8tW}&ICiUHVbHWXn?7ga)kzuOFVvW%BMENO`&Vs*S<}ZJl=G5%2Q+1x3aRb);Lv$ zV=R-TCd|uq9x zGJD7Y;a^!YHvZomA^+I(LMEVg^XkO;g{6aJXy%MK-xaC0yoh(Yu|AGu@8 z(;LV%-Ddr&!ooPKro_+^aw=TGecu-a@LDKPUJlh%AE$*yv`}ZMKer~0%9IqrKZ-0K zS+Y%ZnO_0}`BxjMC4;_^StMHBo@<{ccD_l6RL ziO1kF7y8l;Z}n}KB`5yx$!=~r(|omk@2L6V(Y!B}0vR}L zW5G3p@b1g~x2dUFPSxouIbJO@7l=744CJWM;+Sktt#R&$W?>X}Tz?wi^_}bge(r2P zZ2x9SSeYO><$7u-dq__#?m#)tBd(+dZ%m6U}8I>hH0?CY%FQ`-XJS@!&#OAoX_jxOrYrQraB5 z=_p?hbSrLj^%3&ZX_zw+(Mg?#1=mPO+i=ZL9Ts~h z;%(ws+PBcy=OyokXl`#qu>;4f(IdJWF7(Dh^LHePiKO+^>EWVP)#-}bs6zGk(p(OEu~lF;KopdAA8bOl9_y#+?kNxl$=oGNZm| z&+nZ4fS3c>w|U=5GkvEjKf>*NZ1Qfh#pk||QxBDPi2L0K-)B_zP7*3JlJfk)q}r6Z?0naOX+t&D`OsQ3u2*bo7vS?kR)Q|%T&ia71^FP~9)9m*d{lJ{o!26YHXE5?& z%Am?)yQsJDXQ7{YqEI!TaB2sO<*QRRbE|$a)#K3d@Nsx*jBeE?-UDw_3Z8?)rvQ+p z-us!4n39%s)@SCGn6_^(H>#6##G&T!<%v7;IiFhfoKh}cCsFF()t!FX5oKIlk zdhg+f#uhGsqj!lG*&nSiyTZqi%8-7zzV%Gs?a@_L=)?PZ5jIfVH~#w|+f70a|L_rr zS8r)d<$cgiK+0yX836Llvcwx2196D2ULqSQ?z^+ z-}-sUu(iEyzoDY%vhOrg!Wl57H=zBowCNk%Zd^FWmAm27K|g!@@x2OUP|JJA?)WM` z#5>PzzU({J_2Yw%kRaAsK5aW>QABp4a#Sax(OAoq!B!$AAogaYC)?9b0X5{pN&z-! zKqb)rYfPSxHIal?lH@=8NLo;HPv>_>=fr-LL0yhcr9GCC0AxHS#P2%rWpx_Fs z*3zZoyX)1jwx3FFLTWTPtERTDcbS3(EFBx~SENf+2u9J-oT0VxO<$cgmf8>*wb!fc zDPOj>u&@O*JD+aeXT~f9eQLX3zydiq;ozb^e0%fLvzsfrpViw1`SWGtB%jzf8*^C6 zn8IOiMpDLk?|K(z3-vJFBG}EUxIHSPDmWb@CfuaXp7Po|mqwNmQSWrH8AU#0SfIX! z^)8L0Yu{1pS}t=t!V5oDUhzBHE7S0pR8XyoUtdwgHSzW4Q^kn;LWlf^PU9Yk zVPa~|b%upk?c0JuSMmj|y6G5Iuzk&-To!!V&K@}*U-@qk=ARiqZ%zG=#AS}@s5y8- z!N+4Qgq`uo8QS6@)3fU=*C4U*d6QRyu+^>F$eKst1{_sXbzkmvcZwBGm8MM76m)Cm zRQ|%cHGik}*#5|Y%E4XnQ+waJ;;ynAyjd)Fn%%=Og#AYzP>a07z-#f4x@3t|bi%i~ zetWV}XQV>dCAyA{NV*p&T}jhD{dxF+aPS~CWQ~XNcC{^&0SvZ;AcK`@q#@QQahPLL zxY_;5H|y=~9$N`&`*>-gOW(?fdiSOrD+NyqnV!XPrP1;E|&4ACg- zWfPsmn(zaoED~B~3Z#5uZZ5BqrgdF$Zaer0R=O=ub3(aDALf!0_&wU+p!JAq`L;hX z(eCS)eU+9kQyRqK|Jf`2KU;1TZyDUOYzH+#Mk*MDHn_+E3`o!ooa0-KvN!IxyL>Xx zYh>TkZy&eTZLTQ8)kT+cpYP)clwangRT5vE^W$s9>M8YI>9lxnt5+lTI6_gA$?-(Ep;Fd*sCEJ!-YYP z;J&UFMo;d9jzV!pCLeNx`gOaiH@1QJRFR1T&@OJ)Ms7`az43jkgMlX(XHl6E2|-%5 zuSvwkL7A&TwQt`d2fN`4$Z74tIPwa(JCt&0v(Y0dQyh2IsNLP(pQ-#FO^Da91p0S?i1+Sx;(WEfqeS(~OI?5J7<0bjdJffHr8#d(s2!c;yrc?{aD+3*fQIT16Ui$nQr0`qDy2;H1}KiJa=N%*ug3ZQV*!{y4eRqP)D`ZkdXv-7y@-$Pc?h|W!$ zizrB&DH5Nd7m|ZMokwYf?nmQ-Iu1Ge-SwW0HXiIXPz!?(mDF!cp1Hr zsMq|e*0!VpbxgNw{^%bw{baF`I-x#FSOA-kv2+T)nuyT>H3wwPMzHCCuu@`TbdB%cqN; z&Hui*_kZ^M-=F!vdw}1{bv#Q74ShG8wW`-!M-?~Qvuf#Ff47&oo4{Vf`NbNLqQj}> zD4s1?&7*e~iJC>UqbpnRMcxjE%0zBo(j|FJU}V#)PQ;d21WWm({3YA0xrNnDsW}m7puq$5 z_+`;_g{vNumM!nF3PXgQ;CeQ*PV%F0-Q(vkI3ecOjPzNaeRzGp)I+L~Q6UV!uD8}| zs{MZ771{K1(VbrCfn1Llg%S}mT!e43XMYWe)-Z}FXrxe5(Ggl}t!B?x1xfrXnC5Ut z`bK_9rezA#O2Adks#d?jC+V@tiDFbiD($12)c{Dl`DJM8%H2nunk2|3t6AO^g;060 zoviTZ>UShtytyt3a(!Gw-o<)CA5fMsa|_8igmT3b^vBS$t5kQOc>{-q_KxL~_Bk7u z%KF6Uf`aj%*7jbhN^ZPq78$88_@j{U2cO*v@U%VEewV~gMAw)77RJ=_H7n)Jat)KZ zVMm-lt##^wi(-z%MJrSLWcp|~Dk?^ca$UG)Ra0%-h))8M{T_&sTbQqI^cnM6GpyD{ zTU?*FklRQ0K|L_HUs%HqzpxgLE#1~D72(ddM+QPDk>@E>O8JYy&G1oMQ6#NfU-^v?d<{Fswr98!IKD<$K1d zCZrWHriH{ZqhuwXR{JD>?*TWw)gNcAYCH=cnY3?AHTJFo?{@br)hA3ivlVAK4+e>s zz(6ZCP^UaC_|JbtI-Rp$0Wy@dz;@SuXlm*jf0xWU!^2$X;?bG*b(g(JuD~yrjtH$} z1aOOPtrj7zf35tm!H*+mj82+g(-ZN5Kank+K{!YLjV+4um3-+Nuq`hlf>(%-@NmI| z_Ka}iM(FG3%k<2#*h9J#$lge(QXiO4v(FAAjClOe3{(L?-ftgMzj~{xfwWR|kkRnO-1UuDx^Cw!#4V&PUstNPl-rYj`U;kq zhP#uBlZtcrp_8U3w^0i%Vn0mX=*ls!mE4d;iN#LO6Op4DK35Y;ui3ey@#}-T$#+xG zcK2ARGF!j@9GJ(9*t=PS4amx~Z=~<`?M9nAy{$g|Ire4sd#!w>0b$JCaqH@=9gsW( z3XzR!^nX@=A)VOieN9?ZX!d=c=oc1wx{OiMk)O4=kidHRlxN-C+Rm{_t1izla1JnK(WHNk(MRP( z1Ino^j7%4QKHG?2nA`0GI;)2V?(bGEz@RZF5C$w<8Z7!&-VnAC$fCn*(YZ-kmFsy| z(i{bZOSqgwT_9OE(PC{ApbkNEITjWc(>NZf(53)&OBT;t5rIMv3>6<=mAyHN68ZLM za@_w1{C)S`jowZma28)#oZZhSjGk5?{%jXc_bsa5kKS3neE)qXSxkMNp2x8BiTm&MY~1LewDi| z^o}Xg4!3+#rn?tt?a(#^w_ha7A(>2?wK`S= zkMT!ccIzUKA85%Htm2n z|GD11i=$+*ih8AWyE(Bb`(r40XSYqIJ!=fO`EXW2%gX|QQ-G}ft;2nX`A4{d2ybqT zvc_U3wgaTj+rv)gqGaBl)vVaQ%+1{n17jJ48Ivs?yOKxL?Aq*#*DjpZf@^|ZQu||? z+B|Bh_C)q9GSfTHMOKmL;^%71Zhq+#ivqu})*EXkK6C%VG6d5FcSc`gHI=oY$2IM< zVR*l==%^$cC+sTfHZ}@$^E!^Z; zz#G|@c#%BS7u_+~4#wy?d~*F_IN9{g4!mA@?p9r~KBF|bz0=!xMtsYay(TA<%5)%8 zOC=i7DQumQ@EurtjF8RRP9PFF=^@_cRW zWec*2`3oEUA4;C9Hfo!a5?j0QXBFtjF$wWmY&X#}ZxSU(O!bU>WO*k`wEtx8|5I-9 za}}c}{G9D2V?x8|mJdZ6(B=z0IBlC)hO?F2Chcl)agxd;Lpn=}gGBp0Ah%PO7r6(sJg%EcBAN{O*#%^m4W zTbyMssaZ*!hTa!OW5gkni11qZRQnc`=*Ju6p(3*_MZ=KG(b(wi1<{06lYQf zJ1@~*LO6+t2zmBOZTK&#YEG2S1zs8ud|6ek-sAt+HD|mAE|W0$s=c~Xqw?~o7AO&3 zvj6hgN+7awrgd&$sWzl^!@d%7G$KLR@(W98uBQ2x-|0g6xwxp`cf4(Tw}p4^>AO?s zNh2`d_DdQA#WP#iJ+KJm$j!9IfuzEKEqYQE^P{#mZqg|87Z!Ks&rNTWJ5=qnL4!-K z@i1|mmhX5p-j2JxU`FS`sS=ZGQ~l#RKP4JFtKq*uc7` zmauh`IL&o-_xDs8sNDEx{I8q=A*jL;mq$0gIn|&Um@#x#9<}~{VXg^21vm`b4*K{g zBf&G!qX#{YNfXA6QCZ(yJXtuKS;!s7arD3D+*1rK$9?1CydG6d{ivDH;+_*RxgEz% zc(g~2NWH+jbbM-`V&rb$tdA81pLAp?E}xJHP22Xh=EXzLP4=`7-z$MrXm(+e@4vd_ z|8{nBLuBtX$uZEzm4!1U0hP6i1=i+t_b%0u=}M8Pd$j+--tRU(n;?Fj+ zDeTu+3E2d}c+I}udm4Z~T^u2?Gt?{)dQ;v_p3hc9O=NR;(%Q=kTS_VbXhi4rz%(r& z&e6tDDpH7_azOT3i1lij{)`SL?QrX^PCkGVfj z&)sR(m(8rT>y5L%<1@7y6td%+egrMl6h27&bjAjWphk&1BDfn=4owoju)xjK{51w@ zFU(z4Y`|@db-STr(evZ|Ir%^UJA`Z9!HD|$@%OXfpL27wFfKZrrtI+O&wpB!q3|_^|^pua_=_fT5&*eOCi#&$a5KpOQ9?xR$o_{0ZVWyO)D5L z*bjQO);Hy5NsM9UKyyaI61pi=`ZYs%5Ii3`8{!Lqm5D2F+CR(4iNYS+8u5{gcu;oz z$i6ly7D}FXn_)wlqoxbOnQC0~Fr;meyX1}fY{8rp|fmPv00glr0sW2*NMWajwg;Dpp01Ujay^S{) z)2NW8kcsep4sFJ+<*CwpZuxko;HUH)?YdL(G^HWkcSs}tOeg2s3O^4K5m80kjr z^4+IVDd3BY*tbRgW}hAy^8Cn+s#3(Dp>z~>xmLpkrn0Q{`3`NknA`rs?e2bIWqd_Gga^4;Sov86*21+u$tHHT1*>*;6Kp2j)mz5P-BN{4hU(a#V*e}Tsey%>9 z#BNSiGB#uD$8Alc&e(9blwavBc6jvxzV6Y)sw3J@9>d$6kf`p;sTe2xBNTNwvWItC z(?%9miUXvlEW*z?&cZP!JFG8&Tx7p40ujKu9&5~79PlF>q0$HAHy?TWp2Z8Hu zAq$8jlFl{LqCj?r$-E=vR8pvuIua0`MG8M1;vg0IueS9ibcxys+mgsAuYTdGLzN9M zm&E$k>yyls@$m4C=TPus)2YbD+%NV~*p}2SZY^D5X|W7_)eMiS)iyBFvvaYm9#5M1 z`?9L%c-F}7z_qH}+%bYEK91bK{p{ViKciP(4V~Rlyqkeq=*->tS-SR`_T4tpv~Rz# zPPs#OBO;W$N4sIP8-|z`@=iYg`kzTId#As!I=mqf0qL$kRJ#;p;(gy)R&6Q;KULa{ zsXG9mxjrcy`s*>8!lUMq0lrST?(L0WUJ`~%&v#MWvje4scWb*k(s>U2AyjAkz_N*Q zOk*k>-1yJe9uA8}`Xl+zKXd6Z2UU#xEt*l!| z=qoUfp(8j+K`|~%y^77pJdSFs?TTHKSr( zd=UKNlxohropoQp(rqE)tpP;0uBCJ@*LBWj4+ZB%-Tw0=Sh^aoiMoyXrxES@rzh@1 zD~ocT6-C-j!f593@_u}E-n7lI z^IG@xDEHLM2fe!4ztwtjZ&*Qk(R>|xWo}d`KkCMb$+W~0J1&krvbnZ6yo}PH{ySD< z8C-q@7d`F!6DPqtI&$YyZak)Ert|H5PCb0reqlYn3KO**bCmtK3jg#;T-_vqeH$%{ zx9Z^xR<*tlMbePXOMZRQPAy7)DZVQ%mu6>)qkaTNeZ?Fe|Jm{T%}rLXLQ+>hW3qQ+ zwj(|fNbwWQ^@94CfO^87)SH{Xum(#9Z95ln>Kit9=&nAGRtxY()A50Wi*)t6S^C-S z(oVC5Nsv9#DW}V*9*1{}jb1bT;erO9ozo7jpG2^p@)MT944}NE$0N z81LCeOW}lW9wIb}d@JzXtC-lO-8b>DX=K_D{e1a@x}(W)&C}#-J%?X9*{ii!1c6(N~adEBw?&P2@_&N-|X8o=8oidp#A#mEvR+exldh` zvxIJH2HNbve7ZMU)aS#PogB%^e&;3jmk&pxlQjT8rb{5KZ1U;tcfgQ= z>R!I<{N3CGZ?!83Rc6wgGu!BEpYo1kJV5O;{;Y*k?UEs)Ke|16eWW$h{o1qOwc(|B zEnrBP9QAOijZ5ZyS!86U`-%8HZ<+sP{&H~_RdKuT+P4E8lV#KZ5-8ozOddq^JjrK`tiFRAz7V5#Nx*_IX5R5|X$RDr^UX9|*L?&4ZrR6~ZNzP6bWT$uI+LaMsjwT)S_O58I>3^lr5ZW~&uX+_IH4k0=DL2Ml?I}jjuzWRs z8cl|$@7Ww~30I1WH;j19RPm{mIKw>9|2|)Kv0?|{#Pg22WY%x@3Ucz}*53KLze0^T z@JwgH>Cq1)xnsWvPX za@`1)CzFa*xgSc}S|e)^m`Dp`wG98n72s{TBL=0-K`cM+C#H`SNFaqSeGZp-V=3xI zX>Q*=MOr~j`~j-&0u;%aa}{PODsZMM$37r0lwXu^J}^O?hXRpJouf9Dvw?95M-zZ7 z)Co)u_Rs}Xkl4wdIzuTq$r3}L7)N`8;tTj>*q6QaNPS%99u3Xw0Z}Xu~xDU zXF22oo+W8LMAQ)fm#TtXhv}H>ZL7}{#?UHa=Hf{znJD^dbA08f2=(@FXHH2_mUo)x|_nKcGZ0Y_0s`3K;tHPDoUreV&;iaipc8gV!Ux8!1B16_1{ zl2tIh*3iwS-}@-e+_ZBUXB%aWNNao#=fLnbs)AUB8==WB-09nc!ez%z8&H)-4nEps zN-tpL1*wx=Vtb<{ua!UJQ^Z!^O_8eNV~|n>+sV;))bVvn8~8aPuHjAz)p z6%a;t`TkRg=R3aPhgm>U2%fdrdAp0_?l#^h(m>k=pG4KSQfih$H=hWnbx2y(AST!c zn3JipJGI6L?{EJ{wS>^@o3`lBesxL0nW!i9C)vCS40SO>=%Yx;@O{74E(4bG1d?^} zb{8B+41t)V{%4G7%JK-`?W%g9h`*#XP~X6s!!WRXFC;F7uviP8caW~$o>2OcT`#SF zGrekIegj@Gx}g}tHI)h0u(ta*(Y-p6pCM-x@u2RU4Ku zbaU;c8Pm^(9`bIE3jp>0MEfIV3`M=s+;BOi0LgvzmdVR_4db^}hT%t9U^%QF7=$@; zG5jvV=SBEyyXPGII;!-!CP}=AOQ;@c^G(u+uoMDIH;x_Ke6T*3^x`NWuF|;T*M@c! zSZDoKS;5IMk3_=Z54NDBwEuD$X=kRC$ANO5O|OvbSwQZfIMF(%xXUGAVIz{gnzd7~ zO#|Z6_lYf1X9FPs@;+e}Vs1RuF4H*ZTczREApD;ZISdbsO0;Jr9c;q$7dB`(XZZRp zS9h}7h+nRs01c%bpXn8i@-Omy$Wzp5hVd`-V;XoBj9*igx!;eqQ6)CuEHbI^`ehN)vSwVqF$ug(fwEBrK{7) z84Q#cWZyA)TxJtXIN$+g7)4eUG=qEd7vmbP!5s)g-?fwJ+)l-Mv!xF=j^S%EI)_6aS`Bkamg2YqsJ3sdqtKXB zxJ>Kii+EZ#(L;cO^`Q8I6EaYDEc+AzA!YxsFRB*dV}M`5(px$1`28mOX{YPh6nY|i zJxL+nH|ik4u00V-GGq8&4_)e_qi9&s*J$NekX~HhON&<8PfH>I%*Z!#gLilDncRRo-K-3hLN`!02lNY z-)Qql4ww>KUydh=9{4IF|CU=>S{DgV1*gV(u7D{+SO2X(%1Eq_(tjWFmIGrqXBoGG zW-<5ZpnCQ5pr%wSZQyYh#jS7oMv&I_ULJ+`j!)MRy8pje*uU9!zoTYPeo(pZ?0FC2 zs__DjL(=PDkN#?2J7GvoKVY*s$ryyYfCPjTWiNCN;p> zfC2DsAgNWR0WmH>qg*LRZ6{yEd9eAUy~eWqY)xb3W$l!zEe`oaiuS1w4P6m+1cmN0 zWfU;yRTza$sI%8FN9SCJn)RkV7hoKPU_zJlKWoDtD-3Xs-nE;Fe;FXHfLI%3zDGYw zmx8*ta$==)d4YDB)^h?)aoKM!}g$<{ibw_|`E(RbjAeKRFTe`p9R)F%# zc0Hb_o44IJNwAO@^Cs1xs3*Vcpgf7kHUj<-k6-eZ$Q_cv3@Arg<29gK0n}ba`kYX- zFvAdNy3lqnEV!WUs|Lxx=53Ol;*ySkb!|ck0FYWkbz>hu>XQ`eV()!SwDVw}{vFn| z)rAuq4z-0O7j66rb9QS_#FZkVVa4w|0K_YKC<9?AFlfSgIWB>3b-O)Xn? z*222c4RZp_7UbsQe}~?)r>|#Iar9Dn;%1aHVg8~4<5=f}rK{_dMBYY8BSyQvr$K%w zrBrvD`pxVI7gH5^HL*AOlW3mX;MOS)9-i(uJaSdSYrUHVxE3YYIHb00*EREc@%k!~ z@FMVlRZ*yzd4tzIhJBZlec))8F&h{w)O<{IDC-G)k(MuW+~E?bX+x3)bSR&$8GfZG z(Jp9g;YXHe%T8~N8+||sptUmQtn+h*5;*PnHK!gtz2iK>s~_s! zDW-eyaW zFd5EobCNp)Y(}N{v1@km{z>o1dS!cCZrDQv#WUV*4dXe<3k&i zPW`OPiI4!jhyY+Da+@FhoXjDl-!lI2F-|!Bs7!RDN6>+=lvS}B8@rmEZ#co_4be6I z>Nw#q;{Z$F@5TT4CAf1i`p6Y92Sg3Eztdx7;$u*or6I&U7)U?qjN6O|0=JU_r%3+b z(}QH4L*avGxXc9e1ER^EEIfw{Isl-%Y@k4N4%{+6Y!vc$;qsgqbss^j^YXtGUz4UE8M3R)H2LscQB6?K$lS8mGi%| zKB7xDKjEv365??RHB1z%dt|NY;<8yM9CxpL^n>2;%&vL0Z3UIV*w{h{ci-OV2boeD zh{E-ellAcH&tLFL<>>@+zqrg|DsX3C3G~5o8VorfSw~5=Sp%1+Hmb}y< zstUaTq63cPnUgAQUKd}4e{npmzip~s6P{_4EXdGi zg-emt*a)|7#Iu)jSL2hKdZ|l)^AU&9xu)%fOqhR%J$dtUt%WuM$9p`Pz&wNAN~eY( zpiH}kg`Y>1#Ipwy6QnoXn^~E(BoiNURyxX~eY0!nA1Sro%Vm-vn_pN|4#q}+%=qs? zpD9W1>CM-0m~9D^%fa_Y#W^8(jF30Z)ejQVr|?Zee6Mm<;gq6EZ*D!hU<4voDq0RS zFCUWw?$P~-N-K}&Ne<%r8I6#`{q6Axugz#}Ic9HK>cL1np{05iV5wp;6O-J4+0xlUGTgSIEl}Bslzl7U zTK%CZXq1q!A|>2$fO$={a%*&M;UQ>l>ONA!uCGpE9lD&FlUtvJpe?}dScJu zAwrI(iF*JPOGB@2<1{uT9huWdaO6@tt8LXh6^`e)YeW5YsTH>p(w0Of4yXQ9Dmix~ ziPN^#_%PX4M?ei96X4wj0M_n9DjQoG z&{DZzKn1$D?T^O5$O;}ar(*x5w%o2KCpof{cBH?MtOt+?k{F;wS7y<(H~UPs8-Nt*gl_;gd`cw!l3#(F+x>g31(>#5~yTsvxnrW_-RmD5pm1G_q zvsA5TDs~a9U|kn@V(?8_y$(Td)u%#FKimHjNs?g zB~cK41%Ng$E}0Hx=PY!-+2Lyqsq8S!nKoeJ?Jybs#zItbsF^@0l}(UOke(rX8YGk|gk+#^gHL*^!fVSTOxFK8rG}Fe72_OCP z<$kwzfW=F9WxtFf9E~j;{XnD_LymfPX1SYFrrDco;#Sqj$j3Hc}sLOcTTT!=vVd+INZ-nEyCRsx%9US?6fA{16$?DP*7YSL_ z`J1DiRvp<4wQWi_nOA&&I=$bMdBcZ_q5>szUomK)e>bsu?!%BYXN<)a;a4j-OQC(; zZ@iayKq*dJ&YHN6MR2*T3Vpq#uaWY5hR&K&AoMa<%a#VY_WZYM9w@vlO;9gr*hC}r zEQIE(mb^#>H*c8g2e-!=jo*8^teSiy1XZxKog4d!vf^bTO~;Sf>bM+BNWwLDR557(!wY%%w9 zJO6v9xdKInS)@u?e(L<_0ogm>W8(0+MrlU-L;l-kaFy{U@Lyz=+a zgmz&jejjW(1j0RjUd%Q7py69V;JAvdWFsBhcoa|s1id}|2 z6t-<>Gd6;Kjc}e7b2^8N(LjFJAoIsZGu>(8$OqGcs!AYi3H-WU22750`M>>_MBz7e z`-63jg%srYNy<1~Sypb9(R56d_iSz6qO7OiAcffBUg{RwTS4SI9@i7iduUCNtoyd; zU7arUyEJ)oWoBY!V02MnTB#$M{7Wm`I~XYHWP`{IRe z@qWp_{>h+=2E%U?pDbMhFX)$d9V>ng*{D+jR(R>TcgN0JM_s4Sxv+`{+ty(as znX!4BkZ@3FNVnAGVY=x@ABtVu(ShE`e4vGN_=h+rAF_D7JEc=IWh2v^#d@r-uWwLj z0q6#i{IopD`$daawYBH{!aGy#)kpR44UJ;*{0P&`n_D9lK-jiuC>7UN`A@2TNO9Sw zOX;~1l)&1WmNbk`7hAWABJP20#?+v^@t)qTg!K_0O`{Qc(vOwt z_7Vp9dKr)>I}gI9m!hofoP+qst$37Fhx=xx$j`hzb)JCy?r|fAUANf=HA_{}#AxCQ zHQ@X)#Jv@WPtZ|H;G8SUMtHNnK(fT*!CBxaO&4k(Kbss!E2Lr)ayqMqN?xeDfX630cJi1a3(j6~mOIBpjB{-FxQu z{zXj!6dCW~kc5FRMLChL;*gj_ZS^|KFwNcy+_Z_f=X$m*OL!dgF$@nvQ?g!>ZQmHx zNT`*_1vSmfzA6|3p!t)XGD$?izkOPz*hNz|x;)TX$9*h{ls7z9x!Yg>iaeTD~w44Ki&Uxj+K-||#o zp>OEe%Y|7f7s*fto8>vR?x^4zXsSC={eWn*+TSeGw`s~Dp8=U=T1}eR4H#-V!7yps zqQC8l|HQfg#8g2=6FUN#33<@^TJQR3xWHiQY+h(0=V7c>OL3tk%c;D+Z|rF(0Wm=t zGt3^h{$VRVF)dxRz9QW5+?8slOn>=<;mR2Q&jJ6u`P;ZBSp z>AYQC&>Q&5I z&gs%nrA|!m`2NZIv&^apiyoG#XRiuYW>j*0!uk;2(aVMXDM!qj3DaR7dMCw0mj0Wf zfkj+t>qD0)xDs4l_Fg4ipMgN5q^6gU#7KWa6MLqFMY7CD$G8F6&zN`ryl>!5&^UK1^EjN=t@@ zRCft5MV8mtc3@ShpROx7LRp{mr95k0Qc~T#tv91TY%xa1BFvnSQU0NTf%9P>v(;1g zg~V|$y=dteCUj0!K<50@rL93`GP$aHOZD=wEuG$wUszL@XpqIWi|x83(8#;ecDc4$ z(@Dkb9$hpUx)2J(@As@qm7XmA%4Ej#P}W*>a2Z{od%0i?6YfN zCn=s4JHl<4*`Wu43OAOzHb`w2tOUHqpdMtHmQMd=4MAq_ORC$2^_O(vobZT$J+z*c zSPe^De{^X`MG=YOkXQNk$MIdeX6QJslszf|k(cOraEKk?3Om-O*b+OiAd7)V0 z^L%)a4e6oe-18FMW<$Uum7yMzk{CI#(rc>Q$T~$OmxfFnB+)MqSvLWY+4Ro3Gu$4$ z)Oz^k&XoIP{6hHg)Okbec!C#HXHAiJt-78pedvE_&{4DXMEJgPAseER4lL}UQTdpi z564vFd~(L{r+I`ToxUz^JU<;asakXl= z*;*Q!OxLCxqm>2?xnGpNQM?N`^X&O5&HR`@uI4HvQE;K#HSR=pcpJrkJ?TO8a=YKw z`683^H7pcblaFnUbqtvNe4f3lQ3f_<(1D&>6U(B2gy07n4XfuQ1bi^an^^2yp;8qt zr-9-86r9<-95vks$X+t3Djnq_^1ys~3#c%y9Y)Mj>z;ER`(eNhnCyjiF~k2u^l;(Iv&i~(pkIA9)IaWW;@90d0#ndN49~WO2Gw?rG9iA z_u7iH3{Y}Sv)28EWdqfmz*8G}a^k+}T}Pi66n?E$D^_(<@)kBha=&&iD0$=}Fh^Rw z86|^b8c;g!E|!5IGN7Dv!|pP`3Vik@@5_|XiEQr&D1X6XycJ5qaoT#;DydBaFC2dy z7JxTZ7$Jf11i1#&$bVe0d`>eMs}rW>dFpddSUl~(ecKcC`hs6@TI#X&x4r2D_iv|z zCAsQMP+cz&H7Y#UEay6jOo{rNDxRg{Llp_e=KutPH33L^9!94G>2Cm`DRG%6BR){z ze~OlAk(STM_x;C@3*6yJc)p$1*E1u$UU!A`Mf_xabQmqK`|*r^#83P$)b{F9oUuZ^ zfmm3SfmVCNf5$jnr;syG_Sia#fPlB_RPj}~6YZrt9uWpDj~CYy?u-@QPTu4u?B?4C zIN&C6flnVDf;lZFyT3i1sMsB(+bGF`8)$txI6`2AOPP~#E!1H*&3wDxRA zs|nqlJ7uRA)`7P66@~#Q9-gZLa*ID_ybszo+llr;p_>nmMM0YdalMj3A5TT^%|5iV^71J@;e*Occ!uM-+z3iDYaB z?ddtiAodC$e_ao9z)>P}7}WE70AC%j+d z)*4xaupH>GLr5{587G={U(OJBygqg>Xq*@0pnlfw><|f;kh5Zrr5@`@i_Xbr`8y_8 z6w%};xD4cf8ASgq5P2v9JhOgUz}=H;8^+a!)?;a)~RAiUvhQ!{~Z}a9|zTM8{Ho$u`NA; zxi9fP*c>*fceJO!y;%Ji^#boYlfE|dEQqc zq%u(df1MbA{hwdFIV=hCN?{!b>D!fRIt8@_CRfjkF|9RiC|Fi~C$7oHHPWilb;9hH z{-N?)gQ$wMy2&-7fAeDi+)r_*&Pzf~`iBe;{)i=(WFy2y1}ftMJ8g4Nky)@2gb-i9 zZB_WvWVJ17Ts#$M*H(jPt)D{yrQWK2FmijH)wY$m^BN|4 z0yt*ZBv`JJ+ZwaESq8H~;Xlk}r4{^>xp269>rw($KrdL_A@CB-P31qy3Esq|gWs=S z1~p4H-gzS0BTFAozF}UDo(zdY^vb0TJUp?P6RuDr%_=bkkyg!GwEc|$k1(rtCG$dm zV&vHJl5lW)>3p#!d--h&v{Z#XJ2SgWuVtO@uZbc7n7qPGh-Q;;p^-bHV{bgF_SP3X?pY3GRTSpt-G$9?nz4Q;j7 zcIPuaL%6FMFi0I#ArzYjdC&;8)~nkK4Cr%eBWK@juYA~C82ebA#%wq~u;1m_MW5$W zQLLZotm!=c+3K@+M|k0}%I>Z{NVZfroqZ+KuZsu(7V;5aQDFND@3yGjoj1L46*^W8hVPyYT%w(ZdhKjC|&C z6?-?NoLUzjCyb7hFllJ{CsvL;aVC}4)P_{GJyo@Q9hf`D%=+wIeD$wstee<4*taCG zo(b?&3zRsJn(p4+Y;el~Q|vGct5D2lS9hNo{&y46HJ~*h$cqRLy03xDp|$9JAD83C z@aIWOYyXB)?QI>3jZ(uQ!M(OQj;7$|xdpfDKLV7t67_MTdcKbn{+LmnGNxVlLgq8` z{}_7p$--`6TBP49($6*MJ!FY zn^mjkZS3a?XuCZ9qQCOZy3|jsFRvn8?oOui{6cSK&-cVJR$Xw%0r6d&2(0gQ{uw@u zz=$&j_Tla2|M~x_lEiXlF5mg9&{D*?VPiWO?-;F!uxvG8TNRnJ4;yKZro}t%c1+K* zMz)L9UT#D_-s2YAqf+dX&$o1)Rje~nhclPT0P~GroYV5;pE}9HOSc0VZ6^x#qf7>N zh1wt{gh3bsL>KEF@TSgLx|;ohQ+H8p=fDc7r{fAq%p6iN z=XAG1MYgD0;U{Z`yj68~_wKa81|^&A^(qm?c1@~Bhv-h^d#&CQ7ocHq(RH5*IZRq+ zx?}O#={lu{ySTGeqbFciQzgf_e?vby;Sw6K0-uLR@X%@p%k*{feQ!x~MCw#Li7WHf z8QJZsi5P5KZ-Y2n>sK1YM+kR@YCrZJy^TECsN3800BW;!9`&{eosvbKztGJBPK?3h zuV1Ri9Zl#L+K5{`W-8pyQeBWZ!Jo6h&@?I@Fjj1NxcMoZ*K1V5LMj!wopW}H6|}G< zIkwa#`)R#n@C6P37)g?C^rk3J+NUevw_tkzt6a3^<`*m#r8SNWsw4MNz8|V4C1~mP z*6>^XU*oy*u}uZCUHuCo`Q>#dqWSAz@Y&|dchWS_$|TwOU})AWUxy9iH72qyvf0S* z*@wvj4C-yvjisYN(JiWE`;q$kY=^e!2}Dce9t*=yWp1Ap2O(kh{;A*aLhqF}Y6n|f zzw(E?cP?i4WcAyJ16SLn+^>7Q#kRh8dOWH*U>M%c7TnvENWId2CXF`a&r|GS@$4#& zZtI=D_UA)I`qCqowZhI+*ZAFH7k5?~n?Q~gnqlR|b#>stm0q)0O5?qS6ORNmU^3%I z3%=ud1KVVg-zd)hF6h!=Doh;SZupG&dB^(z;&fxMMRv?%%Ky(2z@KhBXP9!{5eV@h z&kLq>cw+)9#i1uF&VJ>&s^u-Fk&kNiR=ks&&{Tz17Jl2|wd8X>ioJL_xn-Z&6SV*A zDZ~H96RiEL^`2xH5UOidQI_6Ek>!>he-pm|HkX(yxHp@6=bvydFdVlfVUg)6t4=c- zJp>Ya)?nM4?zwX`x76rx1EKHurcHECzAm*;+eLKM@{l9NleGQrT#pSUtFqbY7Y6b5 z{}UjkOlF4N_?NiJShIqTypIg%eeT+XRIC8X=Jc4luf4=J%w5{_WcSLAM~gSl;*UH1 zw~*r}-~kJ}DMBOc|B4cu?}Bt!0QNlft%&n_qEXhja&_|e*F)~cM0=@j_~$S5!af?v zF__)uqE{b_1l~0fSNYmR-2!6cFwdF|THhW#aR>U%*e(%t8rZW#T$fGA zEr^+j|Q_zDs7Rxo8rNTBvlQ95zqH<4p5$Aq0K$@>*$s^~7`{2rBVoa-LO{Bxi!tDz#T_xec_0=8}^$o_jV z+Yfmlq-c8oY?L&RO8;eqoEdC}BbDhl?K@BOd+%wU@{v zxi9>}P$Ugsl%oetl7AXL4m-&a4j;wIb40L!pLV)%f16?Z_WV1U?MLrRt$a?(R_IW7 z-b+bniR$>0cP^GT9!dJsCg_y(G$_s>C78~n6kNjB@E6L11-lYYEA8G7NX6XGN55wT z+P_dzE8Li>P#?EH{2$Q#jhXgrAlrkb#s?XwZ5cbE~EjI&~yG zS`MT@Ed@uEgFhg21Xj4Nj4QaUI~LQ9R8{G&v}7YOnyY0wh8R|S8wYLLCeE391#&4s zOWc~CCkamna;q5{7N9a73kgN=%D&Yma-fVQvVd^-qCUTS==fon>z%z8EP~1{vw38E ze-3lzV!zDf*k@07ts&cyxNZWR82fnd_8Ha&-Yk7p-4fTeMILAnca(82yiq+$ZCJPt zZ{hmwfyKlxaDVz7l4TtPH6qVd`RRLq{O!L!@wqhRO0GlWr;_S43^+GO%Gy!HL&ioq z5Kgpe4zx4oOz3(^bFR0vAK8PyJ^Z4fwu_*po9-9|?z{@o`OzNunz|MZLr3tx7`4D*{`2>i!Na61Ca!pzb~*?yZ0;&T6;q3E(hI(!A8UX;ga6nOEU z&e6>hTGAK@P9-oYH*NHUU_Yp+U^6G1a}uRQt%g5_7{DRMJJv3-<&SXG^N|cMHc1d{`q|Z%^2^b2d)8II-stsKSqN*qGf#yMdWbyCqHe;BE3FC6P${1gw

    D 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 z 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%0D}jYknT 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�>?Lk3dFM6Qb~!M4<(rY27w3L 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

    QOnEjJ;yC|boyUL5A{=;G@3*b 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 z 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

    ^NoL2#A6H@H*%vNZM6&Qn2|XZWvtZJfw#yQpJV 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

    VK)|VtcCHk`AcL1AfcM%QkA*&Ky>MHY(8Yuw4hv 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 -@OT3gnT-m4 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 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 @@ From 49b58d35fd60d15406a4f2fecea982fb3de82f9f Mon Sep 17 00:00:00 2001 From: ines Date: Tue, 3 Oct 2017 14:18:49 +0200 Subject: [PATCH 465/739] Update JavaScript --- website/_includes/_scripts.jade | 53 ++- website/assets/js/chart.min.js | 14 + website/assets/js/in-view.min.js | 6 + website/assets/js/main.js | 329 +++++++++++++++++- website/assets/js/{prism.js => prism.min.js} | 0 .../js/{quickstart.js => quickstart.min.js} | 0 6 files changed, 371 insertions(+), 31 deletions(-) create mode 100644 website/assets/js/chart.min.js create mode 100644 website/assets/js/in-view.min.js rename website/assets/js/{prism.js => prism.min.js} (100%) rename website/assets/js/{quickstart.js => quickstart.min.js} (100%) 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/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("

    Szi%!Of)(Ky)~HOvLM~Sg#noB<@x#3U>gJ1 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 a!r`>~@nt4A+93i{1EFmdOggmxGx=X_m@4A{ diff --git a/website/assets/img/social/preview_alpha.jpg b/website/assets/img/social/preview_alpha.jpg index 6da62256986825cb2b62f10610a18a2bf3ef6818..821db408a0447461206e3481eca4be2ba3681b3c 100644 GIT binary patch literal 386720 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 U-_Sr61^43=f^zs~jvRaN>7O0W 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

  • ");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
    
    From 9af604f0da5676103b5cbbae2147abdb1e5ce089 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:20:13 +0200
    Subject: [PATCH 466/739] Update layout templates, partials and mixins
    
    ---
     website/404.jade                    |   3 +-
     website/_includes/_footer.jade      |  12 +-
     website/_includes/_functions.jade   |  70 ++++++--
     website/_includes/_mixins-base.jade | 124 +++++++++-----
     website/_includes/_mixins.jade      | 249 ++++++++++++++++------------
     website/_includes/_navigation.jade  |  20 +--
     website/_includes/_newsletter.jade  |   9 +-
     website/_includes/_page-docs.jade   |  61 ++++---
     website/_includes/_page_models.jade |  77 +++++++++
     website/_includes/_sidebar.jade     |  24 ++-
     website/_layout.jade                |  19 ++-
     11 files changed, 436 insertions(+), 232 deletions(-)
     create mode 100644 website/_includes/_page_models.jade
    
    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/_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 b140151b2..4876c6b6b 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,33 @@ 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
    -    prompt    - [string] prompt or 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, prompt, 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 = (prompt == 'accept' || prompt == 'reject')
    +        - 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(data-prompt=icon ? null : prompt)
    +        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-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 +165,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 #[+icon("github")] #[code=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 +216,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 +252,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 +285,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 +297,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 +311,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 +345,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 +431,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..6370f1b94
    --- /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-no-block
    +                        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/_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/_layout.jade b/website/_layout.jade
    index b198c8333..31c6ce6c3 100644
    --- a/website/_layout.jade
    +++ b/website/_layout.jade
    @@ -2,11 +2,15 @@
     
     include _includes/_mixins
     
    +- title = IS_MODELS ? LANGUAGES[current.source] || title : title
    +- 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}
    @@ -24,23 +28,20 @@ html(lang="en")
         meta(property="og:url" content="#{SITE_URL}/#{current.path.join('/')}")
         meta(property="og:title" content="#{title} - spaCy")
         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: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")
     
    @@ -48,7 +49,7 @@ html(lang="en")
             include _includes/_svg
             include _includes/_navigation
     
    -        if SECTION == "docs"
    +        if !landing
                 include _includes/_page-docs
     
             else
    
    From 3f4fd2c5d5d61d9a939a563ff3747b57fba6ef25 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:26:20 +0200
    Subject: [PATCH 467/739] Update usage documentation
    
    ---
     website/docs/_data.json                       |  28 -
     website/docs/index.jade                       |  25 -
     website/docs/usage/_data.json                 | 420 --------------
     website/docs/usage/_models-list.jade          |  24 -
     website/docs/usage/deep-learning.jade         |  92 ---
     website/docs/usage/index.jade                 | 353 ------------
     website/docs/usage/production-use.jade        | 147 -----
     website/docs/usage/showcase.jade              |  44 --
     website/docs/usage/spacy-101.jade             | 430 --------------
     website/docs/usage/text-classification.jade   |   5 -
     website/docs/usage/training-ner.jade          | 114 ----
     website/docs/usage/tutorials.jade             |  38 --
     website/docs/usage/v2.jade                    | 531 ------------------
     .../_adding-languages/_language-data.jade}    | 354 +++---------
     website/usage/_adding-languages/_testing.jade |  76 +++
     .../usage/_adding-languages/_training.jade    |  93 +++
     website/usage/_data.json                      | 195 +++++++
     website/usage/_deep-learning/_dynet.jade      |  11 +
     .../usage/_deep-learning/_pre-processing.jade |   3 +
     website/usage/_deep-learning/_pytorch.jade    |  91 +++
     .../usage/_deep-learning/_scikit-learn.jade   |  15 +
     .../_deep-learning/_tensorflow-keras.jade     |  11 +
     website/usage/_deep-learning/_thinc.jade      |  66 +++
     .../_facts-figures/_benchmarks-choi-2015.jade |  45 ++
     .../_facts-figures/_benchmarks-models.jade    |  48 ++
     website/usage/_facts-figures/_benchmarks.jade | 206 +++++++
     .../_facts-figures/_feature-comparison.jade   |  58 ++
     .../_facts-figures/_other-libraries.jade      |  70 +++
     website/usage/_install/_changelog.jade        |  31 +
     website/usage/_install/_instructions.jade     | 185 ++++++
     website/usage/_install/_quickstart.jade       |  26 +
     website/usage/_install/_troubleshooting.jade  | 147 +++++
     .../_dependency-parse.jade}                   |  25 +-
     .../_named-entities.jade}                     |  78 +--
     .../_linguistic-features/_pos-tagging.jade}   |  26 +-
     .../_rule-based-matching.jade}                |  29 +-
     .../_linguistic-features/_tokenization.jade}  |  95 +++-
     website/usage/_models/_available-models.jade  |  22 +
     website/usage/_models/_install-basics.jade    |  33 ++
     .../_models/_install.jade}                    |  87 +--
     website/usage/_models/_production.jade        |  81 +++
     website/usage/_models/_quickstart.jade        |  17 +
     .../_processing-pipelines/_examples.jade      | 126 +++++
     .../_multithreading.jade                      |  40 ++
     .../_processing-pipelines/_pipelines.jade}    | 198 ++-----
     .../_processing-pipelines/_serialization.jade |  38 ++
     .../_processing-pipelines/_user-hooks.jade    |  61 ++
     .../usage/_spacy-101/_architecture.jade       | 116 ++--
     website/usage/_spacy-101/_community-faq.jade  | 141 +++++
     .../usage/_spacy-101/_language-data.jade      |  30 +-
     .../_spacy-101/_lightning-tour.jade}          |  56 +-
     .../usage/_spacy-101/_named-entities.jade     |   4 +-
     .../usage/_spacy-101/_pipelines.jade          |  16 +-
     .../usage/_spacy-101/_pos-deps.jade           |   4 +-
     .../usage/_spacy-101/_serialization.jade      |   0
     .../usage/_spacy-101/_similarity.jade         |   0
     .../usage/_spacy-101/_tokenization.jade       |   8 +-
     .../usage/_spacy-101/_training.jade           |   6 +-
     .../{docs => }/usage/_spacy-101/_vocab.jade   |   6 +-
     .../usage/_spacy-101/_word-vectors.jade       |   4 +-
     .../_training/_basics.jade}                   |  34 +-
     website/usage/_training/_ner.jade             |  61 ++
     .../_training/_saving-loading.jade}           |  90 ++-
     website/usage/_training/_similarity.jade      |   3 +
     website/usage/_training/_tagger-parser.jade   |   3 +
     website/usage/_training/_textcat.jade         |  13 +
     .../usage/_vectors-similarity/_basics.jade    |  15 +
     .../usage/_vectors-similarity/_custom.jade    |  91 +++
     website/usage/_vectors-similarity/_gpu.jade   |  30 +
     .../_vectors-similarity/_in-context.jade}     |  45 +-
     website/usage/adding-languages.jade           |  59 ++
     website/usage/deep-learning.jade              |  29 +
     website/usage/examples.jade                   |  73 +++
     website/usage/facts-figures.jade              |  32 ++
     website/usage/index.jade                      |  27 +
     website/usage/linguistic-features.jade        |  38 ++
     website/usage/models.jade                     |  37 ++
     website/usage/processing-pipelines.jade       |  25 +
     website/usage/resources.jade                  | 125 +++++
     website/usage/spacy-101.jade                  | 300 ++++++++++
     website/usage/text-classification.jade        |   9 +
     website/usage/training.jade                   |  33 ++
     website/usage/v2.jade                         | 520 +++++++++++++++++
     website/usage/vectors-similarity.jade         |  18 +
     website/{docs => }/usage/visualizers.jade     |  10 +-
     85 files changed, 3906 insertions(+), 3143 deletions(-)
     delete mode 100644 website/docs/_data.json
     delete mode 100644 website/docs/index.jade
     delete mode 100644 website/docs/usage/_data.json
     delete mode 100644 website/docs/usage/_models-list.jade
     delete mode 100644 website/docs/usage/deep-learning.jade
     delete mode 100644 website/docs/usage/index.jade
     delete mode 100644 website/docs/usage/production-use.jade
     delete mode 100644 website/docs/usage/showcase.jade
     delete mode 100644 website/docs/usage/spacy-101.jade
     delete mode 100644 website/docs/usage/text-classification.jade
     delete mode 100644 website/docs/usage/training-ner.jade
     delete mode 100644 website/docs/usage/tutorials.jade
     delete mode 100644 website/docs/usage/v2.jade
     rename website/{docs/usage/adding-languages.jade => usage/_adding-languages/_language-data.jade} (62%)
     create mode 100644 website/usage/_adding-languages/_testing.jade
     create mode 100644 website/usage/_adding-languages/_training.jade
     create mode 100644 website/usage/_data.json
     create mode 100644 website/usage/_deep-learning/_dynet.jade
     create mode 100644 website/usage/_deep-learning/_pre-processing.jade
     create mode 100644 website/usage/_deep-learning/_pytorch.jade
     create mode 100644 website/usage/_deep-learning/_scikit-learn.jade
     create mode 100644 website/usage/_deep-learning/_tensorflow-keras.jade
     create mode 100644 website/usage/_deep-learning/_thinc.jade
     create mode 100644 website/usage/_facts-figures/_benchmarks-choi-2015.jade
     create mode 100644 website/usage/_facts-figures/_benchmarks-models.jade
     create mode 100644 website/usage/_facts-figures/_benchmarks.jade
     create mode 100644 website/usage/_facts-figures/_feature-comparison.jade
     create mode 100644 website/usage/_facts-figures/_other-libraries.jade
     create mode 100644 website/usage/_install/_changelog.jade
     create mode 100644 website/usage/_install/_instructions.jade
     create mode 100644 website/usage/_install/_quickstart.jade
     create mode 100644 website/usage/_install/_troubleshooting.jade
     rename website/{docs/usage/dependency-parse.jade => usage/_linguistic-features/_dependency-parse.jade} (93%)
     rename website/{docs/usage/entity-recognition.jade => usage/_linguistic-features/_named-entities.jade} (74%)
     rename website/{docs/usage/pos-tagging.jade => usage/_linguistic-features/_pos-tagging.jade} (76%)
     rename website/{docs/usage/rule-based-matching.jade => usage/_linguistic-features/_rule-based-matching.jade} (95%)
     rename website/{docs/usage/customizing-tokenizer.jade => usage/_linguistic-features/_tokenization.jade} (76%)
     create mode 100644 website/usage/_models/_available-models.jade
     create mode 100644 website/usage/_models/_install-basics.jade
     rename website/{docs/usage/models.jade => usage/_models/_install.jade} (67%)
     create mode 100644 website/usage/_models/_production.jade
     create mode 100644 website/usage/_models/_quickstart.jade
     create mode 100644 website/usage/_processing-pipelines/_examples.jade
     create mode 100644 website/usage/_processing-pipelines/_multithreading.jade
     rename website/{docs/usage/language-processing-pipeline.jade => usage/_processing-pipelines/_pipelines.jade} (56%)
     create mode 100644 website/usage/_processing-pipelines/_serialization.jade
     create mode 100644 website/usage/_processing-pipelines/_user-hooks.jade
     rename website/{docs => }/usage/_spacy-101/_architecture.jade (83%)
     create mode 100644 website/usage/_spacy-101/_community-faq.jade
     rename website/{docs => }/usage/_spacy-101/_language-data.jade (86%)
     rename website/{docs/usage/lightning-tour.jade => usage/_spacy-101/_lightning-tour.jade} (82%)
     rename website/{docs => }/usage/_spacy-101/_named-entities.jade (90%)
     rename website/{docs => }/usage/_spacy-101/_pipelines.jade (89%)
     rename website/{docs => }/usage/_spacy-101/_pos-deps.jade (95%)
     rename website/{docs => }/usage/_spacy-101/_serialization.jade (100%)
     rename website/{docs => }/usage/_spacy-101/_similarity.jade (100%)
     rename website/{docs => }/usage/_spacy-101/_tokenization.jade (90%)
     rename website/{docs => }/usage/_spacy-101/_training.jade (94%)
     rename website/{docs => }/usage/_spacy-101/_vocab.jade (96%)
     rename website/{docs => }/usage/_spacy-101/_word-vectors.jade (98%)
     rename website/{docs/usage/training.jade => usage/_training/_basics.jade} (89%)
     create mode 100644 website/usage/_training/_ner.jade
     rename website/{docs/usage/saving-loading.jade => usage/_training/_saving-loading.jade} (70%)
     create mode 100644 website/usage/_training/_similarity.jade
     create mode 100644 website/usage/_training/_tagger-parser.jade
     create mode 100644 website/usage/_training/_textcat.jade
     create mode 100644 website/usage/_vectors-similarity/_basics.jade
     create mode 100644 website/usage/_vectors-similarity/_custom.jade
     create mode 100644 website/usage/_vectors-similarity/_gpu.jade
     rename website/{docs/usage/word-vectors-similarities.jade => usage/_vectors-similarity/_in-context.jade} (72%)
     create mode 100644 website/usage/adding-languages.jade
     create mode 100644 website/usage/deep-learning.jade
     create mode 100644 website/usage/examples.jade
     create mode 100644 website/usage/facts-figures.jade
     create mode 100644 website/usage/index.jade
     create mode 100644 website/usage/linguistic-features.jade
     create mode 100644 website/usage/models.jade
     create mode 100644 website/usage/processing-pipelines.jade
     create mode 100644 website/usage/resources.jade
     create mode 100644 website/usage/spacy-101.jade
     create mode 100644 website/usage/text-classification.jade
     create mode 100644 website/usage/training.jade
     create mode 100644 website/usage/v2.jade
     create mode 100644 website/usage/vectors-similarity.jade
     rename website/{docs => }/usage/visualizers.jade (97%)
    
    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/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 c8373a095..000000000
    --- a/website/docs/usage/_data.json
    +++ /dev/null
    @@ -1,420 +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",
    -            "Text classification": "text-classification",
    -            "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"
    -    },
    -
    -    "text-classification": {
    -        "title": "Text classification",
    -        "next": "training"
    -    },
    -
    -    "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 a0aa1dca8..000000000
    --- a/website/docs/usage/index.jade
    +++ /dev/null
    @@ -1,353 +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'}) spacy download en
    -    +qs({model: 'de'}) spacy download de
    -    +qs({model: 'fr'}) spacy download fr
    -    +qs({model: 'es'}) 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.
    -        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 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(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]. 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(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/production-use.jade b/website/docs/usage/production-use.jade
    deleted file mode 100644
    index d4a1ffbc2..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 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
    -
    -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 ac3e808b3..000000000
    --- a/website/docs/usage/spacy-101.jade
    +++ /dev/null
    @@ -1,430 +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 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 of 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 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("/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/text-classification.jade b/website/docs/usage/text-classification.jade
    deleted file mode 100644
    index 33e384dbd..000000000
    --- a/website/docs/usage/text-classification.jade
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -//- 💫 DOCS > USAGE > TEXT CLASSIFICATION
    -
    -include ../../_includes/_mixins
    -
    -+under-construction
    diff --git a/website/docs/usage/training-ner.jade b/website/docs/usage/training-ner.jade
    deleted file mode 100644
    index 3c74f7a9d..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").
    -    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 6d98e3f05..000000000
    --- a/website/docs/usage/v2.jade
    +++ /dev/null
    @@ -1,531 +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-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]
    -        +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-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
    -    |  #[strong API:] #[+api("textcategorizer") #[code TextCategorizer]],
    -    |  #[+api("doc#attributes") #[code Doc.cats]],
    -    |  #[+api("goldparse#attributes") #[code GoldParse.cats]]#[br]
    -    |  #[strong Usage:] #[+a("/docs/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
    -    |  #[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").
    -    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 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/adding-languages.jade b/website/usage/_adding-languages/_language-data.jade
    similarity index 62%
    rename from website/docs/usage/adding-languages.jade
    rename to website/usage/_adding-languages/_language-data.jade
    index b341c9f9b..81a6d638e 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
    @@ -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
     
    @@ -547,7 +494,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 +507,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").
    -    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..3c37ee4d1
    --- /dev/null
    +++ b/website/usage/_data.json
    @@ -0,0 +1,195 @@
    +{
    +    "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",
    +            "Examples": "examples",
    +            "Multi-threading": "multithreading",
    +            "User Hooks": "user-hooks",
    +            "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",
    +        "next": "resources"
    +    },
    +
    +    "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"
    +        }
    +    },
    +
    +    "examples": {
    +        "title": "Code Examples",
    +        "teaser": "Full code examples you can modify and run.",
    +        "next": "resources",
    +        "menu": {
    +            "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..208e7da48
    --- /dev/null
    +++ b/website/usage/_facts-figures/_benchmarks-models.jade
    @@ -0,0 +1,48 @@
    +//- 💫 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.
    +
    ++under-construction
    +
    ++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].
    +
    ++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
    diff --git a/website/usage/_facts-figures/_benchmarks.jade b/website/usage/_facts-figures/_benchmarks.jade
    new file mode 100644
    index 000000000..fa0e26763
    --- /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/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..92ac69050
    --- /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/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..10132a646
    --- /dev/null
    +++ b/website/usage/_install/_instructions.jade
    @@ -0,0 +1,185 @@
    +//- 💫 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, "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 76%
    rename from website/docs/usage/pos-tagging.jade
    rename to website/usage/_linguistic-features/_pos-tagging.jade
    index effc185e9..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
    @@ -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 95%
    rename from website/docs/usage/rule-based-matching.jade
    rename to website/usage/_linguistic-features/_rule-based-matching.jade
    index 71400ea55..88a713ffc 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,7 @@ 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(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 +141,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,7 +183,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
    ++h(3, "quantifiers") Using operators and quantifiers
     
     p
         |  The matcher also lets you use quantifiers, specified as the #[code 'OP']
    @@ -221,7 +220,7 @@ p
             +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 +245,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 +282,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 +320,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 0bc81771d..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,16 +24,14 @@ 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 idiosyncrasies that require custom
    @@ -46,7 +41,7 @@ p
     +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.
    @@ -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 67%
    rename from website/docs/usage/models.jade
    rename to website/usage/_models/_install.jade
    index 7421e8aad..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}) 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 "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_md
    -
    -    # download exact model version (doesn't create shortcut link)
    -    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
    -    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
    @@ -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/_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/_examples.jade b/website/usage/_processing-pipelines/_examples.jade
    new file mode 100644
    index 000000000..616bed32c
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_examples.jade
    @@ -0,0 +1,126 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > EXAMPLES
    +
    +p
    +    |  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(3, "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(3, "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")) #[code __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("/usage/training#saving-loading") saving and loading models].
    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/docs/usage/language-processing-pipeline.jade b/website/usage/_processing-pipelines/_pipelines.jade
    similarity index 56%
    rename from website/docs/usage/language-processing-pipeline.jade
    rename to website/usage/_processing-pipelines/_pipelines.jade
    index 03f6c28f5..d09ed4ead 100644
    --- a/website/docs/usage/language-processing-pipeline.jade
    +++ b/website/usage/_processing-pipelines/_pipelines.jade
    @@ -1,12 +1,4 @@
    -//- 💫 DOCS > USAGE > PIPELINE
    -
    -include ../../_includes/_mixins
    -
    -+h(2, "101") Pipelines 101
    -
    -include _spacy-101/_pipelines
    -
    -+h(2, "pipelines") How pipelines work
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > PIPELINES
     
     p
         |  spaCy makes it very easy to create your own pipelines consisting of
    @@ -15,11 +7,11 @@ p
         |  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].
    +    |  #[+a("/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
    +    |  #[+a("/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:
    @@ -29,7 +21,7 @@ p
             "name": "example_model",
             "lang": "en"
             "description": "Example model for spaCy",
    -        "pipeline": ["token_vectors", "tagger"]
    +        "pipeline": ["tensorizer", "tagger"]
         }
     
     +list("numbers")
    @@ -56,24 +48,50 @@ p
     
     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.
    +    |  #[code.u-break ["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
    +    |  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(pipeline=pipeline)           # 2. initialise it with the pipeline
    +    nlp.from_disk(model_data_path)         # 3. 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.
    -    |  Components all return the modified document, which is then processed by
    -    |  the component next in the pipeline.
    +    |  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')
         for proc in nlp.pipeline:
             doc = proc(doc)
     
    -+h(2, "creating") Creating pipeline components and factories
    ++h(3, "creating") Creating pipeline components and factories
     
     p
         |  spaCy lets you customise the pipeline with your own components. Components
    @@ -82,7 +100,7 @@ p
         |  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
    ++h(4, "creating-component") Creating a  component
     
     p
         |  A component receives a #[code Doc] object and
    @@ -103,7 +121,7 @@ p
             +cell #[code Doc]
             +cell The #[code Doc] object processed by the previous component.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Doc]
             +cell The #[code Doc] object processed by this pipeline component.
    @@ -123,7 +141,7 @@ p
         nlp = spacy.load('en')
         nlp.pipeline.append(my_component)
     
    -+h(3, "creating-factory") Creating a factory
    ++h(4, "creating-factory") Creating a factory
     
     p
         |  A factory is a #[strong function that returns a pipeline component].
    @@ -149,7 +167,7 @@ p
                 |  Shared data between components, including strings, morphology,
                 |  vectors etc.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell callable
             +cell The pipeline component.
    @@ -171,148 +189,22 @@ p
         |  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
    +    |  #[+a("/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("/usage/training#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
    ++h(3, "disabling") Disabling pipeline components
     
     p
         |  If you don't need a particular component of the pipeline – for
    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/usage/_processing-pipelines/_user-hooks.jade b/website/usage/_processing-pipelines/_user-hooks.jade
    new file mode 100644
    index 000000000..e7dce53fe
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_user-hooks.jade
    @@ -0,0 +1,61 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > ATTRIBUTE HOOKS
    +
    +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].
    +
    ++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/_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..f91248bfd
    --- /dev/null
    +++ b/website/usage/_spacy-101/_community-faq.jade
    @@ -0,0 +1,141 @@
    +//- 💫 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.
    +
    ++aside("Contributing to spacy.io")
    +    |  All showcase and tutorial links are stored in a
    +    |  #[+a(gh("spaCy", "website/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", 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 86%
    rename from website/docs/usage/_spacy-101/_language-data.jade
    rename to website/usage/_spacy-101/_language-data.jade
    index 1f75b47e8..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.
     
    @@ -27,15 +27,13 @@ p
         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 2b0cf0880..061ec7758 100644
    --- a/website/docs/usage/lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -1,13 +1,11 @@
    -//- 💫 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").
         spacy download en
    @@ -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,9 +169,9 @@ 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
    @@ -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 90%
    rename from website/docs/usage/_spacy-101/_tokenization.jade
    rename to website/usage/_spacy-101/_tokenization.jade
    index d6911387c..602209ec8 100644
    --- a/website/docs/usage/_spacy-101/_tokenization.jade
    +++ b/website/usage/_spacy-101/_tokenization.jade
    @@ -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 96%
    rename from website/docs/usage/_spacy-101/_vocab.jade
    rename to website/usage/_spacy-101/_vocab.jade
    index 3063262d5..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
    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 70%
    rename from website/docs/usage/saving-loading.jade
    rename to website/usage/_training/_saving-loading.jade
    index de7e4ed33..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")
    @@ -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 72%
    rename from website/docs/usage/word-vectors-similarities.jade
    rename to website/usage/_vectors-similarity/_in-context.jade
    index 937fbfbd0..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.
    @@ -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/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..75d05e339
    --- /dev/null
    +++ b/website/usage/examples.jade
    @@ -0,0 +1,73 @@
    +//- 💫 DOCS > USAGE > EXAMPLES
    +
    +include ../_includes/_mixins
    +
    ++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..0bb96780e
    --- /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("examples")
    +    +h(2, "examples") Examples
    +    include _processing-pipelines/_examples
    +
    ++section("multithreading")
    +    +h(2, "multithreading") Multi-threading
    +    include _processing-pipelines/_multithreading
    +
    ++section("user-hooks")
    +    +h(2, "user-hooks") User hooks
    +    include _processing-pipelines/_user-hooks
    +
    ++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..33a2a45aa
    --- /dev/null
    +++ b/website/usage/resources.jade
    @@ -0,0 +1,125 @@
    +//- 💫 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("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..8737c0b76
    --- /dev/null
    +++ b/website/usage/v2.jade
    @@ -0,0 +1,520 @@
    +//- 💫 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").
    +        # 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/pipeline.svg
    +
    +    +infobox
    +        |  #[+label-inline API:] #[+api("language") #[code Language]]
    +        |  #[+label-inline Usage:] #[+a("/usage/language-processing-pipeline") Processing text]
    +
    +    +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 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("/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/docs/usage/visualizers.jade b/website/usage/visualizers.jade
    similarity index 97%
    rename from website/docs/usage/visualizers.jade
    rename to website/usage/visualizers.jade
    index 96a6bd49f..39d34aea6 100644
    --- a/website/docs/usage/visualizers.jade
    +++ b/website/usage/visualizers.jade
    @@ -1,6 +1,6 @@
     //- 💫 DOCS > USAGE > VISUALIZERS
     
    -include ../../_includes/_mixins
    +include ../_includes/_mixins
     
     p
         |  As of v2.0, our popular visualizers, #[+a(DEMOS_URL + "/displacy") displaCy]
    @@ -19,8 +19,8 @@ p
         |  #[+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
    +    |  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
    @@ -148,7 +148,7 @@ p
         |  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].
    +    |  #[+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.
     
    @@ -274,7 +274,7 @@ p
         |  #[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")
    ++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
    
    From 808f7ee417a0aa9d6828eec12297472ba1eddab3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:27:22 +0200
    Subject: [PATCH 468/739] Update API documentation
    
    ---
     website/api/_annotation/_biluo.jade           |  43 ++
     .../api/_annotation/_dep-labels.jade          |   0
     .../api/_annotation/_named-entities.jade      |   0
     .../{docs => }/api/_annotation/_pos-tags.jade |   0
     website/api/_architecture/_cython.jade        | 115 ++++++
     website/api/_architecture/_nn-model.jade      | 141 +++++++
     website/{docs => }/api/_data.json             | 127 +++---
     .../api/cli.jade => api/_top-level/_cli.jade} | 122 +++---
     website/api/_top-level/_compat.jade           |  91 ++++
     .../_top-level/_displacy.jade}                |  24 +-
     .../spacy.jade => api/_top-level/_spacy.jade} |  64 ++-
     .../util.jade => api/_top-level/_util.jade}   |  62 ++-
     website/api/annotation.jade                   | 131 ++++++
     website/{docs => }/api/binder.jade            |   2 +-
     website/api/dependencyparser.jade             |   5 +
     website/{docs => }/api/doc.jade               |  48 ++-
     website/api/entityrecognizer.jade             |   5 +
     website/{docs => }/api/goldcorpus.jade        |   6 +-
     website/{docs => }/api/goldparse.jade         |  14 +-
     website/api/index.jade                        |  14 +
     website/{docs => }/api/language.jade          |  42 +-
     website/api/lemmatizer.jade                   |   5 +
     website/{docs => }/api/lexeme.jade            |  14 +-
     website/{docs => }/api/matcher.jade           |  23 +-
     website/api/phrasematcher.jade                | 181 ++++++++
     website/api/pipe.jade                         | 390 ++++++++++++++++++
     website/{docs => }/api/span.jade              |  32 +-
     website/{docs => }/api/stringstore.jade       |  22 +-
     website/api/tagger.jade                       |   5 +
     website/api/tensorizer.jade                   |   5 +
     website/api/textcategorizer.jade              |  19 +
     website/{docs => }/api/token.jade             |  45 +-
     website/{docs => }/api/tokenizer.jade         |  16 +-
     website/api/top-level.jade                    |  24 ++
     website/api/vectors.jade                      | 333 +++++++++++++++
     website/{docs => }/api/vocab.jade             | 131 +++++-
     website/docs/api/annotation.jade              | 156 -------
     website/docs/api/dependencyparser.jade        | 111 -----
     website/docs/api/entityrecognizer.jade        | 109 -----
     website/docs/api/index.jade                   | 241 -----------
     website/docs/api/language-models.jade         |  93 -----
     website/docs/api/tagger.jade                  |  93 -----
     website/docs/api/tensorizer.jade              |   7 -
     website/docs/api/textcategorizer.jade         |  21 -
     website/docs/api/vectors.jade                 |   7 -
     website/usage/_models/_languages.jade         |  72 ++++
     46 files changed, 2070 insertions(+), 1141 deletions(-)
     create mode 100644 website/api/_annotation/_biluo.jade
     rename website/{docs => }/api/_annotation/_dep-labels.jade (100%)
     rename website/{docs => }/api/_annotation/_named-entities.jade (100%)
     rename website/{docs => }/api/_annotation/_pos-tags.jade (100%)
     create mode 100644 website/api/_architecture/_cython.jade
     create mode 100644 website/api/_architecture/_nn-model.jade
     rename website/{docs => }/api/_data.json (55%)
     rename website/{docs/api/cli.jade => api/_top-level/_cli.jade} (74%)
     create mode 100644 website/api/_top-level/_compat.jade
     rename website/{docs/api/displacy.jade => api/_top-level/_displacy.jade} (91%)
     rename website/{docs/api/spacy.jade => api/_top-level/_spacy.jade} (72%)
     rename website/{docs/api/util.jade => api/_top-level/_util.jade} (87%)
     create mode 100644 website/api/annotation.jade
     rename website/{docs => }/api/binder.jade (79%)
     create mode 100644 website/api/dependencyparser.jade
     rename website/{docs => }/api/doc.jade (97%)
     create mode 100644 website/api/entityrecognizer.jade
     rename website/{docs => }/api/goldcorpus.jade (71%)
     rename website/{docs => }/api/goldparse.jade (95%)
     create mode 100644 website/api/index.jade
     rename website/{docs => }/api/language.jade (92%)
     create mode 100644 website/api/lemmatizer.jade
     rename website/{docs => }/api/lexeme.jade (98%)
     rename website/{docs => }/api/matcher.jade (96%)
     create mode 100644 website/api/phrasematcher.jade
     create mode 100644 website/api/pipe.jade
     rename website/{docs => }/api/span.jade (97%)
     rename website/{docs => }/api/stringstore.jade (96%)
     create mode 100644 website/api/tagger.jade
     create mode 100644 website/api/tensorizer.jade
     create mode 100644 website/api/textcategorizer.jade
     rename website/{docs => }/api/token.jade (96%)
     rename website/{docs => }/api/tokenizer.jade (96%)
     create mode 100644 website/api/top-level.jade
     create mode 100644 website/api/vectors.jade
     rename website/{docs => }/api/vocab.jade (66%)
     delete mode 100644 website/docs/api/annotation.jade
     delete mode 100644 website/docs/api/dependencyparser.jade
     delete mode 100644 website/docs/api/entityrecognizer.jade
     delete mode 100644 website/docs/api/index.jade
     delete mode 100644 website/docs/api/language-models.jade
     delete mode 100644 website/docs/api/tagger.jade
     delete mode 100644 website/docs/api/tensorizer.jade
     delete mode 100644 website/docs/api/textcategorizer.jade
     delete mode 100644 website/docs/api/vectors.jade
     create mode 100644 website/usage/_models/_languages.jade
    
    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 100%
    rename from website/docs/api/_annotation/_pos-tags.jade
    rename to website/api/_annotation/_pos-tags.jade
    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/docs/api/_data.json b/website/api/_data.json
    similarity index 55%
    rename from website/docs/api/_data.json
    rename to website/api/_data.json
    index e413f200c..83b98f1fa 100644
    --- a/website/docs/api/_data.json
    +++ b/website/api/_data.json
    @@ -1,29 +1,32 @@
     {
         "sidebar": {
    -        "Introduction": {
    -            "Facts & Figures": "./",
    -            "Languages": "language-models",
    -            "Annotation Specs": "annotation"
    +        "Overview": {
    +            "Architecture": "./",
    +            "Annotation Specs": "annotation",
    +            "Functions": "top-level"
             },
    -        "Top-level": {
    -            "spacy": "spacy",
    -            "displacy": "displacy",
    -            "Utility Functions": "util",
    -            "Command line": "cli"
    -        },
    -        "Classes": {
    +        "Containers": {
                 "Doc": "doc",
                 "Token": "token",
                 "Span": "span",
    +            "Lexeme": "lexeme"
    +        },
    +
    +        "Pipeline": {
                 "Language": "language",
    -            "Tokenizer": "tokenizer",
    +            "Pipe": "pipe",
                 "Tensorizer": "tensorizer",
                 "Tagger": "tagger",
                 "DependencyParser": "dependencyparser",
                 "EntityRecognizer": "entityrecognizer",
                 "TextCategorizer": "textcategorizer",
    +            "Tokenizer": "tokenizer",
    +            "Lemmatizer": "lemmatizer",
                 "Matcher": "matcher",
    -            "Lexeme": "lexeme",
    +            "PhraseMatcher": "phrasematcher"
    +        },
    +
    +        "Other": {
                 "Vocab": "vocab",
                 "StringStore": "stringstore",
                 "Vectors": "vectors",
    @@ -34,52 +37,37 @@
         },
     
         "index": {
    -        "title": "Facts & Figures",
    -        "next": "language-models"
    +        "title": "Architecture",
    +        "next": "annotation",
    +        "menu": {
    +            "Basics": "basics",
    +            "Neural Network Model": "nn-model",
    +            "Cython Conventions": "cython"
    +        }
         },
     
    -    "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"
    +    "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"
         },
     
    @@ -103,6 +91,7 @@
     
         "vocab": {
             "title": "Vocab",
    +        "teaser": "A storage class for vocabulary and other data shared across a language.",
             "tag": "class",
             "source": "spacy/vocab.pyx"
         },
    @@ -115,10 +104,27 @@
     
         "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",
    @@ -127,18 +133,22 @@
     
         "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"
         },
    @@ -149,15 +159,23 @@
             "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"
         },
     
    @@ -169,23 +187,38 @@
     
         "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"
    +        "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 74%
    rename from website/docs/api/cli.jade
    rename to website/api/_top-level/_cli.jade
    index 26aa1f883..52884988e 100644
    --- a/website/docs/api/cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -1,26 +1,17 @@
    -//- 💫 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 spacy --help].
     
    -+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]).
     
    @@ -49,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()]].
    @@ -95,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,
    @@ -122,15 +113,15 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    -+h(2, "convert") Convert
    ++h(3, "convert") Convert
     
     p
    -    |  Convert files into spaCy's #[+a("/docs/api/annotation#json-input") JSON format]
    +    |  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", "$").
    ++code(false, "bash", "$", false, false, true).
         spacy convert [input_file] [output_dir] [--n-sents] [--morphology]
     
     +table(["Argument", "Type", "Description"])
    @@ -159,14 +150,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", "$").
    -    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
    @@ -204,6 +199,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
    @@ -219,12 +235,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.
    @@ -236,98 +258,96 @@ 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 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, "package") Package
     
     p
    -    |  Generate a #[+a("/docs/usage/saving-loading#generating") model Python package]
    +    |  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
    @@ -336,8 +356,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", "$").
    -    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
    @@ -353,14 +373,14 @@ p
         +row
             +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
    -            |  Create a meta.json file on the command line, even if one already
    -            |  exists in the directory.
    +            |  #[+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 72%
    rename from website/docs/api/spacy.jade
    rename to website/api/_top-level/_spacy.jade
    index a45307378..c14f62f7e 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,57 @@ 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")
    ++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 +113,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,18 +137,18 @@ 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
    ++h(3, "spacy.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]
    +    |  #[+a("/usage/processing-pipelines") processing pipeline]
         |  component. Factories are useful for creating stateful components, especially ones which depend on shared data.
     
     +aside-code("Example").
    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 97%
    rename from website/docs/api/doc.jade
    rename to website/api/doc.jade
    index 7fbbcce97..85932c605 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,7 +133,7 @@ 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.
    @@ -172,7 +170,7 @@ p Create a #[code Span] object from the slice #[code doc.text[start : end]].
             +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.
    @@ -200,7 +198,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.
    @@ -226,7 +224,7 @@ p
             +cell int
             +cell The attribute ID
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell A dictionary mapping attributes to integer counts.
    @@ -251,7 +249,7 @@ p
             +cell list
             +cell A list of attribute ID ints.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
             +cell
    @@ -285,7 +283,7 @@ p
             +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.
    @@ -326,7 +324,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.
    @@ -341,7 +339,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
    @@ -367,7 +365,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.
    @@ -378,7 +376,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").
    @@ -405,7 +403,7 @@ p
                 |  attributes are inherited from the syntactic root token of
                 |  the span.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell
    @@ -440,7 +438,7 @@ p
             +cell bool
             +cell Don't include arcs or modifiers.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell dict
             +cell Parse tree as dict.
    @@ -462,7 +460,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.
    @@ -485,7 +483,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.
    @@ -507,7 +505,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.
    @@ -525,7 +523,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.
    @@ -544,7 +542,7 @@ p
         assert doc.vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the document's semantics.
    @@ -564,7 +562,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.
    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 95%
    rename from website/docs/api/goldparse.jade
    rename to website/api/goldparse.jade
    index 03118343d..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.
    @@ -119,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
    @@ -157,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 92%
    rename from website/docs/api/language.jade
    rename to website/api/language.jade
    index 69665ee9d..617c81599 100644
    --- a/website/docs/api/language.jade
    +++ b/website/api/language.jade
    @@ -1,10 +1,10 @@
     //- 💫 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.
     
     +h(2, "init") Language.__init__
         +tag method
    @@ -49,7 +49,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 +77,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
    @@ -136,9 +136,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.
    @@ -175,7 +175,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.
    @@ -200,7 +200,7 @@ p
             +cell -
             +cell Config parameters.
     
    -    +footrow
    +    +row("foot")
             +cell yields
             +cell tuple
             +cell An optimizer.
    @@ -242,7 +242,7 @@ p
             +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.
    @@ -271,7 +271,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
    @@ -300,14 +300,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.
    @@ -332,10 +332,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.
    @@ -362,14 +362,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
    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 98%
    rename from website/docs/api/lexeme.jade
    rename to website/api/lexeme.jade
    index 6e3f68493..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,7 +127,7 @@ p A real-valued meaning representation.
         assert apple.vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the lexeme's semantics.
    @@ -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..5c49a03d5
    --- /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 = Matcher(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 Matcher
    +
    +    matcher = Matcher(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 len(matcher) == 0
    +    matcher.add('OBAMA', None, nlp(u"Barack Obama"))
    +    assert len(matcher) == 1
    +
    ++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 97%
    rename from website/docs/api/span.jade
    rename to website/api/span.jade
    index 72821ab04..067e709f0 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.
     
    @@ -40,7 +40,7 @@ p Create a Span object from the #[code slice doc[start : end]].
             +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,7 +111,7 @@ 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.
    @@ -140,7 +140,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.
    @@ -167,7 +167,7 @@ p
             +cell list
             +cell A list of attribute ID ints.
     
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[long, ndim=2]]
             +cell
    @@ -194,7 +194,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.
    @@ -216,7 +216,7 @@ p
         assert new_york.root.text == 'York'
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code Token]
             +cell The root token.
    @@ -233,7 +233,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.
    @@ -250,7 +250,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.
    @@ -267,7 +267,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.
    @@ -285,7 +285,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.
    @@ -304,7 +304,7 @@ p
         assert doc[1:].vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the span's semantics.
    @@ -323,7 +323,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 96%
    rename from website/docs/api/token.jade
    rename to website/api/token.jade
    index db445d09b..4eebc262c 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,7 +46,7 @@ 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.
    @@ -68,7 +68,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 +93,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 +114,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 +139,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 +158,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 +177,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 +194,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 +211,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 +230,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,7 +248,7 @@ p A real-valued meaning representation.
         assert apples.vector.shape == (300,)
     
     +table(["Name", "Type", "Description"])
    -    +footrow
    +    +row("foot")
             +cell returns
             +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
             +cell A 1D numpy array representing the token's semantics.
    @@ -268,7 +268,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 +280,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]
    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/docs/api/annotation.jade b/website/docs/api/annotation.jade
    deleted file mode 100644
    index ce18878b7..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 description 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 c6943b410..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").
    -    spacy download en
    -    spacy download de
    -    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/tensorizer.jade b/website/docs/api/tensorizer.jade
    deleted file mode 100644
    index 9abd6793b..000000000
    --- a/website/docs/api/tensorizer.jade
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -//- 💫 DOCS > API > TENSORIZER
    -
    -include ../../_includes/_mixins
    -
    -p Add a tensor with position-sensitive meaning representations to a #[code Doc].
    -
    -+under-construction
    diff --git a/website/docs/api/textcategorizer.jade b/website/docs/api/textcategorizer.jade
    deleted file mode 100644
    index 926d957f7..000000000
    --- a/website/docs/api/textcategorizer.jade
    +++ /dev/null
    @@ -1,21 +0,0 @@
    -//- 💫 DOCS > API > TEXTCATEGORIZER
    -
    -include ../../_includes/_mixins
    -
    -p
    -    |  Add text categorization models to spaCy pipelines. The model supports
    -    |  classification with multiple, non-mutually exclusive labels.
    -
    -p
    -    |  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.
    -
    -+under-construction
    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/usage/_models/_languages.jade b/website/usage/_models/_languages.jade
    new file mode 100644
    index 000000000..abdad01ad
    --- /dev/null
    +++ b/website/usage/_models/_languages.jade
    @@ -0,0 +1,72 @@
    +//- 💫 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")
    +    |  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].
    +
    ++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')
    
    From 22dd929b65d62cdeb1fd65ceb9b304e15b7b90d9 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:28:03 +0200
    Subject: [PATCH 469/739] Add models documentation
    
    ---
     .gitignore                |  2 +-
     website/models/_data.json | 95 +++++++++++++++++++++++++++++++++++++
     website/models/de.jade    |  6 +++
     website/models/en.jade    |  6 +++
     website/models/es.jade    |  6 +++
     website/models/fr.jade    |  6 +++
     website/models/index.jade | 98 +++++++++++++++++++++++++++++++++++++++
     website/models/xx.jade    |  6 +++
     8 files changed, 224 insertions(+), 1 deletion(-)
     create mode 100644 website/models/_data.json
     create mode 100644 website/models/de.jade
     create mode 100644 website/models/en.jade
     create mode 100644 website/models/es.jade
     create mode 100644 website/models/fr.jade
     create mode 100644 website/models/index.jade
     create mode 100644 website/models/xx.jade
    
    diff --git a/.gitignore b/.gitignore
    index cb0a8e84e..572eea92d 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -1,7 +1,7 @@
     # spaCy
     spacy/data/
     corpora/
    -models/
    +/models/
     keys/
     
     # Website
    diff --git a/website/models/_data.json b/website/models/_data.json
    new file mode 100644
    index 000000000..cc26b9bc9
    --- /dev/null
    +++ b/website/models/_data.json
    @@ -0,0 +1,95 @@
    +{
    +    "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)",
    +        "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"
    +    },
    +
    +    "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",
    +        "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.
    
    From 319fac14fe979375faf5fb93db5efbc3c6d0a64c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:28:18 +0200
    Subject: [PATCH 470/739] Update global config and landing page
    
    ---
     website/_data.json |  49 +++++++----
     website/_harp.json |  80 ++++--------------
     website/index.jade | 199 ++++++++++++++++++++++-----------------------
     3 files changed, 145 insertions(+), 183 deletions(-)
    
    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..55035c32f 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.0",
    +        "V_JS": "2.0",
             "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/index.jade b/website/index.jade
    index 9336d5c34..0155ab295 100644
    --- a/website/index.jade
    +++ b/website/index.jade
    @@ -8,61 +8,48 @@ 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
    @@ -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
    
    From 23019d1daa9768f222cd2e94467451eb61eb885a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:28:24 +0200
    Subject: [PATCH 471/739] Add styleguide
    
    ---
     website/styleguide.jade | 623 ++++++++++++++++++++++++++++++++++++++++
     1 file changed, 623 insertions(+)
     create mode 100644 website/styleguide.jade
    
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    new file mode 100644
    index 000000000..107f7e2e6
    --- /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 a 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.
    
    From b24fbd8aad5075af611a3f5dc624da57ba4d6983 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 14:54:33 +0200
    Subject: [PATCH 472/739] Fix titles for social cards
    
    ---
     website/_layout.jade | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/website/_layout.jade b/website/_layout.jade
    index 31c6ce6c3..49a025d96 100644
    --- a/website/_layout.jade
    +++ b/website/_layout.jade
    @@ -3,6 +3,7 @@
     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
    @@ -26,13 +27,13 @@ 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=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=social_img)
     
    
    From b0dfa059db69ecbbd5134779f86de1c72c2580d4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 15:19:55 +0200
    Subject: [PATCH 473/739] Update docs link in about.py
    
    ---
     spacy/about.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index 0ae019946..b8b1dbbf6 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -11,7 +11,7 @@ __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'
    
    From e49cd7aeaf81ed12490d82b8a65ca93088ec916e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 15:22:19 +0200
    Subject: [PATCH 474/739] Move import into load to avoid circular imports
    
    ---
     spacy/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index 1cb7c0cbd..9acc566ad 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -3,12 +3,12 @@ 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 . import util
     
     
     def load(name, **overrides):
    +    from .deprecated import resolve_load_name
         name = resolve_load_name(name, **overrides)
         return util.load_model(name, **overrides)
     
    
    From 5fb057b5754d1c4aa41c2d0c82f37bf89edd99ed Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 15:45:07 +0200
    Subject: [PATCH 475/739] Fix secondary font stack
    
    ---
     website/assets/css/_variables.sass | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/assets/css/_variables.sass b/website/assets/css/_variables.sass
    index 4fafbfca5..fbceb5a6f 100644
    --- a/website/assets/css/_variables.sass
    +++ b/website/assets/css/_variables.sass
    @@ -21,7 +21,7 @@ $headings: (1: 4.4, 2: 3.4, 3: 2.6, 4: 2.2, 5: 1.8)
     //  Fonts
     
     $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" !default
    +$font-secondary: "HK Grotesk", Roboto, Helvetica, Arial, sans-serif !default
     $font-code: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default
     
     // Colors
    
    From 02586a52431865a165439098bff8482cae96397a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:14:34 -0500
    Subject: [PATCH 476/739] Add timing to spacy evaluate command
    
    ---
     spacy/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index 1cb7c0cbd..58a2f10a6 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -4,7 +4,7 @@ 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
     
     
    
    From 96da86b3e5d3a515f0f8db57ef1704750233ff38 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:14:57 -0500
    Subject: [PATCH 477/739] Add support for verbose flag to Language
    
    ---
     spacy/language.py | 6 ++++--
     1 file changed, 4 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 701b5c140..c49c64b1d 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -388,7 +388,7 @@ class Language(object):
             self._optimizer.device = device
             return self._optimizer
     
    -    def evaluate(self, docs_golds):
    +    def evaluate(self, docs_golds, verbose=False):
             scorer = Scorer()
             docs, golds = zip(*docs_golds)
             docs = list(docs)
    @@ -401,7 +401,9 @@ class Language(object):
                     docs = list(pipe.pipe(docs))
             assert len(docs) == len(golds)
             for doc, gold in zip(docs, golds):
    -            scorer.score(doc, gold)
    +            if verbose:
    +                print(doc)
    +            scorer.score(doc, gold, verbose=verbose)
             return scorer
     
         @contextmanager
    
    From a44c4c3a5b91dcf85681df57865942a888485a65 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:15:35 -0500
    Subject: [PATCH 478/739] Add timer to evaluate
    
    ---
     spacy/cli/evaluate.py | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index 209660529..f409821b1 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -32,18 +32,25 @@ numpy.random.seed(0)
         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),
     )
    -def evaluate(cmd, model, data_path, gold_preproc=False):
    +def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
         """
         Train a model. Expects data in spaCy's JSON format.
         """
    +    util.use_gpu(gpu_id)
         util.set_env_log(True)
         data_path = util.ensure_path(data_path)
         if not data_path.exists():
             prints(data_path, title="Evaluation data not found", exits=1)
         corpus = GoldCorpus(data_path, data_path)
         nlp = util.load_model(model)
    -    scorer = nlp.evaluate(list(corpus.dev_docs(nlp, gold_preproc=gold_preproc)))
    +    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('Time', end-begin, 'words', nwords, 'w.p.s', nwords/(end-begin))
         print_results(scorer)
     
     
    
    From 338e1fda0effda0b749926c38dec6f19a2dd6b6f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 09:41:05 -0500
    Subject: [PATCH 479/739] Unbreak merge artefact
    
    ---
     spacy/__init__.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/__init__.py b/spacy/__init__.py
    index 25af17361..ba2479106 100644
    --- a/spacy/__init__.py
    +++ b/spacy/__init__.py
    @@ -3,7 +3,6 @@ from __future__ import unicode_literals
     
     from .cli.info import info as cli_info
     from .glossary import explain
    -<<<<<<< HEAD
     from .deprecated import resolve_load_name
     #from .about import __version__
     from .about import __version__
    
    From e514d6aa0a0fe82a2ebc9cf4d867532769dcb26a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 18:39:57 +0200
    Subject: [PATCH 480/739] Import thinc modules more explicitly, to avoid cycles
    
    ---
     spacy/_ml.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 62fc7543f..77d6e0615 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -1,10 +1,12 @@
     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.model import Model
    +from thinc.neural._classes.maxout import Maxout
    +from thinc.neural._classes.softmax import Softmax
    +from thinc.neural._classes.affine import Affine
     from thinc.neural._classes.hash_embed import HashEmbed
     from thinc.neural.ops import NumpyOps, CupyOps
     from thinc.neural.util import get_array_module
    -import thinc.extra.load_nlp
     import random
     import cytoolz
     
    @@ -13,7 +15,7 @@ from thinc.neural._classes.static_vectors import StaticVectors
     from thinc.neural._classes.batchnorm import BatchNorm as BN
     from thinc.neural._classes.layernorm import LayerNorm as LN
     from thinc.neural._classes.resnet import Residual
    -from thinc.neural import ReLu
    +from thinc.neural._classes.relu import ReLu
     from thinc.neural._classes.selu import SELU
     from thinc import describe
     from thinc.describe import Dimension, Synapses, Biases, Gradient
    @@ -23,6 +25,7 @@ from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool
     from thinc.neural._classes.attention import ParametricAttention
     from thinc.linear.linear import LinearModel
     from thinc.api import uniqued, wrap, flatten_add_lengths, noop
    +import thinc.extra.load_nlp
     
     
     from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER
    
    From cbb1fbef80a15fe2f8415cd698d9f8b78c48ef04 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 18:38:55 +0200
    Subject: [PATCH 481/739] Update train_ner_standalone example
    
    ---
     examples/training/train_ner_standalone.py | 19 +++++++------------
     1 file changed, 7 insertions(+), 12 deletions(-)
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    index 6cca56c69..e4fb1d1e8 100644
    --- a/examples/training/train_ner_standalone.py
    +++ b/examples/training/train_ner_standalone.py
    @@ -20,9 +20,10 @@ 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 tqdm
     
     from spacy.vocab import Vocab
     from spacy.pipeline import TokenVectorEncoder, NeuralEntityRecognizer
    @@ -35,6 +36,7 @@ from spacy.gold import minibatch
     from spacy.scorer import Scorer
     import spacy.util
     
    +
     try:
         unicode
     except NameError:
    @@ -55,20 +57,17 @@ def init_vocab():
     
     
     class Pipeline(object):
    -    def __init__(self, vocab=None, tokenizer=None, tensorizer=None, entity=None):
    +    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 tensorizer is None:
    -            tensorizer = TokenVectorEncoder(vocab)
             if entity is None:
                 entity = NeuralEntityRecognizer(vocab)
             self.vocab = vocab
             self.tokenizer = tokenizer
    -        self.tensorizer = tensorizer
             self.entity = entity
    -        self.pipeline = [tensorizer, self.entity]
    +        self.pipeline = [self.entity]
     
         def begin_training(self):
             for model in self.pipeline:
    @@ -102,10 +101,8 @@ class Pipeline(object):
             golds = [self.make_gold(input_, annot) for input_, annot in
                      zip(inputs, annots)]
     
    -        tensors, bp_tensors = self.tensorizer.update(docs, golds, drop=drop)
    -        d_tensors = self.entity.update((docs, tensors), golds, drop=drop,
    -                                      sgd=sgd, losses=losses)
    -        bp_tensors(d_tensors, sgd=sgd)
    +        self.entity.update(docs, golds, drop=drop,
    +                           sgd=sgd, losses=losses)
             return losses
     
         def evaluate(self, examples):
    @@ -123,7 +120,6 @@ class Pipeline(object):
             elif not path.is_dir():
                 raise IOError("Can't save pipeline to %s\nNot a directory" % path)
             self.vocab.to_disk(path / 'vocab')
    -        self.tensorizer.to_disk(path / 'tensorizer')
             self.entity.to_disk(path / 'ner')
     
         def from_disk(self, path):
    @@ -133,7 +129,6 @@ class Pipeline(object):
             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.tensorizer = self.tensorizer.from_disk(path / 'tensorizer')
             self.entity = self.entity.from_disk(path / 'ner')
     
     
    
    From 4a59f6358cfb1926f363b5c094ce5d9d47608928 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 19:21:26 +0200
    Subject: [PATCH 482/739] Fix thinc imports
    
    ---
     spacy/pipeline.pyx         | 6 ++++--
     spacy/syntax/nn_parser.pyx | 5 ++++-
     spacy/tests/test_misc.py   | 3 ++-
     3 files changed, 10 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 1a12107b7..f6ee257d8 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,7 +13,10 @@ 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.model import Model
    +from thinc.neural._classes.maxout import Maxout
    +from thinc.neural._classes.softmax import Softmax
    +from thinc.neural._classes.affine import Affine
     from thinc.neural._classes.hash_embed import HashEmbed
     from thinc.neural.util import to_categorical
     
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1efdc4474..4043d6dd3 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -38,7 +38,10 @@ from preshed.maps cimport MapStruct
     from preshed.maps cimport map_get
     
     from thinc.api import layerize, chain, noop, clone, with_flatten
    -from thinc.neural import Model, Affine, ReLu, Maxout
    +from thinc.neural._classes.model import Model
    +from thinc.neural._classes.affine import Affine
    +from thinc.neural._classes.relu import ReLu
    +from thinc.neural._classes.maxout import Maxout
     from thinc.neural._classes.batchnorm import BatchNorm as BN
     from thinc.neural._classes.selu import SELU
     from thinc.neural._classes.layernorm import LayerNorm
    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
     
     
    
    From 80a2fb619316b205d3688c608e8027f69bb387a2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 3 Oct 2017 19:40:39 +0200
    Subject: [PATCH 483/739] Update visualizers docs and add submenu
    
    ---
     website/usage/_data.json                 |  10 +-
     website/usage/_visualizers/_dep.jade     |  62 ++++
     website/usage/_visualizers/_ent.jade     |  80 +++++
     website/usage/_visualizers/_html.jade    | 162 +++++++++
     website/usage/_visualizers/_jupyter.jade |  36 ++
     website/usage/visualizers.jade           | 424 +++--------------------
     6 files changed, 393 insertions(+), 381 deletions(-)
     create mode 100644 website/usage/_visualizers/_dep.jade
     create mode 100644 website/usage/_visualizers/_ent.jade
     create mode 100644 website/usage/_visualizers/_html.jade
     create mode 100644 website/usage/_visualizers/_jupyter.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 3c37ee4d1..b34304ed6 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -167,7 +167,15 @@
     
         "visualizers": {
             "title": "Visualizers",
    -        "next": "resources"
    +        "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": {
    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..701d4b683
    --- /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 and them 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/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/visualizers.jade b/website/usage/visualizers.jade
    index 39d34aea6..a092404ac 100644
    --- a/website/usage/visualizers.jade
    +++ b/website/usage/visualizers.jade
    @@ -2,383 +2,47 @@
     
     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")) #[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.
    -
    -+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("/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.: 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))
    -
    -+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.
    ++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
    
    From 5454b20cd7dbb41da577578e55274e556db00a4c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 20:07:17 +0200
    Subject: [PATCH 484/739] Update thinc imports for 6.9
    
    ---
     spacy/_ml.py               | 31 +++++++++++++------------------
     spacy/pipeline.pyx         | 18 ++++++++----------
     spacy/syntax/nn_parser.pyx | 10 +++-------
     3 files changed, 24 insertions(+), 35 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 77d6e0615..47f5c545e 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -1,33 +1,28 @@
     import ujson
    +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.neural._classes.model import Model
    -from thinc.neural._classes.maxout import Maxout
    -from thinc.neural._classes.softmax import Softmax
    -from thinc.neural._classes.affine import Affine
    -from thinc.neural._classes.hash_embed import HashEmbed
    +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 as BN
    -from thinc.neural._classes.layernorm import LayerNorm as LN
    -from thinc.neural._classes.resnet import Residual
    -from thinc.neural._classes.relu import ReLu
    -from thinc.neural._classes.selu import SELU
     from thinc import describe
     from thinc.describe import Dimension, Synapses, Biases, Gradient
     from thinc.neural._classes.affine import _set_dimensions_if_needed
    -from thinc.api import FeatureExtracter, with_getitem
    -from thinc.neural.pooling import Pooling, max_pool, mean_pool, sum_pool
    -from thinc.neural._classes.attention import ParametricAttention
    -from thinc.linear.linear import LinearModel
    -from thinc.api import uniqued, wrap, flatten_add_lengths, noop
     import thinc.extra.load_nlp
     
    -
     from .attrs import ID, ORTH, LOWER, NORM, PREFIX, SUFFIX, SHAPE, TAG, DEP, CLUSTER
     from .tokens.doc import Doc
     from . import util
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index f6ee257d8..8d935335c 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -13,20 +13,18 @@ import ujson
     import msgpack
     
     from thinc.api import add, layerize, chain, clone, concatenate, with_flatten
    -from thinc.neural._classes.model import Model
    -from thinc.neural._classes.maxout import Maxout
    -from thinc.neural._classes.softmax import Softmax
    -from thinc.neural._classes.affine import 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
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 4043d6dd3..459c94463 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -38,13 +38,9 @@ from preshed.maps cimport MapStruct
     from preshed.maps cimport map_get
     
     from thinc.api import layerize, chain, noop, clone, with_flatten
    -from thinc.neural._classes.model import Model
    -from thinc.neural._classes.affine import Affine
    -from thinc.neural._classes.relu import ReLu
    -from thinc.neural._classes.maxout import Maxout
    -from thinc.neural._classes.batchnorm import BatchNorm as BN
    -from thinc.neural._classes.selu import SELU
    -from thinc.neural._classes.layernorm import LayerNorm
    +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 5cbefcba1743701a4d895123178a885454cf6c45 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 20:29:58 +0200
    Subject: [PATCH 485/739] Set backwards compatibility flag
    
    ---
     spacy/_ml.py | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 47f5c545e..3b96a69b5 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -30,6 +30,10 @@ 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(True)
    +
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
     @layerize
    
    From 252299ca2a518ea2d6e1e04208bce516e9d1ef59 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 21:29:43 +0200
    Subject: [PATCH 486/739] Add sdist command
    
    ---
     fabfile.py | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/fabfile.py b/fabfile.py
    index cfa80ead5..02a2110d9 100644
    --- a/fabfile.py
    +++ b/fabfile.py
    @@ -32,6 +32,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__)):
    
    From c69b0836a0f8a10f9bc56517ffb0d8abe1918b10 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 21:31:41 +0200
    Subject: [PATCH 487/739] Fix fabfile
    
    ---
     fabfile.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/fabfile.py b/fabfile.py
    index 02a2110d9..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))
     
     
    
    From 2eb0fe4957f4b827e85e41b811f832c1970567d6 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 21:40:04 +0200
    Subject: [PATCH 488/739] Fix setup.py
    
    ---
     setup.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/setup.py b/setup.py
    index 8943d7a2e..23b4f9581 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -195,7 +195,7 @@ def setup_package():
                     'murmurhash>=0.28,<0.29',
                     'cymem>=1.30,<1.32',
                     'preshed>=1.0.0,<2.0.0',
    -                'thinc>=6.8.2,<6.9.0',
    +                'thinc>=6.9.0,<6.10.0',
                     'plac<1.0.0,>=0.9.6',
                     'six',
                     'pathlib',
    
    From 32b9f3d1a671f2a8aeb6f07cf897ec069cf4e06a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 22:17:31 +0200
    Subject: [PATCH 489/739] Require new thinc
    
    ---
     requirements.txt | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/requirements.txt b/requirements.txt
    index 7fa5d72d3..0b46b38d5 100644
    --- a/requirements.txt
    +++ b/requirements.txt
    @@ -3,7 +3,7 @@ pathlib
     numpy>=1.7
     cymem>=1.30,<1.32
     preshed>=1.0.0,<2.0.0
    -thinc>=6.8.2,<6.9.0
    +thinc>=6.9.0,<6.10.0
     murmurhash>=0.28,<0.29
     plac<1.0.0,>=0.9.6
     six
    
    From f24c2e3a8af785dd11b8d0a994732174290d688b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 22:47:31 +0200
    Subject: [PATCH 490/739] Fix evaluate for non-GPU
    
    ---
     spacy/cli/evaluate.py | 2 +-
     spacy/util.py         | 5 ++++-
     2 files changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index f409821b1..d9be95fae 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -39,7 +39,7 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
         Train a model. Expects data in spaCy's JSON format.
         """
         util.use_gpu(gpu_id)
    -    util.set_env_log(True)
    +    util.set_env_log(False)
         data_path = util.ensure_path(data_path)
         if not data_path.exists():
             prints(data_path, title="Evaluation data not found", exits=1)
    diff --git a/spacy/util.py b/spacy/util.py
    index 911970831..e1a721a12 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -563,7 +563,10 @@ def minify_html(html):
     
     
     def use_gpu(gpu_id):
    -    import cupy.cuda.device
    +    try:
    +        import cupy.cuda.device
    +    except ImportError:
    +        return None
         from thinc.neural.ops import CupyOps
         device = cupy.cuda.device.Device(gpu_id)
         device.use()
    
    From 73ac0aa0b560e3b719ebafe3b5dbbdf27eb18616 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:03:15 +0200
    Subject: [PATCH 491/739] Update spacy evaluate and add displaCy option
    
    ---
     spacy/cli/evaluate.py | 45 ++++++++++++++++++++++++++++++-------------
     1 file changed, 32 insertions(+), 13 deletions(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index d9be95fae..42e077dc2 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -33,16 +33,23 @@ numpy.random.seed(0)
         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):
    +def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
    +             displacy_path=None, displacy_limit=25):
         """
    -    Train a model. Expects data in spaCy's JSON format.
    +    Evaluate a model. To render a sample of parses in a HTML file, set an output
    +    directory as the displacy_path argument.
         """
         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))
    @@ -50,18 +57,27 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False):
         scorer = nlp.evaluate(dev_docs, verbose=False)
         end = timer()
         nwords = sum(len(doc_gold[0]) for doc_gold in dev_docs)
    -    print('Time', end-begin, 'words', nwords, 'w.p.s', nwords/(end-begin))
    -    print_results(scorer)
    +    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(i, to_render):
    -    to_render[0].user_data['title'] = "Batch %d" % i
    -    with Path('/tmp/entities.html').open('w') as file_:
    -        html = displacy.render(to_render[:5], style='ent', page=True)
    -        file_.write(html)
    -    with Path('/tmp/parses.html').open('w') as file_:
    -        html = displacy.render(to_render[:5], style='dep', page=True)
    -        file_.write(html)
    +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):
    @@ -88,8 +104,11 @@ def print_progress(itn, losses, dev_scores, wps=0.0):
         print(tpl.format(itn, **scores))
     
     
    -def print_results(scorer):
    +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,
    
    From bfb512f45a14b6f436cace5dab536871171e4ba8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:18:41 +0200
    Subject: [PATCH 492/739] Add website package.json and fix gitignore
    
    ---
     .gitignore           |  2 --
     website/package.json | 20 ++++++++++++++++++++
     2 files changed, 20 insertions(+), 2 deletions(-)
     create mode 100644 website/package.json
    
    diff --git a/.gitignore b/.gitignore
    index 572eea92d..14097dfcd 100644
    --- a/.gitignore
    +++ b/.gitignore
    @@ -7,8 +7,6 @@ keys/
     # Website
     website/www/
     website/_deploy.sh
    -website/package.json
    -website/announcement.jade
     website/.gitignore
     
     # Cython / C extensions
    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"
    +  }
    +}
    
    From 464f14019d11ff3417fc9a522b810080ee406fe2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:18:47 +0200
    Subject: [PATCH 493/739] Fix typos
    
    ---
     website/styleguide.jade | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/styleguide.jade b/website/styleguide.jade
    index 107f7e2e6..42e70ed73 100644
    --- a/website/styleguide.jade
    +++ b/website/styleguide.jade
    @@ -141,7 +141,7 @@ include _includes/_mixins
             +icon("github", 18)
     
         p
    -        |  Icons are implemented via a SVG sprite and can be included as a
    +        |  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
    @@ -560,7 +560,7 @@ include _includes/_mixins
                 +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",
    +                +code(false, "json").o-no-block "vectors": "Word vectors"
     
             +row
                 +cell #[code MODEL_LICENSES]
    
    From 15ec7ddd0984f2180d0d4bfe7c2b3f4dfcfc772c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:19:03 +0200
    Subject: [PATCH 494/739] Add docs for new spacy evaluate command
    
    ---
     website/api/_top-level/_cli.jade | 53 ++++++++++++++++++++++++++++++++
     1 file changed, 53 insertions(+)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index 52884988e..f59d5afdd 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -344,6 +344,59 @@ p
             +cell Gradient L2 norm constraint.
             +cell #[code 1.0]
     
    ++h(3, "evaluate") Evaluate
    +    +tag-new(2)
    +
    +p
    +    |  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
    
    From 36ff525ff59239e5bf81c569622c918811d4266a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 00:37:15 +0200
    Subject: [PATCH 495/739] Add NER P and NER R scores to model overview
    
    ---
     website/_includes/_page_models.jade | 2 +-
     website/models/_data.json           | 6 +++++-
     2 files changed, 6 insertions(+), 2 deletions(-)
    
    diff --git a/website/_includes/_page_models.jade b/website/_includes/_page_models.jade
    index 6370f1b94..c5bd799f0 100644
    --- a/website/_includes/_page_models.jade
    +++ b/website/_includes/_page_models.jade
    @@ -60,7 +60,7 @@ for id in CURRENT_MODELS
                 +grid.o-no-block
                     +grid-col("third")
                         +h(4) Accuracy
    -                    +table.o-no-block
    +                    +table.o-block-small
                             for label, field in MODEL_ACCURACY
                                 +row(style="display: none")
                                     +cell.u-nowrap
    diff --git a/website/models/_data.json b/website/models/_data.json
    index cc26b9bc9..b2898be8a 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -44,6 +44,8 @@
             "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"
         },
    @@ -59,7 +61,9 @@
             "uas": "UAS",
             "las": "LAS",
             "tags_acc": "POS",
    -        "ents_f": "NER F"
    +        "ents_f": "NER F",
    +        "ents_p": "NER P",
    +        "ents_r": "NER R"
         },
     
         "LANGUAGES": {
    
    From af75b742083798347c279a840abb0535643c920d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 3 Oct 2017 20:47:10 -0500
    Subject: [PATCH 496/739] Unset LayerNorm backwards compat hack
    
    ---
     spacy/_ml.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 3b96a69b5..dc458d6ac 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -31,8 +31,8 @@ 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(True)
    +#import thinc.neural._classes.layernorm
    +#thinc.neural._classes.layernorm.set_compat_six_eight(True)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    
    From 33cf9cecdd047282682c3ff91bd495ca79f89b32 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 13:34:03 +0200
    Subject: [PATCH 497/739] Port over changes from #1386
    
    ---
     website/usage/_facts-figures/_benchmarks.jade         | 2 +-
     website/usage/_facts-figures/_feature-comparison.jade | 2 +-
     website/usage/_visualizers/_html.jade                 | 2 +-
     3 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/website/usage/_facts-figures/_benchmarks.jade b/website/usage/_facts-figures/_benchmarks.jade
    index fa0e26763..f69eb5406 100644
    --- a/website/usage/_facts-figures/_benchmarks.jade
    +++ b/website/usage/_facts-figures/_benchmarks.jade
    @@ -74,7 +74,7 @@ p
     
         +row
             +cell
    -            +a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet Parsey McParseface
    +            +a("https://github.com/tensorflow/models/tree/master/research/syntaxnet") SyntaxNet Parsey McParseface
             +cell 2016
             +cell neural
             +cell.u-text-right 94.15
    diff --git a/website/usage/_facts-figures/_feature-comparison.jade b/website/usage/_facts-figures/_feature-comparison.jade
    index 92ac69050..c8fa5ffbe 100644
    --- a/website/usage/_facts-figures/_feature-comparison.jade
    +++ b/website/usage/_facts-figures/_feature-comparison.jade
    @@ -2,7 +2,7 @@
     
     p
         |  Here's a quick comparison of the functionalities offered by spaCy,
    -    |  #[+a("https://github.com/tensorflow/models/tree/master/syntaxnet") SyntaxNet],
    +    |  #[+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].
     
    diff --git a/website/usage/_visualizers/_html.jade b/website/usage/_visualizers/_html.jade
    index 701d4b683..595192442 100644
    --- a/website/usage/_visualizers/_html.jade
    +++ b/website/usage/_visualizers/_html.jade
    @@ -71,7 +71,7 @@ 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].
    +    |  #[+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()].
    
    From 774f5732bdab210381fffce8c06adca9fc0152e5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 14:55:15 +0200
    Subject: [PATCH 498/739] Fix dimensionality of textcat when no vectors
     available
    
    ---
     spacy/_ml.py | 25 ++++++++++++++++---------
     1 file changed, 16 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index dc458d6ac..b02bd27d9 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -570,6 +570,7 @@ def foreach(layer, drop_factor=1.0):
     
     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'):
    @@ -577,7 +578,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                     SpacyVectors
                     >> flatten_add_lengths
                     >> with_getitem(0,
    -                    Affine(width, 300)
    +                    Affine(width, pretrained_dims)
                     )
                     >> ParametricAttention(width)
                     >> Pooling(sum_pool)
    @@ -604,16 +605,22 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 )
             )
     
    -        static_vectors = (
    -            SpacyVectors
    -            >> with_flatten(Affine(width, 300))
    -        )
    -
    -        cnn_model = (
    +        if pretrained_dims:
    +            static_vectors = (
    +                SpacyVectors
    +                >> with_flatten(Affine(width, pretrained_dims))
    +            )
                 # TODO Make concatenate support lists
    -            concatenate_lists(trained_vectors, static_vectors)
    +            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, width*2))
    +                LN(Maxout(width, vectors_width))
                     >> Residual(
                         (ExtractWindow(nW=1) >> zero_init(Maxout(width, width*3)))
                     ) ** 2, pad=2
    
    From 79a94bc166bfdd73a11b4e10a4717df22d171025 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 14:55:30 +0200
    Subject: [PATCH 499/739] Update textcat exampe
    
    ---
     examples/training/train_textcat.py | 6 +++++-
     1 file changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index eefae111f..7eb356100 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -1,3 +1,7 @@
    +'''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
    @@ -31,7 +35,7 @@ def train_textcat(tokenizer, textcat,
             train_data = tqdm.tqdm(train_data, leave=False) # Progress bar
             for batch in minibatch(train_data, size=batch_sizes):
                 docs, golds = zip(*batch)
    -            textcat.update((docs, None), golds, sgd=optimizer, drop=0.2,
    +            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)
    
    From db05d4d5823c05208880eda92d99e7ba2de3ddd4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 14:56:16 +0200
    Subject: [PATCH 500/739] Add test for #1380. Passes without fix?
    
    ---
     spacy/tests/regression/test_issue1380.py | 13 +++++++++++++
     1 file changed, 13 insertions(+)
     create mode 100644 spacy/tests/regression/test_issue1380.py
    
    diff --git a/spacy/tests/regression/test_issue1380.py b/spacy/tests/regression/test_issue1380.py
    new file mode 100644
    index 000000000..d9cfe1bd2
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1380.py
    @@ -0,0 +1,13 @@
    +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
    
    From 39798b0172eab604873280aa8a429c3bf78c0c78 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 15:12:09 +0200
    Subject: [PATCH 501/739] Uncomment layernorm adjustment hack
    
    ---
     spacy/_ml.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index b02bd27d9..bbd3e2b3c 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -31,8 +31,8 @@ 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(True)
    +import thinc.neural._classes.layernorm
    +thinc.neural._classes.layernorm.set_compat_six_eight(True)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    
    From f1b86dff8cef8802f5493bad4331d23e016dca7c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 15:12:28 +0200
    Subject: [PATCH 502/739] Update textcat example
    
    ---
     examples/training/train_textcat.py | 17 ++++++++++++-----
     1 file changed, 12 insertions(+), 5 deletions(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index 7eb356100..6018827a4 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -16,6 +16,11 @@ 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,
    @@ -28,12 +33,13 @@ def train_textcat(tokenizer, textcat,
         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 = zip(train_docs, train_gold)
    +    train_data = list(zip(train_docs, train_gold))
         batch_sizes = compounding(4., 128., 1.001)
         for i in range(n_iter):
             losses = {}
    -        train_data = tqdm.tqdm(train_data, leave=False) # Progress bar
    -        for batch in minibatch(train_data, size=batch_sizes):
    +        # 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)
    @@ -65,12 +71,13 @@ def evaluate(tokenizer, textcat, texts, cats):
         return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore}  
     
     
    -def load_data():
    +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'] if y else []) for y in labels]
    @@ -90,7 +97,7 @@ def main(model_loc=None):
         textcat = TextCategorizer(tokenizer.vocab, labels=['POSITIVE'])
     
         print("Load IMDB data")
    -    (train_texts, train_cats), (dev_texts, dev_cats) = load_data()
    +    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=1000)
     
         print("Itn.\tLoss\tP\tR\tF")
         progress = '{i:d} {loss:.3f} {textcat_p:.3f} {textcat_r:.3f} {textcat_f:.3f}'
    
    From f8a0614527a656a50100fa784be23c698f706673 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 15:15:53 +0200
    Subject: [PATCH 503/739] Improve textcat model slightly
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index bbd3e2b3c..e882c954e 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -622,7 +622,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 >> with_flatten(
                     LN(Maxout(width, vectors_width))
                     >> Residual(
    -                    (ExtractWindow(nW=1) >> zero_init(Maxout(width, width*3)))
    +                    (ExtractWindow(nW=1) >> LN(Maxout(width, width*3)))
                     ) ** 2, pad=2
                 )
                 >> flatten_add_lengths
    
    From bd8e84998a7bf4706c18f9b3099a84d4a2ba6a52 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 16:07:30 +0200
    Subject: [PATCH 504/739] Add nO attribute to TextCategorizer model
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index e882c954e..4a41339aa 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -642,7 +642,7 @@ def build_text_classifier(nr_class, width=64, **cfg):
                 >> zero_init(Affine(nr_class, nr_class*2, drop_factor=0.0))
                 >> logistic
             )
    -
    +    model.nO = nr_class
         model.lsuv = False
         return model
     
    
    From bb13aa4bf3b7cb10ac93cc36486e8d0d1fddc43c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 16:12:06 +0200
    Subject: [PATCH 505/739] Fix typos in PhraseMatcher docs
    
    ---
     website/api/phrasematcher.jade | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/website/api/phrasematcher.jade b/website/api/phrasematcher.jade
    index 5c49a03d5..0f0959f28 100644
    --- a/website/api/phrasematcher.jade
    +++ b/website/api/phrasematcher.jade
    @@ -15,7 +15,7 @@ p Create the rule-based #[code PhraseMatcher].
     
     +aside-code("Example").
         from spacy.matcher import PhraseMatcher
    -    matcher = Matcher(nlp.vocab, max_length=6)
    +    matcher = PhraseMatcher(nlp.vocab, max_length=6)
     
     +table(["Name", "Type", "Description"])
         +row
    @@ -41,9 +41,9 @@ p Create the rule-based #[code PhraseMatcher].
     p Find all token sequences matching the supplied patterns on the #[code Doc].
     
     +aside-code("Example").
    -    from spacy.matcher import Matcher
    +    from spacy.matcher import PhraseMatcher
     
    -    matcher = Matcher(nlp.vocab)
    +    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)
    
    From 40edb65ee751dfe4cf6e04ee59891266d8b14f30 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 16:36:50 +0200
    Subject: [PATCH 506/739] Make test work for Python 2.7
    
    ---
     spacy/tests/regression/test_issue1380.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/tests/regression/test_issue1380.py b/spacy/tests/regression/test_issue1380.py
    index d9cfe1bd2..b2d610954 100644
    --- a/spacy/tests/regression/test_issue1380.py
    +++ b/spacy/tests/regression/test_issue1380.py
    @@ -1,3 +1,4 @@
    +from __future__ import unicode_literals
     import pytest
     
     from ...language import Language
    
    From d90398643933999d734a09bc3637a8723d5de2c3 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 17:14:26 +0200
    Subject: [PATCH 507/739] Increment version
    
    ---
     spacy/about.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index b8b1dbbf6..a8880d7ca 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -3,13 +3,13 @@
     # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py
     
     __title__ = 'spacy-nightly'
    -__version__ = '2.0.0a15'
    +__version__ = '2.0.0a16'
     __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
    +__release__ = True
     
     __docs_models__ = 'https://alpha.spacy.io/usage/models'
     __download_url__ = 'https://github.com/explosion/spacy-models/releases/download'
    
    From cc29e8b49717c76299e494ad98bf0e80d3363e2a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:00:37 +0200
    Subject: [PATCH 508/739] Add buildkite.yml for making sdists
    
    ---
     .buildkite/sdist.yml | 11 +++++++++++
     1 file changed, 11 insertions(+)
     create mode 100644 .buildkite/sdist.yml
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    new file mode 100644
    index 000000000..a3d8b2b68
    --- /dev/null
    +++ b/.buildkite/sdist.yml
    @@ -0,0 +1,11 @@
    +steps:
    +  -
    +    command:
    +      - "$HOME/.local/bin/fab env clean make test"
    +    label: ":dizzy: :python:"
    +    artifact_paths: "dist/*.tar.gz"
    +  - wait
    +  - trigger "spacy-sdist-against-models"
    +    label: ":spacy: :build:"
    +    env:
    +      SPACY_VERSION: "{$SPACY_VERSION}"
    
    From ff24b6d04a48bf0aa218052fa5e6cc28156e8fe1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:05:45 +0200
    Subject: [PATCH 509/739] Fix yml
    
    ---
     .buildkite/sdist.yml | 4 +---
     1 file changed, 1 insertion(+), 3 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index a3d8b2b68..01dc6f024 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,7 +1,5 @@
     steps:
    -  -
    -    command:
    -      - "$HOME/.local/bin/fab env clean make test"
    +  - command: "$HOME/.local/bin/fab env clean make test"
         label: ":dizzy: :python:"
         artifact_paths: "dist/*.tar.gz"
       - wait
    
    From 6304c5e14636b754f7bf6b7764d759d2bafb7cf7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:08:34 +0200
    Subject: [PATCH 510/739] Fix yml
    
    ---
     .buildkite/sdist.yml | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 01dc6f024..2cbbc54c4 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,9 +1,10 @@
     steps:
    -  - command: "$HOME/.local/bin/fab env clean make test"
    -    label: ":dizzy: :python:"
    -    artifact_paths: "dist/*.tar.gz"
    +  -
    +    command: "$HOME/.local/bin/fab env clean make test"
    +      label: ":dizzy: :python:"
    +      artifact_paths: "dist/*.tar.gz"
       - wait
    -  - trigger "spacy-sdist-against-models"
    +  - trigger: "spacy-sdist-against-models"
         label: ":spacy: :build:"
         env:
           SPACY_VERSION: "{$SPACY_VERSION}"
    
    From 71825f9737dd00b461e0fdefd0b38925389da5c0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:12:16 +0200
    Subject: [PATCH 511/739] Fix yml
    
    ---
     .buildkite/sdist.yml | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 2cbbc54c4..e43153802 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,8 +1,8 @@
     steps:
       -
         command: "$HOME/.local/bin/fab env clean make test"
    -      label: ":dizzy: :python:"
    -      artifact_paths: "dist/*.tar.gz"
    +    label: ":dizzy: :python:"
    +    artifact_paths: "dist/*.tar.gz"
       - wait
       - trigger: "spacy-sdist-against-models"
         label: ":spacy: :build:"
    
    From c4c7def9cef280b20818409846200c49f33afac2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:14:33 +0200
    Subject: [PATCH 512/739] Fix yml
    
    ---
     .buildkite/sdist.yml | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index e43153802..0f80fd9c8 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -6,5 +6,6 @@ steps:
       - wait
       - trigger: "spacy-sdist-against-models"
         label: ":spacy: :build:"
    -    env:
    -      SPACY_VERSION: "{$SPACY_VERSION}"
    +    build:
    +      env:
    +        SPACY_VERSION: "{$SPACY_VERSION}"
    
    From e3c93f87a4c17c1a9db9bf85fd77255d2a5ddc6f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:18:07 +0200
    Subject: [PATCH 513/739] Update sdist
    
    ---
     .buildkite/sdist.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 0f80fd9c8..7776429c5 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,6 +1,6 @@
     steps:
       -
    -    command: "$HOME/.local/bin/fab env clean make test"
    +    command: "fab env clean make test"
         label: ":dizzy: :python:"
         artifact_paths: "dist/*.tar.gz"
       - wait
    
    From 5560c46a593363b6d8c51bbbf575a6b2e562ed4d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 18:29:41 +0200
    Subject: [PATCH 514/739] Update buildkite
    
    ---
     .buildkite/sdist.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index 7776429c5..f5e0fca35 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -1,6 +1,6 @@
     steps:
       -
    -    command: "fab env clean make test"
    +    command: "fab env clean make test sdist"
         label: ":dizzy: :python:"
         artifact_paths: "dist/*.tar.gz"
       - wait
    
    From b621a2e9646f54b396f2c6439022e40e00e074e6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 4 Oct 2017 18:37:27 +0200
    Subject: [PATCH 515/739] Fix build emoji
    
    ---
     .buildkite/sdist.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.buildkite/sdist.yml b/.buildkite/sdist.yml
    index f5e0fca35..9b94e3752 100644
    --- a/.buildkite/sdist.yml
    +++ b/.buildkite/sdist.yml
    @@ -5,7 +5,7 @@ steps:
         artifact_paths: "dist/*.tar.gz"
       - wait
       - trigger: "spacy-sdist-against-models"
    -    label: ":spacy: :build:"
    +    label: ":dizzy: :hammer:"
         build:
           env:
             SPACY_VERSION: "{$SPACY_VERSION}"
    
    From 92066b04d6401207d8b0fad4d121eca06a7210c5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 19:55:34 -0500
    Subject: [PATCH 516/739] Fix Embed and HistoryFeatures
    
    ---
     spacy/_ml.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 6df10b6b2..6ebccd69a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -231,6 +231,8 @@ class Embed(Model):
     
         def __init__(self, nO, nV=None, **kwargs):
             Model.__init__(self, **kwargs)
    +        if 'name' in kwargs:
    +            self.name = kwargs['name']
             self.column = kwargs.get('column', 0)
             self.nO = nO
             self.nV = nV
    @@ -238,12 +240,12 @@ class Embed(Model):
         def predict(self, ids):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        return self._embed(ids)
    +        return self.ops.xp.ascontiguousarray(self.vectors[ids])
     
         def begin_update(self, ids, drop=0.):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        vectors = self.vectors[ids]
    +        vectors = self.ops.xp.ascontiguousarray(self.vectors[ids])
             def backprop_embed(d_vectors, sgd=None):
                 n_vectors = d_vectors.shape[0]
                 self.ops.scatter_add(self.d_vectors, ids, d_vectors)
    @@ -255,7 +257,8 @@ class Embed(Model):
     
     def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
         '''Wrap a model, adding features representing action history.'''
    -    embed_tables = [Embed(nr_dim, nr_class, column=i) for i in range(hist_size)]
    +    embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d')
    +                    for i in range(hist_size)]
         embed = concatenate(*embed_tables)
         ops = embed.ops
         def add_history_fwd(vectors_hists, drop=0.):
    
    From 943af4423a9b3f0eced972c420ae023d8e3a1dd4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 20:06:05 -0500
    Subject: [PATCH 517/739] Make depth setting in parser work again
    
    ---
     spacy/syntax/nn_parser.pyx | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 016807e87..422b0fdc7 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -277,6 +277,7 @@ cdef class Parser:
                     upper = chain(
                         HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, nr_dim=HIST_DIMS),
                         Maxout(hidden_width, hidden_width+HIST_SIZE*HIST_DIMS),
    +                    clone(Maxout(hidden_width, hidden_width), depth-2),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    @@ -286,7 +287,7 @@ cdef class Parser:
                         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)))
    
    From dcdfa071aaf983adae5b3fb39336a2b1102970ab Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 4 Oct 2017 20:06:52 -0500
    Subject: [PATCH 518/739] Disable LayerNorm hack
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 1f78de9a9..6223715b5 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -32,7 +32,7 @@ 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(True)
    +thinc.neural._classes.layernorm.set_compat_six_eight(False)
     
     VECTORS_KEY = 'spacy_pretrained_vectors'
     
    
    From fd4baff475e9cb5ce24b380ec8d75ab28b48962f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 08:12:27 -0500
    Subject: [PATCH 519/739] Update tests
    
    ---
     spacy/tests/lang/en/test_lemmatizer.py  |  1 -
     spacy/tests/lang/en/test_models.py      | 13 +++++++------
     spacy/tests/regression/test_issue429.py |  1 -
     3 files changed, 7 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/tests/lang/en/test_lemmatizer.py b/spacy/tests/lang/en/test_lemmatizer.py
    index 00f02ccb4..ecde87bed 100644
    --- a/spacy/tests/lang/en/test_lemmatizer.py
    +++ b/spacy/tests/lang/en/test_lemmatizer.py
    @@ -57,7 +57,6 @@ 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/regression/test_issue429.py b/spacy/tests/regression/test_issue429.py
    index 1baa9a1db..df8d6d3fc 100644
    --- a/spacy/tests/regression/test_issue429.py
    +++ b/spacy/tests/regression/test_issue429.py
    @@ -19,7 +19,6 @@ def test_issue429(EN):
         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)
    
    From 5743b06e36c92fdb541c0a02d1a4b3850676418f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 08:12:50 -0500
    Subject: [PATCH 520/739] Wrap model saving in try/except
    
    ---
     spacy/cli/train.py | 9 ++++++---
     1 file changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index a22db6abc..064f053a1 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -114,9 +114,12 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=20, n_sents=0,
                 print_progress(i, losses, scorer.scores)
         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):
    
    From 056b08c0df19a3a079ce658455dd71dfaecc729e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 18:27:10 +0200
    Subject: [PATCH 521/739] Delete obsolete nn_text_class example
    
    ---
     examples/nn_text_class.py | 281 --------------------------------------
     1 file changed, 281 deletions(-)
     delete mode 100644 examples/nn_text_class.py
    
    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)
    
    From 563f46f026054a73289bca64d7d6cbc2cca07150 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 18:43:02 -0500
    Subject: [PATCH 522/739] Fix multi-label support for text classification
    
    The TextCategorizer class is supposed to support multi-label
    text classification, and allow training data to contain missing
    values.
    
    For this to work, the gradient of the loss should be 0 when labels
    are missing. Instead, there was no way to actually denote "missing"
    in the GoldParse class, and so the TextCategorizer class treated
    the label set within gold.cats as complete.
    
    To fix this, we change GoldParse.cats to be a dict instead of a list.
    The GoldParse.cats dict should map to floats, with 1. denoting
    'present' and 0. denoting 'absent'. Gradients are zeroed for categories
    absent from the gold.cats dict. A nice bonus is that you can also set
    values between 0 and 1 for partial membership. You can also set numeric
    values, if you're using a text classification model that uses an
    appropriate loss function.
    
    Unfortunately this is a breaking change; although the functionality
    was only recently introduced and hasn't been properly documented
    yet. I've updated the example script accordingly.
    ---
     examples/training/train_textcat.py | 17 +++++++++--------
     spacy/gold.pyx                     | 13 ++++++++-----
     spacy/pipeline.pyx                 |  9 +++++++--
     3 files changed, 24 insertions(+), 15 deletions(-)
    
    diff --git a/examples/training/train_textcat.py b/examples/training/train_textcat.py
    index 6018827a4..4d07ed26a 100644
    --- a/examples/training/train_textcat.py
    +++ b/examples/training/train_textcat.py
    @@ -21,7 +21,6 @@ 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):
    @@ -57,18 +56,20 @@ def evaluate(tokenizer, textcat, texts, cats):
         for i, doc in enumerate(textcat.pipe(docs)):
             gold = cats[i]
             for label, score in doc.cats.items():
    -            if score >= 0.5 and label in gold:
    +            if label not in gold:
    +                continue
    +            if score >= 0.5 and gold[label] >= 0.5:
                     tp += 1.
    -            elif score >= 0.5 and label not in gold:
    +            elif score >= 0.5 and gold[label] < 0.5:
                     fp += 1.
    -            elif score < 0.5 and label not in gold:
    +            elif score < 0.5 and gold[label] < 0.5:
                     tn += 1
    -            if score < 0.5 and label in gold:
    +            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}  
    +    return {'textcat_p': precis, 'textcat_r': recall, 'textcat_f': fscore}
     
     
     def load_data(limit=0):
    @@ -80,7 +81,7 @@ def load_data(limit=0):
         train_data = train_data[-limit:]
     
         texts, labels = zip(*train_data)
    -    cats = [(['POSITIVE'] if y else []) for y in labels]
    +    cats = [{'POSITIVE': bool(y)} for y in labels]
     
         split = int(len(train_data) * 0.8)
     
    @@ -97,7 +98,7 @@ def main(model_loc=None):
         textcat = TextCategorizer(tokenizer.vocab, labels=['POSITIVE'])
     
         print("Load IMDB data")
    -    (train_texts, train_cats), (dev_texts, dev_cats) = load_data(limit=1000)
    +    (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}'
    diff --git a/spacy/gold.pyx b/spacy/gold.pyx
    index fc8d6622b..2512c179f 100644
    --- a/spacy/gold.pyx
    +++ b/spacy/gold.pyx
    @@ -387,7 +387,7 @@ cdef class GoldParse:
     
         def __init__(self, doc, annot_tuples=None, words=None, tags=None, heads=None,
                      deps=None, entities=None, make_projective=False,
    -                 cats=tuple()):
    +                 cats=None):
             """Create a GoldParse.
     
             doc (Doc): The document the annotations refer to.
    @@ -398,12 +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 (iterable): A sequence of labels for text classification. Each
    -            label may be a string or an int, or a `(start_char, end_char, label)`
    +        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.
    +            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:
    @@ -434,7 +437,7 @@ cdef class GoldParse:
             self.c.sent_start = self.mem.alloc(len(doc), sizeof(int))
             self.c.ner = self.mem.alloc(len(doc), sizeof(Transition))
     
    -        self.cats = list(cats)
    +        self.cats = {} if cats is None else dict(cats)
             self.words = [None] * len(doc)
             self.tags = [None] * len(doc)
             self.heads = [None] * len(doc)
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 8d935335c..c39976630 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -551,7 +551,6 @@ class NeuralLabeller(NeuralTagger):
                         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)
    -        print(len(self.labels))
             if self.model is True:
                 token_vector_width = util.env_opt('token_vector_width')
                 self.model = chain(
    @@ -720,11 +719,17 @@ class TextCategorizer(BaseThincComponent):
     
         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):
    -                truths[i, j] = label in gold.cats
    +                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
     
    
    From e25ffcb11f349c1f411d6d51280146eb5f72126a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 19:38:13 -0500
    Subject: [PATCH 523/739] Move history size under feature flags
    
    ---
     spacy/syntax/nn_parser.pyx | 31 ++++++++++++++++---------------
     1 file changed, 16 insertions(+), 15 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 422b0fdc7..b57e8b466 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -68,14 +68,10 @@ from ..gold cimport GoldParse
     from ..attrs cimport ID, TAG, DEP, ORTH, NORM, PREFIX, SUFFIX, TAG
     from . import _beam_utils
     
    -USE_HISTORY = True
    -HIST_SIZE = 8 # Max 8
    -HIST_DIMS = 8
     
     def get_templates(*args, **kwargs):
         return []
     
    -USE_FTRL = True
     DEBUG = False
     def set_debug(val):
         global DEBUG
    @@ -248,6 +244,8 @@ cdef class Parser:
             hidden_width = util.env_opt('hidden_width', hidden_width)
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', 2)
             embed_size = util.env_opt('embed_size', 7000)
    +        hist_size = util.env_opt('history_feats', cfg.get('history_feats', 0))
    +        hist_width = util.env_opt('history_width', cfg.get('history_width', 0))
             tok2vec = Tok2Vec(token_vector_width, embed_size,
                               pretrained_dims=cfg.get('pretrained_dims', 0))
             tok2vec = chain(tok2vec, flatten)
    @@ -263,20 +261,21 @@ cdef class Parser:
     
             with Model.use_device('cpu'):
                 if depth == 0:
    -                if USE_HISTORY:
    +                if hist_size:
                         upper = chain(
    -                        HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE,
    -                                        nr_dim=HIST_DIMS),
    -                        zero_init(Affine(nr_class, nr_class+HIST_SIZE*HIST_DIMS,
    +                        HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    +                                        nr_dim=hist_width),
    +                        zero_init(Affine(nr_class, nr_class+hist_size*hist_size,
                                               drop_factor=0.0)))
                         upper.is_noop = False
                     else:
                         upper = chain()
                         upper.is_noop = True
    -            elif USE_HISTORY:
    +            elif hist_size:
                     upper = chain(
    -                    HistoryFeatures(nr_class=nr_class, hist_size=HIST_SIZE, nr_dim=HIST_DIMS),
    -                    Maxout(hidden_width, hidden_width+HIST_SIZE*HIST_DIMS),
    +                    HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    +                                    nr_dim=hist_width),
    +                    Maxout(hidden_width, hidden_width+hist_size*hist_width),
                         clone(Maxout(hidden_width, hidden_width), depth-2),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
    @@ -296,7 +295,9 @@ cdef class Parser:
                 '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 (tok2vec, lower, upper), cfg
     
    @@ -369,7 +370,7 @@ cdef class Parser:
                 _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.
    @@ -454,7 +455,7 @@ cdef class Parser:
                         hists.append([st.get_hist(j+1) for j in range(8)])
                     hists = numpy.asarray(hists)
                     vectors = state2vec(token_ids[:next_step.size()])
    -                if USE_HISTORY:
    +                if self.cfg.get('hist_size'):
                         scores = vec2scores((vectors, hists))
                     else:
                         scores = vec2scores(vectors)
    @@ -577,7 +578,7 @@ cdef class Parser:
                     mask = vec2scores.ops.get_dropout_mask(vector.shape, drop)
                     vector *= mask
                 hists = numpy.asarray([st.history for st in states], dtype='i')
    -            if USE_HISTORY:
    +            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)
    
    From fc06b0a33357352c99c5b1e41789c15920daac73 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:52:28 -0500
    Subject: [PATCH 524/739] Fix training when hist_size==0
    
    ---
     spacy/_ml.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 6223715b5..d6e745f22 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -257,6 +257,8 @@ class Embed(Model):
     
     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 = concatenate(*embed_tables)
    
    From ca1276477289b570249967d595f232225df90184 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:53:29 -0500
    Subject: [PATCH 525/739] Enable history features for beam parser
    
    ---
     spacy/syntax/_beam_utils.pyx | 11 ++++++++---
     spacy/syntax/nn_parser.pyx   | 11 +++++++++--
     2 files changed, 17 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/_beam_utils.pyx b/spacy/syntax/_beam_utils.pyx
    index a26900f6b..da4efefbc 100644
    --- a/spacy/syntax/_beam_utils.pyx
    +++ b/spacy/syntax/_beam_utils.pyx
    @@ -21,6 +21,7 @@ cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves)
         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:
    @@ -148,8 +149,8 @@ def get_token_ids(states, int n_tokens):
     nr_update = 0
     def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
                     states, golds,
    -                state2vec, vec2scores, 
    -                int width, float density,
    +                state2vec, vec2scores,
    +                int width, float density, int hist_feats,
                     losses=None, drop=0.):
         global nr_update
         cdef MaxViolation violn
    @@ -180,7 +181,11 @@ def update_beam(TransitionSystem moves, int nr_feature, int max_steps,
             # 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)
    -        scores, bp_scores = vec2scores.begin_update(vectors, 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))
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index b57e8b466..9a071ae14 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -505,7 +505,12 @@ cdef class Parser:
                             states.append(stcls)
                     token_ids = self.get_token_ids(states)
                     vectors = state2vec(token_ids)
    -                scores = vec2scores(vectors)
    +                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, drop=drop)
    +                else:
    +                    scores = vec2scores(vectors, drop=drop)
                     j = 0
                     c_scores = scores.data
                     for i in range(beam.size):
    @@ -537,6 +542,7 @@ 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)
    @@ -634,7 +640,7 @@ cdef class Parser:
             states_d_scores, backprops = _beam_utils.update_beam(self.moves, self.nr_feature, 500,
                                             states, golds,
                                             state2vec, vec2scores,
    -                                        width, density,
    +                                        width, density, self.cfg.get('hist_size', 0),
                                             drop=drop, losses=losses)
             backprop_lower = []
             cdef float batch_size = len(docs)
    @@ -967,6 +973,7 @@ cdef int _transition_state(void* _dest, void* _src, class_t clas, void* _moves)
         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:
    
    From 363aa47b40b281d40ee9bfc187a8ba9b964ac913 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:53:49 -0500
    Subject: [PATCH 526/739] Clean up dead parsing code
    
    ---
     spacy/syntax/nn_parser.pyx  |  2 --
     spacy/syntax/stateclass.pyx | 24 ------------------------
     2 files changed, 26 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 9a071ae14..e2c2b41c7 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -529,8 +529,6 @@ cdef class Parser:
                 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))
    diff --git a/spacy/syntax/stateclass.pyx b/spacy/syntax/stateclass.pyx
    index 9c179820c..ddd1f558c 100644
    --- a/spacy/syntax/stateclass.pyx
    +++ b/spacy/syntax/stateclass.pyx
    @@ -62,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
    
    From b0618def8d5e03d24e732432d858a34f1301b314 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 21:54:12 -0500
    Subject: [PATCH 527/739] Add support for 2-token state option
    
    ---
     spacy/syntax/_state.pxd | 3 +++
     1 file changed, 3 insertions(+)
    
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index f4fa49286..50146401e 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -93,6 +93,9 @@ cdef cppclass StateC:
             free(this.shifted - PADDING)
     
         void set_context_tokens(int* ids, int n) nogil:
    +        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)
    
    From 3db0a32fd651d7d8bd99f9a73eeae1124875a85e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 22:21:30 -0500
    Subject: [PATCH 528/739] Fix dropout for history features
    
    ---
     spacy/_ml.py | 10 ++++++++--
     1 file changed, 8 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index d6e745f22..7761e6d11 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -217,6 +217,7 @@ class PrecomputableMaxouts(Model):
     from thinc import describe
     from thinc.neural._classes.embed import _uniform_init
     
    +
     @describe.attributes(
         nV=describe.Dimension("Number of vectors"),
         nO=describe.Dimension("Size of output"),
    @@ -240,12 +241,12 @@ class Embed(Model):
         def predict(self, ids):
             if ids.ndim == 2:
                 ids = ids[:, self.column]
    -        return self.ops.xp.ascontiguousarray(self.vectors[ids])
    +        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])
    +        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)
    @@ -267,8 +268,13 @@ def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
             vectors, hist_ids = vectors_hists
             hist_feats, bp_hists = embed.begin_update(hist_ids)
             outputs = ops.xp.hstack((vectors, hist_feats))
    +        mask = ops.get_dropout_mask(outputs.shape, drop)
    +        if mask is not None:
    +            outputs *= mask
     
             def add_history_bwd(d_outputs, sgd=None):
    +            if mask is not None:
    +                d_outputs *= mask
                 d_vectors = d_outputs[:, :vectors.shape[1]]
                 d_hists = d_outputs[:, vectors.shape[1]:]
                 bp_hists(d_hists, sgd=sgd)
    
    From 555d8c8bffc8a3b31c0f3396b02fcf45cba4bd96 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 5 Oct 2017 22:21:50 -0500
    Subject: [PATCH 529/739] Fix beam history features
    
    ---
     spacy/syntax/nn_parser.pyx | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index e2c2b41c7..2b244bb70 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -508,9 +508,9 @@ cdef class Parser:
                     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, drop=drop)
    +                    scores = vec2scores((vectors, hists))
                     else:
    -                    scores = vec2scores(vectors, drop=drop)
    +                    scores = vec2scores(vectors)
                     j = 0
                     c_scores = scores.data
                     for i in range(beam.size):
    @@ -723,7 +723,7 @@ cdef class Parser:
                                            lower, stream, drop=0.0)
             return (tokvecs, bp_tokvecs), state2vec, upper
     
    -    nr_feature = 8
    +    nr_feature = 2
     
         def get_token_ids(self, states):
             cdef StateClass state
    
    From 21d11936fea53d9b67a2ae306a4825cdd15fcc6c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:08:50 -0500
    Subject: [PATCH 530/739] Fix significant train/test skew error in history
     feats
    
    ---
     spacy/syntax/nn_parser.pyx | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 2b244bb70..3bca59b60 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -684,6 +684,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)
    
    From fbba7c517ece539f9b1c24df4f545b56189def72 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:09:18 -0500
    Subject: [PATCH 531/739] Pass dropout through to embed tables
    
    ---
     spacy/_ml.py | 7 +------
     1 file changed, 1 insertion(+), 6 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 7761e6d11..f79c5668a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -266,15 +266,10 @@ def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
         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)
    +        hist_feats, bp_hists = embed.begin_update(hist_ids, drop=drop)
             outputs = ops.xp.hstack((vectors, hist_feats))
    -        mask = ops.get_dropout_mask(outputs.shape, drop)
    -        if mask is not None:
    -            outputs *= mask
     
             def add_history_bwd(d_outputs, sgd=None):
    -            if mask is not None:
    -                d_outputs *= mask
                 d_vectors = d_outputs[:, :vectors.shape[1]]
                 d_hists = d_outputs[:, vectors.shape[1]:]
                 bp_hists(d_hists, sgd=sgd)
    
    From 5c750a9c2f5c69e16c7c6c5e90d10870d0210e29 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:10:13 -0500
    Subject: [PATCH 532/739] Reserve 0 for 'missing' in history features
    
    ---
     spacy/_ml.py            | 2 ++
     spacy/syntax/_state.pxd | 2 +-
     2 files changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index f79c5668a..898d6ab49 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -231,6 +231,8 @@ 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']
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index 50146401e..1864b22b3 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -297,7 +297,7 @@ cdef cppclass StateC:
                  + hash64(&this._hist, sizeof(RingBufferC), 1)
     
         void push_hist(int act) nogil:
    -        ring_push(&this._hist, act)
    +        ring_push(&this._hist, act+1)
     
         int get_hist(int i) nogil:
             return ring_get(&this._hist, i)
    
    From c66399d8ae1e65580491fa7b0873fea1f8aeca0c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 06:20:05 -0500
    Subject: [PATCH 533/739] Fix depth definition with history features
    
    ---
     spacy/syntax/nn_parser.pyx | 24 +++++++++++++-----------
     1 file changed, 13 insertions(+), 11 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 3bca59b60..f9c8c0c14 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -246,6 +246,9 @@ cdef class Parser:
             embed_size = util.env_opt('embed_size', 7000)
             hist_size = util.env_opt('history_feats', cfg.get('history_feats', 0))
             hist_width = util.env_opt('history_width', cfg.get('history_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)
    @@ -261,16 +264,15 @@ cdef class Parser:
     
             with Model.use_device('cpu'):
                 if depth == 0:
    -                if hist_size:
    -                    upper = chain(
    -                        HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
    -                                        nr_dim=hist_width),
    -                        zero_init(Affine(nr_class, nr_class+hist_size*hist_size,
    -                                          drop_factor=0.0)))
    -                    upper.is_noop = False
    -                else:
    -                    upper = chain()
    -                    upper.is_noop = True
    +                upper = chain()
    +                upper.is_noop = True
    +            elif hist_size and depth == 1:
    +                upper = chain(
    +                    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,
    @@ -282,7 +284,7 @@ cdef class Parser:
                     upper.is_noop = False
                 else:
                     upper = chain(
    -                    Maxout(hidden_width, hidden_width),
    +                    clone(Maxout(hidden_width, hidden_width), depth-1),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    
    From 96a4e79d13a17c179684a53efb95dec982d53c77 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 6 Oct 2017 18:22:10 +0200
    Subject: [PATCH 534/739] Fix PhraseMatcher example
    
    ---
     website/api/phrasematcher.jade | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/api/phrasematcher.jade b/website/api/phrasematcher.jade
    index 0f0959f28..223ec11f9 100644
    --- a/website/api/phrasematcher.jade
    +++ b/website/api/phrasematcher.jade
    @@ -124,9 +124,9 @@ p Check whether the matcher contains rules for a match ID.
     
     +aside-code("Example").
         matcher = PhraseMatcher(nlp.vocab)
    -    assert len(matcher) == 0
    +    assert 'OBAMA' not in matcher
         matcher.add('OBAMA', None, nlp(u"Barack Obama"))
    -    assert len(matcher) == 1
    +    assert 'OBAMA' in matcher
     
     +table(["Name", "Type", "Description"])
         +row
    
    From 16ba6aa8a66b69eeeef482dc3247bc46e938aec7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 13:17:31 -0500
    Subject: [PATCH 535/739] Fix parser config serialization
    
    ---
     spacy/syntax/nn_parser.pyx | 23 ++++++++++++-----------
     1 file changed, 12 insertions(+), 11 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f9c8c0c14..9ae53b103 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -238,14 +238,15 @@ cdef class Parser:
         Base class of the DependencyParser and EntityRecognizer.
         """
         @classmethod
    -    def Model(cls, nr_class, token_vector_width=128, hidden_width=200, 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)
    -        embed_size = util.env_opt('embed_size', 7000)
    -        hist_size = util.env_opt('history_feats', cfg.get('history_feats', 0))
    -        hist_width = util.env_opt('history_width', cfg.get('history_width', 0))
    +    def Model(cls, nr_class, **cfg):
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('parser_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('parser_maxout_pieces', 3))
    +        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))
    +        print("Create parser model", locals())
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    @@ -277,14 +278,14 @@ cdef class Parser:
                     upper = chain(
                         HistoryFeatures(nr_class=nr_class, hist_size=hist_size,
                                         nr_dim=hist_width),
    -                    Maxout(hidden_width, hidden_width+hist_size*hist_width),
    -                    clone(Maxout(hidden_width, hidden_width), depth-2),
    +                    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(Maxout(hidden_width, hidden_width), depth-1),
    +                    clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-1),
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    
    From f4c9a98166feacc788f2d93e834ae2cf3e0332d2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 13:17:47 -0500
    Subject: [PATCH 536/739] Fix spacy evaluate command on non-GPU
    
    ---
     spacy/cli/evaluate.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/cli/evaluate.py b/spacy/cli/evaluate.py
    index 42e077dc2..29e30b7d2 100644
    --- a/spacy/cli/evaluate.py
    +++ b/spacy/cli/evaluate.py
    @@ -42,7 +42,8 @@ def evaluate(cmd, model, data_path, gpu_id=-1, gold_preproc=False,
         Evaluate a model. To render a sample of parses in a HTML file, set an output
         directory as the displacy_path argument.
         """
    -    util.use_gpu(gpu_id)
    +    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)
    
    From 8e731009fea6afa67862c6293248fac244836d70 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 13:50:52 -0500
    Subject: [PATCH 537/739] Fix parser config serialization
    
    ---
     spacy/syntax/nn_parser.pyx | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 9ae53b103..bb1ec1b4a 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,10 +239,10 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('parser_hidden_depth', 1))
    +        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('parser_maxout_pieces', 3))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
             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))
    @@ -295,7 +295,7 @@ cdef class Parser:
             lower.begin_training(lower.ops.allocate((500, token_vector_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,
    @@ -727,7 +727,7 @@ cdef class Parser:
                                            lower, stream, drop=0.0)
             return (tokvecs, bp_tokvecs), state2vec, upper
     
    -    nr_feature = 2
    +    nr_feature = 8
     
         def get_token_ids(self, states):
             cdef StateClass state
    
    From 3468d535ad2ae0074683600c8b1dadaad89ca1cb Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 6 Oct 2017 21:39:06 +0200
    Subject: [PATCH 538/739] Update model benchmarks
    
    ---
     .../_facts-figures/_benchmarks-models.jade    | 26 +++++++++++++++++--
     1 file changed, 24 insertions(+), 2 deletions(-)
    
    diff --git a/website/usage/_facts-figures/_benchmarks-models.jade b/website/usage/_facts-figures/_benchmarks-models.jade
    index 208e7da48..d8f9713b2 100644
    --- a/website/usage/_facts-figures/_benchmarks-models.jade
    +++ b/website/usage/_facts-figures/_benchmarks-models.jade
    @@ -6,14 +6,14 @@ p
         |  end-to-end from raw text, with no "gold standard" pre-processing, over
         |  text from a mix of genres where possible.
     
    -+under-construction
    -
     +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
    @@ -46,3 +46,25 @@ p
             +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
    
    From 8be46d766e1b5c97abe44793ca0e278ac0b3657c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 6 Oct 2017 16:19:02 -0500
    Subject: [PATCH 539/739] Remove print statement
    
    ---
     spacy/syntax/nn_parser.pyx | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index bb1ec1b4a..b5f218d75 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -246,7 +246,6 @@ cdef class Parser:
             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))
    -        print("Create parser model", locals())
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 212c8f071180c9ce134a74b85603e48c14199595 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:25:54 +0200
    Subject: [PATCH 540/739] Implement new Language methods and pipeline API
    
    ---
     spacy/language.py | 260 ++++++++++++++++++++++++++--------------------
     spacy/util.py     |   6 +-
     2 files changed, 150 insertions(+), 116 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index c49c64b1d..91644aec0 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -70,59 +70,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 meta.get('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)],
    -        'similarity': lambda nlp, **cfg: [SimilarityHook(nlp.vocab, **cfg)],
    -        'textcat': lambda nlp, **cfg: [TextCategorizer(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)],
    -    }
    -
    +    pipe_names = ['tensorizer', 'tagger', 'parser', 'ner']
         token_match = TOKEN_MATCH
         prefixes = tuple(TOKENIZER_PREFIXES)
         suffixes = tuple(TOKENIZER_SUFFIXES)
    @@ -152,8 +100,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),  # nonproj.deprojectivize,
    +        '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
    @@ -179,28 +136,7 @@ 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
    @@ -214,11 +150,7 @@ class Language(object):
             self._meta.setdefault('email', '')
             self._meta.setdefault('url', '')
             self._meta.setdefault('license', '')
    -        pipeline = []
    -        for component in self.pipeline:
    -            if hasattr(component, 'name'):
    -                pipeline.append(component.name)
    -        self._meta['pipeline'] = pipeline
    +        self._meta['pipeline'] = self.pipe_names
             return self._meta
     
         @meta.setter
    @@ -228,31 +160,133 @@ class Language(object):
         # 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`.
    +        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:
    +            name = getattr(component, 'name', component.__name__)
    +        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,
    @@ -269,8 +303,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)
    @@ -308,7 +341,7 @@ class Language(object):
                 grads[key] = (W, dW)
             pipes = list(self.pipeline)
             random.shuffle(pipes)
    -        for proc in pipes:
    +        for name, proc in pipes:
                 if not hasattr(proc, 'update'):
                     continue
                 proc.update(docs, golds, drop=drop, sgd=get_grads, losses=losses)
    @@ -322,7 +355,7 @@ 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:
    @@ -371,7 +404,7 @@ class Language(object):
             else:
                 device = None
             link_vectors_to_models(self.vocab)
    -        for proc in self.pipeline:
    +        for name, proc in self.pipeline:
                 if hasattr(proc, 'begin_training'):
                     context = proc.begin_training(get_gold_tuples(),
                                                   pipeline=self.pipeline)
    @@ -393,7 +426,7 @@ class Language(object):
             docs, golds = zip(*docs_golds)
             docs = list(docs)
             golds = list(golds)
    -        for pipe in self.pipeline:
    +        for name, pipe in self.pipeline:
                 if not hasattr(pipe, 'pipe'):
                     for doc in docs:
                         pipe(doc)
    @@ -419,7 +452,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.
    @@ -466,8 +499,7 @@ class Language(object):
                     yield (doc, context)
                 return
             docs = (self.make_doc(text) for text in 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'):
    @@ -495,14 +527,14 @@ class Language(object):
                 ('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})
     
    @@ -526,14 +558,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
    @@ -552,8 +582,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
    @@ -572,8 +602,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/util.py b/spacy/util.py
    index e1a721a12..9e9c4fa42 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -135,7 +135,11 @@ 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)
    +    for name in meta.get('pipeline', []):
    +        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)
     
     
    
    From 2586b61b15fa04d91ec4a2919729ab70e9a6b26b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:26:05 +0200
    Subject: [PATCH 541/739] Fix formatting, tidy up and remove unused imports
    
    ---
     spacy/language.py | 23 ++++++++---------------
     1 file changed, 8 insertions(+), 15 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 91644aec0..7a409133a 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -1,12 +1,9 @@
     # 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
    @@ -17,24 +14,20 @@ 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 TextCategorizer
    -from . import about
    +from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger
    +from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer
     
     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 ._ml import link_vectors_to_models
    +from . import about
     
     
     class BaseDefaults(object):
    @@ -289,7 +282,7 @@ class Language(object):
             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.
     
    @@ -387,7 +380,7 @@ class Language(object):
     
             get_gold_tuples (function): Function returning gold data
             **cfg: Config parameters.
    -        returns: An optimizer
    +        RETURNS: An optimizer
             """
             # Populate vocab
             if get_gold_tuples is not None:
    
    From b39409173e4143b6053892475c1adf6010176060 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:29:08 +0200
    Subject: [PATCH 542/739] Add disable option and True/False/None values for
     pipeline
    
    ---
     spacy/util.py | 15 +++++++++++----
     1 file changed, 11 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 9e9c4fa42..50ebc036b 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -136,10 +136,17 @@ def load_model_from_path(model_path, meta=False, **overrides):
             meta = get_model_meta(model_path)
         cls = get_lang_class(meta['lang'])
         nlp = cls(meta=meta, **overrides)
    -    for name in meta.get('pipeline', []):
    -        config = meta.get('pipeline_args', {}).get(name, {})
    -        component = nlp.create_pipe(name, config=config)
    -        nlp.add_pipe(component, name=name)
    +    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)
     
     
    
    From 61a503a61195c465328fcf0f283ce64f923b5c55 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 00:38:51 +0200
    Subject: [PATCH 543/739] Fix parser test
    
    ---
     spacy/tests/conftest.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py
    index b33a7c008..28b5f4ab9 100644
    --- a/spacy/tests/conftest.py
    +++ b/spacy/tests/conftest.py
    @@ -58,8 +58,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
    
    From e43530269c77a39d7b9460d5730db5707c439285 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 01:04:50 +0200
    Subject: [PATCH 544/739] Update docstrings
    
    ---
     spacy/language.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 7a409133a..a3152aea3 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -195,6 +195,7 @@ class Language(object):
             """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:
    @@ -274,7 +275,7 @@ class Language(object):
             """Remove a component from the pipeline.
     
             name (unicode): Name of the component to remove.
    -        RETURNS (tuple): A (name, component) tuple of the removed component.
    +        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: {}"
    
    From 3a65a0c970ec235d7e5b306924a90e8552c6568c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 01:48:23 +0200
    Subject: [PATCH 545/739] Start adding tests for new pipeline management
    
    ---
     spacy/tests/pipeline/__init__.py      |  0
     spacy/tests/pipeline/test_add_pipe.py | 43 +++++++++++++++++++++++++++
     2 files changed, 43 insertions(+)
     create mode 100644 spacy/tests/pipeline/__init__.py
     create mode 100644 spacy/tests/pipeline/test_add_pipe.py
    
    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_add_pipe.py b/spacy/tests/pipeline/test_add_pipe.py
    new file mode 100644
    index 000000000..13fb4acaf
    --- /dev/null
    +++ b/spacy/tests/pipeline/test_add_pipe.py
    @@ -0,0 +1,43 @@
    +from __future__ import unicode_literals
    +import pytest
    +
    +from ... import language
    +from ...language import Language
    +
    +@pytest.fixture
    +def nlp():
    +    return Language()
    +
    +@pytest.fixture
    +def name():
    +    return 'parser'
    +
    +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')
    +
    +
    +def test_add_pipe_first(nlp, name):
    +    nlp.add_pipe(new_pipe, name=name, first=True)
    +    assert nlp.pipeline[0][0] == name
    +
    +
    +def test_add_pipe_last(nlp, name):
    +    nlp.add_pipe(lambda doc: doc, name='lambda_pipe')
    +    nlp.add_pipe(new_pipe, name=name, last=True)
    +    assert nlp.pipeline[0][0] != name
    +    assert nlp.pipeline[-1][0] == name
    +
    +
    +def test_cant_add_pipe_first_and_last(nlp):
    +    with pytest.raises(ValueError):
    +        nlp.add_pipe(new_pipe, first=True, last=True)
    
    From 0384f0821817014972b5bf8f062d94cd6ea22c2b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 02:00:47 +0200
    Subject: [PATCH 546/739] Trigger nonproj.deprojectivize as a postprocess
    
    ---
     spacy/language.py          |  2 +-
     spacy/pipeline.pyx         | 14 ++++++++++++++
     spacy/syntax/nn_parser.pyx |  8 ++++++++
     3 files changed, 23 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index a3152aea3..d40aee3ca 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -97,7 +97,7 @@ class Language(object):
             '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),  # nonproj.deprojectivize,
    +        '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)
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 8d935335c..4d9adc609 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -28,6 +28,7 @@ from thinc.neural._classes.difference import Siamese, CauchySimilarity
     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
    @@ -773,11 +774,19 @@ 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)
    @@ -818,6 +827,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/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 459c94463..f2c72a639 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -739,6 +739,14 @@ 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):
             for action in self.moves.action_types:
    
    From b38a8f4a943306a4a978e9b40fea9f5f2d7193e7 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 02:06:21 +0200
    Subject: [PATCH 547/739] Fix and update pipe methods tests
    
    ---
     spacy/tests/pipeline/test_add_pipe.py     | 43 ------------
     spacy/tests/pipeline/test_pipe_methods.py | 84 +++++++++++++++++++++++
     2 files changed, 84 insertions(+), 43 deletions(-)
     delete mode 100644 spacy/tests/pipeline/test_add_pipe.py
     create mode 100644 spacy/tests/pipeline/test_pipe_methods.py
    
    diff --git a/spacy/tests/pipeline/test_add_pipe.py b/spacy/tests/pipeline/test_add_pipe.py
    deleted file mode 100644
    index 13fb4acaf..000000000
    --- a/spacy/tests/pipeline/test_add_pipe.py
    +++ /dev/null
    @@ -1,43 +0,0 @@
    -from __future__ import unicode_literals
    -import pytest
    -
    -from ... import language
    -from ...language import Language
    -
    -@pytest.fixture
    -def nlp():
    -    return Language()
    -
    -@pytest.fixture
    -def name():
    -    return 'parser'
    -
    -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')
    -
    -
    -def test_add_pipe_first(nlp, name):
    -    nlp.add_pipe(new_pipe, name=name, first=True)
    -    assert nlp.pipeline[0][0] == name
    -
    -
    -def test_add_pipe_last(nlp, name):
    -    nlp.add_pipe(lambda doc: doc, name='lambda_pipe')
    -    nlp.add_pipe(new_pipe, name=name, last=True)
    -    assert nlp.pipeline[0][0] != name
    -    assert nlp.pipeline[-1][0] == name
    -
    -
    -def test_cant_add_pipe_first_and_last(nlp):
    -    with pytest.raises(ValueError):
    -        nlp.add_pipe(new_pipe, first=True, last=True)
    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
    
    From 0adadcb3f04e2ecb98b5ca5de1afba2ba7208d23 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 02:15:15 +0200
    Subject: [PATCH 548/739] Fix beam parse model test
    
    ---
     spacy/tests/parser/test_beam_parse.py | 15 ++++++++-------
     1 file changed, 8 insertions(+), 7 deletions(-)
    
    diff --git a/spacy/tests/parser/test_beam_parse.py b/spacy/tests/parser/test_beam_parse.py
    index da5f43d5e..dd77c6805 100644
    --- a/spacy/tests/parser/test_beam_parse.py
    +++ b/spacy/tests/parser/test_beam_parse.py
    @@ -1,10 +1,11 @@
    -import spacy
    +# coding: utf8
    +from __future__ import unicode_literals
    +
     import pytest
     
    -@pytest.mark.models
    -def test_beam_parse():
    -    nlp = spacy.load('en_core_web_sm')
    -    doc = nlp(u'Australia is a country', disable=['ner'])
    -    ents = nlp.entity(doc, beam_width=2)
    -    print(ents)
     
    +@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)
    
    From e370332fb1fe8cb179f0fbbbfd79b7251df8781c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 03:00:20 +0200
    Subject: [PATCH 549/739] Update Language API docs
    
    ---
     website/api/language.jade | 229 +++++++++++++++++++++++++++++++++++---
     1 file changed, 216 insertions(+), 13 deletions(-)
    
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 617c81599..89807fabe 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -4,7 +4,14 @@ include ../_includes/_mixins
     
     p
         |  Usually you'll load this once per process as #[code nlp] and pass the
    -    |  instance around your application.
    +    |  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
    @@ -54,6 +53,23 @@ p Initialise a #[code Language] object.
             +cell #[code Language]
             +cell The newly constructed object.
     
    ++infobox("Deprecation note", "⚠️")
    +    .o-block
    +        |  To make the processing pipelines and their components more
    +        |  transparent, the #[code pipeline] and #[code disable] arguments on
    +        |  initialisation are now deprecated. Instead, pipeline components can
    +        |  now be added, removed and rearranged using the new #[code Language]
    +        |  methods, for example #[+api("language#add_pipe") #[code add_pipe]] or
    +        |  #[+api("language#create_pipe") #[code create_pipe]]. This is also how
    +        |  #[+api("spacy#load") #[code spacy.load()]] creates the
    +        |  #[code Language] instance it returns.
    +
    +    +code-new.
    +        nlp = English()
    +        parser = nlp.create_pipe('parser')
    +        nlp.add_pipe(parser)
    +    +code-old nlp = English(pipeline=['parser'])
    +
     +h(2, "call") Language.__call__
         +tag method
     
    @@ -235,7 +251,6 @@ 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]
    @@ -247,6 +262,177 @@ p
             +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)
    @@ -399,7 +585,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]
    @@ -424,3 +618,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.
    
    From ed8e0085b0b6aae9501bb87be365366b88816be4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 03:06:55 +0200
    Subject: [PATCH 550/739] Update docs for spacy.load()
    
    ---
     website/api/_top-level/_spacy.jade | 14 ++++++++++++++
     1 file changed, 14 insertions(+)
    
    diff --git a/website/api/_top-level/_spacy.jade b/website/api/_top-level/_spacy.jade
    index c14f62f7e..2b523f846 100644
    --- a/website/api/_top-level/_spacy.jade
    +++ b/website/api/_top-level/_spacy.jade
    @@ -43,6 +43,20 @@ p
             +cell #[code Language]
             +cell A #[code Language] object with the loaded model.
     
    +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 class for ID, e.g. 'en'
    +    nlp = cls()                             #  initialise the Language class
    +    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
    
    From 3b67eabfea28f817f646a892ed4aec4644a46aee Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 03:36:15 +0200
    Subject: [PATCH 551/739] Allow empty dictionaries to match any token in
     Matcher
    
    Often patterns need to match "any token". A clean way to denote this
    is with the empty dict {}: this sets no constraints on the token,
    so should always match.
    
    The problem was that having attributes length==0 was used as an
    end-of-array signal, so the matcher didn't handle this case correctly.
    
    This patch compiles empty token spec dicts into a constraint
    NULL_ATTR==0. The NULL_ATTR attribute, 0, is always set to 0 on the
    lexeme -- so this always matches.
    ---
     spacy/matcher.pyx           |  8 ++++++--
     spacy/tests/test_matcher.py | 14 ++++++++++++++
     2 files changed, 20 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 3bc6f859c..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.
             """
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index 1b9f92519..b36c67d8c 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -98,6 +98,20 @@ def test_matcher_match_multi(matcher):
                                 (doc.vocab.strings['Java'], 5, 6)]
     
     
    +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)
    
    From 58dfde7c0227958972dc37a71d878d605b87ffa1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 04:54:57 +0200
    Subject: [PATCH 552/739] Remove redundante deprecation note
    
    ---
     website/api/language.jade | 17 -----------------
     1 file changed, 17 deletions(-)
    
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 89807fabe..500d6c411 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -53,23 +53,6 @@ p Initialise a #[code Language] object.
             +cell #[code Language]
             +cell The newly constructed object.
     
    -+infobox("Deprecation note", "⚠️")
    -    .o-block
    -        |  To make the processing pipelines and their components more
    -        |  transparent, the #[code pipeline] and #[code disable] arguments on
    -        |  initialisation are now deprecated. Instead, pipeline components can
    -        |  now be added, removed and rearranged using the new #[code Language]
    -        |  methods, for example #[+api("language#add_pipe") #[code add_pipe]] or
    -        |  #[+api("language#create_pipe") #[code create_pipe]]. This is also how
    -        |  #[+api("spacy#load") #[code spacy.load()]] creates the
    -        |  #[code Language] instance it returns.
    -
    -    +code-new.
    -        nlp = English()
    -        parser = nlp.create_pipe('parser')
    -        nlp.add_pipe(parser)
    -    +code-old nlp = English(pipeline=['parser'])
    -
     +h(2, "call") Language.__call__
         +tag method
     
    
    From feaf353051f1163454a05c78b074c0a37b1329af Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 14:05:59 +0200
    Subject: [PATCH 553/739] Update processing pipelines usage docs
    
    ---
     .../_processing-pipelines/_pipelines.jade     | 195 +++++-------------
     1 file changed, 52 insertions(+), 143 deletions(-)
    
    diff --git a/website/usage/_processing-pipelines/_pipelines.jade b/website/usage/_processing-pipelines/_pipelines.jade
    index d09ed4ead..3c1c28af1 100644
    --- a/website/usage/_processing-pipelines/_pipelines.jade
    +++ b/website/usage/_processing-pipelines/_pipelines.jade
    @@ -11,7 +11,7 @@ p
     
     p
         |  When you load a model, spaCy first consults the model's
    -    |  #[+a("/usage/saving-loading#models-generating") meta.json]. The
    +    |  #[+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:
    @@ -21,24 +21,26 @@ p
             "name": "example_model",
             "lang": "en"
             "description": "Example model for spaCy",
    -        "pipeline": ["tensorizer", "tagger"]
    +        "pipeline": ["tagger", "parser"]
         }
     
     +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]].
    +        |  #[+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
    -        |  Pass the path to the #[strong model data] to the #[code Language]
    -        |  class and return it.
    +        |  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...
    @@ -47,12 +49,12 @@ p
         nlp = spacy.load('en')
     
     p
    -    | ... the model tells spaCy to use the pipeline
    +    | ... the model tells spaCy to use the language #[code "en"] and the pipeline
         |  #[code.u-break ["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.
    +    |  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
    @@ -73,9 +75,12 @@ p
         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(pipeline=pipeline)           # 2. initialise it with the pipeline
    -    nlp.from_disk(model_data_path)         # 3. load in the binary data
    +    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
    @@ -87,124 +92,23 @@ p
         |  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(3, "creating") Creating pipeline components and factories
    +    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
    -    |  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(4, "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.
    -
    -    +row("foot")
    -        +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!
    +    |  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.
    -    # Create a new Language object with a pipeline
    -    from spacy.language import Language
    -    nlp = Language(pipeline=[my_component])
    +    nlp.pipeline
    +    # [('tagger', <spacy.pipeline.Tagger>), ('parser', <spacy.pipeline.DependencyParser>), ('ner', <spacy.pipeline.EntityRecognizer>)]
    +    nlp.pipe_names
    +    # ['tagger', 'parser', 'ner']
     
    -    # Modify an existing pipeline
    -    nlp = spacy.load('en')
    -    nlp.pipeline.append(my_component)
    -
    -+h(4, "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.
    -
    -    +row("foot")
    -        +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("/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("/usage/training#models-generating") model package] with
    -    |  a custom pipeline.
    -
    -+h(3, "disabling") Disabling pipeline components
    ++h(3, "disabling") Disabling and modifying pipeline components
     
     p
         |  If you don't need a particular component of the pipeline – for
    @@ -217,16 +121,19 @@ p
     +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:
    +    |  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 = spacy.load('en')
    -    nlp.pipeline = nlp.pipeline[:2] # only use the first two components
    +    nlp.remove_pipe('parser')
    +    nlp.rename_pipe('ner', 'entityrecognizer')
    +    nlp.replace_pipe('tagger', my_custom_tagger)
     
     +infobox("Important note: disabling pipeline components")
         .o-block
    @@ -234,12 +141,14 @@ p
             |  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
    +        |  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=['tagger', 'ner'])
    -        doc = nlp(u"I don't want parsed", disable=['parser'])
    +        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)
    
    From e22067e3b538e70e55cd20a6ffd4d0a2e64a2f26 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 07:10:10 -0500
    Subject: [PATCH 554/739] Document new hyper-parameters
    
    ---
     website/api/_top-level/_cli.jade | 10 ++++++++++
     1 file changed, 10 insertions(+)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index f59d5afdd..5c91b48e8 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -314,6 +314,16 @@ p
             +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 Learning rate.
    
    From 3d22ccf4954fabc5bbbdf766b6a3ad3a8609692d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 07:16:41 -0500
    Subject: [PATCH 555/739] Update default hyper-parameters
    
    ---
     spacy/syntax/nn_parser.pyx | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index b5f218d75..fdcf1d2d1 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,13 +239,13 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 2))
             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', 3))
    +        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
             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))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 37f755897f3bb95355a04ccaf1a4af8e07b64794 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:04:09 +0200
    Subject: [PATCH 556/739] Update rule-based matching docs
    
    ---
     .../_rule-based-matching.jade                 | 162 ++++++++++++++----
     1 file changed, 125 insertions(+), 37 deletions(-)
    
    diff --git a/website/usage/_linguistic-features/_rule-based-matching.jade b/website/usage/_linguistic-features/_rule-based-matching.jade
    index 88a713ffc..c006f43c9 100644
    --- a/website/usage/_linguistic-features/_rule-based-matching.jade
    +++ b/website/usage/_linguistic-features/_rule-based-matching.jade
    @@ -75,6 +75,131 @@ p
         |  other pattern types. You shouldn't have to create different matchers for
         |  each of those processes.
     
    ++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
    @@ -183,43 +308,6 @@ p
                 |  A list of #[code (match_id, start, end)] tuples, describing the
                 |  matches. A match tuple describes a span #[code doc[start:end]].
     
    -+h(3, "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, "example1") Example: Using linguistic annotations
     
     p
    
    From c970b4f226c76bbeea43d5c510577638bb523ddc Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:04:16 +0200
    Subject: [PATCH 557/739] Add missing token attribute
    
    ---
     website/api/token.jade | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 4eebc262c..814a13310 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -464,6 +464,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
    
    From d70cf1915889bbc4463d353427fb1655a2e922a1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:06:38 +0200
    Subject: [PATCH 558/739] Fix formatting
    
    ---
     website/api/_top-level/_cli.jade | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index 5c91b48e8..3a4b4702a 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -316,12 +316,12 @@ p
     
         +row
             +cell #[code history_feats]
    -        +cell Number of previous action ID features for parser and NER
    +        +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 Number of embedding dimensions for each action ID.
             +cell #[code 128]
     
         +row
    
    From 743d1df1fe6474b6342ff7cfe73a988d89e679c6 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:27:28 +0200
    Subject: [PATCH 559/739] Update pipelines docs and add user hooks to custom
     components
    
    ---
     website/usage/_data.json                      |   7 +-
     .../_custom-components.jade                   | 151 ++++++++++++++++++
     .../_processing-pipelines/_user-hooks.jade    |  61 -------
     website/usage/processing-pipelines.jade       |  10 +-
     4 files changed, 157 insertions(+), 72 deletions(-)
     create mode 100644 website/usage/_processing-pipelines/_custom-components.jade
     delete mode 100644 website/usage/_processing-pipelines/_user-hooks.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index b34304ed6..f77f7929c 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -103,11 +103,10 @@
             "title": "Language Processing Pipelines",
             "next": "vectors-similarity",
             "menu": {
    -            "How pipelines work": "pipelines",
    -            "Examples": "examples",
    +            "How Pipelines Work": "pipelines",
    +            "Custom Components": "custom-components",
                 "Multi-threading": "multithreading",
    -            "User Hooks": "user-hooks",
    -            "Serialization": "serialization"
    +            "Serialization": "serialization",
             }
         },
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    new file mode 100644
    index 000000000..13f0cb85c
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -0,0 +1,151 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > CUSTOM COMPONENTS
    +
    +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.
    +
    +    +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 before or after, tell spaCy
    +    |  to add it first or last in the pipeline, or define a custom name.
    +    |  If no name is set and no #[code name] attribute is present on your
    +    |  component, the function name, e.g. #[code component.__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")
    +    |  Setting attributes on the #[code Doc], #[code Span] and #[code Token]
    +
    ++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.
    +
    ++under-construction
    +
    ++h(3, "custom-components-user-hooks") Other 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/_user-hooks.jade b/website/usage/_processing-pipelines/_user-hooks.jade
    deleted file mode 100644
    index e7dce53fe..000000000
    --- a/website/usage/_processing-pipelines/_user-hooks.jade
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -//- 💫 DOCS > USAGE > PROCESSING PIPELINES > ATTRIBUTE HOOKS
    -
    -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].
    -
    -+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/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
    index 0bb96780e..0d0579883 100644
    --- a/website/usage/processing-pipelines.jade
    +++ b/website/usage/processing-pipelines.jade
    @@ -8,18 +8,14 @@ include _spacy-101/_pipelines
         +h(2, "pipelines") How pipelines work
         include _processing-pipelines/_pipelines
     
    -+section("examples")
    -    +h(2, "examples") Examples
    -    include _processing-pipelines/_examples
    ++section("custom-components")
    +    +h(2, "custom-components") Creating custom pipeline components
    +    include _processing-pipelines/_custom-components
     
     +section("multithreading")
         +h(2, "multithreading") Multi-threading
         include _processing-pipelines/_multithreading
     
    -+section("user-hooks")
    -    +h(2, "user-hooks") User hooks
    -    include _processing-pipelines/_user-hooks
    -
     +section("serialization")
         +h(2, "serialization") Serialization
         include _processing-pipelines/_serialization
    
    From ca6769fd4855e55365b70c3b6cbd32387aec6548 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 7 Oct 2017 15:28:01 +0200
    Subject: [PATCH 560/739] Update spacy functions and remove removed set_factory
    
    ---
     website/api/_top-level/_spacy.jade | 38 ++----------------------------
     1 file changed, 2 insertions(+), 36 deletions(-)
    
    diff --git a/website/api/_top-level/_spacy.jade b/website/api/_top-level/_spacy.jade
    index 2b523f846..81ec744ad 100644
    --- a/website/api/_top-level/_spacy.jade
    +++ b/website/api/_top-level/_spacy.jade
    @@ -50,8 +50,8 @@ p
         |  returns it.
     
     +code("Abstract example").
    -    cls = util.get_lang_class(lang)         #  get Language class for ID, e.g. 'en'
    -    nlp = cls()                             #  initialise the Language class
    +    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
    @@ -155,37 +155,3 @@ p
             +cell returns
             +cell unicode
             +cell The explanation, or #[code None] if not found in the glossary.
    -
    -+h(3, "spacy.set_factory") spacy.set_factory
    -    +tag function
    -    +tag-new(2)
    -
    -p
    -    |  Set a factory that returns a custom
    -    |  #[+a("/usage/processing-pipelines") 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.
    
    From 1289129fd92da28a0d3f55acf65ec6287eea7086 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 18:00:14 +0200
    Subject: [PATCH 561/739] Add Underscore class
    
    ---
     spacy/tokens/underscore.py | 38 ++++++++++++++++++++++++++++++++++++++
     1 file changed, 38 insertions(+)
     create mode 100644 spacy/tokens/underscore.py
    
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    new file mode 100644
    index 000000000..8374f4bda
    --- /dev/null
    +++ b/spacy/tokens/underscore.py
    @@ -0,0 +1,38 @@
    +class Undercore(object):
    +    doc_extensions = {}
    +    span_extensions = {}
    +    token_extensions = {}
    +
    +    def __init__(self, obj, start=None, end=None):
    +        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', start)
    +
    +    def __getattr__(self, name):
    +        if name not in self.__class__.extensions:
    +            raise AttributeError(name)
    +        default, method, getter, setter = self.__class__.extensions[name]
    +        if getter is not None:
    +            return getter(self._obj)
    +        elif method is not None:
    +            return method)
    +        else:
    +            return self._doc.user_data.get(self._get_key(name), default)
    +
    +    def __setattr__(self, name, value):
    +        if name not in self.__class__.extensions:
    +            raise AttributeError(name)
    +        default, method, getter, setter = self.__class__.extensions[name]
    +        if setter is not None:
    +            return setter(self._obj, value)
    +        else:
    +            self._doc.user_data[self._get_key(name)] = value
    +
    +    def _get_key(self, name):
    +        return ('._.', name, self._start, self._end)
    
    From 668a0ea64032dd5896e316db6e62454c7bb48fa0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 18:56:01 +0200
    Subject: [PATCH 562/739] Pass extensions into Underscore class
    
    ---
     spacy/tokens/doc.pyx       | 23 ++++++++++++++++++++++-
     spacy/tokens/span.pyx      | 19 +++++++++++++++++++
     spacy/tokens/token.pyx     | 19 +++++++++++++++++++
     spacy/tokens/underscore.py | 17 +++++++++--------
     4 files changed, 69 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index fcb5a16fa..329b1a0dd 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.
     
    @@ -159,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.
     
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 7e29cccf4..389922518 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -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,11 @@ 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 merge(self, *args, **attributes):
             """Retokenize the document, such that the span is merged into a single
             token.
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 7b11d6efa..c617b382e 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.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, Vocab vocab, Doc doc, int offset):
             """Construct a `Token` object.
     
    @@ -87,6 +101,11 @@ cdef class Token:
             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.
     
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 8374f4bda..66c54d6d6 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -1,9 +1,10 @@
    -class Undercore(object):
    +class Underscore(object):
         doc_extensions = {}
         span_extensions = {}
         token_extensions = {}
     
    -    def __init__(self, obj, start=None, end=None):
    +    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
    @@ -12,23 +13,23 @@ class Undercore(object):
             # (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', start)
    +        object.__setattr__(self, '_end', end)
     
         def __getattr__(self, name):
    -        if name not in self.__class__.extensions:
    +        if name not in self._extensions:
                 raise AttributeError(name)
    -        default, method, getter, setter = self.__class__.extensions[name]
    +        default, method, getter, setter = self._extensions[name]
             if getter is not None:
                 return getter(self._obj)
             elif method is not None:
    -            return method)
    +            return method
             else:
                 return self._doc.user_data.get(self._get_key(name), default)
     
         def __setattr__(self, name, value):
    -        if name not in self.__class__.extensions:
    +        if name not in self._extensions:
                 raise AttributeError(name)
    -        default, method, getter, setter = self.__class__.extensions[name]
    +        default, method, getter, setter = self._extensions[name]
             if setter is not None:
                 return setter(self._obj, value)
             else:
    
    From 9bd81917397e558464e1dd86ab31f1b660279e62 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 18:56:19 +0200
    Subject: [PATCH 563/739] Add tests for Underscore
    
    ---
     spacy/tests/test_underscore.py | 50 ++++++++++++++++++++++++++++++++++
     1 file changed, 50 insertions(+)
     create mode 100644 spacy/tests/test_underscore.py
    
    diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py
    new file mode 100644
    index 000000000..262098515
    --- /dev/null
    +++ b/spacy/tests/test_underscore.py
    @@ -0,0 +1,50 @@
    +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: 'cheese')
    +    Underscore.token_extensions['hello'] = (None, token.say_cheese,
    +                                            None, None)
    +    token._ = Underscore(Underscore.token_extensions, token, start=token.idx)
    +    assert token._.hello() == 'cheese'
    
    From f2b590f67283678fc4521208729fd9c10caa3db0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 19:01:01 +0200
    Subject: [PATCH 564/739] Increment version
    
    ---
     spacy/about.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/about.py b/spacy/about.py
    index a8880d7ca..699b61aff 100644
    --- a/spacy/about.py
    +++ b/spacy/about.py
    @@ -3,13 +3,13 @@
     # https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py
     
     __title__ = 'spacy-nightly'
    -__version__ = '2.0.0a16'
    +__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__ = True
    +__release__ = False
     
     __docs_models__ = 'https://alpha.spacy.io/usage/models'
     __download_url__ = 'https://github.com/explosion/spacy-models/releases/download'
    
    From 92c5d78b422ad437eaac79f11edca7d2f6885e1e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 19:02:40 +0200
    Subject: [PATCH 565/739] Unhack NER.add_action
    
    ---
     spacy/syntax/ner.pyx | 46 +++++++++++++++++++++-----------------------
     1 file changed, 22 insertions(+), 24 deletions(-)
    
    diff --git a/spacy/syntax/ner.pyx b/spacy/syntax/ner.pyx
    index d8c748099..5c4e42176 100644
    --- a/spacy/syntax/ner.pyx
    +++ b/spacy/syntax/ner.pyx
    @@ -219,30 +219,28 @@ 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
    -
    -
    +    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.
    
    From d163115e91aaa6a0f73b05b05bcca9774d76bf7c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 21:00:43 -0500
    Subject: [PATCH 566/739] Add non-linearity after history features
    
    ---
     spacy/_ml.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 898d6ab49..23facb9fb 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -264,7 +264,8 @@ def HistoryFeatures(nr_class, hist_size=8, nr_dim=8):
             return layerize(noop())
         embed_tables = [Embed(nr_dim, nr_class, column=i, name='embed%d')
                         for i in range(hist_size)]
    -    embed = concatenate(*embed_tables)
    +    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
    
    From 9d66a915da3c78346ebf6a47fac54dd5eb94c246 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 21:02:38 -0500
    Subject: [PATCH 567/739] Update training defaults
    
    ---
     spacy/cli/train.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index b27087056..80bb11798 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -78,11 +78,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         # starts high and decays sharply, to force the optimizer to explore.
         # Batch size starts at 1 and grows, so that we make updates quickly
         # at the beginning of training.
    -    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.2),
    -                                  util.env_opt('dropout_to', 0.2),
    -                                  util.env_opt('dropout_decay', 0.0))
    +    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.6),
    +                                  util.env_opt('dropout_to', 0.1),
    +                                  util.env_opt('dropout_decay', 1e-5))
         batch_sizes = util.compounding(util.env_opt('batch_from', 1),
    -                                   util.env_opt('batch_to', 16),
    +                                   util.env_opt('batch_to', 4),
                                        util.env_opt('batch_compound', 1.001))
         corpus = GoldCorpus(train_path, dev_path, limit=n_sents)
         n_train_words = corpus.count_train()
    
    From 42b401d08b5b4b6968d2ed3e70e0a3c580b6c60b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 7 Oct 2017 21:05:21 -0500
    Subject: [PATCH 568/739] Change default hidden depth to 1
    
    ---
     spacy/syntax/nn_parser.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index fdcf1d2d1..153f7a484 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,7 +239,7 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 2))
    +        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', 128))
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
    
    From be4f0b64605b036f06fdd919253b719fdc88b5bb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 02:08:12 -0500
    Subject: [PATCH 569/739] Update defaults
    
    ---
     spacy/cli/train.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 80bb11798..b27087056 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -78,11 +78,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         # starts high and decays sharply, to force the optimizer to explore.
         # Batch size starts at 1 and grows, so that we make updates quickly
         # at the beginning of training.
    -    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.6),
    -                                  util.env_opt('dropout_to', 0.1),
    -                                  util.env_opt('dropout_decay', 1e-5))
    +    dropout_rates = util.decaying(util.env_opt('dropout_from', 0.2),
    +                                  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', 4),
    +                                   util.env_opt('batch_to', 16),
                                        util.env_opt('batch_compound', 1.001))
         corpus = GoldCorpus(train_path, dev_path, limit=n_sents)
         n_train_words = corpus.count_train()
    
    From 18063803de66a63e0583dd4fe1e3aa8938d561a4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 19:58:54 +0200
    Subject: [PATCH 570/739] Make TokenC.sent_tart an int, to allow ternary value
    
    ---
     spacy/structs.pxd | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    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
    
    From 20309fb9dbda330d6b31371610fd5ac5e6663647 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 20:32:14 +0200
    Subject: [PATCH 571/739] Make history features default to zero
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 153f7a484..619431766 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -244,8 +244,8 @@ cdef class Parser:
             hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 128))
             parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
             embed_size = util.env_opt('embed_size', cfg.get('embed_size', 7000))
    -        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    -        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
    +        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")
    
    From 7ae67ec6a16d5861e12b821bb6315c1d7f23ada2 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 23:50:20 +0200
    Subject: [PATCH 572/739] Add Span.as_doc method
    
    ---
     spacy/tokens/span.pyx | 24 ++++++++++++++++++++++++
     1 file changed, 24 insertions(+)
    
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 7e29cccf4..c6bb1a0bb 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -111,6 +111,30 @@ cdef class Span:
             for i in range(self.start, self.end):
                 yield self.doc[i]
     
    +    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.
    
    From 080afd49240e4ebdf61321adeed2bd81f054600f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 23:51:58 +0200
    Subject: [PATCH 573/739] Add ternary value setting to Token.sent_start
    
    ---
     spacy/tokens/token.pyx | 12 ++++++++++--
     1 file changed, 10 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index 7b11d6efa..78ba920dd 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -281,13 +281,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):
    
    From e938bce320bf9870024cd6ad3d9afc7ce47cc119 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sun, 8 Oct 2017 23:53:34 +0200
    Subject: [PATCH 574/739] Adjust parsing transition system to allow preset
     sentence segments.
    
    ---
     spacy/syntax/_state.pxd    | 4 +++-
     spacy/syntax/arc_eager.pyx | 8 +++++---
     spacy/tokens/doc.pyx       | 2 +-
     3 files changed, 9 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/_state.pxd b/spacy/syntax/_state.pxd
    index 1864b22b3..4675d887e 100644
    --- a/spacy/syntax/_state.pxd
    +++ b/spacy/syntax/_state.pxd
    @@ -307,6 +307,8 @@ cdef cppclass StateC:
                 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
     
    @@ -383,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 d1e1987d7..3a61e1f9d 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -118,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:
    @@ -178,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:
    @@ -212,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:
    @@ -248,6 +248,8 @@ cdef class Break:
                 return False
             elif st.stack_depth() < 1:
                 return False
    +        elif st.B_(0).l_edge < 0:
    +            return False
             else:
                 return True
     
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index fcb5a16fa..df75ab3ec 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -485,7 +485,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:
    
    From 5a67efecccb91f68efbe7b14406a14c8151a2e9e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:02:23 +0200
    Subject: [PATCH 575/739] Add tests for sentence segmentation presetting
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 72 +++++++++++++++++++++++++++
     1 file changed, 72 insertions(+)
     create mode 100644 spacy/tests/parser/test_preset_sbd.py
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    new file mode 100644
    index 000000000..1b83567ad
    --- /dev/null
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -0,0 +1,72 @@
    +'''Test that the parser respects preset sentence boundaries.'''
    +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)) == 2
    +
    +
    +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)) == 3
    +    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)) == 4
    +    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
    
    From 4cc84b023427a7dcbe7fbb7909c67ee3cbc9cc19 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:02:45 +0200
    Subject: [PATCH 576/739] Prohibit Break when sent_start < 0
    
    ---
     spacy/syntax/arc_eager.pyx | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx
    index 3a61e1f9d..9770383d1 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -250,6 +250,8 @@ cdef class Break:
                 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
     
    
    From 02c2af7119790a8e0be15ae44e6e5bf6788cd0c4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:29:37 +0200
    Subject: [PATCH 577/739] Fix test
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index 1b83567ad..fa31486ea 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -41,7 +41,7 @@ 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)) == 3
    +    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
    
    From 81a64119dbc3d2fe40b532925b05d7880e6eeade Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 00:59:49 +0200
    Subject: [PATCH 578/739] Fix string-to-unicode problem
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index fa31486ea..77326f797 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -1,4 +1,5 @@
     '''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 d43a83e37a6ccb0087db8f77c916761d81c94afa Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 03:35:40 +0200
    Subject: [PATCH 579/739] Allow parser.add_label for pretrained models
    
    ---
     spacy/syntax/nn_parser.pyx | 12 +++++++++++-
     1 file changed, 11 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 153f7a484..daebcac7b 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -51,7 +51,7 @@ 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
    +from ..compat import json_dumps, copy_array
     
     from . import _parse_features
     from ._parse_features cimport CONTEXT_SIZE
    @@ -781,12 +781,22 @@ cdef class Parser:
                 self.moves.finalize_doc(doc)
     
         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.
    +            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, pipeline=None, **cfg):
             if 'model' in cfg:
    
    From b2b8506f2c8b984864dabb0daeafa4e86c079231 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 03:35:57 +0200
    Subject: [PATCH 580/739] Remove whitespace
    
    ---
     spacy/_ml.py | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 23facb9fb..62e0ceb9a 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -743,5 +743,3 @@ def concatenate_lists(*layers, **kwargs): # pragma: no cover
             return ys, concatenate_lists_bwd
         model = wrap(concatenate_lists_fwd, concat)
         return model
    -
    -
    
    From dde87e6b0d2de331e536d335ead00db5d181ee96 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 03:42:35 +0200
    Subject: [PATCH 581/739] Add tests for adding parser actions
    
    ---
     spacy/tests/parser/test_add_label.py | 68 ++++++++++++++++++++++++++++
     1 file changed, 68 insertions(+)
     create mode 100644 spacy/tests/parser/test_add_label.py
    
    diff --git a/spacy/tests/parser/test_add_label.py b/spacy/tests/parser/test_add_label.py
    new file mode 100644
    index 000000000..b89cca113
    --- /dev/null
    +++ b/spacy/tests/parser/test_add_label.py
    @@ -0,0 +1,68 @@
    +'''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'] = 4
    +    parser.cfg['hidden_width'] = 6
    +    parser.cfg['hist_size'] = 0
    +    parser.add_label('left')
    +    parser.begin_training([], **parser.cfg)
    +    sgd = Adam(NumpyOps(), 0.001)
    +
    +    for i in range(30):
    +        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_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'
    + 
    
    From 6c79841c0dce58cff859dfd37c44824cd267d8ea Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 04:12:24 +0200
    Subject: [PATCH 582/739] Fix tests for history features
    
    ---
     spacy/tests/parser/test_neural_parser.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/parser/test_neural_parser.py b/spacy/tests/parser/test_neural_parser.py
    index 8747b01ba..ae20cd5f0 100644
    --- a/spacy/tests/parser/test_neural_parser.py
    +++ b/spacy/tests/parser/test_neural_parser.py
    @@ -35,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)[0]
    +    return Parser.Model(arc_eager.n_moves, token_vector_width=tok2vec.nO,
    +                        hist_size=0)[0]
     
     @pytest.fixture
     def doc(vocab):
    @@ -51,7 +52,7 @@ def test_can_init_nn_parser(parser):
     
     
     def test_build_model(parser):
    -    parser.model = Parser.Model(parser.moves.n_moves)[0]
    +    parser.model = Parser.Model(parser.moves.n_moves, hist_size=0)[0]
         assert parser.model is not None
     
     
    
    From 2534cd57d7aa99f98cd4ea0f1aeab5404d0d493d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 08:59:35 +0200
    Subject: [PATCH 583/739] Add bandaid solution to the 'shadowing' problem in
     #864
    
    ---
     spacy/matcher.pyx           | 10 +++++++++-
     spacy/tests/test_matcher.py | 12 +++++++++++-
     2 files changed, 20 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 8893b2fed..41d7029f0 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -71,6 +71,11 @@ cdef enum action_t:
         ADVANCE_ZERO
         PANIC
     
    +# A "match expression" conists of one or more token patterns
    +# Each token pattern consists of a quantifier and 0+ (attr, value) pairs.
    +# A state is an (int, pattern pointer) pair, where the int is the start
    +# position, and the pattern pointer shows where we're up to
    +# in the pattern.
     
     cdef struct AttrValueC:
         attr_id_t attr
    @@ -130,7 +135,10 @@ cdef int get_action(const TokenPatternC* pattern, const TokenC* token) nogil:
         elif pattern.quantifier in (ONE, ZERO_ONE):
             return ACCEPT if (pattern+1).nr_attr == 0 else ADVANCE
         elif pattern.quantifier == ZERO_PLUS:
    -        return REPEAT
    +        # This is a bandaid over the 'shadowing' problem described here:
    +        # https://github.com/explosion/spaCy/issues/864
    +        next_action = get_action(pattern+1, token)
    +        return REPEAT if next_action is REJECT else next_action
         else:
             return PANIC
     
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index b36c67d8c..ce6f2d91e 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -111,7 +111,17 @@ def test_matcher_empty_dict(en_vocab):
         matches = matcher(doc)
         assert matches[0][1:] == (0, 2)
      
    -
    +def test_matcher_operator_shadow(en_vocab):
    +    matcher = Matcher(en_vocab)
    +    abc = ["a", "b", "c"]
    +    doc = get_doc(matcher.vocab, abc)
    +    matcher.add('A.C', None, [{'ORTH': 'a'},
    +                              {"IS_ALPHA": True, "OP": "+"},
    +                              {'ORTH': 'c'}])
    +    matches = matcher(doc)
    +    assert len(matches) == 1
    +    assert matches[0][1:] == (0, 3)
    + 
     def test_matcher_phrase_matcher(en_vocab):
         words = ["Google", "Now"]
         doc = get_doc(en_vocab, words)
    
    From 2ac8b5c6223483af59d279277769a1c7b055ee7e Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:20 +0200
    Subject: [PATCH 584/739] Add wrapper for before/after code examples
    
    ---
     website/_includes/_mixins.jade           | 4 ++++
     website/assets/css/_base/_utilities.sass | 6 ++++++
     2 files changed, 10 insertions(+)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 4876c6b6b..68db1be57 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -149,6 +149,10 @@ mixin code(label, language, prompt, height, icon, wrap)
     
     //- Code blocks to display old/new versions
     
    +mixin code-compare()
    +    span.u-inline-block.u-padding-top.u-width-full
    +        block
    +
     mixin code-old()
         +code(false, false, false, false, "reject").o-block-small
             block
    diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass
    index e2ba552b7..91a6251e6 100644
    --- a/website/assets/css/_base/_utilities.sass
    +++ b/website/assets/css/_base/_utilities.sass
    @@ -143,6 +143,9 @@
     
     //- Layout
     
    +.u-width-full
    +    width: 100%
    +
     .u-float-left
         float: left
         margin-right: 1rem
    @@ -166,6 +169,9 @@
     .u-padding-medium
         padding: 1.8rem
     
    +.u-padding-top
    +    padding-top: 2rem
    +
     .u-inline-block
         display: inline-block
     
    
    From 4d248ea920958943979850dc9e605cd172b7ee3a Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:30 +0200
    Subject: [PATCH 585/739] Fix spacing on bulleted lists
    
    ---
     website/assets/css/_components/_lists.sass | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/assets/css/_components/_lists.sass b/website/assets/css/_components/_lists.sass
    index 2a933c95e..553af6578 100644
    --- a/website/assets/css/_components/_lists.sass
    +++ b/website/assets/css/_components/_lists.sass
    @@ -25,7 +25,7 @@
             display: inline-block
             font-size: 0.6em
             font-weight: bold
    -        padding-right: 1.25rem
    +        padding-right: 1em
             margin-left: -3.75rem
             text-align: right
             width: 2.5rem
    
    From 6550d0547c03002e1d46cf2cf1aa396835bc7cde Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:36 +0200
    Subject: [PATCH 586/739] Fix typo
    
    ---
     website/usage/_processing-pipelines/_serialization.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/usage/_processing-pipelines/_serialization.jade b/website/usage/_processing-pipelines/_serialization.jade
    index e29cbc558..111a5fbad 100644
    --- a/website/usage/_processing-pipelines/_serialization.jade
    +++ b/website/usage/_processing-pipelines/_serialization.jade
    @@ -21,7 +21,7 @@ p
     
     +code.
         import spacy
    -    from spacy.tokens import Span
    +    from spacy.tokens.span import Span
     
         text = u'Netflix is hiring a new VP of global policy'
     
    
    From 6c253db3fe879f229adce49f6b2541b8d5b97913 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 9 Oct 2017 14:36:56 +0200
    Subject: [PATCH 587/739] Add section for developing spaCy extensions
    
    ---
     website/usage/_data.json                             | 1 +
     website/usage/_processing-pipelines/_extensions.jade | 3 +++
     website/usage/processing-pipelines.jade              | 4 ++++
     3 files changed, 8 insertions(+)
     create mode 100644 website/usage/_processing-pipelines/_extensions.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index f77f7929c..25165c3ee 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -107,6 +107,7 @@
                 "Custom Components": "custom-components",
                 "Multi-threading": "multithreading",
                 "Serialization": "serialization",
    +            "Developing Extensions": "extensions"
             }
         },
     
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    new file mode 100644
    index 000000000..d512e0321
    --- /dev/null
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -0,0 +1,3 @@
    +//- 💫 DOCS > USAGE > PROCESSING PIPELINES > DEVELOPING EXTENSIONS
    +
    ++under-construction
    diff --git a/website/usage/processing-pipelines.jade b/website/usage/processing-pipelines.jade
    index 0d0579883..346e0554d 100644
    --- a/website/usage/processing-pipelines.jade
    +++ b/website/usage/processing-pipelines.jade
    @@ -19,3 +19,7 @@ include _spacy-101/_pipelines
     +section("serialization")
         +h(2, "serialization") Serialization
         include _processing-pipelines/_serialization
    +
    ++section("extensions")
    +    +h(2, "extensions") Developing spaCy extensions
    +    include _processing-pipelines/_extensions
    
    From 0f41b25f60d1681edbb2ab74d4e23ccd45516b61 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 08:05:37 -0500
    Subject: [PATCH 588/739] Add speed benchmarks to metadata
    
    ---
     spacy/cli/train.py | 38 ++++++++++++++++++++++++++++++--------
     1 file changed, 30 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index b27087056..e0d09c178 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -114,15 +114,33 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     nlp.to_disk(epoch_model_path)
                     nlp_loaded = lang_class(pipeline=pipeline)
                     nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    -                scorer = nlp_loaded.evaluate(
    -                            list(corpus.dev_docs(
    +                dev_docs = list(corpus.dev_docs(
                                     nlp_loaded,
    -                                gold_preproc=gold_preproc)))
    +                                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 = lang_class(pipeline=pipeline)
    +                        nlp_loaded = nlp_loaded.from_disk(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__
    @@ -132,7 +150,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     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...")
             try:
    @@ -153,16 +171,18 @@ 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):
    +    print(locals())
         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}',
    @@ -173,7 +193,9 @@ def print_progress(itn, losses, dev_scores, wps=0.0):
             '{ents_f:.3f}',
             '{tags_acc:.3f}',
             '{token_acc:.3f}',
    -        '{wps:.1f}'))
    +        '{cpu_wps:.1f}',
    +        '{gpu_wps:.1f}',
    +    ))
         print(tpl.format(itn, **scores))
     
     
    
    From 808d8740d6ed4162256d5ea5dd182a7cf92688a5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 08:45:20 -0500
    Subject: [PATCH 589/739] Remove print statement
    
    ---
     spacy/cli/train.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index e0d09c178..b605f4e61 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -172,7 +172,6 @@ def _render_parses(i, to_render):
     
     
     def print_progress(itn, losses, dev_scores, cpu_wps=0.0, gpu_wps=0.0):
    -    print(locals())
         scores = {}
         for col in ['dep_loss', 'tag_loss', 'uas', 'tags_acc', 'token_acc',
                     'ents_p', 'ents_r', 'ents_f', 'cpu_wps', 'gpu_wps']:
    
    From 51d18937afacf3147b05a2108fcada77ef770813 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 02:21:28 +0200
    Subject: [PATCH 590/739] Partially apply doc/span/token into method
    
    We want methods to act like they're "bound" to the object, so that you can make your method conditional on the `doc`, `span` or `token` instance --- like, well, a method. We therefore partially apply the function, which works like this:
    
    ```
    def partial(unbound_method, constant_arg):
        def bound_method(*args, **kwargs):
            return unbound_method(constant_arg, *args, **kwargs)
        return bound_method
    ---
     spacy/tokens/underscore.py | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 66c54d6d6..0b10e7afe 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -1,3 +1,5 @@
    +import functools
    +
     class Underscore(object):
         doc_extensions = {}
         span_extensions = {}
    @@ -22,7 +24,7 @@ class Underscore(object):
             if getter is not None:
                 return getter(self._obj)
             elif method is not None:
    -            return method
    +            return functools.partial(method, self._obj)
             else:
                 return self._doc.user_data.get(self._get_key(name), default)
     
    
    From 735d18654da9481a860c11c398abaa754e05f263 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 20:06:28 -0500
    Subject: [PATCH 591/739] Add NER converter for CoNLL 2003 data
    
    ---
     spacy/cli/convert.py             | 27 ++++++++++++++++-----------
     spacy/cli/converters/__init__.py |  1 +
     2 files changed, 17 insertions(+), 11 deletions(-)
    
    diff --git a/spacy/cli/convert.py b/spacy/cli/convert.py
    index 89615bbe8..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,9 +12,10 @@ from ..util import prints
     # from /converters.
     
     CONVERTERS = {
    -    '.conllu': conllu2json,
    -    '.conll': conllu2json,
    -    '.iob': iob2json,
    +    'conllu': conllu2json,
    +    'conll': conllu2json,
    +    'ner': conll_ner2json,
    +    'iob': iob2json,
     }
     
     
    @@ -22,9 +23,11 @@ CONVERTERS = {
         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", 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=1, morphology=False):
    +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=1, morphology=False):
             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
    
    From f0f2739ae3348f22d948351cdb143b14e6557056 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 03:57:58 +0200
    Subject: [PATCH 592/739] Add test for serialization issue raised in #1105
    
    ---
     spacy/tests/serialize/test_serialize_empty_model.py | 9 +++++++++
     1 file changed, 9 insertions(+)
     create mode 100644 spacy/tests/serialize/test_serialize_empty_model.py
    
    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()
    
    From 8978212ee51b8b519cfd52766c769900a7618e89 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 03:58:12 +0200
    Subject: [PATCH 593/739] Patch serialization bug raised in #1105
    
    ---
     spacy/pipeline.pyx | 39 ++++++++++++++++++++++-----------------
     1 file changed, 22 insertions(+), 17 deletions(-)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index c39976630..9fe538f0c 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -157,11 +157,13 @@ class BaseThincComponent(object):
     
         def to_bytes(self, **exclude):
             """Serialize the pipe to a bytestring."""
    -        serialize = OrderedDict((
    -            ('cfg', lambda: json_dumps(self.cfg)),
    -            ('model', lambda: self.model.to_bytes()),
    -            ('vocab', lambda: self.vocab.to_bytes())
    -        ))
    +        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):
    @@ -182,11 +184,11 @@ class BaseThincComponent(object):
     
         def to_disk(self, path, **exclude):
             """Serialize the pipe to disk."""
    -        serialize = OrderedDict((
    -            ('cfg', lambda p: p.open('w').write(json_dumps(self.cfg))),
    -            ('vocab', lambda p: self.vocab.to_disk(p)),
    -            ('model', lambda p: p.open('wb').write(self.model.to_bytes())),
    -        ))
    +        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):
    @@ -437,13 +439,16 @@ class NeuralTagger(BaseThincComponent):
                 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):
    
    From 59c4f2749934bb4279b5fdf5301db709317771f2 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:14:35 +0200
    Subject: [PATCH 594/739] Add get, set and has methods to Underscore
    
    ---
     spacy/tokens/underscore.py | 9 +++++++++
     1 file changed, 9 insertions(+)
    
    diff --git a/spacy/tokens/underscore.py b/spacy/tokens/underscore.py
    index 0b10e7afe..6e782647b 100644
    --- a/spacy/tokens/underscore.py
    +++ b/spacy/tokens/underscore.py
    @@ -37,5 +37,14 @@ class Underscore(object):
             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)
    
    From 3fc4fe61d2b4a11f681081023e9a26d587a61195 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:15:14 +0200
    Subject: [PATCH 595/739] Fix typo
    
    ---
     spacy/tokens/token.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/token.pyx b/spacy/tokens/token.pyx
    index c617b382e..f56e7682f 100644
    --- a/spacy/tokens/token.pyx
    +++ b/spacy/tokens/token.pyx
    @@ -28,7 +28,7 @@ cdef class Token:
         @classmethod
         def set_extension(cls, name, default=None, method=None,
                           getter=None, setter=None):
    -        Underscore.span_extensions[name] = (default, method, getter, setter) 
    +        Underscore.token_extensions[name] = (default, method, getter, setter)
     
         @classmethod
         def get_extension(cls, name):
    @@ -285,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:
    
    From b4fc6b203ca337bdac2f721bc3b950ca46a0d186 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:22:23 +0200
    Subject: [PATCH 596/739] Rename mixin
    
    ---
     website/_includes/_mixins.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 68db1be57..7666889b5 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -149,7 +149,7 @@ mixin code(label, language, prompt, height, icon, wrap)
     
     //- Code blocks to display old/new versions
     
    -mixin code-compare()
    +mixin code-wrapper()
         span.u-inline-block.u-padding-top.u-width-full
             block
     
    
    From 67350fa4962125a61240fd46d8146f1ca900310c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:23:05 +0200
    Subject: [PATCH 597/739] Use better logic for auto-generating component name
    
    Instances don't have __name__, so we try __class__.__name__ as well,
    before giving up and defaulting to repr(component).
    ---
     spacy/language.py | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index d40aee3ca..6d39fcd69 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -224,7 +224,14 @@ class Language(object):
                 >>> nlp.add_pipe(component, name='custom_name', last=True)
             """
             if name is None:
    -            name = getattr(component, 'name', component.__name__)
    +            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:
    
    From 43b70651fb6f49947c3135f33a6cb85ef0eaeb78 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:23:37 +0200
    Subject: [PATCH 598/739] Document extension methods on Doc, Token and Span
    
    set_extension, get_extension, has_extension
    ---
     website/api/doc.jade   | 103 +++++++++++++++++++++++++++++++++++++++++
     website/api/span.jade  | 103 +++++++++++++++++++++++++++++++++++++++++
     website/api/token.jade | 103 +++++++++++++++++++++++++++++++++++++++++
     3 files changed, 309 insertions(+)
    
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index 85932c605..9ba942e26 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -138,6 +138,109 @@ p Get the number of tokens in the document.
             +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.doc 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.doc 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.doc 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)
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 067e709f0..6f3713203 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -116,6 +116,109 @@ p Get the number of tokens in the span.
             +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.span 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.span 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.span 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")
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 814a13310..080fe11ee 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -51,6 +51,109 @@ p The number of unicode characters in the token, i.e. #[code token.text].
             +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.token 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.token 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.token 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
     
    
    From 3d5154811a92135f526e8167fa33799f1c178f19 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:24:22 +0200
    Subject: [PATCH 599/739] Fix typo
    
    ---
     website/usage/_visualizers/_html.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/usage/_visualizers/_html.jade b/website/usage/_visualizers/_html.jade
    index 595192442..648a6de80 100644
    --- a/website/usage/_visualizers/_html.jade
    +++ b/website/usage/_visualizers/_html.jade
    @@ -61,7 +61,7 @@ p
             output_path.open('w', encoding='utf-8').write(svg)
     
     p
    -    |  The above code will generate the dependency visualizations and them to
    +    |  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].
     
     
    
    From 7a592d01dc068c65bc88b14f8c617e76658d9212 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:24:39 +0200
    Subject: [PATCH 600/739] Update pipeline component usage docs
    
    ---
     website/usage/_data.json                      |   4 +-
     .../_custom-components.jade                   | 246 +++++++++++++++++-
     .../_processing-pipelines/_examples.jade      | 126 ---------
     .../_processing-pipelines/_extensions.jade    | 109 +++++++-
     website/usage/processing-pipelines.jade       |   8 +-
     5 files changed, 347 insertions(+), 146 deletions(-)
     delete mode 100644 website/usage/_processing-pipelines/_examples.jade
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 25165c3ee..ccd14eee2 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -105,9 +105,9 @@
             "menu": {
                 "How Pipelines Work": "pipelines",
                 "Custom Components": "custom-components",
    +            "Developing Extensions": "extensions",
                 "Multi-threading": "multithreading",
    -            "Serialization": "serialization",
    -            "Developing Extensions": "extensions"
    +            "Serialization": "serialization"
             }
         },
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    index 13f0cb85c..cfd1782f1 100644
    --- a/website/usage/_processing-pipelines/_custom-components.jade
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -1,12 +1,11 @@
     //- 💫 DOCS > USAGE > PROCESSING PIPELINES > CUSTOM COMPONENTS
     
     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.
    +    |  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):
    @@ -27,10 +26,10 @@ p
     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 before or after, tell spaCy
    -    |  to add it first or last in the pipeline, or define a custom name.
    -    |  If no name is set and no #[code name] attribute is present on your
    -    |  component, the function name, e.g. #[code component.__name__] is used.
    +    |  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):
    @@ -67,7 +66,19 @@ p
         nlp.add_pipe(my_component, first=True)
     
     +h(3, "custom-components-attributes")
    -    |  Setting attributes on the #[code Doc], #[code Span] and #[code Token]
    +    |  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
    @@ -78,9 +89,218 @@ p
         |  what's custom – for example, #[code doc.sentiment] is spaCy, while
         |  #[code doc._.sent_score] isn't.
     
    -+under-construction
    +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.
     
    -+h(3, "custom-components-user-hooks") Other user hooks
    ++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.token import Token
    +    from spacy.tokens.doc import Doc
    +    from spacy.tokens.span import Span
    +
    +    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._]
    diff --git a/website/usage/_processing-pipelines/_examples.jade b/website/usage/_processing-pipelines/_examples.jade
    deleted file mode 100644
    index 616bed32c..000000000
    --- a/website/usage/_processing-pipelines/_examples.jade
    +++ /dev/null
    @@ -1,126 +0,0 @@
    -//- 💫 DOCS > USAGE > PROCESSING PIPELINES > EXAMPLES
    -
    -p
    -    |  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(3, "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(3, "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")) #[code __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("/usage/training#saving-loading") saving and loading models].
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    index d512e0321..a27ae6287 100644
    --- a/website/usage/_processing-pipelines/_extensions.jade
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -1,3 +1,110 @@
     //- 💫 DOCS > USAGE > PROCESSING PIPELINES > DEVELOPING EXTENSIONS
     
    -+under-construction
    +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:
    +
    ++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.doc 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-pipeline") #[code spacy-pipeline]]
    +        |  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.jade b/website/usage/processing-pipelines.jade
    index 346e0554d..045a32ddb 100644
    --- a/website/usage/processing-pipelines.jade
    +++ b/website/usage/processing-pipelines.jade
    @@ -12,6 +12,10 @@ include _spacy-101/_pipelines
         +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
    @@ -19,7 +23,3 @@ include _spacy-101/_pipelines
     +section("serialization")
         +h(2, "serialization") Serialization
         include _processing-pipelines/_serialization
    -
    -+section("extensions")
    -    +h(2, "extensions") Developing spaCy extensions
    -    include _processing-pipelines/_extensions
    
    From 6679117000ffd8f872ea3b42e89d995bf4307fc4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 04:26:06 +0200
    Subject: [PATCH 601/739] Add pipeline component examples
    
    ---
     examples/pipeline/custom_attr_methods.py      |  53 +++++++++
     .../custom_component_countries_api.py         | 110 ++++++++++++++++++
     .../pipeline/custom_component_entities.py     |  87 ++++++++++++++
     website/usage/_data.json                      |   1 +
     website/usage/examples.jade                   |  38 ++++++
     5 files changed, 289 insertions(+)
     create mode 100644 examples/pipeline/custom_attr_methods.py
     create mode 100644 examples/pipeline/custom_component_countries_api.py
     create mode 100644 examples/pipeline/custom_component_entities.py
    
    diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py
    new file mode 100644
    index 000000000..d99b612a7
    --- /dev/null
    +++ b/examples/pipeline/custom_attr_methods.py
    @@ -0,0 +1,53 @@
    +# 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.doc import Doc
    +from spacy.tokens.span import 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..5a2f3df18
    --- /dev/null
    +++ b/examples/pipeline/custom_component_countries_api.py
    @@ -0,0 +1,110 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import requests
    +
    +from spacy.lang.en import English
    +from spacy.matcher import PhraseMatcher
    +from spacy.tokens.doc import Doc
    +from spacy.tokens.span import Span
    +from spacy.tokens.token import 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..3f9163b83
    --- /dev/null
    +++ b/examples/pipeline/custom_component_entities.py
    @@ -0,0 +1,87 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +from spacy.lang.en import English
    +from spacy.matcher import PhraseMatcher
    +from spacy.tokens.doc import Doc
    +from spacy.tokens.span import Span
    +from spacy.tokens.token import 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/website/usage/_data.json b/website/usage/_data.json
    index ccd14eee2..06b0371ae 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -195,6 +195,7 @@
             "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/examples.jade b/website/usage/examples.jade
    index 75d05e339..5dfeaf2a7 100644
    --- a/website/usage/examples.jade
    +++ b/website/usage/examples.jade
    @@ -2,6 +2,44 @@
     
     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
     
    
    From 8265b90c839becc1efd3fe4192000c455788af90 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 21:55:20 -0500
    Subject: [PATCH 602/739] Update parser defaults
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 8f74721b1..a8a1d4334 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,10 +239,10 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 0))
             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', 128))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 1))
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
             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))
    
    From dce8afb9cfcc4dc3987fb70ea6cbaec5d08e6fe9 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 21:55:55 -0500
    Subject: [PATCH 603/739] Set prefix length to 3
    
    ---
     spacy/lang/lex_attrs.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py
    index d4beebd26..63695d8a1 100644
    --- a/spacy/lang/lex_attrs.py
    +++ b/spacy/lang/lex_attrs.py
    @@ -126,7 +126,7 @@ def word_shape(text):
     LEX_ATTRS = {
         attrs.LOWER: lambda string: string.lower(),
         attrs.NORM: lambda string: string.lower(),
    -    attrs.PREFIX: lambda string: string[0],
    +    attrs.PREFIX: lambda string: string[:3],
         attrs.SUFFIX: lambda string: string[-3:],
         attrs.CLUSTER: lambda string: 0,
         attrs.IS_ALPHA: lambda string: string.isalpha(),
    
    From a6352403982da4211cb83a80ae8bdee2fc861a7b Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 22:03:26 -0500
    Subject: [PATCH 604/739] Add conll_ner2json converter
    
    ---
     spacy/cli/converters/conll_ner2json.py | 50 ++++++++++++++++++++++++++
     1 file changed, 50 insertions(+)
     create mode 100644 spacy/cli/converters/conll_ner2json.py
    
    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
    
    From 9c96a6e1316e716858b2ceae2f9ff094ebf4a601 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 06:33:50 +0200
    Subject: [PATCH 605/739] Update pipelines section in v2 overview
    
    ---
     website/usage/v2.jade | 36 +++++++++++++++++++++---------------
     1 file changed, 21 insertions(+), 15 deletions(-)
    
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    index 8737c0b76..148d8e4bf 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -102,30 +102,36 @@ p
         +h(3, "features-pipelines") Improved processing pipelines
     
         +aside-code("Example").
    -        # Modify an existing pipeline
    -        nlp = spacy.load('en')
    -        nlp.pipeline.append(my_component)
    +        # 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
     
    -        # Register a factory to create a component
    -        spacy.set_factory('my_factory', my_factory)
    -        nlp = Language(pipeline=['my_factory', mycomponent])
    +        # 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. 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.
    +        |  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]]
    -        |  #[+label-inline Usage:] #[+a("/usage/language-processing-pipeline") Processing text]
    +        |  #[+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
     
    
    From 19598ebfee025c5ebfe494ad497c984ca4e3194f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 10 Oct 2017 06:38:11 +0200
    Subject: [PATCH 606/739] Update migration guide
    
    ---
     website/usage/v2.jade | 13 +++++++------
     1 file changed, 7 insertions(+), 6 deletions(-)
    
    diff --git a/website/usage/v2.jade b/website/usage/v2.jade
    index 148d8e4bf..66304c860 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -484,15 +484,16 @@ p
         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 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.
    +        |  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'])
    -        doc = nlp(u"I don't want parsed", disable=['parser'])
    +        nlp.remove_pipe('parser')
         +code-old.
             nlp = spacy.load('en', tagger=False, entity=False)
             doc = nlp(u"I don't want parsed", parse=False)
    
    From 97c9b5db8b6219d53967a136fa9fdd63bd06fca5 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 9 Oct 2017 23:41:16 -0500
    Subject: [PATCH 607/739] Patch spacy.train for new pipeline management
    
    ---
     spacy/cli/train.py | 9 ++++++++-
     1 file changed, 8 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index b605f4e61..35ce4c43b 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -88,9 +88,11 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         n_train_words = corpus.count_train()
     
         lang_class = util.get_lang_class(lang)
    -    nlp = lang_class(pipeline=pipeline)
    +    nlp = lang_class()
         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
     
    @@ -113,6 +115,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     epoch_model_path = output_path / ('model%d' % i)
                     nlp.to_disk(epoch_model_path)
                     nlp_loaded = lang_class(pipeline=pipeline)
    +                for name in pipeline:
    +                    nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
                     nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
                     dev_docs = list(corpus.dev_docs(
                                     nlp_loaded,
    @@ -128,6 +132,9 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                         gpu_wps = nwords/(end_time-start_time)
                         with Model.use_device('cpu'):
                             nlp_loaded = lang_class(pipeline=pipeline)
    +                        for name in pipeline:
    +                            nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
    +
                             nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
                             dev_docs = list(corpus.dev_docs(
                                             nlp_loaded, gold_preproc=gold_preproc))
    
    From 8143618497399543cbceb8c895cc071961094d43 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 19:32:54 +0200
    Subject: [PATCH 608/739] Set prefix length back to 1
    
    ---
     spacy/lang/lex_attrs.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py
    index 63695d8a1..d4beebd26 100644
    --- a/spacy/lang/lex_attrs.py
    +++ b/spacy/lang/lex_attrs.py
    @@ -126,7 +126,7 @@ def word_shape(text):
     LEX_ATTRS = {
         attrs.LOWER: lambda string: string.lower(),
         attrs.NORM: lambda string: string.lower(),
    -    attrs.PREFIX: lambda string: string[:3],
    +    attrs.PREFIX: lambda string: string[0],
         attrs.SUFFIX: lambda string: string[-3:],
         attrs.CLUSTER: lambda string: 0,
         attrs.IS_ALPHA: lambda string: string.isalpha(),
    
    From 5156074df17ee361e1d1444d48118886012b9911 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 12:51:20 -0500
    Subject: [PATCH 609/739] Make loading code more consistent in train command
    
    ---
     spacy/cli/train.py | 11 ++---------
     1 file changed, 2 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 35ce4c43b..05d035769 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -114,10 +114,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     util.set_env_log(False)
                     epoch_model_path = output_path / ('model%d' % i)
                     nlp.to_disk(epoch_model_path)
    -                nlp_loaded = lang_class(pipeline=pipeline)
    -                for name in pipeline:
    -                    nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
    -                nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    +                nlp_loaded = util.load_model_from_path(epoch_model_path)
                     dev_docs = list(corpus.dev_docs(
                                     nlp_loaded,
                                     gold_preproc=gold_preproc))
    @@ -131,11 +128,7 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
                     else:
                         gpu_wps = nwords/(end_time-start_time)
                         with Model.use_device('cpu'):
    -                        nlp_loaded = lang_class(pipeline=pipeline)
    -                        for name in pipeline:
    -                            nlp_loaded.add_pipe(nlp.create_pipe(name), name=name)
    -
    -                        nlp_loaded = nlp_loaded.from_disk(epoch_model_path)
    +                        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()
    
    From 3065f12ef206d13db3544213266973dcc2b08aa3 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 22:57:31 +0200
    Subject: [PATCH 610/739] Make add parser label work for hidden_depth=0
    
    ---
     spacy/syntax/nn_parser.pyx | 19 ++++++++++++++-----
     1 file changed, 14 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index a8a1d4334..939414bd3 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -800,11 +800,20 @@ cdef class Parser:
             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.
    -            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
    +            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, pipeline=None, **cfg):
             if 'model' in cfg:
    
    From d84136b4a9eb716be5771ed5634be6fef4c740ef Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 10 Oct 2017 22:57:41 +0200
    Subject: [PATCH 611/739] Update add label test
    
    ---
     spacy/tests/parser/test_add_label.py | 8 +++++---
     1 file changed, 5 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/tests/parser/test_add_label.py b/spacy/tests/parser/test_add_label.py
    index b89cca113..3fbfc96a6 100644
    --- a/spacy/tests/parser/test_add_label.py
    +++ b/spacy/tests/parser/test_add_label.py
    @@ -22,14 +22,14 @@ def vocab():
     @pytest.fixture
     def parser(vocab):
         parser = NeuralDependencyParser(vocab)
    -    parser.cfg['token_vector_width'] = 4
    -    parser.cfg['hidden_width'] = 6
    +    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(30):
    +    for i in range(10):
             losses = {}
             doc = Doc(vocab, words=['a', 'b', 'c', 'd'])
             gold = GoldParse(doc, heads=[1, 1, 3, 3],
    @@ -37,6 +37,8 @@ def parser(vocab):
             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'])
    
    From 0c2343d73abc5410ddc51816e48e92c56d3c548c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:22:49 +0200
    Subject: [PATCH 612/739] Tidy up language data
    
    ---
     spacy/lang/bn/__init__.py  |  8 +++-----
     spacy/lang/da/__init__.py  |  1 -
     spacy/lang/de/__init__.py  |  1 -
     spacy/lang/en/__init__.py  |  1 -
     spacy/lang/es/__init__.py  |  1 -
     spacy/lang/fi/__init__.py  |  1 -
     spacy/lang/fr/__init__.py  |  1 -
     spacy/lang/he/__init__.py  |  1 -
     spacy/lang/hu/__init__.py  |  1 -
     spacy/lang/id/__init__.py  |  2 --
     spacy/lang/id/lex_attrs.py |  3 +--
     spacy/lang/it/__init__.py  |  1 -
     spacy/lang/nb/__init__.py  |  1 -
     spacy/lang/nl/__init__.py  |  1 -
     spacy/lang/pl/__init__.py  |  1 -
     spacy/lang/pt/__init__.py  |  1 -
     spacy/lang/sv/__init__.py  |  1 -
     spacy/lang/th/__init__.py  | 25 ++++++++++++++-----------
     spacy/lang/xx/__init__.py  |  1 -
     19 files changed, 18 insertions(+), 35 deletions(-)
    
    diff --git a/spacy/lang/bn/__init__.py b/spacy/lang/bn/__init__.py
    index c2cf12f12..1a76123ea 100644
    --- a/spacy/lang/bn/__init__.py
    +++ b/spacy/lang/bn/__init__.py
    @@ -16,12 +16,10 @@ 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
    -
    +    tag_map = dict(TAG_MAP)
    +    stop_words = set(STOP_WORDS)
    +    lemma_rules = dict(LEMMA_RULES)
         prefixes = tuple(TOKENIZER_PREFIXES)
         suffixes = tuple(TOKENIZER_SUFFIXES)
         infixes = tuple(TOKENIZER_INFIXES)
    diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py
    index 99babdc2c..b255a04b9 100644
    --- a/spacy/lang/da/__init__.py
    +++ b/spacy/lang/da/__init__.py
    @@ -15,7 +15,6 @@ 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)
     
    diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py
    index 1c64541e6..0ff707a06 100644
    --- a/spacy/lang/de/__init__.py
    +++ b/spacy/lang/de/__init__.py
    @@ -22,7 +22,6 @@ 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)
         infixes = tuple(TOKENIZER_INFIXES)
         tag_map = dict(TAG_MAP)
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index ec14fecd0..79d383b90 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -23,7 +23,6 @@ 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)
    diff --git a/spacy/lang/es/__init__.py b/spacy/lang/es/__init__.py
    index 1e7f55be8..e64b88fad 100644
    --- a/spacy/lang/es/__init__.py
    +++ b/spacy/lang/es/__init__.py
    @@ -19,7 +19,6 @@ 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)
    diff --git a/spacy/lang/fi/__init__.py b/spacy/lang/fi/__init__.py
    index 931ad5341..2eb40851b 100644
    --- a/spacy/lang/fi/__init__.py
    +++ b/spacy/lang/fi/__init__.py
    @@ -15,7 +15,6 @@ 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)
     
    diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py
    index 06dcf2d45..e2123c28f 100644
    --- a/spacy/lang/fr/__init__.py
    +++ b/spacy/lang/fr/__init__.py
    @@ -21,7 +21,6 @@ class FrenchDefaults(Language.Defaults):
         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)
    diff --git a/spacy/lang/he/__init__.py b/spacy/lang/he/__init__.py
    index a15dc9a05..b815b3273 100644
    --- a/spacy/lang/he/__init__.py
    +++ b/spacy/lang/he/__init__.py
    @@ -12,7 +12,6 @@ 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)
     
    diff --git a/spacy/lang/hu/__init__.py b/spacy/lang/hu/__init__.py
    index 0fe6a9f5c..9b6b63a81 100644
    --- a/spacy/lang/hu/__init__.py
    +++ b/spacy/lang/hu/__init__.py
    @@ -18,7 +18,6 @@ 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)
    diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py
    index e0cfa941d..b4d020427 100644
    --- a/spacy/lang/id/__init__.py
    +++ b/spacy/lang/id/__init__.py
    @@ -19,9 +19,7 @@ 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 = set(STOP_WORDS)
         prefixes = tuple(TOKENIZER_PREFIXES)
    diff --git a/spacy/lang/id/lex_attrs.py b/spacy/lang/id/lex_attrs.py
    index f6acd8508..fb6a31f99 100644
    --- a/spacy/lang/id/lex_attrs.py
    +++ b/spacy/lang/id/lex_attrs.py
    @@ -16,8 +16,7 @@ _num_words = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven',
                   'sembilanbelas', 'duapuluh', 'seratus', 'seribu', 'sejuta',
                   'ribu', 'rb', 'juta', 'jt', 'miliar', 'biliun', 'triliun',
                   'kuadriliun', 'kuintiliun', 'sekstiliun', 'septiliun', 'oktiliun',
    -              'noniliun', 'desiliun',
    -              ]
    +              'noniliun', 'desiliun']
     
     
     def like_num(text):
    diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py
    index 7cc717cb3..f6506038c 100644
    --- a/spacy/lang/it/__init__.py
    +++ b/spacy/lang/it/__init__.py
    @@ -16,7 +16,6 @@ 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)
     
    diff --git a/spacy/lang/nb/__init__.py b/spacy/lang/nb/__init__.py
    index c1b4af263..8804f7424 100644
    --- a/spacy/lang/nb/__init__.py
    +++ b/spacy/lang/nb/__init__.py
    @@ -16,7 +16,6 @@ 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)
     
    diff --git a/spacy/lang/nl/__init__.py b/spacy/lang/nl/__init__.py
    index 98df8d487..29cbb4617 100644
    --- a/spacy/lang/nl/__init__.py
    +++ b/spacy/lang/nl/__init__.py
    @@ -16,7 +16,6 @@ class DutchDefaults(Language.Defaults):
         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)
     
    diff --git a/spacy/lang/pl/__init__.py b/spacy/lang/pl/__init__.py
    index 38a240598..22e103246 100644
    --- a/spacy/lang/pl/__init__.py
    +++ b/spacy/lang/pl/__init__.py
    @@ -15,7 +15,6 @@ 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, TOKENIZER_EXCEPTIONS)
         stop_words = set(STOP_WORDS)
     
    diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py
    index 67539034d..0baae7e7a 100644
    --- a/spacy/lang/pt/__init__.py
    +++ b/spacy/lang/pt/__init__.py
    @@ -19,7 +19,6 @@ 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)
     
    diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py
    index 2d3a640c5..b21333fac 100644
    --- a/spacy/lang/sv/__init__.py
    +++ b/spacy/lang/sv/__init__.py
    @@ -18,7 +18,6 @@ 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)
     
    diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py
    index b6bdb658f..e640fc4ef 100644
    --- a/spacy/lang/th/__init__.py
    +++ b/spacy/lang/th/__init__.py
    @@ -12,24 +12,27 @@ 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 = TOKENIZER_EXCEPTIONS
    +    tokenizer_exceptions = dict(TOKENIZER_EXCEPTIONS)
         tag_map = dict(TAG_MAP)
         stop_words = set(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))
    +    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/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)
     
     
    
    From 417d45f5d062078e1895f4521e868c5bece91a54 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:24:58 +0200
    Subject: [PATCH 613/739] Add lemmatizer data as variable on language data
    
    Don't create lookup lemmatizer within Language class and just pass in
    the data so it can be set on Token creation
    ---
     spacy/lang/de/__init__.py | 6 +-----
     spacy/lang/en/__init__.py | 3 ++-
     spacy/lang/es/__init__.py | 6 +-----
     spacy/lang/fr/__init__.py | 6 +-----
     spacy/lang/hu/__init__.py | 6 +-----
     spacy/lang/id/__init__.py | 6 +-----
     spacy/lang/it/__init__.py | 6 +-----
     spacy/lang/pt/__init__.py | 6 +-----
     spacy/lang/sv/__init__.py | 7 ++-----
     9 files changed, 11 insertions(+), 41 deletions(-)
    
    diff --git a/spacy/lang/de/__init__.py b/spacy/lang/de/__init__.py
    index 0ff707a06..e56bab844 100644
    --- a/spacy/lang/de/__init__.py
    +++ b/spacy/lang/de/__init__.py
    @@ -12,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
     
    @@ -27,10 +26,7 @@ class GermanDefaults(Language.Defaults):
         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)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class German(Language):
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index 79d383b90..fffac6467 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
    @@ -30,6 +30,7 @@ class EnglishDefaults(Language.Defaults):
         lemma_rules = dict(LEMMA_RULES)
         lemma_index = dict(LEMMA_INDEX)
         lemma_exc = dict(LEMMA_EXC)
    +    lemma_lookup = dict(LOOKUP)
         syntax_iterators = dict(SYNTAX_ITERATORS)
     
     
    diff --git a/spacy/lang/es/__init__.py b/spacy/lang/es/__init__.py
    index e64b88fad..4246a0703 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
     
    @@ -23,10 +22,7 @@ class SpanishDefaults(Language.Defaults):
         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)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Spanish(Language):
    diff --git a/spacy/lang/fr/__init__.py b/spacy/lang/fr/__init__.py
    index e2123c28f..0f2a60e3e 100644
    --- a/spacy/lang/fr/__init__.py
    +++ b/spacy/lang/fr/__init__.py
    @@ -11,7 +11,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
     
    @@ -27,10 +26,7 @@ class FrenchDefaults(Language.Defaults):
         suffixes = tuple(TOKENIZER_SUFFIXES)
         token_match = TOKEN_MATCH
         syntax_iterators = dict(SYNTAX_ITERATORS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class French(Language):
    diff --git a/spacy/lang/hu/__init__.py b/spacy/lang/hu/__init__.py
    index 9b6b63a81..fd039a8eb 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
     
    @@ -24,10 +23,7 @@ class HungarianDefaults(Language.Defaults):
         suffixes = tuple(TOKENIZER_SUFFIXES)
         infixes = tuple(TOKENIZER_INFIXES)
         token_match = TOKEN_MATCH
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Hungarian(Language):
    diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py
    index b4d020427..29fe86a01 100644
    --- a/spacy/lang/id/__init__.py
    +++ b/spacy/lang/id/__init__.py
    @@ -11,7 +11,6 @@ from .syntax_iterators import SYNTAX_ITERATORS
     
     from ..tokenizer_exceptions import BASE_EXCEPTIONS
     from ...language import Language
    -from ...lemmatizerlookup import Lemmatizer
     from ...attrs import LANG
     from ...util import update_exc
     
    @@ -26,10 +25,7 @@ class IndonesianDefaults(Language.Defaults):
         suffixes = tuple(TOKENIZER_SUFFIXES)
         infixes = tuple(TOKENIZER_INFIXES)
         syntax_iterators = dict(SYNTAX_ITERATORS)
    -
    -    @classmethod
    -    def create_lemmatizer(cls, nlp=None):
    -        return Lemmatizer(LOOKUP)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Indonesian(Language):
    diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py
    index f6506038c..c19cb6d39 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
     
    @@ -18,10 +17,7 @@ class ItalianDefaults(Language.Defaults):
         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)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Italian(Language):
    diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py
    index 0baae7e7a..6366a25c1 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
     
    @@ -21,10 +20,7 @@ class PortugueseDefaults(Language.Defaults):
         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)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Portuguese(Language):
    diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py
    index b21333fac..27da9024e 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
     
    @@ -20,10 +19,8 @@ class SwedishDefaults(Language.Defaults):
         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)
    +    lemma_rules = dict(LEMMA_RULES)
    +    lemma_lookup = dict(LOOKUP)
     
     
     class Swedish(Language):
    
    From 820bf850752962714a378b20de12ddbefe69f3e8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:25:13 +0200
    Subject: [PATCH 614/739] Move LookupLemmatizer to spacy.lemmatizer
    
    ---
     spacy/lemmatizer.py       | 15 +++++++++++++++
     spacy/lemmatizerlookup.py | 19 -------------------
     2 files changed, 15 insertions(+), 19 deletions(-)
     delete mode 100644 spacy/lemmatizerlookup.py
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 312c8db72..700c7b8ea 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -100,3 +100,18 @@ def lemmatize(string, index, exceptions, rules):
         if not forms:
             forms.append(string)
         return set(forms)
    +
    +
    +class LookupLemmatizer(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])
    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
    
    From f4ae6763b97a17b054bf41d2bfc50f1ced7d2a1f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 02:30:40 +0200
    Subject: [PATCH 615/739] Fix consistency of imports from spacy.tokens in
     examples
    
    ---
     examples/pipeline/custom_attr_methods.py                    | 3 +--
     examples/pipeline/custom_component_countries_api.py         | 4 +---
     examples/pipeline/custom_component_entities.py              | 4 +---
     website/api/doc.jade                                        | 6 +++---
     website/api/span.jade                                       | 6 +++---
     website/api/token.jade                                      | 6 +++---
     website/usage/_processing-pipelines/_custom-components.jade | 4 +---
     website/usage/_processing-pipelines/_extensions.jade        | 2 +-
     website/usage/_processing-pipelines/_serialization.jade     | 2 +-
     website/usage/_spacy-101/_lightning-tour.jade               | 2 +-
     10 files changed, 16 insertions(+), 23 deletions(-)
    
    diff --git a/examples/pipeline/custom_attr_methods.py b/examples/pipeline/custom_attr_methods.py
    index d99b612a7..9b1a8325d 100644
    --- a/examples/pipeline/custom_attr_methods.py
    +++ b/examples/pipeline/custom_attr_methods.py
    @@ -6,8 +6,7 @@ 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.doc import Doc
    -from spacy.tokens.span import Span
    +from spacy.tokens import Doc, Span
     from spacy import displacy
     from pathlib import Path
     
    diff --git a/examples/pipeline/custom_component_countries_api.py b/examples/pipeline/custom_component_countries_api.py
    index 5a2f3df18..2554af967 100644
    --- a/examples/pipeline/custom_component_countries_api.py
    +++ b/examples/pipeline/custom_component_countries_api.py
    @@ -5,9 +5,7 @@ import requests
     
     from spacy.lang.en import English
     from spacy.matcher import PhraseMatcher
    -from spacy.tokens.doc import Doc
    -from spacy.tokens.span import Span
    -from spacy.tokens.token import Token
    +from spacy.tokens import Doc, Span, Token
     
     
     class RESTCountriesComponent(object):
    diff --git a/examples/pipeline/custom_component_entities.py b/examples/pipeline/custom_component_entities.py
    index 3f9163b83..a0d9c61ec 100644
    --- a/examples/pipeline/custom_component_entities.py
    +++ b/examples/pipeline/custom_component_entities.py
    @@ -3,9 +3,7 @@ from __future__ import unicode_literals
     
     from spacy.lang.en import English
     from spacy.matcher import PhraseMatcher
    -from spacy.tokens.doc import Doc
    -from spacy.tokens.span import Span
    -from spacy.tokens.token import Token
    +from spacy.tokens import Doc, Span, Token
     
     
     class TechCompanyRecognizer(object):
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index 9ba942e26..dce6b89e0 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -148,7 +148,7 @@ p
         |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
     
     +aside-code("Example").
    -    from spacy.tokens.doc import Doc
    +    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')
    @@ -201,7 +201,7 @@ p
         |  registered. Raises a #[code KeyError] otherwise.
     
     +aside-code("Example").
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         Doc.set_extension('is_city', default=False)
         extension = Doc.get_extension('is_city')
         assert extension == (False, None, None, None)
    @@ -226,7 +226,7 @@ p
     p Check whether an extension has been registered on the #[code Doc] class.
     
     +aside-code("Example").
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         Doc.set_extension('is_city', default=False)
         assert Doc.has_extension('is_city')
     
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 6f3713203..6bff45a9b 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -126,7 +126,7 @@ p
         |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
     
     +aside-code("Example").
    -    from spacy.tokens.span import Span
    +    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')
    @@ -179,7 +179,7 @@ p
         |  registered. Raises a #[code KeyError] otherwise.
     
     +aside-code("Example").
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
         Span.set_extension('is_city', default=False)
         extension = Span.get_extension('is_city')
         assert extension == (False, None, None, None)
    @@ -204,7 +204,7 @@ p
     p Check whether an extension has been registered on the #[code Span] class.
     
     +aside-code("Example").
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
         Span.set_extension('is_city', default=False)
         assert Span.has_extension('is_city')
     
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 080fe11ee..465d44c66 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -61,7 +61,7 @@ p
         |  #[+a("/usage/processing-pipelines#custom-components-attributes") custom attributes].
     
     +aside-code("Example").
    -    from spacy.tokens.token import Token
    +    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')
    @@ -114,7 +114,7 @@ p
         |  registered. Raises a #[code KeyError] otherwise.
     
     +aside-code("Example").
    -    from spacy.tokens.token import Token
    +    from spacy.tokens import Token
         Token.set_extension('is_fruit', default=False)
         extension = Token.get_extension('is_fruit')
         assert extension == (False, None, None, None)
    @@ -139,7 +139,7 @@ p
     p Check whether an extension has been registered on the #[code Token] class.
     
     +aside-code("Example").
    -    from spacy.tokens.token import Token
    +    from spacy.tokens import Token
         Token.set_extension('is_fruit', default=False)
         assert Token.has_extension('is_fruit')
     
    diff --git a/website/usage/_processing-pipelines/_custom-components.jade b/website/usage/_processing-pipelines/_custom-components.jade
    index cfd1782f1..ea3ea9b97 100644
    --- a/website/usage/_processing-pipelines/_custom-components.jade
    +++ b/website/usage/_processing-pipelines/_custom-components.jade
    @@ -146,9 +146,7 @@ p
         |  been registered, spaCy will raise an #[code AttributeError].
     
     +code("Example").
    -    from spacy.tokens.token import Token
    -    from spacy.tokens.doc import Doc
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Doc, Span, Token
     
         fruits = ['apple', 'pear', 'banana', 'orange', 'strawberry']
         is_fruit_getter = lambda token: token.text in fruits
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    index a27ae6287..a1d8168e0 100644
    --- a/website/usage/_processing-pipelines/_extensions.jade
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -46,7 +46,7 @@ p
     
             +code-wrapper
                 +code-new.
    -                from spacy.tokens.doc import Doc
    +                from spacy.tokens import Doc
                     def __init__(attr='my_attr'):
                         Doc.set_extension(attr, getter=self.get_doc_attr)
                 +code-old.
    diff --git a/website/usage/_processing-pipelines/_serialization.jade b/website/usage/_processing-pipelines/_serialization.jade
    index 111a5fbad..e29cbc558 100644
    --- a/website/usage/_processing-pipelines/_serialization.jade
    +++ b/website/usage/_processing-pipelines/_serialization.jade
    @@ -21,7 +21,7 @@ p
     
     +code.
         import spacy
    -    from spacy.tokens.span import Span
    +    from spacy.tokens import Span
     
         text = u'Netflix is hiring a new VP of global policy'
     
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index 061ec7758..ecf57fbc2 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -175,7 +175,7 @@ p
     
     +code.
         import spacy
    -    from spacy.tokens.doc import Doc
    +    from spacy.tokens import Doc
         from spacy.vocab import Vocab
     
         nlp = spacy.load('en')
    
    From 2c118ab3a6b516fae87280dac69cb9c5d7caa5a9 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:21:23 +0200
    Subject: [PATCH 616/739] Add tests for Doc creation
    
    ---
     spacy/tests/doc/test_creation.py | 37 ++++++++++++++++++++++++++++++++
     1 file changed, 37 insertions(+)
     create mode 100644 spacy/tests/doc/test_creation.py
    
    diff --git a/spacy/tests/doc/test_creation.py b/spacy/tests/doc/test_creation.py
    new file mode 100644
    index 000000000..edadbf086
    --- /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 ...lemmatizerlookup import Lemmatizer
    +
    +
    +@pytest.fixture
    +def lemmatizer():
    +    return Lemmatizer({'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'
    
    From d528b6e36dd13d70238b085191f844728d8a7535 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:22:49 +0200
    Subject: [PATCH 617/739] Add assign_untagged method in Morphology
    
    ---
     spacy/morphology.pxd |  2 ++
     spacy/morphology.pyx | 14 ++++++++++----
     2 files changed, 12 insertions(+), 4 deletions(-)
    
    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 5ee11c151..5a4399698 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,10 @@ 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.'''
    +        token.lemma = self.lemmatize(0, token.lex.orth, {})
    +
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
                 tag = self.strings.add(tag)
    @@ -72,7 +80,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,
    @@ -151,8 +159,6 @@ cdef class Morphology:
             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)
    
    From c15d8278cb3c382a7453b1b33c10700a3f4f0766 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:23:23 +0200
    Subject: [PATCH 618/739] Avoid lemmatizing inappropriate tags in English
     lemmatizer
    
    ---
     spacy/lemmatizer.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 312c8db72..ff7666c37 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -24,6 +24,8 @@ class Lemmatizer(object):
                 univ_pos = 'adj'
             elif univ_pos == 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()])
    
    From 3b527fa52bdd6f29131f3bfb7deb32816c2de4f0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:23:57 +0200
    Subject: [PATCH 619/739] Call morphology.assign_untagged when pushing token to
     Doc
    
    ---
     spacy/tokens/doc.pyx | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index df75ab3ec..400ca0f2a 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -512,6 +512,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
     
    
    From fd47f8e89f55703ad1c527124d631ab8543e6213 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:38:34 +0200
    Subject: [PATCH 620/739] Fix failing test
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index 77326f797..f10b96192 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -64,7 +64,7 @@ def test_sents_1_3(parser):
         doc[1].sent_start = True
         doc[3].sent_start = True
         doc = parser(doc)
    -    assert len(list(doc.sents)) == 4
    +    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
    
    From 3814a161e639829df99fe6f36913fced2c3d4e93 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:41:03 +0200
    Subject: [PATCH 621/739] Avoid clobbering preset lemmas
    
    ---
     spacy/morphology.pyx | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 5a4399698..da9246cb6 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -68,7 +68,8 @@ cdef class Morphology:
     
         cdef int assign_untagged(self, TokenC* token) except -1:
             '''Set morphological attributes on a token without a POS tag.'''
    -        token.lemma = self.lemmatize(0, token.lex.orth, {})
    +        if token.lemma == 0:
    +            token.lemma = self.lemmatize(0, token.lex.orth, {})
     
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
    
    From 74c2c6a58cabdb31b77df3b24f6068355d9738bb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:49:12 +0200
    Subject: [PATCH 622/739] Add default name and lang to meta
    
    ---
     spacy/cli/train.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 05d035769..a8b45e8fa 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -68,6 +68,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
         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')
     
         pipeline = ['tagger', 'parser', 'ner']
         if no_tagger and 'tagger' in pipeline: pipeline.remove('tagger')
    
    From acba2e1051a0734d7d6ae2cc11211096039446bd Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 08:55:52 +0200
    Subject: [PATCH 623/739] Fix metadata in training
    
    ---
     spacy/cli/train.py | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index a8b45e8fa..3dae3f68b 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -91,6 +91,8 @@ def train(cmd, lang, output_dir, train_data, dev_data, n_iter=10, n_sents=0,
     
         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:
    
    From 188f62004694d89a040f5409164258a150abc2b1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 09:43:48 +0200
    Subject: [PATCH 624/739] Improve parser defaults
    
    ---
     spacy/syntax/nn_parser.pyx | 12 ++++++------
     1 file changed, 6 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 939414bd3..ce9ee39fa 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -239,13 +239,13 @@ cdef class Parser:
         """
         @classmethod
         def Model(cls, nr_class, **cfg):
    -        depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 0))
    -        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', 128))
    -        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 3))
    +        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', 64))
    +        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 64))
    +        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))
    +        hist_size = util.env_opt('history_feats', cfg.get('hist_size', 4))
    +        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
             if hist_size >= 1 and depth == 0:
                 raise ValueError("Inconsistent hyper-params: "
                     "history_feats >= 1 but parser_hidden_depth==0")
    
    From 76fe24f44d1238e3755c07cd377eddde2b74a913 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 09:44:17 +0200
    Subject: [PATCH 625/739] Improve embedding defaults
    
    ---
     spacy/_ml.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/_ml.py b/spacy/_ml.py
    index 62e0ceb9a..b07e179f0 100644
    --- a/spacy/_ml.py
    +++ b/spacy/_ml.py
    @@ -311,7 +311,7 @@ def link_vectors_to_models(vocab):
     
     def Tok2Vec(width, embed_size, **kwargs):
         pretrained_dims = kwargs.get('pretrained_dims', 0)
    -    cnn_maxout_pieces = kwargs.get('cnn_maxout_pieces', 3)
    +    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}):
    
    From 6e552c9d83ed2010e8de2291680bc8527b58fec4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 02:46:44 -0500
    Subject: [PATCH 626/739] Prune number of non-projective labels more
     aggressiely
    
    ---
     spacy/gold.pyx             | 2 +-
     spacy/syntax/nn_parser.pyx | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/gold.pyx b/spacy/gold.pyx
    index 2512c179f..5729af667 100644
    --- a/spacy/gold.pyx
    +++ b/spacy/gold.pyx
    @@ -213,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,
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index a8a1d4334..9288b523f 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -809,7 +809,7 @@ cdef class Parser:
         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:
    
    From 17c467e0ab143eb89c45917740b5d32be303f56a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 11 Oct 2017 03:33:06 -0500
    Subject: [PATCH 627/739] Avoid clobbering existing lemmas
    
    ---
     spacy/morphology.pyx | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 5a4399698..b8dbb83ba 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -55,7 +55,7 @@ cdef class Morphology:
             # 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:
    @@ -68,7 +68,8 @@ cdef class Morphology:
     
         cdef int assign_untagged(self, TokenC* token) except -1:
             '''Set morphological attributes on a token without a POS tag.'''
    -        token.lemma = self.lemmatize(0, token.lex.orth, {})
    +        if token.lemma == 0:
    +            token.lemma = self.lemmatize(0, token.lex.orth, {})
     
         cdef int assign_tag(self, TokenC* token, tag) except -1:
             if isinstance(tag, basestring):
    
    From 9fd471372a7e804fdd5402a6095404f71b947ed0 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:25:51 +0200
    Subject: [PATCH 628/739] Add lookup lemmatizer to lemmatizer as lookup()
     method
    
    ---
     spacy/lemmatizer.py | 29 ++++++++++-------------------
     1 file changed, 10 insertions(+), 19 deletions(-)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 6c0fb6356..1fb83a727 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -10,10 +10,11 @@ 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:
    @@ -79,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()
    @@ -102,18 +108,3 @@ def lemmatize(string, index, exceptions, rules):
         if not forms:
             forms.append(string)
         return set(forms)
    -
    -
    -class LookupLemmatizer(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])
    
    From 9620c1a640a52f1e560c122e2c737a16d00d5c2f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:26:05 +0200
    Subject: [PATCH 629/739] Add lemma_lookup to Language defaults
    
    ---
     spacy/language.py | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index d40aee3ca..86292f4ff 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -33,7 +33,8 @@ 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):
    @@ -77,6 +78,7 @@ class BaseDefaults(object):
         lemma_rules = {}
         lemma_exc = {}
         lemma_index = {}
    +    lemma_lookup = {}
         morph_rules = {}
         lex_attr_getters = LEX_ATTRS
         syntax_iterators = {}
    
    From 6dd14dc3427167045c63b9cba8f24bcde87cd765 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:27:10 +0200
    Subject: [PATCH 630/739] Add lookup lemmas to tokens without POS tags
    
    ---
     spacy/morphology.pyx | 8 ++++++--
     1 file changed, 6 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index b8dbb83ba..4a1a0aa54 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -67,9 +67,13 @@ cdef class Morphology:
                                  self.exc), None, None)
     
         cdef int assign_untagged(self, TokenC* token) except -1:
    -        '''Set morphological attributes on a token without a POS tag.'''
    +        """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:
    -            token.lemma = self.lemmatize(0, token.lex.orth, {})
    +            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):
    
    From 15fe0fd82d0d38b584db6f1ca4ad674252c2cf0d Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:27:18 +0200
    Subject: [PATCH 631/739] Fix tests
    
    ---
     spacy/tests/doc/test_creation.py        | 4 ++--
     spacy/tests/regression/test_issue589.py | 1 +
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/doc/test_creation.py b/spacy/tests/doc/test_creation.py
    index edadbf086..c14fdfbe9 100644
    --- a/spacy/tests/doc/test_creation.py
    +++ b/spacy/tests/doc/test_creation.py
    @@ -4,12 +4,12 @@ import pytest
     
     from ...vocab import Vocab
     from ...tokens.doc import Doc
    -from ...lemmatizerlookup import Lemmatizer
    +from ...lemmatizer import Lemmatizer
     
     
     @pytest.fixture
     def lemmatizer():
    -    return Lemmatizer({'dogs': 'dog', 'boxen': 'box', 'mice': 'mouse'})
    +    return Lemmatizer(lookup={'dogs': 'dog', 'boxen': 'box', 'mice': 'mouse'})
     
     
     @pytest.fixture
    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)
    
    From 453c47ca24c7e8d3cd71afc3fe2ef4b501c25e27 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:27:26 +0200
    Subject: [PATCH 632/739] Add German lemmatizer tests
    
    ---
     spacy/tests/lang/de/test_lemma.py | 13 +++++++++++++
     1 file changed, 13 insertions(+)
     create mode 100644 spacy/tests/lang/de/test_lemma.py
    
    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
    
    From c6ae49e8bf1da88a6f51dd47c2e0a4c09ecc851f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:34:11 +0200
    Subject: [PATCH 633/739] Fix formatting
    
    ---
     spacy/tests/test_underscore.py | 5 ++++-
     1 file changed, 4 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py
    index 262098515..4df47b886 100644
    --- a/spacy/tests/test_underscore.py
    +++ b/spacy/tests/test_underscore.py
    @@ -10,6 +10,7 @@ def test_create_doc_underscore():
         assert uscore._start is None
         assert uscore._end is None
     
    +
     def test_doc_underscore_getattr_setattr():
         doc = Mock()
         doc.doc = doc
    @@ -20,6 +21,7 @@ def test_doc_underscore_getattr_setattr():
         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,
    @@ -28,6 +30,7 @@ def test_create_span_underscore():
         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,
    @@ -36,7 +39,7 @@ def test_span_underscore_getter_setter():
                                                                         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')
    
    From 51519251c23654a9f44f2f995b473e24735a5f2c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 13:34:19 +0200
    Subject: [PATCH 634/739] Fix underscore method test
    
    ---
     spacy/tests/test_underscore.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/test_underscore.py b/spacy/tests/test_underscore.py
    index 4df47b886..c7df57b62 100644
    --- a/spacy/tests/test_underscore.py
    +++ b/spacy/tests/test_underscore.py
    @@ -46,7 +46,7 @@ def test_span_underscore_getter_setter():
     
     
     def test_token_underscore_method():
    -    token = Mock(doc=Mock(), idx=7, say_cheese=lambda: 'cheese')
    +    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)
    
    From eac9e99086b2c2b58ee57c0c3b621ac90116ac47 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 14:21:15 +0200
    Subject: [PATCH 635/739] Update docs on adding lemmatization to languages
    
    ---
     .../_adding-languages/_language-data.jade     | 21 ++++---------------
     1 file changed, 4 insertions(+), 17 deletions(-)
    
    diff --git a/website/usage/_adding-languages/_language-data.jade b/website/usage/_adding-languages/_language-data.jade
    index 81a6d638e..dc86b7a03 100644
    --- a/website/usage/_adding-languages/_language-data.jade
    +++ b/website/usage/_adding-languages/_language-data.jade
    @@ -456,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
     
    
    From 8ce6f96180ab37f7f4ec0676868b0d8b3ae18787 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Wed, 11 Oct 2017 15:34:55 +0200
    Subject: [PATCH 636/739] Don't make copies of language data components
    
    ---
     spacy/lang/bn/__init__.py | 12 ++++++------
     spacy/lang/da/__init__.py |  2 +-
     spacy/lang/de/__init__.py | 10 +++++-----
     spacy/lang/en/__init__.py | 16 ++++++++--------
     spacy/lang/es/__init__.py |  8 ++++----
     spacy/lang/fi/__init__.py |  2 +-
     spacy/lang/fr/__init__.py | 10 +++++-----
     spacy/lang/he/__init__.py |  2 +-
     spacy/lang/hu/__init__.py | 10 +++++-----
     spacy/lang/id/__init__.py | 12 ++++++------
     spacy/lang/it/__init__.py |  4 ++--
     spacy/lang/nb/__init__.py |  2 +-
     spacy/lang/nl/__init__.py |  2 +-
     spacy/lang/pl/__init__.py |  2 +-
     spacy/lang/pt/__init__.py |  4 ++--
     spacy/lang/sv/__init__.py |  6 +++---
     spacy/lang/th/__init__.py |  4 ++--
     17 files changed, 54 insertions(+), 54 deletions(-)
    
    diff --git a/spacy/lang/bn/__init__.py b/spacy/lang/bn/__init__.py
    index 1a76123ea..ff560afae 100644
    --- a/spacy/lang/bn/__init__.py
    +++ b/spacy/lang/bn/__init__.py
    @@ -17,12 +17,12 @@ 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 = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    -    lemma_rules = dict(LEMMA_RULES)
    -    prefixes = tuple(TOKENIZER_PREFIXES)
    -    suffixes = tuple(TOKENIZER_SUFFIXES)
    -    infixes = tuple(TOKENIZER_INFIXES)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
    +    lemma_rules = LEMMA_RULES
    +    prefixes = TOKENIZER_PREFIXES
    +    suffixes = TOKENIZER_SUFFIXES
    +    infixes = TOKENIZER_INFIXES
     
     
     class Bengali(Language):
    diff --git a/spacy/lang/da/__init__.py b/spacy/lang/da/__init__.py
    index b255a04b9..86e47c00d 100644
    --- a/spacy/lang/da/__init__.py
    +++ b/spacy/lang/da/__init__.py
    @@ -16,7 +16,7 @@ class DanishDefaults(Language.Defaults):
         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/de/__init__.py b/spacy/lang/de/__init__.py
    index e56bab844..e8e7a12db 100644
    --- a/spacy/lang/de/__init__.py
    +++ b/spacy/lang/de/__init__.py
    @@ -22,11 +22,11 @@ class GermanDefaults(Language.Defaults):
         lex_attr_getters[NORM] = add_lookups(Language.Defaults.lex_attr_getters[NORM],
                                              NORM_EXCEPTIONS, BASE_NORMS)
         tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
    -    infixes = tuple(TOKENIZER_INFIXES)
    -    tag_map = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    -    syntax_iterators = dict(SYNTAX_ITERATORS)
    -    lemma_lookup = dict(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/en/__init__.py b/spacy/lang/en/__init__.py
    index fffac6467..63fd9c2b4 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -24,14 +24,14 @@ class EnglishDefaults(Language.Defaults):
         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)
    -    lemma_lookup = dict(LOOKUP)
    -    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/es/__init__.py b/spacy/lang/es/__init__.py
    index 4246a0703..661f0bbec 100644
    --- a/spacy/lang/es/__init__.py
    +++ b/spacy/lang/es/__init__.py
    @@ -19,10 +19,10 @@ class SpanishDefaults(Language.Defaults):
         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)
    -    lemma_lookup = dict(LOOKUP)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
    +    sytax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class Spanish(Language):
    diff --git a/spacy/lang/fi/__init__.py b/spacy/lang/fi/__init__.py
    index 2eb40851b..7f74495c5 100644
    --- a/spacy/lang/fi/__init__.py
    +++ b/spacy/lang/fi/__init__.py
    @@ -16,7 +16,7 @@ class FinnishDefaults(Language.Defaults):
         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 0f2a60e3e..42acd0736 100644
    --- a/spacy/lang/fr/__init__.py
    +++ b/spacy/lang/fr/__init__.py
    @@ -21,12 +21,12 @@ class FrenchDefaults(Language.Defaults):
         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)
    -    lemma_lookup = dict(LOOKUP)
    +    syntax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class French(Language):
    diff --git a/spacy/lang/he/__init__.py b/spacy/lang/he/__init__.py
    index b815b3273..807794fee 100644
    --- a/spacy/lang/he/__init__.py
    +++ b/spacy/lang/he/__init__.py
    @@ -13,7 +13,7 @@ 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/hu/__init__.py b/spacy/lang/hu/__init__.py
    index fd039a8eb..35b047900 100644
    --- a/spacy/lang/hu/__init__.py
    +++ b/spacy/lang/hu/__init__.py
    @@ -18,12 +18,12 @@ class HungarianDefaults(Language.Defaults):
         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
    -    lemma_lookup = dict(LOOKUP)
    +    lemma_lookup = LOOKUP
     
     
     class Hungarian(Language):
    diff --git a/spacy/lang/id/__init__.py b/spacy/lang/id/__init__.py
    index 29fe86a01..2f21e73cf 100644
    --- a/spacy/lang/id/__init__.py
    +++ b/spacy/lang/id/__init__.py
    @@ -20,12 +20,12 @@ class IndonesianDefaults(Language.Defaults):
         lex_attr_getters[LANG] = lambda text: 'id'
         lex_attr_getters.update(LEX_ATTRS)
         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)
    -    syntax_iterators = dict(SYNTAX_ITERATORS)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    prefixes = TOKENIZER_PREFIXES
    +    suffixes = TOKENIZER_SUFFIXES
    +    infixes = TOKENIZER_INFIXES
    +    syntax_iterators = SYNTAX_ITERATORS
    +    lemma_lookup = LOOKUP
     
     
     class Indonesian(Language):
    diff --git a/spacy/lang/it/__init__.py b/spacy/lang/it/__init__.py
    index c19cb6d39..6bc47ce92 100644
    --- a/spacy/lang/it/__init__.py
    +++ b/spacy/lang/it/__init__.py
    @@ -16,8 +16,8 @@ class ItalianDefaults(Language.Defaults):
         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)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    lemma_lookup = LOOKUP
     
     
     class Italian(Language):
    diff --git a/spacy/lang/nb/__init__.py b/spacy/lang/nb/__init__.py
    index 8804f7424..4250e6809 100644
    --- a/spacy/lang/nb/__init__.py
    +++ b/spacy/lang/nb/__init__.py
    @@ -17,7 +17,7 @@ class NorwegianDefaults(Language.Defaults):
         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/nl/__init__.py b/spacy/lang/nl/__init__.py
    index 29cbb4617..13786a7bc 100644
    --- a/spacy/lang/nl/__init__.py
    +++ b/spacy/lang/nl/__init__.py
    @@ -17,7 +17,7 @@ class DutchDefaults(Language.Defaults):
         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/pl/__init__.py b/spacy/lang/pl/__init__.py
    index 22e103246..80011f9d8 100644
    --- a/spacy/lang/pl/__init__.py
    +++ b/spacy/lang/pl/__init__.py
    @@ -16,7 +16,7 @@ class PolishDefaults(Language.Defaults):
         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, TOKENIZER_EXCEPTIONS)
    -    stop_words = set(STOP_WORDS)
    +    stop_words = STOP_WORDS
     
     
     class Polish(Language):
    diff --git a/spacy/lang/pt/__init__.py b/spacy/lang/pt/__init__.py
    index 6366a25c1..2a8323597 100644
    --- a/spacy/lang/pt/__init__.py
    +++ b/spacy/lang/pt/__init__.py
    @@ -19,8 +19,8 @@ class PortugueseDefaults(Language.Defaults):
         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)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    lemma_lookup = LOOKUP
     
     
     class Portuguese(Language):
    diff --git a/spacy/lang/sv/__init__.py b/spacy/lang/sv/__init__.py
    index 27da9024e..224c105d7 100644
    --- a/spacy/lang/sv/__init__.py
    +++ b/spacy/lang/sv/__init__.py
    @@ -18,9 +18,9 @@ class SwedishDefaults(Language.Defaults):
         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)
    -    lemma_rules = dict(LEMMA_RULES)
    -    lemma_lookup = dict(LOOKUP)
    +    stop_words = STOP_WORDS
    +    lemma_rules = LEMMA_RULES
    +    lemma_lookup = LOOKUP
     
     
     class Swedish(Language):
    diff --git a/spacy/lang/th/__init__.py b/spacy/lang/th/__init__.py
    index e640fc4ef..bedec46c8 100644
    --- a/spacy/lang/th/__init__.py
    +++ b/spacy/lang/th/__init__.py
    @@ -17,8 +17,8 @@ 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 = dict(TAG_MAP)
    -    stop_words = set(STOP_WORDS)
    +    tag_map = TAG_MAP
    +    stop_words = STOP_WORDS
     
     
     class Thai(Language):
    
    From cecfcc77114af45bcc6e52da3c937c8c634c1dca Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 13:12:26 +0200
    Subject: [PATCH 637/739] Set default hyper params back to 'slow' settings
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1059982bc..5b087d367 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -240,8 +240,8 @@ cdef class Parser:
         @classmethod
         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', 64))
    -        hidden_width = util.env_opt('hidden_width', cfg.get('hidden_width', 64))
    +        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', 4))
    
    From a955843684cdbc5c2ac26a89bf2b1b3efeebbaff Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 13:13:01 +0200
    Subject: [PATCH 638/739] Increase default number of epochs
    
    ---
     spacy/cli/train.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/cli/train.py b/spacy/cli/train.py
    index 3dae3f68b..2faea72e7 100644
    --- a/spacy/cli/train.py
    +++ b/spacy/cli/train.py
    @@ -44,7 +44,7 @@ numpy.random.seed(0)
         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=10, n_sents=0,
    +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):
         """
    
    From 908f44c3fe0e025ca9b7cf57d5428331fe66a07d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 14:56:11 +0200
    Subject: [PATCH 639/739] Disable history features by default
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 5b087d367..1f4918935 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -244,8 +244,8 @@ cdef class Parser:
             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', 4))
    -        hist_width = util.env_opt('history_width', cfg.get('hist_width', 16))
    +        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")
    
    From fff1028391aee0f4218dfd7f572a86407cee48cf Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 12 Oct 2017 20:05:06 +0200
    Subject: [PATCH 640/739] Add validate CLI command
    
    ---
     spacy/__main__.py     |   3 +-
     spacy/cli/__init__.py |   1 +
     spacy/cli/validate.py | 123 ++++++++++++++++++++++++++++++++++++++++++
     3 files changed, 126 insertions(+), 1 deletion(-)
     create mode 100644 spacy/cli/validate.py
    
    diff --git a/spacy/__main__.py b/spacy/__main__.py
    index 0ec96e4a1..99d6b116c 100644
    --- a/spacy/__main__.py
    +++ b/spacy/__main__.py
    @@ -7,7 +7,7 @@ if __name__ == '__main__':
         import plac
         import sys
         from spacy.cli import download, link, info, package, train, convert, model
    -    from spacy.cli import profile, evaluate
    +    from spacy.cli import profile, evaluate, validate
         from spacy.util import prints
     
         commands = {
    @@ -20,6 +20,7 @@ if __name__ == '__main__':
             'package': package,
             'model': model,
             'profile': profile,
    +        'validate': validate
         }
         if len(sys.argv) == 1:
             prints(', '.join(commands), title="Available commands", exits=1)
    diff --git a/spacy/cli/__init__.py b/spacy/cli/__init__.py
    index ebe185f24..2595dcc03 100644
    --- a/spacy/cli/__init__.py
    +++ b/spacy/cli/__init__.py
    @@ -7,3 +7,4 @@ 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/validate.py b/spacy/cli/validate.py
    new file mode 100644
    index 000000000..68c8c5053
    --- /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
    +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('✔')
    +        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')
    
    From 39d3cbfdbae08fc43a64fdaa38af23b2d80ee1d3 Mon Sep 17 00:00:00 2001
    From: Jeffrey Gerard 
    Date: Thu, 12 Oct 2017 11:39:12 -0700
    Subject: [PATCH 641/739] Bugfix example script train_ner_standalone.py, fails
     after training
    
    ---
     examples/training/train_ner_standalone.py | 6 ++----
     1 file changed, 2 insertions(+), 4 deletions(-)
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    index e4fb1d1e8..3c2c2781a 100644
    --- a/examples/training/train_ner_standalone.py
    +++ b/examples/training/train_ner_standalone.py
    @@ -142,16 +142,14 @@ def train(nlp, train_examples, dev_examples, nr_epoch=5):
                 inputs, annots = zip(*batch)
                 nlp.update(list(inputs), list(annots), sgd, losses=losses)
             scores = nlp.evaluate(dev_examples)
    -        report_scores(i, losses['ner'], scores)
    -    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):
    
    From 462caf835a9e499387ca20858aecd6e4d9da725d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 21:18:22 +0200
    Subject: [PATCH 642/739] Fix SBD test
    
    ---
     spacy/tests/parser/test_preset_sbd.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/parser/test_preset_sbd.py b/spacy/tests/parser/test_preset_sbd.py
    index f10b96192..4c973bd97 100644
    --- a/spacy/tests/parser/test_preset_sbd.py
    +++ b/spacy/tests/parser/test_preset_sbd.py
    @@ -35,7 +35,7 @@ def parser(vocab):
     def test_no_sentences(parser):
         doc = Doc(parser.vocab, words=['a', 'b', 'c', 'd'])
         doc = parser(doc)
    -    assert len(list(doc.sents)) == 2
    +    assert len(list(doc.sents)) >= 1
     
     
     def test_sents_1(parser):
    
    From 5ba970b4954e7bfe1904eb31a284e11abbf4e7ff Mon Sep 17 00:00:00 2001
    From: Jeffrey Gerard 
    Date: Thu, 12 Oct 2017 12:34:46 -0700
    Subject: [PATCH 643/739] minor cleanup
    
    ---
     examples/training/train_ner_standalone.py | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/examples/training/train_ner_standalone.py b/examples/training/train_ner_standalone.py
    index 3c2c2781a..0c5094bb7 100644
    --- a/examples/training/train_ner_standalone.py
    +++ b/examples/training/train_ner_standalone.py
    @@ -6,7 +6,7 @@ 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:
    @@ -149,7 +149,8 @@ def report_scores(i, loss, scores):
         precision = '%.2f' % scores['ents_p']
         recall = '%.2f' % scores['ents_r']
         f_measure = '%.2f' % scores['ents_f']
    -    print('Epoch %d: %d %s %s %s' % (i, int(loss), precision, recall, f_measure))
    +    print('Epoch %d: %d %s %s %s' % (
    +        i, int(loss), precision, recall, f_measure))
     
     
     def read_examples(path):
    
    From 27b927259a8196816fe5a5c2e789866029e3107f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:22:04 +0200
    Subject: [PATCH 644/739] Add locale_escape compat function
    
    ---
     spacy/compat.py | 10 ++++++++++
     1 file changed, 10 insertions(+)
    
    diff --git a/spacy/compat.py b/spacy/compat.py
    index e6b7c066b..81243ce1b 100644
    --- a/spacy/compat.py
    +++ b/spacy/compat.py
    @@ -6,6 +6,7 @@ import ftfy
     import sys
     import ujson
     import itertools
    +import locale
     
     from thinc.neural.util import copy_array
     
    @@ -113,3 +114,12 @@ def import_file(name, 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
    
    From dc01acd82199562529bc6c6ec7b92543dea895fb Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:23:21 +0200
    Subject: [PATCH 645/739] Escape encoding in validate function
    
    ---
     spacy/cli/validate.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/cli/validate.py b/spacy/cli/validate.py
    index 68c8c5053..c1f992ed6 100644
    --- a/spacy/cli/validate.py
    +++ b/spacy/cli/validate.py
    @@ -5,7 +5,7 @@ import requests
     import pkg_resources
     from pathlib import Path
     
    -from ..compat import path2str
    +from ..compat import path2str, locale_escape
     from ..util import prints, get_data_path, read_json
     from .. import about
     
    @@ -94,7 +94,7 @@ def get_model_row(compat, name, data, type='package'):
         tpl_red = '\x1b[38;5;1m{}\x1b[0m'
         tpl_green = '\x1b[38;5;2m{}\x1b[0m'
         if data['compat']:
    -        comp = tpl_green.format('✔')
    +        comp = tpl_green.format(locale_escape('✔', errors='ignore'))
             version = tpl_green.format(data['version'])
         else:
             comp = '--> {}'.format(compat.get(data['name'], ['n/a'])[0])
    
    From 9b90d235d111a87b50e46c92431d0412d9e5a8c1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:50:43 +0200
    Subject: [PATCH 646/739] Fix tag check in lemmatizer
    
    ---
     spacy/lemmatizer.py | 8 ++++----
     1 file changed, 4 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 1fb83a727..53519e4f1 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -17,13 +17,13 @@ class Lemmatizer(object):
             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()])
    
    From cf6da9301a2e7896da05638c85656683ffd0d413 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 12 Oct 2017 22:50:52 +0200
    Subject: [PATCH 647/739] Update lemmatizer test
    
    ---
     spacy/tests/lang/en/test_lemmatizer.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/tests/lang/en/test_lemmatizer.py b/spacy/tests/lang/en/test_lemmatizer.py
    index ecde87bed..22c8f2499 100644
    --- a/spacy/tests/lang/en/test_lemmatizer.py
    +++ b/spacy/tests/lang/en/test_lemmatizer.py
    @@ -57,6 +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)
    -    assert all(t.lemma_ == '' for t in doc)
         EN.tagger(doc)
         assert all(t.lemma_ != '' for t in doc)
    
    From 9fd68334abe06e14a0dcb5889afea64d6b290df4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 12 Oct 2017 23:36:44 +0200
    Subject: [PATCH 648/739] Add validate command docs
    
    ---
     website/api/_top-level/_cli.jade | 16 ++++++++++++++++
     1 file changed, 16 insertions(+)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index 3a4b4702a..b2a9c574d 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -113,6 +113,22 @@ p
             +cell flag
             +cell Show help message and available arguments.
     
    ++h(3, "validate") Validate
    +    +tag-new(2)
    +
    +p
    +    |  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
    
    From 5f5d6897e81645a2e7c26a707d1e1cc6f53cbab3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 13 Oct 2017 00:18:02 +0200
    Subject: [PATCH 649/739] Increment version
    
    ---
     website/_harp.json | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/website/_harp.json b/website/_harp.json
    index 55035c32f..d87fda049 100644
    --- a/website/_harp.json
    +++ b/website/_harp.json
    @@ -84,8 +84,8 @@
             ],
     
             "ALPHA": true,
    -        "V_CSS": "2.0",
    -        "V_JS": "2.0",
    +        "V_CSS": "2.0a0",
    +        "V_JS": "2.0a0",
             "DEFAULT_SYNTAX": "python",
             "ANALYTICS": "UA-58931649-1",
             "MAILCHIMP": {
    
    From bfd9506f1d69520b6b153390cf34fb9e8288f6ae Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 13 Oct 2017 00:18:13 +0200
    Subject: [PATCH 650/739] Update extensions docs and add resources
    
    ---
     website/usage/_data.json                        |  1 +
     .../_processing-pipelines/_extensions.jade      |  5 +++--
     website/usage/resources.jade                    | 17 +++++++++++++++++
     3 files changed, 21 insertions(+), 2 deletions(-)
    
    diff --git a/website/usage/_data.json b/website/usage/_data.json
    index 06b0371ae..cc9918631 100644
    --- a/website/usage/_data.json
    +++ b/website/usage/_data.json
    @@ -183,6 +183,7 @@
             "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",
    diff --git a/website/usage/_processing-pipelines/_extensions.jade b/website/usage/_processing-pipelines/_extensions.jade
    index a1d8168e0..795d2d7c5 100644
    --- a/website/usage/_processing-pipelines/_extensions.jade
    +++ b/website/usage/_processing-pipelines/_extensions.jade
    @@ -4,7 +4,8 @@ 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:
    +    |  best practices. For examples of other spaCy extensions, see the
    +    |  #[+a("/usage/resources#extensions") resources].
     
     +list
         +item
    @@ -104,7 +105,7 @@ p
             |  #[+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-pipeline") #[code spacy-pipeline]]
    +        |  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/resources.jade b/website/usage/resources.jade
    index 33a2a45aa..285c211e8 100644
    --- a/website/usage/resources.jade
    +++ b/website/usage/resources.jade
    @@ -41,6 +41,23 @@ include ../_includes/_mixins
         .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
     
    
    From bb6ecb82e52bd002837e9c449808b2e47acc24d8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:51:52 +0200
    Subject: [PATCH 651/739] Ensure long file paths in code examples break if
     needed
    
    ---
     website/_harp.json                       | 2 +-
     website/_includes/_mixins.jade           | 2 +-
     website/assets/css/_base/_utilities.sass | 3 +++
     3 files changed, 5 insertions(+), 2 deletions(-)
    
    diff --git a/website/_harp.json b/website/_harp.json
    index d87fda049..7c69beef0 100644
    --- a/website/_harp.json
    +++ b/website/_harp.json
    @@ -84,7 +84,7 @@
             ],
     
             "ALPHA": true,
    -        "V_CSS": "2.0a0",
    +        "V_CSS": "2.0a1",
             "V_JS": "2.0a0",
             "DEFAULT_SYNTAX": "python",
             "ANALYTICS": "UA-58931649-1",
    diff --git a/website/_includes/_mixins.jade b/website/_includes/_mixins.jade
    index 7666889b5..414ee809e 100644
    --- a/website/_includes/_mixins.jade
    +++ b/website/_includes/_mixins.jade
    @@ -190,7 +190,7 @@ mixin github(repo, file, alt_file, height)
                 code.c-code-block__content(data-gh-embed="#{repo}/#{branch}/#{file}")
     
             footer.o-grid.u-text
    -            .o-block-small.u-flex-full #[+icon("github")] #[code=repo + '/' + (alt_file || file)]
    +            .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
     
    diff --git a/website/assets/css/_base/_utilities.sass b/website/assets/css/_base/_utilities.sass
    index 91a6251e6..8c1e82706 100644
    --- a/website/assets/css/_base/_utilities.sass
    +++ b/website/assets/css/_base/_utilities.sass
    @@ -188,6 +188,9 @@
         word-wrap: break-word
         white-space: initial
     
    +    &.u-break--all
    +        word-break: break-all
    +
     .u-no-border
         border: none
     
    
    From a69f4e56e53c093aed0ffa72352043f331d3528c Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:52:07 +0200
    Subject: [PATCH 652/739] Remove outdated aside
    
    ---
     website/usage/_spacy-101/_community-faq.jade | 8 --------
     1 file changed, 8 deletions(-)
    
    diff --git a/website/usage/_spacy-101/_community-faq.jade b/website/usage/_spacy-101/_community-faq.jade
    index f91248bfd..a3a04647d 100644
    --- a/website/usage/_spacy-101/_community-faq.jade
    +++ b/website/usage/_spacy-101/_community-faq.jade
    @@ -115,14 +115,6 @@ p
         |  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/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
    
    From a5da683578db7711073f37a6fadf34def5305ea4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:52:41 +0200
    Subject: [PATCH 653/739] Add Russian to alpha docs and update tokenizer
     dependencies
    
    ---
     website/models/_data.json             |  1 +
     website/usage/_models/_languages.jade | 11 +++++++----
     2 files changed, 8 insertions(+), 4 deletions(-)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index b2898be8a..f7ba16c9f 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -80,6 +80,7 @@
             "da": "Danish",
             "hu": "Hungarian",
             "pl": "Polish",
    +        "ru": "Russian",
             "he": "Hebrew",
             "bn": "Bengali",
             "id": "Indonesian",
    diff --git a/website/usage/_models/_languages.jade b/website/usage/_models/_languages.jade
    index abdad01ad..4337b5b99 100644
    --- a/website/usage/_models/_languages.jade
    +++ b/website/usage/_models/_languages.jade
    @@ -40,10 +40,13 @@ p
                         +src(gh("spaCy", "spacy/lang/" + code)) #[code lang/#{code}]
     
     +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].
    +    .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)
    
    From 09aed581405588947697cdaa2474fd7705197c86 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:52:59 +0200
    Subject: [PATCH 654/739] Port over changes from #1333 and add comments
    
    ---
     spacy/lang/char_classes.py | 10 +++++++++-
     1 file changed, 9 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py
    index b10481411..89774b17d 100644
    --- a/spacy/lang/char_classes.py
    +++ b/spacy/lang/char_classes.py
    @@ -29,11 +29,19 @@ _units = ('km km² km³ m m² m³ dm dm² dm³ cm cm² cm³ mm mm² mm³ ha µm
               '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 %')
     _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$'
    +
    +# 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'\' \'\' " ” “ `` ` ‘ ´ ‚ , „ » «'
    +_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)
    
    From a4d974d97bcbb6f1d9102c2f5146d4e5016fb8ba Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 12:58:07 +0200
    Subject: [PATCH 655/739] Port over URL pattern changes from #1411
    
    ---
     spacy/lang/tokenizer_exceptions.py |  6 +++---
     spacy/tests/tokenizer/test_urls.py | 18 +++++++++---------
     2 files changed, 12 insertions(+), 12 deletions(-)
    
    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/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"),
     ]
     
     
    
    From 9b3f8f9ec3c98c94581694060cfb60be0b8bf2f3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:11:18 +0200
    Subject: [PATCH 656/739] Fix formatting and add comment on languages
    
    ---
     spacy/tests/conftest.py | 11 ++++++++++-
     1 file changed, 10 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/tests/conftest.py b/spacy/tests/conftest.py
    index 28b5f4ab9..5f3fea342 100644
    --- a/spacy/tests/conftest.py
    +++ b/spacy/tests/conftest.py
    @@ -11,8 +11,12 @@ from ..strings import StringStore
     from .. import util
     
     
    +# 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', 'th','xx']
    +              'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx']
    +
     _models = {'en': ['en_core_web_sm'],
                'de': ['de_core_news_md'],
                'fr': ['fr_depvec_web_lg'],
    @@ -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()
    @@ -87,10 +92,12 @@ def hu_tokenizer():
     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()
    @@ -105,6 +112,7 @@ 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()
    @@ -129,6 +137,7 @@ def en_entityrecognizer():
     def text_file():
         return StringIO()
     
    +
     @pytest.fixture
     def text_file_b():
         return BytesIO()
    
    From 612224c10da6cbb956d687dedd33a741d0212750 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:11:39 +0200
    Subject: [PATCH 657/739] Port over changes from #1157
    
    ---
     spacy/lang/ja/__init__.py             | 30 +++++++++++++++++++++------
     spacy/tests/conftest.py               |  7 +++++++
     spacy/tests/lang/ja/__init__.py       |  0
     spacy/tests/lang/ja/test_tokenizer.py | 19 +++++++++++++++++
     4 files changed, 50 insertions(+), 6 deletions(-)
     create mode 100644 spacy/tests/lang/ja/__init__.py
     create mode 100644 spacy/tests/lang/ja/test_tokenizer.py
    
    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/tests/conftest.py b/spacy/tests/conftest.py
    index 5f3fea342..29f37c9fa 100644
    --- a/spacy/tests/conftest.py
    +++ b/spacy/tests/conftest.py
    @@ -117,6 +117,13 @@ def he_tokenizer():
     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")
    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
    
    From 38c756fd852a3f8f89c29eec858d537aaca003f1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:16:21 +0200
    Subject: [PATCH 658/739] Port over changes from #1287
    
    ---
     spacy/lang/en/syntax_iterators.py  |  2 +-
     spacy/tests/lang/en/test_parser.py | 30 ++++++++++++++++++++++++++++++
     2 files changed, 31 insertions(+), 1 deletion(-)
    
    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/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 "
    
    From cd6a29dce7af3edc00de988d6976a11b91b43682 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:28:46 +0200
    Subject: [PATCH 659/739] Port over changes from #1294
    
    ---
     .../lang/en/test_customized_tokenizer.py      | 42 +++++++++++++++++++
     spacy/tokenizer.pyx                           |  3 +-
     2 files changed, 44 insertions(+), 1 deletion(-)
     create mode 100644 spacy/tests/lang/en/test_customized_tokenizer.py
    
    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/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)
    
    From 3516aa0ceaa7fdcf2831a9f6d64c0c15de18c62f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 13:32:55 +0200
    Subject: [PATCH 660/739] Port over changes from #1389
    
    ---
     spacy/lemmatizer.py                      | 19 ++++++++++---------
     spacy/tests/regression/test_issue1387.py | 22 ++++++++++++++++++++++
     2 files changed, 32 insertions(+), 9 deletions(-)
     create mode 100644 spacy/tests/regression/test_issue1387.py
    
    diff --git a/spacy/lemmatizer.py b/spacy/lemmatizer.py
    index 53519e4f1..bd2ca766a 100644
    --- a/spacy/lemmatizer.py
    +++ b/spacy/lemmatizer.py
    @@ -94,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/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"
    
    From 9d6c8eaa491d0988bf16633bbba9847350f57778 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 14:58:52 +0200
    Subject: [PATCH 661/739] Update base norm exceptions with more unicode
     characters
    
    e.g. unicode variations of punctuation used in Chinese
    ---
     spacy/lang/norm_exceptions.py | 10 ++++++++++
     1 file changed, 10 insertions(+)
    
    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 = {
         "„": '"',
         "»": '"',
         "«": '"',
    +    "‘‘": '"',
    +    "’’": '"',
    +    "?": "?",
    +    "!": "!",
    +    ",": ",",
    +    ";": ";",
    +    ":": ":",
    +    "。": ".",
    +    "।": ".",
         "…": "...",
         "—": "-",
         "–": "-",
         "--": "-",
         "---": "-",
    +    "——": "-",
         "€": "$",
         "£": "$",
         "¥": "$",
    
    From e85e1d571b834d35922a816e1886cfc74cdf50d8 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 14:59:23 +0200
    Subject: [PATCH 662/739] Update base punctuation
    
    ---
     spacy/lang/char_classes.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/char_classes.py b/spacy/lang/char_classes.py
    index 89774b17d..7ec631c92 100644
    --- a/spacy/lang/char_classes.py
    +++ b/spacy/lang/char_classes.py
    @@ -33,7 +33,7 @@ _currency = r'\$ £ € ¥ ฿ US\$ C\$ A\$'
     # 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'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ ·'
    +_punct = r'… …… , : ; \! \? ¿ ¡ \( \) \[ \] \{ \} < > _ # \* & 。 ? ! , 、 ; : ~ · ।'
     _quotes = r'\' \'\' " ” “ `` ` ‘ ´ ‘‘ ’’ ‚ , „ » « 「 」 『 』 ( ) 〔 〕 【 】 《 》 〈 〉'
     _hyphens = '- – — -- --- —— ~'
     
    
    From 266e7180a747c78ac4a123c12ef6c1fc3e0286c5 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 14:59:52 +0200
    Subject: [PATCH 663/739] Add Language class, stop words and basic stemmer that
     sets NORM
    
    ---
     spacy/lang/hi/__init__.py   |  24 +++++
     spacy/lang/hi/lex_attrs.py  |  38 ++++++++
     spacy/lang/hi/stop_words.py | 177 ++++++++++++++++++++++++++++++++++++
     3 files changed, 239 insertions(+)
     create mode 100644 spacy/lang/hi/__init__.py
     create mode 100644 spacy/lang/hi/lex_attrs.py
     create mode 100644 spacy/lang/hi/stop_words.py
    
    diff --git a/spacy/lang/hi/__init__.py b/spacy/lang/hi/__init__.py
    new file mode 100644
    index 000000000..0503b5b7f
    --- /dev/null
    +++ b/spacy/lang/hi/__init__.py
    @@ -0,0 +1,24 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +from .stop_words import STOP_WORDS
    +from .lex_attrs import LEX_ATTRS
    +
    +from ..norm_exceptions import BASE_NORMS
    +from ...language import Language
    +from ...attrs import LANG
    +
    +
    +class HindiDefaults(Language.Defaults):
    +    lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
    +    lex_attr_getters.update(LEX_ATTRS)
    +    lex_attr_getters[LANG] = lambda text: 'hi'
    +    stop_words = STOP_WORDS
    +
    +
    +class Hindi(Language):
    +    lang = 'hi'
    +    Defaults = HindiDefaults
    +
    +
    +__all__ = ['Hindi']
    diff --git a/spacy/lang/hi/lex_attrs.py b/spacy/lang/hi/lex_attrs.py
    new file mode 100644
    index 000000000..8886e26c3
    --- /dev/null
    +++ b/spacy/lang/hi/lex_attrs.py
    @@ -0,0 +1,38 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +from ..norm_exceptions import BASE_NORMS
    +from ...attrs import NORM
    +from ...util import add_lookups
    +
    +
    +_stem_suffixes = [
    +    ["ो","े","ू","ु","ी","ि","ा"],
    +    ["कर","ाओ","िए","ाई","ाए","ने","नी","ना","ते","ीं","ती","ता","ाँ","ां","ों","ें"],
    +    ["ाकर","ाइए","ाईं","ाया","ेगी","ेगा","ोगी","ोगे","ाने","ाना","ाते","ाती","ाता","तीं","ाओं","ाएं","ुओं","ुएं","ुआं"],
    +    ["ाएगी","ाएगा","ाओगी","ाओगे","एंगी","ेंगी","एंगे","ेंगे","ूंगी","ूंगा","ातीं","नाओं","नाएं","ताओं","ताएं","ियाँ","ियों","ियां"],
    +    ["ाएंगी","ाएंगे","ाऊंगी","ाऊंगा","ाइयाँ","ाइयों","ाइयां"]
    +]
    +
    +
    +def norm(string):
    +    # normalise base exceptions, e.g. punctuation or currency symbols
    +    if string in BASE_NORMS:
    +        return BASE_NORMS[string]
    +    # set stem word as norm, if available, adapted from:
    +    # http://computing.open.ac.uk/Sites/EACLSouthAsia/Papers/p6-Ramanathan.pdf
    +    # http://research.variancia.com/hindi_stemmer/
    +    # https://github.com/taranjeet/hindi-tokenizer/blob/master/HindiTokenizer.py#L142
    +    for suffix_group in reversed(_stem_suffixes):
    +        length = len(suffix_group[0])
    +        if len(string) <= length:
    +            break
    +        for suffix in suffix_group:
    +            if string.endswith(suffix):
    +                return string[:-length]
    +    return string
    +
    +
    +LEX_ATTRS = {
    +    NORM: norm
    +}
    diff --git a/spacy/lang/hi/stop_words.py b/spacy/lang/hi/stop_words.py
    new file mode 100644
    index 000000000..2ff27c015
    --- /dev/null
    +++ b/spacy/lang/hi/stop_words.py
    @@ -0,0 +1,177 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +
    +# Source: https://github.com/taranjeet/hindi-tokenizer/blob/master/stopwords.txt
    +
    +STOP_WORDS = set("""
    +अत
    +अपना
    +अपनी
    +अपने
    +अभी
    +अंदर
    +आदि
    +आप
    +इत्यादि
    +इन
    +इनका
    +इन्हीं
    +इन्हें
    +इन्हों
    +इस
    +इसका
    +इसकी
    +इसके
    +इसमें
    +इसी
    +इसे
    +उन
    +उनका
    +उनकी
    +उनके
    +उनको
    +उन्हीं
    +उन्हें
    +उन्हों
    +उस
    +उसके
    +उसी
    +उसे
    +एक
    +एवं
    +एस
    +ऐसे
    +और
    +कई
    +कर
    +करता
    +करते
    +करना
    +करने
    +करें
    +कहते
    +कहा
    +का
    +काफ़ी
    +कि
    +कितना
    +किन्हें
    +किन्हों
    +किया
    +किर
    +किस
    +किसी
    +किसे
    +की
    +कुछ
    +कुल
    +के
    +को
    +कोई
    +कौन
    +कौनसा
    +गया
    +घर
    +जब
    +जहाँ
    +जा
    +जितना
    +जिन
    +जिन्हें
    +जिन्हों
    +जिस
    +जिसे
    +जीधर
    +जैसा
    +जैसे
    +जो
    +तक
    +तब
    +तरह
    +तिन
    +तिन्हें
    +तिन्हों
    +तिस
    +तिसे
    +तो
    +था
    +थी
    +थे
    +दबारा
    +दिया
    +दुसरा
    +दूसरे
    +दो
    +द्वारा
    +न
    +नके
    +नहीं
    +ना
    +निहायत
    +नीचे
    +ने
    +पर
    +पहले
    +पूरा
    +पे
    +फिर
    +बनी
    +बही
    +बहुत
    +बाद
    +बाला
    +बिलकुल
    +भी
    +भीतर
    +मगर
    +मानो
    +मे
    +में
    +यदि
    +यह
    +यहाँ
    +यही
    +या
    +यिह
    +ये
    +रखें
    +रहा
    +रहे
    +ऱ्वासा
    +लिए
    +लिये
    +लेकिन
    +व
    +वग़ैरह
    +वर्ग
    +वह
    +वहाँ
    +वहीं
    +वाले
    +वुह
    +वे
    +सकता
    +सकते
    +सबसे
    +सभी
    +साथ
    +साबुत
    +साभ
    +सारा
    +से
    +सो
    +संग
    +ही
    +हुआ
    +हुई
    +हुए
    +है
    +हैं
    +हो
    +होता
    +होती
    +होते
    +होना
    +होने
    +""".split())
    
    From c0aceb9fbecfa0c62b3d3624b627a79e9984c040 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 15:16:41 +0200
    Subject: [PATCH 664/739] Add Hindi to supported languages
    
    ---
     website/models/_data.json | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index f7ba16c9f..ff65d44ef 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -83,6 +83,7 @@
             "ru": "Russian",
             "he": "Hebrew",
             "bn": "Bengali",
    +        "hi": "Hindi",
             "id": "Indonesian",
             "th": "Thai",
             "zh": "Chinese",
    
    From 15514dc333e1333f6001d0eab6ba88e48d0f36df Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Sat, 14 Oct 2017 22:14:47 +0200
    Subject: [PATCH 665/739] Add section on upgrading
    
    ---
     website/usage/_install/_instructions.jade | 34 +++++++++++++++++++++++
     1 file changed, 34 insertions(+)
    
    diff --git a/website/usage/_install/_instructions.jade b/website/usage/_install/_instructions.jade
    index 10132a646..fa4f8b29f 100644
    --- a/website/usage/_install/_instructions.jade
    +++ b/website/usage/_install/_instructions.jade
    @@ -44,6 +44,40 @@ p
         |  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
    
    From 04331816589b1d6310a404add0669ba022a41400 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 12:06:33 +0200
    Subject: [PATCH 666/739] Document operator semantics in Matcher docstring
    
    ---
     spacy/matcher.pyx | 29 +++++++++++++++++++++--------
     1 file changed, 21 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 41d7029f0..58f88fc1a 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -230,14 +230,27 @@ cdef class Matcher:
         def add(self, key, on_match, *patterns):
             """Add a match-rule to the matcher.
             A match-rule consists of: an ID key, an on_match callback, and one or
    -        more patterns. If the key exists, the patterns are appended to the
    -        previous ones, and the previous on_match callback is replaced. The
    -        `on_match` callback will receive the arguments `(matcher, doc, i,
    -        matches)`. You can also set `on_match` to `None` to not perform any
    -        actions. A pattern consists of one or more `token_specs`, where a
    -        `token_spec` is a dictionary mapping attribute IDs to values. Token
    -        descriptors can also include quantifiers. There are currently important
    -        known problems with the quantifiers – see the docs.
    +        more patterns.
    +
    +	If the key exists, the patterns are appended to the previous ones, and
    +	the previous on_match callback is replaced. The `on_match` callback will
    +	receive the arguments `(matcher, doc, i, matches)`. You can also set
    +	`on_match` to `None` to not perform any actions.
    +
    +	A pattern consists of one or more `token_specs`, where a `token_spec`
    +	is a dictionary mapping attribute IDs to values, and optionally a
    +	quantifier operator under the key "op". The available quantifiers are:
    +
    +	'!': Negate the pattern, by requiring it to match exactly 0 times.
    +	'?': Make the pattern optional, by allowing it to match 0 or 1 times.
    +	'+': Require the pattern to match 1 or more times.
    +	'*': Allow the pattern to zero or more times.
    +
    +	The + and * operators are usually interpretted "greedily", i.e. longer
    +	matches are returned where possible. However, if you specify two '+'
    +	and '*' patterns in a row and their matches overlap, the first
    +	operator will behave non-greedily. This quirk in the semantics
    +	makes the matcher more efficient, by avoiding the need for back-tracking.
             """
             for pattern in patterns:
                 if len(pattern) == 0:
    
    From 748d52580107a18c6e9a6ab513772232f87ac530 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 13:38:01 +0200
    Subject: [PATCH 667/739] Add more matcher operator tests
    
    ---
     spacy/tests/test_matcher.py | 37 +++++++++++++++++++++++++++++++++++++
     1 file changed, 37 insertions(+)
    
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index ce6f2d91e..ad6192c8f 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -107,6 +107,7 @@ def test_matcher_empty_dict(en_vocab):
         matches = matcher(doc)
         assert len(matches) == 1
         assert matches[0][1:] == (0, 3)
    +    matcher = Matcher(en_vocab)
         matcher.add('A.', None, [{'ORTH': 'a'}, {}])
         matches = matcher(doc)
         assert matches[0][1:] == (0, 2)
    @@ -175,3 +176,39 @@ def test_matcher_match_one_plus(matcher):
                                              {'ORTH': 'Philippe', 'OP': '+'}])
         m = matcher(doc)
         assert len(m) == 1
    +
    +
    +def test_operator_combos(matcher):
    +    cases = [
    +        ('aaab', 'a a a b', True),
    +        ('aaab', 'a+ b', True),
    +        ('aaab', 'a+ a+ b', True),
    +        ('aaab', 'a+ a+ a b', True),
    +        ('aaab', 'a+ a+ a+ b', True),
    +        ('aaab', 'a+ a a b', True),
    +        ('aaab', 'a+ a a', True),
    +        ('aaab', 'a+', True),
    +        ('aaa', 'a+ b', False),
    +        ('aaa', 'a+ a+ b', False),
    +        ('aaa', 'a+ a+ a+ b', False),
    +        ('aaa', 'a+ a b', False),
    +        ('aaa', 'a+ a a b', False),
    +        ('aaab', 'a+ a a', True),
    +        ('aaab', 'a+', True),
    +        ('aaab', 'a+ a b', False), # <-- This is the weird semantics
    +    ]
    +    for string, pattern_str, result in cases:
    +        matcher = Matcher(matcher.vocab)
    +        doc = get_doc(matcher.vocab, words=list(string))
    +        pattern = []
    +        for part in pattern_str.split():
    +            if part.endswith('+'):
    +                pattern.append({'ORTH': part[0], 'op': '+'})
    +            else:
    +                pattern.append({'ORTH': part})
    +        matcher.add('PATTERN', None, pattern)
    +        matches = matcher(doc)
    +        if result:
    +            assert matches, (string, pattern_str)
    +        else:
    +            assert not matches, (string, pattern_str)
    
    From 56aa42cc5d5371e22b621c9956731fee57d3f893 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 13:38:20 +0200
    Subject: [PATCH 668/739] Fix and document matcher operator 'shadowing'
     behaviour
    
    ---
     spacy/matcher.pyx | 42 ++++++++++++++++++++++--------------------
     1 file changed, 22 insertions(+), 20 deletions(-)
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 58f88fc1a..24d0a9836 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -138,7 +138,10 @@ cdef int get_action(const TokenPatternC* pattern, const TokenC* token) nogil:
             # This is a bandaid over the 'shadowing' problem described here:
             # https://github.com/explosion/spaCy/issues/864
             next_action = get_action(pattern+1, token)
    -        return REPEAT if next_action is REJECT else next_action
    +        if next_action is REJECT:
    +            return REPEAT
    +        else:
    +            return ADVANCE_ZERO
         else:
             return PANIC
     
    @@ -228,29 +231,28 @@ cdef class Matcher:
             return len(self._patterns)
     
         def add(self, key, on_match, *patterns):
    -        """Add a match-rule to the matcher.
    -        A match-rule consists of: an ID key, an on_match callback, and one or
    -        more patterns.
    +        """Add a match-rule to the matcher. A match-rule consists of: an ID key,
    +        an on_match callback, and one or more patterns.
     
    -	If the key exists, the patterns are appended to the previous ones, and
    -	the previous on_match callback is replaced. The `on_match` callback will
    -	receive the arguments `(matcher, doc, i, matches)`. You can also set
    -	`on_match` to `None` to not perform any actions.
    +        If the key exists, the patterns are appended to the previous ones, and
    +        the previous on_match callback is replaced. The `on_match` callback will
    +        receive the arguments `(matcher, doc, i, matches)`. You can also set
    +        `on_match` to `None` to not perform any actions.
     
    -	A pattern consists of one or more `token_specs`, where a `token_spec`
    -	is a dictionary mapping attribute IDs to values, and optionally a
    -	quantifier operator under the key "op". The available quantifiers are:
    +        A pattern consists of one or more `token_specs`, where a `token_spec`
    +        is a dictionary mapping attribute IDs to values, and optionally a
    +        quantifier operator under the key "op". The available quantifiers are:
     
    -	'!': Negate the pattern, by requiring it to match exactly 0 times.
    -	'?': Make the pattern optional, by allowing it to match 0 or 1 times.
    -	'+': Require the pattern to match 1 or more times.
    -	'*': Allow the pattern to zero or more times.
    +        '!': Negate the pattern, by requiring it to match exactly 0 times.
    +        '?': Make the pattern optional, by allowing it to match 0 or 1 times.
    +        '+': Require the pattern to match 1 or more times.
    +        '*': Allow the pattern to zero or more times.
     
    -	The + and * operators are usually interpretted "greedily", i.e. longer
    -	matches are returned where possible. However, if you specify two '+'
    -	and '*' patterns in a row and their matches overlap, the first
    -	operator will behave non-greedily. This quirk in the semantics
    -	makes the matcher more efficient, by avoiding the need for back-tracking.
    +        The + and * operators are usually interpretted "greedily", i.e. longer
    +        matches are returned where possible. However, if you specify two '+'
    +        and '*' patterns in a row and their matches overlap, the first
    +        operator will behave non-greedily. This quirk in the semantics
    +        makes the matcher more efficient, by avoiding the need for back-tracking.
             """
             for pattern in patterns:
                 if len(pattern) == 0:
    
    From 63393b4e0dd9fd63047ff08a12112fb975c7fb3f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 13:44:12 +0200
    Subject: [PATCH 669/739] Update matcher docs to reflect operator changes
    
    ---
     .../_rule-based-matching.jade                 | 29 +++++++++----------
     1 file changed, 13 insertions(+), 16 deletions(-)
    
    diff --git a/website/usage/_linguistic-features/_rule-based-matching.jade b/website/usage/_linguistic-features/_rule-based-matching.jade
    index c006f43c9..a62050282 100644
    --- a/website/usage/_linguistic-features/_rule-based-matching.jade
    +++ b/website/usage/_linguistic-features/_rule-based-matching.jade
    @@ -142,33 +142,30 @@ p
         |  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"])
    ++table([ "OP", "Description"])
         +row
             +cell #[code !]
    -        +cell match exactly 0 times
    -        +cell negation
    +        +cell Negate the pattern, by requiring it to match exactly 0 times.
     
         +row
             +cell #[code *]
    -        +cell match 0 or more times
    -        +cell optional, variable number
    +        +cell Make the pattern optional, by allowing it to match 0 or 1 times.
     
         +row
             +cell #[code +]
    -        +cell match 1 or more times
    -        +cell mandatory, variable number
    +        +cell Require the pattern to match 1 or more times.
     
         +row
             +cell #[code ?]
    -        +cell match 0 or 1 times
    -        +cell optional, max one
    +        +cell Allow the pattern to zero or more times.
    +
    +p
    +    |  The #[code +] and #[code *] operators are usually interpretted
    +    |  "greedily", i.e. longer matches are returned where possible. However, if
    +    |  you specify two #[code +] and #[code *] patterns in a row and their
    +    |  matches overlap, the first operator will behave non-greedily. This quirk
    +    |  in the semantics makes the matcher more efficient, by avoiding the need
    +    |  for back-tracking.
     
     +h(3, "adding-phrase-patterns") Adding phrase patterns
     
    
    From d3c54cf39a7e98ad0568885d89f9306494e2936a Mon Sep 17 00:00:00 2001
    From: Vishnu Kumar Nekkanti 
    Date: Mon, 16 Oct 2017 18:51:33 +0530
    Subject: [PATCH 670/739] fixed SyntaxError while checking for jieba
    
    ---
     spacy/lang/zh/__init__.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/lang/zh/__init__.py b/spacy/lang/zh/__init__.py
    index 46ad3946f..6246fa7ea 100644
    --- a/spacy/lang/zh/__init__.py
    +++ b/spacy/lang/zh/__init__.py
    @@ -10,7 +10,7 @@ class Chinese(Language):
     
         def make_doc(self, text):
             try:
    -            from jieba
    +            import jieba
             except ImportError:
                 raise ImportError("The Chinese tokenizer requires the Jieba library: "
                                   "https://github.com/fxsjy/jieba")
    
    From c29927d2e7ef08a73f9fe0ba74bc77a6df65b2b7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 17:22:18 +0200
    Subject: [PATCH 671/739] Fix matcher test
    
    ---
     spacy/tests/test_matcher.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tests/test_matcher.py b/spacy/tests/test_matcher.py
    index ad6192c8f..9fcb47305 100644
    --- a/spacy/tests/test_matcher.py
    +++ b/spacy/tests/test_matcher.py
    @@ -195,7 +195,7 @@ def test_operator_combos(matcher):
             ('aaa', 'a+ a a b', False),
             ('aaab', 'a+ a a', True),
             ('aaab', 'a+', True),
    -        ('aaab', 'a+ a b', False), # <-- This is the weird semantics
    +        ('aaab', 'a+ a b', True),
         ]
         for string, pattern_str, result in cases:
             matcher = Matcher(matcher.vocab)
    
    From 6ceadcdb5c9b552f3f1c049aa219bcbff6be26b4 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 18:29:56 +0200
    Subject: [PATCH 672/739] Make sure from_disk passes string to numpy (see
     #1421)
    
    If path is a WindowsPath, numpy does not recognise it as a path and as
    a result, doesn't open the file.
    https://github.com/numpy/numpy/blob/master/numpy/lib/npyio.py#L369
    ---
     spacy/util.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 50ebc036b..9262b5df4 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -494,7 +494,7 @@ def from_disk(path, readers, exclude):
         path = ensure_path(path)
         for key, reader in readers.items():
             if key not in exclude:
    -            reader(path / key)
    +            reader(path2str(path / key))
         return path
     
     
    
    From d5418553eb5ee82136754a382c4e6b1b332c1a4f Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 18:30:04 +0200
    Subject: [PATCH 673/739] Fix whitespace
    
    ---
     spacy/util.py | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 9262b5df4..71dff4321 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -584,4 +584,3 @@ def use_gpu(gpu_id):
         Model.ops = CupyOps()
         Model.Ops = CupyOps
         return device
    -
    
    From 59c216196cb0a502ca9214318a17efa4934b1268 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:22:11 +0200
    Subject: [PATCH 674/739] Allow weakrefs on Doc objects
    
    ---
     spacy/tokens/doc.pxd | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/spacy/tokens/doc.pxd b/spacy/tokens/doc.pxd
    index ad2b9876d..f34c455c6 100644
    --- a/spacy/tokens/doc.pxd
    +++ b/spacy/tokens/doc.pxd
    @@ -54,6 +54,8 @@ cdef class Doc:
     
         cdef public object noun_chunks_iterator
     
    +    cdef object __weakref__
    +
         cdef int push_back(self, LexemeOrToken lex_or_tok, bint has_space) except -1
     
         cpdef np.ndarray to_array(self, object features)
    
    From 5c14f3f033232b9329183148e706c0884d9d043f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:22:40 +0200
    Subject: [PATCH 675/739] Create a rolling buffer for the StringStore in
     Language.pipe()
    
    ---
     spacy/language.py | 26 ++++++++++++++++++++++++++
     1 file changed, 26 insertions(+)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 047c94a37..f092c9806 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -8,6 +8,7 @@ import random
     import ujson
     from collections import OrderedDict
     import itertools
    +import weakref
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    @@ -510,8 +511,33 @@ class Language(object):
                 else:
                     # Apply the function, but yield the doc
                     docs = _pipe(proc, docs)
    +        # Track weakrefs of "recent" documents, so that we can see when they
    +        # expire from memory. When they do, we know we don't need old strings.
    +        # This way, we avoid maintaining an unbounded growth in string entries
    +        # in the string store.
    +        recent_refs = weakref.WeakSet()
    +        old_refs = weakref.WeakSet()
    +        original_strings_data = self.vocab.strings.to_bytes()
    +        StringStore = self.vocab.strings.__class__
    +        recent_strings = StringStore().from_bytes(original_strings_data)
    +        nr_seen = 0
             for doc in docs:
                 yield doc
    +            for word in doc:
    +                recent_strings.add(word.text)
    +            recent_refs.add(doc)
    +            if nr_seen < 1000:
    +                old_refs.add(doc)
    +                nr_seen += 1
    +            elif len(old_refs) == 0:
    +                # All the docs in the 'old' set have expired, so the only
    +                # difference between the backup strings and the current
    +                # string-store should be obsolete. We therefore swap out the
    +                # old strings data.
    +                old_refs, recent_refs = recent_refs, old_refs
    +                self.vocab.strings._reset_and_load(recent_strings)
    +                recent_strings = StringStore().from_bytes(original_strings_data)
    +                nr_seen = 0
     
         def to_disk(self, path, disable=tuple()):
             """Save the current state to a directory.  If a model is loaded, this
    
    From 3e037054c88476e11ca6c0bc2e0ee2ce32d0997e Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:23:10 +0200
    Subject: [PATCH 676/739] Remove obsolete is_frozen functionality from
     StringStore
    
    ---
     spacy/strings.pxd |  2 --
     spacy/strings.pyx | 21 +--------------------
     2 files changed, 1 insertion(+), 22 deletions(-)
    
    diff --git a/spacy/strings.pxd b/spacy/strings.pxd
    index 0ad403cf1..4f987baed 100644
    --- a/spacy/strings.pxd
    +++ b/spacy/strings.pxd
    @@ -21,11 +21,9 @@ ctypedef union Utf8Str:
     
     cdef class StringStore:
         cdef Pool mem
    -    cdef bint is_frozen
     
         cdef vector[hash_t] keys
         cdef public PreshMap _map
    -    cdef public PreshMap _oov
     
         cdef const Utf8Str* intern_unicode(self, unicode py_string)
         cdef const Utf8Str* _intern_utf8(self, char* utf8_string, int length)
    diff --git a/spacy/strings.pyx b/spacy/strings.pyx
    index 6f676c79a..29a706996 100644
    --- a/spacy/strings.pyx
    +++ b/spacy/strings.pyx
    @@ -86,8 +86,6 @@ cdef class StringStore:
             """
             self.mem = Pool()
             self._map = PreshMap()
    -        self._oov = PreshMap()
    -        self.is_frozen = freeze
             if strings is not None:
                 for string in strings:
                     self.add(string)
    @@ -243,21 +241,12 @@ cdef class StringStore:
                 self.add(word)
             return self
     
    -    def set_frozen(self, bint is_frozen):
    -        # TODO
    -        self.is_frozen = is_frozen
    -
    -    def flush_oov(self):
    -        self._oov = PreshMap()
    -
    -    def _reset_and_load(self, strings, freeze=False):
    +    def _reset_and_load(self, strings):
             self.mem = Pool()
             self._map = PreshMap()
    -        self._oov = PreshMap()
             self.keys.clear()
             for string in strings:
                 self.add(string)
    -        self.is_frozen = freeze
     
         cdef const Utf8Str* intern_unicode(self, unicode py_string):
             # 0 means missing, but we don't bother offsetting the index.
    @@ -275,14 +264,6 @@ cdef class StringStore:
             value = self._oov.get(key)
             if value is not NULL:
                 return value
    -        if self.is_frozen:
    -            # OOV store uses 32 bit hashes. Pretty ugly :(
    -            key32 = hash32_utf8(utf8_string, length)
    -            # Important: Make the OOV store own the memory. That way it's trivial
    -            # to flush them all.
    -            value = _allocate(self._oov.mem, utf8_string, length)
    -            self._oov.set(key32, value)
    -            return NULL
     
             value = _allocate(self.mem, utf8_string, length)
             self._map.set(key, value)
    
    From a002264fec3f49e85f530bf8cb3d16be0a049071 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:34:21 +0200
    Subject: [PATCH 677/739] Remove caching of Token in Doc, as caused cycle.
    
    ---
     spacy/tokens/doc.pyx   | 13 ++-----------
     spacy/tokens/token.pxd |  3 ---
     2 files changed, 2 insertions(+), 14 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 05d393d2b..bf48cf4f5 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -140,7 +140,6 @@ cdef class Doc:
             self.user_span_hooks = {}
             self.tensor = numpy.zeros((0,), dtype='float32')
             self.user_data = {}
    -        self._py_tokens = []
             self._vector = None
             self.noun_chunks_iterator = _get_chunker(self.vocab.lang)
             cdef unicode orth
    @@ -209,10 +208,7 @@ cdef class Doc:
             if i < 0:
                 i = self.length + i
             bounds_check(i, self.length, PADDING)
    -        if self._py_tokens[i] is not None:
    -            return self._py_tokens[i]
    -        else:
    -            return Token.cinit(self.vocab, &self.c[i], i, self)
    +        return Token.cinit(self.vocab, &self.c[i], i, self)
     
         def __iter__(self):
             """Iterate over `Token`  objects, from which the annotations can be
    @@ -226,10 +222,7 @@ cdef class Doc:
             """
             cdef int i
             for i in range(self.length):
    -            if self._py_tokens[i] is not None:
    -                yield self._py_tokens[i]
    -            else:
    -                yield Token.cinit(self.vocab, &self.c[i], i, self)
    +            yield Token.cinit(self.vocab, &self.c[i], i, self)
     
         def __len__(self):
             """The number of tokens in the document.
    @@ -535,7 +528,6 @@ cdef class Doc:
             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
     
         @cython.boundscheck(False)
    @@ -841,7 +833,6 @@ cdef class Doc:
             # Set the left/right children, left/right edges
             set_children_from_heads(self.c, self.length)
             # Clear the cached Python objects
    -        self._py_tokens = [None] * self.length
             # Return the merged Python object
             return self[start]
     
    diff --git a/spacy/tokens/token.pxd b/spacy/tokens/token.pxd
    index f63a0490c..b408e04eb 100644
    --- a/spacy/tokens/token.pxd
    +++ b/spacy/tokens/token.pxd
    @@ -19,10 +19,7 @@ cdef class Token:
             if offset < 0 or offset >= doc.length:
                 msg = "Attempt to access token at %d, max length %d"
                 raise IndexError(msg % (offset, doc.length))
    -        if doc._py_tokens[offset] != None:
    -            return doc._py_tokens[offset]
             cdef Token self = Token.__new__(Token, vocab, doc, offset)
    -        doc._py_tokens[offset] = self
             return self
     
         #cdef inline TokenC struct_from_attrs(Vocab vocab, attrs):
    
    From 66e2eb8f397c82505d5b44c1b52071fcda2a5a1c Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:34:41 +0200
    Subject: [PATCH 678/739] Clean up remnant of frozen in StringStore
    
    ---
     spacy/strings.pyx | 4 ----
     1 file changed, 4 deletions(-)
    
    diff --git a/spacy/strings.pyx b/spacy/strings.pyx
    index 29a706996..e6926a75d 100644
    --- a/spacy/strings.pyx
    +++ b/spacy/strings.pyx
    @@ -261,10 +261,6 @@ cdef class StringStore:
             cdef Utf8Str* value = self._map.get(key)
             if value is not NULL:
                 return value
    -        value = self._oov.get(key)
    -        if value is not NULL:
    -            return value
    -
             value = _allocate(self.mem, utf8_string, length)
             self._map.set(key, value)
             self.keys.push_back(key)
    
    From 2bc06e4b222c7f38505235b30105bca1d15bf286 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:38:29 +0200
    Subject: [PATCH 679/739] Bump rolling buffer size to 10k
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index f092c9806..7fd56ed56 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -526,7 +526,7 @@ class Language(object):
                 for word in doc:
                     recent_strings.add(word.text)
                 recent_refs.add(doc)
    -            if nr_seen < 1000:
    +            if nr_seen < 10000:
                     old_refs.add(doc)
                     nr_seen += 1
                 elif len(old_refs) == 0:
    
    From 41744771611305363484f046b0271b5f0ea071aa Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 19:50:35 +0200
    Subject: [PATCH 680/739] Fix equality check in test
    
    ---
     spacy/tests/parser/test_parse_navigate.py | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tests/parser/test_parse_navigate.py b/spacy/tests/parser/test_parse_navigate.py
    index 4d909f0d6..da59b0b59 100644
    --- a/spacy/tests/parser/test_parse_navigate.py
    +++ b/spacy/tests/parser/test_parse_navigate.py
    @@ -57,9 +57,9 @@ def test_parser_parse_navigate_consistency(en_tokenizer, text, heads):
         doc = get_doc(tokens.vocab, [t.text for t in tokens], heads=heads)
         for head in doc:
             for child in head.lefts:
    -            assert child.head is head
    +            assert child.head == head
             for child in head.rights:
    -            assert child.head is head
    +            assert child.head == head
     
     
     def test_parser_parse_navigate_child_consistency(en_tokenizer, text, heads):
    
    From d383612225547820cccedf09810bed3177adc929 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 20:31:58 +0200
    Subject: [PATCH 681/739] Add note about word vectors in example (see #1117)
    
    ---
     website/usage/_spacy-101/_lightning-tour.jade | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index ecf57fbc2..7e801b8ef 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -159,6 +159,10 @@ p
     +h(3, "lightning-tour-word-vectors") Get word vectors and similarity
         +tag-model("word vectors")
     
    +p
    +    |  For the best results, you should run this example using the
    +    |  #[+a("/models/en#en_vectors_web_lg") #[code en_vectors_web_lg]] model
    +
     +code.
         doc = nlp(u"Apple and banana are similar. Pasta and hippo aren't.")
         apple = doc[0]
    
    From 18793efef1c505f836e31faa4e88a8174fbaabe1 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 20:36:36 +0200
    Subject: [PATCH 682/739] Remove Russian from v2.0 docs for now
    
    ---
     website/models/_data.json | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/website/models/_data.json b/website/models/_data.json
    index f7ba16c9f..b2898be8a 100644
    --- a/website/models/_data.json
    +++ b/website/models/_data.json
    @@ -80,7 +80,6 @@
             "da": "Danish",
             "hu": "Hungarian",
             "pl": "Polish",
    -        "ru": "Russian",
             "he": "Hebrew",
             "bn": "Bengali",
             "id": "Indonesian",
    
    From 4cfe259266a790189fa3a35965f80990df5e71ba Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 16 Oct 2017 20:36:41 +0200
    Subject: [PATCH 683/739] Fix formatting
    
    ---
     website/usage/_spacy-101/_lightning-tour.jade | 48 +++++++++----------
     1 file changed, 24 insertions(+), 24 deletions(-)
    
    diff --git a/website/usage/_spacy-101/_lightning-tour.jade b/website/usage/_spacy-101/_lightning-tour.jade
    index 7e801b8ef..acc7d5835 100644
    --- a/website/usage/_spacy-101/_lightning-tour.jade
    +++ b/website/usage/_spacy-101/_lightning-tour.jade
    @@ -20,8 +20,8 @@ p
         doc_de = nlp_de(u'Ich bin ein Berliner.')
     
     +infobox
    -    |  #[strong API:] #[+api("spacy#load") #[code spacy.load()]]
    -    |  #[strong Usage:] #[+a("/usage/models") Models],
    +    |  #[+label-inline API:] #[+api("spacy#load") #[code spacy.load()]]
    +    |  #[+label-inline Usage:] #[+a("/usage/models") Models],
         |  #[+a("/usage/spacy-101") spaCy 101]
     
     +h(3, "lightning-tour-tokens-sentences") Get tokens, noun chunks & sentences
    @@ -42,8 +42,8 @@ p
         assert sentences[1].text == u'Peach is the superior emoji.'
     
     +infobox
    -    |  #[strong API:] #[+api("doc") #[code Doc]], #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/usage/spacy-101") spaCy 101]
    +    |  #[+label-inline API:] #[+api("doc") #[code Doc]], #[+api("token") #[code Token]]
    +    |  #[+label-inline Usage:] #[+a("/usage/spacy-101") spaCy 101]
     
     +h(3, "lightning-tour-pos-tags") Get part-of-speech tags and flags
         +tag-model("tagger")
    @@ -63,8 +63,8 @@ p
         assert billion.like_email == False
     
     +infobox
    -    |  #[strong API:] #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#pos-tagging") Part-of-speech tagging]
    +    |  #[+label-inline API:] #[+api("token") #[code Token]]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#pos-tagging") Part-of-speech tagging]
     
     +h(3, "lightning-tour-hashes") Use hash values for any string
     
    @@ -83,8 +83,8 @@ p
         unicorn_text = doc.vocab.strings[unicorn_hash] # '🦄 '
     
     +infobox
    -    |  #[strong API:] #[+api("stringstore") #[code stringstore]]
    -    |  #[strong Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
    +    |  #[+label-inline API:] #[+api("stringstore") #[code stringstore]]
    +    |  #[+label-inline Usage:] #[+a("/usage/spacy-101#vocab") Vocab, hashes and lexemes 101]
     
     +h(3, "lightning-tour-entities") Recongnise and update named entities
         +tag-model("NER")
    @@ -101,7 +101,7 @@ p
         assert ents == [(0, 7, u'ORG')]
     
     +infobox
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#named-entities") Named entity recognition]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#named-entities") Named entity recognition]
     
     +h(3, "lightning-tour-displacy") Visualize a dependency parse and named entities in your browser
         +tag-model("dependency parse", "NER")
    @@ -153,16 +153,12 @@ p
         displacy.serve(doc_ent, style='ent')
     
     +infobox
    -    |  #[strong API:] #[+api("displacy") #[code displacy]]
    -    |  #[strong Usage:] #[+a("/usage/visualizers") Visualizers]
    +    |  #[+label-inline API:] #[+api("displacy") #[code displacy]]
    +    |  #[+label-inline Usage:] #[+a("/usage/visualizers") Visualizers]
     
     +h(3, "lightning-tour-word-vectors") Get word vectors and similarity
         +tag-model("word vectors")
     
    -p
    -    |  For the best results, you should run this example using the
    -    |  #[+a("/models/en#en_vectors_web_lg") #[code en_vectors_web_lg]] model
    -
     +code.
         doc = nlp(u"Apple and banana are similar. Pasta and hippo aren't.")
         apple = doc[0]
    @@ -172,8 +168,12 @@ p
         assert apple.similarity(banana) > pasta.similarity(hippo)
         assert apple.has_vector, banana.has_vector, pasta.has_vector, hippo.has_vector
     
    +p
    +    |  For the best results, you should run this example using the
    +    |  #[+a("/models/en#en_vectors_web_lg") #[code en_vectors_web_lg]] model.
    +
     +infobox
    -    |  #[strong Usage:] #[+a("/usage/vectors-similarity") Word vectors and similarity]
    +    |  #[+label-inline Usage:] #[+a("/usage/vectors-similarity") Word vectors and similarity]
     
     +h(3, "lightning-tour-serialization") Simple and efficient serialization
     
    @@ -190,9 +190,9 @@ p
         new_doc = Doc(Vocab()).from_disk('/moby_dick.bin')
     
     +infobox
    -    |  #[strong API:] #[+api("language") #[code Language]],
    +    |  #[+label-inline API:] #[+api("language") #[code Language]],
         |  #[+api("doc") #[code Doc]]
    -    |  #[strong Usage:] #[+a("/usage/models#saving-loading") Saving and loading models]
    +    |  #[+label-inline Usage:] #[+a("/usage/models#saving-loading") Saving and loading models]
     
     +h(3, "lightning-tour-rule-matcher") Match text with token rules
     
    @@ -213,8 +213,8 @@ p
         matches = nlp(LOTS_OF TEXT)
     
     +infobox
    -    |  #[strong API:] #[+api("matcher") #[code Matcher]]
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#rule-based-matching") Rule-based matching]
    +    |  #[+label-inline API:] #[+api("matcher") #[code Matcher]]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#rule-based-matching") Rule-based matching]
     
     +h(3, "lightning-tour-multi-threaded") Multi-threaded generator
     
    @@ -228,8 +228,8 @@ p
                 break
     
     +infobox
    -    |  #[strong API:] #[+api("doc") #[code Doc]]
    -    |  #[strong Usage:] #[+a("/usage/processing-pipelines#multithreading") Processing pipelines]
    +    |  #[+label-inline API:] #[+api("doc") #[code Doc]]
    +    |  #[+label-inline Usage:] #[+a("/usage/processing-pipelines#multithreading") Processing pipelines]
     
     +h(3, "lightning-tour-dependencies") Get syntactic dependencies
         +tag-model("dependency parse")
    @@ -244,8 +244,8 @@ p
             return dep_labels
     
     +infobox
    -    |  #[strong API:] #[+api("token") #[code Token]]
    -    |  #[strong Usage:] #[+a("/usage/linguistic-features#dependency-parse") Using the dependency parse]
    +    |  #[+label-inline API:] #[+api("token") #[code Token]]
    +    |  #[+label-inline Usage:] #[+a("/usage/linguistic-features#dependency-parse") Using the dependency parse]
     
     +h(3, "lightning-tour-numpy-arrays") Export to numpy arrays
     
    
    From df488274b17a67c9e81566f2fa03cf896d096dc7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Mon, 16 Oct 2017 20:55:00 +0200
    Subject: [PATCH 684/739] Fix deserialization of vectors
    
    ---
     spacy/util.py     | 2 +-
     spacy/vectors.pyx | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index 71dff4321..a67b05eb2 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -494,7 +494,7 @@ def from_disk(path, readers, exclude):
         path = ensure_path(path)
         for key, reader in readers.items():
             if key not in exclude:
    -            reader(path2str(path / key))
    +            reader(path / key)
         return path
     
     
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index 8ce150531..5512279ae 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -12,7 +12,7 @@ from thinc.neural._classes.model import Model
     from .typedefs cimport attr_t
     from .strings cimport StringStore
     from . import util
    -from .compat import basestring_
    +from .compat import basestring_, path2str
     
     
     cdef class Vectors:
    @@ -162,7 +162,7 @@ cdef class Vectors:
         def from_disk(self, path, **exclude):
             def load_keys(path):
                 if path.exists():
    -                self.keys = numpy.load(path)
    +                self.keys = numpy.load(path2str(path))
                     for i, key in enumerate(self.keys):
                         self.keys[i] = key
                         self.key2row[key] = i
    
    From 485c4f6df5763a01b90117632114f96e28c31738 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 17 Oct 2017 02:37:45 +0200
    Subject: [PATCH 685/739] Add Hungarian examples (see #1107)
    
    ---
     spacy/lang/hu/examples.py | 17 +++++++++++++++++
     1 file changed, 17 insertions(+)
     create mode 100644 spacy/lang/hu/examples.py
    
    diff --git a/spacy/lang/hu/examples.py b/spacy/lang/hu/examples.py
    new file mode 100644
    index 000000000..718d7d536
    --- /dev/null
    +++ b/spacy/lang/hu/examples.py
    @@ -0,0 +1,17 @@
    +# coding: utf8
    +from __future__ import unicode_literals
    +
    +
    +"""
    +Example sentences to test spaCy and its language models.
    +
    +>>> from spacy.lang.hu.examples import sentences
    +>>> docs = nlp.pipe(sentences)
    +"""
    +
    +
    +sentences = [
    +    "Az Apple egy brit startup vásárlását tervezi 1 milliárd dollár értékben.",
    +    "San Francisco vezetése mérlegeli a járdát használó szállító robotok betiltását.",
    +    "London az Egyesült Királyság egy nagy városa."
    +]
    
    From 8ca344712d8adb5bdb7c1550667725def9b9bfb3 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 17 Oct 2017 11:20:07 +0200
    Subject: [PATCH 686/739] Add Language.has_pipe method
    
    ---
     spacy/language.py         |  9 +++++++++
     website/api/language.jade | 24 ++++++++++++++++++++++++
     2 files changed, 33 insertions(+)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 7fd56ed56..5a8c3e90c 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -255,6 +255,15 @@ class Language(object):
                 unfound = before or after
                 raise ValueError(msg.format(unfound, self.pipe_names))
     
    +    def has_pipe(self, name):
    +        """Check if a component name is present in the pipeline. Equivalent to
    +        `name in nlp.pipe_names`.
    +
    +        name (unicode): Name of the component.
    +        RETURNS (bool): Whether a component of that name exists in the pipeline.
    +        """
    +        return name in self.pipe_names
    +
         def replace_pipe(self, name, component):
             """Replace a component in the pipeline.
     
    diff --git a/website/api/language.jade b/website/api/language.jade
    index 500d6c411..668cbadd7 100644
    --- a/website/api/language.jade
    +++ b/website/api/language.jade
    @@ -327,6 +327,30 @@ p
             +cell bool
             +cell Insert component last / not last in the pipeline.
     
    ++h(2, "has_pipe") Language.has_pipe
    +    +tag method
    +    +tag-new(2)
    +
    +p
    +    |  Check whether a component is present in the pipeline. Equivalent to
    +    |  #[code name in nlp.pipe_names].
    +
    ++aside-code("Example").
    +    nlp.add_pipe(lambda doc: doc, name='component')
    +    assert 'component' in nlp.pipe_names
    +    assert nlp.has_pipe('component')
    +
    ++table(["Name", "Type", "Description"])
    +    +row
    +        +cell #[code name]
    +        +cell unicode
    +        +cell Name of the pipeline component to check.
    +
    +    +row("foot")
    +        +cell returns
    +        +cell bool
    +        +cell Whether a component of that name exists in the pipeline.
    +
     +h(2, "get_pipe") Language.get_pipe
         +tag method
         +tag-new(2)
    
    From 8f5b60c168f47c1be476627cc1b90f706f19038d Mon Sep 17 00:00:00 2001
    From: Anto Binish Kaspar 
    Date: Tue, 17 Oct 2017 17:15:32 +0530
    Subject: [PATCH 687/739] Fix Language.from_disk overwrites the meta.json file.
    
    ---
     spacy/language.py | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 7fd56ed56..332a814b4 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -585,7 +585,7 @@ class Language(object):
             deserializers = OrderedDict((
                 ('vocab', lambda p: self.vocab.from_disk(p)),
                 ('tokenizer', lambda p: self.tokenizer.from_disk(p, vocab=False)),
    -            ('meta.json', lambda p: p.open('w').write(json_dumps(self.meta)))
    +            ('meta.json', lambda p: self.meta.update(ujson.load(p.open('r'))))
             ))
             for name, proc in self.pipeline:
                 if name in disable:
    
    From 534240648ef9b511048c704bbf4acf3db528ed6b Mon Sep 17 00:00:00 2001
    From: Anto Binish Kaspar 
    Date: Tue, 17 Oct 2017 17:15:58 +0530
    Subject: [PATCH 688/739] Fix trailing whitespace on morphology features
    
    ---
     spacy/symbols.pyx | 126 +++++++++++++++++++++++-----------------------
     1 file changed, 63 insertions(+), 63 deletions(-)
    
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index dd0e38cad..b7f1f4556 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -163,7 +163,7 @@ IDS = {
         "Degree_sup": Degree_sup,
         "Degree_abs": Degree_abs,
         "Degree_com": Degree_com,
    -    "Degree_dim ": Degree_dim, # du
    +    "Degree_dim": Degree_dim, # du
         "Degree_equ": Degree_equ, # U20
         "Evident_nfh": Evident_nfh, # U20
         "Gender_com": Gender_com,
    @@ -189,8 +189,8 @@ IDS = {
         "Number_none": Number_none,
         "Number_plur": Number_plur,
         "Number_sing": Number_sing,
    -    "Number_ptan ": Number_ptan, # bg
    -    "Number_count ": Number_count, # bg, U20
    +    "Number_ptan": Number_ptan, # bg
    +    "Number_count": Number_count, # bg, U20
         "Number_tri": Number_tri, # U20
         "NumType_card": NumType_card,
         "NumType_dist": NumType_dist,
    @@ -235,22 +235,22 @@ IDS = {
         "VerbForm_sup": VerbForm_sup,
         "VerbForm_trans": VerbForm_trans,
         "VerbForm_conv": VerbForm_conv, # U20
    -    "VerbForm_gdv ": VerbForm_gdv, # la,
    +    "VerbForm_gdv": VerbForm_gdv, # la,
         "VerbForm_vnoun": VerbForm_vnoun, # U20
         "Voice_act": Voice_act,
         "Voice_cau": Voice_cau,
         "Voice_pass": Voice_pass,
    -    "Voice_mid ": Voice_mid, # gkc, U20
    -    "Voice_int ": Voice_int, # hb,
    +    "Voice_mid": Voice_mid, # gkc, U20
    +    "Voice_int": Voice_int, # hb,
         "Voice_antip": Voice_antip, # U20
         "Voice_dir": Voice_dir, # U20
         "Voice_inv": Voice_inv, # U20
    -    "Abbr_yes ": Abbr_yes, # cz, fi, sl, U,
    -    "AdpType_prep ": AdpType_prep, # cz, U,
    -    "AdpType_post ": AdpType_post, # U,
    -    "AdpType_voc ": AdpType_voc, # cz,
    -    "AdpType_comprep ": AdpType_comprep, # cz,
    -    "AdpType_circ ": AdpType_circ, # U,
    +    "Abbr_yes": Abbr_yes, # cz, fi, sl, U,
    +    "AdpType_prep": AdpType_prep, # cz, U,
    +    "AdpType_post": AdpType_post, # U,
    +    "AdpType_voc": AdpType_voc, # cz,
    +    "AdpType_comprep": AdpType_comprep, # cz,
    +    "AdpType_circ": AdpType_circ, # U,
         "AdvType_man": AdvType_man,
         "AdvType_loc": AdvType_loc,
         "AdvType_tim": AdvType_tim,
    @@ -260,56 +260,56 @@ IDS = {
         "AdvType_sta": AdvType_sta,
         "AdvType_ex": AdvType_ex,
         "AdvType_adadj": AdvType_adadj,
    -    "ConjType_oper ": ConjType_oper, # cz, U,
    -    "ConjType_comp ": ConjType_comp, # cz, U,
    -    "Connegative_yes ": Connegative_yes, # fi,
    -    "Derivation_minen ": Derivation_minen, # fi,
    -    "Derivation_sti ": Derivation_sti, # fi,
    -    "Derivation_inen ": Derivation_inen, # fi,
    -    "Derivation_lainen ": Derivation_lainen, # fi,
    -    "Derivation_ja ": Derivation_ja, # fi,
    -    "Derivation_ton ": Derivation_ton, # fi,
    -    "Derivation_vs ": Derivation_vs, # fi,
    -    "Derivation_ttain ": Derivation_ttain, # fi,
    -    "Derivation_ttaa ": Derivation_ttaa, # fi,
    -    "Echo_rdp ": Echo_rdp, # U,
    -    "Echo_ech ": Echo_ech, # U,
    -    "Foreign_foreign ": Foreign_foreign, # cz, fi, U,
    -    "Foreign_fscript ": Foreign_fscript, # cz, fi, U,
    -    "Foreign_tscript ": Foreign_tscript, # cz, U,
    -    "Foreign_yes ": Foreign_yes, # sl,
    -    "Gender_dat_masc ": Gender_dat_masc, # bq, U,
    -    "Gender_dat_fem ": Gender_dat_fem, # bq, U,
    -    "Gender_erg_masc ": Gender_erg_masc, # bq,
    -    "Gender_erg_fem ": Gender_erg_fem, # bq,
    -    "Gender_psor_masc ": Gender_psor_masc, # cz, sl, U,
    -    "Gender_psor_fem ": Gender_psor_fem, # cz, sl, U,
    -    "Gender_psor_neut ": Gender_psor_neut, # sl,
    -    "Hyph_yes ": Hyph_yes, # cz, U,
    -    "InfForm_one ": InfForm_one, # fi,
    -    "InfForm_two ": InfForm_two, # fi,
    -    "InfForm_three ": InfForm_three, # fi,
    -    "NameType_geo ": NameType_geo, # U, cz,
    -    "NameType_prs ": NameType_prs, # U, cz,
    -    "NameType_giv ": NameType_giv, # U, cz,
    -    "NameType_sur ": NameType_sur, # U, cz,
    -    "NameType_nat ": NameType_nat, # U, cz,
    -    "NameType_com ": NameType_com, # U, cz,
    -    "NameType_pro ": NameType_pro, # U, cz,
    -    "NameType_oth ": NameType_oth, # U, cz,
    -    "NounType_com ": NounType_com, # U,
    -    "NounType_prop ": NounType_prop, # U,
    -    "NounType_class ": NounType_class, # U,
    -    "Number_abs_sing ": Number_abs_sing, # bq, U,
    -    "Number_abs_plur ": Number_abs_plur, # bq, U,
    -    "Number_dat_sing ": Number_dat_sing, # bq, U,
    -    "Number_dat_plur ": Number_dat_plur, # bq, U,
    -    "Number_erg_sing ": Number_erg_sing, # bq, U,
    -    "Number_erg_plur ": Number_erg_plur, # bq, U,
    -    "Number_psee_sing ": Number_psee_sing, # U,
    -    "Number_psee_plur ": Number_psee_plur, # U,
    -    "Number_psor_sing ": Number_psor_sing, # cz, fi, sl, U,
    -    "Number_psor_plur ": Number_psor_plur, # cz, fi, sl, U,
    +    "ConjType_oper": ConjType_oper, # cz, U,
    +    "ConjType_comp": ConjType_comp, # cz, U,
    +    "Connegative_yes": Connegative_yes, # fi,
    +    "Derivation_minen": Derivation_minen, # fi,
    +    "Derivation_sti": Derivation_sti, # fi,
    +    "Derivation_inen": Derivation_inen, # fi,
    +    "Derivation_lainen": Derivation_lainen, # fi,
    +    "Derivation_ja": Derivation_ja, # fi,
    +    "Derivation_ton": Derivation_ton, # fi,
    +    "Derivation_vs": Derivation_vs, # fi,
    +    "Derivation_ttain": Derivation_ttain, # fi,
    +    "Derivation_ttaa": Derivation_ttaa, # fi,
    +    "Echo_rdp": Echo_rdp, # U,
    +    "Echo_ech": Echo_ech, # U,
    +    "Foreign_foreign": Foreign_foreign, # cz, fi, U,
    +    "Foreign_fscript": Foreign_fscript, # cz, fi, U,
    +    "Foreign_tscript": Foreign_tscript, # cz, U,
    +    "Foreign_yes": Foreign_yes, # sl,
    +    "Gender_dat_masc": Gender_dat_masc, # bq, U,
    +    "Gender_dat_fem": Gender_dat_fem, # bq, U,
    +    "Gender_erg_masc": Gender_erg_masc, # bq,
    +    "Gender_erg_fem": Gender_erg_fem, # bq,
    +    "Gender_psor_masc": Gender_psor_masc, # cz, sl, U,
    +    "Gender_psor_fem": Gender_psor_fem, # cz, sl, U,
    +    "Gender_psor_neut": Gender_psor_neut, # sl,
    +    "Hyph_yes": Hyph_yes, # cz, U,
    +    "InfForm_one": InfForm_one, # fi,
    +    "InfForm_two": InfForm_two, # fi,
    +    "InfForm_three": InfForm_three, # fi,
    +    "NameType_geo": NameType_geo, # U, cz,
    +    "NameType_prs": NameType_prs, # U, cz,
    +    "NameType_giv": NameType_giv, # U, cz,
    +    "NameType_sur": NameType_sur, # U, cz,
    +    "NameType_nat": NameType_nat, # U, cz,
    +    "NameType_com": NameType_com, # U, cz,
    +    "NameType_pro": NameType_pro, # U, cz,
    +    "NameType_oth": NameType_oth, # U, cz,
    +    "NounType_com": NounType_com, # U,
    +    "NounType_prop": NounType_prop, # U,
    +    "NounType_class": NounType_class, # U,
    +    "Number_abs_sing": Number_abs_sing, # bq, U,
    +    "Number_abs_plur": Number_abs_plur, # bq, U,
    +    "Number_dat_sing": Number_dat_sing, # bq, U,
    +    "Number_dat_plur": Number_dat_plur, # bq, U,
    +    "Number_erg_sing": Number_erg_sing, # bq, U,
    +    "Number_erg_plur": Number_erg_plur, # bq, U,
    +    "Number_psee_sing": Number_psee_sing, # U,
    +    "Number_psee_plur": Number_psee_plur, # U,
    +    "Number_psor_sing": Number_psor_sing, # cz, fi, sl, U,
    +    "Number_psor_plur": Number_psor_plur, # cz, fi, sl, U,
         "Number_pauc": Number_pauc, # U20
         "Number_grpa": Number_grpa, # U20
         "Number_grpl": Number_grpl, # U20
    @@ -354,7 +354,7 @@ IDS = {
         "Polite_infm": Polite_infm, # U20
         "Polite_form": Polite_form, # U20
         "Polite_form_elev": Polite_form_elev, # U20
    -    "Polite_form_humb ": Polite_form_humb, # U20
    +    "Polite_form_humb": Polite_form_humb, # U20
         "Prefix_yes": Prefix_yes, # U,
         "PrepCase_npr": PrepCase_npr, # cz,
         "PrepCase_pre": PrepCase_pre, # U,
    
    From ed8da9b11f54705b9b71c4527c8b70d94c7d2ed4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 15:32:56 +0200
    Subject: [PATCH 689/739] Add missing return statement in SentenceSegmenter
    
    ---
     spacy/pipeline.pyx | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/pipeline.pyx b/spacy/pipeline.pyx
    index 5bb4b090e..7c1976dfa 100644
    --- a/spacy/pipeline.pyx
    +++ b/spacy/pipeline.pyx
    @@ -69,6 +69,7 @@ class SentenceSegmenter(object):
     
         def __call__(self, doc):
             doc.user_hooks['sents'] = self.strategy
    +        return doc
     
         @staticmethod
         def split_on_punct(doc):
    
    From 92c1eb2d6f6e13e33f8c74b0b496cb571b354f78 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 16:11:13 +0200
    Subject: [PATCH 690/739] Fix Doc pickling. This also removes need for Binder
     class
    
    ---
     spacy/tokens/doc.pyx | 22 +++++++++++++++++++---
     1 file changed, 19 insertions(+), 3 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index bf48cf4f5..5681df030 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -27,7 +27,7 @@ from ..attrs cimport LENGTH, POS, LEMMA, TAG, DEP, HEAD, SPACY, ENT_IOB, ENT_TYP
     from ..attrs cimport SENT_START
     from ..parts_of_speech cimport CCONJ, PUNCT, NOUN, univ_pos_t
     from ..util import normalize_slice
    -from ..compat import is_config
    +from ..compat import is_config, copy_reg, pickle
     from .. import about
     from .. import util
     from .underscore import Underscore
    @@ -104,7 +104,8 @@ cdef class Doc:
         def has_extension(cls, name):
             return name in Underscore.doc_extensions
     
    -    def __init__(self, Vocab vocab, words=None, spaces=None, orths_and_spaces=None):
    +    def __init__(self, Vocab vocab, words=None, spaces=None, user_data=None,
    +                 orths_and_spaces=None):
             """Create a Doc object.
     
             vocab (Vocab): A vocabulary object, which must match any models you want
    @@ -114,6 +115,8 @@ cdef class Doc:
             spaces (list or None): A list of boolean values, of the same length as
                 words. True means that the word is followed by a space, False means
                 it is not. If `None`, defaults to `[True]*len(words)`
    +        user_data (dict or None): Optional extra data to attach to the Doc.
    + 
             RETURNS (Doc): The newly constructed object.
             """
             self.vocab = vocab
    @@ -139,7 +142,7 @@ cdef class Doc:
             self.user_token_hooks = {}
             self.user_span_hooks = {}
             self.tensor = numpy.zeros((0,), dtype='float32')
    -        self.user_data = {}
    +        self.user_data = {} if user_data is None else user_data
             self._vector = None
             self.noun_chunks_iterator = _get_chunker(self.vocab.lang)
             cdef unicode orth
    @@ -914,3 +917,16 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
             if tokens[i].head == 0 and tokens[i].dep != 0:
                 tokens[tokens[i].l_edge].sent_start = True
     
    +
    +def pickle_doc(doc):
    +    bytes_data = doc.to_bytes(exclude='vocab')
    +    return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
    +
    +
    +def unpickle_doc(vocab, user_data, bytes_data):
    +    doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data)
    +    return doc
    +
    +
    +copy_reg.pickle(Doc, pickle_doc, unpickle_doc)
    +
    
    From a74cba2ffa548e829a56af3a2297c4c0390f0768 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Tue, 17 Oct 2017 16:27:17 +0200
    Subject: [PATCH 691/739] Remove Binder from docs (now covered by Doc API)
    
    ---
     website/api/_data.json                      | 10 +---------
     website/api/binder.jade                     |  7 -------
     website/usage/_spacy-101/_architecture.jade |  4 ----
     website/usage/v2.jade                       |  8 ++++++--
     4 files changed, 7 insertions(+), 22 deletions(-)
     delete mode 100644 website/api/binder.jade
    
    diff --git a/website/api/_data.json b/website/api/_data.json
    index 83b98f1fa..d85b103dc 100644
    --- a/website/api/_data.json
    +++ b/website/api/_data.json
    @@ -31,8 +31,7 @@
                 "StringStore": "stringstore",
                 "Vectors": "vectors",
                 "GoldParse": "goldparse",
    -            "GoldCorpus": "goldcorpus",
    -            "Binder": "binder"
    +            "GoldCorpus": "goldcorpus"
             }
         },
     
    @@ -193,13 +192,6 @@
             "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.",
    diff --git a/website/api/binder.jade b/website/api/binder.jade
    deleted file mode 100644
    index e47cb597d..000000000
    --- a/website/api/binder.jade
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -//- 💫 DOCS > API > BINDER
    -
    -include ../_includes/_mixins
    -
    -p A container class for serializing collections of #[code Doc] objects.
    -
    -+under-construction
    diff --git a/website/usage/_spacy-101/_architecture.jade b/website/usage/_spacy-101/_architecture.jade
    index c9b299036..1a3ed05a3 100644
    --- a/website/usage/_spacy-101/_architecture.jade
    +++ b/website/usage/_spacy-101/_architecture.jade
    @@ -138,7 +138,3 @@ 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/v2.jade b/website/usage/v2.jade
    index 66304c860..bb150de86 100644
    --- a/website/usage/v2.jade
    +++ b/website/usage/v2.jade
    @@ -206,7 +206,7 @@ p
             |  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 API:] #[+api("spacy#load") #[code spacy.load]]
             |  #[+label-inline Usage:] #[+a("/usage/saving-loading") Saving and loading]
     
         +h(3, "features-displacy") displaCy visualizer with Jupyter support
    @@ -387,7 +387,11 @@ p
     
             +row
                 +cell #[code Doc.read_bytes]
    -            +cell #[+api("binder") #[code Binder]]
    +            +cell
    +                |  #[+api("doc#to_bytes") #[code Doc.to_bytes]]
    +                |  #[+api("doc#from_bytes") #[code Doc.from_bytes]]
    +                |  #[+api("doc#to_disk") #[code Doc.to_disk]]
    +                |  #[+api("doc#from_disk") #[code Doc.from_disk]]
     
             +row
                 +cell #[code Token.is_ancestor_of]
    
    From 45d1dd90b1794897d72b25d9090bed785387560f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 17:20:58 +0200
    Subject: [PATCH 692/739] Add tests for pickling doc
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 25 +++++++++++++++++++++++++
     1 file changed, 25 insertions(+)
     create mode 100644 spacy/tests/doc/test_pickle_doc.py
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    new file mode 100644
    index 000000000..81ce22666
    --- /dev/null
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -0,0 +1,25 @@
    +from __future__ import unicode_literals
    +
    +import pickle
    +
    +from ...language import Language
    +
    +
    +def test_pickle_single_doc():
    +    nlp = Language()
    +    doc = nlp(u'pickle roundtrip')
    +    data = pickle.dumps(doc, 1)
    +    doc2 = pickle.loads(data)
    +    assert doc2.text == 'pickle roundtrip'
    +
    +
    +def test_list_of_docs_pickles_efficiently():
    +    nlp = Language()
    +    one_pickled = pickle.dumps(nlp(u'0'), -1)
    +    docs = list(nlp.pipe(str(i) for i in range(100)))
    +    many_pickled = pickle.dumps(docs, -1)
    +    assert len(many_pickled) < (len(one_pickled) * 2)
    +    many_unpickled = pickle.loads(many_pickled)
    +    assert many_unpickled[0].text == '0'
    +    assert many_unpickled[-1].text == '99'
    +    assert len(many_unpickled) == 99
    
    From 0d57b9748ad68002620554b2df06be34527c7503 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:17:45 +0200
    Subject: [PATCH 693/739] Serialize lex_attr_getters with dill, for better
     pickle support
    
    ---
     spacy/vocab.pyx | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index a5f8bf6ad..205e5a2af 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -5,6 +5,7 @@ import bz2
     import ujson
     import re
     import numpy
    +import dill
     
     from libc.string cimport memset, memcpy
     from libc.stdint cimport int32_t
    @@ -419,7 +420,7 @@ def pickle_vocab(vocab):
         morph = vocab.morphology
         length = vocab.length
         data_dir = vocab.data_dir
    -    lex_attr_getters = vocab.lex_attr_getters
    +    lex_attr_getters = dill.dumps(vocab.lex_attr_getters)
     
         lexemes_data = vocab.lexemes_to_bytes()
     
    @@ -435,7 +436,7 @@ def unpickle_vocab(sstore, morphology, data_dir,
         vocab.strings = sstore
         vocab.morphology = morphology
         vocab.data_dir = data_dir
    -    vocab.lex_attr_getters = lex_attr_getters
    +    vocab.lex_attr_getters = dill.loads(lex_attr_getters)
         vocab.lexemes_from_bytes(lexemes_data)
         vocab.length = length
         link_vectors_to_models(vocab)
    
    From 1cc85a89efd6116a904694012ebd150507258c64 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:18:10 +0200
    Subject: [PATCH 694/739] Allow reasonably efficient pickling of Language
     class, using to_bytes() and from_bytes().
    
    ---
     spacy/language.py | 22 +++++++++++++++++-----
     1 file changed, 17 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index 5a8c3e90c..283b19899 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -9,6 +9,7 @@ import ujson
     from collections import OrderedDict
     import itertools
     import weakref
    +import functools
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    @@ -19,14 +20,14 @@ from .syntax.parser import get_templates
     from .pipeline import NeuralDependencyParser, TokenVectorEncoder, NeuralTagger
     from .pipeline import NeuralEntityRecognizer, SimilarityHook, TextCategorizer
     
    -from .compat import json_dumps, izip
    +from .compat import json_dumps, izip, copy_reg
     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 .lang.lex_attrs import LEX_ATTRS, is_stop
     from . import util
     from . import about
     
    @@ -42,7 +43,8 @@ class BaseDefaults(object):
             lemmatizer = cls.create_lemmatizer(nlp)
             lex_attr_getters = dict(cls.lex_attr_getters)
             # This is messy, but it's the minimal working fix to Issue #639.
    -        lex_attr_getters[IS_STOP] = lambda string: string.lower() in cls.stop_words
    +        lex_attr_getters[IS_STOP] = functools.partial(is_stop,
    +                                                      stops=cls.stop_words)
             vocab = Vocab(lex_attr_getters=lex_attr_getters, tag_map=cls.tag_map,
                           lemmatizer=lemmatizer)
             for tag_str, exc in cls.morph_rules.items():
    @@ -135,6 +137,10 @@ class Language(object):
             self.pipeline = []
             self._optimizer = None
     
    +    def __reduce__(self):
    +        bytes_data = self.to_bytes(vocab=False)
    +        return (unpickle_language, (self.vocab, self.meta, bytes_data))
    +
         @property
         def meta(self):
             self._meta.setdefault('lang', self.vocab.lang)
    @@ -608,7 +614,7 @@ class Language(object):
             util.from_disk(path, deserializers, exclude)
             return self
     
    -    def to_bytes(self, disable=[]):
    +    def to_bytes(self, disable=[], **exclude):
             """Serialize the current state to a binary string.
     
             disable (list): Nameds of pipeline components to disable and prevent
    @@ -626,7 +632,7 @@ class Language(object):
                 if not hasattr(proc, 'to_bytes'):
                     continue
                 serializers[i] = lambda proc=proc: proc.to_bytes(vocab=False)
    -        return util.to_bytes(serializers, {})
    +        return util.to_bytes(serializers, exclude)
     
         def from_bytes(self, bytes_data, disable=[]):
             """Load state from a binary string.
    @@ -650,6 +656,12 @@ class Language(object):
             return self
     
     
    +def unpickle_language(vocab, meta, bytes_data):
    +    lang = Language(vocab=vocab)
    +    lang.from_bytes(bytes_data)
    +    return lang
    +
    +
     def _pipe(func, docs):
         for doc in docs:
             func(doc)
    
    From 9ce7d6af8762102bf5c826292e89a2ef29b6bbec Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:19:18 +0200
    Subject: [PATCH 695/739] Make lex attr functions top-level functions, to
     promote pickling
    
    ---
     spacy/lang/lex_attrs.py | 41 +++++++++++++++++++++++++++--------------
     1 file changed, 27 insertions(+), 14 deletions(-)
    
    diff --git a/spacy/lang/lex_attrs.py b/spacy/lang/lex_attrs.py
    index d4beebd26..f0363b05f 100644
    --- a/spacy/lang/lex_attrs.py
    +++ b/spacy/lang/lex_attrs.py
    @@ -122,22 +122,35 @@ def word_shape(text):
                 shape.append(shape_char)
         return ''.join(shape)
     
    +def lower(string): return string.lower()
    +def prefix(string): return string[0]
    +def suffix(string): return string[-3:]
    +def cluster(string): return 0
    +def is_alpha(string): return string.isalpha()
    +def is_digit(string): return string.isdigit()
    +def is_lower(string): return string.islower()
    +def is_space(string): return string.isspace()
    +def is_title(string): return string.istitle()
    +def is_upper(string): return string.isupper()
    +def is_stop(string, stops=set()): return string in stops
    +def is_oov(string): return True
    +def get_prob(string): return -20.
     
     LEX_ATTRS = {
    -    attrs.LOWER: lambda string: string.lower(),
    -    attrs.NORM: lambda string: string.lower(),
    -    attrs.PREFIX: lambda string: string[0],
    -    attrs.SUFFIX: lambda string: string[-3:],
    -    attrs.CLUSTER: lambda string: 0,
    -    attrs.IS_ALPHA: lambda string: string.isalpha(),
    -    attrs.IS_DIGIT: lambda string: string.isdigit(),
    -    attrs.IS_LOWER: lambda string: string.islower(),
    -    attrs.IS_SPACE: lambda string: string.isspace(),
    -    attrs.IS_TITLE: lambda string: string.istitle(),
    -    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.LOWER: lower,
    +    attrs.NORM: lower,
    +    attrs.PREFIX: prefix,
    +    attrs.SUFFIX: suffix,
    +    attrs.CLUSTER: cluster,
    +    attrs.IS_ALPHA: is_alpha,
    +    attrs.IS_DIGIT: is_digit,
    +    attrs.IS_LOWER: is_lower,
    +    attrs.IS_SPACE: is_space,
    +    attrs.IS_TITLE: is_title,
    +    attrs.IS_UPPER: is_upper,
    +    attrs.IS_STOP: is_stop,
    +    attrs.IS_OOV: is_oov,
    +    attrs.PROB: get_prob,
         attrs.LIKE_EMAIL: like_email,
         attrs.LIKE_NUM: like_num,
         attrs.IS_PUNCT: is_punct,
    
    From 8ca97f32a3fa5af7d20937f63430a5d809c5f575 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:19:57 +0200
    Subject: [PATCH 696/739] Fix doc pickling test
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 9 +++++----
     1 file changed, 5 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    index 81ce22666..9bfa442d9 100644
    --- a/spacy/tests/doc/test_pickle_doc.py
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -1,8 +1,7 @@
     from __future__ import unicode_literals
     
    -import pickle
    -
     from ...language import Language
    +from ...compat import pickle, unicode_
     
     
     def test_pickle_single_doc():
    @@ -15,11 +14,13 @@ def test_pickle_single_doc():
     
     def test_list_of_docs_pickles_efficiently():
         nlp = Language()
    +    for i in range(10000):
    +        _ = nlp.vocab[unicode_(i)]
         one_pickled = pickle.dumps(nlp(u'0'), -1)
    -    docs = list(nlp.pipe(str(i) for i in range(100)))
    +    docs = list(nlp.pipe(unicode_(i) for i in range(100)))
         many_pickled = pickle.dumps(docs, -1)
         assert len(many_pickled) < (len(one_pickled) * 2)
         many_unpickled = pickle.loads(many_pickled)
         assert many_unpickled[0].text == '0'
         assert many_unpickled[-1].text == '99'
    -    assert len(many_unpickled) == 99
    +    assert len(many_unpickled) == 100
    
    From 32a8564c79dd9cbee00992b0f07ad5decb4b4dca Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:20:24 +0200
    Subject: [PATCH 697/739] Fix doc pickling
    
    ---
     spacy/tokens/doc.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 5681df030..158cb9220 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -919,7 +919,7 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
     
     
     def pickle_doc(doc):
    -    bytes_data = doc.to_bytes(exclude='vocab')
    +    bytes_data = doc.to_bytes(vocab=False)
         return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
     
     
    
    From 9baa8fe7ecbe014b47b0dcbbe96d01341f5fb008 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:20:52 +0200
    Subject: [PATCH 698/739] Convert closure to functools.partial, to promote
     pickling
    
    ---
     spacy/util.py | 17 +++++++++++------
     1 file changed, 11 insertions(+), 6 deletions(-)
    
    diff --git a/spacy/util.py b/spacy/util.py
    index a67b05eb2..ca5a40f97 100644
    --- a/spacy/util.py
    +++ b/spacy/util.py
    @@ -15,6 +15,7 @@ import io
     import dill
     from collections import OrderedDict
     from thinc.neural._classes.model import Model
    +import functools
     
     import msgpack
     import msgpack_numpy
    @@ -336,12 +337,16 @@ def add_lookups(default_func, *lookups):
         *lookups (dict): Lookup dictionary mapping string to attribute value.
         RETURNS (callable): Lexical attribute getter.
         """
    -    def get_attr(string):
    -        for lookup in lookups:
    -            if string in lookup:
    -                return lookup[string]
    -        return default_func(string)
    -    return get_attr
    +    # This is implemented as functools.partial instead of a closure, to allow
    +    # pickle to work.
    +    return functools.partial(_get_attr_unless_lookup, default_func, lookups)
    +
    +
    +def _get_attr_unless_lookup(default_func, lookups, string):
    +    for lookup in lookups:
    +        if string in lookup:
    +            return lookup[string]
    +    return default_func(string)
     
     
     def update_exc(base_exceptions, *addition_dicts):
    
    From 839de87ca99b1469a0305ded10a7b99abd7a4df7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:21:20 +0200
    Subject: [PATCH 699/739] Make lambda func a named function, for pickling
    
    ---
     spacy/lang/en/__init__.py | 4 +++-
     1 file changed, 3 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/lang/en/__init__.py b/spacy/lang/en/__init__.py
    index 63fd9c2b4..a95e501e1 100644
    --- a/spacy/lang/en/__init__.py
    +++ b/spacy/lang/en/__init__.py
    @@ -16,11 +16,13 @@ from ...language import Language
     from ...attrs import LANG, NORM
     from ...util import update_exc, add_lookups
     
    +def _return_en(_):
    +    return 'en'
     
     class EnglishDefaults(Language.Defaults):
         lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
         lex_attr_getters.update(LEX_ATTRS)
    -    lex_attr_getters[LANG] = lambda text: 'en'
    +    lex_attr_getters[LANG] = _return_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)
    
    From f45973848cf65acf6a1595c10d43bc29553349c1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 18:21:41 +0200
    Subject: [PATCH 700/739] Rename 'tokens' variable 'doc' in tokenizer
    
    ---
     spacy/tokenizer.pyx | 18 +++++++++---------
     1 file changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/spacy/tokenizer.pyx b/spacy/tokenizer.pyx
    index f2d21de44..692357c8a 100644
    --- a/spacy/tokenizer.pyx
    +++ b/spacy/tokenizer.pyx
    @@ -79,9 +79,9 @@ cdef class Tokenizer:
                     "String is too long: %d characters. Max is 2**30." % len(string)
                 )
             cdef int length = len(string)
    -        cdef Doc tokens = Doc(self.vocab)
    +        cdef Doc doc = Doc(self.vocab)
             if length == 0:
    -            return tokens
    +            return doc
             cdef int i = 0
             cdef int start = 0
             cdef bint cache_hit
    @@ -100,11 +100,11 @@ cdef class Tokenizer:
                         # we don't have to create the slice when we hit the cache.
                         span = string[start:i]
                         key = hash_string(span)
    -                    cache_hit = self._try_cache(key, tokens)
    +                    cache_hit = self._try_cache(key, doc)
                         if not cache_hit:
    -                        self._tokenize(tokens, span, key)
    +                        self._tokenize(doc, span, key)
                     if uc == ' ':
    -                    tokens.c[tokens.length - 1].spacy = True
    +                    doc.c[doc.length - 1].spacy = True
                         start = i + 1
                     else:
                         start = i
    @@ -113,11 +113,11 @@ cdef class Tokenizer:
             if start < i:
                 span = string[start:]
                 key = hash_string(span)
    -            cache_hit = self._try_cache(key, tokens)
    +            cache_hit = self._try_cache(key, doc)
                 if not cache_hit:
    -                self._tokenize(tokens, span, key)
    -            tokens.c[tokens.length - 1].spacy = string[-1] == ' ' and not in_ws
    -        return tokens
    +                self._tokenize(doc, span, key)
    +            doc.c[doc.length - 1].spacy = string[-1] == ' ' and not in_ws
    +        return doc
     
         def pipe(self, texts, batch_size=1000, n_threads=2):
             """Tokenize a stream of texts.
    
    From 374819edf827b7be59a57fed9e58d1e920752fd4 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:28:54 +0200
    Subject: [PATCH 701/739] Test user_data deserialization, re #1085
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 17 +++++++++++++++++
     1 file changed, 17 insertions(+)
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    index 9bfa442d9..2571f30ac 100644
    --- a/spacy/tests/doc/test_pickle_doc.py
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -24,3 +24,20 @@ def test_list_of_docs_pickles_efficiently():
         assert many_unpickled[0].text == '0'
         assert many_unpickled[-1].text == '99'
         assert len(many_unpickled) == 100
    +
    +
    +def test_user_data_from_disk():
    +    nlp = Language()
    +    doc = nlp(u'Hello')
    +    doc.user_data[(0, 1)] = False
    +    b = doc.to_bytes()
    +    doc2 = doc.__class__(doc.vocab).from_bytes(b)
    +    assert doc2.user_data[(0, 1)] == False
    +
    +def test_user_data_unpickles():
    +    nlp = Language()
    +    doc = nlp(u'Hello')
    +    doc.user_data[(0, 1)] = False
    +    b = pickle.dumps(doc)
    +    doc2 = pickle.loads(b)
    +    assert doc2.user_data[(0, 1)] == False
    
    From cdb0c426d8961ee381a0bca14d6d869cd1d10d91 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:29:20 +0200
    Subject: [PATCH 702/739] Improve deserialization of user_data, esp. for
     Underscore
    
    ---
     spacy/tokens/doc.pyx | 28 ++++++++++++++++++++++++----
     1 file changed, 24 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 158cb9220..7c67df9c3 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -9,6 +9,7 @@ import numpy
     import numpy.linalg
     import struct
     import dill
    +import msgpack
     
     from libc.string cimport memcpy, memset
     from libc.math cimport sqrt
    @@ -687,14 +688,22 @@ cdef class Doc:
                 all annotations.
             """
             array_head = [LENGTH,SPACY,TAG,LEMMA,HEAD,DEP,ENT_IOB,ENT_TYPE]
    +        # Msgpack doesn't distinguish between lists and tuples, which is
    +        # vexing for user data. As a best guess, we *know* that within
    +        # keys, we must have tuples. In values we just have to hope
    +        # users don't mind getting a list instead of a tuple.
             serializers = {
                 'text': lambda: self.text,
                 'array_head': lambda: array_head,
                 'array_body': lambda: self.to_array(array_head),
                 'sentiment': lambda: self.sentiment,
                 'tensor': lambda: self.tensor,
    -            'user_data': lambda: self.user_data
             }
    +        if 'user_data' not in exclude and self.user_data:
    +            user_data_keys, user_data_values = list(zip(*self.user_data.items()))
    +            serializers['user_data_keys'] = lambda: msgpack.dumps(user_data_keys)
    +            serializers['user_data_values'] = lambda: msgpack.dumps(user_data_values)
    +
             return util.to_bytes(serializers, exclude)
     
         def from_bytes(self, bytes_data, **exclude):
    @@ -711,10 +720,20 @@ cdef class Doc:
                 'array_body': lambda b: None,
                 'sentiment': lambda b: None,
                 'tensor': lambda b: None,
    -            'user_data': lambda user_data: self.user_data.update(user_data)
    +            'user_data_keys': lambda b: None,
    +            'user_data_values': lambda b: None,
             }
     
             msg = util.from_bytes(bytes_data, deserializers, exclude)
    +        # Msgpack doesn't distinguish between lists and tuples, which is
    +        # vexing for user data. As a best guess, we *know* that within
    +        # keys, we must have tuples. In values we just have to hope
    +        # users don't mind getting a list instead of a tuple.
    +        if 'user_data' not in exclude and 'user_data_keys' in msg:
    +            user_data_keys = msgpack.loads(msg['user_data_keys'], use_list=False)
    +            user_data_values = msgpack.loads(msg['user_data_values'])
    +            for key, value in zip(user_data_keys, user_data_values):
    +                self.user_data[key] = value
     
             cdef attr_t[:, :] attrs
             cdef int i, start, end, has_space
    @@ -919,12 +938,13 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
     
     
     def pickle_doc(doc):
    -    bytes_data = doc.to_bytes(vocab=False)
    +    bytes_data = doc.to_bytes(vocab=False, user_data=False)
         return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
     
     
     def unpickle_doc(vocab, user_data, bytes_data):
    -    doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data)
    +    doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data,
    +                                                     exclude='user_data')
         return doc
     
     
    
    From fe844148f6490cd281ff5feb530fdd8941fa1091 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:43:52 +0200
    Subject: [PATCH 703/739] Test pickling hooks
    
    ---
     spacy/tests/doc/test_pickle_doc.py | 11 +++++++++++
     1 file changed, 11 insertions(+)
    
    diff --git a/spacy/tests/doc/test_pickle_doc.py b/spacy/tests/doc/test_pickle_doc.py
    index 2571f30ac..93f06f2c3 100644
    --- a/spacy/tests/doc/test_pickle_doc.py
    +++ b/spacy/tests/doc/test_pickle_doc.py
    @@ -41,3 +41,14 @@ def test_user_data_unpickles():
         b = pickle.dumps(doc)
         doc2 = pickle.loads(b)
         assert doc2.user_data[(0, 1)] == False
    +
    +
    +def test_hooks_unpickle():
    +    def inner_func(d1, d2):
    +        return 'hello!'
    +    nlp = Language()
    +    doc = nlp(u'Hello')
    +    doc.user_hooks['similarity'] = inner_func
    +    b = pickle.dumps(doc)
    +    doc2 = pickle.loads(b)
    +    assert doc2.similarity(None) == 'hello!'
    
    From 394633efce18246af0ddc1839239536a47d71f92 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Tue, 17 Oct 2017 19:44:09 +0200
    Subject: [PATCH 704/739] Make doc pickling support hooks
    
    ---
     spacy/tokens/doc.pyx | 11 +++++++++--
     1 file changed, 9 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 7c67df9c3..809f178f8 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -939,12 +939,19 @@ cdef int set_children_from_heads(TokenC* tokens, int length) except -1:
     
     def pickle_doc(doc):
         bytes_data = doc.to_bytes(vocab=False, user_data=False)
    -    return (unpickle_doc, (doc.vocab, doc.user_data, bytes_data))
    +    hooks_and_data = (doc.user_data, doc.user_hooks, doc.user_span_hooks,
    +                      doc.user_token_hooks)
    +    return (unpickle_doc, (doc.vocab, dill.dumps(hooks_and_data), bytes_data))
     
     
    -def unpickle_doc(vocab, user_data, bytes_data):
    +def unpickle_doc(vocab, hooks_and_data, bytes_data):
    +    user_data, doc_hooks, span_hooks, token_hooks = dill.loads(hooks_and_data)
    + 
         doc = Doc(vocab, user_data=user_data).from_bytes(bytes_data,
                                                          exclude='user_data')
    +    doc.user_hooks.update(doc_hooks)
    +    doc.user_span_hooks.update(span_hooks)
    +    doc.user_token_hooks.update(token_hooks)
         return doc
     
     
    
    From 633a75c7e06fb9b61091412c6cf7add92eadc368 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:45:01 +0200
    Subject: [PATCH 705/739] Break parser batches into sub-batches, sorted by
     length.
    
    ---
     spacy/syntax/nn_parser.pyx | 91 +++++++++++++++++++-------------------
     1 file changed, 45 insertions(+), 46 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 1f4918935..f8e1baf35 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -9,6 +9,7 @@ from collections import Counter, OrderedDict
     import ujson
     import json
     import contextlib
    +import numpy
     
     from libc.math cimport exp
     cimport cython
    @@ -27,7 +28,7 @@ from libc.string cimport memset, memcpy
     from libc.stdlib cimport malloc, calloc, free
     from thinc.typedefs cimport weight_t, class_t, feat_t, atom_t, hash_t
     from thinc.linear.avgtron cimport AveragedPerceptron
    -from thinc.linalg cimport VecVec
    +from thinc.linalg cimport Vec, VecVec
     from thinc.structs cimport SparseArrayC, FeatureC, ExampleC
     from thinc.extra.eg cimport Example
     from thinc.extra.search cimport Beam
    @@ -288,6 +289,8 @@ cdef class Parser:
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    +                print(upper._layers)
    +                print(upper._layers[0]._layers)
     
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
    @@ -391,19 +394,22 @@ cdef class Parser:
                 beam_density = self.cfg.get('beam_density', 0.0)
             cdef Doc doc
             cdef Beam beam
    -        for docs in cytoolz.partition_all(batch_size, docs):
    -            docs = list(docs)
    -            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
    +        for batch in cytoolz.partition_all(batch_size, docs):
    +            batch = list(batch)
    +            by_length = sorted(list(batch), key=lambda doc: len(doc))
    +            for subbatch in cytoolz.partition_all(32, by_length):
    +                subbatch = list(subbatch)
    +                if beam_width == 1:
    +                    parse_states = self.parse_batch(subbatch)
    +                    beams = []
    +                else:
    +                    beams = self.beam_parse(subbatch,
    +                                beam_width=beam_width, beam_density=beam_density)
    +                    parse_states = []
    +                    for beam in beams:
    +                        parse_states.append(beam.at(0))
    +                self.set_annotations(subbatch, parse_states)
    +            yield from batch
     
         def parse_batch(self, docs):
             cdef:
    @@ -437,38 +443,22 @@ cdef class Parser:
             cdef np.ndarray token_ids = numpy.zeros((nr_state, nr_feat), dtype='i')
             cdef np.ndarray is_valid = numpy.zeros((nr_state, nr_class), dtype='i')
             cdef np.ndarray scores
    +        cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
    +        cdef np.ndarray hidden_bias = vec2scores._layers[-1].b
    +
    +        hW = hidden_weights.data
    +        hb = hidden_bias.data
    +        cdef int nr_hidden = hidden_weights.shape[0]
             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(nr_step, num_threads=6,
    -                                                nogil=True):
    -                    self._parse_step(next_step[i],
    -                        feat_weights, nr_class, nr_feat, nr_piece)
    -            else:
    -                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()])
    -                if self.cfg.get('hist_size'):
    -                    scores = vec2scores((vectors, hists))
    -                else:
    -                    scores = vec2scores(vectors)
    -                c_scores = scores.data
    -                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)
    +            for i in cython.parallel.prange(nr_step, num_threads=3,
    +                                            nogil=True):
    +                self._parse_step(next_step[i],
    +                    feat_weights, hW, hb, nr_class, nr_hidden, nr_feat, nr_piece)
                 this_step, next_step = next_step, this_step
                 next_step.clear()
                 for st in this_step:
    @@ -528,24 +518,33 @@ cdef class Parser:
             return beams
     
         cdef void _parse_step(self, StateC* state,
    -            const float* feat_weights,
    -            int nr_class, int nr_feat, int nr_piece) nogil:
    +            const float* feat_weights, const float* hW, const float* hb,
    +            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
             '''This only works with no hidden layers -- fast but inaccurate'''
             token_ids = calloc(nr_feat, sizeof(int))
    -        scores = calloc(nr_class * nr_piece, sizeof(float))
    +        vector = calloc(nr_hidden * nr_piece, sizeof(float))
    +        scores = calloc(nr_class, sizeof(float))
             is_valid = calloc(nr_class, sizeof(int))
     
             state.set_context_tokens(token_ids, nr_feat)
    -        sum_state_features(scores,
    -            feat_weights, token_ids, 1, nr_feat, nr_class * nr_piece)
    +        sum_state_features(vector,
    +            feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    +        for i in range(nr_hidden):
    +            feature = Vec.max(&vector[i*nr_piece], nr_piece)
    +            for j in range(nr_class):
    +                scores[j] += feature * hW[j]
    +            hW += nr_class
    +        for i in range(nr_class):
    +            scores[i] += hb[i]
             self.moves.set_valid(is_valid, state)
    -        guess = arg_maxout_if_valid(scores, is_valid, nr_class, nr_piece)
    +        guess = arg_max_if_valid(scores, is_valid, nr_class)
             action = self.moves.c[guess]
             action.do(state, action.label)
             state.push_hist(guess)
     
             free(is_valid)
             free(scores)
    +        free(vector)
             free(token_ids)
     
         def update(self, docs, golds, drop=0., sgd=None, losses=None):
    
    From 65bf5e85bdab144a034864450628fff969b51c05 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:46:12 +0200
    Subject: [PATCH 706/739] Improve piping in language.pipe
    
    ---
     spacy/language.py | 7 +++----
     1 file changed, 3 insertions(+), 4 deletions(-)
    
    diff --git a/spacy/language.py b/spacy/language.py
    index abfc1a064..c706e532a 100644
    --- a/spacy/language.py
    +++ b/spacy/language.py
    @@ -10,6 +10,7 @@ from collections import OrderedDict
     import itertools
     import weakref
     import functools
    +import tqdm
     
     from .tokenizer import Tokenizer
     from .vocab import Vocab
    @@ -447,11 +448,9 @@ class Language(object):
             golds = list(golds)
             for name, pipe in self.pipeline:
                 if not hasattr(pipe, 'pipe'):
    -                for doc in docs:
    -                    pipe(doc)
    +                docs = (pipe(doc) for doc in docs)
                 else:
    -                docs = list(pipe.pipe(docs))
    -        assert len(docs) == len(golds)
    +                docs = pipe.pipe(docs, batch_size=256)
             for doc, gold in zip(docs, golds):
                 if verbose:
                     print(doc)
    
    From 79fcf8576aa077749c91315d102c0d70d888ca60 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:46:34 +0200
    Subject: [PATCH 707/739] Compile with march=native
    
    ---
     setup.py | 3 ++-
     1 file changed, 2 insertions(+), 1 deletion(-)
    
    diff --git a/setup.py b/setup.py
    index 23b4f9581..2e2b816b7 100755
    --- a/setup.py
    +++ b/setup.py
    @@ -53,7 +53,8 @@ MOD_NAMES = [
     COMPILE_OPTIONS =  {
         'msvc': ['/Ox', '/EHsc'],
         'mingw32' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function'],
    -    'other' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function']
    +    'other' : ['-O3', '-Wno-strict-prototypes', '-Wno-unused-function',
    +               '-march=native']
     }
     
     
    
    From f018f2030ccbc1871732020ff42cb2ebb2277a84 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Wed, 18 Oct 2017 21:48:00 +0200
    Subject: [PATCH 708/739] Try optimized parser forward loop
    
    ---
     spacy/syntax/nn_parser.pxd         | 4 ++--
     spacy/syntax/nn_parser.pyx         | 2 --
     spacy/syntax/transition_system.pyx | 3 ++-
     3 files changed, 4 insertions(+), 5 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd
    index b0b7693b7..fd1d4c9be 100644
    --- a/spacy/syntax/nn_parser.pxd
    +++ b/spacy/syntax/nn_parser.pxd
    @@ -16,7 +16,7 @@ cdef class Parser:
         cdef public object _multitasks
     
         cdef void _parse_step(self, StateC* state,
    -            const float* feat_weights,
    -            int nr_class, int nr_feat, int nr_piece) nogil
    +            const float* feat_weights, const float* hW, const float* hb,
    +            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil
     
         #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f8e1baf35..4846f326e 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -289,8 +289,6 @@ cdef class Parser:
                         zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
                     )
                     upper.is_noop = False
    -                print(upper._layers)
    -                print(upper._layers[0]._layers)
     
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
    diff --git a/spacy/syntax/transition_system.pyx b/spacy/syntax/transition_system.pyx
    index 055129c8b..922fdf97c 100644
    --- a/spacy/syntax/transition_system.pyx
    +++ b/spacy/syntax/transition_system.pyx
    @@ -148,7 +148,8 @@ cdef class TransitionSystem:
     
         def add_action(self, int action, label_name):
             cdef attr_t label_id
    -        if not isinstance(label_name, (int, long)):
    +        if not isinstance(label_name, int) and \
    +        not isinstance(label_name, long):
                 label_id = self.strings.add(label_name)
             else:
                 label_id = label_name
    
    From bbfd7d8d5de70249a949161b7cfee5f21274965d Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 00:25:21 +0200
    Subject: [PATCH 709/739] Clean up parser multi-threading
    
    ---
     spacy/syntax/nn_parser.pxd |   4 +-
     spacy/syntax/nn_parser.pyx | 111 +++++++++++++++++--------------------
     2 files changed, 53 insertions(+), 62 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pxd b/spacy/syntax/nn_parser.pxd
    index fd1d4c9be..1d389609b 100644
    --- a/spacy/syntax/nn_parser.pxd
    +++ b/spacy/syntax/nn_parser.pxd
    @@ -15,8 +15,6 @@ cdef class Parser:
         cdef readonly object cfg
         cdef public object _multitasks
     
    -    cdef void _parse_step(self, StateC* state,
    +    cdef void _parseC(self, StateC* state, 
                 const float* feat_weights, const float* hW, const float* hb,
                 int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil
    -
    -    #cdef int parseC(self, TokenC* tokens, int length, int nr_feat) nogil
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index 4846f326e..fbd950292 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -395,7 +395,7 @@ cdef class Parser:
             for batch in cytoolz.partition_all(batch_size, docs):
                 batch = list(batch)
                 by_length = sorted(list(batch), key=lambda doc: len(doc))
    -            for subbatch in cytoolz.partition_all(32, by_length):
    +            for subbatch in cytoolz.partition_all(8, by_length):
                     subbatch = list(subbatch)
                     if beam_width == 1:
                         parse_states = self.parse_batch(subbatch)
    @@ -412,57 +412,80 @@ cdef class Parser:
         def parse_batch(self, docs):
             cdef:
                 precompute_hiddens state2vec
    -            StateClass state
    +            StateClass stcls
                 Pool mem
                 const float* feat_weights
                 StateC* st
    -            vector[StateC*] next_step, this_step
    -            int nr_class, nr_feat, nr_piece, nr_dim, nr_state
    +            vector[StateC*] states
    +            int guess, nr_class, nr_feat, nr_piece, nr_dim, nr_state, nr_step
    +            int j
             if isinstance(docs, Doc):
                 docs = [docs]
     
             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
             nr_piece = state2vec.nP
     
    -        states = self.moves.init_batch(docs)
    -        for state in states:
    -            if not state.c.is_final():
    -                next_step.push_back(state.c)
    -
    +        state_objs = self.moves.init_batch(docs)
    +        for stcls in state_objs:
    +            if not stcls.c.is_final():
    +                states.push_back(stcls.c)
    +                
             feat_weights = state2vec.get_feat_weights()
             cdef int i
    -        cdef np.ndarray token_ids = numpy.zeros((nr_state, nr_feat), dtype='i')
    -        cdef np.ndarray is_valid = numpy.zeros((nr_state, nr_class), dtype='i')
    -        cdef np.ndarray scores
             cdef np.ndarray hidden_weights = numpy.ascontiguousarray(vec2scores._layers[-1].W.T)
             cdef np.ndarray hidden_bias = vec2scores._layers[-1].b
     
             hW = hidden_weights.data
             hb = hidden_bias.data
             cdef int nr_hidden = hidden_weights.shape[0]
    -        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()
    -            for i in cython.parallel.prange(nr_step, num_threads=3,
    -                                            nogil=True):
    -                self._parse_step(next_step[i],
    -                    feat_weights, hW, hb, nr_class, nr_hidden, nr_feat, nr_piece)
    -            this_step, next_step = next_step, this_step
    -            next_step.clear()
    -            for st in this_step:
    -                if not st.is_final():
    -                    next_step.push_back(st)
    -        return states
    +       
    +        with nogil:
    +            for i in cython.parallel.prange(states.size(), num_threads=2,
    +                                            schedule='guided'):
    +                self._parseC(states[i],
    +                    feat_weights, hW, hb,
    +                    nr_class, nr_hidden, nr_feat, nr_piece)
    +        return state_objs
    +
    +    cdef void _parseC(self, StateC* state, 
    +            const float* feat_weights, const float* hW, const float* hb,
    +            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
    +        token_ids = calloc(nr_feat, sizeof(int))
    +        is_valid = calloc(nr_class, sizeof(int))
    +        vectors = calloc(nr_hidden * nr_piece, sizeof(float))
    +        scores = calloc(nr_class, sizeof(float))
    +        
    +        while not state.is_final():
    +            state.set_context_tokens(token_ids, nr_feat)
    +            memset(vectors, 0, nr_hidden * nr_piece * sizeof(float))
    +            memset(scores, 0, nr_class * sizeof(float))
    +            sum_state_features(vectors,
    +                feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    +            V = vectors
    +            W = hW
    +            for i in range(nr_hidden):
    +                feature = V[0] if V[0] >= V[1] else V[1]
    +                for j in range(nr_class):
    +                    scores[j] += feature * W[j]
    +                W += nr_class
    +                V += nr_piece
    +            for i in range(nr_class):
    +                scores[i] += hb[i]
    +            self.moves.set_valid(is_valid, state)
    +            guess = arg_max_if_valid(scores, is_valid, nr_class)
    +            action = self.moves.c[guess]
    +            action.do(state, action.label)
    +            state.push_hist(guess)
    +        free(token_ids)
    +        free(is_valid)
    +        free(vectors)
    +        free(scores)
     
         def beam_parse(self, docs, int beam_width=3, float beam_density=0.001):
             cdef Beam beam
    @@ -515,36 +538,6 @@ cdef class Parser:
                 beams.append(beam)
             return beams
     
    -    cdef void _parse_step(self, StateC* state,
    -            const float* feat_weights, const float* hW, const float* hb,
    -            int nr_class, int nr_hidden, int nr_feat, int nr_piece) nogil:
    -        '''This only works with no hidden layers -- fast but inaccurate'''
    -        token_ids = calloc(nr_feat, sizeof(int))
    -        vector = calloc(nr_hidden * nr_piece, sizeof(float))
    -        scores = calloc(nr_class, sizeof(float))
    -        is_valid = calloc(nr_class, sizeof(int))
    -
    -        state.set_context_tokens(token_ids, nr_feat)
    -        sum_state_features(vector,
    -            feat_weights, token_ids, 1, nr_feat, nr_hidden * nr_piece)
    -        for i in range(nr_hidden):
    -            feature = Vec.max(&vector[i*nr_piece], nr_piece)
    -            for j in range(nr_class):
    -                scores[j] += feature * hW[j]
    -            hW += nr_class
    -        for i in range(nr_class):
    -            scores[i] += hb[i]
    -        self.moves.set_valid(is_valid, state)
    -        guess = arg_max_if_valid(scores, is_valid, nr_class)
    -        action = self.moves.c[guess]
    -        action.do(state, action.label)
    -        state.push_hist(guess)
    -
    -        free(is_valid)
    -        free(scores)
    -        free(vector)
    -        free(token_ids)
    -
         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
    
    From 960788aaa2681ba5c33ceac257f46d7a6389f949 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 00:42:34 +0200
    Subject: [PATCH 710/739] Eliminate dead code in parser, and raise errors for
     obsolete options
    
    ---
     spacy/syntax/nn_parser.pyx | 79 ++++++++------------------------------
     1 file changed, 16 insertions(+), 63 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index fbd950292..f5c0454bc 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -241,54 +241,32 @@ cdef class Parser:
         @classmethod
         def Model(cls, nr_class, **cfg):
             depth = util.env_opt('parser_hidden_depth', cfg.get('hidden_depth', 1))
    +        if depth != 1:
    +            raise ValueError("Currently parser depth is hard-coded to 1.")
    +        parser_maxout_pieces = util.env_opt('parser_maxout_pieces', cfg.get('maxout_pieces', 2))
    +        if parser_maxout_pieces != 2:
    +            raise ValueError("Currently parser_maxout_pieces is hard-coded to 2")
             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")
    +        if hist_size != 0:
    +            raise ValueError("Currently history size is hard-coded to 0")
    +        if hist_width != 0: 
    +            raise ValueError("Currently history width is hard-coded to 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,
    -                        nI=token_vector_width)
    -        else:
    -            lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    -                        nF=cls.nr_feature,
    -                        nP=parser_maxout_pieces,
    -                        nI=token_vector_width)
    +        lower = PrecomputableMaxouts(hidden_width if depth >= 1 else nr_class,
    +                    nF=cls.nr_feature, nP=parser_maxout_pieces,
    +                    nI=token_vector_width)
     
             with Model.use_device('cpu'):
    -            if depth == 0:
    -                upper = chain()
    -                upper.is_noop = True
    -            elif hist_size and depth == 1:
    -                upper = chain(
    -                    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
    +            upper = chain(
    +                clone(LayerNorm(Maxout(hidden_width, hidden_width)), depth-1),
    +                zero_init(Affine(nr_class, hidden_width, drop_factor=0.0))
    +            )
     
             # TODO: This is an unfortunate hack atm!
             # Used to set input dimensions in network.
    @@ -959,31 +937,6 @@ cdef int arg_max_if_valid(const weight_t* scores, const int* is_valid, int n) no
         return best
     
     
    -cdef int arg_maxout_if_valid(const weight_t* scores, const int* is_valid,
    -                             int n, int nP) nogil:
    -    cdef int best = -1
    -    cdef float best_score = 0
    -    for i in range(n):
    -        if is_valid[i] >= 1:
    -            for j in range(nP):
    -                if best == -1 or scores[i*nP+j] > best_score:
    -                    best = i
    -                    best_score = scores[i*nP+j]
    -    return best
    -
    -
    -cdef int _arg_max_clas(const weight_t* scores, int move, const Transition* actions,
    -                       int nr_class) except -1:
    -    cdef weight_t score = 0
    -    cdef int mode = -1
    -    cdef int i
    -    for i in range(nr_class):
    -        if actions[i].move == move and (mode == -1 or scores[i] >= score):
    -            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
    
    From d4cfff0476bbef90acfba037d805a1b21449f5d7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 00:47:24 +0200
    Subject: [PATCH 711/739] Comment out currently hard-coded hyper-params
    
    ---
     website/api/_top-level/_cli.jade | 32 ++++++++++++++++----------------
     1 file changed, 16 insertions(+), 16 deletions(-)
    
    diff --git a/website/api/_top-level/_cli.jade b/website/api/_top-level/_cli.jade
    index b2a9c574d..fc573e0ec 100644
    --- a/website/api/_top-level/_cli.jade
    +++ b/website/api/_top-level/_cli.jade
    @@ -315,30 +315,30 @@ p
             +cell Number of rows in embedding tables.
             +cell #[code 7500]
     
    -    +row
    -        +cell #[code parser_maxout_pieces]
    -        +cell Number of pieces in the parser's and NER's first maxout layer.
    -        +cell #[code 2]
    +    //- +row
    +    //-     +cell #[code parser_maxout_pieces]
    +    //-     +cell Number of pieces in the parser's and NER's first maxout layer.
    +    //-     +cell #[code 2]
     
    -    +row
    -        +cell #[code parser_hidden_depth]
    -        +cell Number of hidden layers in the parser and NER.
    -        +cell #[code 1]
    +    //- +row
    +    //-     +cell #[code parser_hidden_depth]
    +    //-     +cell Number of hidden layers in the parser and NER.
    +    //-     +cell #[code 1]
     
         +row
             +cell #[code hidden_width]
             +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_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 history_width]
    +    //-     +cell Number of embedding dimensions for each action ID.
    +    //-     +cell #[code 128]
     
         +row
             +cell #[code learn_rate]
    
    From bf415fd7782c430135033ce40705d7d392743730 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 19 Oct 2017 00:53:08 +0200
    Subject: [PATCH 712/739] Add test for serializing extension attrs (see #1085)
    
    ---
     .../test_serialize_extension_attrs.py         | 27 +++++++++++++++++++
     1 file changed, 27 insertions(+)
     create mode 100644 spacy/tests/serialize/test_serialize_extension_attrs.py
    
    diff --git a/spacy/tests/serialize/test_serialize_extension_attrs.py b/spacy/tests/serialize/test_serialize_extension_attrs.py
    new file mode 100644
    index 000000000..8919ebe1e
    --- /dev/null
    +++ b/spacy/tests/serialize/test_serialize_extension_attrs.py
    @@ -0,0 +1,27 @@
    +# coding: utf-8
    +from __future__ import unicode_literals
    +
    +import pytest
    +
    +from ...tokens.doc import Doc
    +from ...vocab import Vocab
    +
    +
    +@pytest.fixture
    +def doc_w_attrs(en_tokenizer):
    +    Doc.set_extension('_test_attr', default=False)
    +    Doc.set_extension('_test_prop', getter=lambda doc: len(doc.text))
    +    Doc.set_extension('_test_method', method=lambda doc, arg: "{}{}".format(len(doc.text), arg))
    +    doc = en_tokenizer("This is a test.")
    +    doc._._test_attr = 'test'
    +    return doc
    +
    +
    +
    +def test_serialize_ext_attrs_from_bytes(doc_w_attrs):
    +    doc_b = doc_w_attrs.to_bytes()
    +    doc = Doc(Vocab()).from_bytes(doc_b)
    +    assert doc._.has('_test_attr')
    +    assert doc._._test_attr == 'test'
    +    assert doc._._test_prop == len(doc.text)
    +    assert doc._._test_method('test') == '{}{}'.format(len(doc.text), 'test')
    
    From 24512420b1e0be23480dd4c71208d9e925907267 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Thu, 19 Oct 2017 00:53:49 +0200
    Subject: [PATCH 713/739] Show error if data_path does not exist or is None
     (see #1102)
    
    ---
     spacy/cli/link.py | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/spacy/cli/link.py b/spacy/cli/link.py
    index 712a05aee..5b333dae5 100644
    --- a/spacy/cli/link.py
    +++ b/spacy/cli/link.py
    @@ -27,6 +27,13 @@ def link(cmd, origin, link_name, force=False, model_path=None):
         if not model_path.exists():
             prints("The data should be located in %s" % path2str(model_path),
                    title="Can't locate model data", exits=1)
    +    data_path = util.get_data_path()
    +    if not data_path or not data_path.exists():
    +        spacy_loc = Path(__file__).parent.parent
    +        prints("Make sure a directory `/data` exists within your spaCy "
    +               "installation and try again. The data directory should be "
    +               "located here:", path2str(spacy_loc), exits=1,
    +               title="Can't find the spaCy data path to create model symlink")
         link_path = util.get_data_path() / link_name
         if link_path.exists() and not force:
             prints("To overwrite an existing link, use the --force flag.",
    
    From 906c50ac5997c33feb0ecb82d32faacf8b0b50e0 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 01:48:39 +0200
    Subject: [PATCH 714/739] Fix loop typing, that caused error on windows
    
    ---
     spacy/syntax/nn_parser.pyx | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f5c0454bc..f79837fae 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -422,9 +422,9 @@ cdef class Parser:
             hW = hidden_weights.data
             hb = hidden_bias.data
             cdef int nr_hidden = hidden_weights.shape[0]
    -       
    +        cdef int nr_task = states.size()
             with nogil:
    -            for i in cython.parallel.prange(states.size(), num_threads=2,
    +            for i in cython.parallel.prange(nr_task, num_threads=2,
                                                 schedule='guided'):
                     self._parseC(states[i],
                         feat_weights, hW, hb,
    
    From 15e5a04a8d9a1be29844332295eea85bedae12fc Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Thu, 19 Oct 2017 01:48:43 +0200
    Subject: [PATCH 715/739] Clean up more depth=0 conditional code
    
    ---
     spacy/syntax/nn_parser.pyx | 21 ++++++---------------
     1 file changed, 6 insertions(+), 15 deletions(-)
    
    diff --git a/spacy/syntax/nn_parser.pyx b/spacy/syntax/nn_parser.pyx
    index f79837fae..cb26b8d37 100644
    --- a/spacy/syntax/nn_parser.pyx
    +++ b/spacy/syntax/nn_parser.pyx
    @@ -38,7 +38,7 @@ from murmurhash.mrmr cimport hash64
     from preshed.maps cimport MapStruct
     from preshed.maps cimport map_get
     
    -from thinc.api import layerize, chain, noop, clone, with_flatten
    +from thinc.api import layerize, chain, clone, with_flatten
     from thinc.v2v import Model, Maxout, Softmax, Affine, ReLu, SELU
     from thinc.misc import LayerNorm
     
    @@ -768,20 +768,11 @@ cdef class Parser:
             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
    +            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, pipeline=None, **cfg):
             if 'model' in cfg:
    
    From 7b9b1be44cae4d13c4e1f0881372701982b61a33 Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Thu, 19 Oct 2017 17:00:41 +0530
    Subject: [PATCH 716/739] Support single value for attribute list in
     doc.to_array
    
    ---
     .github/contributors/ramananbalakrishnan.md | 106 ++++++++++++++++++++
     spacy/tokens/doc.pyx                        |   6 ++
     2 files changed, 112 insertions(+)
     create mode 100644 .github/contributors/ramananbalakrishnan.md
    
    diff --git a/.github/contributors/ramananbalakrishnan.md b/.github/contributors/ramananbalakrishnan.md
    new file mode 100644
    index 000000000..804c41f56
    --- /dev/null
    +++ b/.github/contributors/ramananbalakrishnan.md
    @@ -0,0 +1,106 @@
    +# spaCy contributor agreement
    +
    +This spaCy Contributor Agreement (**"SCA"**) is based on the
    +[Oracle Contributor Agreement](http://www.oracle.com/technetwork/oca-405177.pdf).
    +The SCA applies to any contribution that you make to any product or project
    +managed by us (the **"project"**), and sets out the intellectual property rights
    +you grant to us in the contributed materials. The term **"us"** shall mean
    +[ExplosionAI UG (haftungsbeschränkt)](https://explosion.ai/legal). The term
    +**"you"** shall mean the person or entity identified below.
    +
    +If you agree to be bound by these terms, fill in the information requested
    +below and include the filled-in version with your first pull request, under the
    +folder [`.github/contributors/`](/.github/contributors/). The name of the file
    +should be your GitHub username, with the extension `.md`. For example, the user
    +example_user would create the file `.github/contributors/example_user.md`.
    +
    +Read this agreement carefully before signing. These terms and conditions
    +constitute a binding legal agreement.
    +
    +## Contributor Agreement
    +
    +1. The term "contribution" or "contributed materials" means any source code,
    +object code, patch, tool, sample, graphic, specification, manual,
    +documentation, or any other material posted or submitted by you to the project.
    +
    +2. With respect to any worldwide copyrights, or copyright applications and
    +registrations, in your contribution:
    +
    +    * you hereby assign to us joint ownership, and to the extent that such
    +    assignment is or becomes invalid, ineffective or unenforceable, you hereby
    +    grant to us a perpetual, irrevocable, non-exclusive, worldwide, no-charge,
    +    royalty-free, unrestricted license to exercise all rights under those
    +    copyrights. This includes, at our option, the right to sublicense these same
    +    rights to third parties through multiple levels of sublicensees or other
    +    licensing arrangements;
    +
    +    * you agree that each of us can do all things in relation to your
    +    contribution as if each of us were the sole owners, and if one of us makes
    +    a derivative work of your contribution, the one who makes the derivative
    +    work (or has it made will be the sole owner of that derivative work;
    +
    +    * you agree that you will not assert any moral rights in your contribution
    +    against us, our licensees or transferees;
    +
    +    * you agree that we may register a copyright in your contribution and
    +    exercise all ownership rights associated with it; and
    +
    +    * you agree that neither of us has any duty to consult with, obtain the
    +    consent of, pay or render an accounting to the other for any use or
    +    distribution of your contribution.
    +
    +3. With respect to any patents you own, or that you can license without payment
    +to any third party, you hereby grant to us a perpetual, irrevocable,
    +non-exclusive, worldwide, no-charge, royalty-free license to:
    +
    +    * make, have made, use, sell, offer to sell, import, and otherwise transfer
    +    your contribution in whole or in part, alone or in combination with or
    +    included in any product, work or materials arising out of the project to
    +    which your contribution was submitted, and
    +
    +    * at our option, to sublicense these same rights to third parties through
    +    multiple levels of sublicensees or other licensing arrangements.
    +
    +4. Except as set out above, you keep all right, title, and interest in your
    +contribution. The rights that you grant to us under these terms are effective
    +on the date you first submitted a contribution to us, even if your submission
    +took place before the date you sign these terms.
    +
    +5. You covenant, represent, warrant and agree that:
    +
    +    * Each contribution that you submit is and shall be an original work of
    +    authorship and you can legally grant the rights set out in this SCA;
    +
    +    * to the best of your knowledge, each contribution will not violate any
    +    third party's copyrights, trademarks, patents, or other intellectual
    +    property rights; and
    +
    +    * each contribution shall be in compliance with U.S. export control laws and
    +    other applicable export and import laws. You agree to notify us if you
    +    become aware of any circumstance which would make any of the foregoing
    +    representations inaccurate in any respect. We may publicly disclose your 
    +    participation in the project, including the fact that you have signed the SCA.
    +
    +6. This SCA is governed by the laws of the State of California and applicable
    +U.S. Federal law. Any choice of law rules will not apply.
    +
    +7. Please place an “x” on one of the applicable statement below. Please do NOT
    +mark both statements:
    +
    +    * [x] I am signing on behalf of myself as an individual and no other person
    +    or entity, including my employer, has or will have rights with respect to my
    +    contributions.
    +
    +    * [ ] I am signing on behalf of my employer or a legal entity and I have the
    +    actual authority to contractually bind that entity.
    +
    +## Contributor Details
    +
    +| Field                          | Entry                |
    +|------------------------------- | -------------------- |
    +| Name                           | Ramanan Balakrishnan |
    +| Company name (if applicable)   |                      |
    +| Title or role (if applicable)  |                      |
    +| Date                           | 2017-10-19           |
    +| GitHub username                | ramananbalakrishnan  |
    +| Website (optional)             |                      |
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 809f178f8..ad5358d9a 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -554,13 +554,19 @@ cdef class Doc:
             cdef int i, j
             cdef attr_id_t feature
             cdef np.ndarray[attr_t, ndim=2] output
    +        cdef np.ndarray[attr_t, ndim=1] output_1D
             # Make an array from the attributes --- otherwise our inner loop is Python
             # dict iteration.
    +        if( type(py_attr_ids) is not list and type(py_attr_ids) is not tuple ):
    +            py_attr_ids = [ py_attr_ids ]
             cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
             output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
                     output[i, j] = get_token_attr(&self.c[i], feature)
    +        if( len(attr_ids) == 1 ):
    +            output_1D = output.reshape((self.length))
    +            return output_1D
             return output
     
         def count_by(self, attr_id_t attr_id, exclude=None, PreshCounter counts=None):
    
    From b3ab124fc5ad9934a166cf6a21995571cbf4de8b Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Thu, 19 Oct 2017 19:37:14 +0530
    Subject: [PATCH 717/739] Support strings for attribute list in doc.to_array
    
    ---
     spacy/tests/doc/test_array.py | 20 ++++++++++++++++++++
     spacy/tokens/doc.pyx          | 27 +++++++++++++++++++--------
     2 files changed, 39 insertions(+), 8 deletions(-)
    
    diff --git a/spacy/tests/doc/test_array.py b/spacy/tests/doc/test_array.py
    index dd87aa763..ff10394d1 100644
    --- a/spacy/tests/doc/test_array.py
    +++ b/spacy/tests/doc/test_array.py
    @@ -17,6 +17,26 @@ def test_doc_array_attr_of_token(en_tokenizer, en_vocab):
         assert feats_array[0][0] != feats_array[0][1]
     
     
    +def test_doc_stringy_array_attr_of_token(en_tokenizer, en_vocab):
    +    text = "An example sentence"
    +    tokens = en_tokenizer(text)
    +    example = tokens.vocab["example"]
    +    assert example.orth != example.shape
    +    feats_array = tokens.to_array((ORTH, SHAPE))
    +    feats_array_stringy = tokens.to_array(("ORTH", "SHAPE"))
    +    assert feats_array_stringy[0][0] == feats_array[0][0]
    +    assert feats_array_stringy[0][1] == feats_array[0][1]
    +
    +
    +def test_doc_scalar_attr_of_token(en_tokenizer, en_vocab):
    +    text = "An example sentence"
    +    tokens = en_tokenizer(text)
    +    example = tokens.vocab["example"]
    +    assert example.orth != example.shape
    +    feats_array = tokens.to_array(ORTH)
    +    assert feats_array.shape == (3,)
    +
    +
     def test_doc_array_tag(en_tokenizer):
         text = "A nice sentence."
         pos = ['DET', 'ADJ', 'NOUN', 'PUNCT']
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index ad5358d9a..6e7230428 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -21,7 +21,7 @@ from .token cimport Token
     from .printers import parse_tree
     from ..lexeme cimport Lexeme, EMPTY_LEXEME
     from ..typedefs cimport attr_t, flags_t
    -from ..attrs import intify_attrs
    +from ..attrs import intify_attrs, IDS
     from ..attrs cimport attr_id_t
     from ..attrs cimport ID, ORTH, NORM, LOWER, SHAPE, PREFIX, SUFFIX, LENGTH, CLUSTER
     from ..attrs cimport LENGTH, POS, LEMMA, TAG, DEP, HEAD, SPACY, ENT_IOB, ENT_TYPE
    @@ -536,11 +536,15 @@ cdef class Doc:
     
         @cython.boundscheck(False)
         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.
    +        """Export given token attributes to a numpy `ndarray`.
     
    -        attr_ids (list[int]): A list of attribute ID ints.
    +	If `attr_ids` is a sequence of M attributes, the output array will
    +	be of shape `(N, M)`, where N is the length of the `Doc`
    +	(in tokens). If `attr_ids` is a single attribute, the output shape will
    +	be (N,). You can specify attributes by integer ID (e.g. spacy.attrs.LEMMA)
    +	or string name (e.g. 'LEMMA' or 'lemma').
    +
    +        attr_ids (list[]): A list of attributes (int IDs or string names).
             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`.
    @@ -555,11 +559,18 @@ cdef class Doc:
             cdef attr_id_t feature
             cdef np.ndarray[attr_t, ndim=2] output
             cdef np.ndarray[attr_t, ndim=1] output_1D
    -        # Make an array from the attributes --- otherwise our inner loop is Python
    -        # dict iteration.
    +        # Handle scalar/list inputs of strings/ints for py_attr_ids
             if( type(py_attr_ids) is not list and type(py_attr_ids) is not tuple ):
                 py_attr_ids = [ py_attr_ids ]
    -        cdef np.ndarray[attr_t, ndim=1] attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
    +        py_attr_ids_input = []
    +        for py_attr_id in py_attr_ids:
    +            if( type(py_attr_id) is int ):
    +                py_attr_ids_input.append(py_attr_id)
    +            else:
    +                py_attr_ids_input.append(IDS[py_attr_id.upper()])
    +        # 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_input, dtype=numpy.uint64)
             output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
    
    From d44a079fe3d8958fd4e76690a45e77f85d3ea67c Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Fri, 20 Oct 2017 14:25:38 +0530
    Subject: [PATCH 718/739] Update documentation on doc.to_array
    
    ---
     website/api/doc.jade | 26 +++++++++++++++++++-------
     1 file changed, 19 insertions(+), 7 deletions(-)
    
    diff --git a/website/api/doc.jade b/website/api/doc.jade
    index dce6b89e0..ceb564c7a 100644
    --- a/website/api/doc.jade
    +++ b/website/api/doc.jade
    @@ -336,28 +336,40 @@ p
         +tag method
     
     p
    -    |  Export the document annotations to a numpy array of shape #[code N*M]
    -    |  where #[code N] is the length of the document and #[code M] is the number
    -    |  of attribute IDs to export. The values will be 32-bit integers.
    +    |  Export given token attributes to a numpy #[code ndarray].
    +    |  If #[code attr_ids] is a sequence of #[code M] attributes,
    +    |  the output array will  be of shape #[code (N, M)], where #[code N]
    +    |  is the length of the #[code Doc] (in tokens). If #[code attr_ids] is
    +    |  a single attribute, the output shape will be #[code (N,)]. You can
    +    |  specify attributes by integer ID (e.g. #[code spacy.attrs.LEMMA])
    +    |  or string name (e.g. 'LEMMA' or 'lemma'). The values will be 64-bit
    +    |  integers.
     
     +aside-code("Example").
         from spacy.attrs import LOWER, POS, ENT_TYPE, IS_ALPHA
         doc = nlp(text)
         # All strings mapped to integers, for easy export to numpy
         np_array = doc.to_array([LOWER, POS, ENT_TYPE, IS_ALPHA])
    +    np_array = doc.to_array("POS")
     
     +table(["Name", "Type", "Description"])
         +row
             +cell #[code attr_ids]
    -        +cell list
    -        +cell A list of attribute ID ints.
    +        +cell list or int or string
    +        +cell
    +            | A list of attributes (int IDs or string names) or
    +            | a single attribute (int ID or string name)
     
         +row("foot")
             +cell returns
    -        +cell #[code.u-break numpy.ndarray[ndim=2, dtype='int32']]
    +        +cell
    +            | #[code.u-break numpy.ndarray[ndim=2, dtype='uint64']] or
    +            | #[code.u-break numpy.ndarray[ndim=1, dtype='uint64']] or
             +cell
                 |  The exported attributes as a 2D numpy array, with one row per
    -            |  token and one column per attribute.
    +            |  token and one column per attribute (when #[code attr_ids] is a
    +            |  list), or as a 1D numpy array, with one item per attribute (when
    +            |  #[code attr_ids] is a single value).
     
     +h(2, "from_array") Doc.from_array
         +tag method
    
    From 4acab77a8a36c6f54cacf5e26b32860a30d09657 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 20 Oct 2017 13:07:57 +0200
    Subject: [PATCH 719/739] Add missing symbol for LAW entities (resolves #1427)
    
    ---
     spacy/symbols.pxd                            | 1 +
     spacy/symbols.pyx                            | 1 +
     website/api/_annotation/_named-entities.jade | 4 ++++
     3 files changed, 6 insertions(+)
    
    diff --git a/spacy/symbols.pxd b/spacy/symbols.pxd
    index e981de6ae..4f1d35cf8 100644
    --- a/spacy/symbols.pxd
    +++ b/spacy/symbols.pxd
    @@ -467,3 +467,4 @@ cdef enum symbol_t:
     # We therefore wait until the next data version to add them.
     # acl
     
    +    LAW
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index b7f1f4556..f64577309 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -458,6 +458,7 @@ IDS = {
         "rcmod": rcmod,
         "root": root,
         "xcomp": xcomp
    +    "LAW": LAW
     }
     
     def sort_nums(x):
    diff --git a/website/api/_annotation/_named-entities.jade b/website/api/_annotation/_named-entities.jade
    index 476659d4a..93e705c72 100644
    --- a/website/api/_annotation/_named-entities.jade
    +++ b/website/api/_annotation/_named-entities.jade
    @@ -37,6 +37,10 @@
             +cell #[code WORK_OF_ART]
             +cell Titles of books, songs, etc.
     
    +    +row
    +        +cell #[code LAW]
    +        +cell Named documents made into laws.
    +
         +row
             +cell #[code LANGUAGE]
             +cell Any named language.
    
    From 108f1f786e62b1fc713ca20ff9a1aaf32665824b Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Fri, 20 Oct 2017 13:08:44 +0200
    Subject: [PATCH 720/739] Update symbols and document missing token attributes
     (see #1439)
    
    ---
     spacy/symbols.pxd      | 23 ++++++-----------------
     spacy/symbols.pyx      | 13 ++++++++-----
     website/api/token.jade | 20 ++++++++++++++++++++
     3 files changed, 34 insertions(+), 22 deletions(-)
    
    diff --git a/spacy/symbols.pxd b/spacy/symbols.pxd
    index 4f1d35cf8..6960681a3 100644
    --- a/spacy/symbols.pxd
    +++ b/spacy/symbols.pxd
    @@ -13,12 +13,12 @@ cdef enum symbol_t:
         LIKE_EMAIL
         IS_STOP
         IS_OOV
    +    IS_BRACKET
    +    IS_QUOTE
    +    IS_LEFT_PUNCT
    +    IS_RIGHT_PUNCT
     
    -    FLAG14 = 14
    -    FLAG15
    -    FLAG16
    -    FLAG17
    -    FLAG18
    +    FLAG18 = 18
         FLAG19
         FLAG20
         FLAG21
    @@ -455,16 +455,5 @@ cdef enum symbol_t:
         root
         xcomp
     
    -# Move these up to FLAG14--FLAG18 once we finish the functionality
    -# and are ready to regenerate the model.
    -#IS_BRACKET
    -#IS_QUOTE
    -#IS_LEFT_PUNCT
    -#IS_RIGHT_PUNCT
    -
    -# These symbols are currently missing. However, if we add them currently,
    -# we'll throw off the integer index and the model will have to be retrained.
    -# We therefore wait until the next data version to add them.
    -# acl
    -
    +    acl
         LAW
    diff --git a/spacy/symbols.pyx b/spacy/symbols.pyx
    index f64577309..0e0337b6e 100644
    --- a/spacy/symbols.pyx
    +++ b/spacy/symbols.pyx
    @@ -18,10 +18,11 @@ IDS = {
         "LIKE_EMAIL": LIKE_EMAIL,
         "IS_STOP": IS_STOP,
         "IS_OOV": IS_OOV,
    -    "FLAG14": FLAG14,
    -    "FLAG15": FLAG15,
    -    "FLAG16": FLAG16,
    -    "FLAG17": FLAG17,
    +    "IS_BRACKET": IS_BRACKET,
    +    "IS_QUOTE": IS_QUOTE,
    +    "IS_LEFT_PUNCT": IS_LEFT_PUNCT,
    +    "IS_RIGHT_PUNCT": IS_RIGHT_PUNCT,
    +
         "FLAG18": FLAG18,
         "FLAG19": FLAG19,
         "FLAG20": FLAG20,
    @@ -457,7 +458,9 @@ IDS = {
         "quantmod": quantmod,
         "rcmod": rcmod,
         "root": root,
    -    "xcomp": xcomp
    +    "xcomp": xcomp,
    +
    +    "acl": acl,
         "LAW": LAW
     }
     
    diff --git a/website/api/token.jade b/website/api/token.jade
    index 465d44c66..4062594b4 100644
    --- a/website/api/token.jade
    +++ b/website/api/token.jade
    @@ -586,6 +586,16 @@ p The L2 norm of the token's vector representation.
             +cell bool
             +cell Is the token punctuation?
     
    +    +row
    +        +cell #[code is_left_punct]
    +        +cell bool
    +        +cell Is the token a left punctuation mark, e.g. #[code (]?
    +
    +    +row
    +        +cell #[code is_right_punct]
    +        +cell bool
    +        +cell Is the token a right punctuation mark, e.g. #[code )]?
    +
         +row
             +cell #[code is_space]
             +cell bool
    @@ -593,6 +603,16 @@ p The L2 norm of the token's vector representation.
                 |  Does the token consist of whitespace characters? Equivalent to
                 |  #[code token.text.isspace()].
     
    +    +row
    +        +cell #[code is_bracket]
    +        +cell bool
    +        +cell Is the token a bracket?
    +
    +    +row
    +        +cell #[code is_quote]
    +        +cell bool
    +        +cell Is the token a quotation mark?
    +
         +row
             +cell #[code like_url]
             +cell bool
    
    From 072694656376b423e5b53c2742b733d90b416bee Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Fri, 20 Oct 2017 17:09:37 +0530
    Subject: [PATCH 721/739] cleanup to_array implementation using fixes on master
    
    ---
     spacy/tokens/doc.pyx | 25 +++++++++++--------------
     1 file changed, 11 insertions(+), 14 deletions(-)
    
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 6e7230428..9351ba366 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -557,28 +557,25 @@ cdef class Doc:
             """
             cdef int i, j
             cdef attr_id_t feature
    +        cdef np.ndarray[attr_t, ndim=1] attr_ids
             cdef np.ndarray[attr_t, ndim=2] output
    -        cdef np.ndarray[attr_t, ndim=1] output_1D
             # Handle scalar/list inputs of strings/ints for py_attr_ids
    -        if( type(py_attr_ids) is not list and type(py_attr_ids) is not tuple ):
    -            py_attr_ids = [ py_attr_ids ]
    -        py_attr_ids_input = []
    -        for py_attr_id in py_attr_ids:
    -            if( type(py_attr_id) is int ):
    -                py_attr_ids_input.append(py_attr_id)
    -            else:
    -                py_attr_ids_input.append(IDS[py_attr_id.upper()])
    +        if not hasattr(py_attr_ids, '__iter__'):
    +            py_attr_ids = [py_attr_ids]
    +
    +        # Allow strings, e.g. 'lemma' or 'LEMMA'
    +        py_attr_ids = [(IDS[id_.upper()] if hasattr(id_, 'upper') else id_)
    +                       for id_ in py_attr_ids]
             # 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_input, dtype=numpy.uint64)
    +        attr_ids = numpy.asarray(py_attr_ids, dtype=numpy.uint64)
             output = numpy.ndarray(shape=(self.length, len(attr_ids)), dtype=numpy.uint64)
             for i in range(self.length):
                 for j, feature in enumerate(attr_ids):
                     output[i, j] = get_token_attr(&self.c[i], feature)
    -        if( len(attr_ids) == 1 ):
    -            output_1D = output.reshape((self.length))
    -            return output_1D
    -        return output
    +        # Handle 1d case
    +        return output if len(attr_ids) >= 2 else output.reshape((self.length,))
    +
     
         def count_by(self, attr_id_t attr_id, exclude=None, PreshCounter counts=None):
             """Count the frequencies of a given attribute. Produces a dict of
    
    From 92ac9316b5f3ff79db1c3ec44be54f8c4dfe95dc Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 13:59:24 +0200
    Subject: [PATCH 722/739] Fix initialization of vectors, to address
     serialization problem
    
    ---
     spacy/vectors.pyx | 12 +++++-------
     spacy/vocab.pyx   | 10 ++++------
     2 files changed, 9 insertions(+), 13 deletions(-)
    
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index 5512279ae..cea583110 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -32,22 +32,20 @@ cdef class Vectors:
         cdef public object keys
         cdef public int i
     
    -    def __init__(self, strings, data_or_width=0):
    +    def __init__(self, strings, data=None, 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')
    +        if data is not None:
    +            self.data = numpy.asarray(data, dtype='f')
             else:
    -            data = data_or_width
    +            self.data = numpy.zeros((len(self.strings), width), dtype='f')
             self.i = 0
    -        self.data = data
             self.key2row = {}
    -        self.keys = np.ndarray((self.data.shape[0],), dtype='uint64')
    +        self.keys = numpy.zeros((self.data.shape[0],), dtype='uint64')
     
         def __reduce__(self):
             return (Vectors, (self.strings, self.data))
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 205e5a2af..e6ba9944b 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -62,12 +62,10 @@ cdef class Vocab:
             if strings:
                 for string in strings:
                     _ = self[string]
    -        for name in tag_map.keys():
    -            if name:
    -                self.strings.add(name)
             self.lex_attr_getters = lex_attr_getters
    +        print("Create morphology", list(self.strings), tag_map)
             self.morphology = Morphology(self.strings, tag_map, lemmatizer)
    -        self.vectors = Vectors(self.strings)
    +        self.vectors = Vectors(self.strings, width=0)
     
         property lang:
             def __get__(self):
    @@ -338,7 +336,7 @@ cdef class Vocab:
                 if self.vectors is None:
                     return None
                 else:
    -                return self.vectors.to_bytes(exclude='strings.json')
    +                return self.vectors.to_bytes()
     
             getters = OrderedDict((
                 ('strings', lambda: self.strings.to_bytes()),
    @@ -358,7 +356,7 @@ cdef class Vocab:
                 if self.vectors is None:
                     return None
                 else:
    -                return self.vectors.from_bytes(b, exclude='strings')
    +                return self.vectors.from_bytes(b)
             setters = OrderedDict((
                 ('strings', lambda b: self.strings.from_bytes(b)),
                 ('lexemes', lambda b: self.lexemes_from_bytes(b)),
    
    From 6218af0105d1514089ecd76c4cbf6fec31d50423 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 13:59:57 +0200
    Subject: [PATCH 723/739] Remove cpdef enum, to avoid too much code generation
    
    ---
     spacy/morphology.pxd | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/morphology.pxd b/spacy/morphology.pxd
    index be6711bfd..9192f351f 100644
    --- a/spacy/morphology.pxd
    +++ b/spacy/morphology.pxd
    @@ -44,7 +44,7 @@ cdef class Morphology:
         cdef int assign_feature(self, uint64_t* morph, univ_morph_t feat_id, bint value) except -1
     
     
    -cpdef enum univ_morph_t:
    +cdef enum univ_morph_t:
         NIL = 0
         Animacy_anim = symbols.Animacy_anim
         Animacy_inam
    
    From 506cf2eb1389da6149f97de7db80df52ed0d2d1f Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:00:23 +0200
    Subject: [PATCH 724/739] Remove cpdef enum, to avoid too much code generation
    
    ---
     spacy/morphology.pyx | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 4a1a0aa54..65b46fe08 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -426,3 +426,7 @@ IDS = {
     
     
     NAMES = [key for key, value in sorted(IDS.items(), key=lambda item: item[1])]
    +# 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)
    
    From 49895fbef69598d18fd00197661ec3ad939de849 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:01:12 +0200
    Subject: [PATCH 725/739] Rename 'SP' special tag to '_SP'
    
    Renaming the tag with an underscore lets us add it to the tag map
    without worrying that we'll change the sequence of tags, which throws
    off the tag-to-ID mapping. For instance, if we inserted a 'SP' tag,
    the "VERB" tag is pushed to a different class ID, and the model is all
    messed up.
    ---
     spacy/lang/de/tag_map.py |  2 +-
     spacy/lang/en/tag_map.py |  4 +--
     spacy/lang/es/tag_map.py |  2 +-
     spacy/lang/th/tag_map.py | 77 ++++++++++++++++++++--------------------
     spacy/morphology.pyx     | 14 ++++++--
     5 files changed, 54 insertions(+), 45 deletions(-)
    
    diff --git a/spacy/lang/de/tag_map.py b/spacy/lang/de/tag_map.py
    index d16bd17e0..730c15cfc 100644
    --- a/spacy/lang/de/tag_map.py
    +++ b/spacy/lang/de/tag_map.py
    @@ -62,5 +62,5 @@ TAG_MAP = {
         "VVIZU":    {POS: VERB, "VerbForm": "inf"},
         "VVPP":     {POS: VERB, "Aspect": "perf", "VerbForm": "part"},
         "XY":       {POS: X},
    -    "SP":       {POS: SPACE}
    +    "_SP":      {POS: SPACE}
     }
    diff --git a/spacy/lang/en/tag_map.py b/spacy/lang/en/tag_map.py
    index a674c17e3..76eabf307 100644
    --- a/spacy/lang/en/tag_map.py
    +++ b/spacy/lang/en/tag_map.py
    @@ -55,11 +55,11 @@ TAG_MAP = {
         "WP":       {POS: NOUN, "PronType": "int|rel"},
         "WP$":      {POS: ADJ, "Poss": "yes", "PronType": "int|rel"},
         "WRB":      {POS: ADV, "PronType": "int|rel"},
    -    "SP":       {POS: SPACE},
         "ADD":      {POS: X},
         "NFP":      {POS: PUNCT},
         "GW":       {POS: X},
         "XX":       {POS: X},
         "BES":      {POS: VERB},
    -    "HVS":      {POS: VERB}
    +    "HVS":      {POS: VERB},
    +    "_SP":       {POS: SPACE},
     }
    diff --git a/spacy/lang/es/tag_map.py b/spacy/lang/es/tag_map.py
    index 86dd48620..2095d23b1 100644
    --- a/spacy/lang/es/tag_map.py
    +++ b/spacy/lang/es/tag_map.py
    @@ -303,5 +303,5 @@ TAG_MAP = {
         "VERB__VerbForm=Ger": {"morph": "VerbForm=Ger", "pos": "VERB"},
         "VERB__VerbForm=Inf": {"morph": "VerbForm=Inf", "pos": "VERB"},
         "X___": {"morph": "_", "pos": "X"},
    -    "SP": {"morph": "_", "pos": "SPACE"},
    +    "_SP": {"morph": "_", "pos": "SPACE"},
     }
    diff --git a/spacy/lang/th/tag_map.py b/spacy/lang/th/tag_map.py
    index 40e5ac44c..570871820 100644
    --- a/spacy/lang/th/tag_map.py
    +++ b/spacy/lang/th/tag_map.py
    @@ -19,63 +19,64 @@ TAG_MAP = {
         "NPRP":     {POS: PRON},
         # ADJ
         "ADJ":      {POS: ADJ},
    -    "NONM":      {POS: ADJ},
    -    "VATT":      {POS: ADJ},
    -    "DONM":      {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},
    +    "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},
    +    "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},
    +    "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},
    +    "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},
    +    "XVBM":     {POS: AUX},
    +    "XVAM":     {POS: AUX},
    +    "XVMM":     {POS: AUX},
    +    "XVBB":     {POS: AUX},
    +    "XVAE":     {POS: AUX},
     	# ADP
         "ADP":      {POS: ADP},
    -    "RPRE":      {POS: ADP},
    +    "RPRE":     {POS: ADP},
         # CCONJ
         "CCONJ":    {POS: CCONJ},
    -    "JCRG":    {POS: CCONJ},
    +    "JCRG":     {POS: CCONJ},
     	# SCONJ
         "SCONJ":    {POS: SCONJ},
    -    "PREL":    {POS: SCONJ},
    -    "JSBR":    {POS: SCONJ},
    -    "JCMP":    {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},
    +    "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}
    +    "PUNC":     {POS: PUNCT},
    +    "_SP":      {POS: SPACE}
     }
    diff --git a/spacy/morphology.pyx b/spacy/morphology.pyx
    index 65b46fe08..7845ab4e7 100644
    --- a/spacy/morphology.pyx
    +++ b/spacy/morphology.pyx
    @@ -4,7 +4,7 @@ from __future__ import unicode_literals
     
     from libc.string cimport memset
     
    -from .parts_of_speech cimport ADJ, VERB, NOUN, PUNCT
    +from .parts_of_speech cimport ADJ, VERB, NOUN, PUNCT, SPACE
     from .attrs cimport POS, IS_SPACE
     from .parts_of_speech import IDS as POS_IDS
     from .lexeme cimport Lexeme
    @@ -36,14 +36,22 @@ cdef class Morphology:
         def __init__(self, StringStore string_store, tag_map, lemmatizer, exc=None):
             self.mem = Pool()
             self.strings = string_store
    +        # Add special space symbol. We prefix with underscore, to make sure it
    +        # always sorts to the end.
    +        space_attrs = tag_map.pop('SP', {POS: SPACE})
    +        if '_SP' not in tag_map:
    +            self.strings.add('_SP')
    +            tag_map = dict(tag_map)
    +            tag_map['_SP'] = space_attrs
    +        self.tag_names = tuple(sorted(tag_map.keys()))
             self.tag_map = {}
             self.lemmatizer = lemmatizer
             self.n_tags = len(tag_map)
    -        self.tag_names = tuple(sorted(tag_map.keys()))
             self.reverse_index = {}
     
             self.rich_tags = self.mem.alloc(self.n_tags+1, sizeof(RichTagC))
             for i, (tag_str, attrs) in enumerate(sorted(tag_map.items())):
    +            self.strings.add(tag_str)
                 self.tag_map[tag_str] = dict(attrs)
                 attrs = _normalize_props(attrs)
                 attrs = intify_attrs(attrs, self.strings, _do_deprecated=True)
    @@ -93,7 +101,7 @@ cdef class Morphology:
             # the statistical model fails.
             # Related to Issue #220
             if Lexeme.c_check_flag(token.lex, IS_SPACE):
    -            tag_id = self.reverse_index[self.strings.add('SP')]
    +            tag_id = self.reverse_index[self.strings.add('_SP')]
             rich_tag = self.rich_tags[tag_id]
             analysis = self._cache.get(tag_id, token.lex.orth)
             if analysis is NULL:
    
    From ebecaddb765713aaaf7f5b2f51488f39f66655d9 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:17:15 +0200
    Subject: [PATCH 726/739] Make 'data_or_width' two keyword args in
     Vectors.__init__
    
    Previously the data and width options were one argument in Vectors,
    which meant you couldn't say vectors = Vectors(strings, width=300).
    It's better to have two keywords.
    ---
     spacy/tests/vectors/test_vectors.py |  8 ++++----
     website/api/vectors.jade            | 15 +++++++++------
     2 files changed, 13 insertions(+), 10 deletions(-)
    
    diff --git a/spacy/tests/vectors/test_vectors.py b/spacy/tests/vectors/test_vectors.py
    index 798871edd..74ac26a10 100644
    --- a/spacy/tests/vectors/test_vectors.py
    +++ b/spacy/tests/vectors/test_vectors.py
    @@ -35,18 +35,18 @@ def vocab(en_vocab, vectors):
     
     
     def test_init_vectors_with_data(strings, data):
    -    v = Vectors(strings, data)
    +    v = Vectors(strings, data=data)
         assert v.shape == data.shape
     
     def test_init_vectors_with_width(strings):
    -    v = Vectors(strings, 3)
    +    v = Vectors(strings, width=3)
         for string in strings:
             v.add(string)
         assert v.shape == (len(strings), 3)
     
     
     def test_get_vector(strings, data):
    -    v = Vectors(strings, data)
    +    v = Vectors(strings, data=data)
         for string in strings:
             v.add(string)
         assert list(v[strings[0]]) == list(data[0])
    @@ -56,7 +56,7 @@ def test_get_vector(strings, data):
     
     def test_set_vector(strings, data):
         orig = data.copy()
    -    v = Vectors(strings, data)
    +    v = Vectors(strings, data=data)
         for string in strings:
             v.add(string)
         assert list(v[strings[0]]) == list(orig[0])
    diff --git a/website/api/vectors.jade b/website/api/vectors.jade
    index a58736506..e08f34643 100644
    --- a/website/api/vectors.jade
    +++ b/website/api/vectors.jade
    @@ -12,7 +12,7 @@ p
     
     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
    +    |  #[code 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").
    @@ -21,11 +21,11 @@ p
     
         empty_vectors = Vectors(StringStore())
     
    -    vectors = Vectors([u'cat'], 300)
    +    vectors = Vectors([u'cat'], width=300)
         vectors[u'cat'] = numpy.random.uniform(-1, 1, (300,))
     
         vector_table = numpy.zeros((3, 300), dtype='f')
    -    vectors = Vectors(StringStore(), vector_table)
    +    vectors = Vectors(StringStore(), data=vector_table)
     
     +table(["Name", "Type", "Description"])
         +row
    @@ -36,9 +36,12 @@ p
                 |  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.
    +        +cell #[code data]
    +        +cell #[code.u-break numpy.ndarray[ndim=1, dtype='float32']]
    +
    +    +row
    +        +cell #[code width]
    +        +cell Number of dimensions.
     
         +row("foot")
             +cell returns
    
    From cfae54c507ab24a1da36d3008484d2ac8edb3071 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:19:04 +0200
    Subject: [PATCH 727/739] Make change to Vectors.__init__
    
    ---
     spacy/vectors.pyx | 6 +++++-
     1 file changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/spacy/vectors.pyx b/spacy/vectors.pyx
    index cea583110..fa5fcf624 100644
    --- a/spacy/vectors.pyx
    +++ b/spacy/vectors.pyx
    @@ -32,7 +32,7 @@ cdef class Vectors:
         cdef public object keys
         cdef public int i
     
    -    def __init__(self, strings, data=None, width=0):
    +    def __init__(self, strings, width=0, data=None):
             if isinstance(strings, StringStore):
                 self.strings = strings
             else:
    @@ -46,6 +46,10 @@ cdef class Vectors:
             self.i = 0
             self.key2row = {}
             self.keys = numpy.zeros((self.data.shape[0],), dtype='uint64')
    +        for i, string in enumerate(self.strings):
    +            if i >= self.data.shape[0]:
    +                break
    +            self.add(self.strings[string], self.data[i])
     
         def __reduce__(self):
             return (Vectors, (self.strings, self.data))
    
    From 33229b1c9ef53a49a3bbd00d61ca02c28c5481c8 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:19:29 +0200
    Subject: [PATCH 728/739] Remove print statement
    
    ---
     spacy/vocab.pyx | 1 -
     1 file changed, 1 deletion(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index e6ba9944b..2e189a02b 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -63,7 +63,6 @@ cdef class Vocab:
                 for string in strings:
                     _ = self[string]
             self.lex_attr_getters = lex_attr_getters
    -        print("Create morphology", list(self.strings), tag_map)
             self.morphology = Morphology(self.strings, tag_map, lemmatizer)
             self.vectors = Vectors(self.strings, width=0)
     
    
    From 9010a1a0603fba85143bcd859b88aaed59937a9a Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 14:19:46 +0200
    Subject: [PATCH 729/739] Create vectors correctly
    
    ---
     spacy/vocab.pyx | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 2e189a02b..3f96b5144 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -252,7 +252,7 @@ cdef class Vocab:
             """
             if new_dim is None:
                 new_dim = self.vectors.data.shape[1]
    -        self.vectors = Vectors(self.strings, new_dim)
    +        self.vectors = Vectors(self.strings, width=new_dim)
     
         def get_vector(self, orth):
             """Retrieve a vector for a word in the vocabulary.
    
    From f111b228e0bcd65a9b852f2687a7441628355bba Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 16:24:48 +0200
    Subject: [PATCH 730/739] Fix re-parsing of previously parsed text
    
    If a Doc object had been previously parsed, it was possible for
    invalid parses to be added. There were two problems:
    
    1) The parse was only being partially erased
    2) The RightArc action was able to create a 1-cycle.
    
    This patch fixes both errors, and avoids resetting the parse if one is
    present. In theory this might allow a better parse to be predicted by
    running the parser twice.
    
    Closes #1253.
    ---
     spacy/syntax/arc_eager.pyx               | 14 ++++++++++----
     spacy/tests/regression/test_issue1253.py | 20 ++++++++++++++++++++
     2 files changed, 30 insertions(+), 4 deletions(-)
     create mode 100644 spacy/tests/regression/test_issue1253.py
    
    diff --git a/spacy/syntax/arc_eager.pyx b/spacy/syntax/arc_eager.pyx
    index 9770383d1..8adb8e52c 100644
    --- a/spacy/syntax/arc_eager.pyx
    +++ b/spacy/syntax/arc_eager.pyx
    @@ -212,7 +212,8 @@ cdef class LeftArc:
     cdef class RightArc:
         @staticmethod
         cdef bint is_valid(const StateC* st, attr_t label) nogil:
    -        return st.B_(0).sent_start != 1
    +        # If there's (perhaps partial) parse pre-set, don't allow cycle.
    +        return st.B_(0).sent_start != 1 and st.H(st.S(0)) != st.B(0)
     
         @staticmethod
         cdef int transition(StateC* st, attr_t label) nogil:
    @@ -446,14 +447,19 @@ cdef class ArcEager(TransitionSystem):
     
         cdef int initialize_state(self, StateC* st) nogil:
             for i in range(st.length):
    -            st._sent[i].l_edge = i
    -            st._sent[i].r_edge = i
    +            if st._sent[i].dep == 0:
    +                st._sent[i].l_edge = i
    +                st._sent[i].r_edge = i
    +                st._sent[i].head = 0
    +                st._sent[i].dep = 0
    +                st._sent[i].l_kids = 0
    +                st._sent[i].r_kids = 0
             st.fast_forward()
     
         cdef int finalize_state(self, StateC* st) nogil:
             cdef int i
             for i in range(st.length):
    -            if st._sent[i].head == 0 and st._sent[i].dep == 0:
    +            if st._sent[i].head == 0:
                     st._sent[i].dep = self.root_label
     
         def finalize_doc(self, doc):
    diff --git a/spacy/tests/regression/test_issue1253.py b/spacy/tests/regression/test_issue1253.py
    new file mode 100644
    index 000000000..2fe77d6d8
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1253.py
    @@ -0,0 +1,20 @@
    +from __future__ import unicode_literals
    +import pytest
    +import spacy
    +
    +
    +def ss(tt):
    +    for i in range(len(tt)-1):
    +        for j in range(i+1, len(tt)):
    +            tt[i:j].root
    +
    +
    +@pytest.mark.models('en')
    +def test_access_parse_for_merged():
    +    nlp = spacy.load('en_core_web_sm')
    +    t_t = nlp.tokenizer("Highly rated - I'll definitely")
    +    nlp.tagger(t_t)
    +    nlp.parser(t_t)
    +    nlp.parser(t_t)
    +    ss(t_t)
    +
    
    From d8391b1c4d344f12c89d78bce64779b24b35d658 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Fri, 20 Oct 2017 16:49:36 +0200
    Subject: [PATCH 731/739] Fix #1434: Matcher failed on ending ? if no token
    
    ---
     spacy/matcher.pyx                        |  2 +-
     spacy/tests/regression/test_issue1434.py | 22 ++++++++++++++++++++++
     2 files changed, 23 insertions(+), 1 deletion(-)
     create mode 100644 spacy/tests/regression/test_issue1434.py
    
    diff --git a/spacy/matcher.pyx b/spacy/matcher.pyx
    index 24d0a9836..fa67f32d6 100644
    --- a/spacy/matcher.pyx
    +++ b/spacy/matcher.pyx
    @@ -391,7 +391,7 @@ cdef class Matcher:
                         matches.append((ent_id, start, end))
             # Look for open patterns that are actually satisfied
             for state in partials:
    -            while state.second.quantifier in (ZERO, ZERO_PLUS):
    +            while state.second.quantifier in (ZERO, ZERO_ONE, ZERO_PLUS):
                     state.second += 1
                     if state.second.nr_attr == 0:
                         start = state.first
    diff --git a/spacy/tests/regression/test_issue1434.py b/spacy/tests/regression/test_issue1434.py
    new file mode 100644
    index 000000000..ec3a34bb0
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1434.py
    @@ -0,0 +1,22 @@
    +from __future__ import unicode_literals
    +
    +from spacy.tokens import Doc
    +from spacy.vocab import Vocab
    +from spacy.matcher import Matcher
    +from spacy.lang.lex_attrs import LEX_ATTRS
    +
    +
    +def test_issue1434():
    +    '''Test matches occur when optional element at end of short doc'''
    +    vocab = Vocab(lex_attr_getters=LEX_ATTRS)
    +    hello_world = Doc(vocab, words=['Hello', 'World'])
    +    hello = Doc(vocab, words=['Hello'])
    +
    +    matcher = Matcher(vocab)
    +    matcher.add('MyMatcher', None,
    +        [ {'ORTH': 'Hello' }, {'IS_ALPHA': True, 'OP': '?'} ])
    +
    +    matches = matcher(hello_world)
    +    assert matches
    +    matches = matcher(hello)
    +    assert matches
    
    From d2fe56a5779fbc56b1b8db2b16dc45443d1e076c Mon Sep 17 00:00:00 2001
    From: Ramanan Balakrishnan 
    Date: Fri, 20 Oct 2017 23:58:00 +0530
    Subject: [PATCH 732/739] Add LCA matrix for spans and docs
    
    ---
     spacy/tests/doc/test_doc_api.py |  7 +++++
     spacy/tests/spans/test_span.py  | 11 ++++++++
     spacy/tokens/doc.pyx            | 48 +++++++++++++++++++++++++++++++
     spacy/tokens/span.pyx           | 50 +++++++++++++++++++++++++++++++++
     4 files changed, 116 insertions(+)
    
    diff --git a/spacy/tests/doc/test_doc_api.py b/spacy/tests/doc/test_doc_api.py
    index cbe1bbc66..5e052f771 100644
    --- a/spacy/tests/doc/test_doc_api.py
    +++ b/spacy/tests/doc/test_doc_api.py
    @@ -217,6 +217,13 @@ def test_doc_api_has_vector(en_tokenizer, text_file, text, vectors):
         doc = en_tokenizer(text)
         assert doc.has_vector
     
    +def test_lowest_common_ancestor(en_tokenizer):
    +    tokens = en_tokenizer('the lazy dog slept')
    +    doc = get_doc(tokens.vocab, [t.text for t in tokens], heads=[2, 1, 1, 0])
    +    lca = doc.get_lca_matrix()
    +    assert(lca[1, 1] == 1)
    +    assert(lca[0, 1] == 2)
    +    assert(lca[1, 2] == 2)
     
     def test_parse_tree(en_tokenizer):
         """Tests doc.print_tree() method."""
    diff --git a/spacy/tests/spans/test_span.py b/spacy/tests/spans/test_span.py
    index 7ed9333b8..5e7c638b6 100644
    --- a/spacy/tests/spans/test_span.py
    +++ b/spacy/tests/spans/test_span.py
    @@ -55,6 +55,17 @@ def test_spans_span_sent(doc):
         assert doc[6:7].sent.root.left_edge.text == 'This'
     
     
    +def test_spans_lca_matrix(en_tokenizer):
    +    """Test span's lca matrix generation"""
    +    tokens = en_tokenizer('the lazy dog slept')
    +    doc = get_doc(tokens.vocab, [t.text for t in tokens], heads=[2, 1, 1, 0])
    +    lca = doc[:2].get_lca_matrix()
    +    assert(lca[0, 0] == 0)
    +    assert(lca[0, 1] == -1)
    +    assert(lca[1, 0] == -1)
    +    assert(lca[1, 1] == 1)
    +
    +
     def test_spans_default_sentiment(en_tokenizer):
         """Test span.sentiment property's default averaging behaviour"""
         text = "good stuff bad stuff"
    diff --git a/spacy/tokens/doc.pyx b/spacy/tokens/doc.pyx
    index 809f178f8..fa5b4ba28 100644
    --- a/spacy/tokens/doc.pyx
    +++ b/spacy/tokens/doc.pyx
    @@ -660,6 +660,54 @@ cdef class Doc:
             self.is_tagged = bool(TAG in attrs or POS in attrs)
             return self
     
    +    def get_lca_matrix(self):
    +        '''
    +        Calculates the lowest common ancestor matrix
    +        for a given Spacy doc.
    +        Returns LCA matrix containing the integer index
    +        of the ancestor, or -1 if no common ancestor is
    +        found (ex if span excludes a necessary ancestor).
    +        Apologies about the recursion, but the
    +        impact on performance is negligible given
    +        the natural limitations on the depth of a typical human sentence.
    +        '''
    +        # Efficiency notes:
    +        #
    +        # We can easily improve the performance here by iterating in Cython.
    +        # To loop over the tokens in Cython, the easiest way is:
    +        # for token in doc.c[:doc.c.length]:
    +        #     head = token + token.head
    +        # Both token and head will be TokenC* here. The token.head attribute
    +        # is an integer offset.
    +        def __pairwise_lca(token_j, token_k, lca_matrix):
    +            if lca_matrix[token_j.i][token_k.i] != -2:
    +                return lca_matrix[token_j.i][token_k.i]
    +            elif token_j == token_k:
    +                lca_index = token_j.i
    +            elif token_k.head == token_j:
    +                lca_index = token_j.i
    +            elif token_j.head == token_k:
    +                lca_index = token_k.i
    +            elif (token_j.head == token_j) and (token_k.head == token_k):
    +                lca_index = -1
    +            else:
    +                lca_index = __pairwise_lca(token_j.head, token_k.head, lca_matrix)
    +            lca_matrix[token_j.i][token_k.i] = lca_index
    +            lca_matrix[token_k.i][token_j.i] = lca_index
    +
    +            return lca_index
    +
    +        lca_matrix = numpy.empty((len(self), len(self)), dtype=numpy.int32)
    +        lca_matrix.fill(-2)
    +        for j in range(len(self)):
    +            token_j = self[j]
    +            for k in range(j, len(self)):
    +                token_k = self[k]
    +                lca_matrix[j][k] = __pairwise_lca(token_j, token_k, lca_matrix)
    +                lca_matrix[k][j] = lca_matrix[j][k]
    +
    +        return lca_matrix
    +
         def to_disk(self, path, **exclude):
             """Save the current state to a directory.
     
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 3b31c50c0..b0a170ddf 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -177,6 +177,56 @@ cdef class Span:
                 return 0.0
             return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
     
    +    def get_lca_matrix(self):
    +        '''
    +        Calculates the lowest common ancestor matrix
    +        for a given Spacy span.
    +        Returns LCA matrix containing the integer index
    +        of the ancestor, or -1 if no common ancestor is
    +        found (ex if span excludes a necessary ancestor).
    +        Apologies about the recursion, but the
    +        impact on performance is negligible given
    +        the natural limitations on the depth of a typical human sentence.
    +        '''
    +
    +        def __pairwise_lca(token_j, token_k, lca_matrix, margins):
    +            offset = margins[0]
    +            token_k_head = token_k.head if token_k.head.i in range(*margins) else token_k
    +            token_j_head = token_j.head if token_j.head.i in range(*margins) else token_j
    +            token_j_i = token_j.i - offset
    +            token_k_i = token_k.i - offset
    +
    +            if lca_matrix[token_j_i][token_k_i] != -2:
    +                return lca_matrix[token_j_i][token_k_i]
    +            elif token_j == token_k:
    +                lca_index = token_j_i
    +            elif token_k_head == token_j:
    +                lca_index = token_j_i
    +            elif token_j_head == token_k:
    +                lca_index = token_k_i
    +            elif (token_j_head == token_j) and (token_k_head == token_k):
    +                lca_index = -1
    +            else:
    +                lca_index = __pairwise_lca(token_j_head, token_k_head, lca_matrix, margins)
    +
    +            lca_matrix[token_j_i][token_k_i] = lca_index
    +            lca_matrix[token_k_i][token_j_i] = lca_index
    +
    +            return lca_index
    +
    +        lca_matrix = numpy.empty((len(self), len(self)), dtype=numpy.int32)
    +        lca_matrix.fill(-2)
    +        margins = [self.start, self.end]
    +
    +        for j in range(len(self)):
    +            token_j = self[j]
    +            for k in range(len(self)):
    +                token_k = self[k]
    +                lca_matrix[j][k] = __pairwise_lca(token_j, token_k, lca_matrix, margins)
    +                lca_matrix[k][j] = lca_matrix[j][k]
    +
    +        return lca_matrix
    +
         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.
    
    From 8f8bccecb9427448563b2d2c4c3cf7fb4eecdfb1 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 21 Oct 2017 00:51:42 +0200
    Subject: [PATCH 733/739] Patch deserialisation for invalid loads, to avoid
     model failure
    
    ---
     spacy/vocab.pyx | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/spacy/vocab.pyx b/spacy/vocab.pyx
    index 205e5a2af..da4d21026 100644
    --- a/spacy/vocab.pyx
    +++ b/spacy/vocab.pyx
    @@ -400,6 +400,7 @@ cdef class Vocab:
             cdef int j = 0
             cdef SerializedLexemeC lex_data
             chunk_size = sizeof(lex_data.data)
    +        cdef void* ptr
             cdef unsigned char* bytes_ptr = bytes_data
             for i in range(0, len(bytes_data), chunk_size):
                 lexeme = self.mem.alloc(1, sizeof(LexemeC))
    @@ -407,6 +408,9 @@ cdef class Vocab:
                     lex_data.data[j] = bytes_ptr[i+j]
                 Lexeme.c_from_bytes(lexeme, lex_data)
     
    +            ptr = self.strings._map.get(lexeme.orth)
    +            if ptr == NULL:
    +                continue
                 py_str = self.strings[lexeme.orth]
                 assert self.strings[py_str] == lexeme.orth, (py_str, lexeme.orth)
                 key = hash_string(py_str)
    
    From 490ad3eaf070f2e210869c37b70edf3fcd504da7 Mon Sep 17 00:00:00 2001
    From: Matthew Honnibal 
    Date: Sat, 21 Oct 2017 00:52:14 +0200
    Subject: [PATCH 734/739] Check that empty strings are handled. Closes #1242
    
    ---
     spacy/tests/regression/test_issue1242.py | 23 +++++++++++++++++++++++
     1 file changed, 23 insertions(+)
     create mode 100644 spacy/tests/regression/test_issue1242.py
    
    diff --git a/spacy/tests/regression/test_issue1242.py b/spacy/tests/regression/test_issue1242.py
    new file mode 100644
    index 000000000..50dc8c37e
    --- /dev/null
    +++ b/spacy/tests/regression/test_issue1242.py
    @@ -0,0 +1,23 @@
    +from __future__ import unicode_literals
    +import pytest
    +from ...lang.en import English
    +from ...util import load_model
    +
    +
    +def test_issue1242_empty_strings():
    +    nlp = English()
    +    doc = nlp('')
    +    assert len(doc) == 0
    +    docs = list(nlp.pipe(['', 'hello']))
    +    assert len(docs[0]) == 0
    +    assert len(docs[1]) == 1
    +
    +
    +@pytest.mark.models('en')
    +def test_issue1242_empty_strings_en_core_web_sm():
    +    nlp = load_model('en_core_web_sm')
    +    doc = nlp('')
    +    assert len(doc) == 0
    +    docs = list(nlp.pipe(['', 'hello']))
    +    assert len(docs[0]) == 0
    +    assert len(docs[1]) == 1
    
    From 84c6c20d1c640f665ff98ef8c11b69a2d4038812 Mon Sep 17 00:00:00 2001
    From: Jeroen Bobbeldijk 
    Date: Sun, 22 Oct 2017 15:18:36 +0200
    Subject: [PATCH 735/739] Fix #1444: fix pipeline logic and wrong paramater in
     update call
    
    ---
     examples/training/train_new_entity_type.py | 10 +++++-----
     1 file changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/examples/training/train_new_entity_type.py b/examples/training/train_new_entity_type.py
    index ab69285a6..5f10beebc 100644
    --- a/examples/training/train_new_entity_type.py
    +++ b/examples/training/train_new_entity_type.py
    @@ -56,8 +56,7 @@ def train_ner(nlp, train_data, output_dir):
             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)
    +            nlp.update(docs, golds, losses=losses, sgd=optimizer, drop=0.35)
             print(losses)
         if not output_dir:
             return
    @@ -100,9 +99,10 @@ def main(model_name, output_directory=None):
             )
     
         ]
    -    nlp.pipeline.append(TokenVectorEncoder(nlp.vocab))
    -    nlp.pipeline.append(NeuralEntityRecognizer(nlp.vocab))
    -    nlp.pipeline[-1].add_label('ANIMAL')
    +    nlp.add_pipe(TokenVectorEncoder(nlp.vocab))
    +    ner = NeuralEntityRecognizer(nlp.vocab)
    +    ner.add_label('ANIMAL')
    +    nlp.add_pipe(ner)
         train_ner(nlp, train_data, output_directory)
     
         # Test that the entity is recognized
    
    From a31f048b4d05ff5b30ff456de0460f51a192ee75 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:06 +0200
    Subject: [PATCH 736/739] Fix formatting
    
    ---
     spacy/tokens/span.pyx | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/spacy/tokens/span.pyx b/spacy/tokens/span.pyx
    index 3b31c50c0..05dcce1ba 100644
    --- a/spacy/tokens/span.pyx
    +++ b/spacy/tokens/span.pyx
    @@ -129,6 +129,7 @@ cdef class Span:
         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.
     
    
    From 3f0a157b33a24c63b52c7c714a55573a0f096398 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:13 +0200
    Subject: [PATCH 737/739] Fix typo
    
    ---
     website/api/span.jade | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 6bff45a9b..399d0bd33 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -284,7 +284,7 @@ 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 = doc[2:4]
         span.merge()
         assert len(doc) == 6
         assert doc[2].text == 'New York'
    
    From db15902e84df8c3187479afb8ccfc3ae02aedb33 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:21 +0200
    Subject: [PATCH 738/739] Tidy up
    
    ---
     website/assets/css/_components/_code.sass       | 1 -
     website/assets/css/_components/_navigation.sass | 3 ---
     2 files changed, 4 deletions(-)
    
    diff --git a/website/assets/css/_components/_code.sass b/website/assets/css/_components/_code.sass
    index f83e96d29..eaf0980e1 100644
    --- a/website/assets/css/_components/_code.sass
    +++ b/website/assets/css/_components/_code.sass
    @@ -63,7 +63,6 @@ code
         padding: 0.2rem 0.4rem
         border-radius: 0.25rem
         font-family: $font-code
    -    white-space: nowrap
         margin: 0
         box-decoration-break: clone
         white-space: nowrap
    diff --git a/website/assets/css/_components/_navigation.sass b/website/assets/css/_components/_navigation.sass
    index 0e4af8267..1543de5fb 100644
    --- a/website/assets/css/_components/_navigation.sass
    +++ b/website/assets/css/_components/_navigation.sass
    @@ -14,9 +14,6 @@
         width: 100%
         box-shadow: $box-shadow
     
    -    //@include breakpoint(min, md)
    -    //    position: fixed
    -
         &.is-fixed
             animation: slideInDown 0.5s ease-in-out
             position: fixed
    
    From 7701984f13913a4f114e42f4e0bb009e8c4f6c47 Mon Sep 17 00:00:00 2001
    From: ines 
    Date: Mon, 23 Oct 2017 10:38:27 +0200
    Subject: [PATCH 739/739] Document Span.as_doc
    
    ---
     website/api/span.jade | 19 +++++++++++++++++++
     1 file changed, 19 insertions(+)
    
    diff --git a/website/api/span.jade b/website/api/span.jade
    index 399d0bd33..2a55409f1 100644
    --- a/website/api/span.jade
    +++ b/website/api/span.jade
    @@ -302,6 +302,25 @@ p Retokenize the document, such that the span is merged into a single token.
             +cell #[code Token]
             +cell The newly merged token.
     
    ++h(2, "as_doc") Span.as_doc
    +
    +p
    +    |  Create a #[code Doc] object view of the #[code Span]'s data. Mostly
    +    |  useful for C-typed interfaces.
    +
    ++aside-code("Example").
    +    doc = nlp(u'I like New York in Autumn.')
    +    span = doc[2:4]
    +    doc2 = span.as_doc()
    +    assert doc2.text == 'New York'
    +
    ++table(["Name", "Type", "Description"])
    +    +row("foot")
    +        +cell returns
    +        +cell #[code Doc]
    +        +cell A #[code Doc] object of the #[code Span]'s content.
    +
    +
     +h(2, "root") Span.root
         +tag property
         +tag-model("parse")
    

    lVZMLzun{&8k zn@zj~Hooswq_S8#TneP-n-oJ$433`+hU6<7t|3*iD)v+g#B0a>m5tat$zWP4#YzG&HVs ze{FSC+udTh+af1w-|Mz`OZ;>&=vlY#!~NgYy$mTa6nC>F?fcypX;5gcD;-Tf{nNS! zT8eeu>6(b*w5xQ1!6_gtk#~al4#f6jLkB@T0Ne~%&kK?D7pEQoa+gwPf7%!+-AXlo z$yxiV!l8E4OLbm(o`u=ypyWR5AwvygYuN>Lv#44rs=LglhXWvBkJdG?w1nU%0|7l_ z+iqGAKtfdj5YK^Y4M~!mKnbC7i<0u=5lYF9|0u_J0yVCL??X9WK0(%((AF8Y+ven;xlg#ED}(}^D#??T*KdcPpjvhm3Y3z4uKfW(Wua-;63UXAiJf83$E-GUh^1 z^f#rUVOV1LYurr%#q($paSs8-MLX?sNh61+VCErqB5o9tt491aGGgYw5FeKJP&aG5 zST@HH8sp*Tb`1A07oSnMB39b3#A*dwadBa)2({S6&4;H38kvxOV_h09f+)SxWuTeu zgpDX~yZB%fa8<5fp&C|a$Q?YQjn&nNsp)a}*asERl7WE3I^lt+wsY|sG$zQ1VB{CQ zhPf1@YT7n-ULlW;V8fJp4cF)9mrrPAyI~GK9z*;974lDiFO@+)z0~TIsxGf-PN3)R zzm&~BFhSgcIi3&0MAzX$-8@-}REwlxD5P|F*+%cIfgHJ{C&1A@zmmSh|( z^A7a$&s(%y)mu9Jl4&lp<5JGA!P1)*TdUa0JY8aSaK>`2udo1H3{GUF^$9E(oH!$6 z)A|N70Zf2Gwge?08Cp=jFoFhw1Y>2ggYII&kohjV2Lx*_dx~{7b?C}?5X8t(-}E*a r@Q@%?M}wQlZ7CInEl)vdE0R&!$|TgbDiMvfW(=%sl?Le2PhuwkGL}3^ literal 0 HcmV?d00001 diff --git a/website/assets/fonts/hkgrotesk-semibolditalic.woff b/website/assets/fonts/hkgrotesk-semibolditalic.woff new file mode 100755 index 0000000000000000000000000000000000000000..3fce4cf35a2c0850a86d8e22e742b341c1e81e74 GIT binary patch literal 34196 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�Ke^&QWz)g8Cf-E0kd1dK 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 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 ff2206e58e57e83414c00aad7a17c1e3dd6dd971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55544 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 RErH~@sI<*ri@IN_{{lla#sB~S diff --git a/website/assets/fonts/sourcecodepro-semibold.woff b/website/assets/fonts/sourcecodepro-semibold.woff deleted file mode 100644 index 83cd2c3ea6ad1b86ff5a074ac963d907dbf8dc72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27952 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