[PYTHON] Je veux gérer la rime part4

__ Contenu __

Dans le flux jusqu'à présent, effectuons une analyse de réseau en utilisant les données de texte d'entrée divisées en tant que nœuds et la correspondance des voyelles entre celles divisées en tant que poids de bord. Le but est de dessiner le graphique et de voir la centralité.

__ Divisez les données et faites un dictionnaire __

from pykakasi import kakasi
import re
from collections import defaultdict
from janome.tokenizer import Tokenizer

with open("./gennama.txt","r") as f:
    data = f.read()
    
tokenizer = Tokenizer()
tokens = tokenizer.tokenize(data)

surface_list = []
part_of_speech_list = []
for token in tokens:
    surface_list.append(token.surface)
    part_of_speech_list.append(token.part_of_speech.split(",")[0])
    
segment_text = []
for i in range(len(surface_list)):
    if part_of_speech_list[i] == "symbole":
        continue
    elif part_of_speech_list[i] == "Particule" or part_of_speech_list[i] == "Verbe auxiliaire":
        row = segment_text.pop(-1) + surface_list[i]
    else:
        row = surface_list[i]
    segment_text.append(row)

kakasi = kakasi()

kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')

conv = kakasi.getConverter()
text_data = [conv.do(text) for text in segment_text]
vowel_data = [re.sub(r"[^aeiou]+","",text) for text in text_data]
#{0:"oea"}
dic_vo = {k:v for k,v in enumerate(vowel_data)}
#voel_Créez un dictionnaire afin que vous puissiez voir les données avant la conversion de voyelle à partir de l'index de données.{0:"je suis"}
dic = {k:v for k,v in enumerate(segment_text)}

Utilisez ce que vous avez fait dans la partie 3. Juger que N-gram ne convient pas cette fois. Il y a autant de nœuds qu'il y a de clés de dic_vo, et la connexion est vérifiée par s'il y a une correspondance de voyelle entre les nœuds. Plus les voyelles correspondantes sont longues, plus le poids est donné. Utilisez la méthode qui a été créée dans la partie 1, mais permettez de créer une arête à partir de la connexion à elle-même et de la correspondance de deux caractères ou plus.

__ Faire un graphique __

#dic_Passer vo et l'index est le nœud,La valeur est edge,Le poids est le score(node,node,score)faire.
def create_edge(dic_vo):
    node_len = len(dic_vo)
    
    edge_list = []
    for i in range(node_len):
        for j in range(node_len):
            score = create_weight(dic_vo[i],dic_vo[j])
            if score != 0:
                edge_list.append((i,j,score))
    return edge_list
            
def create_weight(word_a, word_b):
    weight = 0
    if len(word_a) > len(word_b):
        max_len = len(word_b)
        for i in range(max_len):
            for j in range(max_len + 1):
                if word_b[i:j] in word_a:
                    if word_b == word_a:
                        continue
                    elif len(word_b[i:j]) < 2:
                        continue
                    else:
                        weight += len(word_b[i:j])
    else:
        max_len = len(word_a)
        for i in range(max_len):
            for j in range(max_len + 1):
                if word_a[i:j] in word_b:
                    if word_a == word_b:
                        continue
                    elif len(word_b[i:j]) < 2:
                        continue
                    else:
                        weight += len(word_a[i:j])
    return weight

edge_list = create_edge(dic_vo)            

Après cela, dessinez un graphique basé sur cette edge_list. Ensuite, obtenez un nœud avec une centralité de vecteur propre et une centralité de médiation élevées, et affichez les données d'origine.

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
G.add_weighted_edges_from(edge_list)
pos = nx.spring_layout(G)
nx.draw_networkx_edges(G, pos)

plt.show()

