[PYTHON] Holen Sie sich den Songtitel aus dem Titel des von Ihnen gesungenen Videos

Hintergrund

Code

Normalerweise habe ich es mit regulären Ausdrücken verarbeitet. (Unten befindet sich eine verbesserte Version des Codes. Es wird daher empfohlen, vor dem Kopieren nach unten zu scrollen.)

get_song_titles.py



def get_song_title(raw_title):

    # ()()[][] Ausschließen. Manchmal ist die linke Breite halb und die rechte volle Breite.
    title = re.sub("[【(\(\[].+?[】)\)\]]","",raw_title)

    #Wenn "" und "" vorhanden sind, extrahieren Sie die Zeichenfolge darin
    if "「" in title and "」" in title:
        title = title.split("「")[1].split("」")[0]

    if "『" in title and "』" in title:
        title = title.split("『")[1].split("』")[0]

    #Ich habe versucht, X mit Y zu singen,Ich versuchte zu singen und zu löschen
    title = re.sub("Zu.*versuchte zu singen","",title)
    title = title.replace("versuchte zu singen", "") 

    # cover, covered,Löschen Sie die Zeichenfolge, nachdem sie von abgedeckt wurde
    title = re.sub("[cC]over(ed)?( by)?.*", "", title)
 
    #Letzte/Danach löschen
    if "/" in title:
        title = "/".join(title.split("/")[:-1])
    
    if "/" in title:
        title = "/".join(title.split("/")[:-1])
  
    # -Wenn es nur einen gibt, löschen Sie den Rücken
    if len(title.split("-")) == 2: 
        title = title.split("-")[0]

    #Löschen Sie den Teil, der das Kollaborationsmitglied darstellt, mit ×
    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


#Beispiel beim Lesen und Verwenden der später beschriebenen Daten
if __name__ == "__main__":
    x = []
    y = []

    with open("sing_videos.tsv") as f:    
        for line in f:
            x.append(line.strip().split("\t")[1])

    #Die erste Zeile ist die Kopfzeile. Löschen Sie sie daher
    del x[0]

    estimated_titles = [ get_song_titles(x) for raw_title in x ]

Leistungsbeurteilung

Daten

