Model or dataset
GaoQ1/rasa_nlu_gq avatar
GaoQ1/rasa_nlu_gq

rasa_nlu_gq: Rasa NLU addons for Chinese pipelines

Turn natural language into structured data (supports Chinese, with N custom models covering different scenarios and tasks).

304 stars94 forksPythonApache-2.0

At a glance

What is it?
rasa_nlu_gq is a pip-installable addon package that loads extra components into Rasa NLU, aimed at Chinese-language pipelines that need character-level entity models, jieba part-of-speech tagging, or BERT vectors. It pins Rasa 1.1.3 and TensorFlow 1.15.2, and the README is thin on evaluation and upgrade paths.
Who is it for?
Adopt rasa_nlu_gq if you are running Rasa 1.1.x on Chinese text and want a BiLSTM-CRF or IDCNN-CRF entity extractor, jieba part-of-speech tags, or BERT vectors without patching Rasa itself. Do not adopt it if you are on a modern Rasa line, since setup.py pins rasa~=1.1.3 and tensorflow==1.15.2, or if you need the package to work without a separate bert-serving server.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 34 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 11, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The Chinese-language gap rasa_nlu_gq fills

Rasa NLU turns a sentence into an intent plus a list of entities. The README opens with the canonical example: "I'm looking for a Mexican restaurant in the center of town" becomes intent search_restaurant with cuisine: Mexican and location: center. That works acceptably for English, where whitespace gives you token boundaries and where pretrained embeddings are easy to find. Chinese does not behave that way, and the stock pipeline has less to offer.

rasa_nlu_gq is a set of addon components for that case. The README is explicit that it does not fork Rasa: the earlier code lived on a 0.2.7 branch, and the new version modifies components from the old rasa_nlu_gao and loads them as addons against a current Rasa release, so you do not edit Rasa source. The target user is someone building a Chinese chatbot who needs entity extraction that is better than a generic CRF over the default features, or who wants BERT vectors in the pipeline. The package is published on PyPI as rasa-nlu-gao and licensed Apache-2.0.

How the addon components load into a Rasa pipeline

There is no separate runtime. The package ships Python modules under rasa_nlu_gao, and Rasa's pipeline config references them by dotted path. When Rasa builds a pipeline from the YAML, it looks up each name; a bare name like JiebaTokenizer resolves inside Rasa, while a fully qualified name like rasa_nlu_gao.extractors.bilstm_crf_entity_extractor.BiLstmCRFEntityExtractor resolves to this package. The component receives the training data or the message, does its work, and writes back into the Rasa message object.

The components fall into three groups. Tokenizers and featurizers: JiebaTokenizer, BertVectorsFeaturizer, and the jieba part-of-speech extractor. Entity extractors: BiLstmCRFEntityExtractor and JiebaPsegExtractor. Classifiers: EmbeddingBertIntentClassifier, EmbeddingBertIntentEstimatorClassifier, and EntityEditIntent. The BiLstmCRFEntityExtractor is the heaviest piece. Its config exposes lr, char_dim, lstm_dim, batches_per_epoch, seg_dim, num_segs, batch_size, tag_schema, model_type, clip, optimizer, dropout_keep and steps_check, and model_type switches between a BiLSTM and an IDCNN dilated convolution. Note that the class name in the YAML is BiLstmCRFEntityExtractor, while the README's prose calls the same thing ner_bilstm_crf when discussing TensorFlow resource settings. Two names for one component is a real source of config mistakes.

Installing rasa_nlu_gao and running a first Chinese pipeline

The README gives a single install command. It pulls the pinned dependency set from setup.py, which is rasa~=1.1.3, jieba~=0.39, bert-serving-client==1.8.9, tensorflow==1.15.2 and kashgari-tf~=0.5.3. Because TensorFlow 1.15.2 is pinned exactly, install this in a dedicated environment rather than alongside another project.

bash
pip install rasa-nlu-gao

After installation, write a pipeline that uses the jieba part-of-speech extractor. The README's example declares language zh and lists the components in order, with part_of_speech restricted to nr (person names), ns (place names) and nt (organization names).

yaml
language: "zh"

pipeline:
- name: "JiebaTokenizer"
- name: "CRFEntityExtractor"
- name: "rasa_nlu_gao.extractors.jieba_pseg_extractor.JiebaPsegExtractor"
  part_of_speech: ["nr", "ns", "nt"]
- name: "CountVectorsFeaturizer"
  OOV_token: oov
  token_pattern: "(?u)\b\w+\b"
- name: "EmbeddingIntentClassifier"

Train with the standard Rasa command against that config. What you should expect to see is entity annotations produced by jieba's tagger rather than by a learned model: if jieba labels a span nr, it comes out as an entity. That is fast and requires no training data for the extractor itself, but it is only as good as jieba's tagger on your domain vocabulary.

BERT vectors need a separate server, not just a config block

The BertVectorsFeaturizer config looks self-contained. It takes ip, port, port_out, show_server_config and timeout, and the README example uses 127.0.0.1 with port 5555 and port_out 5556. Those keys do not start anything. The dependency list includes bert-serving-client, which is the client half of a client-server setup, so the actual embedding model runs in a separate bert-serving process that you must start yourself. The README does not document how to launch that server, which model to load, or what happens when the endpoint is unreachable.

