2009-05-14 7 views
1

Ich wurde einmal von einem aktuellen Mitarbeiter gefragt, wie ich eine frequenzsortierte Liste der zehntausend am häufigsten verwendeten Wörter in der englischen Sprache entwickeln würde. Schlagen Sie eine Lösung in der Sprache Ihrer Wahl vor, obwohl ich C# bevorzuge.Wie würden Sie eine frequenzsortierte Liste der zehntausend am häufigsten verwendeten Wörter in der englischen Sprache entwickeln?

Bitte geben Sie nicht nur eine Implementierung, sondern auch eine Erklärung.

Dank

+0

Diese Seite hat Ihre ersten 1000 abgedeckt: http://www.duboislc.org/EducationWatch/First100Words.html – gnovice

+0

Gibt es eine bestimmte Quellenliste, wie unten von mindestens 2 Antworten angenommen? Oder entdecken Sie die Liste der 10 000 am häufigsten verwendeten Wörter des Problems, für die Sie eine Lösung suchen? – CoderDennis

Antwort

3

Erläuterung: Ich weiß nicht wirklich, ob es weitere Erklärungen erfordert, aber ich werde es versuchen. inputList ist ein Array oder eine andere Sammlung, die Quellwörter bereitstellt. GroupBy Funktion gruppiert die Eingabe-Sammlung durch eine ähnliche Eigenschaft (in meinem Code das Objekt selbst, wie von der Lambda word => word angegeben). Die Ausgabe (eine Gruppe von Gruppen durch einen angegebenen Schlüssel, das Wort) wird in ein Objekt mit Word und Frequency Eigenschaften umgewandelt und nach Frequency Eigenschaft in absteigender Reihenfolge sortiert. Sie könnten .Take(10000) verwenden, um die ersten 10000 zu nehmen. Die ganze Sache kann leicht durch .AsParallel() von PLINQ zur Verfügung gestellt werden. Die Abfrage Operator Syntax aussehen könnte deutlicher:

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); 
+0

Das kann sehr ineffizient sein, weil es nicht parallelisiert ist. –

+0

Zehn tausend Worte ist nicht etwas, über und btw zu kümmern, bei PLINQ aussehen: http://msdn.microsoft.com/en-us/magazine/cc163329.aspx –

+0

Wo würden Sie die Quelleingangsworte vorschlagen zu bekommen? Das scheint der schwierigste Teil des Problems zu sein, aber Sie nehmen es als gegeben hin. – CoderDennis

1

Das erste, was mir in den Kopf Pop (nicht überprüft Syntax und ausführliche (für Perl) zu Demonstrationszwecken)

#!/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" 
} 
2

Als ersten Schnitt fehlt weitere Definition des Problems (was meinst du mit den meist gebrauchten Wörtern auf Englisch?) - Ich würde Google's n-gram data kaufen, die 1-Gramm mit einem englischen Wörterbuch schneiden und das an sort -rn -k 2 | head -10000 weiterleiten.

Verwandte Themen