jieba分词实例

jieba社区活跃,它其实不只有分词这一个功能,其还是一个开源框架,提供了很多分词之上的算法,如关键词提取、词性标注等。

jieba分词是基于规则和统计的混合分词方法。对于未登陆词,jieba使用了基于汉字成词的HMM模型,采用viterbi算法进行推到。

一、jieba用到的算法:

jieba自带了一个叫做dict.txt的词典, 里面有2万多条词, 包含了词条出现的次数(这个次数是于作者自己基于人民日报语料等资源训练得出来的)和词性. 这个第一条的trie树结构的词图扫描, 说的就是把这2万多条词语, 放到一个trie树中, 而trie树是有名的前缀树, 也就是说一个词语的前面几个字一样, 就表示他们具有相同的前缀, 就可以使用trie树来存储, 具有查找速度快的优势。

1、基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)

1.1 根据dict.txt生成trie树。字典在生成trie树的同时, 也把每个词的出现次数转换为了频率;

1.2 对待分词句子, 根据dict.txt生成的trie树, 生成DAG, 实际上通俗的说, 就是对待分词句子, 根据给定的词典进行查词典操作, 生成几种可能的句子切分。

2、采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
3、对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法

3.1 未登录词:词典 dict.txt 中没有记录的词(注: 就算把dict.txt中所有的词汇全部删掉, jieba依然能够分词, 不过分出来的词, 大部分的长度为2.这个就是基于HMM来预测分词了)

二、分词总体思想:

输入是:整篇文档或者是多篇原始文档。
算法:通过jieba接口,可以使用精确模式(默认)、全模式、搜索引擎模式进行分词,其jieba分词的原理是基于规则和统计的混合分词,因为是接口,所以暂时先不用太究其原理。
输出:相应文档分词好的形式。此时也可以进行高频词的提取,可以自定义提取方法。也可以使用自定义的停用词词典,然后基于jieba的接口进行高频词的提取。

三、jieba的三种分词方法:
  • 精确模式:试图将句子最精确的切开,适合文本分析
  • 全模式:把句子中所有可以成词的词语扫描出来,速度非常快,但是不能解决歧义。
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
import jieba
sent='中文分词是文本处理不可或缺的一步!'
seg_list=jieba.cut(sent,cut_all=False)
print('精确模式:','/'.join(seg_list))
seg_list=jieba.cut(sent)
print('默认模式:','/'.join(seg_list))
seg_list=jieba.cut_for_search(sent)
print('搜索引擎模式:','/'.join(seg_list))
seg_list=jieba.cut(sent,cut_all=True)
print('全模式:','/'.join(seg_list))

运行结果:

精确模式: 中文/分词//文本处理/不可或缺/的/一步/!
默认模式: 中文/分词//文本处理/不可或缺/的/一步/!
搜索引擎模式: 中文/分词//文本/本处/处理/文本处理/不可/或缺/不可或缺//一步/!
全模式: 中文/分词//文本/文本处理/本处/处理/不可/不可或缺/或缺//一步//

一般使用精确模式即可,但是在某些模糊匹配场景下,使用全模式或搜索引擎模式会更好。

四、jieba高频词提取

简单说高频词提取就是自然语言处理中的TF策略,但是会有标点符号和停用词的干扰。

这里的数据是搜狗实验室的新闻数据,进行高频词的提取。

#jieba分词示例
def get_content(path):
    with open(path, 'r', encoding='gbk', errors='ignore') as f:
        content = ''
        for l in f:
            l = l.strip() # strip():只能删除开头或是结尾的字符,不能删除中间部分的字符
            content += l
        return content

def get_TF(words, topK=10):

    tf_dic = {}
    for w in words:
        tf_dic[w] = tf_dic.get(w, 0) + 1
    return sorted(tf_dic.items(), key = lambda x: x[1], reverse=True)[:topK]

def stop_words(path):
    with open(path,encoding='utf-8', errors='ignore') as f:
        return [l.strip() for l in f]


#分词
def main():
    import glob
    import random
    import jieba
    # glob得到所有的该目录下的所有文件的存储路径
    files = glob.glob(r'C:/Users/LiLong/Desktop/learning-nlp-master/chapter-3/data/news/C000013/*.txt')
    print('files:',files[:2])
    # 针对每一个文本提取其内容组成一个列表
    corpus = [get_content(x) for x in files[:5]]
    print(len(corpus))
    sample_inx = random.randint(0, len(corpus))

    split_words = [x for x in jieba.cut(corpus[sample_inx])]
    split_words2 = [x for x in jieba.cut(corpus[sample_inx]) \
                        if x not in stop_words('./stop_words.utf8')]
    print('样本分词效果:'+'/ '.join(split_words))
    print('样本的topK(10)词:'+str(get_TF(split_words)))
    print('过滤掉停用词后的top(10)词:'+str(get_TF(split_words2)))
main()

运行结果:

