搜索引擎中的动态摘要开发(一)

  动态摘要(dynamic abstract) ,搜索引擎术语,是一种对被检索的文档进行主要内容动态显示的技术。 对于搜索引擎来说,当响应用户查询的时候,根据查询词在文档中出现的位置,提取出查询词周围相关的文字并返回给用户。由于一篇文档会被不同的查询词(query)召回,因此动态摘要技术。 根据query term的不同,对同一个文档形成不同的摘要文字。 与动态摘要相对应的概念是“静态摘要”(static abstract),静态摘要由搜索引擎预先提取并保存好,当url被搜索引擎展现时,直接显示该摘要,不受query的不同而改变。

       这块挺有意思的,这几天在用C++实现它,基于的原理是一篇论文《基于滑动窗口的动态摘要实现算法》,目前实现了一半,主要有三个问题没有解决,一个是摘要评分的五个标准我才实现了关键词数目这一个标准,其他基本没怎么实现,这个才是动态摘要的精华所在,准确率完全依靠这块的实现,得加快进度了;二是摘要显示,比如句子黏度和前后断句等等;三是我对容器的掌握太搓了,很多地方应该用容器的地方我都用数组替代,这点很不合理,亟待改进。

      下周内完成这个,加油。。。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <string.h>
using namespace std;


//根据长度参数返回一个字符串的子串,从start开始取length个字符
string subStr(const char *s1, int start, int length){
string subStr="";
for(int i=0,p=0;i<length;s1++){
if(p==start){
subStr+=*s1;
i++;
}
else
p++;
}
return subStr;
}
//评分函数
int computeScore(int location[] ,string value[],int start, int length){
int score=0;
//出现一次关键词分数加1
for(int i=start;i<start+length;i++){
for(int j=0;j<1000;j++){
if(location[j]==i)
score++;
}
}
return score;


}
//等同于split分割函数效果
vector<string> splitEx(const string& src, string separate_character)
{
    vector<string> strs;
    
int separate_characterLen = separate_character.size();//分割字符串的长度,这样就可以支持如“,,”多字符串的分隔符
    int lastPosition = 0,index = -1;
    while (-1 != (index = src.find(separate_character,lastPosition))){
        strs.push_back(src.substr(lastPosition,index - lastPosition));
        lastPosition = index + separate_characterLen;
    }
    string lastString = src.substr(lastPosition);//截取最后一个分隔符后的内容
    if (!lastString.empty())
        strs.push_back(lastString);//如果最后一个分隔符后还有内容就入队
    return strs;
}
//判断被查文本中是否包含待查关键词中的任何一个,如果包含则返回该关键词,如果不包含则返回"0"
string isInvolve(const char *s1,vector<string> strs){
string s2="";
for ( vector<string>::size_type i=0; i!=strs.size(); i++){
s2=strs[i];
int len2=s2.length();
int n=strncmp( &s2[0], s1, len2 );
if(n==0){
return s2;
}
    }
return "0";
}
//找到待搜索词汇在文中的位置,扫描文章,构建逻辑图
int strstrFunc( char *s1,vector<string> strs,int location[],int length[],string value[]){
int keyNumber=0;
for ( int i=0,j=0; *s1; ++s1 ){
if (isInvolve(s1,strs)!="0"){
length[j]=isInvolve(s1,strs).length();
location[j]=i;
value[j]=isInvolve(s1,strs);
keyNumber++;
j++;
}
i++;
}
return keyNumber;
}
string returunAbstract(int keyNumber,string content,int location[],string value[]){
string abstractDemo[100][100];
int score[100][100];
int max_i=0;
int max_j=0;
for(int i=0;i<keyNumber;i++){
for(int j=i;j<keyNumber;j++){
abstractDemo[i][j]=subStr(&content[0],location[i],128)+"-----"+subStr(&content[0],location[j],128);
score[i][j]=computeScore(location,value,location[i],128)+computeScore(location,value,location[j],128);
if(score[i][j]>score[max_i][max_j]){
max_i=i;
max_j=j;
}
}
}
return abstractDemo[max_i][max_j];
}
//主体运行程序
void run(){
    ifstream fin("data.txt");
    string s;
    string query;
    string content;
    while(fin>>s)
    {
        content +=s;
    }
    cout << content<< endl;
cout<<"Input query:";
cin>>query;
int location[100];
int length[100];
int keyNumber=0;
string value[100];
    string del = " ";
    vector<string> strs = splitEx(query, del);
keyNumber=strstrFunc(&content[0],strs,location,length,value);
cout<<returunAbstract(keyNumber,content,location,value);
}
int main()
{
run();
return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值