Go语言实战案例-项目实战篇:实现一个词频分析系统

310 阅读2分钟

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


一、项目目标

  1. 从文本文件中读取内容。
  2. 对文本进行分词(简单处理空格、标点)。
  3. 统计每个单词的出现次数。
  4. 输出词频最高的前 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

五、功能扩展

  1. 支持中文分词:结合 gojieba 库进行中文文本的分词统计。
  2. 命令行工具:支持用户通过命令行输入文件路径和输出前 N 个结果。
  3. Web API 接口:将词频统计结果以 JSON 格式返回,便于前端展示。
  4. 可视化:将结果导出到 CSV,再用 ECharts 或 Excel 绘制词云图。

六、总结

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