在c ++中从向量中获取单词频率

时间:2012-03-11 11:25:27

标签: c++ vector struct words

我搜索了这个问题并找不到与我的代码一致的答案,所以我写这个以获得单词的频率唯一的问题是我得到错误的单词出现次数我认为是侥幸。此外,我正在检查是否已经在矢量中输入了一个单词,所以我不计算两次相同的单词。

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

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

请考虑使用std::map<std::string,int>。地图类将处理确保您没有任何重复项。

答案 1 :(得分: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_map替换为map,并且您可以编写自定义比较操作来对其进行不区分大小写的处理。

答案 2 :(得分: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++;
    }
}