本文记录下使用 Elasticsearch 进行文本分类,当我第一次偶然发现 Elasticsearch 时,就被它的易用性、速度和配置选项所吸引。每次使用 Elasticsearch,我都能找到一种更为简单的方法来解决我一贯通过传统的自然语言处理 (NLP) 工具和技术来解决的问题。
在某个时刻,我意识到,它可以直接用来解决很多问题,而如果采用我以前学到的方法,则需要从头开始构建解决方案。
环境:
服务器:elasticsearch7.9.3
前端:elasticsearch-head
一、下载ICU和IK中文分词插件
进入elasticsearch/bin,查看是否如下2个插件,如果没有就需要下载。
[elasticsearch@ bin]$ ./elasticsearch-plugin list
analysis-icu
analysis-ik
有两种方式,一种是在线下载,一种是离线下载。由于我的网络环境需要代理设置,第一种提示下载超时
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博客
二、使用分词器测试用例
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作为分词器,注:需要新建索引时添加分词器,如果添加数据后,就无法添加分词器了。
put /sample
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_smart"
},
"category": {
"type": "text",
"analyzer": "ik_smart",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
2、 添加文档
//添加文档
POST /sample/_doc/1
{
"content":"我是小鸟",
"category":"动物"
}
POST /sample/_doc/2
{
"content":"我是苹果",
"category":"植物"
}
3、使用more_like_this查询:
GET sample/_search
{
"query": {
"more_like_this": {
"fields": [
"content",
"category"
],
"like": "小鸟",
"min_term_freq": 1,
"max_query_terms": 20
}
}
}
四、结语:
大多数的 NLP 任务都是从一个标准的预处理管道开始的:
- 采集数据
- 提取原始文本
- 句子拆分
- 词汇切分
- 标准化(词干分解、词形还原)
- 停用词删除
- 词性标注
第 1 步和第 2 步可通过 Elasticsearch 中的采集附件处理器插件(5.0 之前版本为映射工具附件插件)来完成。
这些插件的原始文本提取基于 Apache Tika,这个工具包可处理最常见的数据格式(HTML/PDF/Word 等)。
第 4 步到第 6 步可通过开箱即用的语言分析器来完成。比如icu和ik分词器完成。
有几个现实的原因:训练一个 SVM 模型需要花费大量时间。特别是当您在一家初创公司工作,或需要快速适应各种客户或用例时,这可能会是一个棘手的问题。另外,您可能无法在每次数据变更时都对模型进行重新培训。我在一家德国大银行的项目中曾亲身经历过这个难题。这种情况下,您用过时的模型肯定不会带来好的结果。
而使用 Elasticsearch 方法,不仅可在索引时进行训练,还可在任何时间点动态更新模型,而且应用程序的停机时间为零。如果您的数据存储在 Elasticsearch 中,则不需要任何额外的基础设施。通常,在第一页您就可以获得 10% 以上的高精度结果。这在很多应用程序中足以给人留下良好的第一印象。
既然有其他工具,为什么还要使用 Elasticsearch 呢?
因为您的数据已经存在,它会预先计算底层的统计数据。就像是免费得到一些 NLP 一样!