天天看點

《大資料原理:複雜資訊的準備、共享和分析》一一1.3 自動編碼 格物緻知。

1.3 自動編碼

格物緻知。

――中國諺語

編碼用于非結構化文本資料,是用與标準術語中的同義詞一緻的辨別符代碼标記詞條的過程(見術語表,identifier)。例如,醫學術語中可能包含詞條腎細胞癌(一種腎癌),附加一個唯一的辨別符代碼給這個術語,例如“c9385000”。腎細胞癌大約有50個同義詞,這裡列出一部分同義詞和近義詞:adenocarcinoma arising from kidney、adenocarcinoma involving kidney、cancer arising from kdney、carcinoma of kidney、grawitz tumor、grawitz tumour、hypernephroid tumor、hypernephroma、kidney adenocarcinoma、renal adenocarcinoma以及renal cell carcinoma。所有的這些術語都可以用同樣的代碼“c9385000”。

對一篇文本文檔進行自動編碼的過程包括:找到屬于某個特定術語中的全部詞條,用對應的辨別代碼标記這些詞條。

術語是特殊的詞彙表,通常包含涵蓋某個邊界明确的領域的全部詞條(見術語表,vocabulary),例如,疾病、天體、汽車品牌和型号等。一些術語是以字母順序排序的,也有一些是按照同義詞來排序的,同義詞和近義詞(見術語表,plesionymy)是根據某種标準(例如,最佳或是優先級)來收集的。同義詞目錄常由于多義詞的存在而變得麻煩(見術語表,polysemy)。在很多術語集中,為同義詞配置設定同一個代碼(例如,某個獨特的字元串;見術語表,uniqueness,string)。術語集有很多用處:加強互操作性和內建性,允許在查詢時擷取全部同義詞資訊,支援對文本資料的複雜分析,描述細節,在文本文檔中标注資訊,通過整合同義詞的統一編碼降低文本複雜度。對于存在于多個大資料資源中的大量文檔而言,如果能夠為文檔中出現的所有術語進行術語詞條到詞條編碼的替換和增補,那麼這些文檔就具備了一緻性。

在腎細胞癌的例子中,如果在某個醫療文本中出現的所有50多個同義詞詞條都被編碼為“c9385000”,那麼不論查詢哪個同義詞,搜尋引擎都能夠檢索包含這個代碼的全部文檔。例如,檢索grawitz tumor,檢索出來的文檔也将包含“hypernephroid tumor”這個詞,這是因為檢索引擎會簡單地将檢索詞“grawitz tumor”翻譯成代碼“c9385000”,然後推送标注有該代碼的全部記錄。

傳統上的術語編碼很像語言翻譯,一直被認為是最好由人類來完成的一種專業和高度細緻的工作。不僅有經過高度訓練的翻譯工具會給出通俗文本的外文版本,也有訓練有素的、熟練掌握特定術語集的程式員會建立标記後的文檔版本。給文檔标記術語代碼是一項重要工作。如果編碼存在缺陷,後果将不堪設想。2009年,美國榮民事務部(va)發出了上百封郵件,告知榮民他們患上了肌萎縮側索硬化症,也稱為葛雷克氏症,這是一種緻命的神經衰退疾病。然而事實上,大約600個收件人并沒有該疾病。va後來收回了這些郵件,并指明這次的混亂是編碼錯誤造成的12。程式員編碼的前後不一緻、個人習慣差異以及編碼出錯等問題,使得文本編碼并不容易。人為編碼的準确性似乎僅能達到85%~90%(見術語表,accuracy,precision)。

人類沒有足夠的時間、金錢和人力來處理千兆位元組和大量文本編碼。計算機編碼(即自動編碼)是唯一可行的解決方案。

