相關(guān)關(guān)鍵詞
關(guān)于我們
最新文章
- PHP中opcode緩存簡(jiǎn)單用法分析
- thinkPHP控制器變量在模板中的顯示方法示例
- PHP move_uploaded_file() 函數(shù)(將上傳的文件移動(dòng)到新位置)
- dirname(__FILE__)的含義和應(yīng)用說(shuō)明
- thinkPHP5框架實(shí)現(xiàn)分頁(yè)查詢功能的方法示例
- PHP中單雙號(hào)與變量
- PHP獲得當(dāng)日零點(diǎn)時(shí)間戳的方法分析
- Laravel ORM對(duì)Model::find方法進(jìn)行緩存示例詳解
- PHP讀寫(xiě)文件高并發(fā)處理操作實(shí)例詳解
- 【CLI】利用Curl下載文件實(shí)時(shí)進(jìn)度條顯示的實(shí)現(xiàn)
轉(zhuǎn):PHP自動(dòng)提取關(guān)鍵字
不能說(shuō)是提取關(guān)鍵字了,可以說(shuō)是取詞,根據(jù)就是出現(xiàn)2次以上就可以認(rèn)為是詞,做些修改可以提取指定詞頻的詞,效果還不算好,有些高詞頻的詞,由于其會(huì)形成組詞,這樣這個(gè)詞的子詞取代其,因此沒(méi)有取到
基本方法:2個(gè)字符構(gòu)成最小的詞,而其的詞頻必定是從該詞的起點(diǎn)構(gòu)成的詞中最大的,通過(guò)不斷的加字符,路過(guò)出現(xiàn)小于這個(gè)最大的次品,可以認(rèn)為這個(gè)詞到了結(jié)束位置,取出這個(gè)詞,并且把所有的該詞占據(jù)的位置記錄下來(lái),以減少重復(fù)判斷
加了些過(guò)濾的標(biāo)識(shí)符---詞不能包含標(biāo)點(diǎn)符號(hào)等
不足:對(duì)歧義沒(méi)有過(guò)多處理,利用的是最大正向遍歷,取2個(gè)字符假設(shè)為初始詞,可能是詞的一部分,路過(guò)出現(xiàn)沒(méi)有取到應(yīng)該取到的詞(路前面說(shuō)的組合詞,只能證明這個(gè)詞還可以再分,是由幾個(gè)詞組合而來(lái),按照最小詞原則,可以認(rèn)為這樣是可以的)
返回?cái)?shù)組:
[0] => Array ( [0] => 大話西游 [1] => 2 [2] => Array ( [0] => 1 [1] => 892 ) [3] => 4 )
[0] =>詞字符串 [1] => 詞頻 [2] => 該詞出現(xiàn)的各個(gè)位置 [3] => 詞的長(zhǎng)度,幾個(gè)字符
PHP代碼:里面的詞“周星星”出現(xiàn)了問(wèn)題,因?yàn)榍懊嬗?nbsp; “周星馳“,周星最多出現(xiàn)的,所以還是不好,速度也不行,可能判斷重復(fù)的數(shù)組,修改下用鍵直接引用會(huì)快些
<?php
set_time_limit(0);
//解析字符串中英文支付,成為字符數(shù)組,得長(zhǎng)度
//$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;//放到數(shù)組里
}//end while($wz<strlen($fustr))
if($mudi==1)return $arr;
else return count($arr);
}
//測(cè)試
//$arr=str_arr($fustr,$mudi=1);
//print_r($arr);
//end 解析字符串
//截取函數(shù),截取字符串?dāng)?shù)組,得到部分字符串
//$arr=array();//字符串?dāng)?shù)組
$ks=0;//截取開(kāi)始位置
$long=10;//截取長(zhǎng)度,多少個(gè)字符
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);
//查詢函數(shù),得到從查詢位置開(kāi)始的第一個(gè)匹配位置
$wz=0;//查詢位置
$arr=array();//字符串?dāng)?shù)組
$str='gjgg';//目標(biāo)字符串
$strarr=str_arr($str,1);
function dingwei($arr,$strarr,$kswz){
$len1=count($arr);//總字符串?dāng)?shù)組長(zhǎng)度
$len2=count($strarr);//查詢字符串?dāng)?shù)組長(zhǎng)度
$you=0;
$wz=$kswz;
//判斷是全等的第一個(gè)位置
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 {$you=1;$pos=$wz;break;}
}
if($you==0)return false;
else return $pos;
}
//全角半角轉(zhuǎn)換函數(shù)
function banjiao($str)
{
$arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4','5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E','F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O','P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T','U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y','Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd','e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i','j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n','o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y', 'z' => 'z','(' => '(', ')' => ')', '〔' => '[', '〕' => ']', '【' => '[','】' => ']', '〖' => '[', '〗' => ']', '“' => '[', '”' => ']','‘' => '[', '\' => ']', '{' => '{', '}' => '}', '《' => '<','》' => '>','%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-',':' => ':', '。' => '.', '、' => ',', ',' => '.', '、' => '.', ';' => ',', '?' => '?', '!' => '!', '…' => '-', '‖' => '|', '”' => '"', '\' => '`', '‘' => '`', '|' => '|', '〃' => '"',' ' => ' ');
return strtr($str, $arr);
}
//測(cè)試?yán)?/span>
$fuhao=array(',','.',';',':','"','/','>','<','?','=','+','|','\\','!','`','#','&','*','(',')','[',']','{','}','^','%','$',' ' );
$huaizi='的是得嗎嘛呀丫怎么啥哦啊嗄噢喔你我他她它從了很不這';
$fustr='《大話西游》:曾經(jīng)有一份真誠(chéng)的愛(ài)情放在我面前,我沒(méi)有珍惜,等我失去的時(shí)候我才后悔莫及,人世間最痛苦的事莫過(guò)于此。你的劍在我的咽喉上割下去吧!不用再猶豫了!如果上天能夠給我一個(gè)再來(lái)一次的機(jī)會(huì),我會(huì)對(duì)那個(gè)女孩子說(shuō)三個(gè)字:我愛(ài)你。如果非要在這份愛(ài)上加上一個(gè)期限,我希望是——一萬(wàn)年
周星弛泡妞經(jīng)典對(duì)白(先有心理準(zhǔn)備..~笑死你)
一.公車站臺(tái)
周星星:“小姐你踩到我腳了.“
漂亮小妞: “沒(méi)有吧,我離你那么遠(yuǎn).“
周星星: “我是說(shuō),如果你把腳不小心放在了我腳上,就是踩到我腳了.“
漂亮小妞: “神經(jīng)病.“
周星星: “哇,小姐好眼力,我確實(shí)有神經(jīng)病史,一般看見(jiàn)漂亮的女孩就發(fā)作.“
漂亮小妞: “你們男人總是那樣,說(shuō)些無(wú)聊的話故意引女孩子故意.好象以為自己很帥.
周星星: “小姐你錯(cuò)了,我從不以為我自己帥,而是我本身就很帥.“
漂亮小妞: “別那么惡心人好吧.我要吐了.“
周星星: “在你吐之前我可以問(wèn)你個(gè)問(wèn)題嗎?“
漂亮小妞: “有屁快放“.
周星星: “你為什么要昧著良心否定我的帥?“
漂亮小妞: “滾........“
二.公車上
漂亮小妞: “怎么又是你?“
周星星: “有時(shí)候我的確無(wú)處不在.“
漂亮小妞: “你知不知道你很煩人,那么多位置不坐,偏要坐我旁邊.“
周星星: “小姐,你搞清楚,我只是坐了個(gè)空位置,而空位置的旁邊,剛好有個(gè)你,如此而已.“
漂亮小妞: “前面也有個(gè)空位置你怎么不去?“
周星星: “噢,明白了,原來(lái)你是想看我屁股,或者我用屁股看你?“
漂亮小妞: “快滾....“
三.下了公車
漂亮小妞:“你為什么又下車?“
周星星: “反正不是因?yàn)槟悖∥蚁矚g閑逛.“
漂亮小妞: “我告你性騷擾,你哪個(gè)單位的?“
周星星: “你是說(shuō)斤,還是焦耳,牛頓?“
漂亮小妞: “我跟你很熟嗎?老說(shuō)這種無(wú)厘頭話,對(duì)不起,我不感冒!“
周星星: “是呀,我們一點(diǎn)都不熟.我們好比一個(gè)枝頭的兩棵青草莓,酸酸的.“
漂亮小妞: “看了幾次大話西游,學(xué)了幾句唐僧話,以為你很幽默么?“
周星星: “幽默是天生的,要怪,你去怪我媽嘛.對(duì)了,還有我爸爸...“
漂亮小妞: “神經(jīng).“
周星星: “你媽神經(jīng).“
漂亮小妞: “你媽神經(jīng).“
周星星: “你看你,明明是你媽卻要硬說(shuō)成是我媽,莫非你想....“
漂亮小妞: “給我滾....“
四.肯得基門(mén)口
漂亮小妞:“不會(huì)吧,我怎么那么倒霉又遇到你.“
周星星:“ “我也發(fā)覺(jué)了,我想我前輩子的罪一定很重“
漂亮小妞:“你說(shuō)清楚點(diǎn)!小心我扁你!“
周星星:““你敢.我會(huì)叫的.“
漂亮小妞: “叫什么?“
周星星:““非禮呀.“
漂亮小妞:“你以為會(huì)有人理你么?“
周星星:“ “沒(méi)有也好,我非禮回來(lái)好了.“
漂亮小妞:“天拉,你這樣的無(wú)賴都有,真是瞎了老天的眼!“
周星星:“ “恩,是呀,要不然這世界上也不會(huì)存在什么所謂的精英.“
漂亮小妞:“........“
五.肯得基里
漂亮小妞:“別說(shuō)話,你一說(shuō)話我就煩.“
周星星:“ “我還沒(méi)說(shuō)呀,講點(diǎn)道理好不好?“
漂亮小妞: “我都叫你別說(shuō)了,你說(shuō)起話來(lái)象只蒼蠅,惡心死了.“
周星星:““噢,本來(lái)話能起到這么大的作用,實(shí)在是驚天地,泣鬼神喲,我可以做個(gè)兼職喲?“
漂亮小妞:“做什么?“
周星星:““去醫(yī)院幫人洗胃.“
漂亮小妞: “你沒(méi)的救了,早點(diǎn)回去料理后事吧.“
周星星:““臨死前我沒(méi)有什么要求,我只想對(duì)你說(shuō)幾個(gè)字,又怕你不答應(yīng).你答應(yīng)么?“
漂亮小妞: “說(shuō)吧,合理要求可以考慮.“
周星星:““這頓肯得基你請(qǐng)我好嗎?“
漂亮小妞:“去死.....“
六.出肯得基
漂亮小妞:“你沒(méi)女朋友嗎?星期天一個(gè)人閑逛?“
周星星:““準(zhǔn)確的說(shuō)我沒(méi)女朋友,但有女性朋友,你問(wèn)這個(gè)干嘛?“
漂亮小妞:“沒(méi)什么呀,關(guān)心你終生大事,不好嗎?“
周星星:““好,怎么不好?你好象我一個(gè)我深愛(ài)的人。“
漂亮小妞:“誰(shuí)?..“
周星星:““我老媽.她也老喜歡問(wèn)這問(wèn)那。“
漂亮小妞: “要不是在街上這么多人看著,我真想揍你.“
周星星:““我都不怕別人看見(jiàn)你揍我,你怕什么呀?你呢,不陪男朋友嗎?“
漂亮小妞:“不要你管!“
周星星:““噢,明白了.被男朋友拋棄了,揍我想找心理平衡.“
漂亮小妞: “狗嘴里吐不出象牙.明說(shuō)吧,我不想找.“
周星星:““考慮一下我吧,我吃點(diǎn)虧.“
漂亮小妞:“求你別再惡心我了.“
周星星:““我可以無(wú)條件充當(dāng)你的臨時(shí)演員,如果需要男朋友的時(shí)候請(qǐng)打***********“
漂亮小妞:“到時(shí)候再說(shuō).“
周星星:““告訴我你的電話好吧?“
漂亮小妞:“到時(shí)候再說(shuō).再煩我罵你了呀.“
周星星:““好呀,那你就發(fā)條信息罵我.“
漂亮小妞:..................
七.各自回家
漂亮小妞:“奇怪,我真的好想發(fā)條信息去罵他.“
周星星:““呵呵.她不發(fā)信息罵我才奇怪.“
漂亮小妞:“完蛋了,難道我真的喜歡那個(gè)無(wú)賴了?“
周星星:“嘿嘿,她不喜歡我這個(gè)無(wú)賴那才叫完蛋.';
$arr=str_arr($fustr,1);
$maxlen=count($arr);
$str='瑪?shù)?#39;;
$strarr=str_arr($str,1);
$kswz=0;
$pos=dingwei($arr,$strarr,21);
var_dump($pos);
$ciarr=array();
//分詞過(guò)程,給定初始位置,由該位置查詢 ,假想每個(gè)位置都可以取出詞,然后判斷其是否有2個(gè)
$kswz=0;//開(kāi)始取詞位置
while($kswz<$maxlen-1){
//首先判斷詞的開(kāi)始點(diǎn)是否位于某個(gè)重復(fù)區(qū)域,若在則把詞的位置移到這一區(qū)域的后方
$isduan=0;//是否是斷的區(qū)域
for($i=0;$i<count($ciarr)&&$isduan==0;$i++){
$qu=$ciarr[$i][2];//已用的詞的區(qū)間,若在其內(nèi)則記錄該區(qū)間,并跳過(guò)
$qulen=$ciarr[$i][3];//區(qū)間的長(zhǎng)度
for($i1=0;$i1<count($qu)&&$isduan==0;$i1++){
if($qu[$i1]<=$kswz&&$kswz<$qu[$i1]+$qulen){
$nextwz=$qu[$i1]+$qulen;
$isduan=1;
break;
}//end if($qu[$i1]<=$kswz
}//end for($i1=0;$i1<count($qu)
}//end for($i=0;$i<count($ciarr)
//路過(guò)在斷的區(qū)域,重新設(shè)置詞的開(kāi)始位置,并跳過(guò)這次處理
if($isduan==1){
$kswz=$nextwz;
continue;
}
//判斷是否是符號(hào),是著跳過(guò)
$zi=banjiao($arr[$kswz]);
if(in_array($zi,$fuhao)){
$kswz++;continue;
}
//是否壞字
if(strpos($huaizi,$arr[$kswz])!==false){$kswz++;continue;}
$nowci=array($arr[$kswz]);//初始詞,單個(gè)字符,還不能稱為詞
//依次取字符,構(gòu)成詞,得到該詞的個(gè)數(shù),瞞住條件,記錄
$wz=$kswz+1;
$isci=0;//是否可以取到有效的詞
$first=1;//第1個(gè)詞,最小詞
//不斷加字的過(guò)程,通過(guò)加字,比較和2個(gè)字的詞的次數(shù)比較,取最長(zhǎng)的詞
while($wz<$maxlen){
//判斷新增的字是否會(huì)在重復(fù)區(qū)間,從不在---在的過(guò)程,路過(guò)在,結(jié)束while
$isduan=0;//是否是斷的區(qū)域
for($i=0;$i<count($ciarr)&&$isduan==0;$i++){
$qu=$ciarr[$i][2];//已用的詞的區(qū)間,若在其內(nèi)則記錄該區(qū)間,并跳過(guò)
$qulen=$ciarr[$i][3];//區(qū)間的長(zhǎng)度
for($i1=0;$i1<count($qu)&&$isduan==0;$i1++){
if($qu[$i1]<=$wz&&$wz<$qu[$i1]+$qulen){
//$nextwz=$qu[$i1]+$qulen;
$isduan=1;
break;
}//end if($qu[$i1]<=$kswz
}//end for($i1=0;$i1<count($qu)
}//end for($i=0;$i<count($ciarr)
//路過(guò)在斷的區(qū)域,重新設(shè)置詞的開(kāi)始位置,并跳過(guò)這次處理
if($isduan==1){
break;
}//end 加字
//判斷是否是符號(hào),是著跳過(guò)
$zi=banjiao($arr[$wz]);
if(in_array($zi,$fuhao)){
break;
}
//是否遇到壞字
if(strpos($huaizi,$arr[$wz])!==false)break;
//進(jìn)行區(qū)域
$nowci[]=$arr[$wz];//當(dāng)前詞的字符分割數(shù)組
$cishu=1;//初始詞數(shù)1
$wzarr=array($kswz);
//統(tǒng)計(jì)詞數(shù),給出查詢的初始位置
$chaxunwz=$wz+1;
$cilen=count($nowci);
while($chaxunwz<$maxlen){
if(($pos=dingwei($arr,$nowci,$chaxunwz))!==false)//路過(guò)有則記錄
{
$chaxunwz=$pos+$cilen;//下次的查詢位置,位置+詞長(zhǎng)
$cishu++;//詞數(shù)+1
$wzarr[]=$pos;
}//end if(($pos=dingwei($arr,$nowci,$chaxunwz))!==false
else break;
}//end while($chaxunwz<$maxlen)
//路過(guò)詞數(shù)》=2
if($cishu>=2){
//路過(guò)是最小詞時(shí),記錄其詞頻,并作為最大詞頻
if($first==1){
$cistr=implode(',$nowci);//詞連成字符串
$maxcishu=$cishu;//最大詞數(shù)
$save=array($cistr,$maxcishu,$wzarr,$cilen);//說(shuō)明0=》詞,1=》位置的數(shù)組。2=》詞的長(zhǎng)度
$isci=1;
$first=0;
}//end if($first==1)
//非第1次記錄,需要與最大的詞頻比較,當(dāng)?shù)扔跁r(shí)記錄更新,否則停止
else{
//路過(guò)大于等于最大詞頻,更新
if($cishu>=$maxcishu){
$cistr=implode(',$nowci);//詞連成字符串
//$maxcishu=$cishu;//最大詞數(shù)
$save=array($cistr,$cishu,$wzarr,$cilen);//說(shuō)明0=》詞,1=》位置的數(shù)組。2=》詞的長(zhǎng)度
}//end if($cishu>=$maxcishu)
//路過(guò)詞數(shù)小于最大,結(jié)束
else break;
}//end else
}//end if($cishu>=2)
//路過(guò)小于2,直接結(jié)束
else break;
$wz++;
}//end while($wz<$maxlen)
//判斷是否該位置有有效的詞,路過(guò)有,記錄到詞組里
//路過(guò)有有效的詞
if($isci==1){
$ciarr[]=$save;//記錄一個(gè)詞
$kswz=$kswz+$save[3];//把開(kāi)始位置移位
}//end if($isci==1)
//路過(guò)沒(méi)有有效詞,把詞的開(kāi)始位置移1
else{
$kswz=$kswz+1;
}
}//end while($kswz<$maxlen-1)
print_r($ciarr);
?>