1、中文分词工具——Jieba
代码文件
import jieba # 读取输入文本 text = input() # 精确模式分词 seg_list1 = jieba.cut(text, cut_all=False) seg_list1 = list(seg_list1) # 转换为列表以便于打印 # 搜索引擎模式分词 seg_list2 = jieba.cut_for_search(text) seg_list2 = list(seg_list2) # 转换为列表以便于打印 # 打印分词结果 print("精确模式:" + '/'.join(seg_list1) + " 搜索引擎模式:" + ' /'.join(seg_list2))
题目描述
任务描述
本关任务:根据本关所学有关使用 Jieba 库进行分词的知识,完成使用 Jieba 模块进行分词的程序编写并通过所有测试用例。
相关知识
为了完成本关任务,你需要掌握:
-
Jieba 模块的使用;
-
Jieba 的各种分词模式。
Jieba 简介
1、Jieba 的特点
分词是自然语言处理中最基础的一个步骤。而 Jieba 分词是目前中文分词中一个比较好的工具。它包含有以下特性:
-
社区活跃。Jieba 在 Github 上已经有 17670 的 star 数目。社区活跃度高,代表着该项目会持续更新,实际生产实践中遇到的问题能够在社区反馈并得到解决,适合长期使用;
-
功能丰富。Jieba 其实并不是只有分词这一个功能,其是一个开源框架,提供了很多在分词之上的算法,如关键词提取、词性标注等;
-
提供多种编程语言实现。 Jieba 官方提供了 Python、C++、Go、R、iOS 等多平台多语言支持,不仅如此,还提供了很多热门社区项目的扩展插件,如 ElasticSearch、solr、lucene 等。在实际项目中,进行扩展十分容易;
-
使用简单。Jieba 的 API 总体来说并不多,且需要进行的配置并不复杂,方便上手。
2、Jieba 分词的原理
Jieba 分词依靠中文词库,结合了基于规则和基于统计这两类方法。首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀包含的顺序排列。如果将词看作节点,词和词之间的分词符看作边,那么一种分词方案则对应着从第一个字到最后一个字的一条分词路径。
因此,基于前缀词典可以快速构建包含全部可能分词结果的有向无环图,这个图中包含多条分词路径,有向是指全部的路径都始于第一个字、止于最后一个字,无环是指节点之间不构成闭环。基于标注语料,使用动态规划的方法可以找出最大概率路径,并将其作为最终的分词结果。
3、Jieba 分词的三种模式
-
精确模式:试图将句子最精确地切开,适合文本分析;
-
全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
-
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
使用 Jieba 库进行分词
可使用jieba.cut(sentence, cut_all, HMM)和jieba.cut_for_search(sentence, HMM)方法进行分词,两者所返回的结构都是一个可迭代的 generator ,可使用 for 循环来获得分词后得到的每一个词语( Unicode ),或者直接使用jieba.lcut(s,cut_all,HMM)以及jieba.lcut_for_search(sentence, HMM)直接返回 list 。其中:
-
jieba.cut(sentence, cut_all, HMM) 和 jieba.lcut(s,cut_all,HMM) 接受 3 个参数:
- 需要分词的字符串( unicode 或 UTF-8 字符串、GBK 字符串);
- cut_all 参数:是否使用全模式,默认值为 False;
- HMM 参数:用来控制是否使用 HMM 模型,默认值为 True。
-
jieba.cut_for_search(sentence, HMM) 和 jieba.lcut_for_search(sentence, HMM)接受2个参数:
- 需要分词的字符串( unicode 或 UTF-8字符串、 GBK 字符串)
- HMM 参数:用来控制是否使用 HMM 模型,默认值为 True
代码示例:
- 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))
对应的输出为:
- Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
- Default Mode: 我/ 来到/ 北京/ 清华大学
- 他, 来到, 了, 网易, 杭研, 大厦
- 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
编程要求
在右侧编辑器中的 Begin-End 之间补充 Python 代码,实现精确匹配模式分词和搜索引擎模型分词,完成对所输入的文本进行分词,并输出分词结果,其中文本内容通过 input 从后台获取。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
测试输入:
- 我来自北京清华大学
预期输出:
- Building prefix dict from the default dictionary ...
- Dumping model to file cache /tmp/jieba.cache
- Loading model cost 1.252 seconds.
- Prefix dict has been built successfully. # Jieba接口的附加信息,说明分词过程的结果
- 精确模式:我/来自/北京/清华大学 搜索引擎模式:我 /来自 /北京 /清华 /华大 /大学 /清华大学
开始你的任务吧,祝你成功!
2、基于 Jieba 的词频统计
代码文件
import jieba text = input() words = jieba.lcut(text) data = {} # 词典 # 完成基于 Jieba 模块的词频统计 for word in words: if len(word)
题目描述
任务描述
本关任务:根据本关所学有关基于 Jieba 模块进行词频统计的基础知识,完成词频统计程序的编写并通过所有测试用例。
相关知识
为了完成本关任务,你需要掌握:
-
Jieba 的使用;
-
词频统计的方法。
词频统计
在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的次数。一个词语出现的次数越多,越表明是该文件的核心词汇,该词语对于快速理解文章具有重要的意义。词频统计是自然语言处理技术中最基础的技术之一,在词频统计中,如何区分词是很关键的一环,本实训我们将主要介绍如何通过 Jieba 的使用来更好地进行词频统计。
基于 Jieba 的词频统计
1、分词器 在前面的学习,我们已经介绍过在 Jieba 模块中支持三种分词模式,它们分别为:
-
精确模式:试图将句子最精确地切开,适合文本分析;
-
全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
-
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
在进行词频统计之间,我们可以通过 Jieba 模块对文本进行分词,将一个句子中的各个词语分开,从而便于我们对词语进行统计。
- import jieba
- text = input()
- words1 = jieba.cut(text, cut_all=True) # 全模式分词
- words2 = jieba.cut(text, cut_all=False) # 精确模式分词
- words3 = jieba.lcut_for_search(text) # 搜索引擎模式分词
2、分词后的统计 在拿到 Jieba 分词后的数据后就要对数据进行统计,所谓统计就是看一个词在这篇文章中出现了多少次。我们可以通过使用字典的键来存储出现的词,值存储词出现的次数来实现。
- data = {} # 字典
- for chara in words:
- if len(chara)
- continue
- if chara in data:
- data[chara] += 1 # 再次出现则加 1
- else:
- data[chara] = 1 # 首次出现则为 1
编程要求
根据提示,在右侧编辑器中的 Begin-End 之间补充 Python 代码,实现基于 Jieba 的词频统计,完成对 text 文本的词频统计并输出词频前三的词频统计结果。其中 text 文本通过 input 从后台获取。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 测试输入:
- 很长时间不吃水果,到时又年纪比较小,如果说很长时间不吃水果的话,可能对我的身体健康造成,比较大的一个影响,老师每人发了一个苹果给我们,然后我们每个人吃了一个苹果,当时学校里发的那个苹果,还吃起来还是比较甜的,会说我当时吃起来特别好吃
预期输出:
- [('比较', 3), ('一个', 3), ('苹果', 3)]
开始你的任务吧,祝你成功!
-
-