Elasticsearch中文分词

1、分词api

分词就是把一条文本数据转换为一个个单词的过程,英语分词比较简单,直接使用空格就可以把每个词分开,中文分词相对就会复杂很多,需要使用专门的分词器。
在英文中分词,指定分词器进行分词:
POST http://127.0.0.1:9200/_analyze

{
     "analyzer":"standard",
     "text":"Elastic Search"
}

返回结果:

{
    "tokens": [
        {
            "token": "elastic",
            "start_offset": 0,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "search",
            "start_offset": 8,
            "end_offset": 14,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

中文分词,使用标准分词器
请求体:

{
     "analyzer":"standard",
     "text":"为了搜索"
}

返回数据:

{
    "tokens": [
        {
            "token": "为",
            "start_offset": 0,
            "end_offset": 1,
            "type": "<IDEOGRAPHIC>",
            "position": 0
        },
        {
            "token": "了",
            "start_offset": 1,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 1
        },
        {
            "token": "搜",
            "start_offset": 2,
            "end_offset": 3,
            "type": "<IDEOGRAPHIC>",
            "position": 2
        },
        {
            "token": "索",
            "start_offset": 3,
            "end_offset": 4,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        }
    ]
}

在结果中不仅可以看出分词的结果,还返回了该词在文本中的位置。
实际生产中,在创建映射mapping时就会指定分词器,如下:

{
  "properties": {
    "id": {
      "type": "long",
      "store": true
    },
    "title": {
      "type": "text",
      "store": true,
      "index": true,
      "analyzer": "standard"
    },
    "content": {
      "type": "text",
      "store": true,
      "index": true,
      "analyzer": "standard"
    }
  }
}

2、中文分词

从上面的结果也看出来了,标准的分词器api把中文的每个字分开了,这显然不是我们想要的。汉字博大精深,当分词不当时,还会产生歧义。
常用中文分词器,IK、jieba、THULAC等,在python中做数据分析或机器学习时我们经常使用的是jieba分词,但在这里,我们推荐使用IK分词器。

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IK Analyzer 3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

采用了特有的“正向迭代最细粒度切分算法“,具有80万字/秒的高速处理能力 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。 优化的词典存储,更小的内存占用。

IK分词器 Elasticsearch插件下载地址下载zip压缩包。
一定要下载对应版本的,切记,否则将会启动失败。
安装步骤:

  • 在elasticsearch/plugins中新建文件夹ik mkdir (your elasticsearch path)/plugins/ik
  • 将下载好的ik分词器解压到elasticsearch/plugins/ik文件夹。
    cp elasticsearch-analysis-ik-7.2.0.zip ./elasticsearch/plugins/ik
    unzip elasticsearch-analysis-ik-7.2.0.zip
  • 重启elasticsearch
    ./bin/elasticsearch

测试:

{
     "analyzer":"ik_max_word",
     "text":"为了搜索"
}

分词结果:

{
    "tokens": [
        {
            "token": "为了",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "搜索",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

再来一条:
ik_max_word分词方式:

{
     "analyzer":"ik_max_word",
     "text":"中国科学院计算所"
}

分词结果:

{
    "tokens": [
        {
            "token": "中国科学院",
            "start_offset": 0,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "中国",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "科学院",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "科学",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "学院",
            "start_offset": 3,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "计算所",
            "start_offset": 5,
            "end_offset": 8,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "计算",
            "start_offset": 5,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 6
        },
        {
            "token": "所",
            "start_offset": 7,
            "end_offset": 8,
            "type": "CN_CHAR",
            "position": 7
        }
    ]
}

ik_smart分词方式:

{
     "analyzer":"ik_smart",
     "text":"中国科学院计算所"
}

分词结果:

{
    "tokens": [
        {
            "token": "中国科学院",
            "start_offset": 0,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "计算所",
            "start_offset": 5,
            "end_offset": 8,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

ik_max_word 和 ik_smart 什么区别?

  • ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
  • ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。

jieba的分词插件目前支持的elasticsearch版本比较少:

jieba analysis plugin for elasticsearch: 7.3.0, 7.0.0, 6.4.0, 6.0.0, 5.4.0, 5.3.0, 5.2.2, 5.2.1, 5.2.0, 5.1.2, 5.1.1

jieba分词器插件下载地址
jieba对elasticsearch也提供了两种搜索方式,jieba_indexjieba_search,区别和ik_max_word 和 ik_smart 的区别一样。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值