[PYTHON] Netzwerkanalyse von Sprachschauspielern (mit word2vec und networkx) (2/2)

Diesmal wurde ein rauer Analysefluss eingeführt

・ Erstellen und visualisieren Sie ein Netzwerk für weibliche Sprecher ・ Verwenden Sie Netzwerkinformationen, um ähnliche Sprachakteure zu gruppieren und zu kategorisieren ・ Visualisieren Sie kategorisierte Ergebnisse mit Cytoscape

Hallo, das ist Bambus-Nova. Bei Qiita beschäftigen wir uns hauptsächlich mit Materialanalysen.

Wenn Sie an meiner ernsthaften Geschichte oder Analyse interessiert sind, lesen Sie bitte hier (Evakuierungsstelle)

Takenoko Blog

Außerdem habe ich den Quellcode, der die bisherigen Schritte zusammenfasst, in Github eingefügt. Wenn Sie möchten, lesen Sie ihn bitte!

bamboo-nova/seiyu_network

Als letzten Schritt zur Durchführung einer Netzwerkanalyse für Sprachschauspieler haben wir das letzte Mal den Namen und die Geschlechtsliste des Sprachschauspielers abgekratzt und ein Lernmodell mit word2vec aus den Wikipedia-Textinformationen des Sprachschauspielers in der Liste erstellt.

Visualisieren und gruppieren Sie ähnliche Sprachakteure durch Netzwerkanalyse (1/2)

Dieses Mal werden wir anhand des tatsächlich erlernten Modells ein Netzwerk von Sprachschauspielern erstellen und die Sprachschauspieler von dort aus weiter kategorisieren. Zur Netzwerkvisualisierung und zum Clustering analysiert dieser Artikel die Beziehung nur zu weiblichen Sprachschauspielern im Alter von 20 Jahren. Es ist jedoch auch möglich, alle Sprachschauspieler im Alter von Teenagern und 30 Jahren zu analysieren. Wenn Sie also interessiert sind, Versuch es!

Auch das Lernmodell selbst wurde basierend auf den Profilinformationen weiblicher Sprecher im Alter von Teenagern und 30 Jahren erstellt. Zunächst möchte ich jedoch das Netzwerk weiblicher Sprecher im Alter von 20 Jahren visualisieren und kategorisieren.

Aufbau und Visualisierung eines Netzwerks weiblicher Sprecher

Laden Sie zunächst die erforderlichen Module und das im vorherigen Artikel mit word2vec erlernte Modell.

#Laden Sie das gewünschte Modul
import numpy as np
import pandas as pd
import pickle
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline

#Laden Sie das zuletzt mit word2vec erstellte Lernmodell
with open('mecab_word2vec_seiyu.dump', mode='rb') as f:
     model = pickle.load(f)

#Entwickeln Sie eine Möglichkeit, das Netzwerk anzuzeigen
plt.style.use('seaborn')
#Maßnahmen gegen verstümmelte Charaktere, die Japanisch in Tofu verwandeln
plt.rcParams['font.family'] = 'IPAexGothic'

In Bezug auf die im obigen Teil beschriebenen Maßnahmen gegen verstümmelte Zeichen sind die Gegenmaßnahmen auf der folgenden Website aufgeführt. Bitte beziehen Sie sich auf die unten stehende URL und ergreifen Sie Maßnahmen gegen verstümmelte Zeichen (Übrigens, ich antwortete). Masu).

Bitte sagen Sie mir, wie ich Graphviz-Tofu vermeiden kann.

Laden Sie als Nächstes seiyu20.csv, das Sie im vorherigen Artikel erhalten haben, und extrahieren Sie die Liste der Namen weiblicher Sprecher in den Zwanzigern.

df = pd.read_csv('seiyu20.csv')
name = df[df.Gender=='Weiblich']
white_list = name.Name

Dann wird der Wortvektor des entsprechenden Wortes 2vec des Namens jedes Sprachakteurs extrahiert und der Korrelationskoeffizient des Wortvektors für alle Kombinationen von Sprachakteuren berechnet.

output = []
label = []
for name in white_list:
    try:
        vector = model.wv[name]
        output.append(vector)
        label.append(name)
    except:
        continue
res = np.corrcoef(output)

Dies vervollständigt die Korrelationsmatrix zwischen jedem Sprachschauspieler. Lassen Sie uns nun endlich das Voice-Actor-Netzwerk visualisieren.

#Bereiten Sie eine Kantenliste vor, die an networkx übergeben werden soll
edge_lists = []
df = pd.DataFrame(res)

edge_name = label
df.index = df.columns = edge_name


