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.
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
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".
#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.
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.
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.
J'aimerais essayer cette expression de comptage avec les paroles du rappeur actuel et voir s'il y a une découverte.
Recommended Posts