PyConTW 是 Python 社群的年會,可以看看各地的 Python 使用者做了什麼有趣好玩的專案。每個人平常可能都專注在手頭上的工作,所以參加社群聚會是一個啟發創意思考,學習新知的好機會,也可以認識新朋友或找工作,現場有贊助商擺攤。參加後的心得簡言之如下:

  1. Keynote 都很有水準,沒讓人失望
  2. Talk 部分,每個人的背景、興趣不同,因此不是每一場演講都有收穫,有些太淺,有些因背景知識不足引不起興趣,但是都可以參考參考。(深深覺得我也應該投稿的…)
  3. 只聽演講其實沒有辦法學到多少東西,因為演講只是一閃而過的訊息,要學會還是要讀文件跟實作,所以就是看看別人在你有興趣的領域上,是怎麼解決問題,用什麼套件等。
  4. 可以看看社群在溝通協作上都用什麼工具,像共筆採用 hackfoldr + hackmd,就令我耳目一新;另外還有 sli.do 可以接收聽眾問題,gitter 公共聊天室,speakerdeck, slides.com 放投影片等。

我印象比較深刻的講題(與個人興趣、背景高度相關,僅供參考):

  • 唐鳳的 Keynote - 明日之後的世界: 講他推廣公民網路參與公共議題,形成共識的經驗
  • Mosky - Boost Maintainability: 講節省開發及除錯時間的程式設計原則
  • jserv 的 Keynote - Python 導入系統軟體教學: 講他在學校教書的經驗跟最近參加的本地大型專案。jserv 的名氣就不用提了,聽過好幾次他的演講後,我只想說原來程式大神跟嘴砲大神可以存在在同一個人身上 XD
  • 迪士尼資深工程師 Paul 的 Keynote - Inside the Hat: Python @ Walt Disney Animation Studios: 講動畫電影製造過程,Python 在其中的角色,他們對於商業軟體的看法與使用方式
  • PF - 用Numpy做一個自己的股票分析系統: 這大概每個有在買股票的工程師都想過要做,包括我自己 XD 他有提到用 Numpy 加速計算,跟前端 UI 可用 Amcharts.js
  • 柯維然 - 用Google Cloud Platform玩交通資料分析: 單純只是很驚訝泛公務人員體系的臥虎藏龍,之前也有叢培侃這位資安專家 (雖然他後來也離開了),這些人是我離開之前沒有預料過會遇見的
  • 施晨揚 - 如何打造關鍵字精靈: 談他用 Pixnet data 建詞彙關聯的結果,基本上就是在講 Word2Vec 及斷詞,對我而言技術已知,但 data 只有他有,所以可以看看他的實證結果;另外他也提供了好幾個我不知道的斷詞用字典來源
  • Andy Dai - Analyzing Chinese Lyrics with Python: 一樣是技術已知,但結果有趣;也講了很多計算與呈現結果可以使用的套件 (pandas, counter.most_common(), matplotlib, wordcloud)
  • PTVS 作者 Steve 的 Keynote - Intentional Communication: 很令人意外地沒有講他做 PTVS 的技術細節 (大概留在收費的 tutorial 了),而是在講如何有效溝通與溝通工具(說、寫、教)的效果,很有渲染力,他怎麼得到目前這份工作的過程也很值得一聽

全部議程共筆在這。


距離總處事求人開放資料版網站上線已經超過一年半了,期間經歷了各種奇怪的阻礙,例如:

  • 時不時就抓不到資料 (當天沒資料的話網站只能開天窗)
  • 突然改變資料開放的方式,從可以直接 GET 變成要從網頁 POST (後來又改回來了)
  • 總處主機突然擋起了國外 ip (我也想架在台灣但 AWS 在台灣沒有主機呀)
  • 除了我以外,也看到其他人要求總處增加開放資料的頻率,從每日更新一次到每日兩次等,不做就是不做,還把每日新增職缺貼在總處的 fb 頁面上,我是不太懂為什麼他們寧願人工張貼資料,也不願意讓機器自動從資料庫重新產製開放資料就好… (2016-06-02 更新: 現在資料改成每日產製兩次囉! 幫總處同仁按個讚!)

