chABSAデータセットの基礎集計
ここでは、chABSAデータセットの感情分析を行うにあたって、データの中身を事前に確認します。
具体的には、以下の内容を確認します。
- データ数
- 欠損値の確認
- Positive/Negativeラベルの分布を可視化する
- 文章の長さの確認
- 単語数を確認する
目次
使用するデータ
準備編:chABSAデータセットを感情分析のために整形するで作成したデータを使用します。
基礎集計
データの読み込み
事前準備として、データを読み込みます。
■python
import pandas as pd import numpy as np import matplotlib.pyplot as plt # データの読み込み df = pd.read_csv('../data/interim/chabsa-sentiment-analysis.csv') df.head()
![スクリーンショット 2023-09-07 18.49.41.png (33.9 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/cb59f148-9067-4729-be26-35a3588d76e5.png)
データ数の確認
■python
print(f'データ数: {df.shape[0]}')
データ数: 2813
欠損数の確認
■python
df.isnull().sum()
rating 0 sentence 0 dtype: int64
Positive/Negativeラベルの分布を可視化する
ポジティブが1670件(全体の59.3%)、ネガティブが1143件(全体の40.7%)で、やや偏りがあることがわかります。
■python
# Positive/Negativeラベルの分布を可視化する # 0: Negative, 1: Positive import seaborn as sns sns.countplot(x='rating', data=df);
![image.png (15.2 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/a8dfd490-0aeb-4a7a-b318-03018e0c4063.png)
■python
# 定量値を確認する df['rating'].value_counts()
rating 1 1670 0 1143 Name: count, dtype: int64
文章の長さの分布を確認する
文章の長さの平均は80文字で、50文字~100文字のあたりに山があることがわかります。ポジティブもネガティブも、分布に大きな違いがないことがわかります。
■python
# 文章の長さのカラムを追加する df['length'] = df['sentence'].str.len() df.head()
![image.png (38.0 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/e2908a5f-8a35-4a3f-a69b-b5b09c2d3f5c.png)
■python
# 文章の長さの分布を可視化する sns.histplot(df['length'], bins=50);
![image.png (18.0 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/e4d06e28-5adf-4244-83fe-fd75c6e48a9a.png)
■python
fig, axes = plt.subplots() sns.kdeplot(df[df['rating'] == 0]['length'], color='red', ax=axes); sns.kdeplot(df[df['rating'] == 1]['length'], color='blue', ax=axes);
![image.png (29.6 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/53c2aa21-bd50-4b4a-8014-a032e7e6a3c0.png)
単語数の分布を確認する
続いて、単語数の分布を確認します。
分かち書きの実行
spaCyを使って、分かち書きを実行します。元々の文章をリストに分割して、tokens列に入れます。
■python
import spacy nlp = spacy.load('ja_core_news_md') def apply_nlp(text): doc = nlp(text) return [token.text for token in doc] # tokensに分かち書きされた単語が入る df['tokens'] = df['sentence'].apply(apply_nlp) # num_tokensに単語数が入る df['num_tokens'] = df['tokens'].apply(len) df.head()
分布の確認
文章ごとの単語数の平均は47個で、50文字前後に山があることがわかります。ポジティブもネガティブも、分布に大きな違いがないことがわかります。
■python
# 単語数の分布を可視化する sns.histplot(df['num_tokens'], bins=50);
![image.png (17.0 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/ec7d4067-23e9-42fc-abe1-213b4362009f.png)
■python
# Positive/Negativeごとの文章の長さの分布を可視化する fig, axes = plt.subplots() sns.kdeplot(df[df['rating'] == 0]['num_tokens'], color='red', ax=axes); sns.kdeplot(df[df['rating'] == 1]['num_tokens'], color='blue', ax=axes);
![image.png (33.2 kB)](https://img.esa.io/uploads/production/attachments/16757/2023/09/07/93654/5a2d6928-799e-4684-93a0-5e70701e677b.png)
まとめ
ポジティブ/ネガティブのラベルの分布について、ポジティブが1670件(全体の59.3%)、ネガティブが1143件(全体の40.7%)で、やや偏りがあることがわかりました。
また、単語の長さの分布と文章の長さの分布について、全体の分布と、ポジティブ/ネガティブで分布に差がないことがわかりました。