如何將bert應(yīng)用在rasa-nlu-gao
將BERT
應(yīng)用到rasa-nlu-gao亩鬼,其實(shí)在rasa對話系統(tǒng)踩坑記(四)的開頭有簡單提到過山害。當(dāng)時(shí)覺得沒什么嘉涌,所以就略過了。但最近肖大神的bert-as-service項(xiàng)目改動(dòng)的比較大固惯,致使有朋友反饋現(xiàn)在BERT
的component跑不了了梆造,所以今天將bert-as-service
更新到了最新的版本和最新的方法,這兒做個(gè)簡單的總結(jié)。具體的demo可以參照rasa_chatbot_cn镇辉。
BERT
BERT這個(gè)深水炸彈一經(jīng)引爆屡穗,在nlp領(lǐng)域反響劇烈。幾乎席卷了nlp的所有領(lǐng)域忽肛。如果用一句話形容BERT的出現(xiàn)村砂,一切過往,皆為序章屹逛。
那當(dāng)然作為rasa-nlu的資深玩家础废,當(dāng)然不能錯(cuò)過,所以早在一個(gè)月前我就加上去了罕模。然后最近根據(jù)bert-as-service這個(gè)項(xiàng)目的更新做了調(diào)整评腺。
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`
然后需要下載一個(gè)Pre-trained BERT Model蒿讥,再啟動(dòng)一個(gè)BERT服務(wù)
bert-serving-start -model_dir /tmp/chinese_L-12_H-768_A-12/ -num_worker=4
對應(yīng)的bert-serving-start的參數(shù)參見bert-as-service
rasa_nlu_bert_finetune(增加@2019-01-11)
之前在rasa-nlu-gao中使用bert訓(xùn)練,是用的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
訓(xùn)練finetune前先要準(zhǔn)備好rasa json的訓(xùn)練數(shù)據(jù),train為rasa_dataset_training.json全封,dev為rasa_dataset_testing.json马昙,這只是命名的問題。訓(xùn)練完成之后售貌,需要在bert-as-server命令行中加上tuned_model_dir
這個(gè)參數(shù)即可给猾,比如:
bert-serving-start -model_dir ./chinese_L-12_H-768_A-12/ -num_worker=4 -tuned_model_dir ./rasa_model_output/
這樣的話疫萤,之后使用bert_vectors_featurizer
調(diào)用就會(huì)是finetune之后的model了颂跨。就是如此簡單 :)
bert_vectors_featurizer
我在rasa-nlu-gao
中增加了bert_vectors_featurizer組件,并已發(fā)布扯饶,請pip install rasa-nlu-gao
至最新版本恒削。如名字所示,bert_vectors_featurizer組件只是提供word embedding featurizer.后面可以接其他的分類器尾序,這里用的是intent_classifier_tensorflow_embedding組件钓丰,當(dāng)然你也可以自己加個(gè)全連接和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: 指的是從客戶端傳到服務(wù)端數(shù)據(jù)的端口每币,需要和服務(wù)端設(shè)置的一致
- prot_out: 指的是將結(jié)果從服務(wù)端傳到客戶端的端口携丁,需要和服務(wù)端一致
- show_server_config: 是否在第一次連接時(shí)候展示服務(wù)端的config信息
- timeout: 設(shè)置客戶端接收服務(wù)端操作的過期時(shí)間
intent_classifier_tensorflow_embedding_bert
bert_vectors_featurizer
說的是將bert應(yīng)用在詞嵌入方面,然后在意圖分類這塊可以接rasa-nlu官網(wǎng)的intent_classifier_tensorflow_embedding
組件。當(dāng)然這里的intent_classifier_tensorflow_embedding_bert
組件是同組的飛龍同學(xué)加的梦鉴。該組件是將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"
除了這兩個(gè)模型外,還可以自定義其他的復(fù)雜點(diǎn)的分類模型肥橙,也歡迎大家fork該項(xiàng)目魄宏,并給我們提pull request,一起完善該模型存筏。當(dāng)然也歡迎大家star該項(xiàng)目宠互。
大概就這么多,其實(shí)用法很簡單椭坚。原創(chuàng)文章予跌,轉(zhuǎn)載請說明出處