句向量标注
- 用 bert 生成句向量
- 用 lstm 或 bert 承接 bert 的输出,保证模型可以学习到内容的连续性。此时 lstm 输入形状为:
pooled_output.unsqueeze(0)
(1, num_sentence, vector_size)
应用场景
- 词性标注
- 句法分析
- 命名实体识别
ner 任务 - 中文分词
寻找词的边界 - 远程监督
滚雪球思路,在语料库中,从一个实体,找新的实体,携带新实体继续循环预测找新实体
CRF
pip install torch-crf
from torchcrf import CRF
- 限制实体的类别到类别之间的转移关系
- 模型的输出即发射矩阵
模型可以是 bert、GRU、LSTM 等等。 - 当模型足够好时,使用 crf 前后结果可能不大(几个百分点的提升)
如果使用 crf 后效果不明显,则不应该使用 crf
使用 crf 会多出大量的计算,如转移矩阵、篱笆墙解码的处理
- CRF 核心逻辑
- 开始转移矩阵
开始到每个可能标签的转移概率
label_num - 结束转移矩阵
每个可能标签到结束的转移概率
label_num - 状态转移矩阵
任意两个相邻标签间的转移概率
label_num * label_num - 篱笆墙解码
- 假设每组节点平均数量为 D,B 为 beamSize
- beam search
- 保存n 条最高概率的路径
仅保存一条时,称为贪婪解法 - 仅计算高概率路径的转移概率
- 时间复杂度 n * D * B
B=D 时
beam search = 维特比解码 - 维特比解码
- 保留从上一层全部节点,到当前层每个节点中,最高概率的一条路径
- 时间复杂度 n * D^2
- 暴力求解
时间复杂度 D^n - 除了暴力求解,都有可能错过最优解
- 发射矩阵
seq_len * label_num
- 实体标签重叠问题
- 忽略较短的实体
- 使用 moe 思路,分别用对应类型的 label,构建和输出 fc 和 loss,最后把所有 loss 求和
- 用生成式模型处理
- 有时,可以用规则进行实体识别
正则表达式re.search(pattern, string)
re.match(pattern, string)
re.findall(pattern, string)
re.sub(pattern, string)
re.split(pattern, string)
规则
- 输入与输出是等长的序列
- 对序列中的每个时间步做分类
例如在文本中时间步就是一个字或词 - 需要对每个时间步都打上标签
- 本质上相当于每个节点都要做一次分类,做一次 loss