黑马程序员技术交流社区

标题: 使用jieba库对中文文本进行关键词提取 [打印本页]

作者: sunyakai    时间: 2018-6-24 18:47
标题: 使用jieba库对中文文本进行关键词提取
中文文本分析--------关键词提取

1. 添加自定义词库,保证准确率(根据具体语境建立词库);
jieba.load_userdict(file_name) #file_name为自定义语料库的路径。

2.加载停用词词库;
jieba.analyse.set_stop_words(file_name) #file_name为自定义语料库的路径。
关键词提取所使用停用词(Stop Words)文本语料库可以切换成自定义语料库的路径。
如:jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")

3.根据词语权重提取关键词
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS = ())
# sentence:待提取的文本。
# topK:返回几个 TF/IDF 权重最大的关键词,默认值为20。
# withWeight:是否一并返回关键词权重值,默认值为False。
# allowPOS:仅包括指定词性的词,默认值为空,即不进行筛选。

1,2,3是jieba库的具体函数方法使用,自定义词库,停用词词库就要根据实际情况进行创建。

执行代码如下:(路径及词库需要更改)
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# @Author  : Jia
# @Version : Python3.6
# 对输入的文本内容,返回其特征词(词数上限为5)

import os
# from glob import glob
import re
import sys
import jieba
from jieba import analyse

def run():
    # 添加自定义词库,保证准确率
    sys_path = sys.path[0]
    jieba.load_userdict(os.path.join(sys_path, 'dict', 'extract_tags_dict.txt'))

    '''
     基本方法:jieba.analyse.extract_tags(sentence, topK)
     需要先import jieba.analyse,其中sentence为待提取的文本,topK为返回几个TF/IDF权重最大的关键词,默认值为20
     1. 预处理,首先进行分词和词性标注,将满足指定词性的词作为候选词;
     2. 分别计算每个词的TF-IDF值;
     3. 根据每个词的TF-IDF值降序排列,并输出指定个数的词汇作为可能的关键词;
    '''

    tfidf = analyse.extract_tags

    '''
    # 关键词提取所使用停用词(Stop Words)文本语料库可以切换成自定义语料库的路径。
    # jieba.analyse.set_stop_words(file_name) #file_name为自定义语料库的路径。
    # 如:jieba.analyse.set_stop_words("../extra_dict/stop_words.txt")
    主要思想是分词过后,遍历一下停用词表,去掉停用词。
    '''
    analyse.set_stop_words(os.path.join(sys_path, 'dict', 'stopfile_taibao_tags.txt'))

    # 词性限制集合为["ns", "n", "vn", "v", "nr"],表示只能从词性为地名、名词、动名词、动词、人名这些词性的词中抽取关键词。
    allowPOS = ["n", "vn", "v", "nt", "nz"]

    withWeight = False
    withFlag = False


    tags = []
    info = {}
    # 获取命令行参数
    text = sys.argv[-1]
    print(text)
    # text = re.split('(来电|致电|客户|保险?人|业务员|(投|被)保人|员工).{0,5}(表示|称|询问|投诉|反映|要求|(查|咨)询|报案)|(客户|保险?人|业务员|(投|被)保人|员工).{0,5}(来电|致电)|来电|致电', text, 1)[-1]
    #
    # print(text)
    # text = re.split('[,。!、,](烦)?请(贵部|相关部门|有关部门)?.*?(核实|处理|联系|知晓)|联系电话|,谢谢|谢谢|电话?号|预警', text, 1)[0]
    # print(text)

    '''
    来电业务员,表示反要求报案
    # import jieba.analyse
    # jieba.analyse.extract_tags(sentence, topK = 20, withWeight = False, allowPOS = ())
    # sentence:待提取的文本。
    # topK:返回几个 TF/IDF 权重最大的关键词,默认值为20。
    # withWeight:是否一并返回关键词权重值,默认值为False。
    # allowPOS:仅包括指定词性的词,默认值为空,即不进行筛选。
    '''
    keywords = tfidf(text, topK=5, withWeight=withWeight, allowPOS=allowPOS, withFlag=withFlag)
    print(keywords)

    cut_result = jieba.cut(text)
    print(type(cut_result))
    cut_result = [i for i in cut_result]
    print('/'.join(cut_result))
    index = {}
    for item in keywords:

        # 分别为关键词和相应的权重
        # item[0], item[1]
        try:
            index[item] = cut_result.index(item)
        except:
            index[item] = len(cut_result)-1
    # 升序排列
    print(index)
    index = sorted(index.items(), key=lambda x: x[1], reverse=False)
    for key, value in index:
        tags.append(key)
        # print(key, end='/')

    info['rulename'] = '特征词抽取'
    info['bool'] = 'true'
    info['tag'] = tags
    info['keytext'] = '{}'

    print(info)


if __name__ == '__main__':
    run()

# python3 /home/python/Desktop/药品/1jieba/py/py/py/taibao_tags_extract.py '是电话推销的,70周岁返还有点不太现实,要求退保'



下图是在终端的测试及结果图片




小结:
jieba分词库可以简单快速的处理中文文本,可以用于分词,词性输出,关键词输出,词频统计等。

作者: cai901022    时间: 2018-6-26 08:45
get 一个,学习到了,感谢楼主




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2