1. 程式人生 > 實用技巧 >【Python實戰專案】針對醫療資料進行命名實體識別

【Python實戰專案】針對醫療資料進行命名實體識別

一.什麼是命名實體識別

二.基於NLTK的命名實體識別

三.基於Stanford的NER

四.【實戰案例】醫學糖尿病資料命名實體識別

一 、什麼是命名實體識別?
命名實體識別(Named Entity Recognition,簡稱NER),又稱作“專名識別”,是指識別文字中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等。通常包括兩部分:
(1)實體邊界識別;
(2) 確定實體類別(人名、地名、機構名或其他)。
命名實體識別通常是知識挖掘、資訊抽取的第一步,被廣泛應用在自然語言處理領域。接下來,我們將介紹常用的兩種命名實體識別的方法。

二 、基於NLTK的命名實體識別:
NLTK:由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各項NLP領域的功能。
使用前需要先下載NLTK,安裝完成後,在python環境下輸入import nltk測試是否安裝成功然後輸入nltk.download()下載nltk所需要的資料包,完成安裝。
Python程式碼實現(注意檔案的編碼格式為utf-8無BOM格式):
-- coding: utf-8 --

import sys
reload(sys)
sys.setdefaultencoding(‘utf8’)    #讓cmd識別正確的編碼
import nltk
newfile = open(‘news.txt’)
text = newfile.read()  #讀取檔案
tokens = nltk.word_tokenize(text)  #分詞
tagged = nltk.pos_tag(tokens)  #詞性標註
entities = nltk.chunk.ne_chunk(tagged)  #命名實體識別
a1=str(entities) #將檔案轉換為字串
file_object = open(‘out.txt’, ‘w’)
file_object.write(a1)   #寫入到檔案中
file_object.close( )
print entities

具體的方法可參考NLTK官網介紹:http://www.nltk.org/ 輸出的結果為:

entities = nltk.chunk.ne_chunk(tagged)
entities
Tree(‘S’, [(‘At’, ‘IN’), (‘eight’, ‘CD’), (“o’clock”, ‘JJ’),
(‘on’, ‘IN’), (‘Thursday’, ‘NNP’), (‘morning’, ‘NN’),
Tree(‘PERSON’, [(‘Arthur’, ‘NNP’)]),
(‘did’, ‘VBD’), (“n’t”, ‘RB’), (‘feel’, ‘VB’),
(‘very’, ‘RB’), (‘good’, ‘JJ’), (‘.’, ‘.’)])

當然為了方便檢視,我們可以以樹結構的形式把結果繪製出來:

from nltk.corpus import treebank
t = treebank.parsed_sents(‘wsj_0001.mrg’)[0]
t.draw()

三 、基於Stanford的NER:
Stanford Named Entity Recognizer (NER)是斯坦福大學自然語言研究小組釋出的成果之一。
Stanford NER 是一個Java實現的命名實體識別(以下簡稱NER))程式。NER將文字中的實體按類標記出來,例如人名,公司名,地區,基因和蛋白質的名字等。
NER基於一個訓練而得的Model(模型可識別出 Time, Location, Organization, Person, Money, Percent, Date)七類屬性,其用於訓練的資料即大量人工標記好的文字,理論上用於訓練的資料量越大,NER的識別效果就越好。
因為原始的NER是基於java實現的,所以在使用Python程式設計之前,要確保自己電腦上已經安裝了jar1.8的環境(否則會報關於Socket的錯誤)。
然後我們使用Pyner使用python語言實現命名實體識別
安裝Pyner:解壓下載的Pyner,命令列中將工作目錄切換到Pyner資料夾下, 輸入命令 :python setup.py install 完成安裝.
接下來,還需要下載StanfordNER工具包,然後在解壓後的目錄開啟cmd命令窗體,執行,

java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer -loadClassifier classifiers/english.muc.7class.distsim.crf.ser.gz -port 8080 -outputFormat inlineXML

直到結果為:Loading classifier from classifiers/english.muc.7class.distsim.crf.ser.gz … done [1.2 sec].

以上操作是因為斯坦福的命名實體識別是基於java的socket寫的,所以必要保證有一個窗題與我們執行的命令通訊。最後,我們終於可以使用python程式設計實現NER了:

import ner
import sys
import nltk
reload(sys)
sys.setdefaultencoding(‘utf8’)
newfile = open(‘news.txt’)
text = newfile.read()
tagger = ner.SocketNER(host=’localhost’, port=8080)#socket程式設計
result=tagger.get_entities(text)   #stanford實現NER
a1=str(result)
file_object = open(‘outfile.txt’, ‘w’)
file_object.write(a1)
file_object.close( )
print result

四.醫學糖尿病資料命名實識別

目錄如下:
1-資料與任務介紹
2- 整體模型架構
3-資料標籤語料庫處理
4-輸入樣本填充補齊
5-訓練網路模型
6-醫療資料集(糖尿病)實體識別

更多文章和資料|點選下方文字直達 ↓↓↓
阿里雲K8s實戰手冊
[阿里雲CDN排坑指南]CDN
ECS運維指南
DevOps實踐手冊
Hadoop大資料實戰手冊
Knative雲原生應用開發指南
OSS 運維實戰手冊