1. 程式人生 > >自然語言處理(NLP)常用開源工具總結----不定期更新

自然語言處理(NLP)常用開源工具總結----不定期更新

       學習自然語言這一段時間以來接觸和聽說了好多開源的自然語言處理工具,在這裡做一下彙總方便自己以後學習,其中有自己使用過的也有了解不是很多的,對於不甚瞭解的工具以後學習熟悉了會做更新的。

1.IKAnalyzer

IK Analyzer是一個開源的,基於Java語言開發的輕量級的中文分詞工具包。從2006.12推出1.0版本開始,IK Analyzer已經推出了多個版本,當前最新版本為2012 u6,最初基於Luence,從3.0開始成為面向Java的公用分片語件,獨立於Luence,下載地址為:http://code.google.com/p/ik-analyzer/。IK支援細粒度和智慧分詞兩種切分模式,支援英文字母、數字、中文詞彙等分詞處理,相容韓文、日文字元。可以支援使用者自定義的詞典,通過配置IKAnalyzer.cfg.xml

檔案來實現,可以配置自定義的擴充套件詞典和停用詞典。詞典需要採用UTF-8無BOM格式編碼,並且每個詞語佔一行。配置檔案如下所示:

<properties>  
	<comment>IK Analyzer 擴充套件配置</comment>
	<!--使用者可以在這裡配置自己的擴充套件字典--> 
	<entry key="ext_dict">ext.dic;</entry> 
	
	<!--使用者可以在這裡配置自己的擴充套件停止詞字典-->
	<entry key="ext_stopwords">stopword.dic;chinese_stopword.dic</entry> 
	
</properties>

IK部署很簡單,只需要把IKAnalyzer2012_u6.jar部署於專案的lib中,同時將IKAnalyzer.cfg.xml檔案以及詞典檔案置於src中,即可通過API的方式開發呼叫。

示例程式碼:

/**
	 * IK分詞功能實現
	 * @return
	 */
	public String spiltWords(String srcString){
		StringBuffer wordsBuffer = new StringBuffer("");
        try{
        	IKSegmenter ik=new IKSegmenter(new StringReader(srcString), true);  
        	Lexeme lex=null;  
        	while((lex=ik.next())!=null){  
//        		System.out.print(lex.getLexemeText()+" ");
        		wordsBuffer.append(lex.getLexemeText()).append(" ");
        	}
        }catch(Exception e){
        	logger.error(e.getMessage());
        }
		return wordsBuffer.toString();
	}

IK簡單、易於擴充套件,分詞結果較好並且採用Java編寫,因為我平時的專案以Java居多,所以是我平時處理分詞的首選工具。

2.中科院ICTCLAS

ICTCLAS是由中科院計算所歷經數年開發的分詞工具,採用C++編寫。最新版本命名為ICTCLAS2013,又名為NLPIR漢語分詞系統,官網為:http://ictclas.nlpir.org/。主要功能包括中文分詞、詞性標註、命名實體識別、使用者詞典功能,同時支援GBK編碼、UTF8編碼、BIG5編碼,新增微博分詞、新詞發現與關鍵詞提取。可以視覺化介面操作和API方式呼叫。

3.FudanNLP

FudanNLP主要是為中文自然語言處理而開發的工具包,也包含為實現這些任務的機器學習演算法和資料集。FudanNLP及其包含資料集使用LGPL3.0許可證。

主要功能包括:

資訊檢索:文字分類,新聞聚類。

中文處理:中文分詞,詞性標註,實體名識別,關鍵詞抽取,依存句法分析,時間短語識別。

結構化學習:線上學習,層次分類,聚類,精確推理。

工具採用Java編寫,提供了API的訪問呼叫方式。最新版本為FudanNLP-1.6.1,下載地址為:http://code.google.com/p/fudannlp/

下載安裝包後解壓後,內容如下圖所示:


在使用時將fudannlp.jar以及lib中的jar部署於專案中的lib裡面。models資料夾中存放的模型檔案,主要用於分詞、詞性標註和命名實體識別以及分詞所需的詞典;資料夾example中主要是使用的示例程式碼,可以幫助快速入門和使用;java-docs是API幫助文件;src中存放著原始碼;PDF文件中有著比較詳細的介紹和自然語言處理基礎知識的講解。

初始執行程式時初始化時間有點長,並且載入模型時佔用記憶體較大。在進行語法分析時感覺分析的結果不是很準確。

4.The Stanford Natural LanguageProcessing Group

4.1 Stanford CoreNLP

4.2 Stanford Word Segmenter

採用CRF(條件隨機場)演算法進行分詞,也是基於Java開發的,同時可以支援中文和Arabic,官方要求Java版本1.6以上,推薦記憶體至少1G。下載地址為http://nlp.stanford.edu/software/segmenter.shtml

簡單的示例程式:

//設定分詞器屬性。
   Properties props = new Properties();
//字典檔案地址,可以用絕對路徑,如d:/data
   props.setProperty("sighanCorporaDict", "data");
//字典壓縮包地址,可以用絕對路徑
   props.setProperty("serDictionary","data/dict-chris6.ser.gz");
//輸入文字的編碼;
   props.setProperty("inputEncoding", "UTF-8");
   props.setProperty("sighanPostProcessing", "true");
//初始化分詞器,
   CRFClassifier classifier = new CRFClassifier(props);
//從持久化檔案中載入分詞器設定;
   classifier.loadClassifierNoExceptions("data/ctb.gz", props);
   // flags must be re-set after data is loaded
   classifier.flags.setProperties(props);
//分詞
   List words = classifier.segmentString("語句內容");

4.3 Stanford POS Tagger

4.4 Stanford Named Entity Recognizer

4.5 Stanford Parser

4.6 Stanford Classifier

最後附上關於中文分詞器效能比較的一篇文章(2014.05.27更新)

http://www.cnblogs.com/wgp13x/p/3748764.html

4.Apache OpenNLP--2014.12.29更新

OpenNLP是Apache下的一個自然語言處理工具包,提供了分詞、分句、詞性標註、命名實體識別等 功能。官網地址為:http://opennlp.apache.org/  官方提供了文件說明以及API,有命令列呼叫和程式程式碼使用兩種方式。http://opennlp.apache.org/documentation/1.5.3/manual/opennlp.html裡面介紹了每種任務已經使用方式,介紹很詳細。同時提供了最大熵的處理工具opennlp.maxent,可以實現根據自己的需要來訓練最大熵模型,並且藉助模型進行語料的最大熵分類,個人感覺使用還是很方便的。