[mecab] 千鳥の漫才を形態素解析して可視化する [wordcloud]

2022年1月21日金曜日

Artificial Intelligence

本記事では、beautifulsoupを使って千鳥の有名な漫才のテキストデータをWebスクレイピングで取得し、mecabで形態素解析、wordcloudでデータビジュアライゼーションするまでを紹介します。

アイキャッチ

概要

本記事では、「イカ2貫」のワードで有名な千鳥の漫才「クセのすごい寿司屋」を、wordcloudでデータビジュアライゼーション(データ可視化)していきます。

データビジュアライゼーションとは

データビジュアライゼーションとは、膨大で複雑なデータをグラフや図で分かりやすく表現する技術です。データ可視化とも言われます。

本記事のサムネイルに使用している下図は有名な書籍をデータビジュアライゼーションしたものですが、ピンと来た人もいらっしゃるのではないでしょうか?

こちらは、芥川龍之介の羅生門を表しています。頻出単語を大きく表示するなどの処理が施され、データを直感的に理解することができます。

羅生門の視覚化

デモ(Colaboratory)

それでは早速、動かしていきます。処理概要は以下の通りです。

  1. BeautifulSoupで千鳥の漫才のテキストを掲載しているサイトからWebスクレイピング
  2. mecabで漫才のテキストデータを形態素解析
  3. wordcloudで形態素解析結果をデータビジュアライゼーション

なお、これから紹介するソースコードは全てこちらのGitHubに掲載しております。

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

まずMecabをインストールします。
最近の環境ではChaSenの辞書ファイルが入っていないため、別途インストールします。

#Mecabのインストール
!pip install mecab-python3
!pip install unidic-lite
# dictファイルのインストール
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
!sudo apt install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file
%cd /content/mecab-ipadic-neologd
!./bin/install-mecab-ipadic-neologd -n # yesを入力

次に、wordcloudで日本語を表示するため日本語フォントをインストールしておきます。

# 日本語フォントをインストール
!apt -y install fonts-ipafont-gothic

以上でセットアップは完了です。

Webスクレイピング

次に、Webサイトから、テキストを取得します。 本記事では、以下のサイトをスクレイピングします。
【漫才】クセのすごい寿司屋 - 千鳥

url = 'https://www.smule.com/song/%E5%8D%83%E9%B3%A5-%E6%BC%AB%E6%89%8D-%E3%82%AF%E3%82%BB%E3%81%AE%E3%81%99%E3%81%94%E3%81%84%E5%AF%BF%E5%8F%B8%E5%B1%8B-%E5%8D%83%E9%B3%A5-karaoke-lyrics/6268102_6268102/arrangement'
res = requests.get(url)

取得したHTTPレスポンスデータを解析していきます。
<script>タグにテキストが入力されているので、BeautifulSoupで取得します。

# BeautifulSourpでWebページから情報取得
soup = BeautifulSoup(res.content, "lxml", from_encoding='utf-8')
for script_tag in soup.find_all('script'):
  if 'window.DataStore' in str(script_tag):
    target_text = ''
    text = script_tag.get_text()
    # 改行で分割
    lines = text.splitlines()
    for line in lines:
      if "Song:" in line:
        target_text = line
        #"Song:"を除去
        target_text = target_text.replace("Song:", "")
        # 末尾の","を除去
        target_text = target_text[::-1].replace(",", "", 1)[::-1]
        dialogue = json.loads(target_text)['lyrics']
        print(dialogue)

スクレイピングの最後に改行タグの除去、文字の整形を行います。

# tag除去
dialogue = re.sub('<.+?>', '', dialogue)
# ドゥーゾーはドゥーゾに統一
dialogue = dialogue.replace("ドゥーゾー", "ドゥーゾ")
print(dialogue)

著作権の関係でprint文の出力結果の表示は控えますが、漫才のセリフがWebサイトから抽出できています。

形態素解析

次にMecabで形態素解析を行います。
wordcloudに「~が」、「~を」のような助詞を含めると煩雑な結果になるため、形態素解析の結果から、名詞のみを抽出します。

def get_noun(text):
  #MeCabで形態素解析
  mecab = MeCab.Tagger('-Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
  node = mecab.parseToNode(text)
  words = []

  while node is not None:

      #品詞と品詞細分類1を抽出
      pos_type = node.feature.split(',')[0]
      subtype = node.feature.split(',')[1]

      #品詞が名詞、品詞細分類1が一般のとき
      if pos_type in ['名詞']:
          if subtype in ['一般']:
            # "ー"だけは除去
            if node.surface != "ー":
              words.append(node.surface)

      node = node.next
  # 出現数を集計し、ソート
  words_count = Counter(words)
  result = words_count.most_common()

  return result

形態素解析の結果名詞の頻度は以下の通りです。

for word, cnt in manzai_result:
    print(word, cnt)

ドゥーゾ 14
寿司 5
アラジャイ 4
握り 4
巾着 4
出刃 4
首 4
イカ 4
人 3
中 3
蟹 3
てんねん 3
マグロ 3
とこ 3
パート 2
ボケ 2
大将 2
そうそう 2
アテ 2
こだわり 2
次 2
魚 2
きた 2
一色 2
楽しみ 2
肉 2
紺色 2
気持ち 2
すか 2
毒 2
ネタ 1
はいはい 1
うまい 1
本場 1
感じ 1
カウンター 1
雰囲気 1
いらっしゃい 1
眉間 1
シワ 1
寄せて 1
ア 1
ラジャイ 1
外 1
年 1
オジイ 1
ないし 1
おまかせ 1
なにぶん 1
先客 1
脂 1
サンマ 1
ハラ 1
ワタ 1
塩 1
味 1
アマダイ 1
皮 1
クセ 1
もんじゃ 1
表面 1
ぐぅ 1
甘味 1
シオフッテマスンデ 1
ソノママドゥーゾ 1
頭 1
イクラ 1
ウニ 1
カニ 1
口 1
礼 1
店 1
システム 1
弾力 1
イルカ 1
クサ 1
臭み 1
脂身 1
ちゃう 1
ちょうちん 1
アンコウ 1
やろー 1
順番 1
上 1
サッシ 1
ないか 1
刺し 1

データビジュアライゼーション

最後に、この結果をwordcloudでデータビジュアライゼーションします。

def show_wordcloud(result):
  # 辞書型に変換
  dic_result = dict(result)

  # Word Cloudで画像生成
  wordcloud = WordCloud(
      background_color='black',
      font_path='/usr/share/fonts/truetype/fonts-japanese-gothic.ttf',
      width=900,
      height=600,
      colormap='tab10'
      ).fit_words(dic_result)

  # 画像の表示
  import matplotlib.pyplot as plt 
  from matplotlib import rcParams

  plt.figure(figsize=(15,10))
  plt.imshow(wordcloud)
  plt.axis("off")
  plt.show()

出力結果は以下の通りです。

漫才の形態素解析結果

漫才中に最も使われていた言葉は寿司ネタを出すときの「ドゥーゾ」でした。
有名なワード「イカ2貫」は、「イカ」、「2」、「貫」に分解されてしまいましたね。この点「イカ2貫」を固有名詞として辞書登録すればまた違った結果が得られるかもしれません。

まとめ

本記事では、千鳥の漫才「クセのすごい寿司屋」をデータビジュアライゼーションする方法を紹介しました。
処理としては、Webスクレイピング、形態素解析、データビジュアライゼーションと盛りだくさんですが、ライブラリを利用する事で、実装量はそれほどではありません。開発においても、うまく既存の技術を利用して開発負担を軽減していきたいものです。

データビジュアライゼーションは、プレゼンなど多くの場で聴衆に分かりやすく分析結果を伝える術として活用されます。
以下の書籍は、Pythonを用いたデータビジュアライゼーションについて詳しく記載されているためお勧めです。

AIエンジニア向けフリーランスならここがおすすめです

まずは無料会員登録

プロフィール

自分の写真
製造業に勤務する傍ら、日々AIの技術動向を調査しブログにアウトプットしています。 AIに関するご相談やお仕事のご依頼はブログのお問い合わせフォームか以下のアドレスまでお気軽にお問い合わせください。 bhupb13511@yahoo.co.jp

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology