2

次のコードを使用して、文字列の配列をリストに分割しています。

private List<string> GenerateTerms(string[] docs)
    {
        return docs.SelectMany(doc => ProcessDocument(doc)).Distinct().ToList();
    }

    private IEnumerable<string> ProcessDocument(string doc)
    {
        return doc.Split(' ')
                  .GroupBy(word => word)
                  .OrderByDescending(g => g.Count())
                  .Select(g => g.Key)
                  .Take(1000);
    }

私がやりたいのは、返されたリストを次のように置き換えることです

Dictionary <string, int>

つまり、返されたリストの代わりに、辞書を返したい

誰か助けてもらえますか?前もって感謝します。

4

4 に答える 4

2
string doc = "This is a test sentence with some words with some words repeating like: is a test";
var result = doc.Split(' ')
                   .GroupBy(word => word)
                   .OrderByDescending(g=> g.Count())
                   .Take(1000)
                   .ToDictionary(r => r.Key ,r=> r.Count());

編集:

キーとしての単語と値としての最終的なカウントに基づいて、文字列の配列から最終的な辞書を取得しようとしていると思います。辞書には重複する値を含めることができないため、を使用する必要はありませんDistict。メソッドを次のように書き直す必要があります。

private Dictionary<string,int> GenerateTerms(string[] docs)
{
    List<Dictionary<string, int>> combinedDictionaryList = new List<Dictionary<string, int>>();
    foreach (string str in docs)
    {
        //Add returned dictionaries to a list
        combinedDictionaryList.Add(ProcessDocument(str));
    }
    //return a single dictionary from list od dictionaries
    return combinedDictionaryList
            .SelectMany(dict=> dict)
            .ToLookup(pair => pair.Key, pair => pair.Value)
            .ToDictionary(group => group.Key, group => group.Sum(value => value));
}

private Dictionary<string,int> ProcessDocument(string doc)
{
    return doc.Split(' ')
            .GroupBy(word => word)
            .OrderByDescending(g => g.Count())
            .Take(1000)
            .ToDictionary(r => r.Key, r => r.Count());
}

次に、次のように呼び出すことができます。

string[] docs = new[] 
    {
        "This is a test sentence with some words with some words repeating like: is a test",
        "This is a test sentence with some words with some words repeating like: is a test",
        "This is a test sentence with some words",
        "This is a test sentence with some words",
    };

Dictionary<string, int> finalDictionary = GenerateTerms(docs);
于 2012-11-21T05:57:53.120 に答える
1

これを試して:

string[] docs = {"aaa bbb", "aaa ccc", "sss, ccc"};        

var result = docs.SelectMany(doc => doc.Split())
                 .GroupBy(word => word)
                 .OrderByDescending(g => g.Count())
                 .ToDictionary(g => g.Key, g => g.Count())
                 .Take(1000);

編集:

var result = docs.SelectMany(
        doc => doc.Split()
            .GroupBy(word => word)
            .OrderByDescending(g => g.Count())
            .Take(1000))
    .Select(g => new {Word = g.Key, Cnt = g.Count()})
    .GroupBy(t => t.Word)
    .ToDictionary(g => g.Key, g => g.Sum(t => t.Cnt));
于 2012-11-21T06:28:17.093 に答える
0

追加のくだらないものがなくても、次のことが機能するはずです。

return doc.Split(' ')
          .GroupBy(word => word)
          .ToDictionary(g => g.Key, g => g.Count());

Take状況に応じて、OrderByなどで調整してください。

于 2012-11-21T05:54:43.583 に答える
0

次のようなものを試してください。

    var keys = new List<string>();
    var values = new List<string>();
    var dictionary = keys.ToDictionary(x => x, x => values[keys.IndexOf(x)]);
于 2012-11-21T05:55:15.437 に答える