none
Wörter zählen RRS feed

  • Frage

  • Hallo, ich versuche momentan eine Algorithmus zu entwickeln der Wörter einer Textdatei zählen soll. hier mal mein Code dazu: while(hasNextChar())//prüfen ob ein Zeichen zurückgegeben werden kann { //Hier muss die Bedingung hin, die angibt ob // die Sequenz der Zeichen ein Wort entsprechen if(getChar() == hier weiß ich nicht weiter) { wordCount++; } } Mein problem ist nun, wie ich überprüfen kann, ob ein Wort existiert, weil ich will ja nicht alle Zeichen zählen. Die Methode "getChar()" gibt ein Zeichen der Textdatei zurück. Schon mal vielen Dank für eure Bemühungen! Volker
    Samstag, 30. Oktober 2010 15:20

Antworten

  • Hallo D.,

    erstmal als grobes Beispiel:

    [How to: Count Occurrences of a Word in a String (LINQ)]
    http://msdn.microsoft.com/de-de/library/bb546166.aspx

    und zum Lesen der Datei:

    [File.ReadAllText-Methode (System.IO)]
    http://msdn.microsoft.com/de-de/library/system.io.file.readalltext.aspx

    Es kommt letztlich darauf, was Du als Wort definierst. Also zum Beispiel (grob) auch:

    Regex re = new Regex(@"[\w-']+");
    MatchCollection mc = re.Matches(textDateiInhalt);
    mc.Count // ist dann Dein Ergebnis
    

    oder zusammengefasst mit anderen Satz-Statistiken:

    [Parsing Sentences and Building Text Statics in C# - CodeProject]
    http://www.codeproject.com/KB/cs/SentenceParsingAndStatics.aspx


    ciao Frank
    • Als Antwort markiert deppensido Sonntag, 31. Oktober 2010 14:15
    Samstag, 30. Oktober 2010 16:41
  • Hallo Volker,

    das ist schon etliche Male gelöst worden,
    Nu ein Beispiel das Deinem Konzept angelehnt ist:
    http://dotnetperls.com/word-count

    Um das Wort auf Existenz / Richtigkeit zu prüfen, wäre ein Dictionary notwendig.

    Gruß Elmar

    • Als Antwort markiert deppensido Sonntag, 31. Oktober 2010 14:15
    Samstag, 30. Oktober 2010 16:51
    Beantworter
  • Hallo Volker,
    Hallo Elmar,

    Um Elmars Gedanken hier weiterzuführen:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    
    namespace ConsoleApplication2
    {
     class Program
     {
      Dictionary<string, int> wordsDictionary = new Dictionary<string, int>();
    
      static void Main(string[] args)
      {
       string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "LargeCanterburyCorpus.txt");
       Program p = new Program();
       p.CreateDictionary(filePath);
       p.OutputStatistics();
    
       Console.ReadKey(true);
      }
    
      private void CreateDictionary(string filePath)
      {
       wordsDictionary.Clear();
    
       string fileText = File.ReadAllText(filePath);
       string[] words = fileText.Split(new char[] { ' ', '\t', '\r', '\n', '.', ',', '?', ';', ':' }, StringSplitOptions.RemoveEmptyEntries);
    
       foreach (string word in words)
       {
        if (wordsDictionary.ContainsKey(word))
         wordsDictionary[word] = wordsDictionary[word] + 1;
        else
        {
         wordsDictionary.Add(word, 1);
        }
       }
      }
    
      public void OutputStatistics()
      {
       var orderedPairs = wordsDictionary.OrderBy(k => k.Value);
       foreach (KeyValuePair<string, int> kvp in orderedPairs)
       {
        Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
       }
      }
     }
    }
    
    

     

    Gruß
    Marcel

    • Als Antwort markiert deppensido Sonntag, 31. Oktober 2010 14:14
    Samstag, 30. Oktober 2010 18:14
    Moderator

Alle Antworten

  • Hallo D.,

    erstmal als grobes Beispiel:

    [How to: Count Occurrences of a Word in a String (LINQ)]
    http://msdn.microsoft.com/de-de/library/bb546166.aspx

    und zum Lesen der Datei:

    [File.ReadAllText-Methode (System.IO)]
    http://msdn.microsoft.com/de-de/library/system.io.file.readalltext.aspx

    Es kommt letztlich darauf, was Du als Wort definierst. Also zum Beispiel (grob) auch:

    Regex re = new Regex(@"[\w-']+");
    MatchCollection mc = re.Matches(textDateiInhalt);
    mc.Count // ist dann Dein Ergebnis
    

    oder zusammengefasst mit anderen Satz-Statistiken:

    [Parsing Sentences and Building Text Statics in C# - CodeProject]
    http://www.codeproject.com/KB/cs/SentenceParsingAndStatics.aspx


    ciao Frank
    • Als Antwort markiert deppensido Sonntag, 31. Oktober 2010 14:15
    Samstag, 30. Oktober 2010 16:41
  • Hallo Volker,

    das ist schon etliche Male gelöst worden,
    Nu ein Beispiel das Deinem Konzept angelehnt ist:
    http://dotnetperls.com/word-count

    Um das Wort auf Existenz / Richtigkeit zu prüfen, wäre ein Dictionary notwendig.

    Gruß Elmar

    • Als Antwort markiert deppensido Sonntag, 31. Oktober 2010 14:15
    Samstag, 30. Oktober 2010 16:51
    Beantworter
  • Hallo Volker,
    Hallo Elmar,

    Um Elmars Gedanken hier weiterzuführen:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    
    namespace ConsoleApplication2
    {
     class Program
     {
      Dictionary<string, int> wordsDictionary = new Dictionary<string, int>();
    
      static void Main(string[] args)
      {
       string filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "LargeCanterburyCorpus.txt");
       Program p = new Program();
       p.CreateDictionary(filePath);
       p.OutputStatistics();
    
       Console.ReadKey(true);
      }
    
      private void CreateDictionary(string filePath)
      {
       wordsDictionary.Clear();
    
       string fileText = File.ReadAllText(filePath);
       string[] words = fileText.Split(new char[] { ' ', '\t', '\r', '\n', '.', ',', '?', ';', ':' }, StringSplitOptions.RemoveEmptyEntries);
    
       foreach (string word in words)
       {
        if (wordsDictionary.ContainsKey(word))
         wordsDictionary[word] = wordsDictionary[word] + 1;
        else
        {
         wordsDictionary.Add(word, 1);
        }
       }
      }
    
      public void OutputStatistics()
      {
       var orderedPairs = wordsDictionary.OrderBy(k => k.Value);
       foreach (KeyValuePair<string, int> kvp in orderedPairs)
       {
        Console.WriteLine("{0} - {1}", kvp.Key, kvp.Value);
       }
      }
     }
    }
    
    

     

    Gruß
    Marcel

    • Als Antwort markiert deppensido Sonntag, 31. Oktober 2010 14:14
    Samstag, 30. Oktober 2010 18:14
    Moderator
  • hallo,

     

    danke für die Antworten. Hat mir weitergeholfen

     

    Gruß

     

    Volker

    Sonntag, 31. Oktober 2010 14:14