2012-03-29 7 views
1

Es gibt ein Verzeichnis mit ein paar Textdateien. Wie zähle ich die Häufigkeit jedes Wortes in jeder Datei? Ein Wort bedeutet eine Menge von Zeichen, die die Buchstaben, die Ziffern und die Unterstreichungszeichen enthalten können.Um die Häufigkeit jedes Wortes zu zählen

+1

Was möchten Sie tun? Wie hast du es versucht? Wie hat es nicht funktioniert? –

+0

Ich weiß nicht, was ich zuerst tun soll. Die Hauptfrage ist, wie ich Wörter suche? Welchen generischen Container soll ich verwenden, um Informationen über die Wörter, die Zählfrequenzen und die Dateien zu speichern? –

Antwort

5

Hier ist eine Lösung, die alle Worthäufigkeiten in ein zählen sollte Datei:

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; 
     } 
    } 

Sie können diesen Code wie folgt aufrufen:

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

     countWordsInFile("file1.txt", words); 

Nach diesen Worten werden alle Wörter in der Datei mit ihrer Frequenz enthalten (z words["test"] gibt die Häufigkeit zurück, mit der sich "test" im Dateiinhalt befindet. Wenn Sie die Ergebnisse aus mehr als einer Datei zusammenfassen müssen, rufen Sie einfach die Methode für alle Dateien mit demselben Wörterbuch auf. Wenn Sie für jede Datei separate Ergebnisse benötigen, erstellen Sie jedes Mal ein neues Wörterbuch und verwenden Sie eine Struktur wie @DarkGray.

1

Wortzählung:

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

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

Lesen von Text aus Datei:

string text = File.ReadAllText(filename); 

Wort Zählen Struktur:

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

List<FileWordInfo> fileInfos = new List<FileWordInfo>(); 
+0

Ermöglicht diese Regex eine Reihe von Zeichen, die nur Buchstaben, Ziffern und Unterstreichungszeichen enthalten dürfen? Und welchen generischen Container soll ich verwenden, um Informationen über die Wörter, die Zählfrequenzen und die Dateien zu speichern? –

+0

@Grienders Aktuelle Version überprüfen –

+0

Was macht Ihr Code? Es tut nicht, was ich brauche! Zählt es die Häufigkeit jedes Wortes oder zählt es die Menge aller Wörter? –

0

@aKzenT Antwort ist gut, aber hat ein Problem! Sein Code überprüft nie, ob das Wort bereits im Wörterbuch vorhanden ist oder nicht! Also änderte ich den Code wie folgt:

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]++; 
    } 
} 
3

Es gibt eine Linq-ish-Alternative, die imo einfacher ist. Der Schlüssel hier ist, das Framework zu verwenden, das in File.ReadLines (das faul gelesen wird, was cool ist) und string.Split gebaut wird.

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()); 
} 

Um Frequenzen von vielen Dateien, Sie eine Überlastung params Basis haben.

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()); 
}