基于条件随机场模型的中文分词实现(Python中文分词)

目录

实现基于条件随机场模型的中文分词

词语特征学习

一、读取语料库

二、求出特征二(R)

三、求出特征三(P)

四、求出特征四(W)

开始分词

项目完整代码和截图

项目代码

结果截图

不打印特征二、三、四的截图

打印特征后的截图


实现基于条件随机场模型的中文分词

在中文分词领域,基于字标注的方法得到广泛应用,通过字标注分词问题可转换为序列标注问题,现在分词效果较好且常用的是基于条件随机场(CRFs)的标注模型。其模型思想是,条件随机场模型对应一个无向图 ,,Y中的元素与无向图的顶点一一对应。在条件X下,随机变量 的条件概率分布符合图的马尔科夫性质,即可称当前是一个条件随机场。条件随机场模型用于在给定需要标记的观察序列的条件下,计算整个编辑序列的联合概率分布,求解出句子中字的标记序列的联合概率分布,从而实现分词。

基于条件随机场模型的中文分词改进:https://blog.csdn.net/admiz/article/details/109882968

词语特征学习

一、读取语料库

采用Python的open( ) 函数读取ic文件,设置读取编码为'utf-8-sig'后打开名为"msr_training.utf8.ic"的语料库,再用readlines( )函数将语料库的每一行作为wordFeed列表的一个元素,通过len( )函数求得语料库的长度wordFeedLen。其中wordFeed列表内每个元素的格式为:[A|B], “A”为一个字,“B”为该字所处的状态。数据格式如下图,数据下载链接:https://download.csdn.net/download/admiz/13132232

二、求出特征二(R)

为求出特征二,先针对的某个字,统计出所它在语料库中出现的总次数,再计算它的状态为词头(B)、词中(M)、词尾(E)、单字成词(S)的概率。

在进行针对某个字的统计前,先设储存结果的数据结构为字典,其具体结构如{A:[B,M,E,S]},其中“A” 为所针对的字,“B”为该字在词头的概率,“M”为该字在词中的概率,“E”为该字在词尾的概率,“S”为该字单字成词的概率。

该步骤部分伪代码如下:

i为要求特征二的某个字

初始化BDict为空字典

初始化B、M、E、S、BMESsum为0

for j in range(wordFeedLen):
    if wordFeed[j][0] == i:
        if wordFeed[j][2] == 'B':
            B = B+1
        elif  wordFeed[j][2] == 'M':
            M = M+1
        elif  wordFeed[j][2] == 'E':
            E = E+1
        elif  wordFeed[j][2] == 'S':
            S = S+1
    BMESsum = B+M+E+S
    BDict[i] = [B/BMESsum,M/BMESsum,E/BMESsum,S/BMESsum]

三、求出特征三(P)

求特征三是针对某个字,分别计算出它在当前状态B、M、E、S时,它转移到下一个字的状态为B、M、E、S的概率。 统计所针的某个字在全文中出现的总次数,并计算它的状态为词头(B)、词中(M)、词尾(E)、单字成词(S)的概率。针对4种状态,会形成一个4x4的矩阵,矩阵中的值是它们相互之间的转移概率。

在进行针对某个字的统计前,先设储存结果的数据结构为字典,其具体结构如:

{ A:[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]} ,其中“A”为所针对的字,列表内的第一个元素(即所加粗列表)表示:为当“A”为状态B时,下一个字的状态为B、M、E、S的概率与该元素内的[0,0,0,0]一一对应,以此类推。

该步骤部分代码如下:

(1)创建及初始化字的4x4的矩阵(字典)

def setDict2(testWord):   #testWord为句子每个字的列表
    testDict = { }
    for i in testWord:
        testDict[i]=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]  #[B,M,E,S]的四阶矩阵
    return testDict

(2)特征三内的判断判断函数

def charCJudge(i,mark1): #i为要判断的字符 mark1为i的状态
    B=0
    M=0
    E=0
    S=0
    BMESsum=0
    for j in range(wordFeedLen):
    if i == wordFeed[j][0] and wordFeed[j][2]==mark1 and j+1<len(wordFeed):
        if wordFeed[j+1][2] == 'B':
            B=B+1
        elif  wordFeed[j+1][2] == 'M':
            M=M+1
        elif  wordFeed[j+1][2] == 'E' :
            E=E+1
        elif  wordFeed[j+1][2] == 'S' :
            S=S+1
        else:
            pass
     BM
  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于条件随机场模型中文分词代码,使用CRF++工具包: 1. 数据准备 首先将训练数据和测试数据转换成CRF++的格式,格式为每个词和标注用空格隔开,句子之间用空行隔开,例如: 中 B 国 E 是 S 一个 S 伟 B 大 E 的 S 国 S 2. 模型训练 使用CRF++工具包进行模型训练,需要准备好训练数据和模板文件。模板文件指定了特征模板,例如: U00:%x[-2,0] U01:%x[-1,0] U02:%x[0,0] U03:%x[1,0] U04:%x[2,0] U05:%x[-2,0]/%x[-1,0]/%x[0,0] U06:%x[-1,0]/%x[0,0]/%x[1,0] U07:%x[0,0]/%x[1,0]/%x[2,0] 其中,%x[i,j]表示当前位置加上偏移量(i,j)的词和标注,U00-U07则是特征函数的名称。训练命令如下: crf_learn -f 3 -c 4.0 template train.data model 其中,-f指定特征函数的截断阈值,-c指定正则化参数。训练完成后会生成一个模型文件model。 3. 模型测试 使用CRF++工具包进行模型测试,需要准备好测试数据和模型文件。测试命令如下: crf_test -m model test.data > result 其中,-m指定模型文件,test.data是测试数据文件,> result表示将结果输出到result文件中。测试结果为每个词和标注用空格隔开,例如: 中 B 国 E 是 S 一个 S 伟 B 大 E 的 S 国 S 4. 结果评估 使用Python脚本进行结果评估,代码如下: ```python import sys def evaluate(gold_file, pred_file): gold = [] with open(gold_file, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line: word, label = line.split() gold.append(label) pred = [] with open(pred_file, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if line: word, label = line.split() pred.append(label) assert len(gold) == len(pred) correct = 0 for i in range(len(gold)): if gold[i] == pred[i]: correct += 1 accuracy = correct / len(gold) return accuracy if __name__ == '__main__': gold_file = sys.argv[1] pred_file = sys.argv[2] accuracy = evaluate(gold_file, pred_file) print('Accuracy: {:.2%}'.format(accuracy)) ``` 将正确的标注文件和预测的标注文件作为参数传入,即可计算准确率。例如: python evaluate.py test.gold result 输出结果为准确率的百分比。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值