From f8ab76efde9bd7d24327e6586bd76671ed9a6f9c Mon Sep 17 00:00:00 2001 From: "seungjun.lee" Date: Tue, 7 Jan 2025 22:09:00 +0900 Subject: [PATCH 01/10] feat: Add Korean Translation Quality Assessment Support - Add AIHub Korean translation quality assessment dataset support - Add Korean BERT models (kykim/bert-kor-base, klue/bert-base, etc.) - Implement data preprocessing for AIHub dataset - Add Korean font support for visualization - Update gitignore for new data directories This commit enables BERTScore evaluation on Korean translation pairs (en-ko, ja-ko, zh-ko) using AIHub's translation quality assessment dataset and various Korean BERT models. --- bert_score/utils.py | 18 +++++++++-- tune_layers/preprocess.py | 65 ++++++++++++++++++++++++++++++++++++++ tune_layers/tune_layers.py | 59 ++++++++++++++++++++++++++++++++-- 3 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 tune_layers/preprocess.py diff --git a/bert_score/utils.py b/bert_score/utils.py index 8af24be..59d23f1 100644 --- a/bert_score/utils.py +++ b/bert_score/utils.py @@ -33,6 +33,7 @@ "zh": "bert-base-chinese", "tr": "dbmdz/bert-base-turkish-cased", "en-sci": "allenai/scibert_scivocab_uncased", + "ko": "kykim/bert-kor-base" } ) @@ -182,6 +183,20 @@ "microsoft/mdeberta-v3-base": 10, # 0.6778713684091584 "microsoft/deberta-v3-large": 12, # 0.6927693082293821 "khalidalt/DeBERTa-v3-large-mnli": 18, # 0.7428756686018376 + "kykim/bert-kor-base": 8, # 0.6525059442150242 + "klue/bert-base": 8, # 0.610519310980925 + "klue/roberta-small": 5, # 0.6155987371688525 + "klue/roberta-base": 9, # 0.6350758600987101 + "klue/roberta-large": 20, # 0.6632967999039878 + "kakaobank/kf-deberta-base": 8, # 0.6491671887483449 + "beomi/kcbert-base": 11, # 0.5642019923282193 + "lassl/bert-ko-base": 8, # 0.6157721449042898 + "snunlp/KR-BERT-char16424": 9, # 0.6396357376097898 + "snunlp/KR-FinBert-SC": 7, # 0.6092057202033887 + "monologg/distilkobert": 2, # 0.5736902466031919 + "kykim/electra-kor-base": 10, # 0.6393825654827927 + "monologg/koelectra-base-v3-discriminator": 11, # 0.6090487861932803 + "beomi/KcELECTRA-base": 11, # 0.6367047702247479 } @@ -326,11 +341,10 @@ def get_tokenizer(model_type, use_fast=False): model_type = cache_scibert(model_type) if version.parse(trans_version) >= version.parse("4.0.0"): - tokenizer = AutoTokenizer.from_pretrained(model_type, use_fast=use_fast) + tokenizer = AutoTokenizer.from_pretrained(model_type, use_fast=True) else: assert not use_fast, "Fast tokenizer is not available for version < 4.0.0" tokenizer = AutoTokenizer.from_pretrained(model_type) - return tokenizer diff --git a/tune_layers/preprocess.py b/tune_layers/preprocess.py new file mode 100644 index 0000000..7e4bc2c --- /dev/null +++ b/tune_layers/preprocess.py @@ -0,0 +1,65 @@ +import os +import json +import zipfile +from pathlib import Path +import re # 정규표현식을 위한 import 추가 + +def extract_and_load_json_data(base_path, data_type): + """ + 영-한 키워드가 있는 ZIP 파일을 추출하고 JSON 데이터를 로드하는 함수 + + Args: + base_path (str): 데이터가 있는 기본 경로 + data_type (str): 'training' 또는 'validation' + + Returns: + list: JSON 데이터 리스트 + """ + # 라벨링 데이터 경로 설정 + labeling_path = Path(base_path) / data_type / "02.라벨링데이터" + extract_path = labeling_path / "extracted" + json_data = [] + + # 디렉토리가 존재하는지 확인 + if not labeling_path.exists(): + print(f"경로를 찾을 수 없습니다: {labeling_path}") + return json_data + + # 추출 디렉토리 생성 + extract_path.mkdir(exist_ok=True) + + # ZIP 파일 검색 및 압축 해제 + for zip_file in labeling_path.glob("*.zip"): + # 정규표현식 패턴 매칭: "평가데이터(MTPE)_"로 시작하고 "-한"으로 끝나는 파일 + if re.search(r'평가데이터\(MTPE\)_[^-]+-한', zip_file.name): + try: + # ZIP 파일 압축 해제 + with zipfile.ZipFile(zip_file, 'r') as zip_ref: + zip_ref.extractall(extract_path) + print(f"압축 해제 완료: {zip_file.name}") + except Exception as e: + print(f"압축 해제 중 에러 발생 ({zip_file.name}): {str(e)}") + continue + + # 압축 해제된 JSON 파일 읽기 + for json_file in extract_path.glob("**/*.json"): + try: + with open(json_file, 'r', encoding='utf-8') as f: + data = json.load(f) + json_data.append(data) + print(f"JSON 파일 처리 완료: {json_file.name}") + except Exception as e: + print(f"JSON 파일 처리 중 에러 발생 ({json_file.name}): {str(e)}") + + return json_data + +def main(): + # 기본 경로 설정 + base_path = "./008.다국어 번역 품질 평가 데이터/3.개방데이터/1.데이터" + + # validation 데이터 처리 + validation_data = extract_and_load_json_data(base_path, "Validation") + print(f"검증 데이터 개수: {len(validation_data)}") + +if __name__ == "__main__": + main() diff --git a/tune_layers/tune_layers.py b/tune_layers/tune_layers.py index 97469fa..96b63cf 100644 --- a/tune_layers/tune_layers.py +++ b/tune_layers/tune_layers.py @@ -2,6 +2,9 @@ import os import re from collections import defaultdict +import json + + import numpy as np import torch @@ -53,6 +56,47 @@ def get_wmt16_seg_to_bert_score(lang_pair, scorer, data_folder="wmt16", batch_si return scores, gold_scores, max_length +def get_aihub_data(lang_pair, data_folder="../data"): + """AIHub 번역품질평가 데이터를 읽어오는 함수""" + gold_scores = [] + all_refs = [] + all_hyps = [] + + # Training 데이터와 Validation 데이터 모두 처리 + # for data_type in ["Training", "Validation"]: + for data_type in [ "Validation"]: + data_path = os.path.join( + data_folder, + "008.다국어 번역 품질 평가 데이터/3.개방데이터/1.데이터", + data_type, + "02.라벨링데이터/extracted" + ) + + # JSON 파일들을 순회 + for json_file in os.listdir(data_path): + if json_file.startswith(f"{lang_pair.lower()}") and json_file.endswith('.json'): + with open(os.path.join(data_path, json_file), 'r', encoding='utf-8') as f: + data = json.load(f) + for item in data['data']: + gold_scores.append(item['score_da_final']) + all_refs.append(item['ht']) + all_hyps.append(item['mt']) + + return gold_scores, all_refs, all_hyps + + +def get_aihub_bert_score(lang_pair, scorer, data_folder="../data", batch_size=64): + """AIHub 데이터에 대한 BERT Score를 계산하는 함수""" + gold_scores, refs, cands = get_aihub_data(lang_pair, data_folder=data_folder) + if scorer.idf: + scorer.compute_idf(refs) + scores = scorer.score(cands, refs, verbose=True, batch_size=batch_size) + scores = list(scores) + max_length = scorer._tokenizer.max_len_single_sentence + + return scores, gold_scores, max_length + + def main(): parser = argparse.ArgumentParser() parser.add_argument("-d", "--data", default="wmt16", help="path to wmt16 data") @@ -85,9 +129,18 @@ def main(): ) results = defaultdict(dict) for lang_pair in tqdm(args.lang_pairs): - scores, gold_scores, max_length = get_wmt16_seg_to_bert_score( - lang_pair, scorer, batch_size=args.batch_size - ) + print(f"lang_pair: {lang_pair}") + # AIHub 데이터인 경우 + if lang_pair in ["enko", "jako", "zhko"]: + scores, gold_scores, max_length = get_aihub_bert_score( + lang_pair, scorer, batch_size=args.batch_size + ) + # WMT16 데이터인 경우 + else: + scores, gold_scores, max_length = get_wmt16_seg_to_bert_score( + lang_pair, scorer, batch_size=args.batch_size + ) + for i, score in enumerate(scores[2]): results[lang_pair + " " + str(i)]["%s %s" % (network, "F")] = pearsonr( score, gold_scores From 0c769691672865fe683eb780c885a6424ce631a3 Mon Sep 17 00:00:00 2001 From: "seungjun.lee" Date: Tue, 7 Jan 2025 22:34:15 +0900 Subject: [PATCH 02/10] fix update --- README.md | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/README.md b/README.md index f511c19..c16fc1e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,69 @@ +# Korean BertScore + +한국어 텍스트 생성 평가를 위한 BERTScore 구현체입니다. + +## 주요 기능 + +- 한국어에 최적화된 사전학습 모델 지원 + - klue/bert-base + - kykim/electra-kor-base + - monologg/koelectra-base-v3-discriminator + - beomi/KcELECTRA-base + - 기타 한국어 모델 지원 + + + + +## 사용 방법 + +```python +from bert_score import score + +# 한국어 텍스트 평가 +refs = ["이것은 참조 문장입니다."] +cands = ["이것은 생성된 문장입니다."] + +P, R, F1 = score(cands, refs, lang="ko") +``` + + + +## Best Layer + +다양한 한국어/다국어 모델의 최적 레이어와 AI Hub [다국어 번역 품질 평가 데이터](https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=data&dataSetSn=71646) 기준 DA(Direct Assessment) Pearson 상관계수입니다. + +| 모델 | 유형 | Best Layer | Pearson 상관계수 | +|:-----|:----:|:----------:|:----------------:| +| google-bert/bert-base-uncased | English | 12 | 0.504 | +| google-bert/bert-base-multilingual-cased | Multilingual | 9 | 0.542 | +| kykim/bert-kor-base | Korean | 8 | 0.653 | +| snunlp/KR-BERT-char16424 | Korean | 9 | 0.640 | +| kakaobank/kf-deberta-base | Korean | 8 | 0.649 | +| klue/bert-base | Korean | 8 | 0.611 | +| klue/roberta-small | Korean | 5 | 0.616 | +| klue/roberta-base | Korean | 9 | 0.635 | +| klue/roberta-large | Korean | 20 | **0.663** | +| lassl/bert-ko-base | Korean | 8 | 0.616 | +| beomi/kcbert-base | Korean | 11 | 0.564 | +| snunlp/KR-FinBert-SC | Korean | 7 | 0.609 | +| kykim/electra-kor-base | Korean | 10 | 0.639 | +| beomi/KcELECTRA-base | Korean | 11 | 0.637 | +| monologg/koelectra-base-v3-discriminator | Korean | 11 | 0.609 | +| monologg/distilkobert | Korean | 2 | 0.574 | +| FacebookAI/xlm-roberta-large | Multilingual | 22 | 0.591 | +| FacebookAI/xlm-roberta-base | Multilingual | 11 | 0.509 | +| Alibaba-NLP/gte-multilingual-mlm-base | Multilingual | 8 | 0.414 | +| BLEU (`tokenizer=ko-mecab`) | N/A | N/A | 0.388 | + +> 참고: 상관계수는 AI Hub 다국어 번역 품질 평가 데이터셋의 DA(Direct Assessment) 점수 기준이며, -1에서 1 사이의 값을 가지고 1에 가까울수록 인간 평가와의 상관관계가 높음을 의미합니다. + +## Visualization +![Visualization](./asset/visualize.png) + + + +--- + # BERTScore [![made-with-python](https://img.shields.io/badge/Made%20with-Python-red.svg)](#python) [![arxiv](https://img.shields.io/badge/arXiv-1904.09675-b31b1b.svg)](https://arxiv.org/abs/1904.09675) From 62f8be394f49d6522d6f880ee6610d0b581efe2b Mon Sep 17 00:00:00 2001 From: "seungjun.lee" Date: Tue, 7 Jan 2025 22:34:39 +0900 Subject: [PATCH 03/10] add asset --- asset/visualize.png | Bin 0 -> 57781 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 asset/visualize.png diff --git a/asset/visualize.png b/asset/visualize.png new file mode 100644 index 0000000000000000000000000000000000000000..233066e79f17e710ece3929a84763dadb646a447 GIT binary patch literal 57781 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 literal 0 HcmV?d00001 From 08908082c9dc3c53e67fd818dbd2e71b361ef4f8 Mon Sep 17 00:00:00 2001 From: "seungjun.lee" Date: Tue, 7 Jan 2025 22:35:27 +0900 Subject: [PATCH 04/10] fix update --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c16fc1e..bbd536e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 한국어 텍스트 생성 평가를 위한 BERTScore 구현체입니다. -## 주요 기능 +### 주요 기능 - 한국어에 최적화된 사전학습 모델 지원 - klue/bert-base @@ -14,7 +14,7 @@ -## 사용 방법 +### 사용 방법 ```python from bert_score import score @@ -28,7 +28,7 @@ P, R, F1 = score(cands, refs, lang="ko") -## Best Layer +### Best Layer 다양한 한국어/다국어 모델의 최적 레이어와 AI Hub [다국어 번역 품질 평가 데이터](https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=data&dataSetSn=71646) 기준 DA(Direct Assessment) Pearson 상관계수입니다. @@ -57,7 +57,7 @@ P, R, F1 = score(cands, refs, lang="ko") > 참고: 상관계수는 AI Hub 다국어 번역 품질 평가 데이터셋의 DA(Direct Assessment) 점수 기준이며, -1에서 1 사이의 값을 가지고 1에 가까울수록 인간 평가와의 상관관계가 높음을 의미합니다. -## Visualization +### Visualization ![Visualization](./asset/visualize.png) From a05f15bbf10fc535b78d0756724ccbce065ab7cc Mon Sep 17 00:00:00 2001 From: metterian Date: Tue, 7 Jan 2025 22:41:44 +0900 Subject: [PATCH 05/10] fix update --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bbd536e..d587752 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,12 @@ - beomi/KcELECTRA-base - 기타 한국어 모델 지원 - +### 설치 방법 +```bash +git clone https://github.com/metterian/korean_bert_score +cd korean_bert_score +pip install -e . +``` ### 사용 방법 From 62d5fee3539cf9c0b81d5685b1db7d2bc2cc6843 Mon Sep 17 00:00:00 2001 From: metterian Date: Tue, 7 Jan 2025 22:46:52 +0900 Subject: [PATCH 06/10] fix for merging main repo --- README.md | 72 +-------------------------------------------- bert_score/utils.py | 2 +- 2 files changed, 2 insertions(+), 72 deletions(-) diff --git a/README.md b/README.md index d587752..0cccb25 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,3 @@ -# Korean BertScore - -한국어 텍스트 생성 평가를 위한 BERTScore 구현체입니다. - -### 주요 기능 - -- 한국어에 최적화된 사전학습 모델 지원 - - klue/bert-base - - kykim/electra-kor-base - - monologg/koelectra-base-v3-discriminator - - beomi/KcELECTRA-base - - 기타 한국어 모델 지원 - -### 설치 방법 -```bash -git clone https://github.com/metterian/korean_bert_score -cd korean_bert_score -pip install -e . -``` - - -### 사용 방법 - -```python -from bert_score import score - -# 한국어 텍스트 평가 -refs = ["이것은 참조 문장입니다."] -cands = ["이것은 생성된 문장입니다."] - -P, R, F1 = score(cands, refs, lang="ko") -``` - - - -### Best Layer - -다양한 한국어/다국어 모델의 최적 레이어와 AI Hub [다국어 번역 품질 평가 데이터](https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=&topMenu=&aihubDataSe=data&dataSetSn=71646) 기준 DA(Direct Assessment) Pearson 상관계수입니다. - -| 모델 | 유형 | Best Layer | Pearson 상관계수 | -|:-----|:----:|:----------:|:----------------:| -| google-bert/bert-base-uncased | English | 12 | 0.504 | -| google-bert/bert-base-multilingual-cased | Multilingual | 9 | 0.542 | -| kykim/bert-kor-base | Korean | 8 | 0.653 | -| snunlp/KR-BERT-char16424 | Korean | 9 | 0.640 | -| kakaobank/kf-deberta-base | Korean | 8 | 0.649 | -| klue/bert-base | Korean | 8 | 0.611 | -| klue/roberta-small | Korean | 5 | 0.616 | -| klue/roberta-base | Korean | 9 | 0.635 | -| klue/roberta-large | Korean | 20 | **0.663** | -| lassl/bert-ko-base | Korean | 8 | 0.616 | -| beomi/kcbert-base | Korean | 11 | 0.564 | -| snunlp/KR-FinBert-SC | Korean | 7 | 0.609 | -| kykim/electra-kor-base | Korean | 10 | 0.639 | -| beomi/KcELECTRA-base | Korean | 11 | 0.637 | -| monologg/koelectra-base-v3-discriminator | Korean | 11 | 0.609 | -| monologg/distilkobert | Korean | 2 | 0.574 | -| FacebookAI/xlm-roberta-large | Multilingual | 22 | 0.591 | -| FacebookAI/xlm-roberta-base | Multilingual | 11 | 0.509 | -| Alibaba-NLP/gte-multilingual-mlm-base | Multilingual | 8 | 0.414 | -| BLEU (`tokenizer=ko-mecab`) | N/A | N/A | 0.388 | - -> 참고: 상관계수는 AI Hub 다국어 번역 품질 평가 데이터셋의 DA(Direct Assessment) 점수 기준이며, -1에서 1 사이의 값을 가지고 1에 가까울수록 인간 평가와의 상관관계가 높음을 의미합니다. - -### Visualization -![Visualization](./asset/visualize.png) - - - ---- - # BERTScore [![made-with-python](https://img.shields.io/badge/Made%20with-Python-red.svg)](#python) [![arxiv](https://img.shields.io/badge/arXiv-1904.09675-b31b1b.svg)](https://arxiv.org/abs/1904.09675) @@ -302,6 +231,7 @@ Some weights of the model checkpoint at roberta-large were not used when initial | en-sci | allenai/scibert_scivocab_uncased | | zh | bert-base-chinese | | tr | dbmdz/bert-base-turkish-cased | +| ko | kykim/bert-kor-base | | others | bert-base-multilingual-cased | #### Default Layers diff --git a/bert_score/utils.py b/bert_score/utils.py index 59d23f1..0add7b5 100644 --- a/bert_score/utils.py +++ b/bert_score/utils.py @@ -341,7 +341,7 @@ def get_tokenizer(model_type, use_fast=False): model_type = cache_scibert(model_type) if version.parse(trans_version) >= version.parse("4.0.0"): - tokenizer = AutoTokenizer.from_pretrained(model_type, use_fast=True) + tokenizer = AutoTokenizer.from_pretrained(model_type, use_fast=use_fast) else: assert not use_fast, "Fast tokenizer is not available for version < 4.0.0" tokenizer = AutoTokenizer.from_pretrained(model_type) From 52d2c4baecbba0bd656f974336a7007bb0fb84f8 Mon Sep 17 00:00:00 2001 From: metterian Date: Tue, 7 Jan 2025 22:47:48 +0900 Subject: [PATCH 07/10] fix asset --- asset/visualize.png | Bin 57781 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 asset/visualize.png diff --git a/asset/visualize.png b/asset/visualize.png deleted file mode 100644 index 233066e79f17e710ece3929a84763dadb646a447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57781 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 From 13a23b023e0a3a5a14b2207bd5ee84bf7da47d3f Mon Sep 17 00:00:00 2001 From: metterian Date: Tue, 7 Jan 2025 22:51:39 +0900 Subject: [PATCH 08/10] Refactor preprocess.py and tune_layers.py This commit refactors the preprocess.py and tune_layers.py files. --- tune_layers/preprocess.py | 65 -------------------------------------- tune_layers/tune_layers.py | 59 ++-------------------------------- 2 files changed, 3 insertions(+), 121 deletions(-) delete mode 100644 tune_layers/preprocess.py diff --git a/tune_layers/preprocess.py b/tune_layers/preprocess.py deleted file mode 100644 index 7e4bc2c..0000000 --- a/tune_layers/preprocess.py +++ /dev/null @@ -1,65 +0,0 @@ -import os -import json -import zipfile -from pathlib import Path -import re # 정규표현식을 위한 import 추가 - -def extract_and_load_json_data(base_path, data_type): - """ - 영-한 키워드가 있는 ZIP 파일을 추출하고 JSON 데이터를 로드하는 함수 - - Args: - base_path (str): 데이터가 있는 기본 경로 - data_type (str): 'training' 또는 'validation' - - Returns: - list: JSON 데이터 리스트 - """ - # 라벨링 데이터 경로 설정 - labeling_path = Path(base_path) / data_type / "02.라벨링데이터" - extract_path = labeling_path / "extracted" - json_data = [] - - # 디렉토리가 존재하는지 확인 - if not labeling_path.exists(): - print(f"경로를 찾을 수 없습니다: {labeling_path}") - return json_data - - # 추출 디렉토리 생성 - extract_path.mkdir(exist_ok=True) - - # ZIP 파일 검색 및 압축 해제 - for zip_file in labeling_path.glob("*.zip"): - # 정규표현식 패턴 매칭: "평가데이터(MTPE)_"로 시작하고 "-한"으로 끝나는 파일 - if re.search(r'평가데이터\(MTPE\)_[^-]+-한', zip_file.name): - try: - # ZIP 파일 압축 해제 - with zipfile.ZipFile(zip_file, 'r') as zip_ref: - zip_ref.extractall(extract_path) - print(f"압축 해제 완료: {zip_file.name}") - except Exception as e: - print(f"압축 해제 중 에러 발생 ({zip_file.name}): {str(e)}") - continue - - # 압축 해제된 JSON 파일 읽기 - for json_file in extract_path.glob("**/*.json"): - try: - with open(json_file, 'r', encoding='utf-8') as f: - data = json.load(f) - json_data.append(data) - print(f"JSON 파일 처리 완료: {json_file.name}") - except Exception as e: - print(f"JSON 파일 처리 중 에러 발생 ({json_file.name}): {str(e)}") - - return json_data - -def main(): - # 기본 경로 설정 - base_path = "./008.다국어 번역 품질 평가 데이터/3.개방데이터/1.데이터" - - # validation 데이터 처리 - validation_data = extract_and_load_json_data(base_path, "Validation") - print(f"검증 데이터 개수: {len(validation_data)}") - -if __name__ == "__main__": - main() diff --git a/tune_layers/tune_layers.py b/tune_layers/tune_layers.py index 96b63cf..97469fa 100644 --- a/tune_layers/tune_layers.py +++ b/tune_layers/tune_layers.py @@ -2,9 +2,6 @@ import os import re from collections import defaultdict -import json - - import numpy as np import torch @@ -56,47 +53,6 @@ def get_wmt16_seg_to_bert_score(lang_pair, scorer, data_folder="wmt16", batch_si return scores, gold_scores, max_length -def get_aihub_data(lang_pair, data_folder="../data"): - """AIHub 번역품질평가 데이터를 읽어오는 함수""" - gold_scores = [] - all_refs = [] - all_hyps = [] - - # Training 데이터와 Validation 데이터 모두 처리 - # for data_type in ["Training", "Validation"]: - for data_type in [ "Validation"]: - data_path = os.path.join( - data_folder, - "008.다국어 번역 품질 평가 데이터/3.개방데이터/1.데이터", - data_type, - "02.라벨링데이터/extracted" - ) - - # JSON 파일들을 순회 - for json_file in os.listdir(data_path): - if json_file.startswith(f"{lang_pair.lower()}") and json_file.endswith('.json'): - with open(os.path.join(data_path, json_file), 'r', encoding='utf-8') as f: - data = json.load(f) - for item in data['data']: - gold_scores.append(item['score_da_final']) - all_refs.append(item['ht']) - all_hyps.append(item['mt']) - - return gold_scores, all_refs, all_hyps - - -def get_aihub_bert_score(lang_pair, scorer, data_folder="../data", batch_size=64): - """AIHub 데이터에 대한 BERT Score를 계산하는 함수""" - gold_scores, refs, cands = get_aihub_data(lang_pair, data_folder=data_folder) - if scorer.idf: - scorer.compute_idf(refs) - scores = scorer.score(cands, refs, verbose=True, batch_size=batch_size) - scores = list(scores) - max_length = scorer._tokenizer.max_len_single_sentence - - return scores, gold_scores, max_length - - def main(): parser = argparse.ArgumentParser() parser.add_argument("-d", "--data", default="wmt16", help="path to wmt16 data") @@ -129,18 +85,9 @@ def main(): ) results = defaultdict(dict) for lang_pair in tqdm(args.lang_pairs): - print(f"lang_pair: {lang_pair}") - # AIHub 데이터인 경우 - if lang_pair in ["enko", "jako", "zhko"]: - scores, gold_scores, max_length = get_aihub_bert_score( - lang_pair, scorer, batch_size=args.batch_size - ) - # WMT16 데이터인 경우 - else: - scores, gold_scores, max_length = get_wmt16_seg_to_bert_score( - lang_pair, scorer, batch_size=args.batch_size - ) - + scores, gold_scores, max_length = get_wmt16_seg_to_bert_score( + lang_pair, scorer, batch_size=args.batch_size + ) for i, score in enumerate(scores[2]): results[lang_pair + " " + str(i)]["%s %s" % (network, "F")] = pearsonr( score, gold_scores From b6f7f2a2ff57e8252a879d9dc188feb00fe82fe5 Mon Sep 17 00:00:00 2001 From: metterian Date: Wed, 8 Jan 2025 14:55:51 +0900 Subject: [PATCH 09/10] add rescaling data for bert-kor-base --- .../rescale_baseline/ko/kykim/bert-kor-base.tsv | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 bert_score/rescale_baseline/ko/kykim/bert-kor-base.tsv diff --git a/bert_score/rescale_baseline/ko/kykim/bert-kor-base.tsv b/bert_score/rescale_baseline/ko/kykim/bert-kor-base.tsv new file mode 100644 index 0000000..f7b96d0 --- /dev/null +++ b/bert_score/rescale_baseline/ko/kykim/bert-kor-base.tsv @@ -0,0 +1,14 @@ +LAYER,P,R,F +0,0.25749525,0.2573355,0.25574756 +1,0.32705924,0.32676396,0.3259461 +2,0.3948546,0.39444658,0.39400318 +3,0.37353218,0.37326,0.3727555 +4,0.40359724,0.40326488,0.402877 +5,0.50273615,0.50234073,0.50211596 +6,0.5089314,0.5086513,0.5083372 +7,0.47281617,0.4724911,0.4721551 +8,0.4760624,0.4757873,0.47543192 +9,0.49104717,0.49070883,0.49041948 +10,0.48527616,0.48491594,0.4847094 +11,0.42766362,0.4272024,0.42691776 +12,0.3890542,0.3886027,0.38827258 From 3e8bdd258de642dc06eb506a456749da32d856f8 Mon Sep 17 00:00:00 2001 From: metterian Date: Wed, 8 Jan 2025 14:56:35 +0900 Subject: [PATCH 10/10] Add preprocess.py for data extraction and processing --- tune_layers/preprocess.py | 116 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 tune_layers/preprocess.py diff --git a/tune_layers/preprocess.py b/tune_layers/preprocess.py new file mode 100644 index 0000000..06208c7 --- /dev/null +++ b/tune_layers/preprocess.py @@ -0,0 +1,116 @@ +import os +import json +import zipfile +from pathlib import Path +import re # 정규표현식을 위한 import 추가 + +def extract_and_load_json_data(base_path, data_type): + """ + 영-한 키워드가 있는 ZIP 파일을 추출하고 JSON 데이터를 로드하는 함수 + + Args: + base_path (str): 데이터가 있는 기본 경로 + data_type (str): 'training' 또는 'validation' + + Returns: + list: JSON 데이터 리스트 + """ + # 라벨링 데이터 경로 설정 + labeling_path = Path(base_path) / data_type / "02.라벨링데이터" + extract_path = labeling_path / "extracted" + json_data = [] + + # 디렉토리가 존재하는지 확인 + if not labeling_path.exists(): + print(f"경로를 찾을 수 없습니다: {labeling_path}") + return json_data + + # 추출 디렉토리들 생성 + extract_path.mkdir(exist_ok=True) + ht_extract_path = labeling_path / "extracted_ht" # HT 데이터용 새로운 경로 + ht_extract_path.mkdir(exist_ok=True) + + # ZIP 파일 검색 및 압축 해제 + for zip_file in labeling_path.glob("*.zip"): + try: + if re.search(r'평가데이터\(MTPE\)_[^-]+-한', zip_file.name): + # MTPE 데이터 압축 해제 + with zipfile.ZipFile(zip_file, 'r') as zip_ref: + zip_ref.extractall(extract_path) + print(f"MTPE 데이터 압축 해제 완료: {zip_file.name}") + elif re.search(r'VL_번역말뭉치\(HT\)_한', zip_file.name): + # HT 데이터 압축 해제 + with zipfile.ZipFile(zip_file, 'r') as zip_ref: + zip_ref.extractall(ht_extract_path) + print(f"HT 데이터 압축 해제 완료: {zip_file.name}") + except Exception as e: + print(f"압축 해제 중 에러 발생 ({zip_file.name}): {str(e)}") + continue + + # 압축 해제된 JSON 파일 읽기 + for json_file in extract_path.glob("**/*.json"): + try: + with open(json_file, 'r', encoding='utf-8') as f: + data = json.load(f) + json_data.append(data) + print(f"JSON 파일 처리 완료: {json_file.name}") + except Exception as e: + print(f"JSON 파일 처리 중 에러 발생 ({json_file.name}): {str(e)}") + + return json_data + +def collect_source_sentences(base_path, data_type, output_filename="source_sentences.txt"): + """ + extracted_ht 폴더의 모든 JSON 파일에서 source_sentence를 추출하여 txt 파일로 저장하는 함수 + + Args: + base_path (str): 데이터가 있는 기본 경로 + data_type (str): 'training' 또는 'validation' + output_filename (str): 출력할 txt 파일명 + """ + # 경로 설정 + ht_extract_path = Path(base_path) / data_type / "02.라벨링데이터/extracted_ht" + output_path = Path(base_path) / data_type / "02.라벨링데이터" / output_filename + + # 디렉토리 존재 확인 + if not ht_extract_path.exists(): + print(f"경로를 찾을 수 없습니다: {ht_extract_path}") + return + + # source_sentence 수집 + sentences = [] + for json_file in ht_extract_path.glob("**/*.json"): + try: + with open(json_file, 'r', encoding='utf-8') as f: + data = json.load(f) + if isinstance(data, dict) and 'data' in data: + # data 리스트 내의 각 항목에서 source_sentence 추출 + for item in data['data']: + if 'source_sentence' in item: + sentences.append(item['source_sentence']) + print(f"JSON 파일 처리 완료: {json_file.name}") + except Exception as e: + print(f"JSON 파일 처리 중 에러 발생 ({json_file.name}): {str(e)}") + + # 수집된 문장들을 txt 파일로 저장 + try: + with open(output_path, 'w', encoding='utf-8') as f: + for sentence in sentences: + f.write(sentence + '\n') + print(f"문장 추출 완료. 총 {len(sentences)}개의 문장이 {output_path}에 저장되었습니다.") + except Exception as e: + print(f"파일 저장 중 에러 발생: {str(e)}") + +def main(): + # 기본 경로 설정 + base_path = "008.다국어 번역 품질 평가 데이터/3.개방데이터/1.데이터" + + # validation 데이터 처리 + validation_data = extract_and_load_json_data(base_path, "Validation") + print(f"검증 데이터 개수: {len(validation_data)}") + + # source_sentence 수집 및 저장 + collect_source_sentences(base_path, "Validation") + +if __name__ == "__main__": + main()