TreeNut-KR / ChatBot

ChatBot 웹사이트 프로젝트
GNU General Public License v3.0
1 stars 0 forks source link

dataset (ecee9ec) #22

Open CutTheWire opened 2 months ago

CutTheWire commented 2 months ago

github 상태

git 브랜치 상태 다이어그램

main (d9352e7) ── main (6d548fb)
 │ 
develop (d9352e7)
 └── dataset (ecee9ec)

변경된 파일 구조

📦 Checking_folder
    ┣ 📂 Batchfile
    ┃ 📜 venv_install.bat
    ┃ 📜 venv_install.sh
    ┃ 📜 venv_setup.bat
    ┃ 📜 venv_setup.sh
    ┣ 📂 Data_Processor
    ┃  ┣ 📂 Json_processor
    ┃  ┃ 📜 flanT5_processor.py
    ┃  ┃ 📜 openai_Processor.py
    ┃  ┣ 📂 Origin_data
    ┃  ┃ 📜 CSV.py
    ┃  ┃ 📜 Plt.py
    ┃  ┃  ┣ 📂 csv
    ┃  ┃  ┃ 📜 test_li2017dailydialog.csv
    ┃  ┃  ┃ 📜 train_li2017dailydialog.csv
    ┃  ┃  ┃ 📜 validation_li2017dailydialog.csv
    ┃  ┃  ┗ 📂 plt
    ┃  ┃    📜 dialog_analysis.png
    ┃  ┃    📜 dialog_analysis_distribution.png
    ┃  ┣ 📂 Preprocessing_data
    ┃  ┃ 📜 CSV.py
    ┃  ┃ 📜 Plt.py
    ┃  ┃  ┣ 📂 csv
    ┃  ┃  ┃ 📜 test_li2017dailydialog.csv
    ┃  ┃  ┃ 📜 train_li2017dailydialog.csv
    ┃  ┃  ┃ 📜 validation_li2017dailydialog.csv
    ┃  ┃  ┗ 📂 plt
    ┃  ┃    📜 dialog_analysis.png
    ┃  ┃    📜 dialog_analysis_distribution.png
    ┃ 📜 TEST_Dataset.py
    ┃ 📜 filtered_Dataset.py
    ┃  ┗ 📂 filtered_daily_dialog
    ┃    📜 dataset_dict.json
    ┃     ┣ 📂 test
    ┃     ┃ 📜 data-00000-of-00001.arrow
    ┃     ┃ 📜 dataset_info.json
    ┃     ┃ 📜 state.json
    ┃     ┣ 📂 train
    ┃     ┃ 📜 data-00000-of-00001.arrow
    ┃     ┃ 📜 dataset_info.json
    ┃     ┃ 📜 state.json
    ┃     ┗ 📂 validation
    ┃       📜 data-00000-of-00001.arrow
    ┃       📜 dataset_info.json
    ┃       📜 state.json
    ┣ 📂 GPT
    ┃ 📜 AI_Response.py
    ┃ 📜 AI_TXT_Response.py
    ┃ 📜 AI_gpt2.py
    ┃  ┗ 📂 model_pytorch
    ┃    📜 chatbot_model.pth
    ┃    📜 text_classifier.pth
   📜 README.md
    ┣ 📂 Training
    ┃ 📜 Dialog.py
    ┃ 📜 Question-Answer.py
    ┃ 📜 TextClassifier.py
    ┃ 📜 seq2seq.py
   📜 git_directory_state.py
    ┣ 📂 reddit
    ┃  ┣ 📂 data
    ┃  ┃ 📜 model_flan_t5_responses.json
    ┃  ┃ 📜 model_openai_responses.json
    ┃  ┃ 📜 processed_reddit_data.json
    ┃  ┃ 📜 reddit_data.json
    ┃  ┃ 📜 reddit_data.txt
    ┃  ┣ 📂 data_dialog
    ┃  ┃ 📜 reddit_data.json
    ┃ 📜 reddit_Scraper_Popular.py
    ┃ 📜 reddit_Scraper_Q&As.py
    ┃ 📜 reddit_Scraper_Q&As_1_1.py
    ┃ 📜 reddit_txt_Preprocessor.py
   📜 requirements.txt

