22
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MecabとDPマッチングで韻を見つけるシステムを作ってみた。

Last updated at Posted at 2020-12-07

近年のフリースタイルダンジョン、ヒプノシスマイクなどが流行りHIPHOP、ラップが一般に多く浸透してきています。
その影響をモロに受けた私が何か作れないかと思い、今回このシステム作成を行いました。

追記

(2024/09/30) コメント等色々ないですが、コードを共有します。
https://github.com/platinum-valley/rhyme_detector

動作にはPythonライブラリ、MeCab、mecab-ipadic-neologdのインストールが必要です。
以下、参考。

必要Pythonライブラリ(コードを見た感じです。)
flask
numpy
requests
mecab-python3

はじめに

韻は簡単に言えば__母音が一致している__ことです。
「最高」、「対応」は母音が「アイオウ」であり、いわゆる__韻を踏む__ことができています。

また、長音「ー」、促音「ッ」、撥音「ン」は省略される。
「エイ」が「エー」、「オウ」が「オー」に変換できる。などのルールもあります。

韻を踏むことで歌詞にリズムが生まれ、聞き心地がよくなります。

入力単語から韻が踏める単語を提示するWebサービスは以下のものがあります。
韻ノート
韻検索-作詞支援ツール

入力文章から韻を見つけるサービスや取り組みは見つからなかったのでやってみることにしました!
追記:既に取り組まれている方がいらっしゃいました。サーベイ力が足りませんね。

進捗

入力した文章(from 韻ノート)に対して、韻を見つけることができました!
eho03-zwnlm.gif

実験環境

  • Python3.6
  • Mecab 0.996
  • mecab-ipadic-neologd (2020年12月4日時点最新版)

システムの流れ

スクリーンショット 2020-12-08 0.21.24.png

  1. 入力文に対してMecabで読み仮名文を取得
  2. 読み仮名文から母音文を変換
  3. 母音文から同一の母音系列を探索。韻を見つける
  4. 見つかった韻に対応する入力文中の文字列の提示

Mecab

オープンソースの形態素解析エンジンです。1
形態素解析のみならず読み仮名を取得できるため、これを使って母音文を作成します。
スクリーンショット 2020-12-07 22.43.05.png

また、今回はMecab用のカスタム辞書mecab-ipadic-neologd2を用います。
このカスタム辞書は定期的に更新され、固有名詞などの形態素解析が可能になっています。
例えば、「霜降り明星」「四千頭身」という最近流行の芸人コンビ名を形態素解析します。
カスタム辞書を使わないと、下のように固有名詞として形態素解析できていません。また、四千頭身に至っては正しい読みが取得できません。
スクリーンショット 2020-12-07 23.04.22.png
一方でmecab-ipadic-neologdを使うと、それぞれを固有名詞として正しい読みも得ることができました。
スクリーンショット 2020-12-07 23.04.54.png

この韻を見つけるシステムではMecabの形態素解析精度におんぶにだっこです。ほんとにオブリガード

DPマッチング

動的計画法(Dynamic Programming)におけるマッチングの手法はタスクによって異なり、種類も多いようです。
今回は編集距離マッチングによって韻を見つけます。
編集距離(レーベンシュタイン距離)マッチングでは2つの文字列S,Tがあるときに、文字列Sに以下の処理を何回加えれば、文字列Tになるかを探索します。

  • 置換: 文字列Sの1文字を好きな文字に入れ替える。
  • 挿入: 文字列Sに好きな文字を挿入する。(空文字を好きな文字に置換する。)
  • 削除: 文字列Sの1文字を削除する。(空文字に置換する)

例をあげると、「たいよう」と「たいおう」の編集距離を検索する場合は、以下のように初期化します。それぞれの文字列の先頭には空文字が入っています。
スライド3.png

次にd(i, j)に入る編集距離を計算します。
スライド40.png

ここでは隣接する既知の編集距離からd(i,j)に至る編集距離をそれぞれ計算します。
この結果、最も小さい編集距離がd(i,j)に入る。この場合、d(i,j) = 0となります。

  • 挿入: d(i,j-1) + 1
  • 削除: d(i-1,j) + 1
  • 置換: d(i-1,j-1)) + cost
    • i, jに対応する文字が一致していればcost = 0一致していなければcost = 1

これを全てのマスで計算すると以下のように埋まります。右下の編集距離が最終的な編集距離となります。この場合は「よ」と「お」を置換するだけで一致するので__1__となります。

スライド5.png

長々とDPマッチングの説明をしましたが、ここから韻を見つけます。
ここでは、ある母音列と全ての母音列でマッチングを行います。
先の例と異なる点として、1行の初期化を全て0としています。これにより、全ての母音列のどこからでも検索を行うことができます。
スライド6.png

これを全マス埋めると以下のようになります。結果、一番下の行で0となっている点が、__編集距離が0=一致した文字列__を検索することができる。
スライド7.png

これが2個以上の場合に韻を踏めていると判定しています。

実験

タンポポ feat.ZORN/KREVAの一部分の歌詞で韻を探してみました。実際に聞いてみて韻がかなり踏まれていることを確認して欲しいです!
https://youtu.be/iW-jDqNE6M0?t=83
スクリーンショット 2020-12-08 2.16.50.png
スクリーンショット 2020-12-08 2.18.02.png
スクリーンショット 2020-12-08 2.19.02.png

米を「ベイ」と読んでしまっている。読みの修復はプログラムからは難しい。米→コメに変更すると拾える。
天下無双中→「エアウオウ」になっている。同母音の連続を集約すると拾える。一方で拾えなくなる韻も出てきそう。
とは言っても、多くの韻を見つけることはできている。

最後に

ここではMecabを使った読み仮名取得とDPマッチングによる韻検索を行うことで韻を見つけるシステムの構築を行いました。結果、形態素解析エンジンの読み仮名の取得ミスや母音の集約などの問題はあったものの、大体の韻を見つけることができました。

せっかくなのでwebアプリとしてデプロイしたかったですが、時間が足りませんでした。。。

  1. https://taku910.github.io/mecab/

  2. https://github.com/neologd/mecab-ipadic-neologd/

22
7
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?