总体流程
考虑输入的一句话,sSentence="张华平欢迎您",分词流程如下
1、分词 "张/华/平/欢迎/您"
2、posTagging "张/q 华/j 平/j 欢迎/v 您/r"
3、NE识别:人名识别,音译名识别,地名识别 "张/q 华/j 平/j 欢迎/v 您/r" "张华平/nr"
4、重新分词:"张华平/欢迎/您"
5、重新posTagging: "张华平/nr 欢迎/v 您/r"
技术细节
一、分词
1、原始句子:sSentence=张华平欢迎您
2、在头末添加开始符和结束符:sSentence="始##始张华平欢迎您末##末"
3、进行分词,基本思想就是分词的得到的词的联合概率最大:
假设 "张华平欢迎您" 分为 "w_1/w_2/.../w_k" 则
w_1/w_2/.../w_k=argmax_{w_1'/w_2'/.../w_k'}P(w_1',w_2',...,w_k')=argmax_{w_1'/w_2'/.../w_k'}P(w_1')P(w_2')...P(w_k')
细节:
首先给原句按字划分,所有汉字一个一段,连续的字母,数字一段,
比如"始##始张华平2006欢迎您asdf末##末" 被划为
"始##始/张/华/平/2006/欢/迎/您/asdf/末##末"
接着找出这个句子中所有可能出现的词,
比如"始##始张华平欢迎您末##末",
出现的词有"始##始","张","华","平","欢","迎","您","末##末","欢迎" (最细粒度分词),并查找这些词所有可能的词性和这些词出现的频率。
将这些词保存在一个结构中,具体实现如下:
m_segGraph中有一个(PARRAY_CHAIN)m_pHead,是一个链
(PARRAY_CHAIN)p->row//记录该词的头位置
(PARRAY_CHAIN)p->col//记录该词的末位置
(PARRAY_CHAIN)p->value//记录该词的-log(出现的概率),出现的频率指所有该词的所有词性下出现的概率的总和。
(PARRAY_CHAIN)p->nPos//记录该词的词性,比如人名标记为'nr',则对应的nPos='n'*256+'r',如果该词有很多词性,则nPos=0
(PARRAY_CHAIN)p->sWord//记录该词
(PARRAY_CHAIN)p->nWordLen//记录该词的长度
举个例子:
"0 始##始 1 张 2 华 3 平 4 欢 5 迎 6 您 7 末##末 8"
对于"张"来说,
row=1
col=2
value=-log[("张"出现的频率+1)/(MAX_FREQUENCE)]
nPos=0//"张"有5种词性
sWord="张"
nWordLen=2
保存的顺序是按col升序row升序的次序排列
m_segGraph.m_pHead "始##始"
"张"