C#实现Dictionary来计算单词的出现次数,在输出中返回重复的单词

时间:2011-03-30 07:54:06

标签: c# dictionary counter

我最近做了一个小应用程序来阅读歌词的文本文件,然后使用字典来计算每个单词出现的次数。但是,出于某种原因,我在输出中找到了同一个单词多次出现并且标记为1的实例,而不是添加到单词的原始标记上。我正在使用的代码如下:

StreamReader input = new StreamReader(path);
        String[] contents = input.ReadToEnd()
                                            .ToLower()
                                            .Replace(",","")
                                            .Replace("(","")
                                            .Replace(")", "")
                                            .Replace(".","")
                                            .Split(' ');
        input.Close();
        var dict = new Dictionary<string, int>();
        foreach (String word in contents)
        {
            if (dict.ContainsKey(word))
            {
                dict[word]++;
            }else{
                dict[word] = 1;
            }
        }
        var ordered = from k in dict.Keys
                              orderby dict[k] descending
                              select k;
        using (StreamWriter output = new StreamWriter("output.txt"))
        {
            foreach (String k in ordered)
            {
                output.WriteLine(String.Format("{0}: {1}", k, dict[k]));
            }
            output.Close();
            timer.Stop();
        }

我正在输入的文本文件在这里:http://pastebin.com/xZBHkjGt(这是前15首说唱歌曲的歌词,如果你很好奇的话) 输出可以在这里找到:http://pastebin.com/DftANNkE 快速ctrl-F显示“女孩”在输出中至少出现13次。据我所知,它是完全相同的词,除非ASCII值存在某种差异。是的,有些实例上有奇数字符代替撇号,但我稍后会担心这些。我的首要任务是弄清楚为什么完全相同的单词被计为13个不同的单词作为不同的单词。为什么会发生这种情况,我该如何解决?非常感谢任何帮助!

4 个答案:

答案 0 :(得分:9)

另一种方法是分裂非单词。

var lyrics = "I fly with the stars in the skies I am no longer tryin' to survive I believe that life is a prize But to live doesn't mean your alive Don't worry bout me and who I fire I get what I desire, It's my empire And yes I call the shots".ToLower();
var contents = Regex.Split(lyrics, @"[^\w'+]");

此外,这是一个替代(可能更加模糊)的循环

int value;
foreach (var word in contents)
{
    dict[word] = dict.TryGetValue(word, out value) ? ++value : 1; 
}
dict.Remove("");

答案 1 :(得分:4)

如果您注意到,重复出现在一个显然没有计数的单词后面的一行上。

您没有删除换行符,因此em\r\ngirl被视为另一个词。

答案 2 :(得分:1)

String[] contents = input.ReadToEnd()
    .ToLower()
    .Replace(",", "")
    .Replace("(", "")
    .Replace(")", "")
    .Replace(".", "")
    .Split("\r\n ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

效果更好。

答案 3 :(得分:1)

为每个单词添加Trim

foreach (String word in contents.Select(w => w.Trim()))