jieba库分词的三种模式:
1、精准模式:把文本精准地分开,不存在冗余
2、全模式:把文中所有可能的词语都扫描出来,存在冗余
3、搜索引擎模式:在精准模式的基础上,再次对长词进行切分
我来到北京清华大学
【精确模式】: 我/ 来到/ 北京/ 清华/ 大学
我来到北京清华大学
【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
他来到了网易杭研大厦
【新词识别】:他, 来到, 了, 网易, 杭研, 大厦 (此处,“杭研”并没有在词典中,但是也被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 为默认分词器,所有全局分词相关函数都是该分词器的映射。
添加自定义词典
- 开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
- 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
- 词典格式和 dict.txt一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
- 词频省略时使用自动计算的能保证分出该词的词频。
例如:
创新办 3 i
云计算 5
凱特琳 nz
台中
加载自定义词库前:李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /
加载自定义词库后:李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /
案例 三国小说人物出场词频统计
import jieba
def parse():
excludes = {"将军", "却说", "丞相", "二人", "不可", "荆州", "不能", "如此", "商议",
"如何", "主公", "军士", "军马", "左右", "次日", "引兵", "大喜", "天下",
"东吴", "于是", "今日", "不敢", "魏兵", "陛下", "都督", "人马", "不知",
'玄德曰', '孔明曰', '刘备', '关羽', '云长'}
with open('threekingdom.txt','r',encoding='utf-8') as f:
txt= f.read()
# print(txt)
words=jieba.lcut(txt)
counts={} #字典存所有词及其出现次数
for word in words:
if len(word) ==1: #排除字长为1的单字
continue
else:
counts[word]=counts.get(word,0)+1
# print(counts)
# print(type(counts))
#排除相同意义的词
counts["玄德"] = counts.get("玄德", 0) + counts.get("刘备", 0)
counts["关公"] = counts.get("关羽", 0) + counts.get("关公", 0)+ counts.get("云长", 0)
for word in counts:
counts[word]=counts.get(word,0)+counts.get(word+"曰",0)
for word in excludes:
del counts[word]
items =list(counts.items())
#print("排序前:",items)
items.sort(key=lambda x:x[1],reverse=True)
#print("排序后:",items)
#将出现频率前十的人物名输出
for i in range(10):
print(items[i])
parse()
"""
('孔明', 1204)
('玄德', 1159)
('曹操', 910)
('关公', 758)
('张飞', 340)
('孙权', 259)
('吕布', 258)
('赵云', 254)
('司马懿', 221)
('周瑜', 216)
"""