论坛首页 Java版 企业应用

带局部统计识别高频词汇及人名识别的Lucene中文分词

浏览 3371 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-05-24

经过努力终于在 引入局部统计识别高频词汇的Lucene中文分词程序 以及 基于词典的最大匹配的Lucene中文分词程序 把中文人名识别功能加入,能把大部分的中文姓名识别出来,结果喜人。

原理:

根据贝叶斯定理,分别建立中文形式库FirstName.stu,从网上搜集得到的真实姓名库Name.stu,以及以姓氏为开头但非中文姓名的词库(如“曾经是”,“关门”,“陈述”等)UnName.stu。然后先使用之前完成的基于词典的最大匹配分词算法对文本进行初步分词,然后利用Spring的AOP把人名识别器SimpleChineseNameAnalyzer编织到初步分词方法执行之后,利用姓氏驱动的方式遍历分词碎片,找到所有以姓氏开头后两个分词结果为单字或后一个分词结果为双字词的碎片(成为候选词),分别从Name.stu以及UnName.stu中获取姓氏以及各个名字成为姓名的概率,最后判断候选词前后是否存在边界词汇,若有则对其进行概率调整,最终通过与阀值的比较判断是否是一个中文姓名。

用法:

java 代码
  1. ApplicationContext context = new FileSystemXmlApplicationContext("STUSegmentConfig.xml");   
  2. STUChineseAnalyzer analyzer = (STUChineseAnalyzer) context .getBean("stuChineseAnalyzer");  

测试数据:

东方网记者靳慧、张海盈、实习生霍世杰5月20日报道:今天上午10点,同济大学建校100周年庆典大会在同济大学大礼堂隆重举行。中共中央总书记、国家主席胡锦涛发来贺信。全国人大常委会副委员长李铁映,全国人大常委会副委员长顾秀莲,国务委员陈至立,中共上海市委书记习近平,德国前总理施罗德,中央纪委副书记张惠新,教育部部长周济,建设部部长汪光焘,中共上海市委副书记、市长韩正,科技部党组书记、副部长李学勇等出席庆典大会。

  庆典大会上首先宣读胡锦涛总书记贺信,之后科技部部长、同济大学校长万钢从“大学对社会的承诺”的角度讲述百年同济的辉煌历史和未来发展。来自德国柏林工业大学的校长库茨勒、中国科学院院士吴孟超、同济大学交通运输工程学院孙立军等也将作为友好学校代表、校友代表、师生代表先后致辞。

  今天早晨8点开始,同济大学的师生、老校友们就陆续进入庆典大会会场,会场大屏幕上滚动播放着建校100周年的宣传片。庆典大会开始前举行了同济老校友互动活动,现场十分感人。

  同济大学是教育部直属重点大学,创建于1907年,早期为德国医生在上海创办的德文医学堂,取名"同济"意蕴合作共济。1912年增设工学堂,1923年被批准改名为大学,1927年正式定为国立同济大学。抗战期间曾内迁经浙、赣、滇入川,1946年回迁上海并发展为以拥有理、工、医、文、法五大学院著称海内外的综合性大学。1952年院系调整后,同济大学成为国内土木建筑领域最大、专业最全的工科大学。

  1978年经中央批准恢复对德交流,在中科院学部委员李国豪校长领导下实行“两个转变”,即由土木为主的理工科大学向理工为主的多科性大学转变,由国内普通高校向作为中外文化交流“窗口”之一的国际性大学转变,从而迅速恢复和发展成为一所以工为主、理工结合,经、管、文、法各具特色的多科性大学。

