前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HashMap实现中文分词器

HashMap实现中文分词器

作者头像
java404
发布2018-05-18 11:40:33
8800
发布2018-05-18 11:40:33
举报
文章被收录于专栏:java 成神之路java 成神之路

今天下午部门内部技术分享是分词器算法。这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健

作者简介:

  1. Ansj分词器作者
  2. elasticsearch-sql(elasticsearch的sql插件)作者,支持sql查询
  3. nlp-lang自然语言工具包发起人
  4. NLPCN(自然语言处理组织)发起人 等等... 网站:http://www.nlpcn.org/ GIT地址:https://github.com/NLPchina

具体作者详情请百度、Google

大神首先对中文分词的概念进行详细的解释,并对比了传统分词和自然语言分词的区别和优略势。然后又讲到目前中文分词在应用过程中遇到的一些困难,其中就包括中文歧义的识别(包含交叉歧义、组合歧义、真歧义)、人名识别、地名识别和机构名识别。在这几种难题中,又以机构名识别最为困难(机构名称各种简称如:北京大学(北大)、腾讯(鹅场)等)。召回率和准确率的关系,正向匹配、逆向匹配等等。生动的讲解了分词的原理和难度所在。

但是讲到怎么实现的时候,大家都是一脸懵逼的,各种算法(Trie Tree、双数组trie树、CRF模型等)。听完就什么都不记得了,呵呵。

不过讲到最后的时候给我们分享了下HashMap的一种简单实现分词器的思路,意外的收获。下面通过代码说明(五分钟搞定_)。

HashMap简单实现的分词器

public class TokenizerDemo {

    private static Map<String, String> map = new HashMap<String, String>();

    //词典中最长词的长度,map中的key的最长长度
    private static final int maxSize = 3;
    static{
        //可以从数据库中加载或词表中加载
        map.put("中国", "");
        map.put("北京", "");
        map.put("中关村", "");
        map.put("海淀", "");
    }

    public static void main(String[] args) {
        String text = "中国人民共和国首都是北京,中关村在海淀区。";
        int length = text.length();
        for(int i=0; i<length; i++){
            int endIdx = i+maxSize;
            if(endIdx>length){
                endIdx = length;
            }
            //最大逆序匹配
            for(int j=0; j<maxSize; j++){
                String s = text.substring(i, endIdx);
                if(map.get(s)!=null){
                    //跳过匹配过的词(后面会说明跳过匹配词的原因)
                    i=endIdx-1;
                    System.out.println(s);
                    break;
                }else{
                    endIdx-=1;
                    if(endIdx==i){
                        break;
                    }
                }
            }
            
        }
    }
}

输出结果: 中国 北京 中关村 海淀

注意: 如果不跳过已经匹配的词会出现"北京剧院" 拆分成 [北京]、[京剧]、[剧院] 三个词, 如果跳过匹配过的词就会拆分成 [北京]、[剧院]。

分词原理:

从词典中找出最长词的长度,这里为maxSize=3,按照maxSize的长度从文本的第一位(i=0)截取要抽取的文本【中国人】,然后去Map中查找是否有对应的值,如果没有减去一个长度截取(maxSize-1)【中国】,去Map中查找,找到则停止当前查找,接着从匹配当前词后面的字(i=2)【人民共】开始继续上述的步骤开始查找。

代码执行的流程如下:

 第一次循环(i=0):
      中国人  -> 无命中(map中没找到)  (j=0)
      中国    -> map命中               (j=1)  【注释:命中后i+2(当前词)的长度。所以i=2】
 第二次循环(i=2):
      人民共  -> 无命中                (j=0)
      人民    -> 无命中                (j=1)
      人      -> 无命中                (j=2)
 第三次循环(i=3):
      民共和  -> 无命中                (j=0)
      民共    -> 无命中                (j=1)
      民      -> 无命中                (j=2)
 ...依次类推,找出文本中所有匹配词典中的词

很简单的代码就说明了分词器的原理(只是最简单、能命中词而以)。

应用场景

敏感词、文字过滤是一个网站必不可少的功能,可以使用这么简单的几行代码实现网站的敏感词过滤功能,自己这么简单几行代码就能实现是不是很棒。


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HashMap简单实现的分词器
  • 分词原理:
  • 代码执行的流程如下:
  • 应用场景
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档