J'ai essayé de résumer les remarques de tout le monde sur le slack avec wordcloud (Python)

Ceci est un article 12/8 de jsys19AdventCalender (https://adventar.org/calendars/4301).

introduction

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!".

J'ai analysé et résumé les propos de tout le monde dans le mou

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 wc1.png 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?"

Faire une phrase à passer à wordcloud

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)

Sortie d'image avec wordcloud

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. jsys.jpeg

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,,

Achevée!

これ.png

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.

Page Web référencée

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

J'ai essayé de résumer les remarques de tout le monde sur le slack avec wordcloud (Python)
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
J'ai essayé de résumer la gestion des exceptions Python
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
Publiez sur Slack avec Python 3
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
Je veux AWS Lambda avec Python sur Mac!
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé de résumer SparseMatrix
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai créé wordcloud avec Python.
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
[IPdb] Les débutants en développement Web ont tenté de résumer le débogage avec Python
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé de toucher Python (installation)
J'ai essayé webScraping avec python.
Je veux déboguer avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de visualiser les signets volant vers Slack avec Doc2Vec et PCA
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de résumer ce qui était sorti avec Qiita avec Word cloud
J'ai essayé de savoir si ReDoS est possible avec Python
J'ai essayé d'afficher l'interface graphique sur Mac avec le système X Window
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé ChatOps avec Slack x API Gateway x Lambda (Python) x RDS