laravel7 安装中文分词器 jieba

《laravel7 安装中文分词器 jieba》

目前(20210115)市面上比较流行的分词器有两个,分别是 SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统)。 SCWS 采用纯 C 语言开发,不依赖任何外部库函数 。 另外一个是 jieba,也就是我们今天的主角,这里说明一下,为什么用jieba而不用scws,主要是因为jieba是用python编写的, 可能会兼容将来的人工智能发展大方向😎(扯远了,归根到底好用就行!)

安装

//官网:https://github.com/fukuball/jieba-php
//进行项目目录
# cd your project
# composer require fukuball/jieba-php:dev-master

引入

//网上很多都说需要引入,测试发现不需要引入(laravel7 php7.4)
//require_once "vendor/fukuball/jieba-php/src/vendor/multi-array/MultiArray.php";
//require_once "vendor/fukuball/jieba-php/src/vendor/multi-array/Factory/MultiArrayFactory.php";
//require_once "vendor/fukuball/jieba-php/src/class/Jieba.php";
//require_once "vendor/fukuball/jieba-php/src/class/Finalseg.php";

//使用
use Fukuball\Jieba\Jieba;
use Fukuball\Jieba\Finalseg;
--------------------------------
.....class(){
   Jieba::init();
   Finalseg::init();
   $seg_list = Jieba::cut("怜香惜玉也得要看对象啊!");
   dd($seg_list);
}
.....
-----------------------------------------
array:8 [
  0 => "怜香惜玉"
  1 => "也"
  2 => "得"
  3 => "要"
  4 => "看"
  5 => "对象"
  6 => "啊"
  7 => "!"
]

添加自定義詞典

参考:https://github.com/fukuball/jieba-php/blob/master/src/dict/user_dict.txt
//開發者可以指定自己自定義的詞典,以便包含 jieba 詞庫裡沒有的詞。雖然 jieba 有新詞識別能力,但是自行添加新詞可以保證更高的正確率
//用法: Jieba::loadUserDict(file_name) # file_name 為自定義詞典的絕對路徑
//格式:詞典格式和 dict.txt 一樣,一個詞佔一行;每一行分為三部分,一部分為詞語,一部分為詞頻,一部分為詞性,用空格隔開

Jieba::init();
Jieba::loadUserDict('yourpath/surenku_keyword.txt');

----------------------
云计算 5 n
李小福 2 nr
创新办 3 i
easy_install 3 eng
好用 120 adj
-------------------------

词性说明

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 状态词*

關鍵詞提取

use Fukuball\Jieba\Jieba;
use Fukuball\Jieba\Finalseg;
use Fukuball\Jieba\JiebaAnalyse;
Jieba::init(array('mode'=>'test','dict'=>'small'));
Finalseg::init();
JiebaAnalyse::init();

//JiebaAnalyse::extractTags($content, $top_k)
//top_k 為返回幾個 TF/IDF 權重最大的關鍵詞,默認值為 20

$top_k = 10;
$content = "HuaYan 花の颜 Vol.028  Manuela玛鲁娜 无水印百度云下载";
$tags = JiebaAnalyse::extractTags($content, $top_k);
dd($tags);
------------------------------
array:8 [
  "HuaYan" => 1.4943459378625
  "Vol.028" => 1.4943459378625
  "Manuela" => 1.4943459378625
  "玛鲁娜" => 1.4943459378625
  "水印" => 1.3695298341
  "百度" => 1.0891614807675
  "下载" => 0.89355090947875
]
----------------------------------

//可使用 setStopWords 增加自定義 stop words
JiebaAnalyse::setStopWords('/path/to/your/dict/stop_words.txt');
$tags = JiebaAnalyse::extractTags($content, $top_k);
dd($tags);

按詞性分詞

use Fukuball\Jieba\Jieba;
use Fukuball\Jieba\Finalseg;
use Fukuball\Jieba\Posseg;
Jieba::init();
Finalseg::init();
Posseg::init();

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

模式

//切換成大字典模式(支持简/繁体分词)
Jieba::init(array('mode'=>'default','dict'=>'big'));
Finalseg::init();
$seg_list = Jieba::cut("憐香惜玉也得要看對象啊!");

//保留日语或者朝鲜语原文不进行过滤
Jieba::init(array('cjk'=>'all'));
Finalseg::init();
$seg_list = Jieba::cut("한국어 또는 조선말은 제주특별자치도를 제외한 한반도 및 그 부속 도서와 한민족 거주 지역에서 쓰이는 언어로");

//返回詞語在原文的起止位置
Jieba::init(array('mode'=>'test','dict'=>'big'));
Finalseg::init();
$seg_list = Jieba::tokenize("永和服装饰品有限公司");
--------------------
array:4 [
  0 => array:3 [
    "word" => "永和"
    "start" => 0
    "end" => 2
  ]
  1 => array:3 [
    "word" => "服装"
    "start" => 2
    "end" => 4
  ]
  2 => array:3 [
    "word" => "饰品"
    "start" => 4
    "end" => 6
  ]
  3 => array:3 [
    "word" => "有限公司"
    "start" => 6
    "end" => 10
  ]
]
--------------------------------

seg_list = jieba.cut("我来到北京清华大学", true)
dd($seg_list); #全模式
-----------------------------
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) "学"
}
------------------------------

//搜索引擎模式 //测试此模式不存在?
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所") 
点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注