在文本搜索引擎项目中,需要对已排序的文章进行摘要提取,然后与标题,路径一起封装成Json数据返回客户端。因此这里我自己写一个自动摘要,来大概完成这个任务。在自动摘要提取过程中,使用了一个分词库:CppJieba分词库。因此在头文件中包含了头文件 “Application.hpp”。

思路:

  1、对文章提取关键字。通常,关键字能够代表这篇文章的所描述的内容。因此使用CppJieba分词库中“Application.hpp”中api  extract()进行关键字提取。我提取的是前50个,若文章关键字不够50个则取实际个数。关键字的结果已经按照权重的顺序排序好。

  2、把文章拆分成句子。这里是只对中文进行处理(英文道理也一样),当遇到句号‘  。’,问号‘ ? ’,感叹号‘ ! ’,算一句话。把每一句话按顺序保存到vector<string>类型的数组sentences中。

  3、遍历关键字数组,对每一个关键字在每一个句子中查找包含该关键字的第一个句子,并把该句子加入到vector<string>类型的数组summary中。

  4、若遍历到达关键字上限或者句子数量到达上限,跳出循环。

  5、将数组summary中的句子按顺序拼接从摘要。

代码如下:

 #ifndef _AUTOSUMMERY_HPP
#define _AUTOSUMMERY_HPP
#include"../src/Statistics/src/Application.hpp"
#include <string>
#include<set>
#include <utility>
#include<vector>
#include<iostream>
#include<functional>
using namespace std;
using namespace CppJieba;
class AutoSummary
{
public:
AutoSummary(Application &app,int maxSentenceNum=)//初始化一个自动摘要对象
:maxSentenceNum_(maxSentenceNum),
app_(app)
{} //自动提取摘要
string summarizer(string & originTxt,int KEYNUM=)
{
vector<pair<string,double> > keywords;
app_.extract(originTxt,keywords,KEYNUM); //取文章的前50个关键词,按权重排序
vector<string> sentences; //装载句子的数组
getSentences(originTxt,sentences); //把文章拆分成句子
int sentencesNum = sentences.size(); //句子的数量
vector<string> summaryRet; //装包含关键字的句子
set<int> summarySet; //句子去重
set<int>::iterator it;
KEYNUM = keywords.size();//如果关键字数量小于50则取实际的数量
for(int i = ;i<KEYNUM;i++)
{
for(int j = ;j<sentencesNum;j++)
{
int pos = sentences[j].find(keywords[i].first,);
if(pos!=string::npos)
{
it = summarySet.find(pos);
if(it==summarySet.end())
{
summaryRet.push_back(sentences[j]);//向数组添加句子
summarySet.insert(j);
break; //跳出循环,找下一个关键字
}
}
}
//跳出循环的条件
if(summaryRet.size()>maxSentenceNum_||summaryRet.size()>=sentencesNum)
break;
}
string summaryStr;
int i = ;
int num = summaryRet.size();
while(i<num)
{
summaryStr = summaryStr + sentences[i]+"……";
i++;
} return summaryStr;
} private:
//将文章拆分成句子,私有成员函数,在summarizer()中调用
void getSentences(const string &originTxt,vector<string> &sentenceVec)
{
int beg=,end=,pos=,pos1=;
int txtSize = originTxt.size();
while(beg<txtSize&&pos!=string::npos)
{
if((pos=originTxt.find("。",beg))!=string::npos)
{
if((pos1=originTxt.find("?",beg))!=string::npos)
{
pos=((pos<pos1)?pos:pos1);
if((pos1=originTxt.find("!",beg))!=string::npos)
{
pos=((pos<pos1)?pos:pos1);
} }
else if((pos1=originTxt.find("!",beg))!=string::npos)
{
pos=((pos<pos1)?pos:pos1);
}
}
else if((pos=originTxt.find("?",beg))!=string::npos)
{
if((pos1=originTxt.find("!",beg))!=string::npos)
{
pos=((pos<pos1)?pos:pos1);
} }
else if((pos1=originTxt.find("!",beg))!=string::npos)
{
pos = pos1;
}
else
{
break;
}
if(pos!=-)
{
int len = pos-beg;
string sentence(originTxt.substr(beg,len));
sentenceVec.push_back(sentence);
beg = pos+;
}
}
} private:
Application & app_;//分词库的引用
int maxSentenceNum_;//摘要中的句子数目,由外部传进。
};
#endif

参考:http://www.ruanyifeng.com/blog/2013/03/automatic_summarization.html

自动提取文章摘要AutoSummary的更多相关文章

  1. Django HTML 显示文章摘要

    在用Django写个人博客,发现一般都是标题加上文章摘要,然后点击标题可以看详细内容.这样主页就可以多显示几篇文章. 那么就要用到文章摘要功能. 比如要100个字的文章摘要,就可以这样写: {{art ...

  2. wordpress自动截取文章摘要代码

    想要实现 wordpress 首页显示摘要有几种方法: 第一种,可以在写文章的时侯在需要分割的地方加入<!–more–>标签,但在输出首页摘要的同时,也会使feed只显示摘要,不方便读者阅 ...

  3. dedecms首页调用的简介一直修改不了是自动文章摘要在作怪

    一位美女问:dedecms首页调用的简介一直修改不了,ytkah让她到具体的文章修改,然后再重新生成一下首页.她说还是不行.那就奇了怪了,点击到具体的文章页面是显示已经修改好了,为什么首页还是原来的呢 ...

  4. dede文章摘要字数的设置方法

    本文转自:http://blog.csdn.net/yxwmzouzou/article/details/17491991 在织梦系统中(针对5.7版本),文章摘要(可以通过以下四种相关标签调用)被设 ...

  5. WordPress批量修改文章内容、URL链接、文章摘要

    通过SQL语句来批量修改wordpress博客内容,文章中所有语句都使用默认的wp_表前缀,如果您的数据表前缀不是wp_则需要在语句中作相应更改. 方法/步骤   批量修改文章内容 如果您想替换之前写 ...

  6. DEDECMS织梦文章摘要批量更改方法

    我们建站有时候需要直接把数据库导入,只要修改一下基本的名称信息就可以直接用,但是遇用到一些问题.比如文章摘要不会随着文章内容的更新而更新.织梦(dede)在添加文章的时候会自动生成文章摘要,如果重新修 ...

  7. 【Common】NO.81.Note.1.Common.1.002-【文章摘要】

    1.0.0 Summary Tittle:[Common]NO.81.Note.1.Common.1.002-[文章摘要] Style:Common Series:Common Since:2018- ...

  8. django 使用内建过滤器实现文章摘要效果

    django 使用内建过滤器实现文章摘要效果 前端html代码 <div class="list-group"> {% if articles %} {% for ar ...

  9. wordpress调用文章摘要,若无摘要则自动截取文章内容字数做为摘要

    以下是调用指定分类文章列表的一个方法,作者如果有填写文章摘要则直接调用摘要:如果文章摘要忘记写了则自动截取文章内容字数做为摘要.这个方法也适用于调用description标签 <ul> & ...

随机推荐

  1. LAMP_yum安装

    前言,人总是会越来越懒,说真的,我是摸着良心说话的 开始总是喜欢源码安装,因为可以定制,而且能显得有格调(逼格),但是一安装就要半天,还有各种依赖包的安装,各种报错,不忍直视 下面是我摘自晚上的一篇l ...

  2. c#后台调用API

    前两周赶上项目第一个版本上线,着实忙了一把,毕竟只有两个人负责.如今已完结,总算喘了一口气,现在任务就是写API.测API,许久之前写过JS前台调用 项目API,也写过后台调用开放的手机号归属地查询, ...

  3. Python CRM项目四

    实现Django Admin的多对多的复选框效果 效果:左边显示的是未选中的字段,右边显示的是已选中的字段,两边点击的标签可以互相更换 首先在king_admin.py中增加filter_horizo ...

  4. ABP官方文档翻译 4.4 授权

    授权 介绍 关于IPermissionChecker 定义权限 检查权限 使用AbpAuthorize特性 AbpAuthorize特性注意点 抑制授权 使用IPermissionChecker 在R ...

  5. ABP官方文档翻译 4.3 校验数据传输对象

    校验数据传输对象 校验简介 使用数据标注 自定义校验 禁用校验 标准化 校验简介 应用的输入首先应该被校验.输入可以是用户的也可以是其他应用的.在一个web应用中,校验通常实现两次:客户端和服务端.客 ...

  6. Python基础篇(七)

    加上两个下划线变量或者方法变为私有. >>> class Bird: ...    __song = "spark" ...    def sing(self): ...

  7. 夏令营提高班上午上机测试 Day 4 解题报告

    我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...

  8. BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]

    传送门 题意:三种颜色,规定使用每种颜色次数$r,g,b$,给出一个置换群,求多少种不等价着色 $m \le 60,\ r,g,b \le 20$ 咦,规定次数? <组合数学>上不是有生成 ...

  9. java泛型类的继承规则

    首先看一看java泛型类的使用: /** * 一个泛型方法:使程序更加安全 * 并且能被更多的使用 * @author 丁** * * @param <T> */ class Pair&l ...

  10. hiveql函数笔记(二)

    1.数据查询 //提高聚合的性能 SET hive.map.aggr=true; SELECT count(*),avg(salary) FROM employees; //木匾不允许在一个查询语句中 ...