使用 Elasticsearch 轻松进行中文文本分类

本文记录下使用 Elasticsearch 进行文本分类,当我第一次偶然发现 Elasticsearch 时,就被它的易用性、速度和配置选项所吸引。每次使用 Elasticsearch,我都能找到一种更为简单的方法来解决我一贯通过传统的自然语言处理 (NLP) 工具和技术来解决的问题。

在某个时刻,我意识到,它可以直接用来解决很多问题,而如果采用我以前学到的方法,则需要从头开始构建解决方案。

环境:

服务器:elasticsearch7.9.3

前端:elasticsearch-head

一、下载ICU和IK中文分词插件

进入elasticsearch/bin,查看是否如下2个插件,如果没有就需要下载。

bash 复制代码
[elasticsearch@ bin]$ ./elasticsearch-plugin list
analysis-icu
analysis-ik

有两种方式,一种是在线下载,一种是离线下载。由于我的网络环境需要代理设置,第一种提示下载超时

bash 复制代码
root@:/elasticsearch-7.9.3/bin# ./elasticsearch-plugin install analysis-icu
-> Installing analysis-icu
-> Failed installing analysis-icu
-> Rolling back analysis-icu
-> Rolled back analysis-icu
Exception in thread "main" java.net.ConnectException: 连接超时 (Connection timed out)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)

下载对应版本的ik和icu插件

Gitee 极速下载/elasticsearch-analysis-ik

https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-7.9.3.zip

将2个压缩文件,上传至服务器的elasticsearch/plugin,解压并重启elasticsearch,重启的方式见linux上安装部署elasticsearch7.9_elasticsearch linux部署_一个高效工作的家伙的博客-CSDN博客

二、使用分词器测试用例

bash 复制代码
1)普通分词
POST _analyze
{
  "text": ["他是一个前端开发工程师"],
  "analyzer": "standard"
}
 
POST _analyze
{
  "text": ["他是一个前端开发工程师"],
  "analyzer": "keyword"
}
 
2)IK 分词
POST _analyze
{
  "text": ["他是一个前端开发工程师"],
  "analyzer": "ik_max_word"
}
{
  "text": ["他是一个前端开发工程师"],
  "analyzer": "ik_smart"
}
3) ICU 分词
POST _analyze
{
  "text": ["他是一个前端开发工程师"],
  "analyzer": "icu_analyzer"
}

使用elasticsearch-head的复合查询,写法如下:

三、分词器的实际应用

1、创建索引

使用ik_smart作为分词器,注:需要新建索引时添加分词器,如果添加数据后,就无法添加分词器了。

XML 复制代码
put /sample
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "category": {
        "type": "text",
        "analyzer": "ik_smart",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

2、 添加文档

XML 复制代码
//添加文档
POST /sample/_doc/1
{
  "content":"我是小鸟",
  "category":"动物"
}
 
POST /sample/_doc/2
{
  "content":"我是苹果",
  "category":"植物"
}

3、使用more_like_this查询:

XML 复制代码
GET sample/_search
{
  "query": {
    "more_like_this": {
      "fields": [
        "content",
        "category"
      ],
      "like": "小鸟",
      "min_term_freq": 1,
      "max_query_terms": 20
    }
  }
}

四、结语:

大多数的 NLP 任务都是从一个标准的预处理管道开始的:

  1. 采集数据
  2. 提取原始文本
  3. 句子拆分
  4. 词汇切分
  5. 标准化(词干分解、词形还原
  6. 停用词删除
  7. 词性标注

第 1 步和第 2 步可通过 Elasticsearch 中的采集附件处理器插件(5.0 之前版本为映射工具附件插件)来完成。

这些插件的原始文本提取基于 Apache Tika,这个工具包可处理最常见的数据格式(HTML/PDF/Word 等)。

第 4 步到第 6 步可通过开箱即用的语言分析器来完成。比如icu和ik分词器完成。

有几个现实的原因:训练一个 SVM 模型需要花费大量时间。特别是当您在一家初创公司工作,或需要快速适应各种客户或用例时,这可能会是一个棘手的问题。另外,您可能无法在每次数据变更时都对模型进行重新培训。我在一家德国大银行的项目中曾亲身经历过这个难题。这种情况下,您用过时的模型肯定不会带来好的结果。

而使用 Elasticsearch 方法,不仅可在索引时进行训练,还可在任何时间点动态更新模型,而且应用程序的停机时间为零。如果您的数据存储在 Elasticsearch 中,则不需要任何额外的基础设施。通常,在第一页您就可以获得 10% 以上的高精度结果。这在很多应用程序中足以给人留下良好的第一印象。

既然有其他工具,为什么还要使用 Elasticsearch 呢?

因为您的数据已经存在,它会预先计算底层的统计数据。就像是免费得到一些 NLP 一样!

相关推荐
liupenglove6 小时前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
野生技术架构师7 小时前
MySQL数据实时同步到Elasticsearch的高效解决方案
数据库·mysql·elasticsearch
risc1234568 小时前
【Lucene/Elasticsearch】 数据类型(ES 字段类型) | 底层索引结构
elasticsearch
全能搬运大师9 小时前
win10安装Elasticsearch
大数据·elasticsearch·搜索引擎
Guheyunyi10 小时前
电气安全监测系统:筑牢电气安全防线
大数据·运维·网络·人工智能·安全·架构
BigData共享10 小时前
StarRocks fragment的执行流程
大数据
舒一笑10 小时前
如何讲解es中的倒排索引我是一个小白给我解释
后端·elasticsearch
阿里云大数据AI技术11 小时前
阿里云 EMR Serverless Spark: 面向 Data+AI 的高性能 Lakehouse 产品
大数据·人工智能·数据分析
杨小扩11 小时前
AI驱动的软件工程(中):文档驱动的编码与执行
大数据·人工智能·软件工程
技术+ywxs578711 小时前
如何提高微信小店推客系统的推广效果?
大数据·微信开放平台·微信小店·推客系统·系统搭建