En analysant les paroles du rappeur actuel, il n'y a pas de but ultime particulier à essayer de trouver quelque chose. Je vais me concentrer sur le type de séquence de voyelles du texte, ce que j'ai fait dans "Je veux gérer la rime". Les données préparées concernent 8 chansons (environ 90 chansons) d'un groupe avec deux rappeurs contrastés. Les deux ont la différence entre un flot bizarre (bon pour mettre le son?!) Et une rime dure (difficile à expliquer), mais j'espère découvrir comment marcher sur la rime, le nombre d'apparitions et les voyelles que vous aimez. .. ~~ "123" est lu comme "Hi-Fumi" ou "Andu Troyes", j'ai donc préparé les données à la main dans cet esprit ~~
from pykakasi import kakasi
import re
import pandas as pd
import itertools
with open("./data/yoshi.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
#Divisé en chansons une par une.{nombre:Liste des paroles séparées par des espaces pleine largeur et des sauts de ligne}
text_data = data.split("!")
text_data_dic = {k:re.split("\u3000|\n", v) for k,v in enumerate(text_data)}
kakasi = kakasi()
kakasi.setMode('J', 'a')
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
conv = kakasi.getConverter()
#{nombre:Liste convertie en voyelles}
vowel_text_dic = {}
for k,v in text_data_dic.items():
vowel_text_dic[k] = [conv.do(d) for d in v]
for k,v in vowel_text_dic.items():
vowel_text_dic[k] = [re.sub(r"[^aeiou]+","",d) for d in v]
#Nom de colonne"aa"Etc., la valeur est le nombre d'apparitions. Compter l'expression pour une chanson
count_dic = {}
temp1 = []
temp2 = 0
for word in word_list:
for k,v in vowel_text_dic.items():
for vowel in v:
temp2 += vowel.count(word)
temp1.append(temp2)
temp2 = 0
vowel_text_len = 0
count_dic[word] = temp1
temp1 = []
df = pd.DataFrame(count_dic)
df["label"] = 0
df.to_csv("./data/yoshi.csv", index=False)
aa | ai | au | … | ooou | oooe | oooo | label | |
---|---|---|---|---|---|---|---|---|
0 | 4 | 9 | 7 | … | 1 | 1 | 0 | 0 |
1 | 21 | 18 | 7 | … | 1 | 1 | 2 | 0 |
2 | 8 | 18 | 18 | … | 1 | 0 | 0 | 0 |
3 | 19 | 26 | 23 | … | 0 | 0 | 0 | 0 |
… | … | … | … | … | … | … | … | … |
88 | 12 | 14 | 2 | … | 0 | 0 | 0 | 0 |
89 | 17 | 17 | 10 | … | 1 | 0 | 1 | 0 |
Il existe deux fichiers texte préparés pour chaque wrapper. Dans le texte, "!" Indique la partie où la chanson change, et dans les paroles, il y a "espace pleine largeur, saut de ligne" selon la carte des paroles. J'essaie de ne pas faire en sorte que les voyelles continuent à travers. L'autre fichier texte a été enregistré sous le nom df ["label"] = 1 pour une identification facile.
import pandas as pd
df1 = pd.read_csv("./data/pochomkin.csv")
df2 = pd.read_csv("./data/yoshi.csv")
#Focus sur la valeur moyenne de la partie à deux caractères
df1_2vowel = df1.describe().iloc[:, :25]
df1_2vowel = df1_2vowel.loc["mean", :]
print(df1_2vowel.sort_values(ascending=False))
df2_2vowel = df2.describe().iloc[:, :25]
df2_2vowel = df2_2vowel.loc["mean", :]
print(df2_2vowel.sort_values(ascending=False))
Il y a 776 colonnes, alors regardons-les séparément. J'ai vérifié ce qui était arrivé à celui avec la valeur moyenne la plus élevée pour chaque nombre de caractères de la colonne (iloc [:, 25: 150] pour 3 caractères, 125 types de 5 × 5 × 5 et iloc [:, 150: 775] pour 4 caractères. ]). Dans le cas de 2 caractères, les 4 premiers de df1 et df2 correspondaient à "ai, ia, ou, aa", et dans le cas de 3 caractères, les 2 premiers "aia, aai" correspondaient. Dans tous les cas, la valeur moyenne de df2 était plus élevée.
#Additionnez chaque direction de colonne et obtenez la valeur.(Comptez le nombre dans environ 90 chansons)
value_count_1 = df1.sum(axis=0).values
value_count_2 = df2.sum(axis=0).values
#Une valeur booléenne qui compte moins de 10 fois. Moins de 10 est vrai
bool_1 = value_count_1 < 10
bool_2 = value_count_2 < 10
#Imprimez une séquence de voyelles comptant moins de 10 fois sur les deux
print(df1.columns[bool_1 * bool_2])
En examinant la séquence des voyelles peu fréquentes dans les deux données, 37 étaient applicables, dont la plupart étaient des voyelles à 4 caractères, y compris "ee".
Le résultat de trouver une correspondance au sommet peut être qu'il existe de nombreuses séquences de voyelles en japonais, ou que le rappeur l'aime. De plus, en raison du nom de groupe "Ai Ranger", il peut apparaître fréquemment dans les données préparées. Je m'attendais à ce que "aa" apparaisse le plus fréquemment parce qu'il y a beaucoup de mots de "aaaa" tels que "bâclé, différents corps" dans l'ordre de "aa", mais des résultats différents sont obtenus. C'est intéressant. Cependant, peu importe à quel point les paroles du rappeur sont utilisées comme données, toutes les voyelles ne sont pas liées à la rime, donc je ne peux rien dire. Une autre chose à laquelle je m'attendais était que "chaque rappeur ait une séquence de voyelles préférée", mais la différence de caractéristiques n'est pas aussi remarquable que je m'y attendais, alors pourquoi ne pas me concentrer là-dessus? C'est comme ça. Ce que je peux dire cette fois, c'est que le wrapper du côté df2 (rime dure) semble avoir la même séquence de voyelles plus fréquemment que le wrapper du df1. C'est comme prévu. C'est aussi une nouvelle découverte que la fréquence de «ee» est faible. Il peut y avoir une raison pour que le wrapper l'évite, comme une difficulté à capter le son. Si vous divisez les données en deux, vous pourrez peut-être les classer. C'était un sentiment, mais il semble que ce n'est pas si facile. J'examinerai les données un peu plus à l'avenir pour voir s'il y a une différence entre les deux.
Recommended Posts