python自然语言处理:第4章 (自己动手的小例子)

本文借鉴3.3.2节的内容,利用1998年人民日报语料库,自行实现HMM模型进行词性标注。虽然未进行多次迭代求收敛,但详细展示了代码实现过程,帮助理解HMM的前向、后向和维特比算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

借鉴3.3.2 节的实现,尝试自己实现HMM 进行词性标注(语料可选用1998年人民日报饲性标注集

(注意没有语料库//download.youkuaiyun.com/download/qq_26954059/12185434 意思一下 其实书中也有资源)

使用两个hmm模型,一个是基于字的hmm分词,c_hmm词性标注,不做解释,自己看代码注释,还有看书,对hmm模型理解,知道前向。后向,维特比,本代码只是单纯走了一遍语料库,并没有多次迭代求收敛,直接上代码

思路:无论分词还是词性标注,都是先找隐藏状态和可观察状态,在分词中每个字的标签为隐藏状态,字为可观察,而在词性标注时每个词语的词性为隐藏,词语为可观察

#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      nkenen
#
# Created:     12/03/2020
# Copyright:   (c) nkenen 2020
# Licence:     <your licence>
#-------------------------------------------------------------------------------
class HMM(object):
    def __init__(self):
        import os

        #用于存取算法中间结果,不同每次都训练
        self.model_file = 'data/hmm_model.pkl'
        self.model_c_file = 'data/hmm_c_model.pkl'
        #隐藏状态值集合
        self.state_list = ['B','M','E','S']

        self.charact_list = ['ag','a','ad','an','b','bg','c','dg','d',
                             'e','eng','f','g','h','i','j','k','l','m','mg',
                             'ng','n','na','nr','ns','nt','nx','nz','o','p',
                             'q','r','rg','s','tg','t','u','vg','v','vd',
                             'vn','vvn','w','x','y','yg','z']
        #参数加载,用于判断是否需要重新加载,model_file
        self.load_para = False
        self.load_c_para = False

    def try_load_c_model(self,trained):
        if trained:
            import pickle
            with open(self.model_c_file,'rb') as f:
                #pickle库是数据持续化,把hmm模型反序列导入字典里
                self.A_c_dic = pickle.load(f)
                self.B_c_dic = pickle.load(f)
                self.Pi_c_dic = pickle.load(f)
                self.load_c_para = True
        else:
            #状态转移概率(状态->状态的条件转移概率a[i][j])
            self.A_c_dic = {}
            #发射概率(该状态中观察到该词语的概率b[j][o[t])
            self.B_c_dic = {}
            #状态的初始概率(各状态初始出现的概率)
            self.Pi_c_dic = {}
            self.load_c_para = False

    def try_load_model(self,trained):
        if trained:
            import pickle
            with open(self.model_file,'rb') as f:
                #pickle库是数据持续化,把hmm模型
@RequiredArgsConstructorLombok库中的一个注解,用于自动生成一个包含所有必需参数的构造函数。它可以用于类级别,对于被该注解修饰的类,Lombok自动生成一个构造函数,该构造函数接收类中所有被修饰为final或@NonNull的字段作为参数,并使用它们来初始化这些字段。 使用@RequiredArgsConstructor注解可以简化代码,省去手动编写构造函数的麻烦。当类中有多个字段需要传递,并且这些字段都是必需的时,使用@RequiredArgsConstructor注解可以一次性生成一个包含所有必需参数的构造函数,避免了手动编写多个构造函数的重复劳动。 需要注意的是,被修饰为final或@NonNull的字段才会被包含在自动生成的构造函数中,而非final且未被@NonNull修饰的字段不会被包含在其中。 示例代码如下所示: ```java import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class MyClass { private final String name; private final int age; private final boolean active; // 自动生成的构造函数 // public MyClass(String name, int age, boolean active) { // this.name = name; // this.age = age; // this.active = active; // } } ``` 上述代码中,使用@RequiredArgsConstructor注解修饰了MyClass类,Lombok自动生成一个包含name、age和active字段的构造函数。开发者无需手动编写这个构造函数,可以直接使用它来实例化MyClass对象,并传入相应的参数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值