2021年12月28日 星期二

【Let's Go】GoLang 關於 slice 的一些操作

 跟python比起來~~GoLang真的是比較精簡,重複性的東西幾乎是不太會出現的!

相對python而言,個人覺得GoLang更重視如何提供一個良好的「鍋子」讓「廚師」盡情發揮自身的廚藝及創意。而python則是著重於提供各式各樣的廚具,讓每個人不需具備太多廚藝就可以享受烹飪的樂趣!

針對之前談到的SLICE,在GoLang中不像python的list提供了許多函式可供應用的函式進行操作與應用,如:刪除、查詢、轉換等等~~,這些在GoLang中似乎認為可經由程式設計人員透過自身需求,進行設計即可有效解決,就無需代勞提供相關函式庫,提供最大的彈性空間給設計人員自行思考、設計!

就這觀點而言,自己操作起來~~發現其實:就程式設計的邏輯思維能力訓練而言,GoLang似乎比Python更加適合進行邏輯思維能力的訓練與思考!(純粹個人感受~~😏)

好囉~~~接續上一篇關於slice的相關基本設定,這一篇整理一些關於slice的複製、篩選、替換、排序等相關操作練習紀錄!

好了~~~直接上程式碼🐎時間

package main

import (
	"fmt"
	"sort"
)

