介绍几个专门面向中文的命名实体识别和关系抽取工具
知識圖譜已經在人工智能的各個領域發(fā)揮越來越重要的作用,例如視覺問答、對話系統(tǒng)、推薦系統(tǒng)等。知識圖譜構建是應用這些知識圖譜的基礎,而面對生活和企業(yè)中數(shù)據(jù)的爆發(fā)式增長,自動化知識圖譜構建顯得越來越重要。從非結構化文本中自動抽取三元組知識并構建知識圖譜需要用到的核心技術就是命名實體識別和關系抽取,現(xiàn)在已經有了很多相關的具體算法和模型,對于這些大家可以看頂會論文和技術分享,我們主要來介紹幾個專門面向中文的命名實體識別和關系抽取的工具。
?
1. 中文分詞
中文自然語言處理與其它語言比如英語的最大不同之處在于英文中每個詞直接由空格分隔開,但是中文是以字來分隔的,對于機器來說并不知道一句話中哪些字組成一個詞。因此,在實現(xiàn)很多中文的自然語言處理功能時,需要先進行分詞處理,將一句話中的中文詞語分隔開。首先,我們來介紹一種最流行的中文分詞工具jieba。
jieba的官方github地址:https://github.com/fxsjy/
ieba在官方對jieba(標星24.5k+)的介紹中,我們看到是這樣說的:
“結巴”中文分詞:做最好的 Python 中文分詞組件不是人自吹,jieba確實是目前最好的中文分詞工具,我們來看看這個小東西都有什么特點。
2. 對于同一個句子,支持四種分詞模式:
- 精確模式:試圖將句子最精確地切開,適合文本分析。
- 全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但不能解決歧義。
- 搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用于搜索引擎分詞。
- paddle模式:利用PaddlePaddle深度學習框架,訓練序列標注(雙向GRU)網絡模型實現(xiàn)分詞。同時支持詞性標注。paddle模式使用需安裝paddlepaddle-tiny:
3. 支持繁體分詞
4. 支持自定義詞典
5. 算法上,采用了動態(tài)規(guī)劃查找最大概率路徑, 找出基于詞頻的最大切分組合。對于未登錄詞,采用了基于漢字成詞能力的 HMM 模型,使用了 Viterbi 算法。具體的jieba和用法可以參考官方github文檔。
?
2. 命名實體識別
目前較為成熟的中文命名實體識別(NER)工具包括LTP,PyHanlp,Lac等。
2.1 語言技術平臺(LTP)
語言技術平臺(LTP) 是哈工大社會計算與信息檢索研究中心 11 年的持續(xù)研發(fā)和推廣,LTP 已經成為國內外最具影響力的中文處理基礎平臺,曾獲 CoNLL 2009七國語言句法語義分析評測 總成績第一名,中文信息學會錢偉長一等獎等重要成績和榮譽。LTP提供包括中文分詞、詞性標注、命名實體識別、依存句法分析、語義角色標注等豐富、高效、精準的自然語言處理技術。目前,LTP 已經被 500 多家國內外研究機構和企業(yè)使用,多家大企業(yè)和科研機構付費使用。LTP官方地址:http://ltp.ai/
要想用LTP實現(xiàn)中文命名實體識別非常簡單,首選,只需要一行指令便可自動安裝部署LTP:
pip install ltp接著,需要加載模型:
from ltp import LTltp = LTP() # 默認加載 Small 模型這時,就可以愉快的使用命名實體識別了:
from ltp import LTP ltp = LTP() seg, hidden = ltp.seg(["楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。"]) ner = ltp.ner(hidden)tag, start, end = ner[0][0]print(tag,":", "".join(seg[0][start:end + 1]))]利用LTP官方提供的在線演示系統(tǒng):http://ltp.ai/demo.html
可以通過可視化直接看到對“楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。”這句話的命名實體識別的效果:
從上面的結果可以看到,LTP可以識別出“楊超越”為人名,“江蘇省”為地名,但是無法識別出例如“1998年”這種時間類型的實體,同時對于“鹽城市”和“大豐區(qū)”這類地名也無法識別。
?
2.2 Pyhanlp
HanLP是一系列模型與算法組成的NLP工具包,目標是普及自然語言處理在生產環(huán)境中的應用。HanLP具備功能完善、性能高效、架構清晰、語料時新、可自定義的特點。內部算法經過工業(yè)界和學術界考驗。目前,基于深度學習的HanLP 2.0正處于alpha測試階段,未來將實現(xiàn)知識圖譜、問答系統(tǒng)、自動摘要、文本語義相似度、指代消解、三元組抽取、實體鏈接等功能。Pyhanlp的github項目官方地址:
https://github.com/hankcs/pyhanlp
這里我們介紹的Pyhanlp是HanLP1.x的Python接口,支持自動下載與升級HanLP1.x,兼容py2、py3。安裝Pyhanlp的步驟比LTP稍微復雜一步,首先需要安裝JDK,官方下載地址為:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
需要注意的是,這里需要保證JDK的位數(shù)、操作系統(tǒng)位數(shù)和Python位數(shù)一致。然后設置JAVA_HOME環(huán)境變量,接著,就可以根據(jù)如下指令安裝Pyhanlp了:
conda-forge jpype1==0.7.0 # (可選)conda安裝jpype1更方便pip install pyhanlp然后,就可以使用Pyhanlp來進行命名實體識別了,仍然需要通過類似于LTP的流程,先加載模型,再執(zhí)行命名實體識別:
import pyhanlp text = '楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。' NLPTokenizer = pyhanlp.JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer') NER = NLPTokenizer.segment(text) print(NER)為了和LTP的命名實體識別的效果進行對比,使用Pyhanlp官方提供的在線演示系統(tǒng):http://hanlp.hankcs.com/
并針對同樣的一個實例“楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。”,用Pyhanlp對這句話的命名實體識別的效果為:
?
2.3 BosonNLP
BosonNLP實體識別引擎基于自主研發(fā)的結構化信息抽取算法,F1分數(shù)達到81%,相比于StanfordNER高出7個百分點。通過對行業(yè)語料的進一步學習,可以達到更高的準確率。BosonNLP項目官方地址:http://static.bosonnlp.com/
BosonNLP 是一個更加商業(yè)化的中文語義分析API,其中,對于命名實體識別任務,可以識別時間、地點、人名、組織名、公司名、產品名、職位這幾類實體。
安裝這個工具非常簡便:
pip install bosonnlp接著,就可以調用這個API進行命名實體識別的任務了:
from bosonnlp import BosonNLP import os nlp = BosonNLP(os.environ['BOSON_API_TOKEN']) nlp.ner('楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。', sensitivity=2)同樣,為了和前兩個工具LTP和Pyhanlp進行對比,針對同樣的一個實例“楊超越在1998年7月31日出生于江蘇省鹽城市大豐區(qū)。”,使用BosonNLP官方提供的在線演示系統(tǒng):http://static.bosonnlp.com/demo#overview-ner
用BosonNLP對這句話的命名實體識別的效果為:
可以看到,用BosonNLP這個工具,能夠同時識別出這句話中的人名,時間和地名,相比前兩個系統(tǒng)具有最好的命名實體識別的效果。
?
當然,除了前面介紹的這個三個命名實體識別的工具,還有很多開源的工具可以使用,包括:
- 百度的Lac:https://github.com/baidu/lac
- 復旦大學的fnlp:https://github.com/FudanNLP/fnlp
- 斯坦福的StanfordCoreNLP:https://stanfordnlp.github.io/CoreNLP/
?
3. 關系抽取
目前,專門面向中文的關系抽取工具并不多,澤宇搜集到的中文關系抽取工具有DeepKE,Jiagu和DeepDive。
3.1 DeepKE
DeepKE是浙江大學知識引擎實驗室開發(fā)的中文關系抽取開源工具,項目官方地址是:
https://github.com/zjunlp/deepke
安裝DeepKE,首先需要安裝一些配置環(huán)境所需的依賴包:
- python >= 3.6
- torch >= 1.2
- hydra-core >= 0.11
- tensorboard >= 2.0
- matplotlib >= 3.1
- transformers >= 2.0
- jieba >= 0.39
相比于前面介紹的命名實體識別工具,DeepKE的封裝性相對沒有那么強,目前只能通過源碼安裝方式:
git clone https://github.com/zjunlp/deepke.gitcd deepke 再采用 pip install -r requirements.txt 安裝上述的相關依賴包。然后,對于我們自己的關系抽取任務,使用DeepKE提供的模型對我們的數(shù)據(jù)集進行訓練,所有的訓練數(shù)據(jù)需要存儲在 data/origin 文件夾中。接著,就可以訓練關系抽取的模型了,DeepKE提供了7種不同的關系抽取模型,包括:
- 基于 CNN 的關系抽取模型
- 基于 BiLSTM 的關系抽取模型
- 基于 PCNN 的遠程監(jiān)督關系抽取模型
- 基于 Capsule 的關系抽取模型
- 基于 Transformer 的關系抽取模型
- 基于 GCN 的關系抽取模型
- 基于 BERT 語言預訓練模型的關系抽取模型
可以看到,DeepKE提供的所有模型都是基于深度學習的關系抽取模型,其中包括最新的基于Transformer、GCN和BERT的模型,具體的每種模型的使用可以參考官方提供的文檔:
https://github.com/zjunlp/deepke/wiki
?
3.2 Jiagu
Jiagu使用大規(guī)模語料訓練而成。將提供中文分詞、詞性標注、命名實體識別、情感分析、知識圖譜關系抽取、關鍵詞抽取、文本摘要、新詞發(fā)現(xiàn)、情感分析、文本聚類等常用自然語言處理功能。Jiagu是思知機器人公司開發(fā)的一個針對中文關系抽取的開源工具,Jiagu的項目官方地址是:
https://github.com/ownthink/Jiagu
安裝Jiagu就非常方便,可以直接自動安裝:
pip install -U jiagu但是,Jiagu的關系抽取目前僅用于測試的功能,只能使用百科的描述進行測試。使用方法為:
import jiagu text = '姚明1980年9月12日出生于上海市徐匯區(qū),祖籍江蘇省蘇州市吳江區(qū)震澤鎮(zhèn),前中國職業(yè)籃球運動員,司職中鋒,現(xiàn)任中職聯(lián)公司董事長兼總經理。' knowledge = jiagu.knowledge(text) print(knowledge)?
3.3 DeepDive
deepdive是由斯坦福大學InfoLab實驗室開發(fā)的一個開源知識抽取系統(tǒng)。它通過弱監(jiān)督學習,從非結構化的文本中抽取結構化的關系數(shù)據(jù) 。斯坦福開源的DeepDive原本只能支持英文的關系抽取,國內最大的知識圖譜開放平臺OPENKG修改了DeepDive中自然語言處理的model包,使它支持中文,并提供中文使用手冊,后續(xù)將持續(xù)更新一些針對中文的優(yōu)化。
支持中文的DeepDive項目的官方地址為:
http://www.openkg.cn/dataset/cn-deepdive
希望這幾個非常實用的面向中文的命名實體識別和關系抽取工具能夠幫助大家實現(xiàn)非結構化知識抽取,快速自動構建知識圖譜,并賦能各種融入知識的人工智能項目中。
?
往期精選:
速覽EMNLP 2020上錄取的知識圖譜相關論文
介紹一些知識圖譜的實際應用類項目
已嵌入微信公眾號內的小圖聊天機器人介紹和使用說明
知識圖譜最新權威綜述論文解讀:知識表示學習部分
手把手教你搭建一個中式菜譜知識圖譜可視化系統(tǒng)
?
如果對文章感興趣歡迎關注知乎專欄“人工智能遇上知識圖譜“,也歡迎關注同名微信公眾號“人工智能遇上知識圖譜”,讓我們一起學習并交流討論人工智能與知識圖譜技術。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的介绍几个专门面向中文的命名实体识别和关系抽取工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django - 模板相关
- 下一篇: JavaWeb笔记:Html总结