中文电子病例命名实体识别项目
MedicalNamedEntityRecognition
Medical Named Entity Recognition implement using bi-directional lstm and crf model with char embedding.CCKS2018中文電子病例命名實體識別項目,主要實現(xiàn)使用了基于字向量的四層雙向LSTM與CRF模型的網(wǎng)絡(luò).該項目提供了原始訓練數(shù)據(jù)樣本(一般項目,出院情況,病史情況,病史特點,診療經(jīng)過)與轉(zhuǎn)換版本,訓練腳本,預訓練模型,可用于序列標注研究.把玩和PK使用.
項目地址:https://github.com/liuhuanyong/MedicalNamedEntityRecognition
項目介紹
電子病歷結(jié)構(gòu)化是讓計算機理解病歷、應(yīng)用病歷的基礎(chǔ)。基于對病歷的結(jié)構(gòu)化,可以計算出癥狀、疾病、藥品、檢查檢驗等多個知識點之間的關(guān)系及其概率,構(gòu)建醫(yī)療領(lǐng)域的知識圖譜,進一步優(yōu)化醫(yī)生的工作.
CCKS2018的電子病歷命名實體識別的評測任務(wù),是對于給定的一組電子病歷純文本文檔,識別并抽取出其中與醫(yī)學臨床相關(guān)的實體,并將它們歸類到預先定義好的類別中。組委會針對這個評測任務(wù),提供了600份標注好的電子病歷文本,共需識別含解剖部位、獨立癥狀、癥狀描述、手術(shù)和藥物五類實體。
領(lǐng)域命名實體識別問題自然語言處理中經(jīng)典的序列標注問題, 本項目是運用深度學習方法進行命名實體識別的一個嘗試.
實驗數(shù)據(jù)
一, 目標序列標記集合
O非實體部分,TREATMENT治療方式, BODY身體部位, SIGN疾病癥狀, CHECK醫(yī)學檢查, DISEASE疾病實體,
二, 序列標記方法
采用BIO三元標記
三, 數(shù)據(jù)轉(zhuǎn)換
評測方提供了四個目錄(一般項目, 出院項目, 病史特點, 診療經(jīng)過),四個目錄下有txtoriginal文件和txt標注文件,內(nèi)容樣式如下:
一般項目-1.txtoriginal.txt
女性,88歲,農(nóng)民,雙灤區(qū)應(yīng)營子村人,主因右髖部摔傷后疼痛腫脹,活動受限5小時于2016-10-29;11:12入院。一般項目-1.txt:
右髖部 21 23 身體部位 疼痛 27 28 癥狀和體征 腫脹 29 30 癥狀和體征轉(zhuǎn)換腳本函數(shù):
def transfer(self):f = open(self.train_filepath, 'w+')count = 0for root,dirs,files in os.walk(self.origin_path):for file in files:filepath = os.path.join(root, file)if 'original' not in filepath:continuelabel_filepath = filepath.replace('.txtoriginal','')print(filepath, '\t\t', label_filepath)content = open(filepath).read().strip()res_dict = {}for line in open(label_filepath):res = line.strip().split(' ')start = int(res[1])end = int(res[2])label = res[3]label_id = self.label_dict.get(label)for i in range(start, end+1):if i == start:label_cate = label_id + '-B'else:label_cate = label_id + '-I'res_dict[i] = label_catefor indx, char in enumerate(content):char_label = res_dict.get(indx, 'O')print(char, char_label)f.write(char + '\t' + char_label + '\n')f.close()return模型輸出樣式:
, O 男 O , O 雙 O 塔 O 山 O 人 O , O 主 O 因 O 咳 SIGNS-B 嗽 SIGNS-I 、 O 少 SIGNS-B 痰 SIGNS-I 1 O 個 O 月 O , O 加 O 重 O 3 O 天 O , O 抽 SIGNS-B 搐 SIGNS-I模型搭建
本模型使用預訓練字向量,作為embedding層輸入,然后經(jīng)過兩個雙向LSTM層進行編碼,編碼后加入dense層,最后送入CRF層進行序列標注.
'''使用預訓練向量進行模型訓練''' def tokenvec_bilstm2_crf_model(self):model = Sequential()embedding_layer = Embedding(self.VOCAB_SIZE + 1,self.EMBEDDING_DIM,weights=[self.embedding_matrix],input_length=self.TIME_STAMPS,trainable=False,mask_zero=True)model.add(embedding_layer)model.add(Bidirectional(LSTM(128, return_sequences=True)))model.add(Dropout(0.5))model.add(Bidirectional(LSTM(64, return_sequences=True)))model.add(Dropout(0.5))model.add(TimeDistributed(Dense(self.NUM_CLASSES)))crf_layer = CRF(self.NUM_CLASSES, sparse_target=True)model.add(crf_layer)model.compile('adam', loss=crf_layer.loss_function, metrics=[crf_layer.accuracy])model.summary()return model模型效果
1, 模型的訓練:
| 醫(yī)療實體識別 | 6268 | 1571 | 0.9649 | 0.8451 | 5個epcho |
2, 模型的測試:
python lstm_predict.py, 對訓練好的實體識別模型進行測試,測試效果如下:
總結(jié)
1,本項目針對中文電子病例命名實體任務(wù),實現(xiàn)了一個基于Bilstm+CRF的命名實體識別模型
2,本項目使用charembedding作為原始特征,訓練集準確率為0.9649,測試集準確達到0.8451
3,命名實體識別可以加入更多的特征進行訓練,后期將逐步實驗其他方式.
any question? 請聯(lián)系我:
郵箱:lhy_in_blcu@126.com
csdn:https://blog.csdn.net/lhy2014
我的自然語言處理項目: https://liuhuanyong.github.io/
總結(jié)
以上是生活随笔為你收集整理的中文电子病例命名实体识别项目的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 笔记:python3编写的仿hubot的
- 下一篇: BIO,NIO,AIO