2014/4/30

C#捉取網頁資料-其一

在C#建一個簡單的Console專案

然後安裝以下套件                   

image

image

image

語法上其實還蠻單純的

不過在建立新物件時,因為會用到套件的東西所以需要自己手動指定解析,IWebDriver 與 PhantomJSDriver(),將游標移至這2個項目旁邊按右鍵即可

image

此處一個簡短範例如下

            IWebDriver driver = new PhantomJSDriver();
var url = "http://en.wikipedia.org/wiki/Web_scraping";
driver.Navigate().GoToUrl(url);
var tocElements = driver.FindElements(By.CssSelector(".toctext"));



在我這個範例中,最重要的是那個 FindElements有s與沒有s …顧名思義,有s指的是複數的狀況,沒有s指的是單數的狀況;而在CssSelector中的參數要如何取得呢? 簡單就使用Firefox中的FireBug+FirePath即可


image


另外一個小技巧就是在C#的程式中設定適當的中斷點,然後利用「即時運算視窗」再確認我們捉下來的資料是不是我們需要的


因為有時候需要的文字資料裡面會有不需要的東西,則可以事先運用文字相關函數加以整理….

2014/4/29

Big Data 作業流程技術資源

因為Blogger系統的限制要放在側邊有點麻煩,我直接另開一篇

將我個人蒐集在 Onenote 的資料也整理到這邊

後續會陸續更新… (因為Big Data 的議題熱度高啊~)

更新log:

(1)2014-4-29

(2)2014/4/30 更新Web Scraping資料

Moe
資料科學家作業流程
相關技術連結
Ⅰ-定義問題  
Ⅱ-取得資料 Web_scraping 相關技術

利用網站:
https://import.io/
捉取網頁資料

自己寫程式:
https://developer.yahoo.com/yql/ Yahoo的YQL
Python套件 Beautiful Soup、Scrapy

RUBY套件 Watir   Nokogirl

C#套件  Html Agility Pack、 WatiN 、 CsQuery

JavaScript 套件 PhantomJS、CasperJS

我個人有試過在C#底下使用過jQuery+PhantomJS+WebDriver的方式捉取網頁資料
  方式如下:在C#開一個Console專案→安裝以上套件→在Firefox中觀察網站結構確定要捉取資料型態→匯出 ;另外安裝一套 CsvHelp可以簡化輸出作業

輔助工具:
另外由於HTML不是很標準化的語化,所以可以套過FireFox下的Firebug、Firepath來快速掌握網站架構(可快速瞭解DOM與CSS)

可參考書籍:
Mining the social Web

Ⅲ-模型分析  
Ⅳ-行動應對  

2014/4/27

Azure安裝Rstudio

Azure安裝Rstudio

前提:Ubuntu已架設完成

主要分成2個部分

(1)安裝Apache伺服器
   執行以下指令
   sudo apt-get install apache2
   sudo apt-get install libapache2-mod-proxy-html
   sudo apt-get install libxml2-dev

(2)安裝Rstudio 安裝很簡單,但記得在Azure管理介面中將8787 Port打開

   安裝R
   sudo apt-get install r-base
  
   安裝Rstudio(For Ubuntu)
   sudo apt-get install gdebi-core
   sudo apt-get install libapparmor1  # Required only for Ubuntu, not Debian
   wget http://download2.rstudio.org/rstudio-server-0.98.507-amd64.deb
   sudo gdebi rstudio-server-0.98.507-amd64.deb

原廠安裝說明:
http://www.rstudio.com/ide/download/server

打網址後面加上:8787 就可以登入 Rstudio介面
http://<server-ip>:8787
帳號權限管理方式就如同一般Ubuntu指令語法 useradd
 
 
*** 幾乎沒有什麼難度,想想如果這是在以前的話,這會是多麻煩的一件事呢?!

Azure中Ubuntu安裝桌面環境與遠端桌面連線

 

