隐马尔科夫模型分词器_第1页
隐马尔科夫模型分词器_第2页
隐马尔科夫模型分词器_第3页
隐马尔科夫模型分词器_第4页
隐马尔科夫模型分词器_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 隐马尔科夫模型中文分词工程报告一, 研究背景随着互联网技术的发展,计算机在人们的生产生活当中起着不可或缺的作用,而计算机对中文的分词,理解,以及翻译也随着社会生产力的发展,需求量也越来越大,而中文词汇多,语义繁杂,语法不清晰的问题也随之暴露出来,所以一个好的中文分词模型对建立中文分词系统起着至关重要的作用。二, 模型方法本工程主要采用了隐马尔科夫模型。 隐马尔可夫模型可以表示为一个五元组( S, O, A, B,)S 是一组状态的集合。S = S, I, B, EO是一组输出符号的集合。A 是状态转移矩阵。符号B 输出概是率分布B = P( vk | j ) P( vk | j )表示在状态

2、j时输出符号vk的概率是初始状态概率分布=pi i = P( q1 = i ) 表示初始选择某个状态的概率。首先,在A矩阵中求出各个状态之间转移的概率,再算出B中在状态J时输出符号vk的概率,然后算出各种情况下的概率情况,最后所得的最大概率的序列就是中文分词的序列例如:模型的参数已知,评价某个分词结果我 爱 你 程 序 员 S S S B I EValue=*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)求得最佳的转换序列,再进行相应的匹配,就能得到所求的中文分词了三, 系统设

3、计首先,我们需要统计很多词语来用程序训练。选取人民日报上的语料库的格式如下:我们在一个单独的程序里一行一行的读入这些语料,并依据JAVA中String包的split()函数对这一行的许多元组按照”s+”来拆分成一个个小元组,例如:迈向/vt,充满/vt.然后对单个的小元组按照”/”来拆分,并统计重复的词的个数。最终在新的文件里形成:词组 词性 词出现的个数,这样的形式。所用到的源代码如下:Vector all = new Vector();Vector vocabu = new Vector();Vector grammar= new Vector();Vector num= new Vect

4、or();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+)

5、;for(i=0;isp.length;i+)all.add(i,spi);if(!all.isEmpty()for(j=0;jall.size();j+)String cizu = all.elementAt(j);String sic = cizu.split(/);/System.out.println(sic0+ );if(sic0.length()0&sic.length=2)int weizhi=vocabu.indexOf(sic0);/System.out.println(sic0);if(weizhi=-1)vocabu.add(sic0);grammar.add(sic1)

6、;num.add(1);elseint count = num.remove(weizhi);count=count+1;num.add(weizhi,count);/System.out.println(all);all.removeAllElements();/str = fis.readLine();/System.out.println(vocabu);/System.out.println(grammar);/System.out.println(num);long number = 0;for(int as=0;asnum.size();as+)number=number+num.

7、get(as);System.out.println(number);for(int e=0;evocabu.size();e+)String a0 = String.valueOf(e+1);String a1=vocabu.get(e); String a2=grammar.get(e); String a3=String.valueOf(num.get(e); String a=a1+t+a2+t+a3+rn; char buffer1=new chara.length(); buffer1=a.toCharArray(); fw.write(buffer1);fw.close();fr

8、.close();结果如下图所示:然后对每个词分析,如果是单字,则用S表示,如果是一个词,则词首用B表示,词尾用W表示,词中用E表示,并统计次数。例如迈向=BW 中共中央=BEEW程序源代码如下:Vector vocabu = new Vector();Vector num= new Vector();File w = new File(D:result.txt);File s = new File(D:Aun.txt);FileWriter fs2=new FileWriter(s);FileReader fr = new FileReader(w);SuppressWarnings(res

9、ource)BufferedReader fis=new BufferedReader(fr);String str =null;while(str=fis.readLine()!=null)String spr = str.split(t);if(spr0.length()=1)if(vocabu.contains(spr0+ +S)int i=vocabu.indexOf(spr0+ +S);int j= num.remove(i);int m = j+Integer.parseInt(spr2);num.add(i,m);else vocabu.add(spr0+ +S);num.add

10、(Integer.parseInt(spr2);elseif(vocabu.contains(String.valueOf(spr0.charAt(0)+ +B)int i=vocabu.indexOf(String.valueOf(spr0.charAt(0)+ +B);int j= num.remove(i);int m = j+Integer.parseInt(spr2);num.add(i,m);else vocabu.add(String.valueOf(spr0.charAt(0)+ +B);num.add(Integer.parseInt(spr2);if(vocabu.cont

11、ains(String.valueOf(spr0.charAt(spr0.length()-1)+ +W)int i=vocabu.indexOf(String.valueOf(spr0.charAt(spr0.length()-1)+ +W);int j= num.remove(i);int m = j+Integer.parseInt(spr2);num.add(i,m);else vocabu.add(String.valueOf(String.valueOf(spr0.charAt(spr0.length()-1)+ +W);num.add(Integer.parseInt(spr2)

12、;if(spr.length2)for(int e=1;espr0.length();e+)if(vocabu.contains(String.valueOf(spr0.charAt(e)+ +E)int i=vocabu.indexOf(String.valueOf(spr0.charAt(e)+ +E);int j= num.remove(i);int m = j+Integer.parseInt(spr2);num.add(i,m);else vocabu.add(String.valueOf(spr0.charAt(e)+ +E);num.add(Integer.parseInt(sp

13、r2); for(int e=0;eB B-E S-S B-W E-E E-W W-S W-B的次数,并得到A矩阵,A矩阵分别是以上SWEB的概率次数。A矩阵的代码如下:double anun = new double44;for(int i=0;isweb.size()-1;i+)String a = sweb.get(i);String b = sweb.get(i+1);if(a.equalsIgnoreCase(S)&b.equalsIgnoreCase(S)anun00+=1;if(a.equalsIgnoreCase(S)&b.equalsIgnoreCase(B)anun01+=

14、1;if(a.equalsIgnoreCase(B)&b.equalsIgnoreCase(E)anun12+=1;if(a.equalsIgnoreCase(B)&b.equalsIgnoreCase(W)anun13+=1;if(a.equalsIgnoreCase(E)&b.equalsIgnoreCase(W)anun23+=1;if(a.equalsIgnoreCase(W)&b.equalsIgnoreCase(S)anun30+=1;if(a.equalsIgnoreCase(W)&b.equalsIgnoreCase(B)anun31+=1;if(a.equalsIgnoreC

15、ase(E)&b.equalsIgnoreCase(E)anun22+=1;其中sweb为一个Vector向量,存储SWEB的序列。求得A矩阵后,我们输入一串中文字符,以每个字出现SWEB的次数来代替其概率构造出B矩阵。在B矩阵中,用魏特碧算法,从第二个字开始,计算前一个字的每一种状态的概率乘上后一个的某一种状态的概率再乘上A矩阵中对应的两中状态之间的概率。比较并取得最大值,依次计算存储并获得一个矩阵,定义为T1,然后将每种状态概率最大值对应的前一种状态记录(SWEB分别用0123代替)并存储为新的矩阵T2,最后在T1矩阵的最后一列中找到最大值,并在T2矩阵中找到对应的位置,依次向前取相应位置

16、的值并记录,得到一个和输入的中文字符串长度一样的数字串。源代码如下:int j=zhongwen.length();double ps = new double4j;for(int i=0;i4;i+)for(int m=0;mj;m+)psim=0;for(int q=0;qj;q+)if(vocabu.contains(String.valueOf(zhongwen.charAt(q)+ +S)int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q)+ +S);ps0q=Math.pow(num.get(strw),0.1); if

17、(vocabu.contains(String.valueOf(zhongwen.charAt(q)+ +B)int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q)+ +B);ps1q=Math.pow(num.get(strw),0.1); if(vocabu.contains(String.valueOf(zhongwen.charAt(q)+ +E)int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q)+ +E);ps2q=Math.pow(num.get(strw),

18、0.1); if(vocabu.contains(String.valueOf(zhongwen.charAt(q)+ +W)int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q)+ +W);ps3q=Math.pow(num.get(strw),0.1);int location = new int4j;double juli = new double4j;juli00=ps00;juli10=ps10;for(int we = 1;wej;we+)for(int er = 0;er4;er+)for(int rt=0;rtjuli

19、erwe)julierwe=julirtwe-1*pserwe*anunrter;locationerwe=rt;double temp=0;for (int i=0;itemp)temp=juliij-1;int jer=0;/for (int i=0;i0;sd-)int js=locationjersd;sptr = String.valueOf(js)+sptr;jer=js;System.out.println(sptr);由于次数过大可能超出INT的范围,所以我用MATH的方法对其进行了等比缩小。最后得出的数字串中,与中文相对应的,0或3对应的中文字后被拆分。就完成了隐马尔科夫模型对中文的分词,将被分的词与之前的词相

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论