[PYTHON] Ich habe versucht, die Lesezeichen zu visualisieren, die mit Doc2Vec und PCA nach Slack fliegen

Dies ist der Artikel am 11. Tag des Adventskalenders.

das ist

Eine verteilte Darstellung der Artikeltitel, die von allen (4 Personen) mit Lesezeichen versehen und visualisiert wurden

Wenn ich es mit einem Lesezeichen versehen habe, nimmt IFTTT es auf und spuckt es aus, damit es nachlässt, sodass ich es von dort aus verarbeiten kann

Voraussetzungen

--Umgebung

Referenzen / verwendet

  1. [Jobwechsel-Meeting] Versuchen Sie, Unternehmen zu klassifizieren, indem Sie Mundpropaganda in natürlicher Sprache mit word2vec verarbeiten.
  2. [word2vec] Lassen Sie uns das Ergebnis der Verarbeitung von Unternehmensbewertungen in natürlicher Sprache visualisieren
  3. [Japanisches Memorandum zur Vorverarbeitung durch Python](https://datumstudio.jp/blog/python%E3%81%AB%E3%82%88%E3%82%8B%E6%97%A5%E6% 9C% AC% E8% AA% 9E% E5% 89% 8D% E5% 87% A6% E7% 90% 86% E5% 82% 99% E5% BF% 98% E9% 8C% B2)
  4. Einfache Sicherung des Slack-Chat-Protokolls
  5. models.doc2vec(gensim)
  6. slack-dump
  7. slack api

Was du tun kannst

Prognose bevor Sie es tun

Ergebnis

Reichweite und Überlappung liegen intuitiv nahe an den Erwartungen

スクリーンショット 2019-12-11 19.16.44.png

Vorbereitung

So lassen Sie IFTTT Hatena-Lesezeichen in Slack veröffentlichen

Verfahren

Ich werde die Details weglassen, aber der Mechanismus selbst wird durch den Fluss der folgenden Abbildung vervollständigt, aber es ist notwendig, die URL einzugeben, um den RSS-Feed zwischen dem 4. und 5. Frame zu erhalten, diesmal ist es ein Hatena-Lesezeichen, also http: //b.hatena .ne.jp / <Benutzername> / rss

So was

Grund

Soll ich Benutzer in Hatena mögen?

Das ist nicht schlecht (vielmehr können Sie beides tun), aber Sie können sich gerne in der Community dazu äußern.

IMG_52CF406E5EED-1.jpeg
Soll ich den Slack-Befehl / Feed verwenden?

Sie können den Beitrag so anpassen, dass Sie ihn zum Spaß wie diesmal verwenden können. Die Verwendung des Befehls "Slack" nimmt viel Platz in Anspruch, was ein Problem darstellt

Erhalten Sie gepostete Nachrichten von Slack

Diese beiden Typen scheinen einfach zu sein

  1. Slack API
    • https://api.slack.com/methods/channels.history
  2. Go Tool (diesmal)
    • https://github.com/joefitzgerald/slack-dump

Du brauchst sowieso ein Token, also hol es dir von hier

$ wget https://github.com/PyYoshi/slack-dump/releases/download/v1.1.3/slack-dump-v1.1.3-linux-386.tar.gz
$ tar -zxvf slack-dump-v1.1.3-linux-386.tar.gz
$ linux-386/slack-dump -t=<token> <channel>

Nehmen Sie es mit DM und bringen Sie es an einen anderen Ort, da es ein Hindernis ist

python


import zipfile, os

os.mkdir('dumps')
with zipfile.ZipFile('./zipfile_name') as z:
    for n in z.namelist():
        if 'channel_name' in n:
            z.extract(n, './dumps')

Öffnen Sie die Datei und erhalten Sie den Inhalt, da es nach Datum ist, machen Sie alle eins

python


import json, glob

posts = []
files = glob.glob('./dumps/channel/<channel_name>/*.json'.format(dirname))
for file in files:
    with open(file) as f:
        posts += json.loads(f.read())

Extrahieren Sie die Nachricht und verknüpfen Sie den Artikeltitel mit dem Benutzernamen (dieser Bereich hängt von den Einstellungen in IFTTT ab).

python


user_post_dic = {
    'Y': [],
    'S': [],
    'M': [],
    'R': [],
}

for p in posts:
    if "username" not in p or p["username"] != "IFTTT":
        continue
    for a in p["attachments"]:
        #Sonstige Vermeidung
        try:
            user_post_dic[a["text"]].append(a["title"])
        except:
            pass
        
users = user_post_dic.keys()
print([[u, len(user_post_dic[u])] for u in users])

Ausgabe


[['Y', 864], ['S', 896], ['M', 240], ['R', 79]]

Hauptgeschichte

Vorverarbeitung

Reinigen und schreiben

Die gepostete Nachricht sieht folgendermaßen aus und der Site-Titel und die URL sind nicht erforderlich. Löschen Sie sie daher

Verwenden Sie Neodim im Textbereich Ihres Browsers<http://Developers.IO|Developers.IO>

Sicherheitsmaßnahmen für Front-End-Ingenieure/ #frontkansai 2019 - Speaker Deck

Japanisch mit Matplotlib

Wiedereinführung in modernes JavaScript/ Re-introduction to Modern JavaScript - Speaker Deck

Ich wusste nicht, wie man "re" benutzt, also habe ich es geschoben. Darüber hinaus schreibt es auch in MeCab, und obwohl die Umgebung Sudapipy usw. enthält, ist es schnell, etwas zu verwenden, das der Hand vertraut ist.

python


import MeCab, re
m = MeCab.Tagger("-Owakati")

_tag = re.compile(r'<.*?>')
_url = re.compile(r'(http|https)://([-\w]+\.)+[-\w]+(/[-\w./?%&=]*)?')
_title = re.compile(r'( - ).*$')
_par = re.compile(r'\(.*?\)')
_sla = re.compile(r'/.*$')
_qt = re.compile(r'"')
_sep = re.compile(r'\|.*$')
_twi = re.compile(r'(.*)on Twitter: ')
_lab = re.compile(r'(.*) ⇒ \(')
_last_par = re.compile(r'\)$')

def clean_text(text):
    text = text.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
    text = re.sub(_lab, '', text)
    text = re.sub(_tag, '', text)
    text = re.sub(_url, '', text)
    text = re.sub(_title, '', text)
    text = re.sub(_sla,  '', text)
    text = re.sub(_qt,  '', text)
    text = re.sub(_sep, '', text)
    text = re.sub(_twi, '', text)
    text = re.sub(_par, '', text)
    text = re.sub(_last_par, '', text)
    return text

p_all = []
m_all = []
for u in users:
    user_post_dic[u] = list(map(clean_text, p_dic[u]))
    m_all += [m.parse(p).split('\n')[0] for p in p_dic[u]]
    p_all += [u + '**' + p for p in user_post_dic[u]]

In p_all wird der Benutzername am Anfang jedes Elements hinzugefügt, da der Text aufgrund der Vorverarbeitung verschwindet und sich der Index der Liste verschiebt, sodass er auf schmerzhafte Weise verknüpft ist. (Übrigens, wenn die URL als Artikeltitel usw. verwendet wird)

Vorerst wurde es schön

Verwenden Sie Neodim im Textbereich Ihres Browsers
 
Sicherheitsmaßnahmen für Front-End-Ingenieure
 
Japanisch mit Matplotlib

Wiedereinführung in modernes JavaScript

Doc2Vec Der Textkörper, der das Material ist, wenn m_all den verteilten Ausdruck erhält p_all ist nur ein Name

Parameter werden nicht begeistert berücksichtigt

python


from gensim import models

#Referenzartikel: http://qiita.com/okappy/items/32a7ba7eddf8203c9fa1
class LabeledListSentence(object):
    def __init__(self, words_list, labels):
        self.words_list = words_list
        self.labels = labels

    def __iter__(self):
        for i, words in enumerate(self.words_list):
            yield models.doc2vec.TaggedDocument(words, ['%s' % self.labels[i]])

sentences = LabeledListSentence(m_all, p_all)
model = models.Doc2Vec(
    alpha=0.025,
    min_count=5,
    vector_size=100,
    epoch=20,
    workers=4
)
#Bauen Sie aus den Sätzen, die Sie haben, einen Wortschatz auf
model.build_vocab(sentences)
model.train(
    sentences,
    total_examples=len(m_all),
    epochs=model.epochs
)

#Denken Sie daran, da sich die Reihenfolge ändern kann
tags = model.docvecs.offset2doctag

PCA und Zeichnung

Es ist mein erstes Mal, dass ich die PCA-Bibliothek benutze, und obwohl ich so viel gelernt habe, ist es erstaunlich, dass sie in zwei Zeilen verwendet werden kann.

python


from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import japanize_matplotlib

vecs = [model.docvecs[p] for p in tags]
draw_scatter_plot(vecs, ls)

#Verknüpfung aufheben
tag_users = [p.split('**')[0] for p in tags]
tag_docs = [p.split('**')[1] for p in tags]

#Es war schwierig, den gleichen Farbgrad in 4 Farben zu finden
cols = ["#0072c2", "#Fc6993", "#ffaa1c", "#8bd276" ]

#Ich habe es gewaltsam in eine Zeile geschrieben
clusters = [cols[0] if u == tag_users[0] else cols[1] if u == tag_users[1] else cols[2] if u == tag_users[2] else cols[3] for u in lab_users]

#2D, weil es eine Ebene ist
pca = PCA(n_components=2)
coords = pca.fit_transform(vecs)

fig, ax = plt.subplots(figsize=(16, 12))
x = [v[0] for v in coords]
y = [v[1] for v in coords]

#Führen Sie diese Schleife aus, um eine Legende zu erstellen
for i, u in enumerate(set(tag_users)):
    x_of_u = [v for i, v in enumerate(x) if tag_users[i] == u]
    y_of_u = [v for i, v in enumerate(y) if tag_users[i] == u]
    ax.scatter(
        x_of_u,
        y_of_u,
        label=u,
        c=cols[i],
        s=30,
        alpha=1,
        linewidth=0.2,
        edgecolors='#777777'
    )

plt.legend(
    loc='upper right',
    fontsize=20,
    prop={'size':18,}
)
plt.show()

Gemacht (repost)

Prognose bevor Sie es tun

Ergebnis

Reichweite und Überlappung liegen intuitiv nahe an den Erwartungen

スクリーンショット 2019-12-11 19.16.44.png

Ende

Erstens gibt es viele Duplikate in Lesezeichen, daher tut es mir leid, dass ich mich nicht sauber trennen konnte Wenn die Daten etwas mehr zunehmen, möchte ich Empfehlungen aussprechen, indem ich sie in Benutzer-Schlussfolgerungen umwandle.

Entschuldigung für die Verspätung (12/11/21: 00)

Recommended Posts

Ich habe versucht, die Lesezeichen zu visualisieren, die mit Doc2Vec und PCA nach Slack fliegen
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, Überlebende der Titanic mit Kaggle vorherzusagen und einzureichen
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich versuchte, Trauer und Freude über das Problem der stabilen Ehe auszudrücken.
Ich habe versucht, datetime <-> string mit tzinfo mit strftime () und strptime () zu konvertieren.
Ich habe versucht, Googles allgemeine Objekterkennung NN, Inception-v3, mit Tensorboard zu visualisieren
Ich habe versucht, den Winkel von Sin und Cos mit Chainer zu lernen
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, das Modell mit der Low-Code-Bibliothek für maschinelles Lernen "PyCaret" zu visualisieren.
Ich habe versucht, alle Entscheidungsbäume des zufälligen Waldes mit SVG zu visualisieren
Ich habe versucht, die Netzwerkbandbreite und -verzögerung mit dem Befehl tc zu steuern
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe DCGAN implementiert und versucht, Äpfel zu generieren
Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, mit PartiQL und MongoDB verbunden zu spielen
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
[Einführung in PID] Ich habe versucht, ♬ zu steuern und zu spielen
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
[Einführung in AWS] Ich habe versucht, eine Konversations-App zu portieren und mit text2speech @ AWS playing zu spielen
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Mr. Hanyu und Mr. Hanyu mit dem Verarbeiter der Verarbeitung natürlicher Sprache × Naive Bayes zu klassifizieren