自動編碼是一種特殊的機器翻譯形式,即在計算機科學領域處理從叙事文本汲取語義或是将叙事文本從一種語言翻譯成另一種語言的任務。理所當然,自動編碼算法直接采用機器翻譯領域的相關算法,尤其是自然語言處理算法(見術語表,algorithm)。正常的自動編碼算法包括如下幾個步驟:利用自然語言規則找出文本中的全部單詞和詞組,并将其與各個術語詞條對照。理想情況下,正确無誤的文本詞條是與其對應的術語詞條完全一緻的,而不論其在文本中是以何種方式表達。例如,詞條“adenocarcimoma of lung”有很多差别細微的替代詞,如“adenocarcinoma of the lung”“adenocarcinoma of the lungs”“lung adenocarcinoma”和“adenocarcinoma found in the lung”。自然語言算法會考慮文法因素、允許的替代術語結構、詞根和句法變異(見術語表,syntax)。字元串相似性算法可以稱得上是自然語言方法上的一個巧妙改進,當文法方法在判定詞條等價性上不起作用時,字元串相似性算法就可以發揮作用了。

當同義詞詞條缺少詞源學上的共性時,自動編碼會受到自然語言方法的一些限制。以詞條“renal cell carcinoma”為例,它的同義詞包含那些互相之間沒有文法關系的詞條。舉個例子,“hypernephroma”和“grawitz tumor”是“renal cell carcinoma”的同義詞,我們無法通過自然語言規則或是單詞相似度算法來計算這些詞條的等價程度。那麼,擷取單詞或詞組之間的同義程度的唯一方法,是借助全面的、列出每個同義詞的術語表。

撇開無法為沒有詞根的同義術語建構共性不說,現有的最好的自然語言自動編碼器運作速度很慢。究其原因與算法有關,算法通常最少包含以下幾步:從文法上将文本分解成語句,再将語句分解成更小的文法單元,在文法上重新安排群組合句子的文法單元,在詞幹詞彙上擴充句子,支援詞語的奇異性和多元性,并對術語表中列出的詞條在可接受變化範圍内進行比對。

目前,自然語言自動編碼器如果能每秒解析約1kb文本就是非常優秀的了。這意味着如果一個自動編碼器必須解析和編碼1tb的文本素材,則需要用10億秒來處理,即約30年。而大資料資源的資料量通常有很多很多tb,是以,自然語言自動編碼軟體對處理大資料資源不适用。那麼,既然如此,自動編碼有何價值呢?

自然語言自動編碼器如果在資料輸入時得以利用将産生極大價值。人類鍵入句子的速度遠比1kb/s低得多,自然語言編碼器能夠與打字員的速度保持一緻,并為每個輸入的詞條編碼。還可以進行自動更正、自動拼寫、多段預讀以及其他常用支撐性行為,以改善和提升打字員的效率。通過自然語言算法可防止變體術語不被識别,如果一個打字員夠精明,他會為應用程式提供一系列等價表達方式(如腎細胞癌renal cell carcinoma=rcc),這會幫助應用程式應對未來出現的更多的變體形式。

如果我們在進行資料準備時用上了自然語言解析器,似乎可以突破那些自然語言處理算法的固有限制。這種理念是自然語言軟體開發者和軟體使用體驗良好的使用者所推崇的,但他們忽略了大資料資源必備的兩條屬性:壽命和綜合處理(見術語表,curator)。

術語表并非一成不變。随着時間的推移,舊術語表的更新和新術語表的産生都會使同義詞詞條及其代碼發生更改。在某些情況下,大資料中的文本材料需要進行重新注解,而憑借的術語編碼也許涵蓋了資訊學領域新的、原先未預料到的編碼。

在這個資訊爆炸的社會,大多數人已對資料的逐漸消失習以為常,因為一旦資料達到了其存在的最初目的,那麼它就會被人類遺忘。我們并不會對所有電子郵件都永久儲存,也不會因為删除了早期部落格上的文章、facebook上的留言以及twitter上的推文而感到遺憾。再從醫療上說,病人資訊、确診診斷書和病理報告資訊等僅需在幾分鐘、幾小時、幾天或者幾個月中可用即可。也就是說我們很少會将文本資訊儲存幾年甚至幾十年。當我們存有超過幾十年、可回溯的資料時,就可以找到以前出現過的錯誤,避免這些錯誤再次出現,也可以利用這些資料進行趨勢分析,指導未來的發展。

