[PYTHON] Analyse du réseau des acteurs vocaux (utilisant word2vec et networkx) (2/2)

Flux d'analyse approximatif introduit cette fois

・ Construisez et visualisez un réseau d'acteurs féminins ・ Utilisez les informations du réseau pour regrouper et classer les acteurs vocaux similaires ・ Visualisez les résultats catégorisés avec Cytoscape

Salut, c'est bamboo-nova. Chez Qiita, nous nous tournons principalement vers l'analyse matérielle.

Si vous êtes intéressé par mon histoire sérieuse ou mon analyse, veuillez vous référer ici (site d'évacuation)

Blog Takenoko

De plus, j'ai mis le code source qui résume la série d'étapes jusqu'à présent sur Github, alors veuillez vous y référer si vous le souhaitez!

bamboo-nova/seiyu_network

La dernière fois, comme étape préliminaire pour effectuer une analyse du réseau d'acteurs vocaux, nous avons gratté le nom et la liste des sexes de l'acteur vocal et créé un modèle d'apprentissage avec word2vec à partir des informations textuelles Wikipedia de l'acteur vocal sur la liste.

Visualisez et regroupez les acteurs vocaux similaires par analyse de réseau (1/2)

Cette fois, nous allons créer un réseau d'acteurs vocaux en utilisant le modèle que nous avons réellement appris, et catégoriser davantage les acteurs vocaux à partir de là. Pour la visualisation et le regroupement de réseaux, cet article analyse la relation uniquement avec les comédiennes de voix féminines dans la vingtaine, mais il est également possible d'analyser tous les acteurs de la voix dans leur adolescence et la trentaine, donc si vous êtes intéressé, essayez-le!

En outre, le modèle d'apprentissage lui-même a été créé sur la base des informations de profil des comédiennes de voix féminines dans leur adolescence et dans la trentaine, mais au début, j'aimerais visualiser et catégoriser le réseau des comédiennes de voix féminines dans la vingtaine.

Créer et visualiser un réseau d'acteurs vocaux féminins

Tout d'abord, chargez les modules requis et chargez le modèle appris avec word2vec dans l'article précédent.

#Chargez le module requis
import numpy as np
import pandas as pd
import pickle
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline

#Chargez le modèle d'apprentissage créé la dernière fois à l'aide de word2vec
with open('mecab_word2vec_seiyu.dump', mode='rb') as f:
     model = pickle.load(f)

#Concevoir un moyen d'afficher le réseau
plt.style.use('seaborn')
#Mesures contre les caractères déformés qui transforment le japonais en tofu
plt.rcParams['font.family'] = 'IPAexGothic'

En ce qui concerne les mesures contre les caractères déformés décrites dans la partie ci-dessus, les contre-mesures sont répertoriées sur le site suivant, veuillez donc vous référer à l'URL ci-dessous et prendre des mesures contre les caractères déformés (Au fait, j'ai répondu) Masu).

Veuillez me dire comment éviter le tofu graphviz.

Ensuite, chargez seiyu20.csv obtenu en grattant dans l'article précédent et extrayez la liste des noms des comédiennes dans la vingtaine.

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

Ensuite, le vecteur de mot du mot2vec correspondant du nom de chaque acteur vocal est extrait, et le coefficient de corrélation du vecteur de mot est calculé pour toutes les combinaisons d'acteurs vocaux.

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

Ceci complète la matrice de corrélation entre chaque acteur vocal. Maintenant, visualisons enfin le réseau des doubleurs.

#Préparer une liste de périphérie à transmettre à networkx
edge_lists = []
df = pd.DataFrame(res)

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


#La matrice triangulaire en haut à droite du coefficient de corrélation DF et 0.05 Masquer les données suivantes
tmp_df = df.mask(np.triu(np.ones(df.shape)).astype(bool) | (df < 0.05))
#Générer une liste d'arêtes
edge_lists = tmp_df.stack().reset_index().apply(tuple, axis=1).values

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




#Se préparer au dessin
plt.figure(figsize=(8,8))  #Définir en fonction de la cible du dessin

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

Résultat de sortie:

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

Les bords sont visualisés de manière à ce que les bords soient plus épais pour des acteurs de voix similaires (acteurs de voix avec un coefficient de corrélation plus élevé), mais si vous regardez de près, il y a des endroits où la partie épaisse est claire, il semble donc y avoir une relation, donc aléatoire Ça ne ressemble pas à ça!

Au milieu du code source ci-dessus, comme tmp_df = df.mask (np.triu (np.ones (df.shape)). Astype (bool) | (df <0,05)), le seuil du coefficient de corrélation Je filtre avec. Cela a été ajusté en fonction du coefficient de regroupement du réseau.

