99国产在线视频有精品视频_国产精品久久久久久亚洲影视 _国产三级日本三级韩国三级在线看_精精国产XXXX视频在线my_乱VODAFONEWIFI熟妇_超碰cao国产精品一区二区_91久久精品青青草原伊人_欧美,一区,日韩,精品

YzmCMS x 分詞提取關(guān)鍵詞插件(可做接口或自己使用)

1435次瀏覽 更新日期:2024-05-12 15:07:28 分類:模板插件 評論:1

前言

這不僅僅是一篇介紹插件的文章 ,也是一篇自我成長的教程 靈感來于jieba-php


安裝

上傳文件夾到application 有默認(rèn)的演示方法 直接訪問 /Part/index/init 查看效果 


使用方法見控制器

功能描述

我們在控制器中 加載了插件依賴

比如:請不要忘記設(shè)置 

ini_set('memory_limit', '1024M');

image.png

1.我們先做最基礎(chǔ)的分詞

image.png

打印后結(jié)果為:


image.png


2.提取關(guān)鍵詞

image.png

打印結(jié)果為:其中txt為舉例文本

image.png


3.詞性分詞

image.png

打印結(jié)果為:可直接返回關(guān)鍵詞

image.png

完整代碼

<?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)完全夠用

附件下載:


登錄后可查看詳情!

我來說兩句
  • yzmcms
    yzmcms 官網(wǎng)認(rèn)證 1年前
    優(yōu)秀~
    0
    回復(fù)
作者信息
發(fā)布見解
發(fā)內(nèi)容 回頂部