《Using OpenRefine》翻譯~9

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


4-應用一個文本過濾

本點中,我們將學習如何使用文本過濾來尋找符合某個條件的值。

當你想尋找那些匹配某個特定字符串的行時,最簡單的方法是使用文本過濾功能。讓我們以一個簡單的例子開始。假如你想找出Object Title列中所有和美國相關的所有標題。選擇Object Title| Text flter,我們將在左側看到一個對話框,就在上節中透視對話框相同的位置。現在輸入USA。OpenRefne 提示匹配到1,866行,勾選case sensitive (區別大小寫),那麼比如karakusa和Jerusalem之類的就會被排除,這樣我們降低到1,737行。

另外,我們並不能確保這些匹配項裏面是否都正確,比如大寫的字符JERUSALEM,爲了解決這個問題,我們可以試着在USA前後加上空格,但是還是有可能丟失類似以[USA] 和 /USA開頭或結尾的內容。以“  USA  ”(前後有空格)作爲過濾項只會返回172個匹配,只佔全部能取到量的1/10左右,大部分都沒有取到。

另外,這樣簡單的文本過濾並沒有考慮到拼寫方式,比如遺漏了U.S.A. (201 個匹配), U S A (29個匹配)或 U.S.A (22個匹配)。很快你就會發現處理這些問題會讓人煩不勝煩,而且你還需要每次都標星以最後將它們組合起來。

這時候就需要用到正則表達式了,正則表達式十分強大,但是需要你對這些表達式中的奇怪符號有基本的認識,這樣才能發揮其功效。比如,表達式\bU.?S.?A\b(文本過濾時需要勾選regular expression)將匹配上面所有需要包括的內容,並且把干擾項排除,最後將返回1,978項匹配。

本小點不會教你如何使用正則表達式,可以參考附錄:正則表達式和GREL

文本過濾的另一個應用是檢測分隔符的使用,在Categories列種,管道符”|”被用來分隔目錄,讓我們對Categories列應用一個文本過濾,過濾符爲“|”,OpenRefine顯示匹配到了71105行,這說明大部分內容裏面含有至少兩個目錄(因爲單個目錄不需要管道符分隔)。

現在再增加一個管道符:||,檢測到9個問題行,其包含雙管道符,而不是一個。在第三章:高級數據操作中,我們將介紹如何使用GREL來改正這個錯誤。另一個問題是單元格內容以管道符開始或者結尾,解決這個問題也需要藉助於正則表達式。所以我們均將在附錄:正則表達式和GREL中探討。

 

 

5-使用簡單單元格轉換

本點中,我們將學習如何利用OpenRefine內建的轉換功能來修改數據子集。

我們已經學習了透視和過濾,已經基本能夠做到按照不同要求進行數據的顯示,只不過我們並沒有對數據進行過改變。現在到了修改它們的時候了,我們將學習強大的Edit cells菜單。在我們檢測數字重複值的時候我們已經用到過了Blank down菜單。另外的轉換功能比如分割合併單元格、聚類、計算值相對來說較複雜,所以我們將在下一章學習。其他的轉換功能比較簡單,所以我們將先學習Common transforms子菜單下的功能,如下圖所示:

Trimming whitespace(刪除首尾空格),對數據進行刪除多餘首尾空格操作是提升數據質量的很好的開始。這保證了不會因爲首尾處的空格使得相同的值爲誤認爲不同。這些空格導致的值不同肉眼是很難發現的,進行這步可以讓你的數據更加整潔。當然該操作也可以減少不需要的字符從而壓縮數據集大小。雖然單獨一個空格影響不大,但是幾千個空格就有差別了,並且可能會導致大的錯誤。還記得上節中因爲一個空格就導致空值被識別成了non-numeric非數字類型。

唯一標識符也不應該有空格;讓我們對Registration Number列作下檢查:Registration Number | Edit cells| Common transforms| Trim leading and trailing whitespace,我們發現有2,349個單元格被處理,這也就意味着這個操作是必要的。但是記住我們不能對Record ID列進行操作,因爲刪除首尾空格的操作只能針對字符串,而不能對整數操作。如果你去試試,也會發現所有整數會被刪除。

