Ceci est l'article sur le 11e jour du calendrier de l'Avent.
Une représentation distribuée des titres d'articles mis en signet par tous (4 personnes) acquis et visualisés
Quand je le signale, IFTTT le prend et le recrache pour le relâcher, donc je vais le traiter à partir de là
--Environnement
--R-kun
La portée et le chevauchement sont intuitivement proches des attentes
Je vais omettre les détails, mais le mécanisme lui-même est complété par le flux de la figure ci-dessous, mais il est nécessaire de saisir l'URL pour recevoir le flux RSS entre les 4ème et 5ème frames, cette fois c'est un signet Hatena, donc http: //b.hatena .ne.jp / <nom d'utilisateur> / rss
Comme ça
Ce n'est pas mal (plutôt, vous pouvez faire les deux), mais vous pouvez vous sentir libre de commenter comme ça dans la communauté.
Vous pouvez personnaliser la publication afin de pouvoir l'utiliser pour le plaisir comme cette fois-ci, et l'utilisation de la commande Slack prend beaucoup de place, ce qui est un problème
Ces deux types semblent faciles à faire
Vous avez quand même besoin d'un jeton, alors procurez-vous-le depuis ici
$ 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>
Prenez-le avec DM et déplacez-le vers un autre endroit car c'est un obstacle
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')
Ouvrez le fichier et obtenez le contenu, car il est par date, faites-en un
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())
Extraire le message et associer le titre de l'article au nom d'utilisateur (cette zone dépend des paramètres dans IFTTT)
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"]:
#Évitement divers
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])
production
[['Y', 864], ['S', 896], ['M', 240], ['R', 79]]
Le message posté ressemble à ceci et le titre et l'URL du site ne sont pas nécessaires, supprimez-le
Utilisez Neodim dans la zone de texte de votre navigateur<http://Developers.IO|Developers.IO>
Mesures de sécurité pour les ingénieurs front-end/ #frontkansai 2019 - Speaker Deck
Japonais avec matplotlib
Réintroduction à JavaScript moderne/ Re-introduction to Modern JavaScript - Speaker Deck
Je ne savais pas comment utiliser re
, alors je l'ai poussé.
De plus, il écrit également dans MeCab, et bien que l'environnement comprenne sudapipy etc., il est rapide d'utiliser quelque chose qui est familier à la main.
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]]
Dans p_all
, le nom d'utilisateur est ajouté au début de chaque élément car le texte disparaît à cause du prétraitement et de l'index des décalages de liste, il est donc lié de manière douloureuse.
(À propos, si l'URL est utilisée comme titre de l'article, etc.)
Pour le moment c'est devenu beau
Utilisez Neodim dans la zone de texte de votre navigateur
Mesures de sécurité pour les ingénieurs front-end
Japonais avec matplotlib
Réintroduction à JavaScript moderne
Doc2Vec
Le corps du texte qui est le matériau lorsque m_all
acquiert l'expression distribuée
p_all
est juste un nom
Les paramètres ne sont pas considérés avec enthousiasme
python
from gensim import models
#Article de référence: 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
)
#Construisez un vocabulaire à partir des phrases que vous avez
model.build_vocab(sentences)
model.train(
sentences,
total_examples=len(m_all),
epochs=model.epochs
)
#Rappel car l'ordre peut changer
tags = model.docvecs.offset2doctag
C'est la première fois que j'utilise la bibliothèque PCA, et même si j'en ai tellement appris, c'est incroyable qu'elle puisse être utilisée en deux lignes.
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)
#Dissocier
tag_users = [p.split('**')[0] for p in tags]
tag_docs = [p.split('**')[1] for p in tags]
#Il était difficile de trouver le même degré de couleur en 4 couleurs
cols = ["#0072c2", "#Fc6993", "#ffaa1c", "#8bd276" ]
#Je l'ai écrit de force en une ligne
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 parce que c'est un avion
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]
#Faites cette boucle pour donner une légende
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()
--R-kun
La portée et le chevauchement sont intuitivement proches des attentes
En premier lieu, il y a beaucoup de doublons dans les signets, donc je suis désolé de ne pas avoir pu rompre proprement Si les données augmentent un peu plus, j'aimerais faire des recommandations en les transformant en inférences d'utilisateurs.
Désolé d'être en retard (12/11/21: 00)
Recommended Posts