如何从文本中获取次高频单词?现有代码修改后无法生效
问题分析与解决方案
原代码能获取最高频单词,但尝试通过修改highestFreq为freq+1来获取次高频的方法完全错误——次高频是所有单词频率中第二大的数值,不是当前最高频率加1,而且原逻辑只维护了单个最高值,没有记录所有频率的分布。
另外原代码存在一个明显bug:var message = string.Join(" ", source);会把输入字符串的每个字符用空格分隔(比如输入"test code"会变成"t e s t c o d e"),导致后续分割出来的都是单个字符,完全不符合统计单词的需求,这行代码应该直接删除,用原始输入字符串进行分割。
修正后的实现思路
- 先完整统计所有符合条件(长度>4)的单词的出现频率
- 将统计结果按频率降序排序
- 从排序后的结果中提取最高频和次高频单词(需处理输入中符合条件的单词不足2个的边界情况)
修正代码示例
string inputText = TextBox1.Text; var splitChars = new char[] { ' ', '.' }; var words = inputText.Split(splitChars, StringSplitOptions.RemoveEmptyEntries); // 统计符合条件的单词频率 var frequencies = new Dictionary<string, int>(); foreach (var word in words) { var trimmedWord = word.Trim(); if (trimmedWord.Length > 4) { if (frequencies.ContainsKey(trimmedWord)) { frequencies[trimmedWord]++; } else { frequencies[trimmedWord] = 1; } } } // 按频率降序排序,同时保留单词和频率 var sortedFrequencies = frequencies.OrderByDescending(kv => kv.Value).ToList(); // 获取最高频和次高频单词 string highestWord = sortedFrequencies.Count > 0 ? sortedFrequencies[0].Key : null; string secondHighestWord = sortedFrequencies.Count > 1 ? sortedFrequencies[1].Key : null; // 输出到Label Label1.Text = highestWord ?? "无符合条件的单词"; // 如果需要显示次高频,可以添加另一个Label或者拼接文本 // Label2.Text = secondHighestWord ?? "无次高频单词";
关键说明
- 先完成全量统计再排序:这样能完整获取所有单词的频率分布,方便提取任意排名的高频单词
- 处理边界情况:当符合条件的单词数量为0或1时,避免索引越界错误
- 修复了原代码中错误的字符串拆分逻辑:直接用原始输入分割,去掉多余的
string.Join操作
内容的提问来源于stack exchange,提问作者user20465780
相关产品推荐
相关产品推荐

