我正在构建一个简单的天真文本摘要算法。该算法的工作方式如下:
frequency = 5
。sum of the frequencies of all words in the sentence
除以number of the words in the sentence
来计算每个句子的重量。我需要用C ++编写这个算法(作为V8 NodeJS模块),但问题是在过去的几年里,我一直在使用Javascript和I&m等高级脚本语言。没有经验的C ++。在javascript中我可以使用正则表达式删除所有停用词然后找到频率,但在C ++中似乎要复杂得多。
我提出了以下想法:
struct words {
string word;
int freq;
}
std::vector<words> Words;
word
添加新的Words vector
,如果存在则将频率增加1。有了这个想法,我脑子里几乎没有出现任何问题:
我的想法似乎无效,但我对C ++并不熟悉。
所以我的问题是有更好的方法来做到这一点或优化我的算法,尤其是我上面列出的问题吗?
我担心我的算法的性能,我们将非常感谢任何提示/建议。
答案 0 :(得分:0)
对于停用词,请查看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
。