测试结果:

  1. (东方,0,2)   
  2. (网,2,3)   
  3. (记者,3,5)   
  4. (靳慧,5,7)   
  5. (张海盈,8,11)   
  6. (实习生,12,15)   
  7. (霍世杰,15,18)   
  8. (5,18,19)   
  9. (月,19,20)   
  10. (20,20,22)   
  11. (日报,22,24)   
  12. (道,24,25)   
  13. (今天,26,28)   
  14. (上午,28,30)   
  15. (10,30,32)   
  16. (点,32,33)   
  17. (同济大学,34,38)   
  18. (建校,38,40)   
  19. (100,40,43)   
  20. (周年,43,45)   
  21. (庆典,45,47)   
  22. (大会,47,49)   
  23. (在,49,50)   
  24. (同济大学,50,54)   
  25. (大礼堂,54,57)   
  26. (隆重举行,57,61)   
  27. (中共中央总书记,62,69)   
  28. (国家主席,70,74)   
  29. (胡锦涛,74,77)   
  30. (发来,77,79)   
  31. (贺信,79,81)   
  32. (全国人大常委会,82,89)   
  33. (副委员长,89,93)   
  34. (李铁映,93,96)   
  35. (全国人大常委会,97,104)   
  36. (副委员长,104,108)   
  37. (顾秀莲,108,111)   
  38. (国务委员,112,116)   
  39. (陈至立,116,119)   
  40. (中共,120,122)   
  41. (上海市,122,125)   
  42. (委,125,126)   
  43. (书记,126,128)   
  44. (习近平,128,131)   
  45. (德国,132,134)   
  46. (前总理,134,137)   
  47. (施,137,138)   
  48. (罗德,138,140)   
  49. (中央纪委,141,145)   
  50. (副书记,145,148)   
  51. (张惠新,148,151)   
  52. (教育部,152,155)   
  53. (部长,155,157)   
  54. (周济,157,159)   
  55. (建设部,160,163)   
  56. (部长,163,165)   
  57. (汪光焘,165,168)   
  58. (中共,169,171)   
  59. (上海市,171,174)   
  60. (委,174,175)   
  61. (副书记,175,178)   
  62. (市长,179,181)   
  63. (韩正,181,183)   
  64. (科技部,184,187)   
  65. (党组书记,187,191)   
  66. (副部长,192,195)   
  67. (李学勇,195,198)   
  68. (等,198,199)   
  69. (出席,199,201)   
  70. (庆典,201,203)   
  71. (大会,203,205)   
  72. (庆典,210,212)   
  73. (大会,212,214)   
  74. (上首,214,216)   
  75. (先,216,217)   
  76. (宣读,217,219)   
  77. (胡锦涛,219,222)   
  78. (总书记,222,225)   
  79. (贺信,225,227)   
  80. (之后,228,230)   
  81. (科技部,230,233)   
  82. (部长,233,235)   
  83. (同济大学,236,240)   
  84. (校长,240,242)   
  85. (万,242,243)   
  86. (钢,243,244)   
  87. (从,244,245)   
  88. (大学,246,248)   
  89. (对,248,249)   
  90. (社会,249,251)   
  91. (的,251,252)   
  92. (承诺,252,254)   
  93. (的,255,256)   
  94. (角度,256,258)   
  95. (讲述,258,260)   
  96. (百年,260,262)   
  97. (同济,262,264)   
  98. (的,264,265)   
  99. (辉煌,265,267)   
  100. (历史,267,269)   
  101. (和,269,270)   
  102. (未来,270,272)   
  103. (发展,272,274)   
  104. (来自,275,277)   
  105. (德国,277,279)   
  106. (柏林,279,281)   
  107. (工业大学,281,285)   
  108. (的,285,286)   
  109. (校长,286,288)   
  110. (库,288,289)   
  111. (茨,289,290)   
  112. (勒,290,291)   
  113. (中国科学院,292,297)   
  114. (院士,297,299)   
  115. (吴孟超,299,302)   
  116. (同济大学,303,307)   
  117. (交通运输,307,311)   
  118. (工程学院,311,315)   
  119. (孙立军,315,318)   
  120. (等,318,319)   
  121. (也将,319,321)   
  122. (作为,321,323)   
  123. (友好,323,325)   
  124. (学校,325,327)   
  125. (代表,327,329)   
  126. (校友,330,332)   
  127. (代表,332,334)   
  128. (师生,335,337)   
  129. (代表,337,339)   
  130. (先后,339,341)   
  131. (致辞,341,343)   
  132. (今天,348,350)   
  133. (早晨,350,352)   
  134. (8,352,353)   
  135. (点开,353,355)   
  136. (始,355,356)   
  137. (同济大学,357,361)   
  138. (的,361,362)   
  139. (师生,362,364)   
  140. (老,365,366)   
  141. (校友,366,368)   
  142. (们,368,369)   
  143. (就,369,370)   
  144. (陆续,370,372)   
  145. (进入,372,374)   
  146. (庆典,374,376)   
  147. (大会,376,378)   
  148. (会场,378,380)   
  149. (会场,381,383)   
  150. (大屏幕,383,386)   
  151. (上,386,387)   
  152. (滚动,387,389)   
  153. (播放,389,391)   
  154. (着,391,392)   
  155. (建校,392,394)   
  156. (100,394,397)   
  157. (周年,397,399)   
  158. (的,399,400)   
  159. (宣传片,400,403)   
  160. (庆典,404,406)   
  161. (大会,406,408)   
  162. (开始,408,410)   
  163. (前,410,411)   
  164. (举行,411,413)   
  165. (了,413,414)   
  166. (同济,414,416)   
  167. (老,416,417)   
  168. (校友,417,419)   
  169. (互动,419,421)   
  170. (活动,421,423)   
  171. (现场,424,426)   
  172. (十分,426,428)   
  173. (感人,428,430)   
  174. (同济大学,435,439)   
  175. (是,439,440)   
  176. (教育部,440,443)   
  177. (直属,443,445)   
  178. (重点,445,447)   
  179. (大学,447,449)   
  180. (创建,450,452)   
  181. (于,452,453)   
  182. (1907,453,457)   
  183. (年,457,458)   
  184. (早期,459,461)   
  185. (为,461,462)   
  186. (德国,462,464)   
  187. (医生,464,466)   
  188. (在上,466,468)   
  189. (海,468,469)   
  190. (创办,469,471)   
  191. (的,471,472)   
  192. (德文,472,474)   
  193. (医学,474,476)   
  194. (堂,476,477)   
  195. (取名,478,480)   
  196. (同济,481,483)   
  197. (意蕴,484,486)   
  198. (合作,486,488)   
  199. (共,488,489)   
  200. (济,489,490)   
  201. (1912,491,495)   
  202. (年,495,496)   
  203. (增设,496,498)   
  204. (工学,498,500)   
  205. (堂,500,501)   
  206. (1923,502,506)   
  207. (年,506,507)   
  208. (被,507,508)   
  209. (批准,508,510)   
  210. (改名,510,512)   
  211. (为大,512,514)   
  212. (学,514,515)   
  213. (1927,516,520)   
  214. (年,520,521)   
  215. (正式,521,523)   
  216. (定为,523,525)   
  217. (国立,525,527)   
  218. (同济大学,527,531)   
  219. (抗战,532,534)   
  220. (期间,534,536)   
  221. (曾,536,537)   
  222. (内迁,537,539)   
  223. (经,539,540)   
  224. (浙,540,541)   
  225. (赣,542,543)   
  226. (滇,544,545)   
  227. (入,545,546)   
  228. (川,546,547)   
  229. (1946,548,552)   
  230. (年,552,553)   
  231. (回迁,553,555)   
  232. (上海,555,557)   
  233. (并发,557,559)   
  234. (展,559,560)   
  235. (为,560,561)   
  236. (以,561,562)   
  237. (拥有,562,564)   
  238. (理,564,565)   
  239. (工,566,567)   
  240. (医,568,569)   
  241. (文,570,571)   
  242. (法,572,573)   
  243. (五大,573,575)   
  244. (学院,575,577)   
  245. (著称,577,579)   
  246. (海内外,579,582)   
  247. (的,582,583)   
  248. (综合性,583,586)   
  249. (大学,586,588)   
  250. (1952,589,593)   
  251. (年,593,594)   
  252. (院系,594,596)   
  253. (调整,596,598)   
  254. (后,598,599)   
  255. (同济大学,600,604)   
  256. (成为,604,606)   
  257. (国内,606,608)   
  258. (土木,608,610)   
  259. (建筑,610,612)   
  260. (领域,612,614)   
  261. (最大,614,616)   
  262. (专业,617,619)   
  263. (最全,619,621)   
  264. (的,621,622)   
  265. (工科大学,622,626)   
  266. (1978,631,635)   
  267. (年,635,636)   
  268. (经,636,637)   
  269. (中央,637,639)   
  270. (批准,639,641)   
  271. (恢复,641,643)   
  272. (对,643,644)   
  273. (德,644,645)   
  274. (交流,645,647)   
  275. (在,648,649)   
  276. (中科院,649,652)   
  277. (学部委员,652,656)   
  278. (李国豪,656,659)   
  279. (校长,659,661)   
  280. (领导,661,663)   
  281. (下,663,664)   
  282. (实行,664,666)   
  283. (两个转变,667,671)   
  284. (即,673,674)   
  285. (由,674,675)   
  286. (土木,675,677)   
  287. (为主,677,679)   
  288. (的,679,680)   
  289. (理工科,680,683)   
  290. (大学,683,685)   
  291. (向,685,686)   
  292. (理工,686,688)   
  293. (为主,688,690)   
  294. (的,690,691)   
  295. (多科,691,693)   
  296. (性,693,694)   
  297. (大学,694,696)   
  298. (转变,696,698)   
  299. (由,699,700)   
  300. (国内,700,702)   
  301. (普通,702,704)   
  302. (高校,704,706)   
  303. (向,706,707)   
  304. (作为,707,709)   
  305. (中外文,709,712)   
  306. (化,712,713)   
  307. (交流,713,715)   
  308. (窗口,716,718)   
  309. (之一,719,721)   
  310. (的,721,722)   
  311. (国际性,722,725)   
  312. (大学,725,727)   
  313. (转变,727,729)   
  314. (从而,730,732)   
  315. (迅速,732,734)   
  316. (恢复,734,736)   
  317. (和,736,737)   
  318. (发展,737,739)   
  319. (成为,739,741)   
  320. (一所,741,743)   
  321. (以,743,744)   
  322. (工,744,745)   
  323. (为主,745,747)   
  324. (理工,748,750)   
  325. (结合,750,752)   
  326. (经,753,754)   
  327. (管,755,756)   
  328. (文,757,758)   
  329. (法,759,760)   
  330. (各具特色,760,764)   
  331. (的,764,765)   
  332. (多科,765,767)   
  333. (性,767,768)   
  334. (大学,768,770)  
  • Dic.rar (847.9 KB)
  • 描述: 词典
  • 下载次数: 195
   
