电商搜索场景结构化匹配 使用命名实体识别(NER)+类目预测(意图识别)+bert4keras实现k-bert

上一篇的文章中电商搜索使用BM25算法召回+其他匹配特征主要讲了BM25算法的召回以及一些特征的融入,本篇继续进行剩余特征如核心词匹配,同义词匹配  ,上下位词,query类目与商品title类目匹配以及商品的业态等特征

整体结构图如下:

示例:  乐事薯片黄瓜   

        分词: 乐事   薯片  黄瓜   

        词性:品牌,商品核心词,口位词 

这里面 补充一下:

一.分词的话你可以参照  知乎上面的 分词或者命名实体识别融合词典

二.词性匹配要注意 词性消歧义,因为不同的词在不同的商品中可能会有不同的词性,例如山东新鲜黄瓜, 黄瓜味薯片  这里面的黄瓜分别为商品核心词,口位词

具体的做法  当然不局限这些,你都可以尝试:



        譬如:

        黄瓜薯片  黄瓜为口位词属性

        黄瓜茄子组合  黄瓜为商品核心词


基于规则分词处理方法:

        1.根据类目信息,假设有分词性中有两个商品核心词a,b ,c为类目信息,要进行过滤
p(a|b,c)=p(a,b,c)/p(b,c)
p(b|a,c)=p(a,b,c)/p(a,c)
比较两个核心词谁是谁的典型

p(a|b,c)<p(b|a,c) 则选取a为核心词否则选取b

        2.根据term权重  tfidff,deepct或者其他的

        3.相似度模型,可以根据类目预测的模型,或者向量召回的模型 来进行相似度的权重衡量,分别计算不同的term 占原query或者原商品名称的cos值,占比越大可以作为最核心的词



基于模型处理的方法:
        1.预训练增加相应的知识   融入类目信息,cls .....sep....sep....sep   分别为 query  商品 类目信息  
loss=mlm_loss+quer是否匹配商品   (可以参照美团技术预训练搜索)

        2.融入额外知识,k-bert,k-adapter, gcn网络 组合 编造品牌,商品核心词,口位词的图谱关系(spellgcn 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 Pytorch框架基于BERT-BILSTM-CRF实现的中文命名实体识别python源码+详细项目说明.zip 依赖 ```python python==3.6 (可选) pytorch==1.6.0 (可选) pytorch-crf==0.7.2 transformers==4.5.0 numpy==1.22.4 packaging==21.3 ``` **** 这里总结下步骤,以cner数据为例: ```python 先去hugging face下载相关文件到chinese-bert-wwwm-ext下。 目录结构: --pytorch_bilstm_crf_ner --model_hub ----chinese-bert-wwm-ext ------vocab.txt ------config.json ------pytorch_model.bin 1、原始数据放在data/cner/raw_data/下,并新建mid_data和final_data两个文件夹。 2、将raw_data下的数据处理成mid_data下的格式。其中: --labels.txt:实体类别 ["PRO", "ORG", "CONT", "RACE", "NAME", "EDU", "LOC", "TITLE"] --nor_ent2id.json:BIOES格式的标签 {"O": 0, "B-PRO": 1, "I-PRO": 2, "E-PRO": 3, "S-PRO": 4, "B-ORG": 5, "I-ORG": 6, "E-ORG": 7, "S-ORG": 8, "B-CONT": 9, "I-CONT": 10, "E-CONT": 11, "S-CONT": 12, "B-RACE": 13, "I-RACE": 14, "E-RACE": 15, "S-RACE": 16, "B-NAME": 17, "I-NAME": 18, "E-NAME": 19, "S-NAME": 20, "B-EDU": 21, "I-EDU": 22, "E-EDU": 23, "S-EDU": 24, "B-LOC": 25, "I-LOC": 26, "E-LOC": 27, "S-LOC": 28, "B-TITLE": 29, "I-TITLE": 30, "E-TITLE": 31, "S-TITLE": 32} --train.json/dev.json/test.json:是一个列表,列表里面每个元素是: [ { "id": 0, "text": "常建良,男,", "labels": [ [ "T0", "NAME", 0, 3, # 后一位 "常建良" ] ] }, ...... ] 3、在preprocess.py里面修改数据集名称和设置文本最大长度,并按照其它数据一样添加一段代码。运行后得到final_data下的数据。 4、运行指令进行训练、验证和测试: python main.py \ --bert_dir="../model_hub/chinese-bert-wwm-ext/" \ --data_dir="./data/cner/" \ --data_name="cner" \ --model_name="bert" \# 默认为bert --log_dir="./logs/" \ --output_dir="./checkpoints/" \ --num_tags=33 \# BIOES标签的数目 --seed=123 \ --gpu_ids="0" \ --max_seq_len=150 \# 文本最大长度,和prepcoess.py里面保持一致 --lr=3e-5 \ --crf_lr=3e-2 \ --other_lr=3e-4 \ --train_batch_size=32 \# 训练batch_size --train_epochs=3 \# 训练epoc
好的,下面是bert-bilstm-crf-ner模型的代码实现(Python): ```python import torch import torch.nn as nn from transformers import BertModel class BertBilstmCrfNer(nn.Module): def __init__(self, num_tags, hidden_dim=768, bert_model_name='bert-base-chinese'): super(BertBilstmCrfNer, self).__init__() self.bert = BertModel.from_pretrained(bert_model_name) self.dropout = nn.Dropout(0.5) self.bilstm = nn.LSTM(hidden_dim, hidden_dim // 2, num_layers=2, bidirectional=True, batch_first=True) self.fc = nn.Linear(hidden_dim, num_tags) self.crf = nn.CRF(num_tags, batch_first=True) def forward(self, input_ids, attention_mask, labels=None): bert_output = self.bert(input_ids=input_ids, attention_mask=attention_mask)[0] bert_output = self.dropout(bert_output) lstm_output, _ = self.bilstm(bert_output) logits = self.fc(lstm_output) if labels is not None: loss = -self.crf(logits, labels, mask=attention_mask.byte(), reduction='mean') return loss else: pred_labels = self.crf.decode(logits, mask=attention_mask.byte()) return pred_labels ``` 该模型使用BERT作为预训练模型,使用了BiLSTM作为特征提取器,并使用CRF作为序列标注器。在模型中,我们首先使用BERT模型对输入进行编码,然后通过BiLSTM提取特征,最后通过全连接层将提取的特征映射到标签空间。在训练时,我们使用CRF计算损失,并通过反向传播更新模型参数。在推理时,我们使用CRF进行解码,得到最终的标签序列。 模型的输入是一个batch的文本序列,每个文本序列已经使用BERT进行编码,因此输入是一个二维张量,形状为(batch_size, sequence_length, hidden_dim)。另外,我们还需要提供一个attention_mask张量,用于指示输入中的实际文本序列部分。标签序列是一个二维张量,形状为(batch_size, sequence_length),每个元素代表一个标签。在训练时,我们需要提供标签序列,用于计算损失;在推理时,我们不需要提供标签序列,而是通过CRF进行解码,得到最终的标签序列。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值