❌ Data_Processor/Dataset_test.py (삭제)
❌ Data_Processor/Disk_dataset.py (삭제)
❌ Data_Processor/Origin data/CSV_dataset.py (삭제)
❌ Data_Processor/Origin data/Plt.py (삭제)
❌ Data_Processor/Origin data/Plt_distribution.py (삭제)
❌ Data_Processor/Origin data/csv/test_240721_161058_li2017dailydialog.csv (삭제)
❌ Data_Processor/Origin data/csv/train_240721_161058_li2017dailydialog.csv (삭제)
❌ Data_Processor/Origin data/csv/validation_240721_161058_li2017dailydialog.csv (삭제)
✅ Data_Processor/Origin_data/CSV.py (추가)
✅ Data_Processor/Origin_data/Plt.py (추가)
✅ Data_Processor/Origin_data/csv/test_li2017dailydialog.csv (추가)
✅ Data_Processor/Origin_data/csv/train_li2017dailydialog.csv (추가)
✅ Data_Processor/Origin_data/csv/validation_li2017dailydialog.csv (추가)
❌ Data_Processor/Preprocessing data/Plt.py (삭제)
❌ Data_Processor/Preprocessing data/Plt_distribution.py (삭제)
✅ Data_Processor/Preprocessing_data/CSV.py (추가)
✅ Data_Processor/Preprocessing_data/Plt.py (추가)
✅ Data_Processor/Preprocessing_data/csv/test_li2017dailydialog.csv (추가)
✅ Data_Processor/Preprocessing_data/csv/train_li2017dailydialog.csv (추가)
✅ Data_Processor/Preprocessing_data/csv/validation_li2017dailydialog.csv (추가)
✅ Data_Processor/TEST_Dataset.py (추가)
✅ Data_Processor/filtered_Dataset.py (추가)
🔄 Data_Processor/filtered_daily_dialog/test/state.json (수정)
🔄 Data_Processor/filtered_daily_dialog/train/state.json (수정)
🔄 Data_Processor/filtered_daily_dialog/validation/state.json (수정)
🔄 requirements.txt (수정)

코드 상세 리뷰

Data_Processor/filtered_Dataset.py

from datasets import load_dataset, DatasetDict

# 데이터셋 로드
dataset = load_dataset("li2017dailydialog/daily_dialog")

# 길이 제한 설정
train_length_min = 2
train_length_max = 60
validation_length_min = 2
validation_length_max = 55
test_length_min = 2
test_length_max = 60

# 필터링 함수
def filter_dataset(dataset, min_length, max_length):
    return dataset.filter(lambda x: all(min_length <= len(line.split()) <= max_length for line in x['dialog']))

# 각 데이터셋 필터링
filtered_train = filter_dataset(dataset['train'], train_length_min, train_length_max)
filtered_validation = filter_dataset(dataset['validation'], validation_length_min, validation_length_max)
filtered_test = filter_dataset(dataset['test'], test_length_min, test_length_max)

# 필터링된 데이터셋을 딕셔너리로 저장
filtered_dataset = DatasetDict({
    'train': filtered_train,
    'validation': filtered_validation,
    'test': filtered_test
})

# 로컬에 저장
output_dir = './Data_Processor/filtered_daily_dialog'
filtered_dataset.save_to_disk(output_dir)

print(filtered_dataset)
print("데이터셋이 성공적으로 저장되었습니다.")

1. 데이터셋 로드

dataset = load_dataset("li2017dailydialog/daily_dialog")

load_dataset 함수를 사용하여 'li2017dailydialog/daily_dialog' 데이터셋을 로드합니다.

이 데이터셋은 일상 대화 데이터로 구성되어 있습니다.

2. 길이 제한 설정

train_length_min = 2
train_length_max = 60
validation_length_min = 2
validation_length_max = 55
test_length_min = 2
test_length_max = 60

학습 데이터, 검증 데이터, 테스트 데이터에 대해 각각 최소 및 최대 문장 길이를 설정합니다.

  1. 학습 데이터 : 2 <= 문장 길이 <= 60
  2. 검증 데이터 : 2 <= 문장 길이 <= 55
  3. 테스트 데이터 : 2 <= 문장 길이 <= 60

3. 필터링 함수 정의

def filter_dataset(dataset, min_length, max_length):
    return dataset.filter(lambda x: all(min_length <= len(line.split()) <= max_length for line in x['dialog']))