Azure是微軟提供的雲端解決方案,微軟目前很認真的在推這塊領域
微軟的大頭目已經喊出了「Mobile First, Cloud First」
很明顯的要將微軟主要的獲利來源往這塊領域移動,所以Azure提供的不只是微軟自家產品、作業庫系統、資料庫系統的解決方式,已經成為了跨平台方案的提供者

一般人比較會使用到的是自建虛擬主機的方案
設定起來蠻簡單的
就是每台主機都是各自獨立,所以需要設定如下
(1)主機名稱
(2)使用帳號
(3)使用者密碼

其實就想成是從前利用Vmware在自己的電腦再另外安裝一套作業系統一樣
只是安裝的速度更快,例如安裝好一套可以用的 Ubuntu 大約只要10分鐘吧
如果是在自己的電腦上安裝並且要自訂主機名稱,很難這樣快速達成
你設定好的主機名稱,後續在微軟的網域底下 cloudapp.net
想像一下從前自架主機還要搞定IP之類的麻煩事,現在微軟全部幫你搞定

當然一開始架好的 Ubuntu 是Server版本的沒有桌面環境可以使用,如果你和我一樣是GUI派的,就請再自行安裝桌面環境吧

在登入前記得先在Azure管理介面中設定以下Port

(1) 22 port 指定給 SSH (文字介面的遠端連線);

(2) 3389 Port 指定給 RDP  (遠端桌面連線)

利用 SSH (使用 Putty)的方式遠端登入你的 Ubuntu 主機

執行以下指令
sudo apt-get update   (先確定目前Update是最新版)
sudo apt-get upgarde  (這個step會安裝很久...)
sudo apt-get install ubuntu-desktop   (接近2Gb的檔案待安裝,安裝圖形介面)
sudo apt-get install xrdp  (安裝遠端RDP登入)
sudo /etc/init.d/xrdp start (執行xrdp)

OK,打完收工

後續再從Azure管理介面中下載連接檔,就可以在Windows中利用內建的遠端連線進行連接囉

資料科學的入門試題

在資料科學中,怎樣是一個好的第一步呢?

最近在做 Social network Anaysis,可以發現這種重視連線(點與點之間)關係的案例具備有一定的實用性;不過也因為太過複雜,我認為初學者最多就是利用現成套件描繪出圖形,對於進階議題的探討幫助可能不大。不過在Social network Anaysis中,計算距離的概念,其實在很多初階的多變量課本中都有提到,我認為是相當好的入門題,有趣卻又不失直覺 (總不能一開始就叫初學者去學時間序列分析吧…)

想像一個簡單的例題如下:

  A B C D E F
核四興建 1 2 10 9 5 9
反服貿 9 8 1      
破音歌神 2   9 4 5 4
石虎保育 10 10 1 2 5 2

這是一個蠻常見的例子,有7個人對於4種議題的贊同程度予以評分。分數由1~10分進行評比,為了簡化,先假設都是整數…1表示非常不同意,10表示非常同意… 而常常會有人針對特定議題不想要表態,所以有的資料有所缺漏。

在實務上,我們可以把議題置換為其他主題;例如你是一個電子商務老闆,你應該會支持特定的人應該會特別支持特定的商品的這種想法。那些沒有填資料的人,你可以想像是有潛力的客戶,但到底會不會購買呢?? 以我的例子來看 B 應該是比較接近A,而比較不接近 C ,如果你花了大筆的錢針對 B 促銷 “破音歌神” 這項產品,應該是沒有太大的效果…

當然因為我給的例子很簡單,如果今天是有20萬筆資料呢?有1000項商品呢? 那我們適必需要資料科學加以協助…

(1)個體間的差異?最簡單直覺的想法就是用距離的方式

例如 A與C的距離程度 = 9+8+7+9 > A與b的距離程度=1+1+0

  A C 差異(取絕對值)