Le coefficient de clustering (coefficient entre 0 et 1) est l'expression relationnelle de (le nombre de liens entre un nœud et des nœuds adjacents) / v (v-1) / 2 pour chaque nœud. Ce sera la moyenne d'entre eux sur tous les nœuds. Plus le coefficient de clustering est élevé, plus le réseau ** est dense. Quant au coefficient de clustering, on dit que le coefficient de clustering confirmé dans le réseau du monde réel est d'environ 0,1 à 0,7 selon l'explication de Wikipedia ci-dessous (Complex Network. / wiki /% E8% A4% 87% E9% 9B% 91% E3% 83% 8D% E3% 83% 83% E3% 83% 88% E3% 83% AF% E3% 83% BC% E3% 82% UN F) ). Cependant, cette fois, le nombre de nœuds dans le réseau n'est pas si grand et la quantité de données de texte d'origine est petite, donc je pense qu'il vaudra mieux l'ajuster à environ 0,4 à 0,7. Lorsque j'effectue une analyse de réseau, je règle souvent et émets des seuils en fonction du coefficient de clustering.

Cette fois, nous ajustons avec le coefficient de clustering suivant.

print(nx.average_clustering(G))
0.610103228782055

J'ai pu le visualiser sous forme de réseau, et je vais l'essayer avec l'analyse du PageRank. Depuis que j'applique les données textuelles entraînées avec word2vec, je pense que ce que je fais est plus proche de l'algorithme LexRank que de l'analyse PageRank. En tant qu'interprétation, je pense que ** le doubleur féminin qui résume le réseau visualisé (essentiel pour la composition) a une valeur plus élevée **.

Le mécanisme de LexRank est décrit en détail à l'URL suivante, veuillez donc vous y référer si vous le souhaitez. Python: résumer les articles japonais avec LexRank

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


#Visualisation
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()

#Présentons les 10 meilleurs acteurs avec les valeurs de PageRank les plus élevées.
score_sorted = sorted(pr.items(), key=lambda x:-x[1])
print(score_sorted[0:20])

Résultat de sortie:

figfig.png

