Go语言实战案例-项目实战篇:实现一个词频分析系统
在数据分析和文本挖掘中,词频统计(Word Frequency Analysis) 是最基础也是最常用的技术之一。无论是做搜索引擎、舆情分析,还是文章关键词提取,词频分析都扮演着重要角色。本文将带你用 Go 语言实现一个简易的 词频分析系统,支持读取文件并统计词频,最终输出结果。
一、项目目标
- 1. 从文本文件中读取内容。
- 2. 对文本进行分词(简单处理空格、标点)。
- 3. 统计每个单词的出现次数。
- 4. 输出词频最高的前 N 个词。
二、核心技术点
- • 文件读取:使用
os
和bufio
处理文件输入。 - • 字符串处理:用
strings
包清洗数据。 - • map 统计:用哈希表存储词频。
- • 排序:对统计结果排序,输出高频词。
三、代码实现
package mainimport ("bufio""fmt""os""regexp""sort""strings"
)// 词频结果结构体
type WordCount struct {Word stringCount 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.Builderscanner := bufio.NewScanner(file)for scanner.Scan() {content.WriteString(scanner.Text())content.WriteString(" ")}// 统计词频wordFreq := countWordFrequency(content.String())// 转换为切片,方便排序var wcList []WordCountfor 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 服务、支持多语言、甚至接入大数据处理框架。