Je l'ai généralement traité en utilisant des expressions régulières. (Il existe une version améliorée du code en bas, il est donc recommandé de faire défiler vers le bas avant de copier)
get_song_titles.py
def get_song_title(raw_title):
# ()()[]Exclure []. Parfois, la gauche est demi-largeur et la droite est pleine largeur.
title = re.sub("[【(\(\[].+?[】)\)\]]","",raw_title)
#S'il y a "" et "", extrayez-leur la chaîne de caractères
if "「" in title and "」" in title:
title = title.split("「")[1].split("」")[0]
if "『" in title and "』" in title:
title = title.split("『")[1].split("』")[0]
#J'ai essayé de chanter X avec Y,J'ai essayé de chanter et d'effacer
title = re.sub("À.*essayé de chanter","",title)
title = title.replace("essayé de chanter", "")
# cover, covered,Effacez la chaîne de caractères après avoir été couverte par
title = re.sub("[cC]over(ed)?( by)?.*", "", title)
#Dernier/Supprimer après cela
if "/" in title:
title = "/".join(title.split("/")[:-1])
if "/" in title:
title = "/".join(title.split("/")[:-1])
# -S'il n'y en a qu'un, effacez le dos
if len(title.split("-")) == 2:
title = title.split("-")[0]
#Effacer la partie qui représente le membre de la collaboration avec ×
title_part_list = []
for title_part in title.split(" "):
if "×" not in title_part:
title_part_list.append(title_part)
title = " ".join(title_part_list)
title = title.strip()
return title
#Exemple de lecture et d'utilisation des données décrites plus loin
if __name__ == "__main__":
x = []
y = []
with open("sing_videos.tsv") as f:
for line in f:
x.append(line.strip().split("\t")[1])
#La première ligne est l'en-tête, supprimez-le
del x[0]
estimated_titles = [ get_song_titles(x) for raw_title in x ]
Je l'ai étiquetée manuellement en utilisant les métadonnées de la vidéo que j'ai essayé de chanter, que j'ai collectée dans l'article précédent (https://qiita.com/miyatsuki/items/fb933bb233d2896ca644). J'ai publié les données sur GitHub, veuillez donc vous y référer si nécessaire pour des tests supplémentaires. https://github.com/miyatsuki/VTuberNayoseDataset/blob/57fe0d785b40c19fa7b249034bdfe1fa62363743/data/sing_videos.tsv
Nombre de vidéos: 277 Taux de réponse correcte: 92,42% (256/277)
Ce n'est pas un gros problème, mais c'est plus de 90%. Étant donné que le score est réglé tout en regardant le résultat, on ne sait pas si la précision jusqu'à présent sera obtenue pour des vidéos inconnues.
Titre de la vidéo | Titre estimé | Bonne réponse |
---|---|---|
Natto!! -Moon!!(Lapin Tsukinomi/iru) Chanson alternative-J'ai essayé de chanter [Kou Uzuki] | Natto!! -Moon!!parodie- | Moon!! |
Disney Medley | couvert par 戌 亥 Toko | Disney Medley| | Disney Medley |
【Virtual to LIVE(covered by #Sanbaka)] Merci pour six mois d'activité [Nijisanji] | ] Merci pour une demi-année d'activité | Virtual to LIVE |
[J'ai essayé de chanter] Adieu les démangeaisons avec Kenmochi [Guerrier d'entrejambe Mzen] | Adieu les démangeaisons avec Kenmochi | Adieu les démangeaisons |
[Love Circulation] J'ai essayé de chanter. Circulation Renai- Bakemonogatari Cover By Utako suzuka | Circulation d'amour | |
Couverture de [Yukitoki].Eru [écoute de la vidéo] | Yukitoki | |
[J'ai essayé de chanter] Anime "Combien de kilogrammes d'haltères puis-je avoir?" OP Request Muscle [Sœur Claire x Hanahata Chaika] | Combien de kilos d'haltères pouvez-vous transporter? | Veuillez muscler |
[Chanson alternative] Ne blâmez pas la gymnastique youkai n ° 1 [Déclaration de chant] | Ne blâmez pas la gymnastique youkai en premier | Gymnastique Yokai n ° 1 |
[MV original] Cinderella Girl avec Midorisen et Suzuka Uta/ King&Prince j'ai essayé de chanter [couverture] | Cendrillon fille avec Midorisen et Suzuka Uta | Fille de Cendrillon |
⚙*.。..Karakuri Pierrot/Mahiro Yukishiro [j'ai essayé de chanter] | ⚙*.。..Karakuri Pierrot | Clown de Karakuri |
[Météo enfant] Grande évasion(Movie edit) feat.Toko Miura-Couvert par Chima Machida & Piropar | Grand Escape feat.Toko Miura | Grande évasion(Movie edit) feat.Toko Miura |
[Partie LOL] VD&J'ai essayé de chanter Blessing with G [Chanson alternative] | VD&Bénédiction avec G | Blessing |
[1er anniversaire] Keion!!J'ai essayé de chanter U & I [Meiji Doda] | Keion!!U & I | U&I |
♡ future base j'ai essayé de chanter ♡ | ♡future base | future base |
[Yorushika] Soudain, j'ai essayé de chanter la pluie et le cappuccino [Déclaration Arisu] | Soudain, pluie et cappuccino | Pluie et cappuccino |
Attention au volume] J'ai essayé de chanter l'affaire du meurtre du vieux manoir/Takamiya Rion | Note de volume] Ancienne affaire de meurtre dans un livre | Affaire de meurtre dans un vieux livre |
Soleil blanc/ King Gnu (Couvert par Yume Pursuit)Chanson thème "Innocence Innocent Lawyer" de Nippon Television [J'ai essayé de chanter] [Couverture] King Nou | Avocat coupable d'innocence | Soleil blanc |
[J'ai essayé de chanter] Haro/Hawayu [PV peint à la main] | Halo | Halo/Hawayu |
[JK jouant talk] J'ai essayé de jouer Oration et de chanter [Statement Arisu] | Jouez l'oraison | Discours solennel |
[J'ai essayé de chanter] Piège rouge(who loves it?) /LiSA [couverture de Kaede Higuchi] | Piège rouge | Piège rouge(who loves it?) |
[Quel est votre nom? ] Rien/ RADWIMPS (cover)Poésie Suzuka [PV original en Terre Sainte] Nandemonaiya"Your Name"/Utako Suzuka | Rien/RADWIMPS Suzuka Poésie Nandemanaiya"Your Name" | Rien |
J'ai augmenté le nombre de données et examiné à nouveau l'exactitude
Nous avons augmenté le nombre de chanteurs cibles (tous les VTubers) et collecté à nouveau des données (le nombre de vidéos cibles a été multiplié par 4,8). https://github.com/miyatsuki/VTuberNayoseDataset/commit/576b89b5c8a6f74744cb24c62a5d8cb77a736ea7
Nombre de vidéos: 1335 Taux de réponse correcte: 75,95% (1014/1335)
Étant donné que le pourcentage de réponses correctes a fortement chuté, j'ai essayé de soutenir un modèle légèrement spécial. De plus, comme il y a un schéma selon lequel d'autres personnes chantent la même chanson et que le titre est acquis correctement, j'ai essayé d'utiliser d'autres résultats d'estimation afin de pouvoir récupérer ces informations.
import pandas as pd
import re
def get_song_title(raw_title):
#Il existe un motif appelé [Titre de la chanson] de "Titre de l'œuvre", donc dans ce cas, le contenu de [] est utilisé comme titre.
if "Que【" in raw_title:
title = raw_title.split("【")[1].split("】")[0]
else:
title = raw_title
#S'il y a un symbole dans l'en-tête, supprimez-le
if title[0] == "★":
title = title[1:]
# ()()[]Exclure []. Parfois, la gauche est en demi-largeur et la droite en pleine largeur
title = re.sub("[【(《\(\[].+?[】)》\)\]]"," ",title)
#Dans le cas d'un motif tel que la chanson thème "nom de l'œuvre", supprimez cette partie
for keyword in ["Chanson du thème", "OP", "Chanson CM"]:
if "」{}".format(keyword) in title:
end_index = title.index("」{}".format(keyword))
for start_index in range(end_index, -1, -1):
if title[start_index] == "「":
title = title[:start_index] + title[end_index + len(keyword) + 1:]
break
for keyword in ["Chanson du thème", "OP", "Chanson CM"]:
if "』{}".format(keyword) in title:
end_index = title.index("』{}".format(keyword))
for start_index in range(end_index, -1, -1):
if title[start_index] == "『":
title = title[:start_index] + title[end_index + len(keyword) + 1:]
break
#S'il y a "" et "", extrayez-leur la chaîne de caractères
#Cependant, dans de rares cas, vous pouvez mettre votre nom entre "". Ignorer dans ce cas
if "「" in title and "」" in title:
temp_title = title = title.split("「")[1].split("」")[0]
if "cover" not in temp_title.lower():
title = temp_title
if "『" in title and "』" in title:
temp_title = title.split("『")[1].split("』")[0]
if "cover" not in temp_title.lower():
title = temp_title
#Effacez la chaîne de caractères après avoir chanté
title = re.sub("J'ai essayé de chanter.*"," ", title)
title = re.sub("essayé de chanter.*"," ", title)
# cover, covered,Effacez la chaîne de caractères après avoir été couverte par
title = re.sub("[cC]over(ed)?( by)?.*", "", title)
# /Supprimer après cela
if "/" in title:
title = title.split("/")[0]
if "/" in title:
title = title.split("/")[0]
# -S'il y en a, effacez le dos
title = title.split("-")[0]
#Effacer la partie qui représente le membre de la collaboration avec ×
# #Effacer les expressions de type 012
title_part_list = []
for title_part in title.split(" "):
if "×" not in title_part and not re.fullmatch("#[0-9]+", title_part):
title_part_list.append(title_part)
title = " ".join(title_part_list)
#Supprimer les espaces de début et de fin
title = title.strip()
return title
#Titre de la vidéo et titre de la chanson(Valeur estimée)Et renvoyer le plus long des titres de chansons partiellement correspondants
def get_nearest_title(video_title, music_titles):
longest = 0
ans = ""
for music_title in music_titles:
if len(music_title) <= longest:
continue
if music_title in video_title:
ans = music_title
longest = len(music_title)
return ans
def decide_title(row):
return row["estimated_title"] if len(row["estimated_title"]) > 0 else row["estimated_title2"]
if __name__ == "__main__":
evaluate_df = pd.read_table("sing_videos.tsv")
evaluate_df["estimated_title"] = evaluate_df["video_title"].apply(get_song_title)
#Si le résultat de l'estimation avec l'expression régulière est vide, recherchez le plus probable parmi les résultats d'estimation d'autres vidéos.
evaluate_df["estimated_title2"] = evaluate_df["video_title"].apply(
get_nearest_title, music_titles = evaluate_df["estimated_title"].unique()
)
evaluate_df["estimated_title"] = evaluate_df.apply(decide_title, axis=1)
evaluate_df = evaluate_df.drop(columns=["estimated_title2"])
Nombre de vidéos: 1335 Taux de réponse correcte: 85,24% (1138/1335)
Recommended Posts