あの手この手を使って手に入れた、およそ1800曲に及ぶクラシック音楽の楽曲情報(テキスト)をもとに
、PythonのGensimライブラリーのWord2Vecを使って、任意の単語に関する類似単語を出力してみたいと思います。
まずは、手に入れたコーパスを作業フォルダに置いて、MeCabによる分かち書きを行います。
(最後の引数-bは、処理する文書のサイズが大きい際に調整します。)
1 |
mecab -O wakati music_text.txt > music_text_wakati.txt -b 81920 |
後はGensimパッケージを読み込んで、
1 2 |
# -*- coding: utf-8 -*- from gensim.models import word2vec |
Word2Vecを計算させるだけです。
1 2 |
sentences = word2vec.Text8Corpus("music_text_wakati.txt") model = word2vec.Word2Vec(sentences, size=200) |
(引数のsizeは特徴ベクトルの次元数です。)
早速、トランペットについて、所与のコーパスにおける類似単語を見てみたいと思います。(類似度が最も高い単語の上位10位の結果を返しています。)
1 2 3 4 5 6 7 8 9 10 11 12 |
for w, d in model.most_similar(u"トランペット"): print("%s\t%.4f" % (w, d)) トロンボーン 0.9087 コルネット 0.8880 ホルン 0.8806 ファゴット 0.8357 ティンパニ 0.8107 金管楽器 0.8005 チューバ 0.7984 打楽器 0.7816 ユーフォニアム 0.7358 バスーン 0.7238 |
惜しいですね。
願わくば、コルネットが一番目に来てほしかったです。オケの編成上、どうしてもトロンボーンが一緒の文書で出やすいのだと思います。
続いては、ピアノです。こちらもオルガン・チェンバロは非常に近い楽器だと思うのですが、一番目がヴァイオリンというのはデータ上仕方がないのかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 |
for w, d in model.most_similar(u"ピアノ"): print("%s\t%.4f" % (w, d)) ヴァイオリン 0.7837 オルガン 0.7217 チェンバロ 0.7210 弦楽 0.6495 チェロ 0.6474 ギター 0.6433 オーケストラ 0.6221 ヴィオラ 0.6188 室内楽 0.6184 合奏 0.6160 |
続いて、ヴァイオリンですが、ヴィオラ・チェロは良いと思うのですが、ピアノやチェンバロなどが上位に来ています。
1 2 3 4 5 6 7 8 9 10 11 12 |
for w, d in model.most_similar(u"ヴァイオリン"): print("%s\t%.4f" % (w, d)) ピアノ 0.7837 ヴィオラ 0.7805 チェンバロ 0.7743 チェロ 0.7571 フルート 0.7018 ギター 0.6551 クラリネット 0.6521 サクソフォーン 0.6520 オーボエ 0.6443 オルガン 0.6375 |
続いて、クレッシェンドですが、似たような意味はあまり観察されていません。ただし、「クライマックス」・「アルペッジョ」などと似たようなシチュエーションで登場しそうな表現な気がします。
1 2 3 4 5 6 7 8 9 10 11 12 |
for w, d in model.most_similar(u"クレッシェンド"): print("%s\t%.4f" % (w, d)) 転調 0.7839 高音 0.7785 不協和音 0.7748 高揚 0.7653 クライマックス 0.7610 アルペッジョ 0.7597 静寂 0.7590 ピッツィカート 0.7567 楽節 0.7563 突如 0.7537 |
最後に、アレグロですが、こちらは速さの序列に関しては守られていないようです。やはりコーパス次第ですかね。
プレスト > アレグレット > モデラート > アンダンテ > アダージョ > ラルゴ
この序列が守られるようなWord2Vecの実践例などがあると面白いですが。
1 2 3 4 5 6 7 8 9 10 11 12 |
for w, d in model.most_similar(u"アレグロ"): print("%s\t%.4f" % (w, d)) アンダンテ 0.8903 アダージョ 0.8699 モデラート 0.8246 アレグレット 0.8180 プレスト 0.7785 メヌエット 0.7524 スケルツォ 0.7302 Allegretto 0.7280 Allegro 0.7277 ラルゴ 0.7232 |
仕事でWord2Vecを使うシーンがあるとしたら、広告文のアイデアを助けたり、語彙力の弱い人の補助的なツールとして使えるかもしれませんが、実用レベルはまだまだ遠い気がします。
おまけ
左手に関しては、最も類似した単語が「右手」という結果になっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
for w, d in model.most_similar(u"左手"): print("%s\t%.4f" % (w, d)) 右手 0.9253 両手 0.8508 アルペッジョ 0.8326 跳躍 0.8131 オクターヴ 0.7938 音階 0.7925 和音 0.7866 スタッカート 0.7856 動き 0.7847 オクターブ 0.7792 |
参考文献