以前做过自然语言处理(nlp)的相关后端开发,之前也谈过搜索引擎Elasticsearch,它们都离不开一个基础性的工具~分词,放到Python里面也是处理文本的一个很基础常用的东西了,大致干的是这么一件事:将整句话按照一定匹配方法分成n个词语。例如:‘百度一下,你就知道’,可分为‘百度’、‘你’、‘就’、‘知道’,这几个词。

由于这是个基础性工具,Python作为一个机器学习,搞nlp的首选语言,基本上是调个包的事情,但Python的痛点大家也知道~普遍效率低!当时也没拜托搞Java的同志帮忙,就琢磨PHP能不能也搞一个,然后,就有了下面这篇介绍~

PHP中文分词扩展

编译

 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


git clonehttps://github.com/jonnywang/phpjieba.git 





cd phpjieba/cjieba





make





cd..





phpize (如果是多版本PHP,则是例如:/usr/local/php/71/bin/phpize)





./configure(./configure --with-php-config=/usr/local/php/71/bin/php-config)





make





make install

配置PHP.ini文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15


extension=jieba.so





jieba.enable=1





jieba.dict_path=/usr/local/phpjieba/data/softs/jz/cjieba/dict

jieba.dict_path指向jieba库dict目录

调用代码

函数原型:

1
2
3


function array jieba(string$text,booluse_extract =false,longextract_limit =10)

使用案例:

  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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237


ini_set('jieba.enable', 1);  //php.ini 配置了可不用写





ini_set('jieba.dict_path', '/usr/local/data/softs/phpjieba/cjieba/dict'); //php.ini 配置了可不用写





try {





    $result = jieba('小明硕士毕业于中国科学院计算所,后在日本京都大学深造');





    echoimplode('/', $result).PHP_EOL;





    //计算所/小明/京都大学/深造/硕士/中国科学院/毕业/日本





    $result = jieba('小明硕士毕业于中国科学院计算所,后在日本京都大学深造', 1, 50);





    echoimplode('/', $result).PHP_EOL;





    //小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/日本/京都/大学/京都大学/深造





    $result = jieba('他心理健康', 1);





    echoimplode('/', $result).PHP_EOL;





    //他/心理/健康/心理健康





    $result = jieba('this is a demo, my name is jony', 1, 10);





    echoimplode('/', $result).PHP_EOL;





    //demo/jony





    $result = jieba('this is a demo, my name is jony');





    echoimplode('/', $result).PHP_EOL;





    //this/ /is/ /a/ /demo/,/ /my/ /name/ /is/ /jony





    $result = jieba('小明硕士毕业于中国科学院计算所,后在日本京都大学深造', 2);





    print_r($result);





    /*





    Array





    (





    [小明] => x





    [硕士] => n





    [毕业] => n





    [于] => p





    [中国科学院] => nt





    [计算所] => n





    => x





    [后] => f





    [在] => p





    [日本] => ns





    [京都大学] => nz





    [深造] => v





    )





    */





} catch (Exception$e) {





    echo$e - > getMessage.PHP_EOL;





}

还有就是,如果有需要完整匹配的词语,可放到dict文件夹下,这样就不会拆分了。

性能上,别的不说,比起Python的分词包,那是不出意外的秒杀.