使用Go语言实现一个简单的词频分析系统

 更新时间:2025年09月22日 10:18:37   作者:程序员爱钓鱼  
在数据分析和文本挖掘中,词频统计(Word Frequency Analysis) 是最基础也是最常用的技术之一,本文将带你用 Go 语言实现一个简易的 词频分析系统,感兴趣的小伙伴可以了解下

在数据分析和文本挖掘中,词频统计(Word Frequency Analysis) 是最基础也是最常用的技术之一。无论是做搜索引擎、舆情分析,还是文章关键词提取,词频分析都扮演着重要角色。本文将带你用 Go 语言实现一个简易的 词频分析系统,支持读取文件并统计词频,最终输出结果。

一、项目目标

从文本文件中读取内容。

对文本进行分词(简单处理空格、标点)。

统计每个单词的出现次数。

输出词频最高的前 N 个词。

二、核心技术点

文件读取:使用 osbufio 处理文件输入。

字符串处理:用 strings 包清洗数据。

map 统计:用哈希表存储词频。

排序:对统计结果排序,输出高频词。

三、代码实现

package main

import (
	"bufio"
	"fmt"
	"os"
	"regexp"
	"sort"
	"strings"
)

// 词频结果结构体
type WordCount struct {
	Word  string
	Count int
}

// 统计词频函数
func countWordFrequency(text string) map[string]int {
	// 正则去掉标点符号,只保留字母和空格
	reg := regexp.MustCompile(`[^a-zA-Z\s]+`)
	cleanText := reg.ReplaceAllString(text, "")

	// 全部转小写,避免大小写重复
	cleanText = strings.ToLower(cleanText)

	// 按空格分割单词
	words := strings.Fields(cleanText)

	// 使用 map 统计词频
	wordFreq := make(map[string]int)
	for _, word := range words {
		wordFreq[word]++
	}
	return wordFreq
}

func main() {
	// 打开文件
	file, err := os.Open("sample.txt")
	if err != nil {
		fmt.Println("打开文件失败:", err)
		return
	}
	defer file.Close()

	// 逐行读取文件
	var content strings.Builder
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		content.WriteString(scanner.Text())
		content.WriteString(" ")
	}

	// 统计词频
	wordFreq := countWordFrequency(content.String())

	// 转换为切片,方便排序
	var wcList []WordCount
	for word, count := range wordFreq {
		wcList = append(wcList, WordCount{word, count})
	}

	// 按词频排序(降序)
	sort.Slice(wcList, func(i, j int) bool {
		return wcList[i].Count > wcList[j].Count
	})

	// 输出前10个高频词
	fmt.Println("词频最高的前10个单词:")
	for i, wc := range wcList {
		if i >= 10 {
			break
		}
		fmt.Printf("%s: %d\n", wc.Word, wc.Count)
	}
}

四、运行效果

假设 sample.txt 内容如下:

Go is an open source programming language.
Go makes it easy to build simple, reliable, and efficient software.

运行结果:

词频最高的前10个单词:
go: 2
is: 1
an: 1
open: 1
source: 1
programming: 1
language: 1
makes: 1
it: 1
easy: 1

五、功能扩展

支持中文分词:结合 gojieba 库进行中文文本的分词统计。

命令行工具:支持用户通过命令行输入文件路径和输出前 N 个结果。

Web API 接口:将词频统计结果以 JSON 格式返回,便于前端展示。

可视化:将结果导出到 CSV,再用 ECharts 或 Excel 绘制词云图。

六、总结

本文实现了一个基础的 词频分析系统,涵盖了文件读取、字符串清洗、词频统计和排序等常见技能点。在实战项目中,你可以进一步扩展为 Web 服务、支持多语言、甚至接入大数据处理框架。

到此这篇关于使用Go语言实现一个简单的词频分析系统的文章就介绍到这了,更多相关Go词频分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解Go项目标准目录布局

    深入了解Go项目标准目录布局

    本文主要介绍了Go项目标准目录布局,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 数据竞争和内存重分配Golang slice并发不安全问题解决

    数据竞争和内存重分配Golang slice并发不安全问题解决

    这篇文章主要为大家介绍了数据竞争和内存重分配Golang slice并发不安全问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言并发定时任务之从Sleep到Context的8种写法全解析

    Go语言并发定时任务之从Sleep到Context的8种写法全解析

    这篇文章主要为大家详细介绍了Go语言并发定时任务之从Sleep到Context的8种写法的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-08-08
  • go交叉编译sqlite报错问题解决分析

    go交叉编译sqlite报错问题解决分析

    这篇文章主要为大家介绍了go交叉编译sqlite报错问题解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 向Rust学习Go考虑简单字符串插值特性示例解析

    向Rust学习Go考虑简单字符串插值特性示例解析

    这篇文章主要为大家介绍了向Rust学习Go考虑简单字符串插值特性示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Golang安全读写共享变量的方式详解

    Golang安全读写共享变量的方式详解

    互斥锁(Mutex)是一种常用的同步原语,用于防止多个协程同时访问共享资源,这篇文章主要介绍了Golang安全读写共享变量的方式,需要的朋友可以参考下
    2024-05-05
  • Golang使用MinIO的方案详解

    Golang使用MinIO的方案详解

    这篇文章主要介绍了Golang使用MinIO的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Go语言中的sync包同步原语最新详解

    Go语言中的sync包同步原语最新详解

    Go语言在sync包中提供了一套多才多艺的同步机制,以及用于管理对共享资源的并发访问的原子操作,了解这些工具并为您的并发需求选择合适的工具是编写高效可靠的并发Go程序的关键,这篇文章主要介绍了Go语言中的`sync`包同步原语,需要的朋友可以参考下
    2023-12-12
  • 浅析在Go语言中如何实现协程池

    浅析在Go语言中如何实现协程池

    gammazero/workerpool 就是用来实现协程池的 Go 包,本文我们将一起来学习一下其使用方法,并深入其源码来探究下如何实现一个 Go 协程池,需要的可以了解下
    2025-06-06
  • Go高级特性探究之对象比较详解

    Go高级特性探究之对象比较详解

    在go语言中,要比较两个对象是否完全相同,我们可以使用三种方法,这篇文章主要为大家介绍了这三种方法的具体实现,需要的可以参考一下
    2023-06-06

最新评论