ツイートを整形する【🐶のような絵文字も削除】｜つぶやきをWordcloudで可視化②

私事ではありますが、2020年5月にコーギーという中型犬をお迎えしました。
<b>[愛犬のブログ](https://corgi-komugi.com/)</b>を運営してますので、見てもらえると嬉しいです。

<img width="400" alt="corgi_komugi" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/1d07a01c-ce87-9262-c112-e8509ebb3a4e.jpeg">

<b>「コーギー関連のツイートをwordcloudで可視化したい！」</b>と思い立ち、以下の4項目を実施しました。

1. [TwitterAPIでツイートを取得](https://qiita.com/komugi_papa/items/e5d7fb6dafaf68caa1e0)
2. 正規表現を用いてツイートを整形 ← 今回
3. [SudachiPyで形態素単位に分割](https://qiita.com/komugi_papa/items/7d04e386550406371ec5)
4. [WordCloudで可視化](https://qiita.com/komugi_papa/items/8b0cbe1f2674ed54040b)

⇒ <b>[一連のコードと様々なアウトプットの表示](https://corgi-komugi.com/twitter_wordcloud/)</b>

今回は、<b>「正規表現を用いてツイートを整える」</b>に関して説明していきます。

## 対象者

- ツイートから不要な部分を取り除くために、コードを書きたい人
- 🐶のような絵文字を上手く取り除けず、困っている人

##ざっくりとした要件定義

Input ... ツイート内容のDataFrame
Output ... 自然言語処理のために整形済みのツイート内容

Inputは、こちらの記事で取得したデータフレーム(以下)になります。

![2021-07-12_22h36_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/f5735792-4caf-98ee-0780-96c13b2d9e52.png)

Outputは、テキスト内容を整形し、以下のようになります。

![2021-07-13_06h26_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/057b766b-b1ed-7762-f3c1-6efadf91efc7.png)


##コード
###コード全体


```python
import pandas as pd
pd.set_option("display.max_colwidth", 280)
import emoji

def remove_emoji(text):
    return emoji.get_emoji_regexp().sub(u'', text)

def format_df_text(text_col,df):
    '''
    ツイートを整形する
    (形態素解析でsudachiを使用予定のため、textの修正が少ない)
    '''
    df['temp'] = df[text_col].replace(r'https?://[w/:%#$&?()~.=+-…]+', '', regex=True) #画像へのリンクを削除
    df['temp'] = df['temp'].replace(r'@[w/:%#$&?()~.=+-…]+', '', regex=True) #'@'によるメンションを削除
    df['temp'] = df['temp'].replace(r'#(\w+)', '', regex=True) #ハッシュタグ(半角)を削除
    df['temp'] = df['temp'].replace(r'＃(\w+)', '', regex=True) #ハッシュタグ(全角)を削除
    df['temp'] = df['temp'].apply(lambda x: remove_emoji(x)) #🐶のような絵文字を削除
    return df['temp']

df['TW_TEXT_mod'] = format_df_text('TW_TEXT',df)

```

### コードの解説

<b>まずは、🐶のような絵文字を削除します。</b>
emojiライブラリをインストールし、絵文字を削除するためのremove_emoji関数を作成しました。

```python
def remove_emoji(text):
    return emoji.get_emoji_regexp().sub(u'', text)
```

なお、emojiライブラリはpipでインストールできます。

```
pip install emoji --upgrade
```

詳細は[こちら](https://qiita.com/yoshimo123/items/85331d881aed9ad41020)になります。


最初は[この記事](https://stackoverflow.com/questions/57514169/how-can-i-remove-emojis-from-a-dataframe
)のようにencodeとdecodeで上手く処理しようと試みたのですが、絵文字だけでなく日本語テキストも削除されてしまいました。

<b>「ライブラリをあまりインストールしたくない」</b>と思うかもしれませんが、素直にemojiライブラリを使用することをおススメします。
<br>
<b>次に、さきほどのremove_emoji関数を使用し、テキスト全体を整形する関数を作成します。</b>

```python
def format_df_text(text_col,df):
    '''
    ツイートを整形する
    (形態素解析でsudachipyを使用予定のため、textの修正が少ない)
    '''
    df['temp'] = df[text_col].replace(r'https?://[w/:%#$&?()~.=+-…]+', '', regex=True) #画像へのリンクを削除
    df['temp'] = df['temp'].replace(r'@[w/:%#$&?()~.=+-…]+', '', regex=True) #'@'によるメンションを削除
    df['temp'] = df['temp'].replace(r'#(\w+)', '', regex=True) #ハッシュタグ(半角)を削除
    df['temp'] = df['temp'].replace(r'＃(\w+)', '', regex=True) #ハッシュタグ(全角)を削除
    df['temp'] = df['temp'].apply(lambda x: remove_emoji(x)) #🐶のような絵文字を削除
    return df['temp']
```

次の章でsudachipyという形態素解析器を使用しますが、sudachipyは自動で正規表記化(たとえば、'summer'という単語を「サマー」と認識)してくれるので、前処理は少なめにしています。

また、ハッシュタグを全角で記入しているケースもあったので、ハッシュタグの半角・全角ともに削除するようコードを書きました。
おそらくですが、ハッシュタグ関連のコードは1行にまとめられると思います。
(~~正規化が苦手なので諦めました。~~)
<br>
<b>最後に、これらの関数を使用し、テキストを整形します。</b>

```python
df['TW_TEXT_mod'] = format_df_text('TW_TEXT',df)
```

##まとめ
この記事では、正規表現を用いてツイートを整形するコードを見ていきました。

次は、形態素解析器を用いて、ツイートを単語に分割していきたいと思います。
[こちらの記事](https://qiita.com/komugi_papa/items/7d04e386550406371ec5)で説明してますので、興味があれば見てもらえると嬉しいです。

<img width="400" alt="corgi_komugi" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/1b3f0447-f365-50ee-9e96-ac3134ffad25.jpeg">

##参考文献
[pythonで絵文字を駆逐する](https://qiita.com/yoshimo123/items/85331d881aed9ad41020)
[収集したTwitterの対話データの前処理をする。](https://www.pytry3g.com/entry/master-Preprocessing)