rasa对话系统踩坑记(八)

如何将bert应用在rasa-nlu-gao

BERT应用到rasa-nlu-gao,其实在rasa对话系统踩坑记(四)的开头有简单提到过。当时觉得没什么,所以就略过了。但最近肖大神的bert-as-service项目改动的比较大,致使有朋友反馈现在BERT的component跑不了了,所以今天将bert-as-service更新到了最新的版本和最新的方法,这儿做个简单的总结。具体的demo可以参照rasa_chatbot_cn

BERT

BERT这个深水炸弹一经引爆,在nlp领域反响剧烈。几乎席卷了nlp的所有领域。如果用一句话形容BERT的出现,一切过往,皆为序章。

那当然作为rasa-nlu的资深玩家,当然不能错过,所以早在一个月前我就加上去了。然后最近根据bert-as-service这个项目的更新做了调整。

bert-as-service

想要将bert-as-service用起来,首先需要将service和client下载下来。

pip install bert-serving-server==1.6.0  # server
pip install bert-serving-client==1.6.0  # client, independent of `bert-serving-server`

然后需要下载一个Pre-trained BERT Model,再启动一个BERT服务

bert-serving-start -model_dir /tmp/chinese_L-12_H-768_A-12/ -num_worker=4

对应的bert-serving-start的参数参见bert-as-service

rasa_nlu_bert_finetune(增加@2019-01-11)

之前在rasa-nlu-gao中使用bert训练,是用的google开源的中文model(chinese_L-12_H-768_A-12),而并没有将finetune加上去。最近将这一功能加了上去,代码传送rasa-bert-finetune。主要是在run_classifier.py代码里面加了RasaJsonProcessor function,代码如下:

class RasaJsonProcessor(DataProcessor):
    def __init__(self):
        self.labels = set()

    def get_train_examples(self, data_dir):
        file_path = os.path.join(data_dir, "rasa_dataset_training.json")
        return self._create_examples(self._read_json(file_path), "train")

    def get_dev_examples(self, data_dir):
        file_path = os.path.join(data_dir, "rasa_dataset_testing.json")
        return self._create_examples(self._read_json(file_path), "dev")

    def get_labels(self):
        return list(self.labels) 

    def _create_examples(self, lines, set_type):
        examples = []
        data = lines['rasa_nlu_data']['common_examples']

        for (i, line) in enumerate(data):
          guid = "%s-%s" % (set_type, i)
          text_a = tokenization.convert_to_unicode(line['text'])
          label = tokenization.convert_to_unicode(line['intent'])
          self.labels.add(label)

          examples.append(InputExample(guid=guid, text_a=text_a, label=label))

        return examples

训练finetune前先要准备好rasa json的训练数据,train为rasa_dataset_training.json,dev为rasa_dataset_testing.json,这只是命名的问题。训练完成之后,需要在bert-as-server命令行中加上tuned_model_dir这个参数即可,比如:

bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=4 -tuned_model_dir ./rasa_model_output/

这样的话,之后使用bert_vectors_featurizer调用就会是finetune之后的model了。就是如此简单 :)

bert_vectors_featurizer

我在rasa-nlu-gao中增加了bert_vectors_featurizer组件,并已发布,请pip install rasa-nlu-gao至最新版本。如名字所示,bert_vectors_featurizer组件只是提供word embedding featurizer.后面可以接其他的分类器,这里用的是intent_classifier_tensorflow_embedding组件,当然你也可以自己加个全连接和softmax分类。具体的配置如下:

language: "zh"

pipeline:
- name: "tokenizer_jieba"
- name: "bert_vectors_featurizer"
  ip: '172.16.10.46'
  port: 5555
  port_out: 5556
  show_server_config: True
  timeout: 10000
- name: "intent_classifier_tensorflow_embedding"

- name: "ner_crf"
- name: "jieba_pseg_extractor"
  • ip: 指的是service的ip地址
  • port: 指的是从客户端传到服务端数据的端口,需要和服务端设置的一致
  • prot_out: 指的是将结果从服务端传到客户端的端口,需要和服务端一致
  • show_server_config: 是否在第一次连接时候展示服务端的config信息
  • timeout: 设置客户端接收服务端操作的过期时间

intent_classifier_tensorflow_embedding_bert

bert_vectors_featurizer说的是将bert应用在词嵌入方面,然后在意图分类这块可以接rasa-nlu官网的intent_classifier_tensorflow_embedding组件。当然这里的intent_classifier_tensorflow_embedding_bert组件是同组的飞龙同学加的。该组件是将bert_vectors_featurizer之后的输出向量做了全连接+softmax。具体的配置可以参考如下:

language: "zh"

pipeline:
- name: "tokenizer_jieba"
- name: "bert_vectors_featurizer"
  ip: '172.16.10.46'
  port: 6555
  port_out: 6556
  show_server_config: True
  timeout: 10000
- name: "intent_classifier_tensorflow_embedding_bert"

- name: "ner_crf"
- name: "jieba_pseg_extractor"

除了这两个模型外,还可以自定义其他的复杂点的分类模型,也欢迎大家fork该项目,并给我们提pull request,一起完善该模型。当然也欢迎大家star该项目

大概就这么多,其实用法很简单。原创文章,转载请说明出处

Recommand

liveportrait
novelling

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342