作者:担路赢客免费建站 | 来源:互联网 | 2024-10-09 21:44
上期使用LSTM做短文本分类效果不如CNN,或许有朋友会问什么场景下LSTM能体现出序列性的优势,本期使用双向LSTM-CNNs-CRF实现SequenceLabeling。CRF
上期使用LSTM做短文本分类效果不如CNN,或许有朋友会问什么场景下LSTM能体现出序列性的优势,本期使用双向LSTM-CNNs-CRF实现Sequence Labeling。
CRF-条件随机场
Conditional Random Fields,简称CRF
给定一组输入序列的条件下输出另一组序列的条件概率分布,判别式模型。
CRF优点:着眼于局部最优解,在已给出 z 的条件下计算可能的序列 y 的概率分布
LSTM优点:获取长时间序列上样本与样本之间的关系。而BiLSTM可以更有效的获取上下文的特征。
BiLSTM+CRF已在NLP多数场景中表现出让人意想不到的效果。比如分词,相比于传统的分词器,BiLSTM能发挥双向获取句子特征这一优势,分词效果更接近人的感觉。
分词实现的一个简单例子:
>>> print(sg.sentence_cut("ngram是自然语言处理中一个非常重要的概念,通常在NLP中,
人们基于一定的语料库,可以利用ngram来预计或者评估一个句子是否合理。
另外一方面,ngram的另外一个作用是用来评估两个字符串之间的差异程度。
这是模糊匹配中常用的一种手段。本文将从此开始,
进而向读者展示ngram在自然语言处理中的各种powerful的应用"))
['ngram', '是', '自然语言', '处理', '中', '一个', '非常', '重要', '的', '概念',
',', '通常', '在', 'NLP', '中', ',', '人们', '基于', '一定', '的', '语料库',
',', '可以', '利用', 'ngram', '来', '预计', '或者', '评估', '一个', '句子',
'是否', '合理', '。', '另外', '一方面', ',', 'ngram', '的', '另外', '一个',
'作用', '是', '用来', '评估', '两个', '字符串', '之间', '的', '差异', '程度',
'。', '这是', '模糊匹配', '中', '常用', '的', '一种', '手段', '。', '本文', '将',
'从此', '开始', ',', '进而', '向', '读者', '展示', 'ngram', '在', '自然语言',
'处理', '中', '的', '各种', 'powerful', '的', '应用']
CNN在Sequence Labeling中多数使用在英文里,它能更好的提取出单词中的形态信息,例如单词的前后缀;中文里,CNN也可以使用在句子里分词后的字层面,获取更多特征,有兴趣的朋友可以试试。
本期模型的实现来自于论文End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF
训练中使用的数据来自于CoNLL 2003
代码
全部代码链接在文章最后面
Char级的CNN实现
这里初始化embedding权重时使用的Glorot初始化
Word级BiLSTM实现
CRF的实现学习自tutorial-pytorch,不过教程中是逐条数据训练,而本期代码改进为按mini-batch训练
viterbi解码
结果
准确率:91.5%
全部代码
github代码