filter_dataset 함수를 정의하여 주어진 최소 및 최대 문장 길이 범위에 해당하는 데이터만 선별합니다.

이 함수는 데이터셋의 각 대화 문장 길이가 지정된 범위 내에 있는지 확인합니다.

4. 데이터셋 필터링

filtered_train = filter_dataset(dataset['train'], train_length_min, train_length_max)
filtered_validation = filter_dataset(dataset['validation'], validation_length_min, validation_length_max)
filtered_test = filter_dataset(dataset['test'], test_length_min, test_length_max)

학습 데이터, 검증 데이터, 테스트 데이터를 각각 filter_dataset 함수를 사용하여 필터링합니다.

필터링된 데이터셋은 filtered_trainfiltered_validationfiltered_test에 저장됩니다.

5. 필터링된 데이터셋 저장

filtered_dataset = DatasetDict({
    'train': filtered_train,
    'validation': filtered_validation,
    'test': filtered_test
})

DatasetDict 형태로 필터링된 데이터셋을 저장합니다.

학습 데이터, 검증 데이터, 테스트 데이터가 각각 'train''validation''test' 키로 저장됩니다.

6. 로컬에 저장

output_dir = './Data_Processor/filtered_daily_dialog'
filtered_dataset.save_to_disk(output_dir)

print(filtered_dataset)
print("데이터셋이 성공적으로 저장되었습니다.")

필터링된 데이터셋을 './Data_Processor/filtered_daily_dialog' 경로에 저장합니다.

Data_Processor/TEST_Dataset.py

1. 클래스 정의

dataset_check 클래스를 정의합니다.이 클래스는 데이터셋을 불러오고 확인하는 기능을 제공합니다.

2. 데이터셋 불러오기

class dataset_check:
    def __init__(self) -> None:
        # 데이터셋 불러오기
        self.dataset_origin = load_dataset("li2017dailydialog/daily_dialog")
        # 로컬 데이터셋 불러오기
        self.dataset_prepro = load_from_disk('Data_Processor/filtered_daily_dialog')

**생성자에서 두 가지 데이터셋을 불러옵니다.

  1. dataset_origin: 원본 'li2017dailydialog/daily_dialog' 데이터셋dataset_prepro: 전처리된 데이터셋 ('Data_Processor/filtered_daily_dialog')**

3. 데이터셋 확인 함수

    def checking(self, dataset_name: str = 'both') -> None:
        datasets = {
            'origin': self.dataset_origin,
            'prepro': self.dataset_prepro,
            'both': [self.dataset_origin, self.dataset_prepro]
        }
        selected_datasets = datasets.get(dataset_name, datasets['both'])

        for dataset in selected_datasets:
            print(dataset)# 전체 dataset 출력
            print(dataset['train'][0])# train 데이터셋의 첫 번째 샘플 출력
            print(dataset['validation'][0])# validation 데이터셋의 첫 번째 샘플 출력
            print(dataset['test'][0])# test 데이터셋의 첫 번째 샘플 출력

checking 메서드를 정의하여 데이터셋을 확인할 수 있습니다.dataset_name 매개변수를 통해 확인할 데이터셋을 선택할 수 있습니다.'origin': 원본 데이터셋'prepro': 전처리된 데이터셋'both': 두 데이터셋 모두선택된 데이터셋의 전체 데이터, 학습 데이터의 첫 번째 샘플, 검증 데이터의 첫 번째 샘플, 테스트 데이터의 첫 번째 샘플을 출력합니다.

4. 데이터셋 요약 정보 가져오기

    def get_summary(self, dataset_name: str = 'both') -> dict:
        datasets = {
            'origin': self.dataset_origin,
            'prepro': self.dataset_prepro,
            'both': [self.dataset_origin, self.dataset_prepro]
        }
        selected_datasets = datasets.get(dataset_name, datasets['both'])
        summary = {}

        for dataset in selected_datasets:
            summary[dataset_name] = {
                'train_size': len(dataset['train']),
                'validation_size': len(dataset['validation']),
                'test_size': len(dataset['test'])
            }
        return summary

get_summary 메서드를 정의하여 데이터셋의 요약 정보를 가져올 수 있습니다.dataset_name 매개변수를 통해 확인할 데이터셋을 선택할 수 있습니다.'origin': 원본 데이터셋'prepro': 전처리된 데이터셋'both': 두 데이터셋 모두선택된 데이터셋의 학습 데이터, 검증 데이터, 테스트 데이터의 크기를 요약 정보로 반환합니다.