透過民意信箱跟總處打了多次交道,雖然官僚難免,但總的來說服務還是滿周到的,反應的問題大部分都有解決。

開始收集每天的開缺資料也已經超過一年了,為了慶祝即將上任的副人事長是資訊背景,人事資訊化將大有可為(?),花了兩天增修了網站的一些統計功能:

  • 新增各機關開缺數查詢:先點選機關,再點選職系,最後可看到開缺細節。所有表格皆可搜尋及自由排序欄位
  • 修改各職系開缺數查詢:改以表格呈現,並可看到該職系開缺機關,可搜尋及自由排序欄位
  • 職缺特殊條件新增「✔同意開放簡歷」,對應原總處「請注意:本職缺啟用現職應徵人員調閱簡歷功能,現職應徵者需同意開放簡歷給徵才機關調閱」條件

有了職系開缺數查詢,如果你想轉職系,或是朋友在選考公職職系時,可以來看看該職系是否常常開缺,最常開缺的機關是那些,從而了解是否容易調動;至於各機關開缺數查詢的使用時機更廣,例如:

  • 你很想調到某機關,想知道他們有沒有在事求人開過缺 (例如央行從不開外補)
  • 你看到某機關開缺了,想知道該機關是否一天到晚在找人

這邊要注意的是很多機關的缺是掛在上級機關下 (例如北市國中小人事室主任的缺都是北市府人事處開的),因此要找此類職缺必須先從上級機關 (例如北市府人事處) 找起,職缺列表的工作地址會註明真正的工作機關,並請善用關鍵字搜尋,如下圖。

opencpa-1

職缺列表的順序是從開缺日期最近的缺開始,但所有表格的每個欄位都可以自由排序。

總處的開放資料內容其實滿亂的,因為不是每個張貼職缺的人都會依照格式輸入,我只用了一些簡單的規則去判斷職缺結構,爬梳結果難免有不完整的地方 (例如職等判斷錯誤或留下了非公務人員的職缺職系等),不過就先頂著用吧。另有關本站目前的匿名留言功能,我一開始是希望有身分認證,然後讓大家可以私密地交換有意義的資訊,不過我早期測試的結果顯示很少人想要曝光,而且 fb 的封閉社團或 line 群組就已經可以實現這個想法,所以就不做了。網站未來增修的方向:

  1. 把考試缺資訊一起整合進來,機關用人的全貌會更完整 (之前有收到一位朋友來信,似乎正在做這部分的功能)
  2. 附上 Ptt 針對某機關某職系的討論文章

不過實作日大概也是遙遙無期吧。


用自然語言處理與機器學習標註景點主題

很多人喜歡旅遊,但是對於一個旅遊景點,每個人關心的主題是不同的:有的人特別喜歡購物,有些人愛吃美食,喜歡看風景的人也有人文景點或自然景點的偏好,或者你的興趣是攝影,特別關心哪邊有好的取景點。因此,若事先知道這個景點與哪些主題較相關,就能夠依照個人喜好安排自己的旅遊行程。要怎麼知道一個詞彙(景點、地名或商店名稱)與哪些主題相關?人工標註當然很容易,但要怎麼讓機器做到呢?一個直觀的想法是:如果出現這個詞的文章都是在討論某個主題,那這個詞屬於這個主題的機率就很高。例如有”一蘭拉麵”出現的文章大部分都是食記類文章,則可合理推斷”一蘭拉麵”與”美食”這個主題相關。當然,如果有一篇文章在講攝影,然後提到”拍完照後大家都餓了,就前往有名的一蘭拉麵”,則”一蘭拉麵”也會被標註上”攝影”這個無關的主題,但只要文章數量夠多,我們就能用與該詞彙有關的各主題的機率去做判斷,畢竟直覺上一個美食的詞彙出現在美食類文章的數量會比出現在攝影類文章大得多。所以”標註景點主題”的問題就轉變成了”標註文章主題”的問題,而我試著用自然語言處理跟機器學習來解,做法是:

  1. 先決定幾個預設的主題,取一小部分的文章做 training data, 手動標註這些文章的主題
  2. 將 training data 的每一篇文章斷詞後做 Topic modeling, 也就是用這些文章建立 dictionary, language model, 將文章表示成 latent vector space 中的向量
  3. 將剩下的所有文章(testing data),用已經建立好的字典跟模型投射到同一個 latent space 中,看這個向量(這篇文章)與 training data 中的哪一個向量(哪一篇文章)最相似(計算 Cosine similarity),最相似文章的主題就是這篇未知文章的主題。

測試結果

為了驗證,我找了 PTT Japan_Travel 板上標題有”東京”的食記、遊記及住宿類文章大概 5000 篇,接著手動標註了今年1-2月份的文章大約 250 篇(5%),用這 5% 的資料建模,讓機器去標註剩下 95%的文章,有了文章主題後再計算字彙的主題。以下是一些字彙的標註結果:(程式語言是 Python, Topic modeling 用 gensim, 斷詞用 jieba)

迪士尼樂園

  • 景點 0.5294
  • 購物 0.1548
  • 美食 0.0991

嗯,看起來還滿準的

六厘舎

  • 美食 0.4444
  • 景點 0.3333
  • 購物 0.1667

吃沾麵的地方,也正確

昭和記念公園

  • 景點 0.3913
  • 攝影 0.2174
  • 美食 0.1739

搜尋了一下,很多人在這邊拍銀杏跟櫻花

不過除此之外,也有很多不準的,例如:

羽田機場

  • 景點 0.356
  • 購物 0.2042
  • 美食 0.1832
  • 機場 0.0236

一蘭拉麵

  • 景點 0.3477
  • 購物 0.2865
  • 美食 0.1836

標註錯誤的原因有很多:

  1. 該詞彙不是景點,但出現在大量的遊記中,例如很多篇遊記都在羽田機場下機,都去吃一蘭拉麵
  2. 也因為絕大部分的文章都有”景點”這個主題,所以”景點”幾乎 dominate 了所有詞彙的主題排行第一名
  3. 主題切分不夠細,training data 太少,斷詞處理得不好,沒有處理同義字…等

不過就算有更多 training data, 或花更多時間調整精細度,統計式或機率式的自然語言處理都有其極限,所以現在才有很多人改用 deep learning 去試,而中文的處理更難,關鍵還是在斷詞,如果斷詞用的字典不夠大,效果就不可能好,而斷詞用的字典幾乎只能靠人工建立.

首次參加黑客松心得

因為朋友相約參加黑客松,才騰出時間做了上面的實驗。我們參加的是經濟部工業局辦的一個“Big Data X Maker”黑客松,然後其實我們做的成品不只這樣,而是一個東京旅遊推薦系統:依照個人喜好、旅遊天數、預算高低自動產生景點與行程規劃。除了上述部分外,其他朋友負責網站前端、後端、行程排程演算法等,最後的成品如圖:

hackathon-1 hackathon-2

很可惜的是最後沒有得獎。之前就有耳聞,但這次確實觀察到了有關黑客松的一些有趣現象:

  • 大概有一半的隊伍沒有任何成品,只有簡報,而且其中有好幾隊都抱走了獎項(所以是簡報松?美工松?創意松?)
  • 有好幾隊在簡報裡面都說:我們的 App/網站長這樣,讓使用者可以 blablabla,看到最後才發現都是概念圖或改圖的…
  • 撇開沒有成品不說,確實有看到一些新的 idea, 也看到好幾組做特殊領域的 chatting bot, 看來 bot 的趨勢有傳播到國內

平心而論檢討我們的成品,沒有得獎的因素可能如下:

  • 旅遊相關的主題,評審大概看多了,覺得不夠有創意,簡報的方式也可以再改進
  • 資料來源只有 PTT Japan_Travel 板,其他部分都是串 API 得到的,可能不夠多,可以再介接一些 facebook 打卡熱點,或是從 blog 或 fb post and photos 自動學習使用者的興趣等

不過總而言之有學到東西,也有團隊合作,是一次很有趣的經驗!


