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

2022年1月21日金曜日

Artificial Intelligence

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

アイキャッチ

概要

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

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

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

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

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

羅生門の視覚化
スポンサーリンク

デモ(Colaboratory)

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

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

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

それでは、実際に動かしながら形態素解析を行います。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

環境セットアップ

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

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

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

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

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

Webスクレイピング

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

  1. 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'
  2. res = requests.get(url)

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

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

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

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

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

形態素解析

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

  1. def get_noun(text):
  2. #MeCabで形態素解析
  3. mecab = MeCab.Tagger('-Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
  4. node = mecab.parseToNode(text)
  5. words = []
  6.  
  7. while node is not None:
  8.  
  9. #品詞と品詞細分類1を抽出
  10. pos_type = node.feature.split(',')[0]
  11. subtype = node.feature.split(',')[1]
  12.  
  13. #品詞が名詞、品詞細分類1が一般のとき
  14. if pos_type in ['名詞']:
  15. if subtype in ['一般']:
  16. # "ー"だけは除去
  17. if node.surface != "ー":
  18. words.append(node.surface)
  19.  
  20. node = node.next
  21. # 出現数を集計し、ソート
  22. words_count = Counter(words)
  23. result = words_count.most_common()
  24.  
  25. return result

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

  1. for word, cnt in manzai_result:
  2. print(word, cnt)
  3.  
  4. ドゥーゾ 14
  5. 寿司 5
  6. アラジャイ 4
  7. 握り 4
  8. 巾着 4
  9. 出刃 4
  10. 4
  11. イカ 4
  12. 3
  13. 3
  14. 3
  15. てんねん 3
  16. マグロ 3
  17. とこ 3
  18. パート 2
  19. ボケ 2
  20. 大将 2
  21. そうそう 2
  22. アテ 2
  23. こだわり 2
  24. 2
  25. 2
  26. きた 2
  27. 一色 2
  28. 楽しみ 2
  29. 2
  30. 紺色 2
  31. 気持ち 2
  32. すか 2
  33. 2
  34. ネタ 1
  35. はいはい 1
  36. うまい 1
  37. 本場 1
  38. 感じ 1
  39. カウンター 1
  40. 雰囲気 1
  41. いらっしゃい 1
  42. 眉間 1
  43. シワ 1
  44. 寄せて 1
  45. 1
  46. ラジャイ 1
  47. 1
  48. 1
  49. オジイ 1
  50. ないし 1
  51. おまかせ 1
  52. なにぶん 1
  53. 先客 1
  54. 1
  55. サンマ 1
  56. ハラ 1
  57. ワタ 1
  58. 1
  59. 1
  60. アマダイ 1
  61. 1
  62. クセ 1
  63. もんじゃ 1
  64. 表面 1
  65. ぐぅ 1
  66. 甘味 1
  67. シオフッテマスンデ 1
  68. ソノママドゥーゾ 1
  69. 1
  70. イクラ 1
  71. ウニ 1
  72. カニ 1
  73. 1
  74. 1
  75. 1
  76. システム 1
  77. 弾力 1
  78. イルカ 1
  79. クサ 1
  80. 臭み 1
  81. 脂身 1
  82. ちゃう 1
  83. ちょうちん 1
  84. アンコウ 1
  85. やろー 1
  86. 順番 1
  87. 1
  88. サッシ 1
  89. ないか 1
  90. 刺し 1

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

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

  1. def show_wordcloud(result):
  2. # 辞書型に変換
  3. dic_result = dict(result)
  4.  
  5. # Word Cloudで画像生成
  6. wordcloud = WordCloud(
  7. background_color='black',
  8. font_path='/usr/share/fonts/truetype/fonts-japanese-gothic.ttf',
  9. width=900,
  10. height=600,
  11. colormap='tab10'
  12. ).fit_words(dic_result)
  13.  
  14. # 画像の表示
  15. import matplotlib.pyplot as plt
  16. from matplotlib import rcParams
  17.  
  18. plt.figure(figsize=(15,10))
  19. plt.imshow(wordcloud)
  20. plt.axis("off")
  21. plt.show()

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

漫才の形態素解析結果

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

まとめ

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

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

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology