治以从文本文档中提取关键短语+(rule to extract key+phrases from a

2019-10-21 12:48发布

我想提取从文件的关键短语:“事情的关键短语END东西...... ECT”。 我的规则运作良好,但结果不包含关键的名字。 什么应该是为了得到一个字符串的规则:“关键短语”。 谢谢你的建议。

std::vector<std::string> doc; 
bool r = qi::phrase_parse(first,last, 
  ( qi::omit[*(qi::char_-"KEY")] 
    >> qi::lexeme[ "KEY"
    >> *(qi::char_-"KEY" -"END")] ) % "END"
, qi::space, doc);

Answer 1:

qi::lit(...)不合成的属性。

qi::string(...)一样。

替换"KEY"具有补气::字符串( “KEY”),有可能。 (很难说在不知道的类型doc

bool r = qi::phrase_parse(first,last, 
  ( qi::omit[*(qi::char_-"KEY")] 
    >> qi::lexeme[ qi::string("KEY")
    >> *(qi::char_-"KEY" -"END")] ) % "END"
, qi::space, doc);

BONUS参见seek[]解析器指令从精神资源库:

seek[]解析器指令跳过所有输入,直至主题解析器匹配。

这是我会怎么做:

住在Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_seek.hpp>
namespace qi = boost::spirit::qi;
namespace qr = boost::spirit::repository::qi;

extern std::string const sample; // below

int main() {
    auto f(sample.begin()), l(sample.end());

    std::vector<std::string> phrases;

    if (qi::parse(f,l, *qi::as_string[
                qr::seek[qi::string("KEY")] >> *(qi::char_ - "END")
            ], phrases)) 
    {
        for (size_t i = 0; i < phrases.size(); ++i) 
            std::cout << "keyphrase #" << i << ": '" << phrases[i] << "'\n";
    }
}

打印:

keyphrase #0: 'KEY@v/0qwJTjgFQwNmose7LiEmAmKpIdK3TPmkCs@'
keyphrase #1: 'KEY@G1TErN1QSSKi17BSnwBKML@'
keyphrase #2: 'KEY@pWhBKmc0sD+o@'
keyphrase #3: 'KEY@pwgjNJ0FvWGRezwi74QdIQdmUuKVyquWuvXz4tBOXqMMqco@'
keyphrase #4: 'KEY@aJ3QUfLh3AqfKyxcUSiDbanZmCNGza6jb6pZ@'
keyphrase #5: 'KEY@bYJzitZUyXlgPA009qBpleHIJ9uJUSdJO78iisUgHkoqUpf+oXZQF9X/7v2fikgemCD@'

包括在这个答案评论样本数据:/这里/



Answer 2:

最终基准:

  • 灵奇(以上sahe的解决方案) - 项目数:5585已用时间:183.676秒
  • 升压正则表达式 - 物品数:5585已用时间:197.684秒
  • xpressive中的regex - 物品数:5585已用时间:232.597秒

数据大小:23.9 MB的文本文件



文章来源: rule to extract key+phrases from a text document