Посчитать частоту каждого слова - PullRequest
3 голосов
/ 29 марта 2012

Там есть каталог с несколькими текстовыми файлами.Как рассчитать частоту каждого слова в каждом файле?Слово означает набор символов, который может содержать буквы, цифры и символы подчеркивания.

Ответы [ 5 ]

9 голосов
/ 31 марта 2012

Вот решение, которое должно подсчитывать все частоты слов в файле:

    private void countWordsInFile(string file, Dictionary<string, int> words)
    {
        var content = File.ReadAllText(file);

        var wordPattern = new Regex(@"\w+");

        foreach (Match match in wordPattern.Matches(content))
        {
            int currentCount=0;
            words.TryGetValue(match.Value, out currentCount);

            currentCount++;
            words[match.Value] = currentCount;
        }
    }

Этот код можно назвать так:

        var words = new Dictionary<string, int>(StringComparer.CurrentCultureIgnoreCase);

        countWordsInFile("file1.txt", words);

После того, как эти слова будут содержать всеслова в файле с их частотой (например, words["test"] возвращает количество раз, когда "test" находится в содержимом файла. Если вам нужно собрать результаты из более чем одного файла, просто вызовите метод для всех файлов с одинаковымсловарь. Если вам нужны отдельные результаты для каждого файла, каждый раз создавайте новый словарь и используйте структуру, подобную предложенной @DarkGray.

3 голосов
/ 09 декабря 2013

Существует альтернатива Linq-ish, которая imo проще.Ключевым моментом здесь является использование фреймворка, встроенного в File.ReadLines (который лениво читается, что круто) и string.Split.

private Dictionary<string, int> GetWordFrequency(string file)
{
    return File.ReadLines(file)
               .SelectMany(x => x.Split())
               .Where(x => x != string.Empty)
               .GroupBy(x => x)
               .ToDictionary(x => x.Key, x => x.Count());
}

Чтобы получить частоты из многих файлов, вы можете иметь перегрузку на основеparams.

private Dictionary<string, int> GetWordFrequency(params string[] files)
{
    return files.SelectMany(x => File.ReadLines(x))
                .SelectMany(x => x.Split())
                .Where(x => x != string.Empty)
                .GroupBy(x => x)
                .ToDictionary(x => x.Key, x => x.Count());
}
0 голосов
/ 27 мая 2019
string input= File.ReadAllText(filename);
var arr = input.Split(' ');
// finding frequencies of words in a string
IDictionary<string, int> dict = new Dictionary<string, int>();
foreach (var item in arr)
{
    var count = 0;
    if (dict.TryGetValue(item, out count))
        dict[item] = ++a;
    else
        dict.Add(item, 1);
}
0 голосов
/ 09 декабря 2013

@ aKzenT ответ хороший, но есть проблема!его код никогда не проверяет, существует ли слово в словаре или нет!поэтому я изменил код следующим образом:

private void countWordsInFile(string file, Dictionary<string, int> words)
{
    var content = File.ReadAllText(file);

    var wordPattern = new Regex(@"\w+");

    foreach (Match match in wordPattern.Matches(content))
    {
        if (!words.ContainsKey(match.Value))
            words.Add(match.Value, 1);
        else
            words[match.Value]++;
    }
}
0 голосов
/ 30 марта 2012

Количество слов:

int WordCount(string text)
{
  var regex = new System.Text.RegularExpressions.Regex(@"\w+");

  var matches = regex.Matches(text);
  return matches.Count;     
}

Прочитать текст из файла:

string text = File.ReadAllText(filename);

Структура подсчета слов:

class FileWordInfo
{
  public Dictionary<string, int> WordCounts = new Dictionary<string, int>();
}

List<FileWordInfo> fileInfos = new List<FileWordInfo>();
...