jieba-php

GitHub
1.4k 258 非常简单 1 次阅读 3天前MIT开发框架语言模型图像
AI 解读 由 AI 自动生成,仅供参考

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 的操作系统)
GPU

不需要

内存

建议 600MB - 1024MB (根据代码示例中的 memory_limit 设置)

依赖
notes这是一个纯 PHP 实现的中文分词库,不依赖 Python 或 GPU。使用时需通过 ini_set 设置足够的内存限制(示例中为 600M 或 1024M),以加载字典文件。支持繁体中文(需切换字典模式为 'big')。
python不适用 (这是一个 PHP 库)
PHP
Composer (推荐用于自动安装)
multi-array/multi-array (内部依赖)
jieba-php hero image

快速开始

jieba-php

用爱制作 codecov

“结巴”中文分词:打造最佳的 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)
  }
}

其他詞典

  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

常見問題

  1. 模型的數據是如何生成的? https://github.com/fxsjy/jieba/issues/7
  2. 這個庫的授權是? https://github.com/fxsjy/jieba/issues/2

jieba-php 英文文件

在線示範

特色

  • 支持三種分詞模式:

    1. 精確模式,試圖將句子切分成最精確的分詞結果,適合文本分析;
    1. 全模式,將句子中的所有可能單詞都切分出來;
    1. 搜尋引擎模式,基於精確模式,進一步將長詞拆分成若干短詞,以提高召回率;
  • 支持繁體中文分詞

  • 支持自定義詞典

  • 支持多語言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只接受一個參數:需要分詞的字符串,它會將句子切分成短詞。
  • cutcutForSearch都會返回分詞後的數組。

函數 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/19
0.342022/08/15
0.332017/11/22
0.322017/11/22
0.312017/11/21
0.292017/11/09
0.282017/11/07
0.272017/11/04
0.262017/11/04
0.252016/02/16
0.242016/02/06
0.232016/01/28
0.222016/01/28
0.212016/01/27
0.202015/11/30
0.192015/07/27
0.182015/05/27
0.172015/05/02
0.162015/04/30

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|4天前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|4天前
开发框架图像Agent

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 真正成长为懂上

148.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.1k|★★☆☆☆|昨天
开发框架图像Agent

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 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|3天前
插件开发框架

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|3天前
语言模型图像Agent