Получение частоты слов из вектора в C ++ - PullRequest
0 голосов
/ 11 марта 2012

Я гуглил этот вопрос и не смог найти ответ, который работал с моим кодом, поэтому я написал это, чтобы получить частоту слов, единственная проблема в том, что я получаю неправильное количество вхождений слов, кроме одного, которыйЯ думаю, что это случайность.Также я проверяю, введено ли уже слово в вектор, чтобы я не считал одно и то же слово дважды.

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 ]

2 голосов
/ 11 марта 2012

Использование ассоциативного контейнера:

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 голосов
/ 11 марта 2012

Попробуйте вместо этого использовать std::map<std::string,int>.Класс карты будет обрабатывать, гарантируя, что у вас нет дубликатов.

1 голос
/ 11 марта 2012

вместо этого попробуйте этот код, если вы не хотите использовать контейнер карты.

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