精华内容
下载资源
问答
  • python 基于LDA长文本主题提取并预测分类 Lda算法原理,知乎上有很完善的算法介绍,这里就不多废话了。 数据准备 这一阶段主要是对你的问题本进行处理,清洗你的数据。中文文本预处理,主要包括去空格、去表单符号、...

    python 基于LDA长文本主题提取并预测分类

    导读

    Lda算法原理,知乎上有很完善的算法介绍,这里就不多废话了。

    本文主要是用来做文本主题提取,再根据这些主题对现有的文本进行分类。因为数据问题,效果一般,算法设计思路,仅供参考。

    本文代码以及测试数据已上传github:仓库地址

    数据准备

    这一阶段主要是对你的问题本进行处理,清洗你的数据。中文文本预处理,主要包括去空格、去表单符号、去停用词、分词等。根据个人需求进行文本预处理。讲数据处理成下面数据格式即list套list的数据格式。

    最初数据如下所示,一条一条文本,换行符分割。

    在漆黑的夜空里看满天璀璨的星星,非常非常的密集,同时月亮也异常明亮。最主要的是在满天繁星中,靠近月亮的3颗星星排列成“勾”的样子,他们特别的明亮。
    
    ......................................................(省略好多数据)
    
    沟里漂着很多死尸大人小孩都有,我顺着消流的方向走,看到臭水带着死尸流进了苹果园,我很怕!
    

    经过初步处理后,也就是通过下文里面的deal_words()方法得到下面

     [['满天璀璨', '星星', '月亮', '明亮', '靠近', '排列'],........., ['沟里', '漂着', '死尸','大人小孩']]
    

    具体数据处理可以参照:数据预处理

    LDA模型实现

    思路:

    1. 将训练数据和预测数据混合并提取词典库
    2. 利用词典库将训练数据转换成one-hot编码
    3. 利用gensim提供的API做模型提取主题
    4. 将混入的预测数据转换成one-hot编码
    5. 预测分类主题

    这里模型采用gensim提供的API进行实现,代码如下:

    def lad_model(train_data):
        # 读取预测分类数据
        test_data = deal_words(read_text_file('./data/set/test_text.txt'))
        # 拼接提取词典库
        contents = train_data + test_data
        # 根据文本获取词典
        dictionary = corpora.Dictionary(contents)
        # 词典创建语料库
        corpus = [dictionary.doc2bow(doc) for doc in train_data]
    	#调用LDA模型,请求潜在主题数30;训练语料库2次
        lda = gensim.models.ldamodel.LdaModel(corpus, num_topics=30, id2word=dictionary,
                                              passes=2)
        #导出模型分类数量
        data = lda.print_topics(num_topics=3, num_words=5)
        # 打印主题,10个主题,20个单词
        for item in data:
            print(item) 
            print("--------------------split line---------------------")
        # 测试数据转换
        test_vec = [dictionary.doc2bow(doc) for doc in test_data]
    	#预测并打印结果
        for i, item in enumerate(test_vec):
            topic = lda.get_document_topics(item)
            keys = target.keys()
            print('第',i+1,'条记录分类结果:',topic)
    

    全部代码以及效果

    lad模型代码以及处理数据代码。这里处理数据的核心代码text_deal.py,写在了同级目录(lda_demo)下面。

    from lda_demo import text_deal as td
    from gensim import corpora, models
    import gensim
    
    """
    读取text文件
    intput:url
    output:list结构的文本数据
    """
    
    
    def read_text_file(url):
        dream_text = open(url, 'r+', encoding='utf-8')
        return dream_text.read().split("\n\n")
    
    
    """
    停用词/分词
    """
    
    
    def deal_words(contents):
        # 去除空格
        contents = td.remove_blank_space(contents)
        # 获取分词结果
        contents = td.cut_words(contents)
        # 去除停用词
        contents = td.drop_stopwords(contents)
        return contents
    
    def lad_model(train_data):
        # 读取预测分类数据
        test_data = deal_words(read_text_file('./data/set/test_text.txt'))
        # 拼接提取词典库
        contents = train_data + test_data
        # 根据文本获取词典
        dictionary = corpora.Dictionary(contents)
        # 词典创建语料库
        corpus = [dictionary.doc2bow(doc) for doc in train_data]
    	#调用LDA模型,请求潜在主题数30;训练语料库2次
        lda = gensim.models.ldamodel.LdaModel(corpus, num_topics=30, id2word=dictionary,
                                              passes=2)
        #导出模型分类数量
        data = lda.print_topics(num_topics=3, num_words=5)
        # 打印主题,10个主题,20个单词
        for item in data:
            print(item) 
            print("--------------------split line---------------------")
        # 测试数据转换
        test_vec = [dictionary.doc2bow(doc) for doc in test_data]
    	#预测并打印结果
        for i, item in enumerate(test_vec):
            topic = lda.get_document_topics(item)
            keys = target.keys()
            print('第',i+1,'条记录分类结果:',topic)
    
    
      if __name__ == '__main__':
        # 据集读取
        contents = read_text_file('./data/set/train_text.txt')
        # 文本处理
        contents = deal_words(contents)
        # LDAmodel
        lad_model(contents)
    
    

    text_deal.py代码如下:

    """
    自然语言处理---文本预处理
    """
    import jieba
    import pandas as pd
    
    """
    加载初始数据信息
    str:文件传输路径
    index:所需真实值索引列表
    """
    
    
    def read_data(str, index):
        dream_data = pd.read_csv(str)
        return dream_data.values[:, index]
    
    
    """
    去掉文本中的空格
    input:our_data为list文本数据
    output:去除空格后的文本list
    """
    
    
    def remove_blank_space(contents):
        contents_new = map(lambda s: s.replace(' ', ''), contents)
        return list(contents_new)
    
    
    """
    判断单词是否为中文
    input:word单个单词
    output:是中文True,不是中文False
    """
    
    
    def is_chinese(word):
        if word >= u'\u4e00' and word <= u'\u9fa5':
            return True
        else:
            return False
    
    
    """
    判断短句是否为纯中文
    input:words短句
    output:是中文True,不是中文False
    """
    
    
    def is_chinese_words(words):
        for word in words:
            if word >= u'\u4e00' and word <= u'\u9fa5':
                continue
            else:
                return False
        return True
    
    
    """
    将文本数据格式化去除非中文字符
    input:contents list结构的文本数据
    output:去除非中文字符的数据
    """
    
    
    def format_contents(contents):
        contents_new = []
        for content in contents:
            content_str = ''
            for i in content:
                if is_chinese(i):
                    content_str = content_str + i
            contents_new.append(content_str)
        return contents_new
    
    
    """
    对文本进行jieba分词
    input:contents文本list
    output:分词后的文本list
    """
    
    
    def cut_words(contents):
        cut_contents = map(lambda s: list(jieba.lcut(s)), contents)
        return list(cut_contents)
    
    
    """
    去除停用词/标点符号
    input:contents文本list(list中保存list)
    output:去除停用词后的文本list
    """
    
    
    def drop_stopwords(contents):
        # 初始化获取停用词表
        stop = open('./data/word_deal/stop_word_cn.txt', encoding='utf-8')
        stop_me = open('./data/word_deal/stop_one_mx.txt', encoding='utf-8')
        key_words = open('./data/word_deal/key_words.txt', encoding='utf-8')
        #分割停用词/自定义停用词/关键词
        stop_words = stop.read().split("\n")
        stop_me_words = stop_me.read().split("\n")
        key_words = key_words.read().split("\n")
        #定义返回后的结果
        contents_new = []
        #遍历处理数据
        for line in contents:
            line_clean = []
            for word in line:
                if (word in stop_words or word in stop_me_words) and word not in key_words:
                    continue
                if is_chinese_words(word):
                    line_clean.append(word)
            contents_new.append(line_clean)
        return contents_new
    
    

    运行效果

    (1, '0.023*"说" + 0.018*"怀孕" + 0.016*"父亲" + 0.014*"里" + 0.011*"岁"')
    --------------------split line---------------------
    (25, '0.023*"说" + 0.012*"办公室" + 0.010*"是不是" + 0.009*"朋友" + 0.009*"大门"')
    --------------------split line---------------------
    (20, '0.014*"同学" + 0.010*"跑" + 0.010*"培训" + 0.010*"骑" + 0.009*"机构"')
    --------------------split line---------------------
    第 1 条记录分类结果: [(4, 0.24392343), (8, 0.1395505), (10, 0.09619252), (18, 0.16527545), (21, 0.17173427), (23, 0.11055296)]
    第 2 条记录分类结果: [(5, 0.124014), (13, 0.28862998), (16, 0.099018164), (19, 0.09216843), (24, 0.12537746), (29, 0.22633219)]
    第 3 条记录分类结果: [(7, 0.101059936), (10, 0.37497482), (21, 0.15868592), (23, 0.19114888), (29, 0.12510397)]
    第 4 条记录分类结果: [(1, 0.082532495), (4, 0.17312291), (14, 0.072532885), (17, 0.38016438), (19, 0.050784156), (21, 0.21228231)]
    
    1. 文本处理根据自己需求一定要做好,清洗掉不必要的数据;否则影响主题分类。
    2. 语料库全面结果会更加友好吧,在语料库范围内分类效果还是比较好的,但是新数据效果一般。

    欢迎批评指正!

    展开全文
  • 无监督提取文档主题——LDA模型 1.1 准备工作 1.2 调用api实现模型 LDA的可视化交互分析——pyLDAvis 2.1 安装pyLDAvis 2.2 结合gensim调用api实现可视化 p.s. 保存结果为独立网页 p.p.s. 加快prepare速度? 2.3 ...

    主题模型LDA的实现及其可视化pyLDAvis

    1. 无监督提取文档主题——LDA模型
      1.1 准备工作
      1.2 调用api实现模型
    2. LDA的可视化交互分析——pyLDAvis
      2.1 安装pyLDAvis
      2.2 结合gensim调用api实现可视化
      p.s. 保存结果为独立网页
      p.p.s. 加快prepare速度?
      2.3 如何分析pyLDAvis可视化结果
      2.3.1. 每个主题表示什么意义?
      2.3.2 每个主题有多么普遍?
      2.3.3 主题之间有什么关联?
    3. 无监督提取文档主题——LDA模型
      这个模型具体介绍、应用场景什么的就不谈了,你知道它能从一堆的文本中给你反馈出规定主题数的词语聚类就可以了。

    由于是无监督算法,意味着你不需要去准备训练集,不用去苦逼地打标签,在数据准备阶段任务量至少省掉了一半啊。

    而作为数学小白,其中具体原理如无必要我一向是不愿深究的,只要有人证明可行,那我拿来就用。聪明的脑袋要各尽其用嘛(笑

    但也许我之后始终逃不掉要学习原理吧,先把原理解释放在这里,之后需要时再看。

    故而本篇主要介绍的是如何上手实现及如何分析结果,这才是Data Scientist该干的事嘛

    1. 无监督提取文档主题——LDA模型

    1.1 准备工作

    书归正传。以本次工作为例,我需要分析爬取到500名用户每人50页微博,大概500* 50* 10=250000条微博文本的主题情况。也就是说想看看这些人的微博主要是在关心些什么,他们共同关注哪些方面。

    编程环境:
    python 3.6 + pycharm 2018,
    LDA实现使用的包是gensim,
    分词还是用我们的老朋朋朋朋友jieba.

    数据准备:
    爬到的原始数据存在csv中,我想的是将所有的微博文本分行读到一个txt中,然后分词去停用词,就达到gensim的输入标准了。

    分词前:
    在这里插入图片描述
    分词后:
    在这里插入图片描述
    【code】
    用于处理原始文本。

    def stopwordslist(filepath):
        stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
        return stopwords
    
    # 对句子进行分词
    def seg_sentence(sentence):
        sentence = re.sub(u'[0-9\.]+', u'', sentence)
        jb.add_word('光线摄影学院')		# 这里是加入用户自定义的词来补充jieba词典。
        jb.add_word('曾兰老师')			# 同样,如果你想删除哪个特定的未登录词,就先把它加上然后放进停用词表里。
        jb.add_word('网页链接')
        jb.add_word('微博视频')
        jb.add_word('发布了头条文章')
        jb.add_word('青春有你')
        jb.add_word('青你')
        sentence_seged = jb.cut(sentence.strip())
        stopwords = stopwordslist('stopWords/stopwords.txt')  # 这里加载停用词的路径
        outstr = ''
        for word in sentence_seged:
            if word not in stopwords and word.__len__()>1:
                if word != '\t':
                    outstr += word
                    outstr += " "
        return outstr
    
    
    inputs = open('input/like_mi10_user_all_retweet.txt', 'r', encoding='utf-8')
    
    outputs = open('output1/mi10_user_retweet_fc.txt', 'w',encoding='utf-8')
    for line in inputs:
        line_seg = seg_sentence(line)  # 这里的返回值是字符串
        outputs.write(line_seg + '\n')
    outputs.close()
    inputs.close()
    

    1.2 调用api实现模型

    准备数据两小时,接口调用三分钟,等待结果两小时。

    gensim很友好,词典、词袋模型、lda模型都是一句话搞定。

    【code】

    from gensim import corpora
    from gensim.models import LdaModel
    from gensim.corpora import Dictionary
    
    
    train = []
    
    fp = codecs.open('output1/mi10_user_retweet_fc.txt','r',encoding='utf8')
    for line in fp:
        if line != '':
            line = line.split()
            train.append([w for w in line])
    
    dictionary = corpora.Dictionary(train)
    
    corpus = [dictionary.doc2bow(text) for text in train]
    
    lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=20, passes=60)
    # num_topics:主题数目
    # passes:训练伦次
    # num_words:每个主题下输出的term的数目
    
    for topic in lda.print_topics(num_words = 20):
        termNumber = topic[0]
        print(topic[0], ':', sep='')
        listOfTerms = topic[1].split('+')
        for term in listOfTerms:
            listItems = term.split('*')
            print('  ', listItems[1], '(', listItems[0], ')', sep='')
    

    最后的输出是

    0:
      "北京" (0.024)
      "疫情" ( 0.021)
      "中国联通" ( 0.019)
      "领券" ( 0.019)
      "购物" ( 0.016)
      "新冠" ( 0.016)
      "专享" ( 0.012)
      "元券" ( 0.012)
      "确诊" ( 0.012)
      "上海" ( 0.011)
      "优惠" ( 0.011)
      "肺炎" ( 0.010)
      "新闻" ( 0.010)
      "病例" ( 0.010)
      "汽车"( 0.009)
    1:
      "小米" (0.133)
      "Redmi" ( 0.019)
      "新浪" ( 0.019)
      "智慧" ( 0.018)
      "雷军" ( 0.014)
      "众测" ( 0.012)
      "体验" ( 0.012)
      "智能" ( 0.012)
      "MIUI" ( 0.012)
      "电视" ( 0.012)
      "红米" ( 0.011)
      "空调" ( 0.009)
      "产品" ( 0.009)
      "品牌" ( 0.009)
      "价格"( 0.008)
    2:
      "抽奖" (0.056)
      "平台" ( 0.032)
      "评测" ( 0.022)
      "生活" ( 0.013)
      "红包" ( 0.013)
      "关注" ( 0.012)
      "这条" ( 0.012)
      "视频" ( 0.012)
      "工具" ( 0.011)
      "获得" ( 0.011)
      "有效" ( 0.011)
      "进行" ( 0.010)
      "恭喜" ( 0.010)
      "用户" ( 0.010)
      "公正"( 0.010)
     .....
    

    这种。他只会返回给你规定主题数下的多少词,每个词后面的小数可认为是这个词属于这个主题的概率,主题下所有词的概率和为1;而这个主题应该是什么,就要靠你人工后面分析来定义了。

    那,盯着这一堆冷冰冰的词语和数字,也许你能通过概率衡量出这个词和这个主题的关系,但你能看出不同主题之间的关系吗?你能看出一个词和其他主题的关系吗?

    有点困难。这时就要引出我们的LDA可视化分析工具了。

    2. LDA的可视化交互分析——pyLDAvis

    先上效果图:
    在这里插入图片描述

    2.1 安装pyLDAvis

    pip install pyldavis
    

    2.2 结合gensim调用api实现可视化

    pyLDAvis支持三种包内lda模型的直接传入:sklearn、gensim、graphlab,好像也可以自己算。这里当然紧接上文直接用gensim得到的lda模型了。
    pyLDAvis也很友好,同样一句话完成实现:

    import pyLDAvis.gensim
    
    '''插入之前的代码片段'''
    
    d=pyLDAvis.gensim.prepare(lda, corpus, dictionary)
    
    '''
    lda: 计算好的话题模型
    
    corpus: 文档词频矩阵
    
    dictionary: 词语空间
    '''
    
    pyLDAvis.show(d)		#展示在浏览器
    # pyLDAvis.displace(d) #展示在notebook的output cell中
    

    数据量很大,运行时间稍长。

    p.s. 保存结果为独立网页

    同时,如果你希望能够将这个结果保存为独立网页以便分享或放到web系统中,那么可以这样

    d=pyLDAvis.gensim.prepare(lda, corpus, dictionary)
    
    pyLDAvis.save_html(d, 'lda_pass10.html')	# 将结果保存为该html文件
    

    就不用每次都等好久时间跑结果了。。

    p.p.s. 加快prepare速度?

    是的,这个可视化过程真的很慢。。我用time来计时了,测试时为节省时间,gensim只训练一遍,耗时58s,然后等待pyLDAvis的渲染。。等了足足一个多小时吧?4200s…才终于出来了。
    然后保存为网页很快。
    在这里插入图片描述

    d=pyLDAvis.gensim.prepare(lda, corpus, dictionary, mds='mmds')
    

    酱紫。
    实际测试了,可以说,没有效果。。。。。

    同时这个选择算法的参数还可以为tsne,不同算法的区别还是看文档吧。

    2.3 如何分析pyLDAvis可视化结果

    出来的这个页面,说复杂也不复杂,左边的气泡分布是不同主题,右边就是主题内前30个特征词了。浅蓝色的表示这个词在整个文档中出现的频率(权重),深红色的表示这个词在这个主题中所占的权重。右上角可以调节一个参数λ,其作用接着往下看。
    在这里插入图片描述
    于是我们最后回答LDAvis作者开发这个工具所要解决的三个问题:

    2.3.1. 每个主题表示什么意义?

    通过鼠标悬浮在左边的气泡上,我们可以选择查看具体的某个主题。选定后,右侧面板会相应地显示出跟这个主题相关的词汇,通过总结这些词汇表达的意义,我们就可以归纳出该主题的意义。

    同时,哪个词对主题的权重更高呢?某个词语主题的相关性,就由λ参数来调节。

    如果λ接近1,那么在该主题下更频繁出现的词,跟主题更相关;
    如果λ越接近0,那么该主题下更特殊、更独有(exclusive)的词,跟主题更相关(有点TF-IDF的意思了)。
    

    所以我们可以通过调节λ的大小来改变词语跟主题的相关性,探索更加sense的主题意义。

    2.3.2 每个主题有多么普遍?

    在跑完主题建模之后,我们就可以知道每个主题出现的频率。LDAvis的作者将这个数字,用圆圈的大小来表示,同时也按顺序标号为1~n。所以气泡的大小及编号即表示主题出现的频率。
    在这里插入图片描述

    2.3.3 主题之间有什么关联?

    这里作者用多维尺度分析,提取出主成分做维度,将主题分布到这两个维度上,主题相互之间的位置远近,就表达了主题之间的接近性。气泡距离采用的是JSD距离,(应该)可认为是主题间的差异度,气泡有重叠说明这两个话题里的特征词有交叉。

    知道这些后,就是看词说话了。看看这些词应该是在说些什么东西,提炼出不同的topic来,这才是有实际应用价值的结果。若无最后的结果输出,前面所做的一切都是废纸一张。

    先总结到这里吧,抛去理论层面,应该是够用了。

    展开全文
  • 今天的主题是介绍提取文本中关键词技术(有时候业务场景是需要从海量舆情数据中提取关键词,这个时候就需要进行分词求词频来先发现高频词),介绍最为简单的一种用jieba分词后,然后统计词频,词频高的我们就理解为...

    a5fb3568013e978ae34344100bddbff7.png

    大家晚上好,我是阿涛。a080fa6dead99520c7f0b71771f6d949.gif

    今天的主题是介绍提取从文本中关键词技术(有时候业务场景是需要从海量舆情数据中提取关键词,这个时候就需要进行分词求词频来先发现高频词),介绍最为简单的一种用jieba分词后,然后统计词频,词频高的我们就理解为关键词;当然还有LDA、textrank等提取关键词的算法

    如果是多篇文档还可以再加tf-idf算法,计算关键词的"新鲜度"。

    【T】.文本关键词提取-词频统计

    【1】项目说明:

    说明:可用于提取文本中的关键词,对文本进行分词,然后统计词频,可以绘制词云图并输出词频统计结果

    过程:

        1.get_data()读取数据

        2.get_stopword()读取停用词

        3.count_keys()统计关键词并输出到csv

        4.main()进行分词、生成词云图

    【2】项目分支:

        -- 关键词提取

            --code

                文本关键词统计.py

            --data

                红楼梦.txt

            --image

                apple.png

                square.png

            --result

                词频统计结果.csv

                词云图.png

            --stopwords

                stopword.txt

    【3】栗子

    文本数据:这里我选用红楼梦来做。

    980c55ee8a46d8be879e778ea077379a.png

    先看词云图结果:(我用的背景图是apple、可以随意替换的)

    b370577a45d6fb351683760184a294b9.png

    词频统计的结果

    (如果想去掉"一个",这种无意义的词可以在stopword.txt中添加上)

    4c75fe16fa4a2488e0a627100bcc9c9d.png

    【python实现】:

    主要就是上面四个函数了

    # -*- coding: utf-8 -*-"""创建时间:2020.09.05说明:可用于提取文本中的关键词,对文本进行分词,然后统计词频,可以绘制词云图并输出词频统计结果路线:    1.get_data()读取数据    2.get_stopword()读取停用词    3.count_keys()统计关键词并输出到csv    4.main()进行分词、生成词云图    """from wordcloud import WordCloud# from wordcloud import STOPWORDS# STOPWORDS 作用是可以在 WordCloud(stopwords=add.STOPWORDS("一个"),...) 手动添加少量关键词from imageio import imreadfrom sklearn.feature_extraction.text import CountVectorizerimport jiebaimport csv# 1.获取文本内容,注意文本编码为utf-8,可调整,进行分词def get_data(text_path):    """    Parameters    ----------    text_path : str        需要分析文本的路径.    Returns    -------    contents_list : str        采用jieba分词cut算法后的分词结果文本.    """    with open(text_path,encoding='utf-8') as f:         contents = f.read()        # 使用jieba分词,获取词的列表    contents_cut = jieba.cut(contents)    contents_list = " ".join(contents_cut)    return contents_list# 2.读取停用词def get_stopword(stopwords_path):    """        Parameters    ----------    stopwords_path : str        需要添加常用停用词的路径,也可以自己再添加.    Returns    -------    stopwords : list        停用词列表.    """    f=open(stopwords_path,'r',encoding='utf8')    stopwords=[]    lines=f.readlines()    for line in lines:        line=line.strip()        stopwords.append(line)    f.close()    return stopwords# 3.统计词频并生成字典 contents_dictdef count_keys(contents_list):    """    Parameters    ----------    contents_list : str        采用jieba分词cut算法后的分词结果文本.    Returns    -------    contents_dict : dict        每一个词对应的出现频率字典.    """    # 使用CountVectorizer统计词频    cv = CountVectorizer()    contents_count = cv.fit_transform([contents_list])    # 词有哪些    list1 = cv.get_feature_names()    # 词的频率    list2 = contents_count.toarray().tolist()[0]     # 将词与频率一一对应    contents_dict = dict(zip(list1, list2))    # 输出csv文件,newline="",解决输出的csv隔行问题    with open("../result/词频统计结果.csv", 'w', newline="") as f:        writer = csv.writer(f)        for key, value in contents_dict.items():            writer.writerow([key, value])    return contents_dict# 4.主函数def main(text_path,stopwords_path,photo_name):    """    Returns    -------    contents_dict : list        返回每一个词对应的出现频率字典.    """    contents_list=get_data(text_path)    stopwords_ok=get_stopword(stopwords_path)    wc = WordCloud(stopwords=stopwords_ok, collocations=False,                    background_color="white",                    font_path=r"C:\Windows\Fonts\simhei.ttf",                   width=400, height=300, random_state=42,                    mask=imread('../image/apple.png',pilmode="RGB"))    wc.generate(contents_list)    wc.to_file("../result/"+photo_name+".png")    #生成        contents_dict=count_keys(contents_list)    print('结果已完成,见result!')    return contents_dict        if __name__=='__main__':    #参数    text_path=r"../data/红楼梦.txt"    stopwords_path=r"../stopwords/stopword.txt"    photo_name='词云图'    #运行    contents_dict=main(text_path,stopwords_path,photo_name)    #备注,词云图如果已经存在再运行不会进行更新,需要重新命名或者删除图片

    对了,如果有需要还可以打包成exe小工具。

    往期推荐阅读白话 MCMCSQL存储过程SQL窗口函数MYSQL 49问

    两道精彩的SQL练习题

    MySQL语句性能优化的建议

    End

    作者:涛网站:http://atshare.top/

    半壶水全栈工程师,好读书,甚喜之

    c363b25ac12b43a2680fb453f7c7966b.png

    展开全文
  • 单文档摘要从给定的一个文档中生成摘要,多文档摘要从给定的一组主题相关的文档中生成摘要。按照输出类型可分为抽取式摘要和生成式摘要。 摘要:意思就是从一段文本 用几句话来概括这段话的意思 方法有很多 本文只讲...

    任务简介

    文本摘要旨在将文本或文本集合转换为包含关键信息的简短摘要。文本摘要按照输入类型可分为单文档摘要和多文档摘要。单文档摘要从给定的一个文档中生成摘要,多文档摘要从给定的一组主题相关的文档中生成摘要。按照输出类型可分为抽取式摘要和生成式摘要。
    摘要:意思就是从一段文本 用几句话来概括这段话的意思

    方法有很多
    本文只讲我会的 。

    思路

    1 :将文本分词,统计一段文本的词频(当然是去除停用词之后的词频),得到{词:词频}
    2: 对文本进行分句
    3:对句子进行打分,统计这个句子中出现的每个词的词频,
    句子得分=sum(每个词的词频 )

    4.找到得分最高多的几个句子 作为摘要

    得分最高的几个句子,包含了多个高频词 ,原则上可以作为概括文本的摘要。

    算例:

    数据集:《乘风破浪的小姐姐》 的一段网文

    《乘风破浪的姐姐》现在已经播出到了第2期节目,在初舞台之后,现在大家都对姐姐们的实力是有所了解的了。在看完初舞台之后,很多观众就都清楚了哪些姐姐的实力是不错的,哪些姐姐是比较弱的了。不过呢只看了初舞台就认定姐姐们的实力是片面的了,因为小编发现在这么多“姐姐”中其实有一些姐姐是黑马选手呀。
    像是在最新一期节目中,小编就发现了一位“黑马”姐姐,而这个人是谁呢?就是王智了,在最新播出的这一期节目中,王智可是成功逆袭了,她这回成功让观众们看到了她,让导师认可了自己的实力。《浪姐》出现“黑马”姐姐,初舞台最后一名,这一期却连连被夸!说到王智,在初舞台的时候小编对她的印象是不深的。
    而在这一期节目中呢当小组在排练的时候,王智会反复跟老师强调自己是“最后一名”,这下小编采知道她原来在初舞台的时候是最后一名。王智在初舞台得到了最后一名,这打击对她来说还是挺大的,在排练的时候大家也可以看出了她的不自信。然而这回她很幸运地遇到了伊能静,在伊能静的教学下,最后她可是受到了老师的连连夸赞。
    《浪姐》出现“黑马”姐姐,初舞台最后一名,这一期却连连被夸!此次节目中姐姐们进行了一段时间的练习,就去进行评测了,而在王智这一组表演完后,最终导师们也给出了评价,在她们三个人这一组中,王智就是被夸得最多的那一个。当在看了王智这次的表演后,最后赵兆老师竟然跟她道歉了。
    赵兆老师说昨天很抱歉给她打了最低分,但是今天呢她真的让他觉得“傻”了,因为他将这首歌演唱得太好了,他觉得王智非常适合这首歌呢!一向比较严格的赵兆老师这回对王智很是赞扬,看来是被她的表演给惊喜到了。能够得到了专业的赵兆老师的赞扬,可见王智的实力那是很棒的呀。
    而在赵兆说完后,黄晓明也补充说道“真的是,你一张嘴我们都惊了,真的。”这次可以从导师们的话中了解到王智的进步真的是很大了,她这次选择了一首合适自己的歌曲,并且有认真努力地去唱好它,就将它很好地诠释了出来了!这个姐姐其实并不是没有实力,只是实力没有一开始就表现出来。她真的是一匹“黑马”了,当看了这一期节目后,现在观众们都在期待着她后面带来的惊喜了!
    
    

    代码来了
    1读取文件;
    第1,2,3行读取文件,读取后的文件格式为数组
    第5,6,7将读取的文件转换为字符串

    #读取文件
    f=open('文档练手.txt',encoding='utf-8')
    data = f.readlines()  # 直接将文件中按行读到list里,效果与方法2一样
    f.close()  # 关
    #将文件转换成字符串
    text=""
    for line in data:
        text+=line
    print(text)
    

    在这里插入图片描述
    2清洗数据:
    第1,2行导入包
    第3行去除一些类型[1]引用,本文用不上
    第4行 单个空格替换额外空格
    第5行分句
    re.split(’(。|!|!|.|?|?)’,text) 加括号则保留分句符号如。!,不加则不保留分句符号

    import re
    import jieba
    text = re.sub(r'[[0-9]*]',' ',text)#去除类似[1],[2]
    text = re.sub(r'\s+',' ',text)#用单个空格替换了所有额外的空格
    sentences = re.split('(。|!|\!|\.|?|\?)',text)#分句
    print(sentences)
    

    在这里插入图片描述
    3加载停用词

    #加载停用词
    
    def stopwordslist(filepath):
        stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]
        return stopwords
    stopwords = stopwordslist("停用词.txt")
    

    停用词.txt 样子
    在这里插入图片描述
    4统计文本词频
    第1行:创建一个空字典
    第2行:文本分词,对每个单词循环
    第3行:检查单词是否在stopwords停用词中,然后再次检查单词是否在word2count词频key中,不在则把word2count [word]置为1,否则word2count [word] 加1。
    最后对词频归一化

    #词频
    word2count = {} #line 1
    for word in jieba.cut(text): #对整个文本分词
        if word not in stopwords:
            if word not in word2count.keys():
                word2count[word] = 1
            else:
                word2count[word] += 1
    for key in word2count.keys():
        word2count[key] = word2count[key] / max(word2count.values())
    print(word2count)
    

    在这里插入图片描述
    5计算句子得分
    第1行:创建一个空字典
    第2行:对sentences中每个sentence进行循环
    第3行:将sentence分词,对每个word循环
    第4行:使用if检查word2count.keys()中是否存在该单词
    第5行:这里我指定计算句子长度小于300的那部分,你可以根据需要更改
    第6行:再次使用if-else条件,判断如果句子不存在于sentence2keys()中,则执行 sent2score [sentence] = word2count [word],否则执行 sent2score [sentence] + = word2count [word]

    #计算句子得分
    sent2score = {}
    for sentence in sentences:
        for word in jieba.cut(sentence):
            if word in word2count.keys():
                if len(sentence)<300:
                    if sentence not in sent2score.keys():
                        sent2score[sentence] = word2count[word]
                    else:
                        sent2score[sentence] += word2count[word]
    print(sent2score)
    

    在这里插入图片描述
    6 字典排序

    #字典排序
    def dic_order_value_and_get_key(dicts, count):
        # by hellojesson
        # 字典根据value排序,并且获取value排名前几的key
        final_result = []
        # 先对字典排序
        sorted_dic = sorted([(k, v) for k, v in dicts.items()], reverse=True)
        tmp_set = set()  # 定义集合 会去重元素 
        for item in sorted_dic:
            tmp_set.add(item[1])
        for list_item in sorted(tmp_set, reverse=True)[:count]:
            for dic_item in sorted_dic:
                if dic_item[1] == list_item:
                    final_result.append(dic_item[0])
        return final_result
    

    7选取句子得分最高的5句话作为摘要

    final_resul=dic_order_value_and_get_key(sent2score,5)
    print(final_resul)
    

    结果:

    ['”这次可以从导师们的话中了解到王智的进步真的是很大了,她这次选择了一首合适自己的歌曲,并且有认真努力地去唱好它,就将它很好地诠释了出来了', ' 赵兆老师说昨天很抱歉给她打了最低分,但是今天呢她真的让他觉得“傻”了,因为他将这首歌演唱得太好了,他觉得王智非常适合这首歌呢', ' 而在这一期节目中呢当小组在排练的时候,王智会反复跟老师强调自己是“最后一名”,这下小编采知道她原来在初舞台的时候是最后一名', '她真的是一匹“黑马”了,当看了这一期节目后,现在观众们都在期待着她后面带来的惊喜了', '此次节目中姐姐们进行了一段时间的练习,就去进行评测了,而在王智这一组表演完后,最终导师们也给出了评价,在她们三个人这一组中,王智就是被夸得最多的那一个']
    

    代码汇总

    #读取文件
    f=open('文档练手.txt',encoding='utf-8')
    data = f.readlines()  # 直接将文件中按行读到list里,效果与方法2一样
    f.close()  # 关
    #将文件转换成字符串
    text=""
    for line in data:
        text+=line
    
    
    #清洗数据
    import re
    import jieba
    text = re.sub(r'[[0-9]*]',' ',text)#去除类似[1],[2]
    text = re.sub(r'\s+',' ',text)#用单个空格替换了所有额外的空格
    sentences = re.split('(。|!|\!|\.|?|\?)',text)#分句
    
    
    #加载停用词
    
    def stopwordslist(filepath):
        stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]
        return stopwords
    stopwords = stopwordslist("停用词.txt")
    
    #词频
    word2count = {} #line 1
    for word in jieba.cut(text): #对整个文本分词
        if word not in stopwords:
            if word not in word2count.keys():
                word2count[word] = 1
            else:
                word2count[word] += 1
    for key in word2count.keys():
        word2count[key] = word2count[key] / max(word2count.values())
    
    
    #计算句子得分
    sent2score = {}
    for sentence in sentences:
        for word in jieba.cut(sentence):
            if word in word2count.keys():
                if len(sentence)<300:
                    if sentence not in sent2score.keys():
                        sent2score[sentence] = word2count[word]
                    else:
                        sent2score[sentence] += word2count[word]
    
    #字典排序
    def dic_order_value_and_get_key(dicts, count):
        # by hellojesson
        # 字典根据value排序,并且获取value排名前几的key
        final_result = []
        # 先对字典排序
        sorted_dic = sorted([(k, v) for k, v in dicts.items()], reverse=True)
        tmp_set = set()  # 定义集合 会去重元素 --此处存在一个问题,成绩相同的会忽略,有待改进
        for item in sorted_dic:
            tmp_set.add(item[1])
        for list_item in sorted(tmp_set, reverse=True)[:count]:
            for dic_item in sorted_dic:
                if dic_item[1] == list_item:
                    final_result.append(dic_item[0])
        return final_result
    
    #摘要输出
    final_resul=dic_order_value_and_get_key(sent2score,5)
    print(final_resul)
    
    
    

    来源 @Author: yudengwu
    进阶版摘要提取
    中文文本摘要提取,快速提取文本主要意思

    展开全文
  • 原文地址: ... 使用Python 进行简单文本类数据分析,包括: ...2. 生成语料库,tfidf加权  ...3. lda主题提取模型 4. 词向量化word2vec 参考: http://zhuanlan.zhihu.com/textmining-experience
  • 他向我询问方法,我推荐他阅读我的那篇《如何用Python从海量文本提取主题?》。看过之后,他表示很有收获,但是应用场景和他自己的需求有些区别。《如何用Python从海量文本提取主题?》一文面对的是大量的...
  • 不啰嗦,直奔主题……看看如何提取,一般使用函数提取,难度较大先看一下数据源:分别提取数字、字母和汉字方案1:传统函数公式法传统的函数方式难度较大,这里只演示一下提取数字,其他不再演示通用数字提取公式:=...
  • 我正在使用优秀的scikit-learn模块进行一些文本挖掘.我正在尝试对科学摘要进行聚类和分类.我正在寻找一种方法来聚集我的tf-id表示集,而不必事先指定簇的数量.我无法找到一个可以做到这一点的好算法,并且仍能正确处理...
  • 3.内在信息挖掘与展示(词云、关键词提取、自动摘要、文档聚类、情感分析、文章推荐…) 常见的TM分析任务 1.亚洲语言分词(及结果展示) 2.自动摘要 3.指定消解 例:他对她说它的尾巴很短 4.机器翻译 5.词性标注 6....
  • 本文一步步为你演示,如何用Python从中文文本提取关键词。...他向我询问方法,我推荐他阅读我的那篇《如何用Python从海量文本提取主题?》。看过之后,他表示很有收获,但是应用场景和他自己的...
  • lda主题提取模型 4. 词向量化word2vec 参考: http://zhuanlan.zhihu.com/textmining-experience/1963076 #!/usr/bin/env python # -*- coding:utf-8 -*- import MySQLdb import pandas as pd import pandas.io....
  • 比如,在微博的热点话题推荐那里,我们需要比较微博之间的相似度,让相似度高的微博聚集在一起形成一个簇,提出一个主题。在问答系统中,比如说人工客服,我们需要提前准备好问题和一些答案,让用户输入的问题与题库...
  • 我想从docx文件提取文本到简单的txt文件。我知道这个问题可能看起来很简单或者很琐碎(我希望会是这样),但我浏览了几十个论坛主题,花了几个小时试图自己解决,但没有找到解决办法。。。在如果我需要没有格式的内容...
  • 对齐文件是纯文本,因此注释不会是任何复杂的,最好只是用对齐文件本身中的星号替换提取的序列.我有一个脚本扫描数据库文件,提取我需要的所有序列,并将它们写入输出文件.鉴于查询,我需要读取这些序列并将它们与ASCII...
  • 本文一步步为你演示,如何用Python从中文文本提取关键词。...他向我询问方法,我推荐他阅读我的那篇《如何用Python从海量文本提取主题?》。看过之后,他表示很有收获,但是应用场景和他自己的需求有些区...
  • ·提取关键短语、命名实体和图结构,实现文本数据推断。·建立对话框架,实现聊天机器人和语言驱动交互。·用Spark扩展处理能力,用神经网络实现对更复杂模型的支持。从新闻、讲话,到社交媒体上非正式的聊天,自然...
  • 如何用Python提取中文关键词?

    万次阅读 多人点赞 2017-12-10 00:00:00
    本文一步步为你演示,如何用Python从中文文本中...)需求好友最近对自然语言处理感兴趣,因为他打算利用自动化方法从长文本提取关键词,来确定主题。他向我询问方法,我推荐他阅读我的那篇《如何用Python从海量文本
  • python读写文本文件-解决乱码问题

    千次阅读 2017-03-18 16:51:58
    python文本读写-异常处理前言最近需要处理一批日志文件,需要从中提取出一些信息,作为一名C/C++程序员,使用脚本程序初期还是比较别扭的。这里记录自己初期使用遇到的一些问题,为不偏离主题,本文仅仅讨论读取文本...
  • 紧接上篇的文档,这节学习关键字的提取,关键词——keyword,是人们快速了解文档内容,把握主题的重要内容。 #导入需要的模块 import os import codecs import pandas import jieba import jieba.analyse #搭建语料...
  • 主题提取 解决方案

    千次阅读 2017-12-14 11:48:31
    2.每个URL发送GET请求,找到HTML的正文文本提取出来。 3.清理文章文本,去除停用词和标点 二.文档向量化 使用scikit-learn的IT-IDF Vectorizer模块 三.用NMF做主题模型 非负矩阵分解(Non-...
  • 我有少量的文学文本(小说),并希望使用LDA提取一些一般性主题.我正在使用Python中的gensim模块以及一些nltk功能.对于测试,我将原始文本(仅6个)分成30个块,每个块有1000个单词.然后我将块转换为文档项矩阵并运行算法....
  • 利用Python实现中文文本关键词抽取的三种方法 文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种...
  • 将.doc或.docx作为压缩文档打开,也可以直接将后缀该为.zip(先备份好,如果改后缀的话),最后你会看到你world中的一些插曲文件和主题等信息,world/document.xml 就是文字内容说在的文本文件了,用记事本打开就可以...
  • 大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型(Topic Model)能够识别在文档里的主题,并且挖掘语料里隐藏信息,并且在主题聚合、从非结构化文本提取信息、特征...
  • 这一切的基础就是特征词提取技术了,本文主要围绕关键词提取这个主题进行介绍(英文)。不同版本python混用(官方用法)Python2 和python3 是一个神一般的存在,如何让他们共存呢,直到我用了pycharm我才知

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 146
精华内容 58
关键字:

python文本主题提取

python 订阅