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