NO IMAGE

  在intel的spark實驗室實習已經一個月了,在和藹的主管以及學弟的幫助下逐漸熟悉spark相關的程式設計環境。在編寫了一個並不算成功的lsh演算法後,是時候做出總結繼續前進了。

第一週

  除了在公司以及自己的電腦上配置spark和程式設計環境以外,這周開始調研中文分詞的工具,要求速度快擁有apache的license並且能夠和開源的搜尋框架相結合。最後把目標鎖定在ik-analyzer以及ansj-seg上面。
  這周花了大量的時間糾結在公司電腦不能上外網下依賴的問題上面,沒有及時和與經驗的同事溝通,在構建工程的時候浪費了許多時間。
第二週
  這周主要利用sbt重構了ik-analyzer的依賴,由於各種因素mac的環境還沒有配好,利用公司的電腦構件專案依然效率很低。在此同時,對text mining的過程以及各項主流工具進行了調研。
第三週
  這周終於配置好了mac的開發環境,著手實現lsh演算法。lsh演算法利用降維以及多次雜湊將相似的向量放到同一個band中,是一種快速但不精確的聚類方法。我需要實現spark版本的lsh生成向量之間的相似性矩陣。為knn演算法提供介面。看懂了lsh原理之後,我借鑑github上已有的lsh演算法,確定了相似性矩陣的介面以及實現方案。
第四周

  這周與學弟交流了很多,在本地搭建了spark的單機執行環境,找到了spark以及scala的api 完成了lsh的spark實現。在叢集上跑的時候因為實現的時候沒有考慮效能的因素,比如在map之前呼叫distinct,使用groupbykey而不是aggregatebykey使的shuffle的時間以及記憶體過長。同時,雜湊次數過多使得產生過多重複的聚類。

  最後,還是成功的把程式跑了下來,但是最後knn的準確率只有10%,離預期的37%差了好多。分析下來,hash函式的選擇可能有問題,jaccard相似度和歐氏距離相似度並不一樣,同時利用jaccard相似度直接作為矩陣的相似度並不能反映向量之間距離的遠近。在實現之前,沒有做好整體的分析,沒有了解相關的論文,而只是追求最後能有結果這種做法太武斷了。後來看了篇論文發現先利用random project(kd tree)做對映再聚類,然後計算聚類下向量的相似度是可行的。
  下週會有新的任務,lsh只能告一段落,在兩週的時間內沒有利用好機會實現lsh得到該有的結果十分可惜。
總結

  這一個月,因為其他事情犧牲掉了工作的效率。有些東西越陷越深徒增煩惱,只能先放一放了。

  下個月的任務是測試spark的效能,重新專注起來,多交流多思考,在完成新任務的同時努力實現新一版的lsh。同時,得重新打好基礎,重新出發。