5. 메인 실행 부분

if __name__ == "__main__":
    checker = dataset_check()
    checker.checking()  # 모든 데이터셋 확인
    summary = checker.get_summary()  # 데이터셋 요약 정보 가져오기
    print(summary)

if __name__ == "__main__": 블록에서 dataset_check 클래스의 인스턴스를 생성하고, checking 메서드와 get_summary 메서드를 호출합니다.checking 메서드를 통해 데이터셋을 확인하고, get_summary 메서드를 통해 데이터셋의 요약 정보를 출력합니다.

이 코드는 데이터셋을 불러오고 확인하는 기능을 제공합니다. 원본 데이터셋과 전처리된 데이터셋을 비교할 수 있으며, 데이터셋의 크기 정보를 확인할 수 있습니다. 이를 통해 데이터셋의 특성을 이해하고 모델 학습에 적합한 데이터셋을 선택할 수 있습니다.

Data_Processor/Origin_data/Plt.py & Data_Processor/Preprocessing_data/Plt.py

1. 데이터셋 로드

# 데이터셋 로드
dataset = load_dataset("li2017dailydialog/daily_dialog")

Data_Processor/Origin_data/Plt.py : load_dataset 함수를 사용하여 'li2017dailydialog/daily_dialog' 데이터셋을 로드합니다.

# 로컬 데이터셋 불러오기
dataset = load_from_disk('Data_Processor/filtered_daily_dialog')

Data_Processor/Preprocessing_data/Plt.py : load_from_disk 함수를 사용하여 'Data_Processor/filtered_daily_dialog’데이터셋을 로드합니다.

현재 파일의 디렉토리 경로를 가져와 그래프를 저장할 경로를 설정합니다.

2. 데이터셋 분석

2.1 토큰 길이 분석 함수

def get_token_lengths(dataset_split):
    token_lengths = []
    for item in dataset_split:
        dialog = item['dialog']
        max_lengths = [len(line.split()) for line in dialog]
        token_lengths.append(max(max_lengths))
    return token_lengths

2.2 대화 길이 분석 함수

def get_dialog_lengths(dataset_split):
    dialog_lengths = []
    for item in dataset_split:
        dialog = item['dialog']
        dialog_lengths.append(len(dialog))
    return dialog_lengths

2.3 빈도수 계산 함수

def calculate_frequency(data):
    freq = {}
    for value in data:
        if value in freq:
            freq[value] += 1
        else:
            freq[value] = 1
    return freq

2.4 데이터 분석 실행

# 토큰 길이 분석
train_token_lengths = get_token_lengths(dataset['train'])
validation_token_lengths = get_token_lengths(dataset['validation'])
test_token_lengths = get_token_lengths(dataset['test'])

# 대화 길이 분석
train_dialog_lengths = get_dialog_lengths(dataset['train'])
validation_dialog_lengths = get_dialog_lengths(dataset['validation'])
test_dialog_lengths = get_dialog_lengths(dataset['test'])

# 빈도수 계산
train_token_freq = calculate_frequency(train_token_lengths)
validation_token_freq = calculate_frequency(validation_token_lengths)
test_token_freq = calculate_frequency(test_token_lengths)
train_dialog_freq = calculate_frequency(train_dialog_lengths)
validation_dialog_freq = calculate_frequency(validation_dialog_lengths)
test_dialog_freq = calculate_frequency(test_dialog_lengths)

3. 데이터셋 시각화

# 그래프 그리기: Dialog Analysis
fig, axs = plt.subplots(6, 1, figsize=(15, 36))  # 6행 1열의 서브플롯 생성

# Maximum Token Length 막대 그래프
axs[0].bar(range(len(train_token_lengths)), train_token_lengths, label='Train Max Token Length', color='blue')
axs[0].set_title('Maximum Token Length in Train Dataset')
axs[0].set_xlabel('Dialog Index')
axs[0].set_ylabel('Max Token Length')
axs[0].grid()
axs[0].legend()

axs[1].bar(range(len(validation_token_lengths)), validation_token_lengths, label='Validation Max Token Length', color='orange')
axs[1].set_title('Maximum Token Length in Validation Dataset')
axs[1].set_xlabel('Dialog Index')
axs[1].grid()
axs[1].legend()

