---
active_crumb: Docs
layout: documentation
id: built-in-token-enricher
---

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<div class="col-md-8 second-column">
    <section id="overview">
        <h2 class="section-title">Overview<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc NCTokenEnricher NCTokenEnricher %} trait is part of <a href="api-components.html#model-pipeline">Model Pipeline</a>.
            Its implementation should allow to add additional properties to prepared tokens,
            like part of speech, quote, stop-words flags or any other.
            NLPCraft provides English language default set of token enrichers implementations.
        </p>
    </section>

    <section id="enricher-opennlp-lemmapos">
        <h2 class="section-title">Lemma And POS Enricher<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc nlp/enrichers/NCOpenNLPLemmaPosTokenEnricher NCOpenNLPLemmaPosTokenEnricher %} -
            this component allows to add <code>lemma</code> and <code>pos</code> values to processed token.
            Look at these links fpr more details:
            <a href="https://en.wikipedia.org/wiki/Lemma_(morphology)">Lemma</a> and
            <a href="https://en.wikipedia.org/wiki/Part-of-speech_tagging">Part of speech</a>.
            Current implementation is based on <a href="https://opennlp.apache.org/">Apache OpenNLP</a> project components.
            Is uses Apache OpenNLP models, which are accessible
            <a href="http://opennlp.sourceforge.net/models-1.5/">here</a> for POS taggers.
            English lemmatization model is accessible <a href="https://raw.githubusercontent.com/richardwilly98/elasticsearch-opennlp-auto-tagging/master/src/main/resources/models/en-lemmatizer.dict">here</a>.
            You can use any models which are compatible with Apache OpenNLP <a href="https://opennlp.apache.org/docs/2.0.0/apidocs/opennlp-tools/opennlp/tools/postag/POSTaggerME.html">POSTaggerME</a> and
            <a href="https://opennlp.apache.org/docs/2.0.0/apidocs/opennlp-tools/opennlp/tools/lemmatizer/DictionaryLemmatizer.html">DictionaryLemmatizer</a> components.
        </p>
    </section>
    <section id="enricher-opennlp-bracket">
        <h2 class="section-title">Brackets Enricher<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc nlp/enrichers/NCEnBracketsTokenEnricher NCEnBracketsTokenEnricher %} -
            this component allows to add <code>brackets</code> boolean flag to processed token.
        </p>
    </section>
    <section id="enricher-opennlp-quotes">
        <h2 class="section-title">Quotes Enricher<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc nlp/enrichers/NCEnQuotesTokenEnricher NCEnQuotesTokenEnricher %} -
            this component allows to add <code>quoted</code> boolean flag to processed token.
        </p>
    </section>
    <section id="enricher-opennlp-dict">
        <h2 class="section-title">Dictionary Enricher<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc nlp/enrichers/NCEnDictionaryTokenEnricher NCEnDictionaryTokenEnricher %} -
            this component allows to add <code>dict</code> boolean flag to processed token.
            Note that it requires already defined <code>lemma</code> token property.
            You can use {% scaladoc nlp/enrichers/NCOpenNLPLemmaPosTokenEnricher NCOpenNLPLemmaPosTokenEnricher %} or any another component which sets
            <code>lemma</code> into the token. Note that you have to define it in model pipilene token enricher list before
            {% scaladoc nlp/enrichers/NCEnDictionaryTokenEnricher NCEnDictionaryTokenEnricher %}.
        </p>
    </section>
    <section id="enricher-opennlp-stopword">
        <h2 class="section-title">Stop-words Enricher<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc nlp/enrichers/NCEnStopWordsTokenEnricher NCEnStopWordsTokenEnricher %} -
            this component allows to add <code>stopword</code> boolean flag to processed token.
            It is based on predefined rules for English language, but it can be also extended by custom user word list and excluded list.
            Note that it requires already defined <code>lemma</code> token property.
            You can use {% scaladoc nlp/enrichers/NCOpenNLPLemmaPosTokenEnricher NCOpenNLPLemmaPosTokenEnricher %} or any another component which sets
            <code>lemma</code> into the toke. Note that you have to define it in model pipilene token enricher list before
            {% scaladoc nlp/enrichers/NCEnStopWordsTokenEnricher NCEnStopWordsTokenEnricher %}.
        </p>
    </section>
    <section id="enricher-opennlp-swearword">
        <h2 class="section-title">Swear-words Enricher<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>

        <p>
            {% scaladoc nlp/enrichers/NCEnSwearWordsTokenEnricher NCEnSwearWordsTokenEnricher %} -
            this component allows to add <code>swear</code> boolean flag to processed token.
        </p>
    </section>
</div>
<div class="col-md-2 third-column">
    <ul class="side-nav">
        <li class="side-nav-title">On This Page</li>
        <li><a href="#overview">Overvie</a></li>
        <li><a href="#enricher-opennlp-lemmapos">Lemma And POS Enricher</a></li>
        <li><a href="#enricher-opennlp-bracket">Brackets Enricher</a></li>
        <li><a href="#enricher-opennlp-quotes">Quotes Enricher</a></li>
        <li><a href="#enricher-opennlp-dict">Dictionary Enricher</a></li>
        <li><a href="#enricher-opennlp-stopword">Stop-words Enricher</a></li>
        <li><a href="#enricher-opennlp-swearword">Swear-words Enricher</a></li>
        {% include quick-links.html %}
    </ul>
</div>




