搜索引擎之中文分词实现(java版)

开发者在线 Builder.com.cn 更新时间:2008-03-03作者:云天 来源:CSDN

本文关键词: java 中文分词 搜索引擎

    回归项目:)  训练语料一共有5万多个不同的词。建立2-gram统计模型时不断要把每个词在训练语料中出现频率统计出来,还要把每个词及其后面的那个词组成的2- gram在训练语料中出现频率统计出来。因为在切分时会频繁的在建立的2-gram模型中查找相关的数据,所有,存储这个2-gram模型数据的数据结构一定要能提供高效的查找。故选择hash表,它能提供常数时间的查找。Java类库里提供了HashMap类,基于数据两还不是非常大,故可直接拿来用。在存储时,每一个key值对应一个在训练语料中出现过的词语,而每一个key值对应的value值又是一个HashMap。暂且称为子hashmap.这个结构有点类似文件结构里的二级索引。 其相关代码如下:

     怎么在预处理文件里把词分别读出来就不罗嗦了,方法:每读入一行,按空格分成String数组,用个正则表达式匹配下即能得到。

//此方法传入的两个词组成一个2-gramprewd为前一个词,currwd为紧随其后的词

public static void add(String prewd , String currwd){              

                  String key = prewd;

                     String curr = currwd;

                     boolean bb = HMap.containsKey(key);         //Hmap是一个已存在的HashMap,用来存储2-gram统计模型。在这里判断 preword 是否在 map

                     if (bb == false) {           // map 中无,则添加

                            HashMap hm = new HashMap();          //首先,新构造一个 MAP

                            hm.put(key , new Integer(1));             //存储 KEY 的频率                                                   hm.put(curr , new Integer(1));            //存储 KEY 后面紧接着的那个词频率

                            HMap.put(key,hm);              // KEY 和对应的 MAP 放入 MAP

                     }

                     else         // map 中含有该词            

       {

                            HashMap temp = (HashMap)HMap.get(key);              //返回 KEY 所对应的 MAP ,进行值的修改

                            int count = ((Integer)temp.get(key)).intValue() + 1;           // map 中将 key 次数加 1

                            temp.put(key , new Integer(count));                                

 

                            if (temp.containsKey(curr))                 //判断 map 中是否含有该词

                            {

                                   int value = ((Integer)temp.get(curr)).intValue() + 1;                                                                   temp.put(curr , new Integer(value));   

                            }           

                            else

                                   temp.put(curr, new Integer(1));                  //若无,则将其存入子map  

                            HMap.put(key , temp);                 //map 修改完毕 ,将其重新放入 map

                     }           

       }

}

用户评论

  • 用户名
  • 评论内容