原文地址:http://blog.youkuaiyun.com/sherlockzoom/article/details/44566425
jieba
“结巴”中文分词:做最好的 Python 中文分词组件
“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.
- Scroll down for English documentation.
特点
-
支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
-
支持繁体分词
- 支持自定义词典
- MIT 授权协议
在线演示
http://jiebademo.ap01.aws.af.cm/
(Powered by Appfog)
网站代码:https://github.com/fxsjy/jiebademo
安装说明
代码对 Python 2/3 均兼容
- 全自动安装:
easy_install jieba
或者 pip install jieba
/ pip3 install jieba
- 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行
python setup.py install
- 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
- 通过
import jieba
来引用
算法
- 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
- 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
- 对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
主要功能
1) :分词
jieba.cut
方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型jieba.cut_for_search
方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细- 待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
jieba.cut
以及 jieba.cut_for_search
返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),也可以用 list(jieba.cut(…)) 转化为 list
代码示例( 分词 )
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#encoding=utf-8</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> jieba
seg_list = jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我来到北京清华大学"</span>, cut_all=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">True</span>)
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Full Mode: "</span> + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/ "</span>.join(seg_list)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 全模式</span>
seg_list = jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我来到北京清华大学"</span>, cut_all=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Default Mode: "</span> + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/ "</span>.join(seg_list)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 精确模式</span>
seg_list = jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"他来到了网易杭研大厦"</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 默认是精确模式</span>
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span>.join(seg_list))
seg_list = jieba.cut_for_search(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"小明硕士毕业于中国科学院计算所,后在日本京都大学深造"</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 搜索引擎模式</span>
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span>.join(seg_list))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
输出:
【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
【精确模式】: 我/ 来到/ 北京/ 清华大学
【新词识别】:他, 来到, 了, 网易, 杭研, 大厦 (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)
【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
2) :添加自定义词典
载入词典
- 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
- 用法: jieba.load_userdict(file_name) # file_name 为自定义词典的路径
- 词典格式和
dict.txt
一样,一个词占一行;每一行分三部分,一部分为词语,另一部分为词频(可省略),最后为词性(可省略),用空格隔开 -
词频可省略,使用计算出的能保证分出该词的词频
-
范例:
调整词典
代码示例:
<code class="language-pycon hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'如果放到post中将出错。'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
如果/放到/post/中将/出错/。
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>jieba.suggest_freq((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'中'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'将'</span>), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">True</span>)
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">494</span>
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'如果放到post中将出错。'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
如果/放到/post/中/将/出错/。
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'「台中」正确应该不会被切开'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
「/台/中/」/正确/应该/不会/被/切开
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>jieba.suggest_freq(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'台中'</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">True</span>)
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">69</span>
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'「台中」正确应该不会被切开'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
「/台中/」/正确/应该/不会/被/切开</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>
3) :关键词提取
- jieba.analyse.extract_tags(sentence,topK,withWeight) #需要先
import jieba.analyse
- sentence 为待提取的文本
- topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
代码示例 (关键词提取)
https://github.com/fxsjy/jieba/blob/master/test/extract_tags.py
关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径
关键词一并返回关键词权重值示例
算法论文: TextRank: Bringing Order into Texts
基本思想:
- 将待抽取关键词的文本进行分词
- 以固定窗口大小(我选的5,可适当调整),词之间的共现关系,构建图
- 计算图中节点的PageRank,注意是无向带权图
基本使用:
jieba.analyse.textrank(raw_text)
示例结果:
来自__main__
的示例结果:
<code class="hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">吉林 1.0
欧亚 0.864834432786
置业 0.553465925497
实现 0.520660869531
收入 0.379699688954
增资 0.355086023683
子公司 0.349758490263
全资 0.308537396283
城市 0.306103738053
商业 0.304837414946</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>
4) : 词性标注
- 标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法
- 用法示例
<code class="language-pycon hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">>>> import jieba.posseg as pseg
>>> words = pseg.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我爱北京天安门"</span>)
>>> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> w <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> words:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'%s %s'</span> % (w.word, w.flag))
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
我 r
爱 v
北京 ns
天安门 ns</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
5) : 并行分词
6) : Tokenize:返回词语在原文的起始位置
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">result = jieba.tokenize(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">u'永和服装饰品有限公司'</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> tk <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> result:
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"word %s\t\t start: %d \t\t end:%d"</span> % (tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 永和 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">2</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 服装 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">4</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 饰品 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">6</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 有限公司 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">10</span></span>
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">result = jieba.tokenize(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">u'永和服装饰品有限公司'</span>,mode=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'search'</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> tk <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> result:
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"word %s\t\t start: %d \t\t end:%d"</span> % (tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 永和 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">2</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 服装 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">4</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 饰品 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">6</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 有限 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">8</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 公司 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">10</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 有限公司 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">10</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
7) : ChineseAnalyzer for Whoosh 搜索引擎
8) : 命令行分词
使用示例:cat news.txt | python -m jieba > cut_result.txt
命令行选项(翻译):
使用: python -m jieba [options] filename
结巴命令行界面。
固定参数:
filename 输入文件
可选参数:
-h, --help 显示此帮助信息并退出
-d [DELIM], --delimiter [DELIM]
使用 DELIM 分隔词语,而不是用默认的' / '。
若不指定 DELIM,则使用一个空格分隔。
-D DICT, --dict DICT 使用 DICT 代替默认词典
-u USER_DICT, --user-dict USER_DICT
使用 USER_DICT 作为附加词典,与默认词典或自定义词典配合使用
-a, --cut-all 全模式分词
-n, --no-hmm 不使用隐含马尔可夫模型
-q, --quiet 不输出载入信息到 STDERR
-V, --version 显示版本信息并退出
如果没有指定文件名,则使用标准输入。
--help
选项输出:
$> python -m jieba --help
usage: python -m jieba [options] filename
Jieba command line interface.
positional arguments:
filename input file
optional arguments:
-h, --help show this help message and exit
-d [DELIM], --delimiter [DELIM]
use DELIM instead of ' / ' for word delimiter; or a
space if it is used without DELIM
-D DICT, --dict DICT use DICT as dictionary
-u USER_DICT, --user-dict USER_DICT
use USER_DICT together with the default dictionary or
DICT (if specified)
-a, --cut-all full pattern cutting
-n, --no-hmm don't use the Hidden Markov Model
-q, --quiet don't print loading messages to stderr
-V, --version show program's version number and exit
If no filename specified, use STDIN instead.
模块初始化机制的改变:lazy load (从0.28版本开始)
jieba 采用延迟加载,”import jieba” 不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。
import jieba
jieba.initialize() # 手动初始化(可选)
在 0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:
jieba.set_dictionary('data/dict.txt.big')
例子: https://github.com/fxsjy/jieba/blob/master/test/test_change_dictpath.py
其他词典
-
占用内存较小的词典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
-
支持繁体分词更好的词典文件
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big
下载你所需要的词典,然后覆盖 jieba/dict.txt 即可;或者用 jieba.set_dictionary('data/dict.txt.big')
其他语言实现
结巴分词 Java 版本
作者:piaolingxue
地址:https://github.com/huaban/jieba-analysis
结巴分词 C++ 版本
作者:yanyiwu
地址:https://github.com/yanyiwu/cppjieba
结巴分词 Node.js 版本
作者:yanyiwu
地址:https://github.com/yanyiwu/nodejieba
结巴分词 Erlang 版本
作者:falood
地址:https://github.com/falood/exjieba
结巴分词 R 版本
作者:qinwf
地址:https://github.com/qinwf/jiebaR
结巴分词 iOS 版本
作者:yanyiwu
地址:https://github.com/yanyiwu/iosjieba
系统集成
- Solr: https://github.com/sing1ee/jieba-solr
分词速度
- 1.5 MB / Second in Full Mode
- 400 KB / Second in Default Mode
- 测试环境: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《围城》.txt
常见问题
1. 模型的数据是如何生成的?
详见: https://github.com/fxsjy/jieba/issues/7
2. “台中”总是被切成“台 中”?(以及类似情况)
P(台中) < P(台)×P(中),“台中”词频不够导致其成词概率较低
解决方法:强制调高词频
jieba.add_word('台中')
或者 jieba.suggest_freq('台中', True)
3. “今天天气 不错”应该被切成“今天 天气 不错”?(以及类似情况)
解决方法:强制调低词频
jieba.suggest_freq(('今天', '天气'), True)
或者直接删除该词 jieba.del_word('今天天气')
4. 切出了词典中没有的词语,效果不理想?
解决方法:关闭新词发现
jieba.cut('丰田太省了', HMM=False)
jieba.cut('我们中出了一个叛徒', HMM=False)
更多问题请点击:https://github.com/fxsjy/jieba/issues?sort=updated&state=closed
修订历史
https://github.com/fxsjy/jieba/blob/master/Changelog
jieba
“Jieba” (Chinese for “to stutter”) Chinese text segmentation: built to be the best Python Chinese word segmentation module.
Features
Online demo
http://jiebademo.ap01.aws.af.cm/
(Powered by Appfog)
Usage
- Fully automatic installation:
easy_install jieba
or pip install jieba
- Semi-automatic installation: Download http://pypi.python.org/pypi/jieba/ , run
python setup.py install
after extracting. - Manual installation: place the
jieba
directory in the current directory or python site-packages
directory. import jieba
.
Algorithm
- Based on a prefix dictionary structure to achieve efficient word graph scanning. Build a directed acyclic graph (DAG) for all possible word combinations.
- Use dynamic programming to find the most probable combination based on the word frequency.
- For unknown words, a HMM-based model is used with the Viterbi algorithm.
Main Functions
1) : Cut
- The
jieba.cut
function accepts three input parameters: the first parameter is the string to be cut; the second parameter is cut_all
, controlling the cut mode; the third parameter is to control whether to use the Hidden Markov Model. jieba.cut_for_search
accepts two parameter: the string to be cut; whether to use the Hidden Markov Model. This will cut the sentence into short words suitable for search engines.- The input string can be an unicode/str object, or a str/bytes object which is encoded in UTF-8 or GBK. Note that using GBK encoding is not recommended because it may be unexpectly decoded as UTF-8.
jieba.cut
and jieba.cut_for_search
returns an generator, from which you can use a for
loop to get the segmentation result (in unicode), or list(jieba.cut( ... ))
to create a list.
Code example: segmentation
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#encoding=utf-8</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> jieba
seg_list = jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我来到北京清华大学"</span>, cut_all=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">True</span>)
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Full Mode: "</span> + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/ "</span>.join(seg_list)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 全模式</span>
seg_list = jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我来到北京清华大学"</span>, cut_all=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Default Mode: "</span> + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"/ "</span>.join(seg_list)) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 默认模式</span>
seg_list = jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"他来到了网易杭研大厦"</span>)
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span>.join(seg_list))
seg_list = jieba.cut_for_search(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"小明硕士毕业于中国科学院计算所,后在日本京都大学深造"</span>) <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># 搜索引擎模式</span>
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">", "</span>.join(seg_list))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
Output:
[Full Mode]: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
[Accurate Mode]: 我/ 来到/ 北京/ 清华大学
[Unknown Words Recognize] 他, 来到, 了, 网易, 杭研, 大厦 (In this case, "杭研" is not in the dictionary, but is identified by the Viterbi algorithm)
[Search Engine Mode]: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
2) : Add a custom dictionary
Load dictionary
Modify dictionary
- Use
add_word(word, freq=None, tag=None)
and del_word(word)
to modify the dictionary dynamically in programs. -
Use suggest_freq(segment, tune=True)
to adjust the frequency of a single word so that it can (or cannot) be segmented.
-
Note that HMM may affect the final result.
Example:
<code class="language-pycon hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'如果放到post中将出错。'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
如果/放到/post/中将/出错/。
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>jieba.suggest_freq((<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'中'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'将'</span>), <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">True</span>)
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">494</span>
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'如果放到post中将出错。'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
如果/放到/post/中/将/出错/。
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'「台中」正确应该不会被切开'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
「/台/中/」/正确/应该/不会/被/切开
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>jieba.suggest_freq(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'台中'</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">True</span>)
<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">69</span>
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/'</span>.join(jieba.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'「台中」正确应该不会被切开'</span>, HMM=<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">False</span>)))
「/台中/」/正确/应该/不会/被/切开</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>
jieba.analyse.extract_tags(sentence,topK,withWeight) # needs to first import jieba.analyse
sentence
: the text to be extractedtopK
: return how many keywords with the highest TF/IDF weights. The default value is 20withWeight
: whether return TF/IDF weights with the keywords. The default value is False
Example (keyword extraction)
https://github.com/fxsjy/jieba/blob/master/test/extract_tags.py
Developers can specify their own custom IDF corpus in jieba keyword extraction
Developers can specify their own custom stop words corpus in jieba keyword extraction
There’s also a TextRank implementation available.
Use: jieba.analyse.textrank(raw_text)
.
4) : Part of Speech Tagging
- Tags the POS of each word after segmentation, using labels compatible with ictclas.
- Example:
<code class="language-pycon hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">>>> import jieba.posseg as pseg
>>> words = pseg.cut(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我爱北京天安门"</span>)
>>> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> w <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> words:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'%s %s'</span> % (w.word, w.flag))
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
我 r
爱 v
北京 ns
天安门 ns</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>
5) : Parallel Processing
- Principle: Split target text by line, assign the lines into multiple Python processes, and then merge the results, which is considerably faster.
- Based on the multiprocessing module of Python.
-
Usage:
jieba.enable_parallel(4)
# Enable parallel processing. The parameter is the number of processes.jieba.disable_parallel()
# Disable parallel processing.
-
Example:
https://github.com/fxsjy/jieba/blob/master/test/parallel/test_file.py
-
Result: On a four-core 3.4GHz Linux machine, do accurate word segmentation on Complete Works of Jin Yong, and the speed reaches 1MB/s, which is 3.3 times faster than the single-process version.
6) : Tokenize: return words with position
- The input must be unicode
- Default mode
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">result = jieba.tokenize(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">u'永和服装饰品有限公司'</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> tk <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> result:
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"word %s\t\t start: %d \t\t end:%d"</span> % (tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 永和 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">2</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 服装 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">4</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 饰品 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">6</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 有限公司 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">10</span></span>
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
<code class="language-python hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">result = jieba.tokenize(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">u'永和服装饰品有限公司'</span>,mode=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'search'</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> tk <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> result:
print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"word %s\t\t start: %d \t\t end:%d"</span> % (tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],tk[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]))</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 永和 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">2</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 服装 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">4</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 饰品 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">6</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 有限 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">8</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 公司 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">10</span></span>
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">word</span> 有限公司 start: <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">end</span>:<span class="hljs-title" style="box-sizing: border-box;">10</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
7) : ChineseAnalyzer for Whoosh
8) : Command Line Interface
$> python -m jieba --help
usage: python -m jieba [options] filename
Jieba command line interface.
positional arguments:
filename input file
optional arguments:
-h, --help show this help message and exit
-d [DELIM], --delimiter [DELIM]
use DELIM instead of ' / ' for word delimiter; or a
space if it is used without DELIM
-D DICT, --dict DICT use DICT as dictionary
-u USER_DICT, --user-dict USER_DICT
use USER_DICT together with the default dictionary or
DICT (if specified)
-a, --cut-all full pattern cutting
-n, --no-hmm don't use the Hidden Markov Model
-q, --quiet don't print loading messages to stderr
-V, --version show program's version number and exit
If no filename specified, use STDIN instead.
Initialization
By default, Jieba don’t build the prefix dictionary unless it’s necessary. This takes 1-3 seconds, after which it is not initialized again. If you want to initialize Jieba manually, you can call:
import jieba
jieba.initialize() # (optional)
You can also specify the dictionary (not supported before version 0.28) :
jieba.set_dictionary('data/dict.txt.big')
Using Other Dictionaries
It is possible to use your own dictionary with Jieba, and there are also two dictionaries ready for download:
-
A smaller dictionary for a smaller memory footprint:
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.small
-
There is also a bigger dictionary that has better support for traditional Chinese (繁體):
https://github.com/fxsjy/jieba/raw/master/extra_dict/dict.txt.big
By default, an in-between dictionary is used, called dict.txt
and included in the distribution.
In either case, download the file you want, and then call jieba.set_dictionary('data/dict.txt.big')
or just replace the existing dict.txt
.
Segmentation speed
- 1.5 MB / Second in Full Mode
- 400 KB / Second in Default Mode
- Test Env: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《围城》.txt