#Centralité vectorielle intrinsèque
cent = nx.eigenvector_centrality_numpy(G)
max_cent_node = max(list(cent.keys()), key=lambda val: cent[val])
#Centralité de la médiation
between_cent = nx.communicability_betweenness_centrality(G, weight="weight)
max_betw_node = max(list(between_cent.keys()), key=lambda val: between_cent[val])

print("Centralité élevée du vecteur propre:" + dic[max_cent_node])
print("Centralité élevée de la médiation:" + dic[max_betw_node])

Comme prévu, le résultat est le même que "Je peux affiner le mot_cible" fait dans part2. Eh bien, c'est naturel parce que je fais la même chose, mais avec networkx, il semble y avoir quelque chose que je peux encore faire sur la base de ce graphique, donc je vais continuer.

Planifiez à partir de maintenant

Dans la façon de marquer, faites attention à "i" et "u", et si le son précédent est "e" et "o", c'est-à-dire si "e i" "o u", convertissez-le en "ee" "oo" Je pense voir la correspondance des voyelles. Il est difficile de distinguer même en japonais (se référant à la prononciation de mots étrangers), et on peut dire que le son est le même. Cela semble être NG dans le traitement de la réverbération dans le monde du tour, mais je vais l'essayer. ~~ Au fait, avez-vous déjà entendu la vraie "chanson ABC"? C'est ce qui fait de "LMNOP" "elenenopy" d'un seul coup. «Rhythm» me semble familier depuis que je suis enfant. Je n'oublierai pas le respect du rap japonais, mais je vais essayer d'élargir un peu la rime ~~

Recommended Posts

Je veux gérer la rime part1
Je veux gérer la rime part3
Je veux gérer la rime part2
Je veux gérer la rime part4
Je veux gérer la rime part7 (BOW)
Je veux gérer la rime part6 (organiser une fois)
Je veux gérer la rime part8 (fini une fois)
Je veux automatiser ssh en utilisant la commande expect! partie 2
Je veux épingler Spyder à la barre des tâches
Je veux sortir froidement sur la console
Je souhaite personnaliser l'apparence de zabbix
Je souhaite utiliser la fonction d'activation Mish
Je veux afficher la progression en Python!
Je veux voir le nom de fichier de DataLoader
Je veux grep le résultat de l'exécution de strace
Je veux faire défiler la table de décalage Django, mais ...
Je veux gérer l'optimisation avec python et cplex
Je veux résoudre SUDOKU
Je veux hériter de l'arrière avec la classe de données python
Je veux bien comprendre les bases de Bokeh
Je veux écrire en Python! (3) Utiliser des simulacres
J'ai essayé d'effacer la partie négative de Meros
Je veux automatiser ssh en utilisant la commande expect!
Je souhaite publier le produit au moindre coût
Je veux utiliser le jeu de données R avec python
Je souhaite augmenter la sécurité de la connexion SSH
[TensorFlow] Je souhaite maîtriser l'indexation pour Ragged Tensor
Je veux utiliser la dernière version de gcc même si je n'ai pas les privilèges sudo! !!
Je veux initialiser si la valeur est vide (python)
Je souhaite enregistrer les photos envoyées par LINE vers S3
maya Python Je veux réparer à nouveau l'animation cuite.
Je veux déplacer le sélénium pour le moment [pour mac]
Je veux pouvoir analyser des données avec Python (partie 1)
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Je veux pouvoir analyser des données avec Python (partie 4)
Je souhaite calculer le temps d'arrêt autorisé à partir du taux de fonctionnement
Je veux pouvoir analyser des données avec Python (partie 2)
Je veux déterminer l'authenticité d'un élément du tableau numpy
Je veux connaître la nature de Python et pip
Je veux rendre le type de dictionnaire dans la liste unique
Je souhaite mapper le code EDINET et le numéro de valeur
Keras Je veux obtenir la sortie de n'importe quelle couche !!
Je veux aligner les nombres valides dans le tableau Numpy
Je veux connaître la légende du monde des technologies informatiques
Je veux créer un Dockerfile pour le moment.
Je ne voulais pas écrire la clé AWS dans le programme
Je veux comprendre à peu près systemd
Je veux gratter des images et les former
Je veux faire ○○ avec les Pandas
Je veux copier l'annotation de yolo
Je veux déboguer avec Python
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
Je veux obtenir le nom de la fonction / méthode en cours d'exécution
Je souhaite enregistrer l'heure d'exécution et conserver un journal.
[Pytorch] Je souhaite attribuer manuellement les paramètres d'entraînement du modèle
Je veux trouver automatiquement des pièces de haute qualité à partir des vidéos que j'ai tournées
Je veux connaître la météo avec LINE bot avec Heroku + Python
[Linux] Je souhaite connaître la date à laquelle l'utilisateur s'est connecté