之前做过一段时间的命名体识别,本文会从我自己的实际工作经验出发,希望可以给大家一些带来一点帮助
建了仓库,地址在这里:
https://github.com/DA-southampton/ner
点star 不迷路,相关文章在github上更新的会更频繁一点QAQ,在仓库会把之后看过的文章更新在上面
微信公众号: NLP从入门到放弃
(我果然是个渣渣,公众号名字都这么渣....欢迎关注)
项目背景其实也很简单,就是我要做一个关键词匹配的功能,第一步我需要挖掘关键词。关键词的挖掘方法很多,基线一般就是TF-IDF,然后你再根据效果和自己的数据做相关优化就可以。亲测TF-IDF效果已经很不错了。不过,我这里比较特殊,我在使用TF-IDF之后,又对数据做了补充,我在数据调研之后发现对于一部分领域文本,比如说娱乐领域,明星领域,财经领域等等吧,这些领域的文本很有特色,一般人名/地名/公司名称/书名/电影名称都可以很好的表示文本关键信息。
这里小声插一句,对于关键词匹配这种东西,大家千万不要瞧不上,有些时候一个关键词匹配就在文本分类这样的简单任务就可以做到比较不错的效果。而且一般工业上,关键词匹配也有很多细节可以挖,比如如何扩充关键词词典,不同领域关键词有何区别,匹配算法如何高效执行(一般都是用树相关算法来做匹配)等等。
在这种项目背景之下,很自然的就会想到使用命名体识别。我把在做这个项目的过程中,积累的一些资料总结了一下,希望对大家有所帮助。
关于命名体识别,这是个很大的领域,要是做好,有很多工作要做。标题完全是为了能增加曝光,自己还是知道只是一个小学生,我会把自己看过的有用的东西都列出来,给大家提供一些先验信息。
之后看到的关于nert的文章会在此基础继续更新(最近存了好多新文章还没看/苦逼码农/QAQ),不过建议大家star一下Github,地址在开头,不迷路,我给自己的计划是实时更新这个仓库,精读一些论文和博客,做一些思维导图,复现一些代码。
对于命名体识别的代码这一块,我大概的经验就是,工作中很少直接就上复杂模型,一般都是先来简单模型,然后在优化迭代。我给个大概的方向(大家视情况而定):
词典匹配-->HMM/CRF-->BiLSTM-CRF-->Bert系列
一般来说词典匹配是最简单的,也是最快的。不过很依赖于你的词典情况。一般来说,词典的补充需要你自己搞定。
我简单给几种我自己用过的方法:
比如找相关的运营人员/产品人员,因为他们比较靠近一线工作,手上会积累一些相关的词典。
使用合法爬虫手段(至于如何合法就自己考虑吧)去专业的垂直领域网站获取数据补充词典。
比如你可以获取已经有的关键词的同义词来扩充
这里我大概说一下第三条,这个涉及到了如何获取同义词(nlp好复杂啊,退NLP保平安)。
我自己的经验就是,一般来说同义词获取你可以在自己平时维护一个同义词库,功夫下在平时,这个同义词库也有很多功能,简单说比如你可以用来看你自己训练的微博词向量的效果如何,自己定个阈值,看看词向量有没有做到相近词的向量相近,当然也有的大佬怀疑相近词的词向量相近这个方法不能作为判定词向量好坏的方法)
同义词还可以用来做任务的数据增强,比如你做个文本分类,数据有点少,处理调换顺序之类的方法,也可以试试同义词做数据增强。
好!言归正传,再说下去,ner就没地方写了,各位大大估计也没耐心了。大家关注我的公众号,相关文文章我会在后面排期写出来的(感觉挖了好多坑,哭了)
下面我大概分为两个个模块,第一个是各种模型的代码实现相关资源,第二个就是关于命名体识别基础知识之类的相关资源
代码不再多,把一个反复看,看懂了,自己能写出来做二次开发就可以,不要今天看一个代码明天换一个代码看(小声嘟囔)
Bert系列 (Bert/Albert-softmax/CRF/Span/Span+focal_loss/Span+label_smoothing)做命名体识别
https://github.com/lonePatient/BERT-NER-Pytorch
简单介绍:仓库下面有Bert系列完成命名体识别的效果对比(一般来说看F1就可以)以及训练时间之类的比较,很推荐大家去看一看
BiLSTM-CRF实现命名体识别(Pytorch版本)
https://github.com/yanwii/ChinsesNER-pytorch?files=1
简单介绍:BiLSTM-CRF我就推荐这一个吧,其他的都是大同小异,大家可以一步步去调试,做二次开发就可以,比如换个损失函数之类的。
NLP实战-中文命名实体识别-HMM/CRF 代码的实现
https://zhuanlan.zhihu.com/p/61227299
简单介绍:(引用原文)本文章将通过pytorch作为主要工具实现不同的模型(包括HMM,CRF,Bi-LSTM,Bi-LSTM+CRF)来解决中文命名实体识别问题,文章不会涉及过多的数学推导,但会从直观上简单解释模型的原理,主要的内容会集中在代码部分。
隐马尔可夫模型命名实体识别NER-HMM-1
https://www.bilibili.com/video/BV1MJ411w7xR?from=search&seid=10101366636483430700
隐马尔可夫模型命名实体识别NER-HMM-2
https://www.bilibili.com/video/BV1uJ411u7Ut
简单介绍:不愿意看书想看视频的同学可以看一下这个,B站首页偶然推荐给我的(推荐算法精准石锤了),讲的确实好
双向最大匹配和实体标注:你以为我只能分词?------这个是词典方法命名体识别
https://zhuanlan.zhihu.com/p/133532494
简单介绍:这个作者总结了自己实体词典+jieba词性标注进行实体自动打标,有Python代码实现,大家可以关注一下这个博主,名字叫“叫我NLPer”,行文很有意思
基本上代码,我觉的看上面几个就够了吧,反复咂摸一下。
有些时候看到有人说,要想对某个概念真正有所了解,一定要看原论文。这句话肯定没错,但是不是有些时候没时间看论文吗(哭了苦逼码农)。而且有些博客讲的是真的好啊。我大概罗列一些我局的真心不错的文章,主要就是HMM/CRF/Bilstm-CRF
概率图模型体系:HMM、MEMM、CRF
https://zhuanlan.zhihu.com/p/33397147
这个文章传播的比较广,讲的确实比较详细,不过大佬写的有些地方还是有些小问题,大家自己去挖掘吧。。。
最通俗易懂的BiLSTM-CRF模型中的CRF层介绍-孙孙的文章
https://zhuanlan.zhihu.com/p/44042528
这个文章讲的是对CRF模型的讲解,翻译的外文,原文很精彩,看译文也可以。大概讲一下,在看的过程中,要多琢磨。比如CRF有个特点全局归一化,这是区别于MEMM模型的;比如在代码实现的时候,我们一般都是使用log,所以乘法会对应加法,这样你在看源代码时候就不会懵逼;比如CRF损失函数有两个部分组成,分别有啥作用。
ner自动化打标方法
https://zhuanlan.zhihu.com/p/133532494
叉烧大佬讲了一下如何用词典+最大逆向匹配做命名体识别整体思路,代码的实现可以参考第一部分那个Python代码
中文NER任务实验小结报告——深入模型实现细节
https://zhuanlan.zhihu.com/p/103779616
作者写了一下自己在做命名体识别的时候针对Bert的优化:BERT+CE_loss;BERT+lstmcrf;尝试用更少的标签列表;对损失函数进行了优化尝试(解决类别不平衡,因为O类别太多了);BERT+MRC;(改天我可能要精读一下,大佬写了很多内容,感觉有很多细节可以挖)
如何通俗地讲解 viterbi 算法?
https://www.zhihu.com/question/20136144/answer/763021768
讲解了维特比算法,维特比一般是用于解码
小标注数据量下自然语言处理实战经验
https://www.jiqizhixin.com/articles/2019-08-16-6
简单介绍:小标注数据如何处理