背景
高校生の頃に構築した録画サーバーを6年以上運用してきました。
現在ではSEとして、録画した動画ファイルの処理バッチを自作できるようになりました。
昨年、録画した動画ファイルと番組情報をDBで紐付けて一元管理する仕組みを構築しましたが、数%の確率で紐付け処理が失敗する問題が発生しています。
現在、動画ファイルはカテゴリ別で分類しており、カテゴリ情報の取得元は番組情報のため分類処理が失敗してしまいます。
そこで蓄積している番組情報を学習データとして、番組名からカテゴリ情報を推論する仕組みを構築してみました。
課題
この課題に対して、蓄積された番組情報からカテゴリを推論する仕組みを構築することにしました。
以下は、その仕組みの構築手順です。
使用データ
番組情報テーブル
録画サーバーで取得した番組情報を、定時バッチでDBに取り込んでいます。
テーブルには番組表に表示されている基本的な情報が格納されており、今回のモデル構築では以下を利用しました:
番組名(fileName)
カテゴリ1(category1)
テキスト処理の流れ
1. 形態素解析
オープンソースの日本語形態素解析エンジン「MeCab」を使用し、番組名を単語単位に分割します。
例:
金曜ロードショー_名探偵コナン_劇場版
→ ['金曜', 'ロードショー', '名探偵', 'コナン', '劇場版']
2. 前処理
単語列に対し、以下の前処理を実施します。
- 小文字化:英字を小文字に統一
- 不要語(ストップワード)除去:意味のない助詞や汎用語を削除
- 記号・空白の削除:不要な記号の除去
def preprocess_text(text):
# 小文字化
text = text.lower()
# MeCabで形態素解析
node = mecab.parse(text)
words = [line.split('\t')[0] for line in node.split('\n') if len(line.split('\t')) > 1]
# ストップワードの除去
words = [word for word in words if word not in stop_words]
return ' '.join(words)
特徴量抽出(TF-IDF)
前処理を行った番組名のテキストデータを、機械学習で扱える数値データに変換するために、 TfidfVectorizer(TF-IDFベクトル化)を使用します。
前処理を行ったテキストを数値データに変換するためにTfidfVectorizer(TF-IDFベクトル化)を行います。TF-IDFで単語の重要度を数値化して重荷をつけていきます。
from sklearn.feature_extraction.text import TfidfVectorizer
# 特徴量変換
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(df['processed_fileName']) # 前処理済みの番組名を数値ベクトル化
y = df['filepath'] # 対応するラベル(動画ファイルのパス)
機械学習
ベクトルデータを基に分類モデルを構築していきます。
今回はRandom Forest(ランダムフォレスト)を利用します。
# モデル学習
model = RandomForestClassifier(n_estimators=100)
model.fit(X, y)
学習データ出力
ここまでの一連の処理で学習したデータをpklファイルで出力します。
おわり
学習データの生成はAPIとして実装しており、紐付け処理に失敗した動画はエラーフォルダに分類され、自動的に推測クラスのAPIとあわせて呼び出される仕組みです。
今回は疲れたので学習クラスのみ解説しました。
気が向いたら推測クラスとシステム全体の構成について解説しようと思います。
最後まで読んでいただきありがとうございました。