[PYTHON] Je veux gérer la rime part8 (fini une fois)

__ Contenu __

Essayons la correction, l'utilisation et l'expression de comptage précédentes. Puisqu'il y avait une duplication dans la partie où la séquence de voyelles était considérée comme un mot, corrigez-la afin qu'il n'y ait pas de duplication. Après cela, comme la dernière fois, j'exprimerai les phrases du texte en expression binaire et afficherai celles avec une forte similitude cosinus. Faisons de même pour l'expression count.

__ Modifications __

from pykakasi import kakasi
import re
import numpy as np
import pandas as pd
import itertools

with open("./test.txt","r", encoding="utf-8") as f:
    data = f.read()

#Liste de mots. Un mot de 2 à 4 caractères qui peut être créé en utilisant uniquement des voyelles. 775 types
word_list2 = [i[0]+i[1] for i in itertools.product("aiueo", repeat=2)]
word_list3 = [i[0]+i[1]+i[2] for i in itertools.product("aiueo", repeat=3)]
word_list4 = [i[0]+i[1]+i[2]+i[3] for i in itertools.product("aiueo", repeat=4)]
word_list = word_list2 + word_list3 + word_list4

text_data = re.split("\u3000|\n", data)
kakasi = kakasi()
kakasi.setMode('J', 'a')
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
conv = kakasi.getConverter()
vowel_text_list = [conv.do(d) for d in text_data]
vowel_text_list = [re.sub(r"[^aeiou]+","",text) for text in vowel_text_list]

«J'ai utilisé itertools» pour éviter la duplication de la partie de la liste de mots. Il a également été utilisé pour éviter de calculer (0,1) et (1,0) deux fois lors de l'examen de la similitude d'utilisation du cosinus. itertools

__ Représentation binaire __

df = pd.DataFrame({"Phrase": text_data, "voyelle": vowel_text_list})
#Nom de colonne"aa"S'il apparaît dans le texte, ce sera 1, sinon ce sera 0.
binali_dic = {}
temp = []
for word in word_list:
    for vowel in vowel_text_list:
        if word in vowel:
            temp.append(1)
        else:
            temp.append(0)
        binali_dic[word] = temp
    temp = []

for k, v in binali_dic.items():
    df[k] = v

La troisième colonne et les suivantes indiquent s'il y a ou non une séquence de voyelles dans la phrase qui est comparée à un mot tel que "aa".

__ la façon d'utiliser__

#Similitude cosinus
def cosine_similarity(v1, v2):
    cos_sim = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
    return cos_sim

#Passer l'index de df et renvoyer la voyelle commune
def common_vowel(index1, index2):
    idx = df.iloc[index1, 2:].values + df.iloc[index2, 2:].values
    vowel_word = df.columns[2:]
    common_list = [vowel_word[i] for i in range(len(idx)) if idx[i] == 2]
    return common_list

#Classement de similarité cosinus. liste(indice,indice,cos_sim,Liste des voyelles communes)
def cos_sim_ranking(df, threshold):
    ranking = []
    idx = itertools.combinations(df.index, 2)
    for i in idx:
        cos_sim = cosine_similarity(df.iloc[i[0]][2:].values, df.iloc[i[1]][2:].values)
        if cos_sim > threshold:
            com_list = common_vowel(i[0], i[1])
            ranking.append((i[0],i[1],cos_sim,com_list))
    return sorted(ranking, key=lambda x:-x[2])

ranking = cos_sim_ranking(df, 0.4)
for r in ranking:
    print(df["Phrase"][r[0]] + ":" + df["Phrase"][r[1]])
    print("Voyelle commune:{}".format(r[3]))
    print()

Pour les éléments au-dessus du seuil de similarité cosinus (valeur arbitraire), la phrase originale et la séquence de voyelles communes sont sorties dans l'ordre décroissant de similitude. La rime peut être accentuée en déplaçant la voyelle commune au début ou à la fin de la phrase en utilisant la méthode d'inversion de la phrase originale.

__ Expression de comptage __

df = pd.DataFrame({"Phrase": text_data, "voyelle": vowel_text_list})
#Nom de colonne"aa"Etc., la valeur est le nombre d'occurrences
count_dic = {}
temp = []
for word in word_list:
    for vowel in vowel_text_list:
        temp.append(vowel.count(word))
    count_dic[word] = temp
    temp = []

for k, v in count_dic.items():
    df[k] = v

#Passer l'index de df et retourner la voyelle commune et le nombre d'occurrences
def common_vowel(index1, index2):
    idx = df.iloc[index1, 2:].values + df.iloc[index2, 2:].values
    vowel_word = df.columns[2:]
    common_list = [(vowel_word[i], idx[i]) for i in range(len(idx)) if idx[i] >= 2]
    return common_list

La différence entre la création d'un bloc de données et l'ajout et le renvoi du "nombre d'occurrences" dans common_vowel. Les résultats de sortie sont différents même si le même seuil est utilisé, et j'ai estimé que l'expression de comptage qui montre le nombre d'occurrences est bonne.

__ Résumé __

La sortie des données de test était tout à fait satisfaisante. Celles avec un compte de 2 ou plus sont utilisées comme voyelles communes, mais il y en a qui ont un compte de 2 dans une phrase. Cela montrait que le texte lui-même pouvait être rimé et que c'était une récolte inattendue. Au début, j'ai essayé de le gérer le plus longtemps possible, mais je me souviens avoir renoncé à penser que je ne pouvais pas capturer le «son sur lequel la phrase elle-même peut marcher». Après cela, je m'inquiétais de savoir comment le diviser, et c'était intéressant que j'aie fini par gérer les phrases sans les diviser. Eh bien, ce n'est pas que ce que j'ai fait jusqu'à présent ne soit pas mauvais, et je suis heureux d'avoir réalisé les avantages et les inconvénients. Il peut y avoir des corrections et des améliorations mineures, mais j'ai trouvé intéressant comment exprimer le texte par "quel genre de séquence de voyelles", donc "je veux gérer la rime" se termine une fois.

__ Ce que je veux faire à l'avenir __

J'aimerais essayer cette expression de comptage avec les paroles du rappeur actuel et voir s'il y a une découverte.

Recommended Posts

Je veux gérer la rime part8 (fini une fois)
Je veux gérer la rime part6 (organiser une fois)
Je veux gérer la rime part2
Je veux gérer la rime part5
Je veux gérer la rime part4
Je veux automatiser ssh en utilisant la commande expect! partie 2
Je veux afficher la barre de progression
Je souhaite personnaliser l'apparence de zabbix
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 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 pouvoir analyser des données avec Python (partie 3)
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 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)
[Python] Je souhaite utiliser l'option -h avec argparse
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 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.
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)
Pour le moment, je veux convertir n'importe quel fichier avec ffmpeg !!
Je veux faire ○○ avec les Pandas
Je veux vérifier la position de mon visage avec OpenCV!
Je veux connaître la population de chaque pays du monde.
Je veux copier l'annotation de yolo