玩出新花样,给你5个Go语言词频统计扩展练习

简介: 玩出新花样,给你5个Go语言词频统计扩展练习

/ Go 语言词频统计实现 /

词频统计可以分析一段文本中各个词出现的频率,它有许多实用的应用场景,如关键词提取、语言分析等。本文我们将使用 Go 语言实现一个简单的词频统计程序。

主要内容包括:

  1. 问题简述
  2. 初级实现
  3. 分词函数
  4. 数据存储
  5. 统计与输出
  6. 主函数逻辑
  7. 程序测试
  8. 优化思考
  9. 扩展练习

代码示例会包含详细的注释,解释每一段逻辑的具体功能。希望通过详细的实例,可以加深对 Go 语言编程的理解,以及处理文本统计问题的方法。

1

 

1. 问题简述

要求实现一个简单的词频统计程序,功能如下:

  1. 输入一段文本
  2. 对文本进行分词
  3. 统计每个词出现的次数
  4. 按词频输出结果

2

 

2. 初级实现

首先,我们可以使用 map 实现一个简单的单词计数:

// 声明一个map记录词频
frequencies := make(map[string]int) 
// 输入的文本 
input := "hello world hello golang"
// 对空格分割文本  
words := strings.Split(input, " ")
// 统计每个词出现频次
for _, word := range words {
  frequencies[word]++
}
// 输出结果 
fmt.Println(frequencies)

这实现了基本的词频统计和输出要求。

3

 

3. 分词函数

我们可以将文本分词提取封装成一个函数:

// 将文本进行分词
func tokenize(text string) []string {
  return strings.Split(text, " ")
}
words := tokenize(input)

这样可以重用分词逻辑。

我们也可以加强对文本的清理处理,比如转换为小写,移除标点等:

func tokenize(text string) []string {
  // 转小写
  text = strings.ToLower(text)
  // 移除标点
  regex, _ := regexp.Compile("[^a-zA-Z]+") 
  text = regex.ReplaceAllString(text, "")
  // 分词
  return strings.Split(text, " ")
}

4

 

4. 数据存储

使用 map 可以灵活统计词频,我们也可以试试数组的方式:

// 定义一个结构体保存词和频次
type Word struct {
  text string
  frequency int
}
var words []Word
// 查找某个词,返回索引
func find(word string) int {
} 
// 更新词频
func updateFreq(text string) {
  index := find(text)
  if index >= 0 {
    words[index].frequency++ 
  }
}

数组可以按次序存储统计结果。

5

 

5. 统计与输出

词频统计后,我们按频次排序后输出:

// 按频次对单词排序
sort.Slice(words, func(i, j int) bool {
  return words[i].frequency > words[j].frequency
})
// 按排序后顺序输出结果
for _, w := range words {
  fmt.Println(w.text, w.frequency) 
}

sort.Slice 可以按频次对结果排序。

6

 

6. 主函数逻辑

主函数可以组合上述逻辑完成统计:

func main() {
  text := "hello world hello golang"
  words := tokenize(text)
  // 统计频次 
  for _, w := range words {
    updateFreq(w)
  } 
  // 输出结果
  printResults(words)
}

主函数负责组合调用其他函数完成统计任务。

7

 

7. 程序测试

为了测试程序,可以添加一些测试用例:

func TestWordFrequencies(t *testing.T) {
  text := "hello world hello golang"
  freqs := getFrequencies(text)
  if freqs["hello"] != 2 {
    t.Errorf("hello freq expected 2")
  }
  if freqs["golang"] != 1 {
    t.Errorf("golang freq expected 1")
  } 
}

添加一些简单校验可以测试统计结果。

8

 

8. 优化思考

我们可以考虑以下几点来提升程序:

  • 使用 goroutine 并发分词
func tokenizeConcurrent(text string) []string {
  words := []string{}
  chunks := splitTextIntoChunks(text)
  var wg sync.WaitGroup
  wg.Add(len(chunks))
  for _, chunk := range chunks {
    go func(chunk string) {
      words = append(words, tokenize(chunk)) 
      wg.Done()
    }(chunk)
  }
  wg.Wait()
  return words
}

测试更多边界用例

func TestWordFrequencies(t *testing.T) {
  // 边界 testcase
  testEmpty() 
  testNonAlpha()
  testLongText()
  // 正常 testcase
  testGeneralCase() 
}

数据存储可以考虑 Trie 树等结构

type Node struct {
  children map[rune]*Node
  isWord bool 
}
func buildTrie(words []string) *Node {
  // ...
}
func findWord(root *Node, word string) bool {
  // ...
}

使用 channel 通信

func tokenize(text string, c chan []string) {
  words := // 分词 
  c <- words
}
c := make(chan []string)
go tokenize(text, c)
words := <- c
  • 词频保存到数据库

9

 

9. 扩展练习

一些扩展练习可以考虑:

  • 支持统计中文文本词频
  • 基于词频给文本打标签
  • 生成词云图
  • 支持统计文件词频
  • 增加停用词过滤
  • 构建 inverted index

10

 

总结

到此我们使用 Go 语言实现了一个简单的词频统计程序,并给出了一些改进思路。充分理解各部分功能,对 Go 语言编程理解非常有帮助。可以继续优化代码,实现更多扩展功能。


目录
相关文章
|
16天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
60 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
42 7
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
104 71
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
109 67
|
1天前
|
监控 安全 算法
深度剖析核心科技:Go 语言赋能局域网管理监控软件进阶之旅
在局域网管理监控中,跳表作为一种高效的数据结构,能显著提升流量索引和查询效率。基于Go语言的跳表实现,通过随机化索引层生成、插入和搜索功能,在高并发场景下展现卓越性能。跳表将查询时间复杂度优化至O(log n),助力实时监控异常流量,保障网络安全与稳定。示例代码展示了其在实际应用中的精妙之处。
23 9
|
11天前
|
算法 安全 Go
Go 语言中实现 RSA 加解密、签名验证算法
随着互联网的发展,安全需求日益增长。非对称加密算法RSA成为密码学中的重要代表。本文介绍如何使用Go语言和[forgoer/openssl](https://github.com/forgoer/openssl)库简化RSA加解密操作,包括秘钥生成、加解密及签名验证。该库还支持AES、DES等常用算法,安装简便,代码示例清晰易懂。
46 12
|
1月前
|
存储 Go
go语言中映射
go语言中映射
41 11
|
14天前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
22 0
|
28天前
|
Go 数据安全/隐私保护 UED
优化Go语言中的网络连接:设置代理超时参数
优化Go语言中的网络连接:设置代理超时参数