Я строю простой наивный текстовый алгоритм. Алгоритм работает так:
frequency = 5
,sum of the frequencies of all words in the sentence
к number of the words in the sentence
,Мне нужно написать этот алгоритм на C ++ (как модуль V8 NodeJS), но проблема в том, что в последние несколько лет я работал в основном с высокоуровневыми языками сценариев, такими как Javascript, и я не настолько опытен в C ++. В javascript я мог бы просто использовать регулярные выражения, чтобы удалить все стоп-слова, а затем найти частоту, но в C ++ это выглядит намного сложнее.
Мне пришла в голову следующая идея:
struct words {
string word;
int freq;
}
std::vector<words> Words;
word
к Words vector
, если существует, увеличьте частоту на 1.И с этой идеей у меня возникло несколько проблем:
Моя идея кажется неэффективной, но я не очень хорошо знаком с C ++.
Итак, мои вопросы: есть ли лучшие способы сделать это или оптимизировать мой алгоритм, особенно проблемы, которые я перечислил выше?
Я беспокоюсь о производительности моего алгоритма, и любые советы / предложения будут с благодарностью.
Для стоп-слов, посмотрите на std::unordered_set
. Вы можете хранить все свои строки стоп-слов в std::unordered_set<string>
тогда, когда у вас есть строка, которую вы хотите сравнить, позвоните count(string)
чтобы увидеть, если это существует.
Для пар слово / частота используйте std::unordered_map
как в некоторых комментариях. Это будет быстрее, если вы выполните поиск и вставку в одном поиске карты. Попробуйте что-то вроде этого:
struct Frequency
{
int val;
Frequency() : val(0) {}
void increment()
{
++val;
}
};
std::unordered_map<std::string, Frequency> words;
void processWord(const std::string str)
{
words[str].increment();
}
words[str]
ищет слово на карте, добавляя его, если оно не существует. Новые слова будут вызывать конструктор Frequency, который инициализируется нулем. Так что все, что вам нужно сделать, это позвонить processWord
на каждое слово.