[PYTHON] [Traitement du langage naturel] J'ai essayé de visualiser les remarques de chaque membre de la communauté Slack

À propos de cet article

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

table des matières

  1. Exemple d'utilisation et de sortie
  2. Recevez le message de Slack
  3. Prétraitement: création de table / nettoyage / analyse morphologique / normalisation / suppression de mots vides
  4. Prétraitement: extraction de phrases importantes (tf-idf)
  5. Processus de visualisation avec Wordcloud
  6. Bonus

* Je voudrais résumer le prétraitement dans un autre article à l'avenir </ font>

1. Exemple d'utilisation et de sortie

1.1. Comment utiliser

Pour plus d'informations, consultez Prise en main dans README. Le flux est comme ça.

  1. Construisez un environnement virtuel avec docker-compose up -d
  2. Entrez dans le shell avec docker exec -it ds-py3 bash
  3. Exécutez run_wordcloud_by_user.sh

1.2. Exemple de sortie

Ceci est un exemple de sortie réelle. Wordcloud, ce sont les remarques de différents membres.

anim_.gif

2. Recevez le message de Slack

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)

3. Prétraitement: création de table / nettoyage / analyse morphologique / normalisation / suppression de mots vides

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.

  • [Prétraitement: Créer une table de vente de messages](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#3-%E5%89%8D%E5%87%A6%E7%90%86%E3%83% A1% E3% 83% 83% E3% 82% BB% E3% 83% BC% E3% 82% B8% E3% 83% 9E% E3% 83% BC% E3% 83% 88% E3% 83% 86% E3% 83% BC% E3% 83% 96% E3% 83% AB% E4% BD% 9C% E6% 88% 90)
  • [Prétraitement: nettoyage](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#4-%E5%89%8D%E5%87%A6%E7%90%86%E3%82%AF%E3 % 83% AA% E3% 83% BC% E3% 83% 8B% E3% 83% B3% E3% 82% B0)
  • [Prétraitement: analyse morphologique (Janome)](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#5-%E5%89%8D%E5%87%A6%E7%90%86%E5%BD % A2% E6% 85% 8B% E7% B4% A0% E8% A7% A3% E6% 9E% 90janome)
  • [Prétraitement: Normalisation](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#6-%E5%89%8D%E5%87%A6%E7%90%86%E6%AD%A3% E8% A6% 8F% E5% 8C% 96)
  • [Prétraitement: suppression du mot d'arrêt](https://qiita.com/masso/items/41630aa02f1fd6cfa0a4#7-%E5%89%8D%E5%87%A6%E7%90%86%E3%82%B9 % E3% 83% 88% E3% 83% 83% E3% 83% 97% E3% 83% AF% E3% 83% BC% E3% 83% 89% E9% 99% A4% E5% 8E% BB

4. Prétraitement: extraction de phrases importantes (tf-idf)

4.1. Qu'est-ce que tf-idf?

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.

4.2. Mise en œuvre du traitement de notation de mots par tf-idf

4.2.1 Qu'est-ce qu'un document / tous les documents?

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,

  • ** Tous les documents **: Tous les messages de toutes les chaînes et de tous les utilisateurs jusqu'à présent
  • ** 1 document **: Tous les messages d'un membre

J'ai calculé tf-idf comme.

4.2.2. Mise en œuvre

Écrivez facilement le flux de processus.

  1. Regroupement par membre qui a dit le message
  2. Calculez tf-idf avec un groupe de messages comme un seul document
  3. Extraire les mots dont le score tf-idf est supérieur au seuil (sortie sous forme de dictionnaire)

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

4.2.3. Dictionnaire de sortie

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}.

[Traitement du langage naturel] J'ai essayé de visualiser les sujets d'actualité cette semaine dans la communauté Slack

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,
        :
    },
    :
}

5. Processus de visualisation avec Wordcloud

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)

6. Bonus

Articles auxquels j'ai fait référence en particulier

D'autres documents de référence (en grande quantité) sont résumés dans ici: octocat:.

Publicité

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

[Traitement du langage naturel] J'ai essayé de visualiser les remarques de chaque membre de la communauté Slack
[Traitement du langage naturel] J'ai essayé de visualiser les sujets d'actualité cette semaine dans la communauté Slack
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
J'ai essayé de résoudre la version 2020 de 100 problèmes de traitement du langage [Chapitre 3: Expressions régulières 20 à 24]
J'ai essayé d'extraire des expressions uniques avec la bibliothèque de traitement du langage naturel GiNZA
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé de résoudre la version 2020 de 100 coups de traitement de langue [Chapitre 1: Mouvement préparatoire 00-04]
J'ai essayé de résoudre la version 2020 de 100 traitements linguistiques [Chapitre 1: Mouvement préparatoire 05-09]
[First data science ⑥] J'ai essayé de visualiser le prix du marché des restaurants à Tokyo
J'ai essayé d'illustrer le temps et le temps du langage C
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Analyse des émotions avec traitement du langage naturel! J'ai essayé de prédire l'évaluation à partir du texte de l'avis
Je veux connaître la population de chaque pays du monde.
[Word2vec] Visualisons le résultat du traitement en langage naturel des avis des entreprises
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé le traitement du langage naturel avec des transformateurs.
J'ai essayé de résumer le contenu de chaque paquet enregistré par Python pip en une seule ligne
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé d'informer Slack de la mise à jour de Redmine
J'ai essayé de corriger la forme trapézoïdale de l'image
Insoutenable manque d'attention dans le traitement du langage naturel
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
[Python] J'ai essayé de juger l'image du membre du groupe d'idols en utilisant Keras
[Python] [Traitement du langage naturel] J'ai essayé le Deep Learning ❷ fait de toutes pièces en japonais ①
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
J'ai essayé de représenter graphiquement les packages installés en Python
Vérification des performances du prétraitement des données dans le traitement du langage naturel
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé d'identifier la langue en utilisant CNN + Melspectogram
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de classer M. Hanyu et M. Hanyu avec le traitement du langage naturel × classificateur Naive Bayes
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé de vérifier si l'API Natural Language (analyse des émotions) prend en charge l'argot net.
J'ai essayé d'extraire le texte du fichier image en utilisant Tesseract du moteur OCR
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
J'ai essayé de mettre HULFT IoT (Agent) dans la passerelle Rooster de Sun Electronics
J'ai essayé de visualiser les données de course du jeu de course (Assetto Corsa) avec Plotly
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé de visualiser les paroles de GReeeen, que j'écoutais de façon folle dans ma jeunesse mais que je ne l'écoutais plus.
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de visualiser la consommation électrique de ma maison avec Nature Remo E lite
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé de résumer les commandes souvent utilisées en entreprise
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
[TF] J'ai essayé de visualiser le résultat de l'apprentissage en utilisant Tensorboard
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé 100 traitements linguistiques Knock 2020
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"