Rasa 项目总结

介绍:我做的是rasa项目中的数据处理不部分,以及实体提取和意图识别部分,整个项目参考的是rasagao,可以用 pip install rasa-nlu-gao

一. 关于数据处理部分

关于数据生成我用的是Chatito,https://github.com/GaoQ1/chatito_gen_nlu_data 这个里面包含了该用法

二. 数据分词处理

在这个项目中,数据分词中用的是 jieba.tokenize(text),在这个里面由于涉及到了 专属名词,因此使用了自定义字典,jieba.load_userdict(jieba_userdict)(读取自定义字典的专属名词,看句子中是否存在,若存在就不分开,比较耗时,因为每句话都要去检查一遍),这句话将处理之后的数据放入tokens中,example.set(“tokens”, self.tokenize(example.text)),这个里面的具体内容就是:每一个句子 分好词之后的 词+该词在这句话中的 开始位置,下文有用到

将句子分词之后,下面开始进行实体抽取(实体因为自定义字典,所以没有分隔开,为实体抽取提供了可能,不然实体都被分开了,下文实体通过分好词之后直接拿的,就拿不出来实体)

三.关于实体抽取的几种方法

1.CRF进行实体抽取

1.将数据以及实体一一对应起来,data[‘entities’] = entities
2.对每个句子,拿到 实体所在整个句子中的起始位置和结束位置,[(12, 14, ‘价格’), (15, 17, ‘餐桌’)]类似于这样,entity[“start”], entity[“end”], entity[“entity”],(在分词的时候就已经做好)
3. 得到整个句子的实体(在2中已经拿到),然后做bilou处理,处理完之后的结果是[(‘帮’, None, ‘O’, {}), (‘我查’, None, ‘O’, {}), (‘一下’, None, ‘O’, {}), (‘我’, None, ‘O’, {}),(‘的’, None, ‘O’, {}), (‘流量’, None, ‘U-item’, {}),(‘有’, None, ‘O’, {}), (‘多少’, None, ‘O’, }{)],可以看得到,如果是实体,那么在第三个位置上面,将不会是
O

4. 将句子处理成词向量,首先句子是使用 crf feature 进行处理,不知道具体怎么处理的,然后对于实体处理,也就相当于这个句子的目标,通过上面的bilou处理,直接抽取第三个位置的数就行,抽取之后,每个句子的目标标签就成了 [O,O,O,O,O,U-item,O,O](一个句子的标签)
5. 然后进行训练,sklearn_crfsuite.CRF(),不知道具体怎么训练的,CRF太高深了.

2.通过bilstm进行实体抽取

1.前两步和crf 实体抽取一样,即 将实体对应,并且拿到一个句子里的实体对应的开始和结束位置,就是上面你的 1.1,1.2

2.对于数据处理的部分就不相同了,这个是将数据中的每个字全部分开,然后变成一下样子,train_sentences= [‘你’, ‘O’], [‘好’, ‘O’], [‘帮’, ‘O’], [‘我’, ‘O’], [‘查’, ‘O’], [‘一’, ‘O’], [‘查’, ‘O’], [‘放’, ‘B-business’], [‘款’, ‘I-business’], [‘渠’, ‘I-business’], [‘道’, ‘I-business’],如果是实体的话,后面就不会是O

3.将上面的(train_sentences[0],第一个位置)进行频率统计,一个每个字对应在vocabulary中所在的位置,就想之前做的词汇变一样,一字一字分开,char_to_id 字符 到 ID {吗’: 51, ‘户’: 4} ,id_to_char ID到字符 {0:“我”,1:“行”}

4.再次,对上面的(train_sentences[1],第二个位置)也进行 tag_to_id 字符到ID {I-location’: 5, B-organ: 1, B-organ: 3},id_to_tag ID到字符 {0:0,1:I-organ,1:I-location} 的映射,这个相当于目标标签

5.拿到上面的char_to_id, tag_to_id和开始的train_sentences,再进行一次数据处理,加入seg这个特征,得到train_data,这个train_data里面的参数需要详细介绍一下
train_data 包含四个[string, chars, segs, tags]
string 所有的输入[‘浦’, ‘发’, ‘银’, ‘行’, ‘呢’]
chars 是所有的输入的字符对应的位置[115, 109, 101, 37, 75]
segs [1, 2, 2, 3, 0] 1代表的是词和实体的开头,2表示中间部分,3代表结束,0代表不是实体的单子
tags [11, 10, 10, 13, 0] 若是实体就不会是0,因为train_sentences[1]不是0了),
(11, 10, 10, 13 一个实体这么会有四个呢?答: B-organ, I-organ, I-organ, I-organ, E-organ)

将得到的train_data进行批次处理,每一批里面放二十条数据,一共可以分为 总条数/20 批。

6.首先声明一个大矩阵 embedding ,shape(?, ?, 120) ,100维的字向量,20维的tag向量
shape(batch_size 句话, 一句话多少字, 120),这个最大矩阵的初始向量经过**self.initializer = initializers.xavier_initializer()**处理,保证全中初始的参数不大不小(太大/太小:在每层传递的过过程中会越来越大/小)
7.每个句子在进入bilstm之前都会先经过上一步声明的大矩阵,然后变成词向量,在经过一个dropout(),biLSTM_layer(model_inputs, self.lstm_dim, self.lengths),句子长度lengths确定方法:tf.reducesum(sign(abs(text))),biLSTM_layer就用了一个双向的lstm,然后再进如一个全连接层,得到输出结果,然后和正确结果对比,用crf计算损失函数

3.通过idcnn进行实体抽取

1.其他的一模一样,只是在训练的时候,使用的算法不一样
2.算法部分:如何使用 膨胀卷积网络处理训练文字呢?
其输入的shape是 shape(batch_size, 1, n_steps, 120),就相当于[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],卷积核的shape是 shape of filter = [filter_height, filter_width, in_channels, out_channels],[13120*100],可以看到输入的高度都是1,宽度是一句话有多少个字,而图像的通道数是一个字用多少个维度表示,是120维,(100 字向量+20tag向量),这里的使用了一次 layerInput = tf.nn.conv2d(model_inputs,
filter_weights,
strides=[1, 1, 1, 1],
padding=“SAME”,
name=“init_layer”, use_cudnn_on_gpu=True)
之后再循环里面,训练了 conv = tf.nn.atrous_conv2d(layerInput,
w,
rate=dilation,
padding=“SAME”)
conv = tf.nn.bias_add(conv, b)
conv = tf.nn.relu(conv)
再经过 全连接成+激活函数

三.使用bert进行文本特征提取

1.使用bert将每一句话都变成词向量
2.bert_embedding = self.bc.encode(all_tokens, is_tokenized=True)
3.example.set( “text_features”, self._combine_with_existing_text_features(example, X[i])

四.关于意图分类方法

1.要抽取每句话的意图,在使用set去重,*setexample.get(“intent”)*用enumerate得到字典intent_dict
2.np.eye(len(intent_dict)),生成 len(intent_dict)行len(intent_dict)列的矩阵
3.下边重点来了,要提前三个向量,第一个X(每句话的词向量(1019,768)),通过之前bert训练好的直接拿,e.get(“text_features”) for e in training_data.intent_examples。第二个intents_for_X(表示的是每一行的意图是第几个位置(1019,))intent_dict[e.get(“intent”)]
for e in training_data.intent_examples]
,。第三个 将第二个词向量与第2步结合起来,便能得到Y(真正的标签(1019,len(intent_dict)))self.encoded_all_intents[intent_idx] for intent_idx in intents_for_X]
4.

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值