不能说是提取关键字了,可以说是取词,根据就是出现2次以上就可以认为是词,做些修改可以提取指定词频的词,效果还不算好,有些高词频的词,由于其会形成组词,这样这个词的子词取代其,因此没有取到
基本方法:2个字符构成最小的词,而其的词频必定是从该词的起点构成的词中最大的,通过不断的加字符,路过出现小于这个最大的次品,可以认为这个词到了结束位置,取出这个词,并且把所有的该词占据的位置记录下来,以减少重复判断
加了些过滤的标识符---词不能包含标点符号等
不足:对歧义没有过多处理,利用的是最大正向遍历,取2个字符假设为初始词,可能是词的一部分,路过出现没有取到应该取到的词(路前面说的组合词,只能证明这个词还可以再分,是由几个词组合而来,按照最小词原则,可以认为这样是可以的)
返回数组:
[0] => Array ( [0] => 大话西游 [1] => 2 [2] => Array ( [0] => 1 [1] => 892 ) [3] => 4 )
[0] =>词字符串 [1] => 词频 [2] => 该词出现的各个位置 [3] => 词的长度,几个字符
PHP代码:里面的词“周星星”出现了问题,因为前面有 “周星驰“,周星最多出现的,所以还是不好,速度也不行,可能判断重复的数组,修改下用键直接引用会快些
<?php
set_time_limit(0);
//解析字符串中英文支付,成为字符数组,得长度
//$fustr='dddddddddddddgdg大股东广东';//带解析的字符串
function str_arr($fustr,$mudi=1)
{$wz=0;
$arr=array();
while($wz<strlen($fustr)){
$zifu=$fustr[$wz];
if(ord($zifu)>127){$str=$zifu.$fustr[$wz+1];$wz=$wz+2;}
else{$str=$zifu;$wz++;}
$arr[]=$str;//放到数组里
}//end while($wz<strlen($fustr))
if($mudi==1)return $arr;
else return count($arr);
}
//测试
//$arr=str_arr($fustr,$mudi=1);
//print_r($arr);
//end 解析字符串
//截取函数,截取字符串数组,得到部分字符串
//$arr=array();//字符串数组
$ks=0;//截取开始位置
$long=10;//截取长度,多少个字符
function jiequ($arr,$ks,$long=0){
if($ks+$long>count($arr))return false;
$str=';
$maxlen=count($arr);
if($long==0)$end=$maxlen;
else $end=$ks+$long;
for($i=$ks;$i<$end;$i++){
$str.=$arr[$i];
}
return $str;
}//echo jiequ($arr,$ks,$long);
//查询函数,得到从查询位置开始的第一个匹配位置
$wz=0;//查询位置
$arr=array();//字符串数组
$str='gjgg';//目标字符串
$strarr=str_arr($str,1);
function dingwei($arr,$strarr,$kswz){
$len1=count($arr);//总字符串数组长度
$len2=count($strarr);//查询字符串数组长度
$you=0;
$wz=$kswz;
//判断是全等的第一个位置
while($wz+$len2<=$len1){
$isyou=0;
$wz1=$wz;
for($i=0;$i<$len2;$i++){
if($strarr[$i]!=$arr[$wz1]){
$isyou=1;
break;
}//end if($strarr[$i]!=$arr[$wz1])
$wz1++;
}//end for($i=0;$i<count($strarr)
if($isyou==1)$wz++;//位置移1
else {$