準備編:chABSAデータセットを感情分析(ポジネガ)のために整形する
chABSAデータセットの基礎集計
ここでは、chABSAデータセットの感情分析を行うにあたって、データの中身を事前に確認します。
具体的には、以下の内容を確認します。
- データ数
- 欠損値の確認
- Positive/Negativeラベルの分布を可視化する
- 文章の長さの確認
- 単語数を確認する
目次
chABSAデータセットとは
chABSA(Comprehensive Human-annotated Japanese ABSA)データセットは、日本の企業に関する金融報告書から抜粋された文書に基づいた、感情分析(ポジネガ)のための日本語データセットです。このデータセットは、文書の特定の要素や概念(例:製品の品質、サービス、価格など)に対する感情(ポジティブ、ネガティブ、中立など)を識別するために使用されます。
chABSAは、日本語の自然言語処理タスクにおいてよく使われるリソースの一つであり、多くの研究で参照されています。
chABSAデータセットの構造
chABSAデータセットの構造を確認します。公式リポジトリ上には、データが以下のような構造であると記載されています。
■json
{ "header": { "document_id": "E00008", "document_name": "ホクト株式会社", "doc_text": "有価証券報告書", "edi_id": "E00008", "security_code": "13790", "category33": "水産・農林業", "category17": "食品", "scale": "6" }, "sentences": [ { "sentence_id": 0, "sentence": "当連結会計年度におけるわが国経済は、政府の経済政策や日銀の金融緩和策により、企業業績、雇用・所得環境は改善し...", "opinions": [ { "target": "わが国経済", "category": "NULL#general", "polarity": "neutral", "from": 11, "to": 16 }, { "target": "企業業績", "category": "NULL#general", "polarity": "positive", "from": 38, "to": 42 },... ], }, { "sentence_id": 1, "sentence": "当社グループを取り巻く環境は、実質賃金が伸び悩むなか、消費者の皆様の...", "opinions": [ { "target": "実質賃金", "category": "NULL#general", "polarity": "negative", "from": 15, "to": 19 },... ] },... ] }
パラメータ名 | 型 | 説明 |
---|---|---|
header | obj | アノテーション対象文書のメタ情報 |
sentences | array[obj] | 文書内の各文に行われたアノテーション結果の配列 |
headerの要素
パラメータ名 | 型 | 説明 |
---|---|---|
document_id | str | 一意の文書id |
document_name | str | 文書名(企業名) |
doc_text | str | 文書種別名 |
edi_id | str | 企業のEDINETコード |
security_code | str | 企業の証券コード |
category33 | str | 企業の33業種区分 |
category17 | str | 企業の17業種区分 |
scale | str | 企業の規模区分 |
sentencesの要素
パラメータ名 | 型 | 説明 |
---|---|---|
sentence_id | int | 文書内の各文に振られた文id |
sentence | str | アノテーション対象の文 |
opinions | array[obj] | アノテーションの配列 |
optionsの要素
パラメータ名 | 型 | 説明 |
---|---|---|
target | str | polarityの対象となっているEntity |
category | str | Entityの種類のラベル |
polarity | str | ポジティブ・ネガティブ・中立のラベル |
from | int | 元の文書におけるtargetの開始位置 |
to | int | 元の文書におけるtargetの終了位置 |
データセットを感情分析のために整形する
chABSAのデータセットは、文書の各要素に対してポジティブ・ネガティブがつけられています。これを、文に対してポジティブ・ネガティブを振るように加工します。
今回は文の各要素のネガティブ・ポジティブなEntity数をカウントして、「ネガティブ > ポジティブ」なら、その文全体を「ネガティブ」と判定し、「ネガティブ < ポジティブ」なら、その文全体を「ポジティブ」と判定します。
※ 「ネガティブ=ポジティブ」の場合は、判別がつかないため、その文をスキップします。ネガティブ・ポジティブの分類問題として解けるようにするため。
加工用のPythonコード
以下のコードを実行します。
■python
import json from pathlib import Path import pandas as pd # パスの一覧を取得 data_dir = "../data/raw/chABSA-dataset/" data_path = Path(data_dir) path_list = [p for p in data_path.iterdir()]
以下の関数が、メインの加工のための関数です。sentencesの中に複数の文書が含まれていることがあるため、for文で回しています。
■python
def create_ratings(sentences): ratings = {'rating': [], 'sentence': []} for obj in sentences: sentence = obj['sentence'] #文書の取得 options = obj['opinions'] #options部分を取得 rating = 0 for option in options: porarity = option['polarity'] if porarity == 'positive': rating += 1 elif porarity == 'negative': rating -= 1 if rating !=0 : ratings['rating'].append(rating) ratings['sentence'].append(sentence) return pd.DataFrame(ratings)
上記の関数を、chABSAデータセットの各JSONファイルに対して適用し、結果のデータフレームをリストに格納します。最後にpd.concatで、データフレームをひとつに結合します。
※ データセットのファイル中にエンコード形式が異なるファイルが含まれています。ここでは、そのようなファイルは無視しています。
■python
import chardet #全ファイルからratingと文書を抽出 list_dfs = [] for p in path_list: with open(p, 'rb') as f: #文字コードを判定して、UTF-8以外はスキップ binary_data = f.read() det_chardet = chardet.detect(binary_data) if det_chardet['encoding'] != 'utf-8': continue # エンコードして読み込み text_data = binary_data.decode('utf-8') j = json.loads(text_data) list_dfs.append(create_ratings(j['sentences'])) # データフレームを結合 df = pd.concat(list_dfs) #ネガポジの分類「0: ネガティブ、1: ポジティブ」 df['rating'] = df['rating'].apply(lambda x: 1 if x > 0 else 0) df.haed()
文書とその文書のポジティブ/ネガティブのフラグを持つデータセットを作成することができました。最後にこのデータセットをcsvファイルに書き出しておきます。
■python
df.to_csv('../data/interim/chabsa-sentiment-analysis.csv', index=False, encoding='utf-8')