核四興建 1 10 9
反服貿 9 1 8
破音歌神 2 9 7
石虎保育 10 1 9

 

  A B 差異(取絕對值)
核四興建 1 2 1
反服貿 9 8 1
破音歌神 2   跳過去不算
石虎保育 10 10 0

當然你事後會發現這樣的方式有很多問題,但是反過來說在 Big Data 的狀況下,很多時候不特別採用抽樣技術,反正我手邊的資料就是母體,只要分析的結果具備商業價值也就夠了… 一般來說距離求算的技術至少有3種。

在此例中,我們也發現在計算距離中,處理 Null 值的議題…同樣的東西如果要在Excel不利用VBA方式而用函數直接處理的話,往往要寫成很長的公式。而且Excel Sheet對於任意抽2個來計算並不是很擅長,所以我們會使用類似 Python或是R這種語言來協助。

在算出了距離後呢?

(2)接下來就是要找出那些是相似的?

舉例來說,如果以A為例的話,平均距離計算如下 (定義=總歫離/有評分的議題)

image

可以將 A B 視為是較接近的族群,而A C 之間的距離最遠,彼此間的差異最大

(3)進階處理 Null ? Null值可以用其他值加以取代嗎

回到原先的範例(把一開始的表格再複製一次)

  A B C D E F
核四興建 1 2 10 9 5 9
反服貿 9 8 1      
破音歌神 2   9 4 5 4
石虎保育 10 10 1 2 5 2

B D E F 都有不願意表態的項目

但是我們可以試著將 B 在”破音歌神”的Null值用A的值來取代?

Why 為什麼不用D的值來取代呢? 這樣子的演算法的規則是什麼?主要是因為在這例中,B與A的距離最為接近,自然是採用最接近的來進行取代。

 

其他衍生議題

(1)D 與 F 之間的距離最短為0,但是他們同意都不對「反服貿」議題表態..違反了一開始我們設定的簡易演算法規則

(2)E這位仁兄看來是採取二手政策對於各項議題都採取相對中立的態度…有什麼手法可以將這種誤差予以排除?

(3)在這個範例中,每個人只針對一個議題表達一項意件。而在實務中,往往一個人對於一項產品,不會只購買一次;例如:愛打籃球的高中男生 A,可能在一年內就消費了5雙nike籃球鞋…

所以我說這樣的例題,可以一再衍生很多資料科學中的進階議題;而隨著問題的複雜化,在程式語法中所要熟悉的東西就會從基本的變數設定、資料輸入/輸出、一定延伸至函數、Class撰寫等等議題…

否則對一個半路出家但有志於資料科學的人卻和資工系的學生進行一樣的訓練方式,這樣不是很奇怪嗎?

Python對dictionary資料結構進行排序

在Python 中可以針對 dict 資料結構進行排序,最簡單的做法是使用 lambda

因為在 VBA 中沒有這種類似的用法,所以特別紀錄如下

在 sorted 函數中,key = 你要排序的欄位

如果用 t:t[0] 這樣的表示法表示是針對 dict 中的key 進行排序

如果用 t:t[1] 這樣的表示法表示是針對 dict 中的value 進行排序

這似乎是 lambda 最為常見的使用方式…

而為什麼要這樣做呢? 其實最重要的原因是偷懶…因為其實也可以另外寫成函數另外呼叫,不過如果是排序這種這樣直覺的東西都還要另外寫個函數,實在是太麻煩了…

資料來源參考:http://stackoverflow.com/questions/9001509/python-dictionary-sort-by-key