#Die dreieckige Matrix oben rechts des Korrelationskoeffizienten DF und 0.05 Maskieren Sie die folgenden Daten
tmp_df = df.mask(np.triu(np.ones(df.shape)).astype(bool) | (df < 0.05))
#Kantenliste erstellen
edge_lists = tmp_df.stack().reset_index().apply(tuple, axis=1).values

G = nx.Graph()
G.add_weighted_edges_from(edge_lists)




#Vorbereitung zum Zeichnen
plt.figure(figsize=(8,8))  #Stellen Sie entsprechend dem Zeichenziel ein

pos = nx.circular_layout(G)

line_width = [d['weight']*10 for u,v,d in G.edges(data=True)]
nx.draw_networkx(G, pos=pos, font_size=10, node_color='gray', width=line_width, font_family='IPAexGothic')
plt.savefig('netres.png')

Ausgabeergebnis:

スクリーンショット 2020-02-08 19.32.32.png

Die Kanten werden so visualisiert, dass die Kanten für ähnliche Sprachschauspieler (Sprachschauspieler mit höherem Korrelationskoeffizienten) dicker sind. Wenn Sie jedoch genau hinschauen, gibt es einige Stellen, an denen der dicke Teil klar ist, sodass eine Beziehung zu bestehen scheint, die so zufällig ist Es sieht nicht so aus!

In der Mitte des obigen Quellcodes, wie "tmp_df = df.mask (np.triu (np.ones (df.shape)). Astype (bool) | (df <0,05))", der Schwellenwert des Korrelationskoeffizienten Ich filtere mit. Dies wurde basierend auf dem Clustering-Koeffizienten des Netzwerks angepasst.

Der Clustering-Koeffizient (Koeffizient zwischen 0 und 1) ist der relationale Ausdruck von "(die Anzahl der Verbindungen zwischen einem Knoten und benachbarten Knoten) / v (v-1) / 2" für jeden Knoten. Es wird der Durchschnitt von ihnen auf allen Knoten sein. Je höher der Clustering-Koeffizient ist, desto dichter ist das Netzwerk **. Was den Clustering-Koeffizienten betrifft, so wird gesagt, dass der im realen Netzwerk bestätigte Clustering-Koeffizient gemäß der nachstehenden Erklärung von Wikipedia (Complex Network etwa 0,1 bis 0,7 beträgt. / wiki /% E8% A4% 87% E9% 9B% 91% E3% 83% 8D% E3% 83% 83% E3% 83% 88% E3% 83% AF% E3% 83% BC% E3% 82% AF) ). Diesmal ist die Anzahl der Knoten im Netzwerk jedoch nicht so groß und die Menge der ursprünglichen Textdaten gering. Ich denke, es ist besser, sie auf etwa 0,4 bis 0,7 anzupassen. Wenn ich tatsächlich eine Netzwerkanalyse durchführe, stelle ich häufig Schwellenwerte basierend auf dem Clustering-Koeffizienten ein und gebe sie aus.

Dieses Mal passen wir uns mit dem folgenden Clustering-Koeffizienten an.

print(nx.average_clustering(G))
0.610103228782055

Ich konnte es als Netzwerk visualisieren und werde es mit der PageRank-Analyse versuchen. Da ich die mit word2vec trainierten Textdaten anwende, denke ich, dass das, was ich tue, näher am LexRank-Algorithmus liegt als an der PageRank-Analyse. Als Interpretation denke ich, dass ** die weibliche Sprecherin, die das visualisierte Netzwerk zusammenfasst (was für die Komposition unverzichtbar ist), einen höheren Wert hat **.

Der Mechanismus von LexRank wird unter der folgenden URL ausführlich beschrieben. Wenn Sie möchten, lesen Sie ihn bitte. Python: Japanische Artikel mit LexRank zusammenfassen

pr = nx.pagerank(G)
pos1 = nx.spring_layout(G)


#Visualisierung
plt.figure(figsize=(30, 30))
nx.draw_networkx_edges(G, pos1)
nx.draw_networkx_nodes(G, pos=pos1, node_color=list(pr.values()), cmap=plt.cm.Reds, font_family='IPAexGothic', node_size=[100000*v for v in pr.values()])
nx.draw_networkx_labels(G,pos1,font_size=20, font_family='IPAexGothic')

plt.axis('off')
plt.show()

#Lassen Sie uns die 10 besten Sprachschauspieler mit den höchsten PageRank-Werten anzeigen.
score_sorted = sorted(pr.items(), key=lambda x:-x[1])
print(score_sorted[0:20])

Ausgabeergebnis:

figfig.png

