当前位置: > > > Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

一、增加停用词

1,IK 分词器默认效果

(1)下面命令使用 IK 分词器测试中文分词效果:
1
curl -XPOST "http://node1:9200/emp/_analyze?pretty" -H 'Content-Type: application/json' -d '{"text":"我们是中国人","tokenizer":"ik_max_word"}'

(2)返回的结果如下,可以看到在分出来的词语中有一个“”,这个词语其实可以被认为是一个停用词,在分词时是不需要切分出来的。在这里被切分出来了,那也就意味着,IK 分词器在过滤停用词时没有把它过滤掉。
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

2,在 IK 分词器中增加停用词

(1)IK 分词器的停用词默认在 stopword.dic 这个词库文件中,在这个文件中目前都是一些英文停用词。
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)
(2)我们可以编辑 stopword.dic 这个词库文件,把中文停用词添加进去。比如添加“”这个停用词。
注意:集群里所有节点都需要修改。我们可以修改一个然后使用 scp 命令把这个文件改动同步到集群中的其他节点上。
1
vi config/analysis-ik/stopword.dic
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

(3)接着,重启集群让配置生效。我们再次使用 IK 分词器测试中文分词效果,可以发现“”已经被作为停用词不再被切分出来了:
1
curl -XPOST "http://node1:9200/emp/_analyze?pretty" -H 'Content-Type: application/json' -d '{"text":"我们是中国人","tokenizer":"ik_max_word"}'
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

二、自定义词库

1,IK 分词器默认效果

(1)对于一些特殊的词语,在分词时也要能够识别到它们,例如公司产品的名称或网络上新流行的词语。比如我们使用 IK 分词器测试分词效果:
1
curl -XPOST "http://node1:9200/emp/_analyze?pretty" -H 'Content-Type: application/json' -d '{"text":"欢迎访问航歌","tokenizer":"ik_max_word"}'

(2)结果发现,IK 分词器会把“航歌”分为“”和“”这两个词语。因为这个词语并不是通用的词语,所以 IK 分词器识别不出来也正常。要想让 IK 分词器将“航歌”识别出来,则需要自定义词库了,即把我们自己造的词语添加到词库中。
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

2,自定义词库文件

(1)我们切换到 es 用户,进入 elasticsearch-analysis-ik 插件对应的配置文件目录,创建一个自定义词库文件 my.dic
1
2
3
su es
cd config/analysis-ik
vi my.dic
  • 然后直接在文件中添加词语,每一个词语一行。
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)
(2)修改 elasticsearch-analysis-ik 插件的配置文件 IKAnalyzer.cfg.xml
1
vi config/analysis-ik/IKAnalyzer.cfg.xml
  • 我们把 my.dic 词库文件添加到 key="ext_dict" 这个 entry 中。
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 -->
        <entry key="ext_dict">my.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
注意事项:
  • 切记不要随意新增 entry,随意断增的 entry 是不被 IK 识别的,并且 entry 的名称也不能乱改,否则也不会识别。
  • 如果需要指定多个自定义词库文件,则需要使用分号(;)隔开。例如 <entry key="ext_dict">my.dic;your.dic</entry>
  • 如果后期想增加自定义停用词库,则按照这个思路进行添加即可,只不过停用词库需要配置到 key="ext_stopwords" 这个 entry 中。

(3)最后将自定义词库文件 my.dic 和修改好的 IKAnalyzer.cfg.xml 配置文件复制到集群中的所有节点中,然后重启集群。

3.验证自定义词库的分词效果

(1)我们再次使用 IK 分词器测试分词效果:
1
curl -XPOST "http://node1:9200/emp/_analyze?pretty" -H 'Content-Type: application/json' -d '{"text":"欢迎访问航歌","tokenizer":"ik_max_word"}'

(2)现在发现“航歌”这个词语可以被识别出来了,说明自定义词库生效了。
原文:Elasticsearch - 中文分词器的集成与使用教程2(增加停用词、自定义词库)

附:常见的中文停用词汇总

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
使
沿
评论0