上午有位學生來請教我,請我分享心得。他說:「我的老師要我用Spark (in-memory map-reduce)做text mining,我懂NLTK和Spark,但是我不知道要怎麼做下去,我想是我的研究方法有問題,請問有什麼訣竅嗎?」
我說,我不知道NLTK是什麼,對Spark只略懂皮毛,狀況比你還糟糕,但既然你來問我,我就試著回答你。
我打開瀏覽器,搜尋NLTK,結果第一個看到的就是NLTK的官方網頁(http://nltk.org/)。「喔,原來是Natural Language Toolkit的縮寫。嘿,是用Python寫的,應該很不容易平行化吧?」花了約20秒鐘,很快地瀏覽過這一頁。
接下來,我一邊說:「你既然需要用Spark,想必是要做平行或分散式處理。」 一邊輸入搜尋關鍵字:"NLTK parallel"。打開出現的第一個網頁 。
我說:「你看看,這裡有位好心人,寫了一本叫做 Python Text Processing with NLTK 2.0 Cookbook的書,是open source的,其中有一章講 Using Execnet for Parallel and Distributed Processing with NLTK,你看過嗎?」
學生沒說話。
我說:「既然是Cookbook,那表示NLTK應該很好用,可以用來做好菜,而且這位作者應該也很有實戰經驗,才寫得出食譜教人做菜,不妨看看...」
於是我花了20秒下載這本將近250頁的書,花20秒鐘看一下目錄,然後翻到第八章「Distributed Processing and Handling Large Datasets」。「喔,原來有個叫做execnet的程式庫,可以支援Python做分散式處理... 這裡有一個一個範例引導我們用execnet把一些自然語言處理會用到的沈重運算工作分散到其他機器上去做,講得很清楚。」
轉頭跟在場另一位學生,我的碩士生,說:「這個跟你們常用的node.js很像吧?你們可以一起合作看看。」
「要做跨領域的研究不容易,除了要懂各領域之外,真正的重點是把領域串連起來,這個部分你很難在學校學到。因為大部分老師在上某堂課時,光是把該領域的東西教好、教完整,就不容易了,要把領域串連起來,往往需要靠別的方法:找業界專家、上討論版、做專題研究。」
「你先搞清楚專家們如何將 NLTK用於分散式處理,至少跨出了第一步。」
「至於Spark,因為他太新了,不見得有直接的參考資料,我們先查一下 "NLTK Hadoop" 好了。」
才按了幾下,我們就找到了一篇 "Natural Language Processing with Apache Hadoop and Python"的論壇討論。「啊,原來三年前就有人在研究這個了,先看看這些人在討論些什麼,有沒有做出什麼,再看看有沒有辦法用上Spark去加速他。這點就是你接下去的作業了,不用我繼續幫你吧 :)」
然後,我給了一點點建議:
1. 寫碩士論文的目的之一,是為了證明你真正懂一個專業,你必須做出一個用這個專業已知的知識所堆疊成的有相當難度的作品。這跟考試不一樣,不是去解一些人家解過的、答案已知的問題。如果你論文裡面都是人家講過的東西,誰知道你是不是抄來的?所以光懂知識還不夠,必須能夠能夠證明你會用它。
2. 跨領域的研究,越來越重要,但最難的部份,往往在於這些打通領域所需的東西。其實要打通領域也不難,只是說這種工作所需要的學習,並非單一課程所能夠教授的。但是放眼看業界,這類的計畫比比皆是,所以不要小看業界做的東西,覺得人家的東西沒有深度,等到你自己來做就知道了。
3. 自己學東西,有很難嗎?我這個不懂NLP的人,花不到幾分鐘,就找到一些可能對你研究有所貢獻的參考資料。善用Internet,平時多看跨領域的研究資料,參與社群和論壇,對跨領域的研究有很大的幫助。
4. 找一個有意義的問題,把它研究透徹,就我看來,就是很好的論文。你如果能用NLTK+Hadoop+Spark解決一個好的NLP的問題,那就不錯了,這中間有很多實務的問題要解決,並不容易。解決了有意義、有難度的問題,會大大提升功力,業界也看得到。所以,不要再徬徨了,快去找個意義的問題來做吧!
沒有留言:
張貼留言