文本文件词频

时间:2019-03-14 21:54:31

标签: c#

我应该阅读一个文本文件并以降序打印出单词出现的频率,但是“单词被认为是连续字母的任何序列,在字母之前或之后都没有”。

我是否可以将wordBreak chars定义为英语字母以外的任何内容,或者以某种方式使用Regex?

例如,使它能够使程序将字符串“ a198 $a1a1a'ača”识别为单词“ a”,其频率为6。

     {
        char[] wordBreak = new char[] { ' ', ',', ';', '.', '/', '\"', '[', ']', '!'};
        var wordFreq = new Dictionary<string, int>();
        using (var fileStream = File.Open("text.in", FileMode.Open, FileAccess.Read))
        using (var streamReader = new StreamReader(fileStream))
        {
            string line;
            while ((line = streamReader.ReadLine()) != null)
            {
                var words = line.Split(wordBreak, StringSplitOptions.RemoveEmptyEntries);

                foreach (var word in words)
                {
                    if (wordFreq.ContainsKey(word))
                    {
                        wordFreq[word]++;
                    }
                    else
                    {
                        wordFreq.Add(word, 1);
                    }

                }
            }
        }
     }

3 个答案:

答案 0 :(得分:2)

是的,您可以使用Regex。例如:

MatchCollection matches = Regex.Matches("a198$a1a1a'ač a", "[a-zA-Z]+");

var wordFreqs = matches
    .Cast<Match>()
    .GroupBy(a => a.Value)
    .OrderByDescending(a => a.Count())
    .Select(a => new { Word = a.Key, Freq = a.Count() });

foreach (var wordFreq in wordFreqs)
    Console.WriteLine($"\"{wordFreq.Word}\" occurs {wordFreq.Freq} times");

答案 1 :(得分:1)

执行此操作的一种方法是简单地逐字符遍历字符串。如果字符是字母,则将其附加到currentWord字符串中。如果它不是字母,并且currentWord有一些字符,则可以将该单词添加到字典中(值为1),或者如果该单词已经存在,则增加该单词的计数:

private static Dictionary<string, int> GetWords(string input)
{
    var result = new Dictionary<string, int>();
    if (string.IsNullOrWhiteSpace(input)) return result;

    var currentWord = "";

    foreach (var chr in input)
    {
        if (char.IsLetter(chr))
        {
            currentWord += chr;
        }
        else if (currentWord.Length > 0)
        {
            if (result.ContainsKey(currentWord)) result[currentWord]++;
            else result.Add(currentWord, 1);
            currentWord = "";
        }
    }

    if (currentWord.Length > 0)
    {
        if (result.ContainsKey(currentWord)) result[currentWord]++;
        else result.Add(currentWord, 1);
    }

    return result;
}

在使用中,您只需执行以下操作:

private static void Main(string[] args)
{
    var words = GetWords("a198$a1a1a'ač a");

    foreach (var word in words)
    {
        Console.WriteLine($"The word '{word.Key}' occurrs {word.Value} times.");
    }

    GetKeyFromUser("\nDone! Press any key to exit...");
}

输出

![enter image description here

答案 2 :(得分:1)

好的,我做到了,而且可行,但是可能有更好的方法做到这一点。

{{1}}