Consecutive whitespace(連續的空格)的產生一般是因爲輸入時太快導致。我們可能會預見到object titles 或者descriptions這類有很多文本內容的列一定會有這個問題。但是奇怪的是,操作後並沒有發現。倒是對Production Date列進行Collapse consecutive whitespace(連續空格只保留一個)操作,發現有7671個值被處理,但其實這大部分只不過是將整數轉化成了字符串。對其他的列也試試看,這個操作很安全,而且證明總是對數據清洗有益的。

如果你的數據是從互聯網應用中獲取來的,那麼內容中很可能包含HTML代碼,在HTML代碼中,字符被解析成HTML實體。比如法語字符é會被編碼成é;或者é 這取決於使用什麼範例表示方法。

因爲瀏覽器在解析的時候經常會碰到編碼問題。如果解析不對的話會變得難以辨認(比如é就可能被解析成é)。所以,如果你碰到一些值是以&開始並且以;結束的話,試着使用菜單項功能:Edit cells | Common transforms| Unescape HTML entities,這樣內容就能夠被正確解析。

下一個轉換功能是case transformations(大小寫轉換),通過這個功能,我們能夠將文本字符串轉換成全部小寫、全部大寫或者首字母大寫。舉個例子,我們發現registration numbers列沒有小寫,但是對其進行操作:Registration Number|Edit cells |Common transforms |To uppercase.卻發現有2,349個單元格值有變化,一般來說,這應該意味着有很多大小寫問題,但其實卻並沒有。這些值的變化主要是因爲整數被轉換成了字符串(因爲數字被認爲沒有被大寫)。你可以試着對registration numbers列先做一次數字透視,然後進行大小寫轉換來看看這些數字的變化,程序提示你沒有數字,也就是說這次大小寫轉換將數字轉成了字符串。

同樣的,我們也可以用To lowercase來驗證persistent link URL列種沒有大寫字母,或者用To titlecase 來規範categories列的拼寫、統一Didactic Displays 和Didactic displays的書寫。To titlecase只會將空格後的字符串首字母大寫,所以Spacecraft|Models|Space Technology會變成Spacecraft|models|space Technology,有些時候我們並不想這麼做,但是別擔心,因爲第三章:高級數據操作中我們將介紹一個更好的處理這種情況的方法clustering聚類。

2:數據透視中,我們碰到過一種數據轉換方式。事實上,你可能記得,就是將應該是時間類型的數據轉換成日期格式(OpenRefine日期格式:yyyy-mm-ddThh:mm:ss),因爲進行時間軸透視必須要求是日期格式。還有就是將值轉換成文本或者數值。比如我們爲了去重可以把record ID列轉換成文本,但是在我們對其進行排序或者數字透視時就需要將值轉換爲數字,不然排序就會出現10排在2前的錯誤。

預定義轉換方式的最後一個Blank out cells就有點簡單粗暴了,它將刪除該列所有的內容。當然最好只對數據子集使用。一個科學的方法是先將有問題的值標上旗幟標識,然後使用All| Facet| Facet by flag分離出來,最後使用Blank out cells刪除。

我們已經介紹完了常用的轉換方式,但是請注意這些只是轉換功能的冰山一角,轉換的方法不可計數,這你會在第三章:高級數據操作附錄:正則表達式和GREL體會到。打開菜單Edit cells | Transform...就會打開Custom text transform 窗口,你可以在這裏使用GREL自定義轉換,你可能會覺得太難太複雜,但是學好以後你會覺得值得這麼去做。

 

 

6-刪除匹配行

在本點中,我們將學習如何處理問題行(前面通過透視和過濾發現的)。

檢測重複或者將冗餘行標上旗幟標識是需要的,但還不夠。某些時候,你可能需要從單純的數據分析轉到數據清洗中來。在實際情況中,這意味着那些有問題的行需要從數據集中刪除,因爲它們的存在是對數據質量的損害。

