實戰美年健康AI大賽之一_自然語言處理

1. 說明

?一直想找個自然語言處理(NLP)相關的比賽.起始看到"美年健康AI大賽"的時候,覺得和之前糖尿病比賽很相似,還是GBDT調參大賽.解包一看幾百兆數據,覺得自己機器可能跑不動(后來確實加了一條內存),都沒打開看數據就放棄了.
?后來兩個朋友都推薦做這個比賽,說是NLP的,打開數據一看,欸~還挺有意思的.數據量大的好處是穩定,我線上線下基本是同增同減(只提交過三次,目前為止是同增同減),就是看那病情診斷看得心驚肉跳的,腿都軟了.

2. 比賽介紹

?言歸正傳,介紹一下比賽內容,比賽提供了涉及5萬多人的800多萬條各項體驗數據,有數據型的,也有字符型的.體驗項目名稱經過了脫敏處理,檢查結果的文字內容未脫敏,目標是預測:收縮壓、舒張壓、甘油三酯、高密度脂蛋白膽固醇和低密度脂蛋白膽固醇這五項指標,預測具體的值,是一個回歸問題.簡單說就是分析哪些指標與高血壓/高血脂相關.
?我使用的是lightgbm模型,簡單調參,對字符串只做了一些簡單的處理,過濾出一些我認為重要的文字特征,當前最好成績是0.03002(今天中午).NLP建構正在進行中.
?估計最后大多數人還是使用GBDT類算法,對于模型調參和基本的特征工程就不再重復,詳見之前的"糖尿病比賽".
?本文主要說說自然語言處理,此處的目的是把文字轉換成數值,枚舉,或者布爾類型,以方便代入模型.數據里面包含了很多文本,粗算也有上百萬條,其中涉及至少幾百種類型的檢查,眼科,牙科,心臟,B超等等,不可能為每種檢查寫一套正則表達式,下面來看看如何使用NLP的方法簡化工作.

3. 專業領域的自然語言處理

?一開始做的時候首先想到用一些現成的工具,比如snowNLP或者jieba把文字分成短句,詞組,取其中的關鍵詞等等.然后發現,醫療報告相對于普通文章有很大不同.普通文章可能有各種句式,各種結構,篇幅可能很長,其中可能有些和主題無關的信息等等.體驗結果中的文字,結構相對比較簡單.
?先來看看提供的txt數據,它包括:用戶id,體項項目名稱,體驗結果.體驗結果可以分成四種情況:
?第一種:純數值型,無需處理.
?第二種:枚舉型及其變種,如:"陰性","未見異常"等等,簡單處理即可轉成數值.
?第三種:簡單混合型,如:">100次/分,竇性心動過速",此類型以數值為主.
?第四種:復雜混合型,如:"甲狀腺內見多個低回聲結節,最大位于右葉約14mm×8mm,結節周邊有血管環繞".這種情況可能是純文字,可能是文字和數值混合,相對比較復雜,也很有趣,它包含了第二和第三兩種情況.

4. 預處理

?在處理文本之前,先要做些預測處理,比如:歸一大小寫,各種符號的全角半角,處理輸入錯誤,多余的空格等等.

5. 枚舉型及其變種

?常見的一些枚舉有"正常","未見明顯異常","陰性","陽性",以及加減號等等,相對來說比較容易判斷.需要注意的是同一內容可能有幾種不同的表達,此時需要判斷它的關鍵詞,尤其是注意其中的包含否定詞.只要unique()少,就適合將其視為枚舉處理.

6. 簡單混合型

?文本中會有長句包含短句,括號內外等等情況,這里只考慮:以數值為核心的短句.這經常出現在一個字段中其它都是純數字,而某幾個值被寫成"<30次".如果一個短句含有數字,可以把它分解成三部分:前綴+數字+后綴.其中數字又包括:數值,符號,單位.我處理的方法是將其拆分后保存在結構中,借助Python靈活的結構,這一操作并不復雜.
?同時還要需要考慮包含多個數值的情況,比如:< 30(正常范圍30-50).分優先級處理,比如括號內的優先級更低,帶大于小于和范圍比具體數值優先級更低等等.如果不借助結構,直接用正則判斷會非常復雜.
?數字部分除了0-9和小數點正負號外,還可能包含大于,范圍,描述面積體積的乘號等等,也是有限的幾種情況,可以分別用正則實現.
?后綴以單位為主:長度,體積,頻率等等,可能性有限,可一一列舉.
?前綴和其它后綴可能是一些描述性信息,其中也可提取出一些信息,比如:"左眼/右眼",可能涉及一個體驗結果用多個字段描述,放在復雜混合型中討論.

7. 復雜混合型

?復雜混合型是最難處理的一種情況,里面包含大量的醫生診斷信息,很重要.這類特征大概有100種左右.在此也能盡量多地使用自然語言處理的方法.
?第一個技術是遞歸分組,文本中會有長句包含短句,括號內外等等情況,首先要分組,大組(段)包括中組,中組(句)包含小組(詞),以及再小的組,有些數據分成足夠小的組,就可以用枚舉和簡單型來處理了.
?第二個技術是詞性,有一些現成的工具可以分詞,給出詞性,而名詞一般是核心詞,可以把一個短句看成三部分:1什么東西,2怎么了,3具體數值.
?第三個技術是TF/IDF,這與詞頻相關.舉個例子:肝臟B超報告,人看一遍就能從報告中總結出以下特征:形狀,血管,無回聲區及其大小,大概五六種重要指標.這些描述指標會在文本中多次出現,這就需要查找出現次數多的詞,另外還需要去掉一些每個特征都可能包括的關鍵字,比如"正常/大小/高/低".此時就可以對一個體驗項目取出一組關鍵詞,然后把這些關鍵詞相關的屬性(第二/三個技術)分別歸入不同特征.
?另外還可以邊提取邊篩選,比如說:我們得到了新的bool型特征:肝上是否有囊腫,可以計算它的不同取值(有/無)時,目標值的統計數據是否發生變化,假設:高壓均值為120,如果在有囊腫的情況下高壓均值為125,則說明這個新特征有意義.

8. 其它

?首先,需要用經驗手動做一些映射表,比如同一字段中出現的"S"與"敏感",未見異常的N種說法.
?另外,還有一些"后門",早晚有人說,現在說出來,總比最后一天才說強:文字信息會帶一些"血壓","血脂"相關的關鍵字,就是前面說的"關鍵文字特征".有的特征里直接就寫"血壓高".如果不想做復雜的NLP,可以寫正則只分析這些特征.相關的還有"血糖","肥胖"之類的關鍵字,舉一反三吧.(感覺這么說有點攪局)

9. 總結

?綜上,特征工程階段使用了數值處理,自然語言處理,正則表達式.在結構上涉及層層包含的關系,自動生成判斷邏輯(進行中…).我理解NLP并不只是分詞,主謂賓定狀補的解析,詞間的相似度,它在各個層次上的抽象也很重要.盡量自動化處理.雖然目前不能避免人工干預,但是程序也確實在很大程度上減少了工作量.
?我覺得來回試榜效果不好.心里很浮躁,反正現在時間還早,不如在深度和結構上多花點時間.如果做下去再有一些新的思路,后續再加文檔吧.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。