axs[2].bar(range(len(test_token_lengths)), test_token_lengths, label='Test Max Token Length', color='green')
axs[2].set_title('Maximum Token Length in Test Dataset')
axs[2].set_xlabel('Dialog Index')
axs[2].grid()
axs[2].legend()

# Dialog Length 막대 그래프
axs[3].bar(range(len(train_dialog_lengths)), train_dialog_lengths, label='Train Dialog Length', color='purple')
axs[3].set_title('Train Dialog Length')
axs[3].set_xlabel('Dialog Index')
axs[3].set_ylabel('Number of Elements')
axs[3].grid()
axs[3].legend()

axs[4].bar(range(len(validation_dialog_lengths)), validation_dialog_lengths, label='Validation Dialog Length', color='gold')
axs[4].set_title('Validation Dialog Length')
axs[4].set_xlabel('Dialog Index')
axs[4].set_ylabel('Number of Elements')
axs[4].grid()
axs[4].legend()

axs[5].bar(range(len(test_dialog_lengths)), test_dialog_lengths, label='Test Dialog Length', color='red')
axs[5].set_title('Test Dialog Length')
axs[5].set_xlabel('Dialog Index')
axs[5].set_ylabel('Number of Elements')
axs[5].grid()
axs[5].legend()

막대 그래프 생성:

학습, 검증, 테스트 데이터셋의 최대 토큰 길이 분포를 보여줍니다.

학습, 검증, 테스트 데이터셋의 대화 요소 수 분포를 보여줍니다.

# 그래프 그리기
fig, axs = plt.subplots(6, 1, figsize=(15, 36))  # 6행 1열의 서브플롯 생성

# Train Token Length 분포 그래프
axs[0].scatter(list(train_token_freq.keys()), list(train_token_freq.values()), color='blue', marker='o')
axs[0].set_title('Distribution of Train Max Token Length')
axs[0].set_xlabel('Token Length')
axs[0].set_ylabel('Frequency')
axs[0].grid()

# Validation Token Length 분포 그래프
axs[1].scatter(list(validation_token_freq.keys()), list(validation_token_freq.values()), color='orange', marker='o')
axs[1].set_title('Distribution of Validation Max Token Length')
axs[1].set_xlabel('Token Length')
axs[1].set_ylabel('Frequency')
axs[1].grid()

# Test Token Length 분포 그래프
axs[2].scatter(list(test_token_freq.keys()), list(test_token_freq.values()), color='green', marker='o')
axs[2].set_title('Distribution of Test Max Token Length')
axs[2].set_xlabel('Token Length')
axs[2].set_ylabel('Frequency')
axs[2].grid()

# Train Dialog Length 분포 그래프
axs[3].scatter(list(train_dialog_freq.keys()), list(train_dialog_freq.values()), color='purple', marker='o')
axs[3].set_title('Distribution of Train Dialog Length')
axs[3].set_xlabel('Number of Elements')
axs[3].set_ylabel('Frequency')
axs[3].grid()

# Validation Dialog Length 분포 그래프
axs[4].scatter(list(validation_dialog_freq.keys()), list(validation_dialog_freq.values()), color='gold', marker='o')
axs[4].set_title('Distribution of Validation Dialog Length')
axs[4].set_xlabel('Number of Elements')
axs[4].set_ylabel('Frequency')
axs[4].grid()

# Test Dialog Length 분포 그래프
axs[5].scatter(list(test_dialog_freq.keys()), list(test_dialog_freq.values()), color='red', marker='o')
axs[5].set_title('Distribution of Test Dialog Length')
axs[5].set_xlabel('Number of Elements')
axs[5].set_ylabel('Frequency')
axs[5].grid()

산점도 생성:

학습, 검증, 테스트 데이터셋의 최대 토큰 길이 분포를 보여줍니다.

학습, 검증, 테스트 데이터셋의 대화 요소 수 분포를 보여줍니다.

4.그래프 저장

plt.savefig(save_path_analysis)  # 그래프를 이미지 파일로 저장

...

plt.savefig(save_path_distribution)  # 그래프를 이미지 파일로 저장

생성된 그래프를 각각 'dialog_analysis.png'와 'dialog_analysis_distribution.png'라는 이름으로 저장합니다.