Dies ist der Artikel am 11. Tag des Adventskalenders.
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
--Umgebung
Reichweite und Überlappung liegen intuitiv nahe an den Erwartungen
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
Das ist nicht schlecht (vielmehr können Sie beides tun), aber Sie können sich gerne in der Community dazu äußern.
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
Diese beiden Typen scheinen einfach zu sein
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]]
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
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()
Reichweite und Überlappung liegen intuitiv nahe an den Erwartungen
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)