《Using OpenRefine》翻譯~19(完結)

上一篇:《Using OpenRefine》翻譯~18


GREL 

正則表達式的強大功能並不限於數據查找,還可以用作數據管理。GREL提供了利用正則表達式完成函數操作的可能。GREL是用來操作數據的簡單函數語言。其是OpenRefne內置的,並且包含函數參數設置。前幾章我們已經簡要的接觸過了,這裏我們將教你如何構建你自己的GREL表達式。  

 

 

數據轉換

在你需要對數據進行轉換的時候就需要用到GREL。你可以直接對數據進行修改(通過點擊相應列菜單:Edit cells | Transform… )或者創建基於某列的新列數據(通過點擊相應列菜單:Edit column | Add column based on this column… )。我們將對Object Title 列進行操作演示。

當你打開轉換對話框後,你會發現默認有一個GREL表達式叫做value,其作用就是返回源值。這當然並沒有多大用處,但是我們可以以此爲基礎進行擴展。舉個例子,GREL表達式"TITLE: " + value + "." 在源值的前面增加了文本TITLE:,在最後增加了一個點。但是注意這裏的文本必須括在雙引號或者單引號內,不然的話OpenRefne會理解錯誤。在你輸入完成後你就會發現預覽窗口顯示了數據更新。

更有用的功能是改變文本。舉個例子,我們可以用value.replace("stone", "stones") 將字符串stone替換爲 stones。這裏我們通過在value後加小點來調用replace函數。我們這樣就是告訴了OpenRefne將所有值的stone的替換爲stones。

對於上面,如果我們組合上正則表達式,那麼將更加強大。你可以看到,有一些單元格值是以數字開頭的。我們可以用value.replace(/^\d+ /, "")將這些數字刪除。這裏正則表達式被正斜槓“/”包含,要替換成的值用雙引號包含。

我們還可以使用組符來增強功能。其不光可以將多個字符標識爲一個單元,還可以後續使用這個單元以做更多用處。這樣的話,我們就可以將開頭的數字替換成更加容易理解的內容。舉個例子:我們需要將234 替換成 Object 234: ,我們就可以使用如下表達式:value.replace(/^(\d+) /, "Object $1: ") 。你是用美元符號跟一個數字來定義組,第一組叫做$1,另外$0代表整個表達式的結果。

表達式可以完成任意功能,只不過取決於表達式的複雜程度。比較難的例子是我們曾經對Categories 列中的多值內容分析時,有些包含空值。舉個例子,"|Stones||Bones|||Buildings" 實際上只包含三個值,但是如果你針對管道符進行拆分時,你會得到七個值(包括四個空值),這是因爲這裏有六個管道符。我們可以剔除這些多餘管道符。值開始的管道符必須刪除,所以我們可以先用value.replace(/^\|/, "")。這看上去有些複雜,因爲這裏的管道符必須使用反斜槓,以防止被認爲是正則表達式中的特殊字符。將連續出現的多個管道符改爲一個,我們可以使用value.replace(/\|+/, "|") 。記得在正則表達式中管道符需要使用反斜槓,而替換字符串位置不需要,因爲替換字符串位置不可能存在特殊的意義。

OpenRefne除了replace函數外還有大量其他函數,你可以在表達式編輯窗口中點擊Help 頁查看,或者也可以訪問https://github.com/OpenRefine/

OpenRefine/wiki/GREL-Functions。比如split函數,我們對Categories 列使用value.split("|").length() ,可以計算每個單元格中有多少不同的值。這裏,我們首先讓OpenRefne按照管道符“|”進行分割,然後使用length函數計算分割後的值數量。你甚至可以創建更加複雜的表達式:value.split("|").uniques().join("|")。這個表達式可以一次解決我們在第三章:高級數據操作 介紹過的移除重複值的所有操作。 

    

 

 

創建自定義透視功能

現在該到介紹一些曾經略過未說的內容了:每次你創建一個透視,你實際上是執行了一個GREL表達式。比如,讓我們點擊Object Title 列下拉菜單:Facet | Customized Facets | Facet by blank. 。然後在出現的透視窗口右側頂部中點擊change 鏈接, OpenRefne就會顯示隱藏的表達式窗口,這裏你就可以自定義透視表達式,如下圖所示:


我們看到空值透視的表達式是isBlank(value) 。實際上,如果值爲空值的話,isBlank函數會返回true,如果非空,則返回false。我們可以做下修改。比如,我們想知道是否標題是以數字1開頭的,那麼這個表達式子就可以是value.startsWith("1") ,這樣我們就能夠得到一個透視,如果內容以1開頭則返回true,反之返回false(出現(error)表示是值爲空)

這是一個學習GREL的好機會。因爲每一個透視其實都創建了一個GREL表達式,你可以學習其底層的工作方式。比如Duplicates 透視就會教你學習facetCount 函數。如果你有疑問,記得所有的表達式都可以重新編輯,你也可以通過Help頁學習具體函數的用法。

如果你想創建自己的透視,完全不需要從已存在的透視再修改的方式進行。比如,如果你想對categories 列中分類數量進行透視,你可以點擊Categories 列下拉菜單:Facet, Custom text facet…. 輸入表達式value.split("|").length() 然後點擊 OK.你會發現左側出現了一個 Categories 透視窗口,你可以在此選擇分類數量。這裏你發現表達式輸出的都是數字,所以你可能想做一次數字透視來替代,那麼只需要選擇菜單:Facet | Custom numeric facet… 這樣你就可以按照數字方式進行透視了。自定義透視是探索數據細節的好方法,並且不怕數據會被誤操作。

 

GREL排障

最後,如果你的表達式未能夠滿足你的要求該怎麼辦呢?比如,我們在第2章:分析和修改數據中,對Registration Number列應用重複透視的時候效果良好,但是對Record ID列就不怎麼樣,讓我們修復這個問題。點擊Record ID 列下拉菜單:Facets | Customized facets | Duplicates 。 

請確保數據爲未經過清理的源數據,否則重複項如果已經去除就無法繼續操作了。

就像你預料的那樣,OpenRefne 沒有檢測出重複項。所以讓我們修改表達式,點擊Change 鏈接,我們發現表達式如下:

facetCount(value, 'value', 'Record ID') > 1

產生這個問題的原因是value值這裏是數字,而facetCount 函數只對字符串有效。解決的辦法是將value 轉換成字符串,如下:

facetCount(value.toString(), 'value', 'Record ID') > 1 

這樣就能夠檢測出重複項了。

你可能會有疑問:我怎麼樣才能找到這種解決辦法呢?方法就是不斷的練習和嘗試。你使用OpenRefne 分析、清洗、鏈接了越多的數據集,你就會越加有處理感覺。另外,你也會獲得越多的正則表達式和GREL知識,進而成長爲一個專家。從此以後,你就可以一步步處理更復雜的數據集。本書就爲你指明瞭方向,現在就看你的了。



【完結】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章