使用Stanford NLP工具實現中文命名實體識別
一、 系統配置
Eclipseluna、 JDK 1.8+
二、分詞介紹
data目錄下有兩個gz壓縮檔案,分別是ctb.gz和pku.gz,其中CTB:賓州大學的中國樹庫訓練資料 ,PKU:中國北京大學提供的訓練資料。
三、 NER
使用斯坦福大學的NER,下載地址:http://nlp.stanford.edu/software/CRF-NER.shtml,在該頁面下分別下載stanford-ner-2014-10-26和stanford-ner-2012-11-11-chinese兩個包。
解壓後分別可以看到:
同時下載commons-io-2.4.jar、commons-lang3-3.3.2.jar、junit-4.10.jar三個Java包。
四、 中文命名實體識別
新建Java專案,將data目錄拷貝到專案根路徑下,再把stanford-ner-2012-11-11-chinese解壓的內容全部拷貝到classifiers資料夾下,將第三步中的三個Java包以及stanford NER和分詞器的Java包都匯入classpath中,然後,在:http://nlp.stanford.edu/software/ corenlp.shtml下載stanford-corenlp-full-2014-10-31,將解壓之後的stanford-corenlp-3.5.0也加入到classpath之中。將stanfordner中src新增到專案目錄下,並新增一下兩個程式碼:
ExtractDemo.java
importedu.stanford.nlp.ie.AbstractSequenceClassifier;
importedu.stanford.nlp.ie.crf.CRFClassifier;
importedu.stanford.nlp.ling.CoreLabel;
/*
ClassNameExtractDemo
載入NER模組
*/
publicclassExtractDemo
{
privatestaticAbstractSequenceClassifier<CoreLabel>ner;
publicExtractDemo()
{
InitNer();
}
publicvoidInitNer()
{
String serializedClassifier ="classifiers/chinese.misc.distsim.crf.ser.gz";//chinese.misc.distsim.crf.ser.gz
if (ner ==null)
{
ner =CRFClassifier.getClassifierNoExceptions(serializedClassifier);
}
}
public StringdoNer(Stringsent)
{
returnner.classifyWithInlineXML(sent);
}
publicstaticvoid main(Stringargs[])
{
String str = "今天下雨,不去打球。";
ExtractDemoextractDemo =newExtractDemo(); System.out.println(extractDemo.doNer(str));
System.out.println("Complete!");
}
}
ZH_SegDemo.java
importjava.io.File;
importjava.io.IOException;
importjava.util.Properties;
importorg.apache.commons.io.FileUtils;
importedu.stanford.nlp.ie.crf.CRFClassifier;
importedu.stanford.nlp.ling.CoreLabel;
/*
* ClassNameZH_SegDemo
* Description 使用StanfordCoreNLP進行中文實體識別
*/
public class ZH_SegDemo {
public staticCRFClassifier<CoreLabel>segmenter;
static {
// 設定一些初始化引數
Propertiesprops = new Properties();
props.setProperty("sighanCorporaDict","data");
props.setProperty("serDictionary","data/dict-chris6.ser.gz");
props.setProperty("inputEncoding","UTF-8");
props.setProperty("sighanPostProcessing","true");
segmenter = newCRFClassifier<CoreLabel>(props);
segmenter.loadClassifierNoExceptions("data/ctb.gz",props);
segmenter.flags.setProperties(props);
}
public static String doSegment(String sent) {
String[] strs =(String[]) segmenter.segmentString(sent).toArray();
StringBufferbuf= new StringBuffer();
for (String s :strs) {
buf.append(s +" ");
}
System.out.println("segmentedres: " + buf.toString());
returnbuf.toString();
}
public staticvoid main(String[] args) {
try {
StringreadFileToString = FileUtils.readFileToString(newFile("IFENG-8.txt"));
StringdoSegment = doSegment(readFileToString);
System.out.println(doSegment);
ExtractDemoextractDemo= new ExtractDemo();
System.out.println(extractDemo.doNer(doSegment));
System.out.println("Complete!");
} catch(IOException e) {
e.printStackTrace();
}
}
}
最後專案結構如下:
執行結果如下: