首頁 >後端開發 >Golang >使用Gin框架實現文本分析與情緒分析功能

使用Gin框架實現文本分析與情緒分析功能

王林
王林原創
2023-06-23 11:47:591307瀏覽

近年來,隨著社群媒體的普及和行動網路的發展,人們在網路平台上分享和發布的文章和評論數量呈現爆炸式增長,這些文字不僅涉及各種主題,同時也包含了豐富的情感色彩。

對於企業和個人來說​​,了解大眾對其品牌、產品和服務的態度和情感,是非常重要的。因此,實現文本分析和情緒分析功能的需求日益增加。在這篇文章中,我們將介紹如何使用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

三、 實作文字分析功能

在實現情緒分析之前,我們需要先實現一些基本的文本分析功能。

  1. 分詞

對於一段文字來說,我們需要將其分解成一個個單獨的詞語,這個過程就叫做分詞。在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
}
  1. 統計詞頻

#在分詞之後,我們需要統計每個字在文字中出現的次數,這個過程叫做統計詞頻。以下是一個簡單的程式碼範例:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn