我最近做了一个小应用程序来阅读歌词的文本文件,然后使用字典来计算每个单词出现的次数。但是,出于某种原因,我在输出中找到了同一个单词多次出现并且标记为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个不同的单词作为不同的单词。为什么会发生这种情况,我该如何解决?非常感谢任何帮助!
答案 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()))