BERTを用いた単語毎のポジネガ値(感情分析)を算出したい
解決したいこと
BERTを用いた単語毎のポジネガ値を算出したいです。
自然言語処理(NLP)を学び始めた初学者ですが、文単位ではなく、単語毎のポジネガ値を抽出したいと考えています。
テキストは、自由形式の会話文で、既存の単語辞書をあてはめるのではなく、できる限りBERT等、新しい単語にも汎用性の高い手法を用いられたらと考えています。
発生している問題・エラー
下記のスクリプトを実行しても、単語ごとにニュートラルな値しか出力されない(0-1で0.5程度)
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
from janome.tokenizer import Tokenizer
import os
# モデルとトークナイザの保存先パス
model_dir = "/Users/yusei/UNDERPIN_local/debarta"
# モデルとトークナイザのダウンロードと保存
if not os.path.exists(model_dir):
os.makedirs(model_dir)
tokenizer = AutoTokenizer.from_pretrained("ku-nlp/deberta-v2-base-japanese")
model = AutoModelForSequenceClassification.from_pretrained("ku-nlp/deberta-v2-base-japanese")
model.save_pretrained(model_dir)
tokenizer.save_pretrained(model_dir)
# ローカルからモデルとトークナイザの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_dir)
model = AutoModelForSequenceClassification.from_pretrained(model_dir)
# Janomeのトークナイザの準備
janome_tokenizer = Tokenizer()
# テキストファイルの読み込み
with open('/Users/yusei/UNDERPIN_local/underpin_ex/RecordVoice/UKB312-3/Part1_Kana.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
# 各行(テキストが含まれていると仮定)に対して処理を行う
for line in lines:
text = line.strip() # テキストの取得
tokens = list(janome_tokenizer.tokenize(text)) # トークンをリストに変換
# 各単語に対して感情分析を行う
for token in tokens:
inputs = tokenizer.encode_plus(token.surface, return_tensors='pt')
outputs = model(**inputs)
probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1) # ソフトマックス関数で確率に変換
sentiment = probabilities[0][1] # ポジティブな感情の確率を取得
# 結果を直接出力(小数点以下16桁まで)
print(f'Word: {token.surface}, Sentiment: {sentiment:.16f}')
0 likes