1. 程式人生 > >使用Stanford NLP工具實現中文命名實體識別

使用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();

}

}

}

最後專案結構如下:


執行結果如下: