🎬

地上波の番組名からアニメタイトルを気合で抽出する

2023/04/10に公開

一般的な配信サイトではシリーズごとにIDが振られていて簡単にグループ化することが可能ですが、地上波の録画データにはシリーズ情報はなく、放送時間から推測しようにも最近のアニメは延期などで放送時間が変わることも多く、あまり頼りにできません
そこで番組名からタイトルを抽出することがでグループ化することにしました

※EPGStationで録画したデータを使用しています。録画ソフトに合わせて適時調整してください

サンプルデータ

入力データ
タイトルごとにグループ化した出力

サンプルコード

$line = mb_substr(pathinfo($line, PATHINFO_FILENAME), 21);
$line = normalizer_normalize($line, Normalizer::FORM_KC);
$line = mb_strtolower($line);
$line = preg_replace(["/\[.+?]/u", "/\s+/"], ["", " "], $line);
$line = preg_replace(["/^(?:(?:劇場)?アニメ|金曜ロードショー|映画|日5)?[「『](.+?)[」』].*$/u", "/^.*「(劇場版.+?)」.*$/", "/^.*アニメ (.+)$/"], "$1", $line);
$line = preg_replace(["/^劇場版「(.+?)」.*$/u"], "劇場版 $1", $line);
$line = preg_replace(["/「.+?」/u", "/【.+?】/u", "/\(.+?\).*/u", "/(?:#|♯)\d+.*/u", "/第[\d〇一壱壹弌二弐貳貮弍三参參弎四肆五伍六陸七漆質柒八捌九玖十拾百千万萬億兆京]+(話|弾|回).*/u"], "", $line);
$line = trim($line);

処理

  1. 日時情報を削除
$line = mb_substr(pathinfo($line, PATHINFO_FILENAME), 21);
  1. 正規化
$line = normalizer_normalize($line, Normalizer::FORM_KC);
$line = mb_strtolower($line);
$line = preg_replace(["/\s+/"], [" "], $line);
  1. 識別用に「[字][デ][新]」などのタグが付いているが、これはタイトルとは関係ないため削除する
$line = preg_replace(["/\[.+?]/u"], [""], $line);
  1. prefixが付くタイトルを抽出する
$line = preg_replace(["/^(?:(?:劇場)?アニメ|金曜ロードショー|映画|日5)?[「『](.+?)[」』].*$/u", "/^.*「(劇場版.+?)」.*$/", "/^.*アニメ (.+)$/"], "$1", $line);
$line = preg_replace(["/^劇場版「(.+?)」.*$/u"], "劇場版 $1", $line);
  1. サブタイトル・話数などを削除
$line = preg_replace(["/「.+?」/u", "/【.+?】/u", "/\(.+?\).*/u", "/(?:#|♯)\d+.*/u", "/第[\d〇一壱壹弌二弐貳貮弍三参參弎四肆五伍六陸七漆質柒八捌九玖十拾百千万萬億兆京]+(話|弾|回).*/u"], "", $line);
  1. 空白を削除
$line = trim($line);

AIに聞かないの?

単体でシリーズ名を抽出させようとすると結構ブレがあるのでリストをまとめて投げてグループ化させると割りといい感じになりそうでした
ただし、APIを叩こうとすると基本的に金がかかり、ローカルで動かそうにもリソースの消費が激しいので常用するのは難しいかなと考えています

Discussion