糖、脂肪、鹽: 食品工業誘人上癮的三詭計

被加工食品圍繞的現代人值得一讀的書。一些闔上書本後還留在腦中的重點:

  • 若沒有大量的糖、脂肪及鹽,加工食品的味道將難以下嚥(“乾癟”、”金屬味”、”吃起來像潮濕的狗毛”),為了掩蓋這些味道,及延長食物的保存期限,大量、超量的糖鹽脂肪是必用的。
  • 我們習以為常的文化與飲食方式,很可能不是自然形成,而是食品廠商特意行銷的結果。例如:麥當勞一開始沒賣套餐,是可口可樂打進麥當勞的供應體系,說服麥當勞讓餐點搭配可樂;同時可口可樂不只主打它的味道,還主打你的生活體驗:”在值得慶祝的歡樂時刻,身旁一定要有可口可樂”。另以起司(乳酪)為例,從單吃的食品被推廣到可以與所有菜餚搭配,以消化消費者改選購低脂牛奶後業者產出的多餘脂肪;或洋芋片從點心進化到正餐(可以配沙拉,可以配捲餅,或直接裝在籃中當成一道菜)。相同的行銷手法已經被食品業及所有產業使用。
  • 演化結果,人類對糖的喜好是天生的,無法抵抗,但對甜度上限有忍耐點(食品業早就知之甚詳的”極樂點”);人類對吃下去的脂肪中含有多少熱量無法察覺,吃再多也不覺得膩;但人對鹽的喜好是後天習得的,你一陣子吃低鹽飲食,之後會覺得平常吃的食物太鹹。
  • 事情的講法永遠有一體兩面。食品加工業加入超量的糖鹽脂肪是為了最大化其利潤而枉顧消費者健康?還是只是單純回應消費者需求以求在市場上生存?現代人的肥胖及文明病是因為精緻食品製造者的貪得無厭?還是人們自己無法自制的選擇?你所處的立場不同,就會有不同的看法。
  • 大部分食品業者的高層不吃自己家生產的食品:他們多半受過高等教育,講究飲食,生活方式不同於一般普羅大眾,所以業者非常需要焦點團體的回饋結果,據以設計他們的食品。
  • 在經濟不好的時候,加工食品跟垃圾食物的銷量會增加,因為它們往往比新鮮食物便宜,容易取得 (我在美國生活過一陣子的經驗也是如此,路邊小店的12吋基本款披薩比超市裡一盒生菜還便宜,因為加工食品的原料簡單,熱量高,成本低)

獨立思考,聰明選擇,做自己身體的主人吧。


前言

這篇文章講的是我這兩年的美國 CS 博士班申請經驗,之所以稱為非典型,是因為你在網路或 ptt 上找到的典型成功範例多半如下:

  • 直升,除了兵役或研究助理外沒有其他工作經驗
  • 大學 GPA 不錯 (> 3.5/4.0)
  • 已經有 publications in top conferences
  • TOEFL/GRE 輕鬆達標, 甚至超過標準一大截
  • 申請結果是滿手 offers from top schools, 例如這樣的抉擇: “雖然 CMU 是我的理想學校, 但考量到日後就業還是忍痛選了 Stanford”

以上這些元素我一項都沒有,大部分的申請也都被拒絕了,但總算運氣好錄取了與我的研究興趣很契合的教授與 program。因此若你的先天條件佳,這篇文章對你的參考價值並不大;若你有興趣了解條件較差的人有什麼努力的空間,則可以繼續看下去。

