【NLP】之 结巴分词

1.结巴分词简介

结巴分词是当前效果较好的一种中文分词器,支持中文简体、中文繁体分词,同时还支持自定义词库。

结巴分词支持三种分词模式:精确模式、全模式和搜索引擎模式。

  • 精确模式是试图将句子最精确的进行切分,适合用于文本分析;
  • 全模式的原理是把句子中全部可以成词的词语全部扫描出来,它的分词速度快,缺点是无法识别歧义词句;
  • 搜索引擎模式是在精确模式的基础上进一步处理的,它对较长的词语再进行分割,将召回率提高,适合于搜索引擎分词。

结巴分词自带一个词典,内含20000多条词,及词条出现的次数与词性。结巴分词用到的算法有基于Trie树的词图遍历,会生成一个DAG图,该图是由句子中所有汉字的所有可能组合决定,采用动态规划(DP)查找概率最大的路径,从而找出基于词频的最大切分组合,而对于结巴分词词典中未记录的词,其使用了基于汉字成词能力的HMM模型,以及Viterbi算法。

python结巴分词安装

pip install jieba

2.分词实现

结巴分词有三种模式,具体内容在上文已有介绍。本系统分词采用的是精确模式,使用的是基于Python的jieba模块来实现。

停用词(Stop Words)是指在信息检索中,在自然语言处理之前或之后被自动过滤的字或词,目的是为了节省内存空间并提高搜索效率。停用词表是人工构造的,本系统使用的是哈工大停用词表。

哈工大停用词下载链接:GitHub - goto456/stopwords: 中文常用停用词表(哈工大停用词表、百度停用词表等)

结巴分词及去停用词核心代码如下:

import jieba

#分词
def stripdata(Test):
    # jieba 默认启用了HMM(隐马尔科夫模型)进行中文分词
    seg_list = jieba.cut(Test)  # 分词

    #获取字典,去除停用词
    line = "/".join(seg_list)
    word = stripword(line)
    #print(line)
    #列出关键字
    print("\n关键字:\n"+word)

#停用词分析
def stripword(seg):
    #打开写入关键词的文件
    keyword = open('key_word.txt', 'w+', encoding='utf-8')
    print("去停用词:\n")
    wordlist = []

    #获取停用词表
    stop = open('stopword.txt', 'r+', encoding='utf-8')
    stopword = stop.read().split("\n")

    #遍历分词表
    for key in seg.split('/'):
        #print(key)
        #去除停用词,去除单字,去除重复词
        if not(key.strip() in stopword) and (len(key.strip()) > 1) and not(key.strip() in wordlist) :
            wordlist.append(key)
            print(key)
            keyword.write(key+"\n")

    #停用词去除END
    stop.close()
    keyword.close()
    return '/'.join(wordlist)

def creat():
    Rawdata = open('raw.txt','r+')
    text = Rawdata.read()
    #调用分词
    stripdata(text)
    #END
    Rawdata.close()

if __name__ == '__main__' :
    creat()

分词效果

  • 11
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
结巴分词早期版本。 * 结巴分词(java版) jieba-analysis 首先感谢jieba分词原作者[[https://github.com/fxsjy][fxsjy]],没有他的无私贡献,我们也不会结识到结巴 分词,更不会有现在的java版本。 结巴分词的原始版本为python编写,目前该项目在github上的关注量为170, 打星727次(最新的数据以原仓库为准),Fork238次,可以说已经有一定的用户群。 结巴分词(java版)只保留的原项目针对搜索引擎分词的功能(cut_for_index、cut_for_search),词性标注,关键词提取没有实现(今后如用到,可以考虑实现)。 * 简介 ** 支持分词模式 - Search模式,用于对用户查询词分词 - Index模式,用于对索引文档分词 ** 特性 - 支持多种分词模式 - 全角统一转成半角 - 用户词典功能 - conf 目录有整理的搜狗细胞词库 - 支持词性标注(感谢 [[https://github.com/linkerlin][@linkerlin]] 的贡献) * 如何获取 - 当前稳定版本 #+BEGIN_SRC xml com.huaban jieba-analysis 0.0.2 #+END_SRC - 当前快照版本 - 支持词性标注 [[https://github.com/huaban/jieba-analysis/pull/4][#4]] - 修复以'-'连接词分词错误问题 [[https://github.com/huaban/jieba-analysis/issues/3][#3]] #+BEGIN_SRC xml com.huaban jieba-analysis 1.0.0-SNAPSHOT #+END_SRC * 如何使用 - Demo #+BEGIN_SRC java @Test public void testDemo() { JiebaSegmenter segmenter = new JiebaSegmenter(); String[] sentences = new String[] {"这是一个伸手不见五指的黑夜。我叫孙悟空,我爱北京,我爱Python和C++。", "我不喜欢日本和服。", "雷猴回归人间。", "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作", "结果婚的和尚未结过婚的"}; for (String sentence : sentences) { System.out.println(segmenter.process(sentence, SegMode.INDEX).toString()); } } #+END_SRC * 算法(wiki补充...) - [ ] 基于 =trie= 树结构实现高效词图扫描 - [ ] 生成所有切词可能的有向无环图 =DAG= - [ ] 采用动态规划算法计算最佳切词组合 - [ ] 基于 =HMM= 模型,采用 =Viterbi= (维特比)算法实现未登录词识别 * 性能评估 - 测试机配置 #+BEGIN_SRC screen Processor 2 Intel(R) Pentium(R) CPU G620 @ 2.60GHz Memory:8GB 分词测试时机器开了许多应用(eclipse、emacs、chrome...),可能 会影响到测试速度 #+END_SRC - [[src/test/resources/test.txt][测试文本]] - 测试结果(单线程,对测试文本逐行分词,并循环调用上万次) #+BEGIN_SRC screen 循环调用一万次 第一次测试结果: time elapsed:12373, rate:2486.986533kb/s, words:917319.94/s 第二次测试结果: time elapsed:12284, rate:2505.005241kb/s, words:923966.10/s 第三次测试结果: time elapsed:12336, rate:2494.445880kb/s, words:920071.30/s 循环调用2万次 第一次测试结果: time elapsed:22237, rate:2767.593144kb/s, words:1020821.12/s 第二次测试结果: time elapsed:22435, rate:2743.167762kb/s, words:1011811.87/s 第三次测试结果: time elapsed:22102, rate:2784.497726kb/s, words:1027056.34/s 统计结果:词典加载时间1.8s左右,分词效率每秒2Mb多,近100万词。 2 Processor Intel(R) Core(TM) i3-2100 CPU @ 3.10GHz 12G 测试效果 time elapsed:19597, rate:3140.428063kb/s, words:1158340.52/s time elapsed:20122, rate:3058.491639kb/s, words:1128118.44/s #+END_SRC

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧心.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值