File Icons
BLOG
(ch-1) 準備編:chABSAデータセットを感情分析(ポジネガ)のために整形する

準備編:chABSAデータセットを感情分析(ポジネガ)のために整形する

chABSAデータセットの基礎集計

ここでは、chABSAデータセットの感情分析を行うにあたって、データの中身を事前に確認します。

具体的には、以下の内容を確認します。

  • データ数
  • 欠損値の確認
  • Positive/Negativeラベルの分布を可視化する
  • 文章の長さの確認
  • 単語数を確認する

目次

  1. chABSAデータセットとは
  2. chABSAデータセットの構造
  3. データセットを感情分析のために整形する
  4. 参考

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
        },...
      ]
    },...
  ]
}
パラメータ名説明
headerobjアノテーション対象文書のメタ情報
sentencesarray[obj]文書内の各文に行われたアノテーション結果の配列

headerの要素

パラメータ名説明
document_idstr一意の文書id
document_namestr文書名(企業名)
doc_textstr文書種別名
edi_idstr企業のEDINETコード
security_codestr企業の証券コード
category33str企業の33業種区分
category17str企業の17業種区分
scalestr企業の規模区分

sentencesの要素

パラメータ名説明
sentence_idint文書内の各文に振られた文id
sentencestrアノテーション対象の文
opinionsarray[obj]アノテーションの配列

optionsの要素

パラメータ名説明
targetstrpolarityの対象となっているEntity
categorystrEntityの種類のラベル
polaritystrポジティブ・ネガティブ・中立のラベル
fromint元の文書におけるtargetの開始位置
toint元の文書における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()
image.png (28.8 kB)

文書とその文書のポジティブ/ネガティブのフラグを持つデータセットを作成することができました。最後にこのデータセットをcsvファイルに書き出しておきます。

■python

df.to_csv('../data/interim/chabsa-sentiment-analysis.csv', index=False, encoding='utf-8')

参考

CONTACT
ご依頼やご相談、サービスについてのご質問やご要望がございましたら、お気軽にお問い合わせください。
送付いただいた内容を確認の上、担当者からご連絡させていただきます。
お問い合わせ