精华内容
下载资源
问答
  • 网络信息检索

    2018-12-17 17:05:53
    网络信息检索工具是指在因特网上提供信息检索服务的计算机系统,其检索的对象是存在于因特网信息空间中各种类型的网络信息资源。
  • 网络信息检索大作业

    2017-07-13 15:41:21
    网络信息检索
  • 网络信息检索与利用-计算机信息检索全部课件。可以学习怎么检索和利用现代图书馆、网上等资料。
  • 网络信息检索.zip

    2019-11-29 16:36:58
    资源内容为网络信息检索的基本技巧的PPT课件,涉及sci,万方,中国知网的基本查询和高级查询技巧,可以应用于多种查询场景
  • 基于层次依赖的Markov网络信息检索扩展模型
  • 网络信息检索.doc

    2010-06-29 09:56:24
    本文通过对网络信息检索的基本原理、网络信息检索的技术及工具、网络信息检索的现状等方面进行分析研究,并对网络信息检索的发展趋势进行了预测,旨在寻找提高网络信息检索的手段和方法的有效途径,并最终提高网络...
  • 网络信息检索-pdf

    2009-12-05 20:08:50
    网络信息检索,讲解现代计算机网络环境下,如何进行信息检索的原理、技巧
  • 华工网络信息检索作业1和作业2答案全 可供学弟学妹们参考 董老师的课
  • 10月17日网络信息检索和利用实习题.ppt
  • 网络 信息检索与利用

    2009-09-16 18:20:03
    网络信息检索与利用 清华大学出版社 隋莉萍 主编
  • 网络信息检索效率分析~~~~~~~~~~~~~~~
  • 网络信息检索其他问题 网络信息检索其他问题
  • 一、网络信息检索 1、网络信息检索 常用函数 gethostname(); 获得主机名 getpeername(); 获得与套接字相连的远程协议地址 getsockname(); 获得本地套接口协议地址; gethostbyname(); 根据主机名 取得主机信息 ...

    一、网络信息检索

    1、网络信息检索 常用函数

    • gethostname();     获得主机名
    • getpeername();     获得与套接字相连的远程协议地址
    • getsockname();     获得本地套接口协议地址;
    • gethostbyname();  根据主机名 取得主机信息

                  endhostent()  :使用endhostent() 清空 申请的 结构体的空间;

    • gethostbyaddr();         根据主机地址取得主机信息
    • getprotobyname();      根据协议名取得 主机协议信息
    • getprotobynumber();   根据协议号取得主机协议信息
    • getservbyname();       根据服务器名取得 相关服务信息
    • getservbyport();          根据端口号取得相关服务信息

    2、在客户端代码中,使用 gethostbyname()函数去 输入域名  的方法 去连接服务器;

    #include <netdb.h>
    extern int h_errno;	
    struct hostent *gethostbyname(const char *name);
    
    name 指向主机名的指针(域名或 IP地址)
    
    
    #include <sys/socket.h>       /* for AF_INET */
    struct hostent *gethostbyaddr(const void *addr,socklen_t len, int type);
    
    注意:
        IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指
    定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()
    的新API,它是协议无关的,即可用于IPv4,也可用于IPv6.
    • 返回值:
      struct hostent {
            char  *h_name;            /* official name of host */
            char **h_aliases;         /* alias list */
            int    h_addrtype;        /* host address type */
            int    h_length;          /* length of address */
            char **h_addr_list;       /* list of addresses地址列表,指向主机的多个网络地址(网络字节序32位整数). */
        }          
        #define h_addr h_addr_list[0] /* for backward compatibility */
    
    • 结构体中,地址列表的存放示例:

                      

    3、错误处理 herror()、hstrerror()

        extern int h_errno;//出错号
            void herror(const char *s);/打印错误信息
            const char *hstrerror(int err);//打印错误信息

    4、客户端使用 gethonstbyname 指定域名  连接 服务器示例:

    #include "net_pth.h"
    #include <netdb.h>
    
    void usage(const char* s){
    	printf("\n %s serv_ip ser_port \n",s);
    	printf("\n\t serv_ip: server ip address");
    	printf("\r\n serv_port: server port(>5000)\n\n");
    }
    
    int main(int argc, const char *argv[])
    {
    	int fd = -1;
    	int port = 0;
    	struct sockaddr_in sin;
    	struct hostent *hs = NULL;
    	/* 1、创建socket fd */
    	if((fd = socket(AF_INET , SOCK_STREAM,0)) < 0 ){ //创建TCP 通信 Socket文件描述符
    		perror("socket");
    		exit(1);
    	}
    	if(argc != 3 ){
    		usage(argv[0]);
    		exit(1);
    	}
    	port = atoi(argv[2]);
    	if (port < 5000){
    		usage(argv[0]);
    		exit(1);
    	}
    	
    	if((hs = gethostbyname(argv[1])) == NULL){  //根据主机名 获取 主机信息
    		perror("gethostbyname");
    		exit(1);
    	}
    
    	/* 2、连接服务器 */
    	/* 2.1 填充 struct sockaddr_in 结构体变量 */
    	bzero(&sin,sizeof(sin));
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(port);
    
    	sin.sin_addr.s_addr = *(uint32_t *)hs->h_addr; //把获取的主机IP地址,填充进入结构体中
    	endhostent();
    	hs = NULL;
        printf("Client staring .... OK! \n");
    
    	/* 2、2 连接服务器 */
    	if( connect(fd ,(struct sockaddr *)&sin,sizeof(sin)) < 0){
    		perror("connect");
    		exit(1);
    	}
    
    	/* 3、读写数据*/
    	char buf[BUFSIZ];
    	while(1){
    		bzero(buf, sizeof(buf));
    		if(fgets(buf,BUFSIZ-1,stdin) == NULL){
    			continue;
    		}
    		write(fd , buf , strlen(buf));
    		if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){
    			break;
    		}
    	}
    	/* 4、关闭套接字*/
    	close(fd);
    }

    二、网络属性设置

     

    1、网络属性设置接口

    • getsockopt 和 setsockopt
    • int getsockopt(int sockfd , int level , int optname , void *optval , socklen_t  *optlen);
    • int setsockopt(int sockfd , int level , int optname , const void *optval,  socklen_t *optlen);
      1. level 指定控制套接字的层次,可以取三种值:
        1. SOL_SOCKET:   通用套接字选项 (应用层)
        2. IPPROTO_IP:    IP选项;(网络层)
        3. IPPROTO_TCP:  TCP选项(传输层)
    • 以setsockopt为主;
    • optname 指定控制的方式(选项的名称),我们下面详细解释;

                               

       —  划线部分一般是对应层,常用控制的方式;

    2、示例

    在以上例子中 ,替换其中的参数,得到一般的想要的效果;

    其中发送与接收超时的数据类型为:struct  timeval结构体类型;

    其中 setsockopt()函数中 参数const void *optval  ---  传给实现效果的相应的参数;

    其中timeval 的定义如下:
    struct timeval{
    
          long  tv_sec;            /*seconds : 秒*/
    
          long  tv_usec;         /*microseconds: 微妙 */
    
    }
    /*允许广播 */
    
    int  b_br = 1;
    
    setsockopt(fd , SOL_SOCKET , SO_BROADCAST, &b_br, sizeof(int));
    
    /*设置 接收超时 */
    
    struct  timeval  tout;
    
    tout.tv_sec = 5;
    
    tout.tv_usec = 0;
    
    setsockopt(fd,SOL_SOCKET , SO_RCVTIMEO , &tout , sizeof(tout));

    三、超时检查

    • 网络超时:在网络通信中,很多操作会使得进程阻塞;
    • TCP套接字中的recv/accept/connect;
    • UDP套接字中的recvfrom
    • 超时检测的必要性
      1. 避免进程在没有数据时无限制地阻塞;
      2. 当设定的时间到时,进程从原操作返回继续运行;

    1、网络超时优化 第一种方法:设置socket 的属性 SO_RCVTIMEO

    参考代码如下:

    struct timeval  tv;
    tv.tv_sec = 5; //设置5秒时间
    tv.tv_usec = 0; //
    setsockopt(sockfd , SOL_SOCKET , SO_RCVTIMEO , &tv , sizeof(tv)); //设置接收超时
    recv()/recvfrom()  //从socket读取数据;

    2、网络超时优化 第二种方法:用select 是否 ‘ready’

    参考代码如下:

    struct fd_set  rdfs;
    while(1)
    {
        struct timeval tv = {5,0};
        FD_ZERO(&rdfs);
        FD_SET(socket,&rdfs);
        if(select(sockfd -1,&rdfs,NULL,&tv) > 0)//socket就绪
        {
            recv() / recvfrom ()  // 从socket 读取数据
        }
    }

    3、网络超时优化 第三种方法:设置定时器(timer),捕捉SIGALRM信号

    参考代码如下:

    void handler(int signo) {return ;}
    
    struct sigaction act;
    sigaction(SIGALRMR , NULL ,&act);
    act.sa_flags &= ~SA_RESTART;//清除掉SIGALRM信号SA_RESTART
    sigaction(SIGALRM,&act,NULL);
    alarm(5);
    if(recv(, , , ) < 0) ......;

    四、心跳检测

    1、如何在linux中动态检查到是否有网络以及网络中途的掉线/连接的检查?

    • 应用层

                  —  心跳检测;

    • 内核中

                  —  网卡驱动中 2.6内核里面,使能1s的周期性检查定时器;

                  —  网卡硬件或者我们通过GPIO,插拔网线时候产生中断,处理相应中断  ;//立即检测到

    2、心跳检测的两种方法

    方法一:

    客户端 隔一定的时间向服务器发送一段数据,告诉服务器客服端在保持连接;规定在一定的次数,接收不到对方的回应则判定异常;

    方法二:

    • 可通过setkeepAlive()函数 ,来改变套接字的属性;(默认两个小时去检测一次客户端是否掉线)

    参考代码如下:

    void setKeepAlive(int sockfd , int attr_on ,socklen_t idle_time,socklen_t interval,socklen_t cnt)
    {
        setsockopt(sockfd , SOL_SOCKET , SO_KEEPALIVE,(const char *)&attr_on,sizeof(attr_on));
        setsockopt(sockfd , SOL_TCP , TCP_KEEPIDLE  , (const char*)&idle_time,sizeof(idle_time));
        setsockopt(sockfd , SOL_TCP , TCP_KEEPINTVL , (const char *)&interval,sizeof(interval));
        setsockopt(sockfd , SOL_TCP , TCP_KEEPCNT   , (const char *)&cnt,sizeof(cnt));
    }
    
    void cli_data_handle(void *arg)
    {
        int newfd = *(int *)arg;
    
        int keepAlive = 1;   //设定keepAlive
        int keepIdle = 5;   //开始首次keepAlive探测前的TCP空闲时间
        int kepInterval = 5; //两次keepAlive 探测间的 间隔时间
        int keepCount = 3;  // 判定断开前的keepAlive 的探测次数
        
        setKeepAlive(newfd ,keepAlive ,keepIdle ,kepInterval ,keepCount );
    
        //..和newfd进行数据读写
        int ret = -1;
        char buf[BUFSIZE];
        char resp_buf[BUFSIZE + 10];
        while(1) 
        {
            bzero(buf,BUFSIZE);
            do{
                ret = read (newfd , buf ,BUFSIZE - 1);
               }while(ret < 0 && BINTR == errno);
            if(ret < 0)
            {
                perror("read");
                exit(1);
            }
        }
    }

     

    展开全文
  • 网络信息检索发展趋势展望~~~~~~~~~~~~~~~~~
  • 网络信息检索策略的设计~~~~~~~~~~~~~~~~~~~
  • 国外网络信息检索研究现状~~~~~~~~~~~~~~~~~~~~~~
  • 搜索引擎与网络信息检索的课件 第一章 网络信息检索概述.ppt
  • 网络信息检索技术

    2012-03-23 10:11:44
    本文重点讲述 布尔逻辑检索技术 截词检索技术 限制检索技术 模糊检索 邻接检索技术、加权检索、原文检索
  • 影响网络信息检索效率的因素~~~~~~~~~~~~~~~~~
  • 基于N层向量空间模型的网络信息检索平台 基于N层向量空间模型的网络信息检索平台
  • 第一部分1一条及时的信息可能使濒临破产的企业起死回生一条过时的信息可能分文不值甚至是企业丧失难得的发展机遇造成严重后果这说明信息具有C特征A差异性B传递性C时效性D共享性2培养学生养成良好的信息素养主
  • 文章目录一、 为什么要进行检索评价?评价的重要性评价检索系统的困难IR的评价指标二、 检索评价指标基于集合的有效性测度查准率与查全率如何评测结果?插值需要考虑的几个问题其他多种重要指标单一指标:F指标(F-...

    一、 为什么要进行检索评价?

    • 有很多信息检索系统/检索模型/检索算法,哪个最好呢?
    • 在一个信息检索系统内,哪部分最好呢?
      排序算法 (dot-product, cosine, …)
      词的选取 (stopword removal, stemming…)
      权重的定义 (TF, TF-IDF,…)
    • 用户如果需要获取找到一些/全部的相关文献,在排序结果集中还要走多远?

    评价的重要性

    • 可以测试各种差异和实验效果
      系统工作得怎样?
      系统A比系统B好吗?
      它的结果是真的吗?
      需要什么条件?

    • 评价可以推动研究方向
      确认什么技术可行或不可行


    评价检索系统的困难

    • 检索效果是和检索出文献的相关性密切相关的

    • 一般地,相关性不是二值的,而是连续的
       即使相关性是二值的,也很难做出判断

    • 相关性,从人类的观点来看是:
       主观的(Subjective): 依赖于某个特定用户的判断
       情景的(Situational): 跟用户当前的需求密切相关
       认知的(Cognitive): 依赖于人类的认知和行为
       动态的(Dynamic): 随着时间推移而改变


    IR的评价指标

    • 效率(Efficiency)—可以采用通常的评价方法
      时间开销
      空间开销
      响应速度

    • 效果(Effectiveness)
      返回的文档中有多少相关文档
      所有相关文档中返回了多少
      返回得靠不靠前

    • 其他指标
      覆盖率(Coverage)
      访问量
      数据更新速度

    效率和效果是两个最重要的指标


    二、 检索评价指标

    基于集合的有效性测度

    在这里插入图片描述

    查准率与查全率

    在这里插入图片描述


    查全率和查准率的含义

    • 查准率(Precision):检索出很相关文档的能力(质量上)
      检出的结果集中有多少是相关的?
      检索出最相关文献并排在前列的能力
      对搜索引擎而言,查准率比较重要,因为相关文档太多了。
    • 查全率(Recall):检索出所有相关文档的能力(数量上)
      相关文献集中有多少被被检出?
      • 对法律、专利、医药等专业检索尤其重要
      检索出文献集中所有相关文献的能力
      多检出一些冗余的也没关系,尽量不要漏掉。

    查全率和查准率的关系

    查准率太高会导致文档数目少,查全率过高有可能会造成大量不相关文献。
    在这里插入图片描述


    计算实例

    recall的分母是全局相关文档的数目,precision的分母是检索出来的文档的数目,
    在这里插入图片描述

    如何评测结果?插值

    可以看到下图,有时候即使你知道recall和precision的值,也很难确定哪个检索结果比较好。我们需要一些连续的曲线来进行分析
    在这里插入图片描述


    为什么需要插值

    在这里插入图片描述
    锯齿形的东西很难进行比较,我们需要光滑的曲线。
    在这里插入图片描述
    以recall为分子,必须保证在每个标准召回率上都有precision的值,使用最大插值的方法,如果recall=0.1,那么它对应的precision的值,等于所有recall大于0.1的点上的precision的值的最大值


    插值实例
    在这里插入图片描述
    通过这样的插值我们就可以把本来的矩形线变得更加光滑,这样的话显然右图的蓝线更强,但是也有一些曲线是交错的。
    在这里插入图片描述

    需要考虑的几个问题

    • 虽然Precision和Recall都很重要,但是不同的应用、不用的用户可能会对两者的要求不一样
    • 两个指标分别衡量了系统的某个方面,但是为比较带来了难度
    • 两个指标都是基于集合进行计算,并没有考虑序的作用(虽然precision一定程度上表现了序的概念,但是recall是完全没有涉及。)
    • 在网络信息检索时,文档集非常巨大,召回率难以计算。因此需要考虑在无法计算查全率的情况下,如何衡量系统性能的问题(完全是可以用查全率来进行计算的,毕竟我们关注的只是排序在前面的一些结果,并不是所有文档的排序结果。)

    其他多种重要指标

    单一指标:F指标(F-Measure)

    • 单一测度:同时考虑recall和precision
    • recall和precision 的调和平均/倒数平均 (Harmonic mean)

    F=2PRP+R=21/R+1/PF=\frac{2PR}{P+R}=\frac{2}{1/R+1/P}

    在P+R一定的情况下,希望它们接近。换句话说,这个指标不掩盖P, R一个方面特别的不足

    E 指标(参数化的 F 值)

    F测度的变种,允许用户指出他更关注P还是R

    E=(1+β2)PRβ2P+R=(1+β2)β2/R+1/PE=\frac{(1+\beta^2)PR}{\beta^2P+R}=\frac{(1+\beta^2)}{\beta^2/R+1/P}

    β值控制平衡:
     β = 1: 不偏重某个指标,此时E=F
     β > 1: 侧重 recall
     β < 1: 侧重precision

    R- 查准率

    在第R位置上的查准率( R-Precision ),是结果集中具有R个文档时的查准率

    只考虑前R个位置的查准率,衡量的是我们与完美系统的差距,完美系统应该前R个的查准率为1.(个人理解R值也就是对查询Q的相关文档集的数目)
    在这里插入图片描述


    R-查准率实例

    这里的查询q相关文档有三个(完美索引能检索出三个),因此R=3,只考虑索引系统在前三个文档的查准率。
    在这里插入图片描述


    平均正确率AP

    平均正确率(Average Precision, AP):对不同召回率点上的正确率进行平均。AP的计算又分为以下几种情况:

    • 未插值的AP:直接根据返回结果中的各相关文档的召回率进行平均
    • 插值的AP:在召回率分别为0,0.1,0.2,…,,1.0的十一个点上的正确率求平均,等价于11点平均

    MAP (Mean Average Precision )

    • AP是单个查询的平均准确率,是每篇相关文档检索出后的准确率的平均值。
    • 系统的平均准确率(MAP)是每个查询的平均准确率的平均值。
    • MAP(Mean Average Precision ):对所有查询的AP求平均值

    MAP样例

    在这里插入图片描述


    系统的MAP
    在这里插入图片描述

    其他单一测度

    • Precision@N
      在召回率难以计算的情形下,系统评价可以考虑采用不考虑查全率的指标,例如Precision@N
      Precision@N是指在第N个位置上的正确率(其实就是前N个有几个相关的,求准确率),对于搜索引擎,考虑到大部分作者只关注前一、两页的结果,P@10, P@20对大规模搜索引擎是一个非常有效的衡量指标

    • 平均排序倒数MRR (Mean Reciprocal Rank)
      对于某些IR系统(如问答系统或主页发现系统),只关心第一个标准答案返回的位置,越前越好,这个位置的倒数称为排序倒数RR(Reciprocal Rank)
      对问题集合求平均,则得到平均排序倒数MRR

    目前使用很广非常流行的评价因子:

    • 折损累积增益(Discounted Cumulative Gain, DCG):对文档的相关程度其实是一个模糊的概念,大概相关,很相关,一般相关都应该是允许的。
      通过检查文档,用相关度级别( graded relevance )作为有用或增益(gain) 的测度
       DCG 是在某一个特定排序上的总的增益累积:
      DCGp=rel1+i=2prelilog2iDCG_p=rel_1+\sum_{i=2}^p\frac{rel_i}{log_2i}
      relirel_i即i的相关度级别。如果p是1号位置,就是用他的相关度级别即可,如果是2号位置,那么是rel1+rel2/1rel_1+rel_2/1,当位置大于3之后,每个位置都有一个log2i\log_2i的discount factor,也就是说位置越靠后,带来的增益越小。

    对完美排序计算增益累计,显然是大于所有IR系统的,因此我们使用最哟结果对每个IR系统得到的DCGDCG值进行归一化,不就可以互相比较了嘛~

    归一化DCG(NDCG):通过和完美排序(perfect ranking)结果的比较,对每个排序点的DCG值进行归一化
    使得可以对返回相关文档数各不相同的查询进行平均


    计算实例

    在这里插入图片描述
    这样我们就可以看到,我们在第一个点是完美的,后面慢慢就下降了,到后面我们又找到了其它相关文档,因此NDCG有所上升,但是永远不会超过完美排序的值。(完美排序不过是按照相关度从大到小排列仅此而已。)

    面向用户的相关测度

    在这里插入图片描述


    小结
    在这里插入图片描述

    三、 基准测试集

    为什么需要测试基准?

    • 信息检索系统的性能评价受到很多因素影响,很难精确描述
    • 可通过某个测试基准来评价性能,即检索效果可通过某个给定的文献集、查询集和相关判断来评价
    • 性能数据是合法的,仅当系统处于某个评价环境时
    • 避免测试环境不一致带来众说纷

    人工标注集

    在这里插入图片描述
    这是一个必须做的,耗费人力非常大,但是一旦构造成功会使用很久。

    基准测试集

    在这里插入图片描述

    一些小问题

    1.检索评估的目的是什么?一般从哪几个方面对IR系统进行评估?
    目的主要有三个(1)判断哪个检索模型的效果更好。(2)判断某个检索模型内部的那个部分最好。(3)判断检索模型与最优结果之间的差距。
    一般从三个方面对IR系统进行评估,分别是效率,效果,和其他指标,其中效率和效果是最重要的两个指标。


    2.如何计算11个标准召回率上的查准率?
    使用了最大插值的方法,对某个recall=i的位置,此时precision的值等于,所有查全率大于i的位置的查准率的最大值。


    3.一个查询的前10个返回结果“R N R N N N R R N R”,这里的R和 N分别表示相关文档和不相关文档。假设该查询的相关文档数是6,该查询的Precision@8是多少?R-Precision是多少?
    Precision@8=0.5 R-Precision=1/3


    4.一个查询的前5个返回结果分别是0 1 0 2 0,这里的2、1和0分别表示非常相关文档、相关文档和不相关文档,试计算该查询的NDCG值是多少?
    折损增益:0,1,0,1,0
    DCG序列:0,1,1,2,2
    完美排序:2,1,0,0,0
    理想DCG序列:2,3,3,3,3
    NDCG值:0,0.33,0.33,0.67,0.67


    5.基准测试集的主要组成部分?请说明基准测试的主要流程。
    主要组成部分:文献集,查询,相关判断
    主要流程:首先我们将标准文献集和标准查询输入待测试的算法,然后得到检索结果,根据标准结果,我们将二者进行比较,然后得到待测试算法取得的查全率和查准率等评价因子。

    展开全文
  • 网络信息检索课程11

    2010-12-15 09:17:04
    网络检索课件,课程精髓· 网上找资源的好去处
  • 下面,赛恩斯编译介绍几种网络医学信息检索技术。一、逻辑式检索技术。逻辑式检索技术是通过检索人所输入的检索关键字和检索系统中对应的代码所匹配,匹配成功后的结果,即为检索所需信息。是目前国内医学检索方法中...

    随着网络技术在研究领域的逐渐普及,科技研究者针对医学研制出了新的专业医学搜索引擎。医学研究者可以通过专业的医学搜索引擎来对所需的医学信息进行检索,检索出的信息具有专业性强,可参考性高等优势。下面,赛恩斯编译介绍几种网络医学信息检索技术。

    一、逻辑式检索技术。逻辑式检索技术是通过检索人所输入的检索关键字和检索系统中对应的代码所匹配,匹配成功后的结果,即为检索所需信息。是目前国内医学检索方法中较为常用的一种方法。该方法的逻辑语大致分为三种,分别是“与”,“或”和“否”。通过“与”进行检索时,检索系统会自动检索出所有同时包含着A,B检索内容的信息资源。资源中同时出现A,B两个检索信息关键词。通过“或”来进行检索时,检索系统会自动检测这包含着信息关键词A或信息关键词B的信息资源,而关键词A,B不会同时出现在同一信息资源文献中。通过“否”来进行信息检索时,系统将检索出信息资源中不包 A或不包含B,以及同时不包含关键字A,B的信息资源。

    逻辑式检索技术主要是通过对检索人所输入的关键字进行检索,可以理解为同义词检索技术。该检索方式检索范围广,检索出的结果较多。因此检索后的筛选时间较长。但通常检索资源较为详细。逻辑式信息检索技术的原理示意图,大致如下图所示。

    a0cf6b5bc69ae6369e04a39d2dc01c5a.png

    二、限制性检索技术。限制性检索技术是指对检索范围和检索结果进行范围缩小或专业约束等。在医学信息检索系统中,由于检索关键字所关联的内容较多。因此,通常检索出的范围较大,医学研究者需要通过大范围的检索内容,进行筛选,耗时较长。限制性检索技术,可以针对检索人所输入的关键字进行检索后,再由检索人对相应的检索范围进行控制,控制后的检索范围较小,检索出的内容较为容易筛选。通常我们所采用的限制方法有关键字限制检索法,限制符检索法,段落限制检索法和全文检索法。

    全文检索法是目前较为热门的检索方式。全文检索法是将原有的检索原文和检索词之间的联系作为原始记录,通过对检索词间的特定位置关系进行检索对象的一种检索方式。全文检索技术增大了医学信息检索的灵活性,系统可以通过自动识别关键字和检索范围,从而进行信息筛选,从一定程度上增大了医学信息检索的检索效率。同时减少的检索人自行进行内容筛选时所需的时间。全文检索不仅精确了信息的检索范围,减少了信息筛选时间,同时也是一种筛选文献较为全面的一种检索技术。

    三、加权检索技术。加权检索技术与传统的检索技术不同,加权检索技术不是针对于检索关键词进行信息检索,而是针对于判断检索词是否满足检索系统的逻辑和检索关键词在逻辑系统文献中出现的频率进行检索。加权检索方法有针对检索词检索法,针对检索词频率检索法,针对检索词与文献结合频率检索法等。

    加权检索系统主要就是针对于检索人所输入的关键词在参考文献中出现的频率进行检索。查找检索人所输入的关键词在文献数据库中是否存在,然后根据存在检索词的文献进行加权频率的计算。只有当加权频率满足该检索技术所预设的逻辑后,该文献才满足检索系统的要求。

    cbc887e5cbe0368f61fc75ca8189075b.gif

            易海聚|助力企业信息化建设日益完善

             易海聚|面向科技情报的网络信息自动发现技术应用

             网络大数据整合系统方案

             易海聚新闻采编译系统

            对链家数据的爬取分析:深圳到底哪种二手房最吃香?

    展开全文
  • 文章目录1,网络信息检索函数2,域名解析2.1,gethostbyname()2.2,gethostbyaddr()2.3 错误处理 herror()、hstrerror()2.4 释放hostent结构体endhostent()2.5 域名解析示例3,网络属性设置 getsockopt()、...

    1,网络信息检索函数

    gethostname() 获得主机名
    getpeername() 获得与套接口相连的远程协议地址
    getsockname() 获得本地套接口协议地址
    gethostbyname() 根据主机名取得主机信息 (域名解析:把域名转换成IP地址相关信息)
    ·endhostent()

    gethostbyaddr() 根据主机地址取得主机信息
    getprotobyname() 根据协议名取得主机协议信息
    getprotobynumber() 根据协议号取得主机协议信息
    getservbyname() 根据服务名取得相关服务信息
    getservbyport() 根据端口号取得相关服务信息

    2,域名解析

    2.1,gethostbyname()

    #include <netdb.h>
    extern int h_errno;//出错号
    struct hostent *gethostbyname(const char *name);

    • name 指向主机名的指针(域名或 IP地址)

    注意:

    1. IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,即可用于IPv4,也可用于IPv6.

    2.2,gethostbyaddr()

    #include <sys/socket.h> /* for AF_INET */
    struct hostent *gethostbyaddr(const void *addr,socklen_t len, int type);

    • addr 指向网络字节顺序地址的指针

    返回值

    The  gethostbyname()  and  gethostbyaddr() functions return the hostent
    structure or a NULL pointer if an error occurs.  On error, the  h_errno
    variable  holds  an  error number.  When non-NULL, the return value may
    point at static data, see the notes below.
    
      struct hostent {
            char  *h_name;            /* official name of host */
            char **h_aliases;         /* alias list */
            int    h_addrtype;        /* host address type */
            int    h_length;          /* length of address */
            char **h_addr_list;       /* list of addresses地址列表,指向主机的多个网络地址(网络字节序32位整数). */
        }          
        #define h_addr h_addr_list[0] /* for backward compatibility */
    
    linux@linux:~$ ping www.baidu.com
    PING www.a.shifen.com (58.217.200.15) 56(84) bytes of data.	//www.a.shifen.com就是h_addr_list列表中的一个
    64 bytes from 58.217.200.15: icmp_seq=1 ttl=55 time=21.1 ms
    64 bytes from 58.217.200.15: icmp_seq=2 ttl=55 time=18.8 ms
    64 bytes from 58.217.200.15: icmp_seq=3 ttl=55 time=10.1 ms
    ^C
    --- www.a.shifen.com ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2005ms
    rtt min/avg/max/mdev = 10.123/16.686/21.130/4.739 ms
    

    2.3 错误处理 herror()、hstrerror()

    extern int h_errno;//出错号
    void herror(const char *s);/打印错误信息
    const char *hstrerror(int err);//打印错误信息

    2.4 释放hostent结构体endhostent()

    void endhostent(void);//释放hostent结构体

    2.5 域名解析示例

    ······
    ······
    	struct hostent *hs;
    	if((hs = gethostbyname(argv[1])) == NULL)
    	{
    		herror("gethostbyname");
    		exit(-1);
    	}
    
    	/* 1 创建socket fd */
    	if((fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    	{
    		perror("socket");
    		exit(-1);
    	}
    	
    	/* 2 连接服务器 */
    	/* 2.1 填充struct sockaddr_in结构体变量*/
    	bzero(&sin,sizeof(sin));
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons(port);//转为网络字节序端口号
    #if 1
    	sin.sin_addr.s_addr = *(uint32_t *)hs->h_addr;//从hostent结构体中获取IP地址
    	endhostent();//释放hostent结构体空间
    	hs = NULL;
    #else
    	if(inet_pton(AF_INET,argv[1],(void *)&sin.sin_addr.s_addr) < 0)
    	{
    		perror("inet_pton");
    		goto _error1;
    	}
    #endif
    	/* 2.2 连接服务器*/
    	if(connect(fd,(struct sockaddr *)&sin,sizeof(sin)) < 0)
    	{
    		perror("connect");
    		goto _error1;
    	}
    ······
    ······
    

    3,网络属性设置 getsockopt()、setsockopt()

    getsockopt和setsockopt

    int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen)
    int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)

    1. level指定控制套接字的层次.可以取三种值:
      1)SOL_SOCKET:通用套接字选项. (应用层)
      2)IPPROTO_TCP:TCP选项. 传输层)
      3)IPPROTO_IP:IP选项. (网络层)
    2. optname指定控制的方式(选项的名称),我们下面详细解释
    3. optval获得或者是设置套接字选项.根据选项名称的数据类型进行转换
    4. optlen是optval的数据类型长度

    在这里插入图片描述

     struct timeval {
                   long    tv_sec;         /* seconds */
                   long    tv_usec;        /* microseconds */
               };
    

    4,网络超时优化

    1. 在网络通信中,很多操作会使得进程阻塞

    2. TCP套接字中的recv/accept/connect

    3. UDP套接字中的recvfrom

    4. 超时检测的必要性

      ·避免进程在没有数据时无限制地阻塞
      ·当设定的时间到时,进程从原操作返回继续运行

    4.1,网络超时检测(一)

    1. 设置socket的属性 SO_RCVTIMEO

    2. 参考代码如下

    struct timeval  tv;
    
    tv.tv_sec = 5;   //  设置5秒时间
    tv.tv_usec = 0;
    
    setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv));   //  设置接收超时
    recv()recvfrom()    //   从socket读取数据
    

    4.2,网络超时检测(二)

    1. 用select检测socket是否’ready’
    2. 参考代码如下
    struct fd_set rdfs;
    struct timeval  tv = {5 , 0};   // 设置5秒时间
    
    FD_ZERO(&rdfs);
    FD_SET(sockfd, &rdfs);
    
    if (select(sockfd+1, &rdfs, NULL, NULL, &tv) > 0)   // socket就绪
    {
          recv() /  recvfrom()    //  从socket读取数据
    }
    

    4.3,网络超时检测(三)

    1. 设置定时器(timer), 捕捉SIGALRM信号
    2. 参考代码如下
    void  handler(int signo)     {   return;  }
    
    struct sigaction  act;
    sigaction(SIGALRM, NULL, &act);
    act.sa_handler = handler;
    act.sa_flags &= ~SA_RESTART;//清除快速重启位(如果不去掉,时间到了,recv()又会马上重新读数据)
    sigaction(SIGALRM, &act, NULL);
    alarm(5);//	通过定时器alarm()设置5秒超时
    if (recv(,,,) < 0) ……//5秒后还没收到数据,就会被信号SIGALRM打断
    

    5,如何在linux中动态检查到是否有网络以及网络中途的掉线/连接的检查?

    1. 应用层
      ·心跳检测

    2. 内核中
      ·网卡驱动中 2.6内核里面,使能1s的周期性检查定时器
      ·网卡硬件或者我们通过GPIO,插拔网线时候产生中断,处理相应中断 //立即检测到

    5.2 心跳检测 — 方法一

    数据交互双方隔一段时间,一方发送一点数据到对方,对方给出特定的应答。如超过设定次数大小的时间内还是没有应答,这时候认为异常
    

    5.2 心跳检测 — 方法二

    改变套接字的属性来实现
    
    #include <netinet/tcp.h>//包含了SOL_TCP等宏的定义
    void setKeepAlive(int sockfd,int attr_on,socklen_t idle_time,socklen_t interval,socklen_t cnt)
    {
    	setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,(const char *)&attr_on,sizeof(attr_on));
    	setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,(const char *)&idle_time,sizeof(idle_time));
    	setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,(const char *)&interval,sizeof(interval));
    	setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,(const char *)&cnt,sizeof(cnt));
    }
    ......
    ......
    /*心跳检测(自动检测套接字连接是否已断开)*/
    int keepAlive = 1;//设定keepAlive
    int keepIdle = 5;//开始首次keepAlive探测前的TCP空闲时间
    int keepInterval = 5;//两次keepAlive探测间的时间间隔
    int keepCount = 3;//判定断开前的keepAlive探测次数
    
    setKeepAlive(newfd,keepAlive,keepIdle,keepInterval,keepCount);
    ......
    ......
    
    展开全文
  • 2.什么是检索模型 IR的核心问题:预测哪些文档是相关的,哪些文档是不相关的。主要工作在于排序这个核心的问题,如何计算这个排序从而处理文档的相关性。 检索模型描述了如下这些细节 文档表示( Docume...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,588
精华内容 1,435
关键字:

网络信息检索