Top 20 Sprachschauspieler mit hohen Page Rank-Werten
[('Ayaka Ohashi', 0.04555164528689211), 
('Ellie Yamazaki', 0.039995796742290854), 
('Kido Ibuki', 0.03944625539215552), 
('Nao Higashiyama', 0.03748530983574666),
('Yui Ogura', 0.036855264907774486), 
('Natsukawa Shiina', 0.03677562557911518), 
('Asakura Pfirsich', 0.034883881713288184), 
('Sachika Misawa', 0.03461691295075832),
('Azusa Tadokoro', 0.03458330057908542), 
('Shinrei Uchida', 0.034217274567621005), 
('Moe Toyoda', 0.033018028594089754), 
('Minako Kotobuki', 0.03235768418454441),
('Natsuori Ishihara', 0.03065891275211937), 
('Amemiya Ten', 0.030072491383579297), 
('Sumire Uesaka', 0.02920698033366847), 
('Machico', 0.028396698868023), 
('Aimi', 0.02759156041213482), 
('Inori Minase', 0.027163302263303015), 
('Miki Ito', 0.026500204152951186), 
('Haruka Yamazaki', 0.02511585403440591)]

Versuchen Sie, ähnliche Sprachakteure mithilfe von Netzwerkinformationen zu gruppieren und zu kategorisieren

Schließlich werden wir Sprachschauspieler kategorisieren. Dieses Mal werden wir eine Clustering-Technik namens ** Louvain ** verwenden. Louvain ist eine auf Modularität basierende Clustering-Methode, mit der ein Wert definiert und der "Grad der Netzwerkkopplung" dargestellt und optimiert wird. In der Realität handelt es sich um eine Methode zum Auffinden lokaler Optimierungen, die durch Berechnung des Ausdrucks "Verhältnis der Kanten im Cluster - Verhältnis der Kanten zwischen Clustern" realisiert wird.

Techniken wie Netzwerkindikatoren und Clustering werden in der Erklärung von Github vom Matsuo Laboratory der Universität Tokio grob beschrieben. Wenn Sie möchten, lesen Sie dies bitte.

