Ceci est un article 12/8 de jsys19AdventCalender (https://adventar.org/calendars/4301).
C'est la première fois que j'envoie mon code avec le texte, et bien que ce soit un texte et un code médiocres, j'apprécierais que vous puissiez garder un œil dessus et me dire s'il y a quelque chose que vous pensez "c'est la voie à suivre!".
Soudainement, savez-vous tous ce qu'est un nuage de mots?
Une méthode de sélection de 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. https://kotobank.jp/word/%E3%83%AF%E3%83%BC%E3%83%89%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89-674221
Cela ressemble à ceci, le vrai est comme l'image ci-dessous Ceci est une image de la page github de typescript-eslint sur le nuage de mot.
J'ai déjà vu cette méthode pour exprimer des mots de manière un peu intéressante sur le net auparavant, et je me suis dit: "N'est-il pas intéressant de faire cela avec le journal de relâche?"
wordcloud ne peut recevoir que des mots séparés par un espace. Les remarques de tout le monde ne sont pas comme ça, donc j'utiliserai MeCab pour écrire une note. Avant cela, j'ai fait le travail de rassembler toutes les remarques.
Tout d'abord, nous allons obtenir une archive des remarques de chacun de Slack du directeur du propriétaire de l'espace de travail et essayer d'extraire les phrases. Lorsque vous ouvrez le fichier, il existe un dossier pour chaque canal, dans lequel des informations telles que l'expéditeur et la réaction de la remarque sont stockées au format json. (À ce stade, il est plus facile de supprimer le dossier du canal qui contient beaucoup de remarques de bot)
ex-2020-6-31.json
[
{
"client_msg_id": "hoge",
"type": "message",
"text": "Je suis devenu un hatachi",
"user": "hogee",
"ts": "hooge",
"team": "foo",
"user_team": "foo",
"source_team": "foo",
"user_profile": {
"avatar_hash": "bar",
"image_72": "https:\/\/avatars.slack-edge.com\/ore.png ",
"first_name": "Murakami",
"real_name": "Murakami ore",
"display_name": "Murakami",
"team": "piyo",
"name": "s31051315",
"is_restricted": false,
"is_ultra_restricted": false
},
}
]
Vous trouverez ci-dessous le code pour analyser tous les fichiers json dans le dossier d'archive et placer le contenu de la propriété text qui indique l'instruction dans une variable.
from pathlib import Path
import glob
import json
import re
main_text = ""
json_path=Path("src/jsys_archive")
dirs=list(json_path.glob("**/*.json"))
for i in dirs:
json_open = open(i)
json_text = json.load(json_open)
json_dicts = len(json_text)
for j in range(json_dicts):
json_text_fixed = re.sub("<.*?>|:.*?:","",json_text[j]["text"])
main_text += json_text_fixed
Je mets le chemin du dossier que je veux vérifier dans Path () et en fait un objet de chemin, et passe "*** / **. Json" à glob () pour rechercher n'importe quel fichier json.
pa_th=Path("src/jsys_archive")
dirs=list(pa_th.glob("**/*.json"))
Et les remarques de tout le monde sont mélangées avec du bruit de texte non pur comme des données et mentionnent des informations qui seront traitées sur divers slacks inclus dans <>, des informations de réaction incluses dans ::. Si ceux-ci sont également inclus, le nuage de mots de sortie ne sera que des messages système, nous manipulons donc des chaînes de caractères à l'aide d'expressions régulières.
json_text_fixed = re.sub("<.*?>|:.*?:","",json_text[j]["text"])
#<>, Ou::Et efface le texte à l'intérieur
Désormais, les remarques de chacun sont regroupées dans la variable main_text (énorme). Le reste va à MeCab.
wordcloud ne peut être reçu que séparés par un espace. Les remarques de tout le monde ne sont pas comme ça, donc j'utiliserai MeCab pour écrire une note.
Faites ceci.
import MeCab
words = MeCab.Tagger("-Owakati")
nodes = words.parseToNode(main_text)
s = []
while nodes:
if nodes.feature[:2] == "nom":
s.append(nodes.surface)
nodes = nodes.next
Pour ce faire, donnez
-Owakati '' à
`` MeCab.Tagger () '' et partagez-le. L'objet Tagger peut principalement prendre les quatre arguments suivants.
1, "mecabrc" (aucun argument) 2, "-Ochasen" (format compatible ChaSen) 3, "-Owakati" (division de sortie) ← 4, "-Oyomi" (lecture de sortie) Cette fois, nous utiliserons 3 "Partager" ~~ (L'argument de MeCab à la japonaise est intéressant, mais je ne l'appelle pas un partage) ~~
Ensuite, l'objet Node analysé et renvoyé par
(instance de Tagger) .parseToNode ("string")
a deux propriétés, `.surface``` et`
.feature```. il y a.
La surface contient les données de chaîne de caractères de l'objet Node et la fonction contient [partie de pièce, classification de pièce de pièce 1, classification de pièce de pièce 2, classification de pièce de pièce 3, formulaire d'utilisation, type d'utilisation, prototype, lecture, prononciation].
Voici un exemple de programme.
feature_example
import MeCab
mecab = MeCab.Tagger()
nodes = mecab.parseToNode("Bureau du système des médias d'information")
while nodes:
print(nodes.feature)
nodes = nodes.next
↓ Résultat de l'exécution
nom,Général,*,*,*,*,information,Jouhou,Joe Ho
nom,Général,*,*,*,*,médias,médias,médias
nom,Général,*,*,*,*,système,système,système
nom,suffixe,Général,*,*,*,Station,Kyoku,Kyoku
Seule la nomenclature doit être affichée dans la figure, alors ne transmettez que la nomenclature avec if et ajoutez les données de chaîne de caractères à la liste vide préparée. Ensuite, la liste terminée est convertie en une chaîne de caractères séparée par des espaces demi-largeur, et la préparation est enfin terminée.
s = []
while nodes:
if nodes.feature[:2] == "nom":
s.append(nodes.surface)
nodes = nodes.next
parsed_main_text = " ".join(s)
Enfin, vous pouvez créer une image.
wc = wordcloud()
Créez un objet wordcloud en définissant diverses images dans.
Je pense que la hauteur, la largeur, la couleur de fond, etc. qui définissent la hauteur et la largeur de l'image sont stylisées et faciles à comprendre. Il existe diverses autres choses comme la collocation pour éviter l'apparition du même mot, des mots vides pour définir des mots que vous ne voulez pas faire apparaître, mais cette fois nous n'utiliserons que ceux qui sont ici.
Le masque qui détermine la forme de l'image de sortie sera décrit plus loin.
import numpy
from PIL import Image
from wordcloud import WordCloud
mask_jsys = numpy.array(Image.open("jsys.jpeg "))
wc = WordCloud(width=1200, height=800,
background_color="black",
collocations = False,
mask=mask_jsys,
stopwords={"chose","cette","Pour","Il","Au fait",
"Yo","De","M.","mais","chose","alors"},
font_path="/System/Library/Fonts/Hiragino Kaku Gothic W6.ttc")
La première ligne détermine la forme de l'image. Cette fois, j'ai utilisé l'image ci-dessous. J'aime la police, mais j'utilise Impact.
Cela placera les caractères du nuage de mots uniquement dans la partie caractère jsys de cette image.
Passez le parsed_main_text créé précédemment à wc.generate () pour générer l'image et enregistrez-le sous wc.to_file ("nom de fichier").
wc.generate(parsed_main_text)
wc.to_file('jsys_wordcloud.png')
C'est enfin terminé. C'était long,,
Est-ce bien? (Auto-louange) Avez-vous dit cela? Je suis sûr qu'il y a des remarques auxquelles je pense, mais je pense qu'il y a des remarques comme celles-ci. Personnellement, il est intéressant que «demande» et «d'accord» deviennent plus gros. Je suis heureux que le nom de l'organisation jsys soit également sorti.
https://oku.edu.mie-u.ac.jp/~okumura/python/wordcloud.html https://qiita.com/sea_ship/items/7c8811b5cf37d700adc4 https://www.pynote.info/entry/python-wordcloud#%E3%83%9E%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B https://takaxtech.com/2018/11/03/article271/ https://qiita.com/amowwee/items/e63b3610ea750f7dba1b
Recommended Posts