This question has already been answered, but because it's popular on Google, here's what Python's documentation uses:

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'
banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('
apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('
pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('
pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])


2014/4/26

Python Dictionary 資料結構中文輸出解決方式

 

為了整理目前 python 在資料科學上學習的進度,自擬了一個輸入資料如下

以 Dict 的資料結構進行輸入

 
people_point = {"A": {"核四興建": 1 , "反服貿":9 , "破音歌神":  2  ,  "石虎保育": 10  },
         "B":  {"核四興建":2 ,  "反服貿":8   ,  "石虎保育":  10 },
         "C":  {"核四興建": 10 ,  "反服貿": 1 , "破音歌神":  9  ,  "石虎保育":1   },
         "D": {"核四興建": 9   , "破音歌神":  4  ,  "石虎保育": 2  },
         "E": {"核四興建": 5    , "破音歌神":  5  ,  "石虎保育":5   },
         "F": {"核四興建":9 ,    "破音歌神": 4   ,  "石虎保育":  1 }
             }

然後在輸出時遇上了問題:

{'A': {'\xa4\xcf\xaaA\xb6T': 9, '\xa5\xdb\xaa\xea\xabO\xa8|': 10, '\xaf}\xad\xb5\xbaq\xaf\xab': 2, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 1}, 'C': {'\xa4\xcf\xaaA\xb6T': 1, '\xa5\xdb\xaa\xea\xabO\xa8|': 1, '\xaf}\xad\xb5\xbaq\xaf\xab': 9, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 10}, 'B': {'\xa4\xcf\xaaA\xb6T': 8, '\xa5\xdb\xaa\xea\xabO\xa8|': 10, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 2}, 'E': {'\xa5\xdb\xaa\xea\xabO\xa8|': 5, '\xaf}\xad\xb5\xbaq\xaf\xab': 5, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 5}, 'D': {'\xa5\xdb\xaa\xea\xabO\xa8|': 2, '\xaf}\xad\xb5\xbaq\xaf\xab': 4, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 9}, 'F': {'\xa5\xdb\xaa\xea\xabO\xa8|': 1, '\xaf}\xad\xb5\xbaq\xaf\xab': 4, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 9}}

一開始上網查詢,確定是編碼的問題

但無論我如何將 dict 轉換成 str 格式就是無法轉成 unicode 格式

我想這可能是 dict 資料格式先天上的限制,我是使用 Python 2.7 的版本

後來查詢到解決方法如下:

在程式的最前頭加上 import json

在輸出時用這樣的語法輸出

print json.dumps(people_point["A"], encoding="utf-8", ensure_ascii=False) #指定

print json.dumps(people_point, encoding="utf-8", ensure_ascii=False) # 輸出整個 dict

則結果如下:

輸出結果1:

{"反服貿": 9, "石虎保育": 10, "破音歌神": 2, "核四興建": 1}

輸出結果2:

{"A": {"反服貿": 9, "石虎保育": 10, "破音歌神": 2, "核四興建": 1}, "C": {"反服貿": 1, "石虎保育": 1, "破音歌神": 9, "核四興建": 10}, "B": {"反服貿": 8, "石虎保育": 10, "核四興建": 2}, "E": {"石虎保育": 5, "破音歌神": 5, "核四興建": 5}, "D": {"石虎保育": 2, "破音歌神": 4, "核四興建": 9}, "F": {"石虎保育": 1, "破音歌神": 4, "核四興建": 9}}

嗯… 看得到中文,還是比較親切的 

==備註==

我在 Python IDEL 輸出是正常

image

在 Visual Studio 2013 的Console輸出視窗中,卻一樣會有亂碼

image

但是在 Visual Studio 2013 裡的 IronPython 2.7 Interactive 中執行的結果也是正常

image

嗯 … 一定是 Visual Studio 2013 那邊的設定沒有調整好… 不過我想這不是資料科學分析的重點,就不深入研究了

題外話:如果是一般字串與物件間的轉換,就不需要這樣麻煩

[筆記]物件導向-其二

物件導向裡面有三大特性

其實這三大特性,是相對於過往的純程序性語言而來…這樣被認定的優點,就是對過往的歷史所持的反對票;不過有時候是文人相輕,事實上程序性語言也不是什麼壞東西。只能說色色樣樣的程式語言只是工具,而不是目的,這是學習過程中要特別注意的…反正物件導向語言的重點就是在於物件彼此間的互動狀況。

(1)封裝性

很單純就是為了隱藏,只留下介面供存取;並且解決了全域變數的議題

這樣的東西在日常生活中也常常發生,例如:應該沒有幾個人明確的知道電梯的運作原理吧? 但是每個人進了電梯後,都知道依據狀況,按下不同按鈕,例如:「開門」、「關門」、「開門延長」,當然最重要的是「到達樓層」,而且當電梯到達了目的地,電梯門還會自動打開哩…

例如:在C#中,你可以特意將class中的各式屬性給予隱藏(都設成previate),只留下介面讓使用者使用;反過來說,其實電腦完美的將個別不同的物件分別綁住不同的變數與方法,將整理的麻煩工作直接交給電腦…

(2)繼承性

很多書都用什麼父親、兒子之類的舉例;或是鳥類 vs 公雞、企鵝啦….我覺得只會愈看愈火大。

其實不用想這麼多,就從實務的狀況來想就是,繼承性只是為了少寫程式碼而做出來的對策;舉例來說,你今天想要寫一個 RPG 遊戲,而其中最大的賣點是 轉職系統。可能有多種職業,像是勇者可以到處偷東西而不被關、魔法師可以使用高級黑魔法、格鬥家可以裝備拳擊手套、弓箭手可以裝備弓箭…等等。在沒有物件導向的年代,你就要這樣寫

class 勇者{   }

class 魔法師{   }

class 格鬥家{   }…

諸如此類的,可是你會發現除了職業間的差異外,其實有很多共通的特性啊,像是 HP、MP、物理攻擊力、智力、魔法攻擊力、魔法防御力、速度之類的屬性都是共通的;或是像 逃跑() 這類的方法應該也是共同的。重複的複製貼上動作真的很辛苦。所有人有想到,那我就將這些相同的特性給獨立出來,也許新建一個基本類別叫

class player(  }就解決一切…而再針別針別職業特殊性進行物件設定即可

所以說穿了,就是想要 Reuse 就是要做好環保的工作;實務上也有讓程式碼好維護的作用…

(3)多型

物件導向相對於過往的程序語言,這算是一個很特別的機制,就是讓你有用相同的呼叫端來做不同的事(舉例:求算面積時,計算長方形的面積、計算圓形面積的公式並不相同,前者不需要圓周率、後者需要圓周率的介入,但對於使用者而言,只要在程式執行時告訴電腦你要算的是什麼,然後需要你想要計算的值,事情就解決…後續就算再增加一些奇奇怪怪的2D面積計算需求,也只需要再新建新的class加以定義即可。你的呼叫端基本上無需進行任何改變。這對於程式的維護有很大的幫助;

可以想像在遊戲中,隨著遊戲時間的增加,多了更多職業可供轉職;但此時,你一定只需要在相同的介面下進行轉職即可…你不需要去擔心會因此在操作上有所不同

而在 C# 中要實做這個,常常會在基本類別使用 virtual 關鍵字,而在衍生類別中使用 override(改寫);並利用基本類別的陣列來存取子類別的參考 (因為實際上子類別因有繼承行為,所以所佔的記憶體空間一定大於基本類別,所以陣列實際上是有紀錄記憶體位址而已,而這一切都是要程式執行時才會發生,所以討論多型時常常會看到”動態”這2個字。

 

….

2014/4/25

[筆記]物件導向-其一

因為是自學程式,所以在學習的過程中,往往一個簡單的範例要想好幾次才想得通

所以覺得有必要將一些學習心得寫下來做個紀錄

在目前主流的程式語言中,可以聽得到物件導向這個名詞

其實「路過」的程式語言愈多,就會覺得很多名詞的發明好像只是為了追求一種流行做為一種標榜,好像什麼多層次搭配,說穿了就是因為身材不夠完美,所以利用視覺上的錯覺來讓外表更符合想要傳達的印象。反過來,只要你的腿夠長,身材夠完美,其實是不太需要類似的技巧,根據你需要的場合來進行決策即可

好比物件導向,我一開始學習的時候也覺得蠻恐怖的;當然,我相信事情如果要深究到完美,一定有很多事情需要注意。但並不是每個人都是資工背景。有時候我只是需要針對一個中型的計量問題進行處理,程式寫得笨一點速度比人家慢了好幾倍,在現在CPU不是很值錢的年代,似乎也不是什麼大問題?? 注意哦,我寫的是中小型的問題,如果是超大型而複雜的問題,光是演算法的學問就可以寫成好幾本論文….

我對於物件的認識如下

(1)為了簡化程式語寫的複雜度

(2)物件導向的要件

   定義一個類別 (class) → 描述物件裡面的變數 → 編寫建議程序 → 編寫方法

我覺得大致上就是如此

例如:你知道想要做一個類別叫做蜘蛛;一定是你的程式中,有需要用到各種類型的蜘蛛是吧?? 然後再針對你需要的物件特性,例如可能是顏色、大小、攻擊力、魔法攻擊力進行定義。然後再看看沒有什麼方法,好比物件攻擊()、魔法攻擊()

(3)使用物件

   物件都是需要宣告後才能使用;就像一般程式語言中,你要使用一個變數也要先告訴電腦,這個變數x是整數,那個變數y是浮點數哦。同樣的,物件也有類似特性;就把自己定義好的類別想像成一種資料型態,你只是在確定需求的狀況下,予以實體化。

   在Fate/stay night的故事中,主角使用的是一種叫做「投影」的魔法技巧。在劇情中只要魔力充足的狀況下,就可以將看過的武器予以無限制的仿製後再利用。我覺得這個和程式語言其實還蠻像的啊,只要你的記憶體與運算資源是充足的,而你又能完美的瞭解到每個仿製對象(類別)的使用方式,並且予以適當的安排,就可以充分達到你要的效果…

    進而達到無限劍製(Unlimited Blade Works)的境界

嗯…果然是個人心得啊

自訂網域名稱

在購入了 Moebigdata.com 網域後,首先就是要將常用的網站給指向過來

設定的概念如下:

你所持有/維護的網站,與所購買的網域供應商往往不是同一家廠商,所以要進行指定。好比你訂了一件新衣服,但賣你衣服的店家,不一定是製造衣服的廠商;所以你要說明清楚你想要的是怎樣的衣服,最簡單的狀況就是同時通知這2個廠商就絕對不會有錯。

你可能會問,一般實務上我不是直接向賣衣服的那家公司說明就好了嗎??但在網路世界,你應該不會想要隨便想要把在A廠商的帳號與密碼告訴B廠商吧…

好在目前的設定都還算是蠻純的,基本上就是進入網域販賣公司的管理介面進行新增設定即可,主要集中在 CNAME(Alias)與A(Host)

所以設定上的邏輯就是,先去查詢你要轉向網域的指導說明,依設定說明進行設定。

 

image

例如 Bogger的設定方式:

在Blogger中啟用自定網域→依Google指定方式自行到Godaddy進行設定(新增2組CNAME與4組A) →打完收工

 

而Azure上托管的網站服務也是一樣的邏輯,只是微軟需要大家大力支持 Azure 的營運,所以免費等級的網站是不能夠自訂網域 (新增1組CNAME與1組A)

 

延申說明:

如何在網誌使用自訂網域名稱?

Configuring a custom domain name for an Azure Web Site-Azure

Live Writer多重帳號切換 bug

微軟推出的Windows Live Writer 應該還是目前地球上最好的Blog寫作軟體

(因為根本沒有其他競爭對手,大家都轉成玩Facebook囉)

也支援多重帳號,但是今日使用發現異常

解法之道:

把程式關掉再重新執行就可以了…