我正在构建一个简单的天真的文本摘要算法。该算法的工作原理如下:
- 我算法的第一步是删除所有停用词(英语停用词)。
- 在我的文本仅包含具有实际含义的单词后,我将查看每个单词在文本中使用了多少次以查找该单词的频率。例如,如果“超级计算机”这个词被使用了 5 次,它将具有
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;
- 停用词将被预加载到 V8 本地数组或 std::vector 中。
- 对于文本中的每个单词,我将遍历所有停用词,如果当前单词不是停用词,则检查它是否在结构中,如果不是 -> 添加一个新词
word
,Words vector
如果存在则增加频率1. - 在我找到所有单词的所有频率之后,我将再次循环遍历文本以找到每个句子的权重。
有了这个想法,我想到了几个问题:
- 我的文本将主要是 1000 多个单词。并且对于每个循环通过 100 多个停用词的单词,将进行 100000 次迭代以找出停用词。这似乎真的无效。
- 在我获得频率之后,我需要在文本 1000 多个单词和 300 多个单词(在向量频率中)循环一次,以计算每个句子的权重。
我的想法似乎无效,但我对C++不太熟悉。
所以我的问题是有没有更好的方法来做到这一点或优化我的算法,尤其是我上面列出的问题?
我担心我的算法的性能,任何提示/建议将不胜感激。