準備編: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')
