使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)实现中文命名实体识别

一、分词介绍

http://nlp.stanford.edu/software/segmenter.shtml
斯坦福大学的分词器,该系统需要JDK 1.8+,从上面链接中下载stanford-segmenter-2014-10-26,解压之后,如下图所示 使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)实现中文命名实体识别_第1张图片
,进入data目录,其中有两个gz压缩文件,分别是ctb.gz和pku.gz,其中 CTB:宾州大学的中国树库训练资料 , PKU:中国北京大学提供的训练资料。当然了,你也可以自己训练,一个训练的例子可以在这里面看到 http://nlp.stanford.edu/software/trainSegmenter-20080521.tar.gz

二、NER介绍

http://nlp.stanford.edu/software/CRF-NER.shtml
斯坦福NER是采用Java实现,可以识别出(PERSON,ORGANIZATION,LOCATION),使用本软件发表的研究成果需引用下述论文:
Jenny Rose Finkel, Trond Grenager, and Christopher Manning. 2005. Incorporating Non-local Information into Information Extraction Systems by Gibbs Sampling. Proceedings of the 43nd Annual Meeting of the Association for Computational Linguistics (ACL 2005), pp. 363-370. 
下载地址在:
http://nlp.sta nford.edu/~manning/papers/gibbscrf3.pdf
在NER页面可以下载到两个压缩文件,分别是stanford-ner-2014-10-26和stanford-ner-2012-11-11-chinese
将两个文件解压可看到 使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)实现中文命名实体识别_第2张图片 使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)实现中文命名实体识别_第3张图片
,默认NER可以用来处理英文,如果需要处理中文要另外处理。

Included with Stanford NER are a 4 class model trained for CoNLL, a 7 class model trained for MUC, and a 3 class model trained on both data sets for the intersection of those class sets.

3 class: Location, Person, Organization
4 class: Location, Person, Organization, Misc
7 class: Time, Location, Organization, Person, Money, Percent, Date
如上图可以看到针对英文提供了3class、4class、7class, http://nlp.stanford.edu:8080/ner/ 但是中文并没有,这是一个在线演示的地址,可以上去瞧瞧 。

、分词和NER使用

在Eclipse中新建一个Java Project,将data目录拷贝到项目根路径下, 再把stanford-ner-2012-11-11-chinese解压的内容全部拷贝到classifiers文件夹下将stanford-segmenter-3.5.0加入到classpath之中, classifiers文件夹拷贝到项目根目录,将stanford-ner-3.5.0.jar和stanford-ner.jar加入到classpath中。最后,去 http://nlp.stanford.edu/software/corenlp.shtml下载stanford-corenlp-full-2014-10-31,将解压之后的stanford-corenlp-3.5.0也加入到classpath之中。最后的Eclipse中结构如下: 使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)实现中文命名实体识别_第4张图片
根据
We also provide Chinese models built from the Ontonotes Chinese named entity data. There are two models, one using distributional similarity clusters and one without. These are designed to be run on  word-segmented Chinese . So, if you want to use these on normal Chinese text, you will first need to run  Stanford Word Segmenter  or some other Chinese word segmenter, and then run NER on the output of that! 
Chinese NER
这段说明,很清晰,需要将中文分词的结果作为NER的输入,然后才能识别出NER来。
同时便于测试,本Demo使用junit-4.10.jar,下面开始上代码
[java] view plain copy
  1. import edu.stanford.nlp.ie.AbstractSequenceClassifier;   
  2. import edu.stanford.nlp.ie.crf.CRFClassifier;   
  3. import edu.stanford.nlp.ling.CoreLabel;   
  4.   
  5. /**  
  6.  
  7.   

  8. * ClassName ExtractDemo  
  9.  
     
  10.   

  11. * Description 加载NER模块  
  12.  
     
  13.  
  14. * @author wangxu [email protected]  
  15.   

  16. * Date 2015年1月8日 下午2:53:45  
  17.  
     
  18. * @version V1.0.0  
  19.  
  20. */   
  21. public class ExtractDemo {   
  22. private static AbstractSequenceClassifier ner;   
  23. public ExtractDemo() {   
  24. InitNer();   
  25. }   
  26. public void InitNer() {   
  27. String serializedClassifier = "classifiers/chinese.misc.distsim.crf.ser.gz"// chinese.misc.distsim.crf.ser.gz   
  28. if (ner == null) {   
  29. ner = CRFClassifier.getClassifierNoExceptions(serializedClassifier);   
  30. }   
  31. }   
  32.   
  33. public String doNer(String sent) {   
  34. return ner.classifyWithInlineXML(sent);   
  35. }   
  36.   
  37. public static void main(String args[]) {   
  38. String str = "我 去 吃饭 , 告诉 李强 一声 。";   
  39. ExtractDemo extractDemo = new ExtractDemo();   
  40. System.out.println(extractDemo.doNer(str));   
  41. System.out.println("Complete!");   
  42. }   
  43.   
  44. }   
