[PYTHON] Je veux gérer la rime part6 (organiser une fois)

__ Contenu __

Tout en organisant ce que vous avez fait jusqu'à présent, organisez vos réflexions et clarifiez votre future politique. Présentation de la méthode jugée la plus adaptée actuellement. Tout d'abord, en tant que thème, je veux que vous ressentiez le «rythme» de plus près. Par conséquent, j'ai pensé que ce serait amusant si je pouvais m'attarder sur les mots que j'utilise habituellement. J'ai pensé à quelque chose comme une fonction de recherche de rimes, mais l'idée était que tout le monde suivrait la même rime et perdrait son individualité. Il s'agit d'une tentative de regarder les données du point de vue des "paroles" quand quelque chose qui est habituellement pensé, prononcé ou quelque chose comme un bulletin de telles choses est entré.

__ Prétraitement des données __

from pykakasi import kakasi
import re
import numpy as np

with open("./gennama.txt","r", encoding="utf-8") as f:
    data = f.read()
    
kakasi = kakasi()
kakasi.setMode('J', 'K')
kakasi.setMode('H', 'K')
conv = kakasi.getConverter()
#Conversion Katakana. (Le but principal est de lire les kanji. Cela facilite également la conversion d'e-i.)
text_data = conv.do(data)

#e i → ee,Obtenez le texte converti comme o u → oo
def expansion(text_data):
    text_data_len = len(text_data)
    text_data = text_data.replace("bien", "Je je").replace("U","U u")
    text_data = text_data.split("je")
    new_text_data = []
    kakasi.setMode('K', 'a')
    conv = kakasi.getConverter()
    for i in range(len(text_data)):
        if len(text_data[i]) > 0:
            if ("e" in conv.do(text_data[i][-1])):
                new_text_data.append(text_data[i] + "e")
            else:
                new_text_data.append(text_data[i] + "i")
            
    text_data = "".join(new_text_data).split("C")
    new_text_data = []
    for i in range(len(text_data)):
        if len(text_data[i]) > 0:
            if ("o" in conv.do(text_data[i][-1])):
                new_text_data.append(text_data[i] + "o")
            else:
                new_text_data.append(text_data[i] + "u")
    return "".join(new_text_data)[:text_data_len]

#La séparation comme les espaces est considérée comme significative et divisée.
def ngram(text_data, N):
    #Les espaces pleine largeur et les sauts de ligne sont fractionnés
    text_data = re.split("\u3000|\n", text_data)
    ngram = []
    for text in text_data:
        if len(text) < N:
            ngram.append(text)
        else:
            for i in range(len(text)-N+1):
                row = "".join(text[i:i+N])
                ngram.append(row)
    return ngram

#Diviser et transformer du texte
ex_text_data = expansion(text_data)
n = 5
n_text_data = ngram(text_data, n)
n_ex_text_data = ngram(ex_text_data, n)

dic_text_data = {k:v for k,v in enumerate(n_text_data)}
kakasi.setMode('K', 'a')
conv = kakasi.getConverter()
#Conversion Romaji → Ne laissez que les voyelles et donnez des numéros de série aux touches pour créer un dictionnaire.
vowel_text_data = [conv.do(t) for t in n_text_data]
vowel_text_data = [re.sub(r"[^aeiou]+","",text) for text in vowel_text_data]
vowel_ex_data = [conv.do(t) for t in n_ex_text_data]
vowel_ex_data = [re.sub(r"[^aeiou]+","",text) for text in vowel_ex_data]
dic_vo_t = {k:v for k,v in enumerate(vowel_text_data)}
dic_vo_ex = {k:v for k,v in enumerate(vowel_ex_data)}

Ici, tout le texte est d'abord converti en katakana. En lisant des kanji (la lecture dépend de la capacité du dictionnaire), l'idée que la variation de division augmente et la partie appelée «expansion» élargit la rime et la rend plus facile à saisir. Je pense que la meilleure façon de diviser est la division en N caractères. Par exemple, "many (ooi)" à "far (ooi)" sont faciles à trouver, mais "technology (~~ eu ~~ ooi)" et "the view (ooi ~~ aa ~~)" devraient être difficiles à trouver. Je pense qu'il est possible de couvrir les parties qui risquent d'être négligées par les parties de reliure et la segmentation. Après la division, il est converti en caractères romains et les numéros de série sont donnés de sorte qu'il ne reste que les voyelles, il devient donc comme un identifiant de mot, et les trois types d'éléments dic sont accessibles par cet identifiant.

__ Comment saisir la rime __

#Découpez le mot le plus court, et s'il est inclus dans l'autre, considérez-le comme une "rime" et ajoutez sa longueur en tant que partition
def create_weight(word_a, word_b):
    weight = 0
    if len(word_a) > len(word_b):
        for i in range(len(word_b)):
            for j in range(len(word_b) + 1):
                if word_b[i:j] in word_a and len(word_b[i:j]) > 1 and not word_a==word_b:
                    weight += len(word_b[i:j])
    else:
        for i in range(len(word_a)):
            for j in range(len(word_a) + 1):
                if word_a[i:j] in word_b and len(word_a[i:j]) > 1 and not word_a==word_b:
                    weight += len(word_a[i:j])
    return weight

