Golang如何从[]string中获取出现频率最高的3个单词
Golang如何从[]string中获取出现频率最高的3个单词 如何从字符串中获取前3个最常用单词
代码示例1
如何从 []string 中获取前N个最常用的单词而不包含其他单词?代码注释中说明了结果可能呈现的形式。
这是仅进行计数的当前实现。但我正在尝试获取前3个高频词
代码示例2
2个点赞
更多关于Golang如何从[]string中获取出现频率最高的3个单词的实战教程也可以访问 https://www.itying.com/category-94-b0.html
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)
在此之后,我们使用上述映射的键构建一个切片。排序例程使用这些键的计数值来对该切片进行排序。
-
修改 rangeMap 函数,使其接收一个参数来指定要返回的前几个最高频次的值
-
使用以下代码
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 输入。

