這不僅僅是一篇介紹插件的文章 ,也是一篇自我成長的教程 靈感來于jieba-php
上傳文件夾到application 有默認(rèn)的演示方法 直接訪問 /Part/index/init 查看效果
使用方法見控制器
我們在控制器中 加載了插件依賴
比如:請不要忘記設(shè)置
ini_set('memory_limit', '1024M');
打印后結(jié)果為:
打印結(jié)果為:其中txt為舉例文本
打印結(jié)果為:可直接返回關(guān)鍵詞
<?php ini_set('memory_limit', '1024M'); defined('IN_YZMPHP') or exit('Access Denied'); yzm_base::load_model('MultiArray', 'Part', 0); yzm_base::load_model('MultiArrayFactory', 'Part', 0); yzm_base::load_model('Part', 'Part', 0); yzm_base::load_model('Finalseg', 'Part', 0); // 提取關(guān)鍵詞 yzm_base::load_model('Analyse', 'Part', 0); // 詞性分詞 yzm_base::load_model('Posseg', 'Part', 0); class Index { /** * 初始化分詞模型并進(jìn)行分詞 * * @author zhaosong */ public function init() { Part::init(); Finalseg::init(); $seg_list = Part::cut("憐香惜玉也得要看對象啊!"); var_dump($seg_list); } /** * 初始化分詞模型、最終分詞模型和分析模型,并提取關(guān)鍵詞 * * @author zhaosong */ public function inits() { Part::init(array('mode'=>'test','dict'=>'small')); Finalseg::init(); Analyse::init(); $top_k = 10; $content = file_get_contents(dirname(dirname(__FILE__))."/dict/lyric.txt", "r"); $tags = Analyse::extractTags($content, $top_k); var_dump($tags); } /** * 初始化分詞模型、最終分詞模型和詞性標(biāo)注模型,并進(jìn)行詞性標(biāo)注 * * @author zhaosong */ public function initss() { Part::init(); Finalseg::init(); Posseg::init(); $seg_list = Posseg::cut("這是一個伸手不見五指的黑夜。我只會一丟丟PHP,我熱愛YzmCms,我喜歡編程!"); var_dump($seg_list); } }
加載詞典和模型文件,需要加載預(yù)先訓(xùn)練好的詞典和模型文件,
這些文件包含了詞匯、詞頻、詞性等信息。所以我字典很大 所以插件也是很大。
/** * 加載模型文件 * * @param string $f_name 模型文件名 * @param array $options 選項數(shù)組 * @return array 模型數(shù)據(jù) * @author zhaosong */ public static function loadModel($f_name, $options = array()) { $defaults = array( 'mode'=>'default' ); $options = array_merge($defaults, $options); return json_decode(file_get_contents($f_name), true); }
對輸入的文本進(jìn)行分詞。使用維特比算法進(jìn)行中文分詞(待分詞的句子,選項數(shù)組)。
$text = "我來到北京清華大學(xué)"; $seg_list = Part::cut($text); print_r($seg_list);
什么是維特比算法 :是一種動態(tài)規(guī)劃算法,用于在隱馬爾可夫模型(Hidden Markov Model, HMM)中尋找最可能的狀態(tài)序列。維特比算法廣泛應(yīng)用于自然語言處理、語音識別、生物信息學(xué)等領(lǐng)域。
以下是使用 PHP 實現(xiàn)維特比算法的示例:
// 初始狀態(tài)概率 $pi = array('yzm' => 0.6, 'qh' => 0.4); // 狀態(tài)轉(zhuǎn)移概率矩陣 $A = array( 'yzm' => array('yzm' => 0.7, 'qh' => 0.3), 'qh' => array('yzm' => 0.4, 'qh' => 0.6) ); // 觀測概率矩陣 $B = array( 'yzm' => array('normal' => 0.5, 'cold' => 0.4, 'dizzy' => 0.1), 'qh' => array('normal' => 0.1, 'cold' => 0.3, 'dizzy' => 0.6) ); // 觀測序列 $observations = array('normal', 'cold', 'dizzy');
舉例:
function viterbis($pi, $A, $B, $observations) { $T = count($observations); $N = count($pi); $delta = array(); $psi = array(); // 初始化 for ($i = 0; $i < $N; $i++) { $delta[0][$i] = $pi[$i] * $B[$i][$observations[0]]; $psi[0][$i] = 0; } // 遞推 for ($t = 1; $t < $T; $t++) { for ($j = 0; $j < $N; $j++) { $max_prob = 0; $max_state = 0; for ($i = 0; $i < $N; $i++) { $prob = $delta[$t - 1][$i] * $A[$i][$j]; if ($prob > $max_prob) { $max_prob = $prob; $max_state = $i; } } $delta[$t][$j] = $max_prob * $B[$j][$observations[$t]]; $psi[$t][$j] = $max_state; } } // 終止 $max_prob = 0; $max_state = 0; for ($i = 0; $i < $N; $i++) { if ($delta[$T - 1][$i] > $max_prob) { $max_prob = $delta[$T - 1][$i]; $max_state = $i; } } // 回溯 $states = array(); $states[$T - 1] = $max_state; for ($t = $T - 2; $t >= 0; $t--) { $states[$t] = $psi[$t + 1][$states[$t + 1]]; } return $states; }
處理分詞結(jié)果 返回一個包含分詞結(jié)果的數(shù)組。可以對這個數(shù)組進(jìn)行處理,例如將分詞結(jié)果拼接成字符串、統(tǒng)計詞頻等。
分詞模式精確模式、全模式和搜索引擎模式。精確模式是默認(rèn)模式,將句子最精確地切開,
適用于文本分析;全模式是將句子中所有可以成詞的詞語都掃描出來,速度非常快,但是不能解決歧義;
搜索引擎模式在精確模式的基礎(chǔ)上,對長詞再次切分,提高召回率 列如:
/** * 分詞方法(搜索引擎模式) * * @param string $sentence 句子 * @param array $options 選項數(shù)組 * @return array 分詞結(jié)果數(shù)組 * @author zhaosong */ public static function cutForSearch($sentence, $options = array("HMM" => true)) { $defaults = array( 'mode'=>'default' ); $options = array_merge($defaults, $options); $seg_list = array(); $cut_seg_list = Part::cut($sentence, false, array("HMM" => $options["HMM"])); foreach ($cut_seg_list as $w) { $len = mb_strlen($w, 'UTF-8'); if ($len>2) { for ($i=0; $i<($len-1); $i++) { $gram2 = mb_substr($w, $i, 2, 'UTF-8'); if (isset(self::$FREQ[$gram2])) { $seg_list[] = $gram2; } } } if (mb_strlen($w, 'UTF-8')>3) { for ($i=0; $i<($len-2); $i++) { $gram3 = mb_substr($w, $i, 3, 'UTF-8'); if (isset(self::$FREQ[$gram3])) { $seg_list[] = $gram3; } } } $seg_list[] = $w; } return $seg_list; }
總結(jié):實現(xiàn)分詞的邏輯主要包括加載詞典和模型文件、對輸入文本進(jìn)行分詞、處理分詞結(jié)果以及釋放資源。
在實際應(yīng)用中,可以根據(jù)需求調(diào)整分詞模式和處理分詞結(jié)果的方式。
使用插件要靈活 可自己添加字典 但基本的字典已經(jīng)完全夠用
登錄后可查看詳情!