背景

  • 多年前清大資工學士及碩士畢業
    • 學士 GPA 只比 3 多一點; 碩士班 GPA 4.0
    • 研究興趣是軟體測試及軟體工程,碩士論文以第一作者發表於 non-top conference 及 journal
  • 當兵後工作數年
  • 辭去工作,在台大念博士班,延續之前的研究興趣
  • 博士班期間做的事情,對我之後的申請及錄取非常重要,時序如下:
    • 博一上: 通過資格考,跟指導教授要推薦信, 申請美國國家農業圖書館 (NAL) 實習
    • 博一下: 修課,作實驗室計畫,論文投稿
    • 博二:
      • 在 NAL 實習,實習期間與同事共同發表了一篇生醫領域的 journal
      • 當年底考上公費留學
      • 當年底裸考 TOEFL/GRE, 偷偷投了美國 4 間學校的 PhD 申請, 全滅
    • 博三上: 修課, 作實驗室計畫
      • 向指導教授表明出國念書的意願並尋求支持 (推薦函)
      • 有一篇共同作者的 non-top conference paper
      • 加強 TOEFL/GRE, 重寫並找人編修 SOP, 年底再投了一次去年的 4 間加上另外 7 間共 11 間, 申請送出後試著連絡想跟的教授, 最後錄取其中兩家,並落腳 UC Irvine 的 PhD Program in Software Engineering.

第二年的努力

經過了第一年的失敗,第二年申請時我決定要把所有能加強的地方都好好努力一下。在比較這兩年申請條件的差異後,以下是我的經驗與建議。

TOEFL/GRE

常見的說法是:英文分數是用來篩選人的,達標之後就沒差了。我的結論是:沒錯。除非你骨骼精奇,否則還是努力達到標準以上吧! 好學校的標準通常是:TOEFL 100 以上, GRE V + Q 320 以上。我的親身經驗是:同一間學校,在第一年 TOEFL 還沒達標時,申請送出後過了幾個月就默默的接到了 rejection,但第二年在達標的情況下,送出申請後沒多久額外收到了一封”已經經過審核正在系所審查中”的通知信,雖然最後還是 rejection,但很明顯我第一年的申請根本就沒到 committee 手上,第一關就被刷掉了。

SOP 重寫 (包含新增研究想法) 及找人編修

我工作了好幾年才回學校,過了完整的一個學期之後就出國實習(其實就是上班寫程式),所以老實說第一年申請時,我還沒有很具體的研究想法,就是把平常讀的 paper 裡的 future work 或是一些回顧型文獻裡面提到的挑戰寫進去而已,再請一位英語接近母語程度的同學幫我潤稿;第二年經驗比較多了,也有具體的研究想法,我重寫完 SOP 以後,為求慎重也另外再找了專業的編修,而專業編修對我非常有幫助。舉例來說,在 SOP 中會有一段是針對各學校客製化的段落,我原本寫得非常空泛,比方說學校名聲很好,地點離軟體業很近,某些教授是做什麼研究,跟我的興趣很契合等等。而編修把我這些空話直接刪掉,叫我針對教授的研究再寫詳細一點,並且要跟自己的研究想法有強力的連結,因為這是博士班的申請,教授是收你進來做研究,打高空是沒用的;除此之外,即便編修的專業是文組,他還是針對 SOP 內容他看不懂的地方與我討論,要我說明,或是我寫得比較膚淺的地方要我寫深入一點,最後修改了超過一半的內容。另外一個巧合的地方是:我當初評估自己的條件與興趣後,將 UCI 作為我的目標學校,並且拿申請該校的 SOP 請他編修,再拿編修完成的文件修改後投其他 10 間學校,最後錄取我的其中一間學校就是他編修過的這一家,事後想來也相當合理,一來我對 UCI 的 program 跟老師最了解,其他有些不熟的學校根本也是再把那些空話寫上去而已;二來我投了很多排名更好的學校,大概也是自己條件不夠好吧!所以對於已經有研究經驗,研究想法的普通人來說,我的經驗如下:

  • 博班申請亂槍打鳥是沒用的,買個希望而已,你的客製化段落要寫到只適用這間學校 / 這些教授,看起來就是拿來申請這間學校的
  • 找專業編修會有幫助

當然我說過我的經驗是非典型,如果你是申請碩班(很多碩班 program 不做研究,純粹是比條件/財力),或大學畢業直接申請,或條件與以往滿手 offer 的申請者很接近,大概就不適用。

公費留學

