🚀 Bert-base トルコ語センチメントモデル
https://huggingface.co/savasy/bert-base-turkish-sentiment-cased
このモデルは、トルコ語用の BERTurk(https://huggingface.co/dbmdz/bert-base-turkish-cased )に基づくセンチメント分析に使用されます。
📚 引用
研究でこのモデルを使用する場合は、以下の文献を引用してください。
@misc{yildirim2024finetuning,
title={Fine-tuning Transformer-based Encoder for Turkish Language Understanding Tasks},
author={Savas Yildirim},
year={2024},
eprint={2401.17396},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
@book{yildirim2021mastering,
title={Mastering Transformers: Build state-of-the-art models from scratch with advanced natural language processing techniques},
author={Yildirim, Savas and Asgari-Chenaghlu, Meysam},
year={2021},
publisher={Packt Publishing Ltd}
}
📊 データセット
データセットは、研究 [2] と [3] から取得され、統合されています。
-
研究 [2] では、映画と商品のレビューが収集されました。商品は、本、DVD、電子機器、キッチン用品です。映画のデータセットは、映画Webページ(Beyazperde)から取得され、5331件の肯定的な文と5331件の否定的な文が含まれています。Webページのレビューは、レビューを投稿したユーザーによって0から5のスケールでマークされています。この研究では、評価が4以上の場合を肯定的なセンチメント、2以下の場合を否定的なセンチメントと見なしています。また、オンライン小売業者のWebページからトルコ語の商品レビューデータセットを構築しました。彼らは、いくつかの商品(本、DVDなど)に関するレビューからなるベンチマークデータセットを構築しました。同様に、レビューは1から5の範囲でマークされ、レビューの大多数は5です。各カテゴリには、700件の肯定的なレビューと700件の否定的なレビューがあり、否定的なレビューの平均評価は2.27、肯定的なレビューの平均評価は4.5です。このデータセットは、研究 [1] でも使用されています。
-
研究 [3] では、ツイートのデータセットが収集されました。彼らは、マイクロブログメッセージのセンチメントを自動的に分類するための新しいアプローチを提案しました。提案されたアプローチは、堅牢な特徴表現と融合を利用することに基づいています。
統合されたデータセット
サイズ |
データ |
8000 |
dev.tsv |
8262 |
test.tsv |
32000 |
train.tsv |
48290 |
合計 |
このデータセットを使用した論文
[1] Yildirim, Savaş. (2020). Comparing Deep Neural Networks to Traditional Models for Sentiment Analysis in Turkish Language. 10.1007/978-981-15-1216-2_12.
[2] Demirtas, Erkin and Mykola Pechenizkiy. 2013. Cross-lingual polarity detection with machine translation. In Proceedings of the Second International Workshop on Issues of Sentiment
Discovery and Opinion Mining (WISDOM ’13)
[3] Hayran, A., Sert, M. (2017), "Sentiment Analysis on Microblog Data based on Word Embedding and Fusion Techniques", IEEE 25th Signal Processing and Communications Applications Conference (SIU 2017), Belek, Turkey
🏋️♂️ トレーニング
export GLUE_DIR="./sst-2-newall"
export TASK_NAME=SST-2
python3 run_glue.py \
--model_type bert \
--model_name_or_path dbmdz/bert-base-turkish-uncased \
--task_name "SST-2" \
--do_train \
--do_eval \
--data_dir "./sst-2-newall" \
--max_seq_length 128 \
--per_gpu_train_batch_size 32 \
--learning_rate 2e-5 \
--num_train_epochs 3.0 \
--output_dir "./model"
📈 結果
05/10/2020 17:00:43 - INFO - transformers.trainer - ****** Running Evaluation ******
05/10/2020 17:00:43 - INFO - transformers.trainer - Num examples = 7999
05/10/2020 17:00:43 - INFO - transformers.trainer - Batch size = 8
Evaluation: 100% 1000/1000 [00:34<00:00, 29.04it/s]
05/10/2020 17:01:17 - INFO - __main__ - ****** Eval results sst-2 ******
05/10/2020 17:01:17 - INFO - __main__ - acc = 0.9539942492811602
05/10/2020 17:01:17 - INFO - __main__ - loss = 0.16348013816401363
正確率は約 95.4% です。
💻 使用例
基本的な使用法
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
model = AutoModelForSequenceClassification.from_pretrained("savasy/bert-base-turkish-sentiment-cased")
tokenizer = AutoTokenizer.from_pretrained("savasy/bert-base-turkish-sentiment-cased")
sa = pipeline("sentiment-analysis", tokenizer=tokenizer, model=model)
p = sa("bu telefon modelleri çok kaliteli , her parçası çok özel bence")
print(p)
print(p[0]['label'] == 'LABEL_1')
p = sa("Film çok kötü ve çok sahteydi")
print(p)
print(p[0]['label'] == 'LABEL_1')
テスト
データ
ファイルには、多数のコメント行と、末尾にラベル(1または0)がタブ区切りで含まれていると仮定します。
comment1 ... \t label
comment2 ... \t label
...
コード
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
model = AutoModelForSequenceClassification.from_pretrained("savasy/bert-base-turkish-sentiment-cased")
tokenizer = AutoTokenizer.from_pretrained("savasy/bert-base-turkish-sentiment-cased")
sa = pipeline("sentiment-analysis", tokenizer=tokenizer, model=model)
input_file = "/path/to/your/file/yourfile.tsv"
i, crr = 0, 0
for line in open(input_file):
lines = line.strip().split("\t")
if len(lines) == 2:
i = i + 1
if i%100 == 0:
print(i)
pred = sa(lines[0])
pred = pred[0]["label"].split("_")[1]
if pred == lines[1]:
crr = crr + 1
print(crr, i, crr/i)