Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.

Dies ist ein 12/8-Artikel von jsys19AdventCalender (https://adventar.org/calendars/4301).

Einführung

Dies ist das erste Mal, dass ich meinen Code zusammen mit dem Text sende, und obwohl es sich um einen schlechten Text und Code handelt, würde ich es begrüßen, wenn Sie ein Auge darauf haben und mir sagen könnten, ob es etwas gibt, von dem Sie denken, dass dies der richtige Weg ist.

Ich analysierte und fasste die Bemerkungen aller zusammen

Wissen Sie alle plötzlich, was eine Wortwolke ist?

Eine Methode zum Auswählen mehrerer Wörter, die häufig in einem Satz vorkommen, und Anzeigen in einer Größe entsprechend der Häufigkeit. Es bezieht sich auf das automatische Anordnen von Wörtern, die häufig auf Webseiten und Blogs erscheinen. Indem Sie nicht nur die Größe der Zeichen, sondern auch Farbe, Schriftart und Ausrichtung ändern, können Sie den Inhalt des Textes auf einen Blick beeindrucken. 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

Es sieht so aus, das tatsächliche ist wie das Bild unten wc1.png Dies ist ein Bild der Github-Seite von Typoskript-Eslint über der Wortwolke.

Ich habe diese Art des Ausdrucks von Wörtern schon ein wenig Spaß im Internet gesehen und dachte: "Macht es nicht Spaß, dies im Slack Log zu tun?" Und schrieb einen Artikel.

Machen Sie einen Satz, der an wordcloud übergeben werden soll

wordcloud kann nur durch Leerzeichen getrennte Wörter empfangen. Die Bemerkungen aller sind nicht so, deshalb werde ich MeCab verwenden, um eine Notiz zu schreiben. Vorher habe ich alle Bemerkungen zusammengestellt.

Zuerst erhalten wir vom Direktor des Arbeitsbereichseigners ein Archiv aller Bemerkungen von Slack und versuchen, die Sätze zu extrahieren. Wenn Sie die Datei öffnen, gibt es für jeden Kanal einen Ordner, in dem Informationen wie der Absender und die Reaktion der Bemerkung im JSON-Format gespeichert sind. (Zu diesem Zeitpunkt ist es einfacher, den Ordner des Kanals zu löschen, in dem der Bot häufig sagt)

ex-2020-6-31.json


[
    {
        "client_msg_id": "hoge",
        "type": "message",
        "text": "Ich wurde ein 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
        },
    }
]

Unten finden Sie den Code zum Scannen aller JSON-Dateien im Archivordner und zum Einfügen des Inhalts der Texteigenschaft, die die Anweisung angibt, in eine 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

Ich füge den Pfad des Ordners, den ich einchecken möchte, in Path () ein, mache ihn zu einem Pfadobjekt und übergebe "*** / **. Json" an glob (), um nach einer json-Datei zu suchen.

pa_th=Path("src/jsys_archive")
dirs=list(pa_th.glob("**/*.json"))

Und alle Bemerkungen werden mit nicht reinem Textrauschen wie Daten gemischt und erwähnen Informationen, die in verschiedenen Lücken verarbeitet werden, die in <> enthalten sind, Reaktionsinformationen, die in :: enthalten sind. Wenn diese ebenfalls enthalten sind, besteht die Ausgabewortwolke nur aus Systemnachrichten, sodass Zeichenfolgenoperationen mit regulären Ausdrücken ausgeführt werden.

json_text_fixed = re.sub("<.*?>|:.*?:","",json_text[j]["text"])
#<>, Oder::Und löschen Sie den Text darin

Jetzt sind alle Bemerkungen in der Variablen main_text (riesig) zusammengefasst. Der Rest geht an MeCab.

wordcloud kann nur durch Leerzeichen getrennt empfangen werden. Die Bemerkungen aller sind nicht so, deshalb werde ich MeCab verwenden, um eine Notiz zu schreiben.

Mach das.

import MeCab
words = MeCab.Tagger("-Owakati")
nodes = words.parseToNode(main_text)
s = []
while nodes:
    if nodes.feature[:2] == "Substantiv":
        s.append(nodes.surface)
    nodes = nodes.next

Geben Sie dazu `" -Owakati "` `MeCab.Tagger ()` und teilen Sie es. Das Tagger-Objekt kann hauptsächlich die folgenden vier Argumente annehmen.

1, "mecabrc" (kein Argument) 2, "-Ochasen" (ChaSen-kompatibles Format) 3, "-Owakati" (Ausgabeteilung) ← 4, "-Oyomi" (Ausgangsablesung) Dieses Mal werden wir 3 "Share" verwenden ~~ (MeCabs Argument wie Japanisch ist interessant, aber ich nenne es keine Aktie) ~~

