J'ai créé wordcloud avec Python.

introduction

Je suis débutant, mais après avoir pratiqué Python, je veux écrire une image impressionnante dans Word Cloud! J'ai aimé ça. Notez le contenu du travail sous forme de mémorandum.

Environnement de travail

L'environnement de travail est Ubuntu18.04.4 LTS Python 3.6.9 mecab-python3 0.996.5

Veuillez lire les arguments de fichier, etc. dans le code source de cet article en fonction de votre propre environnement.

Qu'est-ce que Word Cloud

WordCloud est une méthode permettant de sélectionner plusieurs mots qui apparaissent fréquemment dans une phrase et de les afficher dans une taille en fonction de la fréquence. Il s'agit de disposer automatiquement des mots qui apparaissent fréquemment sur les pages Web et les blogs. En modifiant non seulement la taille des caractères mais également la couleur, la police et l'orientation, vous pouvez impressionner le contenu du texte en un coup d'œil. (D'après le commentaire sur Digital Daijisen)

C'est la figure du nuage de mots qui s'est finalement achevée cette fois. Le texte a été créé séparément du discours de Steve Jobs, le fondateur d'Apple, et transmis comme fichier d'entrée.

En outre, en utilisant une image de masque, la chaîne de caractères est affichée à l'intérieur du contour des logos Jobs et Apple.

Des personnages comme moi, la vie, les goûts et l'université se démarquent. Je suis content parce que personnellement je pense que c'était cool: applaudir:

wc_image_ja.png

Créer WordCloud

Voici le code source final pour créer l'image ci-dessus.

sample4wordcloud.py


#coding: utf-8
from PIL import Image
import numpy as np
from matplotlib import pyplot as plt
from wordcloud import WordCloud
import requests
import MeCab

#Fonction de création de nuage de mots(Version texte en anglais)
def create_wordcloud_en(text, image):
    fontpath = 'NotoSansCJK-Regular.ttc'
    stop_words_en = [u'am', u'is', u'of', u'and', u'the', u'to', u'it', \
                  u'for', u'in', u'as', u'or', u'are', u'be', u'this', u'that', u'will', u'there', u'was']

    wordcloud = WordCloud(background_color="white",
                          font_path=fontpath,
                          width=900,
                          height=500,
                          mask = msk,
                          contour_width=1,
                          contour_color="black",
                          stopwords=set(stop_words_en)).generate(text)

    #dessin
    plt.figure(figsize=(15,20))
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
    #sortie png
    wordcloud.to_file("wc_image_en.png ")

#Fonction de création de nuage de mots(Version texte japonais)
def create_wordcloud_ja(text, image):
    fontpath = 'NotoSansCJK-Regular.ttc'
    stop_words_ja = ['chose', 'chose', 'Quand', 'alors', 'Etc.', 'cette', 'Yo', 'cetteら', 'Il', 'tout']
    #Analyse morphologique
    tagger = MeCab.Tagger() 
    tagger.parse('') 
    node = tagger.parseToNode(text)

    word_list = []
    while node:
        word_type = node.feature.split(',')[0]
        word_surf = node.surface.split(',')[0]
        if word_type == 'nom' and word_surf not in stop_words_ja:
            word_list.append(node.surface)
        node = node.next

    word_chain = ' '.join(word_list)
    wordcloud = WordCloud(background_color="white",
                          font_path=fontpath,
                          width=900,
                          height=500,
                          mask = msk,
                          contour_width=1,
                          contour_color="black",
                          stopwords=set(stop_words_ja)).generate(word_chain)

    #dessin
    plt.figure(figsize=(15,20))
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
    wordcloud.to_file("wc_image_ja.png ")


#Appel des fichiers requis
#Lecture de texte
with open('jobs.txt', 'r', encoding='utf-8') as fi:
    text = fi.read()
#Chargement de l'image de masque à utiliser
msk = np.array(Image.open("apple.png "))

create_wordcloud_ja(text, msk)

Deux fonctions pour créer un nuage de mots sont définies, une pour le texte japonais et une pour le texte anglais. J'ai écrit un code similaire, donc je suis sûr que c'est plus intelligent ici ... Dois-je écrire en utilisant la classe?

À propos du code source

La méthode de traitement avant de dessiner un nuage de mots est différente entre le texte anglais et le texte japonais.

En anglais, comme "I like Apple.", Chaque mot est séparé par un espace, donc lorsque vous le divisez en parties, vous ne perdez pas de vue la division. Cependant, dans le cas du japonais, la division n'est pas claire comme «j'aime Apple».

Par conséquent, dans le cas du japonais, il est nécessaire d'effectuer une analyse morphologique afin de séparer les chaînes de caractères. Cette fois, une analyse morphologique a été réalisée à l'aide de MeCab.

