英语中分词的用法总结法

结巴中文分词的用法 - 简书
结巴中文分词的用法
“结巴”中文分词:做最好的 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 授权协议
(Powered by Appfog)
网站代码:
代码对 Python 2/3 均兼容
全自动安装:easy_install jieba 或者pip install jieba / pip3 install jieba
半自动安装:先下载
,解压后运行 python setup.py install
手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
通过 import jieba 来引用
基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
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),或者用
jieba.lcut 以及jieba.lcut_for_search 直接返回 list
jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
# encoding=utf-8
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))
# 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦")
# 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")
# 搜索引擎模式
print(", ".join(seg_list))
【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
【精确模式】: 我/ 来到/ 北京/ 清华大学
【新词识别】:他, 来到, 了, 网易, 杭研, 大厦
(此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)
【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
2. 添加自定义词典
开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算的能保证分出该词的词频。
创新办 3 i
更改分词器(默认为jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。
自定义词典:
用法示例:
之前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
使用 add_word(word, freq=None, tag=None)和 del_word(word) 可在程序中动态修改词典。
使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
代码示例:
&&& print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
&&& jieba.suggest_freq(('中', '将'), True)
&&& print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。
&&& print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
&&& jieba.suggest_freq('台中', True)
&&& print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开
"通过用户自定义词典来增强歧义纠错能力" ---
3. 关键词提取
基于 TF-IDF 算法的关键词抽取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选
jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
代码示例 (关键词提取)
关键词提取所使用逆向文件频率(IDF)文本语料库可以切换成自定义语料库的路径
用法: jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
自定义语料库示例:
用法示例:
关键词提取所使用停止词(Stop Words)文本语料库可以切换成自定义语料库的路径
用法: jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
自定义语料库示例:
用法示例:
关键词一并返回关键词权重值示例
用法示例:
基于 TextRank 算法的关键词抽取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')) 直接使用,接口相同,注意默认过滤词性。
jieba.analyse.TextRank() 新建自定义 TextRank 实例
算法论文:
将待抽取关键词的文本进行分词
以固定窗口大小(默认为5,通过span属性调整),词之间的共现关系,构建图
计算图中节点的PageRank,注意是无向带权图
4. 词性标注
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer参数可指定内部使用的jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
&&& import jieba.posseg as pseg
&&& words = pseg.cut("我爱北京天安门")
&&& for word, flag in words:
print('%s %s' % (word, flag))
5. 并行分词
原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升
基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
jieba.enable_parallel(4)# 开启并行分词模式,参数为并行进程数
jieba.disable_parallel() # 关闭并行分词模式
实验结果:在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。
注意:并行分词仅支持默认分词器 jieba.dt 和jieba.posseg.dt。
6. Tokenize:返回词语在原文的起止位置
注意,输入参数只接受 unicode
result = jieba.tokenize(u'永和服装饰品有限公司')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 有限公司
result = jieba.tokenize(u'永和服装饰品有限公司', mode='search')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 有限公司
7. ChineseAnalyzer for Whoosh 搜索引擎
引用: from jieba.analyse import ChineseAnalyzer
8. 命令行分词
使用示例:python -m jieba news.txt & cut_result.txt
命令行选项(翻译):
使用: python -m jieba [options] filename
结巴命令行界面。
-h, --help
显示此帮助信息并退出
-d [DELIM], --delimiter [DELIM]
使用 DELIM 分隔词语,而不是用默认的' / '。
若不指定 DELIM,则使用一个空格分隔。
-p [DELIM], --pos [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
Jieba command line interface.
positional arguments:
input file
optional arguments:
-h, --help
show this help message and exit
-d [DELIM], --delimiter [DELIM]
use DELIM instead of ' / ' or a
space if it is used without DELIM
-p [DELIM], --pos [DELIM]
enable POS if DELIM is specified, use DELIM
instead of '_' for POS delimiter
-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 (ignored with POS tagging)
-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.```
延迟加载机制
jieba 采用延迟加载,import jieba 和 jieba.Tokenizer()不会立即触发词典的加载,一旦有必要才开始加载词典构建前缀字典。如果你想手工初始 jieba,也可以手动初始化。
import jieba
jieba.initialize()
# 手动初始化(可选)```
在 0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:
```jieba.set_dictionary('data/dict.txt.big')```
例子: /fxsjy/jieba/blob/master/test/test_change_dictpath.py
-----------------
1. 占用内存较小的词典文件 /fxsjy/jieba/raw/master/extra_dict/dict.txt.small
2. 支持繁体分词更好的词典文件 /fxsjy/jieba/raw/master/extra_dict/dict.txt.big
下载你所需要的词典,然后覆盖' jieba/dict.txt '即可;或者用 'jieba.set_dictionary('data/dict.txt.big')'
##1. 模型的数据是如何生成的?
详见: /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)`
**更多问题请点击**:/fxsjy/jieba/issues?sort=updated&state=closed
感谢以下的项目,排名不分先后
* [结巴中文分词 ](/fxsjy/jieba)
你不努力没人给你想要的生活.
【转】Android 开源项目分类汇总 旭川君已关注
16:49*字数 29527阅读 1795评论 1喜欢 35 来源:/Trinea/android-open-project 更多:Android 开源库获取途径...
Android 开源项目分类汇总,更全更新可见目前包括: Android 开源项目第一篇——个性化控件(View)篇 包括ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、Progr...
太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫的界面特效设计、个性化控件、工具库、优秀的Android开...
# Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。[awesome-python](/vinta/awesome-python) 是 vinta 发起维护的 Py...
原文: /ecomfe/spec/blob/master/javascript-style-guide.md注:部分规范有删改[ ](/duowan/fe-guide/blob/master/javas...
先解释一下,为什么叫读。孟非,这个名字开始我并不知道,后来从小伙伴那里借了本随遇而安才知道所谓的孟非这个名字,再后来看了孟非主持的《非诚勿扰》才认识他,但总感觉他也就是个损人不带脏字的金牌主持而已,并没有多大的兴趣去品读他和他所谓的人生。然而不知过了多久,从电视上看了他的一...
请问一个人可不可以胜任任何的工作?Q:绝对不可能 A:那么是不是只能选择他能做的?Q:对啊,这是他的优势。 其实发现你的优势是一本畅销书的书名。 而我发现那些生活中自负的人或者根本不关心自我提升的人,对于提升自己这件事儿是根本不关心的。前者有足够的自信——觉得他可以...
晨 清风 拂面送 一抹舒爽 天凉好个秋 带着体贴的轻暖 历一月三次台风洗礼 无意招惹了秋的清新酣畅 风姑娘穿过窄窄窗缝 呼唤肌肤的活力 心上挂满愁 醒来醒来 好个秋 什么 愁
如果一个月收入能达到一万多工作还特轻松……你愿意挑战吗?只要你肯做就一定没问题。工资不但日结而且起步的高低取还决于你的气质。只要你够年轻,够漂亮身高也够就ok啦!想做就联系我喽! v beijingpangyang
限制只能输入数字并且限制输入位数.要先实现限制自能输入0-9 的数字的方法. 如果只在textfiled设置弹出键盘是数字键盘的话第三方输入法还是能输入数字之外的字符 实现限制只能输入数字的方法 实现UITextFile的delegate方法,调用只能输入数字的方法.并限制...英语学霸养成记之分词特殊用法解析
英语学霸养成记之分词特殊用法解析
在语言实践中,我们还会遇到许多关于分词使用的具体疑难问题。以下选用具体试题为例,集中讨论一些常见的语言现象。1.现在分词被动式同过去分词的区别现在分词同过去分词的基本区别可见下表。但现在分词被动式being done也表示被动,在语态概念上与过去分词相同,因此区别就只在于时间概念了。Most of the people ______ to the party were famous scientists.A. invited B. to invitedC. being invited D. inviting试题分析:试题意图是考察分词作定语的知识,句子主语的汉语意思为“受到邀请出席晚会的大多数人”。选项 A、C均表示被动,区别在于invited表示“已经受到邀请出席晚会”;being invited表示“正在受到邀请出席晚会”。句子是一般过去时,因此答案为A。2.分词作定语同不定式作定语的区别不定式作定语在时间概念上表示“将要”,这是他们之间最根本的区别。The first textbooks ______ for teaching English as a foreign language came out in the 16th century.A. having written B. to be writtenC. being written D. written试题分析:选项A为现在分词完成式,同其所修饰的主语textbooks具有逻辑上的动宾关系,没有被动形式,不可能考虑;选项B为不定式的被动式,在时间概念上表示将来,与句子的时态不符,必须排除;选项C为现在分词被动式,在时间概念上表示“进行“,不能满足试题要求;选项D written既表示被动又表示完成,切合试题要求,是正确答案。3. 介词with后的宾语补足语介词with具有一般介词都不具备的语法功能,with后面可以带“宾语+宾语补足语”的结构。In parts of Asia you must not sit with your feet pointing at another person.介词后的宾语补足语同动词后的宾语补足语没有区别,在试题中只要善于识别便不难理解。The murderer was brought in, with his hands ______ behind his back.A. being tied B. having tiedC. to be tied D. tied答案为D。下面一道试题具有一定难度。With his son ______, the old man felt unhappy.A. to disappoint B. to be disappointedC. disappointing D. being disappointed试题分析:宾语补足语如果选用被动式,意思为“他的儿子自己感到失望”;如果选择现在分词,意思为“他的儿子令别人感到失望”。正确答案为C。4. 分词作状语时的逻辑主语问题分词作状语时,其逻辑主语必须同句子的主语一致;如果不一致,需在分词前加一个逻辑主语,分词和它的逻辑主语合称独立主格结构。关于分词作状语时的逻辑主语问题,在试题中可以看到各种不同的命题技巧。The key______,she went through her handbag carefully.A. hadn’t been found B. having not been foundC. not having been found D. wasn’t found试题分析:选项A、D均为谓语形式,选择其中的任何一项前半部分便成为一个分句,与后面的分句必须使用连词。以表示前后分句的逻辑关系,因此全部排除。选项B是现在分词的完成被动式,凡非谓语动词的否定形式,not必须加在最前面,因此也应排除。not having been found同其逻辑主语the key构成独立主格结构,作原因状语。本试题中句子的主语 she不能充当分词的逻辑主语。______ you should have no trouble with the difficult work.A. Knowing this B. If you are knowing thisC. From knowing this D. If you have knowing this试题分析:分词作状语时一般都可以转换为状语从句。本试题的选项B、D作为条件状语从句,时态不正确,应该排除。选项A的knowing this 的逻辑主语同句子的主语一致,符合要求,为正确答案。Written in a hurry, ______. How can it be satisfactory?A. they found many mistakes in the reportB. Sam made lots of mistakes in the reportC. There are plenty of mistakes in the reportD. The report is full of mistakes试题分析:这时一道非常典型的试题。四个选项均为完整的句子,初看起来似乎不容易领悟试题的意图。其实,本题的意图仍然是考察分词作状语的知识。抓住试题意图就容易产生正确的思路——哪个句子的主语能够同过去分词written的逻辑主语一致。沿着这个思路向前走,不难想到the report was written in a hurry, 试题的答案不言自明。5. 现在分词作宾语补足语时同不定式作宾语补足语的区别动词see, hear, feel, watch, notice, observe等可以用不带to 的不定式作宾语补足语,也可以用现在分词作宾语补足语,但意思有区别。不定式作宾语补足语表示动作的全过程已经完成;现在分词作宾语补足语表示动作在谓语动作发生的瞬间正在进行。The missing boys were last seen ______ near the river.A. playing B. to be playingC. play D. to play试题分析:本试题意在考察分词作宾语补足语的知识,试题使用被动语态使我们不容易意识到试题的意图。“这些丢失的孩子们最后被看到的瞬间正在河边玩”,句子的意思决定了只能选择playing作宾语补足语。如果选择play,则表示动作业已完成,与试题的意思不符。更多英语学习,硕士考研和出国留学信息,请登陆了解详细信息。瀚森教育专注英语教学,为您提供最新最全的英语学习信息。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 大学生世界,以新奇话题,勾引你的荡气回忆
作者最新文章结巴分词是国内程序员用Python开发的一个中文分词模块,可能是最好的Python中文分词组件?
中文分词的原理
1、中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程
2、现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法
基于字符串匹配的分词方法:这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)
1)正向最大匹配法(由左到右的方向)
2)逆向最大匹配法(由右到左的方向):
3)最少切分(使每一句中切出的词数最小)
4)双向最大匹配法(进行由左到右、由右到左两次扫描)
基于理解的分词方法:这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
基于统计的分词方法:给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。例如最大概率分词方法和最大熵分词方法等。随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词方法渐渐成为了主流方法。
主要统计模型:N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),条件随机场模型(Conditional Random Fields,CRF)等。
支持三种分词模式
1 精确模式,试图将句子最精确地切开,适合文本分析;
2 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
3 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
支持繁体分词
支持自定义词典
基本用法示例
import jieba
import jieba.posseg as pseg
import jieba.analyse
str1 = "我来到北京清华大学"
str2 = 'python的正则表达式是好用的'
str3 = "小明硕士毕业于中国科学院计算所,后在日本京都大学深造"
seg_list = jieba.cut(str1,cut_all = True)
result = pseg.cut(str1)
result2 = jieba.cut(str2)
jieba.analyse.extract_tags(str1,2)
result4 = jieba.cut_for_search(str3)
print " /".join(seg_list)
&&&我 /来到 /北京 /清华 /清华大学 /华大 /大学
print w.word, "/", w.flag, ", ",
&&&我 / r ,
来到 / v ,
北京 / ns ,
清华大学 / nt ,
for t in result2:
&&&python 的 正则表达式 是 好 用 的
for s in result3:
&&&清华大学
print " ,".join(result4)
&&&小明 ,硕士 ,毕业 ,于 ,中国 ,科学 ,学院 ,科学院 ,中国科学院 ,计算 ,计算所 ,, ,后 ,在 ,日本 ,京都 ,大学 ,日本京都大学 ,深造
2、返回词所在位置
import jieba
test_sent = u"永和服装饰品有限公司"
result = jieba.tokenize(test_sent)
for tk in result:
print "word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2])
&word 永和
(u'\u6c38\u548c', 0, 2)
(u'\u670d\u88c5', 2, 4)
(u'\u', 4, 6)
word 有限公司
(u'\u\u516c\u53f8', 6, 10)
3、自定义词典
import sys
import jieba
jieba.load_userdict('userdict.txt')
test_sent = "大连美容美发学校中君意是你值得信赖的选择"
test_sent2 = '江州市长江大桥参加了长江大桥的通车仪式'
print ", ".join(jieba.cut(test_sent))
&&&大连, 美容美发, 学校, 中, 君意, 是, 你, 值得, 信赖, 的, 选择
print ", ".join(jieba.cut(test_sent2))
&&&江州, 市长, 江大桥, 参加, 了, 长江大桥, 的, 通车, 仪式
自定义词典的格式:一个词占一行;每一行分三部分,一部分为词语,另一部分为词频,最后为词性(可省略),用空格隔开
其中user_dict.txt的内容是:
李小福 2 nr
创新办 3 i
easy_install 3 eng
韩玉赏鉴 3 nz
八一双鹿 3 nz
Edu Trust认证 2000
江大桥 20000
jieba分词的基本原理
第一条:基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
这个看上面的trie树的python实现, 结巴分词自带了一个叫做dict.txt的词典, 里面有2万多条词, 包含了词条出现的次数(这个次数是于作者自己基于人民日报语料等资源训练得出来的)和词性. 这个第一条的trie树结构的词图扫描, 说的就是把这2万多条词语, 放到一个trie树中, 而trie树是有名的前缀树, 也就是说一个词语的前面几个字一样, 就表示他们具有相同的前缀, 就可以使用trie树来存储, 具有查找速度快的优势.
聪明的人可能会想到把 dict.txt中所有的词汇全部删掉, 然后再试试结巴能不能分词, 结果会发现, 结巴依然能够分词, 不过分出来的词, 大部分的长度为2.这个就是第三条, 基于HMM来预测分词了.
接着说DAG有向无环图, 就是后一句的 生成句子中汉字所有可能成词情况所构成的有向无环图, 这个是说的, 给定一个句子, 要你分词, 也就是给定一个 待分词的句子, 对这个句子进行生成有向无环图. 如果对有向无环图理解不了可以百度或者google搜索, 也可以看这篇
比较形象的用图来表示了一个待分词句子的切分情况.
作者是怎么切分的呢? 1. 根据dict.txt生成trie树, 2, 对待分词句子, 根据dict.txt生成的trie树, 生成DAG, 实际上通俗的说, 就是对待分词句子, 根据给定的词典进行查词典操作, 生成几种可能的句子切分. dag是啥玩意?记录了啥呢? 作者的源码中记录的是句子中某个词的开始位置, 从0到n-1(n为句子的长度), 每个开始位置作为字典的键, value是个list, 其中保存了可能的词语的结束位置(通过查字典得到词, 开始位置+词语的长度得到结束位置)
例如:{0:[1,2,3]} 这样一个简单的DAG, 就是表示0位置开始, 在1,2,3位置都是词, 就是说0~1, 0~2,0~3这三个起始位置之间的字符, 在dict.txt中是词语.
第二条:采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
关于动态规划查找最大概率路径, 这个在一些大学课程中讲的很多了, 不熟悉的或者忘记了的翻翻百度就行了. 上面给的那个在线书籍的链接中也说的很明白了, 我这里就说说作者的代码:
作者的代码中讲字典在生成trie树的同时, 也把每个词的出现次数转换为了频率. 关于频率和概率, 这里在啰嗦几句: 按照定义, 频率其实也是一个0~1之间的小数, 是 事件出现的次数/实验中的总次数, 因此在试验次数足够大的情况下, 频率约等于概率, 或者说频率的极限就是概率. 不过通常人们混淆的是频率和次数, 经常把频率等同于事件出现的次数, 比如这里就是某个词语出现的次数, 所以, 频率在引起混淆的时候, 对中国人来说, 还是先理解为出现次数, 然后理解发现有问题, 就理解为出现次数/总数这个比率吧.
动态规划中, 先查找待分词句子中已经切分好的词语, 对该词语查找该词语出现的频率(次数/总数), 如果没有该词(既然是基于词典查找, 应该是有的), 就把词典中出现频率最小的那个词语的频率作为该词的频率, 也就是说P(某词语)=FREQ.get(‘某词语’,min_freq), 然后根据动态规划查找最大概率路径的方法, 对句子从右往左反向计算最大概率(一些教科书上可能是从左往右, 这里反向是因为汉语句子的重心经常落在后面, 就是落在右边, 因为通常情况下形容词太多, 后面的才是主干, 因此, 从右往左计算, 正确率要高于从左往右计算, 这个类似于逆向最大匹配), P(NodeN)=1.0, P(NodeN-1)=P(NodeN)*Max(P(倒数第一个词))…依次类推, 最后得到最大概率路径, 得到最大概率的切分组合.
第三条, 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法
未登录词, 作者说的是什么意思? 其实就是词典 dict.txt 中没有记录的词. 上面说了, 把dict.txt中的所有词语都删除了, 结巴分词一样可以分词, 就是说的这个.
怎么做到的? 这个就基于作者采用的HMM模型了, 中文词汇按照BEMS四个状态来标记, B是开始begin位置, E是end, 是结束位置, M是middle, 是中间位置, S是singgle, 单独成词的位置, 没有前, 也没有后. 也就是说, 他采用了状态为(B,E,M,S)这四种状态来标记中文词语, 比如北京可以标注为 BE, 即 北/B 京/E, 表示北是开始位置, 京是结束位置, 中华民族可以标注为BMME, 就是开始, 中间, 中间, 结束.
经过作者对大量语料的训练, 得到了finalseg目录下的三个文件(来自结巴项目的issues):
要统计的主要有三个概率表:
prob_trans.py
1)位置转换概率,即B(开头),M(中间),E(结尾),S(独立成词)四种状态的转移概率;
{‘B’: {‘E’: 0.1658, ‘M’: 0.83422},
‘E’: {‘B’: 0.4425, ‘S’: 0.55755},
‘M’: {‘E’: 0.6911, ‘M’: 0.3088},
‘S’: {‘B’: 0.94563, ‘S’: 0.0544}}
P(E|B) = 0.851, P(M|B) = 0.149,说明当我们处于一个词的开头时,下一个字是结尾的概率
要远高于下一个字是中间字的概率,符合我们的直觉,因为二个字的词比多个字的词更常见。
prob_emit.py
2)位置到单字的发射概率,比如P(“和”|M)表示一个词的中间出现”和”这个字的概率;
prob_start.py
3) 词语以某种状态开头的概率,其实只有两种,要么是B,要么是S。这个就是起始向量, 就是HMM系统的最初模型状态
实际上, BEMS之间的转换有点类似于2元模型, 就是2个词之间的转移
二元模型考虑一个单词后出现另外一个单词的概率,是N元模型中的一种。
例如:一般来说,”中国”之后出现”北京”的概率大于”中国”之后出现”北海”的概率,也就是:中国北京 比 中国北海出现的概率大些, 更有可能是一个中文词语.
不过, 作者这里应该不是用的2元分词模型的, 这里的BEMS只提供了单个汉字之间的转换, 发射概率, 并没有提供粒度更大的, 基于词语的发射和转移概率, 当然, 也有可能我理解的不够深入.
给定一个 待分词的句子, 就是观察序列, 对HMM(BEMS)四种状态的模型来说, 就是为了找到一个最佳的BEMS序列, 这个就需要使用viterbi算法来得到这个最佳的隐藏状态序列, 具体的python版的viterbi算法请看维基百科: 维特比算法
通过作者之前训练得到的概率表和viterbi算法, 就可以得到一个概率最大的BEMS序列, 按照B打头, E结尾的方式, 对待分词的句子重新组合, 就得到了分词结果. 比如 对待分词的句子 ‘全世界都在学中国话’ 得到一个BEMS序列 [S,B,E,S,S,S,B,E,S] 这个序列只是举例, 不一定正确, 通过把连续的BE凑合到一起得到一个词, 单独的S放单, 就得到一个分词结果了: 上面的BE位置和句子中单个汉字的位置一一对应, 得到全/S 世界/BE 都/S 在/S 学/S 中国/BE 话/S 从而将句子切分为词语.
以上, 就是作者这三条介绍的全部理解和分析, 对于其中任何术语不理解, 请使用搜索引擎.
结巴分词的过程:
加载字典, 生成trie树
给定待分词的句子, 使用正则获取连续的 中文字符和英文字符, 切分成 短语列表, 对每个短语使用DAG(查字典)和动态规划, 得到最大概率路径, 对DAG中那些没有在字典中查到的字, 组合成一个新的片段短语, 使用HMM模型进行分词, 也就是作者说的识别新词, 即识别字典外的新词.
使用python的yield 语法生成一个词语生成器, 逐词语返回. 当然, 我认为直接返回list, 效果也差不到哪里去.
本文已收录于以下专栏:
相关文章推荐
源码下载的地址:/fxsjy/jieba
演示地址:http://jiebademo.ap01.aws.af.cm/
1,支持三种分词模式:...
这篇文章主要是爬取百度5A景区摘要信息,再利用Jieba分词工具进行中文分词,最后提出文本聚类算法的一些概念知识。一. Selenium爬取百度百科摘要 二. Jieba中文分词 1.安装及入门介绍 ...
“结巴”中文分词:做最好的 Python 中文分词组件
&Jieba& (Chinese for &to stutter&) Chinese text segmentation: bu...
原文  /blog/147
源码下载的地址:/fxsjy/jieba
演示地址:http://jiebade...
前面两篇文章说到了根据语料库和频度打分机制生成一个初步的分词结果。但是我们的分词结果仅仅用到了语料库已有的词语和频度,还没有用上词性,所以对于语料库中没有出现的词语判断能力等于0,比如下面这句:
'乔...
结巴分词是国内程序员用python开发的一个中文分词模块, 源码已托管在github, 地址在: /fxsjy/jieba
作者的文档写的不是很全, 只写了怎么用...
jieba分词算法总结特点:
支持三种分词模式
–精确模式,试图将句子最精确地切开,适合文本分析;
–全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但不能解决歧义;
–搜索引擎模式...
转载自/articles/QV36ru
1,支持三种分词模式:
    a,精确模式,试图将句子最精确地切开,适合文本分析;
    b...
整体介绍jieba 基于Python的中文分词工具,安装使用非常方便,直接pip即可,2/3都可以,功能强悍,博主十分推荐
github:/fxsjy/jieba...
中文分词工具:结巴分词
github地址:/fxsjy/jieba一、分词功能
精确模式(默认):试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可...
他的最新文章
讲师:董晓杰
讲师:张冬洪
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 什么时候用过去分词 的文章

 

随机推荐