Ich habe es manuell mit den Metadaten des Videos beschriftet, das ich zu singen versucht habe und das ich im vorherigen Artikel (https://qiita.com/miyatsuki/items/fb933bb233d2896ca644) gesammelt habe. Ich habe die Daten auf GitHub gepostet. Weitere Informationen finden Sie bei Bedarf. https://github.com/miyatsuki/VTuberNayoseDataset/blob/57fe0d785b40c19fa7b249034bdfe1fa62363743/data/sing_videos.tsv

Ergebnis

Anzahl der Videos: 277 Richtige Antwortrate: 92,42% (256/277)

Es ist keine große Sache, aber es ist über 90%. Da die Punktzahl beim Betrachten des Ergebnisses angepasst wird, ist nicht bekannt, ob die bisherige Genauigkeit für unbekannte Videos erreicht wird.

Was war nutzlos

Videotitel Geschätzter Titel Richtige Antwort
Natto!! -Moon!!(Tsukinomi-Kaninchen/iru) Alternatives Lied-Ich habe versucht zu singen [Kou Uzuki] Natto!! -Moon!!Parodie- Moon!!
Disney Medley | von 戌 亥 Toko abgedeckt Disney Medley| Disney Medley
【Virtual to LIVE(covered by #Sanbaka)] Vielen Dank für ein halbes Jahr Aktivität [Nijisanji] ] Vielen Dank für ein halbes Jahr Aktivität Virtual to LIVE
[Ich habe versucht zu singen] Lebewohl, Juckreiz mit Kenmochi [Crotch Warrior Mzen] Abschiedsjucken mit Kenmochi Abschied Juckreiz
[Liebeszirkulation] Ich habe versucht zu singen. Renai Circulation- Bakemonogatari Cover By Utako suzuka Liebeszirkulation
[Yukitoki] Abdeckung.Eru [Video anhören] Yukitoki
[Ich habe versucht zu singen] Anime "Wie viele Kilogramm Hanteln kann ich haben?" OP Request Muscle [Schwester Claire x Hanahata Chaika] Wie viele Kilo Hanteln können Sie tragen? Bitte Muskeln
[Alternatives Lied] Beschuldigen Sie nicht die Youkai-Gymnastik Nr. 1 [Singende Aussage] Beschuldigen Sie nicht zuerst die Youkai-Gymnastik Yokai Gymnastik Nr. 1
[Original MV] Cinderella Girl mit Midorisen und Suzuka Uta/ King&Prinz I versuchte zu singen [cover] Cinderella Girl mit Midorisen und Suzuka Uta Aschenputtel Mädchen
⚙*.。..Karakuri Pierrot/Mahiro Yukishiro [Ich habe versucht zu singen] ⚙*.。..Karakuri Pierrot Karakuri Clown
[Wetterkind] Große Flucht(Movie edit) feat.Toko Miura-Bedeckt von Chima Machida & Piropar Grand Escape feat.Toko Miura Große Flucht(Movie edit) feat.Toko Miura
[LOL Teil] VD&Ich habe versucht, Blessing with G [Alternatives Lied] zu singen. VD&Segen mit G. Blessing
[1. Jahrestag] Keion!!Ich habe versucht, U & I zu singen [Meiji Doda] Keion!!U & ich U&I
♡ zukünftige Basis habe ich versucht zu singen sing ♡future base future base
[Yorushika] Plötzlich versuchte ich Regen und Cappuccino zu singen [Statement Arisu] Plötzlich Regen und Cappuccino Regen und Cappuccino
Bandnotiz] Ich habe versucht, den Mordfall der alten Buchvilla zu singen/Takamiya Rion Bandnotiz] Mordfall im alten Buchhaus Mordfall in einem alten Buchhaus
Weiße Sonne/ King Gnu (Bedeckt von Yume Pursuit)Nippon Television's Titellied "Innocence Innocent Lawyer" [Ich habe versucht zu singen] [Cover] King Nou Unschuld schuldiger Anwalt Weiße Sonne
[Ich habe versucht zu singen] Haro/Hawayu [Handbemalte PV] Heiligenschein Heiligenschein/Hawayu
[JK spielt Talk] Ich habe versucht, Oration zu spielen und zu singen [Statement Arisu] Spielen Sie die Rede Rede
[Ich habe versucht zu singen] Rote Falle(who loves it?) /LiSA [Kaede Higuchi Cover] Rote Falle Rote Falle(who loves it?)
[Wie lautet dein Name? ] Nichts/ RADWIMPS (cover)Poesie Suzuka [Original PV im Heiligen Land] Nandemonaiya"Your Name"/Utako Suzuka Nichts/RADWIMPS Suzuka Poesie Nandemanaiya"Your Name" Nichts

Erneut testen

Ich habe die Anzahl der Daten erhöht und die Genauigkeit erneut untersucht

Daten

Wir haben die Anzahl der Zielsänger (alle VTubers) erhöht und erneut Daten gesammelt (die Anzahl der Zielvideos hat sich um das 4,8-fache erhöht). https://github.com/miyatsuki/VTuberNayoseDataset/commit/576b89b5c8a6f74744cb24c62a5d8cb77a736ea7

Ergebnis

Anzahl der Videos: 1335 Richtige Antwortrate: 75,95% (1014/1335)

Logische Anpassung

Da der Prozentsatz der richtigen Antworten stark gesunken ist, habe ich versucht, ein etwas spezielles Muster zu unterstützen. Da es ein Muster gibt, dass andere Leute dasselbe Lied singen und der Titel korrekt erfasst wird, habe ich versucht, andere Schätzergebnisse zu verwenden, damit ich diese Informationen aufnehmen kann.

import pandas as pd
import re

