2012-03-11 5 views
0

私はこの質問をGoogleで探知し、私のコードで働く答えを見つけることができませんでしたので、単語の頻度を得るためにこれを書いたので、私はフルークだと思うが、それ以外の言葉の出現。また、私は単語がすでにベクトルに入力されているかどうかを確認しているので、同じ単語を2回カウントしません。ベクトルからワード周波数を得るには

fileSize = textFile.size(); 
vector<wordFrequency> words (fileSize); 
int index = 0; 
for(int i = 0; i <= fileSize - 1; i++) 
{ 
    for(int j = 0; j < fileSize - 1; j++) 
    { 
     if(string::npos != textFile[i].find(textFile[j]) && words[i].Word != textFile[j]) 
     { 
      words[j].Word = textFile[i]; 
      words[j].Times = index++; 
     } 
    } 
    index = 0; 
} 

助けてください。

+0

予想よりも発生回数が増えていますか?そして、あなたのプログラムで、テキストファイルのfindメンバー関数は何をするのですか? – bhuwansahni

+0

@bhuwansahniはい私は正しいものを手に入れています。 findは、一致する文字列を探すベクトル関数です。 – bobthemac

+0

そして、失敗と成功で何が戻ってくるのか? – bhuwansahni

答えて

1

テキストファイルベクトル内の発生なしを見つけるために...

struct wordFreq{ 
    string word; 
    int count; 
    wordFreq(string str, int c):word(str),count(c){} 
    }; 
vector<wordFreq> words; 

int ffind(vector<wordFreq>::iterator i, vector<wordFreq>::iterator j, string s) 
{ 
    for(;i<j;i++){ 
     if((*i).word == s) 
      return 1; 
    } 
    return 0; 
} 

コードをこのコードを試すことは、その後です:使用

for(int i=0; i< textfile.size();i++){ 
    if(ffind(words.begin(),words.end(),textfile[i])) // Check whether word already checked for, if so move to the next one, i.e. avoid repetitions 
     continue; 
    words.push_back(wordFreq(textfile[i],1));   // Add the word to vector as it was not checked before and set its count to 1 
    for(int j = i+1;j<textfile.size();j++){   // find possible duplicates of textfile[i] 
     if(file[j] == (*(words.end()-1)).word) 
      (*(words.end()-1)).count++; 
    } 
} 
+0

ちょっと微調整が必​​要でしたが、助けてくれてありがとうございました。 – bobthemac

+1

おっと...これは厄介です! 'map'や' unordered_map'クラスを使う方がはるかに簡単です! –

+0

地図を使用するほうがはるかに優れているかもしれませんが、それを使用したくない場合は... – bhuwansahni

2

代わりにstd::map<std::string,int>を使用することを検討してください。マップクラスは、重複がないことを保証します。あなたがマップ・コンテナを使用しない代わりに、場合

2

結合容器:

typedef std::unordered_map<std::string, unsigned> WordFrequencies; 

WordFrequencies count(std::vector<std::string> const& words) { 
    WordFrequencies wf; 
    for (std::string const& word: words) { 
    wf[word] += 1; 
    } 
    return wf; 
} 

簡略化するのは難しいです...

注:ワールドをアルファベット順に並べ替える場合は、unordered_mapmapに置き換えることができます。大文字と小文字を区別しないようにカスタム比較操作を記述することができます。