Dans cet article, je vais vous montrer comment visualiser les remarques de chaque membre dans Wordcloud dans la communauté Slack.
Le code source peut être trouvé à ici: octocat:
Je veux aussi lire: [Traitement du langage naturel] J'ai essayé de visualiser les sujets d'actualité cette semaine dans la communauté Slack
* Je voudrais résumer le prétraitement dans un autre article à l'avenir </ font>
Pour plus d'informations, consultez Prise en main dans README. Le flux est comme ça.
docker-compose up -d
docker exec -it ds-py3 bash
run_wordcloud_by_user.sh
Ceci est un exemple de sortie réelle. Wordcloud, ce sont les remarques de différents membres.
Consultez cet article.
[[Traitement du langage naturel] J'ai essayé de visualiser les sujets d'actualité cette semaine dans la communauté Slack - 2. Recevez un message de Slack](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#2-slack%E3%81% 8B% E3% 82% 89% E3% 83% A1% E3% 83% 83% E3% 82% BB% E3% 83% BC% E3% 82% B8% E3% 82% 92% E5% 8F% 96% E5% BE% 97)
Cet article est le même que [https://qiita.com/masso/items/41630aa02f1fd6cfa0a4), donc je vais l'omettre. Veuillez vous référer au lien pour plus de détails.
tf-idf est pour chaque mot dans un document On peut dire qu'il s'agit d'un index de notation du point de vue "Est-ce important pour comprendre le contexte du document?"
Pour plus de détails, veuillez consulter cet article.
Le but de ce temps est de voir les caractéristiques de la remarque d'un membre. Par conséquent, j'ai pensé que ** je devrais être en mesure de comprendre les caractéristiques d'un membre ** pour tous les messages de la communauté Slack.
Donc,
J'ai calculé tf-idf comme.
Écrivez facilement le flux de processus.
important_word_extraction.py
import pandas as pd
import json
from datetime import datetime, date, timedelta, timezone
from pathlib import Path
from sklearn.feature_extraction.text import TfidfVectorizer
JST = timezone(timedelta(hours=+9), 'JST')
#Regrouper les messages par utilisateur
def group_msgs_by_user(df_msgs: pd.DataFrame) -> dict:
ser_uid = df_msgs.uid
ser_wktmsg = df_msgs.wakati_msg
#Obtenez une liste uid unique
ser_uid_unique = df_msgs.drop_duplicates(subset='uid').uid
#Regroupement par uid sans duplication
dict_msgs_by_user = {}
for uid in ser_uid_unique:
#Obtenez tous les wktmsg correspondant à l'uid
extracted = df_msgs.query('uid == @uid')
# key,Ajouter de la valeur au dictionnaire de sortie
dict_msgs_by_user[uid] = ' '.join(extracted.wakati_msg.dropna().values.tolist())
return dict_msgs_by_user
# tf-Extraire les mots importants et les renvoyer sous forme de dictionnaire en se référant au score idf
def extract_important_word_by_key(feature_names: list, bow_df: pd.DataFrame, uids: list) -> dict:
# >Regardez chaque ligne et extrayez les mots importants(tfidf Top X des mots)
dict_important_words_by_user = {}
for uid, (i, scores) in zip(uids, bow_df.iterrows()):
#Créer un tableau des mots de l'utilisateur et des scores tfidf
words_score_tbl = pd.DataFrame()
words_score_tbl['scores'] = scores
words_score_tbl['words'] = feature_names
#Trier par ordre décroissant par score tfidf
words_score_tbl = words_score_tbl.sort_values('scores', ascending=False)
words_score_tbl = words_score_tbl.reset_index()
# extract : tf-idf score > 0.001
important_words = words_score_tbl.query('scores > 0.001')
#Créer un dictionnaire pour l'utilisateur'uid0': {'w0': 0.9, 'w1': 0.87}
d = {}
for i, row in important_words.iterrows():
d[row.words] = row.scores
#Ajouter au tableau uniquement si le dictionnaire de l'utilisateur contient au moins un mot
if len(d.keys()) > 0:
dict_important_words_by_user[uid] = d
return dict_important_words_by_user
#Extraire les mots importants pour chaque utilisateur
def extraction_by_user(input_root: str, output_root: str) -> dict:
# ---------------------------------------------
# 1. load messages (processed)
# ---------------------------------------------
msg_fpath = input_root + '/' + 'messages_cleaned_wakati_norm_rmsw.csv'
print('load: {0}'.format(msg_fpath))
df_msgs = pd.read_csv(msg_fpath)
# ---------------------------------------------
# 2. group messages by user
# ---------------------------------------------
print('group messages by user and save it.')
msgs_grouped_by_user = group_msgs_by_user(df_msgs)
msg_grouped_fpath = input_root + '/' + 'messages_grouped_by_user.json'
with open(msg_grouped_fpath, 'w', encoding='utf-8') as f:
json.dump(msgs_grouped_by_user, f, ensure_ascii=False, indent=4)
# ---------------------------------------------
# 4.Tf pour tous les documents-calcul idf
# ---------------------------------------------
print('tfidf vectorizing ...')
# >Les mots de tous les documents sont des colonnes et le nombre de documents (=Une matrice est créée dans laquelle l'utilisateur) est la ligne. Tf pour chaque élément-Il y a une valeur idf
tfidf_vectorizer = TfidfVectorizer(token_pattern=u'(?u)\\b\\w+\\b')
bow_vec = tfidf_vectorizer.fit_transform(msgs_grouped_by_user.values())
bow_array = bow_vec.toarray()
bow_df = pd.DataFrame(bow_array,
index=msgs_grouped_by_user.keys(),
columns=tfidf_vectorizer.get_feature_names())
# ---------------------------------------------
# 5. tf-Extraire des mots importants basés sur idf
# ---------------------------------------------
print('extract important words ...')
d_word_score_by_uid = extract_important_word_by_key(tfidf_vectorizer.get_feature_names(), bow_df, msgs_grouped_by_user.keys())
# ---------------------------------------------
# 6. uid =>conversion uname
# ---------------------------------------------
print('Convertir la clé du groupe de mots important pour chaque utilisateur d'uid en uname...')
user_tbl = pd.read_csv('../../data/020_intermediate/users.csv')
d_word_score_by_uname = {}
for uid, val in d_word_score_by_uid.items():
#Rechercher unname par l'uid du haut-parleur (peut ne pas exister si l'utilisateur n'est pas actif)
target = user_tbl.query('uid == @uid')
if target.shape[0] != 0:
uname = target.iloc[0]['uname']
else:
continue
print('uname: ', uname, 'type of uname: ', type(uname))
d_word_score_by_uname[uname] = val
return d_word_score_by_uname
Dans Wordcloud expliqué dans le chapitre suivant, vous pouvez générer Wordcloud qui change la taille d'affichage des mots en fonction du score en entrant dans le dictionnaire {" word ": score}
.
Dans l'article, je produis Wordcloud lorsqu'il est regroupé par «période».
Dans cet article, nous avons regroupé par "membres", mais ** les dictionnaires de sortie sont au même format **.
Ce faisant, tout sauf ** "processus de notation tf-idf" peut être réalisé avec le même processus **. Vous voulez aller à DRY.
Voici le dictionnaire qui a été produit cette fois. (Le nom d'utilisateur est masqué)
important_word_tfidf_by_user.json
{
"USER_001": {
"Participation": 0.1608918987478819,
"environnement": 0.15024077008089046,
"Bon produit": 0.1347222699467748,
"node": 0.1347222699467748,
"La description": 0.13378417526975775,
"Cyber sécurité": 0.12422689899152742,
"r": 0.12354794954617476,
"Choix": 0.11973696610170319,
"Remplacement": 0.11678031479185731,
"Dernier": 0.11632792524420342,
"Cours": 0.11467215023122095,
"Libération": 0.11324407267324783,
"une analyse": 0.11324407267324783,
"Date limite": 0.11100429535028021,
"Comment écrire": 0.10628494383660991,
"L'apprentissage en profondeur": 0.10229478898619786,
:
},
"USER_002": {
"Les données": 0.170245452132736,
"Participation": 0.15825283334154341,
"Cours": 0.13785592895847276,
"S'il vous plaît": 0.1265412327351908,
"Recrutement": 0.12204781908784276,
"article": 0.1197561921672133,
"environnement": 0.11083230914864184,
"Nourriture": 0.1091835225326696,
"partager": 0.10371152197590257,
"couronne": 0.10081254351124691,
"Lecture ronde": 0.10025885742434383,
"Planification": 0.09899869065055528,
"développement de": 0.09571338092513401,
"Cible": 0.09253887576557392,
"travaux": 0.09094257214685446,
"projet": 0.08910924912513929,
"information": 0.08772258523428605,
"Langue": 0.08636683271048684,
"channel": 0.08295159680178281,
"Libération": 0.0818876418995022,
"youtube": 0.07956948308804826,
"équipe": 0.07956948308804826,
"De base": 0.07444492553072463,
:
},
:
}
Veuillez vous référer à cet article.
[[Traitement du langage naturel] J'ai essayé de visualiser le sujet qui était enthousiasmé cette semaine dans la communauté Slack --- 9. Traitement de visualisation avec Wordcloud](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#9-wordcloud%E3%81%A7 % E5% 8F% AF% E8% A6% 96% E5% 8C% 96% E5% 87% A6% E7% 90% 86)
D'autres documents de référence (en grande quantité) sont résumés dans ici: octocat:.
Cette fois, nous utilisons les données de la communauté Slack appelée Data Learning Guild. La Data Learning Guild est une communauté en ligne de personnel d'analyse de données. Si vous êtes intéressé, veuillez vérifier ici.
Site Web officiel de Data Learning Guild
Calendrier de l'Avent Data Learning Guild 2019
Recommended Posts