近年來,隨著社群媒體的普及和行動網路的發展,人們在網路平台上分享和發布的文章和評論數量呈現爆炸式增長,這些文字不僅涉及各種主題,同時也包含了豐富的情感色彩。
對於企業和個人來說,了解大眾對其品牌、產品和服務的態度和情感,是非常重要的。因此,實現文本分析和情緒分析功能的需求日益增加。在這篇文章中,我們將介紹如何使用Gin框架實現文字分析和情緒分析功能。
一、 Gin框架簡介
Gin框架是一款使用Go語言編寫的Web框架,它透過使用高效能的記憶體重複使用來實現高效能的API服務。 Gin是基於Martini框架的想法設計的,但是它擁有更好的性能和更好的API,可以用於構建中小型Web應用程序,同時也非常適用於構建RESTful API服務。
二、 安裝Gin框架
在開始之前,我們需要安裝Gin框架和相關的依賴函式庫。在安裝之前,您需要先安裝Golang開發環境。在您的終端機中輸入以下指令來安裝Gin框架:
go get -u github.com/gin-gonic/gin
此外,我們還需要安裝以下兩個依賴函式庫:
go get -u gopkg.in/yaml.v2 go get -u github.com/cdipaolo/sentiment
三、 實作文字分析功能
在實現情緒分析之前,我們需要先實現一些基本的文本分析功能。
對於一段文字來說,我們需要將其分解成一個個單獨的詞語,這個過程就叫做分詞。在Go語言中,我們可以使用第三方函式庫github.com/blevesearch/go-porterstemmer來實現這個功能。以下是一個簡單的程式碼範例:
import ( "github.com/blevesearch/go-porterstemmer" "strings" ) func Tokenize(text string) []string { // Remove unnecessary characters text = strings.ReplaceAll(text, ".", "") text = strings.ReplaceAll(text, ",", "") text = strings.ReplaceAll(text, "!", "") text = strings.ReplaceAll(text, "?", "") text = strings.ToLower(text) // Split text into words words := strings.Fields(text) // Stem words using Porter Stemmer algorithm for i, w := range words { words[i] = porterstemmer.Stem(w) } return words }
#在分詞之後,我們需要統計每個字在文字中出現的次數,這個過程叫做統計詞頻。以下是一個簡單的程式碼範例:
func CalculateTermFrequency(words []string) map[string]int { frequency := make(map[string]int) for _, w := range words { _, exists := frequency[w] if exists { frequency[w]++ } else { frequency[w] = 1 } } return frequency }
四、 實作情緒分析功能
在實作情緒分析功能之前,我們需要建立一個情緒詞庫,用於儲存有情緒色彩的單字和它們的情感權值。在這裡,我們使用情緒詞典檔案AFINN-165.txt。以下是該文件的一部分內容:
abandons -2 abducted -2 abduction -2 abductions -2 abhor -3 abhorred -3 abhorrent -3 abhorring -3 abhors -3 abilities 2 ...
我們可以使用以下程式碼來讀取情緒詞典文件,並將其儲存到一個map中:
import ( "bufio" "os" "strconv" "strings" ) func LoadSentimentWords(filename string) (map[string]int, error) { f, err := os.Open(filename) if err != nil { return nil, err } defer f.Close() sentiments := make(map[string]int) scanner := bufio.NewScanner(f) for scanner.Scan() { splitted := strings.Split(scanner.Text(), " ") word := splitted[0] value, err := strconv.Atoi(splitted[1]) if err != nil { continue } sentiments[word] = value } return sentiments, nil }
讀取情緒詞典檔案之後,我們可以使用下面的程式碼來計算一個文字的情緒分數:
import ( "github.com/cdipaolo/sentiment" "github.com/ryangxx/go-sentiment-analysis/text" ) func CalculateSentimentScore(text string, sentiments map[string]int) (float64, error) { words := text.Tokenize(text) wordCount := len(words) score := 0 for _, w := range words { value, exists := sentiments[w] if exists { score += value } } return float64(score) / float64(wordCount), nil }
以上程式碼使用了第三方函式庫github.com/cdipaolo/sentiment來進行情緒分析。這個庫是一個基於NLTK的Python庫VADER的一個Go語言實現,它可以直接計算一個文本的情感得分。
五、 建構API服務
我們已經成功地實現了文字分析和情緒分析功能。現在,我們需要將這些功能整合到一個RESTful API服務中。
以下是我們的目錄結構:
- main.go - config/ - config.yaml - internal/ - analyzer/ - analyzer.go - handler/ - handler.go - model/ - sentiment.go
config/config.yaml檔案用於儲存設定訊息,例如情緒詞庫的檔案路徑。以下是一個範例設定檔:
analyzer: sentimentFile: "data/AFINN-165.txt" tokenizing: remove: - "." - "," - "!" - "?" toLowercase: true
analyzer/analyzer.go檔案是我們的主要分析程式。它包含了對於分詞和情感計算的所有功能。 handler/handler.go檔案包含了我們的API處理程序。最後,我們在model/sentiment.go檔案中定義了一個Sentiment結構體,用於作為API回應的回傳類型。
以下是主要程式碼:
package main import ( "github.com/gin-gonic/gin" "github.com/ryangxx/go-sentiment-analysis/analyzer" "github.com/ryangxx/go-sentiment-analysis/handler" ) func main() { router := gin.Default() sentimentAnalyzer := analyzer.NewSentimentAnalyzer() sentimentHandler := handler.NewSentimentHandler(sentimentAnalyzer) router.GET("/analysis", sentimentHandler.GetSentimentAnalysis) router.Run(":8080") }
六、 API測試
現在,我們已經完成了我們的API服務。我們可以使用curl命令或postman來測試它。
以下是一個curl指令的範例:
curl --location --request GET 'http://localhost:8080/analysis?text=I%20love%20Golang'
這個API將回傳一個JSON物件:
{ "message": "OK", "sentiment": { "score": 0.6 } }
在這個JSON物件中,score是情緒分數。它的值範圍從-1到1,其中-1表示完全負面,0表示中性,1表示完全正面。
七、 結論
在本文中,我們介紹如何使用Gin框架來建立文字分析和情緒分析的API服務。我們使用Go語言開發了一個情緒分析器,它可以讀取一個情感詞庫,並計算一個文本的情感得分。我們也展示如何使用Gin框架將這個情緒分析器建構成一個RESTful API服務。
值得指出的是,雖然我們在這篇文章中使用的是AFINN-165.txt情緒字典,但這並不是唯一的選擇。在現實世界中,有多種情感詞典可供選擇,每種情感詞典都有其優缺點。因此,在實際應用中,我們需要選擇最適合我們需求的情緒字典。
總的來說,基於Gin框架構建的文本分析和情感分析API服務是非常有效和實用的,可以幫助我們更好地了解大眾對我們品牌、產品和服務的態度和情感。
以上是使用Gin框架實現文本分析與情緒分析功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!