使用 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 一样!

相关推荐
闯闯桑32 分钟前
scala 中的@BeanProperty
大数据·开发语言·scala
闯闯桑38 分钟前
Scala 中的隐式转换
大数据·scala
用户Taobaoapi20143 小时前
淘宝商品列表查询 API 接口详解
大数据
涛思数据(TDengine)4 小时前
taosd 写入与查询场景下压缩解压及加密解密的 CPU 占用分析
大数据·数据库·时序数据库·tdengine
DuDuTalk4 小时前
DuDuTalk接入DeepSeek,重构企业沟通数字化新范式
大数据·人工智能
大数据追光猿4 小时前
Qwen 模型与 LlamaFactory 结合训练详细步骤教程
大数据·人工智能·深度学习·计算机视觉·语言模型
Elastic 中国社区官方博客4 小时前
使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack
大数据·linux·服务器·elasticsearch·搜索引擎·信息可视化·debian
对许6 小时前
Hadoop的运行模式
大数据·hadoop·分布式
星星点点洲6 小时前
【RAG】RAG 系统的基本搭建流程(ES关键词检索示例)
python·elasticsearch
天空卫士7 小时前
AI巨浪中的安全之舵:天空卫士助力人工智能落地远航
大数据·人工智能·安全·网络安全·数据安全