2016-11-21 8 views
-3

So habe ich beliebiger Text in einer TXT-Datei und ich muss die 10 häufigsten Wörter finden. Wie soll ich das machen? Ich denke, ich sollte Sätze von Punkt zu Punkt lesen und es zu einem Array zusammensetzen, aber ich weiß nicht wirklich, wie ich das machen soll.So finden Sie 10 häufigsten Wörter in einem Text

+4

Was haben u bisher versucht? –

+1

Text in Wörter aufteilen, nach diesen Wörtern gruppieren, nach Anzahl sortieren (in absteigender Reihenfolge), Top 10 nehmen –

Antwort

7

Sie könnten es mit Linq erreichen. so etwas wie dieses versuchen:

var words = "two one three one three one"; 
var orderedWords = words 
    .Split(' ') 
    .GroupBy(x => x) 
    .Select(x => new { 
    KeyField = x.Key, 
    Count = x.Count() }) 
    .OrderByDescending(x => x.Count) 
    .Take(10); 
+1

'ToList()' ist * redundant *: '... words.Split ('') .GroupBy (x = > x) ... ' –

+0

Sehr wahr Dmitry, es ist nicht erforderlich. Ich habe das Codebeispiel bearbeitet. – JanneP

+1

Wenn Sie einen "* zufälligen Text * in einer TXT-Datei" erhalten, wird Ihre aktuelle Routine Schwierigkeiten haben: Sie müssen alle * Satzzeichen * (* Kommas *, * Punkte * usw.) entfernen; Sie müssen sich mit * case * befassen, z. '" Einer ist nur einer, aber nicht EINER. "' - das Wort 'one' erscheint * zweimal * –

1

alle Daten in String konvertieren, und spaltete es in Array

Beispiel:

char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; 
string text = "one\ttwo three:four,five six seven"; 

string[] words = text.Split(delimiterChars); 

var dict = new Dictionary<String, int>(); 
foreach(var value in array) 
{ 
    if (dict.ContainsKey(value)) 
     dict[value]++; 
    else 
     dict[value] = 1; 
} 

for(int i=0;i<dict.length();i++) //or i<10 
{ 
    Console.WriteLine(dict[i]); 
} 

Sie zuerst das Array mit größeren Wert sortieren müssen.

+1

Gegenbeispiel: 'text =" Eins, zwei, drei, vier, vier, fünf ";' das erwartete Ergebnis ist das '' Vier "', das auf der Oberseite ist. Das tatsächliche Ergebnis ist die * leere Zeichenfolge * Regeln sie alle. –

1

Der schwierigste Teil der Aufgabe ist Split der erste Text zu Worten. Natürliche Sprache (zB Englisch) Wort ist eine ziemlich komplexe Sache:

Forget-me-not  // 1 word (a nice blue flower) 
Do not Forget me! // 4 words 
Cannot   // 1 word or shall we split "cannot" into "can" + "not"? 
May not   // 2 words 
George W. Bush // Is "W" a word? 
W.A.S.P.   // ...If it is, is it equal to "W" in the "W.A.S.P"? 
Donald Trump  // Homonyms: name 
Spades is a trump // ...and a special follow in a game of cards 
It's an IT; it is // "It" and "IT" are different (IT is an acronym), "It" and "it" are same 

Ein weiteres Problem ist der Fall: Sie It und it als ein und dass gleiche Wort zählen möchten, aber IT als andere Akronym. Als ein erster Versuch, schlage ich etwas wie folgt aus:

var top10words = File 
    .ReadLines(@"C:\MyFile.txt") 
    .SelectMany(line => Regex 
    .Matches(value, @"[A-Za-z-']+") 
    .OfType<Match>() 
    .Select(match => CultureInfo.InvariantCulture.TextInfo.ToTitleCase(match.Value))) 
    .GroupBy(word => word) 
    .Select(chunk => new { 
    word = chunk.Key, 
    count = chunk.Count()}) 
    .OrderByDescending(item => item.count) 
    .ThenBy(item => item.word) 
    .Take(10); 

In meiner Lösung, die ich angenommen habe:

  • Wörter A..Z, a..z enthalten, - (Bindestrich) und ' (Apostroph) Buchstaben nur
  • TitleCase wurde verwendet, um alle Großbuchstaben-Akronyme von regulären Wörtern zu trennen (It und it werden als das gleiche Wort behandelt, während IT als unterschiedliche Wörter)
  • Bei binden (zwei oder viele Wörter haben die gleiche Frequenz) diese Bindung bricht nach Alphabet um
Verwandte Themen