Une explication approximative du code pour l'analyse morphologique

sample.py


    tagger = MeCab.Tagger()
    tagger.parse('') 
    node = tagger.parseToNode(text) 

    word_list = []
    while node:
        word_type = node.feature.split(',')[0]
        word_surf = node.surface.split(',')[0]
        if word_type == 'nom' and word_surf not in stop_words_ja:
            word_list.append(node.surface)
        node = node.next

Ce qui précède est la partie où l'analyse morphologique est effectuée.

tagger = MeCab.Tagger()

Réglage du mode de sortie. Le mode de sortie change lorsque le paramètre d'argument est modifié.

Tous les arguments commencent par O et c'est mignon (rires)

tagger.parse('')

Je ne comprends pas vraiment cette partie, Vous pouvez éviter UnicodeDecodeError en écrivant ceci avant de passer les données à l'analyseur ...

node = tagger.parseToNode(text)

Remplacez le résultat de l'analyse par une surface (mot) et une fonction (informations sur la pièce) pour le nœud. Vous pouvez accéder à chacun en écrivant node.surface ou node.feature.

    word_list = []
    while node:
        word_type = node.feature.split(',')[0]
        word_surf = node.surface.split(',')[0]
        if word_type == 'nom' and word_surf not in stop_words_ja:
            word_list.append(node.surface)
        node = node.next

    word_chain = ' '.join(word_list)

Lisez chaque nœud dans l'ordre et ajoutez les mots de partie qui sont nomenclature et qui ne sont pas dans stop_words_ja à word_list.

Ensuite, laissez le délimiteur vide et convertissez la liste en chaîne pour obtenir word_chain.

Figure avant la modification de la source

En fait, la première image que j'ai dessinée était sortie de toute la nomenclature sans définir de caractères cachés. Alors ça ressemble à ça ...

image.png

Dans cette figure, les chaînes de caractères telles que «koto», «it» et «yo» qui ne sont pas intéressantes même si elles sont trop affichées se démarquent.

C'est quelque chose ...: froncer les sourcils2:

J'ai donc créé une liste de mots que je ne souhaite pas afficher et j'ai essayé de ne pas afficher les chaînes de caractères que je ne souhaite pas afficher.

finalement

J'ai essayé de toucher Python après un long moment. Après tout, c'est amusant ~: détendu: Ensuite, je pense à gratter SNS et à jouer avec. Si vous avez des erreurs ou des conseils dans le contenu de cet article, veuillez nous en informer.

Articles référencés / articles liés

https://sleepless-se.net/2018/08/24/python-mecab-wakatigaki/

https://qiita.com/furipon308/items/be97abf25cf4caa0574e

https://qiita.com/yonedaco/items/27e1ad19132c9f1c9180

https://analysis-navi.com/?p=2295

Recommended Posts

J'ai créé wordcloud avec Python.
J'ai fait un blackjack avec du python!
J'ai fait un blackjack avec Python.
J'ai fait une loterie avec Python.
J'ai joué avec wordcloud!
J'ai fait un compteur de caractères avec Python
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait un simulateur de neurones avec Python
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai fait un texte Python
J'ai essayé gRPC avec Python
J'ai créé COVID19_simulator avec JupyterLab
J'ai créé Word2Vec avec Pytorch
Othello fait avec python (comme GUI)
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une application de notification de nouvelles en ligne avec Python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
J'ai essayé de faire LINE BOT avec Python et Heroku
Bases de SNS Python faites avec Flask
J'ai fait un Line-bot avec Python!
pyenv-vertualenv n'installe pas correctement la série python3
J'ai essayé webScraping avec python.
J'ai créé ma propre bibliothèque Python
Numer0n avec des objets fabriqués avec Python
J'ai envoyé un SMS avec Python
Développement de jeux Othello avec Python
J'ai aimé le tweet avec python. ..
J'ai joué avec PyQt5 et Python3
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
Quand j'ai rendu CaboCha disponible en python3, je suis resté bloqué (Windows 10)
J'ai fait un jeu de frappe simple avec tkinter de Python
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
[Je l'ai fait avec Python] Outil pour la sortie par lots de données XML
Jeu de vie avec Python [je l'ai fait] (sur terminal et Tkinter)
FizzBuzz en Python3
Grattage avec Python
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
J'ai fait un package qui peut comparer des analyseurs morphologiques avec Python
Créez wordcloud à partir de votre tweet avec python3
Statistiques avec python
J'ai fait Othello pour enseigner Python3 aux enfants (4)
J'ai fait un programme de gestion de la paie en Python!
Client API Slack simple réalisé avec Python
Grattage avec Python
Python avec Go
J'ai dessiné une carte thermique avec Seaborn [Python]
Twilio avec Python