AlphaGo战胜了围棋领域的人类第一高手,让人们惊叹于人工智能的发展速度。一夜之间,人工智能的应用成为了大家最热议的话题。在医疗领域,人工智能应用已逐渐渗透,如病理诊断、影像、肿瘤治疗等。
人工智能的核心是算法和数据,尤其是海量的优质数据,是人工智能发展的关键。过去“以药养医”,存在过度治疗、过度检查等问题,对医院的临床数据特别是治疗数据造成了污染。而数据质量的高低则直接决定了智能医疗的成功与否。
为了获得持续高质量的医疗大数据,数据治理和自然语言的处理不可或缺。在临床科研中,存在着很多无法描述的自然语言,我们需要将自然语言处理成可量化、可统计的数据。
每家医院都存有大量无法标准化的历史病案数据,特别是B超、放射、病理等数据。如B超的检查结果:
肝:肝大小形态正常,包膜光,实质回声均匀,管网清,右肝内胆管见约0.4cm强光斑,门脉不扩。胆:胆囊大小形态正常,壁光,内未见明显占位及结石,肝内外胆管不扩。胰:胰腺大小形态正常,实质回声均匀,主胰管不扩。脾:脾大小形态正常,内部回声均匀。双肾:双肾大小形态正常,包膜光,左肾见约0.7*0.7cm高回声结节,右肾见约0.4*0.3cm强光斑,余实质回声均匀,双肾盂不扩。CDFI:双肾内血流分布正常。输尿管:双侧输尿管未见明显扩张。膀胱:膀胱充盈尚可,壁毛糙,内透声佳。前列腺:前列腺大小约5.3*3.3*3.7cm,重约34g,内见多枚强光斑,较大约0.8cm,余实质回声欠均匀。
为了解析这部分的数据,我们需要自然语言处理工具,将其切分,分解成可统计、可分析的标准化数据。
一、Python自然语言处理:NLTK
自然语言工具箱(NLTK,Natural Language Toolkit)是一个基于python的类库,它是当前最为流行的自然语言编程和开发工具之一。NLTK是一个高效的平台,为自然语言的处理提供了很多的接口。
Python和NLTK的安装不在本文的讨论范围,在此不再赘述。接下来通过一些实例介绍NLTK的使用。
1.分 句
针对一段文字的描述,我们希望把它分成一个一个的句子。使用NLTK中的punkt句子分割器:
importnltk
sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
paragraph = "The first time I heard that song was in Hawaii on radio. I was just a kid, and loved it very much! What a fantastic song!"
sentences = sent_tokenizer.tokenize(paragraph)
print(sentences)
得到的结果为:
['The first time I heard that song was in Hawaii on radio.', 'I was just a kid, and loved it very much!', 'What a fantastic song!']
2.分 词
分成了句子之后,我们还要将句子分词,得到一个个的词组。使用NLTK 包中的 WordPunct tokenizer:
import nltk
sentence = "Are you old enough to remember Michael Jackson attending the Grammys with Brooke Shields and Webster sat on his lap during the show?"
words = nltk.word_tokenize(sentence)
print(words)
得到的结果:
['Are', 'you', 'old', 'enough', 'to', 'remember', 'Michael', 'Jackson', 'attending', 'the', 'Grammys', 'with', 'Brooke', 'Shields', 'and', 'Webster', 'sat', 'on', 'his', 'lap', 'during', 'the', 'show', '?']
3.词性标注
分句和分词之后,我们还可以对分词做词性标注:
import nltk
sentence = "Are you old enough to remember Michael Jackson attending the Grammys with Brooke Shields and Webster sat on his lap during the show?"
words = nltk.word_tokenize(sentence)
tags = nltk.pos_tag(words)
print(tags)
得到的结果如下:
[('Are', 'NNP'), ('you', 'PRP'), ('old', 'JJ'), ('enough', 'RB'), ('to', 'TO'), ('remember', 'VB'), ('Michael', 'NNP'), ('Jackson', 'NNP'), ('attending', 'VBG'), ('the', 'DT'), ('Grammys', 'NNP'), ('with', 'IN'), ('Brooke', 'NNP'), ('Shields', 'NNP'), ('and', 'CC'), ('Webster', 'NNP'), ('sat', 'VBD'), ('on', 'IN'), ('his', 'PRP