func main() {
	//array設定
	var a1 = [5]string{"PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	//slice設定方式
	var s1 = []string{"ASP", "PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	var s2 []string
	s3 := []int{10, 50, 30, 60, 40, 20}

	//GoLang不像python有針對slice刪除等相關函數,而是透過slice的操作功能進行類似刪除的相關操作
	fmt.Println(a1[2:4])
	s4 := make([]string, 3) //創建一個有3組元素的slice
	copy(s4, s1[2:5])
	fmt.Println(s4)
	fmt.Println(s1[:5])
	s2 = append(s1[:2], s1[4:]...) //去除原slice中的"ASP.NET" "JAVA"二個元素
	fmt.Println(s2)

	//SLICE元素排序操作
	fmt.Printf("排序前的s3:%v \n", s3)
	sort.Ints(s3) //整數型slice排序方法
	fmt.Printf("排序後的s3:%v \n", s3)
	fmt.Printf("排序後最大值、最小值:%d、%d \n", s3[len(s3)-1], s3[0])
	sort.Strings(s2) //文字型slice排序方法
	fmt.Printf("string類型的slice也可以排序:%v \n", s2)
	for k, v := range s2 {
		fmt.Printf("slice s2的k,v分別為:%d, %s \n", k, v)
	}
	s2[0] = "java" //元素替換
	fmt.Println(s2)
	//達成s3內每個元素*2的作法
	for k, v := range s3 {
		s3[k] = v * 2
	}
	fmt.Println(s3)

	//應用map函式產生類似字典檔對應表簡易操作示範
    s5 := map[string]int{
		s1[0]: s3[0],
		s1[1]: s3[1],
		s1[2]: s3[2],
		s1[3]: s3[3],
	}
	fmt.Println(s5)
	fmt.Println(s5["ASP"]) //不存在的對應值為0
	fmt.Println(s5["java"])
}

執行結果截圖如下供參:


當然在實際操作及應用上,仍有相關函式可供配合進行相關操作與設計應用,這些應用就留在後續進行相關專案設計時,有機會再做整理、分享了!

好囉~~這次就先到這裡告一段落!!

2021年12月27日 星期一

【Let's Go】認識GoLang中的slice基礎設定

 在Python中,處理數據及資料時,list是個相當實用的工具,也提供許多好用的函式供相關操作與應用!

同樣的,在GoLang的學習中,我也將這部分列為練習的重點之一!

在GoLang中,對於數據及資料組的處理上,有array及slice可供應用,不過在實際處理動態資料及數據時,似乎slice出場的機會會比較高一些!而且二者的操作都還挺相似的,相干操作概念是可以延伸的!所以我就將重點放在slice上了!

好囉~~這次先將一些有關array、slice的基本設定方式及操作,先做一些整理!

後面再針對slice的應用操作另作整理!當然若要實際應用,還是建議自己設計個專案進行實務上的操作,幫助會最大!

package main

import "fmt"

func main() {
	//array設定
	var a1 = [5]string{"PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	//slice設定方式
	var s1 = []string{"ASP", "PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	var s2 []string
	s3 := []int{10, 20, 30, 40, 50}

	fmt.Println(a1[4])
	fmt.Println(len(s1))
	s2 = append(s2, "python", "GoLang")
	s4 := make([]string, 1) //創建一個只有1組元素的slice
	copy(s4, s2)            //因為s4只有一組元素,所以copy過來只會有一組元素
	fmt.Println(s4)
	s4 = append(s2, s1...) //合併二個slice要在後面加上...三個點是解構的意思
	fmt.Println(s4)
	fmt.Println(append(s4, "Go"))
	for _, v := range s3 {
		fmt.Println(v)
	}
}
 
 

上述程式執行結果如下:

這次就先整理到這裡告一段落!!


2021年12月24日 星期五

【Let's Go】GoLang Gin 開喝

 Gin是目前相當受歡迎與推薦的Web Framework。(https://github.com/gin-gonic/gin)


這篇開始試著開喝、玩玩~~紀錄一下學習歷程!

★首先~~先安裝Gin:$ go get -u github.com/gin-gonic/gin 


★★接著當然是試喝看看囉~~~先來個最單純的網站跑起來看看~上網站程式碼🐎囉......


package main

import (
	"github.com/gin-gonic/gin"
)

func hello(c *gin.Context) {
	c.String(200, "歡迎蒞臨GoLang Gin示範網站")
}

func main() {
	s := gin.Default()
	s.GET("/", hello)
	s.Run(":8888") // 設定網站執行埠
}


十來行,一個驚天動地泣鬼神的網站(連Apache戰鬥機都不必出動)就面世了~~讚👍

啟動(run)之後如下:Go Go Go~~~

2021年12月21日 星期二

【Let's Go】Go關於檔案處理的一些基礎操作

 檔案處理通常是我個人在學習語言上,在接觸一些基礎與法之後,會接續關心與練習的應用之一!

這此就先整理一些有關檔案處理及資訊獲取的基本操作!

相關說明都標註在程式碼中了~~就不用再贅述浪費篇幅了!

一樣直接上程式碼🐎吧.............


package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	w := []byte("Hello GoLang!\n我是被寫入的資料內容")

	fw, _ := os.OpenFile("file1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
	//os.O_CREATE|os.O_RDWR|os.O_APPEND → 可創建|可讀寫|接續新增內容(非覆寫模式)
	defer fw.Close()
	fw.Write(w)

	state, _ := fw.Stat() //獲取檔案相關資訊
	fmt.Println("檔案名稱:", state.Name())
	fmt.Println("檔案大小:", state.Size())
	fmt.Println("檔案最後修改時間:", state.ModTime())

	//ioutil.WriteFile("file1.txt", w, 0666)  //這種寫入方式會覆蓋原檔案內容

	f, _ := ioutil.ReadFile("file1.txt")
	fmt.Printf("文字檔案內容:%s", string(f))
}

檔案執行結果:



2021年12月20日 星期一

【Let's Go 爬】用Go爬圖第一步~~爬圖基礎:如何將網路圖片下載

這次依然是將之前python下載圖片的操作,試著使用Go來玩玩看!

不得不說啊~~Go果然是為著網路而生!

從上一篇用Go擷取網路新聞的操作,到這篇的網路圖片下載操作~都讓人感到一陣順心如意啊~~哈!

另外~~透過Go mod的模組管理機制,在編寫程式過程,Go也會自動引入(import)相關的模組~相當smart、便利!

這次依然示範下載google Doodle 網站中的:

https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png

這個圖檔,作為練習範例!

好囉~~~一樣直接上程式碼🐎囉......

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

func main() {
	url := "https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png"

	path := strings.Split(url, "/")
	name := path[len(path)-1]

	out, _ := os.Create(name)
	defer out.Close()

	r, _ := http.Get(url)
	defer r.Body.Close()

	pic, _ := ioutil.ReadAll(r.Body)
	io.Copy(out, bytes.NewReader(pic))
	//out.Write(pic)
	fmt.Printf("檔案:%s下載完成!", name)
}

使用起來算是相當便捷!

解讀一下程式,基本上一樣是透過幾個步驟~~~

1.解析獲取圖檔名:14~15行

2021年12月19日 星期日

【Let's Go】認識GoLang的模組管理go mod

 之前剛接觸Go時,還在大約1.8左右的版本

這次安裝已經來到1.17了👀😅

而GoLang在1.11之後,加入了模組管理功能~~~go.mod

讓Go在管理模組上,方便許多~~也是在開始使用GoLang之前應該要認識的基礎之一!

如果是使用JetBrains GoLand做為開發的IDE的話,基本上~當你開始一個新的專案時,GoLang會自動幫你設定go.mod這個模組管理檔案!

但假如是使用VS Code 等其他的IDE編輯開發工具,可能就需要自行去設定go.mod模組管理功能囉!

起始設定go.mod模組管理方式:「go mod init 資料夾名稱」

------------------------------------

例如:新開了一個專案的資料夾:「hello

則可以使用終端機(命令提示字元)模式,在該目錄下,輸入:go mod init hello

這樣日後當你安裝(get)新的模組時,go.mod就會自動為你紀錄模組的相依性資訊!

【Let's Go 爬】也用 Go 爬爬看~~~使用goquery爬取udn新聞網內容

 之前(一年前了~~我咧)用python的BS4練習了簡單的udn新聞網頁擷取、分析

這次趁著玩GoLang的機會,也想試試看如何用Go來完成同樣的工作。畢竟Go就是為網路而生啊~對於網路應用方面應該是更加得心應手吧!呵~~自己不負責任的胡亂猜想

好了~~不廢話了!

這次呢~~用了goquery這個模組來進行網頁內容的分析,功能就類似python中BS4模組的功能。

正好可以順道介紹一下,在Go裡面安裝模組的方式:

go get 模組名稱

=====================================================

首先:這次要安裝的goquery安裝方式如下:在終端機(命令提示字元)下輸入

go get github.com/PuerkitoBio/goquery


基本上~~goquery的使用,分成以下幾個步驟:

1.取得網頁內容: func NewDocumentFromReader(r io.Reader) (*Document, error)

2.設定查詢條件:func (s *Selection) Find(selector string) *Selection

3.獲取查詢結果:func (s *Selection) Find(selector string) *Selection

4.提取所需的網頁元素:func (s *Selection) Attr(attrName string) (val string, exists bool)

看完上述整理~~只有一個感覺~嗯...程式人的世界真是枯燥且乏味啊!(哩是滴供啥毀啦🤣)😂

好了,還是直接上程式碼🐎............


跟python BS4一樣~大概十幾二十行就可以完工(中間省略了些查核及錯誤處理)

2021年12月17日 星期五

【Let's Go】Go的基本測試與應用~基本輸出、入操作

 這次整理一下,在Go裡面的基本輸出入

基本輸出~~~

fmt.Printf   或是    fmt.Println


基本輸入~~fmt.Scanln

但是Scan的輸出要注意的是:如果輸入內容有空白符號的話,那會被切開~不會是為一個完整的句子或詞彙!

如以下範例~~輸入Wan Chih-Hsiang

但只會抓取呈現~~第一個字Wan

所以~~若是輸出具空白符號的內容時,對於Go來說,是放入二個變數中的!

2021年12月16日 星期四

【Let's Go】GoLang登場系列~~查核Go的安裝及版本

 安裝GoLang的環境其實很單純~~在不考慮其他需求的狀況下,你只要將Go的安裝程式(for Windows環境)下載並一路執行安裝,應該就可以無痛安裝完成!



安裝完成之後,首先當然要先確認你的GoLang環境確實已經可以運作了


如何確認呢~~~

簡單一點,就是:

1.檢核一下你安裝的Go版本!(有安裝完成才能執行Go命令,並看到所安裝的Go版本)

好~~~

那如何進行安裝的Go版本查核呢?

1.打開(進入)「命令提示字元」視窗~~或是所謂的「終端機」模式


2.輸入:go version


如果你的系統安裝Go環境一切正常的話,應該就會顯示你的Go版本資訊如下:


接下來就可以寫個程式世界最受歡迎的開篇小程式~~Hello World試試看囉!

2021年11月25日 星期四

【簡單玩python】~~opencv(cv2)存取中文檔案發生錯誤的解決方案

 opencv是相當強悍、好用的影像、視覺模組,在python玩樂過程中,經常有他出場的機會!







最近在試著練習使用PyQT5結合cv2做個螢幕截圖及簡易標記工具時,遇到了cv2對於中文檔名檔案的存取會發生錯誤的狀況!

這個問題當然可以說:阿~~那就不要使用中文檔名就好了嘛...

但是本著「無事生非」的精神(呵~~程式設計好玩的地方就在這裡),還是要解決這個問困擾啊!

終於~~沒多大困難的尋求了解決方案如下,做個紀錄,給自己也給其他人參考!

一般情形下,我們會透過 cv2.imread(filename) 來讀取檔案,但若是遇到讀取中文檔名時,就會遇到類似的錯誤訊息如下:


解決「讀取中文檔名」的方法,如下圖。

基本上是改用cv2.imdecode() 的方式呼叫,整體修正方式,寫成個小函式,方便隨時呼叫....


這樣,就可以正常呼叫、顯示中文檔案了!

別忘了,要引入numpy喔!

===================================================

至於「存成中文檔名」的操作~~若是使用一般 cv2.imwrite(filename, image) 則會根本沒有反應,令你以為操作是ok的,實際上根本是沒有反應,檔案也未完成寫入。

「存成中文檔名」的解決方式,如下圖。

基本上是改用,cv2.imencode(ext, image)[1].tofile(filename) 的方式執行即可正常操作。



好囉~~cv2處理中文檔案的存取操作就是這樣囉!

沒啥好掰的了~~收工!

2021年9月26日 星期日

Teachable Machine 讓你輕鬆玩機器學習模型

 機器學習(ML)或是大家都喜歡喊的AI(人工智慧),看似高深、技術本位!

但現在已經有愈來愈多可以讓你輕鬆、無負擔的去真實接觸並藉由玩的過程,去認識、體會所謂的機器學習「模型」的訓練(建模)等概念!

Teachable Machine就是這麼一個讓你能輕鬆建立機器學習模型的網站!

網址:https://teachablemachine.withgoogle.com/


它可以讓使用者無負擔的進行「影像」、「聲音」、「動作」的機器學習模型訓練

這次,就先以「影像」來介紹一下這個好用的網站!

一、進入網站後,先選擇要訓練的類型,這裡我們選擇「圖片專案」


二、進入後就是設定訓練的頁面,基本上就是將要訓練的圖片分類設定好~例如:「口罩」、「眼鏡」等,並透過「攝影機」或是「上傳圖片」的方式將該分類的圖片提供給系統以便進行後續的機器學習模型訓練之用。




2021年5月10日 星期一

【python抓爬仔】~~簡單抓取政府公開資料(新北市UBike即時資訊)來玩玩

 玩抓取資料可以很技術,也可以很生活啊!

現今愈來愈多的政府及機關公開資料可供民眾及系統設計應用,很多都是與民生相關的實用資訊!而且相關資料內容也益加完善,對於有設計及應用需求的人們真是個福音啊!

使用上也相當簡便,這次就以「新北市公共自行車租賃系統(YouBike)」的公開資料為操作範例,來練習玩玩如何簡便的獲取ubike的資時資訊並加以操作。

有關新北市的相關公開資料可以到以下位置查閱!

https://data.ntpc.gov.tw/


https://data.ntpc.gov.tw/openapi/swagger-ui/index.html?configUrl=%2Fopenapi%2Fswagger%2Fconfig&urls.primaryName=%E6%96%B0%E5%8C%97%E5%B8%82%E6%94%BF%E5%BA%9C%E4%BA%A4%E9%80%9A%E5%B1%80(28)


這次的操作練習主要目標是了解如何擷取網路上的公開資料回來加以整理、篩選出自己想要的資訊,並未多加著墨在其他的應用或呈現方式。

好囉~~一樣直接上程式碼吧.......

import requests

# 設定新北市UBike公開資料連結位置(取用json格式資料)
# 設定擷取資料筆數為700筆(目前新北市共有654個站點),若未設定size則每次預設只截取前30筆站點資料
url = 'https://data.ntpc.gov.tw/api/datasets/71Cxxxxx-A2DF-xxxxx-BEF1-xxxxx5E8A/json?size=700'
r = requests.get(url)
data = r.json()


def transform_format(mday):  # 寫個轉換日期顯示格式小函式
    Y, M, D, h, m, s = mday[:4], mday[4:6], mday[6:8], mday[8:10], mday[10:12], mday[12:14]
    return Y + '/' + M + '/' + D + ' ' + h + ':' + m + ':' + s


print('擷取的資料筆數:',len(data))

ui = 0
for u in range(len(data)):  # 逐筆讀取json資料
    if data[u]['sarea'] == '土城區':    # 判斷是否為「土城區」,屬於土城區的資料才呈現
        ui += 1
        data[u]['mday'] = transform_format(data[u]['mday'])  # 轉化「資料更新時間」顯示格式
        print(data[u])

print("「土城區」共有:",ui,"筆資料!")


程式執行結果截圖如下供參:

2021年5月9日 星期日

【簡單玩python】~~整理python中有關檔案(File)的一些常用操作

 有關檔案(目錄)的操作,在程式設計中是常見的需求。

除了對檔案的存取、寫入等相關操作外,對於檔案的查詢、目錄(資料夾)的管理、操作也是重要的議題

這次就來整理一下,python中對於檔案及資料夾的一些重要操作,方便自己日後複習及應用。

好囉~~一樣直接上程式碼!相關語法及功能,可以參考程式碼中的註記。

import os
import time

print(os.getcwd())  # 獲取當前作用(執行)的目錄路徑

if os.path.exists('mkdir_test'):
    print("資料夾已存在,無須建立!")
else:
    os.mkdir('mkdir_test')     # 在當前目錄中建立新資料夾(若目錄已經存在則會出錯)

os.chdir('mkdir_test')  # 切換至指定的資料夾
print(os.getcwd())
os.chdir('../')  # 切換至指定的資料夾
print(os.getcwd())

# os.listdir()將指定目錄(若未指定則為當前作用中之目錄)中的物件都列出
print("資料夾中共有:", len(os.listdir()),"物件")

for f in os.listdir():
    if os.path.isfile(f):   # 檢查是否為檔案
        f_name, f_ext = os.path.splitext(f)  # 將檔案名稱資訊切割檔名及副檔名(類型)
        f_size = os.path.getsize(f)     # 取得檔案大小資訊
        f_time = time.ctime(os.path.getctime(f))
        print("檔名:", f_name, "| 檔案類型:", f_ext[1:], " | 檔案大小:", f_size, "Bytes | 檔案建立時間:", f_time)

# 檔案開啟模式參考網址:https://docs.python.org/zh-tw/3.6/library/functions.html#open
f = open("test1.txt", "a+", encoding='utf-8')  # 若無該檔案會建立,若有則會開啟並可在檔案末尾加上新的內容
str = "\n" + "Hello,歡迎進入Python世界"
fw = f.write(str)
print("本次寫入", fw, "個字元")
f.close()

f1 = open("test1.txt", "r+", encoding='utf-8')  # 讀取並開啟檔案,可在檔案末尾加上新的內容
print(f1.read())
f1.close()

有興趣及相關需求的朋友可以自行操作、執行,會更加了解相關的運作結果喔!

執行結果,部分截圖供參:



2021年1月24日 星期日

【python抓爬仔】~~小試pandas模組~用pandas簡單完成擷取台銀牌告匯率資料

 之前介紹過:[python抓爬仔]~~輕鬆擷取「台灣銀行即時匯率資料」

使用「twder」這支lib就可以輕鬆抓取台銀的即時牌告匯率資訊。

但這件事情到底是怎麼完成的呢??? 

這次~~練習、利用python中pandas這之強悍的套件,來練習一下自行抓取、分析台銀牌告匯率資料的方式,順道瞭解pandas的相關應用!

首先~~簡單認識一下:「pandas」是 Python 進行資料處理和資料分析一個好用的工具

有興趣可以到這裡去深入認識「pandas」

話說「pandas」有多強悍呢~~光是他的說明文件就有3000多頁....天啊~是要害死誰啊


好~~所以囉,別期望一次就把pandas掌握住...

這次我們主要透過抓取台銀網站中的牌告匯率資料,先玩一下已下的相關操作:

1.用pandas抓取網頁中的表格資料

2.使用pandas格式化抓取的表格資料

3.使用pandas將資料儲存至excel檔案

====================================================

好~~從哪著手起呢??

預備動作~當然先確認你已經裝好pandas這支套件囉

動作:pip install pandas  (應該很熟悉了吧~有裝過pandas會告訴你,沒裝過會幫你安裝pandas)

接著~~

1.先確認去哪裡抓取「台銀的牌告匯率資料」,別跑錯地方了~~~:

https://rate.bot.com.tw/xrt?Lang=zh-TW


2.查看一下,在台銀的網站中,牌告匯率表格是該網頁中第幾個「表格」!這個資訊,有助於等一下在設計程式時,指定(告知)pandas要抓取的資料位置(重要喔)。查看該網頁,我們初步確認「牌告匯率」資料位於該網頁中「第一組」表格的位置。

有了相關上述相關資訊後,就可以開始上程式碼了~~~很簡短的,別擔心

import pandas

# 指定pandas要抓取資料的網址
pds = pandas.read_html("https://rate.bot.com.tw/xrt?Lang=zh-TW")
table = pds[0]      # 解析抓取資料中「第一組」表格資料存放至變數中
table = table.iloc[:, 0:5]      # 重設要使用的表格資料
# table.iloc[:, 0:5]~表示要取用[前四個欄位]的[所有資料]

# table.columns~設定表格的欄位名稱
table.columns = ['幣別', '現金買入', '現金賣出', '即期買入', '即期賣出']
# 將表格中的幣別,以正則表達式(regular expression)重設只讀取中文幣別名稱
table['幣別'] = table['幣別'].str.extract('(\w+)')

# 完工~~列印抓取到的牌告匯率表格化資料
print(table)

# 將上述格式化的表格資料儲存成excel格式檔案
table.to_excel('twder.xlsx')

基本上~~就是這麼簡單、扼要就完成了資料抓取、表格化等相關工作!

【簡單玩python】~~使用 jieba 中文斷詞系統,輕鬆進行文章詞語分析

 假如今天你想要對一段文句或是文章內容進行中文詞語的分析與統計,做出類似「文字雲」的效果,要怎麼做呢?

個人簡略分析如下:

1.首先將文字(章)內容抓取下來

2.分析(分解)其中的詞語

3.統計每個詞語的使用頻率

然後...........思考如何美美的呈現囉

這其中最重要的核心關鍵,就在於如何進行詞語的分析工作,當然這也是分析自然語言的基礎啦~~不過目前先不管博大精深的這塊啦!

好~~所以這次我們就要來練習一下:中文的詞語分析及使用頻率統計

使用python要完成以上目標,有多簡單、便捷呢~~底下就紀錄、分享供參囉!

要完成這次的中文分詞(斷詞)工作,我們可以使用這組強大的中文斷詞工具:jieba(結巴?)

同樣的~~我們先上完整程式碼,再做說明吧!

編輯前,記得先將「jieba」安裝起來:pip install jieba

# 使用 jieba 中文分詞程式
import jieba

# jieba.load_userdict('userdict.txt')   # 可視需要引入自定義詞語庫
text = "Ubuntu是以桌面應用為主的Linux發行版," \
       "相當受到Linux使用者歡迎!" \
       "PyCharm是相當容易上手且功能強大、" \
       "實用的python IDE工具,可安裝在各種主要作業系統平台" \
       "在Ubuntu上也可以在軟體庫中找到免費的PyCharm CE 跟 EDU版本,供下載安裝!" \
       "安裝Ubuntu最新的LTS版本:20.04版後," \
       "即會預設安裝、更新至Python3.8的開發環境,相當方便!" \
       "但一切安裝完成後,便會發現在Ubuntu下" \
       "執行PyCharm編輯python程式時,會發現以下「怪怪」的情形"

w_dic = {}

words = jieba.cut(text)   # 呼叫jieba函式進行斷詞作業

### 逐詞建立 字詞:使用次數 字典檔
for w in words:
    if w not in w_dic:   # 若未出現過的字詞則建立新的字詞並設定使用次數為1
        w_dic[w] = 1
    else:
        w_dic[w] += 1

### 將大於二個字元的字詞及使用次數顯示出來查閱
for w in w_dic:
    if len(w) >= 2:
        print(w, w_dic[w])

程式說明部分,大部分在程式碼中都有做備註說明了!!所以也不用囉嗦佔篇幅~~~

執行結果如下:

以下只針對比較特殊的部分做一些心得分享:

1.由於jieba是由大陸團隊建置的,所以部分詞語可能會不夠精準,若想要(或避免)詞語上的誤判,可以將一些重要或常用的詞語建立在自定義的詞語庫檔案(如:userdict.txt)[記得該檔案須以utf-8編碼儲存]。引用自定義詞語庫方式,如程式碼第四行!(記得去除標記的 # 號喔)

2021年1月20日 星期三

解決Ubuntu下PyCharm無法正常輸入中文的困境

Ubuntu是以桌面應用為主的Linux發行版,相當受到Linux使用者歡迎!

PyCharm是相當容易上手且功能強大、實用的python IDE工具,可安裝在各種主要作業系統平台,在Ubuntu上也可以在軟體庫中找到免費的PyCharm CE 跟 EDU版本,供下載安裝!

安裝Ubuntu最新的LTS版本:20.04版後,即會預設安裝、更新至Python3.8的開發環境,相當方便!

但一切安裝完成後,便會發現在Ubuntu下執行PyCharm編輯python程式時,會發現以下「怪怪」的情形:

1.Ubuntu下「新酷音」的中、英文切換(shift鍵)功能失效

2.中文輸入產生錯亂~~無法正常運作

由於僅發生在PyCharm情形,在其他應用程式中,中文輸入及操作正常!所以可以判斷為是PyCharm的相關設定問題。

查了一些網路上的資訊,各有說法~~一番操作之下,將自己覺得最單純、便捷的方法,紀錄、分享一下,供有興趣、需要的朋友參考囉!

先總結一下:就是去選用、更新PyCharm的「JetBrains Runtime」。

具體的作法及步驟如下:

預備動作:先去下載適用的「JetBrains Runtime(JBR)」檔案:

到下載網址:https://confluence.jetbrains.com/pages/viewpage.action?pageId=173178989

下載適用系統版本的JBRSDK檔,下載下來的是.gz的壓縮檔,無須先行解壓縮


以下皆為PyCharm中的操作及設定:

1.安裝「choose runtime」的plugin:

點選「File」→「Settings...」


進入Piugins頁面,在搜尋框中輸入:choose runtime找到該plugin點選「install」安裝完成後,「ok」退出設定頁面。


2.呼叫「Choose Runtime」選用、並安裝之前下載的JBRSDK壓縮檔:

2021年1月17日 星期日

[python抓爬仔]~~如何一次把整個月份的Google Doodle(Google塗鴉)全部抓取下來

 Google塗鴉(英語:Google Doodle)是Google為慶祝節日、紀念日、成就以及紀念傑出人物等而對Google首頁商標的一種特殊的臨時變更。

這些Google Doodle的設計通常都很吸引人,也相當有創意~很值得收藏細細品嘗啊!

這次,延續之前談的【簡單玩python】~~如何下載指定的網路圖片(資料),進一步結合對Google Doodle網站的分析,來實作如何一次將整個月份的Google Doodle圖檔全部下載下來!

通常要實作這類抓取網站資料的操作,都必須要先「分析」一下,該網站是怎麼將資料(圖檔)傳送到你的瀏覽器讓你看到相關的資訊!

由於每個網站的設計不盡相同,對於資訊的提供方式(或隱藏方式)也都各異,所以很難講說有甚麼一套標準方式,所以也只能且戰且走~~碰碰運氣了啦~~哈!(💪不知道就承認啦~還掰!)

以Google Doodle的展示頁面來看,可以依下列步驟分析:

1.從「Google首頁」點選「好手氣」進入

2.進入前(或進入後點選「重新整理」),開啟進入「開發人員工具」頁面

3.而後點選進入「Network→XHR」頁面,可以觀察到Google Doodle頁面是以json模式,按月份分別將Google Doodle圖檔資訊傳送。


4.傳送資訊的網址就是類似下列的型式(以2020/12月份,繁體中文資料為例):

https://www.google.com/doodles/json/2020/12?hl=zh_TW

而提供的json格式及內容,也可以在「preview」頁面中加以察看


5.其中對我們這次想要處理的:下載Google Doodle圖檔的操作而言,最重要的就是圖檔網址:「url」這個資料了!

【簡單玩python】~~如何下載指定的網路圖片(資料)

 網路資料擷取中,如何大量或抓取網頁(站)中的圖片,是網路資料擷取常被應用的區塊之一。

而要如何「爬取」網站中的圖檔,這部分涉及到:

1.如何解析網站內容,抓取網戰中的圖檔資訊,這部分涉及到網站的讀取及解析工作。

2.解析出網站中的圖檔資訊後,即可以網站圖檔的url進行圖檔的抓取(下載、儲存)

這次呢~~我們依然先從分解動作中,比較單純的網路圖檔的下載及儲存(也就是上述的第2階段)下手!

瞭解了網路圖檔如何下載儲存後,後面再來介紹如何爬取、解析網站中的圖檔資訊(例如:解析google Doodle的歷史圖檔),二者結合起來之後~~就可以驅動程式去自動抓取指定網站中的所有圖檔了!

好~~這次主要就是針對如何將網路資料(本次以下載圖檔為例)下載到本地端為操作目標。

主要的工具就是python中 urllib.request 的 urlretrieve() 函數

有關  urllib.request 的 urlretrieve() 函數  的詳細說明,可以參考以下網站資料:

https://docs.python.org/3/library/urllib.request.html#module-urllib.request

我們這次就是使用 urllib.request 的 urlretrieve() 函數 來下載、儲存指定的網路圖檔,並使用OpenCV來讀取並顯示下載後的圖檔,作為整個操作的設計目標。

這次示範預設要下載的圖檔是google Doodle 網站中的:

https://www.google.com/doodles/first-day-of-school-2021-january-04

圖檔位址:

https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png

好囉~~~上程式碼囉:

# 抓取指定網路圖片的方法
from urllib.request import urlretrieve
import cv2

# 網路圖片url
img_url = 'https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png'
fpath = "imgs/"+img_url.split("/")[-1]      # 設定儲存位置並以網路圖檔名稱為儲存檔名
urlretrieve(img_url, fpath)     # 將遠端(網路)資料下載到本地

r_img = cv2.imread(fpath)   # cv2讀取下載的圖檔
cv2.imshow("Net ImageUrl", r_img)   # 以cv2呈現讀取的圖檔

cv2.waitKey(0)
cv2.destroyAllWindows()

程式執行後,就可以看到呈現下載的圖檔視窗,並在指定的路徑中看到下載的圖檔囉!

2021年1月14日 星期四

【簡單玩python】~~使用「dlib」讓python簡單、快速完成人臉辨識

 人臉辨識一直是號稱AI應用的熱門(入門)議題~~尤其是幾年前微軟的用照片辨識年紀的推波助瀾下,大家更是樂此不疲~~呵!

既然如此~~那就也玩玩看如何用python來達成人臉辨識及標記的目標吧!

其實這塊之前就結合OpenCV跟dlib這組套件,並串接雲端微軟的年齡、情緒辨識技術,一起玩過整套的~~不過之前沒有記錄下來,時間久了~~也容易忘掉,所以,這次就納入自己整理、分享的議題之一!只是一開始,還是一樣~~先拆解從簡單的應用入手介紹,後續再依序加入其他整合性的應用!

要達成人臉辨識的目標,我們可以借助「dlib」這支相當成熟、易用的套件,結合OpenCV來著手設計!

首先在Windows系統上,要安裝「dlib」套件時,為避免缺乏CMAKE導致安裝失敗的窘境,建議安裝時直接指定「dlib」套件版本

安裝「dlib」:pip install dlib==19.8.1(個人在win10上可正常安裝無誤)

當然別忘了安裝OpenCV這支影像視覺處理的強大套件:

pip install opencv-python

安裝完成後,就可以開始進行程式設計的部分了~~~

好囉~~又到了直接上程式碼的步驟了:

import dlib
import cv2

# 讀取照片檔
img = cv2.imread('imgs/faceo8.jpg')

# 呼叫 dlib 人臉偵測器
fd = dlib.get_frontal_face_detector()

# 偵測圖檔上的人臉資訊
fs = fd(img, 0)
print(f"偵測到{len(fs)}組人臉資訊")

# 將偵測結果以序列方式取出
for i, f in enumerate(fs):
    x1 = f.left()
    y1 = f.top()
    x2 = f.right()
    y2 = f.bottom()

    # 以上列四點數據,繪製人臉區域綠色矩形框
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

# 顯示結果
cv2.imshow("Face", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

相關程式碼的說明,都標註在其中了!

所以也就不必再贅敘了~~~

執行程式結果如下:

其中最重要的當然就是:第8行~呼叫dlib的人臉偵測函式的部分囉!

fd = dlib.get_frontal_face_detector()

好囉~~這次人臉偵測標示的紀錄就到這告一段落了!

dlib還有個相當強悍的人臉68個特徵偵測標示的訓練模型可供應用,後續再紀錄、分享上來囉!