天天看點

《大資料原理:複雜資訊的準備、共享和分析》一一

1.5 術語提取

知道它叫什麼與知道它是什麼,差别很大。

―richard feynman

我最喜歡的電影之一是惡搞版《巴斯克維爾獵犬》,主演有飾演福爾摩斯的peter cooke和飾演他的忠實聖徒華生醫生的dudley moore。一心隻想着自己可笑的追求的福爾摩斯,讓華生到位于達特穆爾的巴斯克維爾家族去進行緊急偵查活動。倒黴的華生站在巨大的巴斯克維爾莊園,不知道如何着手進行調查。猶豫了一下後,他轉身對漠不關心的女仆指令道:“帶我去找線索!”

建立索引很像偵破一起殘忍的犯罪案―你需要知道如何找到線索。同樣,文本中的術語是索引建構的線索。術語不會自己跳進你的索引檔案,你需要找到它們。有幾個可用的方法可實作從語料庫的文本中尋找和提取索引詞18,但沒有一種方法是簡單、快速而且像“stop”方法那樣可擴充的19(見術語表,term extraction algorithm,scalable)。

文本是由單詞、表示具體概念的短語和單詞與短語組合成的一定序列的句子所構成的。

考慮以下内容:“診斷是慢性病毒性肝炎(the diagnosis is chronic viral hepatitis)。”這句話包含兩個非常具體的醫學概念:“診斷”(diagnosis)和“慢性病毒性肝炎”(chronic viral hepatitis),這兩個概念相連接配接,再加上“the”和“is”以及語句分隔符,形成了一句有含義的陳述句。

一個術語可以是由一個或多個生僻詞順序構成并由“is”“and”“with”“the”等常見詞分隔開的句子。

再舉個例子:“硬腦膜外出血會在中間清醒期發生(an epidural hemorrhage can occur after a lucid interval)。”醫學詞彙“硬腦膜外出血”(epidural hemorrhage)和“中間清醒期”(lucid interval)是生僻詞,這句話由常見詞作為分隔符,如“an”“can occur after a”“.”。

如果我們有一個其中都是常見詞的清單,就可以寫一個程式,提取在任意長度文本中找到的所有概念。概念術語包括由生僻詞構成的、不包含常見詞的全部序列。下面是一種術語提取算法。

1.閱讀句子的第一個字。如果它是一個常見的詞,将其删除。如果它是一個生僻字,儲存它。

2.閱讀下一個單詞。如果它是一個常見的詞,則将其删除,并将已儲存單詞置入已在文本中發現的術語清單中。如果它是生僻詞,則将其與第一步儲存的單詞合并為一個術語。如果它是語句分隔符,将儲存的術語置入術語清單,并結束該步驟。

3.重複第2步。

這個簡單的算法或者其他與之相似的算法,是一種建立索引術語集合的快速高效的方法。要使用該算法,你必須準備好或找到适合您的大資料資源的資訊領域常用的單詞清單。從國家醫學引文庫(大約2000萬期刊論文)中提取出的術語常見詞包括:“about、again、all、almost、also、although、always、among、an、and、another、any、are、as、at、be、because、been、before、being、between、both、 but、by、can、could、did、do、does、done、due、during、each、either、enough、 especially、etc、for、found、from、 further、had、has、have、having、here、how、however、i、if、in、into、is、it、its、itself、just、kg、km、made、mainly、make、 may、mg、might、ml、mm、most、mostly、must, nearly、neither、no、nor、obtained、 of、often、on、our、overall、perhaps、pmid、quite、rather、really、regarding、 seem、seen、several、should、show、showed、shown、shows、significantly、since、 so、some、such、than、that、the、their、theirs、them、then、there、therefore、 these、they、this、those、through、thus、to、upon、use、used、using、various、 very、was、we、were、what、when、which、while、with、within、without、would。”

這樣的常見詞清單有時也被稱為“停止單詞清單”或“障礙單詞清單”,因為它限定了提取術語的開始和結束。

請注意,算法對文本逐句進行解析。對計算機來說,這是一個有點笨拙的方法,因為大多數程式設計語言自動從文本檔案逐行切割文本(即,打破文本在換行處終結的規則)。計算機程式無法知道句子在哪裡開始或結束,除非程式員開發能自動發現句子的子程式。

确定句子的開始和結束有很多種政策。最簡單的方法是尋找緊跟小寫字母的句子分隔符,該分隔符出現在先于一個大寫字母的一個或兩個空格字元之前。

舉個例子:“i like pizza. pizza likes me.”這兩個句子之間是序列“a.p”,小寫的“a”後面是句點,句點後面是大寫的“p”。這種常見的模式(小寫字母、句點、一到兩個空格、大寫字母)常常标示句子的間斷。但如果是一行話或段落的最後一句則不适用這個模式,因為沒有空格存在。對于一個句子裡的多個分句,這種模式也會失效,因為在分号後不是跟着大寫字母。另外,也可能錯誤地界定提綱句子,因為提綱裡的句号後緊跟的是小寫字母,表示新的主題。盡管存在這樣那樣的不完美,程式員還是可以對特殊句型進行規則調整形成子程式,實作對非結構化文本的逐句分解。

一旦有了提取術語的方法,建立一個術語關聯位置的真實索引就跟兒戲似的了。基本上就是,按前面提到的方法每收集一個術語,就将這個術語附加到被發現的位置即可。通常,這可以通過建立一個關聯數組實作,即哈希數組或基于程式語言的字典。如果在大資料資源的後續位置遇到已出現的術語,則隻需将這些位置資訊簡單地添加到該術語位置清單中即可。在整個大資料資源完全被你編寫的索引程式解析後,将會得到一個包含兩個條目的關聯數組,這兩個條目分别是術語名稱和該術語在大資料資源中出現的位置清單。把這個關聯數組以檔案形式展現時,就得到索引了!但這還沒有全部完成。

利用上述方法可以為任意文本語料庫建立索引。然而,在大多數情況下,資料管理者和資料分析人員總認為結果差強人意,因為索引中包含太多他們不感興趣的術語。索引中的術語會按字母順序排列,但在大資料資源中的字母概念表示并不與術語相關。

如果找到一本索引設計水準較高的書,你會發現索引設計者煞費苦心地将關聯術語放在一個副主題下,當然在某些情況下,同一個副主題中的術語會被分到多個副主題中,索引中的個别術語也會被連結到相關術語上(交叉索引)。

無論是由人工建立還是計算機生成,好的索引必須要服務于資料分析所需的資料管理工作。而建立索引的程式員也應當充分運用其創造力、洞察力和審美能力。這裡給出一小部分建立索引時需要關注的問題。

1.索引應該根據特定的知識領域來建立嗎?你也許需要建立一個人名索引、地理位置索引或者交易類型索引,是否需要按知識領域來建立索引,取決于大資料資源的預期用途。

2.索引應該根據特定的術語表來建立嗎?如果一個編譯好的術語表中的術語與近義詞共享代碼,也許有助于索引的建立。

3.索引應該在分類的基礎上建立嗎?例如,一個為生物學家準備的索引也許聚焦在生物體的分類上。基因資料已經能夠被基因本體索引,同時也是生物研究的工具20。

4.在沒有分類的情況下,索引應該包含術語的近義詞嗎?會得到新發現的術語關聯分析有時候會在收集索引術語間的不同時進行,并且會帶來一些有用的資訊21,22。那些距離接近的術語很有可能有某種對應關系。例如,如果“苯胺染料工業”(aniline dye industry)與看似無關的術語“膀胱癌”(bladder cancer)同時出現,你可能會懷疑是否是“苯胺染料工業”誘發了“膀胱癌”。

5.是否應該建立多個索引?專業的索引可能會為不同的資料分析師而建立,他們往往有多種研究任務。

6.是否應該将索引合并到其他索引中?合并索引比合并大資料資源簡單多了,這裡有必要提醒大家,大資料的最大價值在于尋找不同資料集合之間的關聯關系。

繼續閱讀