Как бы вы разработали отсортированный по частоте список из десяти тысяч наиболее употребляемых слов в английском языке? - PullRequest
1 голос
/ 14 мая 2009

Текущий сотрудник однажды спросил меня, как мне составить отсортированный по частоте список из десяти тысяч наиболее употребляемых слов в английском языке. Предложите решение на выбранном вами языке, хотя я предпочитаю C #.

Пожалуйста, предоставьте не только реализацию, но и объяснение.

Спасибо

Ответы [ 4 ]

3 голосов
/ 14 мая 2009
IEnumerable<string> inputList; // input words.
var mostFrequentlyUsed = inputList.GroupBy(word => word)
  .Select(wordGroup => new { Word = wordGroup.Key, Frequency = wordGroup.Count() })
  .OrderByDescending(word => word.Frequency);

Объяснение: Я действительно не знаю, требует ли это дальнейшего объяснения, но я попробую. inputList - это массив или любая другая коллекция, содержащая исходные слова. Функция GroupBy сгруппирует входную коллекцию по некоторому похожему свойству (в моем коде это сам объект, как отмечено лямбдой word => word). Вывод (который представляет собой набор групп по указанному ключу, слову) будет преобразован в объект со свойствами Word и Frequency и отсортирован по свойству Frequency в порядке убывания. Вы можете использовать .Take(10000), чтобы взять первые 10000. Все это можно легко распараллелить с помощью .AsParallel(), предоставленного PLINQ. Синтаксис оператора запроса может выглядеть яснее:

var mostFrequentlyUsed = 
     (from word in inputList
      group word by word into wordGroup
      select new { Word = wordGroup.Key, Frequency = wordGroup.Count() })
     .OrderByDescending(word => word.Frequency).Take(10000);
2 голосов
/ 15 мая 2009

В качестве первого среза отсутствует дальнейшее определение проблемы (что вы подразумеваете под наиболее употребляемыми словами в английском?) - я бы купил данные Google n-грамм , пересекаю 1 грамм с английским словарем, и передайте это на sort -rn -k 2 | head -10000.

1 голос
/ 14 мая 2009

Первое, что приходит мне в голову (не проверяется синтаксис, и многословно (для perl) в демонстрационных целях)

#!/usr/bin/perl

my %wordFreq
foreach ( my $word in @words)
{
   $wordFreq{$word}++;
}

my @mostPopularWords = sort{$wordFreq{$a} <=> $wordFreq{$b} } keys %wordFreq;
for (my $i=0; $i < 10000; ++$i)
{
   print "$i: $mostPopularWords[$i] ($wordFreq{$mostPopularWords[$i]} hits)\n"
}
1 голос
/ 14 мая 2009

Я бы использовал карту-уменьшить. Это канонический пример задачи, которая ему подходит. Вы можете использовать Hadoop с C # с потоковым протоколом . Есть и другие подходы. См. Существует ли .NET-эквивалент Apache Hadoop? и https://stackoverflow.com/questions/436686/-net-mapreduce-implementation.

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