欢迎访问 夜阑小雨 我的学习碎片档案,这里记录了我的学习内容和工作中经验,希望给您带去帮助。

根据关键词提取文本摘要

分享 夜阑小雨 1000℃ 0评论
  1. 问题描述
  • 根据一组关键词,在一段文本中找出一段话作为文本的摘要,摘要有指定长度
  • 摘要中要尽可能多的包含不同的关键词
  • 在不同关键词一样多的情况下,包含关键词总数比较多的优先级高
  • 在以上条件都相同的情况下,出现在文本前面的段落优先
  1. 基本思路
  • 找到各个关键词出现的位置,并记录下来
  • 统计在指定的长度范围内的两个关键词之间的段落最符合条件的段落(即关键词种类越多,出现的频率越高,段落越靠前的段落)
  1. 具体实现
  • 为了方便的实现这个功能,程序预先给每个关键词设定了权重为100(即第一次出现一个关键词,段落的权重+100),重复关键词的权重为1(即重复出现一个关键词,段落的权重+1)
  • 统计关键词在文本中出现的位置并记录下来 $arrwords是关键词组,$content是文本内容,由于是中文文本,所以用mb_的方法去操作字符串

foreach ( $arrwords as $word ) { if ( empty( trim($word) ) ) { continue; } while ( $pos = mb_strpos ( $content, $word, $pos + 1, ‘gbk’ ) ) { $allpos[] = $pos; //记录所有的关键词出现的位置 $pos_words[$pos] = $word; //记录每个位置的关键词 } } sort($allpos); //按照位置的排序

  • 统计两个关键词之间的段落的权重,类似冒泡排序的方式去统计两两关键词之间的段落, MAX_DESC_LEN是指定的摘要长度

$rst = array(); for($i = 0; $i < count($allpos)-1; $i++) { $t = 0; $temp_arr = array(); $temp_arr[ $pos_words[ $allpos[$i] ] ] = 1; $weight = 100 ; for ($j=$i+1; $j < count($allpos); $j++) { if ( $allpos[$j]-$allpos[$i] > MAX_DESC_LEN) { break; } else { $t = $j; if ( isset( $temp_arr[ $pos_words[ $allpos[$j] ] ] ) ) { $weight += 1; $temp_arr[ $pos_words[ $allpos[$j] ] ] += 1; } else { $weight += 100; $temp_arr[ $pos_words[ $allpos[$j] ] ] = 1; } } } if ( $t!=0 ) { //同一权重最先匹配的优先选为摘要,若有重复权重的记录,则权重-1 while ( isset($rst[$weight]) ) { $weight -= 1; } $rst[$weight] = array(“start”=>$allpos[$i],”end”=>$allpos[$t]); } }

  • 按照权重排序($rst是以weight的值为key)排序,取第一个值就得到了想要的结果

krsort($rst); $item = current($rst); $center = ($item[“end”]+$item[“start”])/2; mb_substr($content, ($center>=MAX_DESC_LEN/2 ? $center-MAX_DESC_LEN/2 : 0), MAX_DESC_LEN, “gbk”)

转载请注明:夜阑小雨 » 根据关键词提取文本摘要

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址