目录
实现基于条件随机场模型的中文分词
在中文分词领域,基于字标注的方法得到广泛应用,通过字标注分词问题可转换为序列标注问题,现在分词效果较好且常用的是基于条件随机场(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