jieba-php
jieba-php 是一款专为 PHP 开发者打造的中文分词组件,旨在将连续的中文文本精准切割为有意义的词语。它源自著名的 Python 版 jieba 项目,成功填补了 PHP 生态在高质量中文自然语言处理方面的空白,解决了服务器端无法高效进行中文断词、关键词提取及词性标注的难题。
无论是需要构建搜索引擎索引、进行文本情感分析,还是处理繁体中文与多语言(中日韩)混合内容,jieba-php 都能提供可靠支持。它特别适合后端工程师、数据分析师以及需要在 PHP 项目中集成 NLP 功能的研究人员使用。即便在当前大模型流行的背景下,对于追求低成本、低延迟且无需依赖外部 API 的场景,它依然是极具价值的轻量级选择。
技术层面,jieba-php 基于 Trie 树结构实现高效的词图扫描,利用动态规划算法查找最大概率路径以确保分词准确性;针对未登录词,则采用隐马尔可夫模型(HMM)配合 Viterbi 算法进行智能识别。工具支持精确、全模式及搜索引擎三种分词策略,允许用户自定义词典与词性标签,并提供了 Composer 便捷安装方式,帮助开发者快速将中文处理能力融入现有系统。
使用场景
某电商平台的 PHP 后端团队需要构建一个商品评论情感分析系统,以实时监测用户反馈并优化搜索推荐。
没有 jieba-php 时
- 分词精度极低:只能简单按字符或空格切割,导致“清华大学”被拆成“清”、“华”、“大”、“学”,完全丢失语义,无法识别具体实体。
- 新词识别困难:面对“杭研大厦”等未登录的新品牌或专有名词,系统直接将其拆解为单字,导致情感分析模型误判语意。
- 搜索召回率低:用户搜索“笔记本电脑”时,因评论中的“笔记本”和“电脑”未被正确关联,导致大量相关商品无法被检索到。
- 开发成本高昂:团队需自行编写复杂的正则规则或调用昂贵的第三方 API 来处理中文断词,维护难度大且响应速度慢。
使用 jieba-php 后
- 语义理解精准:利用精确模式自动将“怜香惜玉”、“清华大学”等成语和专名完整切分,大幅提升了后续情感分析的准确度。
- 智能识别新词:基于 HMM 模型和 Viterbi 算法,无需更新字典即可自动识别“杭研大厦”等未登录词,确保新兴品牌不被遗漏。
- 搜索体验升级:通过搜索引擎模式对长词进行细粒度二次切分,显著提高了倒排索引的覆盖率,让用户能更轻松地找到目标商品。
- 部署高效轻量:直接在 PHP 项目中通过 Composer 集成,支持自定义词典和繁体中文,无需依赖外部服务,降低了运营成本并提升了响应速度。
jieba-php 让 PHP 开发者能以低成本获得工业级的中文分词能力,彻底解决了非 Python 生态下中文文本处理的核心痛点。
运行环境要求
- 未说明 (适用于任何支持 PHP 的操作系统)
不需要
建议 600MB - 1024MB (根据代码示例中的 memory_limit 设置)

