中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP
實體命名識別
- 相關知識
- Stanford CoreNLP 命名實體識別
- 一、簡介:
- 二、java版本使用
- 三、python版本使用
- NLTK 命名實體識別
- 一、簡介:
- 二、搭建環(huán)境
- 三、nltk使用
- 1、英文實體命名初體驗
- 2、使用nltk來處理中文資料
- 結(jié)巴分詞使用
- foolnltk 命名實體識別
- 一、簡介
- 二、python版本使用
- Ltp 實體命名識別
- 一、簡介
- 二、使用
- LAC 實體命名
- 一、簡介
- 二、python版本使用
- BosonNLP 實體識別
- 一、簡介
- 二、python版本使用
- Hanlp 實體識別
- 一、簡介
- 二、python版本使用
相關知識
信息抽取:從數(shù)據(jù)庫中抽取信息是容易的,但對于從自然文本中抽取信息則不那么直觀。通常信息抽取的流程如下圖:
分塊是實體識別(NER)使用的基本技術,詞性標注是分塊所需的最主要信息。下面以名詞短語(NP)為例,展示如何分塊。類似的還可以對動詞短語,介詞短語等進行分塊。
命名實體識別(Named Entity Recognition,簡稱NER)用于識別文本中具有特定意義的實體。需要識別的實體可以分為三大類(實體類、時間類和數(shù)字類)和七小類(人名、機構(gòu)名、地名、時間、日期、貨幣和百分比)。
中文命名實體識別工具(NER)哪家強?
介紹幾個專門面向中文的命名實體識別和關系抽取工具
Stanford CoreNLP 命名實體識別
一、簡介:
CoreNLP是Java自然語言處理的一站式服務!CoreNLP使用戶能夠?qū)С鑫谋镜恼Z言注釋,包括標記和句子邊界、詞性、命名實體、數(shù)值和時間值、依賴和選區(qū)解析、共指、情感、引用屬性和關系。CoreNLP的核心是管道。管道接收原始文本,對文本運行一系列NLP注釋器,并生成最終的注釋集。管道產(chǎn)生核心文檔,包含所有注釋信息的數(shù)據(jù)對象,可以通過簡單的API訪問,并且可以序列化到Google協(xié)議緩沖區(qū)。
中文語料模型包中有一個默認的配置文件
StanfordCoreNLP-chinese.properties指定pipeline的操作步驟以及對應的語料文件的位置,可以自定義配置文件,再引入代碼中。實際上我們可能用不到所有的步驟,或者要使用不同的語料庫,因此可以自定義配置文件,然后再引入。那在我的項目中,我就直接讀取了該properties文件。(有時候我們只想使用ner功能,但不想使用其他功能,想去掉。然而,Stanford CoreNLP有一些局限,就是在ner執(zhí)行之前,一定需要tokenize, ssplit, pos, lemma 的引入,大大增加了耗時。)
更多用法參見官網(wǎng)。
二、java版本使用
idea+maven搭建工程
1、在pom.xml 添加依賴:
<properties><corenlp.version>3.9.1</corenlp.version> </properties><dependencies><!--CoreNLP的算法包--><dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>${corenlp.version}</version></dependency><!--英文語料包--><dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>3.9.1</version><classifier>models</classifier></dependency><!--中文預料包--><dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp</artifactId><version>${corenlp.version}</version><classifier>models-chinese</classifier></dependency> </dependencies>2、編寫java程序
package com;import java.util.List; import java.util.Map; import java.util.Properties;import edu.stanford.nlp.coref.CorefCoreAnnotations; import edu.stanford.nlp.coref.data.CorefChain; import edu.stanford.nlp.ling.CoreAnnotations; import edu.stanford.nlp.ling.CoreLabel; import edu.stanford.nlp.pipeline.Annotation; import edu.stanford.nlp.pipeline.StanfordCoreNLP; import edu.stanford.nlp.semgraph.SemanticGraph; import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations; import edu.stanford.nlp.trees.Tree; import edu.stanford.nlp.trees.TreeCoreAnnotations; import edu.stanford.nlp.util.CoreMap; /**代碼思想:將text字符串交給Stanford CoreNLP處理,StanfordCoreNLP的各個組件(annotator)按“tokenize(分詞), ssplit(斷句), pos(詞性標注), lemma(詞元化), ner(命名實體識別), parse(語法分析), dcoref(同義詞分辨)”順序進行處理。處理完后 List<CoreMap> sentences = document.get(SentencesAnnotation.class); 中包含了所有分析結(jié)果,遍歷即可獲知結(jié)果。**/public class StanfordChineseNlpExample2 {public static void main(String[] args) throws Exception {StanfordChineseNlpExample2 nlp=new StanfordChineseNlpExample2();nlp.test();}public void test() throws Exception {//構(gòu)造一個StanfordCoreNLP對象,配置NLP的功能,如lemma是詞干化,ner是命名實體識別等StanfordCoreNLP pipeline = new StanfordCoreNLP("StanfordCoreNLP-chinese.properties");String text = "袁隆平是中國科學院的院士,他于2009年10月到中國山東省東營市東營區(qū)永樂機場附近承包了一千畝鹽堿地,";long startTime = System.currentTimeMillis();// 創(chuàng)造一個空的Annotation對象Annotation document = new Annotation(text);// 對文本進行分析pipeline.annotate(document);//獲取文本處理結(jié)果List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);for (CoreMap sentence : sentences) {// traversing the words in the current sentence// a CoreLabel is a CoreMap with additional token-specific methodsfor (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) {// 獲取句子的token(可以是作為分詞后的詞語)String word = token.get(CoreAnnotations.TextAnnotation.class);System.out.println(word);//詞性標注String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class);System.out.println(pos);// 命名實體識別String ne = token.get(CoreAnnotations.NormalizedNamedEntityTagAnnotation.class);String ner = token.get(CoreAnnotations.NamedEntityTagAnnotation.class);System.out.println(word + " | analysis : { original : " + ner + "," + " normalized : "+ ne + "}");//詞干化處理String lema = token.get(CoreAnnotations.LemmaAnnotation.class);System.out.println(lema);}// 句子的解析樹Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class);System.out.println("句子的解析樹:");tree.pennPrint();// 句子的依賴圖SemanticGraph graph =sentence.get(SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation.class);System.out.println("句子的依賴圖");System.out.println(graph.toString(SemanticGraph.OutputFormat.LIST));}long endTime = System.currentTimeMillis();long time = endTime - startTime;System.out.println("The analysis lasts " + time + " seconds * 1000");// 指代詞鏈// 每條鏈保存指代的集合// 句子和偏移量都從1開始Map<Integer, CorefChain> corefChains = document.get(CorefCoreAnnotations.CorefChainAnnotation.class);if (corefChains == null) {return;}for (Map.Entry<Integer, CorefChain> entry : corefChains.entrySet()) {System.out.println("Chain " + entry.getKey() + " ");for (CorefChain.CorefMention m : entry.getValue().getMentionsInTextualOrder()) {// We need to subtract one since the indices count from 1 but the Lists start from 0List<CoreLabel> tokens = sentences.get(m.sentNum - 1).get(CoreAnnotations.TokensAnnotation.class);// We subtract two for end: one for 0-based indexing, and one because we want last token of mention// not one following.System.out.println(" " + m + ", i.e., 0-based character offsets [" + tokens.get(m.startIndex - 1).beginPosition()+", " + tokens.get(m.endIndex - 2).endPosition() + ")");}}} }實體識別結(jié)果:
袁隆平 | analysis : { original : PERSON, normalized : null} 是 | analysis : { original : O, normalized : null} 中國 | analysis : { original : ORGANIZATION, normalized : null} 科學院 | analysis : { original : ORGANIZATION, normalized : null} 的 | analysis : { original : O, normalized : null} 院士 | analysis : { original : TITLE, normalized : null} , | analysis : { original : O, normalized : null} 他 | analysis : { original : O, normalized : null} 于 | analysis : { original : O, normalized : null} 2009年 | analysis : { original : DATE, normalized : 2009-10-XX} 10月 | analysis : { original : DATE, normalized : 2009-10-XX} 到 | analysis : { original : O, normalized : null} 中國 | analysis : { original : COUNTRY, normalized : null} 山東省 | analysis : { original : STATE_OR_PROVINCE, normalized : null} 東營市 | analysis : { original : CITY, normalized : null} 東營區(qū) | analysis : { original : FACILITY, normalized : null} 永樂 | analysis : { original : FACILITY, normalized : null} 機場 | analysis : { original : FACILITY, normalized : null} 附近 | analysis : { original : O, normalized : null} 承包 | analysis : { original : O, normalized : null} 了 | analysis : { original : O, normalized : null} 一千 | analysis : { original : NUMBER, normalized : 1000} 畝 | analysis : { original : O, normalized : null} 鹽 | analysis : { original : O, normalized : null} 堿地 | analysis : { original : O, normalized : null} , | analysis : { original : O, normalized : null} The analysis lasts 989 seconds * 1000大概可以識別到的類型有:人person、數(shù)字number、組織organization、頭銜title、省/市/區(qū)/位置province/city/facility/location、日期/時間date/time
實時在線演示:https://corenlp.run/
三、python版本使用
出現(xiàn)問題:[WinError 10054] 遠程主機強迫關閉了一個現(xiàn)有的連接。
解決方法:用梯子
更多詳細信息見:斯坦福大學NLP組Python深度學習自然語言處理工具Stanza試用
NLTK 命名實體識別
一、簡介:
NLTK對于自然語言處理有很多開箱即用的API,本文主要介紹如何使用NLTK進行中文命名實體識別。由于NLTK不支持中文分詞,所以本文使用了結(jié)巴分詞。
二、搭建環(huán)境
環(huán)境:windows64+python3
前提:安裝好python3,并且安裝了numpy、matplotlib、pandas等一些常用的庫
1、安裝PyYAML模塊和nltk模塊
pip install pyyaml nltk2、下載NLTK的數(shù)據(jù)包
方式一:界面下載
在pycharm中寫一個python腳本,如下:
import nltk nltk.download()運行腳本,出現(xiàn)如下界面,選擇all,設置下載路徑,點擊下載:
下載時間很長,如果有個別數(shù)據(jù)包無法下載,可切換到All Packages標簽頁,雙擊指定的包來進行下載。
方式二:命令行下載
創(chuàng)建名稱為 nltk_data 的文件夾(比如我創(chuàng)建在了anacondas的目錄下)
文件夾位置要求,程序會按照如下順序去找該文件夾,所以,你創(chuàng)建的文件夾在以下目錄即可:
Searched in:
- ‘C:\Users\10840/nltk_data’
- ‘D:\develop\python\Anaconda3\nltk_data’
- ‘D:\develop\python\Anaconda3\share\nltk_data’
- ‘D:\develop\python\Anaconda3\lib\nltk_data’
- ‘C:\Users\10840\AppData\Roaming\nltk_data’
- ‘C:\nltk_data’
- ‘D:\nltk_data’
- ‘E:\nltk_data’
- ’ ’
- ‘D:\develop\python\Anaconda3\nltk_data’
cmd 進入 nltk_data 文件夾目錄,執(zhí)行命令 python -m nltk.downloader all
關于下載的問題:[win error 10054] 遠程主機強迫關閉了一個現(xiàn)有的連接
解決方法:1.使用梯子 2.從國內(nèi)別人上傳的云盤下載(文末鏈接中有)3. 直接到官網(wǎng)下載數(shù)據(jù)包。
只要將下載的數(shù)據(jù)包復制到你的 Download Directory目錄下即可
三、nltk使用
用NLTK來實現(xiàn)文本信息提取的方法,包含4步:分詞,詞性標注,(分塊)命名實體識別,實體關系識別。
分塊可以簡單的基于經(jīng)驗,使用正則表達式來匹配,也可以使用基于統(tǒng)計的分類算法來實現(xiàn),NLTK有提供基于正則的分塊器。
nltk 不提供中文分詞。
1、英文實體命名初體驗
import sys import importlib importlib.reload(sys) import nltkarticle = "I came to Tsinghua University in Beijing" # 文章 tokens = nltk.word_tokenize(article) # 分詞 print("tokens",tokens) ''' tokens ['I', 'came', 'to', 'Tsinghua', 'University', 'in', 'Beijing'] '''tagged = nltk.pos_tag(tokens) # 詞性標注 print("tagged",tagged) ''' tagged [('I', 'PRP'), ('came', 'VBD'), ('to', 'TO'), ('Tsinghua', 'NNP'), ('University', 'NNP'), ('in', 'IN'), ('Beijing', 'NNP')] '''entities = nltk.chunk.ne_chunk(tagged) # 命名實體識別 print(entities) # 命名實體:確切的名詞短語,指特定類型的個體,如日期、人、組織等 ''' (SI/PRPcame/VBDto/TO(ORGANIZATION Tsinghua/NNP University/NNP)in/IN(GPE Beijing/NNP)) '''NLTK 采用的是賓州中文樹庫標記:
2、使用nltk來處理中文資料
nltk 目前只能比較好的處理英文和其他的一些拉丁語系。由于中文漢字一個挨一個,nltk不支持。
所以可以采用其他分詞工具對中文語料進行處理,再使用nltk對其進行實體識別。
分詞工具有很多,這里使用 結(jié)巴分詞。主頁有詳細介紹
結(jié)巴分詞使用
1、安裝
pip install jieba2、使用:中文分詞初體驗
# encoding=utf-8 import jiebajieba.enable_paddle() # 啟動paddle模式。 strs=["我來到北京清華大學","乒乓球拍賣完了","中國科學技術大學"] for str in strs:seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式print("Paddle Mode: " + '/'.join(list(seg_list)))seg_list = jieba.cut("我來到北京清華大學", cut_all=True) print("【全模式】: " + "/ ".join(seg_list))seg_list = jieba.cut("我來到北京清華大學", cut_all=False) print("【精確模式】: " + "/ ".join(seg_list))seg_list = jieba.cut("他來到了網(wǎng)易杭研大廈") print("【新詞識別】: "+", ".join(seg_list))seg_list = jieba.cut_for_search("小明碩士畢業(yè)于中國科學院計算所,后在日本京都大學深造") print("【搜索引擎模式】: "+", ".join(seg_list))''' Paddle Mode: 我/來到/北京清華大學 Paddle Mode: 乒乓球/拍賣/完/了 Paddle Mode: 中國科學技術大學【全模式】: 我/ 來到/ 北京/ 清華/ 清華大學/ 華大/ 大學 【精確模式】: 我/ 來到/ 北京/ 清華大學 【新詞識別】: 他, 來到, 了, 網(wǎng)易, 杭研, 大廈 【搜索引擎模式】: 小明, 碩士, 畢業(yè), 于, 中國, 科學, 學院, 科學院, 中國科學院, 計算, 計算所, ,, 后, 在, 日本, 京都, 大學, 日本京都大學, 深造 '''這樣,把分詞的結(jié)果輸出到文件中,NLTK就可以拿來做實體識別了,比如下面:
# encoding=utf-8 import sys import importlib importlib.reload(sys) import nltk# 上中文 tokens = nltk.word_tokenize("我 來到 北京 清華大學") # 分詞 print("tokens",tokens) tagged = nltk.pos_tag(tokens) # 詞性標注 print("tagged",tagged) entities = nltk.chunk.ne_chunk(tagged) # 命名實體識別 print(entities)''' tokens ['我', '來到', '北京', '清華大學'] tagged [('我', 'JJ'), ('來到', 'NNP'), ('北京', 'NNP'), ('清華大學', 'NN')] (S 我/JJ 來到/NNP 北京/NNP 清華大學/NN) '''參考資料:
python的nltk中文使用和學習資料匯總幫你入門提高
NLTK學習之四:文本信息抽取
foolnltk 命名實體識別
一、簡介
foolnltk一個基于深度學習的中文分詞工具,具有以下特點:
- 可能不是最快的開源中文分詞,但很可能是最準的開源中文分詞
- 基于 BiLSTM 模型訓練而成
- 包含分詞,詞性標注,實體識別, 都有比較高的準確率
- 用戶自定義詞典
- 可以定制自己的模型
有python版本和java版本,詳情請見
二、python版本使用
1、 安裝
pip install foolnltk2、 使用
#coding utf-8 import fool import os# 分詞 text = "我來到北京清華大學" print(fool.cut(text)) ''' [['我', '來到', '北京', '清華大學']] '''# 用戶自定義詞典 # 詞典格式格式如下,詞的權(quán)重越高,詞的長度越長就越越可能出現(xiàn), 權(quán)重值請大于 1 # 難受香菇 10 # 什么鬼 10 # 分詞工具 10 # 北京 10 # 北京天安門 10 fool.load_userdict(os.getcwd()+'\\mydictionary')# 詞性標注 print(fool.pos_cut(text)) ''' [[('我', 'r'), ('來到', 'v'), ('北京', 'ns'), ('清華大學', 'nt')]] '''# 實體識別 words, ners = fool.analysis(text) print(ners) ''' [[(3, 9, 'org', '北京清華大學')]] '''Ltp 實體命名識別
一、簡介
哈工大的LTP,免費使用但限流量,需要給錢才行
LTP4文檔,啊!其實官方文檔里面已經(jīng)寫的清清楚楚了!
這個也能支持用戶自定義詞典
二、使用
1、安裝
pip install ltp2、使用
import os from ltp import LTPltp = LTP() # 默認加載 Small 模型 # user_dict.txt 是詞典文件, max_window是最大前向分詞窗口 ltp.init_dict(path=os.getcwd()+'\\mydictionary', max_window=4)seg, hidden = ltp.seg(["馬云在1996年11月29日來到杭州的阿里巴巴公司。"]) # 分詞 print(seg) ''' [['馬云', '在', '1996年', '11月', '29日', '來到', '杭州', '的', '阿里巴巴', '公司', '。']] '''pos = ltp.pos(hidden) # 詞性標注 print(pos) ''' [['nh', 'p', 'nt', 'nt', 'nt', 'v', 'ns', 'u', 'nz', 'n', 'wp']] '''ner = ltp.ner(hidden) # 命名實體識別 tag, start, end = ner[0][0] print(ner) for tag, start, end in ner[0]:print(tag, ":", "".join(seg[0][start:end + 1])) ''' [[('Nh', 0, 0), ('Ns', 6, 6), ('Ni', 8, 9)]] Nh : 馬云 Ns : 杭州 Ni : 阿里巴巴公司 '''LTP 提供最基本的三種實體類型人名 Nh、地名 Ns、機構(gòu)名 Ni 的識別。
LAC 實體命名
LAC項目地址
一、簡介
LAC全稱Lexical Analysis of Chinese,是百度自然語言處理部研發(fā)的一款聯(lián)合的詞法分析工具,實現(xiàn)中文分詞、詞性標注、專名識別等功能。該工具具有以下特點與優(yōu)勢:
- 效果好:通過深度學習模型聯(lián)合學習分詞、詞性標注、專名識別任務,詞語重要性,整體效果F1值超過0.91,詞性標注F1值超過0.94,專名識別F1值超過0.85,效果業(yè)內(nèi)領先。
- 效率高:精簡模型參數(shù),結(jié)合Paddle預測庫的性能優(yōu)化,CPU單線程性能達800QPS,效率業(yè)內(nèi)領先。
- 可定制:實現(xiàn)簡單可控的干預機制,精準匹配用戶詞典對模型進行干預。詞典支持長片段形式,使得干預更為精準。
- 調(diào)用便捷:支持一鍵安裝,同時提供了Python、Java和C++調(diào)用接口與調(diào)用示例,實現(xiàn)快速調(diào)用和集成。
- 支持移動端: 定制超輕量級模型,體積僅為2M,主流千元手機單線程性能達200QPS,滿足大多數(shù)移動端應用的需求,同等體積量級效果業(yè)內(nèi)領先。
二、python版本使用
1、安裝
pip install lac2、使用
from LAC import LAC# 裝載LAC模型 lac = LAC(mode='lac')# 單個樣本輸入,輸入為Unicode編碼的字符串 text = u"馬云來到北京清華大學" lac_result = lac.run(text) print(lac_result) ''' [['馬云', '來到', '北京清華', '大學'], ['PER', 'v', 'ORG', 'n']] '''# 批量樣本輸入, 輸入為多個句子組成的list,平均速率更快 texts = [u"LAC是個優(yōu)秀的分詞工具", u"百度是一家高科技公司"] lac_result = lac.run(texts) print(lac_result) ''' [[['LAC', '是', '個', '優(yōu)秀', '的', '分詞', '工具'], ['nz', 'v', 'q', 'a', 'u', 'n', 'n']],[['百度', '是', '一家', '高科技', '公司'], ['ORG', 'v', 'm', 'n', 'n']]] '''控制臺輸出以上內(nèi)容,這個是初始化異常日志,不礙事,不喜歡的可以通過升級 paddlepaddle 版本到1.8以上 來關閉
pip install paddlepaddle==1.8詞性和專業(yè)名詞類別:(專業(yè)名詞只能識別4種:人物、地名、機構(gòu)名、時間)
BosonNLP 實體識別
這個現(xiàn)在官方不給 SDK 的 tooken 了,所以不能用了,但是在線演示平臺挺絢麗的。
bosonnlp的SDK文檔
一、簡介
BosonNLP實體識別引擎基于自主研發(fā)的結(jié)構(gòu)化信息抽取算法,F1分數(shù)達到81%,相比于StanfordNER高出7個百分點。通過對行業(yè)語料的進一步學習,可以達到更高的準確率。
二、python版本使用
1、安裝
pip install bosonnlp2、使用
from bosonnlp import BosonNLP import os nlp = BosonNLP(os.environ['BOSON_API_TOKEN']) nlp.ner('楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。', sensitivity=2)Hanlp 實體識別
pyhanlp 項目官方地址
一、簡介
HanLP是一系列模型與算法組成的NLP工具包,目標是普及自然語言處理在生產(chǎn)環(huán)境中的應用。HanLP具備功能完善、性能高效、架構(gòu)清晰、語料時新、可自定義的特點。內(nèi)部算法經(jīng)過工業(yè)界和學術界考驗。目前,基于深度學習的HanLP 2.0正處于alpha測試階段,未來將實現(xiàn)知識圖譜、問答系統(tǒng)、自動摘要、文本語義相似度、指代消解、三元組抽取、實體鏈接等功能。
我們介紹的Pyhanlp是HanLP1.x的Python接口,支持自動下載與升級HanLP1.x,兼容py2、py3。
二、python版本使用
1、安裝
安裝JDK
JDK官方下載地址
JDK的安裝與環(huán)境變量配置
注意 保證JDK的位數(shù)、操作系統(tǒng)位數(shù)和Python位數(shù)一致。
安裝Pyhanlp
pip install pyhanlp2、使用
# coding utf-8 import pyhanlp text = '楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。' NLPTokenizer = pyhanlp.JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer') # 加載模型 NER = NLPTokenizer.segment(text) # 命名實體識別 print(NER) ''' [楊超越/nr, 在/p, 1998年7月31日/t, 出生/v, 于/p, 江蘇省鹽城市/ns, 大豐區(qū)/ns, 。/w] '''不像前面介紹的幾個工具可以直接獲得實體,hanlp需要從詞性標注里面提取實體,
人名nr、地名ns、機名nt、時間t。
總結(jié)
以上是生活随笔為你收集整理的中文实体命名识别工具使用汇总:Stanza、LAC、Ltp、Hanlp、foolnltk、NLTK、BosonNLP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android官方开发文档Trainin
- 下一篇: 暑期实习NLP算法岗面经总结