基于HMM和CRF的命名实体识别

基于HMM和CRF的命名实体识别

前段时间,上了机器学习课程,然后老师布置了个大作业,使用具体的模型应用到具体的任务

我写了一个基于HMM和CRF的命名实体识别代码。在此总结一下。

数据集

数据集是从网上获取的一个简历数据集,存储在/data目录中,分为三个文件,分别是train.char.bmestest.char.bmesdev.char.bmes文件。三个文件统一用BIOES标注方法标注。如下图所示,每一行为一个中文字符及其对应的标记标注,中文字符和标记用空格隔开。句子与句子之间用换行符分割。

train.char.bmes有将近10万个中文字符,test.char.bmesdev.char.bmes分别有大约1.5万个中文字符。数据集中的实体类别包括NAME(名字)、CONT(国籍)、EDU(学历)、TITLE(头衔)、ORG(组织)、RACE(民族)、PRO(专业)、LOC(籍贯)。

命名实体识别的任务是同时准确识别命名实体的边界和类别

HMM

隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐马尔可夫随机生成的状态的序列,称为状态序列;每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列。

特别注意:隐马尔可夫模型是生成模型,先生成状态序列,然后由状态序列生成观测序列。即是先P(Z),再P(O|Z),所以拟合的是P(O,Z),也就是联合概率分布

具体的代码流程

  • 极大似然估计,估计出隐马尔可夫模型的三个参数初始概率矩阵发射概率矩阵状态转移概率矩阵

  • 维特比算法,维特比算法对输入的观测序列进行解码,得到状态序列(也就是我们要的标签序列)

  • 结果评估, 调用seqeval库。

    classification_report(real, predict, digits=6)
    #classification_report有三个参数
    #第一个参数,是真实的序列标签(必须二维序列,即多个句子)
    #第二个参数,是预测出的序列标签(必须二维序列,即多个句子)
    #第三个参数,是输出的小数点位数
    

如果没学习过隐马尔可夫模型,建议认真阅读李航老师的统计学习方法

CRF

CRF的原理,参考李航老师的统计学习方法

具体代码流程(使用的是sklearn_crfsuite中的CRF库)

  • 定义基本的模型

    self.model = CRF(algorithm=algorithm,
    				c1=c1,
    				c2=c2,
    				max_iterations=max_iterations,
    				all_possible_transitions=all_possible_transitions)
    #algorithm是选择的梯度下降算法,可以选择lbfgs
    
  • 提取特征、进行训练

    def word2features(sent, i):
        """抽取单个字的特征"""
        word = sent[i]
        prev_word = '<s>' if i == 0 else sent[i-1]
        next_word = '</s>' if i == (len(sent)-1) else sent[i+1]
        # 使用的特征:
        # 前一个词,当前词,后一个词,
        # 前一个词+当前词, 当前词+后一个词
        features = {
            'w': word,
            'w-1': prev_word,
            'w+1': next_word,
            'w-1:w': prev_word+word,
            'w:w+1': word+next_word,
            'bias': 1
        }
        return features
    
    
    def sent2features(sent):
        """抽取序列特征"""
        return [word2features(sent, i) for i in range(len(sent))]
    
  • 结果评估,同样调用的是seqeval库

结果截图

运行方式,直接运行main.py, 可能需要装一些库

代码地址 https://github.com/zyxdSTU/NER-CRF-HMM

参考

https://github.com/chakki-works/seqeval

https://github.com/tostq/Easy_HMM

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
命名实体识别(Named Entity Recognition,NER)是自然语言处理(Natural Language Processing,NLP)领域中的一个重要任务,旨在从文本中识别出具有特定含义的实体,如人名、地名、组织机构名等。 NER 是信息抽取、问答系统、机器翻译等应用的基础,其研究意义和应用价值已被广泛认可。在 NER 的研究过程中,学者们提出了许多不同的方法,包括基于规则、基于统计的机器学习方法和深度学习方法等。 基于规则的方法主要是通过人工编写规则来实现 NER,例如基于正则表达式、模式匹配等技术,但是这种方法需要大量的人工劳动和专业知识,且很难涵盖所有可能的实体类型和变体形式,因此难以满足大规模应用的需求。 基于统计的机器学习方法通过对训练语料进行统计分析来学习实体识别模型,包括传统的基于词典、HMMCRF 等模型,这种方法具有一定的准确率和可扩展性,但是需要大量的人工特征工程,并且对训练数据的质量和数量有较高的要求。 近年来,深度学习方法的兴起使得 NER 取得了更加出色的表现,其中基于循环神经网络(Recurrent Neural Network,RNN)和长短时记忆网络(Long Short-Term Memory,LSTM)的方法尤其受到关注,能够自动提取特征并进行实体识别,不需要手工设计特征,但是对训练数据的数量和质量要求较高,且需要大量的计算资源。 总的来说,命名实体识别作为自然语言处理领域的一个重要任务,其研究方法和应用都在不断发展和进步。未来,我们可以期待更加先进和高效的 NER 技术被应用到更多的领域和场景中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值