[PYTHON] [Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren

Über diesen Artikel

In diesem Artikel werde ich Ihnen zeigen, wie Sie die Bemerkungen jedes Mitglieds in Wordcloud in der Slack-Community visualisieren können.

Den Quellcode finden Sie unter hier: octocat:

Ich möchte auch lesen: [Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren

Inhaltsverzeichnis

  1. Verwendungs- und Ausgabebeispiel
  2. Holen Sie sich die Nachricht von Slack
  3. Vorverarbeitung: Tabellenerstellung / Reinigung / morphologische Analyse / Normalisierung / Stoppwortentfernung
  4. Vorverarbeitung: Wichtige Phrasenextraktion (tf-idf)
  5. Visualisierungsprozess mit Wordcloud
  6. Bonus

* Ich möchte die Vorverarbeitung in Zukunft in einem anderen Artikel zusammenfassen </ font>

1. Verwendungs- und Ausgabebeispiel

1.1. Verwendung

Weitere Informationen finden Sie unter Erste Schritte in README. Der Fluss ist so.

  1. Erstellen Sie eine virtuelle Umgebung mit "Docker-Compose Up-D"
  2. Betreten Sie die Shell mit "docker exec -it ds-py3 bash"
  3. Führen Sie run_wordcloud_by_user.sh aus

1.2 Ausgabebeispiel

Dies ist ein Beispiel für die tatsächliche Ausgabe. Wordcloud ist die Bemerkung verschiedener Mitglieder.

anim_.gif

2. Holen Sie sich die Nachricht von Slack

Siehe diesen Artikel.

[[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren - 2. Erhalten Sie eine Nachricht von 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. Vorverarbeitung: Tabellenerstellung / Reinigung / morphologische Analyse / Normalisierung / Stoppwortentfernung

Dieser Artikel ist der gleiche wie [https://qiita.com/masso/items/41630aa02f1fd6cfa0a4), daher werde ich ihn weglassen. Bitte beachten Sie den Link für Details.

  • [Vorverarbeitung: Nachrichten-Mart-Tabelle erstellen](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)
  • [Vorbehandlung: Reinigung](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)
  • [Vorbehandlung: Morphologische Analyse (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)
  • [Vorbehandlung: Normalisierung](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)
  • [Vorbehandlung: Entfernen von Stoppwörtern](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. Vorverarbeitung: Wichtige Phrasenextraktion (tf-idf)

4.1. Was ist tf-idf?

tf-idf steht für jedes Wort in einem Dokument Man kann sagen, dass es sich um einen Index für die Bewertung unter dem Gesichtspunkt handelt: "Ist es wichtig, den Kontext des Dokuments zu verstehen?"

Weitere Informationen finden Sie in diesem Artikel.

4.2. Implementierung der Textverarbeitung durch tf-idf

4.2.1 Was sollte ein Dokument / alle Dokumente sein?

Der Zweck dieser Zeit ist es, die Merkmale der Bemerkung eines Mitglieds zu sehen. Daher dachte ich, dass ** ich in der Lage sein sollte, die Eigenschaften eines Mitglieds ** für alle Beiträge in der Slack-Community zu verstehen.

Deshalb,

  • ** Alle Dokumente **: Alle Beiträge aller Kanäle und aller Benutzer bisher
  • ** 1 Dokument **: Alle Beiträge eines Mitglieds

Ich habe tf-idf als berechnet.

4.2.2. Implementierung

Ich werde den Prozessablauf leicht schreiben.

  1. Gruppierung nach Mitglied, das die Nachricht gesagt hat
  2. Berechnen Sie tf-idf mit einer Gruppe von Nachrichten als ein Dokument
  3. Extrahieren Sie Wörter, deren tf-idf-Punktzahl über dem Schwellenwert liegt (Ausgabe als Wörterbuch).

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')

#Gruppieren Sie Nachrichten nach Benutzer
def group_msgs_by_user(df_msgs: pd.DataFrame) -> dict:
    ser_uid = df_msgs.uid
    ser_wktmsg = df_msgs.wakati_msg
    #Holen Sie sich eine eindeutige UID-Liste
    ser_uid_unique = df_msgs.drop_duplicates(subset='uid').uid
    #Gruppierung nach UID ohne Duplizierung
    dict_msgs_by_user = {}
    for uid in ser_uid_unique:
        #Holen Sie sich alle wktmsg entsprechend der UID
        extracted = df_msgs.query('uid == @uid')
        # key,Mehrwert für das Ausgabewörterbuch
        dict_msgs_by_user[uid] = ' '.join(extracted.wakati_msg.dropna().values.tolist())        
    return dict_msgs_by_user

# tf-Extrahieren Sie wichtige Wörter und geben Sie sie als Wörterbuch zurück, während Sie sich auf die IDF-Punktzahl beziehen
def extract_important_word_by_key(feature_names: list, bow_df: pd.DataFrame, uids: list) -> dict:
    # >Schauen Sie sich jede Zeile an und extrahieren Sie wichtige Wörter(tfidf Top X Wörter)
    dict_important_words_by_user = {}
    for uid, (i, scores) in zip(uids, bow_df.iterrows()):
        #Erstellen Sie eine Tabelle mit den Wörtern und tfidf-Ergebnissen des Benutzers
        words_score_tbl = pd.DataFrame()
        words_score_tbl['scores'] = scores
        words_score_tbl['words'] = feature_names
        #Sortieren Sie in absteigender Reihenfolge nach tfidf score
        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')
        #Erstellen eines Wörterbuchs für den Benutzer'uid0': {'w0': 0.9, 'w1': 0.87}
        d = {}
        for i, row in important_words.iterrows():
            d[row.words] = row.scores
        #Nur zur Tabelle hinzufügen, wenn das Wörterbuch des Benutzers mindestens ein Wort enthält
        if len(d.keys()) > 0:
            dict_important_words_by_user[uid] = d
    return dict_important_words_by_user

#Extrahieren Sie wichtige Wörter für jeden Benutzer
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 für alle Dokumente-IDF-Berechnung
    # ---------------------------------------------
    print('tfidf vectorizing ...')
    # >Wörter in allen Dokumenten sind Spalten und die Anzahl der Dokumente (=Es wird eine Matrix erstellt, in der Benutzer) die Zeile ist. Tf für jedes Element-Es gibt einen IDF-Wert
    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-Extrahieren Sie wichtige Wörter basierend auf 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 =>uname Konvertierung
    # ---------------------------------------------
    print('Konvertieren Sie den Schlüssel einer wichtigen Wortgruppe für jeden Benutzer von uid in 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():
        #Suchen Sie nach dem Namen des Sprechers nach der UID des Sprechers (möglicherweise nicht vorhanden, wenn kein aktiver Benutzer vorhanden ist).
        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. Ausgabewörterbuch

In Wordcloud, das im nächsten Kapitel erläutert wird, können Sie Wordcloud generieren, das die Anzeigegröße von Wörtern entsprechend der Punktzahl ändert, indem Sie das Wörterbuch "{" word ": score}" eingeben.

[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren

In dem Artikel gebe ich Wordcloud aus, wenn es nach "Punkt" gruppiert ist.

In diesem Artikel haben wir nach "Mitgliedern" gruppiert, aber ** die Ausgabewörterbücher haben das gleiche Format **.

Auf diese Weise kann alles mit derselben Verarbeitung erreicht werden ** mit Ausnahme von ** "tf-idf Scoring Processing". Sie möchten zu [DRY] gehen (https://qiita.com/yatmsu/items/b4a84c4ae78fd67a364c).

Hier ist das Wörterbuch, das dieses Mal tatsächlich ausgegeben wurde. (Benutzername ist versteckt)

important_word_tfidf_by_user.json


{
    "USER_001": {
        "Beteiligung": 0.1608918987478819,
        "Umgebung": 0.15024077008089046,
        "Gutes Produkt": 0.1347222699467748,
        "node": 0.1347222699467748,
        "Erläuterung": 0.13378417526975775,
        "Cybersicherheit": 0.12422689899152742,
        "r": 0.12354794954617476,
        "Wahl": 0.11973696610170319,
        "Ersatz": 0.11678031479185731,
        "Letzte": 0.11632792524420342,
        "Kurs": 0.11467215023122095,
        "Veröffentlichung": 0.11324407267324783,
        "Analyse": 0.11324407267324783,
        "Frist": 0.11100429535028021,
        "Wie schreibt man": 0.10628494383660991,
        "Tiefes Lernen": 0.10229478898619786,
        :
    },
    "USER_002": {
        "Daten": 0.170245452132736,
        "Beteiligung": 0.15825283334154341,
        "Kurs": 0.13785592895847276,
        "Bitte": 0.1265412327351908,
        "Rekrutierung": 0.12204781908784276,
        "Artikel": 0.1197561921672133,
        "Umgebung": 0.11083230914864184,
        "Essen": 0.1091835225326696,
        "Aktie": 0.10371152197590257,
        "Corona": 0.10081254351124691,
        "Runde Lesung": 0.10025885742434383,
        "Planung": 0.09899869065055528,
        "Entwicklung von": 0.09571338092513401,
        "Ziel": 0.09253887576557392,
        "Arbeitsplätze": 0.09094257214685446,
        "Projekt": 0.08910924912513929,
        "Information": 0.08772258523428605,
        "Sprache": 0.08636683271048684,
        "channel": 0.08295159680178281,
        "Veröffentlichung": 0.0818876418995022,
        "youtube": 0.07956948308804826,
        "Mannschaft": 0.07956948308804826,
        "Basic": 0.07444492553072463,
        :
    },
    :
}

5. Visualisierungsprozess mit Wordcloud

Bitte beziehen Sie sich auf diesen Artikel.

[[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren - 9 Visualisierungsverarbeitung mit 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

Artikel, auf die ich mich besonders bezog

Andere Referenzmaterialien (große Menge) sind in hier: octocat: zusammengefasst.

Werbung

Dieses Mal verwenden wir Daten aus der Slack-Community namens Data Learning Guild. Die Data Learning Guild ist eine Online-Community von Datenanalyse-Mitarbeitern. Wenn Sie interessiert sind, überprüfen Sie bitte hier.

Offizielle Homepage der Data Learning Guild

Adventskalender 2019 der Data Learning Guild

Recommended Posts

[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 3: Reguläre Ausdrücke 20 bis 24]
Ich habe versucht, mit der Bibliothek GiNZA zur Verarbeitung natürlicher Sprache eindeutige Ausdrücke zu extrahieren
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 00-04]
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 05-09]
[Erste Datenwissenschaft ⑥] Ich habe versucht, den Marktpreis von Restaurants in Tokio zu visualisieren
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Verwenden Sie die Swagger-Benutzeroberfläche. Wenn Sie einen Swagger-UI-ähnlichen Stil wünschen, kopieren Sie einfach die gesamte Datei unter / dist unter https://github.com/swagger-api/swagger-ui. Danach schreiben Sie einfach hier in index.html die URL der yml-Datei um. Wenn Sie der Meinung sind, dass Sie @ApiModel oder @ApiModelProperty nicht finden können, wurden übrigens anscheinend alle Anmerkungen zur Schemadefinition in @Schema integriert. Emotionsanalyse mit Java, Swagger, OpenAPI, Micronaut Natural Language Processing! Ich habe versucht, die Bewertung anhand des Überprüfungstextes vorherzusagen
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
[Word2vec] Lassen Sie uns das Ergebnis der Verarbeitung von Unternehmensbewertungen in natürlicher Sprache visualisieren
Ich habe versucht, den allgemeinen Zustand der VTuber-Kanalbetrachter zu visualisieren
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Ich habe versucht, den Inhalt jedes von Python pip gespeicherten Pakets in einer Zeile zusammenzufassen
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Altersgruppe und die Ratenverteilung von Atcoder zu visualisieren
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Unerträgliche Aufmerksamkeitsmangel bei der Verarbeitung natürlicher Sprache
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
[Python] [Verarbeitung natürlicher Sprache] Ich habe Deep Learning ausprobiert (auf Japanisch von Grund auf neu erstellt)
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Leistungsüberprüfung der Datenvorverarbeitung in der Verarbeitung natürlicher Sprache
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, Mr. Hanyu und Mr. Hanyu mit dem Verarbeiter der Verarbeitung natürlicher Sprache × Naive Bayes zu klassifizieren
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht zu überprüfen, ob die Natural Language API (Emotionsanalyse) Net Slang unterstützt.
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
Ich habe versucht, HULFT IoT (Agent) in das Gateway Rooster von Sun Electronics zu integrieren
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, die Texte von GReeeen zu visualisieren, die ich in meiner Jugend verrückt gehört habe, aber nicht mehr gehört habe.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, den Stromverbrauch meines Hauses mit Nature Remo E lite zu visualisieren
Ich habe versucht, den in Pandas häufig verwendeten Code zusammenzufassen
Ich habe versucht, die im Geschäftsleben häufig verwendeten Befehle zusammenzufassen
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".