Dies ist ein 12/8-Artikel von jsys19AdventCalender (https://adventar.org/calendars/4301).
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.
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 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.
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)
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.
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,,
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.
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