[Netzwerkanalyse](https://github.com/matsuolab/Tutorial/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC% E3% 82% AF% E5% 88% 86% E6% 9E% 90)

Die Louvain-Analyse kann einfach durchgeführt werden, indem die Community mit pip installiert wird. Verwenden Sie dieses Modul daher, um Netzwerkcluster mit Louvain durchzuführen. Außerdem möchte ich das Ergebnis der Clusterbildung in Form von .graphml speichern und es mit Cytoscape übersichtlich visualisieren.

Führen Sie zunächst ein Clustering für Louvain durch.

import community
partition = community.best_partition(G)
size = float(len(set(partition.values())))
pos = nx.spring_layout(G)
count = 0.
for com in set(partition.values()):
    count += 1.
    list_nodes = [nodes for nodes in partition.keys() if partition[nodes] == com]
    nx.draw_networkx_nodes(G, pos, list_nodes, node_size=20, node_color = str(count/size))

partition = community.best_partition(G)
labels = dict([(i, str(i)) for i in range(nx.number_of_nodes(G))])
nx.set_node_attributes(G, labels,'label')
nx.set_node_attributes(G, partition, 'community')
#nx.write_gml(G, "community.gml")Da die Zeichen verstümmelt sind, speichern Sie sie im folgenden Format.
nx.write_graphml(G, "community.graphml", encoding='utf-8')

Bevor wir es in Cytoscape anzeigen, werfen wir einen Blick auf die Sprachakteure für jeden Cluster. Erstens ist der erste Cluster ...

#Erster Cluster
for k,v in partition.items():
    if int(v)==0:
        print(k)
#Ausgabeergebnis:
Ellie Yamazaki
Kido Ibuki
Ayaka Ohashi
Azusa Tadokoro
Machico
M ・ A ・ O.

Ich konnte bestätigen, dass es mit Horipro Synchronsprecher + α brillant verfestigt wurde! https://moca-news.net/article/20140226/2014022614590a_/01/

Schauen wir uns als nächstes den zweiten Cluster an.

#Zweiter Cluster
for k,v in partition.items():
    if int(v)==1:
        print(k)
#Ausgabeergebnis:
Sumire Moroboshi
Natsukawa Shiina
Akina
Asakura Pfirsich
Amemiya Ten
Aimi
Mirai Sasaki
Momo Kuraguchi
Ayaka Mori
Tokui blauer Himmel

Ich habe den Eindruck, dass dies hauptsächlich durch TrySail und Milky Holmes verfestigt wird. Anscheinend funktioniert Clustering! !!

Abschließend möchte ich das von Cytoscape kategorisierte Voice-Actor-Netzwerk klar visualisieren.

Visualisieren Sie kategorisierte Ergebnisse mit Cytoscape

Installieren Sie zuerst Cytoscape.

Cytoscape

Cytoscape ist ein Netzwerkvisualisierungstool, und ich würde gerne ein Tool sehen, das hauptsächlich für die Bioinformatik entwickelt wurde, aber es kann auch vollständig für andere Zwecke als die Bioinformatik verwendet werden. Es ist sehr praktisch, weil es Ihnen große Freiheit gibt.

Öffnen Sie es nach der Installation tatsächlich und gehen Sie in der Symbolleiste zu [Datei-> Importieren-> Netzwerk-> Datei], um die zuvor gespeicherte Netzwerkdatei zu öffnen.

スクリーンショット 2020-02-08 20.53.06.png

Im obigen Zustand kann nicht gesagt werden, dass es schön ist, daher beginnen wir mit der Farbcodierung jedes Clusters. Klicken Sie dann links auf die Registerkarte Stil. Dann öffnen Sie dort "Füllfarbe". Anschließend werden Spalte und Zuordnungstyp angezeigt. Wählen Sie "Community" als Spalte und "Diskrete Zuordnung" als Zuordnungstyp aus.

スクリーンショット 2020-02-08 20.54.09.png

Anschließend werden die folgenden Bildschirme angezeigt. Geben Sie daher jeweils die Farben an.

スクリーンショット 2020-02-08 20.56.22.png

Nachdem Sie es festgelegt haben, ändern wir das Layout grob. Sie können aus einer Vielzahl von Layouts unter Layout-> yFiles-Layouts in der Symbolleiste und anderen Optionen auswählen. Wählen Sie also ein Layout aus, das am besten zu Ihnen passt, und ziehen Sie es mit der Maus, um es zu verschieben und anzupassen.

Das Ergebnis meines Sprachschauspielernetzwerks ist übrigens so (ich habe es korrigiert, weil es eine Anfrage gab, die vorher schwer zu sehen war).

fourpath.graphml.png

Infolgedessen werden weibliche Sprecher in ihren Zwanzigern grob in fünf Cluster unterteilt, wenn sie anhand der Profilinformationen von Wikipedia kategorisiert werden. ・ Cluster mit Schwerpunkt auf Horipro-Synchronsprechern (Ayaka Ohashi, Azusa Tadokoro usw.) ・ Cluster mit Schwerpunkt auf TrySail und Milky Holmes (Herr Ten Amemiya, Herr Aimi usw.) ・ Ein Cluster bestehend aus King Records Trio und verwandten Personen (Mr. Inori Minase, Mr. Sumire Uesaka usw.) ・ Ein Cluster aus talentierten Leuten? (Saori Hayami, Nao Higashiyama usw.) ・ Ein Cluster, der eine starke Idolfarbe zu haben scheint? (Aoi Yuki, Miki Ito usw.)

Ich denke, dass es grob in der Form von geteilt wurde.

Zusammenfassung

Dieses Mal ** haben wir basierend auf den Profilinformationen auf Wikipedia jedes Sprachschauspielers die Beziehung zwischen weiblichen Sprachschauspielern in den Zwanzigern durch Netzwerkanalyse visualisiert **. Zusätzlich wurde ** Clustering durchgeführt, um weibliche Sprecher in den Zwanzigern zu kategorisieren, und die Ergebnisse wurden mit Cytoscape ** visualisiert. Es war mein erstes Mal, dass ich Daten als Hobby brachte und analysierte, also war ich besorgt, aber ich bin froh, dass ich so ein Ergebnis erzielt habe!

Qiita plant, diese Art der Materialanalyse einzuführen, wenn wir Zeit haben. Wenn Sie also Anfragen haben, kommentieren Sie diese bitte!

Außerdem ** wird es eine Ermutigung für die Zukunft sein. Wenn Sie es also interessant finden, mögen Sie es bitte lol **

Andere Referenzmaterialien

Clustering mit Python-Louvain Visualisieren Sie Twitter-Follower mit NetworkX, Cytoscape

Recommended Posts

Netzwerkanalyse von Sprachschauspielern (mit word2vec und networkx) (1/2)
Netzwerkanalyse von Sprachschauspielern (mit word2vec und networkx) (2/2)
Netzwerkanalyse von Sprachschauspielern (mit word2vec und networkx) (1/2)
Netzwerkanalyse von Sprachschauspielern (mit word2vec und networkx) (2/2)
Netzwerkanalyse mit NetworkX --- Community-Erkennungsvolumen
Autorenschätzung unter Verwendung von neuronalen Netzen und Doc2Vec (Aozora Bunko)