July
9th,
2015
前言: 這裏整理一下,如何透過Golang來處理多國使用者網頁顯示的問題. 所謂面對多國使用者的時候,主要有一些問題: 如何根據不同國家顯示不同資料 如何根據不同國家顯示正確的時間資料 如何根據不同國家顯示以及儲存正確的字元集 我在這裡只把顯示的部分整理一下…. 判斷使用者國家語系方法: 透過使用者設定 這個是最簡單的方式,也就是使用者自己先設定好你所偏好的語言.類似Google一樣,然後所有的語言顯示就會依據你的顯示方式. 但是這個方式可能有以下的問題,某些服務可能不只有在內部使用者使用.有可能會邀請不同的使用者. 這時候要如何顯示正確的語言呢? 接著來看第二個判斷方式….. 瀏覽器回傳數值 每個瀏覽器都會提供Accept-Language這個Header參數可以提供網站來參考.它的細節在此. 以下列出我用Golang 抓出的三個我常用的瀏覽器結果,在繁體中文Mac OSX上面. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4] Safari: [zh-tw] FireFox: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3] // Parse accept-language in header to convert it as: tw, en, jp ... func ParseAcceptLang(acceptLang string) string { // 1. Chrome: [zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4] // 2. Safari: [zh-tw] // 3. FF: [zh-TW,zh;q=0.8,en-US;q=0.5,en;q=0.3] // // Ret: zh or en ... tarStrings := strings.Split(acceptLang, ";") if len(strings.Split(tarStrings[0], ",")) > 1 { return strings.Split(tarStrings[0], ",")[1] } return strings.Split(tarStrings[0], "-")[0] } 以上程式碼可以根據目前的Header的Accept-Language 內容轉換成 tw, en或是jp. 針對不同國家語系,顯示不同內容 使用javascript 顯示網頁部分 透過之前的ParseAcceptLang搭配著http.Request裡面的Header你就可以取出資料並且開始判斷與處理.這裏我使用的是martini跟 martini-render. func ShowDifferentResultByLang(r render.Render, res *http.Request) { var acceptLang string for _, v := range res.Header["Accept-Language"] { acceptLang = v break } outPutData.Lang := OutPutStruct{} //取得瀏覽器Accept-Lang設定 outPutData.Lang = ParseAcceptLang(acceptLang) r.HTML(200, "SOME_TMPL", outPutData) } .... //Web Template <script type="text/javascript"> var Language = "\{\{ .Lang \}\}"; DoSomethingWith(Language) </script> 這裡面的方法,就是要透過瀏覽器的回傳數值.透過JavaScript 來做相關的處理. 在JS裡面的細節我就不詳談了,這裡有一個詳細方法可以讓大家參考. 顯示不同的圖片 除了在網頁上面透過Java Script來顯示不同的內容之外,其實就算要顯示圖片也是可以透過不同的瀏覽器來給予不同的語言. 方法其實很簡單,就是必須要多開一個接口來幫忙處理圖形的處理部分. 這裏主要會用到的是 http.ResponseWriter的方式. func ShowLocaleImageByBrowser(params martini.Params, r render.Render, db *DB_Medium, res...
繼續閱讀
June
29th,
2015
前言:
最後一週,只有Lab.而最後一個Lab其實也接著之後的進階課程Scalable Machine Learning. 所以最後一次的Lab開始介紹Spark關於Machine Learning的部分.喜好電影預測是個很有趣,很實用的課題.
相關文章
edx 課程網址在這裡 https://www.edx.org/course/introduction-big-data-apache-spark-uc-berkeleyx-cs100-1x
[MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (一)
[MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (二)
[MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (三)
[MOOCS:edx]BerkeleyX CS100.1x- Introduction to Big Data with Apache Spark (四)
Lab4 - Predicting Movie Ratings
這一次的Lab主要是要做透過使用者對於喜愛電影的評分,加上從MovieLen上面超過10M資料抽出50萬筆一般大眾的評分資料.來預測你可能會喜歡的電影.運用的技術是所謂的“協同過濾”(Collaborative filtering)的方式來達成.
簡單的概念就是: 如果一般人喜歡A電影的同時,大多也喜歡B電影.當你輸入你喜歡A電影的時候,系統就會預測出你可能也喜歡B電影.
上面的圖片可以有一個簡單的概述,也就是透過以下流程達成:
建立參考數值(也就是我們所認知的一般人喜好)
計算每部電影的平均評分跟評分個數
找出500個評分以上的資料.這些資料要來當作預測數值衡量基準.
訓練模型
找出訓練的資料群組
針對Matrix Factorization Model的資料類型,Spark提供ALS.train的方式來train
計算出預測出的RMSE(Root Mean Square Error),也就是與大眾偏好的偏差值
當預測數值越精確,RMSE會越趨近於零.反之,越趨近於一.
透過rank的變化,挑選出最好的模型(RMSE最低的)來進行下一個階段
預測你可能會喜歡的電影
輸入你對於電影的評分
透過ALS.train預測結果
心得
關於最後的Lab,一開始還稍微卡住.不過跟一些人請教之後.一下子就把最後的Lab寫完.
我才發現其實Spark的使用上並不會困擾我,我反而是困擾在Python的Lambda運用.
因為題目裡面很多都只給一個. 但是當你不熟悉Lambda的時候,你就只會用很多行的方式來解決.
如果可以熟練使用Lambda的方式,更可以搭配著Spark的一些transform (map, filter, flatMap 或是 reduceByKey…) 來解決更多的問題.
有人推薦這本Data Science from Scratch principles Python似乎也蠻適合我這種對於Data Science完全沒有概念的人. 關於這本書的範例程式在這裡可以找到.
相關鏈結:
Movie Lens
Wiki: 協同過濾
Wiki: Collaborative filtering
Book: Data Science from Scratch principles Python
Python Data Science Sample Code fro Book “Data Science from Scratch principles Python”
繼續閱讀