我們之前有提到一些蠻有用的內建函式,這裡要再跟大家介紹一些很有用的內建函式,順便來練習一下之前提到的 Lambda Function。這一系列教大家的 Function 主要都會傳入一個可迭代(iterable)的物件。

sorted()

顧名思義,sorted 就是拿來做順序排列用的啦~基本上 input 會是一個 iterable 的 object。我們在做文字標記的時候很常需要從一個文集(corpus)裡面將整個文件字串斷詞、不重複、並且有排序。下列範例程式基本上就稍微模擬了這個狀況~

corpus = 'this is a list. this list have some strings. these strings have punctuations!!!'.split()
# split() 是 string 裡的一個方法(method),他會將一個字串裡對空格(或是 input 的字元)做斷詞
print(corpus)
# Output: ['this', 'is', 'a', 'list.', 'this', 'list', 'have', 'some', 'strings.', 'these', 'strings', 'have', 'punctuations!!!']
sort = sorted(set(l))   # set 是一個沒無排序、無索引、無重複的資料的容器,
print(sort)             # 當我們再把它丟入一個 sorted() 函式裡面,他就會變回 list。
# Output: ['a', 'have', 'is', 'list', 'list.', 'punctuations!!!', 'some', 'strings', 'strings.', 'these', 'this']

map()

顧名思義,他就是一個地圖。不是!!!他基本上是拿來對容器做 mapping(白話文就是對容器裡面的每個物件做運算)。如果有注意剛才的最後印出來的 list 我們會發現到其實有一些字因為沒有去掉標點符號而重複了。在這裡我們就對剛才排序過的 list 做一次去除標點符號的動作,再丟到 set() 裡面就會發現有標點符號的字都不見了~

no_punc = set(map(lambda x: x.strip('!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~'), sort))
print(no_punc)
# Output: {'is', 'punctuations', 'list', 'a', 'strings', 'some', 'have', 'this', 'these'}
# 這段程式碼相等於
# for word in list:
#   word.strip('!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~')
#   new_list.append(word)
# print(new_list)

這裡值得注意的一件事情是,map() 完了之後輸出的是一個 iterable object,因此需要用 list() 來轉換形態。下面 filter() 也是一樣哦~

filter()

顧名思義,他就是一個過濾器。他會針對你所輸入的判斷式,對所輸入的容器做判斷,並輸出一個 filtered object。它基本上,是一個判斷式版本的 map() 。這裡我們現在就來找出字串裡比較長的字。

long_words = list(filter(lambda x: len(x) > 4, no_punc))
print(long_words)
# Output: ['punctuations', 'strings', 'these']
# 這段程式碼相等於
# for word in list:
#   if len(word) > 4
#   new_list.append(word)
# print(new_list)

enumerate()

現在我們把文件裡的字處理完了,最後我們可以將所有的字串做 enumerate()。Enumerate 基本上就是對於一個 iterable object 裡面的物件做 indexing。這樣我們基本上完成了對文件做 word tokenization 的工作啦~

print(dict(enumerate(sorted(no_punc))))
# Output: {0: 'a', 1: 'have', 2: 'is', 3: 'list', 4: 'punctuations', 5: 'some', 6: 'strings', 7: 'these', 8: 'this'}

Leave a Reply

Your email address will not be published. Required fields are marked *