1. 說明
?《瑞金醫(yī)院MMC人工智能輔助構建知識圖譜大賽》是一個天池的自然語言處理相關的比賽天试,初賽是命名實體識別(Named Entity Recognition,簡稱NER)峭状。具體說,就是從醫(yī)學文檔里標注出藥名,疾病疾嗅,病因,臨床表現(xiàn)冕象,檢查方法等十二種實體的類別和位置代承。這是一個有監(jiān)督學習,它的訓練集是標注好的醫(yī)學文檔渐扮。
?還是延續(xù)以往比賽的思路论悴,找一個類似的簡單項目掖棉,在其上修修改改,于是找到了 "參考1" 中的例程膀估,它是一個在中文文本中標注地名幔亥,人名,組織名的程序察纯,使用工具是tensorflow帕棉,算法是BiLSTM-CRF。
?花了不到兩天的時間饼记,混進了復賽笤昨,雖說是在別人的代碼上修修改改,但也不失為一個NLP相關的深度學習入門握恳,順便熟悉一下如何使用tensorflow瞒窒。我做的工作很簡單:參考代碼2000多行,修改了不到200行乡洼,主要就是把那套代碼對這個項目做一個適配崇裁,沒啥可說的,本文主要梳理了深度學習如何應用于自然語言處理束昵,算法原理拔稳,以及Tensorflow的一些用法。
2. 深度學習能解決自然語言處理中的哪些問題
?前一陣被BERT刷屏了锹雏,它是谷歌AI團隊新發(fā)布新模型巴比,傳說在機器閱讀理解頂級水平測試中狂破11項紀錄,全面超越人類礁遵,測試主要來自QLUE和SquAD轻绞,它們包括:
MNLI:判斷兩個句子間是繼承,反駁佣耐,關系政勃。
QQP:兩個問句的類似程度。
QNLI:問答系統(tǒng)兼砖,區(qū)分問題的正確答案和同一段中的其它描述奸远。
SST-2:電影評論的感情色彩標注。
CoLA:判斷語法是否正確讽挟。
STS-B:語義相似度打分(1-5級)
MRPC:兩句語義是否等價懒叛。
RTE:識別繼承關系,和MNLI差不多耽梅,但數(shù)據(jù)集比較小薛窥。
SquAD:閱讀理解,在段落中找答案褐墅。
?看起來拆檬,只要有標注好的訓練集數(shù)據(jù)洪己,上述的各種關系都可以被預測,但是具體這些文字竟贯,又怎么代入模型呢答捕?往下看…
3. 命名實體識別的BIO標注集
?BIO標注將每個元素標注為“B-X”、“I-X”或者“O”屑那。其中拱镐,“B-X”表示此元素所在的片段屬于X類型并且此元素在此片段的開頭,“I-X”表示此元素所在的片段屬于X類型并且此元素在此片段的中間位置持际,“O”表示不屬于任何類型沃琅。形如:
本 O 課 O 題 O 組 O 前 O 期 O 研 O 究 O 及 O 相 O 關 O 研 O 究 O 結 O 果 O 已 O 經(jīng) O 明 O 確 O 1 B-Anatomy 1 I-Anatomy β I-Anatomy - I-Anatomy H I-Anatomy S I-Anatomy D I-Anatomy 1 I-Anatomy 作 O 為 O 公 O 認 O 的 O 肥 B-Disease 胖 I-Disease 相 O 關 O 基 O 因 O
?本例中借鑒的工具使用了BIO標注集,因此蜘欲,把賽題數(shù)據(jù)置換成了BIO格式益眉,以便代入,可以看到姥份,具體方法是以字為單位的標注(以詞為單位郭脂,可能在分詞的過程中引入一些誤差,我也沒嘗試)澈歉。轉換之后更容易看出展鸡,它是一個詞序列的關系問題。
4. 命名實體識別的具體方法
?BiLSTM-CRF是近兩年業(yè)界比較流行的解決命名實體識別的方法埃难,本題使用的也是這個方法莹弊,本題的解法可以分為三個步驟:第一,將文字向量化(Word embedding)涡尘;第二忍弛,計算上下文之間的關系(Bi-LSTM);第三悟衩,句子級的序列標注(CRF)剧罩。
?我借鑒的代碼位置在https://github.com/Determined22/zh-NER-TF, 功能是標注出文字中的人名,地名座泳,組織名。模型相關的代碼在 model.py幕与,我覺得特別核心的100行不到挑势,建議一邊看代碼一邊看以下說明,不妨在其中打印一些信息啦鸣,追蹤一下它的運行流程潮饱。
(1) Word Embedding
?Word Embedding詞嵌入向量是NLP里一個重要的概念,我們利用它將一個詞轉換成固定長度的向量表示,從而便于進行數(shù)學處理诫给。比如一篇文章里有1000個詞香拉,如果做one hot提取特取啦扬,則需要新增1000個特征,而像got與get會被識別為不同的詞凫碌,如果使用Word Embedding扑毡,則可能將一些同義詞提取為一個特征,從而實現(xiàn)降維和抽象的效果盛险,具體實現(xiàn)方法是用上下文預測當前詞瞄摊,也可以理解為在神經(jīng)網(wǎng)絡上實現(xiàn)word2vec,詳見參考二苦掘。
?總之换帜,可以把該層更解為對把詞置換為詞向量,本例中映射前支持的中文字符有3000多個鹤啡,降維的目標是300維惯驼,而每一維中的特征值是從3000映射到300后的概率分布,即可能性(有點像PCA降維)递瑰。從代碼中可以看到祟牲,用tensorflow降維就幾行代碼,確實很方便(見代碼中的model.py:lookup_layer_op)泣矛。
(2) Bi-LSTM
?LSTM(Long Short-Term Memory)長短期記憶網(wǎng)絡疲眷,是RNN(時間遞歸神經(jīng)網(wǎng)絡)的一種,適合于處理和預測時間序列中間隔和延遲相對較長的重要事件您朽。 Bi-LSTM即雙向LSTM狂丝,本例中使用TensorFlow提供的LSTMCell類建立了正向和反向各一個LSTM,用bidirectional_dynamic_rnn() 結合成一個雙向RNN(見代碼中的model.py: biLSTM_layer_op)
?這一步哗总,計算的是上下文之間的關系几颜,誰更可能出現(xiàn)在前面,誰更可能出現(xiàn)在誰后面讯屈,還沒真正標注蛋哭。
(3) CRF
?CRF是條件隨機場,是在給定隨機變量X的條件下涮母,隨機變量Y的馬爾可夫隨機場谆趾,這里使用的線性鏈條件隨機場,在條件概率模型P(Y|X)中叛本,Y是輸出變量沪蓬,表示標記序列(狀態(tài)序列),X是輸入變量来候,表示需要標注的觀測序列跷叉,用最大似然估計計算條件概率模型P ^(Y|X),預測時,對于給定的輸入序列云挟,求出條件概率P ^(y|x)最大的輸出序列y ^(可能性最大的標注序列)梆砸,詳見代碼中的tf.contrib.crf.crf_log_likelihood()。
?要了解CRF的原理园欣,先要了解馬爾可夫鏈帖世,以及很多基礎知識(雖然很有趣,但需要花很多時間)俊庇,但在程序里調用它很容易狮暑,幾行代碼就夠了,一開始了解它怎么用就夠了辉饱。
5. TensorFlow
?C++相對于 C搬男,Python相對于Java,TensorFlow相對于之前的程序架構彭沼,它們不只是語法不同缔逛,更多的是程序的組織方式,和思考方法不同姓惑。
?Tensorflow是基于圖(Graph)的計算系統(tǒng)褐奴。而圖的節(jié)點則是由操作(Operation)來構成的,而圖的各個節(jié)點之間則是由張量(Tensor)作為邊來連接在一起的于毙。所以Tensorflow的計算過程就是一個Tensor流圖敦冬。Tensorflow的圖則是必須在一個Session中來計算。
?這樣講還是很抽象唯沮,簡單地說脖旱,假設在程序中定義了三個函數(shù)(Operation): a,b,c,普通程序會順序地調用a,b,c介蛉,而Tensorflow是指定a,b,c之間的依賴關系(Tensor)萌庆,比如c依賴b的結果,b又依賴a的結果币旧,運行時践险,使用Session.run(),只要告訴它吹菱,我最終需要c巍虫,程序自己找到它依賴的b,以及a來運行鳍刷,通過數(shù)據(jù)流向把握整個過程垫言,有點像Luigi的工作模式。具體請見"參考7"倾剿。
6. 參考
(1) DL4NLP —— 序列標注:BiLSTM-CRF模型做基于字的中文命名實體識別
https://www.cnblogs.com/Determined22/p/7238342.html
(2) 淺談詞嵌入(word embedding)
https://blog.csdn.net/puredreammer/article/details/78330821
(3) 神經(jīng)網(wǎng)絡中embedding層作用
https://www.cnblogs.com/bonelee/p/7904495.html
(4) tensorflow學習筆記--embedding_lookup()用法
https://blog.csdn.net/u013041398/article/details/60955847
(5) tensorflow筆記3:CRF函數(shù):tf.contrib.crf.crf_log_likelihood()
https://www.cnblogs.com/lovychen/p/8490397.html
(6) [學習筆記] TensorFlow 入門之基本使用
https://www.cnblogs.com/flyu6/p/5555161.html
(7) Tensorflow學習筆記2:About Session, Graph, Operation and Tensor
https://www.cnblogs.com/lienhua34/p/5998853.html