【自然言語処理】【感情分析】chABSA-datasetを扱いやすいように整形する
chABSA-datasetとは
chABSA-datasetとは、機械学習で感情分析を行うためのデータセットで、TIS株式会社が無償公開しているものです。
上場企業の有価証券報告書(2016年度)をベースに作成されており、各文章の中で、「何が」ネガティブで、ポジティブなのかという観点を表す情報が含まれています。
一方、データ構造が少々複雑なので、そのまま扱うことができません。タスクにあわせて扱いやすいように、データを整形してやる必要があります。
ここでは、BERTで感情分析を行うことを前提に、chABSA-datasetを整形する方法についてご紹介していきます。
以下のサイトも参考にしています。少しやり方を変えています。
データセットのダウンロード
以下のコードを実行すると、chABSA-datasetというディレクトリが作成され、その中にjsonファイルが格納されます。
!wget https://s3-ap-northeast-1.amazonaws.com/dev.tech-sketch.jp/chakki/public/chABSA-dataset.zip
!unzip chABSA-dataset.zip
データの構造
データファイルは230あり、その一つ一つが企業の有価証券報告書のデータになります。
データを1つ取り出して、構造をみましょう。
import json
with open("/content/chABSA-dataset/e00037_ann.json","br") as f:
data = json.load(f)
data
出力結果
{'header': {'document_id': 'E00037',
'document_name': '三井松島産業株式会社',
'doc_text': '有価証券報告書',
'edi_id': 'E00037',
'security_code': '15180',
'category33': '鉱業',
'category17': 'エネルギー資源',
'scale': '7'},
'sentences': [{'sentence_id': 0,
'sentence': '当連結会計年度における世界経済は、米国経済の持ち直しなどにより、全体としては緩やかな回復基調が続きましたが、中国及び資源国をはじめとした新興国の経済成長の鈍化、英国のEU離脱問題、米国新政権の政策運営への不安感などにより、依然として先行き不透明な状況が継続いたしました',
'opinions': [{'target': '世界経済',
'category': 'NULL#general',
'polarity': 'positive',
'from': 11,
'to': 15},
{'target': '米国経済',
'category': 'NULL#general',
'polarity': 'positive',
'from': 17,
'to': 21},
{'target': '経済成長',
'category': 'NULL#general',
'polarity': 'negative',
'from': 72,
'to': 76},
{'target': '政策運営',
'category': 'NULL#general',
'polarity': 'negative',
'from': 96,
'to': 100}]},
jsonデータのコードと内容は、ざっと以下の通りです。
コード | 内容 |
---|---|
sentence_id | 文章データのID |
sentence | 文章データ |
opinions | target,category,polarity,from,toを含む |
target | キーとなる単語 |
polarity | targetがポジティブか、ネガティブか、ニュートラルか |
from,to | targetがsentenceの何文字目から何文字目にあるか |
データの整形
さて、このデータセットですが、各文章の「何が」ネガティブで、ポジティブかの情報はありますが、文章そのものがネガティブか、ポジティブかの情報はありません。
sentenceごとに、polarityを見て、positveが多いか、negativeが多いかで、その文章にpositve、negativeのアノテーションをつけていきます。
sentenceごとにpolarityを数値化する関数
def create_rating(sentences):
rating = []
for obj in sentences:
s = obj["sentence"] #文章の取得
op = obj["opinions"] #options部分を取得
porarity = 0
for o in op:
p = o["polarity"]
if p == "positive":
porarity += 1
elif p == "negative":
porarity -= 1
if porarity !=0 :
rating.append((porarity, s))
return rating
chABSA-datasetから文章を抽出し、polalityを数値化
import glob
rating = []
for file in glob.glob('chABSA-dataset/*.json'):
with open(file,"br") as f:
j = json.load(f)
s = j["sentences"]
rating += create_rating(s)
polalityの数値に基づいて、ラベル付
polalityがプラスならポジティブ、マイナスならネガティブのラベル付けを行います。
カテゴリー | labels |
---|---|
ポジティブ | 1 |
ネガティブ | 0 |
dataset = []
for r in rating:
text = r[1]
rate = r[0]
if rate > 0:
labels = 1
else:
labels = 0
sample = {'text': text, 'labels': labels}
dataset.append(sample)
datasetの中身
10データを見てみましょう。
dataset[:10]
出力結果
textの内容とlabelsの内容が、綺麗にあっていますね。
[{'text': '当連結会計年度におけるわが国の経済は、当初は足踏み状態が続いたものの、雇用・所得環境の改善を背景に個人消費に持ち直しの動きがみられるなど、緩やかな回復基調となりました',
'labels': 1},
{'text': '住宅市場におきましては、年度末にかけて鈍化の動きがみられましたが、日銀のマイナス金利導入に伴う住宅ローン金利の低下もあり、貸家を中心に概ね堅調に推移し、平成28年度の新設住宅着工戸数は974千戸(前年度比5.8%増)となりました',
'labels': 1},
{'text': '石膏ボード業界におきましては、平成28年度の製品出荷量は504百万㎡(前年度比0.7%増)と前年水準をやや上回りました',
'labels': 1},
{'text': 'しかしながら、新設住宅着工戸数の押し上げ要因が主に貸家であることから一棟当たりの石膏ボード使用量が伸び悩むという一面も窺われました',
'labels': 0},
{'text': 'この結果、当社グループにおける業績は、売上高は308億61百万円(前年同期比3.2%増)となりました', 'labels': 1},
{'text': 'また、営業利益は5億87百万円(前年同期比9.6%増)、経常利益は5億77百万円(前年同期比6.3%増)となりました',
'labels': 1},
{'text': '親会社株主に帰属する当期純利益は前期計上した東京支店の譲渡による固定資産売却益の影響により、4億29百万円(前年同期比54.3%減)と減少しました',
'labels': 0},
{'text': '日本経済におきましては、雇用や所得環境の改善が続く中、景気には一部に改善の遅れも見られるものの緩やかな回復基調が継続しました',
'labels': 1},
{'text': '化学工業界におきましては、原油価格の安定的な推移や国内の余剰設備削減等の構造改革の効果により、国内のナフサクラッカーは高水準で稼働しました',
'labels': 1},
{'text': 'モビリティ領域では、ポリプロピレン(PP)コンパウンドやエラストマー等を中心とする機能樹脂製品が、自動車販売の増加に伴う需要拡大を受け、これまで実施してきた成長投資の順調な回収に貢献しました',
'labels': 1}]
さいごに
作成したデータセットを用いて、BERTをファインチューニングし、感情分析を行っていきたいと思います。
Discussion