2012-03-29 11 views
1

テキストファイルがいくつかあるディレクトリがあります。各ファイルの各単語の頻度をどのように数えますか?単語とは、文字、数字、下線の文字を含むことができる文字の集合を意味します。各単語の頻度を数えるには

+1

何をしようとしていますか?どのようにあなたはそれをやろうとしましたか?どのように機能しませんでしたか? –

+0

私はまず何をすべきかわかりません。主な質問は、どのように単語を検索するのですか?単語、回数、ファイルに関する情報を格納するためには、どのような一般的なコンテナを使用するべきですか。 –

答えて

5

は、内のすべての単語の出現頻度をカウントするソリューションです。ファイル:

この言葉は自分の周波数を使用してファイル内のすべての単語(例えばが含まれています後

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

     countWordsInFile("file1.txt", words); 

あなたはこのようにこのコードを呼び出すことができますwords["test"]は、 "test"がファイルの内容に含まれている回数を返します。複数のファイルの結果を累積する必要がある場合は、同じ辞書を持つすべてのファイルのメソッドを呼び出します。ファイルごとに別々の結果が必要な場合は、毎回新しい辞書を作成し、@DarkGrayのような構造を使用することを推奨します。

1

ワードカウント:

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

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

ファイルから読み込んだテキスト:構造をカウント

string text = File.ReadAllText(filename); 

ワード:ここ

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

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

この正規表現では、文字、数字、下線文字のみを含むことができる文字は許可されていますか?また、単語、カウント回数、ファイルに関する情報を格納するために使用する一般的なコンテナはどれですか? –

+0

@Grienders現在の亜種を確認してください –

+0

あなたのコードは何をしていますか?それは私が必要なことをしない!それは各単語の頻度を数えますか、またはそれはすべての単語の量を数えますか? –

0

@aKzenT回答は良いですが問題があります!彼のコードは、単語が辞書にすでに存在するかどうかを決してチェックしません!そこでコードを次のように変更しました。

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

もっと簡単なLinq-ishの代替方法があります。ここでの鍵は、File.ReadLines(怠惰な読み物です)とstring.Splitで構築されたフレームワークを使用することです。

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

多くのファイルから頻度を取得するには、paramsに基づいて過負荷を設定することができます。

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()); 
} 
関連する問題