• 周五. 3月 1st, 2024

    PHP中文分词库

    root

    8月 24, 2022 #php中文分词库

    一、下载地址

          1.https://github.com/fukuball/jieba-php

    二、简介

         “结巴”中文分词:做最好的PHP中文分词,中文断词组件。/“结巴”(中文为“口吃”)中文分词:建立最好的PHP中文分词模块。

          目前翻译版为jieba-0.26版本,未来再慢慢往上升级,效能也需要再改善,请有兴趣的开发者一起加入开发!若想使用Python版本请前往 https://github.com/fxsjy/jieba

          现在已经可以支援繁体中文!只要将字典切换为大模式即可!

    三、特征

    • 支持三种分词模式:
    • 1)默认精确模式,试图将句子最精确地切开,适合文本分析;
    • 2)全模式,把句子中所有的可以成词的词语都扫描出来,但是不能解决歧义。(需要充足的字典)
      1. 搜寻引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜寻引擎分词。
    • 支持繁体断词
    • 支持自定义词典

    四、用法

    • 手动安装:将jieba-php放置适当目录后,透过require_once引用

    require_once "/yourpath/vendor/multi-array/MultiArray.php";
    require_once “ /yourpath/vendor/multi-array/Factory/MultiArrayFactory.php ” ;
    require_once “ /yourpath/class/Jieba.php ” ;
    require_once “ /yourpath/class/Finalseg.php ” ;

    五、算法

    • 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
    • 采用了动态规划查找最大概率路径,找出基于词频的最大切分组合
    • 对于未入词词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
    • BEMS的解释https://github.com/fxsjy/jieba/issues/7

    六、接口

    • 组件只提供jieba.cut方法用于分词
    • cut方法接受两个输入参数:1)第一个参数为需要分词的字符串2)cut_all参数用来控制分词模式
    • 待分词的字符串可以是utf-8字符串
    • jieba.cut返回的结构是一个可迭代的数组

    七、功能

        1.分词

    • cut 方法接受想个输入参数:1)第一个参数为需要分词的字符串2)cut_all参数用来控制分词模式
    • cutForSearch 方法接受一个参数:需要分词的字符串,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
    • 注意:待分词的字符串是utf-8字符串
    • cut以及cutForSearch返回的结构是一个可迭代的数组

    ini_set(‘memory_limit’, ‘1024M’);

    require_once “/path/to/your/vendor/multi-array/MultiArray.php”;
    require_once “/path/to/your/vendor/multi-array/Factory/MultiArrayFactory.php”;
    require_once “/path/to/your/class/Jieba.php”;
    require_once “/path/to/your/class/Finalseg.php”;
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    Jieba::init();
    Finalseg::init();

    $seg_list = Jieba::cut(“怜香惜玉也得要看对象啊!”);
    var_dump($seg_list);

    $seg_list = Jieba::cut(“我来到北京清华大学”, true);
    var_dump($seg_list); #全模式

    $seg_list = Jieba::cut(“我来到北京清华大学”, false);
    var_dump($seg_list); #默認精確模式

    $seg_list = Jieba::cut(“他来到了网易杭研大厦”);
    var_dump($seg_list);

    $seg_list = Jieba::cutForSearch(“小明硕士毕业于中国科学院计算所,后在日本京都大学深造”); #搜索引擎模式
    var_dump($seg_list);

    打印输出

    array(7) {
      [0]=>
      string(12) "怜香惜玉"
      [1]=>
      string(3) "也"
      [2]=>
      string(3) "得"
      [3]=>
      string(3) "要"
      [4]=>
      string(3) "看"
      [5]=>
      string(6) "对象"
      [6]=>
      string(3) "啊"
    }
     
    Full Mode:
    array(15) {
      [0]=>
      string(3) "我"
      [1]=>
      string(3) "来"
      [2]=>
      string(6) "来到"
      [3]=>
      string(3) "到"
      [4]=>
      string(3) "北"
      [5]=>
      string(6) "北京"
      [6]=>
      string(3) "京"
      [7]=>
      string(3) "清"
      [8]=>
      string(6) "清华"
      [9]=>
      string(12) "清华大学"
      [10]=>
      string(3) "华"
      [11]=>
      string(6) "华大"
      [12]=>
      string(3) "大"
      [13]=>
      string(6) "大学"
      [14]=>
      string(3) "学"
    }
     
    Default Mode:
    array(4) {
      [0]=>
      string(3) "我"
      [1]=>
      string(6) "来到"
      [2]=>
      string(6) "北京"
      [3]=>
      string(12) "清华大学"
    }
    array(6) {
      [0]=>
      string(3) "他"
      [1]=>
      string(6) "来到"
      [2]=>
      string(3) "了"
      [3]=>
      string(6) "网易"
      [4]=>
      string(6) "杭研"
      [5]=>
      string(6) "大厦"
    }
    (此處,“杭研“並沒有在詞典中,但是也被 Viterbi 算法識別出來了)
     
    Search Engine Mode:
    array(18) {
      [0]=>
      string(6) "小明"
      [1]=>
      string(6) "硕士"
      [2]=>
      string(6) "毕业"
      [3]=>
      string(3) "于"
      [4]=>
      string(6) "中国"
      [5]=>
      string(6) "科学"
      [6]=>
      string(6) "学院"
      [7]=>
      string(9) "科学院"
      [8]=>
      string(15) "中国科学院"
      [9]=>
      string(6) "计算"
      [10]=>
      string(9) "计算所"
      [11]=>
      string(3) "后"
      [12]=>
      string(3) "在"
      [13]=>
      string(6) "日本"
      [14]=>
      string(6) "京都"
      [15]=>
      string(6) "大学"
      [16]=>
      string(18) "日本京都大学"
      [17]=>
      string(6) "深造"
    }

      2.添加自定义词典

    • 虽然jieba有新词识别能力,但是自行添加新词可以保证更高的正确率
    • 用法:Jieba :: loadUserDict(file_name)#file_name为自定义词典的绝对路径
    • 词典格式和dict.txt一样,一个词占一行;每一行分为三部分,一部分为词语,一部分为词频,一部分为词性,用空格开
    • 范例:云计算5 n李小福2 n创新办3 n之前:李小福/是/创新/办/主任/也/是/云计算/方面/的/专家/加载自定义词库后:李小福/是/创新办/主任/也/是/云计算/方面/的/专家/

    说明:“通过用户自定义词典来增强歧义纠错能力”

           3.关键词提取

    • JiebaAnalyse :: extractTags($ content,$ top_k)
    • 内容为待提取的文本
    • top_k为返回几个TF / IDF权重最大的关键词,默认值为20
    • 可使用setStopWords增加自定义停用词

          代码示例(关键词提取)

    ini_set('memory_limit', '600M');
     
    require_once "/path/to/your/vendor/multi-array/MultiArray.php";
    require_once "/path/to/your/vendor/multi-array/Factory/MultiArrayFactory.php";
    require_once "/path/to/your/class/Jieba.php";
    require_once "/path/to/your/class/Finalseg.php";
    require_once "/path/to/your/class/JiebaAnalyse.php";
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    use Fukuball\Jieba\JiebaAnalyse;
    Jieba::init(array('mode'=>'test','dict'=>'small'));
    Finalseg::init();
    JiebaAnalyse::init();
     
    $top_k = 10;
    $content = file_get_contents("/path/to/your/dict/lyric.txt", "r");
     
    $tags = JiebaAnalyse::extractTags($content, $top_k);
     
    var_dump($tags);
     
    JiebaAnalyse::setStopWords('/path/to/your/dict/stop_words.txt');
     
    $tags = JiebaAnalyse::extractTags($content, $top_k);
     
    var_dump($tags);

      打印输出

    array(10) {
      '沒有' =>
      double(1.0592831964595)
      '所謂' =>
      double(0.90795702553671)
      '是否' =>
      double(0.66385043195443)
      '一般' =>
      double(0.54607060161899)
      '雖然' =>
      double(0.30265234184557)
      '來說' =>
      double(0.30265234184557)
      '肌迫' =>
      double(0.30265234184557)
      '退縮' =>
      double(0.30265234184557)
      '矯作' =>
      double(0.30265234184557)
      '怯懦' =>
      double(0.24364586159392)
    }
    array(10) {
      '所謂' =>
      double(1.1569129841516)
      '一般' =>
      double(0.69579963754677)
      '矯作' =>
      double(0.38563766138387)
      '來說' =>
      double(0.38563766138387)
      '退縮' =>
      double(0.38563766138387)
      '雖然' =>
      double(0.38563766138387)
      '肌迫' =>
      double(0.38563766138387)
      '怯懦' =>
      double(0.31045198493419)
      '隨便說說' =>
      double(0.19281883069194)
      '一場' =>
      double(0.19281883069194)
    }

      4.词性分词

      代码示例

    ini_set('memory_limit', '600M');
     
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/MultiArray.php";
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/Factory/MultiArrayFactory.php";
    require_once dirname(dirname(__FILE__))."/class/Jieba.php";
    require_once dirname(dirname(__FILE__))."/class/Finalseg.php";
    require_once dirname(dirname(__FILE__))."/class/Posseg.php";
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    use Fukuball\Jieba\Posseg;
    Jieba::init();
    Finalseg::init();
    Posseg::init();
     
    $seg_list = Posseg::cut("这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。");
    var_dump($seg_list);

      打印输出

    array(21) {
      [0]=>
      array(2) {
        ["word"]=>
        string(3) "这"
        ["tag"]=>
        string(1) "r"
      }
      [1]=>
      array(2) {
        ["word"]=>
        string(3) "是"
        ["tag"]=>
        string(1) "v"
      }
      [2]=>
      array(2) {
        ["word"]=>
        string(6) "一个"
        ["tag"]=>
        string(1) "m"
      }
      [3]=>
      array(2) {
        ["word"]=>
        string(18) "伸手不见五指"
        ["tag"]=>
        string(1) "i"
      }
      [4]=>
      array(2) {
        ["word"]=>
        string(3) "的"
        ["tag"]=>
        string(2) "uj"
      }
      [5]=>
      array(2) {
        ["word"]=>
        string(6) "黑夜"
        ["tag"]=>
        string(1) "n"
      }
      [6]=>
      array(2) {
        ["word"]=>
        string(3) "。"
        ["tag"]=>
        string(1) "x"
      }
      [7]=>
      array(2) {
        ["word"]=>
        string(3) "我"
        ["tag"]=>
        string(1) "r"
      }
      [8]=>
      array(2) {
        ["word"]=>
        string(3) "叫"
        ["tag"]=>
        string(1) "v"
      }
      [9]=>
      array(2) {
        ["word"]=>
        string(9) "孙悟空"
        ["tag"]=>
        string(2) "nr"
      }
      [10]=>
      array(2) {
        ["word"]=>
        string(3) ","
        ["tag"]=>
        string(1) "x"
      }
      [11]=>
      array(2) {
        ["word"]=>
        string(3) "我"
        ["tag"]=>
        string(1) "r"
      }
      [12]=>
      array(2) {
        ["word"]=>
        string(3) "爱"
        ["tag"]=>
        string(1) "v"
      }
      [13]=>
      array(2) {
        ["word"]=>
        string(6) "北京"
        ["tag"]=>
        string(2) "ns"
      }
      [14]=>
      array(2) {
        ["word"]=>
        string(3) ","
        ["tag"]=>
        string(1) "x"
      }
      [15]=>
      array(2) {
        ["word"]=>
        string(3) "我"
        ["tag"]=>
        string(1) "r"
      }
      [16]=>
      array(2) {
        ["word"]=>
        string(3) "爱"
        ["tag"]=>
        string(1) "v"
      }
      [17]=>
      array(2) {
        ["word"]=>
        string(6) "Python"
        ["tag"]=>
        string(3) "eng"
      }
      [18]=>
      array(2) {
        ["word"]=>
        string(3) "和"
        ["tag"]=>
        string(1) "c"
      }
      [19]=>
      array(2) {
        ["word"]=>
        string(3) "C++"
        ["tag"]=>
        string(3) "eng"
      }
      [20]=>
      array(2) {
        ["word"]=>
        string(3) "。"
        ["tag"]=>
        string(1) "x"
      }
    }

      5.切换成繁体字

       代码示例

    ini_set('memory_limit', '1024M');
     
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/MultiArray.php";
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/Factory/MultiArrayFactory.php";
    require_once dirname(dirname(__FILE__))."/class/Jieba.php";
    require_once dirname(dirname(__FILE__))."/class/Finalseg.php";
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    Jieba::init(array('mode'=>'default','dict'=>'big'));
    Finalseg::init();
     
    $seg_list = Jieba::cut("怜香惜玉也得要看对象啊!");
    var_dump($seg_list);
     
    $seg_list = Jieba::cut("憐香惜玉也得要看對象啊!");
    var_dump($seg_list);

      打印输出

    array(7) {
      [0]=>
      string(12) "怜香惜玉"
      [1]=>
      string(3) "也"
      [2]=>
      string(3) "得"
      [3]=>
      string(3) "要"
      [4]=>
      string(3) "看"
      [5]=>
      string(6) "对象"
      [6]=>
      string(3) "啊"
    }
    array(7) {
      [0]=>
      string(12) "憐香惜玉"
      [1]=>
      string(3) "也"
      [2]=>
      string(3) "得"
      [3]=>
      string(3) "要"
      [4]=>
      string(3) "看"
      [5]=>
      string(6) "對象"
      [6]=>
      string(3) "啊"
    }

     6.保留日语或者朝鲜语原文不进行过滤

      代码示例

    ini_set('memory_limit', '1024M');
     
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/MultiArray.php";
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/Factory/MultiArrayFactory.php";
    require_once dirname(dirname(__FILE__))."/class/Jieba.php";
    require_once dirname(dirname(__FILE__))."/class/Finalseg.php";
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    Jieba::init(array('cjk'=>'all'));
    Finalseg::init();
     
    $seg_list = Jieba::cut("한국어 또는 조선말은 제주특별자치도를 제외한 한반도 및 그 부속 도서와 한민족 거주 지역에서 쓰이는 언어로");
    var_dump($seg_list);
     
    $seg_list = Jieba::cut("日本語は、主に日本国内や日本人同士の間で使われている言語である。");
    var_dump($seg_list);
     
    // 加载日语词库可以对日语进行简单的分词
    Jieba::loadUserDict("/path/to/your/japanese/dict.txt");
    $seg_list = Jieba::cut("日本語は、主に日本国内や日本人同士の間で使われている言語である。");
    var_dump($seg_list);

      7.返回词语在原文的起止位置

        代码示例

    ini_set('memory_limit', '1024M');
     
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/MultiArray.php";
    require_once dirname(dirname(__FILE__))."/vendor/multi-array/Factory/MultiArrayFactory.php";
    require_once dirname(dirname(__FILE__))."/class/Jieba.php";
    require_once dirname(dirname(__FILE__))."/class/Finalseg.php";
    use Fukuball\Jieba\Jieba;
    use Fukuball\Jieba\Finalseg;
    Jieba::init(array('mode'=>'test','dict'=>'big'));
    Finalseg::init();
     
    $seg_list = Jieba::tokenize("永和服装饰品有限公司");
    var_dump($seg_list);

      打印输出

    array(4) {
      [0] =>
      array(3) {
        'word' =>
        string(6) "永和"
        'start' =>
        int(0)
        'end' =>
        int(2)
      }
      [1] =>
      array(3) {
        'word' =>
        string(6) "服装"
        'start' =>
        int(2)
        'end' =>
        int(4)
      }
      [2] =>
      array(3) {
        'word' =>
        string(6) "饰品"
        'start' =>
        int(4)
        'end' =>
        int(6)
      }
      [3] =>
      array(3) {
        'word' =>
        string(12) "有限公司"
        'start' =>
        int(6)
        'end' =>
        int(10)
      }
    }

     八、其他词典

    1. 内容占用较小的词典 https://github.com/fukuball/jieba-php/blob/master/src/dict/dict.small.txt
    2. 支持繁体字的词典 https://github.com/fukuball/jieba-php/blob/master/src/dict/dict.big.txt

       九、词性说明

    a 形容词 (取英语形容词 adjective 的第 1 个字母。)
      ad 副形词 (直接作状语的形容词,形容词代码 a 和副词代码 d 并在一起。)
      ag 形容词性语素 (形容词性语素,形容词代码为 a,语素代码 g 前面置以 a。)
      an 名形词 (具有名词功能的形容词,形容词代码 a 和名词代码 n 并在一起。)
    b 区别词 (取汉字「别」的声母。)
    c 连词 (取英语连词 conjunction 的第 1 个字母。)
    d 副词 (取 adverb 的第 2 个字母,因其第 1 个字母已用于形容词。)
      df 副词*
      dg 副语素 (副词性语素,副词代码为 d,语素代码 g 前面置以 d。)
    e 叹词 (取英语叹词 exclamation 的第 1 个字母。)
    eng 外语
    f 方位词 (取汉字「方」的声母。)
    g 语素 (绝大多数语素都能作为合成词的「词根」,取汉字「根」的声母。)
    h 前接成分 (取英语 head 的第 1 个字母。)
    i 成语 (取英语成语 idiom 的第 1 个字母。)
    j 简称略语 (取汉字「简」的声母。)
    k 后接成分
    l 习用语 (习用语尚未成为成语,有点「临时性」,取「临」的声母。)
    m 数词 (取英语 numeral 的第 3 个字母,n,u 已有他用。)
      mg 数语素
      mq 数词*
    n 名词 (取英语名词 noun 的第 1 个字母。)
      ng 名语素 (名词性语素,名词代码为 n,语素代码 g 前面置以 n。)
      nr 人名 (名词代码n和「人(ren)」的声母并在一起。)
      nrfg 名词*
      nrt 名词*
      ns 地名 (名词代码 n 和处所词代码 s 并在一起。)
      nt 机构团体 (「团」的声母为 t,名词代码 n 和 t 并在一起。)
      nz 其他专名 (「专」的声母的第 1 个字母为 z,名词代码 n 和 z 并在一起。)
    o 拟声词 (取英语拟声词 onomatopoeia 的第 1 个字母。)
    p 介词 (取英语介词 prepositional 的第 1 个字母。)
    q 量词 (取英语 quantity 的第 1 个字母。)
    r 代词 (取英语代词 pronoun的 第 2 个字母,因 p 已用于介词。)
      rg 代词语素
      rr 代词*
      rz 代词*
    s 处所词 (取英语 space 的第 1 个字母。)
    t 时间词 (取英语 time 的第 1 个字母。)
      tg 时语素 (时间词性语素,时间词代码为 t,在语素的代码 g 前面置以 t。)
    u 助词 (取英语助词 auxiliary 的第 2 个字母,因 a 已用于形容词。)
      ud 助词*
      ug 助词*
      uj 助词*
      ul 助词*
      uv 助词*
      uz 助词*
    v 动词 (取英语动词 verb 的第一个字母。)
      vd 副动词 (直接作状语的动词,动词和副词的代码并在一起。)
      vg 动语素
      vi 动词*
      vn 名动词 (指具有名词功能的动词,动词和名词的代码并在一起。)
      vq 动词*
    w 标点符号
    x 非语素字 (非语素字只是一个符号,字母 x 通常用于代表未知数、符号。)
    y 语气词 (取汉字「语」的声母。)
    z 状态词 (取汉字「状」的声母的前一个字母。)
      zg 状态词*
    
    转载自:https://www.cnblogs.com/kingchou/p/7940691.html

    root