分享一波如何获取关键词语句和段落

写在前面:本次的操作方法,看个人具体要求需要,小编试了多次才满足老板的要求,不容易呀!

1、首先要求是这样的

根据搜索的关键词获取关键词所在文章的这一句话,并且查看语言环境获取关键词所在文章的这个段落。一开始,想了很多的字符串截取方法都不行,达不到要求,后面试了很多次,用下面的方法才实现: 字符串截取+jqerylist内容爬取+字符串定位+字符串出现的所有位置。

2、可以去下面链接体验

SCI机器人写作系统

3、下载 phpQuery和QueryList

phpQuery:https://github.com/jae-jae/phpQuery-single QueryList: https://github.com/jae-jae/QueryList/tree/V3.2.1

在项目中使用QueryList,将下载的phpQuery.php和QueryList.php这两个文件复制到项目中去,然后手动引入这两个文件就可以了。

4、贴代码

 /**
         * @param $key
         * @param $data
         * @return mixed
         * @throws \think\db\exception\DataNotFoundException
         * @throws \think\db\exception\ModelNotFoundException
         * @throws \think\exception\DbException
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @name: get_okk
         * @describe: 处理获取的数据
         */
        public function get_okk($key, $data){
            $rules = [
                'content' => ['p','text'],
            ];
            foreach($data as $k=>$v){
                //根据数据id查询文章数据
                $content = db("article_info")->where("id", $v['id'])->find();
                if(!$content){
               //没有查询到就删除本条数据
                    unset($data[$k]);
                    continue ;
                }
                //获取采集数据数组
                $ok=QueryList::Query($content['info'],$rules)->data;
                $num=count($ok);
                //另外2个字段内容
                $ok[$num]['content']=$content['Abstract'];
                $ok[$num+1]['content']=$content['Introduction'];
                //处理采集的数据
                $ok_arr=$this->hand_arr($ok);
                $str     = "";
                $duan    = "";
                foreach($key as $y => $z){
                    //每个关键词获取语句和环境段落
                    $b  = $this->_find($ok_arr, $z);
                    $str  .= $b['str'];
                    $duan .=$b['duan'];
                }
               //没有匹配到语句就删除本条数据
                if(empty($str)) {
                    unset($data[$k]);
                }
                else {
                   //关键词高亮显示
           // 方法地址:
          // https://www.jackhhy.cn/post/multiple-or-single-keyword-highlighting
                    $data[$k]['str'] = replace($str, @implode(",", $key));
                }
                $data[$k]['duan'] = replace($duan, @implode(",", $key));

            }
            return $data;
        }

 /**
         * @param $ok_arr
         * @param $z
         * @param string $char
         * @return array
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @name: _find
         * @describe:处理语句和环境
         */
        public function _find($ok_arr, $z,$char=". "){
            $str="";
            $duan="";
            foreach($ok_arr as $k=>$v){
               //检测关键词书否在段落中
                $okf=stripos($v,$z);
                if($okf===false){

                }else{ //存在处理
                    //获取 . 在段落中的所有位置
                    $arr     = $this->getCharpos2($v, $char);
                    if(empty($arr)){
                      $arr     = $this->getCharpos2($v, ".");
                    }
                    $min_arr = [];
                    $max_arr = [];
                    //根据关键词的位置,获取前一个点的位置和后一个点的位置
                    //这样英文文章根据.来判断是否是一条句子
                    foreach($arr as $f => $b){
                        if($b < $okf) {
                            $min_arr[] = $b;
                        }
                        else {
                            $max_arr[] = $b;
                        }
                    }
                    if(empty($min_arr)) {
                        $begin = 0;
                    }
                    else {
                        $begin = max($min_arr) + 1; //获取起点值
                        $jian  = max($min_arr);
                    }
                    if(empty($max_arr)) {
                        $end = 100*100;
                    }
                    else {
                        $end = min($max_arr) - $jian;
                    }
                   //截取段落起点位置和长度(关键词的语句)
                    $res_str = substr($v, $begin, $end);
                    $str.=$res_str;
                    $duan.=$v;
                   //只要一句,获取到了就跳出循环
                    break ;
                }
            }
            return ['str'=>$str,'duan'=>$duan];
        }

评论

(= ̄ω ̄=)··· 暂无内容!

回复

您还未登录,请先登录或者注册

微信扫一扫
关注该公众号