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.
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.
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:
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?
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.
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.
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 ...
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.
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.
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