def get_song_title(raw_title):
    
    #Es gibt ein Muster namens [Songtitel] aus "Titel der Arbeit". In diesem Fall wird der Inhalt von [] als Titel verwendet.
    if "Als【" in raw_title:
        title = raw_title.split("【")[1].split("】")[0]
    else:
        title = raw_title
    
    #Wenn sich in der Kopfzeile ein Symbol befindet, löschen Sie es
    if title[0] == "★":
        title = title[1:]
    
    # ()()[][] Ausschließen. Manchmal ist die linke Breite halb und die rechte volle Breite
    title = re.sub("[【(《\(\[].+?[】)》\)\]]"," ",title)

    #Wenn das Muster ein Titelsong "Arbeitsname" ist, löschen Sie diesen Teil.
    for keyword in ["Titellied", "OP", "CM Lied"]:
        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 ["Titellied", "OP", "CM Lied"]:
        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
        
    #Wenn "" und "" vorhanden sind, extrahieren Sie die Zeichenfolge darin
    #In seltenen Fällen können Sie Ihren Namen jedoch in "" eintragen. In diesem Fall ignorieren
    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

    #Löschen Sie die Zeichenkette nach dem Singen
    title = re.sub("Ich habe versucht zu singen.*"," ", title)
    title = re.sub("versuchte zu singen.*"," ", title)

    # cover, covered,Löschen Sie die Zeichenfolge, nachdem sie von abgedeckt wurde
    title = re.sub("[cC]over(ed)?( by)?.*", "", title)

    # /Danach löschen
    if "/" in title:
        title = title.split("/")[0]

    if "/" in title:
        title =  title.split("/")[0]

    # -Wenn ja, löschen Sie den Rücken
    title = title.split("-")[0]

    #Löschen Sie den Teil, der das Kollaborationsmitglied darstellt, mit ×
    # #Löschen Sie 012-ähnliche Ausdrücke
    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)

    #Entfernen Sie die vorderen und hinteren Rohlinge
    title = title.strip()

    return title


#Videotitel und Songtitel(Geschätzter Wert)Und geben Sie den längsten der teilweise übereinstimmenden Songtitel zurück
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)

    #Wenn das Ergebnis der normalen Ausdrucksschätzung leer ist, suchen Sie das wahrscheinlichste Ergebnis aus den Schätzergebnissen anderer Videos.
    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"])

Ergebnis (nach logischer Korrektur)

Anzahl der Videos: 1335 Richtige Antwortrate: 85,24% (1138/1335)

Recommended Posts

Holen Sie sich den Songtitel aus dem Titel des von Ihnen gesungenen Videos
Ich habe versucht, das Musikgenre anhand des Songtitels im Recurrent Neural Network vorherzusagen
Ich habe versucht, das RSS des Top-Songs des iTunes Store automatisch abzurufen
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
Um den Namen des Primitivs usw. zu erhalten, das unmittelbar zuvor generiert wurde
Ich möchte den Namen der ausgeführten Funktion / Methode erhalten
Ich habe versucht, ein Standbild aus dem Video auszuschneiden
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
"Der Typ, der die Anzahl der Aufrufe aus dem Titel von Jar Jals Video vorhersagt"
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, den Text des Romans "Wetterkind" mit Word Cloud zu visualisieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Web-Scraping-Anfänger versuchten, einen Befehl zu erteilen, um den Filmnamen der Roadshow am nächsten Freitag zu erhalten
Holen Sie sich den Inhalt von Git Diff aus Python
So erhalten Sie den Notebook-Namen, den Sie derzeit in Google Colab verwenden
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Ändern Sie den Dezimalpunkt der Protokollierung von, nach.
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
Die Geschichte vom Umzug von Pipenv zur Poesie
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, Objekte aus dem Bild des Steak-Sets zu sortieren
Ich möchte den Dateinamen von DataLoader sehen
Holen Sie sich den Titel der Yahoo News und analysieren Sie die Stimmung
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Ruft den Variablennamen der Variablen als Zeichenfolge ab.
So ermitteln Sie die Anzahl der Stellen in Python
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
[Python] Ruft den Gesetzestext aus der e-GOV-Gesetz-API ab
Holen Sie sich den absoluten Pfad des laufenden Skripts
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Skript zum Abrufen des Ablaufdatums des SSL-Zertifikats
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Ich habe versucht, die Objekte aus dem Bild des Steak-Sets zu sortieren. ① Objekterkennung
Python-Skript, das den Status des Servers über den Browser überprüfen kann
Ich habe versucht, den Trend der Anzahl der Schiffe in der Bucht von Tokio anhand von Satellitenbildern zu ermitteln.
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Holen Sie sich die Paketversion, um sich bei PyPI von Git zu registrieren
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Berechnen des aus ABC134-D gelernten Rechenaufwands