[java] view plain copy
  1. import java.io.File;   
  2. import java.io.IOException;   
  3. import java.util.Properties;   
  4.   
  5. import org.apache.commons.io.FileUtils;   
  6.   
  7. import edu.stanford.nlp.ie.crf.CRFClassifier;   
  8. import edu.stanford.nlp.ling.CoreLabel;   
  9.   
  10. /**  
  11.  
  12.   

  13. * ClassName ZH_SegDemo  
  14.  
     
  15.   

  16. * Description 使用Stanford CoreNLP进行中文分词  
  17.  
     
  18.  
  19. * @author wangxu [email protected]  
  20.   

  21. * Date 2015年1月8日 下午1:56:54  
  22.  
     
  23. * @version V1.0.0  
  24.  
  25. */   
  26. public class ZH_SegDemo {   
  27. public static CRFClassifier segmenter;   
  28. static {   
  29. // 设置一些初始化参数   
  30. Properties props = new Properties();   
  31. props.setProperty("sighanCorporaDict""data");   
  32. props.setProperty("serDictionary""data/dict-chris6.ser.gz");   
  33. props.setProperty("inputEncoding""UTF-8");   
  34. props.setProperty("sighanPostProcessing""true");   
  35. segmenter = new CRFClassifier(props);   
  36. segmenter.loadClassifierNoExceptions("data/ctb.gz", props);   
  37. segmenter.flags.setProperties(props);   
  38. }   
  39.   
  40. public static String doSegment(String sent) {   
  41. String[] strs = (String[]) segmenter.segmentString(sent).toArray();   
  42. StringBuffer buf = new StringBuffer();   
  43. for (String s : strs) {   
  44. buf.append(s + " ");   
  45. }   
  46. System.out.println("segmented res: " + buf.toString());   
  47. return buf.toString();   
  48. }   
  49.   
  50. public static void main(String[] args) {   
  51. try {   
  52. String readFileToString = FileUtils.readFileToString(new File("澳门141人食物中毒与进食“问题生蚝”有关.txt"));   
  53. String doSegment = doSegment(readFileToString);   
  54. System.out.println(doSegment);   
  55.   
  56. ExtractDemo extractDemo = new ExtractDemo();   
  57. System.out.println(extractDemo.doNer(doSegment));   
  58.   
  59. System.out.println("Complete!");   
  60. catch (IOException e) {   
  61. e.printStackTrace();   
  62. }   
  63.   
  64. }   
  65. }   
注意一定是JDK 1.8+的环境,最后输出结果如下
loading dictionaries from data/dict-chris6.ser.gz...Done. Unique words in ChineseDictionary is: 423200
done [23.2 sec].
serDictionary=data/dict-chris6.ser.gz
sighanCorporaDict=data
inputEncoding=UTF-8
sighanPostProcessing=true
INFO: TagAffixDetector: useChPos=false | useCTBChar2=true | usePKChar2=false
INFO: TagAffixDetector: building TagAffixDetector from data/dict/character_list and data/dict/in.ctb
Loading character dictionary file from data/dict/character_list
Loading affix dictionary from data/dict/in.ctb
segmented res: 2008年 9月 9日    新华网 9月 8日 信息 : ( 记者 张家伟 ) 澳门 特区 政府 卫生局 疾病 预防 及 控制 中心 8 日 表示 , 目前 累计 有 141 人 在 本地 自助 餐厅 进食 后 出现 食物 中毒 症状 , 其中 大部分 与 进食 “ 问题 生蚝 ” 有关 。    卫生局 最早 在 3 日 公布 说 , 有 14 名 来自 三 个 群体 的 港 澳 人士 8月 27日 至 30日 期间 在 澳门 金沙 酒店 用 餐后 出现 不适 , 患者 陆续 出现 发热 、 呕吐 和 腹泻 等类 诺沃克 样 病毒 感染 的 症状 。 初步 调查 显示 , “ 上述 情况 可能 和 进食 生蚝 有关 ” 。
2008年 9月 9日    新华网 9月 8日 信息 : ( 记者 张家伟 ) 澳门 特区 政府 卫生局 疾病 预防 及 控制 中心 8 日 表示 , 目前 累计 有 141 人 在 本地 自助 餐厅 进食 后 出现 食物 中毒 症状 , 其中 大部分 与 进食 “ 问题 生蚝 ” 有关 。    卫生局 最早 在 3 日 公布 说 , 有 14 名 来自 三 个 群体 的 港 澳 人士 8月 27日 至 30日 期间 在 澳门 金沙 酒店 用 餐后 出现 不适 , 患者 陆续 出现 发热 、 呕吐 和 腹泻 等类 诺沃克 样 病毒 感染 的 症状 。 初步 调查 显示 , “ 上述 情况 可能 和 进食 生蚝 有关 ” 。
Loading classifier from E:\workspaces\EclipseEE4.4\aaaaaa\classifiers\chinese.misc.distsim.crf.ser.gz ... done [6.8 sec].
2008年 9月 9日    新华网 9月 8日 信息 : ( 记者 张家伟澳门 特区 政府 卫生局 疾病 预防 及 控制 中心 8 日 表示 , 目前 累计 有 141 人 在 本地 自助 餐厅 进食 后 出现 食物 中毒 症状 , 其中 大部分 与 进食 “ 问题 生蚝 ” 有关 。    卫生局 最早 在 3 日 公布 说 , 有 14 名 来自 个 群体 的 港 澳 人士 8月 27日 至 30日 期间 在 澳门 金沙 酒店 用 餐后 出现 不适 , 患者 陆续 出现 发热 、 呕吐 和 腹泻 等类 诺沃克 样 病毒 感染 的 症状 。 初步 调查 显示 , “ 上述 情况 可能 和 进食 生蚝 有关 ” 。
Complete!


转载自:http://blog.csdn.net/shijiebei2009/article/details/42525091


你可能感兴趣的:(使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)实现中文命名实体识别)