That is the largest documentation gap in the package. If the server is down or the port is wrong, the failure surfaces during training or at inference time, not at config validation, and the README offers no troubleshooting path. Treat the ip and port values as an interface contract with a service you operate, and verify the endpoint before blaming the pipeline.

EntityEditIntent and the other classifiers are opinionated

EntityEditIntent is the most unusual component here. The README config gives it entity: ["nr"], intent: ["enter_data"] and min_confidence: 0, and describes the behaviour as modifying the intent based on entities. In other words, the presence of a matching entity can override or set the predicted intent rather than the classifier deciding alone. That is a rule layered on top of a statistical model, and it is a design decision worth noticing: it makes certain flows deterministic, and it also means a stray jieba person-name tag can push a message into enter_data. Setting min_confidence to 0 in the example leaves the rule with no confidence floor at all.

The two BERT-backed classifiers differ in implementation. EmbeddingBertIntentClassifier is the simpler one. EmbeddingBertIntentEstimatorClassifier is built on TensorFlow's higher-level APIs, which the README lists as tf.estimator, tf.data, tf.example and tf.saved_model. If you care about export and serving formats, that distinction matters more than the accuracy difference you might assume from the names.

Where this package is the wrong choice

The dependency pins are the first constraint. rasa~=1.1.3 and tensorflow==1.15.2 mean this package lives in the Rasa 1.x era. If your project is on a later Rasa line, the addon components were written against 1.1.3 internals and there is no compatibility statement in the README for anything newer. Nothing in the repository suggests a migration path, and the last push to the default branch was on 2026-09-08.

Second, the BiLstmCRFEntityExtractor brings kashgari-tf and a training loop of its own. It exposes batches_per_epoch, steps_check and clip, which are training-loop knobs, so you are training a sequence tagger inside your NLU pipeline, not just configuring a featurizer. That costs GPU time and adds a second model to tune. If a plain CRFEntityExtractor over jieba tokens already hits your accuracy target, adding this component buys you nothing but complexity.

Third, the README's external link block is a long list of unrelated sites. It tells you nothing about the package and makes the README harder to scan for the parts that matter.

Compared with a plain Rasa NLU Chinese pipeline

The realistic alternative is stock Rasa NLU with a Chinese tokenizer and the built-in CRFEntityExtractor, which is what the second README example already uses alongside JiebaPsegExtractor. The difference is where entity knowledge comes from. Stock CRF learns from your annotated training examples and generalizes from the features you feed it. JiebaPsegExtractor delegates to jieba's part-of-speech tagger, so it knows person, place and organization names without any training data, at the cost of inheriting jieba's errors on names it has never seen. BiLstmCRFEntityExtractor is a third position: it learns character-level sequence tagging, which suits Chinese because it does not depend on word segmentation being correct first. If your entity boundaries are being broken by tokenization, the character-level model is the more principled fix; if your entities are ordinary names and places, jieba's tagger is cheaper and needs no training.

Licence, maintenance and upgrade cost

The package is Apache-2.0, the same licence family as Rasa itself, and setup.py declares license='Apache 2.0' with LICENSE.txt at the repository root. Apache-2.0 includes a patent grant and requires you to retain notices; it does not impose copyleft obligations on your own code. That is a statement about the licence text, not legal advice for your situation.

Upgrade cost is dominated by the pins. tensorflow==1.15.2 is an exact pin, bert-serving-client==1.8.9 is an exact pin, and rasa~=1.1.3 allows only 1.1.x. Moving to a newer Rasa means either waiting for the addon components to be ported or vendoring them yourself. The repository has no releases listed and no CHANGELOG entries are quoted in the README, so there is no published record of what changed between versions. The last push to the default branch was on 2026-09-08.

Editorial conclusion

Adopt rasa_nlu_gq if you are running Rasa 1.1.x on Chinese text and want a BiLSTM-CRF or IDCNN-CRF entity extractor, jieba part-of-speech tags, or BERT vectors without patching Rasa itself. Do not adopt it if you are on a modern Rasa line, since setup.py pins rasa~=1.1.3 and tensorflow==1.15.2, or if you need the package to work without a separate bert-serving server. Before committing, verify that the components you need are actually importable under your Python version, that the bert-serving endpoint responds on the configured ip and port, and that your training data tolerates the iobes tag schema the BiLstmCRFEntityExtractor defaults to.

Frequently asked questions

Is Rasa an NLU platform?

Rasa NLU is the natural language understanding part of Rasa, and the README describes it as a tool that turns a sentence such as "I'm looking for a Mexican restaurant in the center of town" into structured data with an intent and entities. rasa_nlu_gq is an addon package for that tool rather than a platform of its own.

What is Rasa used for?

According to the README, Rasa NLU parses natural language into structured output: an intent such as search_restaurant plus entities such as cuisine and location. rasa_nlu_gq extends that parsing for Chinese text with extra tokenizers, entity extractors and classifiers.

Can I use Rasa for free?

rasa_nlu_gq is published under Apache-2.0, as declared in setup.py and LICENSE.txt. The README does not discuss pricing for Rasa itself, so this answer covers only the licence of this addon package.

Who are the owners of Rasa company?

The README does not name the owners of the Rasa company. It only states that rasa_nlu_gq is an addon package and lists the author of this package as Gao Quan in setup.py.

Official sources

  1. GaoQ1/rasa_nlu_gq on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/gaoq1-rasa-nlu-gq.svg)](https://hysenlabs.com/projects/gaoq1-rasa-nlu-gq)