天天看點

《Python自然語言處理》——1.4 回到Python:決策與控制

本節書摘來自異步社群《python自然語言處理》一書中的第1章,第1.4節,作者[美]steven bird,ewan klein,edward loper, 陳濤,張旭,崔楊,劉海平 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

到目前為止,小程式有了一些有趣的特征:處理語言的能力和通過自動化節省人力的潛力。程式設計的一個關鍵特征是讓機器能按照我們的意願決策,在遇到特定條件時執行特定指令,或者對文本資料從頭到尾不斷循環直到條件滿足。這一特征被稱為控制,這是本節的重點。

條件

python廣泛支援多種運算符,如:<和> =,可以測試值之間的關系。全部的關系運算符見表1-3。

《Python自然語言處理》——1.4 回到Python:決策與控制

可以使用這些從新聞文本句子中選出不同的詞。下面是一些例子——注意行與行之間隻是運算符不同。它們都使用sent7,第一句話來自text7(華爾街日報)。像以前一樣,如果得到錯誤結果,sent7沒有定義,需要首先輸入:from nltk.book import *。

所有這些例子都有一個共同的模式:[w for w in text if condition],其中condition是一個python“測試”,得到真(true)或者假(false)。在前面的代碼例子中,條件始終是數值比較。然而,也可以使用表1-4中列出的函數測試詞彙的各種屬性。

《Python自然語言處理》——1.4 回到Python:決策與控制

下面是一些從文本中選擇詞彙運算符的例子:以-ableness結尾的詞,包含gnt的詞,首字母大寫的詞,完全由數字組成的詞。

還可以建立更複雜的條件。如果c是一個條件,那麼not c也是一個條件。如果有兩個條件c1和c2,那麼還可以使用合取和析取将它們合并形成一個新的條件:c1 and c2,c1 or c2。

對每個元素進行操作

在1.3節中,列舉了計數詞彙以外的其他項目的一些例子。讓我們仔細看看之前所使用的符号。

表達式形式為[f(w) for ...]或[w.f() for ...],其中f是一個函數,用來計算詞長或将字母轉換為大寫。現階段還不需要了解兩種表示方法f(w)與w.f()之間的差異,而隻需學習python習慣用法(idiom),即對連結清單上的所有元素執行相同的操作。在前面的例子中,周遊text1中的每一個詞,依次地指派給變量w并在變量上執行指定的操作。

回到計數詞彙的問題上,這裡使用相同的習慣用法。

由于不重複計算像this和this這樣僅僅大小寫不同的詞,就這樣從詞彙表計數中抹去了2000個!更進一步,還可以通過過濾掉所有非字母元素,從詞彙表中消除數字和标點符号。

這個例子稍微有些複雜:将所有純字母組成的詞小寫。也許隻計數小寫的詞會更簡單一些,但這卻是一個錯誤的答案(為什麼?)。

如果你對連結清單推導不是很有信心,請不要擔心,因為在下面的章節中你會學習到更多的例子及解釋。

嵌套代碼塊

大多數程式設計語言允許我們在條件表達式或者說if語句條件滿足時執行代碼塊。例如[w for w in sent7 if len(w) < 4]這樣的條件測試的例子。在下面的程式中,我們建立了一個叫word的變量包含字元串值“cat”。在if語句中檢查len(word)< 5是否為真。cat的長度确實小于5,是以if語句下的代碼塊被調用,print語句被執行,向使用者顯示一條消息。别忘了要縮進,在print語句前輸入4個空格。

使用python解釋器時,必須添加一個額外的空白行1,這樣它才能檢測到嵌套塊結束。

如果改變測試條件為len(word) >= 5,檢查詞的長度是否大于或等于5,那麼測試将不再為真。此時,if語句後面的代碼段将不會被執行,沒有消息顯示給使用者。

if語句被看作是控制結構,因為它控制縮進塊中的代碼是否運作。另一個控制結構是for循環。嘗試下面的代碼,請記住輸入冒号和4個空格。

這叫做循環,因為python以循環的方式執行裡面的代碼。它從word='call'指派開始,有效地使用變量word命名連結清單的第一個元素。然後,顯示word的值給使用者。接下來回到for語句,執行word = 'me'指派,然後把這個新值顯示給使用者,以此類推。它以這種方式不斷運作,直到連結清單中所有項都被處理完。

條件循環

現在,可以将if語句和for語句結合。循環連結清單中的每一項,隻輸出結尾字母是l的詞。我們将為變量挑選另一個名字以表明python并不在意變量名的意義。

你會發現在if和for語句所在行末尾——縮進開始之前——有一個冒号。事實上,所有的python控制結構都以冒号結尾。冒号表示目前語句與後面的縮進塊有關聯。

也可以指定當if語句的條件不滿足時采取的行動。在這裡,我們看到elif(else if)語句和else語句。請注意,這些語句在縮進代碼前也有冒号。

正如你看到的,隻具備少量的python知識,就可以建構多行的python程式。分塊開發程式,在整合之前測試每一塊代碼是否達到你的預期是很重要的。這也是python互動式解釋器的價值所在,也是為什麼你必須适應它。

最後,讓我們把一直在探索的習慣用法組合起來。首先,建立一個包含cie或者cei詞彙的連結清單,然後循環輸出其中的每一項。請注意print語句結尾處的逗号,以便使結果在同一行輸出。