#Passez chaque dic et l'index est node,La valeur est edge,Le poids est le poids(node,node,weight)faire.
def create_edge_list(dic_text_data, dic_vo_t, dic_vo_ex):
    edge_list = []
    for i in dic_text_data.keys():
        for j in dic_text_data.keys():
            text_weight = create_weight(dic_text_data[i],dic_text_data[j])
            vo_weight = create_weight(dic_vo_t[i],dic_vo_t[j])
            ex_weight = create_weight(dic_vo_ex[i],dic_vo_ex[j])
            #Est-il possible de changer le ratio?
            weight = text_weight*1.0 + vo_weight*1.0 + ex_weight*1.0
            #Vous pouvez peut-être faire un seuil ici. Aussi je-Il peut également être possible d'ajouter le score à j.
            if weight != 0:
                edge_list.append((i,j,weight))
    return edge_list

edge_list = create_edge_list(dic_text_data, dic_vo_t, dic_vo_ex)

Je pense que la meilleure correspondance de voyelle est celle que j'ai utilisée en premier. Par exemple, pour récupérer "iu, ue, iue" de "aiueo", il ne suffit pas de voir la voyelle concordante de l'avant ou de l'arrière. Au départ, je pensais comparer les données d'entrée avec un mot arbitraire appelé target_word, mais j'ai décidé qu'il serait préférable de le compléter dans les données d'entrée. Et puisque ce que nous faisons ici est d'examiner la relation et la similitude de chaque mot divisé, nous allons regarder le graphique. De plus, en utilisant trois types de dic pour le poids, la correspondance des consonnes et autres, la correspondance des voyelles et la correspondance des voyelles lorsque la rime est développée sont additionnées.

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.figure(figsize=(20,20))
plt.show()

download.png

Comme vous pouvez le voir, je ne sais pas ce que c'est. Puisqu'il est divisé en N caractères, mot adjacent = nœuds sont inévitablement connectés. Ce à quoi je pense maintenant, c'est comme commenter une fonction nommée create_edge_list. Pour le moment, essayez de regrouper avec ceci

from networkx.algorithms.community import greedy_modularity_communities

com = list(greedy_modularity_communities(G, weight="weight"))
for i in range(len(com)):
    if len(com[i]) > 2:
        p = com[i]
        print("communauté:"+str(i))
        for k in p:
            print(dic_text_data[k])

Il y a quelques bons points, mais il est frustrant de voir certains qui sont légèrement désalignés. Avec un regroupement très modulaire, les connexions au sein de chaque communauté sont fortes (elles peuvent être rimées), et les connexions entre les communautés sont faibles (elles ne peuvent pas être rimées avec d'autres communautés), et une phrase est utilisée pour chaque communauté. Je sens que je peux marcher dessus. Pour cette raison, je ne peux nier le sentiment que les bords sont trop importants.

__ Résumé __

Vous n'avez pas besoin de voir une correspondance avec text_data_dic. Si vous le faites, il est préférable d'ajouter quand les voyelles correspondent et si les consonnes correspondent. Il semble que le regroupement et la division de N caractères soient incompatibles. Cependant, j'ai estimé que le regroupement pourrait être le but ultime. En tant que politique future, je reconsidérerai la méthode de division, rechercherai une méthode d'amélioration telle que la connexion si la distance entre les nœuds n'est pas supérieure à une certaine distance, et je serai tout le temps troublé par la division, donc je vais la comparer sans la diviser du tout. Je vais réfléchir à la méthode. En tout cas, je ne peux pas nier le sentiment d'avoir une longueur d'avance et un pas de moins ...

Recommended Posts

Je veux gérer la rime part6 (organiser une fois)
Je veux gérer la rime part8 (fini une fois)
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 part5
Je veux gérer la rime part4
Je veux gérer la rime part7 (BOW)
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 veux afficher la barre de progression
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 gérer l'optimisation avec python et cplex
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 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
J'ai essayé d'organiser SVM.
Je veux résoudre SUDOKU
[TensorFlow] Je souhaite maîtriser l'indexation pour Ragged Tensor
Je veux pouvoir analyser des données avec Python (partie 3)
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 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 veux pouvoir analyser des données avec Python (partie 2)
[Python] Je souhaite utiliser l'option -h avec argparse
Je veux connaître la nature de Python et pip
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 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é
Je veux comprendre à peu près systemd
Je veux lire la version html de la version "OpenCV-Python Tutorials" OpenCV 3.1
Je veux sortir le début du mois prochain avec Python
Je veux exécuter l'interface graphique Python au démarrage de Raspberry Pi
Développement LINEbot, je souhaite vérifier le fonctionnement dans l'environnement local
Je veux créer un système pour éviter d'oublier de serrer la clé 1
J'ai essayé de calculer l'intégrale de probabilité (I à l'intégrale)
Je veux faire de la deuxième ligne le nom de la colonne dans pandas