Als nächstes hat das von `(Tagger-Instanz) .parseToNode (" string ")` `analysierte und zurückgegebene Node-Objekt zwei Eigenschaften,` .surface und `` `.feature. es gibt. Die Oberfläche enthält die Zeichenfolgendaten des Node-Objekts, und das Feature enthält [Teil Teil, Teil Teil Klassifizierung 1, Teil Teil Klassifizierung 2, Teil Teil Klassifizierung 3, Verwendungsform, Verwendungstyp, Prototyp, Lesen, Aussprache]. Unten finden Sie ein Beispielprogramm.

feature_example



import MeCab
mecab = MeCab.Tagger()
nodes = mecab.parseToNode("Büro für Informationsmediensysteme")
while nodes:
    print(nodes.feature)
    nodes = nodes.next

↓ Ausführungsergebnis

Substantiv,Allgemeines,*,*,*,*,Information,Jouhou,Joe Ho
Substantiv,Allgemeines,*,*,*,*,Medien,Medien,Medien
Substantiv,Allgemeines,*,*,*,*,System,System,System
Substantiv,Suffix,Allgemeines,*,*,*,Bahnhof,Kyoku,Kyoku

In der Abbildung muss nur die Nomenklatur angezeigt werden. Übergeben Sie daher nur die Nomenklatur mit if und fügen Sie die Zeichenfolgendaten zur vorbereiteten leeren Liste hinzu. Anschließend wird die abgeschlossene Liste in eine durch Leerzeichen mit halber Breite getrennte Zeichenfolge konvertiert und die Vorbereitung abgeschlossen.

s = []
while nodes:
    if nodes.feature[:2] == "Substantiv":
        s.append(nodes.surface)
    nodes = nodes.next
parsed_main_text = " ".join(s)

Bildausgabe mit Wordcloud

Schließlich können Sie ein Bild machen. wc = wordcloud()Erstellen Sie ein Wordcloud-Objekt, indem Sie verschiedene Bilder einstellen. Ich denke, dass die Höhe, Breite, Hintergrundfarbe usw., die die Höhe und Breite des Bildes festlegen, stilisiert und leicht zu verstehen sind. Es gibt verschiedene andere Dinge, wie die Kollokation, um das Erscheinen desselben Wortes zu vermeiden, Stoppwörter, um Wörter festzulegen, die nicht angezeigt werden sollen. Dieses Mal werden jedoch nur die hier verwendeten verwendet. Die Maske, die die Form des Ausgabebildes bestimmt, wird später beschrieben.

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={"Ding","Dies","Zum","Es","Apropos",
                          "Yo","Von","Herr.","aber","Ding","damit"},
                font_path="/System/Library/Fonts/Hiragino Kaku Gothic W6.ttc")

Die erste Zeile bestimmt die Form des Bildes. Diesmal habe ich das Bild unten verwendet. Ich mag die Schrift, aber ich benutze Impact. jsys.jpeg

Dadurch werden die Wortwolkenzeichen nur im jsys-Zeichenteil dieses Bildes platziert.

Übergeben Sie den zuvor erstellten parsed_main_text an wc.generate (), um das Bild zu generieren, und speichern Sie es als wc.to_file ("Dateiname").

wc.generate(parsed_main_text)
wc.to_file('jsys_wordcloud.png')

Dies ist endlich abgeschlossen. Es war lang,,

Komplett!

これ.png

Ist es gut? (Selbstlob) Hast du das gesagt Ich bin sicher, dass es einige Bemerkungen gibt, die ich denke, aber ich denke, es gibt solche Bemerkungen. Persönlich ist es interessant, dass "Anfrage" und "Okay" größer werden. Ich bin froh, dass auch der Organisationsname jsys herauskam.

Referenzierte Webseite

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

Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Post to Slack mit Python 3
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich möchte Lambda mit Python auf Mac AWS!
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, SparseMatrix zusammenzufassen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe Wordcloud mit Python gemacht.
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
[IPdb] Anfänger in der Webentwicklung haben versucht, das Debuggen mit Python zusammenzufassen
Mayungos Python Learning Episode 3: Ich habe versucht, Zahlen zu drucken
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, Python zu berühren (Installation)
Ich habe versucht, WebScraping mit Python.
Ich möchte mit Python debuggen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Lesezeichen zu visualisieren, die mit Doc2Vec und PCA nach Slack fliegen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Ich habe versucht herauszufinden, ob ReDoS mit Python möglich ist
Ich habe versucht, die GUI auf einem Mac mit X Window System anzuzeigen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe ChatOps mit Slack x API Gateway x Lambda (Python) x RDS ausprobiert