為了儲存資料的價值,我們必須對資料進行持續管理,添加适用于現有術語表的代碼。有些瑣事無法避免―一次又一次地記錄整個大資料資源中的語料庫,使用修改版本的術語表或者使用新的術語表。這就需要自動編碼應用程式迅速地對大量文本資料(可能達到tb級)進行編碼。自然語言算法很大程度上依賴正規表達式操作(例如,尋找文本中的字模式),且自然語言算法過慢的計算速度已無法勝任上述工作(見術語表,regex)。

還有一種更快的方法是所謂的詞法解析。這涉及逐字逐句地解析文本,計算同一個術語表中的詞或詞條之間的比對程度。當發生比對時,文本中的詞彙會被配置設定到與術語表中比對的詞彙相對應的代碼。以句子“margins positive malignant melanoma”為例,其自動編碼算法政策是,首先你會使用一個列出人類遇到的所有惡性良性腫瘤的術語表,讓我們假設術語“malignant melanoma”和“melanoma”都已經包含在這個術語表中,且代碼相同,如“q5673013”,這是因為編寫術語表的人認為這兩者實體等效。

現在,讓我們開始自動編碼“margins positive malignant melanoma”這句話:

1.一次一個單詞,開始解析句子。第一個單詞“margins”,依照術語表沒有找到比對術語,儲存該單詞,進行下一步。

2.第二個單詞“positive”,同樣在術語表中沒有找到比對術語。于是同時檢索前一個單詞與這個單詞“margins positive”,也許這兩個單詞是一個術語,但結論還是no,儲存單詞“margins”和“positive”,繼續下一步。

3.第三個單詞“malignant”,術語表中也沒有比對術語。再看看兩個詞“positive malignant”和三個詞“margins positive malignant”是否有比對術語,結果還是沒有。

4.第四個單詞“melanoma”,發現在術語表中。再檢查兩個單詞“malignant melanoma”、三個單詞“positive malignant melanoma”、四個單詞“margins positive malignant melanoma”,發現術語表中有“malignant melanoma”的比對術語,但與“melanoma”的代碼相同。

5.自動編碼器給這個句子附加代碼“q5673013”,并繼續下一個句子,重複該算法。

這個算法看似工作量較大,且需要多次對比,但實際上它比自然語言解析更為高效。所有術語詞條有對應代碼的術語表,在資料暫存器中可存儲為一個變量(見術語表,variable),查詢速度也會更快。恰好有些方法比我們的示例算法速度更快,我先前發表的處理文本的方法能夠做到比自然語言算法快1000倍14。如今,電腦計算速度更快,在限定時間内,自動編碼能夠實作對大部分的資料資源中的文本資料進行編碼的任務。

如果分析師必須內建兩個互相獨立的大資料資源,且各自的術語表完全不同,這時就會有些棘手。一個可行的解決方案是動态編碼,而不管哪個術語表才能滿足分析師的分析目的。

這裡給出一個常用的動态編碼算法15:首先,在任意一個大資料資源集合中,用任意一個友善的術語表找到查詢詞的所有同義詞。具體如下:

1.分析師以資料使用者送出的查詢詞開始編碼過程。分析師首先選擇一個包含查詢詞及其同義詞的術語表,術語表隻要是由詞條-代碼對組成,且同義詞的代碼一緻即可。

2.收集查詢詞的所有同義詞。例如,一份2004版流行的醫學術語表―統一醫學語言系統,代碼為c0206708的詞條有38個,其中9個如下:

如果分析師對“cervical intraepithelial neoplasia”進行搜尋,那麼,該詞條是這個術語表中的38個同義詞之一。

3.一個接一個地對等價術語詞條與分析師所掌握的大資料資源中的每個記錄進行比對。

4.提取出那些包含與查詢詞及其同義詞相比對的所有記錄條目。

在上面這個案例中,在尋找整個資料記錄中與“cervical intraepithelial neoplasms”相比對的詞條時,對其他37個同義詞也進行了比對查詢。這種搜尋的優點是:在資料記錄中檢索查詢詞時,也可以檢索出其同義詞,這裡沒有預編碼,也不會檢索那些分析師不關心的術語詞條;缺點是:計算速度會因為同義詞過多而變慢。幸運的是,存在簡單且快速的同義詞搜尋方法15。

繼續閱讀