はじめに
仕事で記事間の類似度計算などがあったりするんですが、TF-IDFにしてCOS類似度を計算するなどの方法で行っているのが現状です。そろそろ他の手法にも移行したいので、それに変わる類似度計算の手段としてDoc2vecを試してみたいと思います。
データ
以前より収集している洋楽の歌詞データを用います。Billboardのランキングに登場した楽曲の歌詞データを961曲分集めたものとなります。英語なので、日本語のように形態素解析は不要ですが、ストップワードを除去するなどの処理を施したコーパスを用います。Rのtmパッケージによるストップワードの除去についてはBillboard100位以内の楽曲の歌詞情報にLDAを適用してみたをご覧ください。日本語でのDoc2Vecの適用は参考文献において紹介しています。
類似度計算
TaggedLineDocumentを用いて、doc2vecで扱えるオブジェクトを作成します。TaggedLineDocumentに指定するファイルは主にtxtファイルで、その満たすべき条件は「1行につき1文書」「単語がスペースで区切られている」などです。あとは、doc2vecを実行するだけです。パラメータなどの細かい指定については今後の宿題としたいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#ライブラリの読み込み from gensim.models.doc2vec import LabeledSentence from collections import namedtuple import pandas as pd #データの読み込みとtxtファイルの生成 billboard_list = pd.read_csv("lyrics_data_preprocessed.csv", delimiter=",", encoding='utf-8') billboard_list.columns = ['title','artist', 'lyrics'] billboard_songs = billboard_list['lyrics'] billboard_songs.to_csv("billboard_data.txt",header=None,index=None) #1行1ドキュメントとしてdoc2vecで扱えるオブジェクトに変換 sentences = doc2vec.TaggedLineDocument("billboard_data.txt") #doc2vecの実行 model = models.Doc2Vec(sentences, dm=0, size=300, window=15, alpha=.025, min_alpha=.025, min_count=1, sample=1e-6) #トレーニングの開始 print('\nStart Training') for epoch in range(20): print('Epoch: {}'.format(epoch + 1)) model.train(sentences) model.alpha -= (0.025 - 0.0001) / 19 model.min_alpha = model.alpha |
類似度の算出
早速、気になる楽曲に関して、類似度の高い楽曲を抽出してみたいと思います。
1 2 3 4 5 6 |
#推定したモデルの保存 model.save('doc2vec.model') model = models.Doc2Vec.load('doc2vec.model') #調べたい楽曲のインデックスの確認 billboard_list[billboard_list['title'].str.contains("Radioactive")] |
どうやら、Radioactiveという曲はkings of leonというグループも歌っているようですが、私はimagine dragonsの方の楽曲に関心がありますので、インデックスを409にして歌詞情報の近い楽曲を抽出します。
1 2 3 4 5 |
#最も近い歌詞の楽曲情報を抽出 mostsimilarlyrics = model.docvecs.most_similar(409) billboard_list['title'][mostsimilarlyrics[0][0]] 'Made In America' |
どうやら、toby keithのMade In Americaという楽曲が最も近いようです。類似度は35%程度ですが、全然単語が被っていないので本当に近いのか納得がいかないです。
次に、lady gagaのBorn This Wayに近い楽曲を出してみます。Dancing Queenという非常に懐かしい曲が選ばれていますが、類似度は49%と先ほどよりも高いです。queenやgirlやcanやrightなど共通の単語が含まれているので、先ほどの結果よりは近いのかなぁと思います。
正しく推定できているのか不安だったので、類似度が90%と非常に高かった、Just The Way You Areという楽曲の最も近い楽曲を見てみます。
調べたところ、同じ楽曲のカバー版のようです。近いものは、ちゃんと近いと見なせるようです。近いかどうかの基準をどの水準に置くのかは難しい判断ですね。
参考情報
models.doc2vec – Deep learning with paragraph2vec
Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理