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
* Ich möchte die Vorverarbeitung in Zukunft in einem anderen Artikel zusammenfassen </ font>
Weitere Informationen finden Sie unter Erste Schritte in README. Der Fluss ist so.
run_wordcloud_by_user.sh
ausDies ist ein Beispiel für die tatsächliche Ausgabe. Wordcloud ist die Bemerkung verschiedener Mitglieder.
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)
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.
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.
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,
Ich habe tf-idf als berechnet.
Ich werde den Prozessablauf leicht schreiben.
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
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.
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,
:
},
:
}
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)
Andere Referenzmaterialien (große Menge) sind in hier: octocat: zusammengefasst.
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