Golang如何从[]string中获取出现频率最高的3个单词

Golang如何从[]string中获取出现频率最高的3个单词 如何从字符串中获取前3个最常用单词

代码示例1
如何从 []string 中获取前N个最常用的单词而不包含其他单词?代码注释中说明了结果可能呈现的形式。

这是仅进行计数的当前实现。但我正在尝试获取前3个高频词
代码示例2

2个点赞


更多关于Golang如何从[]string中获取出现频率最高的3个单词的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

Yamil_Bracho:

result := make(map[string]int)
for _, key := range keys {
    result[key] = counts[key]
    count--
    if count == 0 {
        break
    }
}

感谢您的解决方案,但我不太确定在我们遍历已排序的字符串后这里发生了什么。 关于结果部分

更多关于Golang如何从[]string中获取出现频率最高的3个单词的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


以下是转换后的内容:

代码链接

您正确识别了解答的第一部分。首先需要统计单词数量,为此需要使用映射表。

缺少的是第二步。要获取出现频率最高的三个单词,需要按计数对单词进行排序。为此需要创建一个单词-计数对的切片,然后进行排序。

切片排序完成后,前三个条目就是您要打印的内容。

在对键进行排序后,我们将构建一个映射来向调用者返回结果。代码如下:

// 构建结果映射
result := make(map[string]int)
for _, key := range keys {
	result[key] = counts[key]
	count--
	if count == 0 {
		break
	}
}
return result

count 是您想要返回的项目数量。您提到要返回前3个,所以 count 就是这个数字。 然而,棘手的部分是排序

// 获取最大值
	counts := make(map[string]int)
	for key, value := range m {
		if value > 1 {
			counts[key] = value
		}
	}

这部分仅获取在字符串中重复出现的单词。我写了0(value > 0),但实际数字应该是1(value > 1)

在此之后,我们使用上述映射的键构建一个切片。排序例程使用这些键的计数值来对该切片进行排序。

  1. 修改 rangeMap 函数,使其接收一个参数来指定要返回的前几个最高频次的值

  2. 使用以下代码

func rangeMap(s []string, count int) map[string]int {
    words := strings.Split(strings.Join(s, ""), " ")

 // count occurences	
 m := make(map[string]int)
 for _, word := range words {
 	_, ok := m[word]
 	if !ok {
 	  m[word] = 1
 	} else {
 	  m[word]++
 	}
 }
 
 // Takes max values
 counts:= make(map[string]int)
 for key, value := range m {
    if value > 0  {
        counts[key] = value
    }
 }
 
 // Sorts By Value
 keys := make([]string, 0, len(counts))
 for key := range counts {
 	keys = append(keys, key)
 }
 sort.Slice(keys, func(i, j int) bool { return counts[keys[i]] > counts[keys[j]] })

 // Builds result map	
 result := make(map[string]int)
 for _, key := range keys {
    result[key] = counts[key]
    count--
    if count == 0 {
       break
    }	

 }
 return result
 }

以下是基于您的需求从 []string 中获取出现频率最高的前3个单词的Go实现。我将提供一个完整的示例代码,包括字符串分割、频率统计和排序,确保结果不包含其他单词。

代码实现:

package main

import (
	"fmt"
	"sort"
	"strings"
)

func topNWords(words []string, n int) []string {
	// 创建一个映射来统计每个单词的频率
	frequency := make(map[string]int)
	for _, word := range words {
		frequency[word]++
	}

	// 创建一个结构体切片来存储单词和频率,便于排序
	type wordFreq struct {
		word string
		freq int
	}
	var wordFreqs []wordFreq
	for word, freq := range frequency {
		wordFreqs = append(wordFreqs, wordFreq{word, freq})
	}

	// 按频率降序排序,如果频率相同则按单词字母顺序升序排序
	sort.Slice(wordFreqs, func(i, j int) bool {
		if wordFreqs[i].freq == wordFreqs[j].freq {
			return wordFreqs[i].word < wordFreqs[j].word
		}
		return wordFreqs[i].freq > wordFreqs[j].freq
	})

	// 提取前n个单词
	var result []string
	for i := 0; i < n && i < len(wordFreqs); i++ {
		result = append(result, wordFreqs[i].word)
	}
	return result
}

func main() {
	// 示例输入:字符串切片
	words := []string{"apple", "banana", "apple", "cherry", "banana", "apple", "date", "cherry", "banana", "apple"}
	top3 := topNWords(words, 3)
	fmt.Println("Top 3 most frequent words:", top3) // 输出: [apple banana cherry]
}

代码说明:

  • 统计频率:使用 map[string]int 来记录每个单词的出现次数。
  • 排序:将映射转换为结构体切片,按频率降序排序,频率相同时按单词字母顺序升序排序。
  • 提取结果:返回前N个单词的切片,如果单词总数少于N,则返回所有单词。

运行此代码将输出:Top 3 most frequent words: [apple banana cherry]。此方法高效且直接,适用于任意大小的 []string 输入。

回到顶部