golang基于SentiWordNet词典的情感分析插件gosentiwordnet的使用

Golang基于SentiWordNet词典的情感分析插件gosentiwordnet的使用

介绍

GoSentiwordnet是一个使用SentiWordNet词典进行情感分析的Go语言库。该库可以为每个单词生成情感分数,包括积极、消极和客观分数。

安装

首先需要下载并安装Go 1.14或更高版本。

使用go get命令安装该库:

$ go get github.com/dinopuguh/gosentiwordnet/v2

快速开始

下面是一个基本使用示例:

package main

import (
    "fmt"

    goswn "github.com/dinopuguh/gosentiwordnet/v2"
)

func main() {
    // 创建情感分析器实例
    sa := goswn.New()

    // 获取单词"love"的情感分数
    // 参数:单词, 词性标签, 单词用法(1表示最常用)
    scores, exist := sa.GetSentimentScore("love", "v", "2")
    if exist {
        fmt.Println("💬 Sentiment score:", scores) // => 💬 Sentiment score: {1 0 0}
    }
}

GetSentimentScore方法需要3个参数:

  1. Word: 要处理的单词
  2. POS tag: 单词的词性标签
  3. Word usage: 1表示最常用,数字越大表示使用频率越低

完整示例

下面是一个更完整的示例,展示如何处理多个单词:

package main

import (
    "fmt"

    goswn "github.com/dinopuguh/gosentiwordnet/v2"
)

func main() {
    sa := goswn.New()

    words := []struct {
        word    string
        pos     string
        usage   string
    }{
        {"love", "v", "1"},    // 动词
        {"happy", "a", "1"},   // 形容词
        {"hate", "v", "1"},    // 动词
        {"sad", "a", "1"},     // 形容词
        {"beautiful", "a", "1"},// 形容词
    }

    for _, w := range words {
        scores, exist := sa.GetSentimentScore(w.word, w.pos, w.usage)
        if exist {
            fmt.Printf("单词: %-10s 积极分数: %.2f 消极分数: %.2f 客观分数: %.2f\n",
                w.word, scores.Positive, scores.Negative, scores.Objective)
        } else {
            fmt.Printf("单词: %-10s 未找到情感分数\n", w.word)
        }
    }
}

贡献

如果你想表示感谢和/或支持GoSentiwordnet的积极开发:

  1. 给项目添加GitHub Star
  2. 在Medium、Dev.to或个人博客上撰写评论或教程
  3. 成为我们的赞助商来支持这个项目

贡献者

  • Dino Puguh (初始工作)

欢迎任何拉取请求来开发这个项目。


更多关于golang基于SentiWordNet词典的情感分析插件gosentiwordnet的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于SentiWordNet词典的情感分析插件gosentiwordnet的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用gosentiwordnet进行情感分析

gosentiwordnet是一个基于SentiWordNet词典的Golang情感分析库。SentiWordNet是一个基于WordNet的情感词典,为每个词条分配了正面、负面和中性情感分数。

安装

首先安装gosentiwordnet库:

go get github.com/dinopuguh/gosentiwordnet

基本用法

初始化情感分析器

package main

import (
	"fmt"
	"github.com/dinopuguh/gosentiwordnet"
)

func main() {
	// 初始化情感分析器
	swn := gosentiwordnet.New()

	// 分析单个词的情感
	score := swn.GetScore("happy")
	fmt.Printf("happy: Pos=%.3f, Neg=%.3f, Obj=%.3f\n", 
		score.Positive, score.Negative, score.Objective)
	
	// 分析句子情感
	sentence := "I love this beautiful day but hate the traffic"
	sentenceScore := swn.AnalyzeSentence(sentence)
	fmt.Printf("Sentence: %s\nPos=%.3f, Neg=%.3f, Obj=%.3f\n",
		sentence,
		sentenceScore.Positive,
		sentenceScore.Negative,
		sentenceScore.Objective)
}

输出结果示例

happy: Pos=0.750, Neg=0.000, Obj=0.250
Sentence: I love this beautiful day but hate the traffic
Pos=0.600, Neg=0.300, Obj=0.100

高级功能

1. 自定义词典路径

默认情况下,gosentiwordnet使用内置的SentiWordNet数据。你也可以提供自定义路径:

swn := gosentiwordnet.NewWithPath("/path/to/SentiWordNet.txt")

2. 分析文本情感倾向

func analyzeTextSentiment(text string) string {
	swn := gosentiwordnet.New()
	score := swn.AnalyzeSentence(text)
	
	if score.Positive > score.Negative {
		return "Positive"
	} else if score.Negative > score.Positive {
		return "Negative"
	}
	return "Neutral"
}

func main() {
	text := "This movie was terrible and boring"
	fmt.Println(analyzeTextSentiment(text)) // 输出: Negative
}

3. 批量分析文本

func batchAnalyze(texts []string) []gosentiwordnet.Sentiment {
	swn := gosentiwordnet.New()
	results := make([]gosentiwordnet.Sentiment, len(texts))
	
	for i, text := range texts {
		results[i] = swn.AnalyzeSentence(text)
	}
	
	return results
}

func main() {
	reviews := []string{
		"Excellent product, highly recommended",
		"Poor quality, would not buy again",
		"It's okay, nothing special",
	}
	
	scores := batchAnalyze(reviews)
	for i, score := range scores {
		fmt.Printf("Review %d: Pos=%.2f, Neg=%.2f\n", i+1, score.Positive, score.Negative)
	}
}

性能优化

对于大量文本分析,可以预加载词典:

swn := gosentiwordnet.New()
swn.Preload() // 预加载词典到内存

注意事项

  1. SentiWordNet主要针对英语单词,对非英语文本效果有限
  2. 情感分析结果仅供参考,不能完全依赖
  3. 对于短文本,单个强烈情感词可能主导整个文本的情感倾向
  4. 不支持上下文理解和讽刺检测

完整示例

package main

import (
	"fmt"
	"github.com/dinopuguh/gosentiwordnet"
)

type SentimentResult struct {
	Text      string
	Sentiment string
	Score     gosentiwordnet.Sentiment
}

func analyzeReviews(reviews []string) []SentimentResult {
	swn := gosentiwordnet.New()
	swn.Preload()
	
	results := make([]SentimentResult, len(reviews))
	
	for i, review := range reviews {
		score := swn.AnalyzeSentence(review)
		sentiment := "Neutral"
		
		if score.Positive > score.Negative + 0.1 { // 添加阈值避免微小差异
			sentiment = "Positive"
		} else if score.Negative > score.Positive + 0.1 {
			sentiment = "Negative"
		}
		
		results[i] = SentimentResult{
			Text:      review,
			Sentiment: sentiment,
			Score:     score,
		}
	}
	
	return results
}

func main() {
	productReviews := []string{
		"Absolutely love this product! Works perfectly.",
		"Waste of money. Broke after two days.",
		"It's fine, does what it's supposed to do.",
		"Horrible customer service and bad quality.",
		"Best purchase I've made this year!",
	}
	
	results := analyzeReviews(productReviews)
	
	for _, result := range results {
		fmt.Printf("Review: %s\n", result.Text)
		fmt.Printf("Sentiment: %s (Pos=%.2f, Neg=%.2f)\n\n", 
			result.Sentiment, 
			result.Score.Positive, 
			result.Score.Negative)
	}
}

gosentiwordnet提供了一个简单有效的方法来执行基于词典的情感分析。对于更复杂的需求,可能需要结合机器学习方法或使用更高级的自然语言处理技术。

回到顶部