SharpICTCLASAnalyzer——基于吕震宇老师翻译的SharpICTCLAS 1.0开发的Lucene.Net 2.1分词接口源码

2008年3月26日 by yurow
http://www.cnblogs.com/birdshover/

关于SharpICTCLAS 1.0的信息请参考博客园吕震宇老师的博客:
http://www.cnblogs.com/zhenyulu/archive/2007/04/18/718383.html

以前不是做这个的,一直没在意,今天想想好长时间没上吕震宇老师的博客了,上去看看,看到了这个,呵呵。所以包装了一下。

为了增加Lucene.Net的分词接口,因此修改了部分源码。

1、增加了WordResult类sLocation变量,为了记住当前分词在文本中的位置;
代码:
 1    public class WordResult
 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方法;
增加了下面的红色代码
 1   while (pCur != null)
 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;
红色部分是由
 1          //Position for the delimeters
 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

下载完注意修改里面的字典路径在测试。

测试文本:
 1             string testwords = @"1、修改了原子分词代码,使得对于全角字母有较好的识别
 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

posted @ 2008-03-26 01:49  Birdshover  阅读(6155)  评论(11编辑  收藏  举报