样本分词效果:先天性/ 心脏病/ “/ 几岁/ 可/ 根治/ ,/ 十几岁/ 变/ 难治/ ,/ 几十岁/ 成不治/ ”/ ,/ 中国/ 著名/ 心血管/ 学术/ 领袖/ 胡大一/ 今天/ 在/ 此间/ 表示/ 救治/ 心脏病/ 应从/ 儿童/ 抓起/ ,/ 他/ 呼吁/ 社会各界/ 关心/ 贫困地区/ 的/ 先天性/ 心脏病/ 儿童/ 。/ 据/ 了解/ ,/ 今年/ 五月/ 一日/ 到/ 五月/ 三日/ ,/ 胡大一/ 及其/ “/ 爱心/ 工程/ ”/ 专家组/ 将/ 联合/ 北京军区总医院/ 在/ 安徽/ 太和县/ 举办/ 第三届/ 先心病/ 义诊/ 活动/ 。/ 安徽/ 太和县/ 是/ 国家/ 重点/ 贫困县/ ,/ 同时/ 又/ 是/ 先天性/ 心脏病/ 的/ 高发区/ 。/ 由于/ 受/ 贫苦/ 地区/ 医疗/ 技术/ 条件/ 限制/ ,/ 当地/ 很多/ 孩子/ 由于/ 就医/ 太晚/ 而/ 失去/ 了/ 治疗/ 时机/ ,/ 当地/ 群众/ 也/ 因此/ 陷入/ “/ 生病/ —/ 贫困/ —/ 无力/ 医治/ —/ 病情/ 加重/ —/ 更加/ 贫困/ ”/ 的/ 恶性循环/ 中/ 。/ 胡大一/ 表示/ ,/ 由于/ 中国/ 经济/ 发展/ 的/ 不/ 平衡/ 与/ 医疗/ 水平/ 的/ 严重/ 差异化/ ,/ 目前/ 中国/ 有/ 这种/ 情况/ 的/ 绝/ 不止/ 一个/ 太和县/ 。/ 但/ 按照/ 现行/ 医疗/ 体制/ ,/ 目前/ 医院/ 、/ 医生/ 为/ 社会/ 提供/ 的/ 服务/ 模式/ 和/ 力度/ 都/ 远远/ 不能/ 适应/ 社会/ 需求/ 。/ 他/ 希望/ ,/ 发达/ 地区/ 的/ 医院/ 、/ 医生/ 能/ 积极/ 走/ 出来/ ,/ 到/ 患者/ 需要/ 的/ 地方/ 去/ 。/ 据悉/ ,/ 胡大一/ 于/ 二/ 00/ 二/ 发起/ 了/ 面向全国/ 先天性/ 心脏病/ 儿童/ 的/ “/ 胡大一/ 爱心/ 工程/ ”/ ,/ 旨在/ 呼吁/ 社会/ 对于/ 先心病/ 儿童/ 的/ 关注/ ,/ 同时/ 通过/ 组织/ 大城市/ 专家/ 走进/ 贫困地区/ 开展/ 义诊/ 活动/ ,/ 对/ 贫困地区/ 贫困家庭/ 优先/ 实施/ 免费/ 手术/ ,/ 并/ 对/ 其他/ 先心病/ 儿童/ 给予/ 适当/ 资助/ 。/  / (/ 钟啸灵/ )/ 专家/ 简介/ :/ 胡大一/ 、/ 男/ 、/ 1946/ 年/ 7/ 月/ 生于/ 河南/ 开封/ ,/ 主任医师/ 、/ 教授/ 、/ 博士生/ 导师/ ,/ 国家/ 突出贡献/ 专家/ 、/ 享受/ 政府/ 专家/ 津贴/ 。/ 现任/ 同济大学/ 医学院/ 院长/ 、/ 首都医科大学/ 心脏病学/ 系主任/ 、/ 北京大学人民医院/ 心研/ 所/ 所长/ 、/ 心内科/ 主任/ ,/ 首都医科大学/ 心血管/ 疾病/ 研究所/ 所长/ ,/ 首都医科大学/ 北京同仁医院/ 心血管/ 疾病/ 诊疗/ 中心/ 主任/ 。/ 任/ 中华医学会/ 心血管病/ 分会/ 副/ 主任委员/ 、/ 中华医学会/ 北京/ 心血管病/ 分会/ 主任委员/ 、/ 中国/ 生物医学/ 工程/ 学会/ 心脏/ 起搏/ 与/ 电/ 生理/ 分会/ 主任委员/ 、/ 中国/ 医师/ 学会/ 循证/ 医学专业/ 委员会/ 主任委员/ 、/ 北京市/ 健康/ 协会/ 理事长/ 、/ 北京/ 医师/ 协会/ 副会长/ 及/ 美国/ 心脏病/ 学院/ 会员/ 。/ (/ 来源/ :/ 北大人民医院/ 网站/ )
样本的topK(10)词:[(',', 23), ('、', 15), ('的', 11), ('。', 11), ('心脏病', 6), ('胡大一', 6), ('中国', 5), ('儿童', 5), ('先天性', 4), ('“', 4)]
过滤掉停用词后的top(10)词:[('心脏病', 6), ('胡大一', 6), ('中国', 5), ('儿童', 5), ('先天性', 4), ('专家', 4), ('主任委员', 4), ('心血管', 3), ('贫困地区', 3), ('工程', 3)]

可以看到在加入了停用词典后得到的高频词更有意义。

实际上中文分词器在分词效果上的差距并不是很大,但是在特定场景下表现差异很大,所以定义自己的领域词典就显得很重要,不断地更新维护停用词典。

其中jieba分词支持自定义词典:
通过:jieba.load_userdict('./data/user_dict.utf8')
形式如下:
大波浪 10 n
分词 5 v
金融词典 7 n
每一行三个部分分别为:词语、词频、词性。该词典文件需要为utf-8编码。
在提取高频词时,通过合适的自定义词典加载,能够获得很好的分词效果。

其中的词频和词性可以省略,但是如果省略了词性,在jieba进行词性标注时,最终的切分词的词性将变成“x”,所以最好自定义词典时词频和词性都要有。

参考:《pytho自然语言处理实战 核心技术与算法》
https://www.cnblogs.com/echo-cheng/p/7967221.html

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值