気になるある人の過去ツイートを収集・可視化してみる【twint,nlplot】

#0.はじめに
今回は言語処理活用の第1歩としてnlplotというライブラリを使用して、自分の過去ツイートをワードクラウドで可視化してみます。簡単かつ綺麗に色々表現できますので、ぜひ試してみてください。
(**気になるあの人のツイート内容を解析してみても楽しい・・・かも！**)

* 動作環境
 * OS : Windows10 pro(64bit)
 * Python : 3.8.3// Miniconda 4.9.1
 * MeCab : 0.996
 * NEologd (mecab-ipadic-neologd)
 * nlplot : 1.4.0
 * jupyter notebook


#1.導入

<dl>
  <dt>nlplot(自然言語分析ライブラリ)</dt>
  <dd><code>pip install nlplot</code>で導入できます</dd>
  <dt>twint(ツイート取得ライブラリ)</dt>
  <dd><code>pip install --user --upgrade -e git+https://github.com/twintproject/twint.git@origin/master#egg=twint</code>で導入できます</dd>
</dl>

:::note warn
Twitter公式のAPIからもツイート取得できますが、最新3500件までになってしまいます。
twintはいずれ公式から対策されて使えなくなるかもしれませんのでご注意を。
:::

#2.まずは自分の過去ツイートをDataFrameで取得する
気になる人・・の過去ツイートを記事にするわけにいきませんので、以下は自分のアカウントを解析対象とした場合の例です。`c.Username`の部分を解析したいユーザーに変えて色々試してみてください。

```Python:
import twint
import nest_asyncio

nest_asyncio.apply() #これやらないと私の環境はエラーでたので・・

c = twint.Config()
"""以下設定しないと無茶苦茶多く取得しちゃうので注意"""
c.Username = "ku_ai_dl" #解析するユーザーID　※＠の後を書けばいい(設定しないととんでもなく多くなってしまう)
c.Search = "Qiita" #抽出するキーワード(設定しなければすべてが抽出される)
c.Since = "2019-12-01" #取得開始日時
c.Until = "2021-05-19" #取得終了日時
c.Pandas = True #出力形式をPandasに設定

twint.run.Search(c)
```

これですでに期間内の「Qiita」というキーワードを含む過去ツイートが抽出されている。

```Python:
df = twint.storage.panda.Tweets_df #データフレーム形式に変換

df.head(1) #1行だけ表示
```

※めんどいので全部書きません。。

| id | conversation_id | created_at | date | timezone |	place | tweet | language |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|   |   |   | 2021-05-05 18:21:24  | +0900|   |  RNNを理解し、PyTorchで... | ja  | 


必要なのは`tweet`カラムだけなので。。

```Python:
Tweets_df = df['tweet'].to_frame() #tweetカラムのみデータフレーム形式で抽出

tweets_list = Tweets_df['tweet'].tolist() #tweetカラムをlist化して抽出しておく
```

#3.取得したカラムをMeCabで解析して、名詞を抜き出す

`MeCab`や`neologd`に関しての導入や使い方は[過去記事](https://qiita.com/ku_a_i/items/cf9fc9636958adafc690)で書いてますのでそちらを参照してください。


```Python:
# MeCabで特定の名詞だけ抜き取る
import re
import MeCab

#「-d」の後はneologdを配置してる場所を指定する。neologdはなくても解析可能
tagger = MeCab.Tagger('-d "./mecab-ipadic-neologd/neologd"')

def word_extraction(text):
    """文を取得して特定名詞だけ抽出する関数"""
    
    #邪魔なURL部分を正規表現で排除
    result = re.sub("https?://[\w!\?/\+\-_~=;\.,\*&@#\$%\(\)'\[\]]+", "", text)
    parse = tagger.parse(result) #解析
    
    lines = parse.split('\n') #改行で区切る
    nounlist = [] #特定名詞を格納するリスト
    for line in lines:
        feature = line.split('\t') #タブで区切る
        if len(feature) == 2: #'EOS'と''を省く
            info = feature[1].split(',') #カンマで区切る
            hinshi = info[0] #その0番目(品詞)を取得
            hinshi_classi = info[1] #1番目(品詞分類)を取得
            #名詞 - 一般,サ変,固有名詞　だけ抽出する　※抽出したいものに合わせてカスタマイズすればいい
            if (hinshi in ('名詞')) and ((hinshi_classi in ('一般')) or (hinshi_classi in ('サ変接続')) or (hinshi_classi in ('固有名詞'))):
                nounlist.append(feature[0]) #info[6]を取得してもいいが、今回は原文を取得
    return nounlist

#wordsカラムを↑の関数で挿入する
Tweets_df['words'] = Tweets_df['tweet'].apply(word_extraction)

Tweets_df.head(1) #1行表示する
```
| tweet | words |
|:-:|:-:|
|  RNNを理解し、PyTorchで実装する [Python] .. |  [RNN, 理解, PyTorch, 実装, Python, on, Qiita] |


#4.nlplotで可視化(解析)する

```Python:
import nlplot

npt = nlplot.NLPlot(Tweets_df, target_col='words') #Tweets_dfのwordsカラムを解析対象にする
stopwords = npt.get_stopword(top_n=4, min_freq=0) #ストップワードとして上記頻出4単語を排除する
print(stopwords)
```

```:実行結果
['on', '記事', 'Qiita', 'Python']
```

後は解析目的に応じて使用すればいい。
nlplotは日本人が作成していて、ご自身のBlogで使い方解説してますので他の機能はこちら[^1]を参照ください。

[^1]: 製作者の解説URL：https://www.takapy.work/entry/2020/05/17/192947

その中から今回は1例として、**wordcloud**[^2]の機能で可視化させてみる。

[^2]: 文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法

```Python:
#nlplotのwordcloudを使用して可視化させる
npt.wordcloud(
    stopwords=stopwords, #設定したストップワードを排除
    max_words=100,
    max_font_size=100,
    colormap='tab20_r',
    save=True
)
```
すると、以下のようにワードクラウド形式で表示される。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/3153a9c3-ad33-2df8-2a87-dd67a717c9b3.png" alt="wordcloud" width=90%>

#5.さいごに

今回は前回の形態素解析の記事に引き続き、その解析に関してTwitterを絡めて説明してみました。
次回の言語処理記事ではBERT等の最新技術に関して解説していく予定です。
もし良かったら~~チャンネル登録~~LGTM等お待ちしております(笑)