时间:2007-05-24

SimpleChineseNameAnalyzer代码(Part 1):

java 代码
  1. /*  
  2.  * @作者:Hades , 创建日期:May 15, 2007  
  3.  *  
  4.  * 汕头大学03计算机本科  
  5.  *   
  6.  */  
  7. package com.novse.segmentation.unlistedword.name;   
  8.   
  9. import java.util.List;   
  10. import java.util.Map;   
  11.   
  12. import org.apache.commons.lang.StringUtils;   
  13.   
  14. import com.novse.segmentation.matching.dictionary.DictionaryImpl;   
  15. import com.novse.segmentation.unlistedword.AbstractUnListedWordAnalyzer;   
  16. import com.novse.segmentation.unlistedword.dictionary.ChineseFirstNameDictionary;   
  17. import com.novse.segmentation.unlistedword.dictionary.ChineseNameDictionary;   
  18. import com.novse.segmentation.unlistedword.dictionary.NotChineseNameDictionary;   
  19. import com.novse.segmentation.unlistedword.dictionary.ChineseNameDictionary.ChineseNameCharInfo;   
  20. import com.novse.segmentation.unlistedword.dictionary.NotChineseNameDictionary.NotChineseNameCharInfo;   
  21.   
  22. /**  
  23.  * @author Hades Guan 简单的人名识别器实现类  
  24.  */  
  25. public class SimpleChineseNameAnalyzer extends AbstractUnListedWordAnalyzer   
  26. {   
  27.     /**  
  28.      * 左边界词  
  29.      */  
  30.     private DictionaryImpl leftVergeDic = null;   
  31.   
  32.     /**  
  33.      * 边界概率调整系数  
  34.      */  
  35.     private final double M = 10.0;   
  36.   
  37.     /**  
  38.      * 概率调整系数  
  39.      */  
  40.     private final double N = 100.0;   
  41.   
  42.     /**  
  43.      * 带统计信息的中文姓名词典  
  44.      */  
  45.     private ChineseNameDictionary nameDic = null;   
  46.   
  47.     /**  
  48.      * 带统计信息的非中文姓名的词典  
  49.      */  
  50.     private NotChineseNameDictionary notNameDic = null;   
  51.   
  52.     /**  
  53.      * 右边界词  
  54.      */  
  55.     private DictionaryImpl rightVergeDic = null;   
  56.   
  57.     /**  
  58.      * 判断为人名的阀值  
  59.      */  
  60.     private double setpoint = 1;   
  61.   
  62.     /**  
  63.      * 将识别获得的词组放入临时词典中  
  64.      */  
  65.     private Map<String, String> tempNameDic = null;   
  66.   
  67.     /**  
  68.      * @param nameDic  
  69.      *            带统计信息的中文姓名词典  
  70.      * @param notNameDic  
  71.      *            带统计信息的非中文姓名的词典  
  72.      */  
  73.     public SimpleChineseNameAnalyzer(ChineseNameDictionary nameDic,   
  74.             NotChineseNameDictionary notNameDic)   
  75.     {   
  76.         this.nameDic = nameDic;   
  77.         this.notNameDic = notNameDic;   
  78.         this.initSeperator();   
  79.     }   
  80.   
  81.     /**  
  82.      * @param nameDic  
  83.      *            带统计信息的中文姓名词典  
  84.      * @param notNameDic  
  85.      *            带统计信息的非中文姓名的词典  
  86.      * @param leftVergeDic  
  87.      *            左边界词词典  
  88.      * @param rightVergeDic  
  89.      *            右边界词词典  
  90.      */  
  91.     public SimpleChineseNameAnalyzer(ChineseNameDictionary nameDic,   
  92.             NotChineseNameDictionary notNameDic, DictionaryImpl leftVergeDic,   
  93.             DictionaryImpl rightVergeDic)   
  94.     {   
  95.         this.nameDic = nameDic;   
  96.         this.notNameDic = notNameDic;   
  97.         this.leftVergeDic = leftVergeDic;   
  98.         this.rightVergeDic = rightVergeDic;   
  99.         this.initSeperator();   
  100.     }   
  101.   
  102.     /**  
  103.      * @param nameDic  
  104.      *            带统计信息的中文姓名词典  
  105.      * @param notNameDic  
  106.      *            带统计信息的非中文姓名的词典  
  107.      * @param tempNameDic  
  108.      *            用于记录已识别的临时词典  
  109.      */  
  110.     public SimpleChineseNameAnalyzer(ChineseNameDictionary nameDic,   
  111.             NotChineseNameDictionary notNameDic, Map<String, String> tempNameDic)   
  112.     {   
  113.         this.nameDic = nameDic;   
  114.         this.notNameDic = notNameDic;   
  115.         this.tempNameDic = tempNameDic;   
  116.         this.initSeperator();   
  117.     }   
  118.   
  119.     /**  
  120.      * @param nameDic  
  121.      *            带统计信息的中文姓名词典  
  122.      * @param notNameDic  
  123.      *            带统计信息的非中文姓名的词典  
  124.      * @param tempNameDic  
  125.      *            用于记录已识别的临时词典  
  126.      * @param leftVergeDic  
  127.      *            左边界词词典  
  128.      * @param rightVergeDic  
  129.      *            右边界词词典  
  130.      */  
  131.     public SimpleChineseNameAnalyzer(ChineseNameDictionary nameDic,   
  132.             NotChineseNameDictionary notNameDic,   
  133.             Map<String, String> tempNameDic, DictionaryImpl leftVergeDic,   
  134.             DictionaryImpl rightVergeDic)   
  135.     {   
  136.         this.nameDic = nameDic;   
  137.         this.notNameDic = notNameDic;   
  138.         this.tempNameDic = tempNameDic;   
  139.         this.leftVergeDic = leftVergeDic;   
  140.         this.rightVergeDic = rightVergeDic;   
  141.         this.initSeperator();   
  142.     }   
  143.   
  144.     /**  
  145.      * 计算汉字firstName作为姓氏的价值  
  146.      *   
  147.      * @param firstName  
  148.      *            汉字  
  149.      * @return 作为姓氏的价值  
  150.      */  
  151.     protected double getFirstNameValue(String firstName)   
  152.     {   
  153.         if (firstName == null || StringUtils.isBlank(firstName)   
  154.                 || firstName.length() > 2 || firstName.length() < 1)   
  155.             return 0;   
  156.   
  157.         // 获取汉字信息   
  158.         ChineseNameCharInfo info = this.nameDic   
  159.                 .getChineseNameCharInfo(firstName);   
  160.         NotChineseNameCharInfo notInfo = this.notNameDic   
  161.                 .getNotChineseNameCharInfo(firstName);   
  162.   
  163.         // 初始化出现频次   
  164.         int firstNameFrequence = 0, charFrequence = 0;   
  165.         int notFirstNameFrequence = 0, notCharFrequence = 0;   
  166.   
  167.         // 判断是否为姓氏   
  168.         if (!this.nameDic.getFirstNameDic().match(firstName))   
  169.             return 0;   
  170.         // 在姓名统计库与非姓名统计库均出现过   
  171.         else if (info != null && notInfo != null)   
  172.         {   
  173.             firstNameFrequence = info.firstNameFrequence;   
  174.             charFrequence = info.charFrequence;   
  175.   
  176.             notFirstNameFrequence = notInfo.firstFrequence;   
  177.             notCharFrequence = notInfo.otherFrequence;   
  178.         }   
  179.         // 在姓名统计库与非姓名统计库中都没出现的姓氏   
  180.         else if (info == null && notInfo == null)   
  181.         {   
  182.             return 1;   
  183.         }   
  184.         // 姓氏未在非姓名统计库中出现   
  185.         else if (notInfo == null)   
  186.         {   
  187.             firstNameFrequence = info.firstNameFrequence;   
  188.             charFrequence = info.charFrequence;   
  189.   
  190.             notFirstNameFrequence = 0;   
  191.             notCharFrequence = 0;   
  192.         }   
  193.         // 姓氏未在姓名统计库中出现   
  194.         else if (info == null)   
  195.         {   
  196.             firstNameFrequence = 0;   
  197.             charFrequence = 0;   
  198.   
  199.             notFirstNameFrequence = notInfo.firstFrequence;   
  200.             notCharFrequence = notInfo.charFrequence;   
  201.         }   
  202.   
  203.         double absoluteValue, relativeValue;   
  204.         // 姓名统计库的信息   
  205.         // 绝对姓氏概率   
  206.         absoluteValue = N * (double) firstNameFrequence   
  207.                 / (doublethis.nameDic.getFirstNameCount();   
  208.         // 相对姓氏概率   
  209.         if (charFrequence > 0)   
  210.             relativeValue = (double) firstNameFrequence   
  211.                     / (double) charFrequence;   
  212.         else  
  213.             relativeValue = 1;   
  214.         double value = absoluteValue * relativeValue;   
  215.   
  216.         // 非姓名统计库的信息   
  217.         // 绝对姓氏概率   
  218.         absoluteValue = N * (double) notFirstNameFrequence   
  219.                 / (doublethis.notNameDic.getFirstCount();   
  220.         // 相对姓氏概率   
  221.         if (notCharFrequence > 0)   
  222.             relativeValue = (double) notFirstNameFrequence   
  223.                     / (double) notCharFrequence;   
  224.         else  
  225.             relativeValue = 1;   
  226.         double notValue = absoluteValue * relativeValue;   
  227.   
  228.         // 返回结果   
  229.         return value / (value + notValue);   
  230.     }   
  231.   
  232.     /**  
  233.      * 计算givenName作为双字名字的价值  
  234.      *   
  235.      * @param givenName  
  236.      *            汉字  
  237.      * @return 作为双字汉字首字的价值  
  238.      */  
  239.     protected double getGivenNameValue(String givenName)   
  240.     {   
  241.         if (givenName == null || StringUtils.isBlank(givenName)   
  242.                 || givenName.length() != 1)   
  243.             return 0;   
  244.   
  245.         // 获取汉字信息   
  246.         ChineseNameCharInfo info = this.nameDic   
  247.                 .getChineseNameCharInfo(givenName);   
  248.         NotChineseNameCharInfo notInfo = this.notNameDic   
  249.                 .getNotChineseNameCharInfo(givenName);   
  250.   
  251.         int givenNameFrequence = 0, charFrequence = 0;   
  252.         int notGivenNameFrequence = 0, notCharFrequence = 0;   
  253.   
  254.         // 在姓名统计库与非姓名统计库都没有出现   
  255.         if (info == null && notInfo == null)   
  256.             return 1;   
  257.         else if (info == null && notInfo != null && notInfo.otherFrequence == 0)   
  258.             return 1;   
  259.         else if (notInfo == null && info != null  
  260.                 && info.givenNameFrequence == 0)   
  261.             return 1;   
  262.         // 在姓名统计库与非姓名统计库都出现   
  263.         else if (info != null && notInfo != null)   
  264.         {   
  265.             givenNameFrequence = info.givenNameFrequence;   
  266.             charFrequence = info.charFrequence;   
  267.   
  268.             notGivenNameFrequence = notInfo.otherFrequence;   
  269.             notCharFrequence = notInfo.charFrequence;   
  270.         }   
  271.         // 在非姓名统计库中无出现   
  272.         else if (notInfo == null)   
  273.         {   
  274.             givenNameFrequence = info.givenNameFrequence;   
  275.             charFrequence = info.charFrequence;   
  276.   
  277.             notGivenNameFrequence = 0;   
  278.             notCharFrequence = 0;   
  279.         }   
  280.         // 在姓名统计库中无出现   
  281.         else if (info == null)   
  282.         {   
  283.             givenNameFrequence = 0;   
  284.             charFrequence = 0;   
  285.   
  286.             notGivenNameFrequence = notInfo.otherFrequence;   
  287.             notCharFrequence = notInfo.charFrequence;   
  288.         }   
  289.   
  290.         double absoluteValue, relativeValue;   
  291.         // 姓名统计库的信息   
  292.         // 绝对名字用字概率   
  293.         absoluteValue = N * (double) givenNameFrequence   
  294.                 / (doublethis.nameDic.getGivenNameCount();   
  295.         // 相对名字用字概率   
  296.         if (charFrequence > 0)   
  297.             relativeValue = (double) givenNameFrequence   
  298.                     / (double) charFrequence;   
  299.         else  
  300.             relativeValue = 1;   
  301.         double value = absoluteValue * relativeValue;   
  302.   
  303.         // 非姓名统计库的信息   
  304.         // 绝对名字用字概率   
  305.         absoluteValue = N * (double) notGivenNameFrequence   
  306.                 / (doublethis.notNameDic.getOtherCount();   
  307.         // 相对名字用字概率   
  308.         if (notCharFrequence > 0)   
  309.             relativeValue = (double) notGivenNameFrequence   
  310.                     / (double) notCharFrequence;   
  311.         else  
  312.             relativeValue = 0;   
  313.         double notValue = absoluteValue * relativeValue;   
  314.   
  315.         // 返回结果   
  316.         return value / (value + notValue);   
  317.     }   
  318.   
  319.     /**  
  320.      * @return 返回 leftVergeDic。  
  321.      */  
  322.     public DictionaryImpl getLeftVergeDic()   
  323.     {   
  324.         return leftVergeDic;   
  325.     }   
  326.   
  327.     /**  
  328.      * @return 返回 nameDic。  
  329.      */  
  330.     public ChineseNameDictionary getNameDic()   
  331.     {   
  332.         return nameDic;   
  333.     }   
  334.   
  335.     /**  
  336.      * @return 返回 notNameDic。  
  337.      */  
  338.     public NotChineseNameDictionary getNotNameDic()   
  339.     {   
  340.         return notNameDic;   
  341.     }   
  342.   
  343.     /**  
  344.      * @return 返回 rightVergeDic。  
  345.      */  
  346.     public DictionaryImpl getRightVergeDic()   
  347.     {   
  348.         return rightVergeDic;   
  349.     }   
  350.   
  351.     /**  
  352.      * 获取阀值  
  353.      *   
  354.      * @return 返回 setpoint。  
  355.      */  
  356.     public double getSetpoint()   
  357.     {   
  358.         return setpoint;   
  359.     }   
  360.   
  361.     /**  
  362.      * @return 返回 tempNameDic。  
  363.      */  
  364.     public Map<String, String> getTempNameDic()   
  365.     {   
  366.         return tempNameDic;   
  367.     }   
   
0 请登录后投票
时间:2007-05-24

Part 2

java 代码
  1. /**  
  2.  * 对输入的原分词结果srcList进行中文人名识别  
  3.  *   
  4.  * @param srcList  
  5.  *            原分词结果  
  6.  * @return 中文人名识别处理后的分词结果  
  7.  */  
  8. @Override  
  9. public List<String> identify(List<String> srcList)   
  10. {   
  11.     // 获取姓氏词典   
  12.     ChineseFirstNameDictionary firstNameDic = nameDic.getFirstNameDic();   
  13.     // 初始化区间位移   
  14.     int startPos = 0, endPos = 0;   
  15.     // 循环   
  16.     while (startPos < srcList.size())   
  17.     {   
  18.         // 表示startPos位置不是姓氏的情况   
  19.         boolean isNotFirstName = startPos < srcList.size()   
  20.                 && (srcList.get(startPos).length() != 1 || srcList.get(   
  21.                         startPos).length() != 2)   
  22.                 && !firstNameDic.match(srcList.get(startPos));   
  23.         // 表示startPos位置是以姓氏开头且词长为2的情况   
  24.         boolean isBeginWithFirstName = startPos < srcList.size()   
  25.                 && srcList.get(startPos).length() == 2  
  26.                 && firstNameDic   
  27.                         .match(srcList.get(startPos).substring(01))   
  28.                 && this.getFirstNameValue(srcList.get(startPos).substring(   
  29.                         01)) > 0.5 && this.leftVergeDic != null  
  30.                 && startPos > 0 && startPos + 1 < srcList.size()   
  31.                 && this.leftVergeDic.match(srcList.get(startPos - 1))   
  32.                 && this.seperator.indexOf(srcList.get(startPos + 1)) < 0;   
  33.   
  34.         // 寻找分词结果中姓氏的位置   
  35.         while (isNotFirstName && !isBeginWithFirstName)   
  36.         {   
  37.             startPos++;   
  38.             // 表示startPos位置不是姓氏的情况   
  39.             isNotFirstName = startPos < srcList.size()   
  40.                     && (srcList.get(startPos).length() != 1 || srcList.get(   
  41.                             startPos).length() != 2)   
  42.                     && !firstNameDic.match(srcList.get(startPos));   
  43.             // 表示startPos位置是以姓氏开头且词长为2的情况   
  44.             isBeginWithFirstName = startPos < srcList.size()   
  45.                     && srcList.get(startPos).length() == 2  
  46.                     && firstNameDic.match(srcList.get(startPos).substring(   
  47.                             0,&