Top 20 des acteurs vocaux avec des valeurs de Page Rank élevées
[('Ayaka Ohashi', 0.04555164528689211), 
('Ellie Yamazaki', 0.039995796742290854), 
('Kido Ibuki', 0.03944625539215552), 
('Nao Higashiyama', 0.03748530983574666),
('Yui Ogura', 0.036855264907774486), 
('Natsukawa Shiina', 0.03677562557911518), 
('Pêche Asakura', 0.034883881713288184), 
('Sachika Misawa', 0.03461691295075832),
('Azusa Tadokoro', 0.03458330057908542), 
('Masanori 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)]

Essayez de regrouper et de catégoriser des acteurs vocaux similaires à l'aide des informations du réseau

Enfin, nous classerons les acteurs de la voix. Cette fois, nous utiliserons une technique de clustering appelée ** Louvain **. Louvain est une méthode de clustering basée sur la modularité, qui est une méthode pour définir une valeur représentative du «degré de couplage réseau» et l'optimiser. En réalité, c'est une méthode pour trouver une optimisation locale, et elle est réalisée en calculant ʻExpression: Pourcentage d'arêtes dans le rapport de clusters entre les arêtes entre les clusters`.

Des techniques telles que les indicateurs de réseau et le regroupement sont décrites grossièrement dans l'explication du laboratoire Github du Matsuo de l'Université de Tokyo, veuillez donc vous y référer si vous le souhaitez.

[Analyse du réseau](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)

L'analyse de Louvain peut être facilement effectuée en installant la communauté avec pip, utilisez donc ce module pour effectuer un clustering de réseau avec Louvain. En outre, je voudrais enregistrer le résultat du clustering sous la forme de .graphml et le visualiser proprement avec cytoscape.

Commencez par effectuer le clustering sur Louvain.

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")Étant donné que les caractères sont déformés, enregistrez-le au format suivant.
nx.write_graphml(G, "community.graphml", encoding='utf-8')

Avant de l'afficher dans cytoscape, jetons un coup d'œil aux acteurs de la voix pour chaque cluster. Tout d'abord, le premier cluster est ...

#Premier cluster
for k,v in partition.items():
    if int(v)==0:
        print(k)
#Résultat de sortie:
Ellie Yamazaki
Kido Ibuki
Ayaka Ohashi
Azusa Tadokoro
Machico
M ・ A ・ O

J'ai pu confirmer qu'il était brillamment solidifié avec le doubleur Horipro + α! https://moca-news.net/article/20140226/2014022614590a_/01/

Ensuite, regardons le deuxième cluster.

#Deuxième cluster
for k,v in partition.items():
    if int(v)==1:
        print(k)
#Résultat de sortie:
Sumire Moroboshi
Natsukawa Shiina
Akina
Pêche Asakura
Amemiya Ten
Aimi
Mirai Sasaki
Momo Kuraguchi
Ayaka Mori
Ciel bleu Tokui

J'ai l'impression que cela est principalement solidifié par TrySail et Milky Holmes. Apparemment, le clustering fonctionne! !!

Enfin, je voudrais visualiser clairement le réseau d'acteurs vocaux catégorisé par Cytoscape.

Visualisez les résultats catégorisés avec Cytoscape

Tout d'abord, installez Cytoscape.

Cytoscape

Cytoscape est un outil de visualisation de réseau, et j'aimerais voir un outil conçu principalement pour la bioinformatique, mais il peut également être pleinement utilisé à des fins autres que la bioinformatique. C'est très pratique car cela vous donne une grande liberté.

Après l'installation, ouvrez-le et allez dans [Fichier-> Importer-> Réseau-> Fichier] sur la barre d'outils pour ouvrir le fichier réseau que vous avez enregistré précédemment.

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

Dans l'état ci-dessus, on ne peut pas dire que c'est beau, nous allons donc commencer par coder par couleur chaque cluster. Cliquez ensuite sur l'onglet Style sur la gauche. Puis ouvrez-y "Couleur de remplissage". Ensuite, la colonne et le type de mappage seront affichés. Sélectionnez «communauté» pour la colonne et «Disctete Mapping» pour le type de mappage.

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

Ensuite, les écrans suivants apparaîtront, alors spécifiez les couleurs pour chacun.

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

Une fois que vous l'avez spécifié, modifions grossièrement la mise en page. Vous pouvez choisir parmi une variété de mises en page à partir de Disposition-> YFiles Layouts sur la barre d'outils et d'autres options, alors choisissez une mise en page qui vous convient le mieux, puis faites-la glisser avec votre souris pour la déplacer et l'ajuster.

Au fait, le résultat de mon réseau de doubleurs est comme ça (je l'ai corrigé car il y avait une demande qu'il était difficile de voir auparavant).

fourpath.graphml.png

En conséquence, les comédiennes vocales dans la vingtaine sont à peu près divisées en cinq groupes lorsqu'elles sont classées en fonction des informations de profil de Wikipédia. ・ Cluster centré sur les acteurs de la voix Horipro (Ayaka Ohashi, Azusa Tadokoro, etc.) ・ Cluster centré sur TrySail et Milky Holmes (M. Ten Amemiya, M. Aimi, etc.) ・ Un cluster composé du trio King Records et de personnes qui leur sont liées (M. Inori Minase, M. Sumire Uesaka, etc.) ・ Un cluster composé de personnes talentueuses? (Saori Hayami, Nao Higashiyama, etc.) ・ Un cluster qui semble avoir une forte couleur d'idole? (Aoi Yuki, Miki Ito, etc.)

Je pense qu'il a été grossièrement divisé sous forme de

Résumé

Cette fois, ** sur la base des informations de profil de chaque acteur vocal sur Wikipédia, nous avons visualisé la relation entre les acteurs voix féminins dans la vingtaine par analyse de réseau **. En outre, ** un regroupement a été effectué pour catégoriser les comédiennes vocales dans la vingtaine, et les résultats ont été visualisés avec Cytoscape **. C'était la première fois que j'apportais des données comme passe-temps et que je les analysais, alors j'étais inquiète, mais je suis content d'avoir obtenu un résultat comme celui-là!

Qiita prévoit d'introduire ce type d'analyse matérielle lorsque nous en aurons le temps, donc si vous avez des demandes, veuillez commenter!

De plus, ** Ce sera un encouragement pour l'avenir, donc si vous le trouvez intéressant, veuillez l'aimer lol **

Autres matériaux de référence

Clustering avec python-louvain Visualisez les abonnés Twitter avec NetworkX, Cytoscape

Recommended Posts

Analyse du réseau des acteurs vocaux (à l'aide de word2vec et networkx) (1/2)
Analyse du réseau des acteurs vocaux (utilisant word2vec et networkx) (2/2)
Analyse du réseau des acteurs vocaux (à l'aide de word2vec et networkx) (1/2)
Analyse du réseau des acteurs vocaux (utilisant word2vec et networkx) (2/2)
Analyse de réseau avec NetworkX --- Volume de détection de la communauté
Estimation de l'auteur à l'aide du réseau neuronal et de Doc2Vec (Aozora Bunko)