RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 793660
Accepted
MaxU - stop genocide of UA
MaxU - stop genocide of UA
Asked:2020-03-05 08:05:02 +0000 UTC2020-03-05 08:05:02 +0000 UTC 2020-03-05 08:05:02 +0000 UTC

文本中单词频率特征的可视化

  • 772

在对自然文本进行分类时,出现了一个问题,即如何在有和没有文本规范化的情况下直观地显示文本的频率特征。

首先想到的是条形图,但不可能超过 20-30 个单词——一切都太小而且难以理解。

通过规范化,我的意思是将词带入它们的正常(规范)形式。

我尝试以答案的形式找到解决方案,但看看其他解决方案和想法会很有趣。

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MaxU - stop genocide of UA
    2020-03-05T08:05:02Z2020-03-05T08:05:02Z

    在使用NLTK和pymorphy2对文本进行标记和规范化之后,我决定使用WordCloud (c) Andreas Mueller。

    示例(下面的代码):

    安东·契诃夫。全集和信件 - ModernLib.Ru.txt: 在此处输入图像描述

    普希金亚历山大。完整的诗集-royallib.ru.txt: 在此处输入图像描述

    编码:

    import os
    import requests
    from operator import attrgetter
    from pathlib import Path
    #import pandas as pd
    import nltk
    from nltk import sent_tokenize, word_tokenize, regexp_tokenize
    from nltk.corpus import stopwords
    import pymorphy2
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    
    
    # https://raw.githubusercontent.com/stopwords-iso/stopwords-ru/master/stopwords-ru.txt
    def read_stopwords(path='./stopwords-ru.txt', encoding='utf-8'):
        stopwords_en = stopwords.words('english')
        with open(path, encoding=encoding) as f:
            stopwords_ru = f.read().split('\n')
        return set(stopwords_ru) | set(stopwords_en)
    
    
    def normalize_tokens(tokens):
        morph = pymorphy2.MorphAnalyzer()
        return [morph.parse(tok)[0].normal_form for tok in tokens]
    
    
    def remove_stopwords(tokens, stopwords=None, min_length=4):
        if not stopwords:
            return tokens
        stopwords = set(stopwords)
        tokens = [tok
                  for tok in tokens
                  if tok not in stopwords and len(tok) >= min_length]
        return tokens
    
    
    def plot_word_cloud(text, picture_fn='out.png', stopwords=None,
                        normalize=True, regexp=r'(?u)\b\w{4,}\b', **wc_kwargs):
        words = [w for sent in sent_tokenize(text)
                 for w in regexp_tokenize(sent, regexp)]
        if normalize:
            words = normalize_tokens(words)
        if stopwords:
            words = remove_stopwords(words, stopwords)
        wc = WordCloud(**wc_kwargs).generate(' '.join(words))
        plt.figure(figsize=(12,10))
        plt.imshow(wc, interpolation="bilinear")
        plt.axis("off")
        plt.savefig(picture_fn)
    
    def get_text(url, encoding='utf-8', to_lower=True):
        url = str(url)
        if url.startswith('http'):
            r = requests.get(url)
            if not r.ok:
                r.raise_for_status()
            return r.text.lower() if to_lower else r.text
        elif os.path.exists(url):
            with open(url, encoding=encoding) as f:
                return f.read().lower() if to_lower else f.read()
        else:
            raise Exception('parameter [url] can be either URL or a filename')
    
    
    stopwords_ru = read_stopwords('./stopwords-ru.txt')
    
    # Понедельник начинается в субботу
    url='https://www.e-reading.club/txt.php/55060/%D0%A1%D1%82%D1%80%D1%83%D0%B3%D0%B0%D1%86%D0%BA%D0%B8%D0%B9_-_%D0%9F%D0%BE%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA_%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D0%B5%D1%82%D1%81%D1%8F_%D0%B2_%D1%81%D1%83%D0%B1%D0%B1%D0%BE%D1%82%D1%83.txt'
    text = get_text(url)
    plot_word_cloud(text, 'ponedelnik_norm.png', stopwords=stopwords_ru, max_words=100,
                    background_color='black', normalize=True)
    
    # Пушкин Александр. Полное собрание стихотворений - royallib.ru.txt
    url='./Пушкин Александр. Полное собрание стихотворений - royallib.ru.txt'
    text = get_text(url, encoding='cp1251')
    plot_word_cloud(text, 'pushkin_norm.png', stopwords=stopwords_ru, max_words=100,
                    background_color='black', normalize=True)
    
    # Чехов Антон. Полное собрание сочинений и писем - ModernLib.Ru.txt
    url = './Чехов Антон. Полное собрание сочинений и писем - ModernLib.Ru.txt'
    text = get_text(url, encoding='cp1251')
    plot_word_cloud(text, 'chekhov_norm.png', stopwords=stopwords_ru, max_words=100,
                    background_color='black', normalize=True)
    
    • 7

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5