科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道搜索引擎之中文分词实现(java版)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

最近对搜索相关技术产生了浓厚兴趣,前段时间做了个基于统计语言模型的中文切分系统的课程作业,于是乎,帖出来与大家共同学习。

作者:云天 来源:CSDN 2008年3月3日

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

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共4页)

    回归项目:)  训练语料一共有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

                     }           

       }

}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章