美文网首页
Jieba&IK Analyzer——分词工具的比较与使用

Jieba&IK Analyzer——分词工具的比较与使用

作者: sirenyunpan | 来源:发表于2018-05-27 22:54 被阅读0次

    现有的分词工具包概览

    现有的分词工具包种类繁多,我选取了几个比较常见的开源中文分词工具包进行了简单的调查。有感兴趣的同学可以通过下表中的Giuthub链接进行详细地了解。


    常见开源的中文分词工具

    接下来,我具体介绍Jieba和IK Analyzer的使用。

    一、jieba的分词使用

    1、安装jieba


    安装jieba

    2、三种分词模式及比较
    编写代码对 “古蜀青铜艺术与蜀绣非遗技艺结合创新的探讨——现代首饰设计” 进行分词

    import jieba
    
    seg_list1 = jieba.cut("古蜀青铜艺术与蜀绣非遗技艺结合创新的探讨——现代首饰设计", cut_all=True)    # 全模式
    seg_list2 = jieba.cut("古蜀青铜艺术与蜀绣非遗技艺结合创新的探讨——现代首饰设计", cut_all=False)    # 精确模式
    seg_list3 = jieba.cut_for_search("古蜀青铜艺术与蜀绣非遗技艺结合创新的探讨——现代首饰设计")    # 搜索引擎模式
    
    print("Full Mode: " + "/ ".join(seg_list1))  # 全模式
    print("Default Mode: " + "/ ".join(seg_list2))  # 精确模式
    print(", ".join(seg_list3))  # 搜索引擎模式
    

    结果如下图所示:

    分词结果1
    可以看到精确模式与搜索引擎模式的分词结果比全模式更准确。
    3、添加自定义词典
    在对“互联网+背景下古代娱乐项目综合体验平台的设计与实现——基于微信小程序和Web网页”这一文本进行分词的时候,发现“互联网+”与“微信小程序”没有被正确分出来,如下图所示:
    添加词典前
    添加自定义词典的方式帮助jieba正确地分出这些新词。
    • ①载入词典
    • 用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
    • 自定义词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
    • 词频省略时使用自动计算的能保证分出该词的词频

    新建自定义词典文件self_dict.txt


    self_dict.txt

    编写代码导入自定义词典,并重新分词

    import jieba
    jieba.load_userdict('/home/lly/self_dict.txt')     #载入自定义词典
    str='互联网+背景下古代娱乐项目综合体验平台的设计与实现——基于微信小程序和Web网页'
    print("/".join(jieba.cut(str)))
    

    添加自定义词典之后的分词结果如下图所示:


    添加字典后

    可以看到“互联网+”与“微信小程序”被完整地分了出来。

    • ② 使用 add_word() 和 del_word() 动态修改词典


      add_word使用示例
      del_word使用示例
    • ③使用 suggest_freq() 调节单个词语的词频,使其能(或不能)被分出来


      suggest_freq使用示例

      4、关键词提取
      jieba中有两种抽取关键词的方法,一种是基于 TF-IDF 算法的关键词抽取,另外一种是基于 TextRank 算法的关键词抽取。
      编写代码查看两种关键词提取算法的区别:

    import jieba
    import jieba.analyse
    s = "1933年巴黎中国美展上的古画和他者视野,古蜀青铜艺术与蜀绣非遗技艺结合创新的探讨——现代首饰设计,迈克尔·苏立文1940年代在四川大学任职期间艺术交游与活动研究,基于高频金融市场订单流的极端事件研究以及相应交易策略开发"
    for x, w in jieba.analyse.extract_tags(s, withWeight=True):     #基于 TF-IDF 算法的关键词抽取
        print('%s %s' % (x, w))
    
    for x, w in jieba.analyse.textrank(s, withWeight=True):    #基于 TextRank 算法的关键词抽取
        print('%s %s' % (x, w))
    

    结果如下图所示:


    两种算法结果比较

    可以看到两者的差别还是比较大的。

    • TF-IDF(term frequency - inverse document frequency) 是一种统计方法,可以用来评估一个词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数呈正比增加,但同时也会随着它在语料库中出现的频率呈反比下降
    • TextRank是一种用于文本的基于图的排序算法。其基本思想来源于谷歌的 PageRank算法, 通过把文本分割成若干组成单元(单词、句子)并建立图模型, 利用投票机制对文本中的重要成分进行排序, 仅利用单篇文档本身的信息即可实现关键词提取、文摘。

    两种算法的一个区别就是TF-IDF算法需要依赖于语料库,但是TextRank不需要。
    5、词性标注

    jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
    标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。

    词性标注结果

    二、IK Analyzer的分词使用

    1、检查java环境
    输入指令:java -version

    java -version
    2、检查solr
    • 输入bin/solr start -force启动服务

    • 在浏览器地址栏输入http://云主机IP:端口号(默认为8983)/solr,出现以下界面则solr可用


      solr界面

      3、添加IK Analyzer中文分词工具包

    • 下载对应版本的IK Analyzer,下载地址,仅供参考

      解压后的文件
    • 将两个jar包添加到solr文件目录下的/server/solr-webapp/webapp/WEB-INF/lib文件夹中

    • 新建core
      输入bin/solr create -c lycore -p 8983 -force新建一个名为lycore的core

    • 修改配置文件
      在server/solr/lycore/conf文件夹中的managed-schema文件中加入以下代码:

    <fieldType name="text_ik" class="solr.TextField">
        <analyzer type="index">
          <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="org.apache.lucene.analysis.ik.IKTokenizerFactory" useSmart="true"/>
        </analyzer>
      </fieldType>
    
    • 重启solr
      输入bin/solr restart -forc重启solr
      4、开始分词
    • 在浏览器中打开分词窗口


      打开分词窗口
    • 输入文本进行分词
      对“古蜀青铜艺术与蜀绣非遗技艺结合创新的探讨”进行分词
      分词结果:

    古 /蜀 /青铜 /艺术 /蜀绣 /非 /遗 /技艺 /结合 /创新 /探讨

    分词结果

    可以看到“非遗技艺”没有被正确分出来。
    5、设置自定义词典
    将文件夹下的IKAnalyzer.cfg.xml , ext.dic和stopword.dic 三个文件 复制到/server/solr-webapp/webapp/WEB-INF/classes 目录下,并在 ext.dic中添加自定义词典,


    添加“非遗技艺”
    • 重启solr,重新分词


      重新分词结果

      可以看到非遗技艺被成功分了出来。

    三、词频统计与词云生成

    1、准备待分词的文本
    正好最近教务处公布了今年的大创立项名单,我就想要提取项目名称中的关键字并进行词频统计,来看看今年大家的研究重点。
    提取《2018年四川大学“大学生创新创业训练计划”立项项目名单》里的项目名称,保存为proTitle.csv文件.

    待分词文本部分截图

    2、准备自定义词典
    因为项目名称中涉及到很多专业名词,为了提高分词的正确率,需要在自定义词典中加入这些词。我找了一些专业名词的词库,将里面的词都加入了自定义词典文件self_dict.txt


    使用的词库

    3、准备停用词表
    因为项目名称中包含很多“的”、“一个”等意义不大的连词、数量词,因此将这些词作为停用词。我参考了几个常见的停用词表,制作了本次的停用词表stop_words.data


    停用词表
    4、编写代码并运行
    import jieba
    import codecs
    import csv
    from jieba import analyse
    
    analyse.set_stop_words("stop_words.data")    #引入停用词表
    jieba.load_userdict('self_dict.txt')    #载入自定义词典
    
    #读入待分词文件
    f = open('2018dc.csv','r')    
    myfile=f.read()
    
    #分词并将结果写入文件
    seg_list = jieba.cut(myfile, cut_all = False)
    sentence = '/' .join(seg_list)
    f = codecs.open('result1.txt','w','utf-8') 
    f.write(sentence)
    f.close()
    
    #提取前200个关键词并写入文件
    keyWord = analyse.extract_tags(myfile, topK=100, withWeight=True)
    csv=open('result2.csv','w')
    for wd, weight in keyWord:
        print int(weight*1000),wd
        csv.write(wd.encode('utf-8')+','+str(weight*1000)+'\n')
    
    • 分词结果


      分词结果部分截图
      关键抽取即按词频排序结果

    5、生成词云
    生成词云的方式有很多。基于python的wordcloud模块完成分词、设置停用词表、绘制图云等一系列功能。
    因为前面已经完成了关键词的抽取与权重排序,因此在这里直接采用在线词云生成工具,比如易词云图悦等,操作很简单。

    2018大创项目名称词云
    6、小结
    从以上词云图中可以看出,今年的大创立项名单中出现得比较多的词汇是“制备”、“机制”、“系统”、“平台”、“分析”等,这些词大多是与医学、理学、工学的实验相关的。“调查”、“现状”这些词更有可能与人文社科相关的研究有关。

    相关文章

      网友评论

          本文标题:Jieba&IK Analyzer——分词工具的比较与使用

          本文链接:https://www.haomeiwen.com/subject/orysjftx.html