SharpICTCLASAnalyzer——基于吕震宇老师翻译的SharpICTCLAS 1.0开发的Lucene.Net 2.1分词接口源码
http://www.cnblogs.com/birdshover/
关于SharpICTCLAS 1.0的信息请参考博客园吕震宇老师的博客:
http://www.cnblogs.com/zhenyulu/archive/2007/04/18/718383.html
以前不是做这个的,一直没在意,今天想想好长时间没上吕震宇老师的博客了,上去看看,看到了这个,呵呵。所以包装了一下。
为了增加Lucene.Net的分词接口,因此修改了部分源码。
1、增加了WordResult类sLocation变量,为了记住当前分词在文本中的位置;
代码:
2 {
3 //The word
4 public string sWord;
5
6 //the POS of the word
7 public int nPOS;
8
9 //The -log(frequency/MAX)
10 public double dValue;
11
12 public int sLocation;
13 }
2、修改了Segment类GenerateWord方法;
增加了下面的红色代码
2 {
3 WordResult item = new WordResult();
4 item.sWord = pCur.theWord.sWord;
5 item.nPOS = pCur.theWord.nPOS;
6 item.dValue = pCur.theWord.dValue;
7 item.sLocation = pCur.row;
8 result[i] = item;
9
10 m_graphOptimum.SetElement(pCur.row, pCur.col, new ChainContent(item.dValue, item.nPOS, pCur.sWordInSegGraph));
11
12 pCur = pCur.next;
13 i++;
14 }
3、修正了一个因为空格造成的bug;
红色部分是由
2 int nType;
3
4
5 if (sWord.Length != 0)
6 {
7 nType = Utility.charType(sWord.ToCharArray()[0]);
8
9 //Chinese word
10 if (nType == Predefine.CT_CHINESE)
11 {
12 //Get the inner code of the first Chinese Char
13 byte[] byteArray = Utility.String2ByteArray(sWord);
14 nId = Utility.CC_ID(byteArray[0], byteArray[1]);
15
16 //store the word,not store the first Chinese Char
17 sWordRet = sWord.Substring(1);
18 return true;
19 }
20
21 //Delimiter
22 if (nType == Predefine.CT_DELIMITER)
23 {
24 nId = 3755;
25 //Get the inner code of the first Chinese Char
26 sWordRet = sWord; //store the word, not store the first Chinese Char
27 return true;
28 }
29 }
30 else
31 nType = 0;
源码下载:
https://files.cnblogs.com/birdshover/SharpICTCLASAnalyzer.rar
下载完注意修改里面的字典路径在测试。
测试文本:
2
3 2、修改了部分词性标注部分的代码
4
5 因为词性标注部分的代码存在问题(应当是从ICTCLAS就存在的问题),主要表现在如果某个汉字没有词性,则在词性标注时会出现异常。例如:“这些是永远也没有现成的答桉的”其中“答案”写错了,当对这个有错别字的句子分词时,“桉”字是没有词性的,程序在此时将出现错误。
6
7 目前的解决办法是对于这些没有词性的词在最终标注时标注为“字符串”。
8
9 2、修改了地名识别的一些问题
10
11 这个问题出现在Span类的PlaceRecognize方法中,nStart与nEnd在某些时候会计算错误。在测试版SharpICTCLAS中,句子“明定陵是明十三陵中第十座陵墓”在分词时会因为这个问题导致异常。
12
13 3、修改了基于CCID的字符串比较代码
14
15 原有代码没有很好考虑对全角、半角混合字符串的比较问题,现在修正过来了。
16
17 4、修改了向词库添加词汇的代码
18
19 原有代码存在错误,现在改正了过来。
20
21 ";
测试结果:
1 0 1
、 1 2
修改 2 4
了 4 5
原子 5 7
分词 7 9
代码 9 11
, 11 12
使得 12 14
对于 14 16
全角字 16 19
母 19 20
有 20 21
较 21 22
好 22 23
的 23 24
识别 24 26
2 26 31
、 27 28
修改 28 30
了 30 31
部分 31 33
词性 33 35
标注 35 37
部分 37 39
的 39 40
代码 40 42
42 46
因为 43 45
词性 45 47
标注 47 49
部分 49 51
的 51 52
代码 52 54
存在 54 56
问题 56 58
( 58 59
应当 59 61
是 61 62
从 62 63
ICTCLAS 63 70
就 64 65
存在 65 67
的 67 68
问题 68 70
) 70 71
, 71 72
主要 72 74
表现 74 76
在 76 77
如果 77 79
某个 79 81
汉字 81 83
没有 83 85
词 85 86
性 86 87
, 87 88
则 88 89
在 89 90
词性 90 92
标注 92 94
时 94 95
会 95 96
出现 96 98
异常 98 100
。 100 101
例如 101 103
: 103 104
“ 104 105
这些 105 107
是 107 108
永远 108 110
也 110 111
没有 111 113
现成 113 115
的 115 116
答 116 117
桉 117 118
的 118 119
” 119 120
其中 120 122
“ 122 123
答案 123 125
” 125 126
写 126 127
错 127 128
了 128 129
, 129 130
当 130 131
对 131 132
这个 132 134
有 134 135
错别字 135 138
的 138 139
句子 139 141
分词 141 143
时 143 144
, 144 145
“ 145 146
桉 146 147
” 147 148
字 148 149
是 149 150
没有 150 152
词性 152 154
的 154 155
, 155 156
程序 156 158
在 158 159
此时 159 161
将 161 162
出现 162 164
错误 164 166
。 166 167
167 171
目前 168 170
的 170 171
解决 171 173
办法 173 175
是 175 176
对于 176 178
这些 178 180
没有 180 182
词性 182 184
的 184 185
词 185 186
在 186 187
最终 187 189
标注 189 191
时 191 192
标注 192 194
为 194 195
“ 195 196
字符串 196 199
” 199 200
。 200 201
2 201 206
、 202 203
修改 203 205
了 205 206
地名 206 208
识别 208 210
的 210 211
一些 211 213
问题 213 215
215 219
这个 216 218
问题 218 220
出现 220 222
在 222 223
Span 223 227
类 224 225
的 225 226
PlaceRecognize 226 240
方法 227 229
中 229 230
, 230 231
nStart 231 237
与 232 233
nEnd 233 237
在 234 235
某些 235 237
时候 237 239
会 239 240
计算 240 242
错误 242 244
。 244 245
在 245 246
测试 246 248
版 248 249
SharpICTCLAS 249 261
中 250 251
, 251 252
句子 252 254
“ 254 255
明定陵 255 258
是 258 259
明 259 260
十三陵 260 263
中 263 264
第十 264 266
座 266 267
陵墓 267 269
” 269 270
在 270 271
分词 271 273
时 273 274
会 274 275
因为 275 277
这个 277 279
问题 279 281
导致 281 283
异常 283 285
。 285 286
3 286 291
、 287 288
修改 288 290
了 290 291
基于 291 293
CCID 293 297
的 294 295
字符串 295 298
比较 298 300
代码 300 302
302 306
原有 303 305
代码 305 307
没有 307 309
很 309 310
好 310 311
考虑 311 313
对 313 314
全角 314 316
、 316 317
半 317 318
角 318 319
混合 319 321
字符串 321 324
的 324 325
比较 325 327
问题 327 329
, 329 330
现在 330 332
修正 332 334
过来 334 336
了 336 337
。 337 338
4 338 343
、 339 340
修改 340 342
了 342 343
向 343 344
词库 344 346
添加 346 348
词汇 348 350
的 350 351
代码 351 353
353 357
原有 354 356
代码 356 358
存在 358 360
错误 360 362
, 362 363
现在 363 365
改正 365 367
了 367 368
过来 368 370
。 370 371
371 375