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 ]
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
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.
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 |
Ich habe die Anzahl der Daten erhöht und die Genauigkeit erneut untersucht
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
Anzahl der Videos: 1335 Richtige Antwortrate: 75,95% (1014/1335)
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"])
Anzahl der Videos: 1335 Richtige Antwortrate: 85,24% (1138/1335)
Recommended Posts