
Pythonで現代の季語を調べてみた
初めまして!! Aidemy研修生のカピバラさんです。 表題の通り、今回僕はPythonで現代の季語を調べてみました。 俳句の授業などで季語に関して習うと思いますが、何でこの言葉が季語なんだろうって思うことありませんでしたか? 僕は、今と昔で感じ方が違うのかなーと思いながら頑張って暗記してました。 では、現代の人々が季語だと感じているのはどんな言葉なんでしょう。 今でいう昔の俳句のようなものと言えば、CDなどで世に出回っている曲かなと思います。そこで、春夏秋冬、それぞれのイメージを持たれている曲の歌詞から現代の季語を調べていきます。
環境
以下、今回の開発環境です。
- windows10
- Python3.6.5
- Jupyter4.4.0
また、インポートしたライブラリは以下のようになっています。
webスクレイピング
まずは、webスクレイピングによって季節ごとの曲の歌詞を収集します。 今回は、以下のサイトからスクレイピングをさせて頂きました。
- 春の歌・春の曲人気投票(スプリングソング・ランキング)
- 夏の歌・夏の曲人気投票(サマーソング・ランキング)
- 秋の歌・秋の曲人気投票(オータムソング・ランキング)
- 冬の歌(ウィンターソング)人気曲投票ランキング
- 歌詞検索サービス 歌ネット
今回のwebスクレイピングは大きく分けて2段階に分かれます。
- 人気曲投票ランキングから季節の曲の曲名と歌手名を取得する
- 歌詞検索サービスによって指定の曲を検索し、歌詞を取得する
まず、1からやっていきましょう。 それぞれの季節の曲の人気ランキングから曲名と歌手名を取得していきます。 今回参照したサイトでは「曲名(歌手名)」のように曲名と歌手名が連なって表記されているため、取得のついでに曲名と歌手名を分けてリストに入れます。
しかし、表記方法がぶれていたり、そもそも歌手の情報がなかったりと上手く情報が取得できない曲もあったため、そういった曲はリストから削除してしまいました。 ソースコードはこんな感じです。
続いて、2に取り掛かります。 先ほど取得した曲名と歌手名のリストを使って歌詞を検索し、取得します。 検索機能があるwebページでは、ユーザーが入力した情報をurlの中に組み込んで検索結果のページに遷移することによって、検索を行っている場合があります。
そのような場合、urlに直接キーワードを入力することでも検索ができます。 今回はそれを利用しました。 試しに歌詞検索のページで「カピバラ」というキーワードにより曲名検索をしてみると以下のようなurlのページに遷移しました。
https://www.uta-net.com/search/?Aselect=2&Keyword=カピバラ&Bselect=4&x=24&y=15
この「カピバラ」の部分に検索したい曲名を入れたurlを登録することで、曲名検索を行います。 そして、検索結果の中から歌手名が一致する曲の歌詞を取得しました。 ソースコードはこんな感じです。
これで、webスクレイピングは終了です! これで、それぞれの季節の曲の歌詞をテキストファイルに保存することができました。 結果としては、春:51曲、夏:127曲、秋:39曲、冬112曲の歌詞を取得できました。 季節によってだいぶ偏りがありますが、そもそもランキングに載っている曲数がかなり偏っていたため、仕方ないかなということでこのまま進めていきます。
歌詞データの整理
次に、歌詞データを整理していきます。 今回は、日本語の季語を調べたいため、英文字は不要です。また、記号や空白、改行なども要りません。そういったもの正規表現を使って予め削除していきます。 また、文字列の正規化も行います。 複数の文書から特徴を抽出する場合、入力ルールが統一されておらず表記揺れが発生している場合があります。
そうすると、同じはずの単語を別のものとして解析してしまい、意図しない解析結果になってしまいます。 この表記ゆれを無くすために、全角を半角に統一や大文字を小文字に統一等、ルールベースで文字を変換することを正規化と言います。 正規化はライブラリの NEologd を用いると簡単に行うことができます。 ソースコードはこんな感じです。
名詞を抽出
続いて、歌詞データの中から名詞を抽出していきます。 名詞を抽出するためにまず形態素解析を行います。 形態素解析とは、辞書を利用して形態素に分割し、さらに形態素ごとに品詞などのタグ付け(情報の付与)を行うことです。形態素は意味を持つ最小の言語単位です。 例えば、「明日は晴れるだろうか。」という文に対して形態素解析を行うと以下のような結果が得られます。
今回はjanomeという形態素解析器を用いて、形態素解析を行い、名詞を抽出します。 ソースコードはこんな感じです。
出現数をカウント
次に、単語の出現数をカウントしていきます。 出現数のカウントには、ライブラリのcollectionsを使用します。 単語の出現数をカウントし、上位30単語を抽出します。 ソースコードはこんな感じです。
取得結果を調整
最後に取得結果を調整します。 まず、季節の単語そのまま(春、夏、秋、冬)は季語とは言えないため、ストップワードとし、削除します。 また、他の季節でも出てきている単語は季語とは言えないため、重複している単語も削除します。 ストップワード削除のソースコードはこんな感じです。
結果と考察
今回のプログラムで得られた結果はこんな感じになりました。 数字は単語の出現数です。
「花」や「桜」、「海」や「雪」などイメージ通りの単語を抽出することができたかなと思います。 個人的に驚いたのは秋の「涙」や、冬の「街」ですね。潜在的にそういうイメージをもっているのでしょうか。 あとは、秋で「そば」が抽出されていますが、最初「蕎麦」を抽出できたのかと思い感動してました(蕎麦の旬は10~11月らしいです)。でもこれ多分「傍」ですね。途中で気づいてがっかりしてました。 まだ、「それ」や「どこ」など意味のない単語を抽出してしまっているため、そのような単語を削除できれば、精度は上がっていくのかなと思います。
また、「さくら」と「桜」が別の単語として出力されています。word2vecを使った類似度計算などで対策しようかとも思ったのですが、季語の中には似たような言葉もあったイメージがあって、必要以上にまとめ上げられてしまいそうな気がしたため、今回はやめておきました。こういった部分も今後の課題です。 ここまで読んでいただき、ありがとうございました!!
参考
今回、単語の出現数をカウントする際に以下のサイトを参考にさせて頂きました。 ありがとうございます。 www.lifewithpython.com
PythonやAIプログラミングを学ぶなら、オンライン制スクールのアイデミープレミアムプラン。
「機械学習・ディープラーニングに興味がある」
「AIをどのように活用するのだろう?」
「文系の私でもプログラミング学習を続けられるだろうか?」
少しでも気になることがございましたら、ぜひお気軽にAidemy Premium Planの無料相談会にお越しいただき、お悩みをお聞かせください!
このほかにも、Aidemy MagazineとTwitter(@AidemyMagazine)ではたくさんのAI活用事例をご紹介しています。どちらも要チェック!それではまた次の記事でお会いしましょう。最後までご覧くださりありがとうございました。