天天看點

《Python自然語言處理》——1.2 近觀Python:将文本當做詞連結清單

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

大家已經學習過python程式設計語言的一些重要元素。下面進行簡單的系統複習。

連結清單

文本是什麼?一方面,它是一頁紙上的符号序列,就像這頁紙一樣。另一方面,它是章節的序列,每一章由小節序列組成,這些小節由段落序列組成,以此類推。然而,對于我們而言,認為文本不外乎是單詞和标點符号的序列。下面是如何展示python中《白鲸記》的開篇句。

在提示符後面,輸入自己命名的sent1,後跟一個等号,然後是一些引用的詞彙,中間以逗号分割并用括号包圍。方括号裡的内容在python中叫做連結清單,是存儲文本的方式。可以通過輸入名字1來查閱文本。同樣可以查詢文本的長度2,甚至可以在自己的函數lexical_diversity()中使用3。

定義一些連結清單,将每個文本開始的句子定義為sent2…sent9。下面隻檢查其中的兩個。你可以在python解釋器中檢視其餘的(如果得到的是一個錯誤表達:sent2沒有定義,你需要先輸入from nltk.book import *)。

令人驚喜的是,可以對連結清單使用python加法運算。兩個連結清單相加①能夠創造出一個新的連結清單,包括第一個連結清單的全部,并附着第二個連結清單的全部。

不必逐字地輸傳入連結表,可以使用簡短的名字來引用預先定義好的連結清單。

如果想要在連結清單中增加一個單獨的元素該如何做?這種操作叫做追加。當對一個連結清單使用append()時,連結清單自身會随着操作而更新。

索引清單

正如已經看到的,python中的文本是一個詞彙的連結清單,用括号和引号來表示。就像處理一頁普通的文本,我們可以使用len(text1)來計算text1的全部詞數,使用text1.count('heaven')來計算一個文本中特定詞出現的次數,如heaven。

稍微耐心些,我們可以挑選出一篇文本中的第1個、第173個甚至第14278個詞。類似的,也可以通過在連結清單中出現的次序找出python連結清單的元素。表示這個位置的數字叫做這個元素的索引。在文本名稱後面的方括号裡寫下索引,python就會顯示出文本中這個索引處——例如文本中第173個詞。

也可以反過來做;找出一個詞第一次出現時的索引。

索引是一種常見的用來擷取文本中詞彙的方式,或者,更通俗地講,任何清單中的元素。通過python也可以擷取子連結清單,從大文本中任意抽取語言片段,術語叫做切片。

索引還有一些微妙之處,我們将在下面的句子中體會這些。

需要注意的是,索引從零開始:第0個元素寫作sent[0],其實是第1個詞“word1”;而句子的第9個元素是“word10”。原因很簡單:python從計算機記憶體中的連結清單擷取内容的時候,需要告訴它向前多少個元素。是以,向前0個元素使它留在第一個元素上。

現在,如果我們不小心使用的索引量過大就會産生錯誤。

這不是文法錯誤,因為程式片段在文法上是正确的。相反,它是一個運作時錯誤,它會産生一個回溯消息顯示錯誤的上下文,并标注錯誤的名稱:indexerror,以及簡要的解釋說明。

再次使用構造的句子仔細看看切片,這裡我們發現切片5:8包含索引5、6和7的句子元素。

按照慣例,m:n表示元素m…n-1。正如下一個例子所示,如果切片從連結清單第一個元素開始,可以省略第一個數字1;如果切片到連結清單最後一個元素處結尾,則可以省略第二個數字2:

可以通過改變它的索引值來修改連結清單中的元素。在接下來的例子中,把sent[0]放在等号左側1。也可以用新内容替換掉整個片段2。最後一個報錯的原因是這個連結清單隻有4個元素而要擷取4後面的元素,是以産生了錯誤3。

變量

從1.1節開始,已經檢視過名為text1,text2等的文本。像這樣通過隻輸入簡短的名字來就能引用一本250000字的書的做法節省了很多打字時間。一般情況下,可以對任意的計算命名。在前面的小節中已經這樣做了,如下所示,定義一個變量sent1。

語句形式是:變量 = 表達式。python通過計算右邊的表達式把結果儲存在變量中。這個過程被稱為指派。它并不産生任何輸出,但隻能在新的一行輸入變量的名字才能夠檢查它的内容。等号可能會有些誤解,因為資訊是從右邊流到左邊的。你把它想象成一個左箭頭可能會有幫助。變量的名字可以是任何你喜歡的名字,如:my_sent、sentence、xyzzy等。變量必須以字母開頭,可以包含數字和下劃線。下面是變量和指派的一些例子。

請記住,排序表中大寫字母出現在小寫字母之前。

最好是選擇有意義的變量名,它能提醒你代碼的含義,也能幫助别人讀懂你的python代碼。python并不了解這些名稱的意義。它隻是盲目地服從你的指令,如果你輸入一些令人困惑的代碼,例如:one = 'two'或者two = 3,它也不會反對。唯一的限制是變量名不能是python的保留字,如def、if、not或import。如果你使用了保留字,python會産生文法錯誤。

我們經常使用變量來儲存計算的中間步驟,尤其是在這樣做能夠使代碼更容易被讀懂時。是以,len(set(text1))也可以寫作如下形式。

字元串

一些用來通路連結清單元素的方法也可以用在單獨的詞或字元串上。例如可以把一個字元串指定給一個變量1,索引一個字元串2,劃分一個字元串3。

還可以對字元串執行乘法和加法。

可以把詞用連結清單連接配接起來組成單個字元串,或者把字元串分割成一個連結清單,如下面所示。