<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-23  評(píng)論-58  文章-0  trackbacks-0
    最大概率分詞程序,在所有可能分詞路徑中選擇概率最大的一條路徑最為分詞結(jié)果
    public class MPM extends M
    {
        
    public static final HashMap<Character,TreeNode> dic = Dictionary.loadFreqDictionary("sogou.txt");
        
    public static final HashMap<String,Long> map=Dictionary.loadFreq("sogou.txt");
        
        
    /**
         * 
    @return 返回可能匹配詞的長(zhǎng)度, 沒(méi)有找到返回 0.
         
    */

        
    public ArrayList<Integer> maxMatch(TreeNode node,char[] sen, int offset) 
        
    {
            ArrayList
    <Integer> list=new ArrayList<Integer>();
            
    for(int i=offset; i<sen.length; i++
            
    {
                node 
    = node.subNode(sen[i]);
                
    if(node != null
                
    {
                    
    if(node.isAlsoLeaf()) 
                        list.add(i
    +1);
                }

                
    else 
                    
    break;
            }

            
    return list;
        }

        
        @Override
        
    public ArrayList<Token> getToken(ArrayList<Sentence> list) 
        
    {
            ArrayList
    <Token> tokenlist=new ArrayList<Token>();
            
    for(Sentence sen:list)
            
    {
                AdjList g 
    = new AdjList(sen.getText().length+1);//存儲(chǔ)所有被切分的可能的詞
                int i=0;
                
    while(i<sen.getText().length)
                
    {
                    Token token 
    = new Token(new String(sen.getText(),i,1),i,i+1);
                    
    if(map.containsKey(token.getWord()))
                        token.setWeight(Math.log(map.get(token.getWord())));
                    g.addEdge(token);
                    
                    TreeNode n
    =dic.get(sen.getText()[i]);
                    
    if(n!=null)
                    
    {
                        ArrayList
    <Integer> ilist =maxMatch(n, sen.getText(),i);
                        
    if(ilist.size()>0)
                            
    for(int j=0;j<ilist.size();j++)
                            
    {
                                token 
    = new Token(new String(sen.getText(),i,ilist.get(j)-i),i,ilist.get(j));
                                
    if(map.containsKey(token.getWord()))
                                    token.setWeight(Math.log(map.get(token.getWord())));
                                g.addEdge(token);
                            }

                    }

                    i
    ++;
                }

                
    //System.out.println(g);
                ArrayList<Integer> ret=maxProb(g);
                Collections.reverse(ret);
                
    int first=0;
                
    for(Integer last:ret)
                
    {
                    Token token 
    = new Token(new String(sen.getText(),first,last-first),sen.getStartOffset()+first,sen.getStartOffset()+last);
                    tokenlist.add(token);
                    first
    =last;
                }

            }

            
    return tokenlist;
        }

        
        
    int[] prevNode;
        
    double[] prob;
        
        
    //計(jì)算出最大概率的數(shù)組
        public ArrayList<Integer> maxProb(AdjList g)
        
    {
            prevNode 
    = new int[g.verticesNum]; //最佳前驅(qū)節(jié)點(diǎn)
            prob = new double[g.verticesNum]; //節(jié)點(diǎn)概率
            prob[0= 0;//節(jié)點(diǎn)0的初始概率是1,取log后是0
            
            
    //按節(jié)點(diǎn)求最佳前驅(qū)
            for (int index = 1; index < g.verticesNum; index++)
                getBestPrev(g,index);
    //求出最佳前驅(qū)
            
            ArrayList
    <Integer> ret = new ArrayList<Integer>();
            
    for(int i=(g.verticesNum-1);i>0;i=prevNode[i]) // 從右向左找最佳前驅(qū)節(jié)點(diǎn)
                ret.add(i);
            
    return ret;
        }

        
        
    //計(jì)算節(jié)點(diǎn)i的最佳前驅(qū)節(jié)點(diǎn)
        void getBestPrev(AdjList g,int i)
        
    {
            Iterator
    <Token> it = g.getPrev(i);//得到前驅(qū)詞集合,從中挑選最佳前趨詞
            double maxProb = 0;
            
    int maxNode = -1;
            
            
    while(it.hasNext())
            
    {
                Token itr 
    = it.next();
                
    double nodeProb = prob[itr.getStart()]+itr.getWeight();//候選節(jié)點(diǎn)概率
                  if (nodeProb > maxProb)//概率最大的算作最佳前趨
                  {
                      maxNode 
    = itr.getStart();
                      maxProb 
    = nodeProb;
                  }

             }

            prob[i] 
    = maxProb;//節(jié)點(diǎn)概率
            prevNode[i] = maxNode;//最佳前驅(qū)節(jié)點(diǎn)
        }

    }

    posted on 2012-08-31 10:12 nianzai 閱讀(2447) 評(píng)論(0)  編輯  收藏 所屬分類: 中文分詞
    主站蜘蛛池模板: 亚洲国产成人精品无码区在线秒播| 国产jizzjizz免费看jizz| 久久精品免费视频观看| 日本亚洲欧洲免费天堂午夜看片女人员 | 免费又黄又硬又爽大片| 四虎永久免费影院| 免费一级毛片在线观看| 亚洲狠狠爱综合影院婷婷| 久久久久亚洲AV综合波多野结衣 | 日日AV拍夜夜添久久免费| 免费毛片在线播放| 免费a级毛片无码av| 亚洲午夜无码片在线观看影院猛 | 四虎影视www四虎免费| 亚洲一线产品二线产品| 亚洲av永久无码精品天堂久久| 亚洲精品免费网站| 亚洲成av人在线观看网站| 羞羞视频网站免费入口| 国产99视频精品免费视频76| a级毛片免费高清毛片视频| 久久久久久夜精品精品免费啦| 69式互添免费视频| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 国产精品亚洲一区二区三区在线| 亚洲国产精品久久久久久| 亚洲欧洲国产视频| 国产精品亚洲av色欲三区| 一个人看的免费视频www在线高清动漫| 最近中文字幕免费大全| 麻豆国产精品免费视频| 在线观看国产情趣免费视频| 亚洲综合图色40p| 亚洲的天堂av无码| 亚洲精品蜜夜内射| 成av免费大片黄在线观看| 亚洲一区免费在线观看| 国产乱子影视频上线免费观看| 亚洲精品制服丝袜四区| 亚洲国产成a人v在线观看| 又硬又粗又长又爽免费看 |