美文网首页我爱编程
分词练习2——分词体验

分词练习2——分词体验

作者: 骆落啊 | 来源:发表于2018-05-27 17:51 被阅读0次

    分词练习1——分词工具包

    分词效果尝试

    接下来我将体验NLPIR和jieba分词的效果,其中,NLPIR使用在线演示,jieba由于其体验网站出错故使用代码。

    (1)NLPIR

    进入在线演示系统,输入网址抓取后可以在方框内得到相应文字,这里我们以公共管理学院的新闻——认真贯彻落实十九大精神 我院积极开展调研工作为例展开分词体验。(这里抓取的是网页内的所有文本,即包括导航栏文本和底部信息等,我手动将那些删掉了,留下了新闻主体)输入网址后点击开始分析。

    语义分析系统.png
    网页采集.png
    • 分词标注:
      对文本进行分词,并将出现的字词进行词性标注(如名词、形容词、动词等)

      分词标注.png
    • 实体抽取:

    识别出文本中出现的专有名称和有意义的数量短语并进行分类,主要包括实体(组织名,人名,地名)、时间表达式(日期、时间)和数字表达式(货币值、百分数等)

    实体抽取.png
    • 词频统计:
      分词后将每类词性下出现的词语进行频数统计

      词频统计.png
    • 文本分类:
      根据文本中截取到的词语进行分析,得出该文本描述的内容的类别

      文本分类.png
    • 情感分析:

    情感分析(SA)又称为倾向性分析和意见挖掘,它是对带有情感色彩的主观性文本进行分析、处理、归纳和推理的过程,其中情感分析还可以细分为情感极性(倾向)分析,情感程度分析,主客观分析等。

    情感极性分析的目的是对文本进行褒义、贬义、中性的进行判断。

    情感分析.png
    • 关键词提取:
      根据对文本中提取到的词语的统计得出的一些使用次数较多的关键词,并根据出现次数的多少决定字号大小,方便抓取重要词汇

      关键词提取.png
      (有一点不明白的是每刷新一次这个图就会变一次)
    • Word2vec:

    也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。

    (虽然这么说了但是我也还是不是很能理解,有兴趣的童鞋可以自行查找一下相关资料。比如说我就不是很明白为什么这里会出现清华大学,不过我猜测可能是NLPIR自己进行分词统计后得出的和本篇文本相关的词汇)


    Word2vec.png
    • 依存文法:

    通过分析语言单位内成分之间的依存关系揭示其句法结构。 直观来讲,依存句法分析识别句子中的“主谓宾”、“定状补”这些语法成分,并分析各成分之间的关系

    依存文法.png
    • 地图可视化:
      将文本中涉及到的位置显示到地图上
      地图可视化.png
    • 敏感词:
      这个的含义没有查到,我猜测大概是针对文本中可能存在的敏感词进行检测
      敏感词.png
    • 摘要提取:
      对文本内容的精简提炼
      摘要提取.png

    以上即为本次使用NLPIR分词的过程。

    (2)jieba分词

    关于jieba的使用,我是在云服务器上完成的,而我们的云服务器已经由另一个组员安装好了jieba,所以我这里也不赘述安装过程,想知道的同学可以自己看看,也不是很复杂。
    以下代码参考jieba在GitHub上的demo学习使用Jieba
    我先在本地电脑上新建了一个jieba_test.txt文件(内容同上面的新闻一样),然后通过Xftp上传到云服务器的/jieba文件夹中。

    jieba_test.txt.png
    命令行分词
    输入命令:(要注意当前是否处在txt文件所在目录下)
    python -m jieba jieba_test.txt
    

    结果如下:


    命令行分词.png

    可以看到,文本中的“十九大”被切分成了“十九”和“大”;“图情档”被切分成“图情”和“档”;“公共管理大类”被切分成了“公共”、“管理”、“大”和“类”;“史云贵”(院长名)被切分成了“史”和“云贵”。这些问题来源于这些词并不存在于jieba的词典中,而且其出现频率的大小也会造成影响,比如“十九”出现的频率会高于“十九大”的频率,所以会导致在分词时会被切分成两部分。

    通过文件代码分词并添加词典
    接下来添加并引用自定义词典收录上述词语:
    添加用户自定义词典:

    用法: jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
    词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。

    我添加的词典如下图所示:


    self_dict.txt.png

    代码如下:(dict.py)

    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import jieba
    
    #读取txt文档内容
    file_object = open('jieba_test.txt')
    file_content = file_object.read()
    file_object.close()
    
    jieba.load_userdict("self_dict.txt")        #引用用户的自定义词典
    words = jieba.cut(file_content)         #对内容进行分词
    print('/'.join(words))                      #输出分词结果
    

    上传后使用./dict.py运行,报错如下图:


    没有权限.png

    此时可通过代码:

    chmod 755 ./dict.py
    

    来修改权限。修改成功后文件名会变成绿色,如下图所示:


    纠正错误1.png

    完毕后运行时又遇到另一报错:


    不同系统的编码格式转换错误.png
    修改方法为:
    [wenny673@VM_0_8_centos jieba]$ vi dict.py
    :set ff=unix
    :x
    

    保存退出后若是不放心可以再执行一遍vi dict.py然后输入:set ff查看,:set ff=unix时即为成功。
    (纠错方法参考终端直接执行py文件,不需要python命令python报/usr/bin/python^M: bad interpreter: No such file or directory
    再次执行dict.py文件,成功运行并得到下图结果:

    添加词典后的运行结果.png
    可以看到此时“十九大”、“公共管理大类”和“史云贵”三个词已经不会再被切分了。
    另一种方式为直接在程序里进行分词调整:

    使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
    使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
    注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

    代码如下:

    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import jieba
    
    file_object = open('jieba_test.txt')
    file_content = file_object.read()
    file_object.close()
    
    jieba.add_word('十九大')       #通过add_word在程序中动态修改词典
    jieba.add_word('公共管理大类')
    jieba.del_word('史云贵')
    words=jieba.cut(file_content)
    print("/".join(words))
    

    此时也可以获得和上图相同的结果

    提取关键词

    import jieba.analyse
    jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    sentence 为待提取的文本
    topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    withWeight 为是否一并返回关键词权重值,默认值为 False
    allowPOS 仅包括指定词性的词,默认值为空,即不筛选
    jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

    代码参考基于TF-IDF的关键词提取学习使用Jieba
    代码如下:

    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import jieba
    import jieba.analyse
    
    content = open('jieba_test.txt', 'rb').read()
    
    tags = jieba.analyse.extract_tags(content, topK=10)
    
    print(",".join(tags))
    

    提取结果为:


    关键词提取结果1.png

    另一种提取方式:(test.py)

    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import sys
    sys.path.append('../')
    
    import jieba
    import jieba.analyse
    from optparse import OptionParser
    
    USAGE = "usage:    python test.py [file name] -k [top k]"
    
    parser = OptionParser(USAGE)
    parser.add_option("-k", dest="topK")
    opt, args = parser.parse_args()
    
    
    if len(args) < 1:
        print(USAGE)
        sys.exit(1)
    
    file_name = args[0]
    
    if opt.topK is None:
        topK = 10
    else:
        topK = int(opt.topK)
    
    content = open(file_name, 'rb').read()
    
    tags = jieba.analyse.extract_tags(content, topK=topK)
    
    print(",".join(tags))
    

    此时在命令行输入

    python test.py jieba_test.txt -k 15
    

    可得结果如下:

    关键词提取结果2.png
    基于 TextRank 算法的关键词抽取
    tags = jieba.analyse.extract_tags(content, topK=topK)
    

    换为

    tags=jieba.analyse.textrank(content,topK=topK)
    

    即可。
    在命令行输入

    python test.py jieba_test.txt -k 15
    

    结果为:


    关键词提取结果3.png

    词云生成
    代码来自学习使用Jieba,参照Python + wordcloud + jieba 十分钟学会用任意中文文本生成词云稍作改动。
    绘制词云图要用到matplotlib包,请先确保自己的python里已经安装好了这个(我在这里栽了好久)。主要安装方法为

    pip install matplotlib
    

    运气好的一般一次就能成功了,但是像我这种比较惨的就是依赖缺了一个又一个(其实就两个),分别是bz2和tkinter,解决方法见python: ImportError: No module named bz2python解决 ModuleNotFoundError: No module named '_bz2'【求助】centos7上安装Python3缺失tkinter

    运行generate.py时会出现报错如下:

    _tkinter.TclError: no display name and no $DISPLAY environment variable
    

    这时候只要在代码的起始处添加

    import matplotlib  
    matplotlib.use('Agg')  
    

    就ok了。下面是generate_wc.py的详细代码:

    #! /usr/bin/python3
    # -*- coding: utf-8 -*-
    
    
    import os
    from os import path
    import matplotlib
    # Force matplotlib to not use any Xwindows backend.
    matplotlib.use('Agg')
    import jieba
    import jieba.analyse
    from PIL import Image, ImageSequence
    import numpy as np
    import matplotlib.pyplot as plt
    from wordcloud import WordCloud, ImageColorGenerator
    import random
    
    d = path.dirname('.')          # 获取当前文件路径
    def load_data(file_path):
        '''
        输入文件路径,返回文件内容
        '''
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                content = f.read()
        except Exception as e:
            print("something wrong in load_data()")
        return content
    
    #获取背景图片
    def load_image(file_path):
        image = Image.open(file_path)
        graph = np.array(image)
        return graph
    
    
    def generate_wordcloud(content, graph):
        result = jieba.analyse.textrank(content, topK=50, withWeight=True)
        keywords = dict()
        for i in result:
            keywords[i[0]] = random.randint(1, 10)
        wc = WordCloud(font_path='caoshu.ttf',    #设置字体
                       background_color='White',      # 背景颜色
                       max_words=50,         # 词云显示的最大词数
                       mask=graph)
        wc.generate_from_frequencies(keywords)      #生成词云
        image_color = ImageColorGenerator(graph)    # 从背景图片生成颜色值
       #显示图片
        plt.imshow(wc)
        plt.imshow(wc.recolor(color_func=image_color))
        plt.axis("off")
        plt.show()
        #生成图片文件
        wc.to_file(path.join(d, "ciyun.png"))
    
    
    if __name__ == '__main__':
        data_file = input('Please enter a data file path:')
        content = load_data(data_file)
        image_file = input('Please enter a image file path:')
        graph = load_image(image_file)
    
        generate_wordcloud(content, graph)
    

    背景图:


    dq.jpg

    生成的词云图如下:(我用的是草书所以飘逸了点)


    ciyun.png

    以上即为本次jieba分词体验的全部内容。

    参考:

    1. 各分词工具介绍
    2. 常见分词工具总结
    3. python命名实体抽取学习记录(1)
    4. 短文本情感分析
    5. 如果看了此文还不懂 Word2Vec,那是我太笨
    6. 大白话讲解word2vec到底在做些什么
    7. 【工具】语义分析系统---- NLPIR
    8. 依存句法分析与语义依存分析的区别

    相关文章

      网友评论

        本文标题:分词练习2——分词体验

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