最有效的方法来创建一个天真的文本摘要算法

时间:2014-04-26 03:13:47

标签: c++ performance algorithm parsing summarization

我正在构建一个简单的天真文本摘要算法。该算法的工作方式如下:

  • 我的算法的第一步是删除所有停用词(stop words in English)。
  • 在我的文字只包含具有实际含义的单词后,我将查看文本中每个单词使用多少次以查找单词的频率。例如,如果单词"超级计算机"使用5次,它将有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;
  • 停用词将预先加载到V8 Local Array或std :: vector。
  • 对于文本中的每个单词,我将循环遍历所有停用词,如果当前单词不是停用词,则检查它是否在结构中,如果不是 - &gt;向word添加新的Words vector,如果存在则将频率增加1。
  • 在找到所有单词的所有频率后,我将再次遍历文本以找到每个句子的重量。

有了这个想法,我脑子里几乎没有出现任何问题:

  1. 我的文字大多是1000多个单词。对于每个循环100多个停用词的单词,将进行100000次迭代,以找出停用词。这似乎真的无效。
  2. 在我有频率后,我需要再循环一次1000+单词的300+单词(在矢量频率中)来计算每个句子的重量。
  3. 我的想法似乎无效,但我对C ++并不熟悉。

    所以我的问题是有更好的方法来做到这一点或优化我的算法,尤其是我上面列出的问题吗?

    我担心我的算法的性能,我们将非常感谢任何提示/建议。

1 个答案:

答案 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