快速开始
jieba-php
“结巴”中文分词:打造最佳的 PHP 中文分词、中文断词组件,原始版本翻译自 fxsjy/jieba,目前已成为一个独立分支,欢迎感兴趣的开发者共同参与开发!若想使用 Python 版本,请前往 fxsjy/jieba。
现在已支持繁体中文!只需将字典切换为 big 模式即可!
目前使用 LLM 大语言模型进行中文断词可以获得更好的效果,但若追求快速、低成本,该套件仍然具有实用价值。
“Jieba”(中文意为“结巴”)中文文本分词:致力于成为最佳的 PHP 中文分词模块。
请向下滚动查看英文文档。
在线演示
功能
- 支持三种分词模式:
- 1)默认精确模式,尝试将句子最精确地切分,适合文本分析;
- 2)全模式,扫描出句子中所有可能成词的词语,但无法解决歧义。(需要充足的字典)
- 3)搜索引擎模式,在精确模式基础上对长词再次切分,提高召回率,适用于搜索引擎分词。
- 支持繁体断词
- 支持自定义词典
- 支持多语言 CJK 文本处理(中文、日文、韩文)
- 支持 TF-IDF 分词整合和词性标注
- 支持内存管理和缓存优化
- 支持自定义词性标签
使用方法
- 自动安装:使用 Composer 安装后,通过 autoload 引用
代码示例:
composer require fukuball/jieba-php
代码示例:
require_once "/path/to/your/vendor/autoload.php";
- 手动安装:将 jieba-php 放置在适当目录后,通过 require_once 引用
代码示例:
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";
算法
- 基于 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) "啊"
}
全模式:
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) "学"
}
默认模式:
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 算法识别出来)
搜索引擎模式:
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 具有新词识别能力,但自行添加新词可以确保更高的准确率。
使用方法:Jieba::loadUserDict(file_name) # file_name 为自定义词典的绝对路径。
词典格式与 dict.txt 相同,每行一个词;每行分为三部分,分别为词语、词频和词性,用空格隔开。
示例:
云计算 5 n 李小福 2 n 创新办 3 n
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 / 加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
说明:“通过用户自定义词典来增强歧义纠错能力” --- https://github.com/fxsjy/jieba/issues/14
功能 3):关键词提取
- JiebaAnalyse::extractTags($content, $top_k)
- content 为待提取的文本。
- 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):詞性分詞
代碼示例 (Tutorial)
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);
新功能:支持 TF-IDF 分數的詞性分詞
// 使用 Posseg::cut() 含 TF-IDF 分數
$scored_result = Posseg::cut("我愛吃蘋果", array('with_scores' => true));
foreach ($scored_result as $item) {
echo sprintf("%-10s [%s] TF: %.4f, TF-IDF: %.4f\n",
$item['word'], $item['tag'], $item['tf'], $item['tfidf']);
}
// 使用 Jieba::cut() 含詞性標註
$pos_result = Jieba::cut("我愛吃蘋果", false, array('with_pos' => true));
foreach ($pos_result as $item) {
echo sprintf("%-10s [%s]\n", $item['word'], $item['tag']);
}
// 使用 Jieba::cut() 含詞性標註和 TF-IDF 分數
$full_result = Jieba::cut("我愛吃蘋果", false, array(
'with_pos' => true,
'with_scores' => true
));
foreach ($full_result as $item) {
echo sprintf("%-10s [%s] TF: %.4f, TF-IDF: %.4f\n",
$item['word'], $item['tag'], $item['tf'], $item['tfidf']);
}
Output:
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):切換成繁體字典
代碼示例 (Tutorial)
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);
Output:
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) "啊"
}
功能 5):切換成繁體字典
代碼示例 (Tutorial)
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);
Output:
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):多語言 CJK 文本處理
jieba-php 現在支援更好的多語言 CJK(中文、日文、韓文)文本處理,包括混合語言文本的處理。
代碼示例 (Tutorial)
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;
// 初始化支援所有 CJK 語言
Jieba::init(array('cjk'=>'all'));
Finalseg::init();
// 韓語文本處理
$seg_list = Jieba::cut("한국어 또는 조선말은 제주특별자치도를 제외한 한반도 및 그 부속 도서와 한민족 거주 지역에서 쓰이는 언어로");
var_dump($seg_list);
// 日語文本處理
$seg_list = Jieba::cut("日本語は、主に日本国内や日本人同士の間で使われている言語である。");
var_dump($seg_list);
// 混合語言文本處理
$mixed_text = "我喜欢这个世界。私は日本に住んでいます。안녕하세요 세계입니다.";
$seg_list = Jieba::cut($mixed_text);
var_dump($seg_list);
// 複雜混合文本處理
$complex_mixed = "今天weather很好,私たちは공원에 갔습니다。";
$seg_list = Jieba::cut($complex_mixed);
var_dump($seg_list);
// 加載日語詞庫可以對日語進行簡單的分詞
Jieba::loadUserDict("/path/to/your/japanese/dict.txt");
$seg_list = Jieba::cut("日本語は、主に日本国内や日本人同士の間で使われている言語である。");
var_dump($seg_list);
示範腳本
- 基本多語言處理:
php src/cmd/demo_mixed_cjk.php - TF-IDF 和詞性標註整合:
php src/cmd/demo_tf_idf_pos.php
輸出:
array(15) {
[0]=>
string(9) "韓語"
[1]=>
string(6) "或"
[2]=>
string(12) "朝鮮語是"
[3]=>
string(24) "濟州特別自治道的"
[4]=>
string(9) "除外的"
[5]=>
string(9) "韓半島"
[6]=>
string(3) "以及"
[7]=>
string(3) "其"
[8]=>
string(6) "附屬"
[9]=>
string(9) "島嶼與"
[10]=>
string(9) "韓民族"
[11]=>
string(6) "居住"
[12]=>
string(12) "地區中"
[13]=>
string(9) "使用的"
[14]=>
string(9) "語言"
}
array(21) {
[0]=>
string(6) "日本"
[1]=>
string(3) "語"
[2]=>
string(3) "是"
[3]=>
string(3) "主要"
[4]=>
string(3) "在"
[5]=>
string(6) "日本"
[6]=>
string(6) "國內"
[7]=>
string(3) "和"
[8]=>
string(6) "日本人"
[9]=>
string(3) "之間"
[10]=>
string(3) "使用"
[11]=>
string(3) "著"
[12]=>
string(6) "的"
[13]=>
string(6) "語言"
}
array(17) {
[0]=>
string(9) "日語是"
[1]=>
string(3) "主要"
[2]=>
string(6) "在"
[3]=>
string(9) "日本國"
[4]=>
string(3) "內"
[5]=>
string(3) "和"
[6]=>
string(9) "日本人"
[7]=>
string(6) "之間"
[8]=>
string(3) "進行"
[9]=>
string(3) "交流"
[10]=>
string(3) "時"
[11]=>
string(3) "被"
[12]=>
string(6) "使用"
[13]=>
string(6) "的"
[14]=>
string(6) "語言"
[15]=>
string(6) "之一"
[16]=>
string(9) "也是"
}
功能 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)
}
}
其他詞典
佔用內容較小的詞典 https://github.com/fukuball/jieba-php/blob/master/src/dict/dict.small.txt
支持繁體斷詞的詞典 https://github.com/fukuball/jieba-php/blob/master/src/dict/dict.big.txt
常見問題
- 模型的數據是如何生成的? https://github.com/fxsjy/jieba/issues/7
- 這個庫的授權是? https://github.com/fxsjy/jieba/issues/2
jieba-php 英文文件
在線示範
特色
支持三種分詞模式:
- 精確模式,試圖將句子切分成最精確的分詞結果,適合文本分析;
- 全模式,將句子中的所有可能單詞都切分出來;
- 搜尋引擎模式,基於精確模式,進一步將長詞拆分成若干短詞,以提高召回率;
支持繁體中文分詞
支持自定義詞典
支持多語言CJK文本處理(中文、日文、韓文)
支持TF-IDF整合與詞性標註
支持記憶體管理和緩存優化
支持自定義詞性標籤
使用方法
- 安裝:使用Composer安裝jieba-php,然後引入自動載入檔案即可使用。
算法
- 基於Trie樹結構實現高效詞圖掃描;使用漢字構成的句子可形成有向無環圖(DAG)。
- 採用記憶搜尋計算最大概率路徑,以根據詞頻組合識別出最佳切分點。
- 對於未知詞彙,則使用基於字符位置的HMM模型,並採用Viterbi算法。
- BEMS的含義 https://github.com/fxsjy/jieba/issues/7。
接口
cut方法接受兩個參數:1) 第一個參數為待分詞的字符串;2) 第二個參數cut_all用於控制分詞模式。- 待分詞的字符串可以使用UTF-8編碼。
cutForSearch只接受一個參數:需要分詞的字符串,它會將句子切分成短詞。cut和cutForSearch都會返回分詞後的數組。
函數 1) 分詞
示例(教程)
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.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造") #搜索引擎模式
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(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) "學"
}
預設精確模式:
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算法識別出來了)
搜索引擎模式:
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 具备识别新词的能力,但添加自定义新词可以确保更高的分词准确率。
使用方法:
Jieba::loadUserDict(file_name)# file_name 是自定义词典的路径。词典格式与
dict.txt相同:每行一个词;每行分为两部分,第一部分是词本身,第二部分是词频,中间用空格分隔。示例:
云计算 5 李小福 2 创新办 3
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 / 加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
功能 3) 关键词提取
- JiebaAnalyse::extractTags($content, $top_k)
- content:待提取文本
- top_k:返回前若干个 TF/IDF 权重最大的关键词,默认值为 20
示例(关键词提取)
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);
输出:
array(10) {
["是否"]=>
float(1.2196321889395)
["一般"]=>
float(1.0032459890209)
["肌迫"]=>
float(0.64654314660465)
["怯懦"]=>
float(0.44762844339349)
["藉口"]=>
float(0.32327157330233)
["逼不得已"]=>
float(0.32327157330233)
["不安全感"]=>
float(0.26548304656279)
["同感"]=>
float(0.23929673812326)
["有把握"]=>
float(0.21043366018744)
["空洞"]=>
float(0.20598261709442)
}
功能 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) "w"
}
[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) "w"
}
[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) "w"
}
[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) "w"
}
}
功能 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);
输出:
array(15) {
[0]=>
string(9) "한국어"
[1]=>
string(6) "또는"
[2]=>
string(12) "조선말은"
[3]=>
string(24) "제주특별자치도를"
[4]=>
string(9) "제외한"
[5]=>
string(9) "한반도"
[6]=>
string(3) "및"
[7]=>
string(3) "그"
[8]=>
string(6) "부속"
[9]=>
string(9) "도서와"
[10]=>
string(9) "한민족"
[11]=>
string(6) "거주"
[12]=>
string(12) "지역에서"
[13]=>
string(9) "쓰이는"
[14]=>
string(9) "언어로"
}
array(21) {
[0]=>
string(6) "日本"
[1]=>
string(3) "語"
[2]=>
string(3) "は"
[3]=>
string(3) "主"
[4]=>
string(3) "に"
[5]=>
string(6) "日本"
[6]=>
string(6) "国内"
[7]=>
string(3) "や"
[8]=>
string(6) "日本"
[9]=>
string(3) "人"
[10]=>
string(6) "同士"
[11]=>
string(3) "の"
[12]=>
string(3) "間"
[13]=>
string(3) "で"
[14]=>
string(3) "使"
[15]=>
string(3) "わ"
[16]=>
string(6) "れて"
[17]=>
string(6) "いる"
[18]=>
string(6) "言語"
[19]=>
string(3) "で"
[20]=>
string(6) "ある"
}
array(17) {
[0]=>
string(9) "日本語"
[1]=>
string(3) "は"
[2]=>
string(6) "主に"
[3]=>
string(9) "日本国"
[4]=>
string(3) "内"
[5]=>
string(3) "や"
[6]=>
string(9) "日本人"
[7]=>
string(6) "同士"
[8]=>
string(3) "の"
[9]=>
string(3) "間"
[10]=>
string(3) "で"
[11]=>
string(3) "使"
[12]=>
string(3) "わ"
[13]=>
string(6) "れて"
[14]=>
string(6) "いる"
[15]=>
string(6) "言語"
[16]=>
string(9) "である"
}
詞性说明
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 状态词*
功能 8):内存管理
为了处理大量文本时的内存使用问题,jieba-php 提供了新的 JiebaMemory 类来统一管理所有类别的内存使用。
JiebaMemory - 统一内存管理
ini_set('memory_limit', '1024M');
use Fukuball\Jieba\JiebaMemory;
// 初始化所有类别
JiebaMemory::initAll();
// 检查初始化状态
$status = JiebaMemory::getInitializationStatus();
var_dump($status);
// 获取内存使用统计
$stats = JiebaMemory::getMemoryStats();
echo "当前内存使用:" . $stats['current_memory_usage_formatted'] . "\n";
echo "峰值内存使用:" . $stats['peak_memory_usage_formatted'] . "\n";
// 清除所有缓存但保持类别初始化
JiebaMemory::clearAllCaches();
// 销毁所有类别释放内存
JiebaMemory::destroyAll();
详细缓存统计
// 获取所有类别的缓存统计
$cacheStats = JiebaMemory::getAllCacheStats();
echo "Jieba DAG 缓存大小:" . $cacheStats['jieba']['dag_cache_size'] . "\n";
echo "Posseg 词性标注数量:" . $cacheStats['posseg']['word_tag_size'] . "\n";
echo "JiebaAnalyse IDF 频率数量:" . $cacheStats['jieba_analyse']['idf_freq_size'] . "\n";
缓存管理(原有功能)
当处理大量文本时,jieba-php 使用内部缓存来提高性能。以下功能可用于管理缓存内存使用:
clearCache()
清除所有内部缓存以释放内存。处理多个大型文本文件时很有用。
ini_set('memory_limit', '1024M');
use Fukuball\Jieba\Jieba;
use Fukuball\Jieba\Finalseg;
Jieba::init();
Finalseg::init();
// 处理第一个文件
$text1 = file_get_contents('large_file1.txt');
$seg_list1 = Jieba::cut($text1);
// 处理下一个文件前清除缓存
Jieba::clearCache();
// 处理第二个文件
$text2 = file_get_contents('large_file2.txt');
$seg_list2 = Jieba::cut($text2);
getCacheStats()
返回当前缓存使用情况以便监控。
$stats = Jieba::getCacheStats();
echo "DAG 缓存大小:" . $stats['dag_cache_size'] . "\n";
echo "Trie 缓存大小:" . $stats['trie_cache_size'] . "\n";
echo "内存使用:" . round($stats['total_memory_usage'] / 1024 / 1024, 2) . "M\n";
echo "峰值内存:" . round($stats['peak_memory_usage'] / 1024 / 1024, 2) . "M\n";
clearCacheIfNeeded()
如果缓存超过指定大小限制则自动清除。
// 如果 DAG 缓存超过 50,000 条目或 trie 缓存超过 50,000 条目则清除缓存
$cleared = Jieba::clearCacheIfNeeded(50000, 50000);
if ($cleared) {
echo "由于大小限制,缓存已被清除\n";
}
// 自定义限制
$cleared = Jieba::clearCacheIfNeeded(10000, 10000);
内存使用提示
- 对于处理多个文件的 CLI 应用程序,在每个文件后调用
clearCache()或使用JiebaMemory::clearAllCaches() - 使用
getCacheStats()或JiebaMemory::getMemoryStats()监控内存使用情况 - 考虑使用
clearCacheIfNeeded()进行自动缓存管理 - 注意清除缓存会重置性能优化,直到重新建立缓存
- 使用
JiebaMemory::destroyAll()完全释放内存,但需要重新初始化才能再次使用
捐赠
如果您觉得 fuku-ml 很有用,请考虑捐赠。谢谢!
- bitcoin: 1BbihQU3CzSdyLSP9bvQq7Pi1z1jTdAaq9
- eth: 0x92DA3F837bf2F79D422bb8CEAC632208F94cdE33
许可证
MIT 许可证(MIT)
版权所有 © 2015 fukuball
特此授予任何人免费获取本软件及与其相关的文档文件(“软件”)副本的权利,以便对软件进行处理,包括但不限于使用、复制、修改、合并、发布、分发、再许可和出售软件副本的权利,以及允许向任何获得软件的人提供软件以供其使用的权利,但须遵守以下条件:
上述版权声明和本许可声明应包含在软件的所有副本或重要部分中。
“软件”按“原样”提供,不提供任何形式的明示或暗示担保,包括但不限于适销性、特定用途适用性和非侵权性担保。在任何情况下,作者或版权所有者均不对因本软件或其使用而引起的任何索赔、损害或其他责任承担任何责任,无论该等责任是基于合同、侵权行为或其他原因产生的,且与本软件或其使用有关。
版本历史
0.422025/07/190.342022/08/150.332017/11/220.322017/11/220.312017/11/210.292017/11/090.282017/11/070.272017/11/040.262017/11/040.252016/02/160.242016/02/060.232016/01/280.222016/01/280.212016/01/270.202015/11/300.192015/07/270.182015/05/270.172015/05/020.162015/04/30常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备