zoukankan      html  css  js  c++  java
  • pandas之中文分词,词云,情感分析,语义分析1

    中文分词

    分词,就是将0维的非格式化文本转为格式化、向量化数据
    
    中文分词(Chinese Word Segmentation) 是将一个汉字序列切分成一个个单独的词。
    
    英文文档中,单词之间是以空格作为自然分界符的,而中文词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一上,中文分词相比英文要复杂困难的多
    
    '0维的非格式化文本转为格式化'
    分词
    ['0维', '的', '非格式化', '文本', '转为', '格式化']
    

    安装jieba中文分词库

    pip install jieba
    or
    conda install -c conda-forge jieba
    import jieba
    import jieba.analyse

    中文分词基础步骤

    • 载入数据
    • 分词
    • 分词后的数据转回文本
    • 保存分词后的文本为文本文件
    # 外部载入
    with open('example/text.txt', 'r', encoding='GBK') as f:
        a = f.read()
    b = jieba.cut(a)  # 返回生成器
    b = jieba.lcut(a)  # 分词后直接生成列表
    c = ' '.join(b)      # 分好的词转回字符串
    with open('temp/text_cut.txt', 'w', encoding="utf-8")as f:  # 提前建好temp文件夹
        f.write(c)
    

    增加分词的准确率  

    • 增加或删除系统词词典
      • 一个词错误分为多个词(例如:你好,分为:'你', '好'
        • 解决方法:
          • 添加自定义词典:jieba.load_userdict()
          • 动态增加系统词:jieba.add_word()
      • 两个词错误分为一个词:(例如:'你,和,我',分为:‘你和我')
        • 解决方法:
          • 删除系统词:jieba.del_word()
          • 调整词频:jieba.suggest_freq(('a','b'), tune=True)
    • 去停用词
      • 将不想出现在分词结果内的词删除

    注意:修改自定义词典或停用词文本文件时,不要使用记事本修改(保存时会存为UTF-8带BOM格式,导致程序载入出问题)

    添加自定义词典

    • 当句子中的某个词没有被识别分出时,可以指定自己自定义的词典,以便包含 jieba 词库里没有的词
    • 词典文件的内容可以根据项目不断增加。查看初步分词,将分词不正确的词加入自定义词典然后重新再分,直到正确率达标
    • 虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率

    词典格式:

    • 词中间不能有标点符号
    • 一个词占一行;
    • 每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
    • file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码

    词频省略时使用自动计算也能保证分出该词的词频

    jieba.load_userdict('data/custom.txt')  # 输入路径直接应用自定义词典
    jieba.lcut(a)
    

    动态增加或删除词典的词

    a2 = '我们中出了一个叛徒'
    jieba.lcut(a2)   #['我们', '中出', '了', '一个', '叛徒']
    # 两个词错误的分为1个词,删除词实现正确分词
    jieba.del_word('中出')  # 删除jieba自带的词(不同于去停用词,不是删除词,而是重新分词)
    jieba.add_word('中出')  # 增加jieba的词,和自定义词典相比它可以动态增加词
    jieba.lcut(a2)
    
    # 调节词的词频,使其能(或不能)被分出
    # tune=True:执行词频调整,默认False不执行
    jieba.suggest_freq(('中','出'), tune=True)
    jieba.lcut(a2)        #['我们', '中', '出', '了', '一个', '叛徒']
    # 调整的词以字符串形式输入
    jieba.suggest_freq('一个叛徒', tune=True)
    jieba.lcut(a2)                        #['我们', '中', '出', '了', '一个叛徒']
    

    去停用词

    • 与上面相反,当一个字符串不是词,jieba误将其分为词,或者我们不想将某些不重要的词分出来(想删掉某些分出的词)可以自定义停用词词典
    • 停用词就是要从分词结果删掉的垃圾无用词
    • 词典中的词不会出现在分词结果中
    • 停用词词典的内容可以根据项目不断增加

    附一个通用停用词词典,涵盖大部分无用字词,可以根据项目需求不断添加累计补充

    a = '哎,鹅,听说你超级喜欢小游戏的!你是吗?'
    b = jieba.lcut(a)
    
    去停用词功能jieba不带,需自行实现。下面是实现
    1.先载入停用词
    2.1去停用词,第一步,求差集
    2.2去停用词第二步:去掉1个字以下的词
    #
    # 1.若停用词表的特殊词载入时被自动转义,可以判断并恢复
    stopword = []
    with open('temp/stopword.txt', 'r', encoding='UTF-8') as f:
        for line in f.readlines():
            l = line.strip()
            if l == '\n':
                l = '
    '
            if l == '\u3000':
                l = 'u3000'
    
            stopword.append(l)
    
    #2.1去停用词,第一步,求差集
    x = np.array(b)  # 将分好的词列表转为数组
    y = np.array(stopword)  # 将停用词转为数组
    
    # 目的:将分词数组内停用词数组有的值删除
    np.in1d(x, y)  # np.inid(x, y) x的元素是否包含于y
    z = x[~np.in1d(x, y)]
    # 非运算,在x内且不在y内的词
    
    # 2.2第二步:去掉1个字以下的词
    
    # k = []
    # for i in z:
    # #     print(len(i))
    #     if len(i) > 1:
    #         k.append(i)
    # k
    
    k = [i for i in z if len(i) > 1]
    k
    

      

    本文为原创文章,转载请标明出处
  • 相关阅读:
    47 在 Java 程序中怎么保证多线程的运行安全?
    46 线程池中 submit() 和 execute() 方法有什么区别?
    前端能力和后端能力
    在HTML中限制input 输入框只能输入纯数字
    footer固定在页面底部的实现方法总结
    在网站建设的时候需要考虑哪些因素?
    CENTOS中cat命令中文乱码 VIM乱码设置
    腾讯实验室LAMP搭建DZ
    运算符总结
    Typora专业写手都在用
  • 原文地址:https://www.cnblogs.com/harden13/p/13711454.html
Copyright © 2011-2022 走看看