Python

自然言語処理が簡単にできる「nlplot」でツイートデータを可視化・分析する

この記事は約10分で読めます。

 

今回は業務でツイッターAPIを用いてツイートデータを収集して「nlplot」というライブラリでワードクラウドや共起ネットワークの作成みたいな自然言語処理を少し試してみたので忘れないようにメモしておきます。

 

前準備

 

必要なライブラリのインストール

 

今回使用するライブラリは「nlplot」「Tweepy」「Mecab」の3つです

 

nlplot

 

# ライブラリのインストール
$ pip install nlplot==1.6.0

 

バージョンでメソッドの書き方が変わっているのでバージョンを固定していますが、依存性が多いライブラリなので動かない場合は最新バージョンをインストールしたほうがいいと思います

詳しい話についてはライブラリの作成者さんのサイトを参考にしてください

 

Tweepy

 

$ pip install tweepy --upgrade

 

Mecab

 

インストールしていない方は以下のコマンドでインストールしてください

 

$ pip install mecab-python3

 

参照:Google ColaboratoryにMecabをインストールして形態素解析を行うサンプルコード

 

ツイートデータをスクレイピングする

 

まずは分析の元になるツイートデータをTwitterAPIを用いたスクレイピングにて取得します。

今回はTwitterAPI2.0を用いています。

 

API鍵の種類のあれこれとかツイートデータのスクレイピングについて下記記事参照

参照:【Python】TwitterAPI V2のBearer tokenを使ってツイート検索をしてみる

 

ちなみにですが、無料のAPI鍵だと過去10日間しか遡れない&検索数に上限があるので、全期間や過去30日間のツイートについては有料APIが必要になります。

 

参照:【Python】TwitterのAPIを使って過去全期間のツイートをスクレイピング

 


import tweepy
from datetime import datetime
from datetime import timedelta
import json
import requests
import traceback
import os
import pandas as pd

print(f'tweepyのバージョンは{tweepy.__version__}です')

consumer_key = 'xxxx'
consumer_secret = 'xxxx'
access_token = 'xxxx'
access_token_secret = 'xxxx'

#APIインスタンスの作成
client = tweepy.Client(bearer)
api = tweepy.Client(None, consumer_key, consumer_secret, access_token, access_token_secret)

# ツイート取得
data = []

for tweet in tweepy.Paginator(client.search_recent_tweets, query='ワンピース 映画 lang:ja -is:retweet',
    expansions='author_id',max_results=100).flatten(limit=500):
    data.append(tweet.data['text'])

df=pd.DataFrame(data, columns=['data'])
df

<実行結果>

 

 

スポンサーリンク
スポンサーリンク

Pythonでの自然言語処理

 

Mecabで形態素解析して名詞を取り出す

 

まずは取得したテキストデータをMecabで形態素解析します。本記事はColabでMecabの環境構築が完了している前提で進めていますが、もし環境構築難しい場合はGoogle Natural Language APIなどで代用可能です。

 

def mecab_text(text):
    ng_word = ['https', '/','t', 'co','://','.','#',':','こと','さん','ちゃん']
    #MeCabのインスタンスを作成(辞書はmecab-ipadic-neologdを使用)
    mecab = MeCab.Tagger('')
    
    #形態素解析
    node = mecab.parseToNode(text)
    
    #形態素解析した結果を格納するリスト
    wordlist = []
    
    while node:
        #名詞のみリストに格納する
        if node.feature.split(',')[0] == '名詞':
            try:
              if node.surface not in ng_word:
                try:
                  int(node.surface)
                except:
                  if len(node.surface) > 1:
                    wordlist.append(node.surface)
            except:
              wordlist = []
        #他の品詞を取得したければ、elifで追加する
        #elif node.feature.split(',')[0] == '形容詞':
        #    wordlist.append(node.surface)
        node = node.next
    return wordlist

#形態素結果をリスト化し、データフレームdf1に結果を列追加する
df['words'] = df['text'].apply(mecab_text)

#表示
df

 

<実行結果>

 

実行するとデータフレームに新たにwordsという列が作成され、そこに形態素解析したものの中で名詞と判定されたものがリストで格納されます。これでデータが前処理ができたのでいよいよこのツイートデータを自然言語処理で可視化していきます。

 

頻出単語の可視化

 

まずは頻繁に出てきたワードを可視化します。

 

import nlplot

npt = nlplot.NLPlot(df, target_col='words')

# top_nで頻出上位単語, min_freqで頻出下位単語を指定できる
# ストップワーズは設定しませんでした。。。
stopwords = npt.get_stopword(top_n=0, min_freq=0)

npt.bar_ngram(
    title='uni-gram',
    xaxis_label='word_count',
    yaxis_label='word',
    ngram=1,
    top_n=50,
    stopwords=stopwords,
)

 

<実行結果>

ツリーマップで見せたい場合は以下のように記述します

 

npt.treemap(
    title='Tree of Most Common Words',
    ngram=1,
    top_n=30,
    stopwords=stopwords,
)

 

<実行結果>

単語数の分布を確認したい場合は以下のように記述します。

 

# 単語数の分布
npt.word_distribution(
    title='number of words distribution',
    xaxis_label='count',
)

 

<実行結果>

 

ワードクラウドの作成

 

# ワードクラウドを出力する
npt.wordcloud(
    max_words=100,
    max_font_size=100,
    colormap='tab20_r',
    stopwords=stopwords,
)

 

これでグラフが表示されない場合は以下のコマンドを追加してみてください

 

%matplotlib inline
plt.figure(figsize=(10, 15))
plt.imshow(fig_wc, interpolation="bilinear")
plt.axis("off")
plt.show()

 

<実行結果>

 

共起ネットワークの作成

 

#共起ネットワーク図作成
# ビルド(データ件数によっては処理に時間を要します)※ノードの数のみ変更
npt.build_graph(stopwords=stopwords, min_edge_frequency=10)

display(
    npt.node_df.head(), npt.node_df.shape,
    npt.edge_df.head(), npt.edge_df.shape
)

npt.co_network(
    title='Co-occurrence network',
)

 

上記でグラフが出力されない場合は以下を試してみてください

 

#共起ネットワーク図作成
#iplotをインポートして使えば結果が表示される
from plotly.offline import iplot

# ビルド(データ件数によっては処理に時間を要します)
npt.build_graph(stopwords=stopwords, min_edge_frequency=2)

# ビルド後にノードとエッジの数が表示される。ノードの数が100前後になるようにするとネットワークが綺麗に描画できる
#>> node_size:63, edge_size:63

fig_co_network = npt.co_network(
title='Co-occurrence network',
sizing=100,
node_size='adjacency_frequency',
color_palette='hls',
width=1100,
height=700,
save=False
)
iplot(fig_co_network)

 

<実行結果>

感情度の可視化

 

npt.sunburst(
    title='All sentiment sunburst chart',
    colorscale=True,
    color_continuous_scale='Oryel',
    width=800,
    height=600,
    save=True
)

 

<実行結果>

終わり

 

こんな感じで「nlplot」を使うことで関数1つで様々なグラフのプロットが可能なので非常に便利です。

 

関連記事:【Python】PymlaskでML-ASK感情分析をやってみた話

 

関連記事:【Python】GoogleColab上でNetworkXによる日本語の共起ネットワークを文字化けせずにプロット

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

  1. […] 関連記事:自然言語処理が簡単にできる「nlplot」でツイートデータを可視化・分析する […]

  2. […] 関連記事:自然言語処理が簡単にできる「nlplot」でツイートデータを可視化・分析する […]

タイトルとURLをコピーしました