1. 程式人生 > >使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)實現中文命名實體識別

使用Stanford Word Segmenter and Stanford Named Entity Recognizer (NER)實現中文命名實體識別

簡介

    Stanford NER是命名實體識別(NER,Named Entity Recognizer)的一個Java實現。NER可以標記文字中詞的序列,如人名、公司名、基因名或者蛋白質名等。它自帶精心設計的用於NER的特徵提取器,和用於定義特徵提取器的許多選項。在“下載”處,這裡有許多好的英文命名實體識別器,特別是對於有三類的(人名、組織機構名、地名),並且我們也提供對於不同語言和情況的各種其他模型,包括僅僅在CoNLL 2003英文訓練資料的模型。 
    Stanford NER作為CRFClassifier(條件隨機場分類器)也是著名的。此軟體提供一個對於(任意序列)線性鏈條件隨機場(CRF)序列模型的通用實現。通過標記資料,可以訓練自己的模型,你可以使用這個程式碼,為NER或者其他任務,建立序列模型。 
    Stanford NER可供下載,在GNU General Public license (V2 or later)許可下。原始碼也提供在下面。下載包中包含了命令列呼叫元件(請檢視下載中包含的shell指令碼和批處理檔案),執行作為一個服務(檢視原始碼jar檔案中的NERServer),一個java應用程式介面(檢視一個簡單例子——

NERDemo.java

引用

    這裡提供的CRF序列模型沒有精準對應於任何已經出版的文章,但是文章或者軟體可以這樣引用: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.stanford.edu/~manning/papers/gibbscrf3.pdf

開始操作

你可以嘗試Stanford NER CRF classifiers或者Stanford NER 作為Stanford CoreNLP中的一部分,從而理解Stanford NER是什麼,它是否對於您有幫助。去使用此軟體在您的電腦上,首先下載zip壓縮檔案。用其他軟體解壓此壓縮包或者使用unzip命令來解壓。通常建立一個”stanford-ner”空目錄,將檔案直接解壓到此目錄。這裡不需要安裝步驟,可以直接在此目錄中執行Stanford NER。一般地,Stanford NER可以從命令列執行。當前最新版本的Stanford NER要求使用java 1.8或者更新的java版本。確定你已經安裝了java1.8版本或者更新版本,否則還可以執行一箇舊版本的Stanford NER(Stanford NER 3.4.1支援java 6或者java 7).

NER GUI

確保java在電腦的環境變數中,就可以執行NER圖形使用者介面程式,通過雙擊或者執行./ner-gui.sh(在Linux系統中)來開啟程式。也可以通過雙擊stanford-ner.jar檔案去執行程式,但是很可能會因為作業系統沒有為我們的NER系統分配足夠多的java記憶體,而導致執行失敗。所以,通過雙擊ner-gui.bat(Windows中)或者ner-gui.sh(Linux/Unix/mac中)。然後,打開了程式之後,使用頂部的選單欄中“Classifier”選單,從“classifiers”目錄載入一個CRF分類器。可以通過“File”選單載入一個文字檔案或者web網頁,或者使用程式自帶的預設文字。最後,能夠點選“Run NER”按鈕,對文字做出實體標記。

單個CRF NER分類器從命令列

在命令列中完成,你需要在作業系統的環境變數中包含了java的目錄,並且stanford-ner.jar被包含在CLASSPATH中。具體操作方式依賴於具體的作業系統。 
對系統中自帶的sample.txt進行NER測試,可以在命令列中使用以下程式碼 
Windows中

java -mx600m -cp "*;lib\*" edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -textFile sample.txt
  • 1

Linux/Unix中

java -mx600m -cp "*:lib/*" edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -textFile sample.txt
  • 1

執行以上命令,可以得到如下結果 
這裡寫圖片描述

當然,也可將結果儲存到一個tsv檔案中,前兩列對應實體以及它們的類別,程式碼如下

java -mx600m -cp "*:lib/*" edu.stanford.nlp.ie.crf.CRFClassifier -loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -outputFormat tabbedEntities -textFile sample.txt > sample2017-01-24.tsv
  • 1

檢視產生的tsv檔案 
這裡寫圖片描述

完全Stanford NER 功能

這個Stanford distribution也允許訪問Stanford CoreNLP管道的全部NER 功能。這些功能可以被使用通過NERClassifierCombiner類。NERClassifierCombiner允許多CRFs一起被使用,並且也提供選項識別數字序列模型和時間模型,基於SUTime的基於規則NER。 
使用NERClassifierCombiner在命令列,在lib目錄中的jar檔案,必須被在CLASSPATH中。這裡是一個例子

java -mx1g -cp "*:lib/*" edu.stanford.nlp.ie.NERClassifierCombiner -textFile sample.txt -ner.model classifiers/english.all.3class.distsim.crf.ser.gz,classifiers/english.conll.4class.distsim.crf.ser.gz,classifiers/english.muc.7class.distsim.crf.ser.gz
  • 1

這裡寫圖片描述 
這裡有一個不同之處,這裡的sunday被識別為“DATE”

通過使用API實現可程式設計的

你能夠在自己的程式碼中呼叫Stanford NER。NERDemo.java說明了集中呼叫的方式。我們建議你從這裡例子開始,然後在需要的時候看javadoc等。

通過服務來程式設計

Stanford NER也能夠被設定去執行作為一個服務,此服務需要在socket上監聽。

其他問題

你可以檢視ppt上關於NER的介紹。PPT下載地址是nlp.stanford.edu/software/jenny-ner-2007.ppt 
這裡也有一系列的FAQ(Frequently Asked Questions)可檢視