在刪除行前,請確保你已經做過了一個透視或者過濾,不然你可能會誤將所有數據刪除。讓我們從項目數據集的最初狀態開始(重新導入或者在Undo / Redo頁中選擇0. Create project以恢復默認),另外,請確保OpenRefine是以行rows顯示而不是以記錄records顯示。

我們將首先刪除RECORD ID中沒有內容的行。首先對Record ID列進行操作:Record ID|Facet |Numeric facet ,在左側彈出面板中去掉Numeric 勾選,這樣我們就只剩下Non-numeric數據,這裏我們有3條。記住這裏如果使用Facet by blank操作並不會起作用,因爲這些行其實並不是空白,而是包含了一個空格。現在使用All| Edit rows| Remove all matching rows刪除這個行。

很好,這樣我們已經將數據集減少了3行,non-numeric類型的RECORD ID數據被刪除了(透視圖也刷新了),數據質量也提高了一點。現在清除透視後我們發現數據行數量下降到了75,811行。

下一步,我們將處理數據集中registration number列有問題的行。該列沒有空格(你可以對Registration Number列應用一個簡單的文本過濾,輸入一個空格字符,我們發現沒有匹配行)。所以我們對該列進行空值透視:Registration Number| Facet| Customized facets| Facet by blank。選擇爲true的值,得到115條匹配行。這些就是空行,我們可以用Remove all matching rows刪除。

就像你看到的那樣,刪除空值行十分簡單;現在我們將處理重複行。重複行就稍顯麻煩點,但我們還是需要刪除它們的,可能你需要回顧下3:檢測重複項,對Registration Number列執行:Registration Number| Facet| Customized facets| Duplicates facet。選擇true得到163行匹配行。問題是,如果你直接刪除這些行,那麼不光重複項會被刪除,那個唯一的值同時也會被刪除。換句話說,如果某行出現了兩次,那麼刪除匹配行就會把兩條都刪除而不是僅僅刪除一條。不過即使你誤刪除了,你也可以通過項目歷史恢復。

所以我們需要做到既去除多餘重複項,同時還能夠保留一項。我們可以這麼做:對Registration Number進行排序,選擇texta-z選項case sensitive不必勾選,因爲該列只有大寫),然後選擇Sort| Reorder rows permanently來固定排序。最後,使用Registration Number | Edit cells| Blank down將多餘的重複項使用空白填充。最後有84個單元格被修改。

如果你的重複項透視界面還打開着,那麼你會注意到重複項刷新爲84行。這是因爲去重後的值(163條中的一部分)被摘出了,這時候它們已經不再是重複項了,所以在重複項透視中被識別爲false。而真正的重複項則被填充成了空白,它們具有同一個值:空值。這就是出現84項重複的原因。現在你可以將這些項刪除,並且能夠保留下原值。

正常情況下,你現在將還有75,612行數據。我們還可以進一步處理,但是你可能已經知道如何去做了,這些就留給你們去實驗。最後看下Undo / Redo頁中項目歷史究竟我們做了哪幾步。

我們首先刪除了3行,然後刪除了115行看上去record ID爲空的行。爲了刪除84行重複項,我們對Registration Number列進行了排序,固話排序後我們用空值進行了填充。我們總共刪除了202行,我們的數據集更加乾淨了。你可能注意到了:文本透視和排序操作並沒有出現在歷史操作中,這是因爲這些操作並沒有改變數據,而是僅僅是爲刪除做的一些準備工作。

 

 

小結

在本章中,我們學習瞭如何使用OpenRefine來分析和修復數據的基本操作,這是數據分析和清理的最基本技能。

分析數據包括排序和各類透視功能,還包括文本過濾和檢重。

修復數據步驟則包括排序、單元格轉換、刪除。

下一章中,我們將學習OpenRefine更深層次的內容,我們將學習高級數據操作。


未完待續......


發佈了15 篇原創文章 · 獲贊 16 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章