2010-12-23 3 views
1

텍스트 파일이 문자열 변수로 저장되어 있습니다. 텍스트 파일은 소문자 단어와 공백 만 포함하도록 처리됩니다. 자, 정적 인 사전을 가지고 있는데, 이는 특정 단어의 목록 일 뿐이며, 텍스트 파일 내에서 사전의 각 단어의 빈도를 세고 싶습니다. 예를 들면 다음과 같습니다.텍스트 파일의 특정 단어의 빈도 계산

Text file: 

i love love vb development although i m a total newbie 

Dictionary: 

love, development, fire, stone 

출력은 사전 단어와 해당 개수를 모두 나열한 것입니다. 코딩이 단순 해지면 텍스트에 나타난 사전 단어 만 나열 할 수 있습니다.

=========== 

WORD, COUNT 

love, 2 

development, 1 

fire, 0 

stone, 0 

============ 
정규식 (예를 들어, "\ + w") 나는 모든 단어 일치를 얻을 수를 사용하여

,하지만 난 방법을 사전에 또한 카운트를 얻는 단서가 없다, 그래서 나는 갇혔어요. 사전은 상당히 커서 (~ 10 만 단어) 텍스트 파일이 작지 않기 때문에 효율성이 중요합니다 (각각 ~ 200kb).

모든 종류의 도움에 감사드립니다. 이제

Dictionary<string, int> count = 
    theString.Split(' ') 
    .GroupBy(s => s) 
    .ToDictionary(g => g.Key, g => g.Count()); 

그냥 단어가 사전에 존재하는지 확인하고 계산하는 경우를 표시 할 수 있습니다 :

+0

어쩌면 같은 뭔가를 문자열을'Array' 또는'List'로 분할 한 다음리스트를 반복/처리합니까? –

+0

당신은 이것을 C#과 vb.net으로 태그했습니다. 무엇 이니? –

+1

FWIW, 여기에 정규식을 사용하여 단어를 일치시키는 것은 좋은 생각이 아닙니다. 특히 입력 내용이 깨끗한 것 (소문자 및 공백 만 사용)을 지정 했으므로 특히 좋습니다. 대신 String.Split을 사용하십시오. 그 외에도 이것은 사소한 문제입니다. .NET 문서에서 사전을 찾으십시오. –

답변

5
var dict = new Dictionary<string, int>(); 

foreach (var word in file) 
    if (dict.ContainsKey(word)) 
    dict[word]++; 
    else 
    dict[word] = 1; 
6

당신이 그들을 그룹화하고 사전에 그것을 돌려 문자열에서 단어를 셀 수 그렇습니다.

0

그루비 정규식 facilty을 사용하여, 나는 다음과 같이 그것을 할 것입니다 : -

def input=""" 
    i love love vb development although i m a total newbie 
""" 

def dictionary=["love", "development", "fire", "stone"] 


dictionary.each{ 
    def pattern= ~/${it}/ 
    match = input =~ pattern 
    println "${it}" + "-"+ match.count 
} 
+0

데이빗에게 감사드립니다. – Rishi

0

이보십시오. 변수 words는 분명히 당신의 문자열입니다. keywords 배열은 집계 할 키워드의 목록입니다.

텍스트에없는 사전 단어에 대해서는 0을 반환하지 않지만이 동작은 괜찮다고 지정했습니다. 이렇게하면 응용 프로그램의 요구 사항을 충족시키면서 상대적으로 우수한 성능을 얻을 수 있습니다.

string words = "i love love vb development although i m a total newbie"; 
string[] keywords = new[] { "love", "development", "fire", "stone" }; 

Regex regex = new Regex("\\w+"); 

var frequencyList = regex.Matches(words) 
    .Cast<Match>() 
    .Select(c => c.Value.ToLowerInvariant()) 
    .Where(c => keywords.Contains(c)) 
    .GroupBy(c => c) 
    .Select(g => new { Word = g.Key, Count = g.Count() }) 
    .OrderByDescending(g => g.Count) 
    .ThenBy(g => g.Word); 

//Convert to a dictionary 
Dictionary<string, int> dict = frequencyList.ToDictionary(d => d.Word, d => d.Count); 

//Or iterate through them as is 
foreach (var item in frequencyList) 
    Response.Write(String.Format("{0}, {1}", item.Word, item.Count)); 

당신은 당신이 모든 소문자와 공백으로 구분 알고 표시된 이후 정규식을 사용하지 않고 같은 일을 달성하려면 위과 같이 코드를 수정할 수 :

string words = "i love love vb development although i m a total newbie"; 
string[] keywords = new[] { "love", "development", "fire", "stone" }; 

var frequencyList = words.Split(' ') 
    .Select(c => c) 
    .Where(c => keywords.Contains(c)) 
    .GroupBy(c => c) 
    .Select(g => new { Word = g.Key, Count = g.Count() }) 
    .OrderByDescending(g => g.Count) 
    .ThenBy(g => g.Word); 

Dictionary<string, int> dict = frequencyList.ToDictionary(d => d.Word, d => d.Count); 
관련 문제