為了籌措財源、增加履歷亮點及錄取率,我考上了公費留學。你可能常常聽到有人公費留學出國念書,但大概很少聽到 CS 或理工科的人考公費的,這是有原因的。公費留學的優點是:

  1. 錢。我這一屆是 USD 42,000 補助三年,但最新一屆已經又改回學費與生活費分開補助的模式了。
  2. 增加履歷亮點。公費留學各學門一年通常只錄取 1 到 2 個,所以你可以在 CV 或 SOP 內寫上你是該年度該領域全國第一或唯一錄取者
  3. 如果你願意自費念博班的話,或許可以增加錄取率,但我沒有試過不清楚。基本上在申請學校的時候,大部分的學校都會要你勾選”你是否願意自費”或是”若沒有獎學金你是否還願意入學”的選項,如果你因為有了公費而願意自費,可能可以增加錄取率,我因為都沒有勾選,所以無法知道效果如何。

公費有優點,但是其缺點對於理工科及博士班的申請者特別明顯,

  1. 錢太少,時間也太短。通常學校提供博士生的全額獎學金會包含學費全免及每個月的生活費,美國研究所一年學費都是 3 萬起跳,有些甚至 5 萬多的,只靠公費繳學費跟生活費很可能不夠;再來美國博士班普通人要三年畢業很難,三年之後公費用完了要自己想辦法。所以如果你因為有了公費而願意自費,可能可以錄取你理想中的學校,但也可能因此喪失獎學金的機會。
  2. 公費生拿的是 J 簽證,畢業後沒有 OPT。OPT 是讓你畢業後可以合法在美國一年找工作的簽證,理工科 (STEM) 畢業生如果在這一年內找到工作,還可以延長 OPT 兩年,在這期間可以抽工作簽證,以便日後繼續在美國合法工作。雖然 J 簽證有相對應的 APT,但仍然有其他限制 (例如兩年條款,規定 J 簽證持有者必須回到母國兩年後才能申請工作簽)。這兩點大概就是你很少聽到理工科的人考公費的原因。

指導教授的推薦函

我第一年申請時並沒有請我的博班指導教授寫推薦函,實習回國之後,與教授懇談並取得他的首肯,第二年的申請就請他幫我寫了推薦函。我不確定這有沒有影響,不過有一個能夠以最近距離觀察我的人背書,總是讓審查委員放心一點吧。

多了一篇無關緊要的 conference paper

就算這是一篇不怎麼樣,我也不是第一作者的 paper,但是

  1. 這是我最近在做的研究的前期成果,我目前的研究主題與碩士班時期不同,在 SOP 中寫得再多,不如有一篇發表佐證
  2. 這是我跟現在指導教授合作的結果,代表我在這邊有在做事

所以我想多少還是有用的。

Cold emails

我針對幾位我較為了解其研究內容的教授,寄了 CV 過去,並說明我目前的研究興趣與加入他團隊的意願,有些教授有回應,有些沒有,但有沒有回應跟會不會錄取你是兩回事,有回沒錄取或沒回有錄取都是會發生的情況。錄取我的 UCI 教授有沒有回我信?沒有,但是在我寄出信兩週之後有跟我 skype interview。這是因為我有寄信的關係嗎?不知道,因為我沒寄信的學校也有 interview,但有了 interview 之後也沒錄取,所以就是一個盡人事聽天命的概念。結論到底要不要寄信?我的建議是,要寄就一針見血,信的內容必須讓教授一看就知道你真的懂他在做什麼,而且說明你是適合的人選,罐頭信打高空應該只有反效果吧。

努力的作用

第二年錄取我的 UCI 是第一年拒絕我的學校之一,從這個觀點看來我這些努力是有效的;但是除了 UCI 以外,其他去年拒絕我的學校今年還是拒絕我了,以此看來努力並沒有起到太大作用。只能說條件不好的人更要認命,能夠努力的地方還是要拚一下!

Connect all the dots

如果我沒有在第一學期就拚過資格考,我就沒辦法整個博二安心地在國外實習;如果我沒有出國實習,我不會想申請國外博士班;如果我沒有先在台大念過博士班,並且跟著目前的指導教授做計劃,我不會有足夠的研究想法可以寫在 SOP 裡面。

“You can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future.” - Steve Jobs

你懂的。