- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
隐马尔科夫模型分词器汇编
隐马尔科夫模型
中文分词工程报告
研究背景
随着互联网技术的发展,计算机在人们的生产生活当中起着不可或缺的作用,而计算机对中文的分词,理解,以及翻译也随着社会生产力的发展,需求量也越来越大,而中文词汇多,语义繁杂,语法不清晰的问题也随之暴露出来,所以一个好的中文分词模型对建立中文分词系统起着至关重要的作用。
模型方法
本工程主要采用了隐马尔科夫模型。
隐马尔可夫模型可以表示为一个五元组( S, O, A, B,)
S 是一组状态的集合。
S = {‘S’, ‘I’, ‘B’, ‘E’}
O是一组输出符号的集合。
A 是状态转移矩阵。
符号B 输出概是率分布
B = {P( vk | j )} P( vk | j )表示在状态j时输出符号vk的概率
π是初始状态概率分布π={?i }
πi = P( q1 = i ) 表示初始选择某个状态的概率。
首先,在A矩阵中求出各个状态之间转移的概率,再算出B中在状态J时输出符号vk的概率,然后算出各种情况下的概率情况,最后所得的最大概率的序列就是中文分词的序列
例如:
模型的参数已知,评价某个分词结果
我 爱 你 程 序 员
S S S B I E
Value=?*P(S-S)*P(S-S)*P(S-B)*P(B-I)*P(I-E)*
P(我|S)* P(爱|S)* P(你|S)* P(程|B)* P(序|I)* P(员|S)
求得最佳的转换序列,再进行相应的匹配,就能得到所求的中文分词了
系统设计
首先,我们需要统计很多词语来用程序训练。选取人民日报上的语料库的格式如下:
我们在一个单独的程序里一行一行的读入这些语料,并依据JAVA中String包的split()函数对这一行的许多元组按照”\\s+”来拆分成一个个小元组,例如:
迈向/vt,充满/vt.然后对单个的小元组按照”/”来拆分,并统计重复的词的个数。最终在新的文件里形成:词组 词性 词出现的个数,这样的形式。
所用到的源代码如下:
VectorString all = new VectorString();
VectorString vocabu = new VectorString();
VectorString grammar= new VectorString();
VectorInteger num= new VectorInteger();
File s = new File(D:\\we.txt);
File w = new File(D:\\result.txt);
FileWriter fw = new FileWriter(w);
FileReader fr = null;
fr = new FileReader(s);
@SuppressWarnings(resource)
BufferedReader fis=new BufferedReader(fr);
String str = null;
int i,j;
while((str=fis.readLine())!=null)
{
i=0;
j=1;
String[] sp= str.split(\\s+);
for(i=0;isp.length;i++)
{
all.add(i,sp[i]);
}
if(!all.isEmpty())
{
for(j=0;jall.size();j++)
{
String cizu = all.elementAt(j);
String[] sic = cizu.split(/);
// System.out.println(sic[0]+ );
if(sic[0].length()15sic[0].length()0sic.length==2)
{
int weizhi=vocabu.indexOf(sic[0]);
// System.out.println(sic[0]);
if(weizhi==-1)
{
vocabu.add(sic[0]);
grammar.add(sic[1]);
num.add(1);
}
else{
int count = num.remove(weizhi);
coun
文档评论(0)