Найдите 5 самых распространенных слов в строке - PullRequest
1 голос
/ 27 мая 2020

Я и мой коллега пытаемся создать счетчик слов, который ищет 5 наиболее распространенных слов из определенного пути и выводит их в консоль. Пока нам удалось только создать код, который ищет слово, которое мы вводим, и сколько раз оно встречается.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace wordcounter_2._0
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Bitte geben sie eine Keywort ein.");
            string patternWord = Console.ReadLine();
            Console.WriteLine("Bitte geben sie einen Pfad ein.");
            string Pfad = Console.ReadLine();
            try
            {
                StreamReader MyReader = new StreamReader(Pfad);
                string text = MyReader.ReadToEnd();
            }
            catch
            {
                Console.WriteLine("Bitte geben sie einen gültigen Pfad ein.");
            }
            string[] inputSentence = Console.ReadLine().Split();
            int count = 0;
            string pattern = @"(?:\b\w+\ \s|\S)*" + patternWord + @"(?:\b\w+\b\ \s|\S)?";
            Regex rx = new Regex(pattern, RegexOptions.IgnoreCase);
            for (int i = 0; i < inputSentence.Length; i++)
            {
                var mc = rx.Matches(inputSentence[i]);
                foreach (Match m in mc)
                {
                    count++;
                }
            }
            Console.WriteLine("Das Wort " + patternWord + " kommt " + "{0}", count + " mal vor.");
            Console.ReadLine();
        }
    }
}

Ответы [ 2 ]

5 голосов
/ 27 мая 2020
class Program
    {
        static void Main(string[] args)
        {
            string words = "I felt happy because I saw the others were happy and because I knew I should feel happy, but I wasn’t really happy.";
            string[] splitWords = words.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
            var commonWords = splitWords.ToList().GroupBy(e => e).Select(g => new { Value = g.Key, Count = g.Count() }).OrderByDescending(e => e.Count).Take(5);
            foreach (var x in commonWords)
            {
                Console.WriteLine("Value: " + x.Value); // These are the 5 most used words, if you want you can include + " Count: " + x.Count to see count
            }
            Console.ReadLine();
        }
    }

Это решит вашу задачу

0 голосов
/ 27 мая 2020

Здесь решение на основе регулярных выражений

string regWords = "I felt happy because I saw the others were happy and because I knew I should feel happy, but I wasn’t really happy.";
var regMatches = Regex.Matches(regWords, "\\b(?<word>[^\\s]+?)\\b");
var regCommonWords = regMatches.GroupBy(x => x.Groups["word"].Value).OrderByDescending(x => x.Count()).Take(5).Select(x => x.Key);
foreach (var x in regCommonWords)
        Console.WriteLine("Value: " + x);

Чтобы получить объяснение, что такое регулярное выражение, посмотрите на это:

https://regex101.com/r/OTBN5V/1

Трудно имейте в виду, что это решение медленнее, чем решение без регулярных выражений, за счет разделения строки.

https://dotnetfiddle.net/E4GDrj

Используемый ответ vinothvs для сравнения скорости

Предупреждение:

Мое решение не рассматривает «не» как слово, а вместо этого видит «wasn» и «t» как отдельные слова, не удалось найти удовлетворительный способ решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...