• /  13
  • 下載費用: 14.9積分  

隱馬爾科夫模型分詞器.doc

'隱馬爾科夫模型分詞器.doc'
? 隱馬爾科夫模型中文分詞工程報告一, 研究背景隨著互聯網技術的發展,計算機在人們的生產生活當中起著不可或缺的作用,而計算機對中文的分詞,理解,以及翻譯也隨著社會生產力的發展,需求量也越來越大,而中文詞匯多,語義繁雜,語法不清晰的問題也隨之暴露出來,所以一個好的中文分詞模型對建立中文分詞系統起著至關重要的作用。二, 模型方法本工程主要采用了隱馬爾科夫模型。 隱馬爾可夫模型可以表示為一個五元組( S, O, A, B,)S 是一組狀態的集合。S = {‘S’, ‘I’, ‘B’, ‘E’}O是一組輸出符號的集合。A 是狀態轉移矩陣。符號B 輸出概是率分布B = {P( vk | j )} P( vk | j )表示在狀態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)求得最佳的轉換序列,再進行相應的匹配,就能得到所求的中文分詞了三, 系統設計首先,我們需要統計很多詞語來用程序訓練。選取人民日報上的語料庫的格式如下:我們在一個單獨的程序里一行一行的讀入這些語料,并依據JAVA中String包的split()函數對這一行的許多元組按照”\\s+”來拆分成一個個小元組,例如:邁向/vt,充滿/vt.然后對單個的小元組按照”/”來拆分,并統計重復的詞的個數。最終在新的文件里形成:詞組 詞性 詞出現的個數,這樣的形式。所用到的源代碼如下: Vector all = new Vector(); Vector vocabu = new Vector(); Vector grammar= new Vector(); Vector num= new Vector(); 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;i<sp.length;i++) { all.add(i,sp[i]); } if(!all.isEmpty()) { for(j=0;j<all.size();j++) { String cizu = all.elementAt(j); String[] sic = cizu.split("/");// System.out.println(sic[0]+" "); if(sic[0].length()0&&sic.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); 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;as<num.size();as++) { number=number+num.get(as); } System.out.println(number); for(int e=0;e<vocabu.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+"\r\n"; char[] buffer1=new char[a.length()]; buffer1=a.toCharArray(); fw.write(buffer1); } fw.close(); fr.close();結果如下圖所示:然后對每個詞分析,如果是單字,則用S表示,如果是一個詞,則詞首用B表示,詞尾用W表示,詞中用E表示,并統計次數。例如邁向===BW 中共中央===BEEW程序源代碼如下: Vector vocabu = new Vect。省略部分。gnoreCase("E")&&b.equalsIgnoreCase("E")) { anun[2][2]+=1; } }其中sweb為一個Vector向量,存儲SWEB的序列。求得A矩陣后,我們輸入一串中文字符,以每個字出現SWEB的次數來代替其概率構造出B矩陣。在B矩陣中,用魏特碧算法,從第二個字開始,計算前一個字的每一種狀態的概率乘上后一個的某一種狀態的概率再乘上A矩陣中對應的兩中狀態之間的概率。比較并取得最大值,依次計算存儲并獲得一個矩陣,定義為T1,然后將每種狀態概率最大值對應的前一種狀態記錄(SWEB分別用0123代替)并存儲為新的矩陣T2,最后在T1矩陣的最后一列中找到最大值,并在T2矩陣中找到對應的位置,依次向前取相應位置的值并記錄,得到一個和輸入的中文字符串長度一樣的數字串。源代碼如下: int j=zhongwen.length(); double ps[][] = new double[4][j]; for(int i=0;i<4;i++) { for(int m=0;m<j;m++) { ps[i][m]=0; } } for(int q=0;q<j;q++) { if(vocabu.contains(String.valueOf(zhongwen.charAt(q))+" "+"S")){ int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q))+" "+"S"); ps[0][q]=Math.pow(num.get(strw),0.1); } if(vocabu.contains(String.valueOf(zhongwen.charAt(q))+" "+"B")){ int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q))+" "+"B"); ps[1][q]=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"); ps[2][q]=Math.pow(num.get(strw),0.1); } if(vocabu.contains(String.valueOf(zhongwen.charAt(q))+" "+"W")){ int strw=vocabu.indexOf(String.valueOf(zhongwen.charAt(q))+" "+"W"); ps[3][q]=Math.pow(num.get(strw),0.1); } } int location[][] = new int[4][j]; double juli[][] = new double[4][j]; juli[0][0]=ps[0][0]; juli[1][0]=ps[1][0]; for(int we = 1;we<j;we++) { for(int er = 0;er<4;er++) { for(int rt=0;rtjuli[er][we]) { juli[er][we]=juli[rt][we-1]*ps[er][we]*anun[rt][er]; location[er][we]=rt; } } } } double temp=0; for (int i=0;itemp) { temp=juli[i][j-1]; } } int jer=0;// for (int i=0;i0;sd--) { int js=location[jer][sd]; sptr = String.valueOf(js)+sptr; jer=js; } System.out.println(sptr);由于次數過大可能超出INT的范圍,所以我用MATH的方法對其進行了等比縮小。最后得出的數字串中,與中文相對應的,0或3對應的中文字后被拆分。就完成了隱馬爾科夫模型對中文的分詞,將被分的詞與之前的詞相對應的詞比較并取得詞性(同詞不同性暫不能考慮)最后我用JAVA創建了一個簡單的GUI,可以多次輸入與分析中文分詞:四, 系統演示與分析如三中事例的那樣,對于“結婚的和尚未結婚的”這一有歧義的中文字符串成功地避免了“和尚”一詞的出現,但對于像“歡迎新老師生前來就餐”,“大學生前來應聘”等,并不能把“生前”給分開:還有一些其他的語法語義有歧義的地方不能很好的解決句式雜糅和歧義的問題。另外,對于三個字,四個字詞的分析還不夠好,例如“中國人”只能拆分成“中”“國人”,“中共中央”拆成“中”“,共”和“中央”,目前測試成功的只有“干什么”不會被拆分開。究其原因,我想是首先是語料庫的不充分,對于一些詞在不同位置出現的概率并沒有很好地統計,導致所求出來的結果出現誤差。其次是運用詞在不同位置的概率來分詞,本身具有一定的局限性,不可能做到太完美。但相比最長路徑,已經好太多。五,對本門課的感想、意見和建議學習了這門課,讓我掌握了對中文分詞的基本概念的理解。中文不比英文,德文,有著良好的語法系統,不如拉丁文只有26個字母。它個數眾多,每個字的意思不盡相同,語法比較雜亂無章。古代漢語和現代漢語的語法又不相同。同時伴隨著時代的發展,中文的語法也在日新月異地變化著。我覺得解決中文詞法分析是一種比較困難的工程,需要長時間的探索與研究,并能跟上時代的步伐。如果形成一套完善的系統,既能處理好中文分詞,又能對新詞,新意詞進行同步地學習并完善系統,中文在計算機系統中的地位將提高很大一步。
關 鍵 詞:
分詞器 模型
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:隱馬爾科夫模型分詞器.doc
鏈接地址: http://www.476824.live/p-49949195.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 江苏7位数中3位多少钱 黑龙江快乐十分复式投注表 新手200元可以炒股吗 上期算下期平特一肖公式 湖北11选5选号技巧 体彩浙江6十1开奖号码是多少 排三走势图带连线图表 亿源策略配资 排列三预测 河南11选5第27期