使用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语言中的init函数特点及用法详解

    Go语言中的init函数特点及用法详解

    在Go语言中,init()函数是一种特殊的函数,用于在程序启动时自动执行一次。它的存在为我们提供了一种机制,可以在程序启动时进行一些必要的初始化操作,为程序的正常运行做好准备,在这篇文章中,我们将详细探讨init()函数的特点、用途和注意事项
    2023-06-06
  • 关于golang中map使用的几点注意事项总结(强烈推荐!)

    关于golang中map使用的几点注意事项总结(强烈推荐!)

    map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用,下面这篇文章主要给大家介绍了关于golang中map使用的几点注意事项,需要的朋友可以参考下
    2023-01-01
  • 使用Go语言实现xmind文件转换为markdown

    使用Go语言实现xmind文件转换为markdown

    这篇文章主要来和大家一起深入探讨如何用Go语言构建一个强大的命令行工具,实现XMind到Markdown的无损转换,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-06-06
  • Golang 性能基准测试(benchmark)详解

    Golang 性能基准测试(benchmark)详解

    Golang性能基准测试可以帮助开发人员比较不同的实现方式对性能的影响,以便优化程序,本文就来讲解一下如何使用Golang的性能基准测试功能,需要的朋友可以参考下
    2023-06-06
  • Go语言之使用pprof工具查找goroutine(协程)泄漏

    Go语言之使用pprof工具查找goroutine(协程)泄漏

    这篇文章主要介绍了Go语言之使用pprof工具查找goroutine(协程)泄漏,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Golang控制协程执行顺序方法详解

    Golang控制协程执行顺序方法详解

    这篇文章主要介绍了Golang控制协程执行顺序的方法,Golang的语法和运行时直接内置了对并发的支持。Golang里的并发指的是能让某个函数独立于其他函数运行的能力
    2022-11-11
  • go zero微服务实战处理每秒上万次的下单请求

    go zero微服务实战处理每秒上万次的下单请求

    这篇文章主要为大家介绍了go zero微服务实战处理每秒上万次的下单请求示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 浅谈go语言renderer包代码分析

    浅谈go语言renderer包代码分析

    本篇文章主要介绍了浅谈go语言renderer包代码分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • golang package time的用法具体详解

    golang package time的用法具体详解

    本篇文章主要介绍了golang package time的用法具体详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Go 结构体、数组、字典和 json 字符串的相互转换方法

    Go 结构体、数组、字典和 json 字符串的相互转换方法

    今天小编就为大家分享一篇Go 结构体、数组、字典和 json 字符串的相互转换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08

最新评论