[PYTHON] Obtenez le titre de la chanson à partir du titre de la vidéo que vous avez chanté

Contexte

code

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 ]

Évaluation des performances

Les données

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

résultat

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.

Ce qui était inutile

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

Retester

J'ai augmenté le nombre de données et examiné à nouveau l'exactitude

Les données

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

résultat

Nombre de vidéos: 1335 Taux de réponse correcte: 75,95% (1014/1335)

Ajustement logique

É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"])

Résultat (après correction logique)

Nombre de vidéos: 1335 Taux de réponse correcte: 85,24% (1138/1335)

Recommended Posts

Obtenez le titre de la chanson à partir du titre de la vidéo que vous avez chanté
J'ai essayé de prédire le genre de musique à partir du titre de la chanson sur le réseau neuronal récurrent
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé d'obtenir diverses informations de l'API codeforces
Pour obtenir le nom de la primitive etc. généré immédiatement avant
Je veux obtenir le nom de la fonction / méthode en cours d'exécution
J'ai essayé de couper une image fixe de la vidéo
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
"Le gars qui prédit le nombre de vues à partir du titre de la vidéo de Jar Jal"
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
Les débutants en scraping Web ont essayé de créer une commande pour obtenir le nom du film du road show de vendredi prochain
Récupérer le contenu de git diff depuis python
Comment obtenir le nom du bloc-notes que vous utilisez actuellement dans Google Colab
J'ai essayé de corriger la forme trapézoïdale de l'image
Modifiez le point décimal de la journalisation de, à.
De l'introduction de pyethapp à l'exécution du contrat
Histoire de passer de Pipenv à la poésie
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de trier les objets de l'image du plat de steak-④ Clustering
Je veux voir le nom de fichier de DataLoader
Obtenez le titre de Yahoo News et analysez les sentiments
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Obtenez le nom de la variable sous forme de chaîne de caractères.
Comment obtenir le nombre de chiffres en Python
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé de résumer la forme de base de GPLVM
[Python] Récupérez le texte de la loi à partir de l'API e-GOV law
Obtenez le chemin absolu du script en cours d'exécution
Récupérer le code retour d'un script Python depuis bat
Essayez d'obtenir le contenu de Word avec Golang
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
Script pour obtenir la date d'expiration du certificat SSL
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de résumer les opérations de chaîne de Python
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
J'ai essayé de trier les objets de l'image du plat de steak-① Détection d'objets
Script Python qui peut vérifier l'état du serveur à partir du navigateur
J'ai essayé de trouver la tendance du nombre de navires dans la baie de Tokyo à partir d'images satellites.
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
Essayez d'obtenir la liste des fonctions du paquet Python> os
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Obtenez la version du package pour vous inscrire à PyPI à partir